diff --git a/.context/standards/Architecture-Decisions.md b/.context/standards/Architecture-Decisions.md index 109e4e949ae..3fcec177094 100644 --- a/.context/standards/Architecture-Decisions.md +++ b/.context/standards/Architecture-Decisions.md @@ -4199,7 +4199,12 @@ and the rename lands with the `ProjectSelector` migration (PT-4549). Both names store keyed by web view id. Content zoom is the first feature written to the rule: the pane's own levels are `platform.contentZoomLevels` in the definition state, the default and the per-project memory are `platform.webViewContentZoom` and `platform.webViewContentZoomMemory` - (`src/renderer/services/web-view-content-zoom.service.ts`). + (`src/renderer/services/web-view-content-zoom.service.ts`). Definition state that belongs to a + project carries the identity it belongs to: the levels are stamped with + `platform.contentZoomIdentity` (`kind:identity`), written and removed with them, because a pane + re-pointed at another project keeps its web view id and the view spreads its own saved state onto + the new definition — so without the stamp the previous project's levels are indistinguishable from + levels chosen for the new one. - **Alternatives:** (a) **A per-view service with its own hidden `Record` store** — the April content-zoom prototype, PR #2211 — rejected: two stores for one value, and the one that is not the definition has to be taught by hand about every lifecycle event the definition gets for free. @@ -4576,6 +4581,33 @@ and the rename lands with the `ProjectSelector` migration (PT-4549). Both names - **Source:** PT-4464; lead dev's review of PR #2670 (2026-08-25), item 11. Surface inventory measured against the top of the multi-window stack. +## adr-pop-ups-follow-their-content-zoom-area: A pop-up takes the zoom of the area it opens from + +- **Date:** 2026-09-17 +- **Status:** Accepted +- **Context:** pop-ups portal to `document.body`, outside the zoom area, so they rendered at + interface scale next to zoomed content, and a hand-wrapped editor popover was misplaced at + 200 %. +- **Decision:** a pop-up takes the zoom of the area it opens from. `ContentZoomRoot` publishes + its area through React context, and the library's popover, dropdown menu and tooltip mark + their portaled content with the area and a pop-up flag and cap their size by the zoom factor. + The platform bootstrap never counts flagged content as a pane or anchors the indicator on it. + `ContentZoomAreaProvider` covers pop-ups rendered outside the area element. +- **Alternatives:** + - per-call-site `ContentZoomRoot` wraps with a `zoomArea` prop threaded through the comment + list (repeated at every site, easy to forget); + - the bootstrap detecting Radix pop-ups and copying the trigger's area (depends on Radix + internals); + - keeping pop-ups at interface scale (rejected by the product owner). +- **Consequences:** + - six shadcn files carry `CUSTOM` changes - three functional (popover, dropdown menu, tooltip) + and three recording the components that do not follow an area yet; + - the library's `Select`, `ContextMenu`, `Menubar` and dropdown sub-menu + (`DropdownMenuSubContent`) content do not follow an area yet; each needs the same small change + when first opened from zoomed content; + - a pop-up portaled into a container inside another area inherits that container's zoom. +- **Source:** PT-4634. + ## adr-primary-window-owns-app-lifetime: The primary window's close decides whether the app quits; the role stays a role - **Date:** 2026-08-27 @@ -6995,13 +7027,13 @@ and the rename lands with the `ProjectSelector` migration (PT-4549). Both names not even register its wheel listener while a pane has no areas — and the platform scales such a view whole at the Settings default instead. On Windows and Linux this is what a user notices first: Ctrl+`+`, Ctrl+`-` and Ctrl+`0` now do nothing anywhere except a view that answers them itself — - today the Scripture editor, through the zoom areas it marks, and Enhanced Resources, through the - keydown handler it has always had for its own scripture-pane zoom + today the Scripture editor and the comment list, through the zoom areas they mark, and Enhanced + Resources, through the keydown handler it has always had for its own scripture-pane zoom (`extensions/src/platform-enhanced-resources/src/web-views/enhanced-resource.web-view.tsx`). Main no longer claims those chords, nothing replaces them, and a pane with no marked area deliberately leaves the keystroke to whoever else may want it rather than swallowing it for no effect. So a user - on Notes, or on the Text Collection — whose own pane zoom is wheel and menu only — presses Ctrl+0 - and nothing happens. That is the intended cost of scoping zoom to a pane rather than to the window, + on the Text Collection — whose own pane zoom is wheel and menu only — or on any view that marks no + area, such as Home or an inventory, presses Ctrl+0 and nothing happens. That is the intended cost of scoping zoom to a pane rather than to the window, and it shrinks as views adopt the mechanism (the Text Collection grid in PT-4582, Enhanced Resources in PT-4583). The bootstrap listens in the **bubble** phase on purpose, so a view that owns Ctrl+wheel for a sub-region keeps precedence by stopping propagation in the capture diff --git a/.context/standards/Component-Builder-Patterns.md b/.context/standards/Component-Builder-Patterns.md index 9d41e59ea2f..d773ffbd30a 100644 --- a/.context/standards/Component-Builder-Patterns.md +++ b/.context/standards/Component-Builder-Patterns.md @@ -188,6 +188,22 @@ The platform then scales that element on Ctrl/⌘+`+`/`-`/`0`, Ctrl/⌘+wheel an First reference implementation: the Scripture editor's two areas, `main` for the text and `footnotes` for the footnotes pane (PT-4581). +**Pop-ups follow their area.** Popovers, dropdown menus and tooltips from `platform-bible-react` +that open from inside a `ContentZoomRoot` take that area's zoom level. Popovers and dropdown +menus also cap their own width and height to the pane's available space and scroll their content +if it doesn't fit; tooltips cap only width, so a tooltip taller than the available space is +clipped at the pane's edge. A pop-up your view renders outside the area element — beside the +content and anchored to a position in it — joins the area only when wrapped in +`ContentZoomAreaProvider` (pass the same `area` as the root; omit it for the main area). Toolbar +pop-ups outside every area stay at interface scale. `SelectContent`, `ContextMenuContent`, +`MenubarContent` and `DropdownMenuSubContent` do not follow an area yet either — they render at +interface scale even when opened from inside one. `ContentZoomRoot` and `ContentZoomAreaProvider` +are experimental. A +pop-up you build without these components can opt in by putting +`data-platform-content-zoom-root=""` and `data-platform-content-zoom-popup` on its portaled +content. Those attributes only scale it: such a pop-up gets none of the library's size caps, so it +must keep itself inside the pane. + --- ## Async Hook State Shape diff --git a/.context/standards/Extension-Development-Guide.md b/.context/standards/Extension-Development-Guide.md index b39afe385b9..31924d7f45d 100644 --- a/.context/standards/Extension-Development-Guide.md +++ b/.context/standards/Extension-Development-Guide.md @@ -325,6 +325,22 @@ That is the whole opt-in. The platform then scales the marked element on Ctrl/ `ContentZoomRoot`, `CONTENT_ZOOM_ROOT_ATTRIBUTE` and the `data-platform-content-zoom-root` contract are **experimental** and may change without notice. +**Pop-ups follow their area.** Popovers, dropdown menus and tooltips from `platform-bible-react` +that open from inside a `ContentZoomRoot` take that area's zoom level. Popovers and dropdown +menus also cap their own width and height to the pane's available space and scroll their content +if it doesn't fit; tooltips cap only width, so a tooltip taller than the available space is +clipped at the pane's edge. A pop-up your view renders outside the area element — beside the +content and anchored to a position in it — joins the area only when wrapped in +`ContentZoomAreaProvider` (pass the same `area` as the root; omit it for the main area). Toolbar +pop-ups outside every area stay at interface scale. `SelectContent`, `ContextMenuContent`, +`MenubarContent` and `DropdownMenuSubContent` do not follow an area yet either — they render at +interface scale even when opened from inside one. `ContentZoomRoot` and `ContentZoomAreaProvider` +are experimental. A +pop-up you build without these components can opt in by putting +`data-platform-content-zoom-root=""` and `data-platform-content-zoom-popup` on its portaled +content. Those attributes only scale it: such a pop-up gets none of the library's size caps, so it +must keep itself inside the pane. + --- ## Contributions diff --git a/.context/standards/Paranext-Core-Patterns.md b/.context/standards/Paranext-Core-Patterns.md index 4a9d95efeac..a984699a927 100644 --- a/.context/standards/Paranext-Core-Patterns.md +++ b/.context/standards/Paranext-Core-Patterns.md @@ -1237,6 +1237,13 @@ user controls, a hidden one for the memory. copy of the definition's state, and it has to be taught by hand about every open, move, reload and close the definition already handles. +State kept in a definition needs to say **what it belongs to** whenever the pane can be re-pointed at +another project: a re-point keeps the web view id and the view rebuilds its definition by spreading +its own saved state, so the old project's state arrives looking like state chosen for the new one. +Store the identity beside the value and check it. Content zoom stamps +`platform.contentZoomIdentity` (`kind:identity`) alongside its levels and re-seeds the pane from +memory when the two disagree. + Reference: content zoom keeps the pane's own levels under `platform.contentZoomLevels` in the definition state, and the default and per-project memory in the `platform.webViewContentZoom` and `platform.webViewContentZoomMemory` settings diff --git a/e2e-tests/fixtures/comment-test-helpers.ts b/e2e-tests/fixtures/comment-test-helpers.ts index 3bc3586d133..ca58953fba2 100644 --- a/e2e-tests/fixtures/comment-test-helpers.ts +++ b/e2e-tests/fixtures/comment-test-helpers.ts @@ -32,14 +32,16 @@ import crypto from 'crypto'; import fs from 'fs'; import path from 'path'; import os from 'os'; -import { expect, type FrameLocator, type Page } from '@playwright/test'; +import { expect, type Frame, type FrameLocator, type Page } from '@playwright/test'; import { addUsersToProject, + DEFAULT_WEBSOCKET_PORT, escapeXml, PAPI_METHOD_REGISTRATION_TIMEOUT_MS, sendPapiRequestOnce, waitForPapiMethodRegistered, } from './helpers'; +import { getEditorFrame } from './scripture-editor-helpers'; // ───────────────────────────────────────────────────────────────────────────── // Constants @@ -65,8 +67,6 @@ const PARATEXT_PROJECTS_ROOT = path.join( /** Network object name for the Paratext project data provider factory */ const PARATEXT_PDPF_METHOD = 'object:platform.Paratext-pdpf.getProjectDataProviderId'; -const DEFAULT_WEBSOCKET_PORT = 8876; - /** * Paratext app-data directories are named `Paratext` — `Paratext80` is 8.0, * `Paratext94` is 9.4, `Paratext100` is 10.0 — so the suffix read as a number orders the versions @@ -635,6 +635,118 @@ export async function openCommentList(mainPage: Page, project: CommentTestProjec throw new Error(`Failed to open comment list after 5 attempts for project ${project.shortName}`); } +/** + * Clicks a project-scoped comment-list tab — the Column 3 "Comments" tab in Simple mode + * (`comments-tab.spec.ts`) or the per-project Comments panel tab it shares a layout with + * (`comments-panel-content-zoom.spec.ts`) — handling the rc-tabs overflow case where the tab is + * attached but clipped by the scrollable tab bar: rc-tabs renders every tab node at all times but + * clips those outside the visible portion, so `toBeAttached()` succeeds for a clipped tab while a + * direct click would miss it. + * + * @param webViewId The tab's web view id (`data-web-view-id` on `.platform-tab-title`) + * @param actionTimeoutMs Bounds the click/hover actions — pass a short value when calling inside a + * retry loop so a blocked click (e.g. the workspace-updating overlay intercepting pointer events) + * fails fast and the loop can retry, instead of burning the default 30 s action timeout + */ +export async function clickCommentsTab( + mainPage: Page, + webViewId: string, + actionTimeoutMs = 30_000, +): Promise { + const tabTitle = mainPage.locator(`.platform-tab-title[data-web-view-id="${webViewId}"]`); + if (await tabTitle.isVisible()) { + await tabTitle.click({ timeout: actionTimeoutMs }); + return; + } + // Tab is outside the visible scroll area — open the overflow dropdown and activate it. + const dockBar = mainPage.locator('.dock-bar').filter({ has: tabTitle }); + await dockBar.locator('.dock-nav-more').hover({ timeout: actionTimeoutMs }); + // rc-tabs re-renders PlatformTabTitle (including our data-web-view-id) in the overflow popup. + await mainPage + .locator('[role="listbox"] [role="option"]') + .filter({ has: mainPage.locator(`[data-web-view-id="${webViewId}"]`) }) + .click({ timeout: 5_000 }); +} + +/** + * Points the (worker-scoped, singleton) Comment List Panel — the Column 3 "Comments" tab in Simple + * mode — at `projectId`, via the `legacyCommentManager.openCommentListPanel` command. Shared by + * `comments-tab.spec.ts` (called inline for each of its test projects) and + * `comments-panel-content-zoom.spec.ts` (its own Simple-mode Column 3 panel tab). + */ +export async function openCommentListPanel( + projectId: string, + port = DEFAULT_WEBSOCKET_PORT, + registrationTimeoutMs = 60_000, + sendTimeoutMs = 150_000, +): Promise { + await waitForPapiMethodRegistered( + 'command:legacyCommentManager.openCommentListPanel', + port, + registrationTimeoutMs, + ); + await sendPapiRequestOnce( + 'command:legacyCommentManager.openCommentListPanel', + [projectId], + port, + sendTimeoutMs, + ); +} + +/** + * Calls {@link openCommentListPanel}, brings its tab to front (which is also what mounts the panel's + * iframe the first time — Column 3's tabs render their content lazily, on first activation), and + * retries the whole sequence, bounded, until the iframe attaches and `expectedText` appears inside + * it — ARRANGEMENT only, for seeding the (fixed, non-closable Simple-mode) singleton Comments panel + * with content before a test acts on it. Returns the resolved content frame so the caller doesn't + * need a separate {@link getEditorFrame} call. + * + * TODO(PT-4745): every `openCommentListPanel` call re-points an already-mounted panel rather than + * creating a fresh instance (Simple mode's Comments panel is a singleton mounted before any test + * code runs), and the re-point sometimes never reaches the mounted component's props — the panel + * then keeps showing the previous project (or nothing), with no error. The command is idempotent, + * so reissuing it here is safe. Do NOT reach for this to retry an assertion that is itself testing + * the re-point path — see `comments-panel-content-zoom.spec.ts`'s "re-pointed panel" step, which is + * `test.step.skip`ped for the same underlying bug instead of retried, because retrying there would + * retry the very behavior under test. + * + * @param mainPage The Electron main window page the panel's iframe attaches in + * @param panelId The Comment List Panel's web view id (`data-web-view-id`) + * @param projectId The project id to point the panel at + * @param expectedText Text expected to appear in the panel body once it shows `projectId`'s content + * @param attempts Bounded retry count; the call is cheap and idempotent, so a few attempts absorb + * the intermittent re-point failure without masking a persistent one + */ +export async function openCommentListPanelUntilVisible( + mainPage: Page, + panelId: string, + projectId: string, + expectedText: string, + attempts = 3, +): Promise { + let lastError: unknown; + // Sequential retry loop: each attempt must open the panel, activate its tab, wait for its iframe, + // and poll for its content before deciding whether to retry. + /* eslint-disable no-await-in-loop */ + for (let attempt = 0; attempt < attempts; attempt++) { + await openCommentListPanel(projectId); + await clickCommentsTab(mainPage, panelId); + const timeout = attempt < attempts - 1 ? 20_000 : 90_000; + try { + await mainPage + .locator(`iframe[data-web-view-id="${panelId}"]`) + .waitFor({ state: 'attached', timeout }); + const frame = await getEditorFrame(mainPage, panelId); + await expect(frame.locator('body')).toContainText(expectedText, { timeout }); + return frame; + } catch (e) { + lastError = e; + } + } + /* eslint-enable no-await-in-loop */ + throw lastError; +} + /** Returns the frame locator for the comment list web view iframe. */ export function getCommentListFrame(mainPage: Page): FrameLocator { // The comment list iframe has title "Comments: {shortName}"; the scripture editor iframe has diff --git a/e2e-tests/fixtures/content-zoom-helpers.ts b/e2e-tests/fixtures/content-zoom-helpers.ts new file mode 100644 index 00000000000..12dda240d6c --- /dev/null +++ b/e2e-tests/fixtures/content-zoom-helpers.ts @@ -0,0 +1,218 @@ +/** + * Helpers shared by the three content-zoom e2e specs that import this module — + * `tests/isolated/notes-content-zoom/comment-list-content-zoom.spec.ts`, + * `tests/isolated/notes-content-zoom/comments-panel-content-zoom.spec.ts`, and + * `tests/isolated/scripture-editor/content-zoom.spec.ts`: the wheel gesture every one of them + * drives, the memory-setting reader every one of them polls, and the indicator/zoom-area selectors + * every one of them reads. + */ +import { type Frame, type Locator, type Page, expect } from '@playwright/test'; +import { CONTENT_ZOOM_COMMANDS, readFactor, sendCommandWithId } from './scripture-editor-helpers'; + +/** + * Setting key the memory-key-shape assertions read directly + * (`src/renderer/services/web-view-content-zoom.service.ts`). + */ +export const CONTENT_ZOOM_MEMORY_SETTING = 'platform.webViewContentZoomMemory'; + +/** + * The `id` the platform's zoom indicator badge is created with + * (`web-view-content-zoom.bootstrap-script.ts`). + */ +export const INDICATOR_SELECTOR = '#platform-content-zoom-indicator'; + +/** + * Ctrl+wheel over the centre of `box` (main-frame-relative coordinates, as {@link areaBox} returns). + * `deltaY: -120` zooms in, `+120` zooms out (`web-view-content-zoom.bootstrap-script.ts`'s + * `onWheel`: `e.deltaY < 0` is zoom-in). Does not itself wait for the effect — callers poll the + * resulting factor, never a bare timeout, since geometry inside a zoomed frame moves and a fixed + * wait would race the debounced write. + */ +export async function ctrlWheel( + page: Page, + box: { x: number; y: number; width: number; height: number }, + deltaY: number, +): Promise { + await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2); + await page.keyboard.down('Control'); + await page.mouse.wheel(0, deltaY); + await page.keyboard.up('Control'); +} + +/** Reads the `platform.webViewContentZoomMemory` setting straight from the renderer. */ +export async function readContentZoomMemory(page: Page): Promise> { + return page.evaluate((settingKey) => { + // The renderer exposes `papi` on `globalThis`, untyped here (same pattern as + // scripture-text-grid-zoom.spec.ts's afterEach cleanup). + // eslint-disable-next-line no-type-assertion/no-type-assertion + const win = window as unknown as { + papi: { settings: { get: (key: string) => Promise> } }; + }; + return win.papi.settings.get(settingKey); + }, CONTENT_ZOOM_MEMORY_SETTING); +} + +/** Indicator text with whitespace stripped, so the narrow no-break space before `%` doesn't matter. */ +export async function readIndicatorText(frame: Frame): Promise { + const text = await frame.locator(INDICATOR_SELECTOR).textContent(); + return text?.replace(/\s/gu, ''); +} + +/** Bounding box (main-frame-relative) of one zoom area's marked root element. */ +export async function areaBox( + frame: Frame, + areaId: string, +): Promise<{ x: number; y: number; width: number; height: number }> { + const box = await frame + .locator( + `[data-platform-content-zoom-root="${areaId}"]:not([data-platform-content-zoom-popup])`, + ) + .boundingBox(); + if (!box) throw new Error(`Zoom area "${areaId}" has no bounding box`); + return box; +} + +/** + * Steps one area to `target` through the zoom commands, polling the area's factor after each step + * (a step lands after a debounced write, so a bare loop would race it). `areaId` is `'main'` or a + * named area; `readFactor` takes `''` for `main`. + */ +export async function zoomAreaTo( + page: Page, + frame: Frame, + webViewId: string, + areaId: string, + target: number, +): Promise { + const factorKey = areaId === 'main' ? '' : areaId; + await sendCommandWithId(page, CONTENT_ZOOM_COMMANDS.reset, webViewId, areaId); + await expect.poll(() => readFactor(frame, factorKey)).toBe(1); + let current = 1; + // Sequential zoom steps: each step's write must land (confirmed by the poll) before the next + // command is sent, or the loop would race a debounced write. + /* eslint-disable no-await-in-loop */ + while (Math.abs(current - target) > 0.001) { + const stepIn = target > current; + // Each command changes the level by exactly one 10 % step; see `adjustZoomFactor`. + await sendCommandWithId( + page, + stepIn ? CONTENT_ZOOM_COMMANDS.in : CONTENT_ZOOM_COMMANDS.out, + webViewId, + areaId, + ); + current = Math.round((current + (stepIn ? 0.1 : -0.1)) * 10) / 10; + const expected = current; + await expect.poll(() => readFactor(frame, factorKey)).toBe(expected); + } + /* eslint-enable no-await-in-loop */ +} + +/** + * Waits until the finite animations on `popup` and its descendants have finished. A pop-up that has + * just opened runs a short scale-in animation, and `boundingBox()` includes that transform, so a + * box read before it ends is smaller than the settled one. Infinite animations (a spinner inside + * the pop-up) never finish and are not waited for. + */ +export async function waitForPopupAnimations(popup: Locator): Promise { + await popup.evaluate(async (element) => { + await Promise.all( + element + .getAnimations({ subtree: true }) + .filter((animation) => animation.effect?.getComputedTiming().endTime !== Infinity) + // A cancelled animation rejects `finished`; it no longer transforms the box either. + .map((animation) => animation.finished.catch(() => undefined)), + ); + }); +} + +/** Largest gap, in pixels, between a pop-up and its trigger that still counts as "beside" it. */ +const POPUP_TRIGGER_MAX_GAP_PX = 24; + +/** A main-frame-relative box, as Playwright's `boundingBox()` returns it. */ +export type PageBox = { x: number; y: number; width: number; height: number }; + +/** A frame's own box, main-frame-relative. Throws when the frame has none. */ +export async function frameBox(frame: Frame): Promise { + const box = await (await frame.frameElement()).boundingBox(); + if (!box) throw new Error('Frame has no box'); + return box; +} + +/** + * A pop-up trigger's main-frame box: the element's own box when `trigger` is a `Locator`, or the + * box already given directly when it is no element of its own (a text caret or selection). Throws + * when there is no box. + */ +export async function triggerBox(trigger: Locator | PageBox): Promise { + const box = 'boundingBox' in trigger ? await trigger.boundingBox() : trigger; + if (!box) throw new Error('Trigger has no box'); + return box; +} + +/** + * Asserts an open pop-up sits beside its trigger (touching or within + * {@link POPUP_TRIGGER_MAX_GAP_PX} on one axis and overlapping on the other, without covering the + * trigger), lies fully inside the web view's frame, and holds its content without overflowing. + * `trigger` is an element, or a main-frame-relative box for a trigger that is no element of its own + * (a text caret or selection). Waits for the pop-up's open animation first, so the boxes compared + * are its settled ones. + */ +export async function expectPopupBesideTriggerAndInsideFrame( + frame: Frame, + popup: Locator, + trigger: Locator | PageBox, +): Promise { + await waitForPopupAnimations(popup); + const frameRect = await frameBox(frame); + const popupBox = await popup.boundingBox(); + const triggerRect = await triggerBox(trigger); + if (!popupBox) throw new Error('Pop-up has no box'); + const gapY = Math.max( + popupBox.y - (triggerRect.y + triggerRect.height), + triggerRect.y - (popupBox.y + popupBox.height), + ); + const gapX = Math.max( + popupBox.x - (triggerRect.x + triggerRect.width), + triggerRect.x - (popupBox.x + popupBox.width), + ); + const tolerance = 1; + const boxes = `pop-up ${JSON.stringify(popupBox)}, trigger ${JSON.stringify(triggerRect)}, frame ${JSON.stringify(frameRect)}`; + const separation = Math.max(gapX, gapY); + // Beside = separated on at most one axis, by a small gap, and never covering the trigger. + expect(Math.min(gapX, gapY), `separated on one axis only: ${boxes}`).toBeLessThanOrEqual( + tolerance, + ); + // Two boxes intersect exactly when both gaps are negative, so the larger gap must not be. + expect(separation, `not covering the trigger: ${boxes}`).toBeGreaterThanOrEqual(-tolerance); + expect(separation, `close to the trigger: ${boxes}`).toBeLessThanOrEqual( + POPUP_TRIGGER_MAX_GAP_PX, + ); + expect(popupBox.x, `inside the frame: ${boxes}`).toBeGreaterThanOrEqual(frameRect.x - tolerance); + expect(popupBox.y, `inside the frame: ${boxes}`).toBeGreaterThanOrEqual(frameRect.y - tolerance); + expect(popupBox.x + popupBox.width, `inside the frame: ${boxes}`).toBeLessThanOrEqual( + frameRect.x + frameRect.width + tolerance, + ); + expect(popupBox.y + popupBox.height, `inside the frame: ${boxes}`).toBeLessThanOrEqual( + frameRect.y + frameRect.height + tolerance, + ); + // The box alone is not enough: content that cannot shrink to a capped box paints past its edges + // while the box itself looks fine. Its own scroll size must fit its client size (both in its own + // CSS pixels, so the zoom factor cancels out). Never sideways; vertically only when the box is a + // scroll box, where taller content scrolls inside it instead of painting past it. + const overflow = await popup.evaluate((element) => ({ + scrollWidth: element.scrollWidth, + clientWidth: element.clientWidth, + scrollHeight: element.scrollHeight, + clientHeight: element.clientHeight, + scrollsVertically: ['auto', 'scroll'].includes(getComputedStyle(element).overflowY), + })); + expect( + overflow.scrollWidth, + `content fits sideways (scroll ${overflow.scrollWidth}, client ${overflow.clientWidth}): ${boxes}`, + ).toBeLessThanOrEqual(overflow.clientWidth + tolerance); + if (!overflow.scrollsVertically) + expect( + overflow.scrollHeight, + `content fits vertically in a pop-up that does not scroll (scroll ${overflow.scrollHeight}, client ${overflow.clientHeight}): ${boxes}`, + ).toBeLessThanOrEqual(overflow.clientHeight + tolerance); +} diff --git a/e2e-tests/fixtures/helpers.ts b/e2e-tests/fixtures/helpers.ts index 304c5407213..8fe30fc641a 100644 --- a/e2e-tests/fixtures/helpers.ts +++ b/e2e-tests/fixtures/helpers.ts @@ -13,7 +13,7 @@ import WebSocket from 'ws'; import { suppressOnboardingTour } from './onboarding-tour.page'; import { WINDOW_ID_SHAPE_SOURCE } from './window-id-shape'; -const DEFAULT_WEBSOCKET_PORT = 8876; +export const DEFAULT_WEBSOCKET_PORT = 8876; // Re-exported so the matchers below and the specs that build their own read one shape from one // place. It is defined in its own import-free module so the drift guard can read it without pulling diff --git a/e2e-tests/fixtures/scripture-editor-helpers.ts b/e2e-tests/fixtures/scripture-editor-helpers.ts index 58e56b27f18..2b80e731c54 100644 --- a/e2e-tests/fixtures/scripture-editor-helpers.ts +++ b/e2e-tests/fixtures/scripture-editor-helpers.ts @@ -104,7 +104,9 @@ export async function ensureFootnotesVisible( frame: Frame, webViewId: string, ): Promise { - const footnotesRoot = frame.locator('[data-platform-content-zoom-root="footnotes"]'); + const footnotesRoot = frame.locator( + '[data-platform-content-zoom-root="footnotes"]:not([data-platform-content-zoom-popup])', + ); if ((await footnotesRoot.count()) === 0) { await sendCommandWithId(page, 'platformScriptureEditor.toggleFootnotes', webViewId); } diff --git a/e2e-tests/tests/isolated/README.md b/e2e-tests/tests/isolated/README.md index 701888bad36..91cc07793b6 100644 --- a/e2e-tests/tests/isolated/README.md +++ b/e2e-tests/tests/isolated/README.md @@ -44,6 +44,7 @@ These belong to no subset; run them by path (see "How to run"). in `window-close-rule.spec.ts`, which use no fixture and call `launchElectronApp` themselves — several launches per test to exercise relaunch) — tests for multi-window lifecycle (second-window startup, focus routing, app-global scroll group and theme state reaching every window and surviving any window's close, single shutdown-task run on quit), window layout persistence (windows, layouts, and bounds surviving relaunches; a deliberately closed window staying closed; the pre-multi-window single-window upgrade path), and per-window UI isolation (overlays, dialogs, notifications, navigation targets, and web-view placement staying in their own window; scroll groups deliberately app-global) - `navigation-history/` (one Electron per test) — tests for back/forward reference history navigation +- `notes-content-zoom/` (one Electron per spec, worker-scoped via `commentAppOwner`) — tests for the Notes feature's per-pane content zoom (comment list, Simple-mode Comments panel) - `overlay/` (one Electron per test) — tests for the project-switch transition overlay - `scripture-editor/` (one Electron per test) — tests for the scripture editor itself: which view a mode opens in, marker-attribute display settling, the paragraph-style and marker-palette triggers, type-through-save echo, and the Standard-view clipboard USFM round trip. The clipboard spec writes to the real machine-wide OS clipboard — see "State that leaks between runs" in `e2e-tests/CLAUDE.md` - `scroll-groups/` (one Electron per test) — tests for scroll-group synchronization between scripture editors diff --git a/e2e-tests/tests/isolated/comments-tab.spec.ts b/e2e-tests/tests/isolated/comments-tab.spec.ts index ccfaa5dd67c..86b518bbb64 100644 --- a/e2e-tests/tests/isolated/comments-tab.spec.ts +++ b/e2e-tests/tests/isolated/comments-tab.spec.ts @@ -45,6 +45,7 @@ import type { Page } from '@playwright/test'; import { test, expect } from '../../fixtures/comment.fixture'; import { + DEFAULT_WEBSOCKET_PORT, waitForAppReady, waitForOpenWebViewIdByType, waitForOverlayGone, @@ -53,12 +54,13 @@ import { } from '../../fixtures/helpers'; import { type CommentTestProject, + clickCommentsTab, createCommentTestProject, cleanupCommentTestProject, createCommentThreads, + openCommentListPanel, } from '../../fixtures/comment-test-helpers'; -const DEFAULT_WEBSOCKET_PORT = 8876; const SETTINGS_TIMEOUT_MS = 60_000; /** * `openScriptureEditor` triggers `openOrUpdateRelatedPanels`, which sequentially awaits five PAPI @@ -164,39 +166,6 @@ async function openScriptureEditor( } } -/** - * Click the Comments tab in Column 3. - * - * If the tab title is scrolled outside the visible portion of the tab bar (clipped by the rc-tabs - * overflow container), hover the `.dock-nav-more` overflow button to open the dropdown, then click - * the Comments option via its `data-web-view-id` attribute. - * - * `actionTimeoutMs` bounds the click/hover actions — pass a short value when calling inside a retry - * loop so a blocked click (e.g. the workspace-updating overlay intercepting pointer events) fails - * fast and the loop can retry, instead of burning the default 30 s action timeout. - */ -async function clickCommentsTab( - mainPage: Page, - commentListPanelId: string, - actionTimeoutMs = 30_000, -): Promise { - const tabTitle = mainPage.locator( - `.platform-tab-title[data-web-view-id="${commentListPanelId}"]`, - ); - if (await tabTitle.isVisible()) { - await tabTitle.click({ timeout: actionTimeoutMs }); - return; - } - // Tab is outside the visible scroll area — open the overflow dropdown and activate it. - const dockBar = mainPage.locator('.dock-bar').filter({ has: tabTitle }); - await dockBar.locator('.dock-nav-more').hover({ timeout: actionTimeoutMs }); - // rc-tabs re-renders PlatformTabTitle (including our data-web-view-id) in the overflow popup. - await mainPage - .locator('[role="listbox"] [role="option"]') - .filter({ has: mainPage.locator(`[data-web-view-id="${commentListPanelId}"]`) }) - .click({ timeout: 5_000 }); -} - // Own this spec's Electron app so it is not inherited from another spec that has already replaced // the Column 2 scripture-editor slot waitForSimpleLayout waits for. See comment.fixture.ts. test.use({ commentAppOwner: 'comments-tab' }); @@ -279,17 +248,7 @@ test.describe('Comments tab in P10 Simple mode (PT-4068 / PT-4069)', () => { // that call getWebView for the comment list panel while the sentinel is in flight, // occasionally overwriting it with the previously-open developer project. Calling directly // here is safe because waitForSimpleLayout already confirmed the dock is stable (overlay gone). - await waitForPapiMethodRegistered( - 'command:legacyCommentManager.openCommentListPanel', - DEFAULT_WEBSOCKET_PORT, - SETTINGS_TIMEOUT_MS, - ); - await sendPapiRequestOnce( - 'command:legacyCommentManager.openCommentListPanel', - [project.projectId], - DEFAULT_WEBSOCKET_PORT, - OPEN_EDITOR_TIMEOUT_MS, - ); + await openCommentListPanel(project.projectId); await clickCommentsTab(mainPage, commentListPanelId); @@ -317,17 +276,7 @@ test.describe('Comments tab in P10 Simple mode (PT-4068 / PT-4069)', () => { // Point the Column 3 Comments tab at the seeded project (same direct-open path the // "has comments" test uses — see that test for why we avoid openScriptureEditor here). - await waitForPapiMethodRegistered( - 'command:legacyCommentManager.openCommentListPanel', - DEFAULT_WEBSOCKET_PORT, - SETTINGS_TIMEOUT_MS, - ); - await sendPapiRequestOnce( - 'command:legacyCommentManager.openCommentListPanel', - [projectScroll.projectId], - DEFAULT_WEBSOCKET_PORT, - OPEN_EDITOR_TIMEOUT_MS, - ); + await openCommentListPanel(projectScroll.projectId); await clickCommentsTab(mainPage, commentListPanelId); @@ -381,17 +330,7 @@ test.describe('Comments tab in P10 Simple mode (PT-4068 / PT-4069)', () => { ['PT-4070 keyboard a11y 1', 'PT-4070 keyboard a11y 2', 'PT-4070 keyboard a11y 3'], ); - await waitForPapiMethodRegistered( - 'command:legacyCommentManager.openCommentListPanel', - DEFAULT_WEBSOCKET_PORT, - SETTINGS_TIMEOUT_MS, - ); - await sendPapiRequestOnce( - 'command:legacyCommentManager.openCommentListPanel', - [projectScroll.projectId], - DEFAULT_WEBSOCKET_PORT, - OPEN_EDITOR_TIMEOUT_MS, - ); + await openCommentListPanel(projectScroll.projectId); await clickCommentsTab(mainPage, commentListPanelId); @@ -447,17 +386,7 @@ test.describe('Comments tab in P10 Simple mode (PT-4068 / PT-4069)', () => { await createCommentThreads(projectScroll, ['GEN 3:1'], ['PT-4070 scope-option test']); - await waitForPapiMethodRegistered( - 'command:legacyCommentManager.openCommentListPanel', - DEFAULT_WEBSOCKET_PORT, - SETTINGS_TIMEOUT_MS, - ); - await sendPapiRequestOnce( - 'command:legacyCommentManager.openCommentListPanel', - [projectScroll.projectId], - DEFAULT_WEBSOCKET_PORT, - OPEN_EDITOR_TIMEOUT_MS, - ); + await openCommentListPanel(projectScroll.projectId); const commentsFrame = commentsFrameLocator(mainPage, commentListPanelId); // Find the scope dropdown by its stable data-testid rather than by trigger index — the index diff --git a/e2e-tests/tests/isolated/find/find.spec.ts b/e2e-tests/tests/isolated/find/find.spec.ts index d1493af80a9..f0f2205654e 100644 --- a/e2e-tests/tests/isolated/find/find.spec.ts +++ b/e2e-tests/tests/isolated/find/find.spec.ts @@ -49,8 +49,9 @@ * tab nodes at all times but clips those that overflow, so `toBeAttached()` succeeds for a clipped * tab while `toBeVisible()` fails. {@link activateTab} handles both cases, clicking the tab directly * when visible and otherwise going through the `.dock-nav-more` overflow dropdown. This mirrors - * `clickCommentsTab` in `tests/isolated/comments-tab.spec.ts`, the proven precedent for a - * permanent, non-closable Column 3 tab. + * `clickCommentsTab` in `fixtures/comment-test-helpers.ts` (shared by `comments-tab.spec.ts` and + * `notes-content-zoom/comments-panel-content-zoom.spec.ts`), the proven precedent for a permanent, + * non-closable Column 3 tab. */ import { ElectronApplication, Frame, FrameLocator, Locator, Page } from '@playwright/test'; diff --git a/e2e-tests/tests/isolated/notes-content-zoom/comment-list-content-zoom.spec.ts b/e2e-tests/tests/isolated/notes-content-zoom/comment-list-content-zoom.spec.ts new file mode 100644 index 00000000000..30e6993db11 --- /dev/null +++ b/e2e-tests/tests/isolated/notes-content-zoom/comment-list-content-zoom.spec.ts @@ -0,0 +1,437 @@ +/** + * E2E for the comment list's per-pane content zoom: Ctrl+wheel and the + * `platform.webViewContentZoom*` commands scale the comment cards while the filter toolbar stays + * fixed, the level is remembered per project, a same-project editor keeps an independent level, and + * BCV-driven scroll sync still lands on the right card once the list is zoomed. + * + * ONE test() per spec file, matching every other suite built on the worker-scoped comment fixture: + * a second Electron instance against the shared renderer dev server has a documented dock-tab + * failure mode. Sub-scenarios are test.step()s sharing the one instance. + * + * `npm run test:e2e:isolated notes-content-zoom` + */ +import { type Frame, type Page } from '@playwright/test'; +import { test, expect } from '../../../fixtures/comment.fixture'; +import { + type CommentTestProject, + createCommentTestProject, + cleanupCommentTestProject, + createCommentThreads, + openCommentList, +} from '../../../fixtures/comment-test-helpers'; +import { + ctrlWheel, + expectPopupBesideTriggerAndInsideFrame, + INDICATOR_SELECTOR, + readContentZoomMemory, + readIndicatorText, + waitForPopupAnimations, + zoomAreaTo, +} from '../../../fixtures/content-zoom-helpers'; +import { waitForAppReady, waitForOpenWebViewIdByType } from '../../../fixtures/helpers'; +import { + CONTENT_ZOOM_COMMANDS, + getEditorFrame, + navigateToolbarBcv, + readFactor, + sendCommandWithId, +} from '../../../fixtures/scripture-editor-helpers'; + +test.use({ commentAppOwner: 'notes-content-zoom-list' }); + +/** `webViewType` of the comment list web view (`legacyCommentManager.main.ts`). */ +const COMMENT_LIST_WEBVIEW_TYPE = 'legacyCommentManager.commentList'; + +/** + * `webViewType` of the Scripture editor web views (`SCRIPTURE_EDITOR_WEBVIEW_TYPE`, + * `src/shared/models/web-view.model.ts`). + */ +const SCRIPTURE_EDITOR_WEBVIEW_TYPE = 'platformScriptureEditor.react'; + +/** Locates a rendered comment thread card by its thread id (the id `createCommentThreads` returns). */ +function cardLocator(frame: Frame, threadId: string) { + return frame.locator(`[role="option"][id="${threadId}"]`); +} + +/** + * Slack allowed on `cardTopWithinView`'s lower bound to absorb sub-pixel rounding of zoomed client + * rects, not the card's actual scroll position. + */ +const CARD_TOP_TOLERANCE_PX = 4; + +/** + * `id` of the comment list's sticky header (`COMMENT_LIST_STICKY_HEADER_ELEMENT_ID`, + * `extensions/src/legacy-comment-manager/src/comment-list.component.tsx`) — the notice plus the + * filter toolbar. Production measures this same element's height for its own scroll padding + * (`comment-list.web-view.tsx`'s `scrollToTarget`), so `cardTopWithinView` anchors on it too rather + * than on the filter toolbar alone. + */ +const COMMENT_LIST_STICKY_HEADER_ELEMENT_ID = 'comment-list-sticky-header'; + +/** + * How far a card's top sits below the visible top of the list, in the card's own (zoomed) pixels. + * The visible top is the bottom edge of the sticky header: the list's own container never clips + * (the web-view document is what scrolls, and the zoom root travels with the content), so neither + * the zoom root's box nor the bare viewport is the right anchor — the header covers the top of the + * viewport, and the zoom root's top moves with every scroll. Both rectangles are read in one + * `evaluate` so they cannot be a tick apart. The result is signed: a negative value means the + * card's top sits ABOVE the header (scrolled past it), which `toBeInViewport` alone would not + * catch, since the header overlays the card inside the viewport rather than clipping it out. + * Callers must check both directions — see `CARD_TOP_TOLERANCE_PX`. + */ +async function cardTopWithinView( + frame: Frame, + card: ReturnType, +): Promise { + const cardId = await card.getAttribute('id'); + if (!cardId) throw new Error('Comment card has no id'); + return frame.evaluate( + ({ id, headerId }) => { + const header = document.getElementById(headerId); + const element = document.querySelector(`[role="option"][id="${id}"]`); + if (!header || !element) throw new Error(`Sticky header or card "${id}" not found`); + return element.getBoundingClientRect().top - header.getBoundingClientRect().bottom; + }, + { id: cardId, headerId: COMMENT_LIST_STICKY_HEADER_ELEMENT_ID }, + ); +} + +/** A card's rendered height in its own (zoomed) pixels. */ +async function cardHeight(card: ReturnType): Promise { + return card.evaluate((element) => element.getBoundingClientRect().height); +} + +/** + * Waits for a BCV-sync scroll to settle with the card's top inside the visible band: at or below + * the sticky toolbar's bottom edge (within {@link CARD_TOP_TOLERANCE_PX}) and no further down than + * the card's own height. + * + * Both bounds are checked inside ONE poll on purpose. The scroll is animated and still running when + * the navigation call returns, so a poll on a single bound is satisfied by a position the card is + * merely passing through: scrolling down to a later verse the distance starts far positive, and + * scrolling back up to an earlier one it starts far negative — each already satisfies the opposite + * bound on the first sample. The polled value is a phrase rather than a boolean so a failure names + * which way the card missed. + */ +async function expectCardSettledBelowToolbar( + frame: Frame, + card: ReturnType, +): Promise { + await expect + .poll( + async () => { + const top = await cardTopWithinView(frame, card); + const height = await cardHeight(card); + if (top < -CARD_TOP_TOLERANCE_PX) + return `hidden under the toolbar by ${Math.round(-top)}px`; + if (top > height) return `${Math.round(top)}px below the toolbar, past its own height`; + return 'below the toolbar'; + }, + { timeout: 15_000 }, + ) + .toBe('below the toolbar'); +} + +/** + * Closes a dock tab by web view id. `data-web-view-id` is set on `.platform-tab-title` + * (`platform-tab-title.component.tsx`), not on rc-dock's own `.dock-tab` element, so the close + * button is found via its ancestor rather than a `.dock-tab[data-web-view-id]` selector that never + * matches anything. + * + * `dispatchEvent` rather than a real hover+click: on a crowded tab strip the close button can sit + * outside the visible/scrollable area, and `rc-dock` renders a `.dock-tab-hit-area` sibling over + * the same region for drag/drop hit-testing, either of which can make Playwright's actionability + * check report the button as covered or non-actionable for a real click (see `closeFindPanel` in + * `find/replace.spec.ts`, which uses the same `dispatchEvent` for the same reason). + */ +async function closeDockTab(page: Page, webViewId: string): Promise { + const tabTitle = page.locator(`.platform-tab-title[data-web-view-id="${webViewId}"]`); + const dockTab = tabTitle.locator('xpath=ancestor::*[contains(@class,"dock-tab")][1]'); + await dockTab.locator('.dock-tab-close-btn').dispatchEvent('click'); + await expect(tabTitle).not.toBeVisible({ timeout: 10_000 }); +} + +test.describe('comment list content zoom', () => { + let projectA: CommentTestProject; + let projectB: CommentTestProject; + + test.beforeAll(async () => { + projectA = await createCommentTestProject([], 'A'); + projectB = await createCommentTestProject([], 'B'); + }); + + test.afterAll(() => { + cleanupCommentTestProject(projectA); + cleanupCommentTestProject(projectB); + }); + + test('Ctrl+wheel and the zoom commands scale the comment cards, remember the level per project, and stay BCV-synced once zoomed', async ({ + mainPage, + }) => { + // Heavy isolated test (own Electron instance, several zoom gestures each waiting on a debounced + // write, plus a BCV-driven scroll-sync check). Give it Playwright's 3x "slow" budget. + test.slow(); + + await waitForAppReady(mainPage); + + // Threads span several chapters so the BCV-sync step has a distinguishable target, and the six + // after GEN 3:1 guarantee at least a zoomed viewport's worth of content below that target — a + // thread at the very end of the list can never be scrolled to the top of the view. + const threadIds = await createCommentThreads( + projectA, + [ + 'GEN 1:1', + 'GEN 1:5', + 'GEN 2:1', + 'GEN 3:1', + 'GEN 4:1', + 'GEN 5:1', + 'GEN 6:1', + 'GEN 7:1', + 'GEN 8:1', + 'GEN 9:1', + ], + [ + 'Zoom test comment 1', + 'Zoom test comment 2', + 'Zoom test comment 3', + 'Zoom test comment 4', + 'Zoom test comment 5', + 'Zoom test comment 6', + 'Zoom test comment 7', + 'Zoom test comment 8', + 'Zoom test comment 9', + 'Zoom test comment 10', + ], + ); + await openCommentList(mainPage, projectA); + const listId = await waitForOpenWebViewIdByType(mainPage, COMMENT_LIST_WEBVIEW_TYPE); + const editorId = await waitForOpenWebViewIdByType(mainPage, SCRIPTURE_EDITOR_WEBVIEW_TYPE); + const listFrame = await getEditorFrame(mainPage, listId); + // Set by the "reopening" step below; closed by the next step before it opens project B's list, + // so that list's own `waitForOpenWebViewIdByType` (a bare find by type) cannot resolve to this + // one instead of the fresh id project B's list opens with. + let reopenedListId: string | undefined; + + // Baseline: a fresh pane's cards read the Settings default (1), unscaled. + await expect.poll(() => readFactor(listFrame, '')).toBe(1); + const scopeTrigger = listFrame.locator('[data-testid="comment-scope-filter"]'); + const toolbarBoxBaseline = await scopeTrigger.boundingBox(); + if (!toolbarBoxBaseline) throw new Error('Filter toolbar not found'); + + await test.step('Ctrl+wheel over the list scales only the cards', async () => { + const cardBefore = cardLocator(listFrame, threadIds[0]); + const cardBoxBefore = await cardBefore.boundingBox(); + if (!cardBoxBefore) throw new Error('Comment card not found'); + + // Aimed at the first card rather than the zoom area's own box: the area is taller than the + // pane, so its centre point can lie outside the window and the wheel event would land nowhere. + await ctrlWheel(mainPage, cardBoxBefore, -120); + await expect.poll(() => readFactor(listFrame, '')).toBe(1.1); + + const cardBoxAfter = await cardBefore.boundingBox(); + if (!cardBoxAfter) throw new Error('Comment card not found after zoom'); + // A tight tolerance around the actual 1.1 factor: a wide band (e.g. 0.99–1.21) would also + // accept a ratio of 1.0, so a missing marker that left the whole-iframe fallback scaling + // nothing would pass unnoticed. + const ratio = cardBoxAfter.height / cardBoxBefore.height; + expect(ratio).toBeCloseTo(1.1, 1); + + const toolbarBoxZoomed = await scopeTrigger.boundingBox(); + if (!toolbarBoxZoomed) throw new Error('Filter toolbar not found after zoom'); + expect(Math.abs(toolbarBoxZoomed.height - toolbarBoxBaseline.height)).toBeLessThanOrEqual(2); + }); + + await test.step('the zoom indicator carries the area and the current percentage', async () => { + await expect + .poll(() => listFrame.locator(INDICATOR_SELECTOR).getAttribute('data-area'), { + timeout: 2_000, + }) + .toBe('main'); + await expect.poll(() => readIndicatorText(listFrame), { timeout: 2_000 }).toBe('110%'); + }); + + await test.step('the card menu and the assign popover follow the list zoom and stay beside their buttons', async () => { + const card = cardLocator(listFrame, threadIds[0]); + await card.click(); + const menuTrigger = card.locator('button[aria-haspopup="menu"]').first(); + const assignTrigger = card.locator('button[aria-haspopup="dialog"]').first(); + await expect(menuTrigger).toBeVisible(); + + const measureMenuItem = async () => { + await menuTrigger.click(); + const menu = listFrame.locator('[data-slot="dropdown-menu-content"]'); + await expect(menu).toBeVisible(); + await waitForPopupAnimations(menu); + const item = menu.locator('[data-slot="dropdown-menu-item"]').first(); + const box = await item.boundingBox(); + if (!box) throw new Error('Menu item has no box'); + return { menu, height: box.height }; + }; + + // Assign popover: only when the thread offers assignment to this user. + const canAssign = await assignTrigger.isEnabled(); + const assign = listFrame.locator('[data-slot="popover-content"]'); + /** Opens the assign popover, checks it, and returns its first entry's height. */ + const measureAssignItem = async () => { + await assignTrigger.click(); + await expect(assign).toBeVisible(); + await expect(assign).toHaveAttribute('data-platform-content-zoom-root', ''); + // Also waits for the popover's open animation, so the entry below is read at its settled size. + await expectPopupBesideTriggerAndInsideFrame(listFrame, assign, assignTrigger); + const box = await assign.locator('[data-slot="command-item"]').first().boundingBox(); + if (!box) throw new Error('Assign entry has no box'); + // The assign popover stops its own Escape, so the card stays expanded. + await mainPage.keyboard.press('Escape'); + await expect(assign).toBeHidden(); + return box.height; + }; + + await zoomAreaTo(mainPage, listFrame, listId, 'main', 1); + const atDefault = await measureMenuItem(); + await mainPage.keyboard.press('Escape'); + // The card's dropdown menu has no Escape handler of its own, so the keypress bubbles to the + // list container's "Escape collapses the last-interacted thread" handler + // (`handleKeyDownWithEscape` in comment-list.component.tsx) and closes the card along with + // the menu. Re-select it so the trigger exists for the next measurement. + await card.click(); + const assignAtDefault = canAssign ? await measureAssignItem() : undefined; + + const factors = [1.5, 2]; + // Sequential zoom steps: each factor's zoom, measurement and pop-up assertion must complete + // before the next factor is applied. + /* eslint-disable no-await-in-loop */ + for (let i = 0; i < factors.length; i += 1) { + const factor = factors[i]; + await zoomAreaTo(mainPage, listFrame, listId, 'main', factor); + const zoomed = await measureMenuItem(); + expect(zoomed.height / atDefault.height).toBeCloseTo(factor, 1); + await expectPopupBesideTriggerAndInsideFrame(listFrame, zoomed.menu, menuTrigger); + await mainPage.keyboard.press('Escape'); + // Same collapse-on-Escape side effect as above; re-select for the next measurement. + await card.click(); + if (assignAtDefault !== undefined) + expect((await measureAssignItem()) / assignAtDefault).toBeCloseTo(factor, 1); + } + /* eslint-enable no-await-in-loop */ + + if (!canAssign) { + // Recorded so a fixture change that removes assignable users is visible in the report. + test.info().annotations.push({ + type: 'skipped-substep', + description: 'assign popover: no assignable users in the fixture project', + }); + } + + // Leave the level where the following steps expect it (1.1, set by the wheel step above). + await zoomAreaTo(mainPage, listFrame, listId, 'main', 1.1); + }); + + await test.step('memory key shape — keyed by project identity under the notes namespace', async () => { + const normalizedId = projectA.projectId.toUpperCase(); + await expect + .poll(async () => (await readContentZoomMemory(mainPage))[`notes:${normalizedId}:main`]) + .toBe(1.1); + const memory = await readContentZoomMemory(mainPage); + expect(Object.keys(memory).some((key) => key.startsWith(`editor:${normalizedId}:`))).toBe( + false, + ); + }); + + await test.step("the same project's editor keeps its own level, independent of the list", async () => { + const editorFrame = await getEditorFrame(mainPage, editorId); + expect(await readFactor(editorFrame, '')).toBe(1); + expect(await readFactor(listFrame, '')).toBe(1.1); + + await sendCommandWithId(mainPage, CONTENT_ZOOM_COMMANDS.in, editorId, 'main'); + await expect.poll(() => readFactor(editorFrame, '')).toBe(1.1); + expect(await readFactor(listFrame, '')).toBe(1.1); + + const normalizedId = projectA.projectId.toUpperCase(); + await expect + .poll(async () => (await readContentZoomMemory(mainPage))[`editor:${normalizedId}:main`]) + .toBe(1.1); + await expect + .poll(async () => (await readContentZoomMemory(mainPage))[`notes:${normalizedId}:main`]) + .toBe(1.1); + + await sendCommandWithId(mainPage, CONTENT_ZOOM_COMMANDS.in, editorId, 'main'); + await expect.poll(() => readFactor(editorFrame, '')).toBe(1.2); + expect(await readFactor(listFrame, '')).toBe(1.1); + }); + + await test.step('the reset command returns the list to the default and drops its memory entry', async () => { + await sendCommandWithId(mainPage, CONTENT_ZOOM_COMMANDS.reset, listId, 'main'); + await expect.poll(() => readFactor(listFrame, '')).toBe(1); + await expect + .poll(() => readIndicatorText(listFrame), { timeout: 2_000 }) + .toBe('Default·100%'); + + const normalizedId = projectA.projectId.toUpperCase(); + await expect + .poll(async () => (await readContentZoomMemory(mainPage))[`notes:${normalizedId}:main`]) + .toBeUndefined(); + }); + + await test.step('BCV-sync scroll still lands on the right card once the list is zoomed to 150%', async () => { + // Zoom the list back up to 1.5 through the command ladder, polling the factor after each step + // so the loop below never races the debounced write. + const steps = [1.1, 1.2, 1.3, 1.4, 1.5]; + // Sequential zoom-in commands: each step's effect must land before the next is sent. + /* eslint-disable no-await-in-loop */ + for (let i = 0; i < steps.length; i += 1) { + await sendCommandWithId(mainPage, CONTENT_ZOOM_COMMANDS.in, listId, 'main'); + await expect.poll(() => readFactor(listFrame, '')).toBe(steps[i]); + } + /* eslint-enable no-await-in-loop */ + + // Scrolling down to a later verse, then back up to the FIRST card — the direction that a + // sticky header hides the target under, since the scroll stops where the card's top reaches + // the top of the scroll container rather than the top of the visible content. + const gen3Card = cardLocator(listFrame, threadIds[3]); + await navigateToolbarBcv(mainPage, 'Genesis 3:1'); + await expect(gen3Card).toBeInViewport({ timeout: 15_000 }); + await expectCardSettledBelowToolbar(listFrame, gen3Card); + + const gen1Card = cardLocator(listFrame, threadIds[0]); + await navigateToolbarBcv(mainPage, 'Genesis 1:1'); + await expect(gen1Card).toBeInViewport({ timeout: 15_000 }); + await expectCardSettledBelowToolbar(listFrame, gen1Card); + }); + + await test.step('reopening the comment list restores the remembered level without any gesture', async () => { + // Step back down from 1.5 to 1.2, the level this step verifies survives a close/reopen. + await sendCommandWithId(mainPage, CONTENT_ZOOM_COMMANDS.out, listId, 'main'); + await expect.poll(() => readFactor(listFrame, '')).toBe(1.4); + await sendCommandWithId(mainPage, CONTENT_ZOOM_COMMANDS.out, listId, 'main'); + await expect.poll(() => readFactor(listFrame, '')).toBe(1.3); + await sendCommandWithId(mainPage, CONTENT_ZOOM_COMMANDS.out, listId, 'main'); + await expect.poll(() => readFactor(listFrame, '')).toBe(1.2); + + const normalizedId = projectA.projectId.toUpperCase(); + await expect + .poll(async () => (await readContentZoomMemory(mainPage))[`notes:${normalizedId}:main`]) + .toBe(1.2); + + await closeDockTab(mainPage, listId); + await openCommentList(mainPage, projectA); + reopenedListId = await waitForOpenWebViewIdByType(mainPage, COMMENT_LIST_WEBVIEW_TYPE); + const reopenedListFrame = await getEditorFrame(mainPage, reopenedListId); + await expect.poll(() => readFactor(reopenedListFrame, '')).toBe(1.2); + }); + + await test.step("a different project's comment list inherits nothing from the first", async () => { + if (!reopenedListId) + throw new Error('test setup: no reopened list id from the previous step'); + // Close project A's list first: project B's own list must start at the default independent of + // A, and leaving A's list open would let `waitForOpenWebViewIdByType` below (a bare find by + // type) resolve to A's still-open id instead of the fresh one project B's list opens with. + await closeDockTab(mainPage, reopenedListId); + await createCommentThreads(projectB, ['GEN 1:1'], ['Zoom test comment for project B']); + await openCommentList(mainPage, projectB); + const projectBListId = await waitForOpenWebViewIdByType(mainPage, COMMENT_LIST_WEBVIEW_TYPE); + const projectBListFrame = await getEditorFrame(mainPage, projectBListId); + await expect.poll(() => readFactor(projectBListFrame, '')).toBe(1); + }); + }); +}); diff --git a/e2e-tests/tests/isolated/notes-content-zoom/comment-menu-narrow-panel-content-zoom.spec.ts b/e2e-tests/tests/isolated/notes-content-zoom/comment-menu-narrow-panel-content-zoom.spec.ts new file mode 100644 index 00000000000..730e242b817 --- /dev/null +++ b/e2e-tests/tests/isolated/notes-content-zoom/comment-menu-narrow-panel-content-zoom.spec.ts @@ -0,0 +1,122 @@ +/** + * E2E for the comment card's dropdown menu inside a zoomed, narrow Simple-mode Comments panel: at + * maximum zoom the menu's fixed `tw:min-w-32` floor must not force it past the panel's right edge. + * + * Simple mode's Column 3 is the narrowest reproducible pane — locked to a 297px floor + * (`SIMPLE_COLUMN_MIN_WIDTH_PX`, `src/renderer/components/docking/simple-layout.data.ts`), which + * the app's own minimum window width (`WINDOW_MIN_WIDTH_PX`, + * `src/shared/models/window-constraints.model.ts`) forces every column down to. At the platform's + * maximum zoom (`MAX_ZOOM_FACTOR`, `src/shared/data/platform.data.ts`) the dropdown menu's unzoomed + * 8rem CSS min-width paints at 384px — 87px past a 297px panel — unless the zoom-aware minimum + * yields to the panel's own available width. + * + * Own Electron app (`commentAppOwner`): the narrow `windowSize` this spec declares would otherwise + * leak into every other comment spec sharing the worker. + * + * `npm run test:e2e:isolated notes-content-zoom` + */ +import { test, expect } from '../../../fixtures/comment.fixture'; +import { + expectPopupBesideTriggerAndInsideFrame, + zoomAreaTo, +} from '../../../fixtures/content-zoom-helpers'; +import { + waitForAppReady, + waitForOpenWebViewIdByType, + waitForOverlayGone, +} from '../../../fixtures/helpers'; +import { + type CommentTestProject, + cleanupCommentTestProject, + createCommentTestProject, + createCommentThreads, + openCommentListPanelUntilVisible, +} from '../../../fixtures/comment-test-helpers'; + +/** + * `webViewType` of the Comment List Panel tab in Column 3 of the simple layout. Source: + * src/renderer/components/docking/simple-layout.data.ts + */ +const COMMENT_LIST_PANEL_WEBVIEW_TYPE = 'legacyCommentManager.commentListPanel'; + +/** + * The platform's maximum content-zoom factor (`MAX_ZOOM_FACTOR`, + * `src/shared/data/platform.data.ts`) — the level at which the dropdown menu's unzoomed 8rem + * min-width paints widest. + */ +const MAX_ZOOM_FACTOR = 3; + +/** + * The narrowest window rc-dock's Simple-mode layout accepts (`WINDOW_MIN_WIDTH_PX`, + * `src/shared/models/window-constraints.model.ts`). At this width every column — including Column + * 3, where the Comments panel lives — clamps to its 297px `SIMPLE_COLUMN_MIN_WIDTH_PX` floor + * (`src/renderer/components/docking/simple-layout.data.ts`), the narrowest pane the app allows. + */ +const NARROW_WINDOW_WIDTH_PX = 900; + +test.use({ + commentAppOwner: 'notes-content-zoom-narrow-menu', + windowSize: { width: NARROW_WINDOW_WIDTH_PX, height: 800 }, +}); + +test.describe('card menu inside a zoomed, narrow Comments panel', () => { + test.setTimeout(600_000); + + let project: CommentTestProject; + + test.beforeAll(async () => { + project = await createCommentTestProject([], 'NarrowMenu'); + }); + + test.afterAll(() => { + cleanupCommentTestProject(project); + }); + + // Skipped: the card's edit/delete menu never appears in this environment, so the placement this + // test exists to check is unreachable. The menu renders only once the asynchronous + // edit-or-delete permission check resolves true for the comment, and here it never does. The + // cause is not the Send/Receive capability gate (that denies only while a sync blocks edits), + // not a missing project role (creating a comment requires the same role, and the seeding + // succeeds), and not comment authorship (the seed is written as the current user). Re-enable + // once the permission result is understood; the zoom behaviour itself is covered by the sibling + // specs in this directory. + test.skip("a card's dropdown menu stays inside the panel at maximum zoom in the narrowest column", async ({ + mainPage, + }) => { + // Heavy isolated test: own Electron instance, plus 20 sequential zoom-in steps to reach 300%. + test.slow(); + + await waitForAppReady(mainPage, { timeout: 180_000 }); + const panelId = await waitForOpenWebViewIdByType(mainPage, COMMENT_LIST_PANEL_WEBVIEW_TYPE); + await waitForOverlayGone(mainPage, 90_000); + + const [threadId] = await createCommentThreads( + project, + ['GEN 1:1'], + ['Narrow-panel menu zoom marker'], + ); + + const panelFrame = await openCommentListPanelUntilVisible( + mainPage, + panelId, + project.projectId, + 'Narrow-panel menu zoom marker', + ); + + await zoomAreaTo(mainPage, panelFrame, panelId, 'main', MAX_ZOOM_FACTOR); + + const card = panelFrame.locator(`[role="option"][id="${threadId}"]`); + await card.click(); + const menuTrigger = card.locator('button[aria-haspopup="menu"]').first(); + await expect(menuTrigger).toBeVisible(); + await menuTrigger.click(); + + const menu = panelFrame.locator('[data-slot="dropdown-menu-content"]'); + await expect(menu).toBeVisible(); + + // Includes the check this spec exists for — the menu's right edge landing at or inside the + // frame's, which is exactly the panel's own edge at this window width — alongside the helper's + // usual beside-the-trigger and no-overflow assertions. + await expectPopupBesideTriggerAndInsideFrame(panelFrame, menu, menuTrigger); + }); +}); diff --git a/e2e-tests/tests/isolated/notes-content-zoom/comments-panel-content-zoom.spec.ts b/e2e-tests/tests/isolated/notes-content-zoom/comments-panel-content-zoom.spec.ts new file mode 100644 index 00000000000..3715c90e0a4 --- /dev/null +++ b/e2e-tests/tests/isolated/notes-content-zoom/comments-panel-content-zoom.spec.ts @@ -0,0 +1,203 @@ +/** + * E2E for the Simple-mode Comments panel's per-pane content zoom: Ctrl+wheel and the tab's own + * "Zoom in" / "Zoom out" / "Reset zoom to default" menu items scale the panel, and the level is + * remembered under the panel's project identity (the `notes` kind), the same identity a project's + * tab list opens at. + * + * Own Electron app (`commentAppOwner`): a shared app would carry over whatever layout change + * another comment spec left behind, and the fixture only starts a fresh worker when the option + * value differs. + */ +import { test, expect } from '../../../fixtures/comment.fixture'; +import { + areaBox, + ctrlWheel, + INDICATOR_SELECTOR, + readContentZoomMemory, +} from '../../../fixtures/content-zoom-helpers'; +import { + waitForAppReady, + waitForOpenWebViewIdByType, + waitForOverlayGone, +} from '../../../fixtures/helpers'; +import { + type CommentTestProject, + cleanupCommentTestProject, + createCommentTestProject, + createCommentThreads, + openCommentListPanel, + openCommentListPanelUntilVisible, +} from '../../../fixtures/comment-test-helpers'; +import { readFactor } from '../../../fixtures/scripture-editor-helpers'; + +/** + * `webViewType` of the Comment List Panel tab in Column 3 of the simple layout. Source: + * src/renderer/components/docking/simple-layout.data.ts + */ +const COMMENT_LIST_PANEL_WEBVIEW_TYPE = 'legacyCommentManager.commentListPanel'; + +// Own this spec's Electron app: a different owner string from any other comment spec, so the +// fixture starts a fresh worker rather than inheriting another spec's layout/panel state. +test.use({ commentAppOwner: 'notes-content-zoom-panel' }); + +test.describe('Comments panel content zoom in Simple mode', () => { + test.setTimeout(600_000); + + let projectA: CommentTestProject; + let projectB: CommentTestProject; + + // Filesystem-only: creates the project copies before Electron starts scanning the projects + // folder. Thread seeding needs the live app's WebSocket (the PDPF's PAPI methods), so it happens + // in the test body instead, after waitForAppReady — beforeAll takes no fixture and so runs before + // Playwright launches the worker-scoped Electron app that fixture would trigger. + test.beforeAll(async () => { + projectA = await createCommentTestProject([], 'A'); + projectB = await createCommentTestProject([], 'B'); + }); + + test.afterAll(() => { + cleanupCommentTestProject(projectA); + cleanupCommentTestProject(projectB); + }); + + test('Ctrl+wheel and the tab menu zoom the panel and remember the level per project', async ({ + mainPage, + }) => { + test.slow(); + + await waitForAppReady(mainPage, { timeout: 180_000 }); + const panelId = await waitForOpenWebViewIdByType(mainPage, COMMENT_LIST_PANEL_WEBVIEW_TYPE); + await waitForOverlayGone(mainPage, 90_000); + + const [projectACardThreadId] = await createCommentThreads( + projectA, + ['GEN 1:1'], + ['Project A comment zoom marker'], + ); + await createCommentThreads(projectB, ['GEN 1:1'], ['Project B comment zoom marker']); + + const panelFrame = await openCommentListPanelUntilVisible( + mainPage, + panelId, + projectA.projectId, + 'Project A comment zoom marker', + ); + + await expect.poll(() => readFactor(panelFrame, '')).toBe(1); + + const scopeTrigger = panelFrame.locator('[data-testid="comment-scope-filter"]'); + const scopeBoxBaseline = await scopeTrigger.boundingBox(); + if (!scopeBoxBaseline) throw new Error('Scope filter trigger not found'); + + await test.step('wheel over the panel scales it and leaves the scope-filter row untouched', async () => { + const card = panelFrame.locator(`[role="option"][id="${projectACardThreadId}"]`); + const cardBoxBefore = await card.boundingBox(); + if (!cardBoxBefore) throw new Error('Comment card not found'); + + const box = await areaBox(panelFrame, ''); + await ctrlWheel(mainPage, box, -120); + await expect.poll(() => readFactor(panelFrame, '')).toBe(1.1); + + const cardBoxAfter = await card.boundingBox(); + if (!cardBoxAfter) throw new Error('Comment card not found after zoom'); + // A tight tolerance around the actual 1.1 factor: a wide band would also accept a ratio of + // 1.0, so a missing marker that left the whole-iframe fallback scaling nothing would pass + // unnoticed. + const ratio = cardBoxAfter.height / cardBoxBefore.height; + expect(ratio).toBeCloseTo(1.1, 1); + + const indicator = panelFrame.locator(INDICATOR_SELECTOR); + await expect.poll(() => indicator.getAttribute('data-area'), { timeout: 2_000 }).toBe('main'); + + const scopeBoxZoomed = await scopeTrigger.boundingBox(); + if (!scopeBoxZoomed) throw new Error('Scope filter trigger not found after zoom'); + // ±2px absorbs a scrollbar appearing once the zoomed content overflows. + expect(Math.abs(scopeBoxZoomed.height - scopeBoxBaseline.height)).toBeLessThanOrEqual(2); + }); + + const normalizedProjectAId = projectA.projectId.toUpperCase(); + + await test.step('memory identity is the panel project, under the notes kind', async () => { + // Still at 1.1 from the wheel step above. + await expect + .poll( + async () => (await readContentZoomMemory(mainPage))[`notes:${normalizedProjectAId}:main`], + ) + .toBe(1.1); + }); + + await test.step('the tab menu drives the same ladder as the wheel', async () => { + // `data-web-view-id` is emitted on `.platform-tab-title` (platform-tab-title.component.tsx), + // not on rc-dock's own `.dock-tab` ancestor — the same element `clickCommentsTab`'s + // left-click path above targets. + const tab = mainPage.locator(`.platform-tab-title[data-web-view-id="${panelId}"]`); + await tab.click({ button: 'right' }); + await mainPage.getByRole('menuitem', { name: 'Zoom in' }).click(); + await expect.poll(() => readFactor(panelFrame, '')).toBe(1.2); + + await tab.click({ button: 'right' }); + await mainPage.getByRole('menuitem', { name: 'Zoom out' }).click(); + await expect.poll(() => readFactor(panelFrame, '')).toBe(1.1); + + await tab.click({ button: 'right' }); + await mainPage.getByRole('menuitem', { name: 'Reset zoom to default' }).click(); + await expect.poll(() => readFactor(panelFrame, '')).toBe(1); + }); + + // The ladder above ends on a reset, which deletes the memory key rather than writing the + // default back — so re-establish a non-default level here for the re-point check below to + // have something to remember. + await test.step('re-establish a non-default level for project A', async () => { + const box = await areaBox(panelFrame, ''); + await ctrlWheel(mainPage, box, -120); + await expect.poll(() => readFactor(panelFrame, '')).toBe(1.1); + await expect + .poll( + async () => (await readContentZoomMemory(mainPage))[`notes:${normalizedProjectAId}:main`], + ) + .toBe(1.1); + }); + + // TODO(PT-4745): re-pointing an already-mounted Comments panel at another project sometimes + // never reaches the mounted component's props, so the panel silently keeps showing the old + // project (or nothing) instead of the new one. This step deliberately exercises exactly that + // re-point path — content-zoom memory following the panel across a project switch — so it + // cannot be made reliable with an arrangement retry without retrying the behavior under test. + // Skipped until PT-4745 lands; re-enable (drop `.skip`) once the re-point path is reliable. + await test.step.skip( + "a re-pointed panel shows the new project's level, and project A's again on return", + async () => { + const normalizedProjectBId = projectB.projectId.toUpperCase(); + + await openCommentListPanel(projectB.projectId); + await expect(panelFrame.locator('body')).toContainText('Project B comment zoom marker', { + timeout: 90_000, + }); + + // Project B has no remembered level of its own, so the re-pointed panel follows the Settings + // default rather than carrying project A's 110 % across with it. + await expect.poll(() => readFactor(panelFrame, '')).toBe(1); + + // Wait out the memory write's debounce (250 ms) with room to spare before reading again. This + // covers two things at once: the settled level (a plain re-read, not a poll — the reset above + // could pass on a transient `1` mid-reload and then settle back to project A's 1.1, and a poll + // would accept that transient just as readily as the real value) and the memory-key absence + // (a poll for "not there" would likewise pass on its first read, before a wrong write could + // have landed). + await mainPage.waitForTimeout(5_000); + expect(await readFactor(panelFrame, '')).toBe(1); + expect(Object.keys(await readContentZoomMemory(mainPage))).not.toContain( + `notes:${normalizedProjectBId}:main`, + ); + + await openCommentListPanel(projectA.projectId); + await expect(panelFrame.locator('body')).toContainText('Project A comment zoom marker', { + timeout: 90_000, + }); + + // Back on project A: its own remembered 110 % again. + await expect.poll(() => readFactor(panelFrame, '')).toBe(1.1); + }, + ); + }); +}); diff --git a/e2e-tests/tests/isolated/scripture-editor/content-zoom-chords.spec.ts b/e2e-tests/tests/isolated/scripture-editor/content-zoom-chords.spec.ts index 5371cea93a3..99535230e83 100644 --- a/e2e-tests/tests/isolated/scripture-editor/content-zoom-chords.spec.ts +++ b/e2e-tests/tests/isolated/scripture-editor/content-zoom-chords.spec.ts @@ -106,7 +106,7 @@ test.describe('scripture editor content zoom — keyboard chords', () => { // Jonah 1 carries footnote callers at verses 1, 6 (twice) and 9 // (`c-sharp/assets/WEB/32JONengWEBUS.SFM`), so the pane has real rows to put focus on. const footnotesList = editorFrame.locator( - '[data-platform-content-zoom-root="footnotes"] [role="listbox"]', + '[data-platform-content-zoom-root="footnotes"]:not([data-platform-content-zoom-popup]) [role="listbox"]', ); await expect(footnotesList).toBeVisible({ timeout: 20_000 }); // Keyboard, not a click: clicking a row selects that note, and selecting a note sends the caret diff --git a/e2e-tests/tests/isolated/scripture-editor/content-zoom.spec.ts b/e2e-tests/tests/isolated/scripture-editor/content-zoom.spec.ts index 63ccd849f65..0a72f25a587 100644 --- a/e2e-tests/tests/isolated/scripture-editor/content-zoom.spec.ts +++ b/e2e-tests/tests/isolated/scripture-editor/content-zoom.spec.ts @@ -16,8 +16,21 @@ * Runs against an isolated project root (the bundled sample WEB is installed into the empty root): * `npm run test:e2e:isolated scripture-editor`. */ -import { type Frame, type Page } from '@playwright/test'; +import { type Frame, type Locator, type Page } from '@playwright/test'; import { test, expect } from '../../../fixtures/isolated.fixture'; +import { + areaBox, + ctrlWheel, + expectPopupBesideTriggerAndInsideFrame, + frameBox, + INDICATOR_SELECTOR, + type PageBox, + readContentZoomMemory, + readIndicatorText, + triggerBox, + waitForPopupAnimations, + zoomAreaTo, +} from '../../../fixtures/content-zoom-helpers'; import { CONTENT_ZOOM_COMMANDS, ensureFootnotesVisible, @@ -31,6 +44,16 @@ import { sendCommandWithId, waitForHomeTab, } from '../../../fixtures/scripture-editor-helpers'; +import { DEFAULT_WINDOW_SIZE, setWindowWidth } from '../../../fixtures/helpers'; + +/** + * The in-text caller that opens the footnote editor popover (`.immutable-note-caller > button`, + * shared with cross-references). Scoped to `data-note-kind="footnote"` so it lands on a real + * footnote — the sample WEB project's Jonah 1 carries footnote callers at verses 1, 6 and 9 + * (`c-sharp/assets/WEB/32JONengWEBUS.SFM`), and this suite navigates to Jonah 1:1. + */ +const TEXT_NOTE_CALLER_SELECTOR = + '.note[data-note-kind="footnote"] .immutable-note-caller > button'; test.use({ interfaceMode: 'power', @@ -38,84 +61,270 @@ test.use({ }); /** - * Setting key the memory-key-shape assertion reads directly - * (`src/renderer/services/web-view-content-zoom.service.ts`). + * The bootstrap's own idea of the pane's active area (its `window.__platformContentZoom.activeArea` + * getter — `web-view-content-zoom.bootstrap-script.ts`). A real click sets this asynchronously (the + * bootstrap's `pointerdown` listener calls a bound cross-realm function), so callers poll it rather + * than assuming a click's effect lands within the same tick the click's promise resolves in. */ -const CONTENT_ZOOM_MEMORY_SETTING = 'platform.webViewContentZoomMemory'; +async function readActiveArea(frame: Frame): Promise { + return frame.evaluate(() => { + // The bootstrap script defines this global; untyped here since it is an internal + // platform/pane contract, not part of this test's own types. + // eslint-disable-next-line no-type-assertion/no-type-assertion + const win = window as unknown as { __platformContentZoom?: { activeArea?: string } }; + // Same internal platform/pane contract as above — the double underscore is the bootstrap's own name. + // eslint-disable-next-line no-underscore-dangle + return win.__platformContentZoom?.activeArea; + }); +} /** - * The `id` the platform's zoom indicator badge is created with - * (`web-view-content-zoom.bootstrap-script.ts`). + * The main text editor's container. `.first()`: an open footnote popover renders a second + * `.editor-container` of its own (portaled after the main one), so the bare selector is ambiguous + * while it is open. */ -const INDICATOR_SELECTOR = '#platform-content-zoom-indicator'; +function mainEditorContainer(frame: Frame): Locator { + return frame.locator('.editor-container').first(); +} -/** Bounding box (main-frame-relative) of one zoom area's marked root element. */ -async function areaBox( +/** + * Scrolls the main text to `to`, or by `by`, and returns its scroll position before and after, the + * scroll container's main-frame-relative box, and how far that container can scroll at all + * (`maxScroll`). The text scrolls in its nearest scrollable ancestor (inside the footnotes layout), + * not in the pane's outer `overflow-auto` wrapper, which never overflows. Called with neither, it + * only reads. + */ +async function scrollText( frame: Frame, - areaId: string, -): Promise<{ x: number; y: number; width: number; height: number }> { - const box = await frame.locator(`[data-platform-content-zoom-root="${areaId}"]`).boundingBox(); - if (!box) throw new Error(`Zoom area "${areaId}" has no bounding box`); - return box; + target: { to?: number; by?: number }, +): Promise<{ + before: number; + after: number; + box: PageBox; + maxScroll: number; +}> { + const editorFrameBox = await frameBox(frame); + const result = await mainEditorContainer(frame).evaluate((element, { to, by }) => { + let node: Element | null = element; + while (node) { + const { overflowY } = getComputedStyle(node); + if ((overflowY === 'auto' || overflowY === 'scroll') && node.scrollHeight > node.clientHeight) + break; + node = node.parentElement; + } + if (!node) throw new Error('The main text has no scrollable ancestor'); + const before = node.scrollTop; + if (to !== undefined) node.scrollTop = to; + else if (by !== undefined) node.scrollTop = before + by; + const rect = node.getBoundingClientRect(); + return { + before, + after: node.scrollTop, + box: { x: rect.left, y: rect.top, width: rect.width, height: rect.height }, + maxScroll: node.scrollHeight - node.clientHeight, + }; + }, target); + return { + ...result, + box: { ...result.box, x: result.box.x + editorFrameBox.x, y: result.box.y + editorFrameBox.y }, + }; } /** - * Ctrl+wheel over the centre of `box` (main-frame-relative coordinates, as `areaBox` returns). - * `deltaY: -120` zooms in, `+120` zooms out (`web-view-content-zoom.bootstrap-script.ts`'s - * `onWheel`: `e.deltaY < 0` is zoom-in). Does not itself wait for the effect — callers poll the - * resulting factor, never a bare timeout, since geometry inside a zoomed frame moves and a fixed - * wait would race the debounced write. + * Scrolls the main text by `delta` (negative scrolls back up) while a pop-up is open, and checks + * the scroll really moved and left `trigger` visible, so a following "still beside its trigger" + * check is meaningful. Returns the distance scrolled. */ -async function ctrlWheel( - page: Page, - box: { x: number; y: number; width: number; height: number }, - deltaY: number, -): Promise { - await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2); - await page.keyboard.down('Control'); - await page.mouse.wheel(0, deltaY); - await page.keyboard.up('Control'); +async function scrollTextKeepingVisible( + frame: Frame, + delta: number, + trigger: Locator | PageBox, +): Promise { + const { before, after, box: scrollerBox } = await scrollText(frame, { by: delta }); + const moved = after - before; + expect(Math.abs(moved)).toBeGreaterThanOrEqual(Math.abs(delta) / 2); + expect(Math.sign(moved)).toBe(Math.sign(delta)); + const triggerRect = await triggerBox(trigger); + // A pre-scroll box (a caret) is shifted by the distance scrolled. + const top = 'boundingBox' in trigger ? triggerRect.y : triggerRect.y - moved; + expect(top).toBeGreaterThanOrEqual(scrollerBox.y); + expect(top + triggerRect.height).toBeLessThanOrEqual(scrollerBox.y + scrollerBox.height); + return moved; } -/** Reads the `platform.webViewContentZoomMemory` setting straight from the renderer. */ -async function readContentZoomMemory(page: Page): Promise> { - return page.evaluate((settingKey) => { - // The renderer exposes `papi` on `globalThis`, untyped here (same pattern as - // scripture-text-grid-zoom.spec.ts's afterEach cleanup). - // eslint-disable-next-line no-type-assertion/no-type-assertion - const win = window as unknown as { - papi: { settings: { get: (key: string) => Promise> } }; - }; - return win.papi.settings.get(settingKey); - }, CONTENT_ZOOM_MEMORY_SETTING); +/** + * Distance below the top of the main text's scroll container at which this spec parks a pop-up's + * trigger before opening the pop-up. At 200 % a pop-up like the comment editor is about half the + * pane tall, so a trigger left mid-pane has room for it neither above nor below, and the pop-up + * falls back to covering its own line — real behavior in a pane that short, but not what a "sits + * beside its trigger" check is about. Near the top of the pane, the whole pane height is below the + * trigger, with room to spare for the scroll that follows. + */ +const TRIGGER_TOP_MARGIN_PX = 40; + +/** + * Scrolls the main text as near as it goes to putting `trigger`'s box {@link TRIGGER_TOP_MARGIN_PX} + * below the top of the text's scroll container, and returns the box it has there. The room a pop-up + * opened on that trigger then has is the pane's, rather than whatever the preceding steps left the + * text scrolled to. + * + * Landing higher than that margin is fine and needs no scroll: a trigger already near the top of + * the pane has the whole pane below it. So the check is a range, not a target — scrolling up is + * clamped at the top of the text, and demanding an exact offset would fail there instead of + * accepting the room it asked for. Below the pane's top edge, on the other hand, the trigger is + * scrolled out of sight. + * + * Scrolling down clamps too, at the bottom of the text, and then the trigger stays lower than the + * margin — so the margin is allowed exactly the distance the scroll came up short by, and the + * scroll itself is held to moving every pixel that was available. A scroll that simply did not take + * effect fails on that, rather than buying itself room here. The shortfall only ever arises where + * it costs nothing: the text comes up short only when the chapter barely overflows the pane, which + * is the unzoomed case, where a pop-up is a fraction of the pane's height and has room below a + * trigger wherever it sits. At the zoom levels this step is about, the chapter is several + * pane-heights tall and the full margin is demanded. + */ +async function scrollTriggerNearPaneTop(frame: Frame, trigger: PageBox): Promise { + const { box: scroller, before: scrollTop, maxScroll } = await scrollText(frame, {}); + const requested = Math.round(trigger.y - scroller.y - TRIGGER_TOP_MARGIN_PX); + const available = Math.min(Math.max(scrollTop + requested, 0), maxScroll) - scrollTop; + const { before, after } = await scrollText(frame, { by: requested }); + // Sub-pixel: scrollTop is fractional while scrollHeight and clientHeight are whole pixels. + expect(Math.abs(after - before - available), 'the text scrolled as far as it can').toBeLessThan( + 1, + ); + const scrolled = { ...trigger, y: trigger.y - (after - before) }; + const belowPaneTop = scrolled.y - scroller.y; + expect(belowPaneTop, 'trigger inside the pane').toBeGreaterThanOrEqual(0); + expect( + belowPaneTop, + 'trigger as near the top of the pane as the text scrolls', + ).toBeLessThanOrEqual(TRIGGER_TOP_MARGIN_PX + 2 + Math.max(requested - available, 0)); + return scrolled; +} + +/** The text caret's (or the text selection's) box, main-frame-relative. */ +async function readCaretBox(frame: Frame): Promise { + const editorFrameBox = await frameBox(frame); + const caret = await frame.evaluate(() => { + const selection = window.getSelection(); + if (!selection || selection.rangeCount === 0) return undefined; + const rect = selection.getRangeAt(0).getBoundingClientRect(); + return { x: rect.left, y: rect.top, width: rect.width, height: rect.height }; + }); + if (!caret) throw new Error('No text caret'); + return { ...caret, x: caret.x + editorFrameBox.x, y: caret.y + editorFrameBox.y }; +} + +/** + * {@link expectPopupBesideTriggerAndInsideFrame}, retried until it holds: a pop-up that has just + * opened is still being positioned, so its first boxes are not its settled ones. A pop-up that + * never settles beside its trigger still fails. Once this returns, the pop-up's open animation has + * ended and its size can be measured. + */ +async function expectSettledBeside( + frame: Frame, + popup: Locator, + trigger: Locator | PageBox, +): Promise { + await expect(async () => expectPopupBesideTriggerAndInsideFrame(frame, popup, trigger)).toPass({ + timeout: 5_000, + }); } -/** Indicator text with whitespace stripped, so the narrow no-break space before `%` doesn't matter. */ -async function readIndicatorText(frame: Frame): Promise { - const text = await frame.locator(INDICATOR_SELECTOR).textContent(); - return text?.replace(/\s/gu, ''); +/** A locator's main-frame box; throws when it has none. */ +async function boxOf(locator: Locator): Promise { + const box = await locator.boundingBox(); + if (!box) throw new Error('Element has no box'); + return box; } /** - * The bootstrap's own idea of the pane's active area (its `window.__platformContentZoom.activeArea` - * getter — `web-view-content-zoom.bootstrap-script.ts`). A real click sets this asynchronously (the - * bootstrap's `pointerdown` listener calls a bound cross-realm function), so callers poll it rather - * than assuming a click's effect lands within the same tick the click's promise resolves in. + * Selects verse 2's text from "great" onto the line below it with a click and a Shift+click, and + * returns the selection's main-frame box. Checks that the selection really spans more than one + * line. + * + * Where the line below starts is read from the laid-out text rather than named as a second word: + * which word verse 2 wraps after is a property of the Scripture font's metrics at the pane's width + * and zoom, so a fixed pair of words pins the selection to one line or two by luck of the current + * font. */ -async function readActiveArea(frame: Frame): Promise { - return frame.evaluate(() => { - // The bootstrap script defines this global; untyped here since it is an internal - // platform/pane contract, not part of this test's own types. - // eslint-disable-next-line no-type-assertion/no-type-assertion - const win = window as unknown as { __platformContentZoom?: { activeArea?: string } }; - // Same internal platform/pane contract as above — the double underscore is the bootstrap's own name. - // eslint-disable-next-line no-underscore-dangle - return win.__platformContentZoom?.activeArea; +async function selectWrappedText(page: Page, frame: Frame, input: Locator): Promise { + const editorFrameBox = await frameBox(frame); + await input.getByText('that great city', { exact: false }).first().scrollIntoViewIfNeeded(); + const points = await input.evaluate((root) => { + const walker = root.ownerDocument.createTreeWalker(root, NodeFilter.SHOW_TEXT); + for (let node = walker.nextNode(); node; node = walker.nextNode()) { + const text = node.textContent ?? ''; + const from = text.indexOf('great city'); + if (from >= 0) { + const textNode = node; + const charRect = (offset: number) => { + const range = root.ownerDocument.createRange(); + range.setStart(textNode, offset); + range.setEnd(textNode, offset + 1); + return range.getBoundingClientRect(); + }; + const center = (rect: DOMRect) => ({ + x: rect.left + rect.width / 2, + y: rect.top + rect.height / 2, + }); + const start = from + 1; + const startTop = Math.round(charRect(start).top); + // The first character painted below the start's line, then a few more of its line, so the + // Shift+click lands well inside the second line rather than on its very first glyph. + let end = -1; + for (let offset = start + 1; offset < text.length; offset += 1) { + const rect = charRect(offset); + if (rect.width > 0 && Math.round(rect.top) > startTop) { + end = offset; + for ( + let more = offset + 1; + more < text.length && more <= offset + 3 && Math.round(charRect(more).top) > startTop; + more += 1 + ) + end = more; + break; + } + } + if (end < 0) return undefined; + return { start: center(charRect(start)), end: center(charRect(end)) }; + } + } + return undefined; + }); + if (!points) throw new Error('Verse 2 does not wrap onto a second line'); + await page.mouse.click(editorFrameBox.x + points.start.x, editorFrameBox.y + points.start.y); + await page.keyboard.down('Shift'); + await page.mouse.click(editorFrameBox.x + points.end.x, editorFrameBox.y + points.end.y); + await page.keyboard.up('Shift'); + const lines = await frame.evaluate(() => { + const selection = window.getSelection(); + if (!selection || selection.rangeCount === 0) return []; + return Array.from(selection.getRangeAt(0).getClientRects()) + .filter((rect) => rect.width > 0) + .map((rect) => ({ + left: rect.left, + top: rect.top, + right: rect.right, + bottom: rect.bottom, + })); }); + expect(new Set(lines.map((line) => Math.round(line.top))).size).toBeGreaterThan(1); + const left = Math.min(...lines.map((line) => line.left)); + const top = Math.min(...lines.map((line) => line.top)); + const right = Math.max(...lines.map((line) => line.right)); + const bottom = Math.max(...lines.map((line) => line.bottom)); + return { + x: editorFrameBox.x + left, + y: editorFrameBox.y + top, + width: right - left, + height: bottom - top, + }; } test.describe('scripture editor content zoom', () => { test('Ctrl+wheel and the zoom commands scale the text and footnotes areas independently and remember each level', async ({ + electronApp, mainPage, }) => { // Heavy isolated test (own Electron instance, several zoom gestures each waiting on a @@ -289,6 +498,318 @@ test.describe('scripture editor content zoom', () => { expect(await readFactor(editorFrame, 'footnotes')).toBe(1.1); }); + await test.step('the footnote popover follows the text zoom and stays beside its caller, even scrolled and in a narrow pane', async () => { + const caller = editorFrame.locator(TEXT_NOTE_CALLER_SELECTOR).first(); + const popover = editorFrame.locator('[data-slot="popover-content"]').filter({ + has: editorFrame.locator('.editor-input'), + }); + const cancel = popover.getByRole('button', { name: 'Cancel', exact: true }); + // The editor controls this popover and does not close it on Escape or an outside click; its + // own Cancel button closes it, leaving an existing note unchanged. + const closeFootnotePopover = async () => { + await cancel.click(); + await expect(popover).toBeHidden(); + }; + const openFootnotePopover = async () => { + await caller.click({ force: true }); + await expect(popover).toBeVisible(); + await expect(popover).toHaveAttribute('data-platform-content-zoom-root', ''); + await expectSettledBeside(editorFrame, popover, caller); + }; + + await zoomAreaTo(mainPage, editorFrame, editorId, 'main', 1); + await openFootnotePopover(); + // The popover keeps its 500 px minimum width at 100 %. + expect((await boxOf(popover)).width).toBeGreaterThanOrEqual(499); + const cancelAtDefault = await boxOf(cancel); + await closeFootnotePopover(); + + // Growth by the zoom factor is measured on the popover's controls: the popover's own width is + // sized by its content (`w-max`) and capped by the pane, so it does not scale linearly. + await zoomAreaTo(mainPage, editorFrame, editorId, 'main', 1.5); + await openFootnotePopover(); + expect((await boxOf(cancel)).height / cancelAtDefault.height).toBeCloseTo(1.5, 1); + await closeFootnotePopover(); + + await zoomAreaTo(mainPage, editorFrame, editorId, 'main', 2); + // Scroll the text before opening, so the caller is no longer where it sat at the top. + expect((await scrollText(editorFrame, { to: 120 })).after).toBe(120); + await openFootnotePopover(); + expect((await boxOf(cancel)).height / cancelAtDefault.height).toBeCloseTo(2, 1); + + // Scroll after opening: the popover moves with its caller. + await scrollTextKeepingVisible(editorFrame, 60, caller); + await expect(async () => + expectPopupBesideTriggerAndInsideFrame(editorFrame, popover, caller), + ).toPass({ timeout: 5_000 }); + + // Change the text zoom while the popover is open: the text reflows under it and the popover + // follows its caller. + await sendCommandWithId(mainPage, CONTENT_ZOOM_COMMANDS.out, editorId, 'main'); + await expect.poll(() => readFactor(editorFrame, '')).toBe(1.9); + await expect(async () => + expectPopupBesideTriggerAndInsideFrame(editorFrame, popover, caller), + ).toPass({ timeout: 5_000 }); + await sendCommandWithId(mainPage, CONTENT_ZOOM_COMMANDS.in, editorId, 'main'); + await expect.poll(() => readFactor(editorFrame, '')).toBe(2); + await closeFootnotePopover(); + + // Narrow pane: the popover and its content must still fit inside it, at 200 % and at the + // 300 % maximum (the app does not allow a narrower window). A real OS window resize, never + // `mainPage.setViewportSize()` — on this CDP-attached fixture that applies an emulation + // override that bypasses the app's enforced `minWidth` instead of actually narrowing the + // window (see `setWindowWidth` in fixtures/helpers.ts). + await setWindowWidth(electronApp, mainPage, 900); + // Sequential: each zoom level's pop-up must be opened, checked and closed before the next. + /* eslint-disable no-await-in-loop */ + const narrowFactors = [2, 3]; + for (let i = 0; i < narrowFactors.length; i += 1) { + await zoomAreaTo(mainPage, editorFrame, editorId, 'main', narrowFactors[i]); + await openFootnotePopover(); + await closeFootnotePopover(); + } + /* eslint-enable no-await-in-loop */ + await zoomAreaTo(mainPage, editorFrame, editorId, 'main', 2); + // Restore the window width and the text's scroll position for the steps that follow: they + // click verses with `{ force: true }`, which skips Playwright's visibility checks, so a verse + // left scrolled out of view would be clicked where it is no longer painted. + await setWindowWidth(electronApp, mainPage, DEFAULT_WINDOW_SIZE.width); + expect((await scrollText(editorFrame, { to: 0 })).after).toBe(0); + }); + + await test.step('the inline marker menu and the comment editor follow the text zoom', async () => { + // The inline marker menu is the non-standard views' `\` menu (the standard view opens the + // platform's command palette instead), and the markers view is read-only, so cycle + // standard -> markers -> formatted. + const mainInput = editorFrame.locator('.editor-input').first(); + await sendCommandWithId(mainPage, 'platformScriptureEditor.changeView', editorId); + await expect(mainInput).toHaveClass(/\bmarker-visible\b/, { timeout: 20_000 }); + await sendCommandWithId(mainPage, 'platformScriptureEditor.changeView', editorId); + await expect(mainInput).toHaveClass(/\bmarker-hidden\b/, { timeout: 20_000 }); + + const text = mainInput.getByText('that great city', { exact: false }).first(); + const markerMenu = editorFrame.locator('[data-slot="popover-content"]').filter({ + has: editorFrame.locator('input'), + }); + const commentEditor = editorFrame + .locator('[data-slot="popover-content"]') + .filter({ hasNot: editorFrame.locator('.editor-input') }) + .last(); + + // Both pop-ups are anchored to the text caret (or selection), so its box is their trigger. + const placeCaret = async () => { + await text.click(); + return scrollTriggerNearPaneTop(editorFrame, await readCaretBox(editorFrame)); + }; + const openMarkerMenu = async () => { + const caret = await placeCaret(); + await mainPage.keyboard.press('\\'); + await expect(markerMenu).toBeVisible(); + await expect(markerMenu).toHaveAttribute('data-platform-content-zoom-root', ''); + await expectSettledBeside(editorFrame, markerMenu, caret); + return caret; + }; + const closeMarkerMenu = async () => { + await mainPage.keyboard.press('Escape'); + await expect(markerMenu).toBeHidden(); + }; + const openCommentEditor = async (trigger: PageBox) => { + await mainPage.keyboard.press('Control+Shift+N'); + await expect(commentEditor).toBeVisible(); + await expect(commentEditor).toHaveAttribute('data-platform-content-zoom-root', ''); + await expectSettledBeside(editorFrame, commentEditor, trigger); + }; + const closeCommentEditor = async () => { + // The comment editor takes focus shortly after it opens, and only its focused text box + // closes it on Escape. + await expect(commentEditor.locator('[contenteditable="true"]')).toBeFocused(); + await mainPage.keyboard.press('Escape'); + await expect(commentEditor).toBeHidden(); + }; + /** Scrolls the text while a pop-up is open and checks it stays beside its moved trigger. */ + const expectFollowsScroll = async (popup: Locator, trigger: PageBox, delta: number) => { + const moved = await scrollTextKeepingVisible(editorFrame, delta, trigger); + await expect(async () => + expectPopupBesideTriggerAndInsideFrame(editorFrame, popup, { + ...trigger, + y: trigger.y - moved, + }), + ).toPass({ timeout: 5_000 }); + }; + + // Growth: both pop-ups have fixed widths (500 px and 400 px) that fit the pane at every level + // here, so their painted width scales by the zoom factor. + const widths = new Map(); + // Sequential: each zoom level's pop-ups must be opened, measured and closed before the next. + /* eslint-disable no-await-in-loop */ + const factors = [1, 1.5, 2]; + for (let i = 0; i < factors.length; i += 1) { + const factor = factors[i]; + await zoomAreaTo(mainPage, editorFrame, editorId, 'main', factor); + await openMarkerMenu(); + const menu = (await boxOf(markerMenu)).width; + await closeMarkerMenu(); + await openCommentEditor(await placeCaret()); + const comment = (await boxOf(commentEditor)).width; + await closeCommentEditor(); + widths.set(factor, { menu, comment }); + } + /* eslint-enable no-await-in-loop */ + const atDefault = widths.get(1); + if (!atDefault) throw new Error('No 100 % widths recorded'); + [1.5, 2].forEach((factor) => { + expect((widths.get(factor)?.menu ?? 0) / atDefault.menu).toBeCloseTo(factor, 1); + expect((widths.get(factor)?.comment ?? 0) / atDefault.comment).toBeCloseTo(factor, 1); + }); + + // Still at 200 %: scroll after opening, and each pop-up moves with its caret. The text + // scrolls back up (a negative delta), which moves the trigger down: every trigger here is + // parked near the top of the pane, so scrolling the other way would take it out of the pane + // and leave nothing to compare the pop-up's position against. + const caretForMenu = await openMarkerMenu(); + await expectFollowsScroll(markerMenu, caretForMenu, -60); + await closeMarkerMenu(); + + const caretForComment = await placeCaret(); + await openCommentEditor(caretForComment); + await expectFollowsScroll(commentEditor, caretForComment, -60); + await closeCommentEditor(); + + // A selection that wraps onto a second line: the comment editor sits beside the whole + // selection, never on part of it, also once the editor has re-rendered the selection as the + // pending comment and the text scrolls. + const selection = await scrollTriggerNearPaneTop( + editorFrame, + await selectWrappedText(mainPage, editorFrame, mainInput), + ); + await openCommentEditor(selection); + await expectFollowsScroll(commentEditor, selection, -60); + await closeCommentEditor(); + // Stays in the formatted view: the next step needs it too. + }); + + await test.step("the footnote editor's marker menu sits beside the selection and is zoomed once", async () => { + // The footnote editor opens its own inline marker menu on `\` only outside the standard + // view (which opens the platform's command palette instead); the previous step left the + // pane in the formatted view. + const mainInput = editorFrame.locator('.editor-input').first(); + await expect(mainInput).toHaveClass(/\bmarker-hidden\b/); + const caller = editorFrame.locator(TEXT_NOTE_CALLER_SELECTOR).first(); + const popover = editorFrame.locator('[data-slot="popover-content"]').filter({ + has: editorFrame.locator('.editor-input'), + }); + const noteInput = popover.locator('.editor-input'); + const menu = editorFrame.locator('[data-slot="popover-content"]').filter({ + has: editorFrame.locator('[cmdk-input]'), + }); + const menuItem = menu.locator('[cmdk-item]').first(); + + const openFootnotePopover = async () => { + await caller.scrollIntoViewIfNeeded(); + await caller.click({ force: true }); + await expect(popover).toBeVisible(); + await expectSettledBeside(editorFrame, popover, caller); + }; + const closeFootnotePopover = async () => { + await popover.getByRole('button', { name: 'Cancel', exact: true }).click(); + await expect(popover).toBeHidden(); + }; + /** + * Selects the note text from its reference (`\fr`) into its text (`\ft`) and returns the + * selection's box. The menu lists the markers allowed inside the selection's innermost + * marker, and only a note (`\f`) has any: a caret inside one `\ft` run offers nothing, so no + * menu opens there. + */ + const selectAcrossNoteMarkers = async (): Promise => { + const selected = await noteInput.evaluate((root) => { + const firstText = (selector: string) => { + const element = root.querySelector(selector); + if (!element) return undefined; + return root.ownerDocument.createTreeWalker(element, NodeFilter.SHOW_TEXT).nextNode(); + }; + const from = firstText('[data-marker="fr"]'); + const to = firstText('[data-marker="ft"]'); + if (!from || !to) return false; + root.ownerDocument + .getSelection() + ?.setBaseAndExtent( + from, + Math.min(1, from.textContent?.length ?? 0), + to, + Math.min(3, to.textContent?.length ?? 0), + ); + return true; + }); + if (!selected) throw new Error('The note has no \\fr and \\ft text to select'); + return readCaretBox(editorFrame); + }; + /** + * Presses `\` until the menu opens: the editor reports the selection's marker after the + * selection changes, and the key does nothing until it has. + */ + const openMenu = async () => { + await expect(async () => { + await mainPage.keyboard.press('\\'); + await expect(menu).toBeVisible({ timeout: 1_000 }); + }).toPass({ timeout: 10_000 }); + await expect(menuItem).toBeVisible(); + }; + const closeMenu = async () => { + await mainPage.keyboard.press('Escape'); + await expect(menu).toBeHidden(); + }; + + // Control at 100 %: the menu opens for this selection at all. + await zoomAreaTo(mainPage, editorFrame, editorId, 'main', 1); + await openFootnotePopover(); + await selectAcrossNoteMarkers(); + await openMenu(); + await waitForPopupAnimations(menu); + const itemHeightAtDefault = (await boxOf(menuItem)).height; + await closeMenu(); + await closeFootnotePopover(); + + await zoomAreaTo(mainPage, editorFrame, editorId, 'main', 2); + await openFootnotePopover(); + const selection = await selectAcrossNoteMarkers(); + await openMenu(); + await expect(menu).toHaveAttribute('data-platform-content-zoom-root', ''); + // Its own zoom root, outside the zoomed footnote popover: nested inside it, the menu would + // be zoomed twice. + const popoverElement = await popover.elementHandle(); + expect( + await menu.evaluate( + (element, popoverRoot) => !!popoverRoot?.contains(element), + popoverElement, + ), + ).toBe(false); + await waitForPopupAnimations(menu); + await expectSettledBeside(editorFrame, menu, selection); + const itemHeightRatio = (await boxOf(menuItem)).height / itemHeightAtDefault; + expect(itemHeightRatio).toBeGreaterThan(2 * 0.85); + expect(itemHeightRatio).toBeLessThan(2 * 1.15); + await closeMenu(); + await closeFootnotePopover(); + + // Back to the standard view (formatted -> standard) for the steps that follow, still at 200 %. + await sendCommandWithId(mainPage, 'platformScriptureEditor.changeView', editorId); + await expect(mainInput).toHaveClass(/\bmarker-editable\b/, { timeout: 20_000 }); + }); + + await test.step('a toolbar pop-up stays at interface scale while the text is zoomed', async () => { + const toolbarMenuTrigger = editorFrame + .locator('.scripture-editor-tab-nav button[aria-haspopup="menu"]') + .first(); + await toolbarMenuTrigger.click(); + const toolbarMenu = editorFrame.locator('[data-slot="dropdown-menu-content"]').last(); + await expect(toolbarMenu).toBeVisible(); + // Positive control that the text really is zoomed right now. + expect(await readFactor(editorFrame, '')).toBe(2); + await expect(toolbarMenu).not.toHaveAttribute('data-platform-content-zoom-root', /.*/); + await mainPage.keyboard.press('Escape'); + await zoomAreaTo(mainPage, editorFrame, editorId, 'main', 1); + }); + await test.step('a read-only editor of the same project shares the same memory identity', async () => { // Wait for the debounced memory write to land before opening a second pane that seeds from it. const normalizedId = SAMPLE_WEB_PROJECT_ID.toUpperCase(); diff --git a/extensions/src/legacy-comment-manager/src/comment-list.component.test.tsx b/extensions/src/legacy-comment-manager/src/comment-list.component.test.tsx index 36f25b952c9..b4cd8f19d8e 100644 --- a/extensions/src/legacy-comment-manager/src/comment-list.component.test.tsx +++ b/extensions/src/legacy-comment-manager/src/comment-list.component.test.tsx @@ -7,7 +7,11 @@ import userEvent from '@testing-library/user-event'; import '@testing-library/jest-dom'; import { beforeAll, describe, expect, it, vi } from 'vitest'; import type { LanguageStrings } from 'platform-bible-utils'; -import { CommentListPanel, CommentListPanelProps } from './comment-list.component'; +import { + CommentListPanel, + CommentListPanelProps, + COMMENT_LIST_STICKY_HEADER_ELEMENT_ID, +} from './comment-list.component'; import { DEFAULT_COMMENT_FILTERS, DEFAULT_SCOPE_FILTER } from './comment-list-filters.model'; // Radix Select scrolls its highlighted item into view on open and checks pointer capture on @@ -71,7 +75,7 @@ const STRINGS: LanguageStrings = { * and the sync-blocked notice above it, which render regardless of the list content. */ function renderPanel(overrides: Partial = {}) { - render( + return render( { options.forEach((option) => expect(option).not.toHaveTextContent(/%.+%/)); }); }); + +describe('CommentListPanel sticky header', () => { + // The web view looks the header up by this id to measure how much of the view it covers, so the + // id and what it wraps are a DOM contract, not styling detail: without them a BCV-sync scroll + // parks the target card underneath the header. + it('gives the sticky header the id the web view looks it up by', () => { + const { container } = renderPanel(); + const header = container.querySelector(`#${COMMENT_LIST_STICKY_HEADER_ELEMENT_ID}`); + expect(header).not.toBeNull(); + expect(header?.className).toContain('tw:sticky'); + }); + + it('wraps the filter toolbar, and the notice when shown, in that header', () => { + const { container } = renderPanel({ isSyncBlocked: true }); + const header = container.querySelector(`#${COMMENT_LIST_STICKY_HEADER_ELEMENT_ID}`); + expect(header?.contains(screen.getByTestId('comment-scope-filter'))).toBe(true); + expect(header?.contains(screen.getByRole('status'))).toBe(true); + }); +}); + +describe('CommentListPanel content zoom area', () => { + it('exposes exactly one content zoom marker', () => { + const { container } = renderPanel(); + expect(container.querySelectorAll('[data-platform-content-zoom-root]')).toHaveLength(1); + }); + + it("marks it as the view's main area (empty attribute value)", () => { + const { container } = renderPanel(); + const marker = container.querySelector('[data-platform-content-zoom-root]'); + expect(marker?.getAttribute('data-platform-content-zoom-root')).toBe(''); + }); + + it("keeps the list container's layout classes", () => { + const { container } = renderPanel(); + const marker = container.querySelector('[data-platform-content-zoom-root]'); + expect(marker?.className).toContain('tw:flex-1'); + expect(marker?.className).toContain('tw:overflow-auto'); + }); + + it('leaves the filter toolbar outside the zoom area', () => { + const { container } = renderPanel(); + const marker = container.querySelector('[data-platform-content-zoom-root]'); + expect(marker?.contains(screen.getByTestId('comment-scope-filter'))).toBe(false); + }); + + it('leaves the sync-blocked notice outside the zoom area', () => { + const { container } = renderPanel({ isSyncBlocked: true }); + const marker = container.querySelector('[data-platform-content-zoom-root]'); + expect(marker?.contains(screen.getByRole('status'))).toBe(false); + }); + + it('keeps the empty-state message inside the zoom area', () => { + const { container } = renderPanel({ threads: [] }); + const marker = container.querySelector('[data-platform-content-zoom-root]'); + expect(marker?.textContent).toBe(EN_STRINGS['%no_comments%']); + }); + + it('keeps loading skeletons inside the zoom area', () => { + const { container } = renderPanel({ isLoading: true }); + const marker = container.querySelector('[data-platform-content-zoom-root]'); + // `Skeleton` always emits `data-slot="skeleton"` (a deterministic attribute), so the count + // asserted here is exact rather than "at least one" — the component renders 10. + expect(marker?.querySelectorAll('[data-slot="skeleton"]')).toHaveLength(10); + }); +}); diff --git a/extensions/src/legacy-comment-manager/src/comment-list.component.tsx b/extensions/src/legacy-comment-manager/src/comment-list.component.tsx index 9ac741ec699..d67688d6742 100644 --- a/extensions/src/legacy-comment-manager/src/comment-list.component.tsx +++ b/extensions/src/legacy-comment-manager/src/comment-list.component.tsx @@ -1,6 +1,7 @@ import { Button, CommentList, + ContentZoomRoot, Label, localizeOrFallback, Select, @@ -51,6 +52,13 @@ export const COMMENT_LIST_PANEL_EXTRA_STRING_KEYS = [ */ const SYNC_BLOCKED_NOTICE_KEY = '%webView_legacyCommentManager_syncEditBlocked_notice%'; +/** + * `id` of the sticky header (the editing-paused notice, when shown, plus the filter toolbar). The + * header overlays the top of the scrolled content, so anything scrolling a card into view needs its + * current height — which changes with the notice — to keep the card clear of it. + */ +export const COMMENT_LIST_STICKY_HEADER_ELEMENT_ID = 'comment-list-sticky-header'; + // Reuse the underlying CommentList prop types so this panel stays in sync with platform-bible-react. type CommentListProps = ComponentProps; @@ -286,8 +294,12 @@ export function CommentListPanel({
{/* Sticky header: the editing-paused notice (when blocking) and the filter toolbar share one sticky container so both stay pinned to the top of whichever ancestor scrolls and neither - scrolls out of view as the comments list scrolls. */} -
+ scrolls out of view as the comments list scrolls. COMMENT_LIST_STICKY_HEADER_ELEMENT_ID + documents why it carries an id. */} +
{/* Slim, non-covering notice shown while this project's automatic Send/Receive is blocking edits. Only the write affordances are disabled (by the web view's gated capability callbacks); filtering/reading comments stays fully usable. */} @@ -336,8 +348,10 @@ export function CommentListPanel({
{/* Comments list (or skeletons while loading / empty state). Only this region swaps on load, - so the toolbar above stays mounted. */} -
{listContent}
+ so the toolbar above stays mounted. It is also this view's only content-zoom area: the + sticky header above (notice + filter toolbar) stays outside the marker so it keeps its + size while the cards scale. */} + {listContent}
); } diff --git a/extensions/src/legacy-comment-manager/src/comment-list.web-view.burst.test.tsx b/extensions/src/legacy-comment-manager/src/comment-list.web-view.burst.test.tsx index 52c444475f5..a36313938e9 100644 --- a/extensions/src/legacy-comment-manager/src/comment-list.web-view.burst.test.tsx +++ b/extensions/src/legacy-comment-manager/src/comment-list.web-view.burst.test.tsx @@ -8,6 +8,7 @@ import papi from '@papi/frontend'; import type { UseWebViewScrollGroupScrRefHook, UseWebViewStateHook } from '@papi/core'; import type { SerializedVerseRef } from '@sillsdev/scripture'; import type { LegacyCommentThreadSelector } from 'legacy-comment-manager'; +import { useViewVisibility } from 'platform-bible-react'; import type { LegacyCommentThread } from 'platform-bible-utils'; import { saveDrafts } from './comment-draft-store'; import type { StoredFilterSelection } from './comment-filter-store'; @@ -21,6 +22,12 @@ import { LegacyScopeFilter, ScopeFilter, } from './comment-list-filters.model'; +import type { CommentListScrollTarget } from './comment-list-scroll.utils'; + +/** One call the web view made to the (mocked) `useBcvSyncScroll` hook. */ +type BcvSyncScrollCall = { + scrollToTarget: (target: NonNullable, behavior: ScrollBehavior) => void; +}; // vi.mock factories are hoisted above imports, so anything they close over must be created via // vi.hoisted to avoid a temporal-dead-zone reference. @@ -66,11 +73,16 @@ const mocks = vi.hoisted(() => { * re-subscribing; a new reference means it would tear down and re-establish the subscription. */ const commentThreadSelectorLog: LegacyCommentThreadSelector[] = []; + // Every call the web view made to useBcvSyncScroll, most recent last — lets a test reach the web + // view's real `scrollToTarget` callback directly (see the mock below) instead of driving the real + // hook's sync-scroll conditions just to exercise the DOM work that callback owns. + const bcvSyncScrollCalls: BcvSyncScrollCall[] = []; return { panelPropsLog, bcvSyncScroll, commentThreadSelectorLog, commentThreadsFixture, + bcvSyncScrollCalls, }; }); @@ -107,27 +119,42 @@ vi.mock('@papi/frontend/react', () => ({ })); // Only what the web view module reads at load or render time; the pieces these tests exercise -// (message handling, filter state) live in the web view itself and its local utils, which are real -vi.mock('platform-bible-react', () => ({ - COMMENT_LIST_ELEMENT_ID: 'comment-list', - COMMENT_LIST_STRING_KEYS: [], - CONFLICT_NOTE_STRING_KEYS: [], - getCommentThreadElementId: (threadId: string) => `comment-thread-${threadId}`, - Sonner: () => undefined, - sonner: { error: vi.fn(), warning: vi.fn(), info: vi.fn() }, - usePromise: vi.fn((_factory: unknown, defaultValue: unknown) => [defaultValue, false]), - useTabIconSelection: vi.fn(() => undefined), - useViewVisibility: vi.fn(() => true), -})); +// (message handling, filter state) live in the web view itself and its local utils, which are real. +// useRunWhenVisible is the one exception: the hidden-view tests below assert against ITS behavior +// (the deferred-scroll catch-up), so it comes through from the real module via `importOriginal` +// rather than being replaced — a hand-written stand-in would test the wiring against a copy of the +// hook instead of the hook itself. +vi.mock('platform-bible-react', async (importOriginal) => { + const actual = await importOriginal(); + + return { + COMMENT_LIST_ELEMENT_ID: 'comment-list', + COMMENT_LIST_STRING_KEYS: [], + CONFLICT_NOTE_STRING_KEYS: [], + getCommentThreadElementId: (threadId: string) => `comment-thread-${threadId}`, + Sonner: () => undefined, + sonner: { error: vi.fn(), warning: vi.fn(), info: vi.fn() }, + usePromise: vi.fn((_factory: unknown, defaultValue: unknown) => [defaultValue, false]), + useRunWhenVisible: actual.useRunWhenVisible, + useTabIconSelection: vi.fn(() => undefined), + useViewVisibility: vi.fn(() => true), + }; +}); vi.mock('./use-bcv-sync-scroll.hook', () => ({ - useBcvSyncScroll: () => mocks.bcvSyncScroll, + useBcvSyncScroll: (call: BcvSyncScrollCall) => { + mocks.bcvSyncScrollCalls.push(call); + return mocks.bcvSyncScroll; + }, })); // The panel is presentation; recording the props it is handed is how these tests observe which // filters the web view actually has applied vi.mock('./comment-list.component', () => ({ COMMENT_LIST_PANEL_EXTRA_STRING_KEYS: [], + // The real value (comment-list.component.tsx): the web view looks this id up by exact string, so + // the sticky-header test below needs it to match. + COMMENT_LIST_STICKY_HEADER_ELEMENT_ID: 'comment-list-sticky-header', CommentListPanel: ({ isLoading, threads, @@ -268,7 +295,9 @@ function renderCommentListWebView( stateSeed: Record = {}, ) { const CommentListWebView = globalThis.webViewComponent; - render( + // Returned so a test that needs to force a re-render (e.g. to pick up a changed + // useViewVisibility mock return value) can call `rerender` with the same element. + return render( `), + * with `scrollIntoView` stubbed on the instance (jsdom implements neither layout nor + * `scrollIntoView`). Returns the stub and a `remove` cleanup a test should call once done. + */ +function mountThreadElement(threadId: string) { + const threadElement = document.createElement('div'); + threadElement.id = `comment-thread-${threadId}`; + const scrollIntoView = vi.fn(); + threadElement.scrollIntoView = scrollIntoView; + document.body.appendChild(threadElement); + return { scrollIntoView, remove: () => document.body.removeChild(threadElement) }; +} + function latestPanelProps() { return mocks.panelPropsLog[mocks.panelPropsLog.length - 1]; } +/** The web view's own `scrollToTarget` from its most recent `useBcvSyncScroll` call. */ +function latestScrollToTarget() { + const call = mocks.bcvSyncScrollCalls[mocks.bcvSyncScrollCalls.length - 1]; + if (!call) throw new Error('test setup: useBcvSyncScroll was never called'); + return call.scrollToTarget; +} + +/** + * A `DOMRect`-shaped object reporting only the given `height`, for stubbing + * `getBoundingClientRect`. + */ +function rectOfHeight(height: number): DOMRect { + return { + height, + width: 0, + x: 0, + y: 0, + top: 0, + left: 0, + right: 0, + bottom: height, + toJSON: () => ({}), + }; +} + /** Minimal, valid `LegacyCommentThread` fixture builder — only the fields these tests read vary. */ function makeCommentThread(id: string, status: 'Todo' | 'Resolved'): LegacyCommentThread { return { @@ -1336,3 +1408,221 @@ describe('current-user registration-data fetch failure recovery', () => { }); }); }); + +describe('sticky-header scroll padding', () => { + afterEach(() => { + cleanup(); + document.documentElement.style.scrollPaddingTop = ''; + }); + + it("re-reads the sticky header's height on every scroll and pins it as the document's scroll-padding-top", async () => { + renderCommentListWebView(); + await waitFor(() => expect(latestPanelProps()).toBeDefined()); + + const header = document.createElement('div'); + header.id = 'comment-list-sticky-header'; + document.body.appendChild(header); + try { + const heights = [40, 64]; + const getBoundingClientRect = vi.spyOn(header, 'getBoundingClientRect'); + heights.forEach((height) => + getBoundingClientRect.mockImplementationOnce(() => rectOfHeight(height)), + ); + + // A target that resolves to no DOM element (the mocked getCommentThreadElementId never + // matches anything real here) is enough: the sticky-header read runs unconditionally before + // scrollToTarget branches on the target type. + const scrollToTarget = latestScrollToTarget(); + scrollToTarget({ type: 'thread', threadId: 'missing-1' }, 'smooth'); + expect(document.documentElement.style.scrollPaddingTop).toBe(`${heights[0]}px`); + + scrollToTarget({ type: 'thread', threadId: 'missing-2' }, 'smooth'); + expect(document.documentElement.style.scrollPaddingTop).toBe(`${heights[1]}px`); + } finally { + document.body.removeChild(header); + } + }); + + it("also re-reads the sticky header's height when selecting a thread via the selectThread message", async () => { + renderCommentListWebView(); + await waitFor(() => expect(latestPanelProps()).toBeDefined()); + + const header = document.createElement('div'); + header.id = 'comment-list-sticky-header'; + document.body.appendChild(header); + vi.spyOn(header, 'getBoundingClientRect').mockReturnValue(rectOfHeight(72)); + const { scrollIntoView, remove } = mountThreadElement('thread-1'); + + try { + act(() => { + dispatchSelectThread('thread-1'); + }); + + expect(document.documentElement.style.scrollPaddingTop).toBe('72px'); + expect(scrollIntoView).toHaveBeenCalledWith({ behavior: 'smooth', block: 'center' }); + } finally { + document.body.removeChild(header); + remove(); + } + }); +}); + +describe('trySelectThread and hidden views', () => { + afterEach(() => { + cleanup(); + document.documentElement.style.scrollPaddingTop = ''; + // Every other describe block in this file relies on the default (visible) mock; restore it so + // a test order change or a re-run can't leak `false` into an unrelated test. + vi.mocked(useViewVisibility).mockReturnValue(true); + }); + + it('defers the scroll into view while the tab is hidden, then scrolls instantly once it is shown', async () => { + vi.mocked(useViewVisibility).mockReturnValue(false); + const CommentListWebView = globalThis.webViewComponent; + const useWebViewState = makeUseWebViewState({ editorWebViewId: 'editor-1' }); + const { rerender } = render( + , + ); + await waitFor(() => expect(latestPanelProps()).toBeDefined()); + + const { scrollIntoView, remove } = mountThreadElement('thread-1'); + try { + act(() => { + dispatchSelectThread('thread-1'); + }); + + // Hidden: rc-dock keeps the pane mounted but display:none, so there is no layout to scroll + // within — the scroll must stay pending rather than fire against a pane with no layout. + expect(scrollIntoView).not.toHaveBeenCalled(); + + vi.mocked(useViewVisibility).mockReturnValue(true); + act(() => { + rerender( + , + ); + }); + + // The queued request collapses into a single, instant (non-animated) catch-up scroll. + await waitFor(() => expect(scrollIntoView).toHaveBeenCalledTimes(1)); + expect(scrollIntoView).toHaveBeenCalledWith({ behavior: 'instant', block: 'center' }); + } finally { + remove(); + } + }); + + it('retries once if the thread element is briefly missing when the deferred scroll first runs', async () => { + vi.mocked(useViewVisibility).mockReturnValue(false); + const CommentListWebView = globalThis.webViewComponent; + const useWebViewState = makeUseWebViewState({ editorWebViewId: 'editor-1' }); + const { rerender } = render( + , + ); + await waitFor(() => expect(latestPanelProps()).toBeDefined()); + + const first = mountThreadElement('thread-1'); + act(() => { + dispatchSelectThread('thread-1'); + }); + expect(first.scrollIntoView).not.toHaveBeenCalled(); + + // The thread's DOM node disappears right as the tab becomes visible (e.g. a filter re-inserting + // it mid-transition), so the first catch-up attempt misses it. + first.remove(); + + vi.mocked(useViewVisibility).mockReturnValue(true); + act(() => { + rerender( + , + ); + }); + + // The thread reappears shortly after (the interrupted re-render finishing) — the missed + // catch-up must retry rather than being dropped for good. + const second = mountThreadElement('thread-1'); + try { + await waitFor(() => expect(second.scrollIntoView).toHaveBeenCalledTimes(1)); + expect(second.scrollIntoView).toHaveBeenCalledWith({ behavior: 'instant', block: 'center' }); + } finally { + second.remove(); + } + }); +}); + +describe('trySelectThread identity across visibility flips', () => { + afterEach(() => { + cleanup(); + vi.mocked(useViewVisibility).mockReturnValue(true); + }); + + it('keeps the window message listener subscribed across a visibility flip alone', async () => { + const addEventListenerSpy = vi.spyOn(window, 'addEventListener'); + vi.mocked(useViewVisibility).mockReturnValue(true); + const CommentListWebView = globalThis.webViewComponent; + const useWebViewState = makeUseWebViewState({ editorWebViewId: 'editor-1' }); + const { rerender } = render( + , + ); + await waitFor(() => expect(latestPanelProps()).toBeDefined()); + + const messageSubscriptionsBefore = addEventListenerSpy.mock.calls.filter( + ([eventName]) => eventName === 'message', + ).length; + + vi.mocked(useViewVisibility).mockReturnValue(false); + act(() => { + rerender( + , + ); + }); + + const messageSubscriptionsAfter = addEventListenerSpy.mock.calls.filter( + ([eventName]) => eventName === 'message', + ).length; + + // A visibility flip alone must not tear down and re-subscribe the message listener — doing so + // would also restart the pending-selection retry timer (see the effect below it) on every flip. + expect(messageSubscriptionsAfter).toBe(messageSubscriptionsBefore); + }); +}); diff --git a/extensions/src/legacy-comment-manager/src/comment-list.web-view.tsx b/extensions/src/legacy-comment-manager/src/comment-list.web-view.tsx index 50d36b69e7b..32b2db6ccc4 100644 --- a/extensions/src/legacy-comment-manager/src/comment-list.web-view.tsx +++ b/extensions/src/legacy-comment-manager/src/comment-list.web-view.tsx @@ -11,6 +11,7 @@ import { Sonner, sonner, usePromise, + useRunWhenVisible, useTabIconSelection, useViewVisibility, type TabIconUrls, @@ -40,7 +41,11 @@ import { saveFilterSelection, } from './comment-filter-store'; import { CommentListWebViewMessage } from './comment-list-messages.model'; -import { CommentListPanel, COMMENT_LIST_PANEL_EXTRA_STRING_KEYS } from './comment-list.component'; +import { + CommentListPanel, + COMMENT_LIST_PANEL_EXTRA_STRING_KEYS, + COMMENT_LIST_STICKY_HEADER_ELEMENT_ID, +} from './comment-list.component'; import { applyFilterOverrides, buildCommentThreadSelector, @@ -153,6 +158,20 @@ async function withPdp( return action(pdp); } +/** + * Re-measures the sticky header (`COMMENT_LIST_STICKY_HEADER_ELEMENT_ID`) and pins its live height + * as the document's `scroll-padding-top`, so a `scrollIntoView` call lands its target below the + * header instead of underneath it. The header's height is not stable — it grows when the + * editing-paused notice appears, and the filter toolbar it also contains wraps as the viewport + * narrows — so every caller must invoke this immediately before its own `scrollIntoView`, rather + * than relying on a padding value set by an earlier scroll. + */ +function applyStickyHeaderScrollPadding(): void { + const stickyHeader = document.getElementById(COMMENT_LIST_STICKY_HEADER_ELEMENT_ID); + if (stickyHeader) + document.documentElement.style.scrollPaddingTop = `${stickyHeader.getBoundingClientRect().height}px`; +} + global.webViewComponent = function CommentListWebView({ useWebViewScrollGroupScrRef, useWebViewState, @@ -602,11 +621,36 @@ global.webViewComponent = function CommentListWebView({ const isViewVisible = useViewVisibility(); + /** + * Mirrors {@link isViewVisible}, read by `trySelectThread` instead of the closed-over value. + * `trySelectThread` is captured by the `window` message-listener effect below, which only + * re-subscribes when `trySelectThread`'s own identity changes — if `isViewVisible` were a + * dependency of `trySelectThread` instead, every visibility flip would both (a) leave a window, + * between this component's render and that effect's re-subscription, where the still-attached old + * listener's closed-over value can disagree with this ref, and (b) tear down and rebuild the + * message listener and restart the pending-selection retry timer on every flip even when nothing + * else changed. Updated unconditionally on every render, the same way `useRunWhenVisible`'s own + * internal visibility ref is, so the two can never disagree about the current visibility. + */ + const isViewVisibleRef = useRef(isViewVisible); + isViewVisibleRef.current = isViewVisible; + // Performs the DOM scroll for a computed sync-scroll target. The hook computes WHERE to scroll; // this web view owns the DOM knowledge (both element ids come from platform-bible-react's // CommentList). const scrollToTarget = useCallback( (target: NonNullable, behavior: ScrollBehavior) => { + // The sticky header overlays the top of what scrolls here (this view's document scrolls, not + // the list container), so a `block: 'start'` scroll would otherwise park the card underneath + // it. applyStickyHeaderScrollPadding gives the scroll container that much top padding so the + // browser stops the card below the header instead. The height is in the document's own + // pixels — the header sits outside the content-zoom root, so neither it nor + // `scroll-padding-top` is scaled by the zoom level. Setting the padding on `documentElement` + // is correct only while the web-view document itself is the scroller; a future layout that + // bounds this view's height (PT-4173) would move the scroller to a bounded container instead, + // and this padding would need to move with it. + applyStickyHeaderScrollPadding(); + if (target.type === 'thread') { const threadElement = document.getElementById(getCommentThreadElementId(target.threadId)); if (threadElement) threadElement.scrollIntoView({ behavior, block: 'start' }); @@ -636,6 +680,59 @@ global.webViewComponent = function CommentListWebView({ scrollToTarget, }); + // Clears the scroll-padding this view applies before a scroll (see + // applyStickyHeaderScrollPadding) so a stale value never outlives this component. + useEffect(() => { + return () => { + document.documentElement.style.scrollPaddingTop = ''; + }; + }, []); + + /** + * Target for the deferred scroll `trySelectThread` performs — read by + * `scrollSelectedThreadIntoView` at run time rather than closed over, so a request made while the + * view is hidden still resolves against the thread (and behavior) it was made for once the + * catch-up runs. + */ + const pendingThreadScrollRef = useRef<{ threadId: string; behavior: ScrollBehavior } | undefined>( + undefined, + ); + + const scrollSelectedThreadIntoView = useCallback((isRetry = false) => { + const pending = pendingThreadScrollRef.current; + if (!pending) return; + const threadElement = document.getElementById(getCommentThreadElementId(pending.threadId)); + if (!threadElement) { + // The catch-up can race a re-render that is still inserting the thread (e.g. a filter change + // resolving right as the tab becomes visible) — the element that was found when the thread + // was selected can be momentarily gone by the time this runs. Keep the target and retry once + // shortly after instead of dropping it for good; only give up once the retry itself misses. + if (isRetry) { + logger.debug( + `Deferred thread scroll: thread element still not found after retry: ${pending.threadId}`, + ); + pendingThreadScrollRef.current = undefined; + return; + } + logger.debug( + `Deferred thread scroll: thread element not found: ${pending.threadId}; retrying once`, + ); + setTimeout(() => scrollSelectedThreadIntoView(true), 50); + return; + } + pendingThreadScrollRef.current = undefined; + applyStickyHeaderScrollPadding(); + threadElement.scrollIntoView({ behavior: pending.behavior, block: 'center' }); + }, []); + + // Hidden case: rc-dock keeps an inactive tab's pane mounted under `display: none`, where both the + // header-height read and `scrollIntoView` silently no-op — there is no layout to measure or + // scroll within. useRunWhenVisible defers the scroll while hidden, collapsing repeat requests into + // the single most recent one (pendingThreadScrollRef), and runs it once the tab is shown; the + // 'instant' behavior trySelectThread records for that case (below) makes the catch-up snap into + // place instead of animating into a pane the user just switched to. + const requestThreadScroll = useRunWhenVisible(isViewVisible, scrollSelectedThreadIntoView); + /** * Attempts to scroll to and select a thread by ID. If the thread element doesn't exist yet * (likely because data is still loading), queues the thread ID to be processed later. @@ -649,7 +746,15 @@ global.webViewComponent = function CommentListWebView({ const threadElement = document.getElementById(getCommentThreadElementId(threadId)); if (threadElement) { setSelectedThreadId(threadId); - threadElement.scrollIntoView({ behavior: 'smooth', block: 'center' }); + // See requestThreadScroll's own comment for the hidden-view rationale: 'smooth' while the + // view is already visible, 'instant' recorded up front for the hidden case so the eventual + // catch-up doesn't animate. Reads isViewVisibleRef rather than closing over isViewVisible — + // see the ref's own doc comment. + pendingThreadScrollRef.current = { + threadId, + behavior: isViewVisibleRef.current ? 'smooth' : 'instant', + }; + requestThreadScroll(); setPendingThreadIdToSelect(undefined); // The editor's caret move for this navigation may deliver its scroll-group change after // this point; record the thread's reference so that late change doesn't scroll the list @@ -674,7 +779,7 @@ global.webViewComponent = function CommentListWebView({ logger.warn(`Could not find thread element with id: ${threadId}`); return false; }, - [recordSelfInitiatedNavigation], + [recordSelfInitiatedNavigation, requestThreadScroll], ); // Listen for messages from the web view controller diff --git a/extensions/src/platform-scripture-editor/src/content-zoom-markers.contract.test.ts b/extensions/src/platform-scripture-editor/src/content-zoom-markers.contract.test.ts index 593cabd553d..ad9f999473e 100644 --- a/extensions/src/platform-scripture-editor/src/content-zoom-markers.contract.test.ts +++ b/extensions/src/platform-scripture-editor/src/content-zoom-markers.contract.test.ts @@ -4,12 +4,13 @@ import { fileURLToPath } from 'node:url'; import { describe, expect, it } from 'vitest'; /* - * Guards the two `ContentZoomRoot` markers in `platform-scripture-editor.web-view.tsx` — the - * file is a 3 981-line web view that cannot be mounted in jsdom (it depends on the editor - * iframe, PAPI services, and a reverse portal), so this is a source-reading contract test rather - * than a render test, the same shape as `editor-character-marker-contract.test.ts`. The two - * markers *are* the entire zoom opt-in for this view: a refactor that silently drops one leaves - * no other signal anywhere that the text or footnote-editing popover stopped zooming. + * Guards the text marker and the provider around the popovers beside it in + * `platform-scripture-editor.web-view.tsx` — the file is a 3 981-line web view that cannot be + * mounted in jsdom (it depends on the editor iframe, PAPI services, and a reverse portal), so + * this is a source-reading contract test rather than a render test, the same shape as + * `editor-character-marker-contract.test.ts`. These markers *are* the entire zoom opt-in for + * this view: a refactor that silently drops one leaves no other signal anywhere that the text + * or the popovers beside it stopped zooming. * * Behaviour (that the marked areas actually zoom, together with the platform's * `web-view-content-zoom` service) is covered by the e2e spec @@ -35,18 +36,44 @@ describe('content zoom markers (platform-scripture-editor.web-view.tsx)', () => ); }); - it('wraps the footnote editor popover in a ContentZoomRoot', () => { - // Structure only. The popover's own class list is styling and no part of the zoom contract, so - // it stays out of the pattern — the sibling assertion above does the same. An optional JSX - // comment may sit between the popover and the marker (explaining why this `main`-area marker - // isn't nested under the editor's), so it's tolerated but not required. + it('puts the three popovers rendered beside the editor in the text area', () => { + // The markers menu, footnote editor and comment editor popovers sit beside the editor in the + // tree, outside its ContentZoomRoot, so they name the text area through the provider and zoom + // with the text. An optional JSX comment may precede the first popover. expect(source).toMatch( - /]*> (?:\{\/\*.*?\*\/\} )? (?:\{\/\*.*?\*\/\} )?(?:\{\/\*\* Inline markers menu components \*\/\} )?.*.*.*?<\/Popover> <\/ContentZoomAreaProvider>/, ); }); - it('marks both areas as `main` (neither ContentZoomRoot carries an `area` prop)', () => { + it('lets the footnote editor popover’s minimum width yield to the zoomed width cap', () => { + // A plain `min-w-[500px]` zooms to 1000 px at 200 % and beats the cap's `max-width`, so the + // popover would overflow a narrow pane. The `100vw` fallback keeps the minimum defined before + // Radix publishes the available width, on the first layout the footnote editor locks its width + // on. Inline, because the web view's style pipeline drops this value as a Tailwind class. + expect(source).toContain( + "'min(500px, calc(var(--radix-popover-content-available-width, 100vw) / var(--platform-content-zoom-popup-factor, 1)))'", + ); + expect(source).toContain('style={{ minWidth: FOOTNOTE_POPOVER_MIN_WIDTH }}'); + expect(source).not.toContain('tw:min-w-[500px]'); + expect(source).not.toContain('tw:min-w-[min('); + }); + + it('anchors all three popovers to live positions in the text', () => { + // A positioned anchor element keeps the rect captured on open, so the popover stays put while + // the text scrolls or reflows under a zoom change. + expect(source).toContain(''); + expect(source).toContain(''); + expect(source).toContain(''); + expect(source.match(/ { + expect(source).not.toMatch(/]*> (?:\{\/\*.*?\*\/\} )?/); + }); + + it('marks both areas as `main` (neither ContentZoomRoot nor ContentZoomAreaProvider carries an `area` prop)', () => { expect(source).not.toContain(' { diff --git a/extensions/src/platform-scripture-editor/src/editor-dom.util.test.ts b/extensions/src/platform-scripture-editor/src/editor-dom.util.test.ts index 5cd916d16d4..9106aacf58f 100644 --- a/extensions/src/platform-scripture-editor/src/editor-dom.util.test.ts +++ b/extensions/src/platform-scripture-editor/src/editor-dom.util.test.ts @@ -18,6 +18,9 @@ import { clampToScrollRange, clampTopToVisibleArea, computeRangeScrollTop, + createNoteAnchorSource, + createPendingCommentAnchorSource, + createPendingCommentCenterAnchorSource, findScrollContainer, getEditorSelectionRange, getVerseElement, @@ -25,6 +28,7 @@ import { isEchoOfPublishedScrRef, isSameScrollGeometry, isSameVerseRef, + measureAnnotation, measureBaselineOffset, measureRangeScrollGeometry, paraAtPoint, @@ -1161,3 +1165,302 @@ describe('waitForLayoutToSettle', () => { expect(onTimedOut).not.toHaveBeenCalled(); }); }); + +/** + * Gives `target` the client rects jsdom cannot lay out. The measurement helpers read + * `getClientRects()` (and, for a range, `getBoundingClientRect()`), so a test supplies them per + * element or range. + */ +function stubClientRects(target: Element | Range, rects: DOMRect[]) { + Object.defineProperty(target, 'getClientRects', { value: () => rects, configurable: true }); + Object.defineProperty(target, 'getBoundingClientRect', { + configurable: true, + value: () => { + const left = Math.min(...rects.map((rect) => rect.left)); + const top = Math.min(...rects.map((rect) => rect.top)); + const right = Math.max(...rects.map((rect) => rect.right)); + const bottom = Math.max(...rects.map((rect) => rect.bottom)); + return new DOMRect(left, top, right - left, bottom - top); + }, + }); +} + +/** + * A rect's numbers, for comparison. `DOMRect` keeps its values on the prototype, so `toEqual` on + * two rects compares nothing and passes for any pair. + */ +function rectNumbers(rect: DOMRect | undefined) { + if (!rect) return undefined; + return { x: rect.x, y: rect.y, width: rect.width, height: rect.height }; +} + +/** An annotation fragment inside the editor container, carrying the rects it paints. */ +function addAnnotationFragment(container: Element, id: string, rects: DOMRect[]) { + const fragment = document.createElement('span'); + fragment.className = `annotationId-${id}`; + stubClientRects(fragment, rects); + container.appendChild(fragment); + return fragment; +} + +/** An editor container for the annotation selector to scope to. */ +function addEditorContainer() { + const container = document.createElement('div'); + container.className = 'editor-container'; + document.body.appendChild(container); + return container; +} + +describe('measureAnnotation', () => { + afterEach(() => { + document.body.innerHTML = ''; + }); + + it('has no rect when the annotation is not in the document', () => { + addEditorContainer(); + expect(measureAnnotation('missing')).toBeUndefined(); + }); + + it('has no rect when the annotation renders no line box', () => { + // An annotation in a collapsed or unrendered subtree has an element but paints nothing; + // anchoring a pop-up on a zero rect would put it in the frame's corner. + addAnnotationFragment(addEditorContainer(), 'abc', []); + expect(measureAnnotation('abc')).toBeUndefined(); + }); + + it('spans every line box of a wrapped annotation', () => { + // A selection that wraps renders as several line boxes; the anchor must cover all of them + // rather than its first line. + const container = addEditorContainer(); + addAnnotationFragment(container, 'abc', [ + new DOMRect(200, 100, 100, 20), + new DOMRect(40, 120, 260, 20), + ]); + + expect(rectNumbers(measureAnnotation('abc'))).toEqual({ + x: 40, + y: 100, + width: 260, + height: 40, + }); + }); + + it('spans every fragment when formatting splits the annotation', () => { + // Partly formatted text renders one annotation as several elements. + const container = addEditorContainer(); + addAnnotationFragment(container, 'abc', [new DOMRect(50, 100, 60, 20)]); + addAnnotationFragment(container, 'abc', [new DOMRect(110, 100, 90, 20)]); + + expect(rectNumbers(measureAnnotation('abc'))).toEqual({ + x: 50, + y: 100, + width: 150, + height: 20, + }); + }); + + it('ignores an annotation outside the editor container', () => { + // The selector is scoped to the editor, so a copy elsewhere in the document cannot pull the + // anchor away. + addEditorContainer(); + const elsewhere = document.createElement('div'); + document.body.appendChild(elsewhere); + addAnnotationFragment(elsewhere, 'abc', [new DOMRect(10, 10, 10, 10)]); + + expect(measureAnnotation('abc')).toBeUndefined(); + }); +}); + +describe('createPendingCommentAnchorSource', () => { + afterEach(() => { + document.body.innerHTML = ''; + }); + + function addParagraph(text: string) { + const container = addEditorContainer(); + const paragraph = document.createElement('p'); + paragraph.textContent = text; + container.appendChild(paragraph); + const range = document.createRange(); + range.selectNodeContents(paragraph); + return { container, paragraph, range }; + } + + it('mark absent and the range still intact: follows the range', () => { + const { container, range } = addParagraph('In the beginning'); + stubClientRects(range, [new DOMRect(30, 60, 120, 18)]); + + const source = createPendingCommentAnchorSource(range, 'pending-comment', container); + + expect(rectNumbers(source.measure())).toEqual({ x: 30, y: 60, width: 0, height: 18 }); + expect(source.contextElement).toBe(container); + }); + + it('mark absent and the range moved: measure reports no rect', () => { + const { container, paragraph, range } = addParagraph('In the beginning'); + const movedTo = document.createElement('p'); + movedTo.textContent = 'elsewhere'; + container.appendChild(movedTo); + // A stale stub: still returns this rect after the move below, so the test only passes because + // isRangeIntact() is checked BEFORE this stub is ever consulted — not because the stub happens + // to reflect the move. + stubClientRects(range, [new DOMRect(30, 60, 120, 18)]); + + const source = createPendingCommentAnchorSource(range, 'pending-comment', container); + + // The editor re-rendered and moved the range to a different node before the mark appeared. + range.selectNodeContents(movedTo); + expect(range.startContainer).not.toBe(paragraph); + + expect(source.measure()).toBeUndefined(); + }); + + it('mark present: follows the union of its fragments at the fraction from where the caret was', () => { + const { container, range } = addParagraph('In the beginning'); + // The caret sat at x=90 when the popover opened, before the mark existed. + stubClientRects(range, [new DOMRect(90, 105, 30, 20)]); + + const source = createPendingCommentAnchorSource(range, 'abc', container); + + // The editor re-rendered the selection into the pending-comment mark, splitting it into two + // fragments whose union is left=40, top=100, width=200, height=40. + addAnnotationFragment(container, 'abc', [new DOMRect(40, 100, 80, 20)]); + addAnnotationFragment(container, 'abc', [new DOMRect(120, 120, 120, 20)]); + + // fraction = (90 - 40) / 200 = 0.25; x = 40 + 0.25 * 200 = 90 (the caret's original x). + expect(rectNumbers(source.measure())).toEqual({ x: 90, y: 100, width: 0, height: 40 }); + }); + + it('a wrapped selection measured before its second fragment renders is not frozen against the partial width', () => { + const { container, range } = addParagraph('In the beginning'); + // The caret sat at x=90 when the popover opened, before the mark existed. + stubClientRects(range, [new DOMRect(90, 105, 30, 20)]); + + const source = createPendingCommentAnchorSource(range, 'abc', container); + + // The mark's first measurable frame renders only the first fragment of the wrapped selection — + // the second line has not painted yet. + addAnnotationFragment(container, 'abc', [new DOMRect(40, 100, 80, 20)]); + source.measure(); + + // The second fragment paints on a later frame, completing the union used by the earlier + // "follows the union ... at the fraction from where the caret was" test: left=40, top=100, + // width=200, height=40. + addAnnotationFragment(container, 'abc', [new DOMRect(120, 120, 120, 20)]); + + // fraction = (90 - 40) / 200 = 0.25; x = 40 + 0.25 * 200 = 90 (the caret's original x). A + // fraction taken against the first fragment alone (width 80) and then reused against the full + // union would instead land at x = 165. + expect(rectNumbers(source.measure())).toEqual({ x: 90, y: 100, width: 0, height: 40 }); + }); +}); + +describe('createNoteAnchorSource', () => { + afterEach(() => { + document.body.innerHTML = ''; + }); + + it('measures the passed-in element directly when it is still connected', () => { + const container = addEditorContainer(); + const caller = document.createElement('span'); + container.append(caller); + stubClientRects(caller, [new DOMRect(30, 60, 12, 18)]); + const getElementByKey = vi.fn(); + + const source = createNoteAnchorSource(caller, 'note-1', getElementByKey); + + // leftEdgeRect: zero-width, full-height, pinned to the left edge. + expect(rectNumbers(source.measure())).toEqual({ x: 30, y: 60, width: 0, height: 18 }); + expect(getElementByKey).not.toHaveBeenCalled(); + }); + + it('returns undefined when the connected element has no layout', () => { + const container = addEditorContainer(); + const caller = document.createElement('span'); + container.append(caller); + stubClientRects(caller, []); + + const source = createNoteAnchorSource(caller, 'note-1', vi.fn()); + + expect(source.measure()).toBeUndefined(); + }); + + it('falls back to the key lookup once the passed-in element is detached', () => { + const caller = document.createElement('span'); // never appended -> not connected + const replacement = document.createElement('span'); + document.body.append(replacement); + stubClientRects(replacement, [new DOMRect(15, 45, 10, 20)]); + const getElementByKey = vi.fn().mockReturnValue(replacement); + + const source = createNoteAnchorSource(caller, 'note-1', getElementByKey); + + expect(rectNumbers(source.measure())).toEqual({ x: 15, y: 45, width: 0, height: 20 }); + expect(getElementByKey).toHaveBeenCalledWith('note-1'); + }); + + it('returns undefined when detached and the key lookup finds nothing', () => { + const caller = document.createElement('span'); // never appended -> not connected + + const source = createNoteAnchorSource(caller, 'note-1', vi.fn().mockReturnValue(undefined)); + + expect(source.measure()).toBeUndefined(); + }); + + it('returns undefined when detached and the looked-up element has no layout', () => { + const caller = document.createElement('span'); // never appended -> not connected + const replacement = document.createElement('span'); + document.body.append(replacement); + stubClientRects(replacement, []); + + const source = createNoteAnchorSource(caller, 'note-1', vi.fn().mockReturnValue(replacement)); + + expect(source.measure()).toBeUndefined(); + }); + + it("reports the nearest '.editor-input' ancestor as the context element", () => { + const editorInput = document.createElement('div'); + editorInput.className = 'editor-input'; + document.body.append(editorInput); + const caller = document.createElement('span'); + editorInput.append(caller); + + const source = createNoteAnchorSource(caller, 'note-1', vi.fn()); + + expect(source.contextElement).toBe(editorInput); + }); + + it('reports the element itself as the context element when no editor-input ancestor exists', () => { + const caller = document.createElement('span'); + document.body.append(caller); + + const source = createNoteAnchorSource(caller, 'note-1', vi.fn()); + + expect(source.contextElement).toBe(caller); + }); +}); + +describe('createPendingCommentCenterAnchorSource', () => { + afterEach(() => { + document.body.innerHTML = ''; + }); + + it('returns undefined when the editor container has no layout', () => { + const container = addEditorContainer(); + stubClientRects(container, []); + + const source = createPendingCommentCenterAnchorSource(container); + + expect(source.measure()).toBeUndefined(); + }); + + it("returns a zero-size rect at the container's centre when it has layout", () => { + const container = addEditorContainer(); + stubClientRects(container, [new DOMRect(100, 200, 300, 400)]); + + const source = createPendingCommentCenterAnchorSource(container); + + // centre x = 100 + 300/2 = 250; centre y = 200 + 400/2 = 400; zero size. + expect(rectNumbers(source.measure())).toEqual({ x: 250, y: 400, width: 0, height: 0 }); + expect(source.contextElement).toBe(container); + }); +}); diff --git a/extensions/src/platform-scripture-editor/src/editor-dom.util.ts b/extensions/src/platform-scripture-editor/src/editor-dom.util.ts index 105e7322d7b..dd2d4c2ce9d 100644 --- a/extensions/src/platform-scripture-editor/src/editor-dom.util.ts +++ b/extensions/src/platform-scripture-editor/src/editor-dom.util.ts @@ -1,6 +1,12 @@ import { logger } from '@papi/frontend'; import { SerializedVerseRef } from '@sillsdev/scripture'; import { Unsubscriber } from 'platform-bible-utils'; +import { + leftEdgeRect, + LivePopoverAnchorSource, + measureElement, + measureRange, +} from 'platform-bible-react'; /** The offset in pixels from the top of the window to scroll to show the verse number */ const VERSE_NUMBER_SCROLL_OFFSET = 80; @@ -541,6 +547,190 @@ export function scrollToRange(range: Range, behavior: ScrollBehavior): boolean { return true; } +/** + * The selector for every element of the annotation with the given ID within the editor content. + * Annotation/comment ids can contain CSS metacharacters (":", ".", etc.); escaping the whole class + * token via CSS.escape keeps the selector valid (same approach as selectorForAnnotationIds in + * platform-enhanced-resources' scripture-pane.component.tsx). + */ +function annotationSelector(id: string): string { + return `.editor-container .${CSS.escape(`annotationId-${id}`)}`; +} + +/** + * Finds the (first) element of the annotation with the given ID within the editor content. + * + * @param id The ID of the annotation to find + * @returns The DOM element of the annotation if found; otherwise undefined + */ +function getAnnotationElement(id: string): HTMLElement | undefined { + return document.querySelector(annotationSelector(id)) ?? undefined; +} + +/** + * The viewport rect around every rendered fragment of the annotation with the given ID. An + * annotation over wrapped or partly formatted text renders as several elements, each with one or + * more line boxes. + * + * @param id The ID of the annotation to measure + * @returns The union of the fragments' client rects, or undefined when nothing is rendered + */ +export function measureAnnotation(id: string): DOMRect | undefined { + const rects = Array.from(document.querySelectorAll(annotationSelector(id))).flatMap((element) => + Array.from(element.getClientRects()), + ); + const [first, ...rest] = rects; + if (!first) return undefined; + const bounds = rest.reduce( + (accumulator, rect) => ({ + left: Math.min(accumulator.left, rect.left), + top: Math.min(accumulator.top, rect.top), + right: Math.max(accumulator.right, rect.right), + bottom: Math.max(accumulator.bottom, rect.bottom), + }), + { left: first.left, top: first.top, right: first.right, bottom: first.bottom }, + ); + return new DOMRect( + bounds.left, + bounds.top, + bounds.right - bounds.left, + bounds.bottom - bounds.top, + ); +} + +/** + * Builds the anchor source for the pending-comment popover, in the shape `useLivePopoverAnchor`'s + * `setSource` takes. The editor re-renders the selected text to mark it as the pending comment, + * which moves `range` to the start of its text node (or detaches it), so this follows two phases: + * until the mark exists, it follows `range` itself, bailing out once the range no longer matches + * what it was when the popover opened; once the mark exists, it follows the union of the mark's + * rendered fragments, at the horizontal fraction along the mark's width where the caret sat when + * the popover opened. Anchoring on a fraction of the mark's width, rather than a fixed pixel + * offset, keeps the anchor at the caret's original position through a zoom change. + * + * @param range The DOM range the selection had when the popover opened. The caller clones it from + * the live selection first, since a live selection range keeps moving as the user reads or + * edits. + * @param annotationId The id of the annotation the editor renders for the pending comment. + * @param contextElement Element to report as `contextElement`; passed straight through. + * @returns The anchor source for `useLivePopoverAnchor().setSource`. + */ +export function createPendingCommentAnchorSource( + range: Range, + annotationId: string, + contextElement: Element, +): LivePopoverAnchorSource { + const rangeRectAtOpen = measureRange(range); + const { startContainer, startOffset, endContainer, endOffset } = range; + const isRangeIntact = () => + startContainer.isConnected && + range.startContainer === startContainer && + range.startOffset === startOffset && + range.endContainer === endContainer && + range.endOffset === endOffset; + + const computeFraction = (annotationRect: DOMRect): number => + rangeRectAtOpen && annotationRect.width > 0 + ? Math.min( + Math.max((rangeRectAtOpen.left - annotationRect.left) / annotationRect.width, 0), + 1, + ) + : 0; + + let fractionInAnnotation: number | undefined; + let previousAnnotationRect: DOMRect | undefined; + return { + measure: () => { + const annotationRect = measureAnnotation(annotationId); + if (!annotationRect) { + // Between the re-render and the mark appearing, a moved range would place the popover at + // the start of the text node; keep the last good rect instead. + if (!isRangeIntact()) return undefined; + const rangeRect = measureRange(range); + return rangeRect && leftEdgeRect(rangeRect); + } + if (fractionInAnnotation === undefined) { + // A selection that wraps can render only its first fragment on the frame the mark first + // becomes measurable — the rest of the union paints on a later frame. Freezing the fraction + // against that partial width would misplace the popover for as long as it stays open, so + // wait for two consecutive frames to report the same rect (the same stability check + // `isSameScrollGeometry` uses for scroll geometry) before trusting it enough to freeze. + // Until then, recompute the fraction from the current (possibly still-growing) rect on + // every frame instead of caching a partial one. + const isSettled = + previousAnnotationRect !== undefined && + isSameScrollGeometry(previousAnnotationRect.left, annotationRect.left) && + isSameScrollGeometry(previousAnnotationRect.width, annotationRect.width); + if (isSettled) fractionInAnnotation = computeFraction(annotationRect); + else previousAnnotationRect = annotationRect; + } + const fraction = fractionInAnnotation ?? computeFraction(annotationRect); + return new DOMRect( + annotationRect.left + fraction * annotationRect.width, + annotationRect.top, + 0, + annotationRect.height, + ); + }, + contextElement, + }; +} + +/** + * Builds the anchor source for the footnote/cross-reference editor popover, in the shape + * `useLivePopoverAnchor`'s `setSource` takes. Anchors on the note caller's left edge, spanning its + * height, so the popover shows below (or above) the caller's line. + * + * The caller element the click handler captured can go missing from under it — the editor + * re-renders note callers as notes are added, moved or removed elsewhere in the chapter — so this + * re-resolves by key through `getElementByKey` once the captured element is no longer connected, on + * every measurement rather than once, so the anchor keeps following the note across any number of + * re-renders while the popover stays open. + * + * @param element The note caller element as it was when the popover opened. + * @param noteKey The editor's node key for the note, used to re-resolve `element` once it detaches. + * @param getElementByKey Resolves a node key to its current rendered element, or `undefined` if the + * note no longer exists in the document. Passed as a callback rather than an editor reference so + * this module stays free of the editor's own types. + * @returns The anchor source for `useLivePopoverAnchor().setSource`. + */ +export function createNoteAnchorSource( + element: Element, + noteKey: string, + getElementByKey: (nodeKey: string) => HTMLElement | undefined, +): LivePopoverAnchorSource { + return { + measure: () => { + const target = element.isConnected ? element : getElementByKey(noteKey); + if (!target) return undefined; + const rect = measureElement(target); + return rect && leftEdgeRect(rect); + }, + contextElement: element.closest('.editor-input') ?? element, + }; +} + +/** + * Builds the fallback anchor source for the pending-comment popover, used when there is no live DOM + * selection to anchor {@link createPendingCommentAnchorSource} to — the popover then centers on the + * editor's own viewport instead of tracking any particular text. + * + * @param editorContainer The `.usfm` element the popover should center over. + * @returns The anchor source for `useLivePopoverAnchor().setSource`. + */ +export function createPendingCommentCenterAnchorSource( + editorContainer: Element, +): LivePopoverAnchorSource { + return { + measure: () => { + const rect = measureElement(editorContainer); + if (!rect) return undefined; + return new DOMRect(rect.left + rect.width / 2, rect.top + rect.height / 2, 0, 0); + }, + contextElement: editorContainer, + }; +} + /** * Scrolls to the annotation with the given ID within the editor content. * @@ -548,13 +738,7 @@ export function scrollToRange(range: Range, behavior: ScrollBehavior): boolean { * @returns The DOM element of the annotation if found; otherwise undefined */ export function scrollToAnnotation(id: string): HTMLElement | undefined { - // annotation/comment ids can contain CSS metacharacters (":", ".", etc.); escaping the whole - // class token via CSS.escape keeps the selector valid (same approach as selectorForAnnotationIds - // in platform-enhanced-resources' scripture-pane.component.tsx). - const escapedAnnotationClass = CSS.escape(`annotationId-${id}`); - const annotationElement = - document.querySelector(`.editor-container .${escapedAnnotationClass}`) ?? - undefined; + const annotationElement = getAnnotationElement(id); const scrollContainerElement = annotationElement ? findScrollContainer(annotationElement) diff --git a/extensions/src/platform-scripture-editor/src/insert-comment-anchor-guard.contract.test.ts b/extensions/src/platform-scripture-editor/src/insert-comment-anchor-guard.contract.test.ts new file mode 100644 index 00000000000..d01928198c4 --- /dev/null +++ b/extensions/src/platform-scripture-editor/src/insert-comment-anchor-guard.contract.test.ts @@ -0,0 +1,76 @@ +import { readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { describe, expect, it } from 'vitest'; + +/* + * Guards `insertCommentAtCurrentSelection` in `platform-scripture-editor.web-view.tsx` against + * opening the comment-editor popover with nothing to anchor it to. The file is a 3 900+-line web + * view that cannot be mounted in jsdom (it depends on the editor iframe, PAPI services, and a + * reverse portal — see `content-zoom-markers.contract.test.ts`), so this is a source-reading + * contract test rather than a render test, the same shape as `editor-character-marker-contract.test.ts`. + * + * `insertCommentAtCurrentSelection` looks up `.usfm` to anchor the popover; when the book has no + * rendered content (no `.usfm` element) there is nothing to anchor to, and opening the popover + * anyway pins it at the pane's origin or a stale previous anchor. The guard must return before the + * popover opens, not merely before the anchor is computed. + */ + +const SRC_DIR = path.dirname(fileURLToPath(import.meta.url)); +const WEB_VIEW_FILE = path.join(SRC_DIR, 'platform-scripture-editor.web-view.tsx'); + +/** Whitespace-insensitive haystack, so formatting alone can't fail this. */ +function collapseWhitespace(text: string): string { + return text.replace(/\s+/g, ' '); +} + +describe('insertCommentAtCurrentSelection anchor guard (platform-scripture-editor.web-view.tsx)', () => { + const source = collapseWhitespace(readFileSync(WEB_VIEW_FILE, 'utf-8')); + + // The dependency array is matched generically (not re-baked verbatim) so an unrelated dependency + // change doesn't turn every assertion below into a "callback not found" failure. + const callbackMatch = source.match( + /const insertCommentAtCurrentSelection = useCallback\(\(\) => \{(.*?)\}, \[[^[\]]*\]\);/, + ); + if (!callbackMatch) throw new Error('insertCommentAtCurrentSelection callback not found'); + const [, callbackBody] = callbackMatch; + + it('returns before opening the popover when there is no `.usfm` element to anchor to', () => { + const guardIndex = callbackBody.indexOf('if (!editorContainer) return;'); + const openIndex = callbackBody.indexOf('setShowCommentEditor(true);'); + + expect(guardIndex).toBeGreaterThan(-1); + expect(openIndex).toBeGreaterThan(-1); + // The guard must precede the open call, not just the anchor computation, so a missing `.usfm` + // element skips setShowCommentEditor entirely instead of opening at a stale or origin anchor. + expect(guardIndex).toBeLessThan(openIndex); + }); + + it("derives the guard from the same '.usfm' lookup the anchor itself uses", () => { + const queryIndex = callbackBody.indexOf( + "const editorContainer = document.querySelector('.usfm');", + ); + const guardIndex = callbackBody.indexOf('if (!editorContainer) return;'); + + expect(queryIndex).toBeGreaterThan(-1); + expect(guardIndex).toBeGreaterThan(queryIndex); + }); + + it('returns before recording the pending comment range or setting the highlight annotation, not just before opening the popover', () => { + const guardIndex = callbackBody.indexOf('if (!editorContainer) return;'); + const pendingRangeAssignIndex = callbackBody.indexOf( + 'pendingCommentAnnotationRange.current = { range: annotationRange, verseRef: scrRef };', + ); + const setAnnotationIndex = callbackBody.indexOf('editorRef.current?.setAnnotation('); + + expect(guardIndex).toBeGreaterThan(-1); + expect(pendingRangeAssignIndex).toBeGreaterThan(-1); + expect(setAnnotationIndex).toBeGreaterThan(-1); + // A missing `.usfm` element must bail out before either side effect: recording the pending + // range and setting the highlight annotation. Otherwise both survive with no popover ever + // opened to reach the only code that clears them (the cancel/save handlers), so the highlight + // is stranded in the text and the stale range is what the next successful save would use. + expect(guardIndex).toBeLessThan(pendingRangeAssignIndex); + expect(guardIndex).toBeLessThan(setAnnotationIndex); + }); +}); diff --git a/extensions/src/platform-scripture-editor/src/platform-scripture-editor.web-view.tsx b/extensions/src/platform-scripture-editor/src/platform-scripture-editor.web-view.tsx index df54d16f5ac..1a4eb5c29b6 100644 --- a/extensions/src/platform-scripture-editor/src/platform-scripture-editor.web-view.tsx +++ b/extensions/src/platform-scripture-editor/src/platform-scripture-editor.web-view.tsx @@ -50,14 +50,17 @@ import { Button, COMMENT_EDITOR_STRING_KEYS, CommentEditor, + ContentZoomAreaProvider, ContentZoomRoot, EditorKeyboardShortcuts, FOOTNOTE_EDITOR_STRING_KEYS, FootnoteEditor, type FootnoteEditorMarkerPalette, + leftEdgeRect, MarkdownRenderer, MARKER_MENU_STRING_KEYS, MarkerMenu, + measureRange, Popover, PopoverAnchor, PopoverContent, @@ -68,6 +71,7 @@ import { UNDO_REDO_BUTTONS_STRING_KEYS, UndoRedoButtons, isMacOs, + useLivePopoverAnchor, usePromise, useViewVisibility, } from 'platform-bible-react'; @@ -133,6 +137,9 @@ import { removeDecorations, } from './decorations.util'; import { + createNoteAnchorSource, + createPendingCommentAnchorSource, + createPendingCommentCenterAnchorSource, getVerseElement, runOnFirstLoad, scrollToAnnotation, @@ -283,6 +290,18 @@ const ANNOTATION_TYPE_TRANSLATOR_COMMENT = 'translator-comment'; /** Annotation ID used for a pending comment that hasn't been saved yet */ const PENDING_COMMENT_ANNOTATION_ID = 'pending-comment'; +/** + * The footnote editor popover's minimum width: 500 px, yielding to the zoomed width cap (the pane's + * available width divided by the zoom factor) so a zoomed popover still fits a narrow pane. Until + * Radix has published the available width, the viewport width stands in for it: the footnote editor + * locks its own width on its first layout, which happens before that. + * + * Set inline rather than as a Tailwind arbitrary class: the web view's SCSS + PostCSS pipeline + * drops a rule whose value is this `min()` expression, so the minimum is an inline style. + */ +const FOOTNOTE_POPOVER_MIN_WIDTH = + 'min(500px, calc(var(--radix-popover-content-available-width, 100vw) / var(--platform-content-zoom-popup-factor, 1)))'; + /** Prefix the editor puts on annotation type when calling the annotation's callbacks */ const EDITOR_ANNOTATION_TYPE_PREFIX = 'external-'; @@ -400,11 +419,9 @@ globalThis.webViewComponent = function PlatformScriptureEditor({ const [localizedStrings] = useLocalizedStrings(useMemo(() => EDITOR_LOCALIZED_STRINGS, [])); const [scrollGroupLocalizedStrings] = useLocalizedStrings(scrollGroupLocalizedStringKeys); - // These control the placement of the footnote editor popover by setting the location of the anchor + // The footnote editor popover and the live anchor it is placed against const [showFootnoteEditor, setShowFootnoteEditor] = useState(false); - const [notePopoverAnchorX, setNotePopoverAnchorX] = useState(); - const [notePopoverAnchorY, setNotePopoverAnchorY] = useState(); - const [notePopoverAnchorHeight, setNotePopoverAnchorHeight] = useState(); + const notePopoverAnchor = useLivePopoverAnchor(); /** * Mirror of {@link showFootnoteEditor} readable from the stable `noteCallerOnClick` closure: an @@ -432,19 +449,15 @@ globalThis.webViewComponent = function PlatformScriptureEditor({ */ const editingNoteSessionRefreshedAt = useRef(undefined); - // These control the placement of the comment editor popover by setting the location of the anchor + // The comment editor popover and the live anchor it is placed against const [showCommentEditor, setShowCommentEditor] = useState(false); /** Remembers the last assignee chosen so the next new comment pre-selects the same user */ const [lastAssignedUser, setLastAssignedUser] = useState(); - const [commentPopoverAnchorX, setCommentPopoverAnchorX] = useState(); - const [commentPopoverAnchorY, setCommentPopoverAnchorY] = useState(); - const [commentPopoverAnchorHeight, setCommentPopoverAnchorHeight] = useState(); + const commentPopoverAnchor = useLivePopoverAnchor(); - // These control the placement of the inline markers menu by setting the location of the anchor + // The inline markers menu and the live anchor it is placed against const [showMarkersMenu, setShowMarkersMenu] = useState(false); - const [markersMenuAnchorX, setMarkersMenuAnchorX] = useState(); - const [markersMenuAnchorY, setMarkersMenuAnchorY] = useState(); - const [markersMenuAnchorHeight, setMarkersMenuAnchorHeight] = useState(); + const markersMenuAnchor = useLivePopoverAnchor(); // The refs needs to start out with null for it to work as a element ref // eslint-disable-next-line no-null/no-null @@ -1050,6 +1063,21 @@ globalThis.webViewComponent = function PlatformScriptureEditor({ ], ); + /** + * Places the footnote editor popover against a note's caller (or the note itself). The caller + * element is measured live; if the editor re-renders it away, the note is looked up again by key. + * The anchor spans the element's height with no width, so the popover shows below the caller's + * line. + */ + const setNoteAnchorSource = useCallback( + (element: Element, noteKey: string) => { + notePopoverAnchor.setSource( + createNoteAnchorSource(element, noteKey, (key) => editorRef.current?.getElementByKey(key)), + ); + }, + [notePopoverAnchor], + ); + const nodeOptions = useMemo( () => ({ chapterVerseSeparator, @@ -1125,10 +1153,7 @@ globalThis.webViewComponent = function PlatformScriptureEditor({ return; } - const targetRect = event.currentTarget.getBoundingClientRect(); - setNotePopoverAnchorX(targetRect.left); - setNotePopoverAnchorY(targetRect.top); - setNotePopoverAnchorHeight(targetRect.height); + setNoteAnchorSource(event.currentTarget, noteNodeKey); editingNoteKey.current = noteNodeKey; editingNoteOps.current = [noteOp]; editingNoteSessionRefreshedAt.current = Date.now(); @@ -1146,6 +1171,7 @@ globalThis.webViewComponent = function PlatformScriptureEditor({ footnoteCallers, crossRefCallers, setFootnotesPaneVisible, + setNoteAnchorSource, ], ); @@ -1498,6 +1524,14 @@ globalThis.webViewComponent = function PlatformScriptureEditor({ } } + // Try to find the selected text element to anchor the popover to. No rendered editor content + // means there is nothing to anchor to — bail out before recording the pending range or setting + // the highlight annotation below, not just before opening the popover: either one left behind + // with no popover open to clear it would strand a highlight in the text with no way to remove + // it, and would misdirect the next comment actually saved to this stale range. + const editorContainer = document.querySelector('.usfm'); + if (!editorContainer) return; + pendingCommentAnnotationRange.current = { range: annotationRange, verseRef: scrRef }; // Create a temporary annotation to highlight the selected text @@ -1507,29 +1541,21 @@ globalThis.webViewComponent = function PlatformScriptureEditor({ PENDING_COMMENT_ANNOTATION_ID, ); - // Position the popover near the annotation - // Try to find the selected text element for positioning - const editorContainer = document.querySelector('.usfm'); - if (editorContainer) { - // Use the browser's selection to get the bounding rect of the selected text - const domSelection = window.getSelection(); - if (domSelection && domSelection.rangeCount > 0) { - const range = domSelection.getRangeAt(0); - const rect = range.getBoundingClientRect(); - setCommentPopoverAnchorX(rect.left); - setCommentPopoverAnchorY(rect.bottom); - setCommentPopoverAnchorHeight(0); - } else { - // Fallback to center of editor viewport - const rect = editorContainer.getBoundingClientRect(); - setCommentPopoverAnchorX(rect.left + rect.width / 2); - setCommentPopoverAnchorY(rect.top + rect.height / 2); - setCommentPopoverAnchorHeight(0); - } + // Position the popover near the annotation. Use the browser's selection to get the bounding + // rect of the selected text + const domSelection = window.getSelection(); + if (domSelection && domSelection.rangeCount > 0) { + const range = domSelection.getRangeAt(0).cloneRange(); + commentPopoverAnchor.setSource( + createPendingCommentAnchorSource(range, PENDING_COMMENT_ANNOTATION_ID, editorContainer), + ); + } else { + // Fallback to center of editor viewport + commentPopoverAnchor.setSource(createPendingCommentCenterAnchorSource(editorContainer)); } setShowCommentEditor(true); - }, [scrRef, canUserCreateComments, isSyncBlocked, notifySyncEditBlocked]); + }, [scrRef, canUserCreateComments, isSyncBlocked, notifySyncEditBlocked, commentPopoverAnchor]); /** * Inserts a footnote at the current selection. Shared by the "Insert footnote" context-menu item, @@ -1902,13 +1928,25 @@ globalThis.webViewComponent = function PlatformScriptureEditor({ // existing marker menu items to be shown const currentSelection = window.getSelection(); if (inlineMarkerMenuItems.length && currentSelection && currentSelection.rangeCount > 0) { - const selectionRect = currentSelection.getRangeAt(0).getBoundingClientRect(); - setMarkersMenuAnchorX(selectionRect.left); - setMarkersMenuAnchorY(selectionRect.top); - setMarkersMenuAnchorHeight(selectionRect.height); + const range = currentSelection.getRangeAt(0).cloneRange(); + const rangeElement = + range.startContainer instanceof Element + ? range.startContainer + : range.startContainer.parentElement; + const contextElement = rangeElement?.closest('.editor-input') ?? rangeElement; + // A selection outside any element has nothing to anchor to; opening anyway would place the + // menu against a previous selection. + if (!contextElement) return; + markersMenuAnchor.setSource({ + measure: () => { + const rect = measureRange(range); + return rect && leftEdgeRect(rect); + }, + contextElement, + }); setShowMarkersMenu(true); } - }, [inlineMarkerMenuItems]); + }, [inlineMarkerMenuItems, markersMenuAnchor]); // Need to add a window listener for click events that will close the markers menu when you click // outside. There is another `onClick` listener for the marker menu that prevents click events @@ -2918,30 +2956,30 @@ globalThis.webViewComponent = function PlatformScriptureEditor({ editingNoteSessionRefreshedAt.current = Date.now(); }, []); - const openFootnoteEditorOnNewNote = useCallback((ops?: DeltaOp[], insertedNodeKey?: string) => { - if (insertedNodeKey && ops) { - // If we are already editing a note, then returns - if (editingNoteKey.current) return; - - // Makes sure the node is a note - const noteOp = ops[1]; - if (!isInsertEmbedOpOfType('note', noteOp)) return; - - const noteElement = editorRef.current?.getElementByKey(insertedNodeKey); - // Note element must be defined - if (!noteElement) return; - - const targetRect = noteElement.getBoundingClientRect(); - setNotePopoverAnchorX(targetRect.left); - setNotePopoverAnchorY(targetRect.top); - setNotePopoverAnchorHeight(targetRect.height); - editingNoteKey.current = insertedNodeKey; - editingNoteOps.current = [noteOp]; - editingNoteSessionRefreshedAt.current = Date.now(); - editingNoteIsNew.current = true; - setShowFootnoteEditor(true); - } - }, []); + const openFootnoteEditorOnNewNote = useCallback( + (ops?: DeltaOp[], insertedNodeKey?: string) => { + if (insertedNodeKey && ops) { + // If we are already editing a note, then returns + if (editingNoteKey.current) return; + + // Makes sure the node is a note + const noteOp = ops[1]; + if (!isInsertEmbedOpOfType('note', noteOp)) return; + + const noteElement = editorRef.current?.getElementByKey(insertedNodeKey); + // Note element must be defined + if (!noteElement) return; + + setNoteAnchorSource(noteElement, insertedNodeKey); + editingNoteKey.current = insertedNodeKey; + editingNoteOps.current = [noteOp]; + editingNoteSessionRefreshedAt.current = Date.now(); + editingNoteIsNew.current = true; + setShowFootnoteEditor(true); + } + }, + [setNoteAnchorSource], + ); // #region Debounced Save Scheduling @@ -3949,51 +3987,35 @@ globalThis.webViewComponent = function PlatformScriptureEditor({
, )} - {/** Inline markers menu components */} - - - { - event.preventDefault(); - event.stopPropagation(); - }} - > - - - - {/** Footnote editor components */} - - - - {/* This popover is portaled to document.body, a separate subtree from the text area, so - this second `main`-area marker is not nested under the editor's: a note edited in - place follows the text's zoom level. */} - + {/* The popovers below are rendered beside the editor and anchored to live positions in its + text (see useLivePopoverAnchor), so they belong to the text's zoom area, scale with it, + and follow the text when it scrolls or reflows. */} + + {/** Inline markers menu components */} + + + { + event.preventDefault(); + event.stopPropagation(); + }} + > + + + + {/** Footnote editor components */} + + + - - - - {/** Comment editor for creating new comment threads */} - - - - - - + + + {/** Comment editor for creating new comment threads */} + + + {/* `always`: re-measured every frame while open. Marking the selection as the pending + comment re-renders the text under the anchor without any scroll, resize or layout + shift that would otherwise trigger a re-measure. */} + + + + + ); }; diff --git a/lib/papi-dts/papi.d.ts b/lib/papi-dts/papi.d.ts index bcc5287bb96..a15f645036e 100644 --- a/lib/papi-dts/papi.d.ts +++ b/lib/papi-dts/papi.d.ts @@ -662,6 +662,13 @@ declare module 'shared/models/web-view.model' { * id to factor. An area with no entry follows the default from Settings. Written only by the * platform; web views may read it. * + * A web view whose `getWebViewDefinition` rebuilds its own definition on re-point (a + * `reloadWebView` pointed at another project through the same web view id) must carry its saved + * `state` through wholesale, by spreading it rather than copying only the keys the view itself + * uses: the platform stores a companion identity stamp next to this key, and a view that drops the + * stamp while keeping the levels has the platform silently re-attribute the previous project's + * level to the new one, rather than losing it. + * * Extension code cannot import this value at runtime — `@papi/core` is types-only — so a web view * that reads this state key writes the literal `'platform.contentZoomLevels'` itself and keeps it * equal to this constant. @@ -688,6 +695,21 @@ declare module 'shared/models/web-view.model' { * @experimental This constant is unstable and may change or disappear without notice */ export const CONTENT_ZOOM_ROOT_ATTRIBUTE = 'data-platform-content-zoom-root'; + /** + * Attribute that marks an element carrying {@link CONTENT_ZOOM_ROOT_ATTRIBUTE} as pop-up content + * opened from that zoom area (a popover, menu or tooltip portaled out of the area element) rather + * than a pane. The platform scales such an element with its area but never reports it as an area of + * its own and never places the zoom indicator on it. `platform-bible-react`'s `PopoverContent`, + * `DropdownMenuContent` and `TooltipContent` set it automatically; `SelectContent`, + * `ContextMenuContent`, `MenubarContent` and `DropdownMenuSubContent` do not yet. + * + * Extension code cannot import this value at runtime — `@papi/core` is types-only — so a web view + * that marks its own pop-up content writes the literal `'data-platform-content-zoom-popup'` itself + * and keeps it equal to this constant. + * + * @experimental This constant is unstable and may change or disappear without notice + */ + export const CONTENT_ZOOM_POPUP_ATTRIBUTE = 'data-platform-content-zoom-popup'; /** * Prefix of the CSS custom properties the platform sets on every web view's root element, one per * zoom area, with that area's effective factor (own level, else the Settings default): diff --git a/lib/platform-bible-react/dist/experimental.cjs b/lib/platform-bible-react/dist/experimental.cjs index 0b513b56583..8740b39b935 100644 --- a/lib/platform-bible-react/dist/experimental.cjs +++ b/lib/platform-bible-react/dist/experimental.cjs @@ -1,4 +1,4 @@ -"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("./resizable-DLulvBZt.cjs"),t=require("react/jsx-runtime"),ot=require("platform-bible-utils"),I=require("lucide-react"),d=require("react");function dt(r,e=50){const[o,w]=d.useState(e),s=d.useRef(null);return d.useEffect(()=>{w(e)},[r,e]),d.useEffect(()=>{if(o>=r.length)return;const i=s.current,c=new IntersectionObserver(([_])=>{_.isIntersecting&&w(z=>Math.min(z+e,r.length))},{threshold:0});return i&&c.observe(i),()=>c.disconnect()},[o,r.length,e]),{visibleItems:r.slice(0,o),sentinelRef:s,hasMore:or[e]??e;function tt({label:r,resources:e,onSelect:o,showCheckmark:w}){if(e.length!==0)return t.jsxs(t.Fragment,{children:[t.jsx(a.TableRow,{className:"tw:border-0 tw:hover:bg-transparent",children:t.jsx(a.TableCell,{colSpan:4,className:"tw:border-0 tw:pt-4 tw:pb-0",children:t.jsx(a.Label,{className:"tw:text-xs tw:tracking-wider tw:text-muted-foreground tw:uppercase",children:r})})}),e.map(s=>t.jsxs(a.TableRow,{className:o?"tw:cursor-pointer tw:border-0":"tw:pointer-events-none tw:border-0",role:o?"button":void 0,"aria-label":o?s.displayName:void 0,onClick:o?()=>o(s):void 0,onKeyDown:o?i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),o(s))}:void 0,children:[t.jsx(a.TableCell,{className:"tw:border-0 tw:px-1 tw:py-1",children:w&&t.jsxs(t.Fragment,{children:[t.jsx(I.Check,{className:"tw:h-3.5 tw:w-3.5","aria-hidden":!0}),t.jsx("span",{className:"tw:sr-only",children:r})]})}),t.jsx(a.TableCell,{className:"tw:max-w-0 tw:truncate tw:border-0 tw:py-1 tw:pe-2 tw:text-start tw:font-normal",children:t.jsx("span",{title:s.displayName,children:s.displayName})}),t.jsx(a.TableCell,{className:"tw:max-w-0 tw:truncate tw:border-0 tw:py-1 tw:ps-2",children:t.jsx("span",{title:s.fullName,children:s.fullName})}),t.jsx(a.TableCell,{className:"tw:max-w-0 tw:truncate tw:border-0 tw:py-1 tw:ps-4 tw:text-end tw:text-muted-foreground",children:t.jsx("span",{title:s.bestLanguageName,children:s.bestLanguageName})})]},s.dblEntryUid))]})}function it(r){return r.isResourcesLoading?"loading":r.hasNoResults?r.canClearFiltersHelp?"filteredEmpty":r.hasResourcesError?"error":r.areDownloadsUnavailable?"downloadsUnavailable":"empty":"list"}function gt(r,e){if(!e)return!0;const o=e.toLowerCase();return r.displayName.toLowerCase().includes(o)||r.fullName.toLowerCase().includes(o)||r.bestLanguageName.toLowerCase().includes(o)}function ht({allResources:r,isResourcesLoading:e,hasResourcesError:o,onRetryResources:w,areDownloadsUnavailable:s,resourceType:i,selectedResourceIds:c,notice:_,allowSelectingInstalled:z=!0,localizedStrings:p,allowDeselect:M,onSelect:T,searchInputRef:k}){const[v,U]=d.useState(""),[b,D]=d.useState([]),j=d.useRef(null),y=k??j,L=d.useCallback(()=>{var l;U(""),D([]),(l=y.current)==null||l.focus()},[y]),x=d.useMemo(()=>r.filter(l=>!i||(Array.isArray(i)?i.includes(l.type):l.type===i)),[r,i]),f=d.useMemo(()=>x.filter(l=>gt(l,v)).filter(l=>b.length===0||b.includes(l.bestLanguageName)),[x,v,b]),S=d.useMemo(()=>f.filter(l=>c==null?void 0:c.includes(l.dblEntryUid)),[f,c]),R=d.useMemo(()=>f.filter(l=>l.installed&&!(c!=null&&c.includes(l.dblEntryUid))),[f,c]),P=d.useMemo(()=>f.filter(l=>!l.installed&&!(c!=null&&c.includes(l.dblEntryUid))),[f,c]),{visibleItems:q,sentinelRef:C,hasMore:O}=dt(P),E=d.useMemo(()=>Array.from(new Set(r.map(l=>l.bestLanguageName))).map(l=>({label:l,value:l})),[r]),n=S.length===0&&R.length===0&&P.length===0,h=m(p,"%resourcePicker_title%"),g=m(p,"%resourcePicker_description%"),Y=m(p,"%resourcePicker_search_placeholder%"),A=m(p,"%resourcePicker_language_filter_any%"),G=m(p,"%resourcePicker_section_already_selected%"),J=m(p,"%resourcePicker_section_installed%"),X=m(p,"%resourcePicker_section_available_to_download%"),K=m(p,"%resourcePicker_no_results%"),$=m(p,"%resourcePicker_load_error%"),Q=m(p,"%resourcePicker_retry%"),u=m(p,"%resourcePicker_no_results_filtered%"),V=m(p,"%resourcePicker_clear_filters%"),nt=m(p,"%resourcePicker_downloads_unavailable%"),st=m(p,"%resourcePicker_showing_count%"),W=b.length>0&&x.some(l=>!b.includes(l.bestLanguageName)),rt=v.length>0||W,ct=d.useMemo(()=>{if(!W)return A;if(b.length===1){const l=E.find(F=>F.value===b[0]);if(l)return l.label}return ot.formatReplacementString(m(p,"%resourcePicker_language_filter_multipleSelected%"),{selectCount:b.length})},[W,b,E,A,p]),lt=rt&&x.length>0,B=!!e||!!o||x.length===0,et=d.useRef(B);d.useEffect(()=>{const l=et.current&&!B;if(et.current=B,!l)return;const F=y.current;if(!F||F.disabled)return;const{activeElement:Z}=document;(!Z||Z===document.body||Z.getAttribute("data-slot")==="dialog-content")&&F.focus()},[B,y]);const N=it({isResourcesLoading:!!e,hasResourcesError:!!o,hasNoResults:n,canClearFiltersHelp:lt,areDownloadsUnavailable:!!s});return t.jsxs(t.Fragment,{children:[t.jsxs(a.DialogHeader,{className:"tw:px-4 tw:pt-4",children:[t.jsx(a.DialogTitle,{children:h}),t.jsx(a.DialogDescription,{className:"tw:sr-only",children:g})]}),t.jsxs("div",{className:"tw:flex tw:gap-2 tw:p-4",children:[t.jsx(a.SearchBar,{ref:y,value:v,onSearch:U,placeholder:Y,isFullWidth:!0,isDisabled:B}),t.jsx(a.MultiSelectComboBox,{entries:E,selected:b,onChange:D,customSelectedText:ct,placeholder:A,variant:"outline",isDisabled:B})]}),t.jsx("div",{role:"status",children:_&&t.jsx(a.Alert,{role:void 0,className:"tw:mx-4 tw:mb-2 tw:w-auto tw:bg-muted tw:text-muted-foreground",children:t.jsx(a.AlertDescription,{children:_})})}),rt&&(N==="list"||N==="filteredEmpty")&&t.jsx("p",{className:"tw:px-4 tw:pb-1 tw:text-end tw:text-xs tw:text-muted-foreground",children:ot.formatReplacementString(st,{filtered:f.length,total:x.length})}),t.jsxs("div",{className:"tw:min-h-0 tw:flex-1 tw:overflow-x-hidden tw:overflow-y-auto tw:px-4 tw:pb-4",children:[N==="loading"&&t.jsx("p",{className:"tw:py-8 tw:text-center",children:t.jsx(a.Spinner,{})}),N==="error"&&t.jsx(a.RetryableErrorView,{icon:t.jsx(I.CloudOff,{}),message:$,retryLabel:Q,onRetry:w}),N==="filteredEmpty"&&t.jsx(a.RetryableErrorView,{role:"status",icon:t.jsx(I.SearchX,{}),message:u,retryLabel:V,onRetry:L}),N==="downloadsUnavailable"&&t.jsx(a.RetryableErrorView,{role:"status",icon:t.jsx(I.CloudOff,{}),message:nt}),N==="empty"&&t.jsx(a.EmptyState,{className:"tw:py-8 tw:text-center",message:K}),N==="list"&&t.jsxs(a.Table,{className:"tw:table-fixed",children:[t.jsxs("colgroup",{children:[t.jsx("col",{className:"tw:w-7"}),t.jsx("col",{className:"tw:w-1/4"}),t.jsx("col",{}),t.jsx("col",{className:"tw:w-1/6"})]}),t.jsxs(a.TableBody,{children:[t.jsx(tt,{label:G,resources:S,onSelect:M?T:void 0,showCheckmark:!0}),t.jsx(tt,{label:J,resources:R,onSelect:z?T:void 0}),t.jsx(tt,{label:X,resources:q,onSelect:T}),O&&t.jsx(a.TableRow,{className:"tw:border-0",children:t.jsx(a.TableCell,{colSpan:4,className:"tw:border-0 tw:p-0",children:t.jsx("div",{ref:C,"aria-hidden":!0})})})]})]})]})]})}function ut({items:r,renderItem:e,renderDetailContent:o,onItemClick:w,selectedItemId:s,emptyStateMessage:i="No items found",detailRegionLabel:c="Selected item details",isLoading:_=!1,variant:z="text",showSourceLanguage:p=!1,showTransliteration:M=!1,onCharacterPress:T,className:k}){const[v,U]=d.useState(),b=d.useRef(null),D=s??v,j=d.useMemo(()=>v?r.find(n=>n.id===v):void 0,[v,r]),y=d.useMemo(()=>r.map(n=>({id:n.id})),[r]),L=n=>{w==null||w(n),o&&U(n.id===v?void 0:n.id)},x=n=>{const h=r.find(g=>g.id===n.id);h&&L(h)},{listboxRef:f,activeId:S,handleKeyDown:R,focusOption:P}=a.useListbox({options:y,onOptionSelect:x,onCharacterPress:T}),q=()=>{const n=v;U(void 0),n&&requestAnimationFrame(()=>{var h;P(n),(h=f.current)==null||h.focus()})},C=d.useRef(null);if(d.useEffect(()=>{if(!j)return;const n=C.current;if(!n)return;const h=g=>{g.key==="Escape"&&(g.preventDefault(),q())};return n.addEventListener("keydown",h),()=>n.removeEventListener("keydown",h)},[j]),_)return t.jsx("div",{className:a.cn("tw:flex tw:flex-col tw:gap-2 tw:p-2",k),children:Array.from({length:6},(n,h)=>t.jsx(a.Skeleton,{className:a.cn("tw:h-12 tw:w-full tw:rounded",{"tw:h-20":z==="thumbnail"})},h))});if(r.length===0)return t.jsx("div",{className:a.cn("tw:flex tw:items-center tw:justify-center tw:p-8 tw:text-sm tw:text-muted-foreground",k),children:i});const O=t.jsx("ul",{role:"listbox",tabIndex:0,ref:f,"aria-activedescendant":S??void 0,className:"tw:outline-none tw:focus:ring-2 tw:focus:ring-ring tw:focus:ring-offset-1 tw:focus:ring-offset-background",onKeyDown:R,children:r.map(n=>{const h=D===n.id;return t.jsx("li",{id:n.id,role:"option","aria-selected":h,tabIndex:-1,onClick:()=>L(n),onKeyDown:g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),L(n))},className:a.cn("tw:flex tw:cursor-pointer tw:items-center tw:gap-3 tw:p-2 tw:outline-none",{"tw:bg-muted":h,"tw:hover:bg-muted":!h}),children:e?e(n):t.jsx(vt,{item:n,variant:z,showSourceLanguage:p,showTransliteration:M})},n.id)})}),E=o&&j?o(j,q):void 0;return t.jsx("div",{ref:b,className:a.cn("tw:relative tw:flex tw:h-full tw:overflow-hidden",k),children:E?t.jsxs(a.ResizablePanelGroup,{direction:"horizontal",className:"tw:h-full tw:w-full",children:[t.jsx(a.ResizablePanel,{defaultSize:33.3333,minSize:20,children:t.jsx("div",{className:"tw:h-full tw:overflow-y-auto",children:O})}),t.jsx(a.ResizableHandle,{}),t.jsx(a.ResizablePanel,{defaultSize:66.6667,minSize:30,children:t.jsx("div",{ref:C,role:"region","aria-label":c,className:"tw:h-full tw:overflow-y-auto tw:bg-background tw:p-4",children:E})})]}):t.jsx("div",{className:"tw:h-full tw:w-full tw:overflow-y-auto",children:O})})}function vt({item:r,variant:e,showSourceLanguage:o,showTransliteration:w}){return t.jsxs(t.Fragment,{children:[e==="thumbnail"&&r.thumbnailUrl&&t.jsx("img",{src:r.thumbnailUrl,alt:r.thumbnailAlt??r.primaryText,className:"tw:h-14 tw:w-14 tw:shrink-0 tw:rounded tw:object-cover"}),t.jsxs("div",{className:"tw:flex tw:flex-1 tw:items-baseline tw:gap-4 tw:overflow-hidden",children:[t.jsx("span",{className:"tw:shrink-0 tw:truncate tw:text-sm",children:r.primaryText}),o&&r.sourceLanguageText&&t.jsxs("span",{className:"tw:truncate tw:text-sm tw:text-muted-foreground",children:[r.sourceLanguageText,w&&r.transliteration&&t.jsxs("span",{className:"tw:ml-1",children:["(",r.transliteration,")"]})]})]}),t.jsx(a.Separator,{className:"tw:absolute tw:bottom-0 tw:left-0 tw:right-0"})]})}const bt=["%sourceLanguageIndexedList_emptyState%","%sourceLanguageIndexedList_loading%","%sourceLanguageIndexedList_occurrenceCount%","%sourceLanguageIndexedList_strongsCode%","%sourceLanguageIndexedList_filterByDomain%","%sourceLanguageIndexedList_navigationModeTree%","%sourceLanguageIndexedList_navigationModeDropdown%","%sourceLanguageIndexedList_backToList%"];function mt({scrRef:r,onClick:e,tooltipContent:o,ariaLabel:w,className:s,testId:i="linked-scr-ref-button"}){if(r==="")return;const c=t.jsx(a.Button,{type:"button",variant:"link",onClick:e,disabled:!e,"aria-label":w,className:a.cn("tw:h-auto tw:p-0 tw:text-start tw:font-mono tw:text-sm",s),"data-testid":i,children:r});return o?t.jsx(a.TooltipProvider,{delayDuration:0,children:t.jsxs(a.Tooltip,{children:[t.jsx(a.TooltipTrigger,{asChild:!0,children:c}),t.jsx(a.TooltipContent,{children:o})]})}):c}const ft=Object.freeze(["%navigationHistory_back_tooltip%","%navigationHistory_forward_tooltip%","%navigationHistory_backList_ariaLabel%","%navigationHistory_forwardList_ariaLabel%"]),H=(r,e)=>r[e]??e;function xt({canGoBack:r=!1,canGoForward:e=!1,backItems:o=[],forwardItems:w=[],onNavigate:s,localizedStrings:i={},showKeyboardShortcuts:c=!0,className:_,variant:z="ghost",groupClassName:p,showDivider:M=!1}){const T=a.isMacOs(),k=a.readDirection(),v=k==="rtl",[U,b]=d.useState(void 0),D=d.useRef(null),j=d.useRef(null),y=H(i,"%navigationHistory_back_tooltip%"),L=H(i,"%navigationHistory_forward_tooltip%"),x=H(i,"%navigationHistory_backList_ariaLabel%"),f=H(i,"%navigationHistory_forwardList_ariaLabel%"),[S,R]=T?["⌘[","⌘]"]:["Alt+←","Alt+→"],P=a.P("left",k)==="back"?S:R,q=P===S?R:S,C=(n,h)=>{const g=n==="back",Y=g?r:e,A=g?o:w,G=g?y:L,J=g?x:f,X=g?P:q,K=g?D:j,$=U===n,Q=g!==v;return t.jsxs(a.DropdownMenu,{dir:k,open:$,onOpenChange:u=>{u||b(void 0)},children:[t.jsxs(a.Tooltip,{children:[t.jsx(a.TooltipTrigger,{asChild:!0,children:t.jsx(a.DropdownMenuTrigger,{asChild:!0,children:t.jsx("span",{className:"tw:inline-flex",onContextMenu:u=>{u.preventDefault(),A.length>0&&b(n)},children:t.jsx(a.Button,{ref:K,"aria-label":G,"aria-haspopup":"menu","aria-expanded":$,"data-testid":`navigation-history-${n}-button`,className:a.cn(h?"tw:rounded-e-none":"tw:rounded-s-none",_),size:"icon",variant:z,disabled:!Y,onClick:()=>s(g?-1:1),onKeyDown:u=>{(u.key==="Enter"||u.key===" "||u.key==="ArrowDown")&&u.stopPropagation()},children:Q?t.jsx(I.ArrowLeft,{}):t.jsx(I.ArrowRight,{})})})})}),t.jsx(a.TooltipContent,{children:t.jsxs("p",{children:[G,c&&t.jsxs(t.Fragment,{children:[" ",t.jsx(a.Kbd,{children:X})]})]})})]}),t.jsx(a.DropdownMenuContent,{align:"start","aria-label":J,"aria-labelledby":void 0,onCloseAutoFocus:u=>{var V;u.preventDefault(),(V=K.current)==null||V.focus()},children:A.map(u=>t.jsx(a.DropdownMenuItem,{onSelect:()=>s(u.offset),children:u.label},u.offset))})]},n)},O=v?"forward":"back",E=v?"back":"forward";return t.jsx(a.TooltipProvider,{children:t.jsxs(a.ButtonGroup,{"data-testid":"navigation-history-buttons",className:p,children:[C(O,!0),M&&t.jsx(a.ButtonGroupSeparator,{}),C(E,!1)]})})}const at=[{value:"Enabled",labelKey:"%paratextRegistration_description_internetUse_option_Enabled_2%",descriptionKey:"%paratextRegistration_description_internetUse_option_Enabled_details%",isEnabled:!0},{value:"VpnRequired",labelKey:"%paratextRegistration_description_internetUse_option_VpnRequired_2%",descriptionKey:"%paratextRegistration_description_internetUse_option_VpnRequired_details%",isEnabled:!0},{value:"Disabled",labelKey:"%paratextRegistration_description_internetUse_option_Disabled_2%",descriptionKey:"%paratextRegistration_description_internetUse_option_Disabled_details%",isEnabled:!1},{value:"BlockInSensitiveLocations",labelKey:"%paratextRegistration_description_internetUse_option_BlockInSensitiveLocations%",descriptionKey:"%paratextRegistration_description_internetUse_option_BlockInSensitiveLocations_details%",isEnabled:!1},{value:"ProxyOnly",labelKey:"%paratextRegistration_description_internetUse_option_ProxyOnly_2%",descriptionKey:"%paratextRegistration_description_internetUse_option_ProxyOnly_details%",isEnabled:!1}];function kt(r){return at.some(e=>e.value!=="BlockInSensitiveLocations"&&e.value===r)}const yt=[...at.flatMap(r=>[r.labelKey,r.descriptionKey]),"%paratextRegistration_internetUse_comingSoon%","%paratextRegistration_internetUse_footer%"];function _t({localizedStrings:r,value:e,onChange:o,disabled:w,showFooter:s=!0}){return t.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-1",children:[t.jsx(a.RadioGroup,{value:e,onValueChange:i=>{kt(i)&&o(i)},disabled:w,children:at.map(i=>t.jsxs("div",{className:a.cn("tw:flex tw:w-full tw:items-start tw:gap-2 tw:rounded tw:px-2 tw:py-1.5",!w&&i.isEnabled&&"tw:hover:bg-accent"),children:[t.jsx(a.RadioGroupItem,{value:i.value,id:`internet-option-${i.value}`,disabled:w||!i.isEnabled,className:"tw:mt-0.5"}),t.jsxs("div",{className:"tw:flex tw:flex-1 tw:flex-col",children:[t.jsxs("div",{className:"tw:flex tw:items-center tw:justify-between",children:[t.jsx("label",{htmlFor:`internet-option-${i.value}`,"aria-disabled":!i.isEnabled||void 0,className:a.cn("tw:text-sm tw:font-medium",i.isEnabled&&!w?"tw:cursor-pointer":"tw:cursor-not-allowed tw:text-muted-foreground"),children:r[i.labelKey]}),!i.isEnabled&&t.jsx(a.Badge,{variant:"muted",children:r["%paratextRegistration_internetUse_comingSoon%"]})]}),t.jsx("p",{className:"tw:text-xs tw:text-muted-foreground",children:r[i.descriptionKey]})]})]},i.value))}),s&&t.jsx("p",{className:"tw:px-2 tw:text-xs tw:text-muted-foreground",children:r["%paratextRegistration_internetUse_footer%"]})]})}const zt=["%paratextRegistration_developer_section_label%","%paratextRegistration_label_serverType_option_Production%","%paratextRegistration_label_serverType_option_QualityAssurance%","%paratextRegistration_label_serverType_option_Development%","%paratextRegistration_label_serverType_option_Test%"];function jt({localizedStrings:r,selectedServer:e,onServerChange:o,disabled:w}){const[s,i]=d.useState(!1);return t.jsxs("div",{className:"tw:border-t tw:pt-2",children:[t.jsxs(a.Button,{variant:"ghost",size:"sm","aria-expanded":s,"aria-controls":"developer-section-content",className:"tw:flex tw:w-full tw:items-center tw:justify-between tw:px-2 tw:font-normal tw:text-muted-foreground",onClick:()=>i(c=>!c),children:[t.jsx("span",{children:r["%paratextRegistration_developer_section_label%"]}),t.jsx(I.ChevronDown,{className:a.cn("tw:size-4","tw:transition-transform",s&&"tw:rotate-180")})]}),t.jsx("div",{id:"developer-section-content",className:"tw:mt-2 tw:px-2",hidden:!s,children:t.jsxs(a.ToggleGroup,{type:"single",value:e,onValueChange:c=>{(c==="Production"||c==="QualityAssurance"||c==="Development"||c==="Test")&&o(c)},disabled:w,children:[t.jsx(a.ToggleGroupItem,{value:"Production",variant:"outline","data-testid":"server-type-production",children:r["%paratextRegistration_label_serverType_option_Production%"]}),t.jsx(a.ToggleGroupItem,{value:"QualityAssurance",variant:"outline","data-testid":"server-type-quality-assurance",children:r["%paratextRegistration_label_serverType_option_QualityAssurance%"]}),t.jsx(a.ToggleGroupItem,{value:"Development",variant:"outline","data-testid":"server-type-development",children:r["%paratextRegistration_label_serverType_option_Development%"]}),t.jsx(a.ToggleGroupItem,{value:"Test",variant:"outline","data-testid":"server-type-test",children:r["%paratextRegistration_label_serverType_option_Test%"]})]})})]})}exports.ALL_BOOK_IDS=a.lt;exports.NO_GROUPING=a.NO_GROUPING;exports.PROJECT_SELECTOR_DEFAULT_STRINGS=a.PROJECT_SELECTOR_DEFAULT_STRINGS;exports.PROJECT_SELECTOR_STRING_KEYS=a.PROJECT_SELECTOR_STRING_KEYS;exports.ProjectSelector=a.ProjectSelector;exports.Z_INDEX_TOOLTIP=a.Z_INDEX_TOOLTIP;exports.buildBuiltInGroupingStrings=a.buildBuiltInGroupingStrings;exports.buildProjectSelectorLocalizedStrings=a.buildProjectSelectorLocalizedStrings;exports.buildSelectionGroupingStrings=a.buildSelectionGroupingStrings;exports.clearPaletteSessionIfCurrent=a.clearPaletteSessionIfCurrent;exports.defaultGroupings=a.defaultGroupings;exports.filterAndRankPaletteItems=a.filterAndRankPaletteItems;exports.getAvailableBookIds=a.getAvailableBookIds;exports.getMarkerPaletteClaimedKeys=a.getMarkerPaletteClaimedKeys;exports.handleMarkerPaletteSessionKeyDown=a.handleMarkerPaletteSessionKeyDown;exports.makeBuiltInGroupings=a.makeBuiltInGroupings;exports.makeSelectionGrouping=a.makeSelectionGrouping;exports.persistDirection=a.persistDirection;exports.readDirection=a.readDirection;exports.resolveLocalizedString=a.resolveLocalizedString;exports.runMarkerPaletteSession=a.runMarkerPaletteSession;exports.stripMarkerNestingPrefix=a.stripMarkerNestingPrefix;exports.summarizeSelectedBooks=a.summarizeSelectedBooks;exports.DEVELOPER_SECTION_STRING_KEYS=zt;exports.DeveloperSection=jt;exports.INTERNET_ACCESS_OPTION_LIST_STRING_KEYS=yt;exports.InternetAccessOptionList=_t;exports.LinkedScrRefButton=mt;exports.NAVIGATION_HISTORY_BUTTONS_STRING_KEYS=ft;exports.NavigationHistoryButtons=xt;exports.RESOURCE_PICKER_DIALOG_STRING_KEYS=pt;exports.ResourcePickerDialog=ht;exports.SOURCE_LANGUAGE_INDEXED_LIST_STRING_KEYS=bt;exports.SourceLanguageIndexedList=ut;exports.focusResourcePickerOnOpen=wt;exports.getResourcePickerBodyState=it;function St(r,e="top"){if(!r||typeof document>"u")return;const o=document.head||document.querySelector("head"),w=o.querySelector(":first-child"),s=document.createElement("style");s.appendChild(document.createTextNode(r)),e==="top"&&w?o.insertBefore(s,w):o.appendChild(s)}St(`/* By default the editor is too tall for the footnote editor, even while empty, so this makes it +"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("./resizable-iOJw6YSC.cjs"),t=require("react/jsx-runtime"),ot=require("platform-bible-utils"),I=require("lucide-react"),d=require("react");function dt(r,e=50){const[o,w]=d.useState(e),s=d.useRef(null);return d.useEffect(()=>{w(e)},[r,e]),d.useEffect(()=>{if(o>=r.length)return;const i=s.current,c=new IntersectionObserver(([_])=>{_.isIntersecting&&w(z=>Math.min(z+e,r.length))},{threshold:0});return i&&c.observe(i),()=>c.disconnect()},[o,r.length,e]),{visibleItems:r.slice(0,o),sentinelRef:s,hasMore:or[e]??e;function tt({label:r,resources:e,onSelect:o,showCheckmark:w}){if(e.length!==0)return t.jsxs(t.Fragment,{children:[t.jsx(a.TableRow,{className:"tw:border-0 tw:hover:bg-transparent",children:t.jsx(a.TableCell,{colSpan:4,className:"tw:border-0 tw:pt-4 tw:pb-0",children:t.jsx(a.Label,{className:"tw:text-xs tw:tracking-wider tw:text-muted-foreground tw:uppercase",children:r})})}),e.map(s=>t.jsxs(a.TableRow,{className:o?"tw:cursor-pointer tw:border-0":"tw:pointer-events-none tw:border-0",role:o?"button":void 0,"aria-label":o?s.displayName:void 0,onClick:o?()=>o(s):void 0,onKeyDown:o?i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),o(s))}:void 0,children:[t.jsx(a.TableCell,{className:"tw:border-0 tw:px-1 tw:py-1",children:w&&t.jsxs(t.Fragment,{children:[t.jsx(I.Check,{className:"tw:h-3.5 tw:w-3.5","aria-hidden":!0}),t.jsx("span",{className:"tw:sr-only",children:r})]})}),t.jsx(a.TableCell,{className:"tw:max-w-0 tw:truncate tw:border-0 tw:py-1 tw:pe-2 tw:text-start tw:font-normal",children:t.jsx("span",{title:s.displayName,children:s.displayName})}),t.jsx(a.TableCell,{className:"tw:max-w-0 tw:truncate tw:border-0 tw:py-1 tw:ps-2",children:t.jsx("span",{title:s.fullName,children:s.fullName})}),t.jsx(a.TableCell,{className:"tw:max-w-0 tw:truncate tw:border-0 tw:py-1 tw:ps-4 tw:text-end tw:text-muted-foreground",children:t.jsx("span",{title:s.bestLanguageName,children:s.bestLanguageName})})]},s.dblEntryUid))]})}function it(r){return r.isResourcesLoading?"loading":r.hasNoResults?r.canClearFiltersHelp?"filteredEmpty":r.hasResourcesError?"error":r.areDownloadsUnavailable?"downloadsUnavailable":"empty":"list"}function gt(r,e){if(!e)return!0;const o=e.toLowerCase();return r.displayName.toLowerCase().includes(o)||r.fullName.toLowerCase().includes(o)||r.bestLanguageName.toLowerCase().includes(o)}function ht({allResources:r,isResourcesLoading:e,hasResourcesError:o,onRetryResources:w,areDownloadsUnavailable:s,resourceType:i,selectedResourceIds:c,notice:_,allowSelectingInstalled:z=!0,localizedStrings:p,allowDeselect:M,onSelect:T,searchInputRef:k}){const[v,U]=d.useState(""),[b,D]=d.useState([]),j=d.useRef(null),y=k??j,L=d.useCallback(()=>{var l;U(""),D([]),(l=y.current)==null||l.focus()},[y]),x=d.useMemo(()=>r.filter(l=>!i||(Array.isArray(i)?i.includes(l.type):l.type===i)),[r,i]),f=d.useMemo(()=>x.filter(l=>gt(l,v)).filter(l=>b.length===0||b.includes(l.bestLanguageName)),[x,v,b]),S=d.useMemo(()=>f.filter(l=>c==null?void 0:c.includes(l.dblEntryUid)),[f,c]),R=d.useMemo(()=>f.filter(l=>l.installed&&!(c!=null&&c.includes(l.dblEntryUid))),[f,c]),P=d.useMemo(()=>f.filter(l=>!l.installed&&!(c!=null&&c.includes(l.dblEntryUid))),[f,c]),{visibleItems:q,sentinelRef:C,hasMore:O}=dt(P),E=d.useMemo(()=>Array.from(new Set(r.map(l=>l.bestLanguageName))).map(l=>({label:l,value:l})),[r]),n=S.length===0&&R.length===0&&P.length===0,h=m(p,"%resourcePicker_title%"),g=m(p,"%resourcePicker_description%"),Y=m(p,"%resourcePicker_search_placeholder%"),A=m(p,"%resourcePicker_language_filter_any%"),G=m(p,"%resourcePicker_section_already_selected%"),J=m(p,"%resourcePicker_section_installed%"),X=m(p,"%resourcePicker_section_available_to_download%"),K=m(p,"%resourcePicker_no_results%"),$=m(p,"%resourcePicker_load_error%"),Q=m(p,"%resourcePicker_retry%"),u=m(p,"%resourcePicker_no_results_filtered%"),V=m(p,"%resourcePicker_clear_filters%"),nt=m(p,"%resourcePicker_downloads_unavailable%"),st=m(p,"%resourcePicker_showing_count%"),W=b.length>0&&x.some(l=>!b.includes(l.bestLanguageName)),rt=v.length>0||W,ct=d.useMemo(()=>{if(!W)return A;if(b.length===1){const l=E.find(F=>F.value===b[0]);if(l)return l.label}return ot.formatReplacementString(m(p,"%resourcePicker_language_filter_multipleSelected%"),{selectCount:b.length})},[W,b,E,A,p]),lt=rt&&x.length>0,B=!!e||!!o||x.length===0,et=d.useRef(B);d.useEffect(()=>{const l=et.current&&!B;if(et.current=B,!l)return;const F=y.current;if(!F||F.disabled)return;const{activeElement:Z}=document;(!Z||Z===document.body||Z.getAttribute("data-slot")==="dialog-content")&&F.focus()},[B,y]);const N=it({isResourcesLoading:!!e,hasResourcesError:!!o,hasNoResults:n,canClearFiltersHelp:lt,areDownloadsUnavailable:!!s});return t.jsxs(t.Fragment,{children:[t.jsxs(a.DialogHeader,{className:"tw:px-4 tw:pt-4",children:[t.jsx(a.DialogTitle,{children:h}),t.jsx(a.DialogDescription,{className:"tw:sr-only",children:g})]}),t.jsxs("div",{className:"tw:flex tw:gap-2 tw:p-4",children:[t.jsx(a.SearchBar,{ref:y,value:v,onSearch:U,placeholder:Y,isFullWidth:!0,isDisabled:B}),t.jsx(a.MultiSelectComboBox,{entries:E,selected:b,onChange:D,customSelectedText:ct,placeholder:A,variant:"outline",isDisabled:B})]}),t.jsx("div",{role:"status",children:_&&t.jsx(a.Alert,{role:void 0,className:"tw:mx-4 tw:mb-2 tw:w-auto tw:bg-muted tw:text-muted-foreground",children:t.jsx(a.AlertDescription,{children:_})})}),rt&&(N==="list"||N==="filteredEmpty")&&t.jsx("p",{className:"tw:px-4 tw:pb-1 tw:text-end tw:text-xs tw:text-muted-foreground",children:ot.formatReplacementString(st,{filtered:f.length,total:x.length})}),t.jsxs("div",{className:"tw:min-h-0 tw:flex-1 tw:overflow-x-hidden tw:overflow-y-auto tw:px-4 tw:pb-4",children:[N==="loading"&&t.jsx("p",{className:"tw:py-8 tw:text-center",children:t.jsx(a.Spinner,{})}),N==="error"&&t.jsx(a.RetryableErrorView,{icon:t.jsx(I.CloudOff,{}),message:$,retryLabel:Q,onRetry:w}),N==="filteredEmpty"&&t.jsx(a.RetryableErrorView,{role:"status",icon:t.jsx(I.SearchX,{}),message:u,retryLabel:V,onRetry:L}),N==="downloadsUnavailable"&&t.jsx(a.RetryableErrorView,{role:"status",icon:t.jsx(I.CloudOff,{}),message:nt}),N==="empty"&&t.jsx(a.EmptyState,{className:"tw:py-8 tw:text-center",message:K}),N==="list"&&t.jsxs(a.Table,{className:"tw:table-fixed",children:[t.jsxs("colgroup",{children:[t.jsx("col",{className:"tw:w-7"}),t.jsx("col",{className:"tw:w-1/4"}),t.jsx("col",{}),t.jsx("col",{className:"tw:w-1/6"})]}),t.jsxs(a.TableBody,{children:[t.jsx(tt,{label:G,resources:S,onSelect:M?T:void 0,showCheckmark:!0}),t.jsx(tt,{label:J,resources:R,onSelect:z?T:void 0}),t.jsx(tt,{label:X,resources:q,onSelect:T}),O&&t.jsx(a.TableRow,{className:"tw:border-0",children:t.jsx(a.TableCell,{colSpan:4,className:"tw:border-0 tw:p-0",children:t.jsx("div",{ref:C,"aria-hidden":!0})})})]})]})]})]})}function ut({items:r,renderItem:e,renderDetailContent:o,onItemClick:w,selectedItemId:s,emptyStateMessage:i="No items found",detailRegionLabel:c="Selected item details",isLoading:_=!1,variant:z="text",showSourceLanguage:p=!1,showTransliteration:M=!1,onCharacterPress:T,className:k}){const[v,U]=d.useState(),b=d.useRef(null),D=s??v,j=d.useMemo(()=>v?r.find(n=>n.id===v):void 0,[v,r]),y=d.useMemo(()=>r.map(n=>({id:n.id})),[r]),L=n=>{w==null||w(n),o&&U(n.id===v?void 0:n.id)},x=n=>{const h=r.find(g=>g.id===n.id);h&&L(h)},{listboxRef:f,activeId:S,handleKeyDown:R,focusOption:P}=a.useListbox({options:y,onOptionSelect:x,onCharacterPress:T}),q=()=>{const n=v;U(void 0),n&&requestAnimationFrame(()=>{var h;P(n),(h=f.current)==null||h.focus()})},C=d.useRef(null);if(d.useEffect(()=>{if(!j)return;const n=C.current;if(!n)return;const h=g=>{g.key==="Escape"&&(g.preventDefault(),q())};return n.addEventListener("keydown",h),()=>n.removeEventListener("keydown",h)},[j]),_)return t.jsx("div",{className:a.cn("tw:flex tw:flex-col tw:gap-2 tw:p-2",k),children:Array.from({length:6},(n,h)=>t.jsx(a.Skeleton,{className:a.cn("tw:h-12 tw:w-full tw:rounded",{"tw:h-20":z==="thumbnail"})},h))});if(r.length===0)return t.jsx("div",{className:a.cn("tw:flex tw:items-center tw:justify-center tw:p-8 tw:text-sm tw:text-muted-foreground",k),children:i});const O=t.jsx("ul",{role:"listbox",tabIndex:0,ref:f,"aria-activedescendant":S??void 0,className:"tw:outline-none tw:focus:ring-2 tw:focus:ring-ring tw:focus:ring-offset-1 tw:focus:ring-offset-background",onKeyDown:R,children:r.map(n=>{const h=D===n.id;return t.jsx("li",{id:n.id,role:"option","aria-selected":h,tabIndex:-1,onClick:()=>L(n),onKeyDown:g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),L(n))},className:a.cn("tw:flex tw:cursor-pointer tw:items-center tw:gap-3 tw:p-2 tw:outline-none",{"tw:bg-muted":h,"tw:hover:bg-muted":!h}),children:e?e(n):t.jsx(vt,{item:n,variant:z,showSourceLanguage:p,showTransliteration:M})},n.id)})}),E=o&&j?o(j,q):void 0;return t.jsx("div",{ref:b,className:a.cn("tw:relative tw:flex tw:h-full tw:overflow-hidden",k),children:E?t.jsxs(a.ResizablePanelGroup,{direction:"horizontal",className:"tw:h-full tw:w-full",children:[t.jsx(a.ResizablePanel,{defaultSize:33.3333,minSize:20,children:t.jsx("div",{className:"tw:h-full tw:overflow-y-auto",children:O})}),t.jsx(a.ResizableHandle,{}),t.jsx(a.ResizablePanel,{defaultSize:66.6667,minSize:30,children:t.jsx("div",{ref:C,role:"region","aria-label":c,className:"tw:h-full tw:overflow-y-auto tw:bg-background tw:p-4",children:E})})]}):t.jsx("div",{className:"tw:h-full tw:w-full tw:overflow-y-auto",children:O})})}function vt({item:r,variant:e,showSourceLanguage:o,showTransliteration:w}){return t.jsxs(t.Fragment,{children:[e==="thumbnail"&&r.thumbnailUrl&&t.jsx("img",{src:r.thumbnailUrl,alt:r.thumbnailAlt??r.primaryText,className:"tw:h-14 tw:w-14 tw:shrink-0 tw:rounded tw:object-cover"}),t.jsxs("div",{className:"tw:flex tw:flex-1 tw:items-baseline tw:gap-4 tw:overflow-hidden",children:[t.jsx("span",{className:"tw:shrink-0 tw:truncate tw:text-sm",children:r.primaryText}),o&&r.sourceLanguageText&&t.jsxs("span",{className:"tw:truncate tw:text-sm tw:text-muted-foreground",children:[r.sourceLanguageText,w&&r.transliteration&&t.jsxs("span",{className:"tw:ml-1",children:["(",r.transliteration,")"]})]})]}),t.jsx(a.Separator,{className:"tw:absolute tw:bottom-0 tw:left-0 tw:right-0"})]})}const bt=["%sourceLanguageIndexedList_emptyState%","%sourceLanguageIndexedList_loading%","%sourceLanguageIndexedList_occurrenceCount%","%sourceLanguageIndexedList_strongsCode%","%sourceLanguageIndexedList_filterByDomain%","%sourceLanguageIndexedList_navigationModeTree%","%sourceLanguageIndexedList_navigationModeDropdown%","%sourceLanguageIndexedList_backToList%"];function mt({scrRef:r,onClick:e,tooltipContent:o,ariaLabel:w,className:s,testId:i="linked-scr-ref-button"}){if(r==="")return;const c=t.jsx(a.Button,{type:"button",variant:"link",onClick:e,disabled:!e,"aria-label":w,className:a.cn("tw:h-auto tw:p-0 tw:text-start tw:font-mono tw:text-sm",s),"data-testid":i,children:r});return o?t.jsx(a.TooltipProvider,{delayDuration:0,children:t.jsxs(a.Tooltip,{children:[t.jsx(a.TooltipTrigger,{asChild:!0,children:c}),t.jsx(a.TooltipContent,{children:o})]})}):c}const ft=Object.freeze(["%navigationHistory_back_tooltip%","%navigationHistory_forward_tooltip%","%navigationHistory_backList_ariaLabel%","%navigationHistory_forwardList_ariaLabel%"]),H=(r,e)=>r[e]??e;function xt({canGoBack:r=!1,canGoForward:e=!1,backItems:o=[],forwardItems:w=[],onNavigate:s,localizedStrings:i={},showKeyboardShortcuts:c=!0,className:_,variant:z="ghost",groupClassName:p,showDivider:M=!1}){const T=a.isMacOs(),k=a.readDirection(),v=k==="rtl",[U,b]=d.useState(void 0),D=d.useRef(null),j=d.useRef(null),y=H(i,"%navigationHistory_back_tooltip%"),L=H(i,"%navigationHistory_forward_tooltip%"),x=H(i,"%navigationHistory_backList_ariaLabel%"),f=H(i,"%navigationHistory_forwardList_ariaLabel%"),[S,R]=T?["⌘[","⌘]"]:["Alt+←","Alt+→"],P=a.P("left",k)==="back"?S:R,q=P===S?R:S,C=(n,h)=>{const g=n==="back",Y=g?r:e,A=g?o:w,G=g?y:L,J=g?x:f,X=g?P:q,K=g?D:j,$=U===n,Q=g!==v;return t.jsxs(a.DropdownMenu,{dir:k,open:$,onOpenChange:u=>{u||b(void 0)},children:[t.jsxs(a.Tooltip,{children:[t.jsx(a.TooltipTrigger,{asChild:!0,children:t.jsx(a.DropdownMenuTrigger,{asChild:!0,children:t.jsx("span",{className:"tw:inline-flex",onContextMenu:u=>{u.preventDefault(),A.length>0&&b(n)},children:t.jsx(a.Button,{ref:K,"aria-label":G,"aria-haspopup":"menu","aria-expanded":$,"data-testid":`navigation-history-${n}-button`,className:a.cn(h?"tw:rounded-e-none":"tw:rounded-s-none",_),size:"icon",variant:z,disabled:!Y,onClick:()=>s(g?-1:1),onKeyDown:u=>{(u.key==="Enter"||u.key===" "||u.key==="ArrowDown")&&u.stopPropagation()},children:Q?t.jsx(I.ArrowLeft,{}):t.jsx(I.ArrowRight,{})})})})}),t.jsx(a.TooltipContent,{children:t.jsxs("p",{children:[G,c&&t.jsxs(t.Fragment,{children:[" ",t.jsx(a.Kbd,{children:X})]})]})})]}),t.jsx(a.DropdownMenuContent,{align:"start","aria-label":J,"aria-labelledby":void 0,onCloseAutoFocus:u=>{var V;u.preventDefault(),(V=K.current)==null||V.focus()},children:A.map(u=>t.jsx(a.DropdownMenuItem,{onSelect:()=>s(u.offset),children:u.label},u.offset))})]},n)},O=v?"forward":"back",E=v?"back":"forward";return t.jsx(a.TooltipProvider,{children:t.jsxs(a.ButtonGroup,{"data-testid":"navigation-history-buttons",className:p,children:[C(O,!0),M&&t.jsx(a.ButtonGroupSeparator,{}),C(E,!1)]})})}const at=[{value:"Enabled",labelKey:"%paratextRegistration_description_internetUse_option_Enabled_2%",descriptionKey:"%paratextRegistration_description_internetUse_option_Enabled_details%",isEnabled:!0},{value:"VpnRequired",labelKey:"%paratextRegistration_description_internetUse_option_VpnRequired_2%",descriptionKey:"%paratextRegistration_description_internetUse_option_VpnRequired_details%",isEnabled:!0},{value:"Disabled",labelKey:"%paratextRegistration_description_internetUse_option_Disabled_2%",descriptionKey:"%paratextRegistration_description_internetUse_option_Disabled_details%",isEnabled:!1},{value:"BlockInSensitiveLocations",labelKey:"%paratextRegistration_description_internetUse_option_BlockInSensitiveLocations%",descriptionKey:"%paratextRegistration_description_internetUse_option_BlockInSensitiveLocations_details%",isEnabled:!1},{value:"ProxyOnly",labelKey:"%paratextRegistration_description_internetUse_option_ProxyOnly_2%",descriptionKey:"%paratextRegistration_description_internetUse_option_ProxyOnly_details%",isEnabled:!1}];function kt(r){return at.some(e=>e.value!=="BlockInSensitiveLocations"&&e.value===r)}const yt=[...at.flatMap(r=>[r.labelKey,r.descriptionKey]),"%paratextRegistration_internetUse_comingSoon%","%paratextRegistration_internetUse_footer%"];function _t({localizedStrings:r,value:e,onChange:o,disabled:w,showFooter:s=!0}){return t.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-1",children:[t.jsx(a.RadioGroup,{value:e,onValueChange:i=>{kt(i)&&o(i)},disabled:w,children:at.map(i=>t.jsxs("div",{className:a.cn("tw:flex tw:w-full tw:items-start tw:gap-2 tw:rounded tw:px-2 tw:py-1.5",!w&&i.isEnabled&&"tw:hover:bg-accent"),children:[t.jsx(a.RadioGroupItem,{value:i.value,id:`internet-option-${i.value}`,disabled:w||!i.isEnabled,className:"tw:mt-0.5"}),t.jsxs("div",{className:"tw:flex tw:flex-1 tw:flex-col",children:[t.jsxs("div",{className:"tw:flex tw:items-center tw:justify-between",children:[t.jsx("label",{htmlFor:`internet-option-${i.value}`,"aria-disabled":!i.isEnabled||void 0,className:a.cn("tw:text-sm tw:font-medium",i.isEnabled&&!w?"tw:cursor-pointer":"tw:cursor-not-allowed tw:text-muted-foreground"),children:r[i.labelKey]}),!i.isEnabled&&t.jsx(a.Badge,{variant:"muted",children:r["%paratextRegistration_internetUse_comingSoon%"]})]}),t.jsx("p",{className:"tw:text-xs tw:text-muted-foreground",children:r[i.descriptionKey]})]})]},i.value))}),s&&t.jsx("p",{className:"tw:px-2 tw:text-xs tw:text-muted-foreground",children:r["%paratextRegistration_internetUse_footer%"]})]})}const zt=["%paratextRegistration_developer_section_label%","%paratextRegistration_label_serverType_option_Production%","%paratextRegistration_label_serverType_option_QualityAssurance%","%paratextRegistration_label_serverType_option_Development%","%paratextRegistration_label_serverType_option_Test%"];function jt({localizedStrings:r,selectedServer:e,onServerChange:o,disabled:w}){const[s,i]=d.useState(!1);return t.jsxs("div",{className:"tw:border-t tw:pt-2",children:[t.jsxs(a.Button,{variant:"ghost",size:"sm","aria-expanded":s,"aria-controls":"developer-section-content",className:"tw:flex tw:w-full tw:items-center tw:justify-between tw:px-2 tw:font-normal tw:text-muted-foreground",onClick:()=>i(c=>!c),children:[t.jsx("span",{children:r["%paratextRegistration_developer_section_label%"]}),t.jsx(I.ChevronDown,{className:a.cn("tw:size-4","tw:transition-transform",s&&"tw:rotate-180")})]}),t.jsx("div",{id:"developer-section-content",className:"tw:mt-2 tw:px-2",hidden:!s,children:t.jsxs(a.ToggleGroup,{type:"single",value:e,onValueChange:c=>{(c==="Production"||c==="QualityAssurance"||c==="Development"||c==="Test")&&o(c)},disabled:w,children:[t.jsx(a.ToggleGroupItem,{value:"Production",variant:"outline","data-testid":"server-type-production",children:r["%paratextRegistration_label_serverType_option_Production%"]}),t.jsx(a.ToggleGroupItem,{value:"QualityAssurance",variant:"outline","data-testid":"server-type-quality-assurance",children:r["%paratextRegistration_label_serverType_option_QualityAssurance%"]}),t.jsx(a.ToggleGroupItem,{value:"Development",variant:"outline","data-testid":"server-type-development",children:r["%paratextRegistration_label_serverType_option_Development%"]}),t.jsx(a.ToggleGroupItem,{value:"Test",variant:"outline","data-testid":"server-type-test",children:r["%paratextRegistration_label_serverType_option_Test%"]})]})})]})}exports.ALL_BOOK_IDS=a.lt;exports.NO_GROUPING=a.NO_GROUPING;exports.PROJECT_SELECTOR_DEFAULT_STRINGS=a.PROJECT_SELECTOR_DEFAULT_STRINGS;exports.PROJECT_SELECTOR_STRING_KEYS=a.PROJECT_SELECTOR_STRING_KEYS;exports.ProjectSelector=a.ProjectSelector;exports.Z_INDEX_TOOLTIP=a.Z_INDEX_TOOLTIP;exports.buildBuiltInGroupingStrings=a.buildBuiltInGroupingStrings;exports.buildProjectSelectorLocalizedStrings=a.buildProjectSelectorLocalizedStrings;exports.buildSelectionGroupingStrings=a.buildSelectionGroupingStrings;exports.clearPaletteSessionIfCurrent=a.clearPaletteSessionIfCurrent;exports.defaultGroupings=a.defaultGroupings;exports.filterAndRankPaletteItems=a.filterAndRankPaletteItems;exports.getAvailableBookIds=a.getAvailableBookIds;exports.getMarkerPaletteClaimedKeys=a.getMarkerPaletteClaimedKeys;exports.handleMarkerPaletteSessionKeyDown=a.handleMarkerPaletteSessionKeyDown;exports.makeBuiltInGroupings=a.makeBuiltInGroupings;exports.makeSelectionGrouping=a.makeSelectionGrouping;exports.persistDirection=a.persistDirection;exports.readDirection=a.readDirection;exports.resolveLocalizedString=a.resolveLocalizedString;exports.runMarkerPaletteSession=a.runMarkerPaletteSession;exports.stripMarkerNestingPrefix=a.stripMarkerNestingPrefix;exports.summarizeSelectedBooks=a.summarizeSelectedBooks;exports.DEVELOPER_SECTION_STRING_KEYS=zt;exports.DeveloperSection=jt;exports.INTERNET_ACCESS_OPTION_LIST_STRING_KEYS=yt;exports.InternetAccessOptionList=_t;exports.LinkedScrRefButton=mt;exports.NAVIGATION_HISTORY_BUTTONS_STRING_KEYS=ft;exports.NavigationHistoryButtons=xt;exports.RESOURCE_PICKER_DIALOG_STRING_KEYS=pt;exports.ResourcePickerDialog=ht;exports.SOURCE_LANGUAGE_INDEXED_LIST_STRING_KEYS=bt;exports.SourceLanguageIndexedList=ut;exports.focusResourcePickerOnOpen=wt;exports.getResourcePickerBodyState=it;function St(r,e="top"){if(!r||typeof document>"u")return;const o=document.head||document.querySelector("head"),w=o.querySelector(":first-child"),s=document.createElement("style");s.appendChild(document.createTextNode(r)),e==="top"&&w?o.insertBefore(s,w):o.appendChild(s)}St(`/* By default the editor is too tall for the footnote editor, even while empty, so this makes it shorter. */ .footnote-editor .editor-input { min-height: 75px; @@ -153,6 +153,6 @@ list-style-type: disclosure-open; } /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--tw-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--tw-color-red-100:oklch(93.6% .032 17.717);--tw-color-red-200:oklch(88.5% .062 18.334);--tw-color-red-300:oklch(80.8% .114 19.571);--tw-color-red-400:oklch(70.4% .191 22.216);--tw-color-red-500:oklch(63.7% .237 25.331);--tw-color-red-600:oklch(57.7% .245 27.325);--tw-color-red-700:oklch(50.5% .213 27.518);--tw-color-red-800:oklch(44.4% .177 26.899);--tw-color-orange-100:oklch(95.4% .038 75.164);--tw-color-orange-800:oklch(47% .157 37.304);--tw-color-amber-200:oklch(92.4% .12 95.746);--tw-color-amber-400:oklch(82.8% .189 84.429);--tw-color-amber-500:oklch(76.9% .188 70.08);--tw-color-amber-600:oklch(66.6% .179 58.318);--tw-color-yellow-50:oklch(98.7% .026 102.212);--tw-color-yellow-100:oklch(97.3% .071 103.193);--tw-color-yellow-400:oklch(85.2% .199 91.936);--tw-color-yellow-500:oklch(79.5% .184 86.047);--tw-color-yellow-600:oklch(68.1% .162 75.834);--tw-color-yellow-700:oklch(55.4% .135 66.442);--tw-color-green-50:oklch(98.2% .018 155.826);--tw-color-green-100:oklch(96.2% .044 156.743);--tw-color-green-500:oklch(72.3% .219 149.579);--tw-color-green-600:oklch(62.7% .194 149.214);--tw-color-green-700:oklch(52.7% .154 150.069);--tw-color-green-800:oklch(44.8% .119 151.328);--tw-color-teal-400:oklch(77.7% .152 181.912);--tw-color-teal-500:oklch(70.4% .14 182.503);--tw-color-teal-600:oklch(60% .118 184.704);--tw-color-sky-400:oklch(74.6% .16 232.661);--tw-color-sky-500:oklch(68.5% .169 237.323);--tw-color-sky-600:oklch(58.8% .158 241.966);--tw-color-blue-50:oklch(97% .014 254.604);--tw-color-blue-100:oklch(93.2% .032 255.585);--tw-color-blue-400:oklch(70.7% .165 254.624);--tw-color-blue-500:oklch(62.3% .214 259.815);--tw-color-blue-600:oklch(54.6% .245 262.881);--tw-color-blue-800:oklch(42.4% .199 265.638);--tw-color-indigo-200:oklch(87% .065 274.039);--tw-color-purple-50:oklch(97.7% .014 308.299);--tw-color-purple-200:oklch(90.2% .063 306.703);--tw-color-purple-900:oklch(38.1% .176 304.987);--tw-color-rose-400:oklch(71.2% .194 13.428);--tw-color-rose-500:oklch(64.5% .246 16.439);--tw-color-rose-600:oklch(58.6% .253 17.585);--tw-color-slate-300:oklch(86.9% .022 252.894);--tw-color-slate-400:oklch(70.4% .04 256.788);--tw-color-slate-900:oklch(20.8% .042 265.755);--tw-color-gray-50:oklch(98.5% .002 247.839);--tw-color-gray-100:oklch(96.7% .003 264.542);--tw-color-gray-300:oklch(87.2% .01 258.338);--tw-color-gray-500:oklch(55.1% .027 264.364);--tw-color-gray-600:oklch(44.6% .03 256.802);--tw-color-gray-700:oklch(37.3% .034 259.733);--tw-color-gray-800:oklch(27.8% .033 256.848);--tw-color-zinc-400:oklch(70.5% .015 286.067);--tw-color-neutral-300:oklch(87% 0 0);--tw-color-black:#000;--tw-color-white:#fff;--tw-container-xs:20rem;--tw-container-sm:24rem;--tw-container-md:28rem;--tw-container-lg:32rem;--tw-container-2xl:42rem;--tw-container-3xl:48rem;--tw-container-4xl:56rem;--tw-container-6xl:72rem;--tw-text-xs:.75rem;--tw-text-xs--line-height:calc(1 / .75);--tw-text-sm:.875rem;--tw-text-sm--line-height:calc(1.25 / .875);--tw-text-base:1rem;--tw-text-base--line-height:calc(1.5 / 1);--tw-text-lg:1.125rem;--tw-text-lg--line-height:calc(1.75 / 1.125);--tw-text-xl:1.25rem;--tw-text-xl--line-height:calc(1.75 / 1.25);--tw-text-2xl:1.5rem;--tw-text-2xl--line-height:calc(2 / 1.5);--tw-text-3xl:1.875rem;--tw-text-3xl--line-height:calc(2.25 / 1.875);--tw-text-4xl:2.25rem;--tw-text-4xl--line-height:calc(2.5 / 2.25);--tw-text-5xl:3rem;--tw-text-5xl--line-height:1;--tw-font-weight-normal:400;--tw-font-weight-medium:500;--tw-font-weight-semibold:600;--tw-font-weight-bold:700;--tw-font-weight-extrabold:800;--tw-tracking-tight:-.025em;--tw-tracking-wider:.05em;--tw-tracking-widest:.1em;--tw-leading-tight:1.25;--tw-leading-snug:1.375;--tw-leading-relaxed:1.625;--tw-leading-loose:2;--tw-radius-xs:.125rem;--tw-radius-md:calc(var(--radius) * .8);--tw-drop-shadow-sm:0 1px 2px #00000026;--tw-animate-spin:spin 1s linear infinite;--tw-animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--tw-blur-xs:4px;--tw-default-transition-duration:.15s;--tw-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--tw-default-font-family:"IBM Plex Sans Variable", sans-serif;--tw-default-mono-font-family:var(--tw-font-mono)}}@layer base{.pr-twp,.pr-twp *{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.pr-twp,.pr-twp *{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body.pr-twp{background-color:var(--background);color:var(--foreground)}html.pr-twp{font-family:IBM Plex Sans Variable,sans-serif}:where(.pr-twp,.pr-twp *),:where(.pr-twp,.pr-twp *):after,:where(.pr-twp,.pr-twp *):before,:where(.pr-twp,.pr-twp *) ::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}:where(.pr-twp,.pr-twp *) ::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}.pr-twp{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--tw-default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--tw-default-font-feature-settings,normal);font-variation-settings:var(--tw-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr:where(.pr-twp,.pr-twp *){height:0;color:inherit;border-top-width:1px}abbr:where([title]):where(.pr-twp,.pr-twp *){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1:where(.pr-twp,.pr-twp *),h2:where(.pr-twp,.pr-twp *),h3:where(.pr-twp,.pr-twp *),h4:where(.pr-twp,.pr-twp *),h5:where(.pr-twp,.pr-twp *),h6:where(.pr-twp,.pr-twp *){font-size:inherit;font-weight:inherit}a:where(.pr-twp,.pr-twp *){color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b:where(.pr-twp,.pr-twp *),strong:where(.pr-twp,.pr-twp *){font-weight:bolder}code:where(.pr-twp,.pr-twp *),kbd:where(.pr-twp,.pr-twp *),samp:where(.pr-twp,.pr-twp *),pre:where(.pr-twp,.pr-twp *){font-family:var(--tw-default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--tw-default-mono-font-feature-settings,normal);font-variation-settings:var(--tw-default-mono-font-variation-settings,normal);font-size:1em}small:where(.pr-twp,.pr-twp *){font-size:80%}sub:where(.pr-twp,.pr-twp *),sup:where(.pr-twp,.pr-twp *){vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub:where(.pr-twp,.pr-twp *){bottom:-.25em}sup:where(.pr-twp,.pr-twp *){top:-.5em}table:where(.pr-twp,.pr-twp *){text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(.pr-twp,.pr-twp *){outline:auto}progress:where(.pr-twp,.pr-twp *){vertical-align:baseline}summary:where(.pr-twp,.pr-twp *){display:list-item}ol:where(.pr-twp,.pr-twp *),ul:where(.pr-twp,.pr-twp *),menu:where(.pr-twp,.pr-twp *){list-style:none}img:where(.pr-twp,.pr-twp *),svg:where(.pr-twp,.pr-twp *),video:where(.pr-twp,.pr-twp *),canvas:where(.pr-twp,.pr-twp *),audio:where(.pr-twp,.pr-twp *),iframe:where(.pr-twp,.pr-twp *),embed:where(.pr-twp,.pr-twp *),object:where(.pr-twp,.pr-twp *){vertical-align:middle;display:block}img:where(.pr-twp,.pr-twp *),video:where(.pr-twp,.pr-twp *){max-width:100%;height:auto}button:where(.pr-twp,.pr-twp *),input:where(.pr-twp,.pr-twp *),select:where(.pr-twp,.pr-twp *),optgroup:where(.pr-twp,.pr-twp *),textarea:where(.pr-twp,.pr-twp *){font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(.pr-twp,.pr-twp *) ::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup:where(.pr-twp,.pr-twp *){font-weight:bolder}:where(select:is([multiple],[size])) optgroup option:where(.pr-twp,.pr-twp *){padding-inline-start:20px}:where(.pr-twp,.pr-twp *) ::file-selector-button{margin-inline-end:4px}:where(.pr-twp,.pr-twp *) ::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){:where(.pr-twp,.pr-twp *) ::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){:where(.pr-twp,.pr-twp *) ::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea:where(.pr-twp,.pr-twp *){resize:vertical}:where(.pr-twp,.pr-twp *) ::-webkit-search-decoration{-webkit-appearance:none}:where(.pr-twp,.pr-twp *) ::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit{display:inline-flex}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-fields-wrapper{padding:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-year-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-month-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-day-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-hour-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-minute-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-second-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-millisecond-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-meridiem-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid:where(.pr-twp,.pr-twp *){box-shadow:none}button:where(.pr-twp,.pr-twp *),input:where([type=button],[type=reset],[type=submit]):where(.pr-twp,.pr-twp *){appearance:button}:where(.pr-twp,.pr-twp *) ::file-selector-button{appearance:button}:where(.pr-twp,.pr-twp *) ::-webkit-inner-spin-button{height:auto}:where(.pr-twp,.pr-twp *) ::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])):where(.pr-twp,.pr-twp *){display:none!important}}@layer components;@layer utilities{.tw\\:\\@container\\/card-header{container:card-header/inline-size}.tw\\:\\@container\\/search{container:search/inline-size}.tw\\:\\@container\\/toolbar{container:toolbar/inline-size}.tw\\:pointer-events-auto{pointer-events:auto}.tw\\:pointer-events-none{pointer-events:none}.tw\\:invisible{visibility:hidden}.tw\\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.tw\\:absolute{position:absolute}.tw\\:fixed{position:fixed}.tw\\:relative{position:relative}.tw\\:sticky{position:sticky}.tw\\:inset-0{inset:calc(calc(var(--spacing)) * 0)}.tw\\:inset-y-0{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:inset-s-3{inset-inline-start:calc(calc(var(--spacing)) * 3)}.tw\\:start-1\\.5{inset-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:start-1\\/2{inset-inline-start:50%}.tw\\:end-0{inset-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:end-1{inset-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:end-2{inset-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:end-3{inset-inline-end:calc(calc(var(--spacing)) * 3)}.tw\\:inset-e-0{inset-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:-top-\\[1px\\]{top:-1px}.tw\\:top-0{top:calc(calc(var(--spacing)) * 0)}.tw\\:top-1{top:calc(calc(var(--spacing)) * 1)}.tw\\:top-1\\.5{top:calc(calc(var(--spacing)) * 1.5)}.tw\\:top-1\\/2{top:50%}.tw\\:top-1\\/3{top:33.3333%}.tw\\:top-2{top:calc(calc(var(--spacing)) * 2)}.tw\\:top-2\\.5{top:calc(calc(var(--spacing)) * 2.5)}.tw\\:top-3\\.5{top:calc(calc(var(--spacing)) * 3.5)}.tw\\:top-\\[-1px\\]{top:-1px}.tw\\:top-full{top:100%}.tw\\:-right-1{right:calc(calc(var(--spacing)) * -1)}.tw\\:right-0{right:calc(calc(var(--spacing)) * 0)}.tw\\:right-1{right:calc(calc(var(--spacing)) * 1)}.tw\\:right-3{right:calc(calc(var(--spacing)) * 3)}.tw\\:bottom-0{bottom:calc(calc(var(--spacing)) * 0)}.tw\\:-left-\\[1px\\]{left:-1px}.tw\\:left-0{left:calc(calc(var(--spacing)) * 0)}.tw\\:left-1\\/2{left:50%}.tw\\:left-2{left:calc(calc(var(--spacing)) * 2)}.tw\\:left-3{left:calc(calc(var(--spacing)) * 3)}.tw\\:isolate{isolation:isolate}.tw\\:z-10{z-index:10}.tw\\:z-20{z-index:20}.tw\\:z-50{z-index:50}.tw\\:order-first{order:-9999}.tw\\:order-last{order:9999}.tw\\:col-span-1{grid-column:span 1/span 1}.tw\\:col-span-2{grid-column:span 2/span 2}.tw\\:col-span-3{grid-column:span 3/span 3}.tw\\:col-start-1{grid-column-start:1}.tw\\:col-start-2{grid-column-start:2}.tw\\:row-span-2{grid-row:span 2/span 2}.tw\\:row-start-1{grid-row-start:1}.tw\\:row-start-2{grid-row-start:2}.tw\\:m-0{margin:calc(calc(var(--spacing)) * 0)}.tw\\:m-1{margin:calc(calc(var(--spacing)) * 1)}.tw\\:m-2{margin:calc(calc(var(--spacing)) * 2)}.tw\\:-mx-1{margin-inline:calc(calc(var(--spacing)) * -1)}.tw\\:-mx-4{margin-inline:calc(calc(var(--spacing)) * -4)}.tw\\:mx-0{margin-inline:calc(calc(var(--spacing)) * 0)}.tw\\:mx-1{margin-inline:calc(calc(var(--spacing)) * 1)}.tw\\:mx-2{margin-inline:calc(calc(var(--spacing)) * 2)}.tw\\:mx-3\\.5{margin-inline:calc(calc(var(--spacing)) * 3.5)}.tw\\:mx-4{margin-inline:calc(calc(var(--spacing)) * 4)}.tw\\:mx-8{margin-inline:calc(calc(var(--spacing)) * 8)}.tw\\:my-1{margin-block:calc(calc(var(--spacing)) * 1)}.tw\\:my-2\\.5{margin-block:calc(calc(var(--spacing)) * 2.5)}.tw\\:my-4{margin-block:calc(calc(var(--spacing)) * 4)}.tw\\:my-auto{margin-block:auto}.tw\\:ms-1{margin-inline-start:calc(calc(var(--spacing)) * 1)}.tw\\:ms-2{margin-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:ms-5{margin-inline-start:calc(calc(var(--spacing)) * 5)}.tw\\:ms-6{margin-inline-start:calc(calc(var(--spacing)) * 6)}.tw\\:ms-auto{margin-inline-start:auto}.tw\\:me-1{margin-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:me-2{margin-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:prose{color:var(--tw-prose-body);max-width:65ch}.tw\\:prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.tw\\:prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);margin-top:1.2em;margin-bottom:1.2em;font-size:1.25em;line-height:1.6}.tw\\:prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.tw\\:prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.tw\\:prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:decimal}.tw\\:prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.tw\\:prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.tw\\:prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.tw\\:prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.tw\\:prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.tw\\:prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.tw\\:prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.tw\\:prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.tw\\:prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.tw\\:prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:disc}.tw\\:prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.tw\\:prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.tw\\:prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.25em;font-weight:600}.tw\\:prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.tw\\:prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;font-style:italic;font-weight:500}.tw\\:prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.tw\\:prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.tw\\:prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:0;margin-bottom:.888889em;font-size:2.25em;font-weight:800;line-height:1.11111}.tw\\:prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.tw\\:prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:2em;margin-bottom:1em;font-size:1.5em;font-weight:700;line-height:1.33333}.tw\\:prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.tw\\:prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.6em;margin-bottom:.6em;font-size:1.25em;font-weight:600;line-height:1.6}.tw\\:prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.tw\\:prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.5}.tw\\:prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.tw\\:prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em;display:block}.tw\\:prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-kbd);box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%), 0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%);padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;border-radius:.3125rem;padding-inline-start:.375em;font-family:inherit;font-size:.875em;font-weight:500}.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"\`"}.tw\\:prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.tw\\:prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.tw\\:prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);padding-top:.857143em;padding-inline-end:1.14286em;padding-bottom:.857143em;border-radius:.375rem;margin-top:1.71429em;margin-bottom:1.71429em;padding-inline-start:1.14286em;font-size:.875em;font-weight:400;line-height:1.71429;overflow-x:auto}.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit;background-color:#0000;border-width:0;border-radius:0;padding:0}.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.tw\\:prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){table-layout:auto;width:100%;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.71429}.tw\\:prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.tw\\:prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);vertical-align:bottom;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em;font-weight:600}.tw\\:prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.tw\\:prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.tw\\:prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.tw\\:prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.tw\\:prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.tw\\:prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.tw\\:prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);margin-top:.857143em;font-size:.875em;line-height:1.42857}.tw\\:prose{--tw-prose-body:var(--foreground);--tw-prose-headings:var(--foreground);--tw-prose-lead:var(--muted-foreground);--tw-prose-links:var(--primary);--tw-prose-bold:var(--foreground);--tw-prose-counters:var(--muted-foreground);--tw-prose-bullets:var(--muted-foreground);--tw-prose-hr:var(--border);--tw-prose-quotes:var(--foreground);--tw-prose-quote-borders:var(--border);--tw-prose-captions:var(--muted-foreground);--tw-prose-kbd:oklch(21% .034 264.665);--tw-prose-kbd-shadows:NaN NaN NaN;--tw-prose-code:var(--foreground);--tw-prose-pre-code:var(--muted-foreground);--tw-prose-pre-bg:var(--muted);--tw-prose-th-borders:var(--border);--tw-prose-td-borders:var(--border);--tw-prose-invert-body:var(--foreground);--tw-prose-invert-headings:var(--foreground);--tw-prose-invert-lead:var(--muted-foreground);--tw-prose-invert-links:var(--primary);--tw-prose-invert-bold:var(--foreground);--tw-prose-invert-counters:var(--muted-foreground);--tw-prose-invert-bullets:var(--muted-foreground);--tw-prose-invert-hr:var(--border);--tw-prose-invert-quotes:var(--foreground);--tw-prose-invert-quote-borders:var(--border);--tw-prose-invert-captions:var(--muted-foreground);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:var(--foreground);--tw-prose-invert-pre-code:var(--muted-foreground);--tw-prose-invert-pre-bg:var(--muted);--tw-prose-invert-th-borders:var(--border);--tw-prose-invert-td-borders:var(--border);font-size:1rem;line-height:1.75}.tw\\:prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.tw\\:prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.tw\\:prose :where(.tw\\:prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.tw\\:prose :where(.tw\\:prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.tw\\:prose :where(.tw\\:prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.tw\\:prose :where(.tw\\:prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.tw\\:prose :where(.tw\\:prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.tw\\:prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.tw\\:prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.tw\\:prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.tw\\:prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.571429em;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em}.tw\\:prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(.tw\\:prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose :where(.tw\\:prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.tw\\:prose-sm{font-size:.875rem;line-height:1.71429}.tw\\:prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.tw\\:prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.888889em;margin-bottom:.888889em;font-size:1.28571em;line-height:1.55556}.tw\\:prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.33333em;margin-bottom:1.33333em;padding-inline-start:1.11111em}.tw\\:prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:.8em;font-size:2.14286em;line-height:1.2}.tw\\:prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6em;margin-bottom:.8em;font-size:1.42857em;line-height:1.4}.tw\\:prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.55556em;margin-bottom:.444444em;font-size:1.28571em;line-height:1.55556}.tw\\:prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.42857em;margin-bottom:.571429em;line-height:1.42857}.tw\\:prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.142857em;padding-inline-end:.357143em;padding-bottom:.142857em;border-radius:.3125rem;padding-inline-start:.357143em;font-size:.857143em}.tw\\:prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em}.tw\\:prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.tw\\:prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.888889em}.tw\\:prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;border-radius:.25rem;margin-top:1.66667em;margin-bottom:1.66667em;padding-inline-start:1em;font-size:.857143em;line-height:1.66667}.tw\\:prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em;padding-inline-start:1.57143em}.tw\\:prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;margin-bottom:.285714em}.tw\\:prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.428571em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.tw\\:prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.tw\\:prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.tw\\:prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;padding-inline-start:1.57143em}.tw\\:prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.85714em;margin-bottom:2.85714em}.tw\\:prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em;line-height:1.5}.tw\\:prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.tw\\:prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.tw\\:prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.666667em;font-size:.857143em;line-height:1.33333}.tw\\:prose-sm :where(.tw\\:prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose-sm :where(.tw\\:prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.tw\\:-mt-4{margin-top:calc(calc(var(--spacing)) * -4)}.tw\\:mt-0\\.5{margin-top:calc(calc(var(--spacing)) * .5)}.tw\\:mt-1{margin-top:calc(calc(var(--spacing)) * 1)}.tw\\:mt-2{margin-top:calc(calc(var(--spacing)) * 2)}.tw\\:mt-3{margin-top:calc(calc(var(--spacing)) * 3)}.tw\\:mt-4{margin-top:calc(calc(var(--spacing)) * 4)}.tw\\:mt-6{margin-top:calc(calc(var(--spacing)) * 6)}.tw\\:mt-auto{margin-top:auto}.tw\\:mr-1{margin-right:calc(calc(var(--spacing)) * 1)}.tw\\:mr-2{margin-right:calc(calc(var(--spacing)) * 2)}.tw\\:mr-3{margin-right:calc(calc(var(--spacing)) * 3)}.tw\\:-mb-4{margin-bottom:calc(calc(var(--spacing)) * -4)}.tw\\:mb-1{margin-bottom:calc(calc(var(--spacing)) * 1)}.tw\\:mb-2{margin-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:mb-3{margin-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:mb-4{margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:ml-1{margin-left:calc(calc(var(--spacing)) * 1)}.tw\\:ml-2{margin-left:calc(calc(var(--spacing)) * 2)}.tw\\:ml-4{margin-left:calc(calc(var(--spacing)) * 4)}.tw\\:ml-auto{margin-left:auto}.tw\\:box-border{box-sizing:border-box}.tw\\:line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.tw\\:no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.tw\\:no-scrollbar::-webkit-scrollbar{display:none}.tw\\:block{display:block}.tw\\:flex{display:flex}.tw\\:grid{display:grid}.tw\\:hidden{display:none}.tw\\:inline-block{display:inline-block}.tw\\:inline-flex{display:inline-flex}.tw\\:inline-grid{display:inline-grid}.tw\\:field-sizing-content{field-sizing:content}.tw\\:aspect-square{aspect-ratio:1}.tw\\:size-2{width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:size-2\\.5{width:calc(calc(var(--spacing)) * 2.5);height:calc(calc(var(--spacing)) * 2.5)}.tw\\:size-3{width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:size-3\\.5{width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:size-4{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:size-6{width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:size-7{width:calc(calc(var(--spacing)) * 7);height:calc(calc(var(--spacing)) * 7)}.tw\\:size-8{width:calc(calc(var(--spacing)) * 8);height:calc(calc(var(--spacing)) * 8)}.tw\\:size-9{width:calc(calc(var(--spacing)) * 9);height:calc(calc(var(--spacing)) * 9)}.tw\\:size-10{width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:size-full{width:100%;height:100%}.tw\\:h-1{height:calc(calc(var(--spacing)) * 1)}.tw\\:h-2{height:calc(calc(var(--spacing)) * 2)}.tw\\:h-3{height:calc(calc(var(--spacing)) * 3)}.tw\\:h-3\\.5{height:calc(calc(var(--spacing)) * 3.5)}.tw\\:h-4{height:calc(calc(var(--spacing)) * 4)}.tw\\:h-5{height:calc(calc(var(--spacing)) * 5)}.tw\\:h-6{height:calc(calc(var(--spacing)) * 6)}.tw\\:h-7{height:calc(calc(var(--spacing)) * 7)}.tw\\:h-8{height:calc(calc(var(--spacing)) * 8)}.tw\\:h-8\\!{height:calc(calc(var(--spacing)) * 8)!important}.tw\\:h-8\\.5{height:calc(calc(var(--spacing)) * 8.5)}.tw\\:h-9{height:calc(calc(var(--spacing)) * 9)}.tw\\:h-10{height:calc(calc(var(--spacing)) * 10)}.tw\\:h-12{height:calc(calc(var(--spacing)) * 12)}.tw\\:h-14{height:calc(calc(var(--spacing)) * 14)}.tw\\:h-20{height:calc(calc(var(--spacing)) * 20)}.tw\\:h-24{height:calc(calc(var(--spacing)) * 24)}.tw\\:h-32{height:calc(calc(var(--spacing)) * 32)}.tw\\:h-40{height:calc(calc(var(--spacing)) * 40)}.tw\\:h-64{height:calc(calc(var(--spacing)) * 64)}.tw\\:h-80{height:calc(calc(var(--spacing)) * 80)}.tw\\:h-96{height:calc(calc(var(--spacing)) * 96)}.tw\\:h-\\[5px\\]{height:5px}.tw\\:h-\\[260px\\]{height:260px}.tw\\:h-\\[300px\\]{height:300px}.tw\\:h-\\[400px\\]{height:400px}.tw\\:h-\\[600px\\]{height:600px}.tw\\:h-\\[calc\\(100\\%-1px\\)\\]{height:calc(100% - 1px)}.tw\\:h-\\[calc\\(100\\%-2px\\)\\]{height:calc(100% - 2px)}.tw\\:h-auto{height:auto}.tw\\:h-full{height:100%}.tw\\:h-px{height:1px}.tw\\:h-screen{height:100vh}.tw\\:h-svh{height:100svh}.tw\\:max-h-\\(--radix-context-menu-content-available-height\\){max-height:var(--radix-context-menu-content-available-height)}.tw\\:max-h-\\(--radix-dropdown-menu-content-available-height\\){max-height:var(--radix-dropdown-menu-content-available-height)}.tw\\:max-h-\\(--radix-popover-content-available-height\\){max-height:var(--radix-popover-content-available-height)}.tw\\:max-h-\\(--radix-select-content-available-height\\){max-height:var(--radix-select-content-available-height)}.tw\\:max-h-5{max-height:calc(calc(var(--spacing)) * 5)}.tw\\:max-h-10{max-height:calc(calc(var(--spacing)) * 10)}.tw\\:max-h-72{max-height:calc(calc(var(--spacing)) * 72)}.tw\\:max-h-80{max-height:calc(calc(var(--spacing)) * 80)}.tw\\:max-h-\\[96\\%\\]{max-height:96%}.tw\\:max-h-\\[300px\\]{max-height:300px}.tw\\:min-h-0{min-height:calc(calc(var(--spacing)) * 0)}.tw\\:min-h-11{min-height:calc(calc(var(--spacing)) * 11)}.tw\\:min-h-16{min-height:calc(calc(var(--spacing)) * 16)}.tw\\:min-h-\\[200px\\]{min-height:200px}.tw\\:min-h-full{min-height:100%}.tw\\:min-h-svh{min-height:100svh}.tw\\:w-\\(--radix-dropdown-menu-trigger-width\\){width:var(--radix-dropdown-menu-trigger-width)}.tw\\:w-\\(--sidebar-width\\){width:var(--sidebar-width)}.tw\\:w-1{width:calc(calc(var(--spacing)) * 1)}.tw\\:w-1\\/2{width:50%}.tw\\:w-1\\/4{width:25%}.tw\\:w-1\\/6{width:16.6667%}.tw\\:w-2{width:calc(calc(var(--spacing)) * 2)}.tw\\:w-3{width:calc(calc(var(--spacing)) * 3)}.tw\\:w-3\\.5{width:calc(calc(var(--spacing)) * 3.5)}.tw\\:w-3\\/4{width:75%}.tw\\:w-4{width:calc(calc(var(--spacing)) * 4)}.tw\\:w-4\\/5{width:80%}.tw\\:w-4\\/6{width:66.6667%}.tw\\:w-5{width:calc(calc(var(--spacing)) * 5)}.tw\\:w-5\\/6{width:83.3333%}.tw\\:w-6{width:calc(calc(var(--spacing)) * 6)}.tw\\:w-7{width:calc(calc(var(--spacing)) * 7)}.tw\\:w-8{width:calc(calc(var(--spacing)) * 8)}.tw\\:w-9{width:calc(calc(var(--spacing)) * 9)}.tw\\:w-9\\/12{width:75%}.tw\\:w-10{width:calc(calc(var(--spacing)) * 10)}.tw\\:w-12{width:calc(calc(var(--spacing)) * 12)}.tw\\:w-14{width:calc(calc(var(--spacing)) * 14)}.tw\\:w-20{width:calc(calc(var(--spacing)) * 20)}.tw\\:w-24{width:calc(calc(var(--spacing)) * 24)}.tw\\:w-32{width:calc(calc(var(--spacing)) * 32)}.tw\\:w-48{width:calc(calc(var(--spacing)) * 48)}.tw\\:w-56{width:calc(calc(var(--spacing)) * 56)}.tw\\:w-60{width:calc(calc(var(--spacing)) * 60)}.tw\\:w-64{width:calc(calc(var(--spacing)) * 64)}.tw\\:w-72{width:calc(calc(var(--spacing)) * 72)}.tw\\:w-80{width:calc(calc(var(--spacing)) * 80)}.tw\\:w-96{width:calc(calc(var(--spacing)) * 96)}.tw\\:w-\\[1px\\]{width:1px}.tw\\:w-\\[5px\\]{width:5px}.tw\\:w-\\[70px\\]{width:70px}.tw\\:w-\\[100px\\]{width:100px}.tw\\:w-\\[116px\\]{width:116px}.tw\\:w-\\[124px\\]{width:124px}.tw\\:w-\\[150px\\]{width:150px}.tw\\:w-\\[180px\\]{width:180px}.tw\\:w-\\[200px\\]{width:200px}.tw\\:w-\\[250px\\]{width:250px}.tw\\:w-\\[260px\\]{width:260px}.tw\\:w-\\[280px\\]{width:280px}.tw\\:w-\\[300px\\]{width:300px}.tw\\:w-\\[320px\\]{width:320px}.tw\\:w-\\[350px\\]{width:350px}.tw\\:w-\\[400px\\]{width:400px}.tw\\:w-\\[420px\\]{width:420px}.tw\\:w-\\[500px\\]{width:500px}.tw\\:w-\\[560px\\]{width:560px}.tw\\:w-\\[600px\\]{width:600px}.tw\\:w-\\[calc\\(100\\%-2px\\)\\]{width:calc(100% - 2px)}.tw\\:w-\\[var\\(--radix-dropdown-menu-trigger-width\\)\\]{width:var(--radix-dropdown-menu-trigger-width)}.tw\\:w-auto{width:auto}.tw\\:w-fit{width:fit-content}.tw\\:w-full{width:100%}.tw\\:w-max{width:max-content}.tw\\:w-px{width:1px}.tw\\:max-w-\\(--skeleton-width\\){max-width:var(--skeleton-width)}.tw\\:max-w-0{max-width:calc(calc(var(--spacing)) * 0)}.tw\\:max-w-2xl{max-width:var(--tw-container-2xl)}.tw\\:max-w-3xl{max-width:var(--tw-container-3xl)}.tw\\:max-w-4xl{max-width:var(--tw-container-4xl)}.tw\\:max-w-5{max-width:calc(calc(var(--spacing)) * 5)}.tw\\:max-w-6xl{max-width:var(--tw-container-6xl)}.tw\\:max-w-40{max-width:calc(calc(var(--spacing)) * 40)}.tw\\:max-w-48{max-width:calc(calc(var(--spacing)) * 48)}.tw\\:max-w-64{max-width:calc(calc(var(--spacing)) * 64)}.tw\\:max-w-96{max-width:calc(calc(var(--spacing)) * 96)}.tw\\:max-w-\\[200px\\]{max-width:200px}.tw\\:max-w-\\[220px\\]{max-width:220px}.tw\\:max-w-\\[calc\\(100\\%-2rem\\)\\]{max-width:calc(100% - 2rem)}.tw\\:max-w-\\[calc\\(100vw-2rem\\)\\]{max-width:calc(100vw - 2rem)}.tw\\:max-w-fit{max-width:fit-content}.tw\\:max-w-full{max-width:100%}.tw\\:max-w-lg{max-width:var(--tw-container-lg)}.tw\\:max-w-md{max-width:var(--tw-container-md)}.tw\\:max-w-none{max-width:none}.tw\\:max-w-sm{max-width:var(--tw-container-sm)}.tw\\:max-w-xs{max-width:var(--tw-container-xs)}.tw\\:min-w-0{min-width:calc(calc(var(--spacing)) * 0)}.tw\\:min-w-4{min-width:calc(calc(var(--spacing)) * 4)}.tw\\:min-w-5{min-width:calc(calc(var(--spacing)) * 5)}.tw\\:min-w-7{min-width:calc(calc(var(--spacing)) * 7)}.tw\\:min-w-8{min-width:calc(calc(var(--spacing)) * 8)}.tw\\:min-w-9{min-width:calc(calc(var(--spacing)) * 9)}.tw\\:min-w-16{min-width:calc(calc(var(--spacing)) * 16)}.tw\\:min-w-32{min-width:calc(calc(var(--spacing)) * 32)}.tw\\:min-w-36{min-width:calc(calc(var(--spacing)) * 36)}.tw\\:min-w-80{min-width:calc(calc(var(--spacing)) * 80)}.tw\\:min-w-\\[12rem\\]{min-width:12rem}.tw\\:min-w-\\[26px\\]{min-width:26px}.tw\\:min-w-\\[96px\\]{min-width:96px}.tw\\:min-w-\\[140px\\]{min-width:140px}.tw\\:min-w-\\[215px\\]{min-width:215px}.tw\\:min-w-\\[500px\\]{min-width:500px}.tw\\:min-w-min{min-width:min-content}.tw\\:flex-1{flex:1}.tw\\:shrink{flex-shrink:1}.tw\\:shrink\\!{flex-shrink:1!important}.tw\\:shrink-0{flex-shrink:0}.tw\\:shrink-\\[9999\\]{flex-shrink:9999}.tw\\:flex-grow,.tw\\:grow,.tw\\:grow-\\[1\\]{flex-grow:1}.tw\\:grow-\\[10\\]{flex-grow:10}.tw\\:basis-0{flex-basis:calc(calc(var(--spacing)) * 0)}.tw\\:table-fixed{table-layout:fixed}.tw\\:caption-bottom{caption-side:bottom}.tw\\:border-collapse{border-collapse:collapse}.tw\\:origin-\\(--radix-context-menu-content-transform-origin\\){transform-origin:var(--radix-context-menu-content-transform-origin)}.tw\\:origin-\\(--radix-dropdown-menu-content-transform-origin\\){transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.tw\\:origin-\\(--radix-menubar-content-transform-origin\\){transform-origin:var(--radix-menubar-content-transform-origin)}.tw\\:origin-\\(--radix-popover-content-transform-origin\\){transform-origin:var(--radix-popover-content-transform-origin)}.tw\\:origin-\\(--radix-select-content-transform-origin\\){transform-origin:var(--radix-select-content-transform-origin)}.tw\\:origin-\\(--radix-tooltip-content-transform-origin\\){transform-origin:var(--radix-tooltip-content-transform-origin)}.tw\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-y-0{--tw-translate-y:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-y-px{--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rotate-45{rotate:45deg}.tw\\:rotate-180{rotate:180deg}.tw\\:transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.tw\\:animate-none\\!{animation:none!important}.tw\\:animate-pulse{animation:var(--tw-animate-pulse)}.tw\\:animate-spin{animation:var(--tw-animate-spin)}.tw\\:cursor-default{cursor:default}.tw\\:cursor-ew-resize{cursor:ew-resize}.tw\\:cursor-not-allowed{cursor:not-allowed}.tw\\:cursor-pointer{cursor:pointer}.tw\\:cursor-text{cursor:text}.tw\\:touch-none{touch-action:none}.tw\\:resize{resize:both}.tw\\:resize-none{resize:none}.tw\\:scroll-m-20{scroll-margin:calc(calc(var(--spacing)) * 20)}.tw\\:scroll-my-1{scroll-margin-block:calc(calc(var(--spacing)) * 1)}.tw\\:scroll-py-1{scroll-padding-block:calc(calc(var(--spacing)) * 1)}.tw\\:list-inside{list-style-position:inside}.tw\\:list-outside{list-style-position:outside}.tw\\:\\!list-\\[lower-alpha\\]{list-style-type:lower-alpha!important}.tw\\:\\!list-\\[lower-roman\\]{list-style-type:lower-roman!important}.tw\\:\\!list-\\[upper-alpha\\]{list-style-type:upper-alpha!important}.tw\\:\\!list-\\[upper-roman\\]{list-style-type:upper-roman!important}.tw\\:\\!list-decimal{list-style-type:decimal!important}.tw\\:\\!list-disc{list-style-type:disc!important}.tw\\:list-decimal{list-style-type:decimal}.tw\\:list-disc{list-style-type:disc}.tw\\:list-none{list-style-type:none}.tw\\:grid-flow-col{grid-auto-flow:column}.tw\\:grid-flow-row{grid-auto-flow:row}.tw\\:auto-rows-min{grid-auto-rows:min-content}.tw\\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.tw\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.tw\\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.tw\\:grid-cols-\\[25\\%_25\\%_50\\%\\]{grid-template-columns:25% 25% 50%}.tw\\:grid-cols-\\[25\\%_50\\%_25\\%\\]{grid-template-columns:25% 50% 25%}.tw\\:grid-cols-\\[auto_auto_auto_auto\\]{grid-template-columns:auto auto auto auto}.tw\\:grid-cols-\\[min-content_1fr\\]{grid-template-columns:min-content 1fr}.tw\\:grid-cols-\\[min-content_min-content_1fr\\]{grid-template-columns:min-content min-content 1fr}.tw\\:grid-cols-subgrid{grid-template-columns:subgrid}.tw\\:flex-col{flex-direction:column}.tw\\:flex-col-reverse{flex-direction:column-reverse}.tw\\:flex-row{flex-direction:row}.tw\\:flex-row-reverse{flex-direction:row-reverse}.tw\\:flex-nowrap{flex-wrap:nowrap}.tw\\:flex-wrap{flex-wrap:wrap}.tw\\:place-content-center{place-content:center}.tw\\:content-center{align-content:center}.tw\\:items-baseline{align-items:baseline}.tw\\:items-center{align-items:center}.tw\\:items-end{align-items:flex-end}.tw\\:items-start{align-items:flex-start}.tw\\:items-stretch{align-items:stretch}.tw\\:justify-between{justify-content:space-between}.tw\\:justify-center{justify-content:center}.tw\\:justify-end{justify-content:flex-end}.tw\\:justify-start{justify-content:flex-start}.tw\\:gap-0{gap:calc(calc(var(--spacing)) * 0)}.tw\\:gap-0\\.5{gap:calc(calc(var(--spacing)) * .5)}.tw\\:gap-1{gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-1\\.5{gap:calc(calc(var(--spacing)) * 1.5)}.tw\\:gap-1\\.5\\!{gap:calc(calc(var(--spacing)) * 1.5)!important}.tw\\:gap-2{gap:calc(calc(var(--spacing)) * 2)}.tw\\:gap-2\\.5{gap:calc(calc(var(--spacing)) * 2.5)}.tw\\:gap-3{gap:calc(calc(var(--spacing)) * 3)}.tw\\:gap-4{gap:calc(calc(var(--spacing)) * 4)}.tw\\:gap-5{gap:calc(calc(var(--spacing)) * 5)}.tw\\:gap-6{gap:calc(calc(var(--spacing)) * 6)}.tw\\:gap-8{gap:calc(calc(var(--spacing)) * 8)}.tw\\:gap-16{gap:calc(calc(var(--spacing)) * 16)}.tw\\:gap-\\[--spacing\\(var\\(--gap\\)\\)\\]{gap:calc(calc(var(--spacing)) * var(--gap))}.tw\\:gap-\\[12px\\]{gap:12px}:where(.tw\\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-1\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 8) * calc(1 - var(--tw-space-y-reverse)))}.tw\\:gap-x-1{column-gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-x-2{column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:gap-x-3{column-gap:calc(calc(var(--spacing)) * 3)}.tw\\:gap-x-4{column-gap:calc(calc(var(--spacing)) * 4)}:where(.tw\\:-space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * -2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * -2) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 3) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 3) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 4) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 6) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 6) * calc(1 - var(--tw-space-x-reverse)))}.tw\\:gap-y-1{row-gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-y-2{row-gap:calc(calc(var(--spacing)) * 2)}:where(.tw\\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.tw\\:divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}.tw\\:self-start{align-self:flex-start}.tw\\:self-stretch{align-self:stretch}.tw\\:justify-self-end{justify-self:flex-end}.tw\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tw\\:overflow-auto{overflow:auto}.tw\\:overflow-clip{overflow:clip}.tw\\:overflow-hidden{overflow:hidden}.tw\\:overflow-scroll{overflow:scroll}.tw\\:overflow-visible{overflow:visible}.tw\\:overflow-x-auto{overflow-x:auto}.tw\\:overflow-x-hidden{overflow-x:hidden}.tw\\:overflow-y-auto{overflow-y:auto}.tw\\:overflow-y-hidden{overflow-y:hidden}.tw\\:rounded{border-radius:.25rem}.tw\\:rounded-2xl{border-radius:calc(var(--radius) * 1.8)}.tw\\:rounded-4xl{border-radius:calc(var(--radius) * 2.6)}.tw\\:rounded-\\[4px\\]{border-radius:4px}.tw\\:rounded-\\[6px\\]{border-radius:6px}.tw\\:rounded-\\[calc\\(var\\(--radius\\)-3px\\)\\]{border-radius:calc(var(--radius) - 3px)}.tw\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,10px\\)\\]{border-radius:min(var(--tw-radius-md), 10px)}.tw\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,12px\\)\\]{border-radius:min(var(--tw-radius-md), 12px)}.tw\\:rounded-full{border-radius:3.40282e38px}.tw\\:rounded-lg{border-radius:var(--radius)}.tw\\:rounded-lg\\!{border-radius:var(--radius)!important}.tw\\:rounded-md{border-radius:calc(var(--radius) * .8)}.tw\\:rounded-none{border-radius:0}.tw\\:rounded-sm{border-radius:calc(var(--radius) * .6)}.tw\\:rounded-xl{border-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-xl\\!{border-radius:calc(var(--radius) * 1.4)!important}.tw\\:rounded-xs{border-radius:var(--tw-radius-xs)}.tw\\:rounded-s-none{border-start-start-radius:0;border-end-start-radius:0}.tw\\:rounded-e-none{border-start-end-radius:0;border-end-end-radius:0}.tw\\:rounded-t-xl{border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-l-lg{border-top-left-radius:var(--radius);border-bottom-left-radius:var(--radius)}.tw\\:rounded-r-xl{border-top-right-radius:calc(var(--radius) * 1.4);border-bottom-right-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-b-xl{border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:border{border-style:var(--tw-border-style);border-width:1px}.tw\\:border-0{border-style:var(--tw-border-style);border-width:0}.tw\\:border-2{border-style:var(--tw-border-style);border-width:2px}.tw\\:border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:border-s-0{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:border-s-2{border-inline-start-style:var(--tw-border-style);border-inline-start-width:2px}.tw\\:border-s-4{border-inline-start-style:var(--tw-border-style);border-inline-start-width:4px}.tw\\:border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.tw\\:border-e-0{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.tw\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.tw\\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.tw\\:border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.tw\\:border-dashed{--tw-border-style:dashed;border-style:dashed}.tw\\:border-none{--tw-border-style:none;border-style:none}.tw\\:border-solid{--tw-border-style:solid;border-style:solid}.tw\\:border-black{border-color:var(--tw-color-black)}.tw\\:border-blue-400{border-color:var(--tw-color-blue-400)}.tw\\:border-blue-500{border-color:var(--tw-color-blue-500)}.tw\\:border-border,.tw\\:border-border\\/50{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-border\\/50{border-color:color-mix(in oklab, var(--border) 50%, transparent)}}.tw\\:border-destructive{border-color:var(--destructive)}.tw\\:border-foreground{border-color:var(--foreground)}.tw\\:border-gray-300{border-color:var(--tw-color-gray-300)}.tw\\:border-input,.tw\\:border-input\\/30{border-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-input\\/30{border-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:border-muted-foreground,.tw\\:border-muted-foreground\\/40{border-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-muted-foreground\\/40{border-color:color-mix(in oklab, var(--muted-foreground) 40%, transparent)}}.tw\\:border-primary{border-color:var(--primary)}.tw\\:border-red-300{border-color:var(--tw-color-red-300)}.tw\\:border-red-400{border-color:var(--tw-color-red-400)}.tw\\:border-red-500{border-color:var(--tw-color-red-500)}.tw\\:border-red-600{border-color:var(--tw-color-red-600)}.tw\\:border-ring{border-color:var(--ring)}.tw\\:border-sidebar-border{border-color:var(--sidebar-border)}.tw\\:border-slate-300{border-color:var(--tw-color-slate-300)}.tw\\:border-transparent{border-color:#0000}.tw\\:border-yellow-400{border-color:var(--tw-color-yellow-400)}.tw\\:border-yellow-500{border-color:var(--tw-color-yellow-500)}.tw\\:border-s-amber-200{border-inline-start-color:var(--tw-color-amber-200)}.tw\\:border-s-indigo-200{border-inline-start-color:var(--tw-color-indigo-200)}.tw\\:border-s-purple-200{border-inline-start-color:var(--tw-color-purple-200)}.tw\\:border-s-red-200{border-inline-start-color:var(--tw-color-red-200)}.tw\\:\\!bg-destructive\\/50{background-color:var(--destructive)!important}@supports (color:color-mix(in lab, red, red)){.tw\\:\\!bg-destructive\\/50{background-color:color-mix(in oklab, var(--destructive) 50%, transparent)!important}}.tw\\:bg-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{background-color:color-mix(in oklab,var(--destructive) 10%,var(--background))}}.tw\\:bg-accent,.tw\\:bg-accent\\/50{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-accent\\/50{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.tw\\:bg-amber-500,.tw\\:bg-amber-500\\/5{background-color:var(--tw-color-amber-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-amber-500\\/5{background-color:color-mix(in oklab, var(--tw-color-amber-500) 5%, transparent)}}.tw\\:bg-amber-500\\/15{background-color:var(--tw-color-amber-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-amber-500\\/15{background-color:color-mix(in oklab, var(--tw-color-amber-500) 15%, transparent)}}.tw\\:bg-background,.tw\\:bg-background\\/50{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-background\\/50{background-color:color-mix(in oklab, var(--background) 50%, transparent)}}.tw\\:bg-black\\/10{background-color:var(--tw-color-black)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-black\\/10{background-color:color-mix(in oklab, var(--tw-color-black) 10%, transparent)}}.tw\\:bg-blue-50{background-color:var(--tw-color-blue-50)}.tw\\:bg-blue-100{background-color:var(--tw-color-blue-100)}.tw\\:bg-blue-400{background-color:var(--tw-color-blue-400)}.tw\\:bg-blue-500{background-color:var(--tw-color-blue-500)}.tw\\:bg-border{background-color:var(--border)}.tw\\:bg-card{background-color:var(--card)}.tw\\:bg-destructive\\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-destructive\\/10{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.tw\\:bg-foreground{background-color:var(--foreground)}.tw\\:bg-gray-50{background-color:var(--tw-color-gray-50)}.tw\\:bg-gray-100{background-color:var(--tw-color-gray-100)}.tw\\:bg-gray-500{background-color:var(--tw-color-gray-500)}.tw\\:bg-green-50{background-color:var(--tw-color-green-50)}.tw\\:bg-green-100{background-color:var(--tw-color-green-100)}.tw\\:bg-green-500{background-color:var(--tw-color-green-500)}.tw\\:bg-input,.tw\\:bg-input\\/30{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-input\\/30{background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:bg-muted,.tw\\:bg-muted\\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-muted\\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:bg-neutral-300{background-color:var(--tw-color-neutral-300)}.tw\\:bg-orange-100{background-color:var(--tw-color-orange-100)}.tw\\:bg-popover,.tw\\:bg-popover\\/70{background-color:var(--popover)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-popover\\/70{background-color:color-mix(in oklab, var(--popover) 70%, transparent)}}.tw\\:bg-primary{background-color:var(--primary)}.tw\\:bg-primary-foreground{background-color:var(--primary-foreground)}.tw\\:bg-primary\\/30{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-primary\\/30{background-color:color-mix(in oklab, var(--primary) 30%, transparent)}}.tw\\:bg-purple-50{background-color:var(--tw-color-purple-50)}.tw\\:bg-red-100{background-color:var(--tw-color-red-100)}.tw\\:bg-red-500{background-color:var(--tw-color-red-500)}.tw\\:bg-rose-500,.tw\\:bg-rose-500\\/5{background-color:var(--tw-color-rose-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-rose-500\\/5{background-color:color-mix(in oklab, var(--tw-color-rose-500) 5%, transparent)}}.tw\\:bg-rose-500\\/15{background-color:var(--tw-color-rose-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-rose-500\\/15{background-color:color-mix(in oklab, var(--tw-color-rose-500) 15%, transparent)}}.tw\\:bg-secondary{background-color:var(--secondary)}.tw\\:bg-sidebar{background-color:var(--sidebar)}.tw\\:bg-sidebar-accent{background-color:var(--sidebar-accent)}.tw\\:bg-sidebar-border{background-color:var(--sidebar-border)}.tw\\:bg-sky-500,.tw\\:bg-sky-500\\/5{background-color:var(--tw-color-sky-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-sky-500\\/5{background-color:color-mix(in oklab, var(--tw-color-sky-500) 5%, transparent)}}.tw\\:bg-sky-500\\/15{background-color:var(--tw-color-sky-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-sky-500\\/15{background-color:color-mix(in oklab, var(--tw-color-sky-500) 15%, transparent)}}.tw\\:bg-teal-500,.tw\\:bg-teal-500\\/5{background-color:var(--tw-color-teal-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-teal-500\\/5{background-color:color-mix(in oklab, var(--tw-color-teal-500) 5%, transparent)}}.tw\\:bg-teal-500\\/15{background-color:var(--tw-color-teal-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-teal-500\\/15{background-color:color-mix(in oklab, var(--tw-color-teal-500) 15%, transparent)}}.tw\\:bg-transparent{background-color:#0000}.tw\\:bg-white{background-color:var(--tw-color-white)}.tw\\:bg-yellow-50{background-color:var(--tw-color-yellow-50)}.tw\\:bg-yellow-100{background-color:var(--tw-color-yellow-100)}.tw\\:bg-yellow-500{background-color:var(--tw-color-yellow-500)}.tw\\:bg-zinc-400{background-color:var(--tw-color-zinc-400)}.tw\\:bg-clip-padding{background-clip:padding-box}.tw\\:fill-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{fill:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:fill-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{fill:color-mix(in oklab,var(--destructive) 10%,var(--background))}}.tw\\:fill-destructive{fill:var(--destructive)}.tw\\:fill-foreground{fill:var(--foreground)}.tw\\:fill-yellow-400,.tw\\:fill-yellow-400\\/50{fill:var(--tw-color-yellow-400)}@supports (color:color-mix(in lab, red, red)){.tw\\:fill-yellow-400\\/50{fill:color-mix(in oklab, var(--tw-color-yellow-400) 50%, transparent)}}.tw\\:object-cover{object-fit:cover}.tw\\:\\!p-4{padding:calc(calc(var(--spacing)) * 4)!important}.tw\\:p-0{padding:calc(calc(var(--spacing)) * 0)}.tw\\:p-0\\.5{padding:calc(calc(var(--spacing)) * .5)}.tw\\:p-1{padding:calc(calc(var(--spacing)) * 1)}.tw\\:p-2{padding:calc(calc(var(--spacing)) * 2)}.tw\\:p-2\\.5{padding:calc(calc(var(--spacing)) * 2.5)}.tw\\:p-3{padding:calc(calc(var(--spacing)) * 3)}.tw\\:p-4{padding:calc(calc(var(--spacing)) * 4)}.tw\\:p-6{padding:calc(calc(var(--spacing)) * 6)}.tw\\:p-8{padding:calc(calc(var(--spacing)) * 8)}.tw\\:p-\\[1px\\]{padding:1px}.tw\\:p-\\[3px\\]{padding:3px}.tw\\:p-\\[10px\\]{padding:10px}.tw\\:p-\\[16px\\]{padding:16px}.tw\\:px-0{padding-inline:calc(calc(var(--spacing)) * 0)}.tw\\:px-0\\.5{padding-inline:calc(calc(var(--spacing)) * .5)}.tw\\:px-1{padding-inline:calc(calc(var(--spacing)) * 1)}.tw\\:px-1\\.5{padding-inline:calc(calc(var(--spacing)) * 1.5)}.tw\\:px-2{padding-inline:calc(calc(var(--spacing)) * 2)}.tw\\:px-2\\.5{padding-inline:calc(calc(var(--spacing)) * 2.5)}.tw\\:px-3{padding-inline:calc(calc(var(--spacing)) * 3)}.tw\\:px-4{padding-inline:calc(calc(var(--spacing)) * 4)}.tw\\:px-6{padding-inline:calc(calc(var(--spacing)) * 6)}.tw\\:py-0{padding-block:calc(calc(var(--spacing)) * 0)}.tw\\:py-0\\.5{padding-block:calc(calc(var(--spacing)) * .5)}.tw\\:py-1{padding-block:calc(calc(var(--spacing)) * 1)}.tw\\:py-1\\.5{padding-block:calc(calc(var(--spacing)) * 1.5)}.tw\\:py-2{padding-block:calc(calc(var(--spacing)) * 2)}.tw\\:py-3{padding-block:calc(calc(var(--spacing)) * 3)}.tw\\:py-4{padding-block:calc(calc(var(--spacing)) * 4)}.tw\\:py-6{padding-block:calc(calc(var(--spacing)) * 6)}.tw\\:py-8{padding-block:calc(calc(var(--spacing)) * 8)}.tw\\:py-\\[2px\\]{padding-block:2px}.tw\\:ps-1\\.5{padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:ps-2{padding-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:ps-2\\.5{padding-inline-start:calc(calc(var(--spacing)) * 2.5)}.tw\\:ps-4{padding-inline-start:calc(calc(var(--spacing)) * 4)}.tw\\:ps-6{padding-inline-start:calc(calc(var(--spacing)) * 6)}.tw\\:ps-7{padding-inline-start:calc(calc(var(--spacing)) * 7)}.tw\\:ps-8{padding-inline-start:calc(calc(var(--spacing)) * 8)}.tw\\:ps-9{padding-inline-start:calc(calc(var(--spacing)) * 9)}.tw\\:ps-12{padding-inline-start:calc(calc(var(--spacing)) * 12)}.tw\\:ps-\\[85px\\]{padding-inline-start:85px}.tw\\:pe-1{padding-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:pe-1\\.5{padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:pe-2{padding-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:pe-4{padding-inline-end:calc(calc(var(--spacing)) * 4)}.tw\\:pe-8{padding-inline-end:calc(calc(var(--spacing)) * 8)}.tw\\:pe-8\\!{padding-inline-end:calc(calc(var(--spacing)) * 8)!important}.tw\\:pe-9{padding-inline-end:calc(calc(var(--spacing)) * 9)}.tw\\:pe-\\[calc\\(138px\\+1rem\\)\\]{padding-inline-end:calc(138px + 1rem)}.tw\\:pe-\\[…\\]{padding-inline-end:…}.tw\\:pt-1{padding-top:calc(calc(var(--spacing)) * 1)}.tw\\:pt-2{padding-top:calc(calc(var(--spacing)) * 2)}.tw\\:pt-3{padding-top:calc(calc(var(--spacing)) * 3)}.tw\\:pt-4{padding-top:calc(calc(var(--spacing)) * 4)}.tw\\:pt-6{padding-top:calc(calc(var(--spacing)) * 6)}.tw\\:pr-0{padding-right:calc(calc(var(--spacing)) * 0)}.tw\\:pr-3{padding-right:calc(calc(var(--spacing)) * 3)}.tw\\:pr-4{padding-right:calc(calc(var(--spacing)) * 4)}.tw\\:pb-0{padding-bottom:calc(calc(var(--spacing)) * 0)}.tw\\:pb-1{padding-bottom:calc(calc(var(--spacing)) * 1)}.tw\\:pb-2{padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:pb-3{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:pb-4{padding-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:pb-8{padding-bottom:calc(calc(var(--spacing)) * 8)}.tw\\:pb-12{padding-bottom:calc(calc(var(--spacing)) * 12)}.tw\\:pb-16{padding-bottom:calc(calc(var(--spacing)) * 16)}.tw\\:pb-24{padding-bottom:calc(calc(var(--spacing)) * 24)}.tw\\:pl-2{padding-left:calc(calc(var(--spacing)) * 2)}.tw\\:pl-3{padding-left:calc(calc(var(--spacing)) * 3)}.tw\\:pl-4{padding-left:calc(calc(var(--spacing)) * 4)}.tw\\:pl-5{padding-left:calc(calc(var(--spacing)) * 5)}.tw\\:pl-6{padding-left:calc(calc(var(--spacing)) * 6)}.tw\\:pl-8{padding-left:calc(calc(var(--spacing)) * 8)}.tw\\:text-center{text-align:center}.tw\\:text-end{text-align:end}.tw\\:text-left{text-align:left}.tw\\:text-right{text-align:right}.tw\\:text-start{text-align:start}.tw\\:align-middle{vertical-align:middle}.tw\\:font-heading{font-family:var(--font-sans)}.tw\\:font-mono{font-family:var(--tw-font-mono)}.tw\\:font-sans{font-family:IBM Plex Sans Variable,sans-serif}.tw\\:text-2xl{font-size:var(--tw-text-2xl);line-height:var(--tw-leading,var(--tw-text-2xl--line-height))}.tw\\:text-3xl{font-size:var(--tw-text-3xl);line-height:var(--tw-leading,var(--tw-text-3xl--line-height))}.tw\\:text-4xl{font-size:var(--tw-text-4xl);line-height:var(--tw-leading,var(--tw-text-4xl--line-height))}.tw\\:text-base{font-size:var(--tw-text-base);line-height:var(--tw-leading,var(--tw-text-base--line-height))}.tw\\:text-lg{font-size:var(--tw-text-lg);line-height:var(--tw-leading,var(--tw-text-lg--line-height))}.tw\\:text-sm{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:text-sm\\/relaxed{font-size:var(--tw-text-sm);line-height:var(--tw-leading-relaxed)}.tw\\:text-xl{font-size:var(--tw-text-xl);line-height:var(--tw-leading,var(--tw-text-xl--line-height))}.tw\\:text-xs{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:text-\\[0\\.8rem\\]{font-size:.8rem}.tw\\:leading-6{--tw-leading:calc(calc(var(--spacing)) * 6);line-height:calc(calc(var(--spacing)) * 6)}.tw\\:leading-loose{--tw-leading:var(--tw-leading-loose);line-height:var(--tw-leading-loose)}.tw\\:leading-none{--tw-leading:1;line-height:1}.tw\\:leading-relaxed{--tw-leading:var(--tw-leading-relaxed);line-height:var(--tw-leading-relaxed)}.tw\\:leading-snug{--tw-leading:var(--tw-leading-snug);line-height:var(--tw-leading-snug)}.tw\\:leading-tight{--tw-leading:var(--tw-leading-tight);line-height:var(--tw-leading-tight)}.tw\\:font-bold{--tw-font-weight:var(--tw-font-weight-bold);font-weight:var(--tw-font-weight-bold)}.tw\\:font-extrabold{--tw-font-weight:var(--tw-font-weight-extrabold);font-weight:var(--tw-font-weight-extrabold)}.tw\\:font-medium{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:font-normal{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:font-semibold{--tw-font-weight:var(--tw-font-weight-semibold);font-weight:var(--tw-font-weight-semibold)}.tw\\:tracking-tight{--tw-tracking:var(--tw-tracking-tight);letter-spacing:var(--tw-tracking-tight)}.tw\\:tracking-wider{--tw-tracking:var(--tw-tracking-wider);letter-spacing:var(--tw-tracking-wider)}.tw\\:tracking-widest{--tw-tracking:var(--tw-tracking-widest);letter-spacing:var(--tw-tracking-widest)}.tw\\:text-balance{text-wrap:balance}.tw\\:text-nowrap{text-wrap:nowrap}.tw\\:break-words{overflow-wrap:break-word}.tw\\:text-clip{text-overflow:clip}.tw\\:text-ellipsis{text-overflow:ellipsis}.tw\\:whitespace-normal{white-space:normal}.tw\\:whitespace-nowrap{white-space:nowrap}.tw\\:whitespace-pre{white-space:pre}.tw\\:whitespace-pre-line{white-space:pre-line}.tw\\:whitespace-pre-wrap{white-space:pre-wrap}.tw\\:\\[color\\:blue\\]{color:#00f}.tw\\:text-accent-foreground{color:var(--accent-foreground)}.tw\\:text-amber-600{color:var(--tw-color-amber-600)}.tw\\:text-background{color:var(--background)}.tw\\:text-blue-400{color:var(--tw-color-blue-400)}.tw\\:text-blue-500{color:var(--tw-color-blue-500)}.tw\\:text-blue-600{color:var(--tw-color-blue-600)}.tw\\:text-blue-800{color:var(--tw-color-blue-800)}.tw\\:text-card-foreground{color:var(--card-foreground)}.tw\\:text-current{color:currentColor}.tw\\:text-destructive{color:var(--destructive)}.tw\\:text-foreground{color:var(--foreground)}.tw\\:text-foreground\\!{color:var(--foreground)!important}.tw\\:text-foreground\\/30{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/30{color:color-mix(in oklab, var(--foreground) 30%, transparent)}}.tw\\:text-foreground\\/50{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/50{color:color-mix(in oklab, var(--foreground) 50%, transparent)}}.tw\\:text-foreground\\/60{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/60{color:color-mix(in oklab, var(--foreground) 60%, transparent)}}.tw\\:text-foreground\\/70{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/70{color:color-mix(in oklab, var(--foreground) 70%, transparent)}}.tw\\:text-gray-300{color:var(--tw-color-gray-300)}.tw\\:text-gray-500{color:var(--tw-color-gray-500)}.tw\\:text-gray-600{color:var(--tw-color-gray-600)}.tw\\:text-gray-700{color:var(--tw-color-gray-700)}.tw\\:text-gray-800{color:var(--tw-color-gray-800)}.tw\\:text-green-600{color:var(--tw-color-green-600)}.tw\\:text-green-700{color:var(--tw-color-green-700)}.tw\\:text-green-800{color:var(--tw-color-green-800)}.tw\\:text-inherit{color:inherit}.tw\\:text-muted-foreground,.tw\\:text-muted-foreground\\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-muted-foreground\\/50{color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.tw\\:text-orange-800{color:var(--tw-color-orange-800)}.tw\\:text-popover-foreground{color:var(--popover-foreground)}.tw\\:text-primary{color:var(--primary)}.tw\\:text-primary-foreground{color:var(--primary-foreground)}.tw\\:text-purple-900{color:var(--tw-color-purple-900)}.tw\\:text-red-500{color:var(--tw-color-red-500)}.tw\\:text-red-600{color:var(--tw-color-red-600)}.tw\\:text-red-700{color:var(--tw-color-red-700)}.tw\\:text-red-800{color:var(--tw-color-red-800)}.tw\\:text-rose-600{color:var(--tw-color-rose-600)}.tw\\:text-secondary-foreground{color:var(--secondary-foreground)}.tw\\:text-sidebar-accent-foreground{color:var(--sidebar-accent-foreground)}.tw\\:text-sidebar-foreground,.tw\\:text-sidebar-foreground\\/70{color:var(--sidebar-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-sidebar-foreground\\/70{color:color-mix(in oklab, var(--sidebar-foreground) 70%, transparent)}}.tw\\:text-sky-600{color:var(--tw-color-sky-600)}.tw\\:text-slate-900{color:var(--tw-color-slate-900)}.tw\\:text-teal-600{color:var(--tw-color-teal-600)}.tw\\:text-white{color:var(--tw-color-white)}.tw\\:text-yellow-400{color:var(--tw-color-yellow-400)}.tw\\:text-yellow-600{color:var(--tw-color-yellow-600)}.tw\\:text-yellow-700{color:var(--tw-color-yellow-700)}.tw\\:capitalize{text-transform:capitalize}.tw\\:uppercase{text-transform:uppercase}.tw\\:italic{font-style:italic}.tw\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tw\\:line-through{text-decoration-line:line-through}.tw\\:underline{text-decoration-line:underline}.tw\\:decoration-destructive{-webkit-text-decoration-color:var(--destructive);-webkit-text-decoration-color:var(--destructive);text-decoration-color:var(--destructive)}.tw\\:underline-offset-4{text-underline-offset:4px}.tw\\:opacity-0{opacity:0}.tw\\:opacity-40{opacity:.4}.tw\\:opacity-50{opacity:.5}.tw\\:opacity-60{opacity:.6}.tw\\:opacity-100{opacity:1}.tw\\:bg-blend-color{background-blend-mode:color}.tw\\:shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-\\[0_0_0_1px_var\\(--sidebar-border\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-border));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-none\\!{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.tw\\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-background{--tw-ring-color:var(--background)}.tw\\:ring-foreground\\/10{--tw-ring-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:ring-foreground\\/10{--tw-ring-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}.tw\\:ring-primary{--tw-ring-color:var(--primary)}.tw\\:ring-ring\\/50{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:ring-ring\\/50{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:ring-sidebar-ring{--tw-ring-color:var(--sidebar-ring)}.tw\\:ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:ring-offset-background{--tw-ring-offset-color:var(--background)}.tw\\:ring-offset-white{--tw-ring-offset-color:var(--tw-color-white)}.tw\\:outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:outline-hidden{outline-offset:2px;outline:2px solid #0000}}.tw\\:drop-shadow-sm{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--tw-drop-shadow-sm));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.tw\\:transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[color\\,box-shadow\\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[left\\,right\\,width\\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[margin\\,opacity\\]{transition-property:margin,opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[width\\,height\\,padding\\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-none{transition-property:none}.tw\\:duration-100{--tw-duration:.1s;transition-duration:.1s}.tw\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.tw\\:ease-linear{--tw-ease:linear;transition-timing-function:linear}.tw\\:prose-quoteless :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose-quoteless :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.tw\\:outline-none{--tw-outline-style:none;outline-style:none}.tw\\:select-none{-webkit-user-select:none;user-select:none}.tw\\:\\[unicode-bidi\\:plaintext\\]{unicode-bidi:plaintext}.tw\\:group-focus-within\\/menu-item\\:opacity-100:is(:where(.tw\\:group\\/menu-item):focus-within *){opacity:1}@media (hover:hover){.tw\\:group-hover\\:visible:is(:where(.tw\\:group):hover *){visibility:visible}.tw\\:group-hover\\:hidden:is(:where(.tw\\:group):hover *){display:none}.tw\\:group-hover\\:opacity-100:is(:where(.tw\\:group):hover *),.tw\\:group-hover\\/menu-item\\:opacity-100:is(:where(.tw\\:group\\/menu-item):hover *){opacity:1}}.tw\\:group-focus\\/context-menu-item\\:text-accent-foreground:is(:where(.tw\\:group\\/context-menu-item):focus *),.tw\\:group-focus\\/dropdown-menu-item\\:text-accent-foreground:is(:where(.tw\\:group\\/dropdown-menu-item):focus *),.tw\\:group-focus\\/menubar-item\\:text-accent-foreground:is(:where(.tw\\:group\\/menubar-item):focus *){color:var(--accent-foreground)}.tw\\:group-has-disabled\\/field\\:opacity-50:is(:where(.tw\\:group\\/field):has(:disabled) *){opacity:.5}.tw\\:group-has-data-\\[sidebar\\=menu-action\\]\\/menu-item\\:pe-8:is(:where(.tw\\:group\\/menu-item):has([data-sidebar=menu-action]) *){padding-inline-end:calc(calc(var(--spacing)) * 8)}.tw\\:group-has-data-\\[size\\=lg\\]\\/avatar-group\\:size-10:is(:where(.tw\\:group\\/avatar-group):has([data-size=lg]) *){width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:group-has-data-\\[size\\=sm\\]\\/avatar-group\\:size-6:is(:where(.tw\\:group\\/avatar-group):has([data-size=sm]) *){width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:group-has-data-\\[slot\\=command-shortcut\\]\\/command-item\\:hidden:is(:where(.tw\\:group\\/command-item):has([data-slot=command-shortcut]) *){display:none}.tw\\:group-has-\\[\\>input\\]\\/input-group\\:pt-2:is(:where(.tw\\:group\\/input-group):has(>input) *){padding-top:calc(calc(var(--spacing)) * 2)}.tw\\:group-has-\\[\\>input\\]\\/input-group\\:pb-2:is(:where(.tw\\:group\\/input-group):has(>input) *){padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:group-has-\\[\\>svg\\]\\/alert\\:col-start-2:is(:where(.tw\\:group\\/alert):has(>svg) *){grid-column-start:2}.tw\\:group-data-\\[checked\\=true\\]\\/command-item\\:opacity-100:is(:where(.tw\\:group\\/command-item)[data-checked=true] *){opacity:1}.tw\\:group-data-\\[collapsible\\=icon\\]\\:-mt-8:is(:where(.tw\\:group)[data-collapsible=icon] *){margin-top:calc(calc(var(--spacing)) * -8)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:hidden:is(:where(.tw\\:group)[data-collapsible=icon] *){display:none}.tw\\:group-data-\\[collapsible\\=icon\\]\\:size-8\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(calc(var(--spacing)) * 8)!important;height:calc(calc(var(--spacing)) * 8)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\(--sidebar-width-icon\\):is(:where(.tw\\:group)[data-collapsible=icon] *){width:var(--sidebar-width-icon)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\)\\]:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(calc(var(--spacing)) * 4)))}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\+2px\\)\\]:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(calc(var(--spacing)) * 4)) + 2px)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:overflow-hidden:is(:where(.tw\\:group)[data-collapsible=icon] *){overflow:hidden}.tw\\:group-data-\\[collapsible\\=icon\\]\\:p-0\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){padding:calc(calc(var(--spacing)) * 0)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:p-2\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){padding:calc(calc(var(--spacing)) * 2)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:opacity-0:is(:where(.tw\\:group)[data-collapsible=icon] *){opacity:0}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:right-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\]:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:left-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\]:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:w-0:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){width:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:translate-x-0:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:group-data-\\[disabled\\=true\\]\\:pointer-events-none:is(:where(.tw\\:group)[data-disabled=true] *){pointer-events:none}.tw\\:group-data-\\[disabled\\=true\\]\\:opacity-50:is(:where(.tw\\:group)[data-disabled=true] *),.tw\\:group-data-\\[disabled\\=true\\]\\/input-group\\:opacity-50:is(:where(.tw\\:group\\/input-group)[data-disabled=true] *){opacity:.5}.tw\\:group-data-\\[side\\=primary\\]\\:-right-4:is(:where(.tw\\:group)[data-side=primary] *){right:calc(calc(var(--spacing)) * -4)}.tw\\:group-data-\\[side\\=primary\\]\\:border-e:is(:where(.tw\\:group)[data-side=primary] *){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.tw\\:group-data-\\[side\\=secondary\\]\\:left-0:is(:where(.tw\\:group)[data-side=secondary] *){left:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-\\[side\\=secondary\\]\\:rotate-180:is(:where(.tw\\:group)[data-side=secondary] *){rotate:180deg}.tw\\:group-data-\\[side\\=secondary\\]\\:border-s:is(:where(.tw\\:group)[data-side=secondary] *){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:group-data-\\[size\\=default\\]\\/avatar\\:size-2\\.5:is(:where(.tw\\:group\\/avatar)[data-size=default] *){width:calc(calc(var(--spacing)) * 2.5);height:calc(calc(var(--spacing)) * 2.5)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:size-4:is(:where(.tw\\:group\\/switch)[data-size=default] *){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[size\\=lg\\]\\/avatar\\:size-3:is(:where(.tw\\:group\\/avatar)[data-size=lg] *){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=sm] *){width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:text-xs:is(:where(.tw\\:group\\/avatar)[data-size=sm] *){font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:p-3:is(:where(.tw\\:group\\/card)[data-size=sm] *){padding:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:px-3:is(:where(.tw\\:group\\/card)[data-size=sm] *){padding-inline:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:text-sm:is(:where(.tw\\:group\\/card)[data-size=sm] *){font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:size-3:is(:where(.tw\\:group\\/switch)[data-size=sm] *){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:rounded-none:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *){border-radius:0}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:px-2:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *){padding-inline:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[variant\\=floating\\]\\:rounded-lg:is(:where(.tw\\:group)[data-variant=floating] *){border-radius:var(--radius)}.tw\\:group-data-\\[variant\\=floating\\]\\:shadow-sm:is(:where(.tw\\:group)[data-variant=floating] *){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=floating\\]\\:ring-1:is(:where(.tw\\:group)[data-variant=floating] *){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=floating\\]\\:ring-sidebar-border:is(:where(.tw\\:group)[data-variant=floating] *){--tw-ring-color:var(--sidebar-border)}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *){background-color:#0000}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:mx-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){margin-inline:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:mt-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){margin-top:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:h-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){height:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:w-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){width:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:text-center:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){text-align:center}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:my-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){margin-block:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:me-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){margin-inline-end:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:h-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){height:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:w-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){width:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:my-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){margin-block:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:ms-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){margin-inline-start:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:h-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){height:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:w-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){width:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:mx-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){margin-inline:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:mb-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:h-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){height:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:w-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){width:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:text-center:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){text-align:center}.tw\\:group-data-selected\\/command-item\\:text-foreground:is(:where(.tw\\:group\\/command-item):where([data-selected=true]) *){color:var(--foreground)}.tw\\:group-data-horizontal\\/tabs\\:h-8:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *){height:calc(calc(var(--spacing)) * 8)}.tw\\:group-data-vertical\\/tabs\\:h-fit:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){height:fit-content}.tw\\:group-data-vertical\\/tabs\\:w-full:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){width:100%}.tw\\:group-data-vertical\\/tabs\\:flex-col:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){flex-direction:column}.tw\\:group-data-vertical\\/tabs\\:justify-start:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){justify-content:flex-start}@media (hover:hover){.tw\\:peer-hover\\/menu-button\\:text-sidebar-accent-foreground:is(:where(.tw\\:peer\\/menu-button):hover~*){color:var(--sidebar-accent-foreground)}.tw\\:peer-focus\\:group-hover\\:text-blue-500:is(:where(.tw\\:peer):focus~*):is(:where(.tw\\:group):hover *){color:var(--tw-color-blue-500)}}.tw\\:peer-disabled\\:cursor-not-allowed:is(:where(.tw\\:peer):disabled~*){cursor:not-allowed}.tw\\:peer-disabled\\:opacity-50:is(:where(.tw\\:peer):disabled~*){opacity:.5}.tw\\:peer-data-\\[size\\=default\\]\\/menu-button\\:top-1\\.5:is(:where(.tw\\:peer\\/menu-button)[data-size=default]~*){top:calc(calc(var(--spacing)) * 1.5)}.tw\\:peer-data-\\[size\\=lg\\]\\/menu-button\\:top-2\\.5:is(:where(.tw\\:peer\\/menu-button)[data-size=lg]~*){top:calc(calc(var(--spacing)) * 2.5)}.tw\\:peer-data-\\[size\\=sm\\]\\/menu-button\\:top-1:is(:where(.tw\\:peer\\/menu-button)[data-size=sm]~*){top:calc(calc(var(--spacing)) * 1)}.tw\\:peer-data-active\\/menu-button\\:text-sidebar-accent-foreground:is(:is(:where(.tw\\:peer\\/menu-button):where([data-state=active]),:where(.tw\\:peer\\/menu-button):where([data-active]:not([data-active=false])))~*){color:var(--sidebar-accent-foreground)}.tw\\:file\\:inline-flex::file-selector-button{display:inline-flex}.tw\\:file\\:h-6::file-selector-button{height:calc(calc(var(--spacing)) * 6)}.tw\\:file\\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.tw\\:file\\:bg-transparent::file-selector-button{background-color:#0000}.tw\\:file\\:text-sm::file-selector-button{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:file\\:font-medium::file-selector-button{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:file\\:text-foreground::file-selector-button{color:var(--foreground)}.tw\\:placeholder\\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.tw\\:placeholder\\:text-slate-400::placeholder{color:var(--tw-color-slate-400)}.tw\\:before\\:absolute:before{content:var(--tw-content);position:absolute}.tw\\:before\\:top-0\\.5:before{content:var(--tw-content);top:calc(calc(var(--spacing)) * .5)}.tw\\:before\\:left-0:before{content:var(--tw-content);left:calc(calc(var(--spacing)) * 0)}.tw\\:before\\:block:before{content:var(--tw-content);display:block}.tw\\:before\\:hidden:before{content:var(--tw-content);display:none}.tw\\:before\\:h-4:before{content:var(--tw-content);height:calc(calc(var(--spacing)) * 4)}.tw\\:before\\:w-4:before{content:var(--tw-content);width:calc(calc(var(--spacing)) * 4)}.tw\\:before\\:cursor-pointer:before{content:var(--tw-content);cursor:pointer}.tw\\:before\\:rounded:before{content:var(--tw-content);border-radius:.25rem}.tw\\:before\\:border:before{content:var(--tw-content);border-style:var(--tw-border-style);border-width:1px}.tw\\:before\\:border-primary:before{content:var(--tw-content);border-color:var(--primary)}.tw\\:before\\:bg-primary:before{content:var(--tw-content);background-color:var(--primary)}.tw\\:before\\:bg-cover:before{content:var(--tw-content);background-size:cover}.tw\\:before\\:bg-no-repeat:before{content:var(--tw-content);background-repeat:no-repeat}.tw\\:before\\:content-\\[\\"\\"\\]:before{--tw-content:"";content:var(--tw-content)}.tw\\:before\\:content-\\[\\\\\\"\\\\\\"\\]:before{--tw-content:\\"\\";content:var(--tw-content)}.tw\\:after\\:absolute:after{content:var(--tw-content);position:absolute}.tw\\:after\\:-inset-2:after{content:var(--tw-content);inset:calc(calc(var(--spacing)) * -2)}.tw\\:after\\:inset-0:after{content:var(--tw-content);inset:calc(calc(var(--spacing)) * 0)}.tw\\:after\\:-inset-x-3:after{content:var(--tw-content);inset-inline:calc(calc(var(--spacing)) * -3)}.tw\\:after\\:-inset-y-2:after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * -2)}.tw\\:after\\:inset-y-0:after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:after\\:start-1\\/2:after{content:var(--tw-content);inset-inline-start:50%}.tw\\:after\\:top-\\[6px\\]:after{content:var(--tw-content);top:6px}.tw\\:after\\:right-\\[7px\\]:after{content:var(--tw-content);right:7px}.tw\\:after\\:left-\\[7px\\]:after{content:var(--tw-content);left:7px}.tw\\:after\\:block:after{content:var(--tw-content);display:block}.tw\\:after\\:hidden:after{content:var(--tw-content);display:none}.tw\\:after\\:h-0\\.5:after{content:var(--tw-content);height:calc(calc(var(--spacing)) * .5)}.tw\\:after\\:h-\\[6px\\]:after{content:var(--tw-content);height:6px}.tw\\:after\\:w-1:after{content:var(--tw-content);width:calc(calc(var(--spacing)) * 1)}.tw\\:after\\:w-\\[2px\\]:after{content:var(--tw-content);width:2px}.tw\\:after\\:w-\\[3px\\]:after{content:var(--tw-content);width:3px}.tw\\:after\\:-translate-x-1\\/2:after{content:var(--tw-content);--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:after\\:rotate-45:after{content:var(--tw-content);rotate:45deg}.tw\\:after\\:cursor-pointer:after{content:var(--tw-content);cursor:pointer}.tw\\:after\\:rounded-full:after{content:var(--tw-content);border-radius:3.40282e38px}.tw\\:after\\:border:after{content:var(--tw-content);border-style:var(--tw-border-style);border-width:1px}.tw\\:after\\:border-t-0:after{content:var(--tw-content);border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:after\\:border-r-2:after{content:var(--tw-content);border-right-style:var(--tw-border-style);border-right-width:2px}.tw\\:after\\:border-b-2:after{content:var(--tw-content);border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.tw\\:after\\:border-l-0:after{content:var(--tw-content);border-left-style:var(--tw-border-style);border-left-width:0}.tw\\:after\\:border-solid:after{content:var(--tw-content);--tw-border-style:solid;border-style:solid}.tw\\:after\\:border-border:after{content:var(--tw-content);border-color:var(--border)}.tw\\:after\\:border-white:after{content:var(--tw-content);border-color:var(--tw-color-white)}.tw\\:after\\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.tw\\:after\\:bg-muted:after{content:var(--tw-content);background-color:var(--muted)}.tw\\:after\\:opacity-0:after{content:var(--tw-content);opacity:0}.tw\\:after\\:mix-blend-darken:after{content:var(--tw-content);mix-blend-mode:darken}.tw\\:after\\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:after\\:content-\\[\\"\\"\\]:after{--tw-content:"";content:var(--tw-content)}.tw\\:after\\:content-\\[\\\\\\"\\\\\\"\\]:after{--tw-content:\\"\\";content:var(--tw-content)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:after\\:start-full:is(:where(.tw\\:group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);inset-inline-start:100%}.tw\\:group-data-horizontal\\/tabs\\:after\\:inset-x-0:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-horizontal\\/tabs\\:after\\:bottom-\\[-5px\\]:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);bottom:-5px}.tw\\:group-data-horizontal\\/tabs\\:after\\:h-0\\.5:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);height:calc(calc(var(--spacing)) * .5)}.tw\\:group-data-vertical\\/tabs\\:after\\:inset-y-0:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-vertical\\/tabs\\:after\\:-end-1:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);inset-inline-end:calc(calc(var(--spacing)) * -1)}.tw\\:group-data-vertical\\/tabs\\:after\\:w-0\\.5:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);width:calc(calc(var(--spacing)) * .5)}.tw\\:first\\:mt-0:first-child{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:last\\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:even\\:bg-muted:nth-child(2n){background-color:var(--muted)}.tw\\:focus-within\\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-within\\:ring-ring:focus-within{--tw-ring-color:var(--ring)}.tw\\:focus-within\\:ring-offset-1:focus-within{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}@media (hover:hover){.tw\\:hover\\:-mt-4:hover{margin-top:calc(calc(var(--spacing)) * -4)}.tw\\:hover\\:cursor-pointer:hover{cursor:pointer}.tw\\:hover\\:bg-accent:hover,.tw\\:hover\\:bg-accent\\/30:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-accent\\/30:hover{background-color:color-mix(in oklab, var(--accent) 30%, transparent)}}.tw\\:hover\\:bg-accent\\/80:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-accent\\/80:hover{background-color:color-mix(in oklab, var(--accent) 80%, transparent)}}.tw\\:hover\\:bg-blue-600:hover{background-color:var(--tw-color-blue-600)}.tw\\:hover\\:bg-destructive\\/20:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-destructive\\/20:hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:hover\\:bg-gray-50:hover{background-color:var(--tw-color-gray-50)}.tw\\:hover\\:bg-input:hover{background-color:var(--input)}.tw\\:hover\\:bg-muted:hover,.tw\\:hover\\:bg-muted\\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-muted\\/50:hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:hover\\:bg-muted\\/80:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-muted\\/80:hover{background-color:color-mix(in oklab, var(--muted) 80%, transparent)}}.tw\\:hover\\:bg-primary\\/10:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/10:hover{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.tw\\:hover\\:bg-primary\\/70:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/70:hover{background-color:color-mix(in oklab, var(--primary) 70%, transparent)}}.tw\\:hover\\:bg-primary\\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.tw\\:hover\\:bg-red-500:hover{background-color:var(--tw-color-red-500)}.tw\\:hover\\:bg-secondary:hover,.tw\\:hover\\:bg-secondary\\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-secondary\\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.tw\\:hover\\:bg-sidebar-accent:hover{background-color:var(--sidebar-accent)}.tw\\:hover\\:bg-transparent:hover{background-color:#0000}.tw\\:hover\\:text-foreground:hover{color:var(--foreground)}.tw\\:hover\\:text-muted-foreground:hover{color:var(--muted-foreground)}.tw\\:hover\\:text-primary-foreground:hover{color:var(--primary-foreground)}.tw\\:hover\\:text-sidebar-accent-foreground:hover{color:var(--sidebar-accent-foreground)}.tw\\:hover\\:underline:hover{text-decoration-line:underline}.tw\\:hover\\:opacity-80:hover{opacity:.8}.tw\\:hover\\:opacity-100:hover{opacity:1}.tw\\:hover\\:shadow-\\[0_0_0_1px_var\\(--sidebar-accent\\)\\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-accent));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:ring-3:hover{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:group-data-\\[collapsible\\=offcanvas\\]\\:bg-sidebar:hover:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){background-color:var(--sidebar)}.tw\\:hover\\:after\\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:var(--sidebar-border)}}.tw\\:focus\\:relative:focus{position:relative}.tw\\:focus\\:z-10:focus{z-index:10}.tw\\:focus\\:bg-accent:focus{background-color:var(--accent)}.tw\\:focus\\:bg-muted:focus{background-color:var(--muted)}.tw\\:focus\\:text-accent-foreground:focus{color:var(--accent-foreground)}.tw\\:focus\\:text-foreground:focus{color:var(--foreground)}.tw\\:focus\\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus\\:ring-ring:focus{--tw-ring-color:var(--ring)}.tw\\:focus\\:ring-offset-1:focus{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:focus\\:ring-offset-background:focus{--tw-ring-offset-color:var(--background)}.tw\\:focus\\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:focus\\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}:is(.tw\\:focus\\:\\*\\*\\:text-accent-foreground:focus *),:is(.tw\\:not-data-\\[variant\\=destructive\\]\\:focus\\:\\*\\*\\:text-accent-foreground:not([data-variant=destructive]):focus *){color:var(--accent-foreground)}.tw\\:focus-visible\\:relative:focus-visible{position:relative}.tw\\:focus-visible\\:z-10:focus-visible{z-index:10}.tw\\:focus-visible\\:border-destructive\\/40:focus-visible{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:border-destructive\\/40:focus-visible{border-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:focus-visible\\:border-ring:focus-visible{border-color:var(--ring)}.tw\\:focus-visible\\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-3:focus-visible,.tw\\:focus-visible\\:ring-\\[3px\\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-\\[color\\:hsl\\(240\\,5\\%\\,64\\.9\\%\\)\\]:focus-visible{--tw-ring-color:#a1a1aa}.tw\\:focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:focus-visible\\:ring-ring:focus-visible,.tw\\:focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:focus-visible\\:ring-slate-400:focus-visible{--tw-ring-color:var(--tw-color-slate-400)}.tw\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:focus-visible\\:outline-hidden:focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:focus-visible\\:outline-hidden:focus-visible{outline-offset:2px;outline:2px solid #0000}}.tw\\:focus-visible\\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.tw\\:focus-visible\\:outline-ring:focus-visible{outline-color:var(--ring)}.tw\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}:is(.tw\\:\\*\\:focus-visible\\:relative>*):focus-visible{position:relative}:is(.tw\\:\\*\\:focus-visible\\:z-10>*):focus-visible{z-index:10}.tw\\:active\\:bg-sidebar-accent:active{background-color:var(--sidebar-accent)}.tw\\:active\\:text-sidebar-accent-foreground:active{color:var(--sidebar-accent-foreground)}.tw\\:active\\:ring-3:active{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:active\\:not-aria-\\[haspopup\\]\\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:active\\:not-aria-\\[haspopup\\]\\:transform-\\[translateY\\(1px\\)\\]:active:not([aria-haspopup]){transform:translateY(1px)}.tw\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.tw\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.tw\\:disabled\\:bg-input\\/50:disabled{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:disabled\\:bg-input\\/50:disabled{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:disabled\\:bg-transparent:disabled{background-color:#0000}.tw\\:disabled\\:opacity-50:disabled{opacity:.5}:where([data-side=bottom]) .tw\\:in-data-\\[side\\=bottom\\]\\:translate-y-\\[calc\\(-50\\%-1px\\)\\]{--tw-translate-y:calc(-50% - 1px);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=bottom]) .tw\\:in-data-\\[side\\=bottom\\]\\:\\[clip-path\\:polygon\\(100\\%_0\\,100\\%_100\\%\\,0_100\\%\\)\\]{clip-path:polygon(100% 0,100% 100%,0 100%)}:where([data-side=primary]) .tw\\:in-data-\\[side\\=primary\\]\\:cursor-w-resize{cursor:w-resize}:where([data-side=secondary]) .tw\\:in-data-\\[side\\=secondary\\]\\:cursor-e-resize{cursor:e-resize}:where([data-side=top]) .tw\\:in-data-\\[side\\=top\\]\\:translate-y-\\[calc\\(-50\\%-1px\\)\\]{--tw-translate-y:calc(-50% - 1px);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=top]) .tw\\:in-data-\\[side\\=top\\]\\:\\[clip-path\\:polygon\\(100\\%_0\\,100\\%_100\\%\\,0_100\\%\\)\\]{clip-path:polygon(100% 0,100% 100%,0 100%)}:where([data-slot=button-group]) .tw\\:in-data-\\[slot\\=button-group\\]\\:rounded-lg{border-radius:var(--radius)}:where([data-slot=combobox-content]) .tw\\:in-data-\\[slot\\=combobox-content\\]\\:focus-within\\:border-inherit:focus-within{border-color:inherit}:where([data-slot=combobox-content]) .tw\\:in-data-\\[slot\\=combobox-content\\]\\:focus-within\\:ring-0:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:where([data-slot=dialog-content]) .tw\\:in-data-\\[slot\\=dialog-content\\]\\:rounded-lg\\!{border-radius:var(--radius)!important}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/20{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/20{background-color:color-mix(in oklab, var(--background) 20%, transparent)}}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:text-background{color:var(--background)}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:text-destructive{color:var(--destructive)}.tw\\:has-disabled\\:bg-input\\/50:has(:disabled){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-disabled\\:bg-input\\/50:has(:disabled){background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:has-disabled\\:opacity-50:has(:disabled){opacity:.5}.tw\\:has-aria-expanded\\:bg-muted\\/50:has([aria-expanded=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-aria-expanded\\:bg-muted\\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-1:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-1\\.5:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-2:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:has-data-\\[icon\\=inline-end\\]\\:pe-1\\.5:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *):has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-1:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-1\\.5:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-2:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:has-data-\\[icon\\=inline-start\\]\\:ps-1\\.5:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *):has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[slot\\=alert-action\\]\\:relative:has([data-slot=alert-action]){position:relative}.tw\\:has-data-\\[slot\\=alert-action\\]\\:pe-18:has([data-slot=alert-action]){padding-inline-end:calc(calc(var(--spacing)) * 18)}.tw\\:has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.tw\\:has-data-\\[slot\\=card-description\\]\\:grid-rows-\\[auto_auto\\]:has([data-slot=card-description]){grid-template-rows:auto auto}.tw\\:has-data-\\[slot\\=card-footer\\]\\:pb-0:has([data-slot=card-footer]){padding-bottom:calc(calc(var(--spacing)) * 0)}.tw\\:has-data-\\[slot\\=kbd\\]\\:pe-0:has([data-slot=kbd]){padding-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:has-data-\\[slot\\=kbd\\]\\:pe-1\\.5:has([data-slot=kbd]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[variant\\=inset\\]\\:bg-sidebar:has([data-variant=inset]){background-color:var(--sidebar)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:border-ring:has([data-slot=input-group-control]:focus-visible){border-color:var(--ring)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-3:has([data-slot=input-group-control]:focus-visible){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-ring\\/50:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-ring\\/50:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:border-destructive:has([data-slot][aria-invalid=true]){border-color:var(--destructive)}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-3:has([data-slot][aria-invalid=true]){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/20:has([data-slot][aria-invalid=true]){--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/20:has([data-slot][aria-invalid=true]){--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:h-auto:has(>[data-align=block-end]){height:auto}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:flex-col:has(>[data-align=block-end]){flex-direction:column}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:h-auto:has(>[data-align=block-start]){height:auto}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:flex-col:has(>[data-align=block-start]){flex-direction:column}.tw\\:has-\\[\\>\\[data-slot\\=button-group\\]\\]\\:gap-2:has(>[data-slot=button-group]){gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>button\\]\\:ms-\\[-0\\.3rem\\]:has(>button){margin-inline-start:-.3rem}.tw\\:has-\\[\\>button\\]\\:me-\\[-0\\.3rem\\]:has(>button){margin-inline-end:-.3rem}.tw\\:has-\\[\\>img\\]\\:grid-cols-\\[auto_1fr\\]:has(>img){grid-template-columns:auto 1fr}.tw\\:has-\\[\\>img\\]\\:gap-x-2:has(>img){column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>img\\:first-child\\]\\:pt-0:has(>img:first-child){padding-top:calc(calc(var(--spacing)) * 0)}.tw\\:has-\\[\\>kbd\\]\\:ms-\\[-0\\.15rem\\]:has(>kbd){margin-inline-start:-.15rem}.tw\\:has-\\[\\>kbd\\]\\:me-\\[-0\\.15rem\\]:has(>kbd){margin-inline-end:-.15rem}.tw\\:has-\\[\\>svg\\]\\:grid-cols-\\[auto_1fr\\]:has(>svg){grid-template-columns:auto 1fr}.tw\\:has-\\[\\>svg\\]\\:gap-x-2:has(>svg){column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>svg\\]\\:p-0:has(>svg){padding:calc(calc(var(--spacing)) * 0)}.tw\\:has-\\[\\>textarea\\]\\:h-auto:has(>textarea){height:auto}.tw\\:aria-disabled\\:pointer-events-none[aria-disabled=true]{pointer-events:none}.tw\\:aria-disabled\\:opacity-50[aria-disabled=true]{opacity:.5}.tw\\:aria-expanded\\:bg-muted[aria-expanded=true]{background-color:var(--muted)}.tw\\:aria-expanded\\:bg-secondary[aria-expanded=true]{background-color:var(--secondary)}.tw\\:aria-expanded\\:text-foreground[aria-expanded=true]{color:var(--foreground)}.tw\\:aria-expanded\\:text-secondary-foreground[aria-expanded=true]{color:var(--secondary-foreground)}.tw\\:aria-expanded\\:opacity-100[aria-expanded=true]{opacity:1}.tw\\:aria-invalid\\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.tw\\:aria-invalid\\:ring-0[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:aria-invalid\\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:aria-invalid\\:aria-checked\\:border-primary[aria-invalid=true][aria-checked=true]{border-color:var(--primary)}.tw\\:aria-pressed\\:bg-muted[aria-pressed=true]{background-color:var(--muted)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:h-px[aria-orientation=horizontal]{height:1px}.tw\\:aria-\\[orientation\\=horizontal\\]\\:w-full[aria-orientation=horizontal]{width:100%}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:start-0[aria-orientation=horizontal]:after{content:var(--tw-content);inset-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:h-1[aria-orientation=horizontal]:after{content:var(--tw-content);height:calc(calc(var(--spacing)) * 1)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:w-full[aria-orientation=horizontal]:after{content:var(--tw-content);width:100%}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:translate-x-0[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:-translate-y-1\\/2[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:aria-\\[orientation\\=vertical\\]\\:flex-col[aria-orientation=vertical]{flex-direction:column}.tw\\:data-inset\\:ps-7[data-inset]{padding-inline-start:calc(calc(var(--spacing)) * 7)}.tw\\:data-placeholder\\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.tw\\:data-quiet-focus\\:focus-visible\\:border-transparent[data-quiet-focus]:focus-visible{border-color:#0000}.tw\\:data-quiet-focus\\:focus-visible\\:ring-0[data-quiet-focus]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-quiet-focus\\:focus-visible\\:outline-none[data-quiet-focus]:focus-visible{--tw-outline-style:none;outline-style:none}.tw\\:data-\\[align-trigger\\=false\\]\\:min-w-36[data-align-trigger=false]{min-width:calc(calc(var(--spacing)) * 36)}.tw\\:data-\\[align-trigger\\=true\\]\\:min-w-\\(--radix-select-trigger-width\\)[data-align-trigger=true]{min-width:var(--radix-select-trigger-width)}.tw\\:data-\\[align-trigger\\=true\\]\\:animate-none[data-align-trigger=true]{animation:none}.tw\\:data-\\[disabled\\=true\\]\\:pointer-events-none[data-disabled=true]{pointer-events:none}.tw\\:data-\\[disabled\\=true\\]\\:opacity-50[data-disabled=true]{opacity:.5}.tw\\:data-\\[position\\=popper\\]\\:h-\\(--radix-select-trigger-height\\)[data-position=popper]{height:var(--radix-select-trigger-height)}.tw\\:data-\\[position\\=popper\\]\\:w-full[data-position=popper]{width:100%}.tw\\:data-\\[position\\=popper\\]\\:min-w-\\(--radix-select-trigger-width\\)[data-position=popper]{min-width:var(--radix-select-trigger-width)}.tw\\:data-\\[side\\=bottom\\]\\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.tw\\:data-\\[side\\=left\\]\\:-translate-x-1[data-side=left]{--tw-translate-x:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.tw\\:data-\\[side\\=right\\]\\:translate-x-1[data-side=right]{--tw-translate-x:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.tw\\:data-\\[side\\=top\\]\\:-translate-y-1[data-side=top]{--tw-translate-y:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.tw\\:data-\\[size\\=default\\]\\:h-8[data-size=default]{height:calc(calc(var(--spacing)) * 8)}.tw\\:data-\\[size\\=default\\]\\:h-\\[18\\.4px\\][data-size=default]{height:18.4px}.tw\\:data-\\[size\\=default\\]\\:w-\\[32px\\][data-size=default]{width:32px}.tw\\:data-\\[size\\=lg\\]\\:size-10[data-size=lg]{width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:data-\\[size\\=md\\]\\:text-sm[data-size=md]{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:data-\\[size\\=sm\\]\\:size-6[data-size=sm]{width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:data-\\[size\\=sm\\]\\:h-7[data-size=sm]{height:calc(calc(var(--spacing)) * 7)}.tw\\:data-\\[size\\=sm\\]\\:h-\\[14px\\][data-size=sm]{height:14px}.tw\\:data-\\[size\\=sm\\]\\:w-\\[24px\\][data-size=sm]{width:24px}.tw\\:data-\\[size\\=sm\\]\\:gap-3[data-size=sm]{gap:calc(calc(var(--spacing)) * 3)}.tw\\:data-\\[size\\=sm\\]\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,10px\\)\\][data-size=sm]{border-radius:min(var(--tw-radius-md), 10px)}.tw\\:data-\\[size\\=sm\\]\\:py-3[data-size=sm]{padding-block:calc(calc(var(--spacing)) * 3)}.tw\\:data-\\[size\\=sm\\]\\:text-xs[data-size=sm]{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:data-\\[size\\=sm\\]\\:has-data-\\[slot\\=card-footer\\]\\:pb-0[data-size=sm]:has([data-slot=card-footer]){padding-bottom:calc(calc(var(--spacing)) * 0)}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-item]:focus{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-item]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:data-highlighted\\:bg-foreground\\/10 *)[data-slot$=-item][data-highlighted]{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:data-highlighted\\:bg-foreground\\/10 *)[data-slot$=-item][data-highlighted]{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-separator\\]\\:bg-foreground\\/5 *)[data-slot$=-separator]{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-separator\\]\\:bg-foreground\\/5 *)[data-slot$=-separator]{background-color:color-mix(in oklab, var(--foreground) 5%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-trigger]:focus{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-trigger]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:aria-expanded\\:bg-foreground\\/10\\! *)[data-slot$=-trigger][aria-expanded=true]{background-color:var(--foreground)!important}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:aria-expanded\\:bg-foreground\\/10\\! *)[data-slot$=-trigger][aria-expanded=true]{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)!important}}:is(.tw\\:\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90>*)[data-slot=alert-description]{color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90>*)[data-slot=alert-description]{color:color-mix(in oklab, var(--destructive) 90%, transparent)}}:is(.tw\\:\\*\\:data-\\[slot\\=avatar\\]\\:ring-2>*)[data-slot=avatar]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:is(.tw\\:\\*\\:data-\\[slot\\=avatar\\]\\:ring-background>*)[data-slot=avatar]{--tw-ring-color:var(--background)}:is(.tw\\:\\*\\:data-\\[slot\\=input-group-addon\\]\\:ps-2\\!>*)[data-slot=input-group-addon]{padding-inline-start:calc(calc(var(--spacing)) * 2)!important}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:relative *)[data-slot=kbd]{position:relative}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:isolate *)[data-slot=kbd]{isolation:isolate}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:z-50 *)[data-slot=kbd]{z-index:50}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:rounded-sm *)[data-slot=kbd]{border-radius:calc(var(--radius) * .6)}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:flex>*)[data-slot=select-value]{display:flex}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:flex-1>*)[data-slot=select-value]{flex:1}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:items-center>*)[data-slot=select-value]{align-items:center}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:gap-1\\.5>*)[data-slot=select-value]{gap:calc(calc(var(--spacing)) * 1.5)}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:text-start>*)[data-slot=select-value]{text-align:start}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:first\\:rounded-s-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"]:first-child{border-start-start-radius:var(--radius);border-end-start-radius:var(--radius)}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:first\\:rounded-t-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"]:first-child{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:last\\:rounded-e-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"]:last-child{border-start-end-radius:var(--radius);border-end-end-radius:var(--radius)}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:last\\:rounded-b-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"]:last-child{border-bottom-right-radius:var(--radius);border-bottom-left-radius:var(--radius)}.tw\\:data-\\[state\\=active\\]\\:bg-background[data-state=active]{background-color:var(--background)}.tw\\:data-\\[state\\=active\\]\\:text-foreground[data-state=active]{color:var(--foreground)}.tw\\:data-\\[state\\=active\\]\\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-\\[state\\=closed\\]\\:overflow-hidden[data-state=closed]{overflow:hidden}.tw\\:data-\\[state\\=delayed-open\\]\\:animate-in[data-state=delayed-open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-\\[state\\=delayed-open\\]\\:fade-in-0[data-state=delayed-open]{--tw-enter-opacity:0}.tw\\:data-\\[state\\=delayed-open\\]\\:zoom-in-95[data-state=delayed-open]{--tw-enter-scale:.95}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-approved\\)\\][data-state=on]{background-color:var(--inv-soft-approved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-unapproved\\)\\][data-state=on]{background-color:var(--inv-soft-unapproved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-unknown\\)\\][data-state=on]{background-color:var(--inv-soft-unknown)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-approved\\)\\][data-state=on]{background-color:var(--inv-vivid-approved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-unapproved\\)\\][data-state=on]{background-color:var(--inv-vivid-unapproved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-unknown\\)\\][data-state=on]{background-color:var(--inv-vivid-unknown)}.tw\\:data-\\[state\\=on\\]\\:bg-muted[data-state=on]{background-color:var(--muted)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-approved\\)\\][data-state=on]{color:var(--inv-icon-approved)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-unapproved\\)\\][data-state=on]{color:var(--inv-icon-unapproved)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-unknown\\)\\][data-state=on]{color:var(--inv-icon-unknown)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-on\\)\\][data-state=on]{color:var(--inv-on)}.tw\\:data-\\[state\\=on\\]\\:text-foreground[data-state=on]{color:var(--foreground)}.tw\\:data-\\[state\\=open\\]\\:bg-accent[data-state=open]{background-color:var(--accent)}.tw\\:data-\\[state\\=open\\]\\:bg-muted[data-state=open]{background-color:var(--muted)}.tw\\:data-\\[state\\=open\\]\\:text-foreground[data-state=open]{color:var(--foreground)}.tw\\:data-\\[state\\=selected\\]\\:bg-muted[data-state=selected]{background-color:var(--muted)}.tw\\:data-\\[variant\\=destructive\\]\\:text-destructive[data-variant=destructive]{color:var(--destructive)}:is(:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:\\*\\*\\:text-accent-foreground\\! *)[data-variant=destructive] *),:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:text-accent-foreground\\! *)[data-variant=destructive]{color:var(--accent-foreground)!important}.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:text-destructive[data-variant=destructive]:focus{color:var(--destructive)}:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-foreground\\/10\\! *)[data-variant=destructive]:focus{background-color:var(--foreground)!important}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-foreground\\/10\\! *)[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)!important}}.tw\\:data-\\[variant\\=line\\]\\:rounded-none[data-variant=line]{border-radius:0}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:border-s-0:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"][data-variant=outline]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:border-t-0:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"][data-variant=outline]{border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:first\\:border-s:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"][data-variant=outline]:first-child{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:first\\:border-t:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"][data-variant=outline]:first-child{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:inset-x-0[data-vaul-drawer-direction=bottom]{inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:bottom-0[data-vaul-drawer-direction=bottom]{bottom:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:mt-24[data-vaul-drawer-direction=bottom]{margin-top:calc(calc(var(--spacing)) * 24)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:max-h-\\[80vh\\][data-vaul-drawer-direction=bottom]{max-height:80vh}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:rounded-t-xl[data-vaul-drawer-direction=bottom]{border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:border-t[data-vaul-drawer-direction=bottom]{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:inset-y-0[data-vaul-drawer-direction=left]{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:left-0[data-vaul-drawer-direction=left]{left:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:w-3\\/4[data-vaul-drawer-direction=left]{width:75%}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:flex-row[data-vaul-drawer-direction=left]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:rounded-r-xl[data-vaul-drawer-direction=left]{border-top-right-radius:calc(var(--radius) * 1.4);border-bottom-right-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:border-r[data-vaul-drawer-direction=left]{border-right-style:var(--tw-border-style);border-right-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=left\\/right\\]\\:flex-row[data-vaul-drawer-direction=left\\/right]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:inset-y-0[data-vaul-drawer-direction=right]{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:right-0[data-vaul-drawer-direction=right]{right:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:w-3\\/4[data-vaul-drawer-direction=right]{width:75%}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:flex-row[data-vaul-drawer-direction=right]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:rounded-l-xl[data-vaul-drawer-direction=right]{border-top-left-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:border-l[data-vaul-drawer-direction=right]{border-left-style:var(--tw-border-style);border-left-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:inset-x-0[data-vaul-drawer-direction=top]{inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:top-0[data-vaul-drawer-direction=top]{top:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:mb-24[data-vaul-drawer-direction=top]{margin-bottom:calc(calc(var(--spacing)) * 24)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:max-h-\\[80vh\\][data-vaul-drawer-direction=top]{max-height:80vh}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:rounded-b-xl[data-vaul-drawer-direction=top]{border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:border-b[data-vaul-drawer-direction=top]{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.tw\\:supports-backdrop-filter\\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--tw-blur-xs));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}}@media (min-width:40rem){.tw\\:sm\\:flex{display:flex}.tw\\:sm\\:max-w-sm{max-width:var(--tw-container-sm)}.tw\\:sm\\:flex-row{flex-direction:row}.tw\\:sm\\:justify-end{justify-content:flex-end}.tw\\:sm\\:p-8{padding:calc(calc(var(--spacing)) * 8)}.tw\\:sm\\:text-start{text-align:start}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:sm\\:max-w-sm[data-vaul-drawer-direction=left],.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:sm\\:max-w-sm[data-vaul-drawer-direction=right]{max-width:var(--tw-container-sm)}}@media (min-width:48rem){.tw\\:md\\:block{display:block}.tw\\:md\\:flex{display:flex}.tw\\:md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:md\\:gap-0\\.5{gap:calc(calc(var(--spacing)) * .5)}.tw\\:md\\:text-start{text-align:start}.tw\\:md\\:text-sm{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:md\\:text-pretty{text-wrap:pretty}.tw\\:md\\:opacity-0{opacity:0}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:m-2:is(:where(.tw\\:peer)[data-variant=inset]~*){margin:calc(calc(var(--spacing)) * 2)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:ms-0:is(:where(.tw\\:peer)[data-variant=inset]~*){margin-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:rounded-xl:is(:where(.tw\\:peer)[data-variant=inset]~*){border-radius:calc(var(--radius) * 1.4)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:shadow-sm:is(:where(.tw\\:peer)[data-variant=inset]~*){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:peer-data-\\[state\\=collapsed\\]\\:ms-2:is(:where(.tw\\:peer)[data-variant=inset]~*):is(:where(.tw\\:peer)[data-state=collapsed]~*){margin-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:md\\:after\\:hidden:after{content:var(--tw-content);display:none}}@media (min-width:64rem){.tw\\:lg\\:flex{display:flex}.tw\\:lg\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}:where(.tw\\:lg\\:space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 8) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 8) * calc(1 - var(--tw-space-x-reverse)))}.tw\\:lg\\:text-5xl{font-size:var(--tw-text-5xl);line-height:var(--tw-leading,var(--tw-text-5xl--line-height))}}@media (min-width:48rem){@media (min-width:64rem){.tw\\:md\\:lg\\:hidden{display:none}}}@media (min-width:80rem){.tw\\:xl\\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.tw\\:xl\\:grid-flow-col{grid-auto-flow:column}.tw\\:xl\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:xl\\:grid-cols-none{grid-template-columns:none}.tw\\:xl\\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}}@container search not (min-width:7rem){.tw\\:\\@max-\\[7rem\\]\\/search\\:hidden{display:none}.tw\\:\\@max-\\[7rem\\]\\/search\\:ps-3{padding-inline-start:calc(calc(var(--spacing)) * 3)}}@container search not (min-width:4rem){.tw\\:\\@max-\\[4rem\\]\\/search\\:hidden{display:none}.tw\\:\\@max-\\[4rem\\]\\/search\\:pe-3{padding-inline-end:calc(calc(var(--spacing)) * 3)}}@container search not (min-width:3rem){.tw\\:\\@max-\\[3rem\\]\\/search\\:ps-0{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\@max-\\[3rem\\]\\/search\\:pe-0{padding-inline-end:calc(calc(var(--spacing)) * 0)}}@container (min-width:24rem){.tw\\:\\@sm\\:basis-auto{flex-basis:auto}}.tw\\:ltr\\:left-2:where(:dir(ltr),[dir=ltr],[dir=ltr] *){left:calc(calc(var(--spacing)) * 2)}.tw\\:ltr\\:-translate-x-1\\/2:where(:dir(ltr),[dir=ltr],[dir=ltr] *){--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:right-2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:calc(calc(var(--spacing)) * 2)}.tw\\:rtl\\:flex:where(:dir(rtl),[dir=rtl],[dir=rtl] *){display:flex}.tw\\:rtl\\:-translate-x-px:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:translate-x-1\\/2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:translate-x-px:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:after\\:translate-x-1\\/2:where(:dir(rtl),[dir=rtl],[dir=rtl] *):after{content:var(--tw-content);--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=primary]) .tw\\:rtl\\:in-data-\\[side\\=primary\\]\\:cursor-e-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:e-resize}:where([data-side=secondary]) .tw\\:rtl\\:in-data-\\[side\\=secondary\\]\\:cursor-w-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:w-resize}.tw\\:rtl\\:aria-\\[orientation\\=horizontal\\]\\:after\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:data-\\[side\\=left\\]\\:translate-x-1:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-side=left]{--tw-translate-x:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:data-\\[side\\=right\\]\\:-translate-x-1:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-side=right]{--tw-translate-x:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:border-input:is(.dark *){border-color:var(--input)}.tw\\:dark\\:bg-destructive\\/20:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:bg-destructive\\/20:is(.dark *){background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:dark\\:bg-input\\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:bg-input\\/30:is(.dark *){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:dark\\:bg-transparent:is(.dark *){background-color:#0000}.tw\\:dark\\:text-amber-400:is(.dark *){color:var(--tw-color-amber-400)}.tw\\:dark\\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}.tw\\:dark\\:text-rose-400:is(.dark *){color:var(--tw-color-rose-400)}.tw\\:dark\\:text-sky-400:is(.dark *){color:var(--tw-color-sky-400)}.tw\\:dark\\:text-teal-400:is(.dark *){color:var(--tw-color-teal-400)}.tw\\:dark\\:after\\:mix-blend-lighten:is(.dark *):after{content:var(--tw-content);mix-blend-mode:lighten}@media (hover:hover){.tw\\:dark\\:hover\\:bg-blue-500:is(.dark *):hover{background-color:var(--tw-color-blue-500)}.tw\\:dark\\:hover\\:bg-destructive\\/30:is(.dark *):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-destructive\\/30:is(.dark *):hover{background-color:color-mix(in oklab, var(--destructive) 30%, transparent)}}.tw\\:dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:dark\\:hover\\:bg-muted\\/50:is(.dark *):hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-muted\\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:dark\\:hover\\:text-foreground:is(.dark *):hover{color:var(--foreground)}}.tw\\:dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:disabled\\:bg-input\\/80:is(.dark *):disabled{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:disabled\\:bg-input\\/80:is(.dark *):disabled{background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:dark\\:disabled\\:bg-transparent:is(.dark *):disabled{background-color:#0000}:where([data-slot=tooltip-content]) .tw\\:dark\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/10:is(.dark *){background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){:where([data-slot=tooltip-content]) .tw\\:dark\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/10:is(.dark *){background-color:color-mix(in oklab, var(--background) 10%, transparent)}}.tw\\:dark\\:has-disabled\\:bg-input\\/80:is(.dark *):has(:disabled){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:has-disabled\\:bg-input\\/80:is(.dark *):has(:disabled){background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:dark\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/40:is(.dark *):has([data-slot][aria-invalid=true]){--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/40:is(.dark *):has([data-slot][aria-invalid=true]){--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:aria-invalid\\:border-destructive\\/50:is(.dark *)[aria-invalid=true]{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:aria-invalid\\:border-destructive\\/50:is(.dark *)[aria-invalid=true]{border-color:color-mix(in oklab, var(--destructive) 50%, transparent)}}.tw\\:dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:data-open\\:animate-in:where([data-state=open]),.tw\\:data-open\\:animate-in:where([data-open]:not([data-open=false])){animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-open\\:bg-accent:where([data-state=open]),.tw\\:data-open\\:bg-accent:where([data-open]:not([data-open=false])){background-color:var(--accent)}.tw\\:data-open\\:text-accent-foreground:where([data-state=open]),.tw\\:data-open\\:text-accent-foreground:where([data-open]:not([data-open=false])){color:var(--accent-foreground)}.tw\\:data-open\\:fade-in-0:where([data-state=open]),.tw\\:data-open\\:fade-in-0:where([data-open]:not([data-open=false])){--tw-enter-opacity:0}.tw\\:data-open\\:zoom-in-95:where([data-state=open]),.tw\\:data-open\\:zoom-in-95:where([data-open]:not([data-open=false])){--tw-enter-scale:.95}@media (hover:hover){:is(.tw\\:data-open\\:hover\\:bg-sidebar-accent:where([data-state=open]),.tw\\:data-open\\:hover\\:bg-sidebar-accent:where([data-open]:not([data-open=false]))):hover{background-color:var(--sidebar-accent)}:is(.tw\\:data-open\\:hover\\:text-sidebar-accent-foreground:where([data-state=open]),.tw\\:data-open\\:hover\\:text-sidebar-accent-foreground:where([data-open]:not([data-open=false]))):hover{color:var(--sidebar-accent-foreground)}}.tw\\:data-closed\\:animate-out:where([data-state=closed]),.tw\\:data-closed\\:animate-out:where([data-closed]:not([data-closed=false])){animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-closed\\:fade-out-0:where([data-state=closed]),.tw\\:data-closed\\:fade-out-0:where([data-closed]:not([data-closed=false])){--tw-exit-opacity:0}.tw\\:data-closed\\:zoom-out-95:where([data-state=closed]),.tw\\:data-closed\\:zoom-out-95:where([data-closed]:not([data-closed=false])){--tw-exit-scale:.95}.tw\\:data-checked\\:border-primary:where([data-state=checked]),.tw\\:data-checked\\:border-primary:where([data-checked]:not([data-checked=false])){border-color:var(--primary)}.tw\\:data-checked\\:bg-primary:where([data-state=checked]),.tw\\:data-checked\\:bg-primary:where([data-checked]:not([data-checked=false])){background-color:var(--primary)}.tw\\:data-checked\\:text-primary-foreground:where([data-state=checked]),.tw\\:data-checked\\:text-primary-foreground:where([data-checked]:not([data-checked=false])){color:var(--primary-foreground)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=checked]),.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-checked]:not([data-checked=false])),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=checked]),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-checked]:not([data-checked=false])){--tw-translate-x:calc(100% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=checked]),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-checked]:not([data-checked=false])),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=checked]),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-checked]:not([data-checked=false])){--tw-translate-x:calc(calc(100% - 2px) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:data-checked\\:bg-primary:is(.dark *):where([data-state=checked]),.tw\\:dark\\:data-checked\\:bg-primary:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--primary)}.tw\\:dark\\:data-checked\\:bg-primary-foreground:is(.dark *):where([data-state=checked]),.tw\\:dark\\:data-checked\\:bg-primary-foreground:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--primary-foreground)}.tw\\:data-unchecked\\:bg-input:where([data-state=unchecked]),.tw\\:data-unchecked\\:bg-input:where([data-unchecked]:not([data-unchecked=false])){background-color:var(--input)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=unchecked]),.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=unchecked]),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=unchecked]),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=unchecked]),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-unchecked]:not([data-unchecked=false])){--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:data-unchecked\\:bg-foreground:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-foreground:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:var(--foreground)}.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:data-selected\\:bg-muted:where([data-selected=true]),.tw\\:data-selected\\:bg-muted\\/50:where([data-selected=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:bg-muted\\/50:where([data-selected=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:data-selected\\:bg-primary:where([data-selected=true]){background-color:var(--primary)}.tw\\:data-selected\\:bg-transparent:where([data-selected=true]){background-color:#0000}.tw\\:data-selected\\:text-foreground:where([data-selected=true]){color:var(--foreground)}.tw\\:data-selected\\:text-inherit:where([data-selected=true]){color:inherit}.tw\\:data-selected\\:text-muted-foreground\\/50:where([data-selected=true]){color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:text-muted-foreground\\/50:where([data-selected=true]){color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.tw\\:data-selected\\:text-primary-foreground:where([data-selected=true]){color:var(--primary-foreground)}.tw\\:data-selected\\:ring-2:where([data-selected=true]){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-selected\\:ring-primary-foreground\\/70:where([data-selected=true]){--tw-ring-color:var(--primary-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:ring-primary-foreground\\/70:where([data-selected=true]){--tw-ring-color:color-mix(in oklab, var(--primary-foreground) 70%, transparent)}}.tw\\:data-selected\\:ring-ring\\/50:where([data-selected=true]){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:ring-ring\\/50:where([data-selected=true]){--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:data-selected\\:ring-inset:where([data-selected=true]){--tw-ring-inset:inset}@media (forced-colors:active){.tw\\:forced-colors\\:data-selected\\:outline-2:where([data-selected=true]){outline-style:var(--tw-outline-style);outline-width:2px}.tw\\:forced-colors\\:data-selected\\:-outline-offset-2:where([data-selected=true]){outline-offset:calc(2px * -1)}.tw\\:forced-colors\\:data-selected\\:outline-\\[color\\:Highlight\\]:where([data-selected=true]){outline-color:highlight}}.tw\\:data-disabled\\:pointer-events-none:where([data-disabled=true]),.tw\\:data-disabled\\:pointer-events-none:where([data-disabled]:not([data-disabled=false])){pointer-events:none}.tw\\:data-disabled\\:cursor-not-allowed:where([data-disabled=true]),.tw\\:data-disabled\\:cursor-not-allowed:where([data-disabled]:not([data-disabled=false])){cursor:not-allowed}.tw\\:data-disabled\\:opacity-50:where([data-disabled=true]),.tw\\:data-disabled\\:opacity-50:where([data-disabled]:not([data-disabled=false])){opacity:.5}.tw\\:data-active\\:bg-background:where([data-state=active]),.tw\\:data-active\\:bg-background:where([data-active]:not([data-active=false])){background-color:var(--background)}.tw\\:data-active\\:bg-sidebar-accent:where([data-state=active]),.tw\\:data-active\\:bg-sidebar-accent:where([data-active]:not([data-active=false])){background-color:var(--sidebar-accent)}.tw\\:data-active\\:font-medium:where([data-state=active]),.tw\\:data-active\\:font-medium:where([data-active]:not([data-active=false])){--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:data-active\\:text-foreground:where([data-state=active]),.tw\\:data-active\\:text-foreground:where([data-active]:not([data-active=false])){color:var(--foreground)}.tw\\:data-active\\:text-sidebar-accent-foreground:where([data-state=active]),.tw\\:data-active\\:text-sidebar-accent-foreground:where([data-active]:not([data-active=false])){color:var(--sidebar-accent-foreground)}.tw\\:group-data-\\[variant\\=default\\]\\/tabs-list\\:data-active\\:shadow-sm:is(:where(.tw\\:group\\/tabs-list)[data-variant=default] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=default\\]\\/tabs-list\\:data-active\\:shadow-sm:is(:where(.tw\\:group\\/tabs-list)[data-variant=default] *):where([data-active]:not([data-active=false])){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:shadow-none:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:shadow-none:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:is(.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:after\\:opacity-100:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:after\\:opacity-100:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false]))):after{content:var(--tw-content);opacity:1}.tw\\:dark\\:data-active\\:border-input:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:border-input:is(.dark *):where([data-active]:not([data-active=false])){border-color:var(--input)}.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:dark\\:data-active\\:text-foreground:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:text-foreground:is(.dark *):where([data-active]:not([data-active=false])){color:var(--foreground)}.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:border-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:border-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){border-color:#0000}.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.tw\\:data-horizontal\\:mx-px:where([data-orientation=horizontal]){margin-inline:1px}.tw\\:data-horizontal\\:h-1:where([data-orientation=horizontal]){height:calc(calc(var(--spacing)) * 1)}.tw\\:data-horizontal\\:h-full:where([data-orientation=horizontal]){height:100%}.tw\\:data-horizontal\\:h-px:where([data-orientation=horizontal]){height:1px}.tw\\:data-horizontal\\:w-auto:where([data-orientation=horizontal]){width:auto}.tw\\:data-horizontal\\:w-full:where([data-orientation=horizontal]){width:100%}.tw\\:data-horizontal\\:flex-col:where([data-orientation=horizontal]){flex-direction:column}.tw\\:data-vertical\\:my-px:where([data-orientation=vertical]){margin-block:1px}.tw\\:data-vertical\\:h-auto:where([data-orientation=vertical]){height:auto}.tw\\:data-vertical\\:h-full:where([data-orientation=vertical]){height:100%}.tw\\:data-vertical\\:min-h-40:where([data-orientation=vertical]){min-height:calc(calc(var(--spacing)) * 40)}.tw\\:data-vertical\\:w-1:where([data-orientation=vertical]){width:calc(calc(var(--spacing)) * 1)}.tw\\:data-vertical\\:w-auto:where([data-orientation=vertical]){width:auto}.tw\\:data-vertical\\:w-full:where([data-orientation=vertical]){width:100%}.tw\\:data-vertical\\:w-px:where([data-orientation=vertical]){width:1px}.tw\\:data-vertical\\:flex-col:where([data-orientation=vertical]){flex-direction:column}.tw\\:data-vertical\\:items-stretch:where([data-orientation=vertical]){align-items:stretch}.tw\\:data-vertical\\:self-stretch:where([data-orientation=vertical]){align-self:stretch}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:mt-0 [data-lexical-editor=true]>blockquote{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:border-s-0 [data-lexical-editor=true]>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:ps-0 [data-lexical-editor=true]>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:font-normal [data-lexical-editor=true]>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:text-foreground [data-lexical-editor=true]>blockquote{color:var(--foreground)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:not-italic [data-lexical-editor=true]>blockquote{font-style:normal}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:mt-0 [data-lexical-editor=\\"true\\"]>blockquote{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:border-s-0 [data-lexical-editor=\\"true\\"]>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:ps-0 [data-lexical-editor=\\"true\\"]>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:font-normal [data-lexical-editor=\\"true\\"]>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:text-foreground [data-lexical-editor=\\"true\\"]>blockquote{color:var(--foreground)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:not-italic [data-lexical-editor=\\"true\\"]>blockquote{font-style:normal}.tw\\:\\[\\&_a\\]\\:underline a{text-decoration-line:underline}.tw\\:\\[\\&_a\\]\\:underline-offset-3 a{text-underline-offset:3px}@media (hover:hover){.tw\\:\\[\\&_a\\]\\:hover\\:text-foreground a:hover{color:var(--foreground)}}.tw\\:\\[\\&_p\\]\\:my-0 p{margin-block:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_p\\:not\\(\\:last-child\\)\\]\\:mb-4 p:not(:last-child){margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_s\\]\\:text-destructive s{color:var(--destructive)}.tw\\:\\[\\&_s\\]\\:line-through s{text-decoration-line:line-through}.tw\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.tw\\:\\[\\&_svg\\]\\:size-4 svg{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3\\.5 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_tr\\]\\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.tw\\:\\[\\&_tr\\:last-child\\]\\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.tw\\:\\[\\&_u\\]\\:font-semibold u{--tw-font-weight:var(--tw-font-weight-semibold);font-weight:var(--tw-font-weight-semibold)}.tw\\:\\[\\&_u\\]\\:text-success-foreground u{color:var(--success-foreground)}.tw\\:\\[\\&_u\\]\\:no-underline u{text-decoration-line:none}.tw\\:\\[\\&\\:has\\(\\[role\\=checkbox\\]\\)\\]\\:pe-0:has([role=checkbox]){padding-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\.border-b\\]\\:pb-2.border-b{padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:\\[\\.border-b\\]\\:pb-4.border-b{padding-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:\\[\\.border-b\\]\\:pb-3:is(:where(.tw\\:group\\/card)[data-size=sm] *).border-b{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:\\[\\.border-t\\]\\:pt-2.border-t{padding-top:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:px-2 *)[cmdk-group-heading]{padding-inline:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:py-1\\.5 *)[cmdk-group-heading]{padding-block:calc(calc(var(--spacing)) * 1.5)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:text-xs *)[cmdk-group-heading]{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:font-medium *)[cmdk-group-heading]{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:text-muted-foreground *)[cmdk-group-heading]{color:var(--muted-foreground)}:is(.tw\\:\\*\\:\\[a\\]\\:underline>*):is(a){text-decoration-line:underline}:is(.tw\\:\\*\\:\\[a\\]\\:underline-offset-3>*):is(a){text-underline-offset:3px}@media (hover:hover){.tw\\:\\[a\\]\\:hover\\:bg-destructive\\/20:is(a):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-destructive\\/20:is(a):hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:\\[a\\]\\:hover\\:bg-muted:is(a):hover{background-color:var(--muted)}.tw\\:\\[a\\]\\:hover\\:bg-primary\\/80:is(a):hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-primary\\/80:is(a):hover{background-color:color-mix(in oklab, var(--primary) 80%, transparent)}}.tw\\:\\[a\\]\\:hover\\:bg-secondary\\/80:is(a):hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-secondary\\/80:is(a):hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.tw\\:\\[a\\]\\:hover\\:text-muted-foreground:is(a):hover{color:var(--muted-foreground)}:is(.tw\\:\\*\\:\\[a\\]\\:hover\\:text-foreground>*):is(a):hover{color:var(--foreground)}}:is(.tw\\:\\*\\:\\[img\\]\\:row-span-2>*):is(img){grid-row:span 2/span 2}:is(.tw\\:\\*\\:\\[img\\]\\:translate-y-0\\.5>*):is(img){--tw-translate-y:calc(calc(var(--spacing)) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.tw\\:\\*\\:\\[img\\]\\:text-current>*):is(img){color:currentColor}:is(.tw\\:\\*\\:\\[img\\:first-child\\]\\:rounded-t-xl>*):is(img:first-child){border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}:is(.tw\\:\\*\\:\\[img\\:last-child\\]\\:rounded-b-xl>*):is(img:last-child){border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}:is(.tw\\:\\*\\:\\[img\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>*):is(img:not([class*=size-])){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:flex>*):is(span):last-child{display:flex}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:items-center>*):is(span):last-child{align-items:center}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:gap-2>*):is(span):last-child{gap:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\:\\[svg\\]\\:row-span-2>*):is(svg){grid-row:span 2/span 2}:is(.tw\\:\\*\\:\\[svg\\]\\:translate-y-0\\.5>*):is(svg){--tw-translate-y:calc(calc(var(--spacing)) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.tw\\:\\*\\:\\[svg\\]\\:text-current>*):is(svg){color:currentColor}:is(.tw\\:focus\\:\\*\\:\\[svg\\]\\:text-accent-foreground:focus>*):is(svg){color:var(--accent-foreground)}:is(.tw\\:data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:text-destructive[data-variant=destructive]>*):is(svg){color:var(--destructive)}:is(.tw\\:data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:text-destructive\\![data-variant=destructive]>*):is(svg){color:var(--destructive)!important}:is(.tw\\:data-selected\\:\\*\\:\\[svg\\]\\:text-foreground:where([data-selected=true])>*):is(svg){color:var(--foreground)}:is(.tw\\:\\*\\:\\[svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>*):is(svg:not([class*=size-])){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-s-none>:not(:first-child){border-start-start-radius:0;border-end-start-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-t-none>:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-s-0>:not(:first-child){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-t-0>:not(:first-child){border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-e-none>:not(:last-child){border-start-end-radius:0;border-end-end-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-b-none>:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.tw\\:has-\\[select\\[aria-hidden\\=true\\]\\:last-child\\]\\:\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:last-of-type\\]\\:rounded-e-lg:has(:is(select[aria-hidden=true]:last-child))>[data-slot=select-trigger]:last-of-type{border-start-end-radius:var(--radius);border-end-end-radius:var(--radius)}.tw\\:\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:not\\(\\[class\\*\\=w-\\]\\)\\]\\:w-fit>[data-slot=select-trigger]:not([class*=w-]){width:fit-content}.tw\\:\\[\\&\\>\\[data-slot\\]\\:not\\(\\:has\\(\\~\\[data-slot\\]\\)\\)\\]\\:rounded-e-lg\\!>[data-slot]:not(:has(~[data-slot])){border-start-end-radius:var(--radius)!important;border-end-end-radius:var(--radius)!important}.tw\\:\\[\\&\\>\\[data-slot\\]\\:not\\(\\:has\\(\\~\\[data-slot\\]\\)\\)\\]\\:rounded-b-lg\\!>[data-slot]:not(:has(~[data-slot])){border-bottom-right-radius:var(--radius)!important;border-bottom-left-radius:var(--radius)!important}.tw\\:\\[\\&\\>a\\]\\:underline>a{text-decoration-line:underline}.tw\\:\\[\\&\\>a\\]\\:underline-offset-4>a{text-underline-offset:4px}.tw\\:\\[\\&\\>a\\:hover\\]\\:text-primary>a:hover{color:var(--primary)}.tw\\:\\[\\&\\>blockquote\\]\\:my-0>blockquote{margin-block:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:border-s-0>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&\\>blockquote\\]\\:p-0>blockquote{padding:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:ps-0>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:font-normal>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&\\>blockquote\\]\\:text-foreground>blockquote{color:var(--foreground)}.tw\\:\\[\\&\\>blockquote\\]\\:not-italic>blockquote{font-style:normal}.tw\\:\\[\\&\\>input\\]\\:flex-1>input{flex:1}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:\\[\\&\\>input\\]\\:pt-3:has(>[data-align=block-end])>input{padding-top:calc(calc(var(--spacing)) * 3)}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:\\[\\&\\>input\\]\\:pb-3:has(>[data-align=block-start])>input{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:has-\\[\\>\\[data-align\\=inline-end\\]\\]\\:\\[\\&\\>input\\]\\:pe-1\\.5:has(>[data-align=inline-end])>input{padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-\\[\\>\\[data-align\\=inline-start\\]\\]\\:\\[\\&\\>input\\]\\:ps-1\\.5:has(>[data-align=inline-start])>input{padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:\\[\\&\\>kbd\\]\\:rounded-\\[calc\\(var\\(--radius\\)-5px\\)\\]>kbd{border-radius:calc(var(--radius) - 5px)}.tw\\:\\[\\&\\>li\\]\\:mt-2>li{margin-top:calc(calc(var(--spacing)) * 2)}.tw\\:\\[\\&\\>span\\:last-child\\]\\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tw\\:\\[\\&\\>svg\\]\\:pointer-events-none>svg{pointer-events:none}.tw\\:\\[\\&\\>svg\\]\\:hidden>svg{display:none}.tw\\:\\[\\&\\>svg\\]\\:size-3\\!>svg{width:calc(calc(var(--spacing)) * 3)!important;height:calc(calc(var(--spacing)) * 3)!important}.tw\\:\\[\\&\\>svg\\]\\:size-3\\.5>svg{width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&\\>svg\\]\\:size-4>svg{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>svg\\]\\:shrink-0>svg{flex-shrink:0}.tw\\:\\[\\&\\>svg\\]\\:text-sidebar-accent-foreground>svg{color:var(--sidebar-accent-foreground)}.tw\\:group-has-data-\\[size\\=lg\\]\\/avatar-group\\:\\[\\&\\>svg\\]\\:size-5:is(:where(.tw\\:group\\/avatar-group):has([data-size=lg]) *)>svg{width:calc(calc(var(--spacing)) * 5);height:calc(calc(var(--spacing)) * 5)}.tw\\:group-has-data-\\[size\\=sm\\]\\/avatar-group\\:\\[\\&\\>svg\\]\\:size-3:is(:where(.tw\\:group\\/avatar-group):has([data-size=sm]) *)>svg{width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=default\\]\\/avatar\\:\\[\\&\\>svg\\]\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=default] *)>svg,.tw\\:group-data-\\[size\\=lg\\]\\/avatar\\:\\[\\&\\>svg\\]\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=lg] *)>svg{width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:\\[\\&\\>svg\\]\\:hidden:is(:where(.tw\\:group\\/avatar)[data-size=sm] *)>svg,.tw\\:\\[\\&\\>svg\\:last-child\\]\\:hidden>svg:last-child{display:none}.tw\\:\\[\\&\\>svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3\\.5>svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&\\>svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>tr\\]\\:last\\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:\\[\\&\\[align\\=center\\]\\]\\:text-center[align=center]{text-align:center}.tw\\:\\[\\&\\[align\\=right\\]\\]\\:text-right[align=right]{text-align:right}.tw\\:\\[\\&\\[aria-orientation\\=horizontal\\]\\>div\\]\\:rotate-90[aria-orientation=horizontal]>div{rotate:90deg}[data-side=primary][data-collapsible=offcanvas] .tw\\:\\[\\[data-side\\=primary\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-end-2{inset-inline-end:calc(calc(var(--spacing)) * -2)}[data-side=primary][data-state=collapsed] .tw\\:\\[\\[data-side\\=primary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-e-resize{cursor:e-resize}[data-side=primary][data-state=collapsed] .tw\\:rtl\\:\\[\\[data-side\\=primary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-w-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:w-resize}[data-side=secondary][data-collapsible=offcanvas] .tw\\:\\[\\[data-side\\=secondary\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-start-2{inset-inline-start:calc(calc(var(--spacing)) * -2)}[data-side=secondary][data-state=collapsed] .tw\\:\\[\\[data-side\\=secondary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-w-resize{cursor:w-resize}[data-side=secondary][data-state=collapsed] .tw\\:rtl\\:\\[\\[data-side\\=secondary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-e-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:e-resize}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-cyrillic-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-cyrillic-wght-normal.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-greek-wght-normal.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-vietnamese-wght-normal.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-latin-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-latin-wght-normal.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}.light,:root{--radius:.625rem;--spacing:.25rem;--background:oklch(100% 0 0);--foreground:oklch(13.71% .036 258.53);--card:oklch(100% 0 0);--card-foreground:oklch(13.71% .036 258.53);--popover:oklch(98.43% .0018 248.56);--popover-foreground:oklch(13.71% .036 258.53);--primary:oklch(20.79% .0399 265.73);--primary-foreground:oklch(98.38% .0036 248.23);--secondary:oklch(95.89% .011 248.06);--secondary-foreground:oklch(20.79% .0399 265.73);--muted:oklch(95.89% .011 248.06);--muted-foreground:oklch(55.47% .0408 257.45);--accent:oklch(95.89% .011 248.06);--accent-foreground:oklch(20.79% .0399 265.73);--destructive:oklch(63.69% .2077 25.32);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(62.7% .194 149.214);--diff-deleted:oklch(57.7% .245 27.325);--warning:oklch(84% .16 84);--warning-foreground:oklch(28% .07 46);--border:oklch(92.9% .0127 255.58);--input:oklch(92.9% .0127 255.58);--ring:oklch(13.71% .036 258.53);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.43% .0018 248.56);--sidebar-foreground:oklch(13.71% .036 258.53);--sidebar-primary:oklch(20.79% .0399 265.73);--sidebar-primary-foreground:oklch(98.38% .0036 248.23);--sidebar-accent:oklch(95.89% .011 248.06);--sidebar-accent-foreground:oklch(20.79% .0399 265.73);--sidebar-border:oklch(92.9% .0127 255.58);--sidebar-ring:oklch(13.71% .036 258.53)}.dark{--background:oklch(13.71% .036 258.53);--foreground:oklch(98.38% .0036 248.23);--card:oklch(13.71% .036 258.53);--card-foreground:oklch(98.38% .0036 248.23);--popover:oklch(13.71% .036 258.53);--popover-foreground:oklch(98.38% .0036 248.23);--primary:oklch(98.38% .0036 248.23);--primary-foreground:oklch(20.79% .0399 265.73);--secondary:oklch(28% .037 259.98);--secondary-foreground:oklch(98.38% .0036 248.23);--muted:oklch(28% .037 259.98);--muted-foreground:oklch(71.07% .0351 256.8);--accent:oklch(28% .037 259.98);--accent-foreground:oklch(98.38% .0036 248.23);--destructive:oklch(39.6% .1331 25.71);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(79.2% .209 151.711);--diff-deleted:oklch(70.4% .191 22.216);--warning:oklch(41% .11 46);--warning-foreground:oklch(99% .02 95);--border:oklch(44.54% .0374 257.3);--input:oklch(44.54% .0374 257.3);--ring:oklch(86.88% .0199 252.89);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(13.71% .036 258.53);--sidebar-foreground:oklch(71.07% .0351 256.8);--sidebar-primary:oklch(98.38% .0036 248.23);--sidebar-primary-foreground:oklch(20.79% .0399 265.73);--sidebar-accent:oklch(28% .037 259.98);--sidebar-accent-foreground:oklch(71.07% .0351 256.8);--sidebar-border:oklch(28% .037 259.98);--sidebar-ring:oklch(86.88% .0199 252.89)}.paratext-light{--background:oklch(100% 0 0);--foreground:oklch(15.3% .006 107.1);--card:oklch(100% 0 0);--card-foreground:oklch(15.3% .006 107.1);--popover:oklch(100% 0 0);--popover-foreground:oklch(15.3% .006 107.1);--primary:oklch(55.5% .163 48.998);--primary-foreground:oklch(98.7% .022 95.277);--secondary:oklch(96.7% .001 286.375);--secondary-foreground:oklch(21% .006 285.885);--muted:oklch(96.6% .005 106.5);--muted-foreground:oklch(58% .031 107.3);--accent:oklch(96.6% .005 106.5);--accent-foreground:oklch(22.8% .013 107.4);--destructive:oklch(57.7% .245 27.325);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(62.7% .194 149.214);--diff-deleted:oklch(57.7% .245 27.325);--warning:oklch(84% .16 84);--warning-foreground:oklch(28% .07 46);--border:oklch(93% .007 106.5);--input:oklch(93% .007 106.5);--ring:oklch(73.7% .021 106.9);--chart-1:oklch(88% .011 106.6);--chart-2:oklch(58% .031 107.3);--chart-3:oklch(46.6% .025 107.3);--chart-4:oklch(39.4% .023 107.4);--chart-5:oklch(28.6% .016 107.4);--sidebar:oklch(98.8% .003 106.5);--sidebar-foreground:oklch(15.3% .006 107.1);--sidebar-primary:oklch(66.6% .179 58.318);--sidebar-primary-foreground:oklch(98.7% .022 95.277);--sidebar-accent:oklch(96.6% .005 106.5);--sidebar-accent-foreground:oklch(22.8% .013 107.4);--sidebar-border:oklch(93% .007 106.5);--sidebar-ring:oklch(73.7% .021 106.9)}.paratext-dark{--background:oklch(15.3% .006 107.1);--foreground:oklch(98.8% .003 106.5);--card:oklch(22.8% .013 107.4);--card-foreground:oklch(98.8% .003 106.5);--popover:oklch(22.8% .013 107.4);--popover-foreground:oklch(98.8% .003 106.5);--primary:oklch(47.3% .137 46.201);--primary-foreground:oklch(98.7% .022 95.277);--secondary:oklch(27.4% .006 286.033);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(28.6% .016 107.4);--muted-foreground:oklch(73.7% .021 106.9);--accent:oklch(28.6% .016 107.4);--accent-foreground:oklch(98.8% .003 106.5);--destructive:oklch(70.4% .191 22.216);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(79.2% .209 151.711);--diff-deleted:oklch(70.4% .191 22.216);--warning:oklch(41% .11 46);--warning-foreground:oklch(99% .02 95);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(58% .031 107.3);--chart-1:oklch(88% .011 106.6);--chart-2:oklch(58% .031 107.3);--chart-3:oklch(46.6% .025 107.3);--chart-4:oklch(39.4% .023 107.4);--chart-5:oklch(28.6% .016 107.4);--sidebar:oklch(22.8% .013 107.4);--sidebar-foreground:oklch(98.8% .003 106.5);--sidebar-primary:oklch(76.9% .188 70.08);--sidebar-primary-foreground:oklch(27.9% .077 45.635);--sidebar-accent:oklch(28.6% .016 107.4);--sidebar-accent-foreground:oklch(98.8% .003 106.5);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(58% .031 107.3)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}} +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--tw-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--tw-color-red-100:oklch(93.6% .032 17.717);--tw-color-red-200:oklch(88.5% .062 18.334);--tw-color-red-300:oklch(80.8% .114 19.571);--tw-color-red-400:oklch(70.4% .191 22.216);--tw-color-red-500:oklch(63.7% .237 25.331);--tw-color-red-600:oklch(57.7% .245 27.325);--tw-color-red-700:oklch(50.5% .213 27.518);--tw-color-red-800:oklch(44.4% .177 26.899);--tw-color-orange-100:oklch(95.4% .038 75.164);--tw-color-orange-800:oklch(47% .157 37.304);--tw-color-amber-200:oklch(92.4% .12 95.746);--tw-color-amber-400:oklch(82.8% .189 84.429);--tw-color-amber-500:oklch(76.9% .188 70.08);--tw-color-amber-600:oklch(66.6% .179 58.318);--tw-color-yellow-50:oklch(98.7% .026 102.212);--tw-color-yellow-100:oklch(97.3% .071 103.193);--tw-color-yellow-400:oklch(85.2% .199 91.936);--tw-color-yellow-500:oklch(79.5% .184 86.047);--tw-color-yellow-600:oklch(68.1% .162 75.834);--tw-color-yellow-700:oklch(55.4% .135 66.442);--tw-color-green-50:oklch(98.2% .018 155.826);--tw-color-green-100:oklch(96.2% .044 156.743);--tw-color-green-500:oklch(72.3% .219 149.579);--tw-color-green-600:oklch(62.7% .194 149.214);--tw-color-green-700:oklch(52.7% .154 150.069);--tw-color-green-800:oklch(44.8% .119 151.328);--tw-color-teal-400:oklch(77.7% .152 181.912);--tw-color-teal-500:oklch(70.4% .14 182.503);--tw-color-teal-600:oklch(60% .118 184.704);--tw-color-sky-400:oklch(74.6% .16 232.661);--tw-color-sky-500:oklch(68.5% .169 237.323);--tw-color-sky-600:oklch(58.8% .158 241.966);--tw-color-blue-50:oklch(97% .014 254.604);--tw-color-blue-100:oklch(93.2% .032 255.585);--tw-color-blue-400:oklch(70.7% .165 254.624);--tw-color-blue-500:oklch(62.3% .214 259.815);--tw-color-blue-600:oklch(54.6% .245 262.881);--tw-color-blue-800:oklch(42.4% .199 265.638);--tw-color-indigo-200:oklch(87% .065 274.039);--tw-color-purple-50:oklch(97.7% .014 308.299);--tw-color-purple-200:oklch(90.2% .063 306.703);--tw-color-purple-900:oklch(38.1% .176 304.987);--tw-color-rose-400:oklch(71.2% .194 13.428);--tw-color-rose-500:oklch(64.5% .246 16.439);--tw-color-rose-600:oklch(58.6% .253 17.585);--tw-color-slate-300:oklch(86.9% .022 252.894);--tw-color-slate-400:oklch(70.4% .04 256.788);--tw-color-slate-900:oklch(20.8% .042 265.755);--tw-color-gray-50:oklch(98.5% .002 247.839);--tw-color-gray-100:oklch(96.7% .003 264.542);--tw-color-gray-300:oklch(87.2% .01 258.338);--tw-color-gray-500:oklch(55.1% .027 264.364);--tw-color-gray-600:oklch(44.6% .03 256.802);--tw-color-gray-700:oklch(37.3% .034 259.733);--tw-color-gray-800:oklch(27.8% .033 256.848);--tw-color-zinc-400:oklch(70.5% .015 286.067);--tw-color-neutral-300:oklch(87% 0 0);--tw-color-black:#000;--tw-color-white:#fff;--tw-container-xs:20rem;--tw-container-sm:24rem;--tw-container-md:28rem;--tw-container-lg:32rem;--tw-container-2xl:42rem;--tw-container-3xl:48rem;--tw-container-4xl:56rem;--tw-container-6xl:72rem;--tw-text-xs:.75rem;--tw-text-xs--line-height:calc(1 / .75);--tw-text-sm:.875rem;--tw-text-sm--line-height:calc(1.25 / .875);--tw-text-base:1rem;--tw-text-base--line-height:calc(1.5 / 1);--tw-text-lg:1.125rem;--tw-text-lg--line-height:calc(1.75 / 1.125);--tw-text-xl:1.25rem;--tw-text-xl--line-height:calc(1.75 / 1.25);--tw-text-2xl:1.5rem;--tw-text-2xl--line-height:calc(2 / 1.5);--tw-text-3xl:1.875rem;--tw-text-3xl--line-height:calc(2.25 / 1.875);--tw-text-4xl:2.25rem;--tw-text-4xl--line-height:calc(2.5 / 2.25);--tw-text-5xl:3rem;--tw-text-5xl--line-height:1;--tw-font-weight-normal:400;--tw-font-weight-medium:500;--tw-font-weight-semibold:600;--tw-font-weight-bold:700;--tw-font-weight-extrabold:800;--tw-tracking-tight:-.025em;--tw-tracking-wider:.05em;--tw-tracking-widest:.1em;--tw-leading-tight:1.25;--tw-leading-snug:1.375;--tw-leading-relaxed:1.625;--tw-leading-loose:2;--tw-radius-xs:.125rem;--tw-radius-md:calc(var(--radius) * .8);--tw-drop-shadow-sm:0 1px 2px #00000026;--tw-animate-spin:spin 1s linear infinite;--tw-animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--tw-blur-xs:4px;--tw-blur-2xl:40px;--tw-default-transition-duration:.15s;--tw-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--tw-default-font-family:"IBM Plex Sans Variable", sans-serif;--tw-default-mono-font-family:var(--tw-font-mono)}}@layer base{.pr-twp,.pr-twp *{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.pr-twp,.pr-twp *{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body.pr-twp{background-color:var(--background);color:var(--foreground)}html.pr-twp{font-family:IBM Plex Sans Variable,sans-serif}:where(.pr-twp,.pr-twp *),:where(.pr-twp,.pr-twp *):after,:where(.pr-twp,.pr-twp *):before,:where(.pr-twp,.pr-twp *) ::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}:where(.pr-twp,.pr-twp *) ::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}.pr-twp{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--tw-default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--tw-default-font-feature-settings,normal);font-variation-settings:var(--tw-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr:where(.pr-twp,.pr-twp *){height:0;color:inherit;border-top-width:1px}abbr:where([title]):where(.pr-twp,.pr-twp *){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1:where(.pr-twp,.pr-twp *),h2:where(.pr-twp,.pr-twp *),h3:where(.pr-twp,.pr-twp *),h4:where(.pr-twp,.pr-twp *),h5:where(.pr-twp,.pr-twp *),h6:where(.pr-twp,.pr-twp *){font-size:inherit;font-weight:inherit}a:where(.pr-twp,.pr-twp *){color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b:where(.pr-twp,.pr-twp *),strong:where(.pr-twp,.pr-twp *){font-weight:bolder}code:where(.pr-twp,.pr-twp *),kbd:where(.pr-twp,.pr-twp *),samp:where(.pr-twp,.pr-twp *),pre:where(.pr-twp,.pr-twp *){font-family:var(--tw-default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--tw-default-mono-font-feature-settings,normal);font-variation-settings:var(--tw-default-mono-font-variation-settings,normal);font-size:1em}small:where(.pr-twp,.pr-twp *){font-size:80%}sub:where(.pr-twp,.pr-twp *),sup:where(.pr-twp,.pr-twp *){vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub:where(.pr-twp,.pr-twp *){bottom:-.25em}sup:where(.pr-twp,.pr-twp *){top:-.5em}table:where(.pr-twp,.pr-twp *){text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(.pr-twp,.pr-twp *){outline:auto}progress:where(.pr-twp,.pr-twp *){vertical-align:baseline}summary:where(.pr-twp,.pr-twp *){display:list-item}ol:where(.pr-twp,.pr-twp *),ul:where(.pr-twp,.pr-twp *),menu:where(.pr-twp,.pr-twp *){list-style:none}img:where(.pr-twp,.pr-twp *),svg:where(.pr-twp,.pr-twp *),video:where(.pr-twp,.pr-twp *),canvas:where(.pr-twp,.pr-twp *),audio:where(.pr-twp,.pr-twp *),iframe:where(.pr-twp,.pr-twp *),embed:where(.pr-twp,.pr-twp *),object:where(.pr-twp,.pr-twp *){vertical-align:middle;display:block}img:where(.pr-twp,.pr-twp *),video:where(.pr-twp,.pr-twp *){max-width:100%;height:auto}button:where(.pr-twp,.pr-twp *),input:where(.pr-twp,.pr-twp *),select:where(.pr-twp,.pr-twp *),optgroup:where(.pr-twp,.pr-twp *),textarea:where(.pr-twp,.pr-twp *){font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(.pr-twp,.pr-twp *) ::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup:where(.pr-twp,.pr-twp *){font-weight:bolder}:where(select:is([multiple],[size])) optgroup option:where(.pr-twp,.pr-twp *){padding-inline-start:20px}:where(.pr-twp,.pr-twp *) ::file-selector-button{margin-inline-end:4px}:where(.pr-twp,.pr-twp *) ::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){:where(.pr-twp,.pr-twp *) ::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){:where(.pr-twp,.pr-twp *) ::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea:where(.pr-twp,.pr-twp *){resize:vertical}:where(.pr-twp,.pr-twp *) ::-webkit-search-decoration{-webkit-appearance:none}:where(.pr-twp,.pr-twp *) ::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit{display:inline-flex}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-fields-wrapper{padding:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-year-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-month-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-day-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-hour-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-minute-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-second-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-millisecond-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-meridiem-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid:where(.pr-twp,.pr-twp *){box-shadow:none}button:where(.pr-twp,.pr-twp *),input:where([type=button],[type=reset],[type=submit]):where(.pr-twp,.pr-twp *){appearance:button}:where(.pr-twp,.pr-twp *) ::file-selector-button{appearance:button}:where(.pr-twp,.pr-twp *) ::-webkit-inner-spin-button{height:auto}:where(.pr-twp,.pr-twp *) ::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])):where(.pr-twp,.pr-twp *){display:none!important}}@layer components;@layer utilities{.tw\\:\\@container\\/card-header{container:card-header/inline-size}.tw\\:\\@container\\/search{container:search/inline-size}.tw\\:\\@container\\/toolbar{container:toolbar/inline-size}.tw\\:pointer-events-auto{pointer-events:auto}.tw\\:pointer-events-none{pointer-events:none}.tw\\:invisible{visibility:hidden}.tw\\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.tw\\:absolute{position:absolute}.tw\\:fixed{position:fixed}.tw\\:relative{position:relative}.tw\\:sticky{position:sticky}.tw\\:inset-0{inset:calc(calc(var(--spacing)) * 0)}.tw\\:inset-y-0{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:inset-s-3{inset-inline-start:calc(calc(var(--spacing)) * 3)}.tw\\:start-1\\.5{inset-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:start-1\\/2{inset-inline-start:50%}.tw\\:end-0{inset-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:end-1{inset-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:end-2{inset-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:end-3{inset-inline-end:calc(calc(var(--spacing)) * 3)}.tw\\:inset-e-0{inset-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:-top-\\[1px\\]{top:-1px}.tw\\:top-0{top:calc(calc(var(--spacing)) * 0)}.tw\\:top-1{top:calc(calc(var(--spacing)) * 1)}.tw\\:top-1\\.5{top:calc(calc(var(--spacing)) * 1.5)}.tw\\:top-1\\/2{top:50%}.tw\\:top-1\\/3{top:33.3333%}.tw\\:top-2{top:calc(calc(var(--spacing)) * 2)}.tw\\:top-2\\.5{top:calc(calc(var(--spacing)) * 2.5)}.tw\\:top-3\\.5{top:calc(calc(var(--spacing)) * 3.5)}.tw\\:top-\\[-1px\\]{top:-1px}.tw\\:top-full{top:100%}.tw\\:-right-1{right:calc(calc(var(--spacing)) * -1)}.tw\\:right-0{right:calc(calc(var(--spacing)) * 0)}.tw\\:right-1{right:calc(calc(var(--spacing)) * 1)}.tw\\:right-3{right:calc(calc(var(--spacing)) * 3)}.tw\\:bottom-0{bottom:calc(calc(var(--spacing)) * 0)}.tw\\:-left-\\[1px\\]{left:-1px}.tw\\:left-0{left:calc(calc(var(--spacing)) * 0)}.tw\\:left-1\\/2{left:50%}.tw\\:left-2{left:calc(calc(var(--spacing)) * 2)}.tw\\:left-3{left:calc(calc(var(--spacing)) * 3)}.tw\\:isolate{isolation:isolate}.tw\\:z-10{z-index:10}.tw\\:z-20{z-index:20}.tw\\:z-50{z-index:50}.tw\\:order-first{order:-9999}.tw\\:order-last{order:9999}.tw\\:col-span-1{grid-column:span 1/span 1}.tw\\:col-span-2{grid-column:span 2/span 2}.tw\\:col-span-3{grid-column:span 3/span 3}.tw\\:col-start-1{grid-column-start:1}.tw\\:col-start-2{grid-column-start:2}.tw\\:row-span-2{grid-row:span 2/span 2}.tw\\:row-start-1{grid-row-start:1}.tw\\:row-start-2{grid-row-start:2}.tw\\:m-0{margin:calc(calc(var(--spacing)) * 0)}.tw\\:m-1{margin:calc(calc(var(--spacing)) * 1)}.tw\\:m-2{margin:calc(calc(var(--spacing)) * 2)}.tw\\:-mx-1{margin-inline:calc(calc(var(--spacing)) * -1)}.tw\\:-mx-4{margin-inline:calc(calc(var(--spacing)) * -4)}.tw\\:mx-0{margin-inline:calc(calc(var(--spacing)) * 0)}.tw\\:mx-1{margin-inline:calc(calc(var(--spacing)) * 1)}.tw\\:mx-2{margin-inline:calc(calc(var(--spacing)) * 2)}.tw\\:mx-3\\.5{margin-inline:calc(calc(var(--spacing)) * 3.5)}.tw\\:mx-4{margin-inline:calc(calc(var(--spacing)) * 4)}.tw\\:mx-8{margin-inline:calc(calc(var(--spacing)) * 8)}.tw\\:my-1{margin-block:calc(calc(var(--spacing)) * 1)}.tw\\:my-2\\.5{margin-block:calc(calc(var(--spacing)) * 2.5)}.tw\\:my-4{margin-block:calc(calc(var(--spacing)) * 4)}.tw\\:my-auto{margin-block:auto}.tw\\:ms-1{margin-inline-start:calc(calc(var(--spacing)) * 1)}.tw\\:ms-2{margin-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:ms-5{margin-inline-start:calc(calc(var(--spacing)) * 5)}.tw\\:ms-6{margin-inline-start:calc(calc(var(--spacing)) * 6)}.tw\\:ms-auto{margin-inline-start:auto}.tw\\:me-1{margin-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:me-2{margin-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:prose{color:var(--tw-prose-body);max-width:65ch}.tw\\:prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.tw\\:prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);margin-top:1.2em;margin-bottom:1.2em;font-size:1.25em;line-height:1.6}.tw\\:prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.tw\\:prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.tw\\:prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:decimal}.tw\\:prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.tw\\:prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.tw\\:prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.tw\\:prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.tw\\:prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.tw\\:prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.tw\\:prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.tw\\:prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.tw\\:prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.tw\\:prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:disc}.tw\\:prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.tw\\:prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.tw\\:prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.25em;font-weight:600}.tw\\:prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.tw\\:prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;font-style:italic;font-weight:500}.tw\\:prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.tw\\:prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.tw\\:prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:0;margin-bottom:.888889em;font-size:2.25em;font-weight:800;line-height:1.11111}.tw\\:prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.tw\\:prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:2em;margin-bottom:1em;font-size:1.5em;font-weight:700;line-height:1.33333}.tw\\:prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.tw\\:prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.6em;margin-bottom:.6em;font-size:1.25em;font-weight:600;line-height:1.6}.tw\\:prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.tw\\:prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.5}.tw\\:prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.tw\\:prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em;display:block}.tw\\:prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-kbd);box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%), 0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%);padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;border-radius:.3125rem;padding-inline-start:.375em;font-family:inherit;font-size:.875em;font-weight:500}.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"\`"}.tw\\:prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.tw\\:prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.tw\\:prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);padding-top:.857143em;padding-inline-end:1.14286em;padding-bottom:.857143em;border-radius:.375rem;margin-top:1.71429em;margin-bottom:1.71429em;padding-inline-start:1.14286em;font-size:.875em;font-weight:400;line-height:1.71429;overflow-x:auto}.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit;background-color:#0000;border-width:0;border-radius:0;padding:0}.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.tw\\:prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){table-layout:auto;width:100%;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.71429}.tw\\:prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.tw\\:prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);vertical-align:bottom;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em;font-weight:600}.tw\\:prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.tw\\:prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.tw\\:prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.tw\\:prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.tw\\:prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.tw\\:prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.tw\\:prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);margin-top:.857143em;font-size:.875em;line-height:1.42857}.tw\\:prose{--tw-prose-body:var(--foreground);--tw-prose-headings:var(--foreground);--tw-prose-lead:var(--muted-foreground);--tw-prose-links:var(--primary);--tw-prose-bold:var(--foreground);--tw-prose-counters:var(--muted-foreground);--tw-prose-bullets:var(--muted-foreground);--tw-prose-hr:var(--border);--tw-prose-quotes:var(--foreground);--tw-prose-quote-borders:var(--border);--tw-prose-captions:var(--muted-foreground);--tw-prose-kbd:oklch(21% .034 264.665);--tw-prose-kbd-shadows:NaN NaN NaN;--tw-prose-code:var(--foreground);--tw-prose-pre-code:var(--muted-foreground);--tw-prose-pre-bg:var(--muted);--tw-prose-th-borders:var(--border);--tw-prose-td-borders:var(--border);--tw-prose-invert-body:var(--foreground);--tw-prose-invert-headings:var(--foreground);--tw-prose-invert-lead:var(--muted-foreground);--tw-prose-invert-links:var(--primary);--tw-prose-invert-bold:var(--foreground);--tw-prose-invert-counters:var(--muted-foreground);--tw-prose-invert-bullets:var(--muted-foreground);--tw-prose-invert-hr:var(--border);--tw-prose-invert-quotes:var(--foreground);--tw-prose-invert-quote-borders:var(--border);--tw-prose-invert-captions:var(--muted-foreground);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:var(--foreground);--tw-prose-invert-pre-code:var(--muted-foreground);--tw-prose-invert-pre-bg:var(--muted);--tw-prose-invert-th-borders:var(--border);--tw-prose-invert-td-borders:var(--border);font-size:1rem;line-height:1.75}.tw\\:prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.tw\\:prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.tw\\:prose :where(.tw\\:prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.tw\\:prose :where(.tw\\:prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.tw\\:prose :where(.tw\\:prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.tw\\:prose :where(.tw\\:prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.tw\\:prose :where(.tw\\:prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.tw\\:prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.tw\\:prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.tw\\:prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.tw\\:prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.571429em;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em}.tw\\:prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(.tw\\:prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose :where(.tw\\:prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.tw\\:prose-sm{font-size:.875rem;line-height:1.71429}.tw\\:prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.tw\\:prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.888889em;margin-bottom:.888889em;font-size:1.28571em;line-height:1.55556}.tw\\:prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.33333em;margin-bottom:1.33333em;padding-inline-start:1.11111em}.tw\\:prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:.8em;font-size:2.14286em;line-height:1.2}.tw\\:prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6em;margin-bottom:.8em;font-size:1.42857em;line-height:1.4}.tw\\:prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.55556em;margin-bottom:.444444em;font-size:1.28571em;line-height:1.55556}.tw\\:prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.42857em;margin-bottom:.571429em;line-height:1.42857}.tw\\:prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.142857em;padding-inline-end:.357143em;padding-bottom:.142857em;border-radius:.3125rem;padding-inline-start:.357143em;font-size:.857143em}.tw\\:prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em}.tw\\:prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.tw\\:prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.888889em}.tw\\:prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;border-radius:.25rem;margin-top:1.66667em;margin-bottom:1.66667em;padding-inline-start:1em;font-size:.857143em;line-height:1.66667}.tw\\:prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em;padding-inline-start:1.57143em}.tw\\:prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;margin-bottom:.285714em}.tw\\:prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.428571em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.tw\\:prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.tw\\:prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.tw\\:prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;padding-inline-start:1.57143em}.tw\\:prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.85714em;margin-bottom:2.85714em}.tw\\:prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em;line-height:1.5}.tw\\:prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.tw\\:prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.tw\\:prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.666667em;font-size:.857143em;line-height:1.33333}.tw\\:prose-sm :where(.tw\\:prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose-sm :where(.tw\\:prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.tw\\:-mt-4{margin-top:calc(calc(var(--spacing)) * -4)}.tw\\:mt-0\\.5{margin-top:calc(calc(var(--spacing)) * .5)}.tw\\:mt-1{margin-top:calc(calc(var(--spacing)) * 1)}.tw\\:mt-2{margin-top:calc(calc(var(--spacing)) * 2)}.tw\\:mt-3{margin-top:calc(calc(var(--spacing)) * 3)}.tw\\:mt-4{margin-top:calc(calc(var(--spacing)) * 4)}.tw\\:mt-6{margin-top:calc(calc(var(--spacing)) * 6)}.tw\\:mt-auto{margin-top:auto}.tw\\:mr-1{margin-right:calc(calc(var(--spacing)) * 1)}.tw\\:mr-2{margin-right:calc(calc(var(--spacing)) * 2)}.tw\\:mr-3{margin-right:calc(calc(var(--spacing)) * 3)}.tw\\:-mb-4{margin-bottom:calc(calc(var(--spacing)) * -4)}.tw\\:mb-1{margin-bottom:calc(calc(var(--spacing)) * 1)}.tw\\:mb-2{margin-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:mb-3{margin-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:mb-4{margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:ml-1{margin-left:calc(calc(var(--spacing)) * 1)}.tw\\:ml-2{margin-left:calc(calc(var(--spacing)) * 2)}.tw\\:ml-4{margin-left:calc(calc(var(--spacing)) * 4)}.tw\\:ml-auto{margin-left:auto}.tw\\:box-border{box-sizing:border-box}.tw\\:line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.tw\\:no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.tw\\:no-scrollbar::-webkit-scrollbar{display:none}.tw\\:block{display:block}.tw\\:flex{display:flex}.tw\\:grid{display:grid}.tw\\:hidden{display:none}.tw\\:inline-block{display:inline-block}.tw\\:inline-flex{display:inline-flex}.tw\\:inline-grid{display:inline-grid}.tw\\:field-sizing-content{field-sizing:content}.tw\\:aspect-square{aspect-ratio:1}.tw\\:size-2{width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:size-2\\.5{width:calc(calc(var(--spacing)) * 2.5);height:calc(calc(var(--spacing)) * 2.5)}.tw\\:size-3{width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:size-3\\.5{width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:size-4{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:size-6{width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:size-7{width:calc(calc(var(--spacing)) * 7);height:calc(calc(var(--spacing)) * 7)}.tw\\:size-8{width:calc(calc(var(--spacing)) * 8);height:calc(calc(var(--spacing)) * 8)}.tw\\:size-9{width:calc(calc(var(--spacing)) * 9);height:calc(calc(var(--spacing)) * 9)}.tw\\:size-10{width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:size-full{width:100%;height:100%}.tw\\:h-1{height:calc(calc(var(--spacing)) * 1)}.tw\\:h-2{height:calc(calc(var(--spacing)) * 2)}.tw\\:h-3{height:calc(calc(var(--spacing)) * 3)}.tw\\:h-3\\.5{height:calc(calc(var(--spacing)) * 3.5)}.tw\\:h-4{height:calc(calc(var(--spacing)) * 4)}.tw\\:h-5{height:calc(calc(var(--spacing)) * 5)}.tw\\:h-6{height:calc(calc(var(--spacing)) * 6)}.tw\\:h-7{height:calc(calc(var(--spacing)) * 7)}.tw\\:h-8{height:calc(calc(var(--spacing)) * 8)}.tw\\:h-8\\!{height:calc(calc(var(--spacing)) * 8)!important}.tw\\:h-8\\.5{height:calc(calc(var(--spacing)) * 8.5)}.tw\\:h-9{height:calc(calc(var(--spacing)) * 9)}.tw\\:h-10{height:calc(calc(var(--spacing)) * 10)}.tw\\:h-12{height:calc(calc(var(--spacing)) * 12)}.tw\\:h-14{height:calc(calc(var(--spacing)) * 14)}.tw\\:h-20{height:calc(calc(var(--spacing)) * 20)}.tw\\:h-24{height:calc(calc(var(--spacing)) * 24)}.tw\\:h-32{height:calc(calc(var(--spacing)) * 32)}.tw\\:h-40{height:calc(calc(var(--spacing)) * 40)}.tw\\:h-64{height:calc(calc(var(--spacing)) * 64)}.tw\\:h-80{height:calc(calc(var(--spacing)) * 80)}.tw\\:h-96{height:calc(calc(var(--spacing)) * 96)}.tw\\:h-\\[5px\\]{height:5px}.tw\\:h-\\[260px\\]{height:260px}.tw\\:h-\\[300px\\]{height:300px}.tw\\:h-\\[400px\\]{height:400px}.tw\\:h-\\[600px\\]{height:600px}.tw\\:h-\\[calc\\(100\\%-1px\\)\\]{height:calc(100% - 1px)}.tw\\:h-\\[calc\\(100\\%-2px\\)\\]{height:calc(100% - 2px)}.tw\\:h-auto{height:auto}.tw\\:h-full{height:100%}.tw\\:h-px{height:1px}.tw\\:h-screen{height:100vh}.tw\\:h-svh{height:100svh}.tw\\:max-h-\\(--radix-context-menu-content-available-height\\){max-height:var(--radix-context-menu-content-available-height)}.tw\\:max-h-\\(--radix-dropdown-menu-content-available-height\\){max-height:var(--radix-dropdown-menu-content-available-height)}.tw\\:max-h-\\(--radix-popover-content-available-height\\){max-height:var(--radix-popover-content-available-height)}.tw\\:max-h-\\(--radix-select-content-available-height\\){max-height:var(--radix-select-content-available-height)}.tw\\:max-h-5{max-height:calc(calc(var(--spacing)) * 5)}.tw\\:max-h-10{max-height:calc(calc(var(--spacing)) * 10)}.tw\\:max-h-72{max-height:calc(calc(var(--spacing)) * 72)}.tw\\:max-h-80{max-height:calc(calc(var(--spacing)) * 80)}.tw\\:max-h-\\[96\\%\\]{max-height:96%}.tw\\:max-h-\\[300px\\]{max-height:300px}.tw\\:max-h-\\[calc\\(var\\(--radix-dropdown-menu-content-available-height\\,100vh\\)\\/var\\(--platform-content-zoom-popup-factor\\,1\\)\\)\\]{max-height:calc(var(--radix-dropdown-menu-content-available-height,100vh) / var(--platform-content-zoom-popup-factor,1))}.tw\\:max-h-\\[calc\\(var\\(--radix-popover-content-available-height\\,100vh\\)\\/var\\(--platform-content-zoom-popup-factor\\,1\\)\\)\\]{max-height:calc(var(--radix-popover-content-available-height,100vh) / var(--platform-content-zoom-popup-factor,1))}.tw\\:min-h-0{min-height:calc(calc(var(--spacing)) * 0)}.tw\\:min-h-11{min-height:calc(calc(var(--spacing)) * 11)}.tw\\:min-h-16{min-height:calc(calc(var(--spacing)) * 16)}.tw\\:min-h-\\[200px\\]{min-height:200px}.tw\\:min-h-full{min-height:100%}.tw\\:min-h-svh{min-height:100svh}.tw\\:w-\\(--radix-dropdown-menu-trigger-width\\){width:var(--radix-dropdown-menu-trigger-width)}.tw\\:w-\\(--sidebar-width\\){width:var(--sidebar-width)}.tw\\:w-1{width:calc(calc(var(--spacing)) * 1)}.tw\\:w-1\\/2{width:50%}.tw\\:w-1\\/4{width:25%}.tw\\:w-1\\/6{width:16.6667%}.tw\\:w-2{width:calc(calc(var(--spacing)) * 2)}.tw\\:w-3{width:calc(calc(var(--spacing)) * 3)}.tw\\:w-3\\.5{width:calc(calc(var(--spacing)) * 3.5)}.tw\\:w-3\\/4{width:75%}.tw\\:w-4{width:calc(calc(var(--spacing)) * 4)}.tw\\:w-4\\/5{width:80%}.tw\\:w-4\\/6{width:66.6667%}.tw\\:w-5{width:calc(calc(var(--spacing)) * 5)}.tw\\:w-5\\/6{width:83.3333%}.tw\\:w-6{width:calc(calc(var(--spacing)) * 6)}.tw\\:w-7{width:calc(calc(var(--spacing)) * 7)}.tw\\:w-8{width:calc(calc(var(--spacing)) * 8)}.tw\\:w-9{width:calc(calc(var(--spacing)) * 9)}.tw\\:w-9\\/12{width:75%}.tw\\:w-10{width:calc(calc(var(--spacing)) * 10)}.tw\\:w-12{width:calc(calc(var(--spacing)) * 12)}.tw\\:w-14{width:calc(calc(var(--spacing)) * 14)}.tw\\:w-20{width:calc(calc(var(--spacing)) * 20)}.tw\\:w-24{width:calc(calc(var(--spacing)) * 24)}.tw\\:w-32{width:calc(calc(var(--spacing)) * 32)}.tw\\:w-48{width:calc(calc(var(--spacing)) * 48)}.tw\\:w-56{width:calc(calc(var(--spacing)) * 56)}.tw\\:w-60{width:calc(calc(var(--spacing)) * 60)}.tw\\:w-64{width:calc(calc(var(--spacing)) * 64)}.tw\\:w-72{width:calc(calc(var(--spacing)) * 72)}.tw\\:w-80{width:calc(calc(var(--spacing)) * 80)}.tw\\:w-96{width:calc(calc(var(--spacing)) * 96)}.tw\\:w-\\[1px\\]{width:1px}.tw\\:w-\\[5px\\]{width:5px}.tw\\:w-\\[70px\\]{width:70px}.tw\\:w-\\[100px\\]{width:100px}.tw\\:w-\\[116px\\]{width:116px}.tw\\:w-\\[124px\\]{width:124px}.tw\\:w-\\[150px\\]{width:150px}.tw\\:w-\\[180px\\]{width:180px}.tw\\:w-\\[200px\\]{width:200px}.tw\\:w-\\[250px\\]{width:250px}.tw\\:w-\\[260px\\]{width:260px}.tw\\:w-\\[280px\\]{width:280px}.tw\\:w-\\[300px\\]{width:300px}.tw\\:w-\\[320px\\]{width:320px}.tw\\:w-\\[350px\\]{width:350px}.tw\\:w-\\[400px\\]{width:400px}.tw\\:w-\\[420px\\]{width:420px}.tw\\:w-\\[500px\\]{width:500px}.tw\\:w-\\[560px\\]{width:560px}.tw\\:w-\\[600px\\]{width:600px}.tw\\:w-\\[calc\\(100\\%-2px\\)\\]{width:calc(100% - 2px)}.tw\\:w-\\[var\\(--radix-dropdown-menu-trigger-width\\)\\]{width:var(--radix-dropdown-menu-trigger-width)}.tw\\:w-auto{width:auto}.tw\\:w-fit{width:fit-content}.tw\\:w-full{width:100%}.tw\\:w-max{width:max-content}.tw\\:w-px{width:1px}.tw\\:max-w-\\(--skeleton-width\\){max-width:var(--skeleton-width)}.tw\\:max-w-0{max-width:calc(calc(var(--spacing)) * 0)}.tw\\:max-w-2xl{max-width:var(--tw-container-2xl)}.tw\\:max-w-3xl{max-width:var(--tw-container-3xl)}.tw\\:max-w-4xl{max-width:var(--tw-container-4xl)}.tw\\:max-w-5{max-width:calc(calc(var(--spacing)) * 5)}.tw\\:max-w-6xl{max-width:var(--tw-container-6xl)}.tw\\:max-w-40{max-width:calc(calc(var(--spacing)) * 40)}.tw\\:max-w-48{max-width:calc(calc(var(--spacing)) * 48)}.tw\\:max-w-64{max-width:calc(calc(var(--spacing)) * 64)}.tw\\:max-w-96{max-width:calc(calc(var(--spacing)) * 96)}.tw\\:max-w-\\[200px\\]{max-width:200px}.tw\\:max-w-\\[220px\\]{max-width:220px}.tw\\:max-w-\\[calc\\(100\\%-2rem\\)\\]{max-width:calc(100% - 2rem)}.tw\\:max-w-\\[calc\\(100vw-2rem\\)\\]{max-width:calc(100vw - 2rem)}.tw\\:max-w-\\[calc\\(var\\(--radix-dropdown-menu-content-available-width\\,100vw\\)\\/var\\(--platform-content-zoom-popup-factor\\,1\\)\\)\\]{max-width:calc(var(--radix-dropdown-menu-content-available-width,100vw) / var(--platform-content-zoom-popup-factor,1))}.tw\\:max-w-\\[calc\\(var\\(--radix-popover-content-available-width\\,100vw\\)\\/var\\(--platform-content-zoom-popup-factor\\,1\\)\\)\\]{max-width:calc(var(--radix-popover-content-available-width,100vw) / var(--platform-content-zoom-popup-factor,1))}.tw\\:max-w-\\[min\\(20rem\\,calc\\(var\\(--radix-tooltip-content-available-width\\,100vw\\)\\/var\\(--platform-content-zoom-popup-factor\\,1\\)\\)\\)\\]{max-width:min(20rem, calc(var(--radix-tooltip-content-available-width,100vw) / var(--platform-content-zoom-popup-factor,1)))}.tw\\:max-w-fit{max-width:fit-content}.tw\\:max-w-full{max-width:100%}.tw\\:max-w-lg{max-width:var(--tw-container-lg)}.tw\\:max-w-md{max-width:var(--tw-container-md)}.tw\\:max-w-none{max-width:none}.tw\\:max-w-sm{max-width:var(--tw-container-sm)}.tw\\:max-w-xs{max-width:var(--tw-container-xs)}.tw\\:min-w-0{min-width:calc(calc(var(--spacing)) * 0)}.tw\\:min-w-4{min-width:calc(calc(var(--spacing)) * 4)}.tw\\:min-w-5{min-width:calc(calc(var(--spacing)) * 5)}.tw\\:min-w-7{min-width:calc(calc(var(--spacing)) * 7)}.tw\\:min-w-8{min-width:calc(calc(var(--spacing)) * 8)}.tw\\:min-w-9{min-width:calc(calc(var(--spacing)) * 9)}.tw\\:min-w-16{min-width:calc(calc(var(--spacing)) * 16)}.tw\\:min-w-32{min-width:calc(calc(var(--spacing)) * 32)}.tw\\:min-w-36{min-width:calc(calc(var(--spacing)) * 36)}.tw\\:min-w-80{min-width:calc(calc(var(--spacing)) * 80)}.tw\\:min-w-\\[12rem\\]{min-width:12rem}.tw\\:min-w-\\[26px\\]{min-width:26px}.tw\\:min-w-\\[96px\\]{min-width:96px}.tw\\:min-w-\\[140px\\]{min-width:140px}.tw\\:min-w-\\[215px\\]{min-width:215px}.tw\\:min-w-\\[500px\\]{min-width:500px}.tw\\:min-w-min{min-width:min-content}.tw\\:flex-1{flex:1}.tw\\:shrink{flex-shrink:1}.tw\\:shrink\\!{flex-shrink:1!important}.tw\\:shrink-0{flex-shrink:0}.tw\\:shrink-\\[9999\\]{flex-shrink:9999}.tw\\:flex-grow,.tw\\:grow,.tw\\:grow-\\[1\\]{flex-grow:1}.tw\\:grow-\\[10\\]{flex-grow:10}.tw\\:basis-0{flex-basis:calc(calc(var(--spacing)) * 0)}.tw\\:table-fixed{table-layout:fixed}.tw\\:caption-bottom{caption-side:bottom}.tw\\:border-collapse{border-collapse:collapse}.tw\\:origin-\\(--radix-context-menu-content-transform-origin\\){transform-origin:var(--radix-context-menu-content-transform-origin)}.tw\\:origin-\\(--radix-dropdown-menu-content-transform-origin\\){transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.tw\\:origin-\\(--radix-menubar-content-transform-origin\\){transform-origin:var(--radix-menubar-content-transform-origin)}.tw\\:origin-\\(--radix-popover-content-transform-origin\\){transform-origin:var(--radix-popover-content-transform-origin)}.tw\\:origin-\\(--radix-select-content-transform-origin\\){transform-origin:var(--radix-select-content-transform-origin)}.tw\\:origin-\\(--radix-tooltip-content-transform-origin\\){transform-origin:var(--radix-tooltip-content-transform-origin)}.tw\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-y-0{--tw-translate-y:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-y-px{--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rotate-45{rotate:45deg}.tw\\:rotate-180{rotate:180deg}.tw\\:transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.tw\\:animate-none\\!{animation:none!important}.tw\\:animate-pulse{animation:var(--tw-animate-pulse)}.tw\\:animate-spin{animation:var(--tw-animate-spin)}.tw\\:cursor-default{cursor:default}.tw\\:cursor-ew-resize{cursor:ew-resize}.tw\\:cursor-not-allowed{cursor:not-allowed}.tw\\:cursor-pointer{cursor:pointer}.tw\\:cursor-text{cursor:text}.tw\\:touch-none{touch-action:none}.tw\\:resize{resize:both}.tw\\:resize-none{resize:none}.tw\\:scroll-m-20{scroll-margin:calc(calc(var(--spacing)) * 20)}.tw\\:scroll-my-1{scroll-margin-block:calc(calc(var(--spacing)) * 1)}.tw\\:scroll-py-1{scroll-padding-block:calc(calc(var(--spacing)) * 1)}.tw\\:list-inside{list-style-position:inside}.tw\\:list-outside{list-style-position:outside}.tw\\:\\!list-\\[lower-alpha\\]{list-style-type:lower-alpha!important}.tw\\:\\!list-\\[lower-roman\\]{list-style-type:lower-roman!important}.tw\\:\\!list-\\[upper-alpha\\]{list-style-type:upper-alpha!important}.tw\\:\\!list-\\[upper-roman\\]{list-style-type:upper-roman!important}.tw\\:\\!list-decimal{list-style-type:decimal!important}.tw\\:\\!list-disc{list-style-type:disc!important}.tw\\:list-decimal{list-style-type:decimal}.tw\\:list-disc{list-style-type:disc}.tw\\:list-none{list-style-type:none}.tw\\:grid-flow-col{grid-auto-flow:column}.tw\\:grid-flow-row{grid-auto-flow:row}.tw\\:auto-rows-min{grid-auto-rows:min-content}.tw\\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.tw\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.tw\\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.tw\\:grid-cols-\\[25\\%_25\\%_50\\%\\]{grid-template-columns:25% 25% 50%}.tw\\:grid-cols-\\[25\\%_50\\%_25\\%\\]{grid-template-columns:25% 50% 25%}.tw\\:grid-cols-\\[auto_auto_auto_auto\\]{grid-template-columns:auto auto auto auto}.tw\\:grid-cols-\\[min-content_1fr\\]{grid-template-columns:min-content 1fr}.tw\\:grid-cols-\\[min-content_min-content_1fr\\]{grid-template-columns:min-content min-content 1fr}.tw\\:grid-cols-subgrid{grid-template-columns:subgrid}.tw\\:flex-col{flex-direction:column}.tw\\:flex-col-reverse{flex-direction:column-reverse}.tw\\:flex-row{flex-direction:row}.tw\\:flex-row-reverse{flex-direction:row-reverse}.tw\\:flex-nowrap{flex-wrap:nowrap}.tw\\:flex-wrap{flex-wrap:wrap}.tw\\:place-content-center{place-content:center}.tw\\:content-center{align-content:center}.tw\\:items-baseline{align-items:baseline}.tw\\:items-center{align-items:center}.tw\\:items-end{align-items:flex-end}.tw\\:items-start{align-items:flex-start}.tw\\:items-stretch{align-items:stretch}.tw\\:justify-between{justify-content:space-between}.tw\\:justify-center{justify-content:center}.tw\\:justify-end{justify-content:flex-end}.tw\\:justify-start{justify-content:flex-start}.tw\\:gap-0{gap:calc(calc(var(--spacing)) * 0)}.tw\\:gap-0\\.5{gap:calc(calc(var(--spacing)) * .5)}.tw\\:gap-1{gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-1\\.5{gap:calc(calc(var(--spacing)) * 1.5)}.tw\\:gap-1\\.5\\!{gap:calc(calc(var(--spacing)) * 1.5)!important}.tw\\:gap-2{gap:calc(calc(var(--spacing)) * 2)}.tw\\:gap-2\\.5{gap:calc(calc(var(--spacing)) * 2.5)}.tw\\:gap-3{gap:calc(calc(var(--spacing)) * 3)}.tw\\:gap-4{gap:calc(calc(var(--spacing)) * 4)}.tw\\:gap-5{gap:calc(calc(var(--spacing)) * 5)}.tw\\:gap-6{gap:calc(calc(var(--spacing)) * 6)}.tw\\:gap-8{gap:calc(calc(var(--spacing)) * 8)}.tw\\:gap-16{gap:calc(calc(var(--spacing)) * 16)}.tw\\:gap-\\[--spacing\\(var\\(--gap\\)\\)\\]{gap:calc(calc(var(--spacing)) * var(--gap))}.tw\\:gap-\\[12px\\]{gap:12px}:where(.tw\\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-1\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 8) * calc(1 - var(--tw-space-y-reverse)))}.tw\\:gap-x-1{column-gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-x-2{column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:gap-x-3{column-gap:calc(calc(var(--spacing)) * 3)}.tw\\:gap-x-4{column-gap:calc(calc(var(--spacing)) * 4)}:where(.tw\\:-space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * -2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * -2) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 3) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 3) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 4) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 6) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 6) * calc(1 - var(--tw-space-x-reverse)))}.tw\\:gap-y-1{row-gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-y-2{row-gap:calc(calc(var(--spacing)) * 2)}:where(.tw\\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.tw\\:divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}.tw\\:self-start{align-self:flex-start}.tw\\:self-stretch{align-self:stretch}.tw\\:justify-self-end{justify-self:flex-end}.tw\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tw\\:overflow-auto{overflow:auto}.tw\\:overflow-clip{overflow:clip}.tw\\:overflow-hidden{overflow:hidden}.tw\\:overflow-scroll{overflow:scroll}.tw\\:overflow-visible{overflow:visible}.tw\\:overflow-x-auto{overflow-x:auto}.tw\\:overflow-x-hidden{overflow-x:hidden}.tw\\:overflow-y-auto{overflow-y:auto}.tw\\:overflow-y-hidden{overflow-y:hidden}.tw\\:rounded{border-radius:.25rem}.tw\\:rounded-2xl{border-radius:calc(var(--radius) * 1.8)}.tw\\:rounded-4xl{border-radius:calc(var(--radius) * 2.6)}.tw\\:rounded-\\[4px\\]{border-radius:4px}.tw\\:rounded-\\[6px\\]{border-radius:6px}.tw\\:rounded-\\[calc\\(var\\(--radius\\)-3px\\)\\]{border-radius:calc(var(--radius) - 3px)}.tw\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,10px\\)\\]{border-radius:min(var(--tw-radius-md), 10px)}.tw\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,12px\\)\\]{border-radius:min(var(--tw-radius-md), 12px)}.tw\\:rounded-full{border-radius:3.40282e38px}.tw\\:rounded-lg{border-radius:var(--radius)}.tw\\:rounded-lg\\!{border-radius:var(--radius)!important}.tw\\:rounded-md{border-radius:calc(var(--radius) * .8)}.tw\\:rounded-none{border-radius:0}.tw\\:rounded-sm{border-radius:calc(var(--radius) * .6)}.tw\\:rounded-xl{border-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-xl\\!{border-radius:calc(var(--radius) * 1.4)!important}.tw\\:rounded-xs{border-radius:var(--tw-radius-xs)}.tw\\:rounded-s-none{border-start-start-radius:0;border-end-start-radius:0}.tw\\:rounded-e-none{border-start-end-radius:0;border-end-end-radius:0}.tw\\:rounded-t-xl{border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-l-lg{border-top-left-radius:var(--radius);border-bottom-left-radius:var(--radius)}.tw\\:rounded-r-xl{border-top-right-radius:calc(var(--radius) * 1.4);border-bottom-right-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-b-xl{border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:border{border-style:var(--tw-border-style);border-width:1px}.tw\\:border-0{border-style:var(--tw-border-style);border-width:0}.tw\\:border-2{border-style:var(--tw-border-style);border-width:2px}.tw\\:border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:border-s-0{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:border-s-2{border-inline-start-style:var(--tw-border-style);border-inline-start-width:2px}.tw\\:border-s-4{border-inline-start-style:var(--tw-border-style);border-inline-start-width:4px}.tw\\:border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.tw\\:border-e-0{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.tw\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.tw\\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.tw\\:border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.tw\\:border-dashed{--tw-border-style:dashed;border-style:dashed}.tw\\:border-none{--tw-border-style:none;border-style:none}.tw\\:border-solid{--tw-border-style:solid;border-style:solid}.tw\\:border-black{border-color:var(--tw-color-black)}.tw\\:border-blue-400{border-color:var(--tw-color-blue-400)}.tw\\:border-blue-500{border-color:var(--tw-color-blue-500)}.tw\\:border-border,.tw\\:border-border\\/50{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-border\\/50{border-color:color-mix(in oklab, var(--border) 50%, transparent)}}.tw\\:border-destructive{border-color:var(--destructive)}.tw\\:border-foreground{border-color:var(--foreground)}.tw\\:border-gray-300{border-color:var(--tw-color-gray-300)}.tw\\:border-input,.tw\\:border-input\\/30{border-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-input\\/30{border-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:border-muted-foreground,.tw\\:border-muted-foreground\\/40{border-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-muted-foreground\\/40{border-color:color-mix(in oklab, var(--muted-foreground) 40%, transparent)}}.tw\\:border-primary{border-color:var(--primary)}.tw\\:border-red-300{border-color:var(--tw-color-red-300)}.tw\\:border-red-400{border-color:var(--tw-color-red-400)}.tw\\:border-red-500{border-color:var(--tw-color-red-500)}.tw\\:border-red-600{border-color:var(--tw-color-red-600)}.tw\\:border-ring{border-color:var(--ring)}.tw\\:border-sidebar-border{border-color:var(--sidebar-border)}.tw\\:border-slate-300{border-color:var(--tw-color-slate-300)}.tw\\:border-transparent{border-color:#0000}.tw\\:border-yellow-400{border-color:var(--tw-color-yellow-400)}.tw\\:border-yellow-500{border-color:var(--tw-color-yellow-500)}.tw\\:border-s-amber-200{border-inline-start-color:var(--tw-color-amber-200)}.tw\\:border-s-indigo-200{border-inline-start-color:var(--tw-color-indigo-200)}.tw\\:border-s-purple-200{border-inline-start-color:var(--tw-color-purple-200)}.tw\\:border-s-red-200{border-inline-start-color:var(--tw-color-red-200)}.tw\\:\\!bg-destructive\\/50{background-color:var(--destructive)!important}@supports (color:color-mix(in lab, red, red)){.tw\\:\\!bg-destructive\\/50{background-color:color-mix(in oklab, var(--destructive) 50%, transparent)!important}}.tw\\:bg-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{background-color:color-mix(in oklab,var(--destructive) 10%,var(--background))}}.tw\\:bg-accent,.tw\\:bg-accent\\/50{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-accent\\/50{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.tw\\:bg-amber-500,.tw\\:bg-amber-500\\/5{background-color:var(--tw-color-amber-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-amber-500\\/5{background-color:color-mix(in oklab, var(--tw-color-amber-500) 5%, transparent)}}.tw\\:bg-amber-500\\/15{background-color:var(--tw-color-amber-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-amber-500\\/15{background-color:color-mix(in oklab, var(--tw-color-amber-500) 15%, transparent)}}.tw\\:bg-background,.tw\\:bg-background\\/50{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-background\\/50{background-color:color-mix(in oklab, var(--background) 50%, transparent)}}.tw\\:bg-black\\/10{background-color:var(--tw-color-black)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-black\\/10{background-color:color-mix(in oklab, var(--tw-color-black) 10%, transparent)}}.tw\\:bg-blue-50{background-color:var(--tw-color-blue-50)}.tw\\:bg-blue-100{background-color:var(--tw-color-blue-100)}.tw\\:bg-blue-400{background-color:var(--tw-color-blue-400)}.tw\\:bg-blue-500{background-color:var(--tw-color-blue-500)}.tw\\:bg-border{background-color:var(--border)}.tw\\:bg-card{background-color:var(--card)}.tw\\:bg-destructive\\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-destructive\\/10{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.tw\\:bg-foreground{background-color:var(--foreground)}.tw\\:bg-gray-50{background-color:var(--tw-color-gray-50)}.tw\\:bg-gray-100{background-color:var(--tw-color-gray-100)}.tw\\:bg-gray-500{background-color:var(--tw-color-gray-500)}.tw\\:bg-green-50{background-color:var(--tw-color-green-50)}.tw\\:bg-green-100{background-color:var(--tw-color-green-100)}.tw\\:bg-green-500{background-color:var(--tw-color-green-500)}.tw\\:bg-input,.tw\\:bg-input\\/30{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-input\\/30{background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:bg-muted,.tw\\:bg-muted\\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-muted\\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:bg-neutral-300{background-color:var(--tw-color-neutral-300)}.tw\\:bg-orange-100{background-color:var(--tw-color-orange-100)}.tw\\:bg-popover,.tw\\:bg-popover\\/70{background-color:var(--popover)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-popover\\/70{background-color:color-mix(in oklab, var(--popover) 70%, transparent)}}.tw\\:bg-primary{background-color:var(--primary)}.tw\\:bg-primary-foreground{background-color:var(--primary-foreground)}.tw\\:bg-primary\\/30{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-primary\\/30{background-color:color-mix(in oklab, var(--primary) 30%, transparent)}}.tw\\:bg-purple-50{background-color:var(--tw-color-purple-50)}.tw\\:bg-red-100{background-color:var(--tw-color-red-100)}.tw\\:bg-red-500{background-color:var(--tw-color-red-500)}.tw\\:bg-rose-500,.tw\\:bg-rose-500\\/5{background-color:var(--tw-color-rose-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-rose-500\\/5{background-color:color-mix(in oklab, var(--tw-color-rose-500) 5%, transparent)}}.tw\\:bg-rose-500\\/15{background-color:var(--tw-color-rose-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-rose-500\\/15{background-color:color-mix(in oklab, var(--tw-color-rose-500) 15%, transparent)}}.tw\\:bg-secondary{background-color:var(--secondary)}.tw\\:bg-sidebar{background-color:var(--sidebar)}.tw\\:bg-sidebar-accent{background-color:var(--sidebar-accent)}.tw\\:bg-sidebar-border{background-color:var(--sidebar-border)}.tw\\:bg-sky-500,.tw\\:bg-sky-500\\/5{background-color:var(--tw-color-sky-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-sky-500\\/5{background-color:color-mix(in oklab, var(--tw-color-sky-500) 5%, transparent)}}.tw\\:bg-sky-500\\/15{background-color:var(--tw-color-sky-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-sky-500\\/15{background-color:color-mix(in oklab, var(--tw-color-sky-500) 15%, transparent)}}.tw\\:bg-teal-500,.tw\\:bg-teal-500\\/5{background-color:var(--tw-color-teal-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-teal-500\\/5{background-color:color-mix(in oklab, var(--tw-color-teal-500) 5%, transparent)}}.tw\\:bg-teal-500\\/15{background-color:var(--tw-color-teal-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-teal-500\\/15{background-color:color-mix(in oklab, var(--tw-color-teal-500) 15%, transparent)}}.tw\\:bg-transparent{background-color:#0000}.tw\\:bg-white{background-color:var(--tw-color-white)}.tw\\:bg-yellow-50{background-color:var(--tw-color-yellow-50)}.tw\\:bg-yellow-100{background-color:var(--tw-color-yellow-100)}.tw\\:bg-yellow-500{background-color:var(--tw-color-yellow-500)}.tw\\:bg-zinc-400{background-color:var(--tw-color-zinc-400)}.tw\\:bg-clip-padding{background-clip:padding-box}.tw\\:fill-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{fill:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:fill-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{fill:color-mix(in oklab,var(--destructive) 10%,var(--background))}}.tw\\:fill-destructive{fill:var(--destructive)}.tw\\:fill-foreground{fill:var(--foreground)}.tw\\:fill-yellow-400,.tw\\:fill-yellow-400\\/50{fill:var(--tw-color-yellow-400)}@supports (color:color-mix(in lab, red, red)){.tw\\:fill-yellow-400\\/50{fill:color-mix(in oklab, var(--tw-color-yellow-400) 50%, transparent)}}.tw\\:object-cover{object-fit:cover}.tw\\:\\!p-4{padding:calc(calc(var(--spacing)) * 4)!important}.tw\\:p-0{padding:calc(calc(var(--spacing)) * 0)}.tw\\:p-0\\.5{padding:calc(calc(var(--spacing)) * .5)}.tw\\:p-1{padding:calc(calc(var(--spacing)) * 1)}.tw\\:p-2{padding:calc(calc(var(--spacing)) * 2)}.tw\\:p-2\\.5{padding:calc(calc(var(--spacing)) * 2.5)}.tw\\:p-3{padding:calc(calc(var(--spacing)) * 3)}.tw\\:p-4{padding:calc(calc(var(--spacing)) * 4)}.tw\\:p-6{padding:calc(calc(var(--spacing)) * 6)}.tw\\:p-8{padding:calc(calc(var(--spacing)) * 8)}.tw\\:p-\\[1px\\]{padding:1px}.tw\\:p-\\[3px\\]{padding:3px}.tw\\:p-\\[10px\\]{padding:10px}.tw\\:p-\\[16px\\]{padding:16px}.tw\\:px-0{padding-inline:calc(calc(var(--spacing)) * 0)}.tw\\:px-0\\.5{padding-inline:calc(calc(var(--spacing)) * .5)}.tw\\:px-1{padding-inline:calc(calc(var(--spacing)) * 1)}.tw\\:px-1\\.5{padding-inline:calc(calc(var(--spacing)) * 1.5)}.tw\\:px-2{padding-inline:calc(calc(var(--spacing)) * 2)}.tw\\:px-2\\.5{padding-inline:calc(calc(var(--spacing)) * 2.5)}.tw\\:px-3{padding-inline:calc(calc(var(--spacing)) * 3)}.tw\\:px-4{padding-inline:calc(calc(var(--spacing)) * 4)}.tw\\:px-6{padding-inline:calc(calc(var(--spacing)) * 6)}.tw\\:py-0{padding-block:calc(calc(var(--spacing)) * 0)}.tw\\:py-0\\.5{padding-block:calc(calc(var(--spacing)) * .5)}.tw\\:py-1{padding-block:calc(calc(var(--spacing)) * 1)}.tw\\:py-1\\.5{padding-block:calc(calc(var(--spacing)) * 1.5)}.tw\\:py-2{padding-block:calc(calc(var(--spacing)) * 2)}.tw\\:py-3{padding-block:calc(calc(var(--spacing)) * 3)}.tw\\:py-4{padding-block:calc(calc(var(--spacing)) * 4)}.tw\\:py-6{padding-block:calc(calc(var(--spacing)) * 6)}.tw\\:py-8{padding-block:calc(calc(var(--spacing)) * 8)}.tw\\:py-\\[2px\\]{padding-block:2px}.tw\\:ps-1\\.5{padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:ps-2{padding-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:ps-2\\.5{padding-inline-start:calc(calc(var(--spacing)) * 2.5)}.tw\\:ps-4{padding-inline-start:calc(calc(var(--spacing)) * 4)}.tw\\:ps-6{padding-inline-start:calc(calc(var(--spacing)) * 6)}.tw\\:ps-7{padding-inline-start:calc(calc(var(--spacing)) * 7)}.tw\\:ps-8{padding-inline-start:calc(calc(var(--spacing)) * 8)}.tw\\:ps-9{padding-inline-start:calc(calc(var(--spacing)) * 9)}.tw\\:ps-12{padding-inline-start:calc(calc(var(--spacing)) * 12)}.tw\\:ps-\\[85px\\]{padding-inline-start:85px}.tw\\:pe-1{padding-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:pe-1\\.5{padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:pe-2{padding-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:pe-4{padding-inline-end:calc(calc(var(--spacing)) * 4)}.tw\\:pe-8{padding-inline-end:calc(calc(var(--spacing)) * 8)}.tw\\:pe-8\\!{padding-inline-end:calc(calc(var(--spacing)) * 8)!important}.tw\\:pe-9{padding-inline-end:calc(calc(var(--spacing)) * 9)}.tw\\:pe-\\[calc\\(138px\\+1rem\\)\\]{padding-inline-end:calc(138px + 1rem)}.tw\\:pe-\\[…\\]{padding-inline-end:…}.tw\\:pt-1{padding-top:calc(calc(var(--spacing)) * 1)}.tw\\:pt-2{padding-top:calc(calc(var(--spacing)) * 2)}.tw\\:pt-3{padding-top:calc(calc(var(--spacing)) * 3)}.tw\\:pt-4{padding-top:calc(calc(var(--spacing)) * 4)}.tw\\:pt-6{padding-top:calc(calc(var(--spacing)) * 6)}.tw\\:pr-0{padding-right:calc(calc(var(--spacing)) * 0)}.tw\\:pr-3{padding-right:calc(calc(var(--spacing)) * 3)}.tw\\:pr-4{padding-right:calc(calc(var(--spacing)) * 4)}.tw\\:pb-0{padding-bottom:calc(calc(var(--spacing)) * 0)}.tw\\:pb-1{padding-bottom:calc(calc(var(--spacing)) * 1)}.tw\\:pb-2{padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:pb-3{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:pb-4{padding-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:pb-8{padding-bottom:calc(calc(var(--spacing)) * 8)}.tw\\:pb-12{padding-bottom:calc(calc(var(--spacing)) * 12)}.tw\\:pb-16{padding-bottom:calc(calc(var(--spacing)) * 16)}.tw\\:pb-24{padding-bottom:calc(calc(var(--spacing)) * 24)}.tw\\:pl-2{padding-left:calc(calc(var(--spacing)) * 2)}.tw\\:pl-3{padding-left:calc(calc(var(--spacing)) * 3)}.tw\\:pl-4{padding-left:calc(calc(var(--spacing)) * 4)}.tw\\:pl-5{padding-left:calc(calc(var(--spacing)) * 5)}.tw\\:pl-6{padding-left:calc(calc(var(--spacing)) * 6)}.tw\\:pl-8{padding-left:calc(calc(var(--spacing)) * 8)}.tw\\:text-center{text-align:center}.tw\\:text-end{text-align:end}.tw\\:text-left{text-align:left}.tw\\:text-right{text-align:right}.tw\\:text-start{text-align:start}.tw\\:align-middle{vertical-align:middle}.tw\\:font-heading{font-family:var(--font-sans)}.tw\\:font-mono{font-family:var(--tw-font-mono)}.tw\\:font-sans{font-family:IBM Plex Sans Variable,sans-serif}.tw\\:text-2xl{font-size:var(--tw-text-2xl);line-height:var(--tw-leading,var(--tw-text-2xl--line-height))}.tw\\:text-3xl{font-size:var(--tw-text-3xl);line-height:var(--tw-leading,var(--tw-text-3xl--line-height))}.tw\\:text-4xl{font-size:var(--tw-text-4xl);line-height:var(--tw-leading,var(--tw-text-4xl--line-height))}.tw\\:text-base{font-size:var(--tw-text-base);line-height:var(--tw-leading,var(--tw-text-base--line-height))}.tw\\:text-lg{font-size:var(--tw-text-lg);line-height:var(--tw-leading,var(--tw-text-lg--line-height))}.tw\\:text-sm{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:text-sm\\/relaxed{font-size:var(--tw-text-sm);line-height:var(--tw-leading-relaxed)}.tw\\:text-xl{font-size:var(--tw-text-xl);line-height:var(--tw-leading,var(--tw-text-xl--line-height))}.tw\\:text-xs{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:text-\\[0\\.8rem\\]{font-size:.8rem}.tw\\:leading-6{--tw-leading:calc(calc(var(--spacing)) * 6);line-height:calc(calc(var(--spacing)) * 6)}.tw\\:leading-loose{--tw-leading:var(--tw-leading-loose);line-height:var(--tw-leading-loose)}.tw\\:leading-none{--tw-leading:1;line-height:1}.tw\\:leading-relaxed{--tw-leading:var(--tw-leading-relaxed);line-height:var(--tw-leading-relaxed)}.tw\\:leading-snug{--tw-leading:var(--tw-leading-snug);line-height:var(--tw-leading-snug)}.tw\\:leading-tight{--tw-leading:var(--tw-leading-tight);line-height:var(--tw-leading-tight)}.tw\\:font-bold{--tw-font-weight:var(--tw-font-weight-bold);font-weight:var(--tw-font-weight-bold)}.tw\\:font-extrabold{--tw-font-weight:var(--tw-font-weight-extrabold);font-weight:var(--tw-font-weight-extrabold)}.tw\\:font-medium{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:font-normal{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:font-semibold{--tw-font-weight:var(--tw-font-weight-semibold);font-weight:var(--tw-font-weight-semibold)}.tw\\:tracking-tight{--tw-tracking:var(--tw-tracking-tight);letter-spacing:var(--tw-tracking-tight)}.tw\\:tracking-wider{--tw-tracking:var(--tw-tracking-wider);letter-spacing:var(--tw-tracking-wider)}.tw\\:tracking-widest{--tw-tracking:var(--tw-tracking-widest);letter-spacing:var(--tw-tracking-widest)}.tw\\:text-balance{text-wrap:balance}.tw\\:text-nowrap{text-wrap:nowrap}.tw\\:break-words{overflow-wrap:break-word}.tw\\:text-clip{text-overflow:clip}.tw\\:text-ellipsis{text-overflow:ellipsis}.tw\\:whitespace-normal{white-space:normal}.tw\\:whitespace-nowrap{white-space:nowrap}.tw\\:whitespace-pre{white-space:pre}.tw\\:whitespace-pre-line{white-space:pre-line}.tw\\:whitespace-pre-wrap{white-space:pre-wrap}.tw\\:\\[color\\:blue\\]{color:#00f}.tw\\:text-accent-foreground{color:var(--accent-foreground)}.tw\\:text-amber-600{color:var(--tw-color-amber-600)}.tw\\:text-background{color:var(--background)}.tw\\:text-blue-400{color:var(--tw-color-blue-400)}.tw\\:text-blue-500{color:var(--tw-color-blue-500)}.tw\\:text-blue-600{color:var(--tw-color-blue-600)}.tw\\:text-blue-800{color:var(--tw-color-blue-800)}.tw\\:text-card-foreground{color:var(--card-foreground)}.tw\\:text-current{color:currentColor}.tw\\:text-destructive{color:var(--destructive)}.tw\\:text-foreground{color:var(--foreground)}.tw\\:text-foreground\\!{color:var(--foreground)!important}.tw\\:text-foreground\\/30{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/30{color:color-mix(in oklab, var(--foreground) 30%, transparent)}}.tw\\:text-foreground\\/50{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/50{color:color-mix(in oklab, var(--foreground) 50%, transparent)}}.tw\\:text-foreground\\/60{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/60{color:color-mix(in oklab, var(--foreground) 60%, transparent)}}.tw\\:text-foreground\\/70{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/70{color:color-mix(in oklab, var(--foreground) 70%, transparent)}}.tw\\:text-gray-300{color:var(--tw-color-gray-300)}.tw\\:text-gray-500{color:var(--tw-color-gray-500)}.tw\\:text-gray-600{color:var(--tw-color-gray-600)}.tw\\:text-gray-700{color:var(--tw-color-gray-700)}.tw\\:text-gray-800{color:var(--tw-color-gray-800)}.tw\\:text-green-600{color:var(--tw-color-green-600)}.tw\\:text-green-700{color:var(--tw-color-green-700)}.tw\\:text-green-800{color:var(--tw-color-green-800)}.tw\\:text-inherit{color:inherit}.tw\\:text-muted-foreground,.tw\\:text-muted-foreground\\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-muted-foreground\\/50{color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.tw\\:text-orange-800{color:var(--tw-color-orange-800)}.tw\\:text-popover-foreground{color:var(--popover-foreground)}.tw\\:text-primary{color:var(--primary)}.tw\\:text-primary-foreground{color:var(--primary-foreground)}.tw\\:text-purple-900{color:var(--tw-color-purple-900)}.tw\\:text-red-500{color:var(--tw-color-red-500)}.tw\\:text-red-600{color:var(--tw-color-red-600)}.tw\\:text-red-700{color:var(--tw-color-red-700)}.tw\\:text-red-800{color:var(--tw-color-red-800)}.tw\\:text-rose-600{color:var(--tw-color-rose-600)}.tw\\:text-secondary-foreground{color:var(--secondary-foreground)}.tw\\:text-sidebar-accent-foreground{color:var(--sidebar-accent-foreground)}.tw\\:text-sidebar-foreground,.tw\\:text-sidebar-foreground\\/70{color:var(--sidebar-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-sidebar-foreground\\/70{color:color-mix(in oklab, var(--sidebar-foreground) 70%, transparent)}}.tw\\:text-sky-600{color:var(--tw-color-sky-600)}.tw\\:text-slate-900{color:var(--tw-color-slate-900)}.tw\\:text-teal-600{color:var(--tw-color-teal-600)}.tw\\:text-white{color:var(--tw-color-white)}.tw\\:text-yellow-400{color:var(--tw-color-yellow-400)}.tw\\:text-yellow-600{color:var(--tw-color-yellow-600)}.tw\\:text-yellow-700{color:var(--tw-color-yellow-700)}.tw\\:capitalize{text-transform:capitalize}.tw\\:uppercase{text-transform:uppercase}.tw\\:italic{font-style:italic}.tw\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tw\\:line-through{text-decoration-line:line-through}.tw\\:underline{text-decoration-line:underline}.tw\\:decoration-destructive{-webkit-text-decoration-color:var(--destructive);-webkit-text-decoration-color:var(--destructive);text-decoration-color:var(--destructive)}.tw\\:underline-offset-4{text-underline-offset:4px}.tw\\:opacity-0{opacity:0}.tw\\:opacity-40{opacity:.4}.tw\\:opacity-50{opacity:.5}.tw\\:opacity-60{opacity:.6}.tw\\:opacity-100{opacity:1}.tw\\:bg-blend-color{background-blend-mode:color}.tw\\:shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-\\[0_0_0_1px_var\\(--sidebar-border\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-border));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-none\\!{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.tw\\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-background{--tw-ring-color:var(--background)}.tw\\:ring-foreground\\/10{--tw-ring-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:ring-foreground\\/10{--tw-ring-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}.tw\\:ring-primary{--tw-ring-color:var(--primary)}.tw\\:ring-ring\\/50{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:ring-ring\\/50{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:ring-sidebar-ring{--tw-ring-color:var(--sidebar-ring)}.tw\\:ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:ring-offset-background{--tw-ring-offset-color:var(--background)}.tw\\:ring-offset-white{--tw-ring-offset-color:var(--tw-color-white)}.tw\\:outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:outline-hidden{outline-offset:2px;outline:2px solid #0000}}.tw\\:drop-shadow-sm{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--tw-drop-shadow-sm));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.tw\\:transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[color\\,box-shadow\\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[left\\,right\\,width\\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[margin\\,opacity\\]{transition-property:margin,opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[width\\,height\\,padding\\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-none{transition-property:none}.tw\\:duration-100{--tw-duration:.1s;transition-duration:.1s}.tw\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.tw\\:ease-linear{--tw-ease:linear;transition-timing-function:linear}.tw\\:prose-quoteless :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose-quoteless :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.tw\\:outline-none{--tw-outline-style:none;outline-style:none}.tw\\:select-none{-webkit-user-select:none;user-select:none}.tw\\:\\[unicode-bidi\\:plaintext\\]{unicode-bidi:plaintext}.tw\\:group-focus-within\\/menu-item\\:opacity-100:is(:where(.tw\\:group\\/menu-item):focus-within *){opacity:1}@media (hover:hover){.tw\\:group-hover\\:visible:is(:where(.tw\\:group):hover *){visibility:visible}.tw\\:group-hover\\:hidden:is(:where(.tw\\:group):hover *){display:none}.tw\\:group-hover\\:opacity-100:is(:where(.tw\\:group):hover *),.tw\\:group-hover\\/menu-item\\:opacity-100:is(:where(.tw\\:group\\/menu-item):hover *){opacity:1}}.tw\\:group-focus\\/context-menu-item\\:text-accent-foreground:is(:where(.tw\\:group\\/context-menu-item):focus *),.tw\\:group-focus\\/dropdown-menu-item\\:text-accent-foreground:is(:where(.tw\\:group\\/dropdown-menu-item):focus *),.tw\\:group-focus\\/menubar-item\\:text-accent-foreground:is(:where(.tw\\:group\\/menubar-item):focus *){color:var(--accent-foreground)}.tw\\:group-has-disabled\\/field\\:opacity-50:is(:where(.tw\\:group\\/field):has(:disabled) *){opacity:.5}.tw\\:group-has-data-\\[sidebar\\=menu-action\\]\\/menu-item\\:pe-8:is(:where(.tw\\:group\\/menu-item):has([data-sidebar=menu-action]) *){padding-inline-end:calc(calc(var(--spacing)) * 8)}.tw\\:group-has-data-\\[size\\=lg\\]\\/avatar-group\\:size-10:is(:where(.tw\\:group\\/avatar-group):has([data-size=lg]) *){width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:group-has-data-\\[size\\=sm\\]\\/avatar-group\\:size-6:is(:where(.tw\\:group\\/avatar-group):has([data-size=sm]) *){width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:group-has-data-\\[slot\\=command-shortcut\\]\\/command-item\\:hidden:is(:where(.tw\\:group\\/command-item):has([data-slot=command-shortcut]) *){display:none}.tw\\:group-has-\\[\\>input\\]\\/input-group\\:pt-2:is(:where(.tw\\:group\\/input-group):has(>input) *){padding-top:calc(calc(var(--spacing)) * 2)}.tw\\:group-has-\\[\\>input\\]\\/input-group\\:pb-2:is(:where(.tw\\:group\\/input-group):has(>input) *){padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:group-has-\\[\\>svg\\]\\/alert\\:col-start-2:is(:where(.tw\\:group\\/alert):has(>svg) *){grid-column-start:2}.tw\\:group-data-\\[checked\\=true\\]\\/command-item\\:opacity-100:is(:where(.tw\\:group\\/command-item)[data-checked=true] *){opacity:1}.tw\\:group-data-\\[collapsible\\=icon\\]\\:-mt-8:is(:where(.tw\\:group)[data-collapsible=icon] *){margin-top:calc(calc(var(--spacing)) * -8)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:hidden:is(:where(.tw\\:group)[data-collapsible=icon] *){display:none}.tw\\:group-data-\\[collapsible\\=icon\\]\\:size-8\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(calc(var(--spacing)) * 8)!important;height:calc(calc(var(--spacing)) * 8)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\(--sidebar-width-icon\\):is(:where(.tw\\:group)[data-collapsible=icon] *){width:var(--sidebar-width-icon)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\)\\]:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(calc(var(--spacing)) * 4)))}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\+2px\\)\\]:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(calc(var(--spacing)) * 4)) + 2px)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:overflow-hidden:is(:where(.tw\\:group)[data-collapsible=icon] *){overflow:hidden}.tw\\:group-data-\\[collapsible\\=icon\\]\\:p-0\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){padding:calc(calc(var(--spacing)) * 0)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:p-2\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){padding:calc(calc(var(--spacing)) * 2)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:opacity-0:is(:where(.tw\\:group)[data-collapsible=icon] *){opacity:0}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:right-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\]:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:left-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\]:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:w-0:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){width:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:translate-x-0:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:group-data-\\[disabled\\=true\\]\\:pointer-events-none:is(:where(.tw\\:group)[data-disabled=true] *){pointer-events:none}.tw\\:group-data-\\[disabled\\=true\\]\\:opacity-50:is(:where(.tw\\:group)[data-disabled=true] *),.tw\\:group-data-\\[disabled\\=true\\]\\/input-group\\:opacity-50:is(:where(.tw\\:group\\/input-group)[data-disabled=true] *){opacity:.5}.tw\\:group-data-\\[side\\=primary\\]\\:-right-4:is(:where(.tw\\:group)[data-side=primary] *){right:calc(calc(var(--spacing)) * -4)}.tw\\:group-data-\\[side\\=primary\\]\\:border-e:is(:where(.tw\\:group)[data-side=primary] *){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.tw\\:group-data-\\[side\\=secondary\\]\\:left-0:is(:where(.tw\\:group)[data-side=secondary] *){left:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-\\[side\\=secondary\\]\\:rotate-180:is(:where(.tw\\:group)[data-side=secondary] *){rotate:180deg}.tw\\:group-data-\\[side\\=secondary\\]\\:border-s:is(:where(.tw\\:group)[data-side=secondary] *){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:group-data-\\[size\\=default\\]\\/avatar\\:size-2\\.5:is(:where(.tw\\:group\\/avatar)[data-size=default] *){width:calc(calc(var(--spacing)) * 2.5);height:calc(calc(var(--spacing)) * 2.5)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:size-4:is(:where(.tw\\:group\\/switch)[data-size=default] *){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[size\\=lg\\]\\/avatar\\:size-3:is(:where(.tw\\:group\\/avatar)[data-size=lg] *){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=sm] *){width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:text-xs:is(:where(.tw\\:group\\/avatar)[data-size=sm] *){font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:p-3:is(:where(.tw\\:group\\/card)[data-size=sm] *){padding:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:px-3:is(:where(.tw\\:group\\/card)[data-size=sm] *){padding-inline:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:text-sm:is(:where(.tw\\:group\\/card)[data-size=sm] *){font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:size-3:is(:where(.tw\\:group\\/switch)[data-size=sm] *){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:rounded-none:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *){border-radius:0}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:px-2:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *){padding-inline:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[variant\\=floating\\]\\:rounded-lg:is(:where(.tw\\:group)[data-variant=floating] *){border-radius:var(--radius)}.tw\\:group-data-\\[variant\\=floating\\]\\:shadow-sm:is(:where(.tw\\:group)[data-variant=floating] *){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=floating\\]\\:ring-1:is(:where(.tw\\:group)[data-variant=floating] *){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=floating\\]\\:ring-sidebar-border:is(:where(.tw\\:group)[data-variant=floating] *){--tw-ring-color:var(--sidebar-border)}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *){background-color:#0000}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:mx-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){margin-inline:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:mt-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){margin-top:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:h-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){height:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:w-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){width:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:text-center:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){text-align:center}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:my-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){margin-block:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:me-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){margin-inline-end:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:h-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){height:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:w-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){width:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:my-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){margin-block:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:ms-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){margin-inline-start:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:h-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){height:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:w-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){width:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:mx-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){margin-inline:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:mb-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:h-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){height:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:w-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){width:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:text-center:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){text-align:center}.tw\\:group-data-selected\\/command-item\\:text-foreground:is(:where(.tw\\:group\\/command-item):where([data-selected=true]) *){color:var(--foreground)}.tw\\:group-data-horizontal\\/tabs\\:h-8:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *){height:calc(calc(var(--spacing)) * 8)}.tw\\:group-data-vertical\\/tabs\\:h-fit:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){height:fit-content}.tw\\:group-data-vertical\\/tabs\\:w-full:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){width:100%}.tw\\:group-data-vertical\\/tabs\\:flex-col:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){flex-direction:column}.tw\\:group-data-vertical\\/tabs\\:justify-start:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){justify-content:flex-start}@media (hover:hover){.tw\\:peer-hover\\/menu-button\\:text-sidebar-accent-foreground:is(:where(.tw\\:peer\\/menu-button):hover~*){color:var(--sidebar-accent-foreground)}.tw\\:peer-focus\\:group-hover\\:text-blue-500:is(:where(.tw\\:peer):focus~*):is(:where(.tw\\:group):hover *){color:var(--tw-color-blue-500)}}.tw\\:peer-disabled\\:cursor-not-allowed:is(:where(.tw\\:peer):disabled~*){cursor:not-allowed}.tw\\:peer-disabled\\:opacity-50:is(:where(.tw\\:peer):disabled~*){opacity:.5}.tw\\:peer-data-\\[size\\=default\\]\\/menu-button\\:top-1\\.5:is(:where(.tw\\:peer\\/menu-button)[data-size=default]~*){top:calc(calc(var(--spacing)) * 1.5)}.tw\\:peer-data-\\[size\\=lg\\]\\/menu-button\\:top-2\\.5:is(:where(.tw\\:peer\\/menu-button)[data-size=lg]~*){top:calc(calc(var(--spacing)) * 2.5)}.tw\\:peer-data-\\[size\\=sm\\]\\/menu-button\\:top-1:is(:where(.tw\\:peer\\/menu-button)[data-size=sm]~*){top:calc(calc(var(--spacing)) * 1)}.tw\\:peer-data-active\\/menu-button\\:text-sidebar-accent-foreground:is(:is(:where(.tw\\:peer\\/menu-button):where([data-state=active]),:where(.tw\\:peer\\/menu-button):where([data-active]:not([data-active=false])))~*){color:var(--sidebar-accent-foreground)}.tw\\:file\\:inline-flex::file-selector-button{display:inline-flex}.tw\\:file\\:h-6::file-selector-button{height:calc(calc(var(--spacing)) * 6)}.tw\\:file\\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.tw\\:file\\:bg-transparent::file-selector-button{background-color:#0000}.tw\\:file\\:text-sm::file-selector-button{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:file\\:font-medium::file-selector-button{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:file\\:text-foreground::file-selector-button{color:var(--foreground)}.tw\\:placeholder\\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.tw\\:placeholder\\:text-slate-400::placeholder{color:var(--tw-color-slate-400)}.tw\\:before\\:absolute:before{content:var(--tw-content);position:absolute}.tw\\:before\\:top-0\\.5:before{content:var(--tw-content);top:calc(calc(var(--spacing)) * .5)}.tw\\:before\\:left-0:before{content:var(--tw-content);left:calc(calc(var(--spacing)) * 0)}.tw\\:before\\:block:before{content:var(--tw-content);display:block}.tw\\:before\\:hidden:before{content:var(--tw-content);display:none}.tw\\:before\\:h-4:before{content:var(--tw-content);height:calc(calc(var(--spacing)) * 4)}.tw\\:before\\:w-4:before{content:var(--tw-content);width:calc(calc(var(--spacing)) * 4)}.tw\\:before\\:cursor-pointer:before{content:var(--tw-content);cursor:pointer}.tw\\:before\\:rounded:before{content:var(--tw-content);border-radius:.25rem}.tw\\:before\\:border:before{content:var(--tw-content);border-style:var(--tw-border-style);border-width:1px}.tw\\:before\\:border-primary:before{content:var(--tw-content);border-color:var(--primary)}.tw\\:before\\:bg-primary:before{content:var(--tw-content);background-color:var(--primary)}.tw\\:before\\:bg-cover:before{content:var(--tw-content);background-size:cover}.tw\\:before\\:bg-no-repeat:before{content:var(--tw-content);background-repeat:no-repeat}.tw\\:before\\:content-\\[\\"\\"\\]:before{--tw-content:"";content:var(--tw-content)}.tw\\:before\\:content-\\[\\\\\\"\\\\\\"\\]:before{--tw-content:\\"\\";content:var(--tw-content)}.tw\\:after\\:absolute:after{content:var(--tw-content);position:absolute}.tw\\:after\\:-inset-2:after{content:var(--tw-content);inset:calc(calc(var(--spacing)) * -2)}.tw\\:after\\:inset-0:after{content:var(--tw-content);inset:calc(calc(var(--spacing)) * 0)}.tw\\:after\\:-inset-x-3:after{content:var(--tw-content);inset-inline:calc(calc(var(--spacing)) * -3)}.tw\\:after\\:-inset-y-2:after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * -2)}.tw\\:after\\:inset-y-0:after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:after\\:start-1\\/2:after{content:var(--tw-content);inset-inline-start:50%}.tw\\:after\\:top-\\[6px\\]:after{content:var(--tw-content);top:6px}.tw\\:after\\:right-\\[7px\\]:after{content:var(--tw-content);right:7px}.tw\\:after\\:left-\\[7px\\]:after{content:var(--tw-content);left:7px}.tw\\:after\\:block:after{content:var(--tw-content);display:block}.tw\\:after\\:hidden:after{content:var(--tw-content);display:none}.tw\\:after\\:h-0\\.5:after{content:var(--tw-content);height:calc(calc(var(--spacing)) * .5)}.tw\\:after\\:h-\\[6px\\]:after{content:var(--tw-content);height:6px}.tw\\:after\\:w-1:after{content:var(--tw-content);width:calc(calc(var(--spacing)) * 1)}.tw\\:after\\:w-\\[2px\\]:after{content:var(--tw-content);width:2px}.tw\\:after\\:w-\\[3px\\]:after{content:var(--tw-content);width:3px}.tw\\:after\\:-translate-x-1\\/2:after{content:var(--tw-content);--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:after\\:rotate-45:after{content:var(--tw-content);rotate:45deg}.tw\\:after\\:cursor-pointer:after{content:var(--tw-content);cursor:pointer}.tw\\:after\\:rounded-full:after{content:var(--tw-content);border-radius:3.40282e38px}.tw\\:after\\:border:after{content:var(--tw-content);border-style:var(--tw-border-style);border-width:1px}.tw\\:after\\:border-t-0:after{content:var(--tw-content);border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:after\\:border-r-2:after{content:var(--tw-content);border-right-style:var(--tw-border-style);border-right-width:2px}.tw\\:after\\:border-b-2:after{content:var(--tw-content);border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.tw\\:after\\:border-l-0:after{content:var(--tw-content);border-left-style:var(--tw-border-style);border-left-width:0}.tw\\:after\\:border-solid:after{content:var(--tw-content);--tw-border-style:solid;border-style:solid}.tw\\:after\\:border-border:after{content:var(--tw-content);border-color:var(--border)}.tw\\:after\\:border-white:after{content:var(--tw-content);border-color:var(--tw-color-white)}.tw\\:after\\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.tw\\:after\\:bg-muted:after{content:var(--tw-content);background-color:var(--muted)}.tw\\:after\\:opacity-0:after{content:var(--tw-content);opacity:0}.tw\\:after\\:mix-blend-darken:after{content:var(--tw-content);mix-blend-mode:darken}.tw\\:after\\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:after\\:content-\\[\\"\\"\\]:after{--tw-content:"";content:var(--tw-content)}.tw\\:after\\:content-\\[\\\\\\"\\\\\\"\\]:after{--tw-content:\\"\\";content:var(--tw-content)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:after\\:start-full:is(:where(.tw\\:group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);inset-inline-start:100%}.tw\\:group-data-horizontal\\/tabs\\:after\\:inset-x-0:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-horizontal\\/tabs\\:after\\:bottom-\\[-5px\\]:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);bottom:-5px}.tw\\:group-data-horizontal\\/tabs\\:after\\:h-0\\.5:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);height:calc(calc(var(--spacing)) * .5)}.tw\\:group-data-vertical\\/tabs\\:after\\:inset-y-0:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-vertical\\/tabs\\:after\\:-end-1:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);inset-inline-end:calc(calc(var(--spacing)) * -1)}.tw\\:group-data-vertical\\/tabs\\:after\\:w-0\\.5:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);width:calc(calc(var(--spacing)) * .5)}.tw\\:first\\:mt-0:first-child{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:last\\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:even\\:bg-muted:nth-child(2n){background-color:var(--muted)}.tw\\:focus-within\\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-within\\:ring-ring:focus-within{--tw-ring-color:var(--ring)}.tw\\:focus-within\\:ring-offset-1:focus-within{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}@media (hover:hover){.tw\\:hover\\:-mt-4:hover{margin-top:calc(calc(var(--spacing)) * -4)}.tw\\:hover\\:cursor-pointer:hover{cursor:pointer}.tw\\:hover\\:bg-accent:hover,.tw\\:hover\\:bg-accent\\/30:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-accent\\/30:hover{background-color:color-mix(in oklab, var(--accent) 30%, transparent)}}.tw\\:hover\\:bg-accent\\/80:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-accent\\/80:hover{background-color:color-mix(in oklab, var(--accent) 80%, transparent)}}.tw\\:hover\\:bg-blue-600:hover{background-color:var(--tw-color-blue-600)}.tw\\:hover\\:bg-destructive\\/20:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-destructive\\/20:hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:hover\\:bg-gray-50:hover{background-color:var(--tw-color-gray-50)}.tw\\:hover\\:bg-input:hover{background-color:var(--input)}.tw\\:hover\\:bg-muted:hover,.tw\\:hover\\:bg-muted\\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-muted\\/50:hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:hover\\:bg-muted\\/80:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-muted\\/80:hover{background-color:color-mix(in oklab, var(--muted) 80%, transparent)}}.tw\\:hover\\:bg-primary\\/10:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/10:hover{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.tw\\:hover\\:bg-primary\\/70:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/70:hover{background-color:color-mix(in oklab, var(--primary) 70%, transparent)}}.tw\\:hover\\:bg-primary\\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.tw\\:hover\\:bg-red-500:hover{background-color:var(--tw-color-red-500)}.tw\\:hover\\:bg-secondary:hover,.tw\\:hover\\:bg-secondary\\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-secondary\\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.tw\\:hover\\:bg-sidebar-accent:hover{background-color:var(--sidebar-accent)}.tw\\:hover\\:bg-transparent:hover{background-color:#0000}.tw\\:hover\\:text-foreground:hover{color:var(--foreground)}.tw\\:hover\\:text-muted-foreground:hover{color:var(--muted-foreground)}.tw\\:hover\\:text-primary-foreground:hover{color:var(--primary-foreground)}.tw\\:hover\\:text-sidebar-accent-foreground:hover{color:var(--sidebar-accent-foreground)}.tw\\:hover\\:underline:hover{text-decoration-line:underline}.tw\\:hover\\:opacity-80:hover{opacity:.8}.tw\\:hover\\:opacity-100:hover{opacity:1}.tw\\:hover\\:shadow-\\[0_0_0_1px_var\\(--sidebar-accent\\)\\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-accent));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:ring-3:hover{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:group-data-\\[collapsible\\=offcanvas\\]\\:bg-sidebar:hover:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){background-color:var(--sidebar)}.tw\\:hover\\:after\\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:var(--sidebar-border)}}.tw\\:focus\\:relative:focus{position:relative}.tw\\:focus\\:z-10:focus{z-index:10}.tw\\:focus\\:bg-accent:focus{background-color:var(--accent)}.tw\\:focus\\:bg-muted:focus{background-color:var(--muted)}.tw\\:focus\\:text-accent-foreground:focus{color:var(--accent-foreground)}.tw\\:focus\\:text-foreground:focus{color:var(--foreground)}.tw\\:focus\\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus\\:ring-ring:focus{--tw-ring-color:var(--ring)}.tw\\:focus\\:ring-offset-1:focus{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:focus\\:ring-offset-background:focus{--tw-ring-offset-color:var(--background)}.tw\\:focus\\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:focus\\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}:is(.tw\\:focus\\:\\*\\*\\:text-accent-foreground:focus *),:is(.tw\\:not-data-\\[variant\\=destructive\\]\\:focus\\:\\*\\*\\:text-accent-foreground:not([data-variant=destructive]):focus *){color:var(--accent-foreground)}.tw\\:focus-visible\\:relative:focus-visible{position:relative}.tw\\:focus-visible\\:z-10:focus-visible{z-index:10}.tw\\:focus-visible\\:border-destructive\\/40:focus-visible{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:border-destructive\\/40:focus-visible{border-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:focus-visible\\:border-ring:focus-visible{border-color:var(--ring)}.tw\\:focus-visible\\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-3:focus-visible,.tw\\:focus-visible\\:ring-\\[3px\\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-\\[color\\:hsl\\(240\\,5\\%\\,64\\.9\\%\\)\\]:focus-visible{--tw-ring-color:#a1a1aa}.tw\\:focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:focus-visible\\:ring-ring:focus-visible,.tw\\:focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:focus-visible\\:ring-slate-400:focus-visible{--tw-ring-color:var(--tw-color-slate-400)}.tw\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:focus-visible\\:outline-hidden:focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:focus-visible\\:outline-hidden:focus-visible{outline-offset:2px;outline:2px solid #0000}}.tw\\:focus-visible\\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.tw\\:focus-visible\\:outline-ring:focus-visible{outline-color:var(--ring)}.tw\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}:is(.tw\\:\\*\\:focus-visible\\:relative>*):focus-visible{position:relative}:is(.tw\\:\\*\\:focus-visible\\:z-10>*):focus-visible{z-index:10}.tw\\:active\\:bg-sidebar-accent:active{background-color:var(--sidebar-accent)}.tw\\:active\\:text-sidebar-accent-foreground:active{color:var(--sidebar-accent-foreground)}.tw\\:active\\:ring-3:active{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:active\\:not-aria-\\[haspopup\\]\\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:active\\:not-aria-\\[haspopup\\]\\:transform-\\[translateY\\(1px\\)\\]:active:not([aria-haspopup]){transform:translateY(1px)}.tw\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.tw\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.tw\\:disabled\\:bg-input\\/50:disabled{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:disabled\\:bg-input\\/50:disabled{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:disabled\\:bg-transparent:disabled{background-color:#0000}.tw\\:disabled\\:opacity-50:disabled{opacity:.5}:where([data-side=bottom]) .tw\\:in-data-\\[side\\=bottom\\]\\:translate-y-\\[calc\\(-50\\%-1px\\)\\]{--tw-translate-y:calc(-50% - 1px);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=bottom]) .tw\\:in-data-\\[side\\=bottom\\]\\:\\[clip-path\\:polygon\\(100\\%_0\\,100\\%_100\\%\\,0_100\\%\\)\\]{clip-path:polygon(100% 0,100% 100%,0 100%)}:where([data-side=primary]) .tw\\:in-data-\\[side\\=primary\\]\\:cursor-w-resize{cursor:w-resize}:where([data-side=secondary]) .tw\\:in-data-\\[side\\=secondary\\]\\:cursor-e-resize{cursor:e-resize}:where([data-side=top]) .tw\\:in-data-\\[side\\=top\\]\\:translate-y-\\[calc\\(-50\\%-1px\\)\\]{--tw-translate-y:calc(-50% - 1px);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=top]) .tw\\:in-data-\\[side\\=top\\]\\:\\[clip-path\\:polygon\\(100\\%_0\\,100\\%_100\\%\\,0_100\\%\\)\\]{clip-path:polygon(100% 0,100% 100%,0 100%)}:where([data-slot=button-group]) .tw\\:in-data-\\[slot\\=button-group\\]\\:rounded-lg{border-radius:var(--radius)}:where([data-slot=combobox-content]) .tw\\:in-data-\\[slot\\=combobox-content\\]\\:focus-within\\:border-inherit:focus-within{border-color:inherit}:where([data-slot=combobox-content]) .tw\\:in-data-\\[slot\\=combobox-content\\]\\:focus-within\\:ring-0:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:where([data-slot=dialog-content]) .tw\\:in-data-\\[slot\\=dialog-content\\]\\:rounded-lg\\!{border-radius:var(--radius)!important}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/20{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/20{background-color:color-mix(in oklab, var(--background) 20%, transparent)}}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:text-background{color:var(--background)}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:text-destructive{color:var(--destructive)}.tw\\:has-disabled\\:bg-input\\/50:has(:disabled){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-disabled\\:bg-input\\/50:has(:disabled){background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:has-disabled\\:opacity-50:has(:disabled){opacity:.5}.tw\\:has-aria-expanded\\:bg-muted\\/50:has([aria-expanded=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-aria-expanded\\:bg-muted\\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-1:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-1\\.5:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-2:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:has-data-\\[icon\\=inline-end\\]\\:pe-1\\.5:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *):has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-1:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-1\\.5:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-2:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:has-data-\\[icon\\=inline-start\\]\\:ps-1\\.5:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *):has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[slot\\=alert-action\\]\\:relative:has([data-slot=alert-action]){position:relative}.tw\\:has-data-\\[slot\\=alert-action\\]\\:pe-18:has([data-slot=alert-action]){padding-inline-end:calc(calc(var(--spacing)) * 18)}.tw\\:has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.tw\\:has-data-\\[slot\\=card-description\\]\\:grid-rows-\\[auto_auto\\]:has([data-slot=card-description]){grid-template-rows:auto auto}.tw\\:has-data-\\[slot\\=card-footer\\]\\:pb-0:has([data-slot=card-footer]){padding-bottom:calc(calc(var(--spacing)) * 0)}.tw\\:has-data-\\[slot\\=kbd\\]\\:pe-0:has([data-slot=kbd]){padding-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:has-data-\\[slot\\=kbd\\]\\:pe-1\\.5:has([data-slot=kbd]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[variant\\=inset\\]\\:bg-sidebar:has([data-variant=inset]){background-color:var(--sidebar)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:border-ring:has([data-slot=input-group-control]:focus-visible){border-color:var(--ring)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-3:has([data-slot=input-group-control]:focus-visible){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-ring\\/50:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-ring\\/50:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:border-destructive:has([data-slot][aria-invalid=true]){border-color:var(--destructive)}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-3:has([data-slot][aria-invalid=true]){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/20:has([data-slot][aria-invalid=true]){--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/20:has([data-slot][aria-invalid=true]){--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:h-auto:has(>[data-align=block-end]){height:auto}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:flex-col:has(>[data-align=block-end]){flex-direction:column}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:h-auto:has(>[data-align=block-start]){height:auto}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:flex-col:has(>[data-align=block-start]){flex-direction:column}.tw\\:has-\\[\\>\\[data-slot\\=button-group\\]\\]\\:gap-2:has(>[data-slot=button-group]){gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>button\\]\\:ms-\\[-0\\.3rem\\]:has(>button){margin-inline-start:-.3rem}.tw\\:has-\\[\\>button\\]\\:me-\\[-0\\.3rem\\]:has(>button){margin-inline-end:-.3rem}.tw\\:has-\\[\\>img\\]\\:grid-cols-\\[auto_1fr\\]:has(>img){grid-template-columns:auto 1fr}.tw\\:has-\\[\\>img\\]\\:gap-x-2:has(>img){column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>img\\:first-child\\]\\:pt-0:has(>img:first-child){padding-top:calc(calc(var(--spacing)) * 0)}.tw\\:has-\\[\\>kbd\\]\\:ms-\\[-0\\.15rem\\]:has(>kbd){margin-inline-start:-.15rem}.tw\\:has-\\[\\>kbd\\]\\:me-\\[-0\\.15rem\\]:has(>kbd){margin-inline-end:-.15rem}.tw\\:has-\\[\\>svg\\]\\:grid-cols-\\[auto_1fr\\]:has(>svg){grid-template-columns:auto 1fr}.tw\\:has-\\[\\>svg\\]\\:gap-x-2:has(>svg){column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>svg\\]\\:p-0:has(>svg){padding:calc(calc(var(--spacing)) * 0)}.tw\\:has-\\[\\>textarea\\]\\:h-auto:has(>textarea){height:auto}.tw\\:aria-disabled\\:pointer-events-none[aria-disabled=true]{pointer-events:none}.tw\\:aria-disabled\\:opacity-50[aria-disabled=true]{opacity:.5}.tw\\:aria-expanded\\:bg-muted[aria-expanded=true]{background-color:var(--muted)}.tw\\:aria-expanded\\:bg-secondary[aria-expanded=true]{background-color:var(--secondary)}.tw\\:aria-expanded\\:text-foreground[aria-expanded=true]{color:var(--foreground)}.tw\\:aria-expanded\\:text-secondary-foreground[aria-expanded=true]{color:var(--secondary-foreground)}.tw\\:aria-expanded\\:opacity-100[aria-expanded=true]{opacity:1}.tw\\:aria-invalid\\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.tw\\:aria-invalid\\:ring-0[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:aria-invalid\\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:aria-invalid\\:aria-checked\\:border-primary[aria-invalid=true][aria-checked=true]{border-color:var(--primary)}.tw\\:aria-pressed\\:bg-muted[aria-pressed=true]{background-color:var(--muted)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:h-px[aria-orientation=horizontal]{height:1px}.tw\\:aria-\\[orientation\\=horizontal\\]\\:w-full[aria-orientation=horizontal]{width:100%}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:start-0[aria-orientation=horizontal]:after{content:var(--tw-content);inset-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:h-1[aria-orientation=horizontal]:after{content:var(--tw-content);height:calc(calc(var(--spacing)) * 1)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:w-full[aria-orientation=horizontal]:after{content:var(--tw-content);width:100%}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:translate-x-0[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:-translate-y-1\\/2[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:aria-\\[orientation\\=vertical\\]\\:flex-col[aria-orientation=vertical]{flex-direction:column}.tw\\:data-inset\\:ps-7[data-inset]{padding-inline-start:calc(calc(var(--spacing)) * 7)}.tw\\:data-placeholder\\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.tw\\:data-quiet-focus\\:focus-visible\\:border-transparent[data-quiet-focus]:focus-visible{border-color:#0000}.tw\\:data-quiet-focus\\:focus-visible\\:ring-0[data-quiet-focus]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-quiet-focus\\:focus-visible\\:outline-none[data-quiet-focus]:focus-visible{--tw-outline-style:none;outline-style:none}.tw\\:data-\\[align-trigger\\=false\\]\\:min-w-36[data-align-trigger=false]{min-width:calc(calc(var(--spacing)) * 36)}.tw\\:data-\\[align-trigger\\=true\\]\\:min-w-\\(--radix-select-trigger-width\\)[data-align-trigger=true]{min-width:var(--radix-select-trigger-width)}.tw\\:data-\\[align-trigger\\=true\\]\\:animate-none[data-align-trigger=true]{animation:none}.tw\\:data-\\[disabled\\=true\\]\\:pointer-events-none[data-disabled=true]{pointer-events:none}.tw\\:data-\\[disabled\\=true\\]\\:opacity-50[data-disabled=true]{opacity:.5}.tw\\:data-\\[position\\=popper\\]\\:h-\\(--radix-select-trigger-height\\)[data-position=popper]{height:var(--radix-select-trigger-height)}.tw\\:data-\\[position\\=popper\\]\\:w-full[data-position=popper]{width:100%}.tw\\:data-\\[position\\=popper\\]\\:min-w-\\(--radix-select-trigger-width\\)[data-position=popper]{min-width:var(--radix-select-trigger-width)}.tw\\:data-\\[side\\=bottom\\]\\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.tw\\:data-\\[side\\=left\\]\\:-translate-x-1[data-side=left]{--tw-translate-x:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.tw\\:data-\\[side\\=right\\]\\:translate-x-1[data-side=right]{--tw-translate-x:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.tw\\:data-\\[side\\=top\\]\\:-translate-y-1[data-side=top]{--tw-translate-y:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.tw\\:data-\\[size\\=default\\]\\:h-8[data-size=default]{height:calc(calc(var(--spacing)) * 8)}.tw\\:data-\\[size\\=default\\]\\:h-\\[18\\.4px\\][data-size=default]{height:18.4px}.tw\\:data-\\[size\\=default\\]\\:w-\\[32px\\][data-size=default]{width:32px}.tw\\:data-\\[size\\=lg\\]\\:size-10[data-size=lg]{width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:data-\\[size\\=md\\]\\:text-sm[data-size=md]{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:data-\\[size\\=sm\\]\\:size-6[data-size=sm]{width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:data-\\[size\\=sm\\]\\:h-7[data-size=sm]{height:calc(calc(var(--spacing)) * 7)}.tw\\:data-\\[size\\=sm\\]\\:h-\\[14px\\][data-size=sm]{height:14px}.tw\\:data-\\[size\\=sm\\]\\:w-\\[24px\\][data-size=sm]{width:24px}.tw\\:data-\\[size\\=sm\\]\\:gap-3[data-size=sm]{gap:calc(calc(var(--spacing)) * 3)}.tw\\:data-\\[size\\=sm\\]\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,10px\\)\\][data-size=sm]{border-radius:min(var(--tw-radius-md), 10px)}.tw\\:data-\\[size\\=sm\\]\\:py-3[data-size=sm]{padding-block:calc(calc(var(--spacing)) * 3)}.tw\\:data-\\[size\\=sm\\]\\:text-xs[data-size=sm]{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:data-\\[size\\=sm\\]\\:has-data-\\[slot\\=card-footer\\]\\:pb-0[data-size=sm]:has([data-slot=card-footer]){padding-bottom:calc(calc(var(--spacing)) * 0)}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-item]:focus{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-item]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:data-highlighted\\:bg-foreground\\/10 *)[data-slot$=-item][data-highlighted]{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:data-highlighted\\:bg-foreground\\/10 *)[data-slot$=-item][data-highlighted]{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-separator\\]\\:bg-foreground\\/5 *)[data-slot$=-separator]{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-separator\\]\\:bg-foreground\\/5 *)[data-slot$=-separator]{background-color:color-mix(in oklab, var(--foreground) 5%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-trigger]:focus{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-trigger]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:aria-expanded\\:bg-foreground\\/10\\! *)[data-slot$=-trigger][aria-expanded=true]{background-color:var(--foreground)!important}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:aria-expanded\\:bg-foreground\\/10\\! *)[data-slot$=-trigger][aria-expanded=true]{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)!important}}:is(.tw\\:\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90>*)[data-slot=alert-description]{color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90>*)[data-slot=alert-description]{color:color-mix(in oklab, var(--destructive) 90%, transparent)}}:is(.tw\\:\\*\\:data-\\[slot\\=avatar\\]\\:ring-2>*)[data-slot=avatar]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:is(.tw\\:\\*\\:data-\\[slot\\=avatar\\]\\:ring-background>*)[data-slot=avatar]{--tw-ring-color:var(--background)}:is(.tw\\:\\*\\:data-\\[slot\\=input-group-addon\\]\\:ps-2\\!>*)[data-slot=input-group-addon]{padding-inline-start:calc(calc(var(--spacing)) * 2)!important}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:relative *)[data-slot=kbd]{position:relative}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:isolate *)[data-slot=kbd]{isolation:isolate}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:z-50 *)[data-slot=kbd]{z-index:50}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:rounded-sm *)[data-slot=kbd]{border-radius:calc(var(--radius) * .6)}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:flex>*)[data-slot=select-value]{display:flex}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:flex-1>*)[data-slot=select-value]{flex:1}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:items-center>*)[data-slot=select-value]{align-items:center}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:gap-1\\.5>*)[data-slot=select-value]{gap:calc(calc(var(--spacing)) * 1.5)}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:text-start>*)[data-slot=select-value]{text-align:start}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:first\\:rounded-s-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"]:first-child{border-start-start-radius:var(--radius);border-end-start-radius:var(--radius)}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:first\\:rounded-t-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"]:first-child{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:last\\:rounded-e-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"]:last-child{border-start-end-radius:var(--radius);border-end-end-radius:var(--radius)}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:last\\:rounded-b-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"]:last-child{border-bottom-right-radius:var(--radius);border-bottom-left-radius:var(--radius)}.tw\\:data-\\[state\\=active\\]\\:bg-background[data-state=active]{background-color:var(--background)}.tw\\:data-\\[state\\=active\\]\\:text-foreground[data-state=active]{color:var(--foreground)}.tw\\:data-\\[state\\=active\\]\\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-\\[state\\=closed\\]\\:overflow-hidden[data-state=closed]{overflow:hidden}.tw\\:data-\\[state\\=delayed-open\\]\\:animate-in[data-state=delayed-open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-\\[state\\=delayed-open\\]\\:fade-in-0[data-state=delayed-open]{--tw-enter-opacity:0}.tw\\:data-\\[state\\=delayed-open\\]\\:zoom-in-95[data-state=delayed-open]{--tw-enter-scale:.95}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-approved\\)\\][data-state=on]{background-color:var(--inv-soft-approved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-unapproved\\)\\][data-state=on]{background-color:var(--inv-soft-unapproved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-unknown\\)\\][data-state=on]{background-color:var(--inv-soft-unknown)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-approved\\)\\][data-state=on]{background-color:var(--inv-vivid-approved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-unapproved\\)\\][data-state=on]{background-color:var(--inv-vivid-unapproved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-unknown\\)\\][data-state=on]{background-color:var(--inv-vivid-unknown)}.tw\\:data-\\[state\\=on\\]\\:bg-muted[data-state=on]{background-color:var(--muted)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-approved\\)\\][data-state=on]{color:var(--inv-icon-approved)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-unapproved\\)\\][data-state=on]{color:var(--inv-icon-unapproved)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-unknown\\)\\][data-state=on]{color:var(--inv-icon-unknown)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-on\\)\\][data-state=on]{color:var(--inv-on)}.tw\\:data-\\[state\\=on\\]\\:text-foreground[data-state=on]{color:var(--foreground)}.tw\\:data-\\[state\\=open\\]\\:bg-accent[data-state=open]{background-color:var(--accent)}.tw\\:data-\\[state\\=open\\]\\:bg-muted[data-state=open]{background-color:var(--muted)}.tw\\:data-\\[state\\=open\\]\\:text-foreground[data-state=open]{color:var(--foreground)}.tw\\:data-\\[state\\=selected\\]\\:bg-muted[data-state=selected]{background-color:var(--muted)}.tw\\:data-\\[variant\\=destructive\\]\\:text-destructive[data-variant=destructive]{color:var(--destructive)}:is(:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:\\*\\*\\:text-accent-foreground\\! *)[data-variant=destructive] *),:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:text-accent-foreground\\! *)[data-variant=destructive]{color:var(--accent-foreground)!important}.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:text-destructive[data-variant=destructive]:focus{color:var(--destructive)}:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-foreground\\/10\\! *)[data-variant=destructive]:focus{background-color:var(--foreground)!important}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-foreground\\/10\\! *)[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)!important}}.tw\\:data-\\[variant\\=line\\]\\:rounded-none[data-variant=line]{border-radius:0}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:border-s-0:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"][data-variant=outline]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:border-t-0:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"][data-variant=outline]{border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:first\\:border-s:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"][data-variant=outline]:first-child{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:first\\:border-t:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"][data-variant=outline]:first-child{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:inset-x-0[data-vaul-drawer-direction=bottom]{inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:bottom-0[data-vaul-drawer-direction=bottom]{bottom:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:mt-24[data-vaul-drawer-direction=bottom]{margin-top:calc(calc(var(--spacing)) * 24)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:max-h-\\[80vh\\][data-vaul-drawer-direction=bottom]{max-height:80vh}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:rounded-t-xl[data-vaul-drawer-direction=bottom]{border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:border-t[data-vaul-drawer-direction=bottom]{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:inset-y-0[data-vaul-drawer-direction=left]{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:left-0[data-vaul-drawer-direction=left]{left:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:w-3\\/4[data-vaul-drawer-direction=left]{width:75%}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:flex-row[data-vaul-drawer-direction=left]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:rounded-r-xl[data-vaul-drawer-direction=left]{border-top-right-radius:calc(var(--radius) * 1.4);border-bottom-right-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:border-r[data-vaul-drawer-direction=left]{border-right-style:var(--tw-border-style);border-right-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=left\\/right\\]\\:flex-row[data-vaul-drawer-direction=left\\/right]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:inset-y-0[data-vaul-drawer-direction=right]{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:right-0[data-vaul-drawer-direction=right]{right:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:w-3\\/4[data-vaul-drawer-direction=right]{width:75%}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:flex-row[data-vaul-drawer-direction=right]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:rounded-l-xl[data-vaul-drawer-direction=right]{border-top-left-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:border-l[data-vaul-drawer-direction=right]{border-left-style:var(--tw-border-style);border-left-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:inset-x-0[data-vaul-drawer-direction=top]{inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:top-0[data-vaul-drawer-direction=top]{top:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:mb-24[data-vaul-drawer-direction=top]{margin-bottom:calc(calc(var(--spacing)) * 24)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:max-h-\\[80vh\\][data-vaul-drawer-direction=top]{max-height:80vh}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:rounded-b-xl[data-vaul-drawer-direction=top]{border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:border-b[data-vaul-drawer-direction=top]{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.tw\\:supports-backdrop-filter\\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--tw-blur-xs));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}}@media (min-width:40rem){.tw\\:sm\\:flex{display:flex}.tw\\:sm\\:max-w-sm{max-width:var(--tw-container-sm)}.tw\\:sm\\:flex-row{flex-direction:row}.tw\\:sm\\:justify-end{justify-content:flex-end}.tw\\:sm\\:p-8{padding:calc(calc(var(--spacing)) * 8)}.tw\\:sm\\:text-start{text-align:start}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:sm\\:max-w-sm[data-vaul-drawer-direction=left],.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:sm\\:max-w-sm[data-vaul-drawer-direction=right]{max-width:var(--tw-container-sm)}}@media (min-width:48rem){.tw\\:md\\:block{display:block}.tw\\:md\\:flex{display:flex}.tw\\:md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:md\\:gap-0\\.5{gap:calc(calc(var(--spacing)) * .5)}.tw\\:md\\:text-start{text-align:start}.tw\\:md\\:text-sm{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:md\\:text-pretty{text-wrap:pretty}.tw\\:md\\:opacity-0{opacity:0}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:m-2:is(:where(.tw\\:peer)[data-variant=inset]~*){margin:calc(calc(var(--spacing)) * 2)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:ms-0:is(:where(.tw\\:peer)[data-variant=inset]~*){margin-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:rounded-xl:is(:where(.tw\\:peer)[data-variant=inset]~*){border-radius:calc(var(--radius) * 1.4)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:shadow-sm:is(:where(.tw\\:peer)[data-variant=inset]~*){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:peer-data-\\[state\\=collapsed\\]\\:ms-2:is(:where(.tw\\:peer)[data-variant=inset]~*):is(:where(.tw\\:peer)[data-state=collapsed]~*){margin-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:md\\:after\\:hidden:after{content:var(--tw-content);display:none}}@media (min-width:64rem){.tw\\:lg\\:flex{display:flex}.tw\\:lg\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}:where(.tw\\:lg\\:space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 8) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 8) * calc(1 - var(--tw-space-x-reverse)))}.tw\\:lg\\:text-5xl{font-size:var(--tw-text-5xl);line-height:var(--tw-leading,var(--tw-text-5xl--line-height))}}@media (min-width:48rem){@media (min-width:64rem){.tw\\:md\\:lg\\:hidden{display:none}}}@media (min-width:80rem){.tw\\:xl\\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.tw\\:xl\\:grid-flow-col{grid-auto-flow:column}.tw\\:xl\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:xl\\:grid-cols-none{grid-template-columns:none}.tw\\:xl\\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}}@container search not (min-width:7rem){.tw\\:\\@max-\\[7rem\\]\\/search\\:hidden{display:none}.tw\\:\\@max-\\[7rem\\]\\/search\\:ps-3{padding-inline-start:calc(calc(var(--spacing)) * 3)}}@container search not (min-width:4rem){.tw\\:\\@max-\\[4rem\\]\\/search\\:hidden{display:none}.tw\\:\\@max-\\[4rem\\]\\/search\\:pe-3{padding-inline-end:calc(calc(var(--spacing)) * 3)}}@container search not (min-width:3rem){.tw\\:\\@max-\\[3rem\\]\\/search\\:ps-0{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\@max-\\[3rem\\]\\/search\\:pe-0{padding-inline-end:calc(calc(var(--spacing)) * 0)}}@container (min-width:24rem){.tw\\:\\@sm\\:basis-auto{flex-basis:auto}}.tw\\:ltr\\:left-2:where(:dir(ltr),[dir=ltr],[dir=ltr] *){left:calc(calc(var(--spacing)) * 2)}.tw\\:ltr\\:-translate-x-1\\/2:where(:dir(ltr),[dir=ltr],[dir=ltr] *){--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:right-2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:calc(calc(var(--spacing)) * 2)}.tw\\:rtl\\:flex:where(:dir(rtl),[dir=rtl],[dir=rtl] *){display:flex}.tw\\:rtl\\:-translate-x-px:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:translate-x-1\\/2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:translate-x-px:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:after\\:translate-x-1\\/2:where(:dir(rtl),[dir=rtl],[dir=rtl] *):after{content:var(--tw-content);--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=primary]) .tw\\:rtl\\:in-data-\\[side\\=primary\\]\\:cursor-e-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:e-resize}:where([data-side=secondary]) .tw\\:rtl\\:in-data-\\[side\\=secondary\\]\\:cursor-w-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:w-resize}.tw\\:rtl\\:aria-\\[orientation\\=horizontal\\]\\:after\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:data-\\[side\\=left\\]\\:translate-x-1:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-side=left]{--tw-translate-x:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:data-\\[side\\=right\\]\\:-translate-x-1:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-side=right]{--tw-translate-x:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:border-input:is(.dark *){border-color:var(--input)}.tw\\:dark\\:bg-destructive\\/20:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:bg-destructive\\/20:is(.dark *){background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:dark\\:bg-input\\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:bg-input\\/30:is(.dark *){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:dark\\:bg-transparent:is(.dark *){background-color:#0000}.tw\\:dark\\:text-amber-400:is(.dark *){color:var(--tw-color-amber-400)}.tw\\:dark\\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}.tw\\:dark\\:text-rose-400:is(.dark *){color:var(--tw-color-rose-400)}.tw\\:dark\\:text-sky-400:is(.dark *){color:var(--tw-color-sky-400)}.tw\\:dark\\:text-teal-400:is(.dark *){color:var(--tw-color-teal-400)}.tw\\:dark\\:after\\:mix-blend-lighten:is(.dark *):after{content:var(--tw-content);mix-blend-mode:lighten}@media (hover:hover){.tw\\:dark\\:hover\\:bg-blue-500:is(.dark *):hover{background-color:var(--tw-color-blue-500)}.tw\\:dark\\:hover\\:bg-destructive\\/30:is(.dark *):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-destructive\\/30:is(.dark *):hover{background-color:color-mix(in oklab, var(--destructive) 30%, transparent)}}.tw\\:dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:dark\\:hover\\:bg-muted\\/50:is(.dark *):hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-muted\\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:dark\\:hover\\:text-foreground:is(.dark *):hover{color:var(--foreground)}}.tw\\:dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:disabled\\:bg-input\\/80:is(.dark *):disabled{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:disabled\\:bg-input\\/80:is(.dark *):disabled{background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:dark\\:disabled\\:bg-transparent:is(.dark *):disabled{background-color:#0000}:where([data-slot=tooltip-content]) .tw\\:dark\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/10:is(.dark *){background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){:where([data-slot=tooltip-content]) .tw\\:dark\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/10:is(.dark *){background-color:color-mix(in oklab, var(--background) 10%, transparent)}}.tw\\:dark\\:has-disabled\\:bg-input\\/80:is(.dark *):has(:disabled){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:has-disabled\\:bg-input\\/80:is(.dark *):has(:disabled){background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:dark\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/40:is(.dark *):has([data-slot][aria-invalid=true]){--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/40:is(.dark *):has([data-slot][aria-invalid=true]){--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:aria-invalid\\:border-destructive\\/50:is(.dark *)[aria-invalid=true]{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:aria-invalid\\:border-destructive\\/50:is(.dark *)[aria-invalid=true]{border-color:color-mix(in oklab, var(--destructive) 50%, transparent)}}.tw\\:dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:data-open\\:animate-in:where([data-state=open]),.tw\\:data-open\\:animate-in:where([data-open]:not([data-open=false])){animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-open\\:bg-accent:where([data-state=open]),.tw\\:data-open\\:bg-accent:where([data-open]:not([data-open=false])){background-color:var(--accent)}.tw\\:data-open\\:text-accent-foreground:where([data-state=open]),.tw\\:data-open\\:text-accent-foreground:where([data-open]:not([data-open=false])){color:var(--accent-foreground)}.tw\\:data-open\\:fade-in-0:where([data-state=open]),.tw\\:data-open\\:fade-in-0:where([data-open]:not([data-open=false])){--tw-enter-opacity:0}.tw\\:data-open\\:zoom-in-95:where([data-state=open]),.tw\\:data-open\\:zoom-in-95:where([data-open]:not([data-open=false])){--tw-enter-scale:.95}@media (hover:hover){:is(.tw\\:data-open\\:hover\\:bg-sidebar-accent:where([data-state=open]),.tw\\:data-open\\:hover\\:bg-sidebar-accent:where([data-open]:not([data-open=false]))):hover{background-color:var(--sidebar-accent)}:is(.tw\\:data-open\\:hover\\:text-sidebar-accent-foreground:where([data-state=open]),.tw\\:data-open\\:hover\\:text-sidebar-accent-foreground:where([data-open]:not([data-open=false]))):hover{color:var(--sidebar-accent-foreground)}}.tw\\:data-closed\\:animate-out:where([data-state=closed]),.tw\\:data-closed\\:animate-out:where([data-closed]:not([data-closed=false])){animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-closed\\:fade-out-0:where([data-state=closed]),.tw\\:data-closed\\:fade-out-0:where([data-closed]:not([data-closed=false])){--tw-exit-opacity:0}.tw\\:data-closed\\:zoom-out-95:where([data-state=closed]),.tw\\:data-closed\\:zoom-out-95:where([data-closed]:not([data-closed=false])){--tw-exit-scale:.95}.tw\\:data-checked\\:border-primary:where([data-state=checked]),.tw\\:data-checked\\:border-primary:where([data-checked]:not([data-checked=false])){border-color:var(--primary)}.tw\\:data-checked\\:bg-primary:where([data-state=checked]),.tw\\:data-checked\\:bg-primary:where([data-checked]:not([data-checked=false])){background-color:var(--primary)}.tw\\:data-checked\\:text-primary-foreground:where([data-state=checked]),.tw\\:data-checked\\:text-primary-foreground:where([data-checked]:not([data-checked=false])){color:var(--primary-foreground)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=checked]),.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-checked]:not([data-checked=false])),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=checked]),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-checked]:not([data-checked=false])){--tw-translate-x:calc(100% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=checked]),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-checked]:not([data-checked=false])),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=checked]),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-checked]:not([data-checked=false])){--tw-translate-x:calc(calc(100% - 2px) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:data-checked\\:bg-primary:is(.dark *):where([data-state=checked]),.tw\\:dark\\:data-checked\\:bg-primary:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--primary)}.tw\\:dark\\:data-checked\\:bg-primary-foreground:is(.dark *):where([data-state=checked]),.tw\\:dark\\:data-checked\\:bg-primary-foreground:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--primary-foreground)}.tw\\:data-unchecked\\:bg-input:where([data-state=unchecked]),.tw\\:data-unchecked\\:bg-input:where([data-unchecked]:not([data-unchecked=false])){background-color:var(--input)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=unchecked]),.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=unchecked]),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=unchecked]),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=unchecked]),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-unchecked]:not([data-unchecked=false])){--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:data-unchecked\\:bg-foreground:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-foreground:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:var(--foreground)}.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:data-selected\\:bg-muted:where([data-selected=true]),.tw\\:data-selected\\:bg-muted\\/50:where([data-selected=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:bg-muted\\/50:where([data-selected=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:data-selected\\:bg-primary:where([data-selected=true]){background-color:var(--primary)}.tw\\:data-selected\\:bg-transparent:where([data-selected=true]){background-color:#0000}.tw\\:data-selected\\:text-foreground:where([data-selected=true]){color:var(--foreground)}.tw\\:data-selected\\:text-inherit:where([data-selected=true]){color:inherit}.tw\\:data-selected\\:text-muted-foreground\\/50:where([data-selected=true]){color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:text-muted-foreground\\/50:where([data-selected=true]){color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.tw\\:data-selected\\:text-primary-foreground:where([data-selected=true]){color:var(--primary-foreground)}.tw\\:data-selected\\:ring-2:where([data-selected=true]){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-selected\\:ring-primary-foreground\\/70:where([data-selected=true]){--tw-ring-color:var(--primary-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:ring-primary-foreground\\/70:where([data-selected=true]){--tw-ring-color:color-mix(in oklab, var(--primary-foreground) 70%, transparent)}}.tw\\:data-selected\\:ring-ring\\/50:where([data-selected=true]){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:ring-ring\\/50:where([data-selected=true]){--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:data-selected\\:ring-inset:where([data-selected=true]){--tw-ring-inset:inset}@media (forced-colors:active){.tw\\:forced-colors\\:data-selected\\:outline-2:where([data-selected=true]){outline-style:var(--tw-outline-style);outline-width:2px}.tw\\:forced-colors\\:data-selected\\:-outline-offset-2:where([data-selected=true]){outline-offset:calc(2px * -1)}.tw\\:forced-colors\\:data-selected\\:outline-\\[color\\:Highlight\\]:where([data-selected=true]){outline-color:highlight}}.tw\\:data-disabled\\:pointer-events-none:where([data-disabled=true]),.tw\\:data-disabled\\:pointer-events-none:where([data-disabled]:not([data-disabled=false])){pointer-events:none}.tw\\:data-disabled\\:cursor-not-allowed:where([data-disabled=true]),.tw\\:data-disabled\\:cursor-not-allowed:where([data-disabled]:not([data-disabled=false])){cursor:not-allowed}.tw\\:data-disabled\\:opacity-50:where([data-disabled=true]),.tw\\:data-disabled\\:opacity-50:where([data-disabled]:not([data-disabled=false])){opacity:.5}.tw\\:data-active\\:bg-background:where([data-state=active]),.tw\\:data-active\\:bg-background:where([data-active]:not([data-active=false])){background-color:var(--background)}.tw\\:data-active\\:bg-sidebar-accent:where([data-state=active]),.tw\\:data-active\\:bg-sidebar-accent:where([data-active]:not([data-active=false])){background-color:var(--sidebar-accent)}.tw\\:data-active\\:font-medium:where([data-state=active]),.tw\\:data-active\\:font-medium:where([data-active]:not([data-active=false])){--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:data-active\\:text-foreground:where([data-state=active]),.tw\\:data-active\\:text-foreground:where([data-active]:not([data-active=false])){color:var(--foreground)}.tw\\:data-active\\:text-sidebar-accent-foreground:where([data-state=active]),.tw\\:data-active\\:text-sidebar-accent-foreground:where([data-active]:not([data-active=false])){color:var(--sidebar-accent-foreground)}.tw\\:group-data-\\[variant\\=default\\]\\/tabs-list\\:data-active\\:shadow-sm:is(:where(.tw\\:group\\/tabs-list)[data-variant=default] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=default\\]\\/tabs-list\\:data-active\\:shadow-sm:is(:where(.tw\\:group\\/tabs-list)[data-variant=default] *):where([data-active]:not([data-active=false])){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:shadow-none:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:shadow-none:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:is(.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:after\\:opacity-100:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:after\\:opacity-100:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false]))):after{content:var(--tw-content);opacity:1}.tw\\:dark\\:data-active\\:border-input:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:border-input:is(.dark *):where([data-active]:not([data-active=false])){border-color:var(--input)}.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:dark\\:data-active\\:text-foreground:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:text-foreground:is(.dark *):where([data-active]:not([data-active=false])){color:var(--foreground)}.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:border-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:border-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){border-color:#0000}.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.tw\\:data-horizontal\\:mx-px:where([data-orientation=horizontal]){margin-inline:1px}.tw\\:data-horizontal\\:h-1:where([data-orientation=horizontal]){height:calc(calc(var(--spacing)) * 1)}.tw\\:data-horizontal\\:h-full:where([data-orientation=horizontal]){height:100%}.tw\\:data-horizontal\\:h-px:where([data-orientation=horizontal]){height:1px}.tw\\:data-horizontal\\:w-auto:where([data-orientation=horizontal]){width:auto}.tw\\:data-horizontal\\:w-full:where([data-orientation=horizontal]){width:100%}.tw\\:data-horizontal\\:flex-col:where([data-orientation=horizontal]){flex-direction:column}.tw\\:data-vertical\\:my-px:where([data-orientation=vertical]){margin-block:1px}.tw\\:data-vertical\\:h-auto:where([data-orientation=vertical]){height:auto}.tw\\:data-vertical\\:h-full:where([data-orientation=vertical]){height:100%}.tw\\:data-vertical\\:min-h-40:where([data-orientation=vertical]){min-height:calc(calc(var(--spacing)) * 40)}.tw\\:data-vertical\\:w-1:where([data-orientation=vertical]){width:calc(calc(var(--spacing)) * 1)}.tw\\:data-vertical\\:w-auto:where([data-orientation=vertical]){width:auto}.tw\\:data-vertical\\:w-full:where([data-orientation=vertical]){width:100%}.tw\\:data-vertical\\:w-px:where([data-orientation=vertical]){width:1px}.tw\\:data-vertical\\:flex-col:where([data-orientation=vertical]){flex-direction:column}.tw\\:data-vertical\\:items-stretch:where([data-orientation=vertical]){align-items:stretch}.tw\\:data-vertical\\:self-stretch:where([data-orientation=vertical]){align-self:stretch}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:mt-0 [data-lexical-editor=true]>blockquote{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:border-s-0 [data-lexical-editor=true]>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:ps-0 [data-lexical-editor=true]>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:font-normal [data-lexical-editor=true]>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:text-foreground [data-lexical-editor=true]>blockquote{color:var(--foreground)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:not-italic [data-lexical-editor=true]>blockquote{font-style:normal}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:mt-0 [data-lexical-editor=\\"true\\"]>blockquote{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:border-s-0 [data-lexical-editor=\\"true\\"]>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:ps-0 [data-lexical-editor=\\"true\\"]>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:font-normal [data-lexical-editor=\\"true\\"]>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:text-foreground [data-lexical-editor=\\"true\\"]>blockquote{color:var(--foreground)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:not-italic [data-lexical-editor=\\"true\\"]>blockquote{font-style:normal}.tw\\:\\[\\&_a\\]\\:underline a{text-decoration-line:underline}.tw\\:\\[\\&_a\\]\\:underline-offset-3 a{text-underline-offset:3px}@media (hover:hover){.tw\\:\\[\\&_a\\]\\:hover\\:text-foreground a:hover{color:var(--foreground)}}.tw\\:\\[\\&_p\\]\\:my-0 p{margin-block:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_p\\:not\\(\\:last-child\\)\\]\\:mb-4 p:not(:last-child){margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_s\\]\\:text-destructive s{color:var(--destructive)}.tw\\:\\[\\&_s\\]\\:line-through s{text-decoration-line:line-through}.tw\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.tw\\:\\[\\&_svg\\]\\:size-4 svg{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3\\.5 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_tr\\]\\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.tw\\:\\[\\&_tr\\:last-child\\]\\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.tw\\:\\[\\&_u\\]\\:font-semibold u{--tw-font-weight:var(--tw-font-weight-semibold);font-weight:var(--tw-font-weight-semibold)}.tw\\:\\[\\&_u\\]\\:text-success-foreground u{color:var(--success-foreground)}.tw\\:\\[\\&_u\\]\\:no-underline u{text-decoration-line:none}.tw\\:\\[\\&\\:has\\(\\[role\\=checkbox\\]\\)\\]\\:pe-0:has([role=checkbox]){padding-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\.border-b\\]\\:pb-2.border-b{padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:\\[\\.border-b\\]\\:pb-4.border-b{padding-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:\\[\\.border-b\\]\\:pb-3:is(:where(.tw\\:group\\/card)[data-size=sm] *).border-b{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:\\[\\.border-t\\]\\:pt-2.border-t{padding-top:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:px-2 *)[cmdk-group-heading]{padding-inline:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:py-1\\.5 *)[cmdk-group-heading]{padding-block:calc(calc(var(--spacing)) * 1.5)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:text-xs *)[cmdk-group-heading]{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:font-medium *)[cmdk-group-heading]{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:text-muted-foreground *)[cmdk-group-heading]{color:var(--muted-foreground)}:is(.tw\\:\\*\\:\\[a\\]\\:underline>*):is(a){text-decoration-line:underline}:is(.tw\\:\\*\\:\\[a\\]\\:underline-offset-3>*):is(a){text-underline-offset:3px}@media (hover:hover){.tw\\:\\[a\\]\\:hover\\:bg-destructive\\/20:is(a):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-destructive\\/20:is(a):hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:\\[a\\]\\:hover\\:bg-muted:is(a):hover{background-color:var(--muted)}.tw\\:\\[a\\]\\:hover\\:bg-primary\\/80:is(a):hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-primary\\/80:is(a):hover{background-color:color-mix(in oklab, var(--primary) 80%, transparent)}}.tw\\:\\[a\\]\\:hover\\:bg-secondary\\/80:is(a):hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-secondary\\/80:is(a):hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.tw\\:\\[a\\]\\:hover\\:text-muted-foreground:is(a):hover{color:var(--muted-foreground)}:is(.tw\\:\\*\\:\\[a\\]\\:hover\\:text-foreground>*):is(a):hover{color:var(--foreground)}}:is(.tw\\:\\*\\:\\[img\\]\\:row-span-2>*):is(img){grid-row:span 2/span 2}:is(.tw\\:\\*\\:\\[img\\]\\:translate-y-0\\.5>*):is(img){--tw-translate-y:calc(calc(var(--spacing)) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.tw\\:\\*\\:\\[img\\]\\:text-current>*):is(img){color:currentColor}:is(.tw\\:\\*\\:\\[img\\:first-child\\]\\:rounded-t-xl>*):is(img:first-child){border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}:is(.tw\\:\\*\\:\\[img\\:last-child\\]\\:rounded-b-xl>*):is(img:last-child){border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}:is(.tw\\:\\*\\:\\[img\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>*):is(img:not([class*=size-])){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:flex>*):is(span):last-child{display:flex}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:items-center>*):is(span):last-child{align-items:center}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:gap-2>*):is(span):last-child{gap:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\:\\[svg\\]\\:row-span-2>*):is(svg){grid-row:span 2/span 2}:is(.tw\\:\\*\\:\\[svg\\]\\:translate-y-0\\.5>*):is(svg){--tw-translate-y:calc(calc(var(--spacing)) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.tw\\:\\*\\:\\[svg\\]\\:text-current>*):is(svg){color:currentColor}:is(.tw\\:focus\\:\\*\\:\\[svg\\]\\:text-accent-foreground:focus>*):is(svg){color:var(--accent-foreground)}:is(.tw\\:data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:text-destructive[data-variant=destructive]>*):is(svg){color:var(--destructive)}:is(.tw\\:data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:text-destructive\\![data-variant=destructive]>*):is(svg){color:var(--destructive)!important}:is(.tw\\:data-selected\\:\\*\\:\\[svg\\]\\:text-foreground:where([data-selected=true])>*):is(svg){color:var(--foreground)}:is(.tw\\:\\*\\:\\[svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>*):is(svg:not([class*=size-])){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-s-none>:not(:first-child){border-start-start-radius:0;border-end-start-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-t-none>:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-s-0>:not(:first-child){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-t-0>:not(:first-child){border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-e-none>:not(:last-child){border-start-end-radius:0;border-end-end-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-b-none>:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.tw\\:has-\\[select\\[aria-hidden\\=true\\]\\:last-child\\]\\:\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:last-of-type\\]\\:rounded-e-lg:has(:is(select[aria-hidden=true]:last-child))>[data-slot=select-trigger]:last-of-type{border-start-end-radius:var(--radius);border-end-end-radius:var(--radius)}.tw\\:\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:not\\(\\[class\\*\\=w-\\]\\)\\]\\:w-fit>[data-slot=select-trigger]:not([class*=w-]){width:fit-content}.tw\\:\\[\\&\\>\\[data-slot\\]\\:not\\(\\:has\\(\\~\\[data-slot\\]\\)\\)\\]\\:rounded-e-lg\\!>[data-slot]:not(:has(~[data-slot])){border-start-end-radius:var(--radius)!important;border-end-end-radius:var(--radius)!important}.tw\\:\\[\\&\\>\\[data-slot\\]\\:not\\(\\:has\\(\\~\\[data-slot\\]\\)\\)\\]\\:rounded-b-lg\\!>[data-slot]:not(:has(~[data-slot])){border-bottom-right-radius:var(--radius)!important;border-bottom-left-radius:var(--radius)!important}.tw\\:\\[\\&\\>a\\]\\:underline>a{text-decoration-line:underline}.tw\\:\\[\\&\\>a\\]\\:underline-offset-4>a{text-underline-offset:4px}.tw\\:\\[\\&\\>a\\:hover\\]\\:text-primary>a:hover{color:var(--primary)}.tw\\:\\[\\&\\>blockquote\\]\\:my-0>blockquote{margin-block:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:border-s-0>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&\\>blockquote\\]\\:p-0>blockquote{padding:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:ps-0>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:font-normal>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&\\>blockquote\\]\\:text-foreground>blockquote{color:var(--foreground)}.tw\\:\\[\\&\\>blockquote\\]\\:not-italic>blockquote{font-style:normal}.tw\\:\\[\\&\\>input\\]\\:flex-1>input{flex:1}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:\\[\\&\\>input\\]\\:pt-3:has(>[data-align=block-end])>input{padding-top:calc(calc(var(--spacing)) * 3)}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:\\[\\&\\>input\\]\\:pb-3:has(>[data-align=block-start])>input{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:has-\\[\\>\\[data-align\\=inline-end\\]\\]\\:\\[\\&\\>input\\]\\:pe-1\\.5:has(>[data-align=inline-end])>input{padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-\\[\\>\\[data-align\\=inline-start\\]\\]\\:\\[\\&\\>input\\]\\:ps-1\\.5:has(>[data-align=inline-start])>input{padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:\\[\\&\\>kbd\\]\\:rounded-\\[calc\\(var\\(--radius\\)-5px\\)\\]>kbd{border-radius:calc(var(--radius) - 5px)}.tw\\:\\[\\&\\>li\\]\\:mt-2>li{margin-top:calc(calc(var(--spacing)) * 2)}.tw\\:\\[\\&\\>span\\:last-child\\]\\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tw\\:\\[\\&\\>svg\\]\\:pointer-events-none>svg{pointer-events:none}.tw\\:\\[\\&\\>svg\\]\\:hidden>svg{display:none}.tw\\:\\[\\&\\>svg\\]\\:size-3\\!>svg{width:calc(calc(var(--spacing)) * 3)!important;height:calc(calc(var(--spacing)) * 3)!important}.tw\\:\\[\\&\\>svg\\]\\:size-3\\.5>svg{width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&\\>svg\\]\\:size-4>svg{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>svg\\]\\:shrink-0>svg{flex-shrink:0}.tw\\:\\[\\&\\>svg\\]\\:text-sidebar-accent-foreground>svg{color:var(--sidebar-accent-foreground)}.tw\\:group-has-data-\\[size\\=lg\\]\\/avatar-group\\:\\[\\&\\>svg\\]\\:size-5:is(:where(.tw\\:group\\/avatar-group):has([data-size=lg]) *)>svg{width:calc(calc(var(--spacing)) * 5);height:calc(calc(var(--spacing)) * 5)}.tw\\:group-has-data-\\[size\\=sm\\]\\/avatar-group\\:\\[\\&\\>svg\\]\\:size-3:is(:where(.tw\\:group\\/avatar-group):has([data-size=sm]) *)>svg{width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=default\\]\\/avatar\\:\\[\\&\\>svg\\]\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=default] *)>svg,.tw\\:group-data-\\[size\\=lg\\]\\/avatar\\:\\[\\&\\>svg\\]\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=lg] *)>svg{width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:\\[\\&\\>svg\\]\\:hidden:is(:where(.tw\\:group\\/avatar)[data-size=sm] *)>svg,.tw\\:\\[\\&\\>svg\\:last-child\\]\\:hidden>svg:last-child{display:none}.tw\\:\\[\\&\\>svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3\\.5>svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&\\>svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>tr\\]\\:last\\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:\\[\\&\\[align\\=center\\]\\]\\:text-center[align=center]{text-align:center}.tw\\:\\[\\&\\[align\\=right\\]\\]\\:text-right[align=right]{text-align:right}.tw\\:\\[\\&\\[aria-orientation\\=horizontal\\]\\>div\\]\\:rotate-90[aria-orientation=horizontal]>div{rotate:90deg}[data-side=primary][data-collapsible=offcanvas] .tw\\:\\[\\[data-side\\=primary\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-end-2{inset-inline-end:calc(calc(var(--spacing)) * -2)}[data-side=primary][data-state=collapsed] .tw\\:\\[\\[data-side\\=primary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-e-resize{cursor:e-resize}[data-side=primary][data-state=collapsed] .tw\\:rtl\\:\\[\\[data-side\\=primary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-w-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:w-resize}[data-side=secondary][data-collapsible=offcanvas] .tw\\:\\[\\[data-side\\=secondary\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-start-2{inset-inline-start:calc(calc(var(--spacing)) * -2)}[data-side=secondary][data-state=collapsed] .tw\\:\\[\\[data-side\\=secondary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-w-resize{cursor:w-resize}[data-side=secondary][data-state=collapsed] .tw\\:rtl\\:\\[\\[data-side\\=secondary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-e-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:e-resize}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-cyrillic-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-cyrillic-wght-normal.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-greek-wght-normal.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-vietnamese-wght-normal.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-latin-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-latin-wght-normal.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}.light,:root{--radius:.625rem;--spacing:.25rem;--background:oklch(100% 0 0);--foreground:oklch(13.71% .036 258.53);--card:oklch(100% 0 0);--card-foreground:oklch(13.71% .036 258.53);--popover:oklch(98.43% .0018 248.56);--popover-foreground:oklch(13.71% .036 258.53);--primary:oklch(20.79% .0399 265.73);--primary-foreground:oklch(98.38% .0036 248.23);--secondary:oklch(95.89% .011 248.06);--secondary-foreground:oklch(20.79% .0399 265.73);--muted:oklch(95.89% .011 248.06);--muted-foreground:oklch(55.47% .0408 257.45);--accent:oklch(95.89% .011 248.06);--accent-foreground:oklch(20.79% .0399 265.73);--destructive:oklch(63.69% .2077 25.32);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(62.7% .194 149.214);--diff-deleted:oklch(57.7% .245 27.325);--warning:oklch(84% .16 84);--warning-foreground:oklch(28% .07 46);--border:oklch(92.9% .0127 255.58);--input:oklch(92.9% .0127 255.58);--ring:oklch(13.71% .036 258.53);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.43% .0018 248.56);--sidebar-foreground:oklch(13.71% .036 258.53);--sidebar-primary:oklch(20.79% .0399 265.73);--sidebar-primary-foreground:oklch(98.38% .0036 248.23);--sidebar-accent:oklch(95.89% .011 248.06);--sidebar-accent-foreground:oklch(20.79% .0399 265.73);--sidebar-border:oklch(92.9% .0127 255.58);--sidebar-ring:oklch(13.71% .036 258.53)}.dark{--background:oklch(13.71% .036 258.53);--foreground:oklch(98.38% .0036 248.23);--card:oklch(13.71% .036 258.53);--card-foreground:oklch(98.38% .0036 248.23);--popover:oklch(13.71% .036 258.53);--popover-foreground:oklch(98.38% .0036 248.23);--primary:oklch(98.38% .0036 248.23);--primary-foreground:oklch(20.79% .0399 265.73);--secondary:oklch(28% .037 259.98);--secondary-foreground:oklch(98.38% .0036 248.23);--muted:oklch(28% .037 259.98);--muted-foreground:oklch(71.07% .0351 256.8);--accent:oklch(28% .037 259.98);--accent-foreground:oklch(98.38% .0036 248.23);--destructive:oklch(39.6% .1331 25.71);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(79.2% .209 151.711);--diff-deleted:oklch(70.4% .191 22.216);--warning:oklch(41% .11 46);--warning-foreground:oklch(99% .02 95);--border:oklch(44.54% .0374 257.3);--input:oklch(44.54% .0374 257.3);--ring:oklch(86.88% .0199 252.89);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(13.71% .036 258.53);--sidebar-foreground:oklch(71.07% .0351 256.8);--sidebar-primary:oklch(98.38% .0036 248.23);--sidebar-primary-foreground:oklch(20.79% .0399 265.73);--sidebar-accent:oklch(28% .037 259.98);--sidebar-accent-foreground:oklch(71.07% .0351 256.8);--sidebar-border:oklch(28% .037 259.98);--sidebar-ring:oklch(86.88% .0199 252.89)}.paratext-light{--background:oklch(100% 0 0);--foreground:oklch(15.3% .006 107.1);--card:oklch(100% 0 0);--card-foreground:oklch(15.3% .006 107.1);--popover:oklch(100% 0 0);--popover-foreground:oklch(15.3% .006 107.1);--primary:oklch(55.5% .163 48.998);--primary-foreground:oklch(98.7% .022 95.277);--secondary:oklch(96.7% .001 286.375);--secondary-foreground:oklch(21% .006 285.885);--muted:oklch(96.6% .005 106.5);--muted-foreground:oklch(58% .031 107.3);--accent:oklch(96.6% .005 106.5);--accent-foreground:oklch(22.8% .013 107.4);--destructive:oklch(57.7% .245 27.325);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(62.7% .194 149.214);--diff-deleted:oklch(57.7% .245 27.325);--warning:oklch(84% .16 84);--warning-foreground:oklch(28% .07 46);--border:oklch(93% .007 106.5);--input:oklch(93% .007 106.5);--ring:oklch(73.7% .021 106.9);--chart-1:oklch(88% .011 106.6);--chart-2:oklch(58% .031 107.3);--chart-3:oklch(46.6% .025 107.3);--chart-4:oklch(39.4% .023 107.4);--chart-5:oklch(28.6% .016 107.4);--sidebar:oklch(98.8% .003 106.5);--sidebar-foreground:oklch(15.3% .006 107.1);--sidebar-primary:oklch(66.6% .179 58.318);--sidebar-primary-foreground:oklch(98.7% .022 95.277);--sidebar-accent:oklch(96.6% .005 106.5);--sidebar-accent-foreground:oklch(22.8% .013 107.4);--sidebar-border:oklch(93% .007 106.5);--sidebar-ring:oklch(73.7% .021 106.9)}.paratext-dark{--background:oklch(15.3% .006 107.1);--foreground:oklch(98.8% .003 106.5);--card:oklch(22.8% .013 107.4);--card-foreground:oklch(98.8% .003 106.5);--popover:oklch(22.8% .013 107.4);--popover-foreground:oklch(98.8% .003 106.5);--primary:oklch(47.3% .137 46.201);--primary-foreground:oklch(98.7% .022 95.277);--secondary:oklch(27.4% .006 286.033);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(28.6% .016 107.4);--muted-foreground:oklch(73.7% .021 106.9);--accent:oklch(28.6% .016 107.4);--accent-foreground:oklch(98.8% .003 106.5);--destructive:oklch(70.4% .191 22.216);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(79.2% .209 151.711);--diff-deleted:oklch(70.4% .191 22.216);--warning:oklch(41% .11 46);--warning-foreground:oklch(99% .02 95);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(58% .031 107.3);--chart-1:oklch(88% .011 106.6);--chart-2:oklch(58% .031 107.3);--chart-3:oklch(46.6% .025 107.3);--chart-4:oklch(39.4% .023 107.4);--chart-5:oklch(28.6% .016 107.4);--sidebar:oklch(22.8% .013 107.4);--sidebar-foreground:oklch(98.8% .003 106.5);--sidebar-primary:oklch(76.9% .188 70.08);--sidebar-primary-foreground:oklch(27.9% .077 45.635);--sidebar-accent:oklch(28.6% .016 107.4);--sidebar-accent-foreground:oklch(98.8% .003 106.5);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(58% .031 107.3)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}} `,"after-all"); //# sourceMappingURL=experimental.cjs.map diff --git a/lib/platform-bible-react/dist/experimental.js b/lib/platform-bible-react/dist/experimental.js index 0964d01b665..6139bb3f0ad 100644 --- a/lib/platform-bible-react/dist/experimental.js +++ b/lib/platform-bible-react/dist/experimental.js @@ -1,22 +1,22 @@ -import { O as zt, Q as Nt, aN as Ut, an as Et, aa as Lt, aI as St, aJ as Tt, b4 as Ct, b3 as nt, aW as Pt, a3 as qt, a6 as Dt, a1 as ct, a2 as j, J as Rt, Z as It, Y as At, c as x, b2 as Bt, b1 as gt, b0 as Ft, X as Ot, B as lt, T as vt, b as bt, d as mt, e as ft, p as Mt, E as jt, F as Kt, D as Gt, h as $t, ab as Vt, i as Ht, k as Yt, bj as Jt, V as Qt, R as Wt, K as Xt, W as Zt, S as ta, U as W } from "./resizable-ehLO8YVZ.js"; -import { q as qa, bk as Da, bl as Ra, bm as Ia, am as Aa, bn as Ba, bo as Fa, bp as Oa, bq as Ma, aj as ja, br as Ka, bs as Ga, ao as $a, bt as Va, ai as Ha, bu as Ya, bv as Ja, bw as Qa, r as Wa, ah as Xa, ae as Za, bx as tr } from "./resizable-ehLO8YVZ.js"; +import { O as _t, Q as Ut, aS as Nt, ao as Et, ab as Lt, aJ as St, aK as Tt, ba as Ct, b9 as nt, a$ as Pt, a4 as qt, a7 as Dt, a2 as st, a3 as j, J as Rt, Z as It, Y as At, c as x, b8 as Bt, b7 as gt, b6 as Ft, X as Ot, B as lt, T as vt, b as bt, d as mt, e as ft, p as Mt, E as jt, F as Kt, D as Gt, h as $t, ac as Vt, i as Ht, k as Yt, bq as Jt, V as Qt, R as Xt, K as Wt, W as Zt, S as ta, U as X } from "./resizable-BQFRPfJp.js"; +import { q as qa, br as Da, bs as Ra, bt as Ia, an as Aa, bu as Ba, bv as Fa, bw as Oa, bx as Ma, ak as ja, by as Ka, bz as Ga, ap as $a, bA as Va, aj as Ha, bB as Ya, bC as Ja, bD as Qa, r as Xa, ai as Wa, af as Za, bE as tr } from "./resizable-BQFRPfJp.js"; import { jsxs as l, Fragment as V, jsx as t } from "react/jsx-runtime"; import { formatReplacementString as ht } from "platform-bible-utils"; import { CloudOff as ut, SearchX as aa, Check as ra, ArrowLeft as ea, ArrowRight as oa, ChevronDown as ia } from "lucide-react"; -import { useState as K, useRef as I, useEffect as Z, useCallback as na, useMemo as _ } from "react"; -function sa(a, r = 50) { +import { useState as K, useRef as I, useEffect as Z, useCallback as na, useMemo as z } from "react"; +function ca(a, r = 50) { const [e, d] = K(r), n = I(null); return Z(() => { d(r); }, [a, r]), Z(() => { if (e >= a.length) return; - const o = n.current, s = new IntersectionObserver( - ([z]) => { - z.isIntersecting && d((N) => Math.min(N + r, a.length)); + const o = n.current, c = new IntersectionObserver( + ([_]) => { + _.isIntersecting && d((U) => Math.min(U + r, a.length)); }, { threshold: 0 } ); - return o && s.observe(o), () => s.disconnect(); + return o && c.observe(o), () => c.disconnect(); }, [e, a.length, r]), { visibleItems: a.slice(0, e), sentinelRef: n, @@ -47,7 +47,7 @@ const xa = Object.freeze([ "%resourcePicker_clear_filters%", "%resourcePicker_downloads_unavailable%" ]), b = (a, r) => a[r] ?? r; -function st({ +function ct({ label: a, resources: r, onSelect: e, @@ -55,9 +55,9 @@ function st({ }) { if (r.length !== 0) return /* @__PURE__ */ l(V, { children: [ - /* @__PURE__ */ t(ct, { className: "tw:border-0 tw:hover:bg-transparent", children: /* @__PURE__ */ t(j, { colSpan: 4, className: "tw:border-0 tw:pt-4 tw:pb-0", children: /* @__PURE__ */ t(Rt, { className: "tw:text-xs tw:tracking-wider tw:text-muted-foreground tw:uppercase", children: a }) }) }), + /* @__PURE__ */ t(st, { className: "tw:border-0 tw:hover:bg-transparent", children: /* @__PURE__ */ t(j, { colSpan: 4, className: "tw:border-0 tw:pt-4 tw:pb-0", children: /* @__PURE__ */ t(Rt, { className: "tw:text-xs tw:tracking-wider tw:text-muted-foreground tw:uppercase", children: a }) }) }), r.map((n) => /* @__PURE__ */ l( - ct, + st, { className: e ? "tw:cursor-pointer tw:border-0" : "tw:pointer-events-none tw:border-0", role: e ? "button" : void 0, @@ -80,7 +80,7 @@ function st({ )) ] }); } -function ca(a) { +function sa(a) { return a.isResourcesLoading ? "loading" : a.hasNoResults ? a.canClearFiltersHelp ? "filteredEmpty" : a.hasResourcesError ? "error" : a.areDownloadsUnavailable ? "downloadsUnavailable" : "empty" : "list"; } function la(a, r) { @@ -95,42 +95,42 @@ function ka({ onRetryResources: d, areDownloadsUnavailable: n, resourceType: o, - selectedResourceIds: s, - notice: z, - allowSelectingInstalled: N = !0, + selectedResourceIds: c, + notice: _, + allowSelectingInstalled: U = !0, localizedStrings: w, allowDeselect: G, onSelect: T, searchInputRef: k }) { - const [u, C] = K(""), [v, A] = K([]), U = I(null), y = k ?? U, P = na(() => { - var c; - C(""), A([]), (c = y.current) == null || c.focus(); - }, [y]), f = _( + const [u, C] = K(""), [v, A] = K([]), N = I(null), y = k ?? N, P = na(() => { + var s; + C(""), A([]), (s = y.current) == null || s.focus(); + }, [y]), f = z( () => a.filter( - (c) => !o || (Array.isArray(o) ? o.includes(c.type) : c.type === o) + (s) => !o || (Array.isArray(o) ? o.includes(s.type) : s.type === o) ), [a, o] - ), m = _( - () => f.filter((c) => la(c, u)).filter( - (c) => v.length === 0 || v.includes(c.bestLanguageName) + ), m = z( + () => f.filter((s) => la(s, u)).filter( + (s) => v.length === 0 || v.includes(s.bestLanguageName) ), [f, u, v] - ), E = _( - () => m.filter((c) => s == null ? void 0 : s.includes(c.dblEntryUid)), - [m, s] - ), q = _( - () => m.filter((c) => c.installed && !(s != null && s.includes(c.dblEntryUid))), - [m, s] - ), D = _( + ), E = z( + () => m.filter((s) => c == null ? void 0 : c.includes(s.dblEntryUid)), + [m, c] + ), q = z( + () => m.filter((s) => s.installed && !(c != null && c.includes(s.dblEntryUid))), + [m, c] + ), D = z( () => m.filter( - (c) => !c.installed && !(s != null && s.includes(c.dblEntryUid)) + (s) => !s.installed && !(c != null && c.includes(s.dblEntryUid)) ), - [m, s] - ), { visibleItems: B, sentinelRef: R, hasMore: F } = sa(D), L = _( - () => Array.from(new Set(a.map((c) => c.bestLanguageName))).map((c) => ({ - label: c, - value: c + [m, c] + ), { visibleItems: B, sentinelRef: R, hasMore: F } = ca(D), L = z( + () => Array.from(new Set(a.map((s) => s.bestLanguageName))).map((s) => ({ + label: s, + value: s })), [a] ), i = E.length === 0 && q.length === 0 && D.length === 0, g = b(w, "%resourcePicker_title%"), p = b(w, "%resourcePicker_description%"), tt = b(w, "%resourcePicker_search_placeholder%"), O = b(w, "%resourcePicker_language_filter_any%"), H = b( @@ -145,11 +145,11 @@ function ka({ ), Q = b(w, "%resourcePicker_clear_filters%"), xt = b( w, "%resourcePicker_downloads_unavailable%" - ), kt = b(w, "%resourcePicker_showing_count%"), ot = v.length > 0 && f.some((c) => !v.includes(c.bestLanguageName)), wt = u.length > 0 || ot, yt = _(() => { + ), kt = b(w, "%resourcePicker_showing_count%"), ot = v.length > 0 && f.some((s) => !v.includes(s.bestLanguageName)), wt = u.length > 0 || ot, yt = z(() => { if (!ot) return O; if (v.length === 1) { - const c = L.find(($) => $.value === v[0]); - if (c) return c.label; + const s = L.find(($) => $.value === v[0]); + if (s) return s.label; } return ht( b(w, "%resourcePicker_language_filter_multipleSelected%"), @@ -157,26 +157,26 @@ function ka({ selectCount: v.length } ); - }, [ot, v, L, O, w]), _t = wt && f.length > 0, M = !!r || !!e || f.length === 0, pt = I(M); + }, [ot, v, L, O, w]), zt = wt && f.length > 0, M = !!r || !!e || f.length === 0, pt = I(M); Z(() => { - const c = pt.current && !M; - if (pt.current = M, !c) return; + const s = pt.current && !M; + if (pt.current = M, !s) return; const $ = y.current; if (!$ || $.disabled) return; const { activeElement: it } = document; (!it || it === document.body || it.getAttribute("data-slot") === "dialog-content") && $.focus(); }, [M, y]); - const S = ca({ + const S = sa({ isResourcesLoading: !!r, hasResourcesError: !!e, hasNoResults: i, - canClearFiltersHelp: _t, + canClearFiltersHelp: zt, areDownloadsUnavailable: !!n }); return /* @__PURE__ */ l(V, { children: [ - /* @__PURE__ */ l(zt, { className: "tw:px-4 tw:pt-4", children: [ - /* @__PURE__ */ t(Nt, { children: g }), - /* @__PURE__ */ t(Ut, { className: "tw:sr-only", children: p }) + /* @__PURE__ */ l(_t, { className: "tw:px-4 tw:pt-4", children: [ + /* @__PURE__ */ t(Ut, { children: g }), + /* @__PURE__ */ t(Nt, { className: "tw:sr-only", children: p }) ] }), /* @__PURE__ */ l("div", { className: "tw:flex tw:gap-2 tw:p-4", children: [ /* @__PURE__ */ t( @@ -203,12 +203,12 @@ function ka({ } ) ] }), - /* @__PURE__ */ t("div", { role: "status", children: z && /* @__PURE__ */ t( + /* @__PURE__ */ t("div", { role: "status", children: _ && /* @__PURE__ */ t( St, { role: void 0, className: "tw:mx-4 tw:mb-2 tw:w-auto tw:bg-muted tw:text-muted-foreground", - children: /* @__PURE__ */ t(Tt, { children: z }) + children: /* @__PURE__ */ t(Tt, { children: _ }) } ) }), wt && (S === "list" || S === "filteredEmpty") && /* @__PURE__ */ t("p", { className: "tw:px-4 tw:pb-1 tw:text-end tw:text-xs tw:text-muted-foreground", children: ht(kt, { @@ -254,7 +254,7 @@ function ka({ ] }), /* @__PURE__ */ l(Dt, { children: [ /* @__PURE__ */ t( - st, + ct, { label: H, resources: E, @@ -263,22 +263,22 @@ function ka({ } ), /* @__PURE__ */ t( - st, + ct, { label: at, resources: q, - onSelect: N ? T : void 0 + onSelect: U ? T : void 0 } ), /* @__PURE__ */ t( - st, + ct, { label: rt, resources: B, onSelect: T } ), - F && /* @__PURE__ */ t(ct, { className: "tw:border-0", children: /* @__PURE__ */ t(j, { colSpan: 4, className: "tw:border-0 tw:p-0", children: /* @__PURE__ */ t("div", { ref: R, "aria-hidden": !0 }) }) }) + F && /* @__PURE__ */ t(st, { className: "tw:border-0", children: /* @__PURE__ */ t(j, { colSpan: 4, className: "tw:border-0 tw:p-0", children: /* @__PURE__ */ t("div", { ref: R, "aria-hidden": !0 }) }) }) ] }) ] }) ] }) @@ -291,18 +291,18 @@ function ya({ onItemClick: d, selectedItemId: n, emptyStateMessage: o = "No items found", - detailRegionLabel: s = "Selected item details", - isLoading: z = !1, - variant: N = "text", + detailRegionLabel: c = "Selected item details", + isLoading: _ = !1, + variant: U = "text", showSourceLanguage: w = !1, showTransliteration: G = !1, onCharacterPress: T, className: k }) { - const [u, C] = K(), v = I(null), A = n ?? u, U = _( + const [u, C] = K(), v = I(null), A = n ?? u, N = z( () => u ? a.find((i) => i.id === u) : void 0, [u, a] - ), y = _(() => a.map((i) => ({ id: i.id })), [a]), P = (i) => { + ), y = z(() => a.map((i) => ({ id: i.id })), [a]), P = (i) => { d == null || d(i), e && C(i.id === u ? void 0 : i.id); }, f = (i) => { const g = a.find((p) => p.id === i.id); @@ -319,19 +319,19 @@ function ya({ }); }, R = I(null); if (Z(() => { - if (!U) return; + if (!N) return; const i = R.current; if (!i) return; const g = (p) => { p.key === "Escape" && (p.preventDefault(), B()); }; return i.addEventListener("keydown", g), () => i.removeEventListener("keydown", g); - }, [U]), z) + }, [N]), _) return /* @__PURE__ */ t("div", { className: x("tw:flex tw:flex-col tw:gap-2 tw:p-2", k), children: Array.from({ length: 6 }, (i, g) => /* @__PURE__ */ t( At, { className: x("tw:h-12 tw:w-full tw:rounded", { - "tw:h-20": N === "thumbnail" + "tw:h-20": U === "thumbnail" }) }, g @@ -380,7 +380,7 @@ function ya({ da, { item: i, - variant: N, + variant: U, showSourceLanguage: w, showTransliteration: G } @@ -390,7 +390,7 @@ function ya({ ); }) } - ), L = e && U ? e(U, B) : void 0; + ), L = e && N ? e(N, B) : void 0; return /* @__PURE__ */ t( "div", { @@ -408,7 +408,7 @@ function ya({ { ref: R, role: "region", - "aria-label": s, + "aria-label": c, className: "tw:h-full tw:overflow-y-auto tw:bg-background tw:p-4", children: L } @@ -447,7 +447,7 @@ function da({ /* @__PURE__ */ t(Ot, { className: "tw:absolute tw:bottom-0 tw:left-0 tw:right-0" }) ] }); } -const _a = [ +const za = [ "%sourceLanguageIndexedList_emptyState%", "%sourceLanguageIndexedList_loading%", "%sourceLanguageIndexedList_occurrenceCount%", @@ -457,7 +457,7 @@ const _a = [ "%sourceLanguageIndexedList_navigationModeDropdown%", "%sourceLanguageIndexedList_backToList%" ]; -function za({ +function _a({ scrRef: a, onClick: r, tooltipContent: e, @@ -466,7 +466,7 @@ function za({ testId: o = "linked-scr-ref-button" }) { if (a === "") return; - const s = /* @__PURE__ */ t( + const c = /* @__PURE__ */ t( lt, { type: "button", @@ -485,37 +485,37 @@ function za({ } ); return e ? /* @__PURE__ */ t(vt, { delayDuration: 0, children: /* @__PURE__ */ l(bt, { children: [ - /* @__PURE__ */ t(mt, { asChild: !0, children: s }), + /* @__PURE__ */ t(mt, { asChild: !0, children: c }), /* @__PURE__ */ t(ft, { children: e }) - ] }) }) : s; + ] }) }) : c; } -const Na = Object.freeze([ +const Ua = Object.freeze([ "%navigationHistory_back_tooltip%", "%navigationHistory_forward_tooltip%", "%navigationHistory_backList_ariaLabel%", "%navigationHistory_forwardList_ariaLabel%" -]), X = (a, r) => a[r] ?? r; -function Ua({ +]), W = (a, r) => a[r] ?? r; +function Na({ canGoBack: a = !1, canGoForward: r = !1, backItems: e = [], forwardItems: d = [], onNavigate: n, localizedStrings: o = {}, - showKeyboardShortcuts: s = !0, - className: z, - variant: N = "ghost", + showKeyboardShortcuts: c = !0, + className: _, + variant: U = "ghost", groupClassName: w, showDivider: G = !1 }) { - const T = Qt(), k = Mt(), u = k === "rtl", [C, v] = K(void 0), A = I(null), U = I(null), y = X(o, "%navigationHistory_back_tooltip%"), P = X(o, "%navigationHistory_forward_tooltip%"), f = X( + const T = Qt(), k = Mt(), u = k === "rtl", [C, v] = K(void 0), A = I(null), N = I(null), y = W(o, "%navigationHistory_back_tooltip%"), P = W(o, "%navigationHistory_forward_tooltip%"), f = W( o, "%navigationHistory_backList_ariaLabel%" - ), m = X( + ), m = W( o, "%navigationHistory_forwardList_ariaLabel%" ), [E, q] = T ? ["⌘[", "⌘]"] : ["Alt+←", "Alt+→"], D = Jt("left", k) === "back" ? E : q, B = D === E ? q : E, R = (i, g) => { - const p = i === "back", tt = p ? a : r, O = p ? e : d, H = p ? y : P, at = p ? f : m, rt = p ? D : B, Y = p ? A : U, J = C === i, et = p !== u; + const p = i === "back", tt = p ? a : r, O = p ? e : d, H = p ? y : P, at = p ? f : m, rt = p ? D : B, Y = p ? A : N, J = C === i, et = p !== u; return /* @__PURE__ */ l( Gt, { @@ -541,9 +541,9 @@ function Ua({ "aria-haspopup": "menu", "aria-expanded": J, "data-testid": `navigation-history-${i}-button`, - className: x(g ? "tw:rounded-e-none" : "tw:rounded-s-none", z), + className: x(g ? "tw:rounded-e-none" : "tw:rounded-s-none", _), size: "icon", - variant: N, + variant: U, disabled: !tt, onClick: () => n(p ? -1 : 1), onKeyDown: (h) => { @@ -556,7 +556,7 @@ function Ua({ ) }) }), /* @__PURE__ */ t(ft, { children: /* @__PURE__ */ l("p", { children: [ H, - s && /* @__PURE__ */ l(V, { children: [ + c && /* @__PURE__ */ l(V, { children: [ " ", /* @__PURE__ */ t(Vt, { children: rt }) ] }) @@ -642,7 +642,7 @@ function La({ }) { return /* @__PURE__ */ l("div", { className: "tw:flex tw:flex-col tw:gap-1", children: [ /* @__PURE__ */ t( - Wt, + Xt, { value: r, onValueChange: (o) => { @@ -658,7 +658,7 @@ function La({ ), children: [ /* @__PURE__ */ t( - Xt, + Wt, { value: o.value, id: `internet-option-${o.value}`, @@ -716,7 +716,7 @@ function Ta({ "aria-expanded": n, "aria-controls": "developer-section-content", className: "tw:flex tw:w-full tw:items-center tw:justify-between tw:px-2 tw:font-normal tw:text-muted-foreground", - onClick: () => o((s) => !s), + onClick: () => o((c) => !c), children: [ /* @__PURE__ */ t("span", { children: a["%paratextRegistration_developer_section_label%"] }), /* @__PURE__ */ t( @@ -733,13 +733,13 @@ function Ta({ { type: "single", value: r, - onValueChange: (s) => { - (s === "Production" || s === "QualityAssurance" || s === "Development" || s === "Test") && e(s); + onValueChange: (c) => { + (c === "Production" || c === "QualityAssurance" || c === "Development" || c === "Test") && e(c); }, disabled: d, children: [ /* @__PURE__ */ t( - W, + X, { value: "Production", variant: "outline", @@ -748,7 +748,7 @@ function Ta({ } ), /* @__PURE__ */ t( - W, + X, { value: "QualityAssurance", variant: "outline", @@ -757,7 +757,7 @@ function Ta({ } ), /* @__PURE__ */ t( - W, + X, { value: "Development", variant: "outline", @@ -765,7 +765,7 @@ function Ta({ children: a["%paratextRegistration_label_serverType_option_Development%"] } ), - /* @__PURE__ */ t(W, { value: "Test", variant: "outline", "data-testid": "server-type-test", children: a["%paratextRegistration_label_serverType_option_Test%"] }) + /* @__PURE__ */ t(X, { value: "Test", variant: "outline", "data-testid": "server-type-test", children: a["%paratextRegistration_label_serverType_option_Test%"] }) ] } ) }) @@ -931,7 +931,7 @@ pa(`/* By default the editor is too tall for the footnote editor, even while emp list-style-type: disclosure-open; } /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--tw-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--tw-color-red-100:oklch(93.6% .032 17.717);--tw-color-red-200:oklch(88.5% .062 18.334);--tw-color-red-300:oklch(80.8% .114 19.571);--tw-color-red-400:oklch(70.4% .191 22.216);--tw-color-red-500:oklch(63.7% .237 25.331);--tw-color-red-600:oklch(57.7% .245 27.325);--tw-color-red-700:oklch(50.5% .213 27.518);--tw-color-red-800:oklch(44.4% .177 26.899);--tw-color-orange-100:oklch(95.4% .038 75.164);--tw-color-orange-800:oklch(47% .157 37.304);--tw-color-amber-200:oklch(92.4% .12 95.746);--tw-color-amber-400:oklch(82.8% .189 84.429);--tw-color-amber-500:oklch(76.9% .188 70.08);--tw-color-amber-600:oklch(66.6% .179 58.318);--tw-color-yellow-50:oklch(98.7% .026 102.212);--tw-color-yellow-100:oklch(97.3% .071 103.193);--tw-color-yellow-400:oklch(85.2% .199 91.936);--tw-color-yellow-500:oklch(79.5% .184 86.047);--tw-color-yellow-600:oklch(68.1% .162 75.834);--tw-color-yellow-700:oklch(55.4% .135 66.442);--tw-color-green-50:oklch(98.2% .018 155.826);--tw-color-green-100:oklch(96.2% .044 156.743);--tw-color-green-500:oklch(72.3% .219 149.579);--tw-color-green-600:oklch(62.7% .194 149.214);--tw-color-green-700:oklch(52.7% .154 150.069);--tw-color-green-800:oklch(44.8% .119 151.328);--tw-color-teal-400:oklch(77.7% .152 181.912);--tw-color-teal-500:oklch(70.4% .14 182.503);--tw-color-teal-600:oklch(60% .118 184.704);--tw-color-sky-400:oklch(74.6% .16 232.661);--tw-color-sky-500:oklch(68.5% .169 237.323);--tw-color-sky-600:oklch(58.8% .158 241.966);--tw-color-blue-50:oklch(97% .014 254.604);--tw-color-blue-100:oklch(93.2% .032 255.585);--tw-color-blue-400:oklch(70.7% .165 254.624);--tw-color-blue-500:oklch(62.3% .214 259.815);--tw-color-blue-600:oklch(54.6% .245 262.881);--tw-color-blue-800:oklch(42.4% .199 265.638);--tw-color-indigo-200:oklch(87% .065 274.039);--tw-color-purple-50:oklch(97.7% .014 308.299);--tw-color-purple-200:oklch(90.2% .063 306.703);--tw-color-purple-900:oklch(38.1% .176 304.987);--tw-color-rose-400:oklch(71.2% .194 13.428);--tw-color-rose-500:oklch(64.5% .246 16.439);--tw-color-rose-600:oklch(58.6% .253 17.585);--tw-color-slate-300:oklch(86.9% .022 252.894);--tw-color-slate-400:oklch(70.4% .04 256.788);--tw-color-slate-900:oklch(20.8% .042 265.755);--tw-color-gray-50:oklch(98.5% .002 247.839);--tw-color-gray-100:oklch(96.7% .003 264.542);--tw-color-gray-300:oklch(87.2% .01 258.338);--tw-color-gray-500:oklch(55.1% .027 264.364);--tw-color-gray-600:oklch(44.6% .03 256.802);--tw-color-gray-700:oklch(37.3% .034 259.733);--tw-color-gray-800:oklch(27.8% .033 256.848);--tw-color-zinc-400:oklch(70.5% .015 286.067);--tw-color-neutral-300:oklch(87% 0 0);--tw-color-black:#000;--tw-color-white:#fff;--tw-container-xs:20rem;--tw-container-sm:24rem;--tw-container-md:28rem;--tw-container-lg:32rem;--tw-container-2xl:42rem;--tw-container-3xl:48rem;--tw-container-4xl:56rem;--tw-container-6xl:72rem;--tw-text-xs:.75rem;--tw-text-xs--line-height:calc(1 / .75);--tw-text-sm:.875rem;--tw-text-sm--line-height:calc(1.25 / .875);--tw-text-base:1rem;--tw-text-base--line-height:calc(1.5 / 1);--tw-text-lg:1.125rem;--tw-text-lg--line-height:calc(1.75 / 1.125);--tw-text-xl:1.25rem;--tw-text-xl--line-height:calc(1.75 / 1.25);--tw-text-2xl:1.5rem;--tw-text-2xl--line-height:calc(2 / 1.5);--tw-text-3xl:1.875rem;--tw-text-3xl--line-height:calc(2.25 / 1.875);--tw-text-4xl:2.25rem;--tw-text-4xl--line-height:calc(2.5 / 2.25);--tw-text-5xl:3rem;--tw-text-5xl--line-height:1;--tw-font-weight-normal:400;--tw-font-weight-medium:500;--tw-font-weight-semibold:600;--tw-font-weight-bold:700;--tw-font-weight-extrabold:800;--tw-tracking-tight:-.025em;--tw-tracking-wider:.05em;--tw-tracking-widest:.1em;--tw-leading-tight:1.25;--tw-leading-snug:1.375;--tw-leading-relaxed:1.625;--tw-leading-loose:2;--tw-radius-xs:.125rem;--tw-radius-md:calc(var(--radius) * .8);--tw-drop-shadow-sm:0 1px 2px #00000026;--tw-animate-spin:spin 1s linear infinite;--tw-animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--tw-blur-xs:4px;--tw-default-transition-duration:.15s;--tw-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--tw-default-font-family:"IBM Plex Sans Variable", sans-serif;--tw-default-mono-font-family:var(--tw-font-mono)}}@layer base{.pr-twp,.pr-twp *{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.pr-twp,.pr-twp *{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body.pr-twp{background-color:var(--background);color:var(--foreground)}html.pr-twp{font-family:IBM Plex Sans Variable,sans-serif}:where(.pr-twp,.pr-twp *),:where(.pr-twp,.pr-twp *):after,:where(.pr-twp,.pr-twp *):before,:where(.pr-twp,.pr-twp *) ::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}:where(.pr-twp,.pr-twp *) ::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}.pr-twp{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--tw-default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--tw-default-font-feature-settings,normal);font-variation-settings:var(--tw-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr:where(.pr-twp,.pr-twp *){height:0;color:inherit;border-top-width:1px}abbr:where([title]):where(.pr-twp,.pr-twp *){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1:where(.pr-twp,.pr-twp *),h2:where(.pr-twp,.pr-twp *),h3:where(.pr-twp,.pr-twp *),h4:where(.pr-twp,.pr-twp *),h5:where(.pr-twp,.pr-twp *),h6:where(.pr-twp,.pr-twp *){font-size:inherit;font-weight:inherit}a:where(.pr-twp,.pr-twp *){color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b:where(.pr-twp,.pr-twp *),strong:where(.pr-twp,.pr-twp *){font-weight:bolder}code:where(.pr-twp,.pr-twp *),kbd:where(.pr-twp,.pr-twp *),samp:where(.pr-twp,.pr-twp *),pre:where(.pr-twp,.pr-twp *){font-family:var(--tw-default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--tw-default-mono-font-feature-settings,normal);font-variation-settings:var(--tw-default-mono-font-variation-settings,normal);font-size:1em}small:where(.pr-twp,.pr-twp *){font-size:80%}sub:where(.pr-twp,.pr-twp *),sup:where(.pr-twp,.pr-twp *){vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub:where(.pr-twp,.pr-twp *){bottom:-.25em}sup:where(.pr-twp,.pr-twp *){top:-.5em}table:where(.pr-twp,.pr-twp *){text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(.pr-twp,.pr-twp *){outline:auto}progress:where(.pr-twp,.pr-twp *){vertical-align:baseline}summary:where(.pr-twp,.pr-twp *){display:list-item}ol:where(.pr-twp,.pr-twp *),ul:where(.pr-twp,.pr-twp *),menu:where(.pr-twp,.pr-twp *){list-style:none}img:where(.pr-twp,.pr-twp *),svg:where(.pr-twp,.pr-twp *),video:where(.pr-twp,.pr-twp *),canvas:where(.pr-twp,.pr-twp *),audio:where(.pr-twp,.pr-twp *),iframe:where(.pr-twp,.pr-twp *),embed:where(.pr-twp,.pr-twp *),object:where(.pr-twp,.pr-twp *){vertical-align:middle;display:block}img:where(.pr-twp,.pr-twp *),video:where(.pr-twp,.pr-twp *){max-width:100%;height:auto}button:where(.pr-twp,.pr-twp *),input:where(.pr-twp,.pr-twp *),select:where(.pr-twp,.pr-twp *),optgroup:where(.pr-twp,.pr-twp *),textarea:where(.pr-twp,.pr-twp *){font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(.pr-twp,.pr-twp *) ::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup:where(.pr-twp,.pr-twp *){font-weight:bolder}:where(select:is([multiple],[size])) optgroup option:where(.pr-twp,.pr-twp *){padding-inline-start:20px}:where(.pr-twp,.pr-twp *) ::file-selector-button{margin-inline-end:4px}:where(.pr-twp,.pr-twp *) ::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){:where(.pr-twp,.pr-twp *) ::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){:where(.pr-twp,.pr-twp *) ::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea:where(.pr-twp,.pr-twp *){resize:vertical}:where(.pr-twp,.pr-twp *) ::-webkit-search-decoration{-webkit-appearance:none}:where(.pr-twp,.pr-twp *) ::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit{display:inline-flex}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-fields-wrapper{padding:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-year-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-month-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-day-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-hour-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-minute-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-second-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-millisecond-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-meridiem-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid:where(.pr-twp,.pr-twp *){box-shadow:none}button:where(.pr-twp,.pr-twp *),input:where([type=button],[type=reset],[type=submit]):where(.pr-twp,.pr-twp *){appearance:button}:where(.pr-twp,.pr-twp *) ::file-selector-button{appearance:button}:where(.pr-twp,.pr-twp *) ::-webkit-inner-spin-button{height:auto}:where(.pr-twp,.pr-twp *) ::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])):where(.pr-twp,.pr-twp *){display:none!important}}@layer components;@layer utilities{.tw\\:\\@container\\/card-header{container:card-header/inline-size}.tw\\:\\@container\\/search{container:search/inline-size}.tw\\:\\@container\\/toolbar{container:toolbar/inline-size}.tw\\:pointer-events-auto{pointer-events:auto}.tw\\:pointer-events-none{pointer-events:none}.tw\\:invisible{visibility:hidden}.tw\\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.tw\\:absolute{position:absolute}.tw\\:fixed{position:fixed}.tw\\:relative{position:relative}.tw\\:sticky{position:sticky}.tw\\:inset-0{inset:calc(calc(var(--spacing)) * 0)}.tw\\:inset-y-0{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:inset-s-3{inset-inline-start:calc(calc(var(--spacing)) * 3)}.tw\\:start-1\\.5{inset-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:start-1\\/2{inset-inline-start:50%}.tw\\:end-0{inset-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:end-1{inset-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:end-2{inset-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:end-3{inset-inline-end:calc(calc(var(--spacing)) * 3)}.tw\\:inset-e-0{inset-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:-top-\\[1px\\]{top:-1px}.tw\\:top-0{top:calc(calc(var(--spacing)) * 0)}.tw\\:top-1{top:calc(calc(var(--spacing)) * 1)}.tw\\:top-1\\.5{top:calc(calc(var(--spacing)) * 1.5)}.tw\\:top-1\\/2{top:50%}.tw\\:top-1\\/3{top:33.3333%}.tw\\:top-2{top:calc(calc(var(--spacing)) * 2)}.tw\\:top-2\\.5{top:calc(calc(var(--spacing)) * 2.5)}.tw\\:top-3\\.5{top:calc(calc(var(--spacing)) * 3.5)}.tw\\:top-\\[-1px\\]{top:-1px}.tw\\:top-full{top:100%}.tw\\:-right-1{right:calc(calc(var(--spacing)) * -1)}.tw\\:right-0{right:calc(calc(var(--spacing)) * 0)}.tw\\:right-1{right:calc(calc(var(--spacing)) * 1)}.tw\\:right-3{right:calc(calc(var(--spacing)) * 3)}.tw\\:bottom-0{bottom:calc(calc(var(--spacing)) * 0)}.tw\\:-left-\\[1px\\]{left:-1px}.tw\\:left-0{left:calc(calc(var(--spacing)) * 0)}.tw\\:left-1\\/2{left:50%}.tw\\:left-2{left:calc(calc(var(--spacing)) * 2)}.tw\\:left-3{left:calc(calc(var(--spacing)) * 3)}.tw\\:isolate{isolation:isolate}.tw\\:z-10{z-index:10}.tw\\:z-20{z-index:20}.tw\\:z-50{z-index:50}.tw\\:order-first{order:-9999}.tw\\:order-last{order:9999}.tw\\:col-span-1{grid-column:span 1/span 1}.tw\\:col-span-2{grid-column:span 2/span 2}.tw\\:col-span-3{grid-column:span 3/span 3}.tw\\:col-start-1{grid-column-start:1}.tw\\:col-start-2{grid-column-start:2}.tw\\:row-span-2{grid-row:span 2/span 2}.tw\\:row-start-1{grid-row-start:1}.tw\\:row-start-2{grid-row-start:2}.tw\\:m-0{margin:calc(calc(var(--spacing)) * 0)}.tw\\:m-1{margin:calc(calc(var(--spacing)) * 1)}.tw\\:m-2{margin:calc(calc(var(--spacing)) * 2)}.tw\\:-mx-1{margin-inline:calc(calc(var(--spacing)) * -1)}.tw\\:-mx-4{margin-inline:calc(calc(var(--spacing)) * -4)}.tw\\:mx-0{margin-inline:calc(calc(var(--spacing)) * 0)}.tw\\:mx-1{margin-inline:calc(calc(var(--spacing)) * 1)}.tw\\:mx-2{margin-inline:calc(calc(var(--spacing)) * 2)}.tw\\:mx-3\\.5{margin-inline:calc(calc(var(--spacing)) * 3.5)}.tw\\:mx-4{margin-inline:calc(calc(var(--spacing)) * 4)}.tw\\:mx-8{margin-inline:calc(calc(var(--spacing)) * 8)}.tw\\:my-1{margin-block:calc(calc(var(--spacing)) * 1)}.tw\\:my-2\\.5{margin-block:calc(calc(var(--spacing)) * 2.5)}.tw\\:my-4{margin-block:calc(calc(var(--spacing)) * 4)}.tw\\:my-auto{margin-block:auto}.tw\\:ms-1{margin-inline-start:calc(calc(var(--spacing)) * 1)}.tw\\:ms-2{margin-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:ms-5{margin-inline-start:calc(calc(var(--spacing)) * 5)}.tw\\:ms-6{margin-inline-start:calc(calc(var(--spacing)) * 6)}.tw\\:ms-auto{margin-inline-start:auto}.tw\\:me-1{margin-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:me-2{margin-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:prose{color:var(--tw-prose-body);max-width:65ch}.tw\\:prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.tw\\:prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);margin-top:1.2em;margin-bottom:1.2em;font-size:1.25em;line-height:1.6}.tw\\:prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.tw\\:prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.tw\\:prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:decimal}.tw\\:prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.tw\\:prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.tw\\:prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.tw\\:prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.tw\\:prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.tw\\:prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.tw\\:prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.tw\\:prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.tw\\:prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.tw\\:prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:disc}.tw\\:prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.tw\\:prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.tw\\:prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.25em;font-weight:600}.tw\\:prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.tw\\:prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;font-style:italic;font-weight:500}.tw\\:prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.tw\\:prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.tw\\:prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:0;margin-bottom:.888889em;font-size:2.25em;font-weight:800;line-height:1.11111}.tw\\:prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.tw\\:prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:2em;margin-bottom:1em;font-size:1.5em;font-weight:700;line-height:1.33333}.tw\\:prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.tw\\:prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.6em;margin-bottom:.6em;font-size:1.25em;font-weight:600;line-height:1.6}.tw\\:prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.tw\\:prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.5}.tw\\:prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.tw\\:prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em;display:block}.tw\\:prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-kbd);box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%), 0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%);padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;border-radius:.3125rem;padding-inline-start:.375em;font-family:inherit;font-size:.875em;font-weight:500}.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"\`"}.tw\\:prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.tw\\:prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.tw\\:prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);padding-top:.857143em;padding-inline-end:1.14286em;padding-bottom:.857143em;border-radius:.375rem;margin-top:1.71429em;margin-bottom:1.71429em;padding-inline-start:1.14286em;font-size:.875em;font-weight:400;line-height:1.71429;overflow-x:auto}.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit;background-color:#0000;border-width:0;border-radius:0;padding:0}.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.tw\\:prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){table-layout:auto;width:100%;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.71429}.tw\\:prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.tw\\:prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);vertical-align:bottom;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em;font-weight:600}.tw\\:prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.tw\\:prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.tw\\:prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.tw\\:prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.tw\\:prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.tw\\:prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.tw\\:prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);margin-top:.857143em;font-size:.875em;line-height:1.42857}.tw\\:prose{--tw-prose-body:var(--foreground);--tw-prose-headings:var(--foreground);--tw-prose-lead:var(--muted-foreground);--tw-prose-links:var(--primary);--tw-prose-bold:var(--foreground);--tw-prose-counters:var(--muted-foreground);--tw-prose-bullets:var(--muted-foreground);--tw-prose-hr:var(--border);--tw-prose-quotes:var(--foreground);--tw-prose-quote-borders:var(--border);--tw-prose-captions:var(--muted-foreground);--tw-prose-kbd:oklch(21% .034 264.665);--tw-prose-kbd-shadows:NaN NaN NaN;--tw-prose-code:var(--foreground);--tw-prose-pre-code:var(--muted-foreground);--tw-prose-pre-bg:var(--muted);--tw-prose-th-borders:var(--border);--tw-prose-td-borders:var(--border);--tw-prose-invert-body:var(--foreground);--tw-prose-invert-headings:var(--foreground);--tw-prose-invert-lead:var(--muted-foreground);--tw-prose-invert-links:var(--primary);--tw-prose-invert-bold:var(--foreground);--tw-prose-invert-counters:var(--muted-foreground);--tw-prose-invert-bullets:var(--muted-foreground);--tw-prose-invert-hr:var(--border);--tw-prose-invert-quotes:var(--foreground);--tw-prose-invert-quote-borders:var(--border);--tw-prose-invert-captions:var(--muted-foreground);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:var(--foreground);--tw-prose-invert-pre-code:var(--muted-foreground);--tw-prose-invert-pre-bg:var(--muted);--tw-prose-invert-th-borders:var(--border);--tw-prose-invert-td-borders:var(--border);font-size:1rem;line-height:1.75}.tw\\:prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.tw\\:prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.tw\\:prose :where(.tw\\:prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.tw\\:prose :where(.tw\\:prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.tw\\:prose :where(.tw\\:prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.tw\\:prose :where(.tw\\:prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.tw\\:prose :where(.tw\\:prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.tw\\:prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.tw\\:prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.tw\\:prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.tw\\:prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.571429em;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em}.tw\\:prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(.tw\\:prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose :where(.tw\\:prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.tw\\:prose-sm{font-size:.875rem;line-height:1.71429}.tw\\:prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.tw\\:prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.888889em;margin-bottom:.888889em;font-size:1.28571em;line-height:1.55556}.tw\\:prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.33333em;margin-bottom:1.33333em;padding-inline-start:1.11111em}.tw\\:prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:.8em;font-size:2.14286em;line-height:1.2}.tw\\:prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6em;margin-bottom:.8em;font-size:1.42857em;line-height:1.4}.tw\\:prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.55556em;margin-bottom:.444444em;font-size:1.28571em;line-height:1.55556}.tw\\:prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.42857em;margin-bottom:.571429em;line-height:1.42857}.tw\\:prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.142857em;padding-inline-end:.357143em;padding-bottom:.142857em;border-radius:.3125rem;padding-inline-start:.357143em;font-size:.857143em}.tw\\:prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em}.tw\\:prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.tw\\:prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.888889em}.tw\\:prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;border-radius:.25rem;margin-top:1.66667em;margin-bottom:1.66667em;padding-inline-start:1em;font-size:.857143em;line-height:1.66667}.tw\\:prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em;padding-inline-start:1.57143em}.tw\\:prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;margin-bottom:.285714em}.tw\\:prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.428571em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.tw\\:prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.tw\\:prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.tw\\:prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;padding-inline-start:1.57143em}.tw\\:prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.85714em;margin-bottom:2.85714em}.tw\\:prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em;line-height:1.5}.tw\\:prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.tw\\:prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.tw\\:prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.666667em;font-size:.857143em;line-height:1.33333}.tw\\:prose-sm :where(.tw\\:prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose-sm :where(.tw\\:prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.tw\\:-mt-4{margin-top:calc(calc(var(--spacing)) * -4)}.tw\\:mt-0\\.5{margin-top:calc(calc(var(--spacing)) * .5)}.tw\\:mt-1{margin-top:calc(calc(var(--spacing)) * 1)}.tw\\:mt-2{margin-top:calc(calc(var(--spacing)) * 2)}.tw\\:mt-3{margin-top:calc(calc(var(--spacing)) * 3)}.tw\\:mt-4{margin-top:calc(calc(var(--spacing)) * 4)}.tw\\:mt-6{margin-top:calc(calc(var(--spacing)) * 6)}.tw\\:mt-auto{margin-top:auto}.tw\\:mr-1{margin-right:calc(calc(var(--spacing)) * 1)}.tw\\:mr-2{margin-right:calc(calc(var(--spacing)) * 2)}.tw\\:mr-3{margin-right:calc(calc(var(--spacing)) * 3)}.tw\\:-mb-4{margin-bottom:calc(calc(var(--spacing)) * -4)}.tw\\:mb-1{margin-bottom:calc(calc(var(--spacing)) * 1)}.tw\\:mb-2{margin-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:mb-3{margin-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:mb-4{margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:ml-1{margin-left:calc(calc(var(--spacing)) * 1)}.tw\\:ml-2{margin-left:calc(calc(var(--spacing)) * 2)}.tw\\:ml-4{margin-left:calc(calc(var(--spacing)) * 4)}.tw\\:ml-auto{margin-left:auto}.tw\\:box-border{box-sizing:border-box}.tw\\:line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.tw\\:no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.tw\\:no-scrollbar::-webkit-scrollbar{display:none}.tw\\:block{display:block}.tw\\:flex{display:flex}.tw\\:grid{display:grid}.tw\\:hidden{display:none}.tw\\:inline-block{display:inline-block}.tw\\:inline-flex{display:inline-flex}.tw\\:inline-grid{display:inline-grid}.tw\\:field-sizing-content{field-sizing:content}.tw\\:aspect-square{aspect-ratio:1}.tw\\:size-2{width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:size-2\\.5{width:calc(calc(var(--spacing)) * 2.5);height:calc(calc(var(--spacing)) * 2.5)}.tw\\:size-3{width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:size-3\\.5{width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:size-4{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:size-6{width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:size-7{width:calc(calc(var(--spacing)) * 7);height:calc(calc(var(--spacing)) * 7)}.tw\\:size-8{width:calc(calc(var(--spacing)) * 8);height:calc(calc(var(--spacing)) * 8)}.tw\\:size-9{width:calc(calc(var(--spacing)) * 9);height:calc(calc(var(--spacing)) * 9)}.tw\\:size-10{width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:size-full{width:100%;height:100%}.tw\\:h-1{height:calc(calc(var(--spacing)) * 1)}.tw\\:h-2{height:calc(calc(var(--spacing)) * 2)}.tw\\:h-3{height:calc(calc(var(--spacing)) * 3)}.tw\\:h-3\\.5{height:calc(calc(var(--spacing)) * 3.5)}.tw\\:h-4{height:calc(calc(var(--spacing)) * 4)}.tw\\:h-5{height:calc(calc(var(--spacing)) * 5)}.tw\\:h-6{height:calc(calc(var(--spacing)) * 6)}.tw\\:h-7{height:calc(calc(var(--spacing)) * 7)}.tw\\:h-8{height:calc(calc(var(--spacing)) * 8)}.tw\\:h-8\\!{height:calc(calc(var(--spacing)) * 8)!important}.tw\\:h-8\\.5{height:calc(calc(var(--spacing)) * 8.5)}.tw\\:h-9{height:calc(calc(var(--spacing)) * 9)}.tw\\:h-10{height:calc(calc(var(--spacing)) * 10)}.tw\\:h-12{height:calc(calc(var(--spacing)) * 12)}.tw\\:h-14{height:calc(calc(var(--spacing)) * 14)}.tw\\:h-20{height:calc(calc(var(--spacing)) * 20)}.tw\\:h-24{height:calc(calc(var(--spacing)) * 24)}.tw\\:h-32{height:calc(calc(var(--spacing)) * 32)}.tw\\:h-40{height:calc(calc(var(--spacing)) * 40)}.tw\\:h-64{height:calc(calc(var(--spacing)) * 64)}.tw\\:h-80{height:calc(calc(var(--spacing)) * 80)}.tw\\:h-96{height:calc(calc(var(--spacing)) * 96)}.tw\\:h-\\[5px\\]{height:5px}.tw\\:h-\\[260px\\]{height:260px}.tw\\:h-\\[300px\\]{height:300px}.tw\\:h-\\[400px\\]{height:400px}.tw\\:h-\\[600px\\]{height:600px}.tw\\:h-\\[calc\\(100\\%-1px\\)\\]{height:calc(100% - 1px)}.tw\\:h-\\[calc\\(100\\%-2px\\)\\]{height:calc(100% - 2px)}.tw\\:h-auto{height:auto}.tw\\:h-full{height:100%}.tw\\:h-px{height:1px}.tw\\:h-screen{height:100vh}.tw\\:h-svh{height:100svh}.tw\\:max-h-\\(--radix-context-menu-content-available-height\\){max-height:var(--radix-context-menu-content-available-height)}.tw\\:max-h-\\(--radix-dropdown-menu-content-available-height\\){max-height:var(--radix-dropdown-menu-content-available-height)}.tw\\:max-h-\\(--radix-popover-content-available-height\\){max-height:var(--radix-popover-content-available-height)}.tw\\:max-h-\\(--radix-select-content-available-height\\){max-height:var(--radix-select-content-available-height)}.tw\\:max-h-5{max-height:calc(calc(var(--spacing)) * 5)}.tw\\:max-h-10{max-height:calc(calc(var(--spacing)) * 10)}.tw\\:max-h-72{max-height:calc(calc(var(--spacing)) * 72)}.tw\\:max-h-80{max-height:calc(calc(var(--spacing)) * 80)}.tw\\:max-h-\\[96\\%\\]{max-height:96%}.tw\\:max-h-\\[300px\\]{max-height:300px}.tw\\:min-h-0{min-height:calc(calc(var(--spacing)) * 0)}.tw\\:min-h-11{min-height:calc(calc(var(--spacing)) * 11)}.tw\\:min-h-16{min-height:calc(calc(var(--spacing)) * 16)}.tw\\:min-h-\\[200px\\]{min-height:200px}.tw\\:min-h-full{min-height:100%}.tw\\:min-h-svh{min-height:100svh}.tw\\:w-\\(--radix-dropdown-menu-trigger-width\\){width:var(--radix-dropdown-menu-trigger-width)}.tw\\:w-\\(--sidebar-width\\){width:var(--sidebar-width)}.tw\\:w-1{width:calc(calc(var(--spacing)) * 1)}.tw\\:w-1\\/2{width:50%}.tw\\:w-1\\/4{width:25%}.tw\\:w-1\\/6{width:16.6667%}.tw\\:w-2{width:calc(calc(var(--spacing)) * 2)}.tw\\:w-3{width:calc(calc(var(--spacing)) * 3)}.tw\\:w-3\\.5{width:calc(calc(var(--spacing)) * 3.5)}.tw\\:w-3\\/4{width:75%}.tw\\:w-4{width:calc(calc(var(--spacing)) * 4)}.tw\\:w-4\\/5{width:80%}.tw\\:w-4\\/6{width:66.6667%}.tw\\:w-5{width:calc(calc(var(--spacing)) * 5)}.tw\\:w-5\\/6{width:83.3333%}.tw\\:w-6{width:calc(calc(var(--spacing)) * 6)}.tw\\:w-7{width:calc(calc(var(--spacing)) * 7)}.tw\\:w-8{width:calc(calc(var(--spacing)) * 8)}.tw\\:w-9{width:calc(calc(var(--spacing)) * 9)}.tw\\:w-9\\/12{width:75%}.tw\\:w-10{width:calc(calc(var(--spacing)) * 10)}.tw\\:w-12{width:calc(calc(var(--spacing)) * 12)}.tw\\:w-14{width:calc(calc(var(--spacing)) * 14)}.tw\\:w-20{width:calc(calc(var(--spacing)) * 20)}.tw\\:w-24{width:calc(calc(var(--spacing)) * 24)}.tw\\:w-32{width:calc(calc(var(--spacing)) * 32)}.tw\\:w-48{width:calc(calc(var(--spacing)) * 48)}.tw\\:w-56{width:calc(calc(var(--spacing)) * 56)}.tw\\:w-60{width:calc(calc(var(--spacing)) * 60)}.tw\\:w-64{width:calc(calc(var(--spacing)) * 64)}.tw\\:w-72{width:calc(calc(var(--spacing)) * 72)}.tw\\:w-80{width:calc(calc(var(--spacing)) * 80)}.tw\\:w-96{width:calc(calc(var(--spacing)) * 96)}.tw\\:w-\\[1px\\]{width:1px}.tw\\:w-\\[5px\\]{width:5px}.tw\\:w-\\[70px\\]{width:70px}.tw\\:w-\\[100px\\]{width:100px}.tw\\:w-\\[116px\\]{width:116px}.tw\\:w-\\[124px\\]{width:124px}.tw\\:w-\\[150px\\]{width:150px}.tw\\:w-\\[180px\\]{width:180px}.tw\\:w-\\[200px\\]{width:200px}.tw\\:w-\\[250px\\]{width:250px}.tw\\:w-\\[260px\\]{width:260px}.tw\\:w-\\[280px\\]{width:280px}.tw\\:w-\\[300px\\]{width:300px}.tw\\:w-\\[320px\\]{width:320px}.tw\\:w-\\[350px\\]{width:350px}.tw\\:w-\\[400px\\]{width:400px}.tw\\:w-\\[420px\\]{width:420px}.tw\\:w-\\[500px\\]{width:500px}.tw\\:w-\\[560px\\]{width:560px}.tw\\:w-\\[600px\\]{width:600px}.tw\\:w-\\[calc\\(100\\%-2px\\)\\]{width:calc(100% - 2px)}.tw\\:w-\\[var\\(--radix-dropdown-menu-trigger-width\\)\\]{width:var(--radix-dropdown-menu-trigger-width)}.tw\\:w-auto{width:auto}.tw\\:w-fit{width:fit-content}.tw\\:w-full{width:100%}.tw\\:w-max{width:max-content}.tw\\:w-px{width:1px}.tw\\:max-w-\\(--skeleton-width\\){max-width:var(--skeleton-width)}.tw\\:max-w-0{max-width:calc(calc(var(--spacing)) * 0)}.tw\\:max-w-2xl{max-width:var(--tw-container-2xl)}.tw\\:max-w-3xl{max-width:var(--tw-container-3xl)}.tw\\:max-w-4xl{max-width:var(--tw-container-4xl)}.tw\\:max-w-5{max-width:calc(calc(var(--spacing)) * 5)}.tw\\:max-w-6xl{max-width:var(--tw-container-6xl)}.tw\\:max-w-40{max-width:calc(calc(var(--spacing)) * 40)}.tw\\:max-w-48{max-width:calc(calc(var(--spacing)) * 48)}.tw\\:max-w-64{max-width:calc(calc(var(--spacing)) * 64)}.tw\\:max-w-96{max-width:calc(calc(var(--spacing)) * 96)}.tw\\:max-w-\\[200px\\]{max-width:200px}.tw\\:max-w-\\[220px\\]{max-width:220px}.tw\\:max-w-\\[calc\\(100\\%-2rem\\)\\]{max-width:calc(100% - 2rem)}.tw\\:max-w-\\[calc\\(100vw-2rem\\)\\]{max-width:calc(100vw - 2rem)}.tw\\:max-w-fit{max-width:fit-content}.tw\\:max-w-full{max-width:100%}.tw\\:max-w-lg{max-width:var(--tw-container-lg)}.tw\\:max-w-md{max-width:var(--tw-container-md)}.tw\\:max-w-none{max-width:none}.tw\\:max-w-sm{max-width:var(--tw-container-sm)}.tw\\:max-w-xs{max-width:var(--tw-container-xs)}.tw\\:min-w-0{min-width:calc(calc(var(--spacing)) * 0)}.tw\\:min-w-4{min-width:calc(calc(var(--spacing)) * 4)}.tw\\:min-w-5{min-width:calc(calc(var(--spacing)) * 5)}.tw\\:min-w-7{min-width:calc(calc(var(--spacing)) * 7)}.tw\\:min-w-8{min-width:calc(calc(var(--spacing)) * 8)}.tw\\:min-w-9{min-width:calc(calc(var(--spacing)) * 9)}.tw\\:min-w-16{min-width:calc(calc(var(--spacing)) * 16)}.tw\\:min-w-32{min-width:calc(calc(var(--spacing)) * 32)}.tw\\:min-w-36{min-width:calc(calc(var(--spacing)) * 36)}.tw\\:min-w-80{min-width:calc(calc(var(--spacing)) * 80)}.tw\\:min-w-\\[12rem\\]{min-width:12rem}.tw\\:min-w-\\[26px\\]{min-width:26px}.tw\\:min-w-\\[96px\\]{min-width:96px}.tw\\:min-w-\\[140px\\]{min-width:140px}.tw\\:min-w-\\[215px\\]{min-width:215px}.tw\\:min-w-\\[500px\\]{min-width:500px}.tw\\:min-w-min{min-width:min-content}.tw\\:flex-1{flex:1}.tw\\:shrink{flex-shrink:1}.tw\\:shrink\\!{flex-shrink:1!important}.tw\\:shrink-0{flex-shrink:0}.tw\\:shrink-\\[9999\\]{flex-shrink:9999}.tw\\:flex-grow,.tw\\:grow,.tw\\:grow-\\[1\\]{flex-grow:1}.tw\\:grow-\\[10\\]{flex-grow:10}.tw\\:basis-0{flex-basis:calc(calc(var(--spacing)) * 0)}.tw\\:table-fixed{table-layout:fixed}.tw\\:caption-bottom{caption-side:bottom}.tw\\:border-collapse{border-collapse:collapse}.tw\\:origin-\\(--radix-context-menu-content-transform-origin\\){transform-origin:var(--radix-context-menu-content-transform-origin)}.tw\\:origin-\\(--radix-dropdown-menu-content-transform-origin\\){transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.tw\\:origin-\\(--radix-menubar-content-transform-origin\\){transform-origin:var(--radix-menubar-content-transform-origin)}.tw\\:origin-\\(--radix-popover-content-transform-origin\\){transform-origin:var(--radix-popover-content-transform-origin)}.tw\\:origin-\\(--radix-select-content-transform-origin\\){transform-origin:var(--radix-select-content-transform-origin)}.tw\\:origin-\\(--radix-tooltip-content-transform-origin\\){transform-origin:var(--radix-tooltip-content-transform-origin)}.tw\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-y-0{--tw-translate-y:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-y-px{--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rotate-45{rotate:45deg}.tw\\:rotate-180{rotate:180deg}.tw\\:transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.tw\\:animate-none\\!{animation:none!important}.tw\\:animate-pulse{animation:var(--tw-animate-pulse)}.tw\\:animate-spin{animation:var(--tw-animate-spin)}.tw\\:cursor-default{cursor:default}.tw\\:cursor-ew-resize{cursor:ew-resize}.tw\\:cursor-not-allowed{cursor:not-allowed}.tw\\:cursor-pointer{cursor:pointer}.tw\\:cursor-text{cursor:text}.tw\\:touch-none{touch-action:none}.tw\\:resize{resize:both}.tw\\:resize-none{resize:none}.tw\\:scroll-m-20{scroll-margin:calc(calc(var(--spacing)) * 20)}.tw\\:scroll-my-1{scroll-margin-block:calc(calc(var(--spacing)) * 1)}.tw\\:scroll-py-1{scroll-padding-block:calc(calc(var(--spacing)) * 1)}.tw\\:list-inside{list-style-position:inside}.tw\\:list-outside{list-style-position:outside}.tw\\:\\!list-\\[lower-alpha\\]{list-style-type:lower-alpha!important}.tw\\:\\!list-\\[lower-roman\\]{list-style-type:lower-roman!important}.tw\\:\\!list-\\[upper-alpha\\]{list-style-type:upper-alpha!important}.tw\\:\\!list-\\[upper-roman\\]{list-style-type:upper-roman!important}.tw\\:\\!list-decimal{list-style-type:decimal!important}.tw\\:\\!list-disc{list-style-type:disc!important}.tw\\:list-decimal{list-style-type:decimal}.tw\\:list-disc{list-style-type:disc}.tw\\:list-none{list-style-type:none}.tw\\:grid-flow-col{grid-auto-flow:column}.tw\\:grid-flow-row{grid-auto-flow:row}.tw\\:auto-rows-min{grid-auto-rows:min-content}.tw\\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.tw\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.tw\\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.tw\\:grid-cols-\\[25\\%_25\\%_50\\%\\]{grid-template-columns:25% 25% 50%}.tw\\:grid-cols-\\[25\\%_50\\%_25\\%\\]{grid-template-columns:25% 50% 25%}.tw\\:grid-cols-\\[auto_auto_auto_auto\\]{grid-template-columns:auto auto auto auto}.tw\\:grid-cols-\\[min-content_1fr\\]{grid-template-columns:min-content 1fr}.tw\\:grid-cols-\\[min-content_min-content_1fr\\]{grid-template-columns:min-content min-content 1fr}.tw\\:grid-cols-subgrid{grid-template-columns:subgrid}.tw\\:flex-col{flex-direction:column}.tw\\:flex-col-reverse{flex-direction:column-reverse}.tw\\:flex-row{flex-direction:row}.tw\\:flex-row-reverse{flex-direction:row-reverse}.tw\\:flex-nowrap{flex-wrap:nowrap}.tw\\:flex-wrap{flex-wrap:wrap}.tw\\:place-content-center{place-content:center}.tw\\:content-center{align-content:center}.tw\\:items-baseline{align-items:baseline}.tw\\:items-center{align-items:center}.tw\\:items-end{align-items:flex-end}.tw\\:items-start{align-items:flex-start}.tw\\:items-stretch{align-items:stretch}.tw\\:justify-between{justify-content:space-between}.tw\\:justify-center{justify-content:center}.tw\\:justify-end{justify-content:flex-end}.tw\\:justify-start{justify-content:flex-start}.tw\\:gap-0{gap:calc(calc(var(--spacing)) * 0)}.tw\\:gap-0\\.5{gap:calc(calc(var(--spacing)) * .5)}.tw\\:gap-1{gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-1\\.5{gap:calc(calc(var(--spacing)) * 1.5)}.tw\\:gap-1\\.5\\!{gap:calc(calc(var(--spacing)) * 1.5)!important}.tw\\:gap-2{gap:calc(calc(var(--spacing)) * 2)}.tw\\:gap-2\\.5{gap:calc(calc(var(--spacing)) * 2.5)}.tw\\:gap-3{gap:calc(calc(var(--spacing)) * 3)}.tw\\:gap-4{gap:calc(calc(var(--spacing)) * 4)}.tw\\:gap-5{gap:calc(calc(var(--spacing)) * 5)}.tw\\:gap-6{gap:calc(calc(var(--spacing)) * 6)}.tw\\:gap-8{gap:calc(calc(var(--spacing)) * 8)}.tw\\:gap-16{gap:calc(calc(var(--spacing)) * 16)}.tw\\:gap-\\[--spacing\\(var\\(--gap\\)\\)\\]{gap:calc(calc(var(--spacing)) * var(--gap))}.tw\\:gap-\\[12px\\]{gap:12px}:where(.tw\\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-1\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 8) * calc(1 - var(--tw-space-y-reverse)))}.tw\\:gap-x-1{column-gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-x-2{column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:gap-x-3{column-gap:calc(calc(var(--spacing)) * 3)}.tw\\:gap-x-4{column-gap:calc(calc(var(--spacing)) * 4)}:where(.tw\\:-space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * -2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * -2) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 3) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 3) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 4) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 6) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 6) * calc(1 - var(--tw-space-x-reverse)))}.tw\\:gap-y-1{row-gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-y-2{row-gap:calc(calc(var(--spacing)) * 2)}:where(.tw\\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.tw\\:divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}.tw\\:self-start{align-self:flex-start}.tw\\:self-stretch{align-self:stretch}.tw\\:justify-self-end{justify-self:flex-end}.tw\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tw\\:overflow-auto{overflow:auto}.tw\\:overflow-clip{overflow:clip}.tw\\:overflow-hidden{overflow:hidden}.tw\\:overflow-scroll{overflow:scroll}.tw\\:overflow-visible{overflow:visible}.tw\\:overflow-x-auto{overflow-x:auto}.tw\\:overflow-x-hidden{overflow-x:hidden}.tw\\:overflow-y-auto{overflow-y:auto}.tw\\:overflow-y-hidden{overflow-y:hidden}.tw\\:rounded{border-radius:.25rem}.tw\\:rounded-2xl{border-radius:calc(var(--radius) * 1.8)}.tw\\:rounded-4xl{border-radius:calc(var(--radius) * 2.6)}.tw\\:rounded-\\[4px\\]{border-radius:4px}.tw\\:rounded-\\[6px\\]{border-radius:6px}.tw\\:rounded-\\[calc\\(var\\(--radius\\)-3px\\)\\]{border-radius:calc(var(--radius) - 3px)}.tw\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,10px\\)\\]{border-radius:min(var(--tw-radius-md), 10px)}.tw\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,12px\\)\\]{border-radius:min(var(--tw-radius-md), 12px)}.tw\\:rounded-full{border-radius:3.40282e38px}.tw\\:rounded-lg{border-radius:var(--radius)}.tw\\:rounded-lg\\!{border-radius:var(--radius)!important}.tw\\:rounded-md{border-radius:calc(var(--radius) * .8)}.tw\\:rounded-none{border-radius:0}.tw\\:rounded-sm{border-radius:calc(var(--radius) * .6)}.tw\\:rounded-xl{border-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-xl\\!{border-radius:calc(var(--radius) * 1.4)!important}.tw\\:rounded-xs{border-radius:var(--tw-radius-xs)}.tw\\:rounded-s-none{border-start-start-radius:0;border-end-start-radius:0}.tw\\:rounded-e-none{border-start-end-radius:0;border-end-end-radius:0}.tw\\:rounded-t-xl{border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-l-lg{border-top-left-radius:var(--radius);border-bottom-left-radius:var(--radius)}.tw\\:rounded-r-xl{border-top-right-radius:calc(var(--radius) * 1.4);border-bottom-right-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-b-xl{border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:border{border-style:var(--tw-border-style);border-width:1px}.tw\\:border-0{border-style:var(--tw-border-style);border-width:0}.tw\\:border-2{border-style:var(--tw-border-style);border-width:2px}.tw\\:border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:border-s-0{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:border-s-2{border-inline-start-style:var(--tw-border-style);border-inline-start-width:2px}.tw\\:border-s-4{border-inline-start-style:var(--tw-border-style);border-inline-start-width:4px}.tw\\:border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.tw\\:border-e-0{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.tw\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.tw\\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.tw\\:border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.tw\\:border-dashed{--tw-border-style:dashed;border-style:dashed}.tw\\:border-none{--tw-border-style:none;border-style:none}.tw\\:border-solid{--tw-border-style:solid;border-style:solid}.tw\\:border-black{border-color:var(--tw-color-black)}.tw\\:border-blue-400{border-color:var(--tw-color-blue-400)}.tw\\:border-blue-500{border-color:var(--tw-color-blue-500)}.tw\\:border-border,.tw\\:border-border\\/50{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-border\\/50{border-color:color-mix(in oklab, var(--border) 50%, transparent)}}.tw\\:border-destructive{border-color:var(--destructive)}.tw\\:border-foreground{border-color:var(--foreground)}.tw\\:border-gray-300{border-color:var(--tw-color-gray-300)}.tw\\:border-input,.tw\\:border-input\\/30{border-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-input\\/30{border-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:border-muted-foreground,.tw\\:border-muted-foreground\\/40{border-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-muted-foreground\\/40{border-color:color-mix(in oklab, var(--muted-foreground) 40%, transparent)}}.tw\\:border-primary{border-color:var(--primary)}.tw\\:border-red-300{border-color:var(--tw-color-red-300)}.tw\\:border-red-400{border-color:var(--tw-color-red-400)}.tw\\:border-red-500{border-color:var(--tw-color-red-500)}.tw\\:border-red-600{border-color:var(--tw-color-red-600)}.tw\\:border-ring{border-color:var(--ring)}.tw\\:border-sidebar-border{border-color:var(--sidebar-border)}.tw\\:border-slate-300{border-color:var(--tw-color-slate-300)}.tw\\:border-transparent{border-color:#0000}.tw\\:border-yellow-400{border-color:var(--tw-color-yellow-400)}.tw\\:border-yellow-500{border-color:var(--tw-color-yellow-500)}.tw\\:border-s-amber-200{border-inline-start-color:var(--tw-color-amber-200)}.tw\\:border-s-indigo-200{border-inline-start-color:var(--tw-color-indigo-200)}.tw\\:border-s-purple-200{border-inline-start-color:var(--tw-color-purple-200)}.tw\\:border-s-red-200{border-inline-start-color:var(--tw-color-red-200)}.tw\\:\\!bg-destructive\\/50{background-color:var(--destructive)!important}@supports (color:color-mix(in lab, red, red)){.tw\\:\\!bg-destructive\\/50{background-color:color-mix(in oklab, var(--destructive) 50%, transparent)!important}}.tw\\:bg-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{background-color:color-mix(in oklab,var(--destructive) 10%,var(--background))}}.tw\\:bg-accent,.tw\\:bg-accent\\/50{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-accent\\/50{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.tw\\:bg-amber-500,.tw\\:bg-amber-500\\/5{background-color:var(--tw-color-amber-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-amber-500\\/5{background-color:color-mix(in oklab, var(--tw-color-amber-500) 5%, transparent)}}.tw\\:bg-amber-500\\/15{background-color:var(--tw-color-amber-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-amber-500\\/15{background-color:color-mix(in oklab, var(--tw-color-amber-500) 15%, transparent)}}.tw\\:bg-background,.tw\\:bg-background\\/50{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-background\\/50{background-color:color-mix(in oklab, var(--background) 50%, transparent)}}.tw\\:bg-black\\/10{background-color:var(--tw-color-black)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-black\\/10{background-color:color-mix(in oklab, var(--tw-color-black) 10%, transparent)}}.tw\\:bg-blue-50{background-color:var(--tw-color-blue-50)}.tw\\:bg-blue-100{background-color:var(--tw-color-blue-100)}.tw\\:bg-blue-400{background-color:var(--tw-color-blue-400)}.tw\\:bg-blue-500{background-color:var(--tw-color-blue-500)}.tw\\:bg-border{background-color:var(--border)}.tw\\:bg-card{background-color:var(--card)}.tw\\:bg-destructive\\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-destructive\\/10{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.tw\\:bg-foreground{background-color:var(--foreground)}.tw\\:bg-gray-50{background-color:var(--tw-color-gray-50)}.tw\\:bg-gray-100{background-color:var(--tw-color-gray-100)}.tw\\:bg-gray-500{background-color:var(--tw-color-gray-500)}.tw\\:bg-green-50{background-color:var(--tw-color-green-50)}.tw\\:bg-green-100{background-color:var(--tw-color-green-100)}.tw\\:bg-green-500{background-color:var(--tw-color-green-500)}.tw\\:bg-input,.tw\\:bg-input\\/30{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-input\\/30{background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:bg-muted,.tw\\:bg-muted\\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-muted\\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:bg-neutral-300{background-color:var(--tw-color-neutral-300)}.tw\\:bg-orange-100{background-color:var(--tw-color-orange-100)}.tw\\:bg-popover,.tw\\:bg-popover\\/70{background-color:var(--popover)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-popover\\/70{background-color:color-mix(in oklab, var(--popover) 70%, transparent)}}.tw\\:bg-primary{background-color:var(--primary)}.tw\\:bg-primary-foreground{background-color:var(--primary-foreground)}.tw\\:bg-primary\\/30{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-primary\\/30{background-color:color-mix(in oklab, var(--primary) 30%, transparent)}}.tw\\:bg-purple-50{background-color:var(--tw-color-purple-50)}.tw\\:bg-red-100{background-color:var(--tw-color-red-100)}.tw\\:bg-red-500{background-color:var(--tw-color-red-500)}.tw\\:bg-rose-500,.tw\\:bg-rose-500\\/5{background-color:var(--tw-color-rose-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-rose-500\\/5{background-color:color-mix(in oklab, var(--tw-color-rose-500) 5%, transparent)}}.tw\\:bg-rose-500\\/15{background-color:var(--tw-color-rose-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-rose-500\\/15{background-color:color-mix(in oklab, var(--tw-color-rose-500) 15%, transparent)}}.tw\\:bg-secondary{background-color:var(--secondary)}.tw\\:bg-sidebar{background-color:var(--sidebar)}.tw\\:bg-sidebar-accent{background-color:var(--sidebar-accent)}.tw\\:bg-sidebar-border{background-color:var(--sidebar-border)}.tw\\:bg-sky-500,.tw\\:bg-sky-500\\/5{background-color:var(--tw-color-sky-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-sky-500\\/5{background-color:color-mix(in oklab, var(--tw-color-sky-500) 5%, transparent)}}.tw\\:bg-sky-500\\/15{background-color:var(--tw-color-sky-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-sky-500\\/15{background-color:color-mix(in oklab, var(--tw-color-sky-500) 15%, transparent)}}.tw\\:bg-teal-500,.tw\\:bg-teal-500\\/5{background-color:var(--tw-color-teal-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-teal-500\\/5{background-color:color-mix(in oklab, var(--tw-color-teal-500) 5%, transparent)}}.tw\\:bg-teal-500\\/15{background-color:var(--tw-color-teal-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-teal-500\\/15{background-color:color-mix(in oklab, var(--tw-color-teal-500) 15%, transparent)}}.tw\\:bg-transparent{background-color:#0000}.tw\\:bg-white{background-color:var(--tw-color-white)}.tw\\:bg-yellow-50{background-color:var(--tw-color-yellow-50)}.tw\\:bg-yellow-100{background-color:var(--tw-color-yellow-100)}.tw\\:bg-yellow-500{background-color:var(--tw-color-yellow-500)}.tw\\:bg-zinc-400{background-color:var(--tw-color-zinc-400)}.tw\\:bg-clip-padding{background-clip:padding-box}.tw\\:fill-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{fill:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:fill-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{fill:color-mix(in oklab,var(--destructive) 10%,var(--background))}}.tw\\:fill-destructive{fill:var(--destructive)}.tw\\:fill-foreground{fill:var(--foreground)}.tw\\:fill-yellow-400,.tw\\:fill-yellow-400\\/50{fill:var(--tw-color-yellow-400)}@supports (color:color-mix(in lab, red, red)){.tw\\:fill-yellow-400\\/50{fill:color-mix(in oklab, var(--tw-color-yellow-400) 50%, transparent)}}.tw\\:object-cover{object-fit:cover}.tw\\:\\!p-4{padding:calc(calc(var(--spacing)) * 4)!important}.tw\\:p-0{padding:calc(calc(var(--spacing)) * 0)}.tw\\:p-0\\.5{padding:calc(calc(var(--spacing)) * .5)}.tw\\:p-1{padding:calc(calc(var(--spacing)) * 1)}.tw\\:p-2{padding:calc(calc(var(--spacing)) * 2)}.tw\\:p-2\\.5{padding:calc(calc(var(--spacing)) * 2.5)}.tw\\:p-3{padding:calc(calc(var(--spacing)) * 3)}.tw\\:p-4{padding:calc(calc(var(--spacing)) * 4)}.tw\\:p-6{padding:calc(calc(var(--spacing)) * 6)}.tw\\:p-8{padding:calc(calc(var(--spacing)) * 8)}.tw\\:p-\\[1px\\]{padding:1px}.tw\\:p-\\[3px\\]{padding:3px}.tw\\:p-\\[10px\\]{padding:10px}.tw\\:p-\\[16px\\]{padding:16px}.tw\\:px-0{padding-inline:calc(calc(var(--spacing)) * 0)}.tw\\:px-0\\.5{padding-inline:calc(calc(var(--spacing)) * .5)}.tw\\:px-1{padding-inline:calc(calc(var(--spacing)) * 1)}.tw\\:px-1\\.5{padding-inline:calc(calc(var(--spacing)) * 1.5)}.tw\\:px-2{padding-inline:calc(calc(var(--spacing)) * 2)}.tw\\:px-2\\.5{padding-inline:calc(calc(var(--spacing)) * 2.5)}.tw\\:px-3{padding-inline:calc(calc(var(--spacing)) * 3)}.tw\\:px-4{padding-inline:calc(calc(var(--spacing)) * 4)}.tw\\:px-6{padding-inline:calc(calc(var(--spacing)) * 6)}.tw\\:py-0{padding-block:calc(calc(var(--spacing)) * 0)}.tw\\:py-0\\.5{padding-block:calc(calc(var(--spacing)) * .5)}.tw\\:py-1{padding-block:calc(calc(var(--spacing)) * 1)}.tw\\:py-1\\.5{padding-block:calc(calc(var(--spacing)) * 1.5)}.tw\\:py-2{padding-block:calc(calc(var(--spacing)) * 2)}.tw\\:py-3{padding-block:calc(calc(var(--spacing)) * 3)}.tw\\:py-4{padding-block:calc(calc(var(--spacing)) * 4)}.tw\\:py-6{padding-block:calc(calc(var(--spacing)) * 6)}.tw\\:py-8{padding-block:calc(calc(var(--spacing)) * 8)}.tw\\:py-\\[2px\\]{padding-block:2px}.tw\\:ps-1\\.5{padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:ps-2{padding-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:ps-2\\.5{padding-inline-start:calc(calc(var(--spacing)) * 2.5)}.tw\\:ps-4{padding-inline-start:calc(calc(var(--spacing)) * 4)}.tw\\:ps-6{padding-inline-start:calc(calc(var(--spacing)) * 6)}.tw\\:ps-7{padding-inline-start:calc(calc(var(--spacing)) * 7)}.tw\\:ps-8{padding-inline-start:calc(calc(var(--spacing)) * 8)}.tw\\:ps-9{padding-inline-start:calc(calc(var(--spacing)) * 9)}.tw\\:ps-12{padding-inline-start:calc(calc(var(--spacing)) * 12)}.tw\\:ps-\\[85px\\]{padding-inline-start:85px}.tw\\:pe-1{padding-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:pe-1\\.5{padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:pe-2{padding-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:pe-4{padding-inline-end:calc(calc(var(--spacing)) * 4)}.tw\\:pe-8{padding-inline-end:calc(calc(var(--spacing)) * 8)}.tw\\:pe-8\\!{padding-inline-end:calc(calc(var(--spacing)) * 8)!important}.tw\\:pe-9{padding-inline-end:calc(calc(var(--spacing)) * 9)}.tw\\:pe-\\[calc\\(138px\\+1rem\\)\\]{padding-inline-end:calc(138px + 1rem)}.tw\\:pe-\\[…\\]{padding-inline-end:…}.tw\\:pt-1{padding-top:calc(calc(var(--spacing)) * 1)}.tw\\:pt-2{padding-top:calc(calc(var(--spacing)) * 2)}.tw\\:pt-3{padding-top:calc(calc(var(--spacing)) * 3)}.tw\\:pt-4{padding-top:calc(calc(var(--spacing)) * 4)}.tw\\:pt-6{padding-top:calc(calc(var(--spacing)) * 6)}.tw\\:pr-0{padding-right:calc(calc(var(--spacing)) * 0)}.tw\\:pr-3{padding-right:calc(calc(var(--spacing)) * 3)}.tw\\:pr-4{padding-right:calc(calc(var(--spacing)) * 4)}.tw\\:pb-0{padding-bottom:calc(calc(var(--spacing)) * 0)}.tw\\:pb-1{padding-bottom:calc(calc(var(--spacing)) * 1)}.tw\\:pb-2{padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:pb-3{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:pb-4{padding-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:pb-8{padding-bottom:calc(calc(var(--spacing)) * 8)}.tw\\:pb-12{padding-bottom:calc(calc(var(--spacing)) * 12)}.tw\\:pb-16{padding-bottom:calc(calc(var(--spacing)) * 16)}.tw\\:pb-24{padding-bottom:calc(calc(var(--spacing)) * 24)}.tw\\:pl-2{padding-left:calc(calc(var(--spacing)) * 2)}.tw\\:pl-3{padding-left:calc(calc(var(--spacing)) * 3)}.tw\\:pl-4{padding-left:calc(calc(var(--spacing)) * 4)}.tw\\:pl-5{padding-left:calc(calc(var(--spacing)) * 5)}.tw\\:pl-6{padding-left:calc(calc(var(--spacing)) * 6)}.tw\\:pl-8{padding-left:calc(calc(var(--spacing)) * 8)}.tw\\:text-center{text-align:center}.tw\\:text-end{text-align:end}.tw\\:text-left{text-align:left}.tw\\:text-right{text-align:right}.tw\\:text-start{text-align:start}.tw\\:align-middle{vertical-align:middle}.tw\\:font-heading{font-family:var(--font-sans)}.tw\\:font-mono{font-family:var(--tw-font-mono)}.tw\\:font-sans{font-family:IBM Plex Sans Variable,sans-serif}.tw\\:text-2xl{font-size:var(--tw-text-2xl);line-height:var(--tw-leading,var(--tw-text-2xl--line-height))}.tw\\:text-3xl{font-size:var(--tw-text-3xl);line-height:var(--tw-leading,var(--tw-text-3xl--line-height))}.tw\\:text-4xl{font-size:var(--tw-text-4xl);line-height:var(--tw-leading,var(--tw-text-4xl--line-height))}.tw\\:text-base{font-size:var(--tw-text-base);line-height:var(--tw-leading,var(--tw-text-base--line-height))}.tw\\:text-lg{font-size:var(--tw-text-lg);line-height:var(--tw-leading,var(--tw-text-lg--line-height))}.tw\\:text-sm{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:text-sm\\/relaxed{font-size:var(--tw-text-sm);line-height:var(--tw-leading-relaxed)}.tw\\:text-xl{font-size:var(--tw-text-xl);line-height:var(--tw-leading,var(--tw-text-xl--line-height))}.tw\\:text-xs{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:text-\\[0\\.8rem\\]{font-size:.8rem}.tw\\:leading-6{--tw-leading:calc(calc(var(--spacing)) * 6);line-height:calc(calc(var(--spacing)) * 6)}.tw\\:leading-loose{--tw-leading:var(--tw-leading-loose);line-height:var(--tw-leading-loose)}.tw\\:leading-none{--tw-leading:1;line-height:1}.tw\\:leading-relaxed{--tw-leading:var(--tw-leading-relaxed);line-height:var(--tw-leading-relaxed)}.tw\\:leading-snug{--tw-leading:var(--tw-leading-snug);line-height:var(--tw-leading-snug)}.tw\\:leading-tight{--tw-leading:var(--tw-leading-tight);line-height:var(--tw-leading-tight)}.tw\\:font-bold{--tw-font-weight:var(--tw-font-weight-bold);font-weight:var(--tw-font-weight-bold)}.tw\\:font-extrabold{--tw-font-weight:var(--tw-font-weight-extrabold);font-weight:var(--tw-font-weight-extrabold)}.tw\\:font-medium{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:font-normal{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:font-semibold{--tw-font-weight:var(--tw-font-weight-semibold);font-weight:var(--tw-font-weight-semibold)}.tw\\:tracking-tight{--tw-tracking:var(--tw-tracking-tight);letter-spacing:var(--tw-tracking-tight)}.tw\\:tracking-wider{--tw-tracking:var(--tw-tracking-wider);letter-spacing:var(--tw-tracking-wider)}.tw\\:tracking-widest{--tw-tracking:var(--tw-tracking-widest);letter-spacing:var(--tw-tracking-widest)}.tw\\:text-balance{text-wrap:balance}.tw\\:text-nowrap{text-wrap:nowrap}.tw\\:break-words{overflow-wrap:break-word}.tw\\:text-clip{text-overflow:clip}.tw\\:text-ellipsis{text-overflow:ellipsis}.tw\\:whitespace-normal{white-space:normal}.tw\\:whitespace-nowrap{white-space:nowrap}.tw\\:whitespace-pre{white-space:pre}.tw\\:whitespace-pre-line{white-space:pre-line}.tw\\:whitespace-pre-wrap{white-space:pre-wrap}.tw\\:\\[color\\:blue\\]{color:#00f}.tw\\:text-accent-foreground{color:var(--accent-foreground)}.tw\\:text-amber-600{color:var(--tw-color-amber-600)}.tw\\:text-background{color:var(--background)}.tw\\:text-blue-400{color:var(--tw-color-blue-400)}.tw\\:text-blue-500{color:var(--tw-color-blue-500)}.tw\\:text-blue-600{color:var(--tw-color-blue-600)}.tw\\:text-blue-800{color:var(--tw-color-blue-800)}.tw\\:text-card-foreground{color:var(--card-foreground)}.tw\\:text-current{color:currentColor}.tw\\:text-destructive{color:var(--destructive)}.tw\\:text-foreground{color:var(--foreground)}.tw\\:text-foreground\\!{color:var(--foreground)!important}.tw\\:text-foreground\\/30{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/30{color:color-mix(in oklab, var(--foreground) 30%, transparent)}}.tw\\:text-foreground\\/50{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/50{color:color-mix(in oklab, var(--foreground) 50%, transparent)}}.tw\\:text-foreground\\/60{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/60{color:color-mix(in oklab, var(--foreground) 60%, transparent)}}.tw\\:text-foreground\\/70{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/70{color:color-mix(in oklab, var(--foreground) 70%, transparent)}}.tw\\:text-gray-300{color:var(--tw-color-gray-300)}.tw\\:text-gray-500{color:var(--tw-color-gray-500)}.tw\\:text-gray-600{color:var(--tw-color-gray-600)}.tw\\:text-gray-700{color:var(--tw-color-gray-700)}.tw\\:text-gray-800{color:var(--tw-color-gray-800)}.tw\\:text-green-600{color:var(--tw-color-green-600)}.tw\\:text-green-700{color:var(--tw-color-green-700)}.tw\\:text-green-800{color:var(--tw-color-green-800)}.tw\\:text-inherit{color:inherit}.tw\\:text-muted-foreground,.tw\\:text-muted-foreground\\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-muted-foreground\\/50{color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.tw\\:text-orange-800{color:var(--tw-color-orange-800)}.tw\\:text-popover-foreground{color:var(--popover-foreground)}.tw\\:text-primary{color:var(--primary)}.tw\\:text-primary-foreground{color:var(--primary-foreground)}.tw\\:text-purple-900{color:var(--tw-color-purple-900)}.tw\\:text-red-500{color:var(--tw-color-red-500)}.tw\\:text-red-600{color:var(--tw-color-red-600)}.tw\\:text-red-700{color:var(--tw-color-red-700)}.tw\\:text-red-800{color:var(--tw-color-red-800)}.tw\\:text-rose-600{color:var(--tw-color-rose-600)}.tw\\:text-secondary-foreground{color:var(--secondary-foreground)}.tw\\:text-sidebar-accent-foreground{color:var(--sidebar-accent-foreground)}.tw\\:text-sidebar-foreground,.tw\\:text-sidebar-foreground\\/70{color:var(--sidebar-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-sidebar-foreground\\/70{color:color-mix(in oklab, var(--sidebar-foreground) 70%, transparent)}}.tw\\:text-sky-600{color:var(--tw-color-sky-600)}.tw\\:text-slate-900{color:var(--tw-color-slate-900)}.tw\\:text-teal-600{color:var(--tw-color-teal-600)}.tw\\:text-white{color:var(--tw-color-white)}.tw\\:text-yellow-400{color:var(--tw-color-yellow-400)}.tw\\:text-yellow-600{color:var(--tw-color-yellow-600)}.tw\\:text-yellow-700{color:var(--tw-color-yellow-700)}.tw\\:capitalize{text-transform:capitalize}.tw\\:uppercase{text-transform:uppercase}.tw\\:italic{font-style:italic}.tw\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tw\\:line-through{text-decoration-line:line-through}.tw\\:underline{text-decoration-line:underline}.tw\\:decoration-destructive{-webkit-text-decoration-color:var(--destructive);-webkit-text-decoration-color:var(--destructive);text-decoration-color:var(--destructive)}.tw\\:underline-offset-4{text-underline-offset:4px}.tw\\:opacity-0{opacity:0}.tw\\:opacity-40{opacity:.4}.tw\\:opacity-50{opacity:.5}.tw\\:opacity-60{opacity:.6}.tw\\:opacity-100{opacity:1}.tw\\:bg-blend-color{background-blend-mode:color}.tw\\:shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-\\[0_0_0_1px_var\\(--sidebar-border\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-border));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-none\\!{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.tw\\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-background{--tw-ring-color:var(--background)}.tw\\:ring-foreground\\/10{--tw-ring-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:ring-foreground\\/10{--tw-ring-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}.tw\\:ring-primary{--tw-ring-color:var(--primary)}.tw\\:ring-ring\\/50{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:ring-ring\\/50{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:ring-sidebar-ring{--tw-ring-color:var(--sidebar-ring)}.tw\\:ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:ring-offset-background{--tw-ring-offset-color:var(--background)}.tw\\:ring-offset-white{--tw-ring-offset-color:var(--tw-color-white)}.tw\\:outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:outline-hidden{outline-offset:2px;outline:2px solid #0000}}.tw\\:drop-shadow-sm{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--tw-drop-shadow-sm));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.tw\\:transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[color\\,box-shadow\\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[left\\,right\\,width\\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[margin\\,opacity\\]{transition-property:margin,opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[width\\,height\\,padding\\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-none{transition-property:none}.tw\\:duration-100{--tw-duration:.1s;transition-duration:.1s}.tw\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.tw\\:ease-linear{--tw-ease:linear;transition-timing-function:linear}.tw\\:prose-quoteless :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose-quoteless :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.tw\\:outline-none{--tw-outline-style:none;outline-style:none}.tw\\:select-none{-webkit-user-select:none;user-select:none}.tw\\:\\[unicode-bidi\\:plaintext\\]{unicode-bidi:plaintext}.tw\\:group-focus-within\\/menu-item\\:opacity-100:is(:where(.tw\\:group\\/menu-item):focus-within *){opacity:1}@media (hover:hover){.tw\\:group-hover\\:visible:is(:where(.tw\\:group):hover *){visibility:visible}.tw\\:group-hover\\:hidden:is(:where(.tw\\:group):hover *){display:none}.tw\\:group-hover\\:opacity-100:is(:where(.tw\\:group):hover *),.tw\\:group-hover\\/menu-item\\:opacity-100:is(:where(.tw\\:group\\/menu-item):hover *){opacity:1}}.tw\\:group-focus\\/context-menu-item\\:text-accent-foreground:is(:where(.tw\\:group\\/context-menu-item):focus *),.tw\\:group-focus\\/dropdown-menu-item\\:text-accent-foreground:is(:where(.tw\\:group\\/dropdown-menu-item):focus *),.tw\\:group-focus\\/menubar-item\\:text-accent-foreground:is(:where(.tw\\:group\\/menubar-item):focus *){color:var(--accent-foreground)}.tw\\:group-has-disabled\\/field\\:opacity-50:is(:where(.tw\\:group\\/field):has(:disabled) *){opacity:.5}.tw\\:group-has-data-\\[sidebar\\=menu-action\\]\\/menu-item\\:pe-8:is(:where(.tw\\:group\\/menu-item):has([data-sidebar=menu-action]) *){padding-inline-end:calc(calc(var(--spacing)) * 8)}.tw\\:group-has-data-\\[size\\=lg\\]\\/avatar-group\\:size-10:is(:where(.tw\\:group\\/avatar-group):has([data-size=lg]) *){width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:group-has-data-\\[size\\=sm\\]\\/avatar-group\\:size-6:is(:where(.tw\\:group\\/avatar-group):has([data-size=sm]) *){width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:group-has-data-\\[slot\\=command-shortcut\\]\\/command-item\\:hidden:is(:where(.tw\\:group\\/command-item):has([data-slot=command-shortcut]) *){display:none}.tw\\:group-has-\\[\\>input\\]\\/input-group\\:pt-2:is(:where(.tw\\:group\\/input-group):has(>input) *){padding-top:calc(calc(var(--spacing)) * 2)}.tw\\:group-has-\\[\\>input\\]\\/input-group\\:pb-2:is(:where(.tw\\:group\\/input-group):has(>input) *){padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:group-has-\\[\\>svg\\]\\/alert\\:col-start-2:is(:where(.tw\\:group\\/alert):has(>svg) *){grid-column-start:2}.tw\\:group-data-\\[checked\\=true\\]\\/command-item\\:opacity-100:is(:where(.tw\\:group\\/command-item)[data-checked=true] *){opacity:1}.tw\\:group-data-\\[collapsible\\=icon\\]\\:-mt-8:is(:where(.tw\\:group)[data-collapsible=icon] *){margin-top:calc(calc(var(--spacing)) * -8)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:hidden:is(:where(.tw\\:group)[data-collapsible=icon] *){display:none}.tw\\:group-data-\\[collapsible\\=icon\\]\\:size-8\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(calc(var(--spacing)) * 8)!important;height:calc(calc(var(--spacing)) * 8)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\(--sidebar-width-icon\\):is(:where(.tw\\:group)[data-collapsible=icon] *){width:var(--sidebar-width-icon)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\)\\]:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(calc(var(--spacing)) * 4)))}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\+2px\\)\\]:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(calc(var(--spacing)) * 4)) + 2px)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:overflow-hidden:is(:where(.tw\\:group)[data-collapsible=icon] *){overflow:hidden}.tw\\:group-data-\\[collapsible\\=icon\\]\\:p-0\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){padding:calc(calc(var(--spacing)) * 0)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:p-2\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){padding:calc(calc(var(--spacing)) * 2)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:opacity-0:is(:where(.tw\\:group)[data-collapsible=icon] *){opacity:0}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:right-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\]:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:left-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\]:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:w-0:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){width:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:translate-x-0:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:group-data-\\[disabled\\=true\\]\\:pointer-events-none:is(:where(.tw\\:group)[data-disabled=true] *){pointer-events:none}.tw\\:group-data-\\[disabled\\=true\\]\\:opacity-50:is(:where(.tw\\:group)[data-disabled=true] *),.tw\\:group-data-\\[disabled\\=true\\]\\/input-group\\:opacity-50:is(:where(.tw\\:group\\/input-group)[data-disabled=true] *){opacity:.5}.tw\\:group-data-\\[side\\=primary\\]\\:-right-4:is(:where(.tw\\:group)[data-side=primary] *){right:calc(calc(var(--spacing)) * -4)}.tw\\:group-data-\\[side\\=primary\\]\\:border-e:is(:where(.tw\\:group)[data-side=primary] *){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.tw\\:group-data-\\[side\\=secondary\\]\\:left-0:is(:where(.tw\\:group)[data-side=secondary] *){left:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-\\[side\\=secondary\\]\\:rotate-180:is(:where(.tw\\:group)[data-side=secondary] *){rotate:180deg}.tw\\:group-data-\\[side\\=secondary\\]\\:border-s:is(:where(.tw\\:group)[data-side=secondary] *){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:group-data-\\[size\\=default\\]\\/avatar\\:size-2\\.5:is(:where(.tw\\:group\\/avatar)[data-size=default] *){width:calc(calc(var(--spacing)) * 2.5);height:calc(calc(var(--spacing)) * 2.5)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:size-4:is(:where(.tw\\:group\\/switch)[data-size=default] *){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[size\\=lg\\]\\/avatar\\:size-3:is(:where(.tw\\:group\\/avatar)[data-size=lg] *){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=sm] *){width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:text-xs:is(:where(.tw\\:group\\/avatar)[data-size=sm] *){font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:p-3:is(:where(.tw\\:group\\/card)[data-size=sm] *){padding:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:px-3:is(:where(.tw\\:group\\/card)[data-size=sm] *){padding-inline:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:text-sm:is(:where(.tw\\:group\\/card)[data-size=sm] *){font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:size-3:is(:where(.tw\\:group\\/switch)[data-size=sm] *){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:rounded-none:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *){border-radius:0}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:px-2:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *){padding-inline:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[variant\\=floating\\]\\:rounded-lg:is(:where(.tw\\:group)[data-variant=floating] *){border-radius:var(--radius)}.tw\\:group-data-\\[variant\\=floating\\]\\:shadow-sm:is(:where(.tw\\:group)[data-variant=floating] *){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=floating\\]\\:ring-1:is(:where(.tw\\:group)[data-variant=floating] *){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=floating\\]\\:ring-sidebar-border:is(:where(.tw\\:group)[data-variant=floating] *){--tw-ring-color:var(--sidebar-border)}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *){background-color:#0000}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:mx-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){margin-inline:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:mt-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){margin-top:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:h-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){height:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:w-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){width:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:text-center:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){text-align:center}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:my-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){margin-block:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:me-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){margin-inline-end:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:h-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){height:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:w-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){width:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:my-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){margin-block:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:ms-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){margin-inline-start:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:h-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){height:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:w-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){width:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:mx-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){margin-inline:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:mb-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:h-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){height:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:w-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){width:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:text-center:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){text-align:center}.tw\\:group-data-selected\\/command-item\\:text-foreground:is(:where(.tw\\:group\\/command-item):where([data-selected=true]) *){color:var(--foreground)}.tw\\:group-data-horizontal\\/tabs\\:h-8:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *){height:calc(calc(var(--spacing)) * 8)}.tw\\:group-data-vertical\\/tabs\\:h-fit:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){height:fit-content}.tw\\:group-data-vertical\\/tabs\\:w-full:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){width:100%}.tw\\:group-data-vertical\\/tabs\\:flex-col:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){flex-direction:column}.tw\\:group-data-vertical\\/tabs\\:justify-start:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){justify-content:flex-start}@media (hover:hover){.tw\\:peer-hover\\/menu-button\\:text-sidebar-accent-foreground:is(:where(.tw\\:peer\\/menu-button):hover~*){color:var(--sidebar-accent-foreground)}.tw\\:peer-focus\\:group-hover\\:text-blue-500:is(:where(.tw\\:peer):focus~*):is(:where(.tw\\:group):hover *){color:var(--tw-color-blue-500)}}.tw\\:peer-disabled\\:cursor-not-allowed:is(:where(.tw\\:peer):disabled~*){cursor:not-allowed}.tw\\:peer-disabled\\:opacity-50:is(:where(.tw\\:peer):disabled~*){opacity:.5}.tw\\:peer-data-\\[size\\=default\\]\\/menu-button\\:top-1\\.5:is(:where(.tw\\:peer\\/menu-button)[data-size=default]~*){top:calc(calc(var(--spacing)) * 1.5)}.tw\\:peer-data-\\[size\\=lg\\]\\/menu-button\\:top-2\\.5:is(:where(.tw\\:peer\\/menu-button)[data-size=lg]~*){top:calc(calc(var(--spacing)) * 2.5)}.tw\\:peer-data-\\[size\\=sm\\]\\/menu-button\\:top-1:is(:where(.tw\\:peer\\/menu-button)[data-size=sm]~*){top:calc(calc(var(--spacing)) * 1)}.tw\\:peer-data-active\\/menu-button\\:text-sidebar-accent-foreground:is(:is(:where(.tw\\:peer\\/menu-button):where([data-state=active]),:where(.tw\\:peer\\/menu-button):where([data-active]:not([data-active=false])))~*){color:var(--sidebar-accent-foreground)}.tw\\:file\\:inline-flex::file-selector-button{display:inline-flex}.tw\\:file\\:h-6::file-selector-button{height:calc(calc(var(--spacing)) * 6)}.tw\\:file\\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.tw\\:file\\:bg-transparent::file-selector-button{background-color:#0000}.tw\\:file\\:text-sm::file-selector-button{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:file\\:font-medium::file-selector-button{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:file\\:text-foreground::file-selector-button{color:var(--foreground)}.tw\\:placeholder\\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.tw\\:placeholder\\:text-slate-400::placeholder{color:var(--tw-color-slate-400)}.tw\\:before\\:absolute:before{content:var(--tw-content);position:absolute}.tw\\:before\\:top-0\\.5:before{content:var(--tw-content);top:calc(calc(var(--spacing)) * .5)}.tw\\:before\\:left-0:before{content:var(--tw-content);left:calc(calc(var(--spacing)) * 0)}.tw\\:before\\:block:before{content:var(--tw-content);display:block}.tw\\:before\\:hidden:before{content:var(--tw-content);display:none}.tw\\:before\\:h-4:before{content:var(--tw-content);height:calc(calc(var(--spacing)) * 4)}.tw\\:before\\:w-4:before{content:var(--tw-content);width:calc(calc(var(--spacing)) * 4)}.tw\\:before\\:cursor-pointer:before{content:var(--tw-content);cursor:pointer}.tw\\:before\\:rounded:before{content:var(--tw-content);border-radius:.25rem}.tw\\:before\\:border:before{content:var(--tw-content);border-style:var(--tw-border-style);border-width:1px}.tw\\:before\\:border-primary:before{content:var(--tw-content);border-color:var(--primary)}.tw\\:before\\:bg-primary:before{content:var(--tw-content);background-color:var(--primary)}.tw\\:before\\:bg-cover:before{content:var(--tw-content);background-size:cover}.tw\\:before\\:bg-no-repeat:before{content:var(--tw-content);background-repeat:no-repeat}.tw\\:before\\:content-\\[\\"\\"\\]:before{--tw-content:"";content:var(--tw-content)}.tw\\:before\\:content-\\[\\\\\\"\\\\\\"\\]:before{--tw-content:\\"\\";content:var(--tw-content)}.tw\\:after\\:absolute:after{content:var(--tw-content);position:absolute}.tw\\:after\\:-inset-2:after{content:var(--tw-content);inset:calc(calc(var(--spacing)) * -2)}.tw\\:after\\:inset-0:after{content:var(--tw-content);inset:calc(calc(var(--spacing)) * 0)}.tw\\:after\\:-inset-x-3:after{content:var(--tw-content);inset-inline:calc(calc(var(--spacing)) * -3)}.tw\\:after\\:-inset-y-2:after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * -2)}.tw\\:after\\:inset-y-0:after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:after\\:start-1\\/2:after{content:var(--tw-content);inset-inline-start:50%}.tw\\:after\\:top-\\[6px\\]:after{content:var(--tw-content);top:6px}.tw\\:after\\:right-\\[7px\\]:after{content:var(--tw-content);right:7px}.tw\\:after\\:left-\\[7px\\]:after{content:var(--tw-content);left:7px}.tw\\:after\\:block:after{content:var(--tw-content);display:block}.tw\\:after\\:hidden:after{content:var(--tw-content);display:none}.tw\\:after\\:h-0\\.5:after{content:var(--tw-content);height:calc(calc(var(--spacing)) * .5)}.tw\\:after\\:h-\\[6px\\]:after{content:var(--tw-content);height:6px}.tw\\:after\\:w-1:after{content:var(--tw-content);width:calc(calc(var(--spacing)) * 1)}.tw\\:after\\:w-\\[2px\\]:after{content:var(--tw-content);width:2px}.tw\\:after\\:w-\\[3px\\]:after{content:var(--tw-content);width:3px}.tw\\:after\\:-translate-x-1\\/2:after{content:var(--tw-content);--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:after\\:rotate-45:after{content:var(--tw-content);rotate:45deg}.tw\\:after\\:cursor-pointer:after{content:var(--tw-content);cursor:pointer}.tw\\:after\\:rounded-full:after{content:var(--tw-content);border-radius:3.40282e38px}.tw\\:after\\:border:after{content:var(--tw-content);border-style:var(--tw-border-style);border-width:1px}.tw\\:after\\:border-t-0:after{content:var(--tw-content);border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:after\\:border-r-2:after{content:var(--tw-content);border-right-style:var(--tw-border-style);border-right-width:2px}.tw\\:after\\:border-b-2:after{content:var(--tw-content);border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.tw\\:after\\:border-l-0:after{content:var(--tw-content);border-left-style:var(--tw-border-style);border-left-width:0}.tw\\:after\\:border-solid:after{content:var(--tw-content);--tw-border-style:solid;border-style:solid}.tw\\:after\\:border-border:after{content:var(--tw-content);border-color:var(--border)}.tw\\:after\\:border-white:after{content:var(--tw-content);border-color:var(--tw-color-white)}.tw\\:after\\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.tw\\:after\\:bg-muted:after{content:var(--tw-content);background-color:var(--muted)}.tw\\:after\\:opacity-0:after{content:var(--tw-content);opacity:0}.tw\\:after\\:mix-blend-darken:after{content:var(--tw-content);mix-blend-mode:darken}.tw\\:after\\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:after\\:content-\\[\\"\\"\\]:after{--tw-content:"";content:var(--tw-content)}.tw\\:after\\:content-\\[\\\\\\"\\\\\\"\\]:after{--tw-content:\\"\\";content:var(--tw-content)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:after\\:start-full:is(:where(.tw\\:group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);inset-inline-start:100%}.tw\\:group-data-horizontal\\/tabs\\:after\\:inset-x-0:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-horizontal\\/tabs\\:after\\:bottom-\\[-5px\\]:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);bottom:-5px}.tw\\:group-data-horizontal\\/tabs\\:after\\:h-0\\.5:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);height:calc(calc(var(--spacing)) * .5)}.tw\\:group-data-vertical\\/tabs\\:after\\:inset-y-0:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-vertical\\/tabs\\:after\\:-end-1:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);inset-inline-end:calc(calc(var(--spacing)) * -1)}.tw\\:group-data-vertical\\/tabs\\:after\\:w-0\\.5:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);width:calc(calc(var(--spacing)) * .5)}.tw\\:first\\:mt-0:first-child{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:last\\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:even\\:bg-muted:nth-child(2n){background-color:var(--muted)}.tw\\:focus-within\\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-within\\:ring-ring:focus-within{--tw-ring-color:var(--ring)}.tw\\:focus-within\\:ring-offset-1:focus-within{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}@media (hover:hover){.tw\\:hover\\:-mt-4:hover{margin-top:calc(calc(var(--spacing)) * -4)}.tw\\:hover\\:cursor-pointer:hover{cursor:pointer}.tw\\:hover\\:bg-accent:hover,.tw\\:hover\\:bg-accent\\/30:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-accent\\/30:hover{background-color:color-mix(in oklab, var(--accent) 30%, transparent)}}.tw\\:hover\\:bg-accent\\/80:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-accent\\/80:hover{background-color:color-mix(in oklab, var(--accent) 80%, transparent)}}.tw\\:hover\\:bg-blue-600:hover{background-color:var(--tw-color-blue-600)}.tw\\:hover\\:bg-destructive\\/20:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-destructive\\/20:hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:hover\\:bg-gray-50:hover{background-color:var(--tw-color-gray-50)}.tw\\:hover\\:bg-input:hover{background-color:var(--input)}.tw\\:hover\\:bg-muted:hover,.tw\\:hover\\:bg-muted\\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-muted\\/50:hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:hover\\:bg-muted\\/80:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-muted\\/80:hover{background-color:color-mix(in oklab, var(--muted) 80%, transparent)}}.tw\\:hover\\:bg-primary\\/10:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/10:hover{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.tw\\:hover\\:bg-primary\\/70:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/70:hover{background-color:color-mix(in oklab, var(--primary) 70%, transparent)}}.tw\\:hover\\:bg-primary\\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.tw\\:hover\\:bg-red-500:hover{background-color:var(--tw-color-red-500)}.tw\\:hover\\:bg-secondary:hover,.tw\\:hover\\:bg-secondary\\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-secondary\\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.tw\\:hover\\:bg-sidebar-accent:hover{background-color:var(--sidebar-accent)}.tw\\:hover\\:bg-transparent:hover{background-color:#0000}.tw\\:hover\\:text-foreground:hover{color:var(--foreground)}.tw\\:hover\\:text-muted-foreground:hover{color:var(--muted-foreground)}.tw\\:hover\\:text-primary-foreground:hover{color:var(--primary-foreground)}.tw\\:hover\\:text-sidebar-accent-foreground:hover{color:var(--sidebar-accent-foreground)}.tw\\:hover\\:underline:hover{text-decoration-line:underline}.tw\\:hover\\:opacity-80:hover{opacity:.8}.tw\\:hover\\:opacity-100:hover{opacity:1}.tw\\:hover\\:shadow-\\[0_0_0_1px_var\\(--sidebar-accent\\)\\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-accent));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:ring-3:hover{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:group-data-\\[collapsible\\=offcanvas\\]\\:bg-sidebar:hover:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){background-color:var(--sidebar)}.tw\\:hover\\:after\\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:var(--sidebar-border)}}.tw\\:focus\\:relative:focus{position:relative}.tw\\:focus\\:z-10:focus{z-index:10}.tw\\:focus\\:bg-accent:focus{background-color:var(--accent)}.tw\\:focus\\:bg-muted:focus{background-color:var(--muted)}.tw\\:focus\\:text-accent-foreground:focus{color:var(--accent-foreground)}.tw\\:focus\\:text-foreground:focus{color:var(--foreground)}.tw\\:focus\\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus\\:ring-ring:focus{--tw-ring-color:var(--ring)}.tw\\:focus\\:ring-offset-1:focus{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:focus\\:ring-offset-background:focus{--tw-ring-offset-color:var(--background)}.tw\\:focus\\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:focus\\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}:is(.tw\\:focus\\:\\*\\*\\:text-accent-foreground:focus *),:is(.tw\\:not-data-\\[variant\\=destructive\\]\\:focus\\:\\*\\*\\:text-accent-foreground:not([data-variant=destructive]):focus *){color:var(--accent-foreground)}.tw\\:focus-visible\\:relative:focus-visible{position:relative}.tw\\:focus-visible\\:z-10:focus-visible{z-index:10}.tw\\:focus-visible\\:border-destructive\\/40:focus-visible{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:border-destructive\\/40:focus-visible{border-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:focus-visible\\:border-ring:focus-visible{border-color:var(--ring)}.tw\\:focus-visible\\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-3:focus-visible,.tw\\:focus-visible\\:ring-\\[3px\\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-\\[color\\:hsl\\(240\\,5\\%\\,64\\.9\\%\\)\\]:focus-visible{--tw-ring-color:#a1a1aa}.tw\\:focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:focus-visible\\:ring-ring:focus-visible,.tw\\:focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:focus-visible\\:ring-slate-400:focus-visible{--tw-ring-color:var(--tw-color-slate-400)}.tw\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:focus-visible\\:outline-hidden:focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:focus-visible\\:outline-hidden:focus-visible{outline-offset:2px;outline:2px solid #0000}}.tw\\:focus-visible\\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.tw\\:focus-visible\\:outline-ring:focus-visible{outline-color:var(--ring)}.tw\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}:is(.tw\\:\\*\\:focus-visible\\:relative>*):focus-visible{position:relative}:is(.tw\\:\\*\\:focus-visible\\:z-10>*):focus-visible{z-index:10}.tw\\:active\\:bg-sidebar-accent:active{background-color:var(--sidebar-accent)}.tw\\:active\\:text-sidebar-accent-foreground:active{color:var(--sidebar-accent-foreground)}.tw\\:active\\:ring-3:active{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:active\\:not-aria-\\[haspopup\\]\\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:active\\:not-aria-\\[haspopup\\]\\:transform-\\[translateY\\(1px\\)\\]:active:not([aria-haspopup]){transform:translateY(1px)}.tw\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.tw\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.tw\\:disabled\\:bg-input\\/50:disabled{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:disabled\\:bg-input\\/50:disabled{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:disabled\\:bg-transparent:disabled{background-color:#0000}.tw\\:disabled\\:opacity-50:disabled{opacity:.5}:where([data-side=bottom]) .tw\\:in-data-\\[side\\=bottom\\]\\:translate-y-\\[calc\\(-50\\%-1px\\)\\]{--tw-translate-y:calc(-50% - 1px);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=bottom]) .tw\\:in-data-\\[side\\=bottom\\]\\:\\[clip-path\\:polygon\\(100\\%_0\\,100\\%_100\\%\\,0_100\\%\\)\\]{clip-path:polygon(100% 0,100% 100%,0 100%)}:where([data-side=primary]) .tw\\:in-data-\\[side\\=primary\\]\\:cursor-w-resize{cursor:w-resize}:where([data-side=secondary]) .tw\\:in-data-\\[side\\=secondary\\]\\:cursor-e-resize{cursor:e-resize}:where([data-side=top]) .tw\\:in-data-\\[side\\=top\\]\\:translate-y-\\[calc\\(-50\\%-1px\\)\\]{--tw-translate-y:calc(-50% - 1px);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=top]) .tw\\:in-data-\\[side\\=top\\]\\:\\[clip-path\\:polygon\\(100\\%_0\\,100\\%_100\\%\\,0_100\\%\\)\\]{clip-path:polygon(100% 0,100% 100%,0 100%)}:where([data-slot=button-group]) .tw\\:in-data-\\[slot\\=button-group\\]\\:rounded-lg{border-radius:var(--radius)}:where([data-slot=combobox-content]) .tw\\:in-data-\\[slot\\=combobox-content\\]\\:focus-within\\:border-inherit:focus-within{border-color:inherit}:where([data-slot=combobox-content]) .tw\\:in-data-\\[slot\\=combobox-content\\]\\:focus-within\\:ring-0:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:where([data-slot=dialog-content]) .tw\\:in-data-\\[slot\\=dialog-content\\]\\:rounded-lg\\!{border-radius:var(--radius)!important}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/20{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/20{background-color:color-mix(in oklab, var(--background) 20%, transparent)}}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:text-background{color:var(--background)}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:text-destructive{color:var(--destructive)}.tw\\:has-disabled\\:bg-input\\/50:has(:disabled){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-disabled\\:bg-input\\/50:has(:disabled){background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:has-disabled\\:opacity-50:has(:disabled){opacity:.5}.tw\\:has-aria-expanded\\:bg-muted\\/50:has([aria-expanded=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-aria-expanded\\:bg-muted\\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-1:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-1\\.5:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-2:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:has-data-\\[icon\\=inline-end\\]\\:pe-1\\.5:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *):has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-1:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-1\\.5:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-2:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:has-data-\\[icon\\=inline-start\\]\\:ps-1\\.5:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *):has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[slot\\=alert-action\\]\\:relative:has([data-slot=alert-action]){position:relative}.tw\\:has-data-\\[slot\\=alert-action\\]\\:pe-18:has([data-slot=alert-action]){padding-inline-end:calc(calc(var(--spacing)) * 18)}.tw\\:has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.tw\\:has-data-\\[slot\\=card-description\\]\\:grid-rows-\\[auto_auto\\]:has([data-slot=card-description]){grid-template-rows:auto auto}.tw\\:has-data-\\[slot\\=card-footer\\]\\:pb-0:has([data-slot=card-footer]){padding-bottom:calc(calc(var(--spacing)) * 0)}.tw\\:has-data-\\[slot\\=kbd\\]\\:pe-0:has([data-slot=kbd]){padding-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:has-data-\\[slot\\=kbd\\]\\:pe-1\\.5:has([data-slot=kbd]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[variant\\=inset\\]\\:bg-sidebar:has([data-variant=inset]){background-color:var(--sidebar)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:border-ring:has([data-slot=input-group-control]:focus-visible){border-color:var(--ring)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-3:has([data-slot=input-group-control]:focus-visible){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-ring\\/50:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-ring\\/50:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:border-destructive:has([data-slot][aria-invalid=true]){border-color:var(--destructive)}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-3:has([data-slot][aria-invalid=true]){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/20:has([data-slot][aria-invalid=true]){--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/20:has([data-slot][aria-invalid=true]){--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:h-auto:has(>[data-align=block-end]){height:auto}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:flex-col:has(>[data-align=block-end]){flex-direction:column}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:h-auto:has(>[data-align=block-start]){height:auto}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:flex-col:has(>[data-align=block-start]){flex-direction:column}.tw\\:has-\\[\\>\\[data-slot\\=button-group\\]\\]\\:gap-2:has(>[data-slot=button-group]){gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>button\\]\\:ms-\\[-0\\.3rem\\]:has(>button){margin-inline-start:-.3rem}.tw\\:has-\\[\\>button\\]\\:me-\\[-0\\.3rem\\]:has(>button){margin-inline-end:-.3rem}.tw\\:has-\\[\\>img\\]\\:grid-cols-\\[auto_1fr\\]:has(>img){grid-template-columns:auto 1fr}.tw\\:has-\\[\\>img\\]\\:gap-x-2:has(>img){column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>img\\:first-child\\]\\:pt-0:has(>img:first-child){padding-top:calc(calc(var(--spacing)) * 0)}.tw\\:has-\\[\\>kbd\\]\\:ms-\\[-0\\.15rem\\]:has(>kbd){margin-inline-start:-.15rem}.tw\\:has-\\[\\>kbd\\]\\:me-\\[-0\\.15rem\\]:has(>kbd){margin-inline-end:-.15rem}.tw\\:has-\\[\\>svg\\]\\:grid-cols-\\[auto_1fr\\]:has(>svg){grid-template-columns:auto 1fr}.tw\\:has-\\[\\>svg\\]\\:gap-x-2:has(>svg){column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>svg\\]\\:p-0:has(>svg){padding:calc(calc(var(--spacing)) * 0)}.tw\\:has-\\[\\>textarea\\]\\:h-auto:has(>textarea){height:auto}.tw\\:aria-disabled\\:pointer-events-none[aria-disabled=true]{pointer-events:none}.tw\\:aria-disabled\\:opacity-50[aria-disabled=true]{opacity:.5}.tw\\:aria-expanded\\:bg-muted[aria-expanded=true]{background-color:var(--muted)}.tw\\:aria-expanded\\:bg-secondary[aria-expanded=true]{background-color:var(--secondary)}.tw\\:aria-expanded\\:text-foreground[aria-expanded=true]{color:var(--foreground)}.tw\\:aria-expanded\\:text-secondary-foreground[aria-expanded=true]{color:var(--secondary-foreground)}.tw\\:aria-expanded\\:opacity-100[aria-expanded=true]{opacity:1}.tw\\:aria-invalid\\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.tw\\:aria-invalid\\:ring-0[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:aria-invalid\\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:aria-invalid\\:aria-checked\\:border-primary[aria-invalid=true][aria-checked=true]{border-color:var(--primary)}.tw\\:aria-pressed\\:bg-muted[aria-pressed=true]{background-color:var(--muted)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:h-px[aria-orientation=horizontal]{height:1px}.tw\\:aria-\\[orientation\\=horizontal\\]\\:w-full[aria-orientation=horizontal]{width:100%}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:start-0[aria-orientation=horizontal]:after{content:var(--tw-content);inset-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:h-1[aria-orientation=horizontal]:after{content:var(--tw-content);height:calc(calc(var(--spacing)) * 1)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:w-full[aria-orientation=horizontal]:after{content:var(--tw-content);width:100%}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:translate-x-0[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:-translate-y-1\\/2[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:aria-\\[orientation\\=vertical\\]\\:flex-col[aria-orientation=vertical]{flex-direction:column}.tw\\:data-inset\\:ps-7[data-inset]{padding-inline-start:calc(calc(var(--spacing)) * 7)}.tw\\:data-placeholder\\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.tw\\:data-quiet-focus\\:focus-visible\\:border-transparent[data-quiet-focus]:focus-visible{border-color:#0000}.tw\\:data-quiet-focus\\:focus-visible\\:ring-0[data-quiet-focus]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-quiet-focus\\:focus-visible\\:outline-none[data-quiet-focus]:focus-visible{--tw-outline-style:none;outline-style:none}.tw\\:data-\\[align-trigger\\=false\\]\\:min-w-36[data-align-trigger=false]{min-width:calc(calc(var(--spacing)) * 36)}.tw\\:data-\\[align-trigger\\=true\\]\\:min-w-\\(--radix-select-trigger-width\\)[data-align-trigger=true]{min-width:var(--radix-select-trigger-width)}.tw\\:data-\\[align-trigger\\=true\\]\\:animate-none[data-align-trigger=true]{animation:none}.tw\\:data-\\[disabled\\=true\\]\\:pointer-events-none[data-disabled=true]{pointer-events:none}.tw\\:data-\\[disabled\\=true\\]\\:opacity-50[data-disabled=true]{opacity:.5}.tw\\:data-\\[position\\=popper\\]\\:h-\\(--radix-select-trigger-height\\)[data-position=popper]{height:var(--radix-select-trigger-height)}.tw\\:data-\\[position\\=popper\\]\\:w-full[data-position=popper]{width:100%}.tw\\:data-\\[position\\=popper\\]\\:min-w-\\(--radix-select-trigger-width\\)[data-position=popper]{min-width:var(--radix-select-trigger-width)}.tw\\:data-\\[side\\=bottom\\]\\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.tw\\:data-\\[side\\=left\\]\\:-translate-x-1[data-side=left]{--tw-translate-x:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.tw\\:data-\\[side\\=right\\]\\:translate-x-1[data-side=right]{--tw-translate-x:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.tw\\:data-\\[side\\=top\\]\\:-translate-y-1[data-side=top]{--tw-translate-y:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.tw\\:data-\\[size\\=default\\]\\:h-8[data-size=default]{height:calc(calc(var(--spacing)) * 8)}.tw\\:data-\\[size\\=default\\]\\:h-\\[18\\.4px\\][data-size=default]{height:18.4px}.tw\\:data-\\[size\\=default\\]\\:w-\\[32px\\][data-size=default]{width:32px}.tw\\:data-\\[size\\=lg\\]\\:size-10[data-size=lg]{width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:data-\\[size\\=md\\]\\:text-sm[data-size=md]{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:data-\\[size\\=sm\\]\\:size-6[data-size=sm]{width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:data-\\[size\\=sm\\]\\:h-7[data-size=sm]{height:calc(calc(var(--spacing)) * 7)}.tw\\:data-\\[size\\=sm\\]\\:h-\\[14px\\][data-size=sm]{height:14px}.tw\\:data-\\[size\\=sm\\]\\:w-\\[24px\\][data-size=sm]{width:24px}.tw\\:data-\\[size\\=sm\\]\\:gap-3[data-size=sm]{gap:calc(calc(var(--spacing)) * 3)}.tw\\:data-\\[size\\=sm\\]\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,10px\\)\\][data-size=sm]{border-radius:min(var(--tw-radius-md), 10px)}.tw\\:data-\\[size\\=sm\\]\\:py-3[data-size=sm]{padding-block:calc(calc(var(--spacing)) * 3)}.tw\\:data-\\[size\\=sm\\]\\:text-xs[data-size=sm]{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:data-\\[size\\=sm\\]\\:has-data-\\[slot\\=card-footer\\]\\:pb-0[data-size=sm]:has([data-slot=card-footer]){padding-bottom:calc(calc(var(--spacing)) * 0)}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-item]:focus{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-item]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:data-highlighted\\:bg-foreground\\/10 *)[data-slot$=-item][data-highlighted]{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:data-highlighted\\:bg-foreground\\/10 *)[data-slot$=-item][data-highlighted]{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-separator\\]\\:bg-foreground\\/5 *)[data-slot$=-separator]{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-separator\\]\\:bg-foreground\\/5 *)[data-slot$=-separator]{background-color:color-mix(in oklab, var(--foreground) 5%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-trigger]:focus{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-trigger]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:aria-expanded\\:bg-foreground\\/10\\! *)[data-slot$=-trigger][aria-expanded=true]{background-color:var(--foreground)!important}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:aria-expanded\\:bg-foreground\\/10\\! *)[data-slot$=-trigger][aria-expanded=true]{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)!important}}:is(.tw\\:\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90>*)[data-slot=alert-description]{color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90>*)[data-slot=alert-description]{color:color-mix(in oklab, var(--destructive) 90%, transparent)}}:is(.tw\\:\\*\\:data-\\[slot\\=avatar\\]\\:ring-2>*)[data-slot=avatar]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:is(.tw\\:\\*\\:data-\\[slot\\=avatar\\]\\:ring-background>*)[data-slot=avatar]{--tw-ring-color:var(--background)}:is(.tw\\:\\*\\:data-\\[slot\\=input-group-addon\\]\\:ps-2\\!>*)[data-slot=input-group-addon]{padding-inline-start:calc(calc(var(--spacing)) * 2)!important}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:relative *)[data-slot=kbd]{position:relative}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:isolate *)[data-slot=kbd]{isolation:isolate}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:z-50 *)[data-slot=kbd]{z-index:50}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:rounded-sm *)[data-slot=kbd]{border-radius:calc(var(--radius) * .6)}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:flex>*)[data-slot=select-value]{display:flex}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:flex-1>*)[data-slot=select-value]{flex:1}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:items-center>*)[data-slot=select-value]{align-items:center}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:gap-1\\.5>*)[data-slot=select-value]{gap:calc(calc(var(--spacing)) * 1.5)}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:text-start>*)[data-slot=select-value]{text-align:start}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:first\\:rounded-s-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"]:first-child{border-start-start-radius:var(--radius);border-end-start-radius:var(--radius)}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:first\\:rounded-t-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"]:first-child{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:last\\:rounded-e-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"]:last-child{border-start-end-radius:var(--radius);border-end-end-radius:var(--radius)}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:last\\:rounded-b-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"]:last-child{border-bottom-right-radius:var(--radius);border-bottom-left-radius:var(--radius)}.tw\\:data-\\[state\\=active\\]\\:bg-background[data-state=active]{background-color:var(--background)}.tw\\:data-\\[state\\=active\\]\\:text-foreground[data-state=active]{color:var(--foreground)}.tw\\:data-\\[state\\=active\\]\\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-\\[state\\=closed\\]\\:overflow-hidden[data-state=closed]{overflow:hidden}.tw\\:data-\\[state\\=delayed-open\\]\\:animate-in[data-state=delayed-open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-\\[state\\=delayed-open\\]\\:fade-in-0[data-state=delayed-open]{--tw-enter-opacity:0}.tw\\:data-\\[state\\=delayed-open\\]\\:zoom-in-95[data-state=delayed-open]{--tw-enter-scale:.95}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-approved\\)\\][data-state=on]{background-color:var(--inv-soft-approved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-unapproved\\)\\][data-state=on]{background-color:var(--inv-soft-unapproved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-unknown\\)\\][data-state=on]{background-color:var(--inv-soft-unknown)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-approved\\)\\][data-state=on]{background-color:var(--inv-vivid-approved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-unapproved\\)\\][data-state=on]{background-color:var(--inv-vivid-unapproved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-unknown\\)\\][data-state=on]{background-color:var(--inv-vivid-unknown)}.tw\\:data-\\[state\\=on\\]\\:bg-muted[data-state=on]{background-color:var(--muted)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-approved\\)\\][data-state=on]{color:var(--inv-icon-approved)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-unapproved\\)\\][data-state=on]{color:var(--inv-icon-unapproved)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-unknown\\)\\][data-state=on]{color:var(--inv-icon-unknown)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-on\\)\\][data-state=on]{color:var(--inv-on)}.tw\\:data-\\[state\\=on\\]\\:text-foreground[data-state=on]{color:var(--foreground)}.tw\\:data-\\[state\\=open\\]\\:bg-accent[data-state=open]{background-color:var(--accent)}.tw\\:data-\\[state\\=open\\]\\:bg-muted[data-state=open]{background-color:var(--muted)}.tw\\:data-\\[state\\=open\\]\\:text-foreground[data-state=open]{color:var(--foreground)}.tw\\:data-\\[state\\=selected\\]\\:bg-muted[data-state=selected]{background-color:var(--muted)}.tw\\:data-\\[variant\\=destructive\\]\\:text-destructive[data-variant=destructive]{color:var(--destructive)}:is(:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:\\*\\*\\:text-accent-foreground\\! *)[data-variant=destructive] *),:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:text-accent-foreground\\! *)[data-variant=destructive]{color:var(--accent-foreground)!important}.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:text-destructive[data-variant=destructive]:focus{color:var(--destructive)}:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-foreground\\/10\\! *)[data-variant=destructive]:focus{background-color:var(--foreground)!important}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-foreground\\/10\\! *)[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)!important}}.tw\\:data-\\[variant\\=line\\]\\:rounded-none[data-variant=line]{border-radius:0}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:border-s-0:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"][data-variant=outline]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:border-t-0:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"][data-variant=outline]{border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:first\\:border-s:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"][data-variant=outline]:first-child{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:first\\:border-t:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"][data-variant=outline]:first-child{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:inset-x-0[data-vaul-drawer-direction=bottom]{inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:bottom-0[data-vaul-drawer-direction=bottom]{bottom:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:mt-24[data-vaul-drawer-direction=bottom]{margin-top:calc(calc(var(--spacing)) * 24)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:max-h-\\[80vh\\][data-vaul-drawer-direction=bottom]{max-height:80vh}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:rounded-t-xl[data-vaul-drawer-direction=bottom]{border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:border-t[data-vaul-drawer-direction=bottom]{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:inset-y-0[data-vaul-drawer-direction=left]{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:left-0[data-vaul-drawer-direction=left]{left:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:w-3\\/4[data-vaul-drawer-direction=left]{width:75%}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:flex-row[data-vaul-drawer-direction=left]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:rounded-r-xl[data-vaul-drawer-direction=left]{border-top-right-radius:calc(var(--radius) * 1.4);border-bottom-right-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:border-r[data-vaul-drawer-direction=left]{border-right-style:var(--tw-border-style);border-right-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=left\\/right\\]\\:flex-row[data-vaul-drawer-direction=left\\/right]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:inset-y-0[data-vaul-drawer-direction=right]{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:right-0[data-vaul-drawer-direction=right]{right:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:w-3\\/4[data-vaul-drawer-direction=right]{width:75%}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:flex-row[data-vaul-drawer-direction=right]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:rounded-l-xl[data-vaul-drawer-direction=right]{border-top-left-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:border-l[data-vaul-drawer-direction=right]{border-left-style:var(--tw-border-style);border-left-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:inset-x-0[data-vaul-drawer-direction=top]{inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:top-0[data-vaul-drawer-direction=top]{top:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:mb-24[data-vaul-drawer-direction=top]{margin-bottom:calc(calc(var(--spacing)) * 24)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:max-h-\\[80vh\\][data-vaul-drawer-direction=top]{max-height:80vh}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:rounded-b-xl[data-vaul-drawer-direction=top]{border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:border-b[data-vaul-drawer-direction=top]{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.tw\\:supports-backdrop-filter\\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--tw-blur-xs));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}}@media (min-width:40rem){.tw\\:sm\\:flex{display:flex}.tw\\:sm\\:max-w-sm{max-width:var(--tw-container-sm)}.tw\\:sm\\:flex-row{flex-direction:row}.tw\\:sm\\:justify-end{justify-content:flex-end}.tw\\:sm\\:p-8{padding:calc(calc(var(--spacing)) * 8)}.tw\\:sm\\:text-start{text-align:start}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:sm\\:max-w-sm[data-vaul-drawer-direction=left],.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:sm\\:max-w-sm[data-vaul-drawer-direction=right]{max-width:var(--tw-container-sm)}}@media (min-width:48rem){.tw\\:md\\:block{display:block}.tw\\:md\\:flex{display:flex}.tw\\:md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:md\\:gap-0\\.5{gap:calc(calc(var(--spacing)) * .5)}.tw\\:md\\:text-start{text-align:start}.tw\\:md\\:text-sm{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:md\\:text-pretty{text-wrap:pretty}.tw\\:md\\:opacity-0{opacity:0}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:m-2:is(:where(.tw\\:peer)[data-variant=inset]~*){margin:calc(calc(var(--spacing)) * 2)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:ms-0:is(:where(.tw\\:peer)[data-variant=inset]~*){margin-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:rounded-xl:is(:where(.tw\\:peer)[data-variant=inset]~*){border-radius:calc(var(--radius) * 1.4)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:shadow-sm:is(:where(.tw\\:peer)[data-variant=inset]~*){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:peer-data-\\[state\\=collapsed\\]\\:ms-2:is(:where(.tw\\:peer)[data-variant=inset]~*):is(:where(.tw\\:peer)[data-state=collapsed]~*){margin-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:md\\:after\\:hidden:after{content:var(--tw-content);display:none}}@media (min-width:64rem){.tw\\:lg\\:flex{display:flex}.tw\\:lg\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}:where(.tw\\:lg\\:space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 8) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 8) * calc(1 - var(--tw-space-x-reverse)))}.tw\\:lg\\:text-5xl{font-size:var(--tw-text-5xl);line-height:var(--tw-leading,var(--tw-text-5xl--line-height))}}@media (min-width:48rem){@media (min-width:64rem){.tw\\:md\\:lg\\:hidden{display:none}}}@media (min-width:80rem){.tw\\:xl\\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.tw\\:xl\\:grid-flow-col{grid-auto-flow:column}.tw\\:xl\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:xl\\:grid-cols-none{grid-template-columns:none}.tw\\:xl\\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}}@container search not (min-width:7rem){.tw\\:\\@max-\\[7rem\\]\\/search\\:hidden{display:none}.tw\\:\\@max-\\[7rem\\]\\/search\\:ps-3{padding-inline-start:calc(calc(var(--spacing)) * 3)}}@container search not (min-width:4rem){.tw\\:\\@max-\\[4rem\\]\\/search\\:hidden{display:none}.tw\\:\\@max-\\[4rem\\]\\/search\\:pe-3{padding-inline-end:calc(calc(var(--spacing)) * 3)}}@container search not (min-width:3rem){.tw\\:\\@max-\\[3rem\\]\\/search\\:ps-0{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\@max-\\[3rem\\]\\/search\\:pe-0{padding-inline-end:calc(calc(var(--spacing)) * 0)}}@container (min-width:24rem){.tw\\:\\@sm\\:basis-auto{flex-basis:auto}}.tw\\:ltr\\:left-2:where(:dir(ltr),[dir=ltr],[dir=ltr] *){left:calc(calc(var(--spacing)) * 2)}.tw\\:ltr\\:-translate-x-1\\/2:where(:dir(ltr),[dir=ltr],[dir=ltr] *){--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:right-2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:calc(calc(var(--spacing)) * 2)}.tw\\:rtl\\:flex:where(:dir(rtl),[dir=rtl],[dir=rtl] *){display:flex}.tw\\:rtl\\:-translate-x-px:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:translate-x-1\\/2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:translate-x-px:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:after\\:translate-x-1\\/2:where(:dir(rtl),[dir=rtl],[dir=rtl] *):after{content:var(--tw-content);--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=primary]) .tw\\:rtl\\:in-data-\\[side\\=primary\\]\\:cursor-e-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:e-resize}:where([data-side=secondary]) .tw\\:rtl\\:in-data-\\[side\\=secondary\\]\\:cursor-w-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:w-resize}.tw\\:rtl\\:aria-\\[orientation\\=horizontal\\]\\:after\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:data-\\[side\\=left\\]\\:translate-x-1:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-side=left]{--tw-translate-x:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:data-\\[side\\=right\\]\\:-translate-x-1:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-side=right]{--tw-translate-x:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:border-input:is(.dark *){border-color:var(--input)}.tw\\:dark\\:bg-destructive\\/20:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:bg-destructive\\/20:is(.dark *){background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:dark\\:bg-input\\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:bg-input\\/30:is(.dark *){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:dark\\:bg-transparent:is(.dark *){background-color:#0000}.tw\\:dark\\:text-amber-400:is(.dark *){color:var(--tw-color-amber-400)}.tw\\:dark\\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}.tw\\:dark\\:text-rose-400:is(.dark *){color:var(--tw-color-rose-400)}.tw\\:dark\\:text-sky-400:is(.dark *){color:var(--tw-color-sky-400)}.tw\\:dark\\:text-teal-400:is(.dark *){color:var(--tw-color-teal-400)}.tw\\:dark\\:after\\:mix-blend-lighten:is(.dark *):after{content:var(--tw-content);mix-blend-mode:lighten}@media (hover:hover){.tw\\:dark\\:hover\\:bg-blue-500:is(.dark *):hover{background-color:var(--tw-color-blue-500)}.tw\\:dark\\:hover\\:bg-destructive\\/30:is(.dark *):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-destructive\\/30:is(.dark *):hover{background-color:color-mix(in oklab, var(--destructive) 30%, transparent)}}.tw\\:dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:dark\\:hover\\:bg-muted\\/50:is(.dark *):hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-muted\\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:dark\\:hover\\:text-foreground:is(.dark *):hover{color:var(--foreground)}}.tw\\:dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:disabled\\:bg-input\\/80:is(.dark *):disabled{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:disabled\\:bg-input\\/80:is(.dark *):disabled{background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:dark\\:disabled\\:bg-transparent:is(.dark *):disabled{background-color:#0000}:where([data-slot=tooltip-content]) .tw\\:dark\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/10:is(.dark *){background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){:where([data-slot=tooltip-content]) .tw\\:dark\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/10:is(.dark *){background-color:color-mix(in oklab, var(--background) 10%, transparent)}}.tw\\:dark\\:has-disabled\\:bg-input\\/80:is(.dark *):has(:disabled){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:has-disabled\\:bg-input\\/80:is(.dark *):has(:disabled){background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:dark\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/40:is(.dark *):has([data-slot][aria-invalid=true]){--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/40:is(.dark *):has([data-slot][aria-invalid=true]){--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:aria-invalid\\:border-destructive\\/50:is(.dark *)[aria-invalid=true]{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:aria-invalid\\:border-destructive\\/50:is(.dark *)[aria-invalid=true]{border-color:color-mix(in oklab, var(--destructive) 50%, transparent)}}.tw\\:dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:data-open\\:animate-in:where([data-state=open]),.tw\\:data-open\\:animate-in:where([data-open]:not([data-open=false])){animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-open\\:bg-accent:where([data-state=open]),.tw\\:data-open\\:bg-accent:where([data-open]:not([data-open=false])){background-color:var(--accent)}.tw\\:data-open\\:text-accent-foreground:where([data-state=open]),.tw\\:data-open\\:text-accent-foreground:where([data-open]:not([data-open=false])){color:var(--accent-foreground)}.tw\\:data-open\\:fade-in-0:where([data-state=open]),.tw\\:data-open\\:fade-in-0:where([data-open]:not([data-open=false])){--tw-enter-opacity:0}.tw\\:data-open\\:zoom-in-95:where([data-state=open]),.tw\\:data-open\\:zoom-in-95:where([data-open]:not([data-open=false])){--tw-enter-scale:.95}@media (hover:hover){:is(.tw\\:data-open\\:hover\\:bg-sidebar-accent:where([data-state=open]),.tw\\:data-open\\:hover\\:bg-sidebar-accent:where([data-open]:not([data-open=false]))):hover{background-color:var(--sidebar-accent)}:is(.tw\\:data-open\\:hover\\:text-sidebar-accent-foreground:where([data-state=open]),.tw\\:data-open\\:hover\\:text-sidebar-accent-foreground:where([data-open]:not([data-open=false]))):hover{color:var(--sidebar-accent-foreground)}}.tw\\:data-closed\\:animate-out:where([data-state=closed]),.tw\\:data-closed\\:animate-out:where([data-closed]:not([data-closed=false])){animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-closed\\:fade-out-0:where([data-state=closed]),.tw\\:data-closed\\:fade-out-0:where([data-closed]:not([data-closed=false])){--tw-exit-opacity:0}.tw\\:data-closed\\:zoom-out-95:where([data-state=closed]),.tw\\:data-closed\\:zoom-out-95:where([data-closed]:not([data-closed=false])){--tw-exit-scale:.95}.tw\\:data-checked\\:border-primary:where([data-state=checked]),.tw\\:data-checked\\:border-primary:where([data-checked]:not([data-checked=false])){border-color:var(--primary)}.tw\\:data-checked\\:bg-primary:where([data-state=checked]),.tw\\:data-checked\\:bg-primary:where([data-checked]:not([data-checked=false])){background-color:var(--primary)}.tw\\:data-checked\\:text-primary-foreground:where([data-state=checked]),.tw\\:data-checked\\:text-primary-foreground:where([data-checked]:not([data-checked=false])){color:var(--primary-foreground)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=checked]),.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-checked]:not([data-checked=false])),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=checked]),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-checked]:not([data-checked=false])){--tw-translate-x:calc(100% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=checked]),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-checked]:not([data-checked=false])),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=checked]),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-checked]:not([data-checked=false])){--tw-translate-x:calc(calc(100% - 2px) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:data-checked\\:bg-primary:is(.dark *):where([data-state=checked]),.tw\\:dark\\:data-checked\\:bg-primary:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--primary)}.tw\\:dark\\:data-checked\\:bg-primary-foreground:is(.dark *):where([data-state=checked]),.tw\\:dark\\:data-checked\\:bg-primary-foreground:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--primary-foreground)}.tw\\:data-unchecked\\:bg-input:where([data-state=unchecked]),.tw\\:data-unchecked\\:bg-input:where([data-unchecked]:not([data-unchecked=false])){background-color:var(--input)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=unchecked]),.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=unchecked]),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=unchecked]),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=unchecked]),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-unchecked]:not([data-unchecked=false])){--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:data-unchecked\\:bg-foreground:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-foreground:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:var(--foreground)}.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:data-selected\\:bg-muted:where([data-selected=true]),.tw\\:data-selected\\:bg-muted\\/50:where([data-selected=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:bg-muted\\/50:where([data-selected=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:data-selected\\:bg-primary:where([data-selected=true]){background-color:var(--primary)}.tw\\:data-selected\\:bg-transparent:where([data-selected=true]){background-color:#0000}.tw\\:data-selected\\:text-foreground:where([data-selected=true]){color:var(--foreground)}.tw\\:data-selected\\:text-inherit:where([data-selected=true]){color:inherit}.tw\\:data-selected\\:text-muted-foreground\\/50:where([data-selected=true]){color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:text-muted-foreground\\/50:where([data-selected=true]){color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.tw\\:data-selected\\:text-primary-foreground:where([data-selected=true]){color:var(--primary-foreground)}.tw\\:data-selected\\:ring-2:where([data-selected=true]){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-selected\\:ring-primary-foreground\\/70:where([data-selected=true]){--tw-ring-color:var(--primary-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:ring-primary-foreground\\/70:where([data-selected=true]){--tw-ring-color:color-mix(in oklab, var(--primary-foreground) 70%, transparent)}}.tw\\:data-selected\\:ring-ring\\/50:where([data-selected=true]){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:ring-ring\\/50:where([data-selected=true]){--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:data-selected\\:ring-inset:where([data-selected=true]){--tw-ring-inset:inset}@media (forced-colors:active){.tw\\:forced-colors\\:data-selected\\:outline-2:where([data-selected=true]){outline-style:var(--tw-outline-style);outline-width:2px}.tw\\:forced-colors\\:data-selected\\:-outline-offset-2:where([data-selected=true]){outline-offset:calc(2px * -1)}.tw\\:forced-colors\\:data-selected\\:outline-\\[color\\:Highlight\\]:where([data-selected=true]){outline-color:highlight}}.tw\\:data-disabled\\:pointer-events-none:where([data-disabled=true]),.tw\\:data-disabled\\:pointer-events-none:where([data-disabled]:not([data-disabled=false])){pointer-events:none}.tw\\:data-disabled\\:cursor-not-allowed:where([data-disabled=true]),.tw\\:data-disabled\\:cursor-not-allowed:where([data-disabled]:not([data-disabled=false])){cursor:not-allowed}.tw\\:data-disabled\\:opacity-50:where([data-disabled=true]),.tw\\:data-disabled\\:opacity-50:where([data-disabled]:not([data-disabled=false])){opacity:.5}.tw\\:data-active\\:bg-background:where([data-state=active]),.tw\\:data-active\\:bg-background:where([data-active]:not([data-active=false])){background-color:var(--background)}.tw\\:data-active\\:bg-sidebar-accent:where([data-state=active]),.tw\\:data-active\\:bg-sidebar-accent:where([data-active]:not([data-active=false])){background-color:var(--sidebar-accent)}.tw\\:data-active\\:font-medium:where([data-state=active]),.tw\\:data-active\\:font-medium:where([data-active]:not([data-active=false])){--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:data-active\\:text-foreground:where([data-state=active]),.tw\\:data-active\\:text-foreground:where([data-active]:not([data-active=false])){color:var(--foreground)}.tw\\:data-active\\:text-sidebar-accent-foreground:where([data-state=active]),.tw\\:data-active\\:text-sidebar-accent-foreground:where([data-active]:not([data-active=false])){color:var(--sidebar-accent-foreground)}.tw\\:group-data-\\[variant\\=default\\]\\/tabs-list\\:data-active\\:shadow-sm:is(:where(.tw\\:group\\/tabs-list)[data-variant=default] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=default\\]\\/tabs-list\\:data-active\\:shadow-sm:is(:where(.tw\\:group\\/tabs-list)[data-variant=default] *):where([data-active]:not([data-active=false])){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:shadow-none:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:shadow-none:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:is(.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:after\\:opacity-100:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:after\\:opacity-100:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false]))):after{content:var(--tw-content);opacity:1}.tw\\:dark\\:data-active\\:border-input:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:border-input:is(.dark *):where([data-active]:not([data-active=false])){border-color:var(--input)}.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:dark\\:data-active\\:text-foreground:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:text-foreground:is(.dark *):where([data-active]:not([data-active=false])){color:var(--foreground)}.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:border-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:border-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){border-color:#0000}.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.tw\\:data-horizontal\\:mx-px:where([data-orientation=horizontal]){margin-inline:1px}.tw\\:data-horizontal\\:h-1:where([data-orientation=horizontal]){height:calc(calc(var(--spacing)) * 1)}.tw\\:data-horizontal\\:h-full:where([data-orientation=horizontal]){height:100%}.tw\\:data-horizontal\\:h-px:where([data-orientation=horizontal]){height:1px}.tw\\:data-horizontal\\:w-auto:where([data-orientation=horizontal]){width:auto}.tw\\:data-horizontal\\:w-full:where([data-orientation=horizontal]){width:100%}.tw\\:data-horizontal\\:flex-col:where([data-orientation=horizontal]){flex-direction:column}.tw\\:data-vertical\\:my-px:where([data-orientation=vertical]){margin-block:1px}.tw\\:data-vertical\\:h-auto:where([data-orientation=vertical]){height:auto}.tw\\:data-vertical\\:h-full:where([data-orientation=vertical]){height:100%}.tw\\:data-vertical\\:min-h-40:where([data-orientation=vertical]){min-height:calc(calc(var(--spacing)) * 40)}.tw\\:data-vertical\\:w-1:where([data-orientation=vertical]){width:calc(calc(var(--spacing)) * 1)}.tw\\:data-vertical\\:w-auto:where([data-orientation=vertical]){width:auto}.tw\\:data-vertical\\:w-full:where([data-orientation=vertical]){width:100%}.tw\\:data-vertical\\:w-px:where([data-orientation=vertical]){width:1px}.tw\\:data-vertical\\:flex-col:where([data-orientation=vertical]){flex-direction:column}.tw\\:data-vertical\\:items-stretch:where([data-orientation=vertical]){align-items:stretch}.tw\\:data-vertical\\:self-stretch:where([data-orientation=vertical]){align-self:stretch}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:mt-0 [data-lexical-editor=true]>blockquote{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:border-s-0 [data-lexical-editor=true]>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:ps-0 [data-lexical-editor=true]>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:font-normal [data-lexical-editor=true]>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:text-foreground [data-lexical-editor=true]>blockquote{color:var(--foreground)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:not-italic [data-lexical-editor=true]>blockquote{font-style:normal}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:mt-0 [data-lexical-editor=\\"true\\"]>blockquote{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:border-s-0 [data-lexical-editor=\\"true\\"]>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:ps-0 [data-lexical-editor=\\"true\\"]>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:font-normal [data-lexical-editor=\\"true\\"]>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:text-foreground [data-lexical-editor=\\"true\\"]>blockquote{color:var(--foreground)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:not-italic [data-lexical-editor=\\"true\\"]>blockquote{font-style:normal}.tw\\:\\[\\&_a\\]\\:underline a{text-decoration-line:underline}.tw\\:\\[\\&_a\\]\\:underline-offset-3 a{text-underline-offset:3px}@media (hover:hover){.tw\\:\\[\\&_a\\]\\:hover\\:text-foreground a:hover{color:var(--foreground)}}.tw\\:\\[\\&_p\\]\\:my-0 p{margin-block:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_p\\:not\\(\\:last-child\\)\\]\\:mb-4 p:not(:last-child){margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_s\\]\\:text-destructive s{color:var(--destructive)}.tw\\:\\[\\&_s\\]\\:line-through s{text-decoration-line:line-through}.tw\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.tw\\:\\[\\&_svg\\]\\:size-4 svg{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3\\.5 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_tr\\]\\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.tw\\:\\[\\&_tr\\:last-child\\]\\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.tw\\:\\[\\&_u\\]\\:font-semibold u{--tw-font-weight:var(--tw-font-weight-semibold);font-weight:var(--tw-font-weight-semibold)}.tw\\:\\[\\&_u\\]\\:text-success-foreground u{color:var(--success-foreground)}.tw\\:\\[\\&_u\\]\\:no-underline u{text-decoration-line:none}.tw\\:\\[\\&\\:has\\(\\[role\\=checkbox\\]\\)\\]\\:pe-0:has([role=checkbox]){padding-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\.border-b\\]\\:pb-2.border-b{padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:\\[\\.border-b\\]\\:pb-4.border-b{padding-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:\\[\\.border-b\\]\\:pb-3:is(:where(.tw\\:group\\/card)[data-size=sm] *).border-b{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:\\[\\.border-t\\]\\:pt-2.border-t{padding-top:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:px-2 *)[cmdk-group-heading]{padding-inline:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:py-1\\.5 *)[cmdk-group-heading]{padding-block:calc(calc(var(--spacing)) * 1.5)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:text-xs *)[cmdk-group-heading]{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:font-medium *)[cmdk-group-heading]{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:text-muted-foreground *)[cmdk-group-heading]{color:var(--muted-foreground)}:is(.tw\\:\\*\\:\\[a\\]\\:underline>*):is(a){text-decoration-line:underline}:is(.tw\\:\\*\\:\\[a\\]\\:underline-offset-3>*):is(a){text-underline-offset:3px}@media (hover:hover){.tw\\:\\[a\\]\\:hover\\:bg-destructive\\/20:is(a):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-destructive\\/20:is(a):hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:\\[a\\]\\:hover\\:bg-muted:is(a):hover{background-color:var(--muted)}.tw\\:\\[a\\]\\:hover\\:bg-primary\\/80:is(a):hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-primary\\/80:is(a):hover{background-color:color-mix(in oklab, var(--primary) 80%, transparent)}}.tw\\:\\[a\\]\\:hover\\:bg-secondary\\/80:is(a):hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-secondary\\/80:is(a):hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.tw\\:\\[a\\]\\:hover\\:text-muted-foreground:is(a):hover{color:var(--muted-foreground)}:is(.tw\\:\\*\\:\\[a\\]\\:hover\\:text-foreground>*):is(a):hover{color:var(--foreground)}}:is(.tw\\:\\*\\:\\[img\\]\\:row-span-2>*):is(img){grid-row:span 2/span 2}:is(.tw\\:\\*\\:\\[img\\]\\:translate-y-0\\.5>*):is(img){--tw-translate-y:calc(calc(var(--spacing)) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.tw\\:\\*\\:\\[img\\]\\:text-current>*):is(img){color:currentColor}:is(.tw\\:\\*\\:\\[img\\:first-child\\]\\:rounded-t-xl>*):is(img:first-child){border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}:is(.tw\\:\\*\\:\\[img\\:last-child\\]\\:rounded-b-xl>*):is(img:last-child){border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}:is(.tw\\:\\*\\:\\[img\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>*):is(img:not([class*=size-])){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:flex>*):is(span):last-child{display:flex}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:items-center>*):is(span):last-child{align-items:center}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:gap-2>*):is(span):last-child{gap:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\:\\[svg\\]\\:row-span-2>*):is(svg){grid-row:span 2/span 2}:is(.tw\\:\\*\\:\\[svg\\]\\:translate-y-0\\.5>*):is(svg){--tw-translate-y:calc(calc(var(--spacing)) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.tw\\:\\*\\:\\[svg\\]\\:text-current>*):is(svg){color:currentColor}:is(.tw\\:focus\\:\\*\\:\\[svg\\]\\:text-accent-foreground:focus>*):is(svg){color:var(--accent-foreground)}:is(.tw\\:data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:text-destructive[data-variant=destructive]>*):is(svg){color:var(--destructive)}:is(.tw\\:data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:text-destructive\\![data-variant=destructive]>*):is(svg){color:var(--destructive)!important}:is(.tw\\:data-selected\\:\\*\\:\\[svg\\]\\:text-foreground:where([data-selected=true])>*):is(svg){color:var(--foreground)}:is(.tw\\:\\*\\:\\[svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>*):is(svg:not([class*=size-])){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-s-none>:not(:first-child){border-start-start-radius:0;border-end-start-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-t-none>:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-s-0>:not(:first-child){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-t-0>:not(:first-child){border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-e-none>:not(:last-child){border-start-end-radius:0;border-end-end-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-b-none>:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.tw\\:has-\\[select\\[aria-hidden\\=true\\]\\:last-child\\]\\:\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:last-of-type\\]\\:rounded-e-lg:has(:is(select[aria-hidden=true]:last-child))>[data-slot=select-trigger]:last-of-type{border-start-end-radius:var(--radius);border-end-end-radius:var(--radius)}.tw\\:\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:not\\(\\[class\\*\\=w-\\]\\)\\]\\:w-fit>[data-slot=select-trigger]:not([class*=w-]){width:fit-content}.tw\\:\\[\\&\\>\\[data-slot\\]\\:not\\(\\:has\\(\\~\\[data-slot\\]\\)\\)\\]\\:rounded-e-lg\\!>[data-slot]:not(:has(~[data-slot])){border-start-end-radius:var(--radius)!important;border-end-end-radius:var(--radius)!important}.tw\\:\\[\\&\\>\\[data-slot\\]\\:not\\(\\:has\\(\\~\\[data-slot\\]\\)\\)\\]\\:rounded-b-lg\\!>[data-slot]:not(:has(~[data-slot])){border-bottom-right-radius:var(--radius)!important;border-bottom-left-radius:var(--radius)!important}.tw\\:\\[\\&\\>a\\]\\:underline>a{text-decoration-line:underline}.tw\\:\\[\\&\\>a\\]\\:underline-offset-4>a{text-underline-offset:4px}.tw\\:\\[\\&\\>a\\:hover\\]\\:text-primary>a:hover{color:var(--primary)}.tw\\:\\[\\&\\>blockquote\\]\\:my-0>blockquote{margin-block:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:border-s-0>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&\\>blockquote\\]\\:p-0>blockquote{padding:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:ps-0>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:font-normal>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&\\>blockquote\\]\\:text-foreground>blockquote{color:var(--foreground)}.tw\\:\\[\\&\\>blockquote\\]\\:not-italic>blockquote{font-style:normal}.tw\\:\\[\\&\\>input\\]\\:flex-1>input{flex:1}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:\\[\\&\\>input\\]\\:pt-3:has(>[data-align=block-end])>input{padding-top:calc(calc(var(--spacing)) * 3)}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:\\[\\&\\>input\\]\\:pb-3:has(>[data-align=block-start])>input{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:has-\\[\\>\\[data-align\\=inline-end\\]\\]\\:\\[\\&\\>input\\]\\:pe-1\\.5:has(>[data-align=inline-end])>input{padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-\\[\\>\\[data-align\\=inline-start\\]\\]\\:\\[\\&\\>input\\]\\:ps-1\\.5:has(>[data-align=inline-start])>input{padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:\\[\\&\\>kbd\\]\\:rounded-\\[calc\\(var\\(--radius\\)-5px\\)\\]>kbd{border-radius:calc(var(--radius) - 5px)}.tw\\:\\[\\&\\>li\\]\\:mt-2>li{margin-top:calc(calc(var(--spacing)) * 2)}.tw\\:\\[\\&\\>span\\:last-child\\]\\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tw\\:\\[\\&\\>svg\\]\\:pointer-events-none>svg{pointer-events:none}.tw\\:\\[\\&\\>svg\\]\\:hidden>svg{display:none}.tw\\:\\[\\&\\>svg\\]\\:size-3\\!>svg{width:calc(calc(var(--spacing)) * 3)!important;height:calc(calc(var(--spacing)) * 3)!important}.tw\\:\\[\\&\\>svg\\]\\:size-3\\.5>svg{width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&\\>svg\\]\\:size-4>svg{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>svg\\]\\:shrink-0>svg{flex-shrink:0}.tw\\:\\[\\&\\>svg\\]\\:text-sidebar-accent-foreground>svg{color:var(--sidebar-accent-foreground)}.tw\\:group-has-data-\\[size\\=lg\\]\\/avatar-group\\:\\[\\&\\>svg\\]\\:size-5:is(:where(.tw\\:group\\/avatar-group):has([data-size=lg]) *)>svg{width:calc(calc(var(--spacing)) * 5);height:calc(calc(var(--spacing)) * 5)}.tw\\:group-has-data-\\[size\\=sm\\]\\/avatar-group\\:\\[\\&\\>svg\\]\\:size-3:is(:where(.tw\\:group\\/avatar-group):has([data-size=sm]) *)>svg{width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=default\\]\\/avatar\\:\\[\\&\\>svg\\]\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=default] *)>svg,.tw\\:group-data-\\[size\\=lg\\]\\/avatar\\:\\[\\&\\>svg\\]\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=lg] *)>svg{width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:\\[\\&\\>svg\\]\\:hidden:is(:where(.tw\\:group\\/avatar)[data-size=sm] *)>svg,.tw\\:\\[\\&\\>svg\\:last-child\\]\\:hidden>svg:last-child{display:none}.tw\\:\\[\\&\\>svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3\\.5>svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&\\>svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>tr\\]\\:last\\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:\\[\\&\\[align\\=center\\]\\]\\:text-center[align=center]{text-align:center}.tw\\:\\[\\&\\[align\\=right\\]\\]\\:text-right[align=right]{text-align:right}.tw\\:\\[\\&\\[aria-orientation\\=horizontal\\]\\>div\\]\\:rotate-90[aria-orientation=horizontal]>div{rotate:90deg}[data-side=primary][data-collapsible=offcanvas] .tw\\:\\[\\[data-side\\=primary\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-end-2{inset-inline-end:calc(calc(var(--spacing)) * -2)}[data-side=primary][data-state=collapsed] .tw\\:\\[\\[data-side\\=primary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-e-resize{cursor:e-resize}[data-side=primary][data-state=collapsed] .tw\\:rtl\\:\\[\\[data-side\\=primary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-w-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:w-resize}[data-side=secondary][data-collapsible=offcanvas] .tw\\:\\[\\[data-side\\=secondary\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-start-2{inset-inline-start:calc(calc(var(--spacing)) * -2)}[data-side=secondary][data-state=collapsed] .tw\\:\\[\\[data-side\\=secondary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-w-resize{cursor:w-resize}[data-side=secondary][data-state=collapsed] .tw\\:rtl\\:\\[\\[data-side\\=secondary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-e-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:e-resize}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-cyrillic-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-cyrillic-wght-normal.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-greek-wght-normal.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-vietnamese-wght-normal.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-latin-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-latin-wght-normal.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}.light,:root{--radius:.625rem;--spacing:.25rem;--background:oklch(100% 0 0);--foreground:oklch(13.71% .036 258.53);--card:oklch(100% 0 0);--card-foreground:oklch(13.71% .036 258.53);--popover:oklch(98.43% .0018 248.56);--popover-foreground:oklch(13.71% .036 258.53);--primary:oklch(20.79% .0399 265.73);--primary-foreground:oklch(98.38% .0036 248.23);--secondary:oklch(95.89% .011 248.06);--secondary-foreground:oklch(20.79% .0399 265.73);--muted:oklch(95.89% .011 248.06);--muted-foreground:oklch(55.47% .0408 257.45);--accent:oklch(95.89% .011 248.06);--accent-foreground:oklch(20.79% .0399 265.73);--destructive:oklch(63.69% .2077 25.32);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(62.7% .194 149.214);--diff-deleted:oklch(57.7% .245 27.325);--warning:oklch(84% .16 84);--warning-foreground:oklch(28% .07 46);--border:oklch(92.9% .0127 255.58);--input:oklch(92.9% .0127 255.58);--ring:oklch(13.71% .036 258.53);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.43% .0018 248.56);--sidebar-foreground:oklch(13.71% .036 258.53);--sidebar-primary:oklch(20.79% .0399 265.73);--sidebar-primary-foreground:oklch(98.38% .0036 248.23);--sidebar-accent:oklch(95.89% .011 248.06);--sidebar-accent-foreground:oklch(20.79% .0399 265.73);--sidebar-border:oklch(92.9% .0127 255.58);--sidebar-ring:oklch(13.71% .036 258.53)}.dark{--background:oklch(13.71% .036 258.53);--foreground:oklch(98.38% .0036 248.23);--card:oklch(13.71% .036 258.53);--card-foreground:oklch(98.38% .0036 248.23);--popover:oklch(13.71% .036 258.53);--popover-foreground:oklch(98.38% .0036 248.23);--primary:oklch(98.38% .0036 248.23);--primary-foreground:oklch(20.79% .0399 265.73);--secondary:oklch(28% .037 259.98);--secondary-foreground:oklch(98.38% .0036 248.23);--muted:oklch(28% .037 259.98);--muted-foreground:oklch(71.07% .0351 256.8);--accent:oklch(28% .037 259.98);--accent-foreground:oklch(98.38% .0036 248.23);--destructive:oklch(39.6% .1331 25.71);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(79.2% .209 151.711);--diff-deleted:oklch(70.4% .191 22.216);--warning:oklch(41% .11 46);--warning-foreground:oklch(99% .02 95);--border:oklch(44.54% .0374 257.3);--input:oklch(44.54% .0374 257.3);--ring:oklch(86.88% .0199 252.89);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(13.71% .036 258.53);--sidebar-foreground:oklch(71.07% .0351 256.8);--sidebar-primary:oklch(98.38% .0036 248.23);--sidebar-primary-foreground:oklch(20.79% .0399 265.73);--sidebar-accent:oklch(28% .037 259.98);--sidebar-accent-foreground:oklch(71.07% .0351 256.8);--sidebar-border:oklch(28% .037 259.98);--sidebar-ring:oklch(86.88% .0199 252.89)}.paratext-light{--background:oklch(100% 0 0);--foreground:oklch(15.3% .006 107.1);--card:oklch(100% 0 0);--card-foreground:oklch(15.3% .006 107.1);--popover:oklch(100% 0 0);--popover-foreground:oklch(15.3% .006 107.1);--primary:oklch(55.5% .163 48.998);--primary-foreground:oklch(98.7% .022 95.277);--secondary:oklch(96.7% .001 286.375);--secondary-foreground:oklch(21% .006 285.885);--muted:oklch(96.6% .005 106.5);--muted-foreground:oklch(58% .031 107.3);--accent:oklch(96.6% .005 106.5);--accent-foreground:oklch(22.8% .013 107.4);--destructive:oklch(57.7% .245 27.325);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(62.7% .194 149.214);--diff-deleted:oklch(57.7% .245 27.325);--warning:oklch(84% .16 84);--warning-foreground:oklch(28% .07 46);--border:oklch(93% .007 106.5);--input:oklch(93% .007 106.5);--ring:oklch(73.7% .021 106.9);--chart-1:oklch(88% .011 106.6);--chart-2:oklch(58% .031 107.3);--chart-3:oklch(46.6% .025 107.3);--chart-4:oklch(39.4% .023 107.4);--chart-5:oklch(28.6% .016 107.4);--sidebar:oklch(98.8% .003 106.5);--sidebar-foreground:oklch(15.3% .006 107.1);--sidebar-primary:oklch(66.6% .179 58.318);--sidebar-primary-foreground:oklch(98.7% .022 95.277);--sidebar-accent:oklch(96.6% .005 106.5);--sidebar-accent-foreground:oklch(22.8% .013 107.4);--sidebar-border:oklch(93% .007 106.5);--sidebar-ring:oklch(73.7% .021 106.9)}.paratext-dark{--background:oklch(15.3% .006 107.1);--foreground:oklch(98.8% .003 106.5);--card:oklch(22.8% .013 107.4);--card-foreground:oklch(98.8% .003 106.5);--popover:oklch(22.8% .013 107.4);--popover-foreground:oklch(98.8% .003 106.5);--primary:oklch(47.3% .137 46.201);--primary-foreground:oklch(98.7% .022 95.277);--secondary:oklch(27.4% .006 286.033);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(28.6% .016 107.4);--muted-foreground:oklch(73.7% .021 106.9);--accent:oklch(28.6% .016 107.4);--accent-foreground:oklch(98.8% .003 106.5);--destructive:oklch(70.4% .191 22.216);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(79.2% .209 151.711);--diff-deleted:oklch(70.4% .191 22.216);--warning:oklch(41% .11 46);--warning-foreground:oklch(99% .02 95);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(58% .031 107.3);--chart-1:oklch(88% .011 106.6);--chart-2:oklch(58% .031 107.3);--chart-3:oklch(46.6% .025 107.3);--chart-4:oklch(39.4% .023 107.4);--chart-5:oklch(28.6% .016 107.4);--sidebar:oklch(22.8% .013 107.4);--sidebar-foreground:oklch(98.8% .003 106.5);--sidebar-primary:oklch(76.9% .188 70.08);--sidebar-primary-foreground:oklch(27.9% .077 45.635);--sidebar-accent:oklch(28.6% .016 107.4);--sidebar-accent-foreground:oklch(98.8% .003 106.5);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(58% .031 107.3)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}} +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--tw-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--tw-color-red-100:oklch(93.6% .032 17.717);--tw-color-red-200:oklch(88.5% .062 18.334);--tw-color-red-300:oklch(80.8% .114 19.571);--tw-color-red-400:oklch(70.4% .191 22.216);--tw-color-red-500:oklch(63.7% .237 25.331);--tw-color-red-600:oklch(57.7% .245 27.325);--tw-color-red-700:oklch(50.5% .213 27.518);--tw-color-red-800:oklch(44.4% .177 26.899);--tw-color-orange-100:oklch(95.4% .038 75.164);--tw-color-orange-800:oklch(47% .157 37.304);--tw-color-amber-200:oklch(92.4% .12 95.746);--tw-color-amber-400:oklch(82.8% .189 84.429);--tw-color-amber-500:oklch(76.9% .188 70.08);--tw-color-amber-600:oklch(66.6% .179 58.318);--tw-color-yellow-50:oklch(98.7% .026 102.212);--tw-color-yellow-100:oklch(97.3% .071 103.193);--tw-color-yellow-400:oklch(85.2% .199 91.936);--tw-color-yellow-500:oklch(79.5% .184 86.047);--tw-color-yellow-600:oklch(68.1% .162 75.834);--tw-color-yellow-700:oklch(55.4% .135 66.442);--tw-color-green-50:oklch(98.2% .018 155.826);--tw-color-green-100:oklch(96.2% .044 156.743);--tw-color-green-500:oklch(72.3% .219 149.579);--tw-color-green-600:oklch(62.7% .194 149.214);--tw-color-green-700:oklch(52.7% .154 150.069);--tw-color-green-800:oklch(44.8% .119 151.328);--tw-color-teal-400:oklch(77.7% .152 181.912);--tw-color-teal-500:oklch(70.4% .14 182.503);--tw-color-teal-600:oklch(60% .118 184.704);--tw-color-sky-400:oklch(74.6% .16 232.661);--tw-color-sky-500:oklch(68.5% .169 237.323);--tw-color-sky-600:oklch(58.8% .158 241.966);--tw-color-blue-50:oklch(97% .014 254.604);--tw-color-blue-100:oklch(93.2% .032 255.585);--tw-color-blue-400:oklch(70.7% .165 254.624);--tw-color-blue-500:oklch(62.3% .214 259.815);--tw-color-blue-600:oklch(54.6% .245 262.881);--tw-color-blue-800:oklch(42.4% .199 265.638);--tw-color-indigo-200:oklch(87% .065 274.039);--tw-color-purple-50:oklch(97.7% .014 308.299);--tw-color-purple-200:oklch(90.2% .063 306.703);--tw-color-purple-900:oklch(38.1% .176 304.987);--tw-color-rose-400:oklch(71.2% .194 13.428);--tw-color-rose-500:oklch(64.5% .246 16.439);--tw-color-rose-600:oklch(58.6% .253 17.585);--tw-color-slate-300:oklch(86.9% .022 252.894);--tw-color-slate-400:oklch(70.4% .04 256.788);--tw-color-slate-900:oklch(20.8% .042 265.755);--tw-color-gray-50:oklch(98.5% .002 247.839);--tw-color-gray-100:oklch(96.7% .003 264.542);--tw-color-gray-300:oklch(87.2% .01 258.338);--tw-color-gray-500:oklch(55.1% .027 264.364);--tw-color-gray-600:oklch(44.6% .03 256.802);--tw-color-gray-700:oklch(37.3% .034 259.733);--tw-color-gray-800:oklch(27.8% .033 256.848);--tw-color-zinc-400:oklch(70.5% .015 286.067);--tw-color-neutral-300:oklch(87% 0 0);--tw-color-black:#000;--tw-color-white:#fff;--tw-container-xs:20rem;--tw-container-sm:24rem;--tw-container-md:28rem;--tw-container-lg:32rem;--tw-container-2xl:42rem;--tw-container-3xl:48rem;--tw-container-4xl:56rem;--tw-container-6xl:72rem;--tw-text-xs:.75rem;--tw-text-xs--line-height:calc(1 / .75);--tw-text-sm:.875rem;--tw-text-sm--line-height:calc(1.25 / .875);--tw-text-base:1rem;--tw-text-base--line-height:calc(1.5 / 1);--tw-text-lg:1.125rem;--tw-text-lg--line-height:calc(1.75 / 1.125);--tw-text-xl:1.25rem;--tw-text-xl--line-height:calc(1.75 / 1.25);--tw-text-2xl:1.5rem;--tw-text-2xl--line-height:calc(2 / 1.5);--tw-text-3xl:1.875rem;--tw-text-3xl--line-height:calc(2.25 / 1.875);--tw-text-4xl:2.25rem;--tw-text-4xl--line-height:calc(2.5 / 2.25);--tw-text-5xl:3rem;--tw-text-5xl--line-height:1;--tw-font-weight-normal:400;--tw-font-weight-medium:500;--tw-font-weight-semibold:600;--tw-font-weight-bold:700;--tw-font-weight-extrabold:800;--tw-tracking-tight:-.025em;--tw-tracking-wider:.05em;--tw-tracking-widest:.1em;--tw-leading-tight:1.25;--tw-leading-snug:1.375;--tw-leading-relaxed:1.625;--tw-leading-loose:2;--tw-radius-xs:.125rem;--tw-radius-md:calc(var(--radius) * .8);--tw-drop-shadow-sm:0 1px 2px #00000026;--tw-animate-spin:spin 1s linear infinite;--tw-animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--tw-blur-xs:4px;--tw-blur-2xl:40px;--tw-default-transition-duration:.15s;--tw-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--tw-default-font-family:"IBM Plex Sans Variable", sans-serif;--tw-default-mono-font-family:var(--tw-font-mono)}}@layer base{.pr-twp,.pr-twp *{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.pr-twp,.pr-twp *{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body.pr-twp{background-color:var(--background);color:var(--foreground)}html.pr-twp{font-family:IBM Plex Sans Variable,sans-serif}:where(.pr-twp,.pr-twp *),:where(.pr-twp,.pr-twp *):after,:where(.pr-twp,.pr-twp *):before,:where(.pr-twp,.pr-twp *) ::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}:where(.pr-twp,.pr-twp *) ::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}.pr-twp{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--tw-default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--tw-default-font-feature-settings,normal);font-variation-settings:var(--tw-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr:where(.pr-twp,.pr-twp *){height:0;color:inherit;border-top-width:1px}abbr:where([title]):where(.pr-twp,.pr-twp *){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1:where(.pr-twp,.pr-twp *),h2:where(.pr-twp,.pr-twp *),h3:where(.pr-twp,.pr-twp *),h4:where(.pr-twp,.pr-twp *),h5:where(.pr-twp,.pr-twp *),h6:where(.pr-twp,.pr-twp *){font-size:inherit;font-weight:inherit}a:where(.pr-twp,.pr-twp *){color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b:where(.pr-twp,.pr-twp *),strong:where(.pr-twp,.pr-twp *){font-weight:bolder}code:where(.pr-twp,.pr-twp *),kbd:where(.pr-twp,.pr-twp *),samp:where(.pr-twp,.pr-twp *),pre:where(.pr-twp,.pr-twp *){font-family:var(--tw-default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--tw-default-mono-font-feature-settings,normal);font-variation-settings:var(--tw-default-mono-font-variation-settings,normal);font-size:1em}small:where(.pr-twp,.pr-twp *){font-size:80%}sub:where(.pr-twp,.pr-twp *),sup:where(.pr-twp,.pr-twp *){vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub:where(.pr-twp,.pr-twp *){bottom:-.25em}sup:where(.pr-twp,.pr-twp *){top:-.5em}table:where(.pr-twp,.pr-twp *){text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(.pr-twp,.pr-twp *){outline:auto}progress:where(.pr-twp,.pr-twp *){vertical-align:baseline}summary:where(.pr-twp,.pr-twp *){display:list-item}ol:where(.pr-twp,.pr-twp *),ul:where(.pr-twp,.pr-twp *),menu:where(.pr-twp,.pr-twp *){list-style:none}img:where(.pr-twp,.pr-twp *),svg:where(.pr-twp,.pr-twp *),video:where(.pr-twp,.pr-twp *),canvas:where(.pr-twp,.pr-twp *),audio:where(.pr-twp,.pr-twp *),iframe:where(.pr-twp,.pr-twp *),embed:where(.pr-twp,.pr-twp *),object:where(.pr-twp,.pr-twp *){vertical-align:middle;display:block}img:where(.pr-twp,.pr-twp *),video:where(.pr-twp,.pr-twp *){max-width:100%;height:auto}button:where(.pr-twp,.pr-twp *),input:where(.pr-twp,.pr-twp *),select:where(.pr-twp,.pr-twp *),optgroup:where(.pr-twp,.pr-twp *),textarea:where(.pr-twp,.pr-twp *){font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(.pr-twp,.pr-twp *) ::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup:where(.pr-twp,.pr-twp *){font-weight:bolder}:where(select:is([multiple],[size])) optgroup option:where(.pr-twp,.pr-twp *){padding-inline-start:20px}:where(.pr-twp,.pr-twp *) ::file-selector-button{margin-inline-end:4px}:where(.pr-twp,.pr-twp *) ::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){:where(.pr-twp,.pr-twp *) ::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){:where(.pr-twp,.pr-twp *) ::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea:where(.pr-twp,.pr-twp *){resize:vertical}:where(.pr-twp,.pr-twp *) ::-webkit-search-decoration{-webkit-appearance:none}:where(.pr-twp,.pr-twp *) ::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit{display:inline-flex}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-fields-wrapper{padding:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-year-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-month-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-day-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-hour-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-minute-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-second-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-millisecond-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-meridiem-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid:where(.pr-twp,.pr-twp *){box-shadow:none}button:where(.pr-twp,.pr-twp *),input:where([type=button],[type=reset],[type=submit]):where(.pr-twp,.pr-twp *){appearance:button}:where(.pr-twp,.pr-twp *) ::file-selector-button{appearance:button}:where(.pr-twp,.pr-twp *) ::-webkit-inner-spin-button{height:auto}:where(.pr-twp,.pr-twp *) ::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])):where(.pr-twp,.pr-twp *){display:none!important}}@layer components;@layer utilities{.tw\\:\\@container\\/card-header{container:card-header/inline-size}.tw\\:\\@container\\/search{container:search/inline-size}.tw\\:\\@container\\/toolbar{container:toolbar/inline-size}.tw\\:pointer-events-auto{pointer-events:auto}.tw\\:pointer-events-none{pointer-events:none}.tw\\:invisible{visibility:hidden}.tw\\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.tw\\:absolute{position:absolute}.tw\\:fixed{position:fixed}.tw\\:relative{position:relative}.tw\\:sticky{position:sticky}.tw\\:inset-0{inset:calc(calc(var(--spacing)) * 0)}.tw\\:inset-y-0{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:inset-s-3{inset-inline-start:calc(calc(var(--spacing)) * 3)}.tw\\:start-1\\.5{inset-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:start-1\\/2{inset-inline-start:50%}.tw\\:end-0{inset-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:end-1{inset-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:end-2{inset-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:end-3{inset-inline-end:calc(calc(var(--spacing)) * 3)}.tw\\:inset-e-0{inset-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:-top-\\[1px\\]{top:-1px}.tw\\:top-0{top:calc(calc(var(--spacing)) * 0)}.tw\\:top-1{top:calc(calc(var(--spacing)) * 1)}.tw\\:top-1\\.5{top:calc(calc(var(--spacing)) * 1.5)}.tw\\:top-1\\/2{top:50%}.tw\\:top-1\\/3{top:33.3333%}.tw\\:top-2{top:calc(calc(var(--spacing)) * 2)}.tw\\:top-2\\.5{top:calc(calc(var(--spacing)) * 2.5)}.tw\\:top-3\\.5{top:calc(calc(var(--spacing)) * 3.5)}.tw\\:top-\\[-1px\\]{top:-1px}.tw\\:top-full{top:100%}.tw\\:-right-1{right:calc(calc(var(--spacing)) * -1)}.tw\\:right-0{right:calc(calc(var(--spacing)) * 0)}.tw\\:right-1{right:calc(calc(var(--spacing)) * 1)}.tw\\:right-3{right:calc(calc(var(--spacing)) * 3)}.tw\\:bottom-0{bottom:calc(calc(var(--spacing)) * 0)}.tw\\:-left-\\[1px\\]{left:-1px}.tw\\:left-0{left:calc(calc(var(--spacing)) * 0)}.tw\\:left-1\\/2{left:50%}.tw\\:left-2{left:calc(calc(var(--spacing)) * 2)}.tw\\:left-3{left:calc(calc(var(--spacing)) * 3)}.tw\\:isolate{isolation:isolate}.tw\\:z-10{z-index:10}.tw\\:z-20{z-index:20}.tw\\:z-50{z-index:50}.tw\\:order-first{order:-9999}.tw\\:order-last{order:9999}.tw\\:col-span-1{grid-column:span 1/span 1}.tw\\:col-span-2{grid-column:span 2/span 2}.tw\\:col-span-3{grid-column:span 3/span 3}.tw\\:col-start-1{grid-column-start:1}.tw\\:col-start-2{grid-column-start:2}.tw\\:row-span-2{grid-row:span 2/span 2}.tw\\:row-start-1{grid-row-start:1}.tw\\:row-start-2{grid-row-start:2}.tw\\:m-0{margin:calc(calc(var(--spacing)) * 0)}.tw\\:m-1{margin:calc(calc(var(--spacing)) * 1)}.tw\\:m-2{margin:calc(calc(var(--spacing)) * 2)}.tw\\:-mx-1{margin-inline:calc(calc(var(--spacing)) * -1)}.tw\\:-mx-4{margin-inline:calc(calc(var(--spacing)) * -4)}.tw\\:mx-0{margin-inline:calc(calc(var(--spacing)) * 0)}.tw\\:mx-1{margin-inline:calc(calc(var(--spacing)) * 1)}.tw\\:mx-2{margin-inline:calc(calc(var(--spacing)) * 2)}.tw\\:mx-3\\.5{margin-inline:calc(calc(var(--spacing)) * 3.5)}.tw\\:mx-4{margin-inline:calc(calc(var(--spacing)) * 4)}.tw\\:mx-8{margin-inline:calc(calc(var(--spacing)) * 8)}.tw\\:my-1{margin-block:calc(calc(var(--spacing)) * 1)}.tw\\:my-2\\.5{margin-block:calc(calc(var(--spacing)) * 2.5)}.tw\\:my-4{margin-block:calc(calc(var(--spacing)) * 4)}.tw\\:my-auto{margin-block:auto}.tw\\:ms-1{margin-inline-start:calc(calc(var(--spacing)) * 1)}.tw\\:ms-2{margin-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:ms-5{margin-inline-start:calc(calc(var(--spacing)) * 5)}.tw\\:ms-6{margin-inline-start:calc(calc(var(--spacing)) * 6)}.tw\\:ms-auto{margin-inline-start:auto}.tw\\:me-1{margin-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:me-2{margin-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:prose{color:var(--tw-prose-body);max-width:65ch}.tw\\:prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.tw\\:prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);margin-top:1.2em;margin-bottom:1.2em;font-size:1.25em;line-height:1.6}.tw\\:prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.tw\\:prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.tw\\:prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:decimal}.tw\\:prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.tw\\:prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.tw\\:prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.tw\\:prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.tw\\:prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.tw\\:prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.tw\\:prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.tw\\:prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.tw\\:prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.tw\\:prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:disc}.tw\\:prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.tw\\:prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.tw\\:prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.25em;font-weight:600}.tw\\:prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.tw\\:prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;font-style:italic;font-weight:500}.tw\\:prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.tw\\:prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.tw\\:prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:0;margin-bottom:.888889em;font-size:2.25em;font-weight:800;line-height:1.11111}.tw\\:prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.tw\\:prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:2em;margin-bottom:1em;font-size:1.5em;font-weight:700;line-height:1.33333}.tw\\:prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.tw\\:prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.6em;margin-bottom:.6em;font-size:1.25em;font-weight:600;line-height:1.6}.tw\\:prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.tw\\:prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.5}.tw\\:prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.tw\\:prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em;display:block}.tw\\:prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-kbd);box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%), 0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%);padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;border-radius:.3125rem;padding-inline-start:.375em;font-family:inherit;font-size:.875em;font-weight:500}.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"\`"}.tw\\:prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.tw\\:prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.tw\\:prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);padding-top:.857143em;padding-inline-end:1.14286em;padding-bottom:.857143em;border-radius:.375rem;margin-top:1.71429em;margin-bottom:1.71429em;padding-inline-start:1.14286em;font-size:.875em;font-weight:400;line-height:1.71429;overflow-x:auto}.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit;background-color:#0000;border-width:0;border-radius:0;padding:0}.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.tw\\:prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){table-layout:auto;width:100%;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.71429}.tw\\:prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.tw\\:prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);vertical-align:bottom;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em;font-weight:600}.tw\\:prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.tw\\:prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.tw\\:prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.tw\\:prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.tw\\:prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.tw\\:prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.tw\\:prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);margin-top:.857143em;font-size:.875em;line-height:1.42857}.tw\\:prose{--tw-prose-body:var(--foreground);--tw-prose-headings:var(--foreground);--tw-prose-lead:var(--muted-foreground);--tw-prose-links:var(--primary);--tw-prose-bold:var(--foreground);--tw-prose-counters:var(--muted-foreground);--tw-prose-bullets:var(--muted-foreground);--tw-prose-hr:var(--border);--tw-prose-quotes:var(--foreground);--tw-prose-quote-borders:var(--border);--tw-prose-captions:var(--muted-foreground);--tw-prose-kbd:oklch(21% .034 264.665);--tw-prose-kbd-shadows:NaN NaN NaN;--tw-prose-code:var(--foreground);--tw-prose-pre-code:var(--muted-foreground);--tw-prose-pre-bg:var(--muted);--tw-prose-th-borders:var(--border);--tw-prose-td-borders:var(--border);--tw-prose-invert-body:var(--foreground);--tw-prose-invert-headings:var(--foreground);--tw-prose-invert-lead:var(--muted-foreground);--tw-prose-invert-links:var(--primary);--tw-prose-invert-bold:var(--foreground);--tw-prose-invert-counters:var(--muted-foreground);--tw-prose-invert-bullets:var(--muted-foreground);--tw-prose-invert-hr:var(--border);--tw-prose-invert-quotes:var(--foreground);--tw-prose-invert-quote-borders:var(--border);--tw-prose-invert-captions:var(--muted-foreground);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:var(--foreground);--tw-prose-invert-pre-code:var(--muted-foreground);--tw-prose-invert-pre-bg:var(--muted);--tw-prose-invert-th-borders:var(--border);--tw-prose-invert-td-borders:var(--border);font-size:1rem;line-height:1.75}.tw\\:prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.tw\\:prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.tw\\:prose :where(.tw\\:prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.tw\\:prose :where(.tw\\:prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.tw\\:prose :where(.tw\\:prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.tw\\:prose :where(.tw\\:prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.tw\\:prose :where(.tw\\:prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.tw\\:prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.tw\\:prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.tw\\:prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.tw\\:prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.571429em;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em}.tw\\:prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(.tw\\:prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose :where(.tw\\:prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.tw\\:prose-sm{font-size:.875rem;line-height:1.71429}.tw\\:prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.tw\\:prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.888889em;margin-bottom:.888889em;font-size:1.28571em;line-height:1.55556}.tw\\:prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.33333em;margin-bottom:1.33333em;padding-inline-start:1.11111em}.tw\\:prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:.8em;font-size:2.14286em;line-height:1.2}.tw\\:prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6em;margin-bottom:.8em;font-size:1.42857em;line-height:1.4}.tw\\:prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.55556em;margin-bottom:.444444em;font-size:1.28571em;line-height:1.55556}.tw\\:prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.42857em;margin-bottom:.571429em;line-height:1.42857}.tw\\:prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.142857em;padding-inline-end:.357143em;padding-bottom:.142857em;border-radius:.3125rem;padding-inline-start:.357143em;font-size:.857143em}.tw\\:prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em}.tw\\:prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.tw\\:prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.888889em}.tw\\:prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;border-radius:.25rem;margin-top:1.66667em;margin-bottom:1.66667em;padding-inline-start:1em;font-size:.857143em;line-height:1.66667}.tw\\:prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em;padding-inline-start:1.57143em}.tw\\:prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;margin-bottom:.285714em}.tw\\:prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.428571em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.tw\\:prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.tw\\:prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.tw\\:prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;padding-inline-start:1.57143em}.tw\\:prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.85714em;margin-bottom:2.85714em}.tw\\:prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em;line-height:1.5}.tw\\:prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.tw\\:prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.tw\\:prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.666667em;font-size:.857143em;line-height:1.33333}.tw\\:prose-sm :where(.tw\\:prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose-sm :where(.tw\\:prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.tw\\:-mt-4{margin-top:calc(calc(var(--spacing)) * -4)}.tw\\:mt-0\\.5{margin-top:calc(calc(var(--spacing)) * .5)}.tw\\:mt-1{margin-top:calc(calc(var(--spacing)) * 1)}.tw\\:mt-2{margin-top:calc(calc(var(--spacing)) * 2)}.tw\\:mt-3{margin-top:calc(calc(var(--spacing)) * 3)}.tw\\:mt-4{margin-top:calc(calc(var(--spacing)) * 4)}.tw\\:mt-6{margin-top:calc(calc(var(--spacing)) * 6)}.tw\\:mt-auto{margin-top:auto}.tw\\:mr-1{margin-right:calc(calc(var(--spacing)) * 1)}.tw\\:mr-2{margin-right:calc(calc(var(--spacing)) * 2)}.tw\\:mr-3{margin-right:calc(calc(var(--spacing)) * 3)}.tw\\:-mb-4{margin-bottom:calc(calc(var(--spacing)) * -4)}.tw\\:mb-1{margin-bottom:calc(calc(var(--spacing)) * 1)}.tw\\:mb-2{margin-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:mb-3{margin-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:mb-4{margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:ml-1{margin-left:calc(calc(var(--spacing)) * 1)}.tw\\:ml-2{margin-left:calc(calc(var(--spacing)) * 2)}.tw\\:ml-4{margin-left:calc(calc(var(--spacing)) * 4)}.tw\\:ml-auto{margin-left:auto}.tw\\:box-border{box-sizing:border-box}.tw\\:line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.tw\\:no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.tw\\:no-scrollbar::-webkit-scrollbar{display:none}.tw\\:block{display:block}.tw\\:flex{display:flex}.tw\\:grid{display:grid}.tw\\:hidden{display:none}.tw\\:inline-block{display:inline-block}.tw\\:inline-flex{display:inline-flex}.tw\\:inline-grid{display:inline-grid}.tw\\:field-sizing-content{field-sizing:content}.tw\\:aspect-square{aspect-ratio:1}.tw\\:size-2{width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:size-2\\.5{width:calc(calc(var(--spacing)) * 2.5);height:calc(calc(var(--spacing)) * 2.5)}.tw\\:size-3{width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:size-3\\.5{width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:size-4{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:size-6{width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:size-7{width:calc(calc(var(--spacing)) * 7);height:calc(calc(var(--spacing)) * 7)}.tw\\:size-8{width:calc(calc(var(--spacing)) * 8);height:calc(calc(var(--spacing)) * 8)}.tw\\:size-9{width:calc(calc(var(--spacing)) * 9);height:calc(calc(var(--spacing)) * 9)}.tw\\:size-10{width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:size-full{width:100%;height:100%}.tw\\:h-1{height:calc(calc(var(--spacing)) * 1)}.tw\\:h-2{height:calc(calc(var(--spacing)) * 2)}.tw\\:h-3{height:calc(calc(var(--spacing)) * 3)}.tw\\:h-3\\.5{height:calc(calc(var(--spacing)) * 3.5)}.tw\\:h-4{height:calc(calc(var(--spacing)) * 4)}.tw\\:h-5{height:calc(calc(var(--spacing)) * 5)}.tw\\:h-6{height:calc(calc(var(--spacing)) * 6)}.tw\\:h-7{height:calc(calc(var(--spacing)) * 7)}.tw\\:h-8{height:calc(calc(var(--spacing)) * 8)}.tw\\:h-8\\!{height:calc(calc(var(--spacing)) * 8)!important}.tw\\:h-8\\.5{height:calc(calc(var(--spacing)) * 8.5)}.tw\\:h-9{height:calc(calc(var(--spacing)) * 9)}.tw\\:h-10{height:calc(calc(var(--spacing)) * 10)}.tw\\:h-12{height:calc(calc(var(--spacing)) * 12)}.tw\\:h-14{height:calc(calc(var(--spacing)) * 14)}.tw\\:h-20{height:calc(calc(var(--spacing)) * 20)}.tw\\:h-24{height:calc(calc(var(--spacing)) * 24)}.tw\\:h-32{height:calc(calc(var(--spacing)) * 32)}.tw\\:h-40{height:calc(calc(var(--spacing)) * 40)}.tw\\:h-64{height:calc(calc(var(--spacing)) * 64)}.tw\\:h-80{height:calc(calc(var(--spacing)) * 80)}.tw\\:h-96{height:calc(calc(var(--spacing)) * 96)}.tw\\:h-\\[5px\\]{height:5px}.tw\\:h-\\[260px\\]{height:260px}.tw\\:h-\\[300px\\]{height:300px}.tw\\:h-\\[400px\\]{height:400px}.tw\\:h-\\[600px\\]{height:600px}.tw\\:h-\\[calc\\(100\\%-1px\\)\\]{height:calc(100% - 1px)}.tw\\:h-\\[calc\\(100\\%-2px\\)\\]{height:calc(100% - 2px)}.tw\\:h-auto{height:auto}.tw\\:h-full{height:100%}.tw\\:h-px{height:1px}.tw\\:h-screen{height:100vh}.tw\\:h-svh{height:100svh}.tw\\:max-h-\\(--radix-context-menu-content-available-height\\){max-height:var(--radix-context-menu-content-available-height)}.tw\\:max-h-\\(--radix-dropdown-menu-content-available-height\\){max-height:var(--radix-dropdown-menu-content-available-height)}.tw\\:max-h-\\(--radix-popover-content-available-height\\){max-height:var(--radix-popover-content-available-height)}.tw\\:max-h-\\(--radix-select-content-available-height\\){max-height:var(--radix-select-content-available-height)}.tw\\:max-h-5{max-height:calc(calc(var(--spacing)) * 5)}.tw\\:max-h-10{max-height:calc(calc(var(--spacing)) * 10)}.tw\\:max-h-72{max-height:calc(calc(var(--spacing)) * 72)}.tw\\:max-h-80{max-height:calc(calc(var(--spacing)) * 80)}.tw\\:max-h-\\[96\\%\\]{max-height:96%}.tw\\:max-h-\\[300px\\]{max-height:300px}.tw\\:max-h-\\[calc\\(var\\(--radix-dropdown-menu-content-available-height\\,100vh\\)\\/var\\(--platform-content-zoom-popup-factor\\,1\\)\\)\\]{max-height:calc(var(--radix-dropdown-menu-content-available-height,100vh) / var(--platform-content-zoom-popup-factor,1))}.tw\\:max-h-\\[calc\\(var\\(--radix-popover-content-available-height\\,100vh\\)\\/var\\(--platform-content-zoom-popup-factor\\,1\\)\\)\\]{max-height:calc(var(--radix-popover-content-available-height,100vh) / var(--platform-content-zoom-popup-factor,1))}.tw\\:min-h-0{min-height:calc(calc(var(--spacing)) * 0)}.tw\\:min-h-11{min-height:calc(calc(var(--spacing)) * 11)}.tw\\:min-h-16{min-height:calc(calc(var(--spacing)) * 16)}.tw\\:min-h-\\[200px\\]{min-height:200px}.tw\\:min-h-full{min-height:100%}.tw\\:min-h-svh{min-height:100svh}.tw\\:w-\\(--radix-dropdown-menu-trigger-width\\){width:var(--radix-dropdown-menu-trigger-width)}.tw\\:w-\\(--sidebar-width\\){width:var(--sidebar-width)}.tw\\:w-1{width:calc(calc(var(--spacing)) * 1)}.tw\\:w-1\\/2{width:50%}.tw\\:w-1\\/4{width:25%}.tw\\:w-1\\/6{width:16.6667%}.tw\\:w-2{width:calc(calc(var(--spacing)) * 2)}.tw\\:w-3{width:calc(calc(var(--spacing)) * 3)}.tw\\:w-3\\.5{width:calc(calc(var(--spacing)) * 3.5)}.tw\\:w-3\\/4{width:75%}.tw\\:w-4{width:calc(calc(var(--spacing)) * 4)}.tw\\:w-4\\/5{width:80%}.tw\\:w-4\\/6{width:66.6667%}.tw\\:w-5{width:calc(calc(var(--spacing)) * 5)}.tw\\:w-5\\/6{width:83.3333%}.tw\\:w-6{width:calc(calc(var(--spacing)) * 6)}.tw\\:w-7{width:calc(calc(var(--spacing)) * 7)}.tw\\:w-8{width:calc(calc(var(--spacing)) * 8)}.tw\\:w-9{width:calc(calc(var(--spacing)) * 9)}.tw\\:w-9\\/12{width:75%}.tw\\:w-10{width:calc(calc(var(--spacing)) * 10)}.tw\\:w-12{width:calc(calc(var(--spacing)) * 12)}.tw\\:w-14{width:calc(calc(var(--spacing)) * 14)}.tw\\:w-20{width:calc(calc(var(--spacing)) * 20)}.tw\\:w-24{width:calc(calc(var(--spacing)) * 24)}.tw\\:w-32{width:calc(calc(var(--spacing)) * 32)}.tw\\:w-48{width:calc(calc(var(--spacing)) * 48)}.tw\\:w-56{width:calc(calc(var(--spacing)) * 56)}.tw\\:w-60{width:calc(calc(var(--spacing)) * 60)}.tw\\:w-64{width:calc(calc(var(--spacing)) * 64)}.tw\\:w-72{width:calc(calc(var(--spacing)) * 72)}.tw\\:w-80{width:calc(calc(var(--spacing)) * 80)}.tw\\:w-96{width:calc(calc(var(--spacing)) * 96)}.tw\\:w-\\[1px\\]{width:1px}.tw\\:w-\\[5px\\]{width:5px}.tw\\:w-\\[70px\\]{width:70px}.tw\\:w-\\[100px\\]{width:100px}.tw\\:w-\\[116px\\]{width:116px}.tw\\:w-\\[124px\\]{width:124px}.tw\\:w-\\[150px\\]{width:150px}.tw\\:w-\\[180px\\]{width:180px}.tw\\:w-\\[200px\\]{width:200px}.tw\\:w-\\[250px\\]{width:250px}.tw\\:w-\\[260px\\]{width:260px}.tw\\:w-\\[280px\\]{width:280px}.tw\\:w-\\[300px\\]{width:300px}.tw\\:w-\\[320px\\]{width:320px}.tw\\:w-\\[350px\\]{width:350px}.tw\\:w-\\[400px\\]{width:400px}.tw\\:w-\\[420px\\]{width:420px}.tw\\:w-\\[500px\\]{width:500px}.tw\\:w-\\[560px\\]{width:560px}.tw\\:w-\\[600px\\]{width:600px}.tw\\:w-\\[calc\\(100\\%-2px\\)\\]{width:calc(100% - 2px)}.tw\\:w-\\[var\\(--radix-dropdown-menu-trigger-width\\)\\]{width:var(--radix-dropdown-menu-trigger-width)}.tw\\:w-auto{width:auto}.tw\\:w-fit{width:fit-content}.tw\\:w-full{width:100%}.tw\\:w-max{width:max-content}.tw\\:w-px{width:1px}.tw\\:max-w-\\(--skeleton-width\\){max-width:var(--skeleton-width)}.tw\\:max-w-0{max-width:calc(calc(var(--spacing)) * 0)}.tw\\:max-w-2xl{max-width:var(--tw-container-2xl)}.tw\\:max-w-3xl{max-width:var(--tw-container-3xl)}.tw\\:max-w-4xl{max-width:var(--tw-container-4xl)}.tw\\:max-w-5{max-width:calc(calc(var(--spacing)) * 5)}.tw\\:max-w-6xl{max-width:var(--tw-container-6xl)}.tw\\:max-w-40{max-width:calc(calc(var(--spacing)) * 40)}.tw\\:max-w-48{max-width:calc(calc(var(--spacing)) * 48)}.tw\\:max-w-64{max-width:calc(calc(var(--spacing)) * 64)}.tw\\:max-w-96{max-width:calc(calc(var(--spacing)) * 96)}.tw\\:max-w-\\[200px\\]{max-width:200px}.tw\\:max-w-\\[220px\\]{max-width:220px}.tw\\:max-w-\\[calc\\(100\\%-2rem\\)\\]{max-width:calc(100% - 2rem)}.tw\\:max-w-\\[calc\\(100vw-2rem\\)\\]{max-width:calc(100vw - 2rem)}.tw\\:max-w-\\[calc\\(var\\(--radix-dropdown-menu-content-available-width\\,100vw\\)\\/var\\(--platform-content-zoom-popup-factor\\,1\\)\\)\\]{max-width:calc(var(--radix-dropdown-menu-content-available-width,100vw) / var(--platform-content-zoom-popup-factor,1))}.tw\\:max-w-\\[calc\\(var\\(--radix-popover-content-available-width\\,100vw\\)\\/var\\(--platform-content-zoom-popup-factor\\,1\\)\\)\\]{max-width:calc(var(--radix-popover-content-available-width,100vw) / var(--platform-content-zoom-popup-factor,1))}.tw\\:max-w-\\[min\\(20rem\\,calc\\(var\\(--radix-tooltip-content-available-width\\,100vw\\)\\/var\\(--platform-content-zoom-popup-factor\\,1\\)\\)\\)\\]{max-width:min(20rem, calc(var(--radix-tooltip-content-available-width,100vw) / var(--platform-content-zoom-popup-factor,1)))}.tw\\:max-w-fit{max-width:fit-content}.tw\\:max-w-full{max-width:100%}.tw\\:max-w-lg{max-width:var(--tw-container-lg)}.tw\\:max-w-md{max-width:var(--tw-container-md)}.tw\\:max-w-none{max-width:none}.tw\\:max-w-sm{max-width:var(--tw-container-sm)}.tw\\:max-w-xs{max-width:var(--tw-container-xs)}.tw\\:min-w-0{min-width:calc(calc(var(--spacing)) * 0)}.tw\\:min-w-4{min-width:calc(calc(var(--spacing)) * 4)}.tw\\:min-w-5{min-width:calc(calc(var(--spacing)) * 5)}.tw\\:min-w-7{min-width:calc(calc(var(--spacing)) * 7)}.tw\\:min-w-8{min-width:calc(calc(var(--spacing)) * 8)}.tw\\:min-w-9{min-width:calc(calc(var(--spacing)) * 9)}.tw\\:min-w-16{min-width:calc(calc(var(--spacing)) * 16)}.tw\\:min-w-32{min-width:calc(calc(var(--spacing)) * 32)}.tw\\:min-w-36{min-width:calc(calc(var(--spacing)) * 36)}.tw\\:min-w-80{min-width:calc(calc(var(--spacing)) * 80)}.tw\\:min-w-\\[12rem\\]{min-width:12rem}.tw\\:min-w-\\[26px\\]{min-width:26px}.tw\\:min-w-\\[96px\\]{min-width:96px}.tw\\:min-w-\\[140px\\]{min-width:140px}.tw\\:min-w-\\[215px\\]{min-width:215px}.tw\\:min-w-\\[500px\\]{min-width:500px}.tw\\:min-w-min{min-width:min-content}.tw\\:flex-1{flex:1}.tw\\:shrink{flex-shrink:1}.tw\\:shrink\\!{flex-shrink:1!important}.tw\\:shrink-0{flex-shrink:0}.tw\\:shrink-\\[9999\\]{flex-shrink:9999}.tw\\:flex-grow,.tw\\:grow,.tw\\:grow-\\[1\\]{flex-grow:1}.tw\\:grow-\\[10\\]{flex-grow:10}.tw\\:basis-0{flex-basis:calc(calc(var(--spacing)) * 0)}.tw\\:table-fixed{table-layout:fixed}.tw\\:caption-bottom{caption-side:bottom}.tw\\:border-collapse{border-collapse:collapse}.tw\\:origin-\\(--radix-context-menu-content-transform-origin\\){transform-origin:var(--radix-context-menu-content-transform-origin)}.tw\\:origin-\\(--radix-dropdown-menu-content-transform-origin\\){transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.tw\\:origin-\\(--radix-menubar-content-transform-origin\\){transform-origin:var(--radix-menubar-content-transform-origin)}.tw\\:origin-\\(--radix-popover-content-transform-origin\\){transform-origin:var(--radix-popover-content-transform-origin)}.tw\\:origin-\\(--radix-select-content-transform-origin\\){transform-origin:var(--radix-select-content-transform-origin)}.tw\\:origin-\\(--radix-tooltip-content-transform-origin\\){transform-origin:var(--radix-tooltip-content-transform-origin)}.tw\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-y-0{--tw-translate-y:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-y-px{--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rotate-45{rotate:45deg}.tw\\:rotate-180{rotate:180deg}.tw\\:transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.tw\\:animate-none\\!{animation:none!important}.tw\\:animate-pulse{animation:var(--tw-animate-pulse)}.tw\\:animate-spin{animation:var(--tw-animate-spin)}.tw\\:cursor-default{cursor:default}.tw\\:cursor-ew-resize{cursor:ew-resize}.tw\\:cursor-not-allowed{cursor:not-allowed}.tw\\:cursor-pointer{cursor:pointer}.tw\\:cursor-text{cursor:text}.tw\\:touch-none{touch-action:none}.tw\\:resize{resize:both}.tw\\:resize-none{resize:none}.tw\\:scroll-m-20{scroll-margin:calc(calc(var(--spacing)) * 20)}.tw\\:scroll-my-1{scroll-margin-block:calc(calc(var(--spacing)) * 1)}.tw\\:scroll-py-1{scroll-padding-block:calc(calc(var(--spacing)) * 1)}.tw\\:list-inside{list-style-position:inside}.tw\\:list-outside{list-style-position:outside}.tw\\:\\!list-\\[lower-alpha\\]{list-style-type:lower-alpha!important}.tw\\:\\!list-\\[lower-roman\\]{list-style-type:lower-roman!important}.tw\\:\\!list-\\[upper-alpha\\]{list-style-type:upper-alpha!important}.tw\\:\\!list-\\[upper-roman\\]{list-style-type:upper-roman!important}.tw\\:\\!list-decimal{list-style-type:decimal!important}.tw\\:\\!list-disc{list-style-type:disc!important}.tw\\:list-decimal{list-style-type:decimal}.tw\\:list-disc{list-style-type:disc}.tw\\:list-none{list-style-type:none}.tw\\:grid-flow-col{grid-auto-flow:column}.tw\\:grid-flow-row{grid-auto-flow:row}.tw\\:auto-rows-min{grid-auto-rows:min-content}.tw\\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.tw\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.tw\\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.tw\\:grid-cols-\\[25\\%_25\\%_50\\%\\]{grid-template-columns:25% 25% 50%}.tw\\:grid-cols-\\[25\\%_50\\%_25\\%\\]{grid-template-columns:25% 50% 25%}.tw\\:grid-cols-\\[auto_auto_auto_auto\\]{grid-template-columns:auto auto auto auto}.tw\\:grid-cols-\\[min-content_1fr\\]{grid-template-columns:min-content 1fr}.tw\\:grid-cols-\\[min-content_min-content_1fr\\]{grid-template-columns:min-content min-content 1fr}.tw\\:grid-cols-subgrid{grid-template-columns:subgrid}.tw\\:flex-col{flex-direction:column}.tw\\:flex-col-reverse{flex-direction:column-reverse}.tw\\:flex-row{flex-direction:row}.tw\\:flex-row-reverse{flex-direction:row-reverse}.tw\\:flex-nowrap{flex-wrap:nowrap}.tw\\:flex-wrap{flex-wrap:wrap}.tw\\:place-content-center{place-content:center}.tw\\:content-center{align-content:center}.tw\\:items-baseline{align-items:baseline}.tw\\:items-center{align-items:center}.tw\\:items-end{align-items:flex-end}.tw\\:items-start{align-items:flex-start}.tw\\:items-stretch{align-items:stretch}.tw\\:justify-between{justify-content:space-between}.tw\\:justify-center{justify-content:center}.tw\\:justify-end{justify-content:flex-end}.tw\\:justify-start{justify-content:flex-start}.tw\\:gap-0{gap:calc(calc(var(--spacing)) * 0)}.tw\\:gap-0\\.5{gap:calc(calc(var(--spacing)) * .5)}.tw\\:gap-1{gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-1\\.5{gap:calc(calc(var(--spacing)) * 1.5)}.tw\\:gap-1\\.5\\!{gap:calc(calc(var(--spacing)) * 1.5)!important}.tw\\:gap-2{gap:calc(calc(var(--spacing)) * 2)}.tw\\:gap-2\\.5{gap:calc(calc(var(--spacing)) * 2.5)}.tw\\:gap-3{gap:calc(calc(var(--spacing)) * 3)}.tw\\:gap-4{gap:calc(calc(var(--spacing)) * 4)}.tw\\:gap-5{gap:calc(calc(var(--spacing)) * 5)}.tw\\:gap-6{gap:calc(calc(var(--spacing)) * 6)}.tw\\:gap-8{gap:calc(calc(var(--spacing)) * 8)}.tw\\:gap-16{gap:calc(calc(var(--spacing)) * 16)}.tw\\:gap-\\[--spacing\\(var\\(--gap\\)\\)\\]{gap:calc(calc(var(--spacing)) * var(--gap))}.tw\\:gap-\\[12px\\]{gap:12px}:where(.tw\\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-1\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 8) * calc(1 - var(--tw-space-y-reverse)))}.tw\\:gap-x-1{column-gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-x-2{column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:gap-x-3{column-gap:calc(calc(var(--spacing)) * 3)}.tw\\:gap-x-4{column-gap:calc(calc(var(--spacing)) * 4)}:where(.tw\\:-space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * -2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * -2) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 3) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 3) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 4) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 6) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 6) * calc(1 - var(--tw-space-x-reverse)))}.tw\\:gap-y-1{row-gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-y-2{row-gap:calc(calc(var(--spacing)) * 2)}:where(.tw\\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.tw\\:divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}.tw\\:self-start{align-self:flex-start}.tw\\:self-stretch{align-self:stretch}.tw\\:justify-self-end{justify-self:flex-end}.tw\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tw\\:overflow-auto{overflow:auto}.tw\\:overflow-clip{overflow:clip}.tw\\:overflow-hidden{overflow:hidden}.tw\\:overflow-scroll{overflow:scroll}.tw\\:overflow-visible{overflow:visible}.tw\\:overflow-x-auto{overflow-x:auto}.tw\\:overflow-x-hidden{overflow-x:hidden}.tw\\:overflow-y-auto{overflow-y:auto}.tw\\:overflow-y-hidden{overflow-y:hidden}.tw\\:rounded{border-radius:.25rem}.tw\\:rounded-2xl{border-radius:calc(var(--radius) * 1.8)}.tw\\:rounded-4xl{border-radius:calc(var(--radius) * 2.6)}.tw\\:rounded-\\[4px\\]{border-radius:4px}.tw\\:rounded-\\[6px\\]{border-radius:6px}.tw\\:rounded-\\[calc\\(var\\(--radius\\)-3px\\)\\]{border-radius:calc(var(--radius) - 3px)}.tw\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,10px\\)\\]{border-radius:min(var(--tw-radius-md), 10px)}.tw\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,12px\\)\\]{border-radius:min(var(--tw-radius-md), 12px)}.tw\\:rounded-full{border-radius:3.40282e38px}.tw\\:rounded-lg{border-radius:var(--radius)}.tw\\:rounded-lg\\!{border-radius:var(--radius)!important}.tw\\:rounded-md{border-radius:calc(var(--radius) * .8)}.tw\\:rounded-none{border-radius:0}.tw\\:rounded-sm{border-radius:calc(var(--radius) * .6)}.tw\\:rounded-xl{border-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-xl\\!{border-radius:calc(var(--radius) * 1.4)!important}.tw\\:rounded-xs{border-radius:var(--tw-radius-xs)}.tw\\:rounded-s-none{border-start-start-radius:0;border-end-start-radius:0}.tw\\:rounded-e-none{border-start-end-radius:0;border-end-end-radius:0}.tw\\:rounded-t-xl{border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-l-lg{border-top-left-radius:var(--radius);border-bottom-left-radius:var(--radius)}.tw\\:rounded-r-xl{border-top-right-radius:calc(var(--radius) * 1.4);border-bottom-right-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-b-xl{border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:border{border-style:var(--tw-border-style);border-width:1px}.tw\\:border-0{border-style:var(--tw-border-style);border-width:0}.tw\\:border-2{border-style:var(--tw-border-style);border-width:2px}.tw\\:border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:border-s-0{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:border-s-2{border-inline-start-style:var(--tw-border-style);border-inline-start-width:2px}.tw\\:border-s-4{border-inline-start-style:var(--tw-border-style);border-inline-start-width:4px}.tw\\:border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.tw\\:border-e-0{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.tw\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.tw\\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.tw\\:border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.tw\\:border-dashed{--tw-border-style:dashed;border-style:dashed}.tw\\:border-none{--tw-border-style:none;border-style:none}.tw\\:border-solid{--tw-border-style:solid;border-style:solid}.tw\\:border-black{border-color:var(--tw-color-black)}.tw\\:border-blue-400{border-color:var(--tw-color-blue-400)}.tw\\:border-blue-500{border-color:var(--tw-color-blue-500)}.tw\\:border-border,.tw\\:border-border\\/50{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-border\\/50{border-color:color-mix(in oklab, var(--border) 50%, transparent)}}.tw\\:border-destructive{border-color:var(--destructive)}.tw\\:border-foreground{border-color:var(--foreground)}.tw\\:border-gray-300{border-color:var(--tw-color-gray-300)}.tw\\:border-input,.tw\\:border-input\\/30{border-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-input\\/30{border-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:border-muted-foreground,.tw\\:border-muted-foreground\\/40{border-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-muted-foreground\\/40{border-color:color-mix(in oklab, var(--muted-foreground) 40%, transparent)}}.tw\\:border-primary{border-color:var(--primary)}.tw\\:border-red-300{border-color:var(--tw-color-red-300)}.tw\\:border-red-400{border-color:var(--tw-color-red-400)}.tw\\:border-red-500{border-color:var(--tw-color-red-500)}.tw\\:border-red-600{border-color:var(--tw-color-red-600)}.tw\\:border-ring{border-color:var(--ring)}.tw\\:border-sidebar-border{border-color:var(--sidebar-border)}.tw\\:border-slate-300{border-color:var(--tw-color-slate-300)}.tw\\:border-transparent{border-color:#0000}.tw\\:border-yellow-400{border-color:var(--tw-color-yellow-400)}.tw\\:border-yellow-500{border-color:var(--tw-color-yellow-500)}.tw\\:border-s-amber-200{border-inline-start-color:var(--tw-color-amber-200)}.tw\\:border-s-indigo-200{border-inline-start-color:var(--tw-color-indigo-200)}.tw\\:border-s-purple-200{border-inline-start-color:var(--tw-color-purple-200)}.tw\\:border-s-red-200{border-inline-start-color:var(--tw-color-red-200)}.tw\\:\\!bg-destructive\\/50{background-color:var(--destructive)!important}@supports (color:color-mix(in lab, red, red)){.tw\\:\\!bg-destructive\\/50{background-color:color-mix(in oklab, var(--destructive) 50%, transparent)!important}}.tw\\:bg-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{background-color:color-mix(in oklab,var(--destructive) 10%,var(--background))}}.tw\\:bg-accent,.tw\\:bg-accent\\/50{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-accent\\/50{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.tw\\:bg-amber-500,.tw\\:bg-amber-500\\/5{background-color:var(--tw-color-amber-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-amber-500\\/5{background-color:color-mix(in oklab, var(--tw-color-amber-500) 5%, transparent)}}.tw\\:bg-amber-500\\/15{background-color:var(--tw-color-amber-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-amber-500\\/15{background-color:color-mix(in oklab, var(--tw-color-amber-500) 15%, transparent)}}.tw\\:bg-background,.tw\\:bg-background\\/50{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-background\\/50{background-color:color-mix(in oklab, var(--background) 50%, transparent)}}.tw\\:bg-black\\/10{background-color:var(--tw-color-black)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-black\\/10{background-color:color-mix(in oklab, var(--tw-color-black) 10%, transparent)}}.tw\\:bg-blue-50{background-color:var(--tw-color-blue-50)}.tw\\:bg-blue-100{background-color:var(--tw-color-blue-100)}.tw\\:bg-blue-400{background-color:var(--tw-color-blue-400)}.tw\\:bg-blue-500{background-color:var(--tw-color-blue-500)}.tw\\:bg-border{background-color:var(--border)}.tw\\:bg-card{background-color:var(--card)}.tw\\:bg-destructive\\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-destructive\\/10{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.tw\\:bg-foreground{background-color:var(--foreground)}.tw\\:bg-gray-50{background-color:var(--tw-color-gray-50)}.tw\\:bg-gray-100{background-color:var(--tw-color-gray-100)}.tw\\:bg-gray-500{background-color:var(--tw-color-gray-500)}.tw\\:bg-green-50{background-color:var(--tw-color-green-50)}.tw\\:bg-green-100{background-color:var(--tw-color-green-100)}.tw\\:bg-green-500{background-color:var(--tw-color-green-500)}.tw\\:bg-input,.tw\\:bg-input\\/30{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-input\\/30{background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:bg-muted,.tw\\:bg-muted\\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-muted\\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:bg-neutral-300{background-color:var(--tw-color-neutral-300)}.tw\\:bg-orange-100{background-color:var(--tw-color-orange-100)}.tw\\:bg-popover,.tw\\:bg-popover\\/70{background-color:var(--popover)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-popover\\/70{background-color:color-mix(in oklab, var(--popover) 70%, transparent)}}.tw\\:bg-primary{background-color:var(--primary)}.tw\\:bg-primary-foreground{background-color:var(--primary-foreground)}.tw\\:bg-primary\\/30{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-primary\\/30{background-color:color-mix(in oklab, var(--primary) 30%, transparent)}}.tw\\:bg-purple-50{background-color:var(--tw-color-purple-50)}.tw\\:bg-red-100{background-color:var(--tw-color-red-100)}.tw\\:bg-red-500{background-color:var(--tw-color-red-500)}.tw\\:bg-rose-500,.tw\\:bg-rose-500\\/5{background-color:var(--tw-color-rose-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-rose-500\\/5{background-color:color-mix(in oklab, var(--tw-color-rose-500) 5%, transparent)}}.tw\\:bg-rose-500\\/15{background-color:var(--tw-color-rose-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-rose-500\\/15{background-color:color-mix(in oklab, var(--tw-color-rose-500) 15%, transparent)}}.tw\\:bg-secondary{background-color:var(--secondary)}.tw\\:bg-sidebar{background-color:var(--sidebar)}.tw\\:bg-sidebar-accent{background-color:var(--sidebar-accent)}.tw\\:bg-sidebar-border{background-color:var(--sidebar-border)}.tw\\:bg-sky-500,.tw\\:bg-sky-500\\/5{background-color:var(--tw-color-sky-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-sky-500\\/5{background-color:color-mix(in oklab, var(--tw-color-sky-500) 5%, transparent)}}.tw\\:bg-sky-500\\/15{background-color:var(--tw-color-sky-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-sky-500\\/15{background-color:color-mix(in oklab, var(--tw-color-sky-500) 15%, transparent)}}.tw\\:bg-teal-500,.tw\\:bg-teal-500\\/5{background-color:var(--tw-color-teal-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-teal-500\\/5{background-color:color-mix(in oklab, var(--tw-color-teal-500) 5%, transparent)}}.tw\\:bg-teal-500\\/15{background-color:var(--tw-color-teal-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-teal-500\\/15{background-color:color-mix(in oklab, var(--tw-color-teal-500) 15%, transparent)}}.tw\\:bg-transparent{background-color:#0000}.tw\\:bg-white{background-color:var(--tw-color-white)}.tw\\:bg-yellow-50{background-color:var(--tw-color-yellow-50)}.tw\\:bg-yellow-100{background-color:var(--tw-color-yellow-100)}.tw\\:bg-yellow-500{background-color:var(--tw-color-yellow-500)}.tw\\:bg-zinc-400{background-color:var(--tw-color-zinc-400)}.tw\\:bg-clip-padding{background-clip:padding-box}.tw\\:fill-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{fill:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:fill-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{fill:color-mix(in oklab,var(--destructive) 10%,var(--background))}}.tw\\:fill-destructive{fill:var(--destructive)}.tw\\:fill-foreground{fill:var(--foreground)}.tw\\:fill-yellow-400,.tw\\:fill-yellow-400\\/50{fill:var(--tw-color-yellow-400)}@supports (color:color-mix(in lab, red, red)){.tw\\:fill-yellow-400\\/50{fill:color-mix(in oklab, var(--tw-color-yellow-400) 50%, transparent)}}.tw\\:object-cover{object-fit:cover}.tw\\:\\!p-4{padding:calc(calc(var(--spacing)) * 4)!important}.tw\\:p-0{padding:calc(calc(var(--spacing)) * 0)}.tw\\:p-0\\.5{padding:calc(calc(var(--spacing)) * .5)}.tw\\:p-1{padding:calc(calc(var(--spacing)) * 1)}.tw\\:p-2{padding:calc(calc(var(--spacing)) * 2)}.tw\\:p-2\\.5{padding:calc(calc(var(--spacing)) * 2.5)}.tw\\:p-3{padding:calc(calc(var(--spacing)) * 3)}.tw\\:p-4{padding:calc(calc(var(--spacing)) * 4)}.tw\\:p-6{padding:calc(calc(var(--spacing)) * 6)}.tw\\:p-8{padding:calc(calc(var(--spacing)) * 8)}.tw\\:p-\\[1px\\]{padding:1px}.tw\\:p-\\[3px\\]{padding:3px}.tw\\:p-\\[10px\\]{padding:10px}.tw\\:p-\\[16px\\]{padding:16px}.tw\\:px-0{padding-inline:calc(calc(var(--spacing)) * 0)}.tw\\:px-0\\.5{padding-inline:calc(calc(var(--spacing)) * .5)}.tw\\:px-1{padding-inline:calc(calc(var(--spacing)) * 1)}.tw\\:px-1\\.5{padding-inline:calc(calc(var(--spacing)) * 1.5)}.tw\\:px-2{padding-inline:calc(calc(var(--spacing)) * 2)}.tw\\:px-2\\.5{padding-inline:calc(calc(var(--spacing)) * 2.5)}.tw\\:px-3{padding-inline:calc(calc(var(--spacing)) * 3)}.tw\\:px-4{padding-inline:calc(calc(var(--spacing)) * 4)}.tw\\:px-6{padding-inline:calc(calc(var(--spacing)) * 6)}.tw\\:py-0{padding-block:calc(calc(var(--spacing)) * 0)}.tw\\:py-0\\.5{padding-block:calc(calc(var(--spacing)) * .5)}.tw\\:py-1{padding-block:calc(calc(var(--spacing)) * 1)}.tw\\:py-1\\.5{padding-block:calc(calc(var(--spacing)) * 1.5)}.tw\\:py-2{padding-block:calc(calc(var(--spacing)) * 2)}.tw\\:py-3{padding-block:calc(calc(var(--spacing)) * 3)}.tw\\:py-4{padding-block:calc(calc(var(--spacing)) * 4)}.tw\\:py-6{padding-block:calc(calc(var(--spacing)) * 6)}.tw\\:py-8{padding-block:calc(calc(var(--spacing)) * 8)}.tw\\:py-\\[2px\\]{padding-block:2px}.tw\\:ps-1\\.5{padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:ps-2{padding-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:ps-2\\.5{padding-inline-start:calc(calc(var(--spacing)) * 2.5)}.tw\\:ps-4{padding-inline-start:calc(calc(var(--spacing)) * 4)}.tw\\:ps-6{padding-inline-start:calc(calc(var(--spacing)) * 6)}.tw\\:ps-7{padding-inline-start:calc(calc(var(--spacing)) * 7)}.tw\\:ps-8{padding-inline-start:calc(calc(var(--spacing)) * 8)}.tw\\:ps-9{padding-inline-start:calc(calc(var(--spacing)) * 9)}.tw\\:ps-12{padding-inline-start:calc(calc(var(--spacing)) * 12)}.tw\\:ps-\\[85px\\]{padding-inline-start:85px}.tw\\:pe-1{padding-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:pe-1\\.5{padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:pe-2{padding-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:pe-4{padding-inline-end:calc(calc(var(--spacing)) * 4)}.tw\\:pe-8{padding-inline-end:calc(calc(var(--spacing)) * 8)}.tw\\:pe-8\\!{padding-inline-end:calc(calc(var(--spacing)) * 8)!important}.tw\\:pe-9{padding-inline-end:calc(calc(var(--spacing)) * 9)}.tw\\:pe-\\[calc\\(138px\\+1rem\\)\\]{padding-inline-end:calc(138px + 1rem)}.tw\\:pe-\\[…\\]{padding-inline-end:…}.tw\\:pt-1{padding-top:calc(calc(var(--spacing)) * 1)}.tw\\:pt-2{padding-top:calc(calc(var(--spacing)) * 2)}.tw\\:pt-3{padding-top:calc(calc(var(--spacing)) * 3)}.tw\\:pt-4{padding-top:calc(calc(var(--spacing)) * 4)}.tw\\:pt-6{padding-top:calc(calc(var(--spacing)) * 6)}.tw\\:pr-0{padding-right:calc(calc(var(--spacing)) * 0)}.tw\\:pr-3{padding-right:calc(calc(var(--spacing)) * 3)}.tw\\:pr-4{padding-right:calc(calc(var(--spacing)) * 4)}.tw\\:pb-0{padding-bottom:calc(calc(var(--spacing)) * 0)}.tw\\:pb-1{padding-bottom:calc(calc(var(--spacing)) * 1)}.tw\\:pb-2{padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:pb-3{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:pb-4{padding-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:pb-8{padding-bottom:calc(calc(var(--spacing)) * 8)}.tw\\:pb-12{padding-bottom:calc(calc(var(--spacing)) * 12)}.tw\\:pb-16{padding-bottom:calc(calc(var(--spacing)) * 16)}.tw\\:pb-24{padding-bottom:calc(calc(var(--spacing)) * 24)}.tw\\:pl-2{padding-left:calc(calc(var(--spacing)) * 2)}.tw\\:pl-3{padding-left:calc(calc(var(--spacing)) * 3)}.tw\\:pl-4{padding-left:calc(calc(var(--spacing)) * 4)}.tw\\:pl-5{padding-left:calc(calc(var(--spacing)) * 5)}.tw\\:pl-6{padding-left:calc(calc(var(--spacing)) * 6)}.tw\\:pl-8{padding-left:calc(calc(var(--spacing)) * 8)}.tw\\:text-center{text-align:center}.tw\\:text-end{text-align:end}.tw\\:text-left{text-align:left}.tw\\:text-right{text-align:right}.tw\\:text-start{text-align:start}.tw\\:align-middle{vertical-align:middle}.tw\\:font-heading{font-family:var(--font-sans)}.tw\\:font-mono{font-family:var(--tw-font-mono)}.tw\\:font-sans{font-family:IBM Plex Sans Variable,sans-serif}.tw\\:text-2xl{font-size:var(--tw-text-2xl);line-height:var(--tw-leading,var(--tw-text-2xl--line-height))}.tw\\:text-3xl{font-size:var(--tw-text-3xl);line-height:var(--tw-leading,var(--tw-text-3xl--line-height))}.tw\\:text-4xl{font-size:var(--tw-text-4xl);line-height:var(--tw-leading,var(--tw-text-4xl--line-height))}.tw\\:text-base{font-size:var(--tw-text-base);line-height:var(--tw-leading,var(--tw-text-base--line-height))}.tw\\:text-lg{font-size:var(--tw-text-lg);line-height:var(--tw-leading,var(--tw-text-lg--line-height))}.tw\\:text-sm{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:text-sm\\/relaxed{font-size:var(--tw-text-sm);line-height:var(--tw-leading-relaxed)}.tw\\:text-xl{font-size:var(--tw-text-xl);line-height:var(--tw-leading,var(--tw-text-xl--line-height))}.tw\\:text-xs{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:text-\\[0\\.8rem\\]{font-size:.8rem}.tw\\:leading-6{--tw-leading:calc(calc(var(--spacing)) * 6);line-height:calc(calc(var(--spacing)) * 6)}.tw\\:leading-loose{--tw-leading:var(--tw-leading-loose);line-height:var(--tw-leading-loose)}.tw\\:leading-none{--tw-leading:1;line-height:1}.tw\\:leading-relaxed{--tw-leading:var(--tw-leading-relaxed);line-height:var(--tw-leading-relaxed)}.tw\\:leading-snug{--tw-leading:var(--tw-leading-snug);line-height:var(--tw-leading-snug)}.tw\\:leading-tight{--tw-leading:var(--tw-leading-tight);line-height:var(--tw-leading-tight)}.tw\\:font-bold{--tw-font-weight:var(--tw-font-weight-bold);font-weight:var(--tw-font-weight-bold)}.tw\\:font-extrabold{--tw-font-weight:var(--tw-font-weight-extrabold);font-weight:var(--tw-font-weight-extrabold)}.tw\\:font-medium{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:font-normal{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:font-semibold{--tw-font-weight:var(--tw-font-weight-semibold);font-weight:var(--tw-font-weight-semibold)}.tw\\:tracking-tight{--tw-tracking:var(--tw-tracking-tight);letter-spacing:var(--tw-tracking-tight)}.tw\\:tracking-wider{--tw-tracking:var(--tw-tracking-wider);letter-spacing:var(--tw-tracking-wider)}.tw\\:tracking-widest{--tw-tracking:var(--tw-tracking-widest);letter-spacing:var(--tw-tracking-widest)}.tw\\:text-balance{text-wrap:balance}.tw\\:text-nowrap{text-wrap:nowrap}.tw\\:break-words{overflow-wrap:break-word}.tw\\:text-clip{text-overflow:clip}.tw\\:text-ellipsis{text-overflow:ellipsis}.tw\\:whitespace-normal{white-space:normal}.tw\\:whitespace-nowrap{white-space:nowrap}.tw\\:whitespace-pre{white-space:pre}.tw\\:whitespace-pre-line{white-space:pre-line}.tw\\:whitespace-pre-wrap{white-space:pre-wrap}.tw\\:\\[color\\:blue\\]{color:#00f}.tw\\:text-accent-foreground{color:var(--accent-foreground)}.tw\\:text-amber-600{color:var(--tw-color-amber-600)}.tw\\:text-background{color:var(--background)}.tw\\:text-blue-400{color:var(--tw-color-blue-400)}.tw\\:text-blue-500{color:var(--tw-color-blue-500)}.tw\\:text-blue-600{color:var(--tw-color-blue-600)}.tw\\:text-blue-800{color:var(--tw-color-blue-800)}.tw\\:text-card-foreground{color:var(--card-foreground)}.tw\\:text-current{color:currentColor}.tw\\:text-destructive{color:var(--destructive)}.tw\\:text-foreground{color:var(--foreground)}.tw\\:text-foreground\\!{color:var(--foreground)!important}.tw\\:text-foreground\\/30{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/30{color:color-mix(in oklab, var(--foreground) 30%, transparent)}}.tw\\:text-foreground\\/50{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/50{color:color-mix(in oklab, var(--foreground) 50%, transparent)}}.tw\\:text-foreground\\/60{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/60{color:color-mix(in oklab, var(--foreground) 60%, transparent)}}.tw\\:text-foreground\\/70{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/70{color:color-mix(in oklab, var(--foreground) 70%, transparent)}}.tw\\:text-gray-300{color:var(--tw-color-gray-300)}.tw\\:text-gray-500{color:var(--tw-color-gray-500)}.tw\\:text-gray-600{color:var(--tw-color-gray-600)}.tw\\:text-gray-700{color:var(--tw-color-gray-700)}.tw\\:text-gray-800{color:var(--tw-color-gray-800)}.tw\\:text-green-600{color:var(--tw-color-green-600)}.tw\\:text-green-700{color:var(--tw-color-green-700)}.tw\\:text-green-800{color:var(--tw-color-green-800)}.tw\\:text-inherit{color:inherit}.tw\\:text-muted-foreground,.tw\\:text-muted-foreground\\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-muted-foreground\\/50{color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.tw\\:text-orange-800{color:var(--tw-color-orange-800)}.tw\\:text-popover-foreground{color:var(--popover-foreground)}.tw\\:text-primary{color:var(--primary)}.tw\\:text-primary-foreground{color:var(--primary-foreground)}.tw\\:text-purple-900{color:var(--tw-color-purple-900)}.tw\\:text-red-500{color:var(--tw-color-red-500)}.tw\\:text-red-600{color:var(--tw-color-red-600)}.tw\\:text-red-700{color:var(--tw-color-red-700)}.tw\\:text-red-800{color:var(--tw-color-red-800)}.tw\\:text-rose-600{color:var(--tw-color-rose-600)}.tw\\:text-secondary-foreground{color:var(--secondary-foreground)}.tw\\:text-sidebar-accent-foreground{color:var(--sidebar-accent-foreground)}.tw\\:text-sidebar-foreground,.tw\\:text-sidebar-foreground\\/70{color:var(--sidebar-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-sidebar-foreground\\/70{color:color-mix(in oklab, var(--sidebar-foreground) 70%, transparent)}}.tw\\:text-sky-600{color:var(--tw-color-sky-600)}.tw\\:text-slate-900{color:var(--tw-color-slate-900)}.tw\\:text-teal-600{color:var(--tw-color-teal-600)}.tw\\:text-white{color:var(--tw-color-white)}.tw\\:text-yellow-400{color:var(--tw-color-yellow-400)}.tw\\:text-yellow-600{color:var(--tw-color-yellow-600)}.tw\\:text-yellow-700{color:var(--tw-color-yellow-700)}.tw\\:capitalize{text-transform:capitalize}.tw\\:uppercase{text-transform:uppercase}.tw\\:italic{font-style:italic}.tw\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tw\\:line-through{text-decoration-line:line-through}.tw\\:underline{text-decoration-line:underline}.tw\\:decoration-destructive{-webkit-text-decoration-color:var(--destructive);-webkit-text-decoration-color:var(--destructive);text-decoration-color:var(--destructive)}.tw\\:underline-offset-4{text-underline-offset:4px}.tw\\:opacity-0{opacity:0}.tw\\:opacity-40{opacity:.4}.tw\\:opacity-50{opacity:.5}.tw\\:opacity-60{opacity:.6}.tw\\:opacity-100{opacity:1}.tw\\:bg-blend-color{background-blend-mode:color}.tw\\:shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-\\[0_0_0_1px_var\\(--sidebar-border\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-border));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-none\\!{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.tw\\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-background{--tw-ring-color:var(--background)}.tw\\:ring-foreground\\/10{--tw-ring-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:ring-foreground\\/10{--tw-ring-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}.tw\\:ring-primary{--tw-ring-color:var(--primary)}.tw\\:ring-ring\\/50{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:ring-ring\\/50{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:ring-sidebar-ring{--tw-ring-color:var(--sidebar-ring)}.tw\\:ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:ring-offset-background{--tw-ring-offset-color:var(--background)}.tw\\:ring-offset-white{--tw-ring-offset-color:var(--tw-color-white)}.tw\\:outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:outline-hidden{outline-offset:2px;outline:2px solid #0000}}.tw\\:drop-shadow-sm{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--tw-drop-shadow-sm));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.tw\\:transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[color\\,box-shadow\\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[left\\,right\\,width\\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[margin\\,opacity\\]{transition-property:margin,opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[width\\,height\\,padding\\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-none{transition-property:none}.tw\\:duration-100{--tw-duration:.1s;transition-duration:.1s}.tw\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.tw\\:ease-linear{--tw-ease:linear;transition-timing-function:linear}.tw\\:prose-quoteless :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose-quoteless :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.tw\\:outline-none{--tw-outline-style:none;outline-style:none}.tw\\:select-none{-webkit-user-select:none;user-select:none}.tw\\:\\[unicode-bidi\\:plaintext\\]{unicode-bidi:plaintext}.tw\\:group-focus-within\\/menu-item\\:opacity-100:is(:where(.tw\\:group\\/menu-item):focus-within *){opacity:1}@media (hover:hover){.tw\\:group-hover\\:visible:is(:where(.tw\\:group):hover *){visibility:visible}.tw\\:group-hover\\:hidden:is(:where(.tw\\:group):hover *){display:none}.tw\\:group-hover\\:opacity-100:is(:where(.tw\\:group):hover *),.tw\\:group-hover\\/menu-item\\:opacity-100:is(:where(.tw\\:group\\/menu-item):hover *){opacity:1}}.tw\\:group-focus\\/context-menu-item\\:text-accent-foreground:is(:where(.tw\\:group\\/context-menu-item):focus *),.tw\\:group-focus\\/dropdown-menu-item\\:text-accent-foreground:is(:where(.tw\\:group\\/dropdown-menu-item):focus *),.tw\\:group-focus\\/menubar-item\\:text-accent-foreground:is(:where(.tw\\:group\\/menubar-item):focus *){color:var(--accent-foreground)}.tw\\:group-has-disabled\\/field\\:opacity-50:is(:where(.tw\\:group\\/field):has(:disabled) *){opacity:.5}.tw\\:group-has-data-\\[sidebar\\=menu-action\\]\\/menu-item\\:pe-8:is(:where(.tw\\:group\\/menu-item):has([data-sidebar=menu-action]) *){padding-inline-end:calc(calc(var(--spacing)) * 8)}.tw\\:group-has-data-\\[size\\=lg\\]\\/avatar-group\\:size-10:is(:where(.tw\\:group\\/avatar-group):has([data-size=lg]) *){width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:group-has-data-\\[size\\=sm\\]\\/avatar-group\\:size-6:is(:where(.tw\\:group\\/avatar-group):has([data-size=sm]) *){width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:group-has-data-\\[slot\\=command-shortcut\\]\\/command-item\\:hidden:is(:where(.tw\\:group\\/command-item):has([data-slot=command-shortcut]) *){display:none}.tw\\:group-has-\\[\\>input\\]\\/input-group\\:pt-2:is(:where(.tw\\:group\\/input-group):has(>input) *){padding-top:calc(calc(var(--spacing)) * 2)}.tw\\:group-has-\\[\\>input\\]\\/input-group\\:pb-2:is(:where(.tw\\:group\\/input-group):has(>input) *){padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:group-has-\\[\\>svg\\]\\/alert\\:col-start-2:is(:where(.tw\\:group\\/alert):has(>svg) *){grid-column-start:2}.tw\\:group-data-\\[checked\\=true\\]\\/command-item\\:opacity-100:is(:where(.tw\\:group\\/command-item)[data-checked=true] *){opacity:1}.tw\\:group-data-\\[collapsible\\=icon\\]\\:-mt-8:is(:where(.tw\\:group)[data-collapsible=icon] *){margin-top:calc(calc(var(--spacing)) * -8)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:hidden:is(:where(.tw\\:group)[data-collapsible=icon] *){display:none}.tw\\:group-data-\\[collapsible\\=icon\\]\\:size-8\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(calc(var(--spacing)) * 8)!important;height:calc(calc(var(--spacing)) * 8)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\(--sidebar-width-icon\\):is(:where(.tw\\:group)[data-collapsible=icon] *){width:var(--sidebar-width-icon)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\)\\]:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(calc(var(--spacing)) * 4)))}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\+2px\\)\\]:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(calc(var(--spacing)) * 4)) + 2px)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:overflow-hidden:is(:where(.tw\\:group)[data-collapsible=icon] *){overflow:hidden}.tw\\:group-data-\\[collapsible\\=icon\\]\\:p-0\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){padding:calc(calc(var(--spacing)) * 0)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:p-2\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){padding:calc(calc(var(--spacing)) * 2)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:opacity-0:is(:where(.tw\\:group)[data-collapsible=icon] *){opacity:0}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:right-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\]:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:left-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\]:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:w-0:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){width:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:translate-x-0:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:group-data-\\[disabled\\=true\\]\\:pointer-events-none:is(:where(.tw\\:group)[data-disabled=true] *){pointer-events:none}.tw\\:group-data-\\[disabled\\=true\\]\\:opacity-50:is(:where(.tw\\:group)[data-disabled=true] *),.tw\\:group-data-\\[disabled\\=true\\]\\/input-group\\:opacity-50:is(:where(.tw\\:group\\/input-group)[data-disabled=true] *){opacity:.5}.tw\\:group-data-\\[side\\=primary\\]\\:-right-4:is(:where(.tw\\:group)[data-side=primary] *){right:calc(calc(var(--spacing)) * -4)}.tw\\:group-data-\\[side\\=primary\\]\\:border-e:is(:where(.tw\\:group)[data-side=primary] *){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.tw\\:group-data-\\[side\\=secondary\\]\\:left-0:is(:where(.tw\\:group)[data-side=secondary] *){left:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-\\[side\\=secondary\\]\\:rotate-180:is(:where(.tw\\:group)[data-side=secondary] *){rotate:180deg}.tw\\:group-data-\\[side\\=secondary\\]\\:border-s:is(:where(.tw\\:group)[data-side=secondary] *){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:group-data-\\[size\\=default\\]\\/avatar\\:size-2\\.5:is(:where(.tw\\:group\\/avatar)[data-size=default] *){width:calc(calc(var(--spacing)) * 2.5);height:calc(calc(var(--spacing)) * 2.5)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:size-4:is(:where(.tw\\:group\\/switch)[data-size=default] *){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[size\\=lg\\]\\/avatar\\:size-3:is(:where(.tw\\:group\\/avatar)[data-size=lg] *){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=sm] *){width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:text-xs:is(:where(.tw\\:group\\/avatar)[data-size=sm] *){font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:p-3:is(:where(.tw\\:group\\/card)[data-size=sm] *){padding:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:px-3:is(:where(.tw\\:group\\/card)[data-size=sm] *){padding-inline:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:text-sm:is(:where(.tw\\:group\\/card)[data-size=sm] *){font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:size-3:is(:where(.tw\\:group\\/switch)[data-size=sm] *){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:rounded-none:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *){border-radius:0}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:px-2:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *){padding-inline:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[variant\\=floating\\]\\:rounded-lg:is(:where(.tw\\:group)[data-variant=floating] *){border-radius:var(--radius)}.tw\\:group-data-\\[variant\\=floating\\]\\:shadow-sm:is(:where(.tw\\:group)[data-variant=floating] *){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=floating\\]\\:ring-1:is(:where(.tw\\:group)[data-variant=floating] *){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=floating\\]\\:ring-sidebar-border:is(:where(.tw\\:group)[data-variant=floating] *){--tw-ring-color:var(--sidebar-border)}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *){background-color:#0000}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:mx-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){margin-inline:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:mt-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){margin-top:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:h-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){height:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:w-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){width:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:text-center:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){text-align:center}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:my-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){margin-block:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:me-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){margin-inline-end:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:h-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){height:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:w-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){width:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:my-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){margin-block:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:ms-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){margin-inline-start:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:h-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){height:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:w-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){width:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:mx-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){margin-inline:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:mb-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:h-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){height:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:w-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){width:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:text-center:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){text-align:center}.tw\\:group-data-selected\\/command-item\\:text-foreground:is(:where(.tw\\:group\\/command-item):where([data-selected=true]) *){color:var(--foreground)}.tw\\:group-data-horizontal\\/tabs\\:h-8:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *){height:calc(calc(var(--spacing)) * 8)}.tw\\:group-data-vertical\\/tabs\\:h-fit:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){height:fit-content}.tw\\:group-data-vertical\\/tabs\\:w-full:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){width:100%}.tw\\:group-data-vertical\\/tabs\\:flex-col:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){flex-direction:column}.tw\\:group-data-vertical\\/tabs\\:justify-start:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){justify-content:flex-start}@media (hover:hover){.tw\\:peer-hover\\/menu-button\\:text-sidebar-accent-foreground:is(:where(.tw\\:peer\\/menu-button):hover~*){color:var(--sidebar-accent-foreground)}.tw\\:peer-focus\\:group-hover\\:text-blue-500:is(:where(.tw\\:peer):focus~*):is(:where(.tw\\:group):hover *){color:var(--tw-color-blue-500)}}.tw\\:peer-disabled\\:cursor-not-allowed:is(:where(.tw\\:peer):disabled~*){cursor:not-allowed}.tw\\:peer-disabled\\:opacity-50:is(:where(.tw\\:peer):disabled~*){opacity:.5}.tw\\:peer-data-\\[size\\=default\\]\\/menu-button\\:top-1\\.5:is(:where(.tw\\:peer\\/menu-button)[data-size=default]~*){top:calc(calc(var(--spacing)) * 1.5)}.tw\\:peer-data-\\[size\\=lg\\]\\/menu-button\\:top-2\\.5:is(:where(.tw\\:peer\\/menu-button)[data-size=lg]~*){top:calc(calc(var(--spacing)) * 2.5)}.tw\\:peer-data-\\[size\\=sm\\]\\/menu-button\\:top-1:is(:where(.tw\\:peer\\/menu-button)[data-size=sm]~*){top:calc(calc(var(--spacing)) * 1)}.tw\\:peer-data-active\\/menu-button\\:text-sidebar-accent-foreground:is(:is(:where(.tw\\:peer\\/menu-button):where([data-state=active]),:where(.tw\\:peer\\/menu-button):where([data-active]:not([data-active=false])))~*){color:var(--sidebar-accent-foreground)}.tw\\:file\\:inline-flex::file-selector-button{display:inline-flex}.tw\\:file\\:h-6::file-selector-button{height:calc(calc(var(--spacing)) * 6)}.tw\\:file\\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.tw\\:file\\:bg-transparent::file-selector-button{background-color:#0000}.tw\\:file\\:text-sm::file-selector-button{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:file\\:font-medium::file-selector-button{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:file\\:text-foreground::file-selector-button{color:var(--foreground)}.tw\\:placeholder\\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.tw\\:placeholder\\:text-slate-400::placeholder{color:var(--tw-color-slate-400)}.tw\\:before\\:absolute:before{content:var(--tw-content);position:absolute}.tw\\:before\\:top-0\\.5:before{content:var(--tw-content);top:calc(calc(var(--spacing)) * .5)}.tw\\:before\\:left-0:before{content:var(--tw-content);left:calc(calc(var(--spacing)) * 0)}.tw\\:before\\:block:before{content:var(--tw-content);display:block}.tw\\:before\\:hidden:before{content:var(--tw-content);display:none}.tw\\:before\\:h-4:before{content:var(--tw-content);height:calc(calc(var(--spacing)) * 4)}.tw\\:before\\:w-4:before{content:var(--tw-content);width:calc(calc(var(--spacing)) * 4)}.tw\\:before\\:cursor-pointer:before{content:var(--tw-content);cursor:pointer}.tw\\:before\\:rounded:before{content:var(--tw-content);border-radius:.25rem}.tw\\:before\\:border:before{content:var(--tw-content);border-style:var(--tw-border-style);border-width:1px}.tw\\:before\\:border-primary:before{content:var(--tw-content);border-color:var(--primary)}.tw\\:before\\:bg-primary:before{content:var(--tw-content);background-color:var(--primary)}.tw\\:before\\:bg-cover:before{content:var(--tw-content);background-size:cover}.tw\\:before\\:bg-no-repeat:before{content:var(--tw-content);background-repeat:no-repeat}.tw\\:before\\:content-\\[\\"\\"\\]:before{--tw-content:"";content:var(--tw-content)}.tw\\:before\\:content-\\[\\\\\\"\\\\\\"\\]:before{--tw-content:\\"\\";content:var(--tw-content)}.tw\\:after\\:absolute:after{content:var(--tw-content);position:absolute}.tw\\:after\\:-inset-2:after{content:var(--tw-content);inset:calc(calc(var(--spacing)) * -2)}.tw\\:after\\:inset-0:after{content:var(--tw-content);inset:calc(calc(var(--spacing)) * 0)}.tw\\:after\\:-inset-x-3:after{content:var(--tw-content);inset-inline:calc(calc(var(--spacing)) * -3)}.tw\\:after\\:-inset-y-2:after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * -2)}.tw\\:after\\:inset-y-0:after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:after\\:start-1\\/2:after{content:var(--tw-content);inset-inline-start:50%}.tw\\:after\\:top-\\[6px\\]:after{content:var(--tw-content);top:6px}.tw\\:after\\:right-\\[7px\\]:after{content:var(--tw-content);right:7px}.tw\\:after\\:left-\\[7px\\]:after{content:var(--tw-content);left:7px}.tw\\:after\\:block:after{content:var(--tw-content);display:block}.tw\\:after\\:hidden:after{content:var(--tw-content);display:none}.tw\\:after\\:h-0\\.5:after{content:var(--tw-content);height:calc(calc(var(--spacing)) * .5)}.tw\\:after\\:h-\\[6px\\]:after{content:var(--tw-content);height:6px}.tw\\:after\\:w-1:after{content:var(--tw-content);width:calc(calc(var(--spacing)) * 1)}.tw\\:after\\:w-\\[2px\\]:after{content:var(--tw-content);width:2px}.tw\\:after\\:w-\\[3px\\]:after{content:var(--tw-content);width:3px}.tw\\:after\\:-translate-x-1\\/2:after{content:var(--tw-content);--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:after\\:rotate-45:after{content:var(--tw-content);rotate:45deg}.tw\\:after\\:cursor-pointer:after{content:var(--tw-content);cursor:pointer}.tw\\:after\\:rounded-full:after{content:var(--tw-content);border-radius:3.40282e38px}.tw\\:after\\:border:after{content:var(--tw-content);border-style:var(--tw-border-style);border-width:1px}.tw\\:after\\:border-t-0:after{content:var(--tw-content);border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:after\\:border-r-2:after{content:var(--tw-content);border-right-style:var(--tw-border-style);border-right-width:2px}.tw\\:after\\:border-b-2:after{content:var(--tw-content);border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.tw\\:after\\:border-l-0:after{content:var(--tw-content);border-left-style:var(--tw-border-style);border-left-width:0}.tw\\:after\\:border-solid:after{content:var(--tw-content);--tw-border-style:solid;border-style:solid}.tw\\:after\\:border-border:after{content:var(--tw-content);border-color:var(--border)}.tw\\:after\\:border-white:after{content:var(--tw-content);border-color:var(--tw-color-white)}.tw\\:after\\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.tw\\:after\\:bg-muted:after{content:var(--tw-content);background-color:var(--muted)}.tw\\:after\\:opacity-0:after{content:var(--tw-content);opacity:0}.tw\\:after\\:mix-blend-darken:after{content:var(--tw-content);mix-blend-mode:darken}.tw\\:after\\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:after\\:content-\\[\\"\\"\\]:after{--tw-content:"";content:var(--tw-content)}.tw\\:after\\:content-\\[\\\\\\"\\\\\\"\\]:after{--tw-content:\\"\\";content:var(--tw-content)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:after\\:start-full:is(:where(.tw\\:group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);inset-inline-start:100%}.tw\\:group-data-horizontal\\/tabs\\:after\\:inset-x-0:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-horizontal\\/tabs\\:after\\:bottom-\\[-5px\\]:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);bottom:-5px}.tw\\:group-data-horizontal\\/tabs\\:after\\:h-0\\.5:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);height:calc(calc(var(--spacing)) * .5)}.tw\\:group-data-vertical\\/tabs\\:after\\:inset-y-0:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-vertical\\/tabs\\:after\\:-end-1:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);inset-inline-end:calc(calc(var(--spacing)) * -1)}.tw\\:group-data-vertical\\/tabs\\:after\\:w-0\\.5:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);width:calc(calc(var(--spacing)) * .5)}.tw\\:first\\:mt-0:first-child{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:last\\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:even\\:bg-muted:nth-child(2n){background-color:var(--muted)}.tw\\:focus-within\\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-within\\:ring-ring:focus-within{--tw-ring-color:var(--ring)}.tw\\:focus-within\\:ring-offset-1:focus-within{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}@media (hover:hover){.tw\\:hover\\:-mt-4:hover{margin-top:calc(calc(var(--spacing)) * -4)}.tw\\:hover\\:cursor-pointer:hover{cursor:pointer}.tw\\:hover\\:bg-accent:hover,.tw\\:hover\\:bg-accent\\/30:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-accent\\/30:hover{background-color:color-mix(in oklab, var(--accent) 30%, transparent)}}.tw\\:hover\\:bg-accent\\/80:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-accent\\/80:hover{background-color:color-mix(in oklab, var(--accent) 80%, transparent)}}.tw\\:hover\\:bg-blue-600:hover{background-color:var(--tw-color-blue-600)}.tw\\:hover\\:bg-destructive\\/20:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-destructive\\/20:hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:hover\\:bg-gray-50:hover{background-color:var(--tw-color-gray-50)}.tw\\:hover\\:bg-input:hover{background-color:var(--input)}.tw\\:hover\\:bg-muted:hover,.tw\\:hover\\:bg-muted\\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-muted\\/50:hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:hover\\:bg-muted\\/80:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-muted\\/80:hover{background-color:color-mix(in oklab, var(--muted) 80%, transparent)}}.tw\\:hover\\:bg-primary\\/10:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/10:hover{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.tw\\:hover\\:bg-primary\\/70:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/70:hover{background-color:color-mix(in oklab, var(--primary) 70%, transparent)}}.tw\\:hover\\:bg-primary\\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.tw\\:hover\\:bg-red-500:hover{background-color:var(--tw-color-red-500)}.tw\\:hover\\:bg-secondary:hover,.tw\\:hover\\:bg-secondary\\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-secondary\\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.tw\\:hover\\:bg-sidebar-accent:hover{background-color:var(--sidebar-accent)}.tw\\:hover\\:bg-transparent:hover{background-color:#0000}.tw\\:hover\\:text-foreground:hover{color:var(--foreground)}.tw\\:hover\\:text-muted-foreground:hover{color:var(--muted-foreground)}.tw\\:hover\\:text-primary-foreground:hover{color:var(--primary-foreground)}.tw\\:hover\\:text-sidebar-accent-foreground:hover{color:var(--sidebar-accent-foreground)}.tw\\:hover\\:underline:hover{text-decoration-line:underline}.tw\\:hover\\:opacity-80:hover{opacity:.8}.tw\\:hover\\:opacity-100:hover{opacity:1}.tw\\:hover\\:shadow-\\[0_0_0_1px_var\\(--sidebar-accent\\)\\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-accent));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:ring-3:hover{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:group-data-\\[collapsible\\=offcanvas\\]\\:bg-sidebar:hover:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){background-color:var(--sidebar)}.tw\\:hover\\:after\\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:var(--sidebar-border)}}.tw\\:focus\\:relative:focus{position:relative}.tw\\:focus\\:z-10:focus{z-index:10}.tw\\:focus\\:bg-accent:focus{background-color:var(--accent)}.tw\\:focus\\:bg-muted:focus{background-color:var(--muted)}.tw\\:focus\\:text-accent-foreground:focus{color:var(--accent-foreground)}.tw\\:focus\\:text-foreground:focus{color:var(--foreground)}.tw\\:focus\\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus\\:ring-ring:focus{--tw-ring-color:var(--ring)}.tw\\:focus\\:ring-offset-1:focus{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:focus\\:ring-offset-background:focus{--tw-ring-offset-color:var(--background)}.tw\\:focus\\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:focus\\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}:is(.tw\\:focus\\:\\*\\*\\:text-accent-foreground:focus *),:is(.tw\\:not-data-\\[variant\\=destructive\\]\\:focus\\:\\*\\*\\:text-accent-foreground:not([data-variant=destructive]):focus *){color:var(--accent-foreground)}.tw\\:focus-visible\\:relative:focus-visible{position:relative}.tw\\:focus-visible\\:z-10:focus-visible{z-index:10}.tw\\:focus-visible\\:border-destructive\\/40:focus-visible{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:border-destructive\\/40:focus-visible{border-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:focus-visible\\:border-ring:focus-visible{border-color:var(--ring)}.tw\\:focus-visible\\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-3:focus-visible,.tw\\:focus-visible\\:ring-\\[3px\\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-\\[color\\:hsl\\(240\\,5\\%\\,64\\.9\\%\\)\\]:focus-visible{--tw-ring-color:#a1a1aa}.tw\\:focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:focus-visible\\:ring-ring:focus-visible,.tw\\:focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:focus-visible\\:ring-slate-400:focus-visible{--tw-ring-color:var(--tw-color-slate-400)}.tw\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:focus-visible\\:outline-hidden:focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:focus-visible\\:outline-hidden:focus-visible{outline-offset:2px;outline:2px solid #0000}}.tw\\:focus-visible\\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.tw\\:focus-visible\\:outline-ring:focus-visible{outline-color:var(--ring)}.tw\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}:is(.tw\\:\\*\\:focus-visible\\:relative>*):focus-visible{position:relative}:is(.tw\\:\\*\\:focus-visible\\:z-10>*):focus-visible{z-index:10}.tw\\:active\\:bg-sidebar-accent:active{background-color:var(--sidebar-accent)}.tw\\:active\\:text-sidebar-accent-foreground:active{color:var(--sidebar-accent-foreground)}.tw\\:active\\:ring-3:active{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:active\\:not-aria-\\[haspopup\\]\\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:active\\:not-aria-\\[haspopup\\]\\:transform-\\[translateY\\(1px\\)\\]:active:not([aria-haspopup]){transform:translateY(1px)}.tw\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.tw\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.tw\\:disabled\\:bg-input\\/50:disabled{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:disabled\\:bg-input\\/50:disabled{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:disabled\\:bg-transparent:disabled{background-color:#0000}.tw\\:disabled\\:opacity-50:disabled{opacity:.5}:where([data-side=bottom]) .tw\\:in-data-\\[side\\=bottom\\]\\:translate-y-\\[calc\\(-50\\%-1px\\)\\]{--tw-translate-y:calc(-50% - 1px);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=bottom]) .tw\\:in-data-\\[side\\=bottom\\]\\:\\[clip-path\\:polygon\\(100\\%_0\\,100\\%_100\\%\\,0_100\\%\\)\\]{clip-path:polygon(100% 0,100% 100%,0 100%)}:where([data-side=primary]) .tw\\:in-data-\\[side\\=primary\\]\\:cursor-w-resize{cursor:w-resize}:where([data-side=secondary]) .tw\\:in-data-\\[side\\=secondary\\]\\:cursor-e-resize{cursor:e-resize}:where([data-side=top]) .tw\\:in-data-\\[side\\=top\\]\\:translate-y-\\[calc\\(-50\\%-1px\\)\\]{--tw-translate-y:calc(-50% - 1px);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=top]) .tw\\:in-data-\\[side\\=top\\]\\:\\[clip-path\\:polygon\\(100\\%_0\\,100\\%_100\\%\\,0_100\\%\\)\\]{clip-path:polygon(100% 0,100% 100%,0 100%)}:where([data-slot=button-group]) .tw\\:in-data-\\[slot\\=button-group\\]\\:rounded-lg{border-radius:var(--radius)}:where([data-slot=combobox-content]) .tw\\:in-data-\\[slot\\=combobox-content\\]\\:focus-within\\:border-inherit:focus-within{border-color:inherit}:where([data-slot=combobox-content]) .tw\\:in-data-\\[slot\\=combobox-content\\]\\:focus-within\\:ring-0:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:where([data-slot=dialog-content]) .tw\\:in-data-\\[slot\\=dialog-content\\]\\:rounded-lg\\!{border-radius:var(--radius)!important}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/20{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/20{background-color:color-mix(in oklab, var(--background) 20%, transparent)}}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:text-background{color:var(--background)}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:text-destructive{color:var(--destructive)}.tw\\:has-disabled\\:bg-input\\/50:has(:disabled){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-disabled\\:bg-input\\/50:has(:disabled){background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:has-disabled\\:opacity-50:has(:disabled){opacity:.5}.tw\\:has-aria-expanded\\:bg-muted\\/50:has([aria-expanded=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-aria-expanded\\:bg-muted\\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-1:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-1\\.5:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-2:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:has-data-\\[icon\\=inline-end\\]\\:pe-1\\.5:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *):has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-1:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-1\\.5:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-2:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:has-data-\\[icon\\=inline-start\\]\\:ps-1\\.5:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *):has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[slot\\=alert-action\\]\\:relative:has([data-slot=alert-action]){position:relative}.tw\\:has-data-\\[slot\\=alert-action\\]\\:pe-18:has([data-slot=alert-action]){padding-inline-end:calc(calc(var(--spacing)) * 18)}.tw\\:has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.tw\\:has-data-\\[slot\\=card-description\\]\\:grid-rows-\\[auto_auto\\]:has([data-slot=card-description]){grid-template-rows:auto auto}.tw\\:has-data-\\[slot\\=card-footer\\]\\:pb-0:has([data-slot=card-footer]){padding-bottom:calc(calc(var(--spacing)) * 0)}.tw\\:has-data-\\[slot\\=kbd\\]\\:pe-0:has([data-slot=kbd]){padding-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:has-data-\\[slot\\=kbd\\]\\:pe-1\\.5:has([data-slot=kbd]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[variant\\=inset\\]\\:bg-sidebar:has([data-variant=inset]){background-color:var(--sidebar)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:border-ring:has([data-slot=input-group-control]:focus-visible){border-color:var(--ring)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-3:has([data-slot=input-group-control]:focus-visible){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-ring\\/50:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-ring\\/50:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:border-destructive:has([data-slot][aria-invalid=true]){border-color:var(--destructive)}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-3:has([data-slot][aria-invalid=true]){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/20:has([data-slot][aria-invalid=true]){--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/20:has([data-slot][aria-invalid=true]){--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:h-auto:has(>[data-align=block-end]){height:auto}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:flex-col:has(>[data-align=block-end]){flex-direction:column}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:h-auto:has(>[data-align=block-start]){height:auto}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:flex-col:has(>[data-align=block-start]){flex-direction:column}.tw\\:has-\\[\\>\\[data-slot\\=button-group\\]\\]\\:gap-2:has(>[data-slot=button-group]){gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>button\\]\\:ms-\\[-0\\.3rem\\]:has(>button){margin-inline-start:-.3rem}.tw\\:has-\\[\\>button\\]\\:me-\\[-0\\.3rem\\]:has(>button){margin-inline-end:-.3rem}.tw\\:has-\\[\\>img\\]\\:grid-cols-\\[auto_1fr\\]:has(>img){grid-template-columns:auto 1fr}.tw\\:has-\\[\\>img\\]\\:gap-x-2:has(>img){column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>img\\:first-child\\]\\:pt-0:has(>img:first-child){padding-top:calc(calc(var(--spacing)) * 0)}.tw\\:has-\\[\\>kbd\\]\\:ms-\\[-0\\.15rem\\]:has(>kbd){margin-inline-start:-.15rem}.tw\\:has-\\[\\>kbd\\]\\:me-\\[-0\\.15rem\\]:has(>kbd){margin-inline-end:-.15rem}.tw\\:has-\\[\\>svg\\]\\:grid-cols-\\[auto_1fr\\]:has(>svg){grid-template-columns:auto 1fr}.tw\\:has-\\[\\>svg\\]\\:gap-x-2:has(>svg){column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>svg\\]\\:p-0:has(>svg){padding:calc(calc(var(--spacing)) * 0)}.tw\\:has-\\[\\>textarea\\]\\:h-auto:has(>textarea){height:auto}.tw\\:aria-disabled\\:pointer-events-none[aria-disabled=true]{pointer-events:none}.tw\\:aria-disabled\\:opacity-50[aria-disabled=true]{opacity:.5}.tw\\:aria-expanded\\:bg-muted[aria-expanded=true]{background-color:var(--muted)}.tw\\:aria-expanded\\:bg-secondary[aria-expanded=true]{background-color:var(--secondary)}.tw\\:aria-expanded\\:text-foreground[aria-expanded=true]{color:var(--foreground)}.tw\\:aria-expanded\\:text-secondary-foreground[aria-expanded=true]{color:var(--secondary-foreground)}.tw\\:aria-expanded\\:opacity-100[aria-expanded=true]{opacity:1}.tw\\:aria-invalid\\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.tw\\:aria-invalid\\:ring-0[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:aria-invalid\\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:aria-invalid\\:aria-checked\\:border-primary[aria-invalid=true][aria-checked=true]{border-color:var(--primary)}.tw\\:aria-pressed\\:bg-muted[aria-pressed=true]{background-color:var(--muted)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:h-px[aria-orientation=horizontal]{height:1px}.tw\\:aria-\\[orientation\\=horizontal\\]\\:w-full[aria-orientation=horizontal]{width:100%}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:start-0[aria-orientation=horizontal]:after{content:var(--tw-content);inset-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:h-1[aria-orientation=horizontal]:after{content:var(--tw-content);height:calc(calc(var(--spacing)) * 1)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:w-full[aria-orientation=horizontal]:after{content:var(--tw-content);width:100%}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:translate-x-0[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:-translate-y-1\\/2[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:aria-\\[orientation\\=vertical\\]\\:flex-col[aria-orientation=vertical]{flex-direction:column}.tw\\:data-inset\\:ps-7[data-inset]{padding-inline-start:calc(calc(var(--spacing)) * 7)}.tw\\:data-placeholder\\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.tw\\:data-quiet-focus\\:focus-visible\\:border-transparent[data-quiet-focus]:focus-visible{border-color:#0000}.tw\\:data-quiet-focus\\:focus-visible\\:ring-0[data-quiet-focus]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-quiet-focus\\:focus-visible\\:outline-none[data-quiet-focus]:focus-visible{--tw-outline-style:none;outline-style:none}.tw\\:data-\\[align-trigger\\=false\\]\\:min-w-36[data-align-trigger=false]{min-width:calc(calc(var(--spacing)) * 36)}.tw\\:data-\\[align-trigger\\=true\\]\\:min-w-\\(--radix-select-trigger-width\\)[data-align-trigger=true]{min-width:var(--radix-select-trigger-width)}.tw\\:data-\\[align-trigger\\=true\\]\\:animate-none[data-align-trigger=true]{animation:none}.tw\\:data-\\[disabled\\=true\\]\\:pointer-events-none[data-disabled=true]{pointer-events:none}.tw\\:data-\\[disabled\\=true\\]\\:opacity-50[data-disabled=true]{opacity:.5}.tw\\:data-\\[position\\=popper\\]\\:h-\\(--radix-select-trigger-height\\)[data-position=popper]{height:var(--radix-select-trigger-height)}.tw\\:data-\\[position\\=popper\\]\\:w-full[data-position=popper]{width:100%}.tw\\:data-\\[position\\=popper\\]\\:min-w-\\(--radix-select-trigger-width\\)[data-position=popper]{min-width:var(--radix-select-trigger-width)}.tw\\:data-\\[side\\=bottom\\]\\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.tw\\:data-\\[side\\=left\\]\\:-translate-x-1[data-side=left]{--tw-translate-x:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.tw\\:data-\\[side\\=right\\]\\:translate-x-1[data-side=right]{--tw-translate-x:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.tw\\:data-\\[side\\=top\\]\\:-translate-y-1[data-side=top]{--tw-translate-y:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.tw\\:data-\\[size\\=default\\]\\:h-8[data-size=default]{height:calc(calc(var(--spacing)) * 8)}.tw\\:data-\\[size\\=default\\]\\:h-\\[18\\.4px\\][data-size=default]{height:18.4px}.tw\\:data-\\[size\\=default\\]\\:w-\\[32px\\][data-size=default]{width:32px}.tw\\:data-\\[size\\=lg\\]\\:size-10[data-size=lg]{width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:data-\\[size\\=md\\]\\:text-sm[data-size=md]{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:data-\\[size\\=sm\\]\\:size-6[data-size=sm]{width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:data-\\[size\\=sm\\]\\:h-7[data-size=sm]{height:calc(calc(var(--spacing)) * 7)}.tw\\:data-\\[size\\=sm\\]\\:h-\\[14px\\][data-size=sm]{height:14px}.tw\\:data-\\[size\\=sm\\]\\:w-\\[24px\\][data-size=sm]{width:24px}.tw\\:data-\\[size\\=sm\\]\\:gap-3[data-size=sm]{gap:calc(calc(var(--spacing)) * 3)}.tw\\:data-\\[size\\=sm\\]\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,10px\\)\\][data-size=sm]{border-radius:min(var(--tw-radius-md), 10px)}.tw\\:data-\\[size\\=sm\\]\\:py-3[data-size=sm]{padding-block:calc(calc(var(--spacing)) * 3)}.tw\\:data-\\[size\\=sm\\]\\:text-xs[data-size=sm]{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:data-\\[size\\=sm\\]\\:has-data-\\[slot\\=card-footer\\]\\:pb-0[data-size=sm]:has([data-slot=card-footer]){padding-bottom:calc(calc(var(--spacing)) * 0)}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-item]:focus{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-item]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:data-highlighted\\:bg-foreground\\/10 *)[data-slot$=-item][data-highlighted]{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:data-highlighted\\:bg-foreground\\/10 *)[data-slot$=-item][data-highlighted]{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-separator\\]\\:bg-foreground\\/5 *)[data-slot$=-separator]{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-separator\\]\\:bg-foreground\\/5 *)[data-slot$=-separator]{background-color:color-mix(in oklab, var(--foreground) 5%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-trigger]:focus{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-trigger]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:aria-expanded\\:bg-foreground\\/10\\! *)[data-slot$=-trigger][aria-expanded=true]{background-color:var(--foreground)!important}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:aria-expanded\\:bg-foreground\\/10\\! *)[data-slot$=-trigger][aria-expanded=true]{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)!important}}:is(.tw\\:\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90>*)[data-slot=alert-description]{color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90>*)[data-slot=alert-description]{color:color-mix(in oklab, var(--destructive) 90%, transparent)}}:is(.tw\\:\\*\\:data-\\[slot\\=avatar\\]\\:ring-2>*)[data-slot=avatar]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:is(.tw\\:\\*\\:data-\\[slot\\=avatar\\]\\:ring-background>*)[data-slot=avatar]{--tw-ring-color:var(--background)}:is(.tw\\:\\*\\:data-\\[slot\\=input-group-addon\\]\\:ps-2\\!>*)[data-slot=input-group-addon]{padding-inline-start:calc(calc(var(--spacing)) * 2)!important}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:relative *)[data-slot=kbd]{position:relative}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:isolate *)[data-slot=kbd]{isolation:isolate}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:z-50 *)[data-slot=kbd]{z-index:50}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:rounded-sm *)[data-slot=kbd]{border-radius:calc(var(--radius) * .6)}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:flex>*)[data-slot=select-value]{display:flex}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:flex-1>*)[data-slot=select-value]{flex:1}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:items-center>*)[data-slot=select-value]{align-items:center}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:gap-1\\.5>*)[data-slot=select-value]{gap:calc(calc(var(--spacing)) * 1.5)}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:text-start>*)[data-slot=select-value]{text-align:start}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:first\\:rounded-s-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"]:first-child{border-start-start-radius:var(--radius);border-end-start-radius:var(--radius)}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:first\\:rounded-t-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"]:first-child{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:last\\:rounded-e-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"]:last-child{border-start-end-radius:var(--radius);border-end-end-radius:var(--radius)}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:last\\:rounded-b-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"]:last-child{border-bottom-right-radius:var(--radius);border-bottom-left-radius:var(--radius)}.tw\\:data-\\[state\\=active\\]\\:bg-background[data-state=active]{background-color:var(--background)}.tw\\:data-\\[state\\=active\\]\\:text-foreground[data-state=active]{color:var(--foreground)}.tw\\:data-\\[state\\=active\\]\\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-\\[state\\=closed\\]\\:overflow-hidden[data-state=closed]{overflow:hidden}.tw\\:data-\\[state\\=delayed-open\\]\\:animate-in[data-state=delayed-open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-\\[state\\=delayed-open\\]\\:fade-in-0[data-state=delayed-open]{--tw-enter-opacity:0}.tw\\:data-\\[state\\=delayed-open\\]\\:zoom-in-95[data-state=delayed-open]{--tw-enter-scale:.95}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-approved\\)\\][data-state=on]{background-color:var(--inv-soft-approved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-unapproved\\)\\][data-state=on]{background-color:var(--inv-soft-unapproved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-unknown\\)\\][data-state=on]{background-color:var(--inv-soft-unknown)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-approved\\)\\][data-state=on]{background-color:var(--inv-vivid-approved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-unapproved\\)\\][data-state=on]{background-color:var(--inv-vivid-unapproved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-unknown\\)\\][data-state=on]{background-color:var(--inv-vivid-unknown)}.tw\\:data-\\[state\\=on\\]\\:bg-muted[data-state=on]{background-color:var(--muted)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-approved\\)\\][data-state=on]{color:var(--inv-icon-approved)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-unapproved\\)\\][data-state=on]{color:var(--inv-icon-unapproved)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-unknown\\)\\][data-state=on]{color:var(--inv-icon-unknown)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-on\\)\\][data-state=on]{color:var(--inv-on)}.tw\\:data-\\[state\\=on\\]\\:text-foreground[data-state=on]{color:var(--foreground)}.tw\\:data-\\[state\\=open\\]\\:bg-accent[data-state=open]{background-color:var(--accent)}.tw\\:data-\\[state\\=open\\]\\:bg-muted[data-state=open]{background-color:var(--muted)}.tw\\:data-\\[state\\=open\\]\\:text-foreground[data-state=open]{color:var(--foreground)}.tw\\:data-\\[state\\=selected\\]\\:bg-muted[data-state=selected]{background-color:var(--muted)}.tw\\:data-\\[variant\\=destructive\\]\\:text-destructive[data-variant=destructive]{color:var(--destructive)}:is(:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:\\*\\*\\:text-accent-foreground\\! *)[data-variant=destructive] *),:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:text-accent-foreground\\! *)[data-variant=destructive]{color:var(--accent-foreground)!important}.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:text-destructive[data-variant=destructive]:focus{color:var(--destructive)}:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-foreground\\/10\\! *)[data-variant=destructive]:focus{background-color:var(--foreground)!important}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-foreground\\/10\\! *)[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)!important}}.tw\\:data-\\[variant\\=line\\]\\:rounded-none[data-variant=line]{border-radius:0}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:border-s-0:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"][data-variant=outline]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:border-t-0:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"][data-variant=outline]{border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:first\\:border-s:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"][data-variant=outline]:first-child{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:first\\:border-t:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"][data-variant=outline]:first-child{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:inset-x-0[data-vaul-drawer-direction=bottom]{inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:bottom-0[data-vaul-drawer-direction=bottom]{bottom:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:mt-24[data-vaul-drawer-direction=bottom]{margin-top:calc(calc(var(--spacing)) * 24)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:max-h-\\[80vh\\][data-vaul-drawer-direction=bottom]{max-height:80vh}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:rounded-t-xl[data-vaul-drawer-direction=bottom]{border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:border-t[data-vaul-drawer-direction=bottom]{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:inset-y-0[data-vaul-drawer-direction=left]{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:left-0[data-vaul-drawer-direction=left]{left:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:w-3\\/4[data-vaul-drawer-direction=left]{width:75%}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:flex-row[data-vaul-drawer-direction=left]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:rounded-r-xl[data-vaul-drawer-direction=left]{border-top-right-radius:calc(var(--radius) * 1.4);border-bottom-right-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:border-r[data-vaul-drawer-direction=left]{border-right-style:var(--tw-border-style);border-right-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=left\\/right\\]\\:flex-row[data-vaul-drawer-direction=left\\/right]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:inset-y-0[data-vaul-drawer-direction=right]{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:right-0[data-vaul-drawer-direction=right]{right:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:w-3\\/4[data-vaul-drawer-direction=right]{width:75%}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:flex-row[data-vaul-drawer-direction=right]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:rounded-l-xl[data-vaul-drawer-direction=right]{border-top-left-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:border-l[data-vaul-drawer-direction=right]{border-left-style:var(--tw-border-style);border-left-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:inset-x-0[data-vaul-drawer-direction=top]{inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:top-0[data-vaul-drawer-direction=top]{top:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:mb-24[data-vaul-drawer-direction=top]{margin-bottom:calc(calc(var(--spacing)) * 24)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:max-h-\\[80vh\\][data-vaul-drawer-direction=top]{max-height:80vh}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:rounded-b-xl[data-vaul-drawer-direction=top]{border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:border-b[data-vaul-drawer-direction=top]{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.tw\\:supports-backdrop-filter\\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--tw-blur-xs));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}}@media (min-width:40rem){.tw\\:sm\\:flex{display:flex}.tw\\:sm\\:max-w-sm{max-width:var(--tw-container-sm)}.tw\\:sm\\:flex-row{flex-direction:row}.tw\\:sm\\:justify-end{justify-content:flex-end}.tw\\:sm\\:p-8{padding:calc(calc(var(--spacing)) * 8)}.tw\\:sm\\:text-start{text-align:start}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:sm\\:max-w-sm[data-vaul-drawer-direction=left],.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:sm\\:max-w-sm[data-vaul-drawer-direction=right]{max-width:var(--tw-container-sm)}}@media (min-width:48rem){.tw\\:md\\:block{display:block}.tw\\:md\\:flex{display:flex}.tw\\:md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:md\\:gap-0\\.5{gap:calc(calc(var(--spacing)) * .5)}.tw\\:md\\:text-start{text-align:start}.tw\\:md\\:text-sm{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:md\\:text-pretty{text-wrap:pretty}.tw\\:md\\:opacity-0{opacity:0}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:m-2:is(:where(.tw\\:peer)[data-variant=inset]~*){margin:calc(calc(var(--spacing)) * 2)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:ms-0:is(:where(.tw\\:peer)[data-variant=inset]~*){margin-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:rounded-xl:is(:where(.tw\\:peer)[data-variant=inset]~*){border-radius:calc(var(--radius) * 1.4)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:shadow-sm:is(:where(.tw\\:peer)[data-variant=inset]~*){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:peer-data-\\[state\\=collapsed\\]\\:ms-2:is(:where(.tw\\:peer)[data-variant=inset]~*):is(:where(.tw\\:peer)[data-state=collapsed]~*){margin-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:md\\:after\\:hidden:after{content:var(--tw-content);display:none}}@media (min-width:64rem){.tw\\:lg\\:flex{display:flex}.tw\\:lg\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}:where(.tw\\:lg\\:space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 8) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 8) * calc(1 - var(--tw-space-x-reverse)))}.tw\\:lg\\:text-5xl{font-size:var(--tw-text-5xl);line-height:var(--tw-leading,var(--tw-text-5xl--line-height))}}@media (min-width:48rem){@media (min-width:64rem){.tw\\:md\\:lg\\:hidden{display:none}}}@media (min-width:80rem){.tw\\:xl\\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.tw\\:xl\\:grid-flow-col{grid-auto-flow:column}.tw\\:xl\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:xl\\:grid-cols-none{grid-template-columns:none}.tw\\:xl\\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}}@container search not (min-width:7rem){.tw\\:\\@max-\\[7rem\\]\\/search\\:hidden{display:none}.tw\\:\\@max-\\[7rem\\]\\/search\\:ps-3{padding-inline-start:calc(calc(var(--spacing)) * 3)}}@container search not (min-width:4rem){.tw\\:\\@max-\\[4rem\\]\\/search\\:hidden{display:none}.tw\\:\\@max-\\[4rem\\]\\/search\\:pe-3{padding-inline-end:calc(calc(var(--spacing)) * 3)}}@container search not (min-width:3rem){.tw\\:\\@max-\\[3rem\\]\\/search\\:ps-0{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\@max-\\[3rem\\]\\/search\\:pe-0{padding-inline-end:calc(calc(var(--spacing)) * 0)}}@container (min-width:24rem){.tw\\:\\@sm\\:basis-auto{flex-basis:auto}}.tw\\:ltr\\:left-2:where(:dir(ltr),[dir=ltr],[dir=ltr] *){left:calc(calc(var(--spacing)) * 2)}.tw\\:ltr\\:-translate-x-1\\/2:where(:dir(ltr),[dir=ltr],[dir=ltr] *){--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:right-2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:calc(calc(var(--spacing)) * 2)}.tw\\:rtl\\:flex:where(:dir(rtl),[dir=rtl],[dir=rtl] *){display:flex}.tw\\:rtl\\:-translate-x-px:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:translate-x-1\\/2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:translate-x-px:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:after\\:translate-x-1\\/2:where(:dir(rtl),[dir=rtl],[dir=rtl] *):after{content:var(--tw-content);--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=primary]) .tw\\:rtl\\:in-data-\\[side\\=primary\\]\\:cursor-e-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:e-resize}:where([data-side=secondary]) .tw\\:rtl\\:in-data-\\[side\\=secondary\\]\\:cursor-w-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:w-resize}.tw\\:rtl\\:aria-\\[orientation\\=horizontal\\]\\:after\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:data-\\[side\\=left\\]\\:translate-x-1:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-side=left]{--tw-translate-x:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:data-\\[side\\=right\\]\\:-translate-x-1:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-side=right]{--tw-translate-x:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:border-input:is(.dark *){border-color:var(--input)}.tw\\:dark\\:bg-destructive\\/20:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:bg-destructive\\/20:is(.dark *){background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:dark\\:bg-input\\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:bg-input\\/30:is(.dark *){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:dark\\:bg-transparent:is(.dark *){background-color:#0000}.tw\\:dark\\:text-amber-400:is(.dark *){color:var(--tw-color-amber-400)}.tw\\:dark\\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}.tw\\:dark\\:text-rose-400:is(.dark *){color:var(--tw-color-rose-400)}.tw\\:dark\\:text-sky-400:is(.dark *){color:var(--tw-color-sky-400)}.tw\\:dark\\:text-teal-400:is(.dark *){color:var(--tw-color-teal-400)}.tw\\:dark\\:after\\:mix-blend-lighten:is(.dark *):after{content:var(--tw-content);mix-blend-mode:lighten}@media (hover:hover){.tw\\:dark\\:hover\\:bg-blue-500:is(.dark *):hover{background-color:var(--tw-color-blue-500)}.tw\\:dark\\:hover\\:bg-destructive\\/30:is(.dark *):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-destructive\\/30:is(.dark *):hover{background-color:color-mix(in oklab, var(--destructive) 30%, transparent)}}.tw\\:dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:dark\\:hover\\:bg-muted\\/50:is(.dark *):hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-muted\\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:dark\\:hover\\:text-foreground:is(.dark *):hover{color:var(--foreground)}}.tw\\:dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:disabled\\:bg-input\\/80:is(.dark *):disabled{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:disabled\\:bg-input\\/80:is(.dark *):disabled{background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:dark\\:disabled\\:bg-transparent:is(.dark *):disabled{background-color:#0000}:where([data-slot=tooltip-content]) .tw\\:dark\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/10:is(.dark *){background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){:where([data-slot=tooltip-content]) .tw\\:dark\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/10:is(.dark *){background-color:color-mix(in oklab, var(--background) 10%, transparent)}}.tw\\:dark\\:has-disabled\\:bg-input\\/80:is(.dark *):has(:disabled){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:has-disabled\\:bg-input\\/80:is(.dark *):has(:disabled){background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:dark\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/40:is(.dark *):has([data-slot][aria-invalid=true]){--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/40:is(.dark *):has([data-slot][aria-invalid=true]){--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:aria-invalid\\:border-destructive\\/50:is(.dark *)[aria-invalid=true]{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:aria-invalid\\:border-destructive\\/50:is(.dark *)[aria-invalid=true]{border-color:color-mix(in oklab, var(--destructive) 50%, transparent)}}.tw\\:dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:data-open\\:animate-in:where([data-state=open]),.tw\\:data-open\\:animate-in:where([data-open]:not([data-open=false])){animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-open\\:bg-accent:where([data-state=open]),.tw\\:data-open\\:bg-accent:where([data-open]:not([data-open=false])){background-color:var(--accent)}.tw\\:data-open\\:text-accent-foreground:where([data-state=open]),.tw\\:data-open\\:text-accent-foreground:where([data-open]:not([data-open=false])){color:var(--accent-foreground)}.tw\\:data-open\\:fade-in-0:where([data-state=open]),.tw\\:data-open\\:fade-in-0:where([data-open]:not([data-open=false])){--tw-enter-opacity:0}.tw\\:data-open\\:zoom-in-95:where([data-state=open]),.tw\\:data-open\\:zoom-in-95:where([data-open]:not([data-open=false])){--tw-enter-scale:.95}@media (hover:hover){:is(.tw\\:data-open\\:hover\\:bg-sidebar-accent:where([data-state=open]),.tw\\:data-open\\:hover\\:bg-sidebar-accent:where([data-open]:not([data-open=false]))):hover{background-color:var(--sidebar-accent)}:is(.tw\\:data-open\\:hover\\:text-sidebar-accent-foreground:where([data-state=open]),.tw\\:data-open\\:hover\\:text-sidebar-accent-foreground:where([data-open]:not([data-open=false]))):hover{color:var(--sidebar-accent-foreground)}}.tw\\:data-closed\\:animate-out:where([data-state=closed]),.tw\\:data-closed\\:animate-out:where([data-closed]:not([data-closed=false])){animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-closed\\:fade-out-0:where([data-state=closed]),.tw\\:data-closed\\:fade-out-0:where([data-closed]:not([data-closed=false])){--tw-exit-opacity:0}.tw\\:data-closed\\:zoom-out-95:where([data-state=closed]),.tw\\:data-closed\\:zoom-out-95:where([data-closed]:not([data-closed=false])){--tw-exit-scale:.95}.tw\\:data-checked\\:border-primary:where([data-state=checked]),.tw\\:data-checked\\:border-primary:where([data-checked]:not([data-checked=false])){border-color:var(--primary)}.tw\\:data-checked\\:bg-primary:where([data-state=checked]),.tw\\:data-checked\\:bg-primary:where([data-checked]:not([data-checked=false])){background-color:var(--primary)}.tw\\:data-checked\\:text-primary-foreground:where([data-state=checked]),.tw\\:data-checked\\:text-primary-foreground:where([data-checked]:not([data-checked=false])){color:var(--primary-foreground)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=checked]),.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-checked]:not([data-checked=false])),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=checked]),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-checked]:not([data-checked=false])){--tw-translate-x:calc(100% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=checked]),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-checked]:not([data-checked=false])),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=checked]),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-checked]:not([data-checked=false])){--tw-translate-x:calc(calc(100% - 2px) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:data-checked\\:bg-primary:is(.dark *):where([data-state=checked]),.tw\\:dark\\:data-checked\\:bg-primary:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--primary)}.tw\\:dark\\:data-checked\\:bg-primary-foreground:is(.dark *):where([data-state=checked]),.tw\\:dark\\:data-checked\\:bg-primary-foreground:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--primary-foreground)}.tw\\:data-unchecked\\:bg-input:where([data-state=unchecked]),.tw\\:data-unchecked\\:bg-input:where([data-unchecked]:not([data-unchecked=false])){background-color:var(--input)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=unchecked]),.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=unchecked]),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=unchecked]),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=unchecked]),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-unchecked]:not([data-unchecked=false])){--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:data-unchecked\\:bg-foreground:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-foreground:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:var(--foreground)}.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:data-selected\\:bg-muted:where([data-selected=true]),.tw\\:data-selected\\:bg-muted\\/50:where([data-selected=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:bg-muted\\/50:where([data-selected=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:data-selected\\:bg-primary:where([data-selected=true]){background-color:var(--primary)}.tw\\:data-selected\\:bg-transparent:where([data-selected=true]){background-color:#0000}.tw\\:data-selected\\:text-foreground:where([data-selected=true]){color:var(--foreground)}.tw\\:data-selected\\:text-inherit:where([data-selected=true]){color:inherit}.tw\\:data-selected\\:text-muted-foreground\\/50:where([data-selected=true]){color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:text-muted-foreground\\/50:where([data-selected=true]){color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.tw\\:data-selected\\:text-primary-foreground:where([data-selected=true]){color:var(--primary-foreground)}.tw\\:data-selected\\:ring-2:where([data-selected=true]){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-selected\\:ring-primary-foreground\\/70:where([data-selected=true]){--tw-ring-color:var(--primary-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:ring-primary-foreground\\/70:where([data-selected=true]){--tw-ring-color:color-mix(in oklab, var(--primary-foreground) 70%, transparent)}}.tw\\:data-selected\\:ring-ring\\/50:where([data-selected=true]){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:ring-ring\\/50:where([data-selected=true]){--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:data-selected\\:ring-inset:where([data-selected=true]){--tw-ring-inset:inset}@media (forced-colors:active){.tw\\:forced-colors\\:data-selected\\:outline-2:where([data-selected=true]){outline-style:var(--tw-outline-style);outline-width:2px}.tw\\:forced-colors\\:data-selected\\:-outline-offset-2:where([data-selected=true]){outline-offset:calc(2px * -1)}.tw\\:forced-colors\\:data-selected\\:outline-\\[color\\:Highlight\\]:where([data-selected=true]){outline-color:highlight}}.tw\\:data-disabled\\:pointer-events-none:where([data-disabled=true]),.tw\\:data-disabled\\:pointer-events-none:where([data-disabled]:not([data-disabled=false])){pointer-events:none}.tw\\:data-disabled\\:cursor-not-allowed:where([data-disabled=true]),.tw\\:data-disabled\\:cursor-not-allowed:where([data-disabled]:not([data-disabled=false])){cursor:not-allowed}.tw\\:data-disabled\\:opacity-50:where([data-disabled=true]),.tw\\:data-disabled\\:opacity-50:where([data-disabled]:not([data-disabled=false])){opacity:.5}.tw\\:data-active\\:bg-background:where([data-state=active]),.tw\\:data-active\\:bg-background:where([data-active]:not([data-active=false])){background-color:var(--background)}.tw\\:data-active\\:bg-sidebar-accent:where([data-state=active]),.tw\\:data-active\\:bg-sidebar-accent:where([data-active]:not([data-active=false])){background-color:var(--sidebar-accent)}.tw\\:data-active\\:font-medium:where([data-state=active]),.tw\\:data-active\\:font-medium:where([data-active]:not([data-active=false])){--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:data-active\\:text-foreground:where([data-state=active]),.tw\\:data-active\\:text-foreground:where([data-active]:not([data-active=false])){color:var(--foreground)}.tw\\:data-active\\:text-sidebar-accent-foreground:where([data-state=active]),.tw\\:data-active\\:text-sidebar-accent-foreground:where([data-active]:not([data-active=false])){color:var(--sidebar-accent-foreground)}.tw\\:group-data-\\[variant\\=default\\]\\/tabs-list\\:data-active\\:shadow-sm:is(:where(.tw\\:group\\/tabs-list)[data-variant=default] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=default\\]\\/tabs-list\\:data-active\\:shadow-sm:is(:where(.tw\\:group\\/tabs-list)[data-variant=default] *):where([data-active]:not([data-active=false])){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:shadow-none:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:shadow-none:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:is(.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:after\\:opacity-100:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:after\\:opacity-100:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false]))):after{content:var(--tw-content);opacity:1}.tw\\:dark\\:data-active\\:border-input:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:border-input:is(.dark *):where([data-active]:not([data-active=false])){border-color:var(--input)}.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:dark\\:data-active\\:text-foreground:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:text-foreground:is(.dark *):where([data-active]:not([data-active=false])){color:var(--foreground)}.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:border-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:border-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){border-color:#0000}.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.tw\\:data-horizontal\\:mx-px:where([data-orientation=horizontal]){margin-inline:1px}.tw\\:data-horizontal\\:h-1:where([data-orientation=horizontal]){height:calc(calc(var(--spacing)) * 1)}.tw\\:data-horizontal\\:h-full:where([data-orientation=horizontal]){height:100%}.tw\\:data-horizontal\\:h-px:where([data-orientation=horizontal]){height:1px}.tw\\:data-horizontal\\:w-auto:where([data-orientation=horizontal]){width:auto}.tw\\:data-horizontal\\:w-full:where([data-orientation=horizontal]){width:100%}.tw\\:data-horizontal\\:flex-col:where([data-orientation=horizontal]){flex-direction:column}.tw\\:data-vertical\\:my-px:where([data-orientation=vertical]){margin-block:1px}.tw\\:data-vertical\\:h-auto:where([data-orientation=vertical]){height:auto}.tw\\:data-vertical\\:h-full:where([data-orientation=vertical]){height:100%}.tw\\:data-vertical\\:min-h-40:where([data-orientation=vertical]){min-height:calc(calc(var(--spacing)) * 40)}.tw\\:data-vertical\\:w-1:where([data-orientation=vertical]){width:calc(calc(var(--spacing)) * 1)}.tw\\:data-vertical\\:w-auto:where([data-orientation=vertical]){width:auto}.tw\\:data-vertical\\:w-full:where([data-orientation=vertical]){width:100%}.tw\\:data-vertical\\:w-px:where([data-orientation=vertical]){width:1px}.tw\\:data-vertical\\:flex-col:where([data-orientation=vertical]){flex-direction:column}.tw\\:data-vertical\\:items-stretch:where([data-orientation=vertical]){align-items:stretch}.tw\\:data-vertical\\:self-stretch:where([data-orientation=vertical]){align-self:stretch}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:mt-0 [data-lexical-editor=true]>blockquote{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:border-s-0 [data-lexical-editor=true]>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:ps-0 [data-lexical-editor=true]>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:font-normal [data-lexical-editor=true]>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:text-foreground [data-lexical-editor=true]>blockquote{color:var(--foreground)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:not-italic [data-lexical-editor=true]>blockquote{font-style:normal}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:mt-0 [data-lexical-editor=\\"true\\"]>blockquote{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:border-s-0 [data-lexical-editor=\\"true\\"]>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:ps-0 [data-lexical-editor=\\"true\\"]>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:font-normal [data-lexical-editor=\\"true\\"]>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:text-foreground [data-lexical-editor=\\"true\\"]>blockquote{color:var(--foreground)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:not-italic [data-lexical-editor=\\"true\\"]>blockquote{font-style:normal}.tw\\:\\[\\&_a\\]\\:underline a{text-decoration-line:underline}.tw\\:\\[\\&_a\\]\\:underline-offset-3 a{text-underline-offset:3px}@media (hover:hover){.tw\\:\\[\\&_a\\]\\:hover\\:text-foreground a:hover{color:var(--foreground)}}.tw\\:\\[\\&_p\\]\\:my-0 p{margin-block:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_p\\:not\\(\\:last-child\\)\\]\\:mb-4 p:not(:last-child){margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_s\\]\\:text-destructive s{color:var(--destructive)}.tw\\:\\[\\&_s\\]\\:line-through s{text-decoration-line:line-through}.tw\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.tw\\:\\[\\&_svg\\]\\:size-4 svg{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3\\.5 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_tr\\]\\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.tw\\:\\[\\&_tr\\:last-child\\]\\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.tw\\:\\[\\&_u\\]\\:font-semibold u{--tw-font-weight:var(--tw-font-weight-semibold);font-weight:var(--tw-font-weight-semibold)}.tw\\:\\[\\&_u\\]\\:text-success-foreground u{color:var(--success-foreground)}.tw\\:\\[\\&_u\\]\\:no-underline u{text-decoration-line:none}.tw\\:\\[\\&\\:has\\(\\[role\\=checkbox\\]\\)\\]\\:pe-0:has([role=checkbox]){padding-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\.border-b\\]\\:pb-2.border-b{padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:\\[\\.border-b\\]\\:pb-4.border-b{padding-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:\\[\\.border-b\\]\\:pb-3:is(:where(.tw\\:group\\/card)[data-size=sm] *).border-b{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:\\[\\.border-t\\]\\:pt-2.border-t{padding-top:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:px-2 *)[cmdk-group-heading]{padding-inline:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:py-1\\.5 *)[cmdk-group-heading]{padding-block:calc(calc(var(--spacing)) * 1.5)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:text-xs *)[cmdk-group-heading]{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:font-medium *)[cmdk-group-heading]{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:text-muted-foreground *)[cmdk-group-heading]{color:var(--muted-foreground)}:is(.tw\\:\\*\\:\\[a\\]\\:underline>*):is(a){text-decoration-line:underline}:is(.tw\\:\\*\\:\\[a\\]\\:underline-offset-3>*):is(a){text-underline-offset:3px}@media (hover:hover){.tw\\:\\[a\\]\\:hover\\:bg-destructive\\/20:is(a):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-destructive\\/20:is(a):hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:\\[a\\]\\:hover\\:bg-muted:is(a):hover{background-color:var(--muted)}.tw\\:\\[a\\]\\:hover\\:bg-primary\\/80:is(a):hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-primary\\/80:is(a):hover{background-color:color-mix(in oklab, var(--primary) 80%, transparent)}}.tw\\:\\[a\\]\\:hover\\:bg-secondary\\/80:is(a):hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-secondary\\/80:is(a):hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.tw\\:\\[a\\]\\:hover\\:text-muted-foreground:is(a):hover{color:var(--muted-foreground)}:is(.tw\\:\\*\\:\\[a\\]\\:hover\\:text-foreground>*):is(a):hover{color:var(--foreground)}}:is(.tw\\:\\*\\:\\[img\\]\\:row-span-2>*):is(img){grid-row:span 2/span 2}:is(.tw\\:\\*\\:\\[img\\]\\:translate-y-0\\.5>*):is(img){--tw-translate-y:calc(calc(var(--spacing)) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.tw\\:\\*\\:\\[img\\]\\:text-current>*):is(img){color:currentColor}:is(.tw\\:\\*\\:\\[img\\:first-child\\]\\:rounded-t-xl>*):is(img:first-child){border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}:is(.tw\\:\\*\\:\\[img\\:last-child\\]\\:rounded-b-xl>*):is(img:last-child){border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}:is(.tw\\:\\*\\:\\[img\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>*):is(img:not([class*=size-])){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:flex>*):is(span):last-child{display:flex}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:items-center>*):is(span):last-child{align-items:center}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:gap-2>*):is(span):last-child{gap:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\:\\[svg\\]\\:row-span-2>*):is(svg){grid-row:span 2/span 2}:is(.tw\\:\\*\\:\\[svg\\]\\:translate-y-0\\.5>*):is(svg){--tw-translate-y:calc(calc(var(--spacing)) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.tw\\:\\*\\:\\[svg\\]\\:text-current>*):is(svg){color:currentColor}:is(.tw\\:focus\\:\\*\\:\\[svg\\]\\:text-accent-foreground:focus>*):is(svg){color:var(--accent-foreground)}:is(.tw\\:data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:text-destructive[data-variant=destructive]>*):is(svg){color:var(--destructive)}:is(.tw\\:data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:text-destructive\\![data-variant=destructive]>*):is(svg){color:var(--destructive)!important}:is(.tw\\:data-selected\\:\\*\\:\\[svg\\]\\:text-foreground:where([data-selected=true])>*):is(svg){color:var(--foreground)}:is(.tw\\:\\*\\:\\[svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>*):is(svg:not([class*=size-])){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-s-none>:not(:first-child){border-start-start-radius:0;border-end-start-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-t-none>:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-s-0>:not(:first-child){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-t-0>:not(:first-child){border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-e-none>:not(:last-child){border-start-end-radius:0;border-end-end-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-b-none>:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.tw\\:has-\\[select\\[aria-hidden\\=true\\]\\:last-child\\]\\:\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:last-of-type\\]\\:rounded-e-lg:has(:is(select[aria-hidden=true]:last-child))>[data-slot=select-trigger]:last-of-type{border-start-end-radius:var(--radius);border-end-end-radius:var(--radius)}.tw\\:\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:not\\(\\[class\\*\\=w-\\]\\)\\]\\:w-fit>[data-slot=select-trigger]:not([class*=w-]){width:fit-content}.tw\\:\\[\\&\\>\\[data-slot\\]\\:not\\(\\:has\\(\\~\\[data-slot\\]\\)\\)\\]\\:rounded-e-lg\\!>[data-slot]:not(:has(~[data-slot])){border-start-end-radius:var(--radius)!important;border-end-end-radius:var(--radius)!important}.tw\\:\\[\\&\\>\\[data-slot\\]\\:not\\(\\:has\\(\\~\\[data-slot\\]\\)\\)\\]\\:rounded-b-lg\\!>[data-slot]:not(:has(~[data-slot])){border-bottom-right-radius:var(--radius)!important;border-bottom-left-radius:var(--radius)!important}.tw\\:\\[\\&\\>a\\]\\:underline>a{text-decoration-line:underline}.tw\\:\\[\\&\\>a\\]\\:underline-offset-4>a{text-underline-offset:4px}.tw\\:\\[\\&\\>a\\:hover\\]\\:text-primary>a:hover{color:var(--primary)}.tw\\:\\[\\&\\>blockquote\\]\\:my-0>blockquote{margin-block:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:border-s-0>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&\\>blockquote\\]\\:p-0>blockquote{padding:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:ps-0>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:font-normal>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&\\>blockquote\\]\\:text-foreground>blockquote{color:var(--foreground)}.tw\\:\\[\\&\\>blockquote\\]\\:not-italic>blockquote{font-style:normal}.tw\\:\\[\\&\\>input\\]\\:flex-1>input{flex:1}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:\\[\\&\\>input\\]\\:pt-3:has(>[data-align=block-end])>input{padding-top:calc(calc(var(--spacing)) * 3)}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:\\[\\&\\>input\\]\\:pb-3:has(>[data-align=block-start])>input{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:has-\\[\\>\\[data-align\\=inline-end\\]\\]\\:\\[\\&\\>input\\]\\:pe-1\\.5:has(>[data-align=inline-end])>input{padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-\\[\\>\\[data-align\\=inline-start\\]\\]\\:\\[\\&\\>input\\]\\:ps-1\\.5:has(>[data-align=inline-start])>input{padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:\\[\\&\\>kbd\\]\\:rounded-\\[calc\\(var\\(--radius\\)-5px\\)\\]>kbd{border-radius:calc(var(--radius) - 5px)}.tw\\:\\[\\&\\>li\\]\\:mt-2>li{margin-top:calc(calc(var(--spacing)) * 2)}.tw\\:\\[\\&\\>span\\:last-child\\]\\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tw\\:\\[\\&\\>svg\\]\\:pointer-events-none>svg{pointer-events:none}.tw\\:\\[\\&\\>svg\\]\\:hidden>svg{display:none}.tw\\:\\[\\&\\>svg\\]\\:size-3\\!>svg{width:calc(calc(var(--spacing)) * 3)!important;height:calc(calc(var(--spacing)) * 3)!important}.tw\\:\\[\\&\\>svg\\]\\:size-3\\.5>svg{width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&\\>svg\\]\\:size-4>svg{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>svg\\]\\:shrink-0>svg{flex-shrink:0}.tw\\:\\[\\&\\>svg\\]\\:text-sidebar-accent-foreground>svg{color:var(--sidebar-accent-foreground)}.tw\\:group-has-data-\\[size\\=lg\\]\\/avatar-group\\:\\[\\&\\>svg\\]\\:size-5:is(:where(.tw\\:group\\/avatar-group):has([data-size=lg]) *)>svg{width:calc(calc(var(--spacing)) * 5);height:calc(calc(var(--spacing)) * 5)}.tw\\:group-has-data-\\[size\\=sm\\]\\/avatar-group\\:\\[\\&\\>svg\\]\\:size-3:is(:where(.tw\\:group\\/avatar-group):has([data-size=sm]) *)>svg{width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=default\\]\\/avatar\\:\\[\\&\\>svg\\]\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=default] *)>svg,.tw\\:group-data-\\[size\\=lg\\]\\/avatar\\:\\[\\&\\>svg\\]\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=lg] *)>svg{width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:\\[\\&\\>svg\\]\\:hidden:is(:where(.tw\\:group\\/avatar)[data-size=sm] *)>svg,.tw\\:\\[\\&\\>svg\\:last-child\\]\\:hidden>svg:last-child{display:none}.tw\\:\\[\\&\\>svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3\\.5>svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&\\>svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>tr\\]\\:last\\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:\\[\\&\\[align\\=center\\]\\]\\:text-center[align=center]{text-align:center}.tw\\:\\[\\&\\[align\\=right\\]\\]\\:text-right[align=right]{text-align:right}.tw\\:\\[\\&\\[aria-orientation\\=horizontal\\]\\>div\\]\\:rotate-90[aria-orientation=horizontal]>div{rotate:90deg}[data-side=primary][data-collapsible=offcanvas] .tw\\:\\[\\[data-side\\=primary\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-end-2{inset-inline-end:calc(calc(var(--spacing)) * -2)}[data-side=primary][data-state=collapsed] .tw\\:\\[\\[data-side\\=primary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-e-resize{cursor:e-resize}[data-side=primary][data-state=collapsed] .tw\\:rtl\\:\\[\\[data-side\\=primary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-w-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:w-resize}[data-side=secondary][data-collapsible=offcanvas] .tw\\:\\[\\[data-side\\=secondary\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-start-2{inset-inline-start:calc(calc(var(--spacing)) * -2)}[data-side=secondary][data-state=collapsed] .tw\\:\\[\\[data-side\\=secondary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-w-resize{cursor:w-resize}[data-side=secondary][data-state=collapsed] .tw\\:rtl\\:\\[\\[data-side\\=secondary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-e-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:e-resize}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-cyrillic-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-cyrillic-wght-normal.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-greek-wght-normal.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-vietnamese-wght-normal.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-latin-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-latin-wght-normal.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}.light,:root{--radius:.625rem;--spacing:.25rem;--background:oklch(100% 0 0);--foreground:oklch(13.71% .036 258.53);--card:oklch(100% 0 0);--card-foreground:oklch(13.71% .036 258.53);--popover:oklch(98.43% .0018 248.56);--popover-foreground:oklch(13.71% .036 258.53);--primary:oklch(20.79% .0399 265.73);--primary-foreground:oklch(98.38% .0036 248.23);--secondary:oklch(95.89% .011 248.06);--secondary-foreground:oklch(20.79% .0399 265.73);--muted:oklch(95.89% .011 248.06);--muted-foreground:oklch(55.47% .0408 257.45);--accent:oklch(95.89% .011 248.06);--accent-foreground:oklch(20.79% .0399 265.73);--destructive:oklch(63.69% .2077 25.32);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(62.7% .194 149.214);--diff-deleted:oklch(57.7% .245 27.325);--warning:oklch(84% .16 84);--warning-foreground:oklch(28% .07 46);--border:oklch(92.9% .0127 255.58);--input:oklch(92.9% .0127 255.58);--ring:oklch(13.71% .036 258.53);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.43% .0018 248.56);--sidebar-foreground:oklch(13.71% .036 258.53);--sidebar-primary:oklch(20.79% .0399 265.73);--sidebar-primary-foreground:oklch(98.38% .0036 248.23);--sidebar-accent:oklch(95.89% .011 248.06);--sidebar-accent-foreground:oklch(20.79% .0399 265.73);--sidebar-border:oklch(92.9% .0127 255.58);--sidebar-ring:oklch(13.71% .036 258.53)}.dark{--background:oklch(13.71% .036 258.53);--foreground:oklch(98.38% .0036 248.23);--card:oklch(13.71% .036 258.53);--card-foreground:oklch(98.38% .0036 248.23);--popover:oklch(13.71% .036 258.53);--popover-foreground:oklch(98.38% .0036 248.23);--primary:oklch(98.38% .0036 248.23);--primary-foreground:oklch(20.79% .0399 265.73);--secondary:oklch(28% .037 259.98);--secondary-foreground:oklch(98.38% .0036 248.23);--muted:oklch(28% .037 259.98);--muted-foreground:oklch(71.07% .0351 256.8);--accent:oklch(28% .037 259.98);--accent-foreground:oklch(98.38% .0036 248.23);--destructive:oklch(39.6% .1331 25.71);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(79.2% .209 151.711);--diff-deleted:oklch(70.4% .191 22.216);--warning:oklch(41% .11 46);--warning-foreground:oklch(99% .02 95);--border:oklch(44.54% .0374 257.3);--input:oklch(44.54% .0374 257.3);--ring:oklch(86.88% .0199 252.89);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(13.71% .036 258.53);--sidebar-foreground:oklch(71.07% .0351 256.8);--sidebar-primary:oklch(98.38% .0036 248.23);--sidebar-primary-foreground:oklch(20.79% .0399 265.73);--sidebar-accent:oklch(28% .037 259.98);--sidebar-accent-foreground:oklch(71.07% .0351 256.8);--sidebar-border:oklch(28% .037 259.98);--sidebar-ring:oklch(86.88% .0199 252.89)}.paratext-light{--background:oklch(100% 0 0);--foreground:oklch(15.3% .006 107.1);--card:oklch(100% 0 0);--card-foreground:oklch(15.3% .006 107.1);--popover:oklch(100% 0 0);--popover-foreground:oklch(15.3% .006 107.1);--primary:oklch(55.5% .163 48.998);--primary-foreground:oklch(98.7% .022 95.277);--secondary:oklch(96.7% .001 286.375);--secondary-foreground:oklch(21% .006 285.885);--muted:oklch(96.6% .005 106.5);--muted-foreground:oklch(58% .031 107.3);--accent:oklch(96.6% .005 106.5);--accent-foreground:oklch(22.8% .013 107.4);--destructive:oklch(57.7% .245 27.325);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(62.7% .194 149.214);--diff-deleted:oklch(57.7% .245 27.325);--warning:oklch(84% .16 84);--warning-foreground:oklch(28% .07 46);--border:oklch(93% .007 106.5);--input:oklch(93% .007 106.5);--ring:oklch(73.7% .021 106.9);--chart-1:oklch(88% .011 106.6);--chart-2:oklch(58% .031 107.3);--chart-3:oklch(46.6% .025 107.3);--chart-4:oklch(39.4% .023 107.4);--chart-5:oklch(28.6% .016 107.4);--sidebar:oklch(98.8% .003 106.5);--sidebar-foreground:oklch(15.3% .006 107.1);--sidebar-primary:oklch(66.6% .179 58.318);--sidebar-primary-foreground:oklch(98.7% .022 95.277);--sidebar-accent:oklch(96.6% .005 106.5);--sidebar-accent-foreground:oklch(22.8% .013 107.4);--sidebar-border:oklch(93% .007 106.5);--sidebar-ring:oklch(73.7% .021 106.9)}.paratext-dark{--background:oklch(15.3% .006 107.1);--foreground:oklch(98.8% .003 106.5);--card:oklch(22.8% .013 107.4);--card-foreground:oklch(98.8% .003 106.5);--popover:oklch(22.8% .013 107.4);--popover-foreground:oklch(98.8% .003 106.5);--primary:oklch(47.3% .137 46.201);--primary-foreground:oklch(98.7% .022 95.277);--secondary:oklch(27.4% .006 286.033);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(28.6% .016 107.4);--muted-foreground:oklch(73.7% .021 106.9);--accent:oklch(28.6% .016 107.4);--accent-foreground:oklch(98.8% .003 106.5);--destructive:oklch(70.4% .191 22.216);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(79.2% .209 151.711);--diff-deleted:oklch(70.4% .191 22.216);--warning:oklch(41% .11 46);--warning-foreground:oklch(99% .02 95);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(58% .031 107.3);--chart-1:oklch(88% .011 106.6);--chart-2:oklch(58% .031 107.3);--chart-3:oklch(46.6% .025 107.3);--chart-4:oklch(39.4% .023 107.4);--chart-5:oklch(28.6% .016 107.4);--sidebar:oklch(22.8% .013 107.4);--sidebar-foreground:oklch(98.8% .003 106.5);--sidebar-primary:oklch(76.9% .188 70.08);--sidebar-primary-foreground:oklch(27.9% .077 45.635);--sidebar-accent:oklch(28.6% .016 107.4);--sidebar-accent-foreground:oklch(98.8% .003 106.5);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(58% .031 107.3)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}} `, "after-all"); export { qa as ALL_BOOK_IDS, @@ -939,16 +939,16 @@ export { Ta as DeveloperSection, Ea as INTERNET_ACCESS_OPTION_LIST_STRING_KEYS, La as InternetAccessOptionList, - za as LinkedScrRefButton, - Na as NAVIGATION_HISTORY_BUTTONS_STRING_KEYS, + _a as LinkedScrRefButton, + Ua as NAVIGATION_HISTORY_BUTTONS_STRING_KEYS, Da as NO_GROUPING, - Ua as NavigationHistoryButtons, + Na as NavigationHistoryButtons, Ra as PROJECT_SELECTOR_DEFAULT_STRINGS, Ia as PROJECT_SELECTOR_STRING_KEYS, Aa as ProjectSelector, xa as RESOURCE_PICKER_DIALOG_STRING_KEYS, ka as ResourcePickerDialog, - _a as SOURCE_LANGUAGE_INDEXED_LIST_STRING_KEYS, + za as SOURCE_LANGUAGE_INDEXED_LIST_STRING_KEYS, ya as SourceLanguageIndexedList, Ba as Z_INDEX_TOOLTIP, Fa as buildBuiltInGroupingStrings, @@ -960,14 +960,14 @@ export { fa as focusResourcePickerOnOpen, $a as getAvailableBookIds, Va as getMarkerPaletteClaimedKeys, - ca as getResourcePickerBodyState, + sa as getResourcePickerBodyState, Ha as handleMarkerPaletteSessionKeyDown, Ya as makeBuiltInGroupings, Ja as makeSelectionGrouping, Qa as persistDirection, Mt as readDirection, - Wa as resolveLocalizedString, - Xa as runMarkerPaletteSession, + Xa as resolveLocalizedString, + Wa as runMarkerPaletteSession, Za as stripMarkerNestingPrefix, tr as summarizeSelectedBooks }; diff --git a/lib/platform-bible-react/dist/index.cjs b/lib/platform-bible-react/dist/index.cjs index 89179600f5e..4cf41dded37 100644 --- a/lib/platform-bible-react/dist/index.cjs +++ b/lib/platform-bible-react/dist/index.cjs @@ -1,5 +1,5 @@ -"use strict";var En=Object.defineProperty;var Tn=(t,r,a)=>r in t?En(t,r,{enumerable:!0,configurable:!0,writable:!0,value:a}):t[r]=a;var Kt=(t,r,a)=>Tn(t,typeof r!="symbol"?r+"":r,a);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("./resizable-DLulvBZt.cjs"),e=require("react/jsx-runtime"),Lt=require("@sillsdev/scripture"),z=require("lucide-react"),B=require("platform-bible-utils"),s=require("react"),Dt=require("@tabler/icons-react"),v=require("lexical"),Gr=require("@lexical/rich-text"),_a=require("react-dom"),Sn=require("@lexical/table"),Ha=require("@lexical/headless"),qa=require("@lexical/html"),G=require("radix-ui"),qt=require("@tanstack/react-table"),Rn=require("markdown-to-jsx"),Ut=require("@eten-tech-foundation/platform-editor"),Ya=require("class-variance-authority"),Mn=require("react-hotkeys-hook"),je=require("vaul"),Dn=require("next-themes"),Xa=require("sonner");function In({className:t,...r}){return e.jsx("textarea",{"data-slot":"textarea",className:o.cn("pr-twp tw:flex tw:field-sizing-content tw:min-h-16 tw:w-full tw:rounded-lg tw:border tw:border-input tw:bg-transparent tw:px-2.5 tw:py-2 tw:text-base tw:transition-colors tw:outline-none tw:placeholder:text-muted-foreground tw:focus-visible:border-ring tw:focus-visible:ring-3 tw:focus-visible:ring-ring/50 tw:disabled:cursor-not-allowed tw:disabled:bg-input/50 tw:disabled:opacity-50 tw:aria-invalid:border-destructive tw:aria-invalid:ring-3 tw:aria-invalid:ring-destructive/20 tw:md:text-sm tw:dark:bg-input/30 tw:dark:disabled:bg-input/80 tw:dark:aria-invalid:border-destructive/50 tw:dark:aria-invalid:ring-destructive/40",t),...r})}function Wa({ref:t,bookId:r,isSelected:a,onSelect:n,onMouseDown:i,section:l,className:c,showCheck:d=!1,localizedBookNames:u,commandValue:w,suppressKeyboardHighlight:p=!1,disabled:h=!1,dimmedReason:g,dimmedDescription:m}){const x=s.useRef(!1),y=()=>{h||(x.current||n==null||n(r),setTimeout(()=>{x.current=!1},100))},f=O=>{if(h){O.preventDefault();return}x.current=!0,i?i(O):n==null||n(r)},N=s.useMemo(()=>o.getLocalizedBookName(r,u),[r,u]),k=s.useMemo(()=>o.getLocalizedBookId(r,u),[r,u]),C=!!g&&!h,j=`${N} (${k})`,L=C?m||`${j}, ${g}`:j,S=e.jsxs(o.CommandItem,{ref:t,value:w||`${r} ${Lt.Canon.bookIdToEnglishName(r)}`,onSelect:y,onMouseDown:f,role:"option","aria-selected":a,"aria-disabled":h||void 0,"aria-label":L,disabled:h,className:o.cn(!p&&o.LIST_ITEM_KEYBOARD_FOCUS_RING,"tw:data-selected:bg-transparent tw:data-selected:text-inherit","tw:hover:bg-muted","tw:[&>svg:last-child]:hidden",c,h&&"tw:cursor-not-allowed tw:opacity-50",C&&"tw:bg-muted/50 tw:text-muted-foreground/50 tw:data-selected:bg-muted/50 tw:data-selected:text-muted-foreground/50"),children:[d&&e.jsx(z.Check,{className:o.cn("tw:me-2 tw:h-4 tw:w-4 tw:shrink-0",a?"tw:opacity-100":"tw:opacity-0")}),e.jsx("span",{className:"tw:min-w-0 tw:flex-1",children:N}),C&&e.jsx("span",{className:"tw:ms-2 tw:shrink-0 tw:text-xs tw:italic",children:g}),e.jsx("span",{className:o.cn("tw:ms-2 tw:shrink-0 tw:text-xs",!C&&"tw:text-muted-foreground"),children:k})]});return e.jsx("div",{className:o.cn("tw:mx-1 tw:my-1 tw:border-b-0 tw:border-e-0 tw:border-s-2 tw:border-t-0 tw:border-solid",{"tw:border-s-red-200":l===B.Section.OT,"tw:border-s-purple-200":l===B.Section.NT,"tw:border-s-indigo-200":l===B.Section.DC,"tw:border-s-amber-200":l===B.Section.Extra}),children:S})}const On=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"];function Pn(t){return On.some(r=>r===t)}function ja(t){const r=new RegExp("^\\p{L}$","u").test(t),a=/^[0-9]$/.test(t);return{isLetter:r,isDigit:a}}const ze=Object.freeze({WIDE:0,TIGHT:1,TIGHTER:2,MINIMUM:3}),Je=s.createContext(ze.WIDE);function Za(){return s.useContext(Je)}const ea=s.createContext(void 0);function ra(){return s.useContext(ea)}function Ja(){s.useEffect(()=>{o.trackInteractionModality()},[])}function Qa({primary:t,secondary:r,separator:a=" ",secondaryFirst:n=!1,showSecondary:i=!0,isPartial:l,fullText:c,className:d}){const{ref:u,open:w,onPointerEnter:p,onPointerLeave:h}=o.useTruncationTooltip(),{ref:g,open:m,onPointerEnter:x,onPointerLeave:y}=o.useTruncationTooltip(),[f,N]=s.useState(!1),[k,C]=s.useState(!1),j=s.useRef(null),L=i&&r!==void 0,S=l??(r!==void 0&&!i);Ja(),s.useEffect(()=>{var W;const A=(W=j.current)==null?void 0:W.closest('button, [role="combobox"], [tabindex]');if(!A)return;const _=q=>!!q&&q.scrollWidth>q.clientWidth,rt=()=>{o.getLastInteractionModality()!=="pointer"&&(S||_(g.current)||_(u.current))&&C(!0)},P=()=>C(!1);return A.addEventListener("focus",rt),A.addEventListener("blur",P),()=>{A.removeEventListener("focus",rt),A.removeEventListener("blur",P)}},[S,g,u]);const O=s.useCallback(()=>{S&&N(!0),x(),L&&p()},[S,L,x,p]),M=s.useCallback(()=>{N(!1),C(!1),y(),h()},[y,h]);s.useEffect(()=>{S||N(!1)},[S]);const E=e.jsx("span",{ref:g,className:"tw:min-w-0 tw:shrink tw:truncate",children:t},"primary"),D=L?e.jsx("span",{ref:u,className:"tw:min-w-0 tw:shrink-[9999] tw:truncate",children:r},"secondary"):void 0,[Y,X]=n?[D,E]:[E,D];return e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{open:m||w||f||k,onOpenChange:A=>{A||M()},children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsxs("span",{ref:j,onPointerEnter:O,onPointerLeave:M,onPointerDown:M,className:o.cn("tw:flex tw:min-w-0 tw:items-center",d),children:[Y,Y&&X&&e.jsx("span",{className:"tw:shrink-0 tw:whitespace-pre",children:a},"separator"),X]})}),e.jsx(o.TooltipContent,{children:c})]})})}function Kr(t,r){return`${t} ${o.ALL_ENGLISH_BOOK_NAMES[t]}${r?` ${o.getLocalizedBookId(t,r)} ${o.getLocalizedBookName(t,r)}`:""}`}function $e(t,r){return`${t} ${o.ALL_ENGLISH_BOOK_NAMES[t]||""} ${r}`}function pr(t,r,a){return`${$e(t,r)}:${a}`}function Ye(t){if(t.includes(":"))return;const r=/(\d+)$/.exec(t);if(!r)return;const a=parseInt(r[1],10),n=t.indexOf(" ");if(n<0)return;const i=t.slice(0,n);return t===$e(i,a)?a:void 0}function cr(t){const r=/:(\d+)$/.exec(t);if(!r)return;const a=t.slice(0,t.length-r[0].length);if(Ye(a)!==void 0)return parseInt(r[1],10)}const Ln="top-match",An="Show recent searches",Bn="Recent";function to({recentSearches:t,onSearchItemSelect:r,renderItem:a=g=>String(g),getItemKey:n=g=>String(g),ariaLabel:i,groupHeading:l,id:c,classNameForItems:d,buttonClassName:u="tw:absolute tw:end-0 tw:top-0 tw:h-full tw:px-3 tw:py-2",buttonVariant:w="ghost",open:p,onOpenChange:h}){const[g,m]=s.useState(!1),[x,y]=s.useState(!1),f=s.useId(),N=s.useRef(!1),k=p!==void 0,C=k?p:g,j=i===""?"":o.resolveLocalizedString(i,An),L=o.resolveLocalizedString(l,Bn),S=D=>{D||(N.current=!0,y(!1)),k||m(D),h==null||h(D)},O=D=>{if(D&&N.current){N.current=!1;return}y(D)};if(t.length===0)return;const M=D=>{r(D)},E=e.jsx(o.Button,{variant:w,size:"icon",className:u,"aria-label":j,onPointerEnter:()=>{N.current=!1},children:e.jsx(z.Clock,{className:"tw:h-4 tw:w-4"})});return e.jsxs(o.DropdownMenu,{open:C,onOpenChange:S,modal:!1,children:[e.jsx(o.TooltipProvider,{children:j?e.jsxs(o.Tooltip,{open:x,onOpenChange:O,children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.DropdownMenuTrigger,{asChild:!0,children:E})}),e.jsx(o.TooltipContent,{children:j})]}):e.jsx(o.DropdownMenuTrigger,{asChild:!0,children:E})}),e.jsxs(o.DropdownMenuContent,{id:c,"aria-labelledby":f,className:"tw:w-[300px]",align:"start",onKeyDown:D=>D.stopPropagation(),children:[e.jsx(o.DropdownMenuLabel,{id:f,children:L}),t.map(D=>e.jsxs(o.DropdownMenuItem,{onSelect:()=>M(D),className:o.cn("tw:flex tw:items-center",d),children:[e.jsx(z.Clock,{className:"tw:me-2 tw:h-4 tw:w-4 tw:opacity-50"}),e.jsx("span",{children:a(D)})]},n(D)))]})]})}function zn(t,r,a=(i,l)=>i===l,n=15){return i=>{const l=t.filter(d=>!a(d,i)),c=[i,...l.slice(0,n-1)];r(c)}}function lr(t,r){return!r||B.compareScrRefs(t,r)===0}function $n(t,r,a,n,i){const l=s.useMemo(()=>o.x(t,r),[t,r]),c=s.useMemo(()=>o.a(t,r),[t,r]),d=s.useMemo(()=>o.B(t,r),[t,r]),u=s.useMemo(()=>o.I(t,r),[t,r]),w=s.useCallback(p=>{p&&n(p)},[n]);return s.useMemo(()=>[{onClick:()=>w(l),disabled:lr(t,l),title:o.resolveLocalizedString(i==null?void 0:i["%webView_bookChapterControl_previousChapter%"],"Previous chapter"),icon:a==="ltr"?z.ChevronsLeft:z.ChevronsRight,group:"chapter"},{onClick:()=>w(c),disabled:lr(t,c),title:o.resolveLocalizedString(i==null?void 0:i["%webView_bookChapterControl_nextChapter%"],"Next chapter"),icon:a==="ltr"?z.ChevronsRight:z.ChevronsLeft,group:"chapter"},{onClick:()=>w(d),disabled:lr(t,d),title:o.resolveLocalizedString(i==null?void 0:i["%webView_bookChapterControl_previousVerse%"],"Previous verse"),icon:z.ChevronUp,group:"verse"},{onClick:()=>w(u),disabled:lr(t,u),title:o.resolveLocalizedString(i==null?void 0:i["%webView_bookChapterControl_nextVerse%"],"Next verse"),icon:z.ChevronDown,group:"verse"}],[t,a,w,l,d,u,c,i])}const hr={BOOK_ONLY:/^([^:\s]+(?:\s+[^:\s]+)*)$/i,BOOK_CHAPTER:/^([^:\s]+(?:\s+[^:\s]+)*)\s+(\d+)$/i,BOOK_CHAPTER_VERSE:/^([^:\s]+(?:\s+[^:\s]+)*)\s+(\d+):(\d*)$/i},Vn=[hr.BOOK_ONLY,hr.BOOK_CHAPTER,hr.BOOK_CHAPTER_VERSE];function Fn(t){return hr.BOOK_CHAPTER_VERSE.test(t.trim())}function Ca(t,r){return Lt.Canon.bookIdToNumber(t)0?!1:r0?!1:rn.chapterNum?!1:a{if(i)return i;const c=l.exec(t.trim());if(c){const[d,u=void 0,w=void 0]=c.slice(1);let p;const h=r.filter(g=>o.doesBookMatchQuery(g,d,a));if(h.length===1&&([p]=h),!p&&u){if(Lt.Canon.isBookIdValid(d)){const g=d.toUpperCase();r.includes(g)&&(p=g)}if(!p&&a){const g=Array.from(a.entries()).find(([,m])=>m.localizedId.toLowerCase()===d.toLowerCase());g&&r.includes(g[0])&&([p]=g)}}if(!p&&u){const m=(x=>Object.keys(o.ALL_ENGLISH_BOOK_NAMES).find(y=>o.ALL_ENGLISH_BOOK_NAMES[y].toLowerCase()===x.toLowerCase()))(d);if(m&&r.includes(m)&&(p=m),!p&&a){const x=Array.from(a.entries()).find(([,y])=>y.localizedName.toLowerCase()===d.toLowerCase());x&&r.includes(x[0])&&([p]=x)}}if(p){let g=u?parseInt(u,10):void 0;g&&g>_e(p)&&(g=Math.max(_e(p),1));const m=w?parseInt(w,10):void 0;return{book:p,chapterNum:g,verseNum:m}}}},void 0);if(n)return n}function Ur(t){return{[B.Section.OT]:t.filter(r=>Lt.Canon.isBookOT(r)),[B.Section.NT]:t.filter(r=>Lt.Canon.isBookNT(r)),[B.Section.DC]:t.filter(r=>Lt.Canon.isBookDC(r)),[B.Section.Extra]:t.filter(r=>Lt.Canon.extraBooks().includes(r))}}function Un(t,r){const a=new Set(t),n=r.filter(w=>!a.has(w)),i=new Set(n),l=i.size===0?t:Lt.Canon.allBookIds.filter(w=>a.has(w)||i.has(w)),c=Ur(l),d=Object.values(c).flat(),u=Ur(t);return{projectBooksBySection:u,reachableBooksBySection:c,reachableBooks:d,projectBooks:Object.values(u).flat(),booksOutsideProject:new Set(d.filter(w=>!a.has(w)))}}const Hr=6;function Hn(t){return t==="ArrowLeft"?"ArrowRight":t==="ArrowRight"?"ArrowLeft":t}function qn({current:t,key:r,max:a,direction:n="ltr"}){if(a<=0)return t;if(t<1||t>a)return 1;switch(n==="rtl"?Hn(r):r){case"ArrowLeft":return t>1?t-1:a;case"ArrowRight":return tp+1).map(w=>{const p=(i==null?void 0:i(w))??!1;return e.jsx(o.CommandItem,{value:r(w),onSelect:()=>{p||a(w)},ref:n(w),disabled:p,"aria-disabled":p||void 0,className:o.cn("tw:h-8 tw:w-8 tw:cursor-pointer tw:justify-center tw:rounded-md tw:text-center tw:text-sm","tw:[&>svg]:hidden tw:hover:bg-muted",!d&&o.LIST_ITEM_KEYBOARD_FOCUS_RING,"tw:data-selected:bg-transparent tw:data-selected:text-inherit",{"tw:bg-primary tw:text-primary-foreground tw:hover:bg-primary/90 tw:data-selected:bg-primary tw:data-selected:text-primary-foreground tw:data-selected:ring-primary-foreground/70":(c==null?void 0:c(w))??!1},{"tw:bg-muted/50 tw:text-muted-foreground/50 tw:data-selected:bg-muted/50 tw:data-selected:text-muted-foreground/50":((l==null?void 0:l(w))??!1)&&!p},p&&"tw:cursor-not-allowed tw:opacity-40"),children:w},w)})})})}function Na({bookId:t,scrRef:r,onChapterSelect:a,setChapterRef:n,isChapterDimmed:i,isChapterDisabled:l,suppressKeyboardHighlight:c,className:d}){if(t)return e.jsx(eo,{count:_e(t),valueBuilder:u=>$e(t,u),onSelect:a,itemRef:n,isDisabled:l,isDimmed:i,isSelected:u=>t===r.book&&u===r.chapterNum,suppressKeyboardHighlight:c,className:d})}function Ea({bookId:t,chapterNum:r,endVerse:a,scrRef:n,onVerseSelect:i,setVerseRef:l,isVerseDimmed:c,isVerseDisabled:d,suppressKeyboardHighlight:u,className:w}){if(!(!t||a<=0))return e.jsx(eo,{count:a,valueBuilder:p=>pr(t,r,p),onSelect:i,itemRef:l,isDisabled:d,isDimmed:c,isSelected:p=>t===n.book&&r===n.chapterNum&&p===n.verseNum,suppressKeyboardHighlight:u,className:w})}const Yn="a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]";function Xn(t){return Array.from(t.querySelectorAll(Yn)).filter(r=>r.tabIndex>=0)}function gr({scrRef:t,handleSubmit:r,className:a,getActiveBookIds:n,getAdditionalBookIds:i,localizedBookNames:l,localizedStrings:c,recentSearches:d,onAddRecentSearch:u,id:w,getEndVerse:p,disableReferencesUpTo:h,submitKeys:g,triggerContent:m,triggerVariant:x="outline",showTriggerChevron:y=!1,onOpenChange:f,onCloseAutoFocus:N,modal:k=!1,align:C="center",ref:j,disabled:L}){const S=o.readDirection(),O=Za(),[M,E]=s.useState(!1),[D,Y]=s.useState(""),[X,A]=s.useState(""),[_,rt]=s.useState("books"),[P,W]=s.useState(void 0),[q,$]=s.useState(void 0),[et,dt]=s.useState(void 0),[ct,Q]=s.useState(!1),[wt,ft]=s.useState(!1),[ht,_t]=s.useState(!1),[It,St]=s.useState(!1),oe=s.useRef(null),te=s.useRef(!1),mt=s.useRef(void 0),vt=s.useRef(void 0),xt=s.useRef(void 0),Yt=s.useRef(void 0),ne=s.useRef({}),jt=s.useRef({}),Ct=s.useCallback(b=>{r(b),u&&u(b)},[r,u]),Xt=s.useMemo(()=>n?n():o.lt,[n]),le=s.useMemo(()=>n&&i?i():[],[n,i]),{projectBooksBySection:ie,reachableBooksBySection:ge,reachableBooks:Zt,projectBooks:$t,booksOutsideProject:Vt}=s.useMemo(()=>Un(Xt,le),[Xt,le]),Ft=Vt.has(t.book),fe=s.useMemo(()=>X.trim()?Ur(Zt.filter(b=>o.doesBookMatchQuery(b,X,l))):wt?ge:ie,[ie,ge,Zt,wt,X,l]),I=s.useMemo(()=>Kn(X,Zt,l),[X,Zt,l]),Nt=s.useMemo(()=>{if(!I)return;const b=D.startsWith(`${I.book} `)?D:"",H=cr(b),st=Ye(b);return{book:I.book,chapterNum:st??I.chapterNum??1,verseNum:H??I.verseNum??1}},[I,D]),At=s.useRef(!1);s.useEffect(()=>{if(!At.current){At.current=!0;return}f==null||f(M)},[M,f]);const Et=s.useCallback(()=>{Nt&&(h&&Dr(Nt.book,Nt.chapterNum,Nt.verseNum,h)||(Ct(Nt),E(!1),A(""),Y("")))},[Ct,Nt,h]),R=s.useCallback(b=>{const H=q??(I==null?void 0:I.book),st=et??(I==null?void 0:I.chapterNum);!H||!st||(Ct({book:H,chapterNum:st,verseNum:b}),E(!1))},[Ct,q,et,I]),K=s.useCallback(b=>{if(h&&Ca(b,h))return;if(_e(b)<=1){Ct({book:b,chapterNum:1,verseNum:1}),E(!1),A("");return}W(b),rt("chapters")},[Ct,h]),Z=s.useCallback(b=>{const H=_==="chapters"?P:I==null?void 0:I.book;if(H){if(p&&p(H,b)>1){$(H),dt(b),rt("verses"),Y("");return}Ct({book:H,chapterNum:b,verseNum:1}),E(!1)}},[Ct,_,P,I,p]),U=s.useCallback(b=>{Ct(b),E(!1),A("")},[Ct]),J=$n(t,wt?Zt:$t,S,r,c),V=s.useCallback(b=>{A(b),St(!1)},[]),at=s.useCallback(()=>{rt("books"),W(void 0),$(void 0),dt(void 0),St(!1),setTimeout(()=>{var b;(b=vt.current)==null||b.focus()},0)},[]),nt=s.useCallback(()=>{const b=q;$(void 0),dt(void 0),b?(W(b),rt("chapters"),Y("")):at()},[q,at]),ot=s.useCallback(b=>{E(b),b&&(rt("books"),W(void 0),$(void 0),dt(void 0),A(""),St(!1),_t(!1),ft(Ft))},[Ft]);s.useEffect(()=>{L&&ot(!1)},[L,ot]);const[gt,bt]=s.useState(0);s.useEffect(()=>{var b;gt!==0&&((b=vt.current)==null||b.focus())},[gt]),s.useImperativeHandle(j,()=>({open:()=>{L||(ot(!0),bt(b=>b+1))}}),[ot,L]);const{otLong:yt,ntLong:Bt,dcLong:Ce,extraLong:xe}={otLong:c==null?void 0:c["%scripture_section_ot_long%"],ntLong:c==null?void 0:c["%scripture_section_nt_long%"],dcLong:c==null?void 0:c["%scripture_section_dc_long%"],extraLong:c==null?void 0:c["%scripture_section_extra_long%"]},me=s.useCallback(b=>o.getSectionLongName(b,yt,Bt,Ce,xe),[yt,Bt,Ce,xe]),de=s.useCallback(b=>I?!!I.chapterNum&&!b.toString().includes(I.chapterNum.toString()):!1,[I]),De=s.useMemo(()=>B.formatScrRef(t,l?o.getLocalizedBookName(t.book,l):"English"),[t,l]),er=s.useMemo(()=>O>=ze.TIGHT?o.getLocalizedBookId(t.book,l):o.getLocalizedBookName(t.book,l),[t.book,l,O]),Ie=`${t.chapterNum}:${t.verseNum}`,T=s.useCallback(b=>H=>{ne.current[b]=H},[]),it=s.useCallback(b=>H=>{jt.current[b]=H},[]),lt=s.useMemo(()=>Fn(X),[X]),Tt=s.useMemo(()=>!p||!I||!I.chapterNum||!lt?!1:p(I.book,I.chapterNum)>0,[p,I,lt]),ye=_==="books"&&!ct&&!X.trim()&&Vt.size>0,Tr=s.useCallback(b=>h?Ca(b,h):!1,[h]),ve=s.useCallback(b=>H=>h?Gn(b,H,h):!1,[h]),Oe=s.useCallback((b,H)=>st=>h?Dr(b,H,st,h):!1,[h]),Pe=o.resolveLocalizedString(c==null?void 0:c["%webView_bookChapterControl_selectChapter%"],"Select chapter"),Sr=o.resolveLocalizedString(c==null?void 0:c["%webView_bookChapterControl_selectVerse%"],"Select verse"),rr=_==="verses"?o.resolveLocalizedString(c==null?void 0:c["%webView_bookChapterControl_backToChapters%"],"Back to chapters"):o.resolveLocalizedString(c==null?void 0:c["%webView_bookChapterControl_backToBooks%"],"Back to books"),Rr=o.resolveLocalizedString(c==null?void 0:c["%webView_bookChapterControl_bookNotInProject%"],"Not in project"),ar=o.resolveLocalizedString(c==null?void 0:c["%webView_bookChapterControl_bookNotInProjectDescription%"],"{book} is not in this project"),or=s.useCallback(b=>B.formatReplacementString(ar,{book:`${o.getLocalizedBookName(b,l)} (${o.getLocalizedBookId(b,l)})`}),[ar,l]),nr=o.resolveLocalizedString(c==null?void 0:c["%webView_bookChapterControl_showMoreBooks%"],"Show more books"),Le=o.resolveLocalizedString(c==null?void 0:c["%webView_bookChapterControl_showProjectBooksOnly%"],"Show project books only"),ir=s.useCallback(b=>{(b.key==="Home"||b.key==="End")&&b.stopPropagation(),g&&g.includes(b.key)&&I&&I.chapterNum!==void 0&&I.verseNum!==void 0&&(b.preventDefault(),b.stopPropagation(),Et())},[g,I,Et]),sr=s.useCallback(b=>{var xa,ya;if(b.ctrlKey)return;const H=b.target instanceof HTMLElement?b.target:void 0;if(!(!!H&&!!((xa=mt.current)!=null&&xa.contains(H)))&&(H!=null&&H.closest('[role="menu"], [role="menuitem"]')))return;if(b.key==="Tab"){const Mt=mt.current?Xn(mt.current):[];if(Mt.length===0){b.preventDefault(),b.stopPropagation();return}const re=Mt[Mt.length-1],Gt=b.shiftKey?Mt[0]:re;document.activeElement===Gt&&(b.preventDefault(),b.stopPropagation(),(b.shiftKey?re:Mt[0]).focus());return}const{isLetter:Ot,isDigit:zt}=ja(b.key);if((_==="chapters"||_==="verses")&&(b.key===" "||b.key==="Enter")){if(!!(H!=null&&H.closest('button, a, input, select, textarea, [role="button"]'))){b.stopPropagation();return}const re=(()=>{if(_==="verses"){const Ue=q,ka=et,Mr=cr(D);return!Ue||!ka||Mr===void 0?void 0:{isDisabled:Oe(Ue,ka)(Mr),activate:()=>R(Mr)}}const Gt=P,ce=Ye(D);if(!(!Gt||ce===void 0))return{isDisabled:ve(Gt)(ce),activate:()=>Z(ce)}})();if(re){b.preventDefault(),b.stopPropagation(),re.isDisabled||re.activate();return}}if(_==="books"&&I&&!ct&&b.key==="Enter"&&!(H!==vt.current&&!!(H!=null&&H.closest('button, a, input, select, textarea, [role="button"]')))){b.preventDefault(),b.stopPropagation(),Et();return}if((_==="chapters"||_==="verses")&&(Ot||zt)){b.preventDefault(),b.stopPropagation();return}if(b.key==="Backspace"&&(_==="chapters"||_==="verses")){b.preventDefault(),b.stopPropagation(),_==="verses"?nt():at();return}if(!Pn(b.key)||ct)return;if(_==="books"&&!It&&(b.key==="ArrowLeft"||b.key==="ArrowRight")){const Mt=H===vt.current?vt.current:void 0,re=(Mt==null?void 0:Mt.selectionStart)??0,Gt=(Mt==null?void 0:Mt.selectionEnd)??0,ce=S==="rtl"?b.key==="ArrowRight":b.key==="ArrowLeft";if(!!Mt&&(re!==Gt||(ce?re>0:Gt{const Mt=_==="books"&&I&&Tt&&I.chapterNum?{bookId:I.book,chapterNum:I.chapterNum}:void 0,re=_==="verses"?{bookId:q,chapterNum:et}:Mt;if(re){const{bookId:Gt,chapterNum:ce}=re;return!Gt||!ce||!p?void 0:{max:p(Gt,ce),current:cr(D)??0,buildValue:Ue=>pr(Gt,ce,Ue),refs:jt,takeFocus:_==="verses"}}if(_==="chapters"||_==="books"&&I&&_e(I.book)>1){const Gt=_==="chapters"?P:I==null?void 0:I.book;return Gt?{max:_e(Gt),current:Ye(D)??0,buildValue:ce=>$e(Gt,ce),refs:ne,takeFocus:_==="chapters"}:void 0}})();if(!kt||kt.max<=0)return;_==="books"&&St(!0),kt.takeFocus&&((ya=mt.current)==null||ya.focus());const Wt=qn({current:kt.current,key:b.key,max:kt.max,direction:S});if(b.preventDefault(),b.stopPropagation(),Wt===kt.current)return;Y(kt.buildValue(Wt));const ba=kt.refs.current[Wt];ba&&ba.scrollIntoView({block:"nearest",behavior:"smooth"})},[_,I,Tt,ct,It,S,at,nt,Z,Et,R,ve,Oe,P,q,et,p,D]),F=s.useCallback(b=>{var Ot,zt;if(b.shiftKey||b.key==="Tab"||b.key===" ")return;if(b.key==="Enter"){b.stopPropagation();return}if(b.key==="ArrowUp"||b.key==="ArrowDown"){(Ot=vt.current)==null||Ot.focus();return}const{isLetter:H,isDigit:st}=ja(b.key);(H||st)&&(b.preventDefault(),A(kt=>kt+b.key),(zt=vt.current)==null||zt.focus(),Q(!1))},[]);s.useLayoutEffect(()=>{const b=setTimeout(()=>{if(M&&_==="books"&&xt.current&&Yt.current){const H=xt.current,st=Yt.current,Ot=st.offsetTop,zt=H.clientHeight,kt=st.clientHeight,Wt=Ot-zt/2+kt/2;H.scrollTo({top:Math.max(0,Wt),behavior:"smooth"}),Y(Kr(t.book))}},0);return()=>{clearTimeout(b)}},[M,_,X,I,t.book]),s.useLayoutEffect(()=>{if(_==="chapters"&&P){const b=P===t.book,H=b?t.chapterNum:1;Y($e(P,H)),setTimeout(()=>{if(xt.current)if(b){const st=ne.current[t.chapterNum];st&&st.scrollIntoView({block:"center",behavior:"smooth"})}else xt.current.scrollTo({top:0});mt.current&&mt.current.focus()},0)}},[_,P,I,t.book,t.chapterNum]),s.useLayoutEffect(()=>{if(_==="verses"&&q&&et!==void 0){const b=q===t.book&&et===t.chapterNum,H=b?t.verseNum:1;Y(pr(q,et,H)),setTimeout(()=>{if(xt.current)if(b){const st=jt.current[t.verseNum];st&&st.scrollIntoView({block:"center",behavior:"smooth"})}else xt.current.scrollTo({top:0});mt.current&&mt.current.focus()},0)}},[_,q,et,t.book,t.chapterNum,t.verseNum]);const tt=I?`${I.book} ${I.chapterNum??""} ${I.verseNum??""} ${Tt}`:"",Rt=s.useRef(""),ee=s.useRef(""),se=s.useMemo(()=>{if(_!=="books"||!I||ct)return;const{book:b,chapterNum:H,verseNum:st}=I;if(Tt&&H&&p)return{max:p(b,H),initial:st??(b===t.book&&H===t.chapterNum?t.verseNum:1),parse:cr,buildValue:zt=>pr(b,H,zt)};const Ot=_e(b);if(!(Ot<=1))return{max:Ot,initial:H??(b===t.book?t.chapterNum:1),parse:Ye,buildValue:zt=>$e(b,zt)}},[_,I,ct,Tt,p,t.book,t.chapterNum,t.verseNum]);return s.useLayoutEffect(()=>{if(_!=="books"||!I||!se||se.max<=0){Rt.current="";return}const{max:b,initial:H,parse:st,buildValue:Ot}=se,zt=kt=>{const Wt=st(kt);return Wt!==void 0&&Wt>=1&&Wt<=b&&kt===Ot(Wt)?Wt:void 0};if(Rt.current!==tt){Rt.current=tt;const kt=Ot(Math.min(Math.max(H,1),b));ee.current=kt,Y(kt);return}if(zt(D)!==void 0){ee.current=D;return}Y(zt(ee.current)!==void 0?ee.current:Ot(Math.min(Math.max(H,1),b)))},[_,I,se,tt,D]),e.jsxs(o.Popover,{open:M,onOpenChange:ot,modal:k,children:[e.jsx(o.PopoverTrigger,{asChild:!0,children:e.jsxs(o.Button,{ref:oe,"aria-label":"book-chapter-trigger",variant:x,role:"combobox","aria-expanded":M,disabled:L,className:o.cn("tw:h-8 tw:w-full tw:min-w-16 tw:max-w-48 tw:shrink tw:overflow-hidden tw:px-1",a),onClick:b=>{te.current&&(te.current=!1,b.preventDefault())},children:[m??e.jsx(Qa,{primary:er,secondary:Ie,showSecondary:O=ze.TIGHT,fullText:De}),y&&e.jsx(Dt.IconSelector,{"data-testid":"book-chapter-control-chevron",className:"tw:ms-2 tw:size-4 tw:shrink-0 tw:opacity-50"})]})}),e.jsx(o.PopoverContent,{id:w,forceMount:!0,className:"tw:w-[280px] tw:p-0",align:C,onKeyDownCapture:sr,onKeyDown:b=>b.stopPropagation(),onPointerDownOutside:b=>{const{target:H}=b;M&&oe.current&&H instanceof Node&&oe.current.contains(H)&&(te.current=!0,ot(!1))},onCloseAutoFocus:N,children:e.jsx(o.TooltipProvider,{children:e.jsxs(o.Command,{ref:mt,loop:!0,value:D,onValueChange:Y,disablePointerSelection:!0,shouldFilter:!1,children:[_==="books"?e.jsxs("div",{className:o.cn("tw:flex tw:items-end",ct&&"tw:pb-1"),onFocus:b=>{_t(b.target!==vt.current)},onBlur:b=>{b.currentTarget.contains(b.relatedTarget)||_t(!1)},children:[e.jsxs("div",{className:"tw:relative tw:flex-1",children:[e.jsx(o.CommandInput,{ref:vt,value:X,onValueChange:V,onKeyDown:ir,onFocus:()=>Q(!1),className:d&&d.length>0?"tw:pe-8!":"",spaceSelectsHighlightedItem:!0}),d&&d.length>0&&e.jsx(to,{recentSearches:d,onSearchItemSelect:U,renderItem:b=>B.formatScrRef(b,"English"),getItemKey:b=>`${b.book}-${b.chapterNum}-${b.verseNum}`,ariaLabel:c==null?void 0:c["%history_recentSearches_ariaLabel%"],groupHeading:c==null?void 0:c["%history_recent%"],buttonClassName:"tw:absolute tw:end-1 tw:top-1"})]}),e.jsx(o.ButtonGroup,{className:"tw:translate-y-px tw:gap-1 tw:pe-2",children:J.map(({onClick:b,disabled:H,title:st,icon:Ot,group:zt},kt)=>{const Wt=e.jsx(o.Button,{variant:"ghost",size:"sm",onClick:()=>{Q(!0),b()},disabled:H,className:"tw:h-8.5 tw:w-6 tw:rounded-lg! tw:p-0","aria-label":st,onKeyDown:F,children:e.jsx(Ot,{})});return e.jsxs(s.Fragment,{children:[kt>0&&zt!==J[kt-1].group&&e.jsx(o.ButtonGroupSeparator,{}),H?e.jsx("span",{title:st,className:"tw:inline-flex",children:Wt}):e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:Wt}),e.jsx(o.TooltipContent,{children:st})]})]},`${zt}-${kt}`)})})]}):e.jsxs("div",{className:"tw:flex tw:items-center tw:border-b tw:px-3 tw:py-1",children:[e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.Button,{variant:"ghost",size:"sm",onClick:_==="verses"?nt:at,className:"tw:me-2 tw:h-6 tw:w-6 tw:p-0",tabIndex:-1,"aria-label":rr,children:S==="ltr"?e.jsx(z.ArrowLeft,{className:"tw:h-4 tw:w-4"}):e.jsx(z.ArrowRight,{className:"tw:h-4 tw:w-4"})})}),e.jsx(o.TooltipContent,{children:rr})]}),_==="chapters"&&P&&e.jsx("span",{tabIndex:-1,className:"tw:text-sm tw:font-medium",children:o.getLocalizedBookName(P,l)}),_==="verses"&&q&&et!==void 0&&e.jsx("span",{tabIndex:-1,className:"tw:text-sm tw:font-medium",children:`${o.getLocalizedBookName(q,l)} ${et}`}),e.jsx("span",{tabIndex:-1,className:"tw:ms-auto tw:text-sm tw:font-medium tw:text-muted-foreground",children:_==="verses"?Sr:Pe})]}),!ct&&e.jsxs(o.CommandList,{ref:xt,children:[_==="books"&&e.jsxs(e.Fragment,{children:[!I&&Object.entries(fe).map(([b,H])=>{if(H.length!==0)return e.jsx(o.CommandGroup,{heading:me(b),children:H.map(st=>e.jsx(Wa,{bookId:st,onSelect:Ot=>K(Ot),section:B.getSectionForBook(st),commandValue:Kr(st),suppressKeyboardHighlight:ht,ref:st===t.book?Yt:void 0,localizedBookNames:l,disabled:Tr(st),dimmedReason:Vt.has(st)?Rr:void 0,dimmedDescription:Vt.has(st)?or(st):void 0},st))},b)}),I&&Nt&&e.jsx(o.CommandGroup,{children:e.jsxs(o.CommandItem,{value:Ln,onSelect:Et,disabled:!!h&&Dr(Nt.book,Nt.chapterNum,Nt.verseNum,h),className:"tw:font-semibold tw:text-primary tw:hover:bg-muted tw:[&>svg:last-child]:hidden",children:[e.jsx("span",{className:"tw:min-w-0 tw:flex-1",children:B.formatScrRef(Nt,o.getLocalizedBookName(I.book,l))}),e.jsx("span",{className:"tw:ms-2 tw:shrink-0 tw:text-xs tw:text-muted-foreground",children:o.getLocalizedBookId(I.book,l)})]},"top-match")}),I&&Tt&&I.chapterNum&&p&&e.jsx(Ea,{bookId:I.book,chapterNum:I.chapterNum,endVerse:p(I.book,I.chapterNum),scrRef:t,onVerseSelect:R,setVerseRef:it,isVerseDisabled:Oe(I.book,I.chapterNum),suppressKeyboardHighlight:ht,className:"tw:px-4 tw:pb-4"}),I&&!Tt&&_e(I.book)>1&&e.jsx(Na,{bookId:I.book,scrRef:t,onChapterSelect:Z,setChapterRef:T,isChapterDimmed:de,isChapterDisabled:ve(I.book),suppressKeyboardHighlight:ht,className:"tw:px-4 tw:pb-4"})]}),_==="chapters"&&P&&e.jsx(Na,{bookId:P,scrRef:t,onChapterSelect:Z,setChapterRef:T,isChapterDisabled:ve(P),className:"tw:p-4"}),_==="verses"&&q&&et!==void 0&&p&&e.jsx(Ea,{bookId:q,chapterNum:et,endVerse:p(q,et),scrRef:t,onVerseSelect:R,setVerseRef:it,isVerseDisabled:Oe(q,et),className:"tw:p-4"})]}),ye&&e.jsx("div",{className:"tw:border-t tw:p-1",children:e.jsx(o.Button,{variant:"ghost",size:"sm",className:"tw:w-full tw:justify-start tw:font-normal",onClick:()=>ft(b=>!b),children:wt?Le:nr})})]})})})]})}const Wn=Object.freeze(["%scripture_section_ot_long%","%scripture_section_nt_long%","%scripture_section_dc_long%","%scripture_section_extra_long%","%history_recent%","%history_recentSearches_ariaLabel%","%webView_bookChapterControl_bookNotInProject%","%webView_bookChapterControl_bookNotInProjectDescription%","%webView_bookChapterControl_selectChapter%","%webView_bookChapterControl_selectVerse%","%webView_bookChapterControl_showMoreBooks%","%webView_bookChapterControl_showProjectBooksOnly%","%webView_bookChapterControl_previousChapter%","%webView_bookChapterControl_nextChapter%","%webView_bookChapterControl_previousVerse%","%webView_bookChapterControl_nextVerse%","%webView_bookChapterControl_backToBooks%","%webView_bookChapterControl_backToChapters%"]);function Zn(t){return typeof t=="string"?t:typeof t=="number"?t.toString():t.label}function qr({id:t,options:r=[],className:a,buttonClassName:n,popoverContentClassName:i,popoverContentStyle:l,value:c,onChange:d=()=>{},getOptionLabel:u=Zn,getButtonLabel:w,icon:p=void 0,buttonPlaceholder:h="",textPlaceholder:g="",commandEmptyMessage:m="No option found",buttonVariant:x="outline",alignDropDown:y="start",isDisabled:f=!1,ariaLabel:N,...k}){const[C,j]=s.useState(!1),L=w??u,S=M=>M.length>0&&typeof M[0]=="object"&&"options"in M[0],O=(M,E)=>{const D=u(M),Y=typeof M=="object"&&"secondaryLabel"in M?M.secondaryLabel:void 0,X=`${E??""}${D}${Y??""}`;return e.jsxs(o.CommandItem,{value:D,onSelect:()=>{d(M),j(!1)},className:"tw:gap-1.5!",children:[e.jsx(z.Check,{className:o.cn("tw:h-4 tw:w-4 tw:shrink-0",{"tw:opacity-0":!c||u(c)!==D})}),e.jsxs("span",{className:"tw:flex-1 tw:overflow-hidden tw:text-ellipsis tw:whitespace-nowrap",children:[D,Y&&e.jsxs("span",{className:"tw:text-muted-foreground",children:[" · ",Y]})]})]},X)};return e.jsxs(o.Popover,{open:C,onOpenChange:j,...k,children:[e.jsx(o.PopoverTrigger,{asChild:!0,children:e.jsxs(o.Button,{variant:x,role:"combobox","aria-expanded":C,"aria-label":N,id:t,className:o.cn("tw:flex tw:w-[200px] tw:items-center tw:justify-between tw:overflow-hidden",n??a),disabled:f,children:[e.jsxs("div",{className:"tw:flex tw:min-w-0 tw:flex-1 tw:items-center tw:overflow-hidden",children:[p&&e.jsx("div",{className:"tw:shrink-0 tw:pe-2",children:p}),e.jsx("span",{className:o.cn("tw:min-w-0 tw:overflow-hidden tw:text-ellipsis tw:whitespace-nowrap tw:text-start"),children:c?L(c):h})]}),e.jsx(z.ChevronDown,{className:"tw:ms-2 tw:h-4 tw:w-4 tw:shrink-0 tw:opacity-50"})]})}),e.jsx(o.PopoverContent,{align:y,className:o.cn("tw:w-[200px] tw:p-0",i),style:l,children:e.jsxs(o.Command,{children:[e.jsx(o.CommandInput,{placeholder:g,className:"tw:text-inherit",spaceSelectsHighlightedItem:!0}),e.jsx(o.CommandEmpty,{children:m}),e.jsx(o.CommandList,{children:S(r)?r.map(M=>e.jsx(o.CommandGroup,{heading:M.groupHeading,children:M.options.map(E=>O(E,M.groupHeading))},M.groupHeading)):e.jsx(o.CommandGroup,{children:r.map(M=>O(M))})})]})})]})}function ro({startChapter:t,endChapter:r,handleSelectStartChapter:a,handleSelectEndChapter:n,isDisabled:i=!1,chapterCount:l}){const c=s.useMemo(()=>Array.from({length:l},(w,p)=>p+1),[l]),d=w=>{a(w),w>r&&n(w)},u=w=>{n(w),ww.toString(),value:t},"start chapter"),e.jsx(o.Label,{htmlFor:"end-chapters-combobox",children:"to"}),e.jsx(qr,{isDisabled:i,onChange:u,buttonClassName:"tw:ms-2 tw:w-20",options:c,getOptionLabel:w=>w.toString(),value:r},"end chapter")]})}exports.BookSelectionMode=(t=>(t.CurrentBook="current book",t.ChooseBooks="choose books",t))(exports.BookSelectionMode||{});(t=>{t.CURRENT_BOOK="current book",t.CHOOSE_BOOKS="choose books"})(exports.BookSelectionMode||(exports.BookSelectionMode={}));const Jn=Object.freeze(["%webView_bookSelector_currentBook%","%webView_bookSelector_choose%","%webView_bookSelector_chooseBooks%"]),Ir=(t,r)=>t[r]??r;function Qn({handleBookSelectionModeChange:t,currentBookName:r,onSelectBooks:a,selectedBookIds:n,chapterCount:i,endChapter:l,handleSelectEndChapter:c,startChapter:d,handleSelectStartChapter:u,localizedStrings:w}){const p=Ir(w,"%webView_bookSelector_currentBook%"),h=Ir(w,"%webView_bookSelector_choose%"),g=Ir(w,"%webView_bookSelector_chooseBooks%"),[m,x]=s.useState("current book"),y=f=>{x(f),t(f)};return e.jsx(o.RadioGroup,{className:"pr-twp tw:flex",value:m,onValueChange:f=>y(f),children:e.jsxs("div",{className:"tw:flex tw:w-full tw:flex-col tw:gap-4",children:[e.jsxs("div",{className:"tw:grid tw:grid-cols-[25%_25%_50%]",children:[e.jsxs("div",{className:"tw:flex tw:items-center",children:[e.jsx(o.RadioGroupItem,{value:"current book"}),e.jsx(o.Label,{className:"tw:ms-1",children:p})]}),e.jsx(o.Label,{className:"tw:flex tw:items-center",children:r}),e.jsx("div",{className:"tw:flex tw:items-center tw:justify-end",children:e.jsx(ro,{isDisabled:m==="choose books",handleSelectStartChapter:u,handleSelectEndChapter:c,chapterCount:i,startChapter:d,endChapter:l})})]}),e.jsxs("div",{className:"tw:grid tw:grid-cols-[25%_50%_25%]",children:[e.jsxs("div",{className:"tw:flex tw:items-center",children:[e.jsx(o.RadioGroupItem,{value:"choose books"}),e.jsx(o.Label,{className:"tw:ms-1",children:g})]}),e.jsx(o.Label,{className:"tw:flex tw:items-center",children:n.map(f=>Lt.Canon.bookIdToEnglishName(f)).join(", ")}),e.jsx(o.Button,{disabled:m==="current book",onClick:()=>a(),children:h})]})]})})}const ao=s.createContext(null);function ti(t,r){return{getTheme:function(){return r??null}}}function he(){const t=s.useContext(ao);return t==null&&function(r,...a){const n=new URL("https://lexical.dev/docs/error"),i=new URLSearchParams;i.append("code",r);for(const l of a)i.append("v",l);throw n.search=i.toString(),Error(`Minified Lexical error #${r}; visit ${n.toString()} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}(8),t}const oo=typeof window<"u"&&window.document!==void 0&&window.document.createElement!==void 0,ei=oo?s.useLayoutEffect:s.useEffect,dr={tag:v.HISTORY_MERGE_TAG};function ri({initialConfig:t,children:r}){const a=s.useMemo(()=>{const{theme:n,namespace:i,nodes:l,onError:c,editorState:d,html:u}=t,w=ti(null,n),p=v.createEditor({editable:t.editable,html:u,namespace:i,nodes:l,onError:h=>c(h,p),theme:n});return function(h,g){if(g!==null){if(g===void 0)h.update(()=>{const m=v.$getRoot();if(m.isEmpty()){const x=v.$createParagraphNode();m.append(x);const y=oo?document.activeElement:null;(v.$getSelection()!==null||y!==null&&y===h.getRootElement())&&x.select()}},dr);else if(g!==null)switch(typeof g){case"string":{const m=h.parseEditorState(g);h.setEditorState(m,dr);break}case"object":h.setEditorState(g,dr);break;case"function":h.update(()=>{v.$getRoot().isEmpty()&&g(h)},dr)}}}(p,d),[p,w]},[]);return ei(()=>{const n=t.editable,[i]=a;i.setEditable(n===void 0||n)},[]),e.jsx(ao.Provider,{value:a,children:r})}const ai=typeof window<"u"&&window.document!==void 0&&window.document.createElement!==void 0?s.useLayoutEffect:s.useEffect;function oi({ignoreHistoryMergeTagChange:t=!0,ignoreSelectionChange:r=!1,onChange:a}){const[n]=he();return ai(()=>{if(a)return n.registerUpdateListener(({editorState:i,dirtyElements:l,dirtyLeaves:c,prevEditorState:d,tags:u})=>{r&&l.size===0&&c.size===0||t&&u.has(v.HISTORY_MERGE_TAG)||d.isEmpty()||a(i,n,u)})},[n,t,r,a]),null}const aa={ltr:"tw:text-left",rtl:"tw:text-right",heading:{h1:"tw:scroll-m-20 tw:text-4xl tw:font-extrabold tw:tracking-tight tw:lg:text-5xl",h2:"tw:scroll-m-20 tw:border-b tw:pb-2 tw:text-3xl tw:font-semibold tw:tracking-tight tw:first:mt-0",h3:"tw:scroll-m-20 tw:text-2xl tw:font-semibold tw:tracking-tight",h4:"tw:scroll-m-20 tw:text-xl tw:font-semibold tw:tracking-tight",h5:"tw:scroll-m-20 tw:text-lg tw:font-semibold tw:tracking-tight",h6:"tw:scroll-m-20 tw:text-base tw:font-semibold tw:tracking-tight"},paragraph:"tw:outline-hidden",quote:"tw:mt-6 tw:border-l-2 tw:pl-6 tw:italic",link:"tw:text-blue-600 tw:hover:underline tw:hover:cursor-pointer",list:{checklist:"tw:relative",listitem:"tw:mx-8",listitemChecked:'tw:relative tw:mx-2 tw:px-6 tw:list-none tw:outline-hidden tw:line-through tw:before:content-[""] tw:before:w-4 tw:before:h-4 tw:before:top-0.5 tw:before:left-0 tw:before:cursor-pointer tw:before:block tw:before:bg-cover tw:before:absolute tw:before:border tw:before:border-primary tw:before:rounded tw:before:bg-primary tw:before:bg-no-repeat tw:after:content-[""] tw:after:cursor-pointer tw:after:border-white tw:after:border-solid tw:after:absolute tw:after:block tw:after:top-[6px] tw:after:w-[3px] tw:after:left-[7px] tw:after:right-[7px] tw:after:h-[6px] tw:after:rotate-45 tw:after:border-r-2 tw:after:border-b-2 tw:after:border-l-0 tw:after:border-t-0',listitemUnchecked:'tw:relative tw:mx-2 tw:px-6 tw:list-none tw:outline-hidden tw:before:content-[""] tw:before:w-4 tw:before:h-4 tw:before:top-0.5 tw:before:left-0 tw:before:cursor-pointer tw:before:block tw:before:bg-cover tw:before:absolute tw:before:border tw:before:border-primary tw:before:rounded',nested:{listitem:"tw:list-none tw:before:hidden tw:after:hidden"},ol:"tw:m-0 tw:p-0 tw:list-decimal tw:[&>li]:mt-2",olDepth:["tw:list-outside tw:!list-decimal","tw:list-outside tw:!list-[upper-roman]","tw:list-outside tw:!list-[lower-roman]","tw:list-outside tw:!list-[upper-alpha]","tw:list-outside tw:!list-[lower-alpha]"],ul:"tw:m-0 tw:p-0 tw:list-outside tw:[&>li]:mt-2",ulDepth:["tw:list-outside tw:!list-disc","tw:list-outside tw:!list-disc","tw:list-outside tw:!list-disc","tw:list-outside tw:!list-disc","tw:list-outside tw:!list-disc"]},hashtag:"tw:text-blue-600 tw:bg-blue-100 tw:rounded-md tw:px-1",text:{bold:"tw:font-bold",code:"tw:bg-gray-100 tw:p-1 tw:rounded-md",italic:"tw:italic",strikethrough:"tw:line-through",subscript:"tw:sub",superscript:"tw:sup",underline:"tw:underline",underlineStrikethrough:"tw:underline tw:line-through"},image:"tw:relative tw:inline-block tw:user-select-none tw:cursor-default editor-image",inlineImage:"tw:relative tw:inline-block tw:user-select-none tw:cursor-default inline-editor-image",keyword:"tw:text-purple-900 tw:font-bold",code:"EditorTheme__code",codeHighlight:{atrule:"EditorTheme__tokenAttr",attr:"EditorTheme__tokenAttr",boolean:"EditorTheme__tokenProperty",builtin:"EditorTheme__tokenSelector",cdata:"EditorTheme__tokenComment",char:"EditorTheme__tokenSelector",class:"EditorTheme__tokenFunction","class-name":"EditorTheme__tokenFunction",comment:"EditorTheme__tokenComment",constant:"EditorTheme__tokenProperty",deleted:"EditorTheme__tokenProperty",doctype:"EditorTheme__tokenComment",entity:"EditorTheme__tokenOperator",function:"EditorTheme__tokenFunction",important:"EditorTheme__tokenVariable",inserted:"EditorTheme__tokenSelector",keyword:"EditorTheme__tokenAttr",namespace:"EditorTheme__tokenVariable",number:"EditorTheme__tokenProperty",operator:"EditorTheme__tokenOperator",prolog:"EditorTheme__tokenComment",property:"EditorTheme__tokenProperty",punctuation:"EditorTheme__tokenPunctuation",regex:"EditorTheme__tokenVariable",selector:"EditorTheme__tokenSelector",string:"EditorTheme__tokenSelector",symbol:"EditorTheme__tokenProperty",tag:"EditorTheme__tokenProperty",url:"EditorTheme__tokenOperator",variable:"EditorTheme__tokenVariable"},characterLimit:"tw:!bg-destructive/50",table:"EditorTheme__table tw:w-fit tw:overflow-scroll tw:border-collapse",tableCell:"EditorTheme__tableCell tw:w-24 tw:relative tw:border tw:px-4 tw:py-2 tw:text-left tw:[&[align=center]]:text-center tw:[&[align=right]]:text-right",tableCellActionButton:"EditorTheme__tableCellActionButton tw:bg-background tw:block tw:border-0 tw:rounded-2xl tw:w-5 tw:h-5 tw:text-foreground tw:cursor-pointer",tableCellActionButtonContainer:"EditorTheme__tableCellActionButtonContainer tw:block tw:right-1 tw:top-1.5 tw:absolute tw:z-10 tw:w-5 tw:h-5",tableCellEditing:"EditorTheme__tableCellEditing tw:rounded-sm tw:shadow-sm",tableCellHeader:"EditorTheme__tableCellHeader tw:bg-muted tw:border tw:px-4 tw:py-2 tw:text-left tw:font-bold tw:[&[align=center]]:text-center tw:[&[align=right]]:text-right",tableCellPrimarySelected:"EditorTheme__tableCellPrimarySelected tw:border tw:border-primary tw:border-solid tw:block tw:h-[calc(100%-2px)] tw:w-[calc(100%-2px)] tw:absolute tw:-left-[1px] tw:-top-[1px] tw:z-10 ",tableCellResizer:"EditorTheme__tableCellResizer tw:absolute tw:-right-1 tw:h-full tw:w-2 tw:cursor-ew-resize tw:z-10 tw:top-0",tableCellSelected:"EditorTheme__tableCellSelected tw:bg-muted",tableCellSortedIndicator:"EditorTheme__tableCellSortedIndicator tw:block tw:opacity-50 tw:absolute tw:bottom-0 tw:left-0 tw:w-full tw:h-1 tw:bg-muted",tableResizeRuler:"EditorTheme__tableCellResizeRuler tw:block tw:absolute tw:w-[1px] tw:h-full tw:bg-primary tw:top-0",tableRowStriping:"EditorTheme__tableRowStriping tw:m-0 tw:border-t tw:p-0 tw:even:bg-muted",tableSelected:"EditorTheme__tableSelected tw:ring-2 tw:ring-primary tw:ring-offset-2",tableSelection:"EditorTheme__tableSelection tw:bg-transparent",layoutItem:"tw:border tw:border-dashed tw:px-4 tw:py-2",layoutContainer:"tw:grid tw:gap-2.5 tw:my-2.5 tw:mx-0",autocomplete:"tw:text-muted-foreground",blockCursor:"",embedBlock:{base:"tw:user-select-none",focus:"tw:ring-2 tw:ring-primary tw:ring-offset-2"},hr:'tw:p-0.5 tw:border-none tw:my-1 tw:mx-0 tw:cursor-pointer tw:after:content-[""] tw:after:block tw:after:h-0.5 tw:after:bg-muted tw:selected:ring-2 tw:selected:ring-primary tw:selected:ring-offset-2 tw:selected:user-select-none',indent:"[--lexical-indent-base-value:40px]",mark:"",markOverlap:""},oa=[Gr.HeadingNode,v.ParagraphNode,v.TextNode,Gr.QuoteNode],ni=s.createContext(null),Or={didCatch:!1,error:null};class ii extends s.Component{constructor(r){super(r),this.resetErrorBoundary=this.resetErrorBoundary.bind(this),this.state=Or}static getDerivedStateFromError(r){return{didCatch:!0,error:r}}resetErrorBoundary(){const{error:r}=this.state;if(r!==null){for(var a,n,i=arguments.length,l=new Array(i),c=0;c0&&arguments[0]!==void 0?arguments[0]:[],r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[];return t.length!==r.length||t.some((a,n)=>!Object.is(a,r[n]))}function ci({children:t,onError:r}){return e.jsx(ii,{fallback:e.jsx("div",{style:{border:"1px solid #f00",color:"#f00",padding:"8px"},children:"An error was thrown."}),onError:r,children:t})}const li=typeof window<"u"&&window.document!==void 0&&window.document.createElement!==void 0?s.useLayoutEffect:s.useEffect;function di(t){return{initialValueFn:()=>t.isEditable(),subscribe:r=>t.registerEditableListener(r)}}function wi(){return function(t){const[r]=he(),a=s.useMemo(()=>t(r),[r,t]),[n,i]=s.useState(()=>a.initialValueFn()),l=s.useRef(n);return li(()=>{const{initialValueFn:c,subscribe:d}=a,u=c();return l.current!==u&&(l.current=u,i(u)),d(w=>{l.current=w,i(w)})},[a,t]),n}(di)}function ui(t,r){const a=t.getRootElement();if(a===null)return[];const n=a.getBoundingClientRect(),i=getComputedStyle(a),l=parseFloat(i.paddingLeft)+parseFloat(i.paddingRight),c=Array.from(r.getClientRects());let d,u=c.length;c.sort((w,p)=>{const h=w.top-p.top;return Math.abs(h)<=3?w.left-p.left:h});for(let w=0;wp.top&&d.left+d.width>p.left,g=p.width+l===n.width;h||g?(c.splice(w--,1),u--):d=p}return c}function xr(t,...r){const a=new URL("https://lexical.dev/docs/error"),n=new URLSearchParams;n.append("code",t);for(const i of r)n.append("v",i);throw a.search=n.toString(),Error(`Minified Lexical error #${t}; visit ${a.toString()} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}const no=typeof window<"u"&&window.document!==void 0&&window.document.createElement!==void 0,pi=no&&"documentMode"in document?document.documentMode:null;!(!no||!("InputEvent"in window)||pi)&&"getTargetRanges"in new window.InputEvent("input");function ue(t){return`${t}px`}const hi={attributes:!0,characterData:!0,childList:!0,subtree:!0};function gi(t,r,a){let n=null,i=null,l=null,c=[];const d=document.createElement("div");function u(){n===null&&xr(182),i===null&&xr(183);const{left:h,top:g}=i.getBoundingClientRect(),m=ui(t,r);var x,y;d.isConnected||(y=d,(x=i).insertBefore(y,x.firstChild));let f=!1;for(let N=0;Nm.length;)c.pop();f&&a(c)}function w(){i=null,n=null,l!==null&&l.disconnect(),l=null,d.remove();for(const h of c)h.remove();c=[]}d.style.position="relative";const p=t.registerRootListener(function h(){const g=t.getRootElement();if(g===null)return w();const m=g.parentElement;if(!v.isHTMLElement(m))return w();w(),n=g,i=m,l=new MutationObserver(x=>{const y=t.getRootElement(),f=y&&y.parentElement;if(y!==n||f!==i)return h();for(const N of x)if(!d.contains(N.target))return u()}),l.observe(m,hi),u()});return()=>{p(),w()}}function Ta(t,r,a){if(t.type!=="text"&&v.$isElementNode(r)){const n=r.getDOMSlot(a);return[n.element,n.getFirstChildOffset()+t.offset]}return[v.getDOMTextNode(a)||a,t.offset]}function fi(t){for(const r of t){const a=r.style;a.background!=="Highlight"&&(a.background="Highlight"),a.color!=="HighlightText"&&(a.color="HighlightText"),a.marginTop!==ue(-1.5)&&(a.marginTop=ue(-1.5)),a.paddingTop!==ue(4)&&(a.paddingTop=ue(4)),a.paddingBottom!==ue(0)&&(a.paddingBottom=ue(0))}}function mi(t,r=fi){let a=null,n=null,i=null,l=null,c=null,d=null,u=()=>{};function w(p){p.read(()=>{const h=v.$getSelection();if(!v.$isRangeSelection(h))return a=null,i=null,l=null,d=null,u(),void(u=()=>{});const[g,m]=function(M){const E=M.getStartEndPoints();return M.isBackward()?[E[1],E[0]]:E}(h),x=g.getNode(),y=x.getKey(),f=g.offset,N=m.getNode(),k=N.getKey(),C=m.offset,j=t.getElementByKey(y),L=t.getElementByKey(k),S=a===null||j!==n||f!==i||y!==a.getKey(),O=l===null||L!==c||C!==d||k!==l.getKey();if((S||O)&&j!==null&&L!==null){const M=function(E,D,Y,X,A,_,rt){const P=(E._window?E._window.document:document).createRange();return P.setStart(...Ta(D,Y,X)),P.setEnd(...Ta(A,_,rt)),P}(t,g,x,j,m,N,L);u(),u=gi(t,M,r)}a=x,n=j,i=f,l=N,c=L,d=C})}return w(t.getEditorState()),v.mergeRegister(t.registerUpdateListener(({editorState:p})=>w(p)),()=>{u()})}function vi(t,r){let a=null;const n=()=>{const i=getSelection(),l=i&&i.anchorNode,c=t.getRootElement();l!==null&&c!==null&&c.contains(l)?a!==null&&(a(),a=null):a===null&&(a=mi(t,r))};return t.registerRootListener(i=>{if(i){const l=i.ownerDocument;return l.addEventListener("selectionchange",n),n(),()=>{a!==null&&a(),l.removeEventListener("selectionchange",n)}}})}function bi(t){const r=v.$findMatchingParent(t,a=>v.$isElementNode(a)&&!a.isInline());return v.$isElementNode(r)||xr(4,t.__key),r}function xi(t){const r=v.$getSelection()||v.$getPreviousSelection();let a;if(v.$isRangeSelection(r))a=v.$caretFromPoint(r.focus,"next");else{if(r!=null){const c=r.getNodes(),d=c[c.length-1];d&&(a=v.$getSiblingCaret(d,"next"))}a=a||v.$getChildCaret(v.$getRoot(),"previous").getFlipped().insert(v.$createParagraphNode())}const n=yi(t,a),i=v.$getAdjacentChildCaret(n),l=v.$isChildCaret(i)?v.$normalizeCaret(i):n;return v.$setSelectionFromCaretRange(v.$getCollapsedCaretRange(l)),t.getLatest()}function yi(t,r,a){let n=v.$getCaretInDirection(r,"next");for(let i=n;i;i=v.$splitAtPointCaretNext(i,a))n=i;return v.$isTextPointCaret(n)&&xr(283),n.insert(t.isInline()?v.$createParagraphNode().append(t):t),v.$getCaretInDirection(v.$getSiblingCaret(t.getLatest(),"next"),r.direction)}function ki(t){const r=v.$getSelection();if(!v.$isRangeSelection(r))return!1;const a=new Set,n=r.getNodes();for(let i=0;iv.$isElementNode(w)&&!w.isInline());if(d===null)continue;const u=d.getKey();d.canIndent()&&!a.has(u)&&(a.add(u),t(d))}return a.size>0}const _i=Symbol.for("preact-signals");function Er(){if(be>1)return void be--;let t,r=!1;for(!function(){let a=yr;for(yr=void 0;a!==void 0;)a.S.v===a.v&&(a.S.i=a.i),a=a.o}();We!==void 0;){let a=We;for(We=void 0,kr++;a!==void 0;){const n=a.u;if(a.u=void 0,a.f&=-3,!(8&a.f)&&io(a))try{a.c()}catch(i){r||(t=i,r=!0)}a=n}}if(kr=0,be--,r)throw t}function ji(t){if(be>0)return t();Yr=++Ci,be++;try{return t()}finally{Er()}}let ut,We;function Sa(t){const r=ut;ut=void 0;try{return t()}finally{ut=r}}let yr,be=0,kr=0,Ci=0,Yr=0,fr=0;function Ra(t){if(ut===void 0)return;let r=t.n;return r===void 0||r.t!==ut?(r={i:0,S:t,p:ut.s,n:void 0,t:ut,e:void 0,x:void 0,r},ut.s!==void 0&&(ut.s.n=r),ut.s=r,t.n=r,32&ut.f&&t.S(r),r):r.i===-1?(r.i=0,r.n!==void 0&&(r.n.p=r.p,r.p!==void 0&&(r.p.n=r.n),r.p=ut.s,r.n=void 0,ut.s.n=r,ut.s=r),r):void 0}function Ht(t,r){this.v=t,this.i=0,this.n=void 0,this.t=void 0,this.l=0,this.W=r==null?void 0:r.watched,this.Z=r==null?void 0:r.unwatched,this.name=r==null?void 0:r.name}function Ze(t,r){return new Ht(t,r)}function io(t){for(let r=t.s;r!==void 0;r=r.n)if(r.S.i!==r.i||!r.S.h()||r.S.i!==r.i)return!0;return!1}function Ma(t){for(let r=t.s;r!==void 0;r=r.n){const a=r.S.n;if(a!==void 0&&(r.r=a),r.S.n=r,r.i=-1,r.n===void 0){t.s=r;break}}}function so(t){let r,a=t.s;for(;a!==void 0;){const n=a.p;a.i===-1?(a.S.U(a),n!==void 0&&(n.n=a.n),a.n!==void 0&&(a.n.p=n)):r=a,a.S.n=a.r,a.r!==void 0&&(a.r=void 0),a=n}t.s=r}function Ne(t,r){Ht.call(this,void 0),this.x=t,this.s=void 0,this.g=fr-1,this.f=4,this.W=r==null?void 0:r.watched,this.Z=r==null?void 0:r.unwatched,this.name=r==null?void 0:r.name}function Ni(t,r){return new Ne(t,r)}function co(t){const r=t.m;if(t.m=void 0,typeof r=="function"){be++;const a=ut;ut=void 0;try{r()}catch(n){throw t.f&=-2,t.f|=8,na(t),n}finally{ut=a,Er()}}}function na(t){for(let r=t.s;r!==void 0;r=r.n)r.S.U(r);t.x=void 0,t.s=void 0,co(t)}function Ei(t){if(ut!==this)throw new Error("Out-of-order effect");so(this),ut=t,this.f&=-2,8&this.f&&na(this),Er()}function Be(t,r){this.x=t,this.m=void 0,this.s=void 0,this.u=void 0,this.f=32,this.name=r==null?void 0:r.name}function pe(t,r){const a=new Be(t,r);try{a.c()}catch(i){throw a.d(),i}const n=a.d.bind(a);return n[Symbol.dispose]=n,n}function Ke(t,r={}){const a={};for(const n in t){const i=r[n],l=Ze(i===void 0?t[n]:i);a[n]=l}return a}Ht.prototype.brand=_i,Ht.prototype.h=function(){return!0},Ht.prototype.S=function(t){const r=this.t;r!==t&&t.e===void 0&&(t.x=r,this.t=t,r!==void 0?r.e=t:Sa(()=>{var a;(a=this.W)==null||a.call(this)}))},Ht.prototype.U=function(t){if(this.t!==void 0){const r=t.e,a=t.x;r!==void 0&&(r.x=a,t.e=void 0),a!==void 0&&(a.e=r,t.x=void 0),t===this.t&&(this.t=a,a===void 0&&Sa(()=>{var n;(n=this.Z)==null||n.call(this)}))}},Ht.prototype.subscribe=function(t){return pe(()=>{const r=this.value,a=ut;ut=void 0;try{t(r)}finally{ut=a}},{name:"sub"})},Ht.prototype.valueOf=function(){return this.value},Ht.prototype.toString=function(){return this.value+""},Ht.prototype.toJSON=function(){return this.value},Ht.prototype.peek=function(){const t=ut;ut=void 0;try{return this.value}finally{ut=t}},Object.defineProperty(Ht.prototype,"value",{get(){const t=Ra(this);return t!==void 0&&(t.i=this.i),this.v},set(t){if(t!==this.v){if(kr>100)throw new Error("Cycle detected");(function(r){be!==0&&kr===0&&r.l!==Yr&&(r.l=Yr,yr={S:r,v:r.v,i:r.i,o:yr})})(this),this.v=t,this.i++,fr++,be++;try{for(let r=this.t;r!==void 0;r=r.x)r.t.N()}finally{Er()}}}}),Ne.prototype=new Ht,Ne.prototype.h=function(){if(this.f&=-3,1&this.f)return!1;if((36&this.f)==32||(this.f&=-5,this.g===fr))return!0;if(this.g=fr,this.f|=1,this.i>0&&!io(this))return this.f&=-2,!0;const t=ut;try{Ma(this),ut=this;const r=this.x();(16&this.f||this.v!==r||this.i===0)&&(this.v=r,this.f&=-17,this.i++)}catch(r){this.v=r,this.f|=16,this.i++}return ut=t,so(this),this.f&=-2,!0},Ne.prototype.S=function(t){if(this.t===void 0){this.f|=36;for(let r=this.s;r!==void 0;r=r.n)r.S.S(r)}Ht.prototype.S.call(this,t)},Ne.prototype.U=function(t){if(this.t!==void 0&&(Ht.prototype.U.call(this,t),this.t===void 0)){this.f&=-33;for(let r=this.s;r!==void 0;r=r.n)r.S.U(r)}},Ne.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(let t=this.t;t!==void 0;t=t.x)t.t.N()}},Object.defineProperty(Ne.prototype,"value",{get(){if(1&this.f)throw new Error("Cycle detected");const t=Ra(this);if(this.h(),t!==void 0&&(t.i=this.i),16&this.f)throw this.v;return this.v}}),Be.prototype.c=function(){const t=this.S();try{if(8&this.f||this.x===void 0)return;const r=this.x();typeof r=="function"&&(this.m=r)}finally{t()}},Be.prototype.S=function(){if(1&this.f)throw new Error("Cycle detected");this.f|=1,this.f&=-9,co(this),Ma(this),be++;const t=ut;return ut=this,Ei.bind(this,t)},Be.prototype.N=function(){2&this.f||(this.f|=2,this.u=We,We=this)},Be.prototype.d=function(){this.f|=8,1&this.f||na(this)},Be.prototype.dispose=function(){this.d()};v.defineExtension({build:(t,r,a)=>Ke(r),config:v.safeCast({defaultSelection:"rootEnd",disabled:!1}),name:"@lexical/extension/AutoFocus",register(t,r,a){const n=a.getOutput();return pe(()=>n.disabled.value?void 0:t.registerRootListener(i=>{t.focus(()=>{const l=document.activeElement;i===null||l!==null&&i.contains(l)||i.focus({preventScroll:!0})},{defaultSelection:n.defaultSelection.peek()})}))}});function lo(){const t=v.$getRoot(),r=v.$getSelection(),a=v.$createParagraphNode();t.clear(),t.append(a),r!==null&&a.select(),v.$isRangeSelection(r)&&(r.format=0)}function wo(t,r=lo){return t.registerCommand(v.CLEAR_EDITOR_COMMAND,a=>(t.update(r),!0),v.COMMAND_PRIORITY_EDITOR)}v.defineExtension({build:(t,r,a)=>Ke(r),config:v.safeCast({$onClear:lo}),name:"@lexical/extension/ClearEditor",register(t,r,a){const{$onClear:n}=a.getOutput();return pe(()=>wo(t,n.value))}});function Ti(t){return(typeof t.nodes=="function"?t.nodes():t.nodes)||[]}const Pr=v.createState("format",{parse:t=>typeof t=="number"?t:0});class uo extends v.DecoratorNode{$config(){return this.config("decorator-text",{extends:v.DecoratorNode,stateConfigs:[{flat:!0,stateConfig:Pr}]})}getFormat(){return v.$getState(this,Pr)}getFormatFlags(r,a){return v.toggleTextFormatType(this.getFormat(),r,a)}hasFormat(r){const a=v.TEXT_TYPE_TO_FORMAT[r];return(this.getFormat()&a)!==0}setFormat(r){return v.$setState(this,Pr,r)}toggleFormat(r){const a=this.getFormat(),n=v.toggleTextFormatType(a,r,null);return this.setFormat(n)}isInline(){return!0}createDOM(){return document.createElement("span")}updateDOM(){return!1}}function Si(t){return t instanceof uo}v.defineExtension({name:"@lexical/extension/DecoratorText",nodes:()=>[uo],register:(t,r,a)=>t.registerCommand(v.FORMAT_TEXT_COMMAND,n=>{const i=v.$getSelection();if(v.$isNodeSelection(i)||v.$isRangeSelection(i))for(const l of i.getNodes())Si(l)&&l.toggleFormat(n);return!1},v.COMMAND_PRIORITY_LOW)});function po(t,r){let a;return Ze(t(),{unwatched(){a&&(a(),a=void 0)},watched(){this.value=t(),a=r(this)}})}const Xr=v.defineExtension({build:t=>po(()=>t.getEditorState(),r=>t.registerUpdateListener(a=>{r.value=a.editorState})),name:"@lexical/extension/EditorState"});function pt(t,...r){const a=new URL("https://lexical.dev/docs/error"),n=new URLSearchParams;n.append("code",t);for(const i of r)n.append("v",i);throw a.search=n.toString(),Error(`Minified Lexical error #${t}; visit ${a.toString()} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}function ho(t,r){if(t&&r&&!Array.isArray(r)&&typeof t=="object"&&typeof r=="object"){const a=t,n=r;for(const i in n)a[i]=ho(a[i],n[i]);return t}return r}const ia=0,Wr=1,go=2,Lr=3,wr=4,Ae=5,Ar=6,He=7;function Br(t){return t.id===ia}function fo(t){return t.id===go}function Ri(t){return function(r){return r.id===Wr}(t)||pt(305,String(t.id),String(Wr)),Object.assign(t,{id:go})}const Mi=new Set;class Di{constructor(r,a){Kt(this,"builder");Kt(this,"configs");Kt(this,"_dependency");Kt(this,"_peerNameSet");Kt(this,"extension");Kt(this,"state");Kt(this,"_signal");this.builder=r,this.extension=a,this.configs=new Set,this.state={id:ia}}mergeConfigs(){let r=this.extension.config||{};const a=this.extension.mergeConfig?this.extension.mergeConfig.bind(this.extension):v.shallowMergeConfig;for(const n of this.configs)r=a(r,n);return r}init(r){const a=this.state;fo(a)||pt(306,String(a.id));const n={getDependency:this.getInitDependency.bind(this),getDirectDependentNames:this.getDirectDependentNames.bind(this),getPeer:this.getInitPeer.bind(this),getPeerNameSet:this.getPeerNameSet.bind(this)},i={...n,getDependency:this.getDependency.bind(this),getInitResult:this.getInitResult.bind(this),getPeer:this.getPeer.bind(this)},l=function(d,u,w){return Object.assign(d,{config:u,id:Lr,registerState:w})}(a,this.mergeConfigs(),n);let c;this.state=l,this.extension.init&&(c=this.extension.init(r,l.config,n)),this.state=function(d,u,w){return Object.assign(d,{id:wr,initResult:u,registerState:w})}(l,c,i)}build(r){const a=this.state;let n;a.id!==wr&&pt(307,String(a.id),String(Ae)),this.extension.build&&(n=this.extension.build(r,a.config,a.registerState));const i={...a.registerState,getOutput:()=>n,getSignal:this.getSignal.bind(this)};this.state=function(l,c,d){return Object.assign(l,{id:Ae,output:c,registerState:d})}(a,n,i)}register(r,a){this._signal=a;const n=this.state;n.id!==Ae&&pt(308,String(n.id),String(Ae));const i=this.extension.register&&this.extension.register(r,n.config,n.registerState);return this.state=function(l){return Object.assign(l,{id:Ar})}(n),()=>{const l=this.state;l.id!==He&&pt(309,String(n.id),String(He)),this.state=function(c){return Object.assign(c,{id:Ae})}(l),i&&i()}}afterRegistration(r){const a=this.state;let n;return a.id!==Ar&&pt(310,String(a.id),String(Ar)),this.extension.afterRegistration&&(n=this.extension.afterRegistration(r,a.config,a.registerState)),this.state=function(i){return Object.assign(i,{id:He})}(a),n}getSignal(){return this._signal===void 0&&pt(311),this._signal}getInitResult(){this.extension.init===void 0&&pt(312,this.extension.name);const r=this.state;return function(a){return a.id>=wr}(r)||pt(313,String(r.id),String(wr)),r.initResult}getInitPeer(r){const a=this.builder.extensionNameMap.get(r);return a?a.getExtensionInitDependency():void 0}getExtensionInitDependency(){const r=this.state;return function(a){return a.id>=Lr}(r)||pt(314,String(r.id),String(Lr)),{config:r.config}}getPeer(r){const a=this.builder.extensionNameMap.get(r);return a?a.getExtensionDependency():void 0}getInitDependency(r){const a=this.builder.getExtensionRep(r);return a===void 0&&pt(315,this.extension.name,r.name),a.getExtensionInitDependency()}getDependency(r){const a=this.builder.getExtensionRep(r);return a===void 0&&pt(315,this.extension.name,r.name),a.getExtensionDependency()}getState(){const r=this.state;return function(a){return a.id>=He}(r)||pt(316,String(r.id),String(He)),r}getDirectDependentNames(){return this.builder.incomingEdges.get(this.extension.name)||Mi}getPeerNameSet(){let r=this._peerNameSet;return r||(r=new Set((this.extension.peerDependencies||[]).map(([a])=>a)),this._peerNameSet=r),r}getExtensionDependency(){if(!this._dependency){const r=this.state;(function(a){return a.id>=Ae})(r)||pt(317,this.extension.name),this._dependency={config:r.config,init:r.initResult,output:r.output}}return this._dependency}}const Da={tag:v.HISTORY_MERGE_TAG};function Ii(){const t=v.$getRoot();t.isEmpty()&&t.append(v.$createParagraphNode())}const Oi=v.defineExtension({config:v.safeCast({setOptions:Da,updateOptions:Da}),init:({$initialEditorState:t=Ii})=>({$initialEditorState:t,initialized:!1}),afterRegistration(t,{updateOptions:r,setOptions:a},n){const i=n.getInitResult();if(!i.initialized){i.initialized=!0;const{$initialEditorState:l}=i;if(v.$isEditorState(l))t.setEditorState(l,a);else if(typeof l=="function")t.update(()=>{l(t)},r);else if(l&&(typeof l=="string"||typeof l=="object")){const c=t.parseEditorState(l);t.setEditorState(c,a)}}return()=>{}},name:"@lexical/extension/InitialState",nodes:[v.RootNode,v.TextNode,v.LineBreakNode,v.TabNode,v.ParagraphNode]}),Ia=Symbol.for("@lexical/extension/LexicalBuilder");function Oa(){}function Pi(t){throw t}function ur(t){return Array.isArray(t)?t:[t]}const zr="0.43.0+prod.esm";class Ve{constructor(r){Kt(this,"roots");Kt(this,"extensionNameMap");Kt(this,"outgoingConfigEdges");Kt(this,"incomingEdges");Kt(this,"conflicts");Kt(this,"_sortedExtensionReps");Kt(this,"PACKAGE_VERSION");this.outgoingConfigEdges=new Map,this.incomingEdges=new Map,this.extensionNameMap=new Map,this.conflicts=new Map,this.PACKAGE_VERSION=zr,this.roots=r;for(const a of r)this.addExtension(a)}static fromExtensions(r){const a=[ur(Oi)];for(const n of r)a.push(ur(n));return new Ve(a)}static maybeFromEditor(r){const a=r[Ia];return a&&(a.PACKAGE_VERSION!==zr&&pt(292,a.PACKAGE_VERSION,zr),a instanceof Ve||pt(293)),a}static fromEditor(r){const a=Ve.maybeFromEditor(r);return a===void 0&&pt(294),a}constructEditor(){const{$initialEditorState:r,onError:a,...n}=this.buildCreateEditorArgs(),i=Object.assign(v.createEditor({...n,...a?{onError:l=>{a(l,i)}}:{}}),{[Ia]:this});for(const l of this.sortedExtensionReps())l.build(i);return i}buildEditor(){let r=Oa;function a(){try{r()}finally{r=Oa}}const n=Object.assign(this.constructEditor(),{dispose:a,[Symbol.dispose]:a});return r=v.mergeRegister(this.registerEditor(n),()=>n.setRootElement(null)),n}hasExtensionByName(r){return this.extensionNameMap.has(r)}getExtensionRep(r){const a=this.extensionNameMap.get(r.name);if(a)return a.extension!==r&&pt(295,r.name),a}addEdge(r,a,n){const i=this.outgoingConfigEdges.get(r);i?i.set(a,n):this.outgoingConfigEdges.set(r,new Map([[a,n]]));const l=this.incomingEdges.get(a);l?l.add(r):this.incomingEdges.set(a,new Set([r]))}addExtension(r){this._sortedExtensionReps!==void 0&&pt(296);const a=ur(r),[n]=a;typeof n.name!="string"&&pt(297,typeof n.name);let i=this.extensionNameMap.get(n.name);if(i!==void 0&&i.extension!==n&&pt(298,n.name),!i){i=new Di(this,n),this.extensionNameMap.set(n.name,i);const l=this.conflicts.get(n.name);typeof l=="string"&&pt(299,n.name,l);for(const c of n.conflictsWith||[])this.extensionNameMap.has(c)&&pt(299,n.name,c),this.conflicts.set(c,n.name);for(const c of n.dependencies||[]){const d=ur(c);this.addEdge(n.name,d[0].name,d.slice(1)),this.addExtension(d)}for(const[c,d]of n.peerDependencies||[])this.addEdge(n.name,c,d?[d]:[])}}sortedExtensionReps(){if(this._sortedExtensionReps)return this._sortedExtensionReps;const r=[],a=(n,i)=>{let l=n.state;if(fo(l))return;const c=n.extension.name;var d;Br(l)||pt(300,c,i||"[unknown]"),Br(d=l)||pt(304,String(d.id),String(ia)),l=Object.assign(d,{id:Wr}),n.state=l;const u=this.outgoingConfigEdges.get(c);if(u)for(const w of u.keys()){const p=this.extensionNameMap.get(w);p&&a(p,c)}l=Ri(l),n.state=l,r.push(n)};for(const n of this.extensionNameMap.values())Br(n.state)&&a(n);for(const n of r)for(const[i,l]of this.outgoingConfigEdges.get(n.extension.name)||[])if(l.length>0){const c=this.extensionNameMap.get(i);if(c)for(const d of l)c.configs.add(d)}for(const[n,...i]of this.roots)if(i.length>0){const l=this.extensionNameMap.get(n.name);l===void 0&&pt(301,n.name);for(const c of i)l.configs.add(c)}return this._sortedExtensionReps=r,this._sortedExtensionReps}registerEditor(r){const a=this.sortedExtensionReps(),n=new AbortController,i=[()=>n.abort()],l=n.signal;for(const c of a){const d=c.register(r,l);d&&i.push(d)}for(const c of a){const d=c.afterRegistration(r);d&&i.push(d)}return v.mergeRegister(...i)}buildCreateEditorArgs(){const r={},a=new Set,n=new Map,i=new Map,l={},c={},d=this.sortedExtensionReps();for(const p of d){const{extension:h}=p;if(h.onError!==void 0&&(r.onError=h.onError),h.disableEvents!==void 0&&(r.disableEvents=h.disableEvents),h.parentEditor!==void 0&&(r.parentEditor=h.parentEditor),h.editable!==void 0&&(r.editable=h.editable),h.namespace!==void 0&&(r.namespace=h.namespace),h.$initialEditorState!==void 0&&(r.$initialEditorState=h.$initialEditorState),h.nodes)for(const g of Ti(h)){if(typeof g!="function"){const m=n.get(g.replace);m&&pt(302,h.name,g.replace.name,m.extension.name),n.set(g.replace,p)}a.add(g)}if(h.html){if(h.html.export)for(const[g,m]of h.html.export.entries())i.set(g,m);h.html.import&&Object.assign(l,h.html.import)}h.theme&&ho(c,h.theme)}Object.keys(c).length>0&&(r.theme=c),a.size&&(r.nodes=[...a]);const u=Object.keys(l).length>0,w=i.size>0;(u||w)&&(r.html={},u&&(r.html.import=l),w&&(r.html.export=i));for(const p of d)p.init(r);return r.onError||(r.onError=Pi),r}}const Li=new Set,Pa=v.defineExtension({build(t,r,a){const n=a.getDependency(Xr).output,i=Ze({watchedNodeKeys:new Map}),l=po(()=>{},()=>pe(()=>{const c=l.peek(),{watchedNodeKeys:d}=i.value;let u,w=!1;n.value.read(()=>{if(v.$getSelection())for(const[p,h]of d.entries()){if(h.size===0){d.delete(p);continue}const g=v.$getNodeByKey(p),m=g&&g.isSelected()||!1;w=w||m!==(!!c&&c.has(p)),m&&(u=u||new Set,u.add(p))}}),!w&&u&&c&&u.size===c.size||(l.value=u)}));return{watchNodeKey:function(c){const d=Ni(()=>(l.value||Li).has(c)),{watchedNodeKeys:u}=i.peek();let w=u.get(c);const p=w!==void 0;return w=w||new Set,w.add(d),p||(u.set(c,w),i.value={watchedNodeKeys:u}),d}}},dependencies:[Xr],name:"@lexical/extension/NodeSelection"}),Ai=v.createCommand("INSERT_HORIZONTAL_RULE_COMMAND");class Fe extends v.DecoratorNode{static getType(){return"horizontalrule"}static clone(r){return new Fe(r.__key)}static importJSON(r){return sa().updateFromJSON(r)}static importDOM(){return{hr:()=>({conversion:Bi,priority:0})}}exportDOM(){return{element:document.createElement("hr")}}createDOM(r){const a=document.createElement("hr");return v.addClassNamesToElement(a,r.theme.hr),a}getTextContent(){return` -`}isInline(){return!1}updateDOM(){return!1}}function Bi(){return{node:sa()}}function sa(){return v.$create(Fe)}function zi(t){return t instanceof Fe}v.defineExtension({dependencies:[Xr,Pa],name:"@lexical/extension/HorizontalRule",nodes:()=>[Fe],register(t,r,a){const{watchNodeKey:n}=a.getDependency(Pa).output,i=Ze({nodeSelections:new Map}),l=t._config.theme.hrSelected??"selected";return v.mergeRegister(t.registerCommand(Ai,c=>{const d=v.$getSelection();if(!v.$isRangeSelection(d))return!1;if(d.focus.getNode()!==null){const u=sa();xi(u)}return!0},v.COMMAND_PRIORITY_EDITOR),t.registerCommand(v.CLICK_COMMAND,c=>{if(v.isDOMNode(c.target)){const d=v.$getNodeFromDOMNode(c.target);if(zi(d))return function(u,w=!1){const p=v.$getSelection(),h=u.isSelected(),g=u.getKey();let m;w&&v.$isNodeSelection(p)?m=p:(m=v.$createNodeSelection(),v.$setSelection(m)),h?m.delete(g):m.add(g)}(d,c.shiftKey),!0}return!1},v.COMMAND_PRIORITY_LOW),t.registerMutationListener(Fe,(c,d)=>{ji(()=>{let u=!1;const{nodeSelections:w}=i.peek();for(const[p,h]of c.entries())if(h==="destroyed")w.delete(p),u=!0;else{const g=w.get(p),m=t.getElementByKey(p);g?g.domNode.value=m:(u=!0,w.set(p,{domNode:Ze(m),selectedSignal:n(p)}))}u&&(i.value={nodeSelections:w})})}),pe(()=>{const c=[];for(const{domNode:d,selectedSignal:u}of i.value.nodeSelections.values())c.push(pe(()=>{const w=d.value;w&&(u.value?v.addClassNamesToElement(w,l):v.removeClassNamesFromElement(w,l))}));return v.mergeRegister(...c)}))}});v.defineExtension({build:(t,r)=>Ke({inheritEditableFromParent:r.inheritEditableFromParent}),config:v.safeCast({$getParentEditor:function(){const t=v.$getEditor();return Ve.fromEditor(t),t},inheritEditableFromParent:!1}),init:(t,r,a)=>{const n=r.$getParentEditor();t.parentEditor=n,t.theme=t.theme||n._config.theme},name:"@lexical/extension/NestedEditor",register:(t,r,a)=>pe(()=>{const n=t._parentEditor;if(n&&a.getOutput().inheritEditableFromParent.value)return t.setEditable(n.isEditable()),n.registerEditableListener(t.setEditable.bind(t))})});v.defineExtension({build:(t,r,a)=>Ke(r),config:v.safeCast({disabled:!1,onReposition:void 0}),name:"@lexical/utils/SelectionAlwaysOnDisplay",register:(t,r,a)=>{const n=a.getOutput();return pe(()=>{if(!n.disabled.value)return vi(t,n.onReposition.value)})}});function mo(t){return t.canBeEmpty()}function $i(t,r,a=mo){return v.mergeRegister(t.registerCommand(v.KEY_TAB_COMMAND,n=>{const i=v.$getSelection();if(!v.$isRangeSelection(i))return!1;n.preventDefault();const l=function(c){if(c.getNodes().filter(g=>v.$isBlockElementNode(g)&&g.canIndent()).length>0)return!0;const d=c.anchor,u=c.focus,w=u.isBefore(d)?u:d,p=w.getNode(),h=bi(p);if(h.canIndent()){const g=h.getKey();let m=v.$createRangeSelection();if(m.anchor.set(g,0,"element"),m.focus.set(g,0,"element"),m=v.$normalizeSelection__EXPERIMENTAL(m),m.anchor.is(w))return!0}return!1}(i)?n.shiftKey?v.OUTDENT_CONTENT_COMMAND:v.INDENT_CONTENT_COMMAND:v.INSERT_TAB_COMMAND;return t.dispatchCommand(l,void 0)},v.COMMAND_PRIORITY_EDITOR),t.registerCommand(v.INDENT_CONTENT_COMMAND,()=>{const n=typeof r=="number"?r:r?r.peek():null,i=v.$getSelection();if(!v.$isRangeSelection(i))return!1;const l=typeof a=="function"?a:a.peek();return ki(c=>{if(l(c)){const d=c.getIndent()+1;(!n||dKe(r),config:v.safeCast({$canIndent:mo,disabled:!1,maxIndent:null}),name:"@lexical/extension/TabIndentation",register(t,r,a){const{disabled:n,maxIndent:i,$canIndent:l}=a.getOutput();return pe(()=>{if(!n.value)return $i(t,i,l)})}});const Vi=v.defineExtension({name:"@lexical/react/ReactProvider"});function Fi(){return v.$getRoot().getTextContent()}function Gi(t,r=!0){if(t)return!1;let a=Fi();return r&&(a=a.trim()),a===""}function Ki(t){if(!Gi(t,!1))return!1;const r=v.$getRoot().getChildren(),a=r.length;if(a>1)return!1;for(let n=0;nKi(t)}function bo(t){const r=window.location.origin,a=n=>{if(n.origin!==r)return;const i=t.getRootElement();if(document.activeElement!==i)return;const l=n.data;if(typeof l=="string"){let c;try{c=JSON.parse(l)}catch{return}if(c&&c.protocol==="nuanria_messaging"&&c.type==="request"){const d=c.payload;if(d&&d.functionId==="makeChanges"){const u=d.args;if(u){const[w,p,h,g,m]=u;t.update(()=>{const x=v.$getSelection();if(v.$isRangeSelection(x)){const y=x.anchor;let f=y.getNode(),N=0,k=0;if(v.$isTextNode(f)&&w>=0&&p>=0&&(N=w,k=w+p,x.setTextNodeRange(f,N,f,k)),N===k&&h===""||(x.insertRawText(h),f=y.getNode()),v.$isTextNode(f)){N=g,k=g+m;const C=f.getTextContentSize();N=N>C?C:N,k=k>C?C:k,x.setTextNodeRange(f,N,f,k)}n.stopImmediatePropagation()}})}}}}};return window.addEventListener("message",a,!0),()=>{window.removeEventListener("message",a,!0)}}v.defineExtension({build:(t,r,a)=>Ke(r),config:v.safeCast({disabled:typeof window>"u"}),name:"@lexical/dragon",register:(t,r,a)=>pe(()=>a.getOutput().disabled.value?void 0:bo(t))});function Ui(t,...r){const a=new URL("https://lexical.dev/docs/error"),n=new URLSearchParams;n.append("code",t);for(const i of r)n.append("v",i);throw a.search=n.toString(),Error(`Minified Lexical error #${t}; visit ${a.toString()} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}const ca=typeof window<"u"&&window.document!==void 0&&window.document.createElement!==void 0?s.useLayoutEffect:s.useEffect;function Hi({editor:t,ErrorBoundary:r}){return function(a,n){const[i,l]=s.useState(()=>a.getDecorators());return ca(()=>a.registerDecoratorListener(c=>{_a.flushSync(()=>{l(c)})}),[a]),s.useEffect(()=>{l(a.getDecorators())},[a]),s.useMemo(()=>{const c=[],d=Object.keys(i);for(let u=0;ua._onError(g),children:e.jsx(s.Suspense,{fallback:null,children:i[w]})}),h=a.getElementByKey(w);h!==null&&c.push(_a.createPortal(p,h,w))}return c},[n,i,a])}(t,r)}function qi({editor:t,ErrorBoundary:r}){return function(a){const n=Ve.maybeFromEditor(a);if(n&&n.hasExtensionByName(Vi.name)){for(const i of["@lexical/plain-text","@lexical/rich-text"])n.hasExtensionByName(i)&&Ui(320,i);return!0}return!1}(t)?null:e.jsx(Hi,{editor:t,ErrorBoundary:r})}function La(t){return t.getEditorState().read(vo(t.isComposing()))}function Yi({contentEditable:t,placeholder:r=null,ErrorBoundary:a}){const[n]=he();return function(i){ca(()=>v.mergeRegister(Gr.registerRichText(i),bo(i)),[i])}(n),e.jsxs(e.Fragment,{children:[t,e.jsx(Xi,{content:r}),e.jsx(qi,{editor:n,ErrorBoundary:a})]})}function Xi({content:t}){const[r]=he(),a=function(i){const[l,c]=s.useState(()=>La(i));return ca(()=>{function d(){const u=La(i);c(u)}return d(),v.mergeRegister(i.registerUpdateListener(()=>{d()}),i.registerEditableListener(()=>{d()}))},[i]),l}(r),n=wi();return a?typeof t=="function"?t(n):t:null}function Wi({defaultSelection:t}){const[r]=he();return s.useEffect(()=>{r.focus(()=>{const a=document.activeElement,n=r.getRootElement();n===null||a!==null&&n.contains(a)||n.focus({preventScroll:!0})},{defaultSelection:t})},[t,r]),null}const Zi=typeof window<"u"&&window.document!==void 0&&window.document.createElement!==void 0?s.useLayoutEffect:s.useEffect;function Ji({onClear:t}){const[r]=he();return Zi(()=>wo(r,t),[r,t]),null}const xo=typeof window<"u"&&window.document!==void 0&&window.document.createElement!==void 0?s.useLayoutEffect:s.useEffect;function Qi({editor:t,ariaActiveDescendant:r,ariaAutoComplete:a,ariaControls:n,ariaDescribedBy:i,ariaErrorMessage:l,ariaExpanded:c,ariaInvalid:d,ariaLabel:u,ariaLabelledBy:w,ariaMultiline:p,ariaOwns:h,ariaRequired:g,autoCapitalize:m,className:x,id:y,role:f="textbox",spellCheck:N=!0,style:k,tabIndex:C,"data-testid":j,...L},S){const[O,M]=s.useState(t.isEditable()),E=s.useCallback(Y=>{Y&&Y.ownerDocument&&Y.ownerDocument.defaultView?t.setRootElement(Y):t.setRootElement(null)},[t]),D=s.useMemo(()=>function(...Y){return X=>{for(const A of Y)typeof A=="function"?A(X):A!=null&&(A.current=X)}}(S,E),[E,S]);return xo(()=>(M(t.isEditable()),t.registerEditableListener(Y=>{M(Y)})),[t]),e.jsx("div",{"aria-activedescendant":O?r:void 0,"aria-autocomplete":O?a:"none","aria-controls":O?n:void 0,"aria-describedby":i,...l!=null?{"aria-errormessage":l}:{},"aria-expanded":O&&f==="combobox"?!!c:void 0,...d!=null?{"aria-invalid":d}:{},"aria-label":u,"aria-labelledby":w,"aria-multiline":p,"aria-owns":O?h:void 0,"aria-readonly":!O||void 0,"aria-required":g,autoCapitalize:m,className:x,contentEditable:O,"data-testid":j,id:y,ref:D,role:f,spellCheck:N,style:k,tabIndex:C,...L})}const ts=s.forwardRef(Qi);function Aa(t){return t.getEditorState().read(vo(t.isComposing()))}const es=s.forwardRef(rs);function rs(t,r){const{placeholder:a,...n}=t,[i]=he();return e.jsxs(e.Fragment,{children:[e.jsx(ts,{editor:i,...n,ref:r}),a!=null&&e.jsx(as,{editor:i,content:a})]})}function as({content:t,editor:r}){const a=function(c){const[d,u]=s.useState(()=>Aa(c));return xo(()=>{function w(){const p=Aa(c);u(p)}return w(),v.mergeRegister(c.registerUpdateListener(()=>{w()}),c.registerEditableListener(()=>{w()}))},[c]),d}(r),[n,i]=s.useState(r.isEditable());if(s.useLayoutEffect(()=>(i(r.isEditable()),r.registerEditableListener(c=>{i(c)})),[r]),!a)return null;let l=null;return typeof t=="function"?l=t(n):t!==null&&(l=t),l===null?null:e.jsx("div",{"aria-hidden":!0,children:l})}function os({placeholder:t,className:r,placeholderClassName:a}){return e.jsx(es,{className:r??"ContentEditable__root tw:relative tw:block tw:min-h-11 tw:overflow-auto tw:px-3 tw:py-3 tw:text-sm tw:outline-hidden","aria-placeholder":t,placeholder:e.jsx("div",{className:a??"tw:pointer-events-none tw:absolute tw:top-0 tw:select-none tw:overflow-hidden tw:text-ellipsis tw:px-3 tw:py-3 tw:text-sm tw:text-muted-foreground",children:t})})}const yo=s.createContext(void 0);function ns({activeEditor:t,$updateToolbar:r,blockType:a,setBlockType:n,showModal:i,children:l}){const c=s.useMemo(()=>({activeEditor:t,$updateToolbar:r,blockType:a,setBlockType:n,showModal:i}),[t,r,a,n,i]);return e.jsx(yo.Provider,{value:c,children:l})}function ko(){const t=s.useContext(yo);if(!t)throw new Error("useToolbarContext must be used within a ToolbarContext provider");return t}function is(){const[t,r]=s.useState(void 0),a=s.useCallback(()=>{r(void 0)},[]),n=s.useMemo(()=>{if(t===void 0)return;const{title:l,content:c}=t;return e.jsx(o.Dialog,{open:!0,onOpenChange:a,children:e.jsxs(o.DialogContent,{children:[e.jsx(o.DialogHeader,{children:e.jsx(o.DialogTitle,{children:l})}),c]})})},[t,a]),i=s.useCallback((l,c,d=!1)=>{r({closeOnClickOutside:d,content:c(a),title:l})},[a]);return[n,i]}function ss({children:t}){const[r]=he(),[a,n]=s.useState(r),[i,l]=s.useState("paragraph"),[c,d]=is(),u=()=>{};return s.useEffect(()=>a.registerCommand(v.SELECTION_CHANGE_COMMAND,(w,p)=>(n(p),!1),v.COMMAND_PRIORITY_CRITICAL),[a]),e.jsxs(ns,{activeEditor:a,$updateToolbar:u,blockType:i,setBlockType:l,showModal:d,children:[c,t({blockType:i})]})}function cs(t){const[r]=he(),{activeEditor:a}=ko();s.useEffect(()=>a.registerCommand(v.SELECTION_CHANGE_COMMAND,()=>{const n=v.$getSelection();return n&&t(n),!1},v.COMMAND_PRIORITY_CRITICAL),[r,t]),s.useEffect(()=>{a.getEditorState().read(()=>{const n=v.$getSelection();n&&t(n)})},[a,t])}const Ba=[{format:"bold",icon:z.BoldIcon,label:"Bold"},{format:"italic",icon:z.ItalicIcon,label:"Italic"}];function ls(){const{activeEditor:t}=ko(),[r,a]=s.useState([]),n=s.useCallback(i=>{if(v.$isRangeSelection(i)||Sn.$isTableSelection(i)){const l=[];Ba.forEach(({format:c})=>{i.hasFormat(c)&&l.push(c)}),a(c=>c.length!==l.length||!l.every(d=>c.includes(d))?l:c)}},[]);return cs(n),e.jsx(o.ToggleGroup,{type:"multiple",value:r,onValueChange:a,variant:"outline",size:"sm",children:Ba.map(({format:i,icon:l,label:c})=>e.jsx(o.ToggleGroupItem,{value:i,"aria-label":c,onClick:()=>{t.dispatchCommand(v.FORMAT_TEXT_COMMAND,i)},children:e.jsx(l,{className:"tw:h-4 tw:w-4"})},i))})}function ds({onClear:t}){const[r]=he();s.useEffect(()=>{t&&t(()=>{r.dispatchCommand(v.CLEAR_EDITOR_COMMAND,void 0)})},[r,t])}function ws({placeholder:t="Start typing ...",autoFocus:r=!1,onClear:a,actions:n}){const[,i]=s.useState(void 0),l=c=>{c!==void 0&&i(c)};return e.jsxs("div",{className:"tw:relative",children:[e.jsx(ss,{children:()=>e.jsx("div",{"data-testid":"editor-format-toolbar",className:"tw:sticky tw:top-0 tw:flex tw:gap-2 tw:overflow-auto tw:border-b tw:p-1",children:e.jsx(ls,{})})}),e.jsxs("div",{className:"tw:relative",children:[e.jsx(Yi,{contentEditable:e.jsx("div",{ref:l,children:e.jsx(os,{placeholder:t})}),ErrorBoundary:ci}),r&&e.jsx(Wi,{defaultSelection:"rootEnd"}),e.jsx(ds,{onClear:a}),e.jsx(Ji,{})]}),n&&e.jsx("div",{"data-slot":"editor-actions",className:"tw:flex tw:flex-row tw:items-center tw:gap-2 tw:border-t tw:px-2 tw:py-1.5",children:n})]})}const us={namespace:"commentEditor",theme:aa,nodes:oa,onError:t=>{console.error(t)}};function _r({editorState:t,editorSerializedState:r,onChange:a,onSerializedChange:n,placeholder:i="Start typing…",autoFocus:l=!1,onClear:c,className:d,actions:u}){const[w]=s.useState(()=>({...us,...t?{editorState:t}:{},...r?{editorState:JSON.stringify(r)}:{}})),p=s.useCallback(h=>{a==null||a(h),n==null||n(h.toJSON())},[a,n]);return e.jsx("div",{className:o.cn("pr-twp tw:overflow-hidden tw:rounded-lg tw:border tw:bg-background tw:shadow",d),children:e.jsx(ri,{initialConfig:w,children:e.jsxs(o.TooltipProvider,{children:[e.jsx(ws,{placeholder:i,autoFocus:l,onClear:c,actions:u}),e.jsx(oi,{ignoreSelectionChange:!0,onChange:p})]})})})}function _o(t){const r=t.querySelector('[contenteditable="true"]');if(!r)return!1;r.focus();const a=window.getSelection(),n=document.createRange();return n.selectNodeContents(r),n.collapse(!1),a==null||a.removeAllRanges(),a==null||a.addRange(n),!0}function jo(t){return t?t.some(r=>r&&"text"in r&&r.text.trim().length>0?!0:!r||!("children"in r)?!1:jo(r.children)):!1}function Jt(t){var r;return(r=t==null?void 0:t.root)!=null&&r.children?jo(t.root.children):!1}function ps(t){if(!t||t.trim()==="")throw new Error("Input HTML is empty");const r=Ha.createHeadlessEditor({namespace:"EditorUtils",theme:aa,nodes:oa,onError:n=>{console.error(n)}});let a;if(r.update(()=>{const i=new DOMParser().parseFromString(t,"text/html"),l=qa.$generateNodesFromDOM(r,i);v.$getRoot().clear(),v.$insertNodes(l)},{discrete:!0}),r.getEditorState().read(()=>{a=r.getEditorState().toJSON()}),!a)throw new Error("Failed to convert HTML to editor state");return a}function jr(t){const r=Ha.createHeadlessEditor({namespace:"EditorUtils",theme:aa,nodes:oa,onError:i=>{console.error(i)}}),a=r.parseEditorState(JSON.stringify(t));r.setEditorState(a);let n="";return r.getEditorState().read(()=>{n=qa.$generateHtmlFromNodes(r)}),n=n.replace(/\s+style="[^"]*"/g,"").replace(/\s+class="[^"]*"/g,"").replace(/(.*?)<\/span>/g,"$1").replace(/]*>(.*?)<\/strong><\/b>/g,"$1").replace(/]*>(.*?)<\/b><\/strong>/g,"$1").replace(/]*>(.*?)<\/em><\/i>/g,"$1").replace(/]*>(.*?)<\/i><\/em>/g,"$1").replace(/]*>(.*?)<\/span><\/u>/g,"$1").replace(/]*>(.*?)<\/span><\/s>/g,"$1").replace(//gi,"
"),n}function la(t){return["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Home","End"].includes(t.key)?(t.stopPropagation(),!0):!1}const da=Object.freeze(["%cancelButton_tooltip%","%acceptButton_tooltip%"]),za=(t,r)=>t[r]??r;function wa({onCancelClick:t,onAcceptClick:r,canAccept:a=!0,localizedStrings:n={},className:i="tw:h-6 tw:w-6",acceptLabel:l}){const c=za(n,"%cancelButton_tooltip%"),d=l??za(n,"%acceptButton_tooltip%");return e.jsxs(o.ButtonGroup,{children:[e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.Button,{"aria-label":c,className:i,size:"icon",onClick:t,variant:"secondary",children:e.jsx(z.X,{})})}),e.jsx(o.TooltipContent,{children:e.jsx("p",{children:c})})]})}),e.jsx(o.ButtonGroupSeparator,{}),e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.Button,{"aria-label":d,className:i,size:"icon",onClick:r,disabled:!a,children:e.jsx(z.Check,{})})}),e.jsx(o.TooltipContent,{children:e.jsx("p",{children:d})})]})})]})}const hs="verseText",gs=Object.freeze(["%conflict_note_description_verseText%","%conflict_note_choose_aria_label%","%conflict_note_stale_notice%","%conflict_note_resolve_failed%","%conflict_note_choose_prompt%","%conflict_note_option_keep_current%","%conflict_note_option_use_other%","%conflict_note_option_combine%","%conflict_note_save_and_resolve%","%conflict_note_save_disabled_tooltip%","%conflict_note_save_warning%","%conflict_note_no_result%","%conflict_note_outcome_used_other%","%conflict_note_outcome_combined%","%conflict_note_summary_unresolved%","%conflict_note_summary_resolved_kept_current%","%conflict_note_summary_resolved_used_other%","%conflict_note_summary_resolved_combined%"]);function Xe(t){return t!==void 0&&Object.keys(t).length>0}function Zr(t){return t.editorState===void 0&&t.assignedUser===void 0&&!Xe(t.commentEdits)}const Co=["tw:prose tw:max-w-none tw:break-words tw:text-sm tw:font-normal tw:text-foreground","tw:[&>blockquote]:border-s-0 tw:[&>blockquote]:p-0 tw:[&>blockquote]:ps-0 tw:[&>blockquote]:font-normal tw:[&>blockquote]:not-italic tw:[&>blockquote]:text-foreground","tw:prose-quoteless"].join(" ");function No(t){return(t==null?void 0:t.conflictType)===hs}function Eo(t){return t==="replaced"?"reject":t==="merged"?"merged":"accept"}function mr(t,r){return t===""?r["%comment_assign_unassigned%"]??"Unassigned":t==="Team"?r["%comment_assign_team%"]??"Team":t}function ua(t){const r=o.isMacOs();return t.key==="Enter"&&(r&&t.metaKey||!r&&t.ctrlKey)}function Qt(t,r,a){const n=r[t];return n===void 0||n===t?a:n}const fs={root:{children:[{children:[],direction:"ltr",format:"",indent:0,type:"paragraph",version:1,textFormat:0,textStyle:""}],direction:"ltr",format:"",indent:0,type:"root",version:1}},ms={root:{children:[{children:[{detail:0,format:0,mode:"normal",style:"",text:"",type:"text",version:1}],direction:"ltr",format:"",indent:0,type:"paragraph",version:1,textFormat:0,textStyle:""}],direction:"ltr",format:"",indent:0,type:"root",version:1}};function $r(t,r){return t===""?r["%commentEditor_unassigned%"]??"Unassigned":t==="Team"?r["%commentEditor_team%"]??"Team":t}function vs({assignableUsers:t,onSave:r,onClose:a,localizedStrings:n,initialAssignedUser:i}){const[l,c]=s.useState(ms),[d,u]=s.useState(i),[w,p]=s.useState(!1),h=s.useRef(void 0),g=s.useRef(null);s.useEffect(()=>{let f=!0;const N=g.current;if(!N)return;const k=setTimeout(()=>{f&&_o(N)},300);return()=>{f=!1,clearTimeout(k)}},[]);const m=s.useCallback(()=>{if(!Jt(l))return;const f=jr(l);r(f,d)},[l,r,d]),x=n["%commentEditor_placeholder%"]??"Type your comment here...",y=n["%commentEditor_assignTo_label%"]??"Assign to";return e.jsxs("div",{className:"pr-twp tw:grid tw:gap-3",children:[e.jsxs("div",{className:"tw:flex tw:items-center tw:justify-between",children:[e.jsx("span",{className:"tw:text-sm tw:font-medium",children:y}),e.jsx(wa,{onCancelClick:a,onAcceptClick:m,canAccept:Jt(l),localizedStrings:n,acceptLabel:n["%commentEditor_saveButton_tooltip%"]})]}),e.jsx("div",{className:"tw:flex tw:items-center tw:gap-2",children:e.jsxs(o.Popover,{open:w,onOpenChange:p,children:[e.jsx(o.PopoverTrigger,{asChild:!0,children:e.jsxs(o.Button,{variant:"outline",className:"tw:flex tw:w-full tw:items-center tw:justify-start tw:gap-2",disabled:t.length===0,children:[e.jsx(z.AtSign,{className:"tw:h-4 tw:w-4"}),e.jsx("span",{children:$r(d!==void 0?d:"",n)})]})}),e.jsx(o.PopoverContent,{className:"tw:w-auto tw:p-0",align:"start",onKeyDown:f=>{f.key==="Escape"&&(f.stopPropagation(),p(!1))},children:e.jsx(o.Command,{children:e.jsx(o.CommandList,{children:t.map(f=>e.jsx(o.CommandItem,{onSelect:()=>{u(f||void 0),p(!1)},className:"tw:flex tw:items-center",children:e.jsx("span",{children:$r(f,n)})},f||"unassigned"))})})})]})}),e.jsx("div",{ref:g,role:"textbox",tabIndex:-1,className:"tw:outline-hidden",onKeyDownCapture:f=>{f.key==="Escape"?(f.preventDefault(),f.stopPropagation(),a()):ua(f)&&(f.preventDefault(),f.stopPropagation(),Jt(l)&&m())},onKeyDown:f=>{la(f),(f.key==="Enter"||f.key===" ")&&f.stopPropagation()},children:e.jsx(_r,{editorSerializedState:l,onSerializedChange:f=>c(f),placeholder:x,onClear:f=>{h.current=f}})})]})}const bs=Object.freeze(["%commentEditor_placeholder%","%commentEditor_assignTo_label%","%commentEditor_saveButton_tooltip%","%commentEditor_unassigned%","%commentEditor_team%",...da]),xs=Object.freeze(["%comment_assign_team%","%comment_assign_unassigned%","%comment_assigned_to%","%comment_assigning_to%","%comment_dateAtTime%","%comment_date_today%","%comment_date_yesterday%","%comment_deleteComment%","%comment_editComment%","%comment_replyOrAssign%","%comment_reopenResolved%","%comment_status_resolved%","%comment_status_todo%","%comment_thread_multiple_replies%","%comment_thread_single_reply%","%comment_aria_assign_user%","%comment_aria_submit_comment%","%comment_aria_mark_as_read%","%comment_aria_mark_as_unread%","%comment_aria_resolve_thread%","%comment_aria_cancel_edit%","%comment_aria_save_edit%"]),To="comment-list";function ys(t){return t}function So({className:t,size:r="default",...a}){return e.jsx("div",{"data-slot":"card","data-size":r,className:o.cn("pr-twp tw:group/card tw:flex tw:flex-col tw:gap-4 tw:overflow-hidden tw:rounded-xl tw:bg-card tw:py-4 tw:text-sm tw:text-card-foreground tw:ring-1 tw:ring-foreground/10 tw:has-data-[slot=card-footer]:pb-0 tw:has-[>img:first-child]:pt-0 tw:data-[size=sm]:gap-3 tw:data-[size=sm]:py-3 tw:data-[size=sm]:has-data-[slot=card-footer]:pb-0 tw:*:[img:first-child]:rounded-t-xl tw:*:[img:last-child]:rounded-b-xl",t),...a})}function ks({className:t,...r}){return e.jsx("div",{"data-slot":"card-header",className:o.cn("pr-twp tw:group/card-header tw:@container/card-header tw:grid tw:auto-rows-min tw:items-start tw:gap-1 tw:rounded-t-xl tw:px-4 tw:group-data-[size=sm]/card:px-3 tw:has-data-[slot=card-action]:grid-cols-[1fr_auto] tw:has-data-[slot=card-description]:grid-rows-[auto_auto] tw:[.border-b]:pb-4 tw:group-data-[size=sm]/card:[.border-b]:pb-3",t),...r})}function _s({className:t,...r}){return e.jsx("div",{"data-slot":"card-title",className:o.cn("pr-twp tw:font-heading tw:text-base tw:leading-snug tw:font-medium tw:group-data-[size=sm]/card:text-sm",t),...r})}function js({className:t,...r}){return e.jsx("div",{"data-slot":"card-description",className:o.cn("pr-twp tw:text-sm tw:text-muted-foreground",t),...r})}function Ro({className:t,...r}){return e.jsx("div",{"data-slot":"card-content",className:o.cn("pr-twp tw:px-4 tw:group-data-[size=sm]/card:px-3",t),...r})}function Cs({className:t,...r}){return e.jsx("div",{"data-slot":"card-footer",className:o.cn("pr-twp tw:flex tw:items-center tw:rounded-b-xl tw:border-t tw:bg-muted/50 tw:p-4 tw:group-data-[size=sm]/card:p-3",t),...r})}function Ge({children:t,isDisabled:r,disabledExplanation:a,...n}){return e.jsx("div",{...n,role:r?"group":void 0,tabIndex:r?0:void 0,"aria-label":r?a:void 0,children:t})}function Mo({className:t,size:r="default",...a}){return e.jsx(G.Avatar.Root,{"data-slot":"avatar","data-size":r,className:o.cn("pr-twp tw:group/avatar tw:relative tw:flex tw:size-8 tw:shrink-0 tw:rounded-full tw:select-none tw:after:absolute tw:after:inset-0 tw:after:rounded-full tw:after:border tw:after:border-border tw:after:mix-blend-darken tw:data-[size=lg]:size-10 tw:data-[size=sm]:size-6 tw:dark:after:mix-blend-lighten",t),...a})}function Ns({className:t,...r}){return e.jsx(G.Avatar.Image,{"data-slot":"avatar-image",className:o.cn("pr-twp tw:aspect-square tw:size-full tw:rounded-full tw:object-cover",t),...r})}function Do({className:t,...r}){return e.jsx(G.Avatar.Fallback,{"data-slot":"avatar-fallback",className:o.cn("pr-twp tw:flex tw:size-full tw:items-center tw:justify-center tw:rounded-full tw:bg-muted tw:text-sm tw:text-muted-foreground tw:group-data-[size=sm]/avatar:text-xs",t),...r})}function $a({comment:t,isReply:r=!1,localizedStrings:a,isThreadExpanded:n=!1,handleUpdateComment:i,handleDeleteComment:l,onEditingChange:c,canEditOrDelete:d=!1,draftEditorState:u,onDraftEditorStateChange:w}){const[p,h]=s.useState(),g=u??p,x=g!==void 0&&n,y=w!==void 0,f=s.useCallback(A=>{y||h(A),w==null||w(A)},[y,w]),N=s.useRef(null),k=s.useRef(!1);s.useEffect(()=>{if(!x||!k.current)return;k.current=!1;let A=!0;const _=N.current;if(!_)return;const rt=setTimeout(()=>{A&&_o(_)},300);return()=>{A=!1,clearTimeout(rt)}},[x]);const C=s.useCallback(A=>{A&&A.stopPropagation(),f(void 0),c==null||c(!1)},[c,f]),j=s.useCallback(async A=>{if(A&&A.stopPropagation(),!g||!i)return;await i(t.id,jr(g))&&(f(void 0),c==null||c(!1))},[g,i,t.id,c,f]),L=s.useMemo(()=>{const A=new Date(t.date),_=B.formatRelativeDate(A,a["%comment_date_today%"],a["%comment_date_yesterday%"]),rt=A.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit"});return B.formatReplacementString(a["%comment_dateAtTime%"],{date:_,time:rt})},[t.date,a]),S=s.useMemo(()=>t.user,[t.user]),O=s.useMemo(()=>t.user.split(" ").map(A=>A[0]).join("").toUpperCase().slice(0,2),[t.user]),M=s.useMemo(()=>B.sanitizeHtml(t.contents),[t.contents]),E=s.useMemo(()=>t.contents.replace(/<[^>]*>/g,"").trim().length>0,[t.contents]),D=!!t.conflictResolutionAction&&!E,Y=s.useMemo(()=>{if(n&&d)return e.jsxs(e.Fragment,{children:[e.jsxs(o.DropdownMenuItem,{onClick:A=>{A.stopPropagation(),k.current=!0;const _=t.contents.trim()!=="";f(_?ps(t.contents):fs),c==null||c(!0)},children:[e.jsx(z.Pencil,{className:"tw:me-2 tw:h-4 tw:w-4"}),a["%comment_editComment%"]]}),e.jsxs(o.DropdownMenuItem,{onClick:async A=>{A.stopPropagation(),l&&await l(t.id)},children:[e.jsx(z.Trash2,{className:"tw:me-2 tw:h-4 tw:w-4"}),a["%comment_deleteComment%"]]})]})},[d,n,a,t.contents,t.id,l,c,f]),X=!Jt(g);return e.jsxs("div",{className:o.cn("tw:flex tw:w-full tw:flex-row tw:items-baseline tw:gap-2",{"tw:text-sm":r}),children:[e.jsx(Mo,{className:"tw:h-8 tw:w-8",children:e.jsx(Do,{className:"tw:text-xs tw:font-medium",children:O})}),e.jsxs("div",{className:"tw:flex tw:flex-1 tw:flex-col tw:gap-1",children:[e.jsxs("div",{className:"tw:flex tw:w-full tw:flex-row tw:flex-wrap tw:items-baseline tw:gap-x-2",children:[e.jsx("p",{className:"tw:text-sm tw:font-medium",children:S}),e.jsx("p",{className:"tw:text-xs tw:font-normal tw:text-muted-foreground",children:L}),e.jsx("div",{className:"tw:flex-1"}),r&&t.assignedUser!==void 0&&e.jsxs(o.Badge,{variant:"secondary",className:"tw:text-xs tw:font-normal",children:["→ ",mr(t.assignedUser,a)]})]}),x&&e.jsx("div",{role:"textbox",tabIndex:-1,className:"tw:flex tw:flex-col tw:gap-2",ref:N,onKeyDownCapture:A=>{A.key==="Escape"?(A.preventDefault(),A.stopPropagation(),C()):ua(A)&&(A.preventDefault(),A.stopPropagation(),Jt(g)&&j())},onKeyDown:A=>{la(A),(A.key==="Enter"||A.key===" ")&&A.stopPropagation()},onClick:A=>{A.stopPropagation()},children:e.jsx(_r,{className:o.cn('tw:[&_[data-lexical-editor="true"]>blockquote]:mt-0 tw:[&_[data-lexical-editor="true"]>blockquote]:border-s-0 tw:[&_[data-lexical-editor="true"]>blockquote]:ps-0 tw:[&_[data-lexical-editor="true"]>blockquote]:font-normal tw:[&_[data-lexical-editor="true"]>blockquote]:not-italic tw:[&_[data-lexical-editor="true"]>blockquote]:text-foreground'),editorSerializedState:g,onSerializedChange:A=>f(A),actions:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"tw:flex-1"}),e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.Button,{size:"icon-sm",onClick:C,variant:"outline",className:"tw:flex tw:items-center tw:justify-center tw:rounded-md","aria-label":Qt("%comment_aria_cancel_edit%",a,"Cancel edit"),children:e.jsx(z.Undo2,{})})}),e.jsx(o.TooltipContent,{children:Qt("%comment_aria_cancel_edit%",a,"Cancel edit")})]}),e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(Ge,{isDisabled:X,disabledExplanation:Qt("%comment_aria_save_edit%",a,"Save edit"),className:"tw:inline-flex",children:e.jsx(o.Button,{size:"icon-sm",onClick:j,className:"tw:flex tw:items-center tw:justify-center tw:rounded-md",disabled:X,"aria-label":Qt("%comment_aria_save_edit%",a,"Save edit"),children:e.jsx(z.ArrowUp,{})})})}),e.jsx(o.TooltipContent,{children:Qt("%comment_aria_save_edit%",a,"Save edit")})]})]})})}),!x&&e.jsxs(e.Fragment,{children:[t.status==="Resolved"&&!D&&e.jsx("div",{className:"tw:text-sm tw:italic",children:a["%comment_status_resolved%"]}),t.status==="Todo"&&r&&e.jsx("div",{className:"tw:text-sm tw:italic",children:a["%comment_status_todo%"]}),D?e.jsx("div",{className:"tw:text-sm tw:italic",children:Eo(t.conflictResolutionAction)==="merged"?a["%conflict_note_outcome_combined%"]??"Combined both changes.":a["%conflict_note_outcome_used_other%"]??"Used the other change instead of the current text."}):e.jsx("div",{className:o.cn(Co,"tw:items-start tw:gap-2",{"tw:line-clamp-3":!n}),dangerouslySetInnerHTML:{__html:M}})]})]}),Y&&e.jsxs(o.DropdownMenu,{children:[e.jsx(o.DropdownMenuTrigger,{asChild:!0,children:e.jsx(o.Button,{variant:"ghost",size:"icon",children:e.jsx(z.MoreHorizontal,{})})}),e.jsx(o.DropdownMenuContent,{align:"end",children:Y})]})]})}function Io({show:t,disabled:r=!1,onClick:a,ariaLabel:n}){if(t)return e.jsx(o.Button,{variant:"ghost",size:"icon",disabled:r,className:o.cn("tw:ms-auto","tw:text-primary tw:transition-opacity tw:duration-200 tw:hover:bg-primary/10","tw:opacity-0 tw:group-hover:opacity-100"),onClick:i=>{i.stopPropagation(),a()},"aria-label":n,children:e.jsx(z.Check,{className:"tw:h-4 tw:w-4"})})}const Es={root:{children:[{children:[{detail:0,format:0,mode:"normal",style:"",text:"",type:"text",version:1}],direction:"ltr",format:"",indent:0,type:"paragraph",version:1,textFormat:0,textStyle:""}],direction:"ltr",format:"",indent:0,type:"root",version:1}},Oo=s.memo(function({classNameForVerseText:r,comments:a,localizedStrings:n,isSelected:i=!1,verseRef:l,assignedUser:c,currentUser:d,handleSelectThread:u,threadId:w,thread:p,threadStatus:h,handleAddCommentToThread:g,handleUpdateComment:m,handleDeleteComment:x,handleReadStatusChange:y,assignableUsers:f,canUserAddCommentToThread:N,canUserAssignThreadCallback:k,canUserResolveThreadCallback:C,canUserEditOrDeleteCommentCallback:j,isRead:L=!1,autoReadDelay:S=5,onVerseRefClick:O,initialAssignedUser:M,activeComments:E,rootContentSlot:D,resolveActionSlot:Y,spaceRootContentFromReplies:X=!1,draft:A,onDraftChange:_}){var Ie;const[rt,P]=s.useState({}),W=A??rt,q=W.editorState??Es,$=W.assignedUser,et=_!==void 0,dt=s.useRef(W);dt.current=W;const ct=s.useCallback(T=>{const it={...dt.current,...T};dt.current=it,et||P(it),_==null||_(w,Zr(it)?void 0:it)},[et,_,w]),Q=s.useCallback((T,it)=>{const lt={...W.commentEdits};it===void 0?delete lt[T]:lt[T]=it,ct({commentEdits:Xe(lt)?lt:void 0})},[W.commentEdits,ct]),[wt,ft]=s.useState(),ht=i,[_t,It]=s.useState(!1),[St,oe]=s.useState(!1),[te,mt]=s.useState(!1),[vt,xt]=s.useState(!1),[Yt,ne]=s.useState(!1),[jt,Ct]=s.useState(L),[Xt,le]=s.useState(!1),ie=s.useRef(void 0),[ge,Zt]=s.useState(new Map);s.useEffect(()=>{let T=!0;return(async()=>{const lt=C?await C(w):!1;T&&ne(lt)})(),()=>{T=!1}},[w,C]),s.useEffect(()=>{let T=!0;if(!i){xt(!1),Zt(new Map);return}return(async()=>{const lt=k?await k(w):!1;T&&xt(lt)})(),()=>{T=!1}},[i,w,k]);const $t=s.useRef("idle");s.useEffect(()=>{if(!i){$t.current!=="idle"&&(ct({assignedUser:void 0}),ft(void 0),$t.current="idle");return}$t.current==="idle"&&($t.current="pending"),vt?$t.current==="pending"&&M!==void 0&&M!==c&&(ct({assignedUser:M}),$t.current="auto-populated"):$t.current==="auto-populated"&&(ct({assignedUser:void 0}),$t.current="pending")},[i,M,vt,c,ct]);const Vt=s.useRef(wt);Vt.current=wt;const Ft=s.useRef(_);Ft.current=_;const fe=s.useRef(w);fe.current=w,s.useEffect(()=>()=>{var it;const{current:T}=dt;T.assignedUser!==void 0&&T.assignedUser===Vt.current&&T.editorState===void 0&&!Xe(T.commentEdits)&&((it=Ft.current)==null||it.call(Ft,fe.current,void 0))},[]);const I=s.useMemo(()=>E??a.filter(T=>!T.deleted),[E,a]),Nt=s.useMemo(()=>{const{commentEdits:T}=W;if(!T)return T;const it=new Set(I.map(Tt=>Tt.id)),lt=Object.fromEntries(Object.entries(T).filter(([Tt])=>it.has(Tt)));return Xe(lt)?lt:void 0},[W,I]),At=St||Xe(Nt);s.useEffect(()=>{let T=!0;if(!i||!j){Zt(new Map);return}return(async()=>{const lt=new Map;await Promise.all(I.map(async Tt=>{const ye=await j(Tt.id);T&<.set(Tt.id,ye)})),T&&Zt(lt)})(),()=>{T=!1}},[i,I,j]);const Et=s.useMemo(()=>I[0],[I]),R=s.useRef(null),K=s.useRef(void 0),Z=s.useCallback(()=>{var T;(T=K.current)==null||T.call(K),ct({editorState:void 0})},[ct]),U=s.useCallback(T=>{ct({editorState:Jt(T)?T:void 0})},[ct]),J=s.useCallback(()=>{const T=!jt;Ct(T),le(!T),y==null||y(w,T)},[jt,y,w]);s.useEffect(()=>{It(!1)},[i]),s.useEffect(()=>{if(i&&!jt&&!Xt&&Zr(W)){const T=setTimeout(()=>{Ct(!0),y==null||y(w,!0)},S*1e3);return ie.current=T,()=>clearTimeout(T)}ie.current&&(clearTimeout(ie.current),ie.current=void 0)},[i,jt,Xt,S,w,y,W]);const V=s.useMemo(()=>({singleReply:n["%comment_thread_single_reply%"],multipleReplies:n["%comment_thread_multiple_replies%"]}),[n]),at=s.useMemo(()=>{if(c===void 0)return;if(c==="")return n["%comment_assign_unassigned%"]??"Unassigned";const T=mr(c,n);return B.formatReplacementString(n["%comment_assigned_to%"],{assignedUser:T})},[c,n]),nt=s.useMemo(()=>I.slice(1),[I]),ot=s.useMemo(()=>nt.length??0,[nt.length]),gt=s.useMemo(()=>ot>0,[ot]),bt=s.useMemo(()=>{if(_t||ot<=2)return nt;const T=new Set(nt.slice(-2).map(it=>it.id));return nt.filter(it=>{var lt;return T.has(it.id)||((lt=W.commentEdits)==null?void 0:lt[it.id])!==void 0})},[nt,ot,_t,W.commentEdits]),yt=s.useMemo(()=>_t||ot<=2?0:ot-bt.length,[ot,_t,bt.length]),Bt=s.useMemo(()=>ot===1?V.singleReply:B.formatReplacementString(V.multipleReplies,{count:ot}),[ot,V]),Ce=s.useMemo(()=>yt===1?V.singleReply:B.formatReplacementString(V.multipleReplies,{count:yt}),[yt,V]);s.useEffect(()=>{!i&&At&>&&oe(!1)},[i,At,gt]);const xe=s.useCallback(async T=>{T&&T.stopPropagation();const it=Jt(q)?jr(q):void 0;if($!==void 0){await g({threadId:w,contents:it,assignedUser:$})&&(ft($),it&&Z());return}it&&await g({threadId:w,contents:it})&&Z()},[Z,q,g,$,w]),me=s.useCallback(async T=>{const it=Jt(q)?jr(q):void 0,lt=T.status?T.assignedUser:$??T.assignedUser,Tt=await g({...T,contents:it,assignedUser:lt});return Tt&&(lt!==void 0&&ft(lt),it&&Z()),Tt},[Z,q,g,$]);if(I.length===0)return;const de=!vt||!f||f.length===0||!f.includes(d),De=!Jt(q)&&($===void 0||$===wt),er=e.jsx($a,{comment:Et,localizedStrings:n,isThreadExpanded:i,threadStatus:h,handleAddCommentToThread:me,handleUpdateComment:m,handleDeleteComment:x,onEditingChange:oe,canEditOrDelete:(!At&&ge.get(Et.id))??!1,canUserResolveThread:Yt,draftEditorState:(Ie=W.commentEdits)==null?void 0:Ie[Et.id],onDraftEditorStateChange:T=>Q(Et.id,T)});return e.jsx(So,{role:"option","aria-selected":i,id:w,className:o.cn("tw:group tw:w-full tw:rounded-none tw:border-s-4 tw:p-3 tw:outline-hidden tw:transition-all tw:duration-200 tw:focus:ring-2 tw:focus:ring-ring tw:focus:ring-offset-1 tw:focus:ring-offset-background",{"tw:cursor-pointer tw:hover:shadow-md":!i},{"tw:border-foreground tw:shadow-md":i,"tw:border-transparent":!i},{"tw:bg-card":h!=="Resolved"&&jt,"tw:bg-muted":h==="Resolved","tw:bg-accent":!jt&&h!=="Resolved"}),onClick:()=>{u(w)},tabIndex:-1,children:e.jsxs(Ro,{className:"tw:flex tw:flex-col tw:gap-2 tw:p-0",children:[e.jsxs("div",{className:"tw:flex tw:flex-col tw:content-center tw:items-start tw:gap-2",children:[e.jsxs("div",{className:"tw:flex tw:items-center tw:gap-2",children:[at&&e.jsx(o.Badge,{className:"tw:rounded-sm tw:bg-input tw:text-sm tw:font-normal tw:text-primary tw:hover:bg-input",children:at}),e.jsx(o.Button,{variant:"ghost",size:"icon",onClick:T=>{T.stopPropagation(),J()},className:"tw:text-muted-foreground tw:transition tw:hover:text-foreground","aria-label":jt?n["%comment_aria_mark_as_unread%"]??"Mark as unread":n["%comment_aria_mark_as_read%"]??"Mark as read",children:jt?e.jsx(z.MailOpen,{}):e.jsx(z.Mail,{})}),Y===void 0?e.jsx(Io,{show:Yt&&h!=="Resolved",onClick:()=>me({threadId:w,status:"Resolved"}),ariaLabel:n["%comment_aria_resolve_thread%"]??"Resolve thread"}):Y]}),e.jsx("div",{className:"tw:flex tw:max-w-full tw:flex-wrap tw:items-baseline tw:gap-2",children:e.jsxs("p",{ref:R,className:o.cn("tw:flex-1 tw:overflow-hidden tw:text-ellipsis tw:text-sm tw:font-normal tw:text-muted-foreground",{"tw:overflow-visible tw:text-clip tw:whitespace-normal tw:break-words":ht},{"tw:whitespace-nowrap":!ht}),children:[l&&O?e.jsx(o.Button,{variant:"ghost",size:"sm",className:"tw:h-auto tw:px-1 tw:py-0 tw:text-sm tw:font-normal tw:text-muted-foreground",onClick:T=>{T.stopPropagation(),O(p)},children:l}):l,e.jsxs("span",{className:r,children:[Et.contextBefore,e.jsx("span",{className:"tw:font-bold",children:Et.selectedText}),Et.contextAfter]})]})}),D??er]}),e.jsxs(e.Fragment,{children:[gt&&!i&&e.jsxs("div",{className:"tw:flex tw:items-center tw:gap-5",children:[e.jsx("div",{className:"tw:w-8",children:e.jsx(o.Separator,{})}),e.jsx("p",{className:"tw:text-sm tw:text-muted-foreground",children:Bt})]}),!i&&Jt(q)&&e.jsx(_r,{editorSerializedState:q,onSerializedChange:U,placeholder:n["%comment_replyOrAssign%"]}),i&&e.jsxs(e.Fragment,{children:[X&&bt.length>0&&e.jsx("div",{className:"tw:h-2","data-slot":"root-content-reply-gap","aria-hidden":"true"}),yt>0&&e.jsxs("div",{className:"tw:flex tw:cursor-pointer tw:items-center tw:gap-5 tw:py-2",onClick:T=>{T.stopPropagation(),It(!0)},role:"button",tabIndex:0,onKeyDown:T=>{(T.key==="Enter"||T.key===" ")&&(T.preventDefault(),T.stopPropagation(),It(!0))},children:[e.jsx("div",{className:"tw:w-8",children:e.jsx(o.Separator,{})}),e.jsxs("div",{className:"tw:flex tw:items-center tw:gap-2",children:[e.jsx("p",{className:"tw:text-sm tw:text-muted-foreground",children:Ce}),_t?e.jsx(z.ChevronUp,{}):e.jsx(z.ChevronDown,{})]})]}),bt.map(T=>{var it;return e.jsx("div",{children:e.jsx($a,{comment:T,localizedStrings:n,isReply:!0,isThreadExpanded:i,handleUpdateComment:m,handleDeleteComment:x,onEditingChange:oe,canEditOrDelete:(!At&&ge.get(T.id))??!1,draftEditorState:(it=W.commentEdits)==null?void 0:it[T.id],onDraftEditorStateChange:lt=>Q(T.id,lt)})},T.id)}),N!==!1&&(!At||Jt(q))&&e.jsx("div",{role:"textbox",tabIndex:-1,className:"tw:w-full tw:space-y-2",onClick:T=>T.stopPropagation(),onKeyDownCapture:T=>{ua(T)&&(T.preventDefault(),T.stopPropagation(),(Jt(q)||$!==void 0&&$!==wt)&&xe())},onKeyDown:T=>{la(T),(T.key==="Enter"||T.key===" ")&&T.stopPropagation()},children:e.jsx(_r,{editorSerializedState:q,onSerializedChange:U,placeholder:h==="Resolved"?n["%comment_reopenResolved%"]:n["%comment_replyOrAssign%"],autoFocus:!0,onClear:T=>{K.current=T},actions:e.jsxs(e.Fragment,{children:[$!==void 0&&(Jt(q)||$!==wt)?e.jsx("span",{className:"tw:flex-1 tw:text-sm tw:text-muted-foreground",children:B.formatReplacementString(Qt("%comment_assigning_to%",n,"Assigning to: {assignedUser}"),{assignedUser:mr($,n)})}):e.jsx("div",{className:"tw:flex-1"}),e.jsxs(o.Popover,{open:te,onOpenChange:mt,children:[e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(Ge,{isDisabled:de,disabledExplanation:Qt("%comment_aria_assign_user%",n,"Assign user"),children:e.jsx(o.PopoverTrigger,{asChild:!0,children:e.jsx(o.Button,{size:"icon-sm",variant:"outline",className:"tw:flex tw:items-center tw:justify-center tw:rounded-md",disabled:de,"aria-label":Qt("%comment_aria_assign_user%",n,"Assign user"),children:e.jsx(z.AtSign,{})})})})}),e.jsx(o.TooltipContent,{children:Qt("%comment_aria_assign_user%",n,"Assign user")})]}),e.jsx(o.PopoverContent,{className:"tw:w-auto tw:p-0",align:"end",onKeyDown:T=>{T.key==="Escape"&&(T.stopPropagation(),mt(!1))},children:e.jsx(o.Command,{children:e.jsx(o.CommandList,{children:f==null?void 0:f.map(T=>e.jsx(o.CommandItem,{onSelect:()=>{ct({assignedUser:T!==c?T:void 0}),$t.current="user-selected",ft(void 0),mt(!1)},className:"tw:flex tw:items-center",children:e.jsx("span",{children:mr(T,n)})},T||"unassigned"))})})})]}),e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(Ge,{isDisabled:De,disabledExplanation:Qt("%comment_aria_submit_comment%",n,"Submit comment"),className:"tw:inline-flex",children:e.jsx(o.Button,{size:"icon-sm",onClick:xe,className:"tw:flex tw:items-center tw:justify-center tw:rounded-md",disabled:De,"aria-label":Qt("%comment_aria_submit_comment%",n,"Submit comment"),children:e.jsx(z.ArrowUp,{})})})}),e.jsx(o.TooltipContent,{children:Qt("%comment_aria_submit_comment%",n,"Submit comment")})]})]})})})]})]})]})})}),Ts=o.cn(Co,"tw:[&>blockquote]:my-0 tw:[&_p]:my-0","tw:[&_u]:font-semibold tw:[&_u]:text-success-foreground tw:[&_u]:no-underline","tw:[&_s]:text-destructive tw:[&_s]:line-through"),Ss=t=>t.replace(/(\s+)(<\/[us]>)/g,"$2$1"),vr=t=>Ss(B.sanitizeHtml(t));function br({html:t}){return e.jsx("div",{className:Ts,dangerouslySetInnerHTML:{__html:t}})}function Po({comment:t,localizedStrings:r,availableActions:a="acceptOrReject",resolvedResolution:n,onResolve:i,isResolving:l=!1}){const[c,d]=s.useState("accept"),u=s.useId(),w=s.useId(),p=a==="loading",h=a==="accept",g=a==="none",m=a==="acceptRejectOrMerge",x=h?"accept":c,y=s.useMemo(()=>vr(t.rejectedText??""),[t.rejectedText]),f=s.useMemo(()=>vr(t.acceptedText??""),[t.acceptedText]),N=s.useMemo(()=>vr(t.mergedText??""),[t.mergedText]),k=s.useMemo(()=>B.sanitizeHtml(t.contents),[t.contents]);if(!No(t))return e.jsx(br,{html:k});const C=P=>{d(P==="reject"||P==="merge"?P:"accept")},j=r["%conflict_note_stale_notice%"]??"The verse was edited after this conflict was recorded, so 'Use the other change' is no longer available. Keep the current text to resolve.",L=m?[{value:"merge",label:r["%conflict_note_option_combine%"]??"Combine both changes",html:N}]:[],S=[{value:"accept",label:r["%conflict_note_option_keep_current%"]??"Keep the current text",html:f},{value:"reject",label:r["%conflict_note_option_use_other%"]??"Use the other change",html:y},...L],O=x==="accept",M=l||O;let E;O?E=r["%conflict_note_save_disabled_tooltip%"]??"Keeping the current text makes no change — resolve the thread with the ✓ to keep it.":l||(E=r["%conflict_note_save_warning%"]??"This can't be undone.");const D=r["%conflict_note_no_result%"]??"No result preview available.",Y=e.jsx("p",{className:"tw:text-muted-foreground",children:D}),X=P=>P?e.jsx("p",{className:"tw:whitespace-pre-wrap tw:text-foreground",children:P}):Y,A=()=>{const P=n??"accept";return P==="merged"?t.mergedText?e.jsx(br,{html:N}):Y:X(P==="reject"?t.rejectedResultText:t.resultText)},_=P=>h&&P.value==="reject",rt=P=>{const W=x===P.value,q=`${w}-${P.value}`,$=_(P);return e.jsxs("label",{htmlFor:q,"data-slot":"conflict-resolution-option","data-value":P.value,className:o.cn("tw:flex tw:flex-col tw:gap-1 tw:rounded-md tw:border tw:p-2","tw:focus-within:ring-2 tw:focus-within:ring-ring tw:focus-within:ring-offset-1",W?"tw:border-border tw:bg-accent/50":"tw:border-transparent tw:hover:bg-accent/30",$?"tw:cursor-not-allowed tw:opacity-60":"tw:cursor-pointer"),children:[e.jsxs("div",{className:"tw:flex tw:items-center tw:gap-2",children:[e.jsx(o.RadioGroupItem,{id:q,value:P.value,"aria-label":P.label,disabled:$,"aria-describedby":$?u:void 0}),e.jsx("span",{"aria-hidden":!0,className:"tw:font-medium",children:P.label})]}),$&&e.jsx("span",{id:u,className:"tw:sr-only",children:j}),e.jsx(br,{html:P.html})]},P.value)};return e.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-3 tw:text-sm",onClick:P=>P.stopPropagation(),children:[e.jsx("p",{children:r["%conflict_note_description_verseText%"]??"Conflicting changes were made to the verse text."}),p&&e.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-2","data-slot":"conflict-loading",children:[e.jsx(o.Skeleton,{className:"tw:h-8 tw:w-full"}),e.jsx(o.Skeleton,{className:"tw:h-8 tw:w-full"}),e.jsx(o.Skeleton,{className:"tw:h-8 tw:w-24"})]}),!p&&g&&A(),!p&&!g&&e.jsxs(e.Fragment,{children:[e.jsx("p",{children:r["%conflict_note_choose_prompt%"]??"Select which change to keep:"}),e.jsx(o.RadioGroup,{value:x,onValueChange:C,disabled:l,"aria-label":r["%conflict_note_choose_aria_label%"]??"Choose resolution",children:S.map(P=>_(P)?e.jsx(o.TooltipProvider,{delayDuration:0,children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:rt(P)}),e.jsx(o.TooltipContent,{children:j})]})},P.value):rt(P))}),e.jsx(o.TooltipProvider,{delayDuration:0,children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(Ge,{isDisabled:M&&E!==void 0,disabledExplanation:E,className:"tw:inline-flex tw:self-start",children:e.jsx(o.Button,{size:"sm",disabled:M,onClick:()=>i==null?void 0:i(x),children:r["%conflict_note_save_and_resolve%"]??"Save and resolve"})})}),E&&e.jsx(o.TooltipContent,{children:E})]})})]})]})}const Rs={accept:{key:"%conflict_note_summary_resolved_kept_current%",fallback:"Conflicting edits were resolved. Kept the current text."},reject:{key:"%conflict_note_summary_resolved_used_other%",fallback:"Conflicting edits were resolved. Used the other change."},merged:{key:"%conflict_note_summary_resolved_combined%",fallback:"Conflicting edits were resolved. Combined both changes."}};function Ms({comment:t,localizedStrings:r,resolvedResolution:a}){const n=s.useMemo(()=>vr(t.rejectedText??""),[t.rejectedText]);if(a){const{key:l,fallback:c}=Rs[a];return e.jsx("p",{className:"tw:text-sm tw:font-normal tw:text-muted-foreground",children:r[l]??c})}const i=r["%conflict_note_summary_unresolved%"]??"Conflicting edits. Choose which change to keep.";return e.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-1",children:[e.jsx("p",{className:"tw:text-sm tw:font-normal tw:text-muted-foreground",children:i}),n?e.jsx(br,{html:n}):void 0]})}function Ds(t){return t==="reject"?"reject":t==="merge"?"merged":"accept"}function Is({threadId:t,threadStatus:r,isSelected:a,activeComments:n,conflictResolution:i}){const[l,c]=s.useState("loading"),[d,u]=s.useState(!1),[w,p]=s.useState(),h=i==null?void 0:i.getOptions,g=i==null?void 0:i.resolve;s.useEffect(()=>{let k=!0;if(!a){c("loading");return}return(async()=>{let j;try{j=h?await h(t):"none"}catch{j="none"}k&&(c(j),j!=="none"&&p(void 0))})(),()=>{k=!1}},[a,t,r,h]);const m=s.useRef(!1),x=s.useCallback(async k=>{if(!(!g||m.current)){m.current=!0,u(!0);try{await g(t,k)&&(p(Ds(k)),c("none"))}catch{}finally{m.current=!1,u(!1)}}},[g,t]),f=s.useMemo(()=>{if(r==="Resolved"){for(let k=n.length-1;k>=0;k-=1)if(n[k].status==="Resolved")return Eo(n[k].conflictResolutionAction);return"accept"}},[r,n])??w;return{conflictOptions:l,isResolving:d,resolve:x,resolvedResolution:f,showResolveCheck:l!=="loading"&&l!=="none"}}const Os=s.memo(function(r){const{comments:a,localizedStrings:n,isSelected:i=!1,threadId:l,threadStatus:c,conflictResolution:d}=r,u=s.useMemo(()=>a.filter(k=>!k.deleted),[a]),w=s.useMemo(()=>u.find(k=>k.conflictType)??u[0],[u]),{conflictOptions:p,isResolving:h,resolve:g,resolvedResolution:m,showResolveCheck:x}=Is({threadId:l,threadStatus:c,isSelected:i,activeComments:u,conflictResolution:d}),y=No(w);let f;y&&w&&(f=i?e.jsx(Po,{comment:w,localizedStrings:n,availableActions:p,resolvedResolution:m,onResolve:g,isResolving:h}):e.jsx(Ms,{comment:w,localizedStrings:n,resolvedResolution:m}));let N;return y&&(N=e.jsx(Io,{show:x,disabled:h,onClick:()=>g("accept"),ariaLabel:n["%comment_aria_resolve_thread%"]??"Resolve thread"})),e.jsx(Oo,{...r,activeComments:u,rootContentSlot:f,resolveActionSlot:N,spaceRootContentFromReplies:y&&i})});function Ps({className:t="",classNameForVerseText:r,threads:a,currentUser:n,localizedStrings:i,handleAddCommentToThread:l,handleUpdateComment:c,handleDeleteComment:d,handleReadStatusChange:u,assignableUsers:w,canUserAddCommentToThread:p,canUserAssignThreadCallback:h,canUserResolveThreadCallback:g,canUserEditOrDeleteCommentCallback:m,selectedThreadId:x,onSelectedThreadChange:y,onVerseRefClick:f,conflictResolution:N,drafts:k,onDraftChange:C}){const[j,L]=s.useState(new Set),[S,O]=s.useState(),[M,E]=s.useState(),D=s.useCallback(async $=>{const et=await l($);return et!==void 0&&$.assignedUser!==void 0&&$.assignedUser!==""&&E($.assignedUser),et},[l]);s.useEffect(()=>{x&&(L($=>new Set($).add(x)),O(x))},[x]);const Y=a.filter($=>$.comments.some(et=>!et.deleted)),X=Y.map($=>({id:$.id})),A=s.useCallback($=>{L(et=>new Set(et).add($.id)),O($.id),y==null||y($.id)},[y]),_=s.useCallback($=>{const et=j.has($);L(dt=>{const ct=new Set(dt);return ct.has($)?ct.delete($):ct.add($),ct}),O($),y==null||y(et?void 0:$)},[j,y]),{listboxRef:rt,activeId:P,handleKeyDown:W}=o.useListbox({options:X,onOptionSelect:A}),q=s.useCallback($=>{$.key==="Escape"?(S&&j.has(S)&&(L(et=>{const dt=new Set(et);return dt.delete(S),dt}),O(void 0),y==null||y(void 0)),$.preventDefault(),$.stopPropagation()):W($)},[S,j,W,y]);return e.jsx("div",{id:To,role:"listbox",tabIndex:0,ref:rt,"aria-activedescendant":P??void 0,"aria-label":"Comments",className:o.cn("tw:flex tw:w-full tw:flex-col tw:outline-hidden tw:focus:ring-2 tw:focus:ring-ring tw:focus:ring-offset-1 tw:focus:ring-offset-background",t),onKeyDown:q,children:Y.map($=>{const et={classNameForVerseText:r,comments:$.comments,localizedStrings:i,verseRef:$.verseRef,handleSelectThread:_,threadId:$.id,thread:$,isRead:$.isRead,isSelected:j.has($.id),currentUser:n,assignedUser:$.assignedUser,threadStatus:$.status,handleAddCommentToThread:D,handleUpdateComment:c,handleDeleteComment:d,handleReadStatusChange:u,assignableUsers:w,canUserAddCommentToThread:p,canUserAssignThreadCallback:h,canUserResolveThreadCallback:g,canUserEditOrDeleteCommentCallback:m,onVerseRefClick:f,initialAssignedUser:M,draft:k==null?void 0:k[$.id],onDraftChange:C};return e.jsx("div",{className:o.cn("tw:border-b tw:border-border tw:last:border-b-0",{"tw:opacity-60":$.status==="Resolved"}),children:$.type==="Conflict"?e.jsx(Os,{...et,conflictResolution:N}):e.jsx(Oo,{...et})},$.id)})})}const Ls="data-platform-content-zoom-root",Lo=s.forwardRef(function({area:r,...a},n){return e.jsx("div",{ref:n,...a,"data-platform-content-zoom-root":r??""})});Lo.displayName="ContentZoomRoot";function As({table:t}){return e.jsxs(o.DropdownMenu,{children:[e.jsx(o.DropdownMenuTrigger,{asChild:!0,children:e.jsxs(o.Button,{variant:"outline",size:"sm",className:"tw:ml-auto tw:hidden tw:h-8 tw:lg:flex",children:[e.jsx(z.FilterIcon,{className:"tw:mr-2 tw:h-4 tw:w-4"}),"View"]})}),e.jsxs(o.DropdownMenuContent,{align:"end",className:"tw:w-[150px]",children:[e.jsx(o.DropdownMenuLabel,{children:"Toggle columns"}),e.jsx(o.DropdownMenuSeparator,{}),t.getAllColumns().filter(r=>r.getCanHide()).map(r=>e.jsx(o.DropdownMenuCheckboxItem,{className:"tw:capitalize",checked:r.getIsVisible(),onCheckedChange:a=>r.toggleVisibility(!!a),children:r.id},r.id))]})]})}function Te({...t}){return e.jsx(G.Select.Root,{"data-slot":"select",...t})}function Ao({className:t,...r}){return e.jsx(G.Select.Group,{"data-slot":"select-group",className:o.cn("tw:scroll-my-1 tw:p-1",t),...r})}function Se({...t}){return e.jsx(G.Select.Value,{"data-slot":"select-value",...t})}function Re({className:t,size:r="default",children:a,...n}){const i=o.readDirection();return e.jsxs(G.Select.Trigger,{"data-slot":"select-trigger","data-size":r,className:o.cn("pr-twp tw:flex tw:w-fit tw:items-center tw:gap-2 tw:rounded-lg tw:border tw:border-input tw:bg-transparent tw:py-2 tw:pe-2 tw:ps-2.5 tw:text-sm tw:whitespace-nowrap tw:transition-colors tw:outline-none tw:select-none tw:focus-visible:border-ring tw:focus-visible:ring-3 tw:focus-visible:ring-ring/50 tw:disabled:cursor-not-allowed tw:disabled:opacity-50 tw:aria-invalid:border-destructive tw:aria-invalid:ring-3 tw:aria-invalid:ring-destructive/20 tw:data-placeholder:text-muted-foreground tw:data-[size=default]:h-8 tw:data-[size=sm]:h-7 tw:data-[size=sm]:rounded-[min(var(--tw-radius-md),10px)] tw:*:data-[slot=select-value]:line-clamp-1 tw:*:data-[slot=select-value]:flex tw:*:data-[slot=select-value]:flex-1 tw:*:data-[slot=select-value]:items-center tw:*:data-[slot=select-value]:gap-1.5 tw:*:data-[slot=select-value]:text-start tw:dark:bg-input/30 tw:dark:hover:bg-input/50 tw:dark:aria-invalid:border-destructive/50 tw:dark:aria-invalid:ring-destructive/40 tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0 tw:[&_svg:not([class*=size-])]:size-4",t),dir:i,...n,children:[a,e.jsx(G.Select.Icon,{asChild:!0,children:e.jsx(Dt.IconSelector,{className:"tw:pointer-events-none tw:size-4 tw:text-muted-foreground"})})]})}function Me({className:t,children:r,position:a="popper",align:n="center",style:i,...l}){const c=o.readDirection();return e.jsx(G.Select.Portal,{children:e.jsxs(G.Select.Content,{"data-slot":"select-content","data-align-trigger":a==="item-aligned",className:o.cn("pr-twp tw:relative tw:max-h-(--radix-select-content-available-height) tw:data-[align-trigger=true]:min-w-(--radix-select-trigger-width) tw:data-[align-trigger=false]:min-w-36 tw:origin-(--radix-select-content-transform-origin) tw:overflow-x-hidden tw:overflow-y-auto tw:rounded-lg tw:bg-popover tw:text-popover-foreground tw:shadow-md tw:ring-1 tw:ring-foreground/10 tw:duration-100 tw:data-[align-trigger=true]:animate-none tw:data-[side=bottom]:slide-in-from-top-2 tw:data-[side=left]:slide-in-from-right-2 tw:data-[side=right]:slide-in-from-left-2 tw:data-[side=top]:slide-in-from-bottom-2 tw:data-open:animate-in tw:data-open:fade-in-0 tw:data-open:zoom-in-95 tw:data-closed:animate-out tw:data-closed:fade-out-0 tw:data-closed:zoom-out-95 tw:animate-none! tw:**:data-[slot$=-item]:focus:bg-foreground/10 tw:**:data-[slot$=-item]:data-highlighted:bg-foreground/10 tw:**:data-[slot$=-separator]:bg-foreground/5 tw:**:data-[slot$=-trigger]:focus:bg-foreground/10 tw:**:data-[slot$=-trigger]:aria-expanded:bg-foreground/10! tw:**:data-[variant=destructive]:focus:bg-foreground/10! tw:**:data-[variant=destructive]:text-accent-foreground! tw:**:data-[variant=destructive]:**:text-accent-foreground! tw:relative",a==="popper"&&"tw:data-[side=bottom]:translate-y-1 tw:data-[side=left]:-translate-x-1 tw:rtl:data-[side=left]:translate-x-1 tw:data-[side=right]:translate-x-1 tw:rtl:data-[side=right]:-translate-x-1 tw:data-[side=top]:-translate-y-1",t),style:{zIndex:o.Z_INDEX_ABOVE_DOCK,...i},position:a,align:n,...l,children:[e.jsx(Bo,{}),e.jsx(G.Select.Viewport,{"data-position":a,className:o.cn("tw:data-[position=popper]:h-(--radix-select-trigger-height) tw:data-[position=popper]:w-full tw:data-[position=popper]:min-w-(--radix-select-trigger-width)",a==="popper"&&"tw:"),children:e.jsx("div",{dir:c,children:r})}),e.jsx(zo,{})]})})}function Bs({className:t,...r}){return e.jsx(G.Select.Label,{"data-slot":"select-label",className:o.cn("pr-twp tw:px-1.5 tw:py-1 tw:text-xs tw:text-muted-foreground",t),...r})}function ae({className:t,children:r,...a}){return e.jsxs(G.Select.Item,{"data-slot":"select-item",className:o.cn("pr-twp tw:relative tw:flex tw:w-full tw:cursor-default tw:items-center tw:gap-1.5 tw:rounded-md tw:py-1 tw:pe-8 tw:ps-1.5 tw:text-sm tw:outline-hidden tw:select-none tw:focus:bg-accent tw:focus:text-accent-foreground tw:not-data-[variant=destructive]:focus:**:text-accent-foreground tw:data-disabled:pointer-events-none tw:data-disabled:opacity-50 tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0 tw:[&_svg:not([class*=size-])]:size-4 tw:*:[span]:last:flex tw:*:[span]:last:items-center tw:*:[span]:last:gap-2",t),...a,children:[e.jsx("span",{className:"tw:pointer-events-none tw:absolute tw:end-2 tw:flex tw:size-4 tw:items-center tw:justify-center",children:e.jsx(G.Select.ItemIndicator,{children:e.jsx(Dt.IconCheck,{className:"tw:pointer-events-none"})})}),e.jsx(G.Select.ItemText,{children:r})]})}function zs({className:t,...r}){return e.jsx(G.Select.Separator,{"data-slot":"select-separator",className:o.cn("pr-twp tw:pointer-events-none tw:-mx-1 tw:my-1 tw:h-px tw:bg-border",t),...r})}function Bo({className:t,...r}){return e.jsx(G.Select.ScrollUpButton,{"data-slot":"select-scroll-up-button",className:o.cn("pr-twp tw:z-10 tw:flex tw:cursor-default tw:items-center tw:justify-center tw:bg-popover tw:py-1 tw:[&_svg:not([class*=size-])]:size-4",t),...r,children:e.jsx(Dt.IconChevronUp,{})})}function zo({className:t,...r}){return e.jsx(G.Select.ScrollDownButton,{"data-slot":"select-scroll-down-button",className:o.cn("pr-twp tw:z-10 tw:flex tw:cursor-default tw:items-center tw:justify-center tw:bg-popover tw:py-1 tw:[&_svg:not([class*=size-])]:size-4",t),...r,children:e.jsx(Dt.IconChevronDown,{})})}function $s({table:t}){return e.jsx("div",{className:"tw:flex tw:items-center tw:justify-between tw:px-2 tw:pb-3 tw:pt-3",children:e.jsxs("div",{className:"tw:flex tw:items-center tw:space-x-6 tw:lg:space-x-8",children:[e.jsxs("div",{className:"tw:flex-1 tw:text-sm tw:text-muted-foreground",children:[t.getFilteredSelectedRowModel().rows.length," of"," ",t.getFilteredRowModel().rows.length," row(s) selected"]}),e.jsxs("div",{className:"tw:flex tw:items-center tw:space-x-2",children:[e.jsx("p",{className:"tw:text-nowrap tw:text-sm tw:font-medium",children:"Rows per page"}),e.jsxs(Te,{value:`${t.getState().pagination.pageSize}`,onValueChange:r=>{t.setPageSize(Number(r))},children:[e.jsx(Re,{className:"tw:h-8 tw:w-[70px]",children:e.jsx(Se,{placeholder:t.getState().pagination.pageSize})}),e.jsx(Me,{side:"top",children:[10,20,30,40,50].map(r=>e.jsx(ae,{value:`${r}`,children:r},r))})]})]}),e.jsxs("div",{className:"tw:flex tw:w-[100px] tw:items-center tw:justify-center tw:text-sm tw:font-medium",children:["Page ",t.getState().pagination.pageIndex+1," of ",t.getPageCount()]}),e.jsxs("div",{className:"tw:flex tw:items-center tw:space-x-2",children:[e.jsxs(o.Button,{variant:"outline",size:"icon",className:"tw:hidden tw:h-8 tw:w-8 tw:p-0 tw:lg:flex",onClick:()=>t.setPageIndex(0),disabled:!t.getCanPreviousPage(),children:[e.jsx("span",{className:"tw:sr-only",children:"Go to first page"}),e.jsx(z.ArrowLeftIcon,{className:"tw:h-4 tw:w-4"})]}),e.jsxs(o.Button,{variant:"outline",size:"icon",className:"tw:h-8 tw:w-8 tw:p-0",onClick:()=>t.previousPage(),disabled:!t.getCanPreviousPage(),children:[e.jsx("span",{className:"tw:sr-only",children:"Go to previous page"}),e.jsx(z.ChevronLeftIcon,{className:"tw:h-4 tw:w-4"})]}),e.jsxs(o.Button,{variant:"outline",size:"icon",className:"tw:h-8 tw:w-8 tw:p-0",onClick:()=>t.nextPage(),disabled:!t.getCanNextPage(),children:[e.jsx("span",{className:"tw:sr-only",children:"Go to next page"}),e.jsx(z.ChevronRightIcon,{className:"tw:h-4 tw:w-4"})]}),e.jsxs(o.Button,{variant:"outline",size:"icon",className:"tw:hidden tw:h-8 tw:w-8 tw:p-0 tw:lg:flex",onClick:()=>t.setPageIndex(t.getPageCount()-1),disabled:!t.getCanNextPage(),children:[e.jsx("span",{className:"tw:sr-only",children:"Go to last page"}),e.jsx(z.ArrowRightIcon,{className:"tw:h-4 tw:w-4"})]})]})]})})}function $o({columns:t,data:r,enablePagination:a=!1,showPaginationControls:n=!1,showColumnVisibilityControls:i=!1,stickyHeader:l=!1,onRowClickHandler:c=()=>{},id:d,isLoading:u=!1,noResultsMessage:w}){var S;const[p,h]=s.useState([]),[g,m]=s.useState([]),[x,y]=s.useState({}),[f,N]=s.useState({}),k=s.useMemo(()=>r??[],[r]),C=qt.useReactTable({data:k,columns:t,getCoreRowModel:qt.getCoreRowModel(),...a&&{getPaginationRowModel:qt.getPaginationRowModel()},onSortingChange:h,getSortedRowModel:qt.getSortedRowModel(),onColumnFiltersChange:m,getFilteredRowModel:qt.getFilteredRowModel(),onColumnVisibilityChange:y,onRowSelectionChange:N,state:{sorting:p,columnFilters:g,columnVisibility:x,rowSelection:f}}),j=C.getVisibleFlatColumns();let L;return u?L=Array.from({length:10}).map((E,D)=>`skeleton-row-${D}`).map(E=>e.jsx(o.TableRow,{className:"tw:hover:bg-transparent",children:e.jsx(o.TableCell,{colSpan:j.length??t.length,className:"tw:border-0 tw:p-0",children:e.jsx("div",{className:"tw:w-full tw:py-2",children:e.jsx(o.Skeleton,{className:"tw:h-14 tw:w-full tw:rounded-md"})})})},E)):((S=C.getRowModel().rows)==null?void 0:S.length)>0?L=C.getRowModel().rows.map(O=>e.jsx(o.TableRow,{onClick:()=>c(O,C),"data-state":O.getIsSelected()&&"selected",children:O.getVisibleCells().map(M=>e.jsx(o.TableCell,{children:qt.flexRender(M.column.columnDef.cell,M.getContext())},M.id))},O.id)):L=e.jsx(o.TableRow,{children:e.jsx(o.TableCell,{colSpan:t.length,className:"tw:h-24 tw:text-center",children:w})}),e.jsxs("div",{className:"pr-twp",id:d,children:[i&&e.jsx(As,{table:C}),e.jsxs(o.Table,{stickyHeader:l,children:[e.jsx(o.TableHeader,{stickyHeader:l,children:C.getHeaderGroups().map(O=>e.jsx(o.TableRow,{children:O.headers.map(M=>e.jsx(o.TableHead,{className:"tw:p-0",children:M.isPlaceholder?void 0:qt.flexRender(M.column.columnDef.header,M.getContext())},M.id))},O.id))}),e.jsx(o.TableBody,{children:L})]}),a&&e.jsxs("div",{className:"tw:flex tw:items-center tw:justify-end tw:space-x-2 tw:py-4",children:[e.jsx(o.Button,{variant:"outline",size:"sm",onClick:()=>C.previousPage(),disabled:!C.getCanPreviousPage(),children:"Previous"}),e.jsx(o.Button,{variant:"outline",size:"sm",onClick:()=>C.nextPage(),disabled:!C.getCanNextPage(),children:"Next"})]}),a&&n&&e.jsx($s,{table:C})]})}function Vs({id:t,markdown:r,className:a,anchorTarget:n,truncate:i}){const l=s.useMemo(()=>({overrides:{a:{props:{target:n,rel:n==="_blank"?"noopener noreferrer":void 0}}}}),[n]);return e.jsx("div",{id:t,className:o.cn("pr-twp tw:prose",{"tw:line-clamp-3 tw:max-h-10 tw:overflow-hidden tw:text-ellipsis tw:break-words":i},a),children:e.jsx(Rn,{options:l,children:r})})}const Vo=Object.freeze(["%webView_error_dump_header%","%webView_error_dump_info_message%"]),Va=(t,r)=>t[r]??r;function Fo({errorDetails:t,handleCopyNotify:r,localizedStrings:a,id:n}){const i=Va(a,"%webView_error_dump_header%"),l=Va(a,"%webView_error_dump_info_message%");function c(){navigator.clipboard.writeText(t),r&&r()}return e.jsxs("div",{id:n,className:"tw:inline-flex tw:w-full tw:flex-col tw:items-start tw:justify-start tw:gap-4",children:[e.jsxs("div",{className:"tw:inline-flex tw:items-start tw:justify-start tw:gap-4 tw:self-stretch",children:[e.jsxs("div",{className:"tw:inline-flex tw:flex-1 tw:flex-col tw:items-start tw:justify-start",children:[e.jsx("div",{className:"tw:text-color-text tw:justify-center tw:text-center tw:text-lg tw:font-semibold tw:leading-loose",children:i}),e.jsx("div",{className:"tw:justify-center tw:self-stretch tw:text-sm tw:font-normal tw:leading-tight tw:text-muted-foreground",children:l})]}),e.jsx(o.Button,{variant:"secondary",size:"icon",className:"size-8",onClick:()=>c(),children:e.jsx(z.Copy,{})})]}),e.jsx("div",{className:"tw:prose tw:w-full",children:e.jsx("pre",{className:"tw:text-xs",children:t})})]})}const Fs=Object.freeze([...Vo,"%webView_error_dump_copied_message%"]);function Gs({errorDetails:t,handleCopyNotify:r,localizedStrings:a,children:n,className:i,id:l}){const[c,d]=s.useState(!1),u=()=>{d(!0),r&&r()},w=p=>{p||d(!1)};return e.jsxs(o.Popover,{onOpenChange:w,children:[e.jsx(o.PopoverTrigger,{asChild:!0,children:n}),e.jsxs(o.PopoverContent,{id:l,className:o.cn("tw:min-w-80 tw:max-w-96",i),children:[c&&a["%webView_error_dump_copied_message%"]&&e.jsx(o.Label,{children:a["%webView_error_dump_copied_message%"]}),e.jsx(Fo,{errorDetails:t,handleCopyNotify:u,localizedStrings:a})]})]})}var Go=(t=>(t[t.Check=0]="Check",t[t.Radio=1]="Radio",t))(Go||{});function Ks({id:t,label:r,groups:a}){const[n,i]=s.useState(Object.fromEntries(a.map((w,p)=>w.itemType===0?[p,[]]:void 0).filter(w=>!!w))),[l,c]=s.useState({}),d=(w,p)=>{const h=!n[w][p];i(m=>(m[w][p]=h,{...m}));const g=a[w].items[p];g.onUpdate(g.id,h)},u=(w,p)=>{c(g=>(g[w]=p,{...g}));const h=a[w].items.find(g=>g.id===p);h?h.onUpdate(p):console.error(`Could not find dropdown radio item with id '${p}'!`)};return e.jsx("div",{id:t,children:e.jsxs(o.DropdownMenu,{children:[e.jsx(o.DropdownMenuTrigger,{asChild:!0,children:e.jsxs(o.Button,{variant:"default",children:[e.jsx(z.Filter,{size:16,className:"tw:mr-2 tw:h-4 tw:w-4"}),r,e.jsx(z.ChevronDown,{size:16,className:"tw:ml-2 tw:h-4 tw:w-4"})]})}),e.jsx(o.DropdownMenuContent,{children:a.map((w,p)=>e.jsxs("div",{children:[e.jsx(o.DropdownMenuLabel,{children:w.label}),e.jsx(o.DropdownMenuGroup,{children:w.itemType===0?e.jsx(e.Fragment,{children:w.items.map((h,g)=>e.jsx("div",{children:e.jsx(o.DropdownMenuCheckboxItem,{checked:n[p][g],onCheckedChange:()=>d(p,g),children:h.label})},h.id))}):e.jsx(o.DropdownMenuRadioGroup,{value:l[p],onValueChange:h=>u(p,h),children:w.items.map(h=>e.jsx("div",{children:e.jsx(o.DropdownMenuRadioItem,{value:h.id,children:h.label})},h.id))})}),e.jsx(o.DropdownMenuSeparator,{})]},w.label))})]})})}function Us({id:t,category:r,downloads:a,languages:n,moreInfoUrl:i,handleMoreInfoLinkClick:l,supportUrl:c,handleSupportLinkClick:d}){const u=new B.NumberFormat("en",{notation:"compact",compactDisplay:"short"}).format(Object.values(a).reduce((p,h)=>p+h,0)),w=()=>{window.scrollTo(0,document.body.scrollHeight)};return e.jsxs("div",{id:t,className:"pr-twp tw:flex tw:items-center tw:justify-center tw:divide-x tw:border-b tw:border-t tw:py-2 tw:text-center",children:[r&&e.jsxs("div",{className:"tw:flex tw:flex-col tw:items-center tw:gap-1 tw:px-4",children:[e.jsx("div",{className:"tw:flex",children:e.jsx("span",{className:"tw:text-xs tw:font-semibold tw:text-foreground",children:r})}),e.jsx("span",{className:"tw:text-xs tw:text-foreground",children:"CATEGORY"})]}),e.jsxs("div",{className:"tw:flex tw:flex-col tw:items-center tw:gap-1 tw:px-4",children:[e.jsxs("div",{className:"tw:flex tw:gap-1",children:[e.jsx(z.User,{className:"tw:h-4 tw:w-4"}),e.jsx("span",{className:"tw:text-xs tw:font-semibold tw:text-foreground",children:u})]}),e.jsx("span",{className:"tw:text-xs tw:text-foreground",children:"USERS"})]}),e.jsxs("div",{className:"tw:flex tw:flex-col tw:items-center tw:gap-1 tw:px-4",children:[e.jsx("div",{className:"tw:flex tw:gap-2",children:n.slice(0,3).map(p=>e.jsx("span",{className:"tw:text-xs tw:font-semibold tw:text-foreground",children:p.toUpperCase()},p))}),n.length>3&&e.jsxs("button",{type:"button",onClick:()=>w(),className:"tw:text-xs tw:text-foreground tw:underline",children:["+",n.length-3," more languages"]})]}),(i||c)&&e.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-1 tw:px-4",children:[i&&e.jsx("div",{className:"tw:flex tw:gap-1",children:e.jsxs(o.Button,{onClick:()=>l(),variant:"link",className:"tw:flex tw:h-auto tw:gap-1 tw:py-0 tw:text-xs tw:font-semibold tw:text-foreground",children:["Website",e.jsx(z.Link,{className:"tw:h-4 tw:w-4"})]})}),c&&e.jsx("div",{className:"tw:flex tw:gap-1",children:e.jsxs(o.Button,{onClick:()=>d(),variant:"link",className:"tw:flex tw:h-auto tw:gap-1 tw:py-0 tw:text-xs tw:font-semibold tw:text-foreground",children:["Support",e.jsx(z.CircleHelp,{className:"tw:h-4 tw:w-4"})]})})]})]})}function Hs({id:t,versionHistory:r}){const[a,n]=s.useState(!1),i=new Date;function l(d){const u=new Date(d),w=new Date(i.getTime()-u.getTime()),p=w.getUTCFullYear()-1970,h=w.getUTCMonth(),g=w.getUTCDate()-1;let m="";return p>0?m=`${p.toString()} year${p===1?"":"s"} ago`:h>0?m=`${h.toString()} month${h===1?"":"s"} ago`:g===0?m="today":m=`${g.toString()} day${g===1?"":"s"} ago`,m}const c=Object.entries(r).sort((d,u)=>u[0].localeCompare(d[0]));return e.jsxs("div",{className:"pr-twp",id:t,children:[e.jsx("h3",{className:"tw:text-md tw:font-semibold",children:"What`s New"}),e.jsx("ul",{className:"tw:list-disc tw:pl-5 tw:pr-4 tw:text-xs tw:text-foreground",children:(a?c:c.slice(0,5)).map(d=>e.jsxs("div",{className:"tw:mt-3 tw:flex tw:justify-between",children:[e.jsx("div",{className:"tw:text-foreground",children:e.jsx("li",{className:"tw:prose tw:text-xs",children:e.jsx("span",{children:d[1].description})})}),e.jsxs("div",{className:"tw:justify-end tw:text-right",children:[e.jsxs("div",{children:["Version ",d[0]]}),e.jsx("div",{children:l(d[1].date)})]})]},d[0]))}),c.length>5&&e.jsx("button",{type:"button",onClick:()=>n(!a),className:"tw:text-xs tw:text-foreground tw:underline",children:a?"Show Less Version History":"Show All Version History"})]})}function qs({id:t,publisherDisplayName:r,fileSize:a,locales:n,versionHistory:i,currentVersion:l}){const c=s.useMemo(()=>B.formatBytes(a),[a]),u=(w=>{const p=new Intl.DisplayNames(B.getCurrentLocale(),{type:"language"});return w.map(h=>p.of(h))})(n);return e.jsx("div",{id:t,className:"pr-twp tw:border-t tw:py-2",children:e.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-2 tw:divide-y",children:[Object.entries(i).length>0&&e.jsx(Hs,{versionHistory:i}),e.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-2 tw:py-2",children:[e.jsx("h2",{className:"tw:text-md tw:font-semibold",children:"Information"}),e.jsxs("div",{className:"tw:flex tw:items-start tw:justify-between tw:text-xs tw:text-foreground",children:[e.jsxs("p",{className:"tw:flex tw:flex-col tw:justify-start tw:gap-1",children:[e.jsx("span",{children:"Publisher"}),e.jsx("span",{className:"tw:font-semibold",children:r}),e.jsx("span",{children:"Size"}),e.jsx("span",{className:"tw:font-semibold",children:c})]}),e.jsx("div",{className:"tw:flex tw:w-3/4 tw:items-center tw:justify-between tw:text-xs tw:text-foreground",children:e.jsxs("p",{className:"tw:flex tw:flex-col tw:justify-start tw:gap-1",children:[e.jsx("span",{children:"Version"}),e.jsx("span",{className:"tw:font-semibold",children:l}),e.jsx("span",{children:"Languages"}),e.jsx("span",{className:"tw:font-semibold",children:u.join(", ")})]})})]})]})]})})}function Ys({entries:t,selected:r,onChange:a,placeholder:n,commandEmptyMessage:i,customSelectedText:l,isDisabled:c,sortSelected:d,icon:u,className:w,badgesPlaceholder:p,id:h}){return e.jsxs("div",{id:h,className:"tw:flex tw:items-center tw:gap-2",children:[e.jsx(o.MultiSelectComboBox,{entries:t,selected:r,onChange:a,placeholder:n,commandEmptyMessage:i,customSelectedText:l,isDisabled:c,sortSelected:d,icon:u,className:w}),r.length>0?e.jsx("div",{className:"tw:flex tw:flex-wrap tw:items-center tw:gap-2",children:r.map(g=>{var m;return e.jsxs(o.Badge,{variant:"muted",className:"tw:flex tw:items-center tw:gap-1",children:[e.jsx(o.Button,{variant:"ghost",size:"icon",className:"tw:h-4 tw:w-4 tw:p-0 tw:hover:bg-transparent",onClick:()=>a(r.filter(x=>x!==g)),children:e.jsx(z.X,{className:"tw:h-3 tw:w-3"})}),(m=t.find(x=>x.value===g))==null?void 0:m.label]},g)})}):e.jsx(o.Label,{children:p})]})}const Ko=Object.freeze(["%undoButton_tooltip%","%redoButton_tooltip%"]),Fa=(t,r)=>t[r]??r;function Uo({onUndoClick:t,onRedoClick:r,canUndo:a=!0,canRedo:n=!0,localizedStrings:i={},showKeyboardShortcuts:l=!0,className:c="tw:h-6 tw:w-6",variant:d="ghost"}){const u=o.isMacOs(),w=Fa(i,"%undoButton_tooltip%"),p=Fa(i,"%redoButton_tooltip%"),h=d==="secondary"||d==="default";return e.jsxs(o.ButtonGroup,{children:[e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.Button,{"aria-label":w,className:c,size:"icon",onClick:t,disabled:!a,variant:d,children:e.jsx(z.Undo,{})})}),e.jsx(o.TooltipContent,{children:e.jsxs("p",{children:[w,l&&e.jsxs(e.Fragment,{children:[" ",e.jsx(o.Kbd,{children:u?"⌘Z":"Ctrl+Z"})]})]})})]})}),r&&h&&e.jsx(o.ButtonGroupSeparator,{}),r&&e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.Button,{"aria-label":p,className:c,size:"icon",onClick:r,disabled:!n,variant:d,children:e.jsx(z.Redo,{})})}),e.jsx(o.TooltipContent,{children:e.jsxs("p",{children:[p,l&&e.jsxs(e.Fragment,{children:[" ",e.jsx(o.Kbd,{children:u?"⌘⇧Z":"Ctrl+Y"})]})]})})]})})]})}function Ho({children:t,editorRef:r,canUndo:a=!0,canRedo:n=!0}){const i=s.useRef(null);return s.useEffect(()=>{var u;const l=o.isMacOs(),c=((u=i.current)==null?void 0:u.querySelector(".editor-input"))??void 0,d=w=>{var h,g,m,x;if(!c||document.activeElement!==c)return;const p=w.key.toLowerCase();if(l){if(!w.metaKey)return;!w.shiftKey&&p==="z"?(w.preventDefault(),a&&((h=r.current)==null||h.undo())):w.shiftKey&&p==="z"&&(w.preventDefault(),n&&((g=r.current)==null||g.redo()))}else{if(!w.ctrlKey)return;!w.shiftKey&&p==="z"?(w.preventDefault(),a&&((m=r.current)==null||m.undo())):(p==="y"||w.shiftKey&&p==="z")&&(w.preventDefault(),n&&((x=r.current)==null||x.redo()))}};return document.addEventListener("keydown",d),()=>document.removeEventListener("keydown",d)},[n,a,r]),e.jsx("div",{ref:i,children:t})}const Xs=(t,r,a)=>t==="generated"?e.jsxs(e.Fragment,{children:[e.jsx("p",{children:"+"})," ",r["%footnoteEditor_callerDropdown_item_generated%"]]}):t==="hidden"?e.jsxs(e.Fragment,{children:[e.jsx("p",{children:"-"})," ",r["%footnoteEditor_callerDropdown_item_hidden%"]]}):e.jsxs(e.Fragment,{children:[e.jsx("p",{children:a})," ",r["%footnoteEditor_callerDropdown_item_custom%"]]});function Ws({callerType:t,customCaller:r,updateCaller:a,localizedStrings:n}){const i=s.useRef(null),l=s.useRef(null),c=s.useRef(!1),[d,u]=s.useState(t),[w,p]=s.useState(r),[h,g]=s.useState(!1),m=s.useRef(!1),x=s.useRef(d);x.current=d;const y=s.useRef(w);y.current=w,s.useEffect(()=>{u(t)},[t]),s.useEffect(()=>{w!==r&&p(r)},[r]);const f=k=>{if(c.current=!1,g(k),!k){const C=x.current,j=y.current;C!=="custom"||j?(C!==t||j!==r)&&a(C,j):(u(t),p(r))}},N=k=>{var C,j,L,S;k.stopPropagation(),document.activeElement===l.current&&k.key==="ArrowDown"||k.key==="ArrowRight"?((C=i.current)==null||C.focus(),c.current=!0):document.activeElement===i.current&&k.key==="ArrowUp"?((j=l.current)==null||j.focus(),c.current=!1):document.activeElement===i.current&&k.key==="ArrowLeft"&&((L=i.current)==null?void 0:L.selectionStart)===0&&((S=l.current)==null||S.focus(),c.current=!1),d==="custom"&&k.key==="Enter"&&(document.activeElement===l.current||document.activeElement===i.current)&&f(!1)};return e.jsxs(o.DropdownMenu,{open:h,onOpenChange:f,children:[e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.DropdownMenuTrigger,{asChild:!0,children:e.jsx(o.Button,{variant:"outline",className:"tw:h-6",children:Xs(t,n,r)})})}),e.jsx(o.TooltipContent,{children:n["%footnoteEditor_callerDropdown_tooltip%"]})]})}),e.jsxs(o.DropdownMenuContent,{style:{zIndex:o.Z_INDEX_ABOVE_POPOVER},onClick:()=>{c.current&&(c.current=!1)},onKeyDown:N,onMouseMove:()=>{var k;c.current&&((k=i.current)==null||k.focus())},children:[e.jsx(o.DropdownMenuLabel,{children:n["%footnoteEditor_callerDropdown_label%"]}),e.jsx(o.DropdownMenuSeparator,{}),e.jsx(o.DropdownMenuCheckboxItem,{checked:d==="generated",onCheckedChange:()=>u("generated"),children:e.jsxs("div",{className:"tw:flex tw:w-full tw:justify-between",children:[e.jsx("span",{children:n["%footnoteEditor_callerDropdown_item_generated%"]}),e.jsx("span",{className:"tw:w-10 tw:text-center",children:Ut.GENERATOR_NOTE_CALLER})]})}),e.jsx(o.DropdownMenuCheckboxItem,{checked:d==="hidden",onCheckedChange:()=>u("hidden"),children:e.jsxs("div",{className:"tw:flex tw:w-full tw:justify-between",children:[e.jsx("span",{children:n["%footnoteEditor_callerDropdown_item_hidden%"]}),e.jsx("span",{className:"tw:w-10 tw:text-center",children:Ut.HIDDEN_NOTE_CALLER})]})}),e.jsx(o.DropdownMenuCheckboxItem,{ref:l,checked:d==="custom",onCheckedChange:()=>u("custom"),onPointerDown:()=>{m.current=d==="custom"},onClick:k=>{var C;if(k.stopPropagation(),m.current&&k.target!==i.current){f(!1);return}c.current=!0,(C=i.current)==null||C.focus()},onSelect:k=>k.preventDefault(),children:e.jsxs("div",{className:"tw:flex tw:w-full tw:justify-between",children:[e.jsx("span",{children:n["%footnoteEditor_callerDropdown_item_custom%"]}),e.jsx(o.Input,{tabIndex:0,onMouseDown:k=>{k.stopPropagation(),u("custom"),c.current=!0},ref:i,className:"tw:h-auto tw:w-10 tw:p-0 tw:text-center",value:w,onKeyDown:k=>{k.key==="Enter"||k.key==="ArrowUp"||k.key==="ArrowDown"||k.key==="ArrowLeft"||k.key==="ArrowRight"||k.stopPropagation()},maxLength:1,onChange:k=>p(k.target.value)})]})})]})]})}const Zs=(t,r)=>t==="f"?e.jsxs(e.Fragment,{children:[e.jsx(z.FunctionSquare,{})," ",r["%footnoteEditor_noteType_footnote_label%"]]}):t==="fe"?e.jsxs(e.Fragment,{children:[e.jsx(z.SquareSigma,{})," ",r["%footnoteEditor_noteType_endNote_label%"]]}):e.jsxs(e.Fragment,{children:[e.jsx(z.SquareX,{})," ",r["%footnoteEditor_noteType_crossReference_label%"]]}),Js=(t,r)=>{if(t==="x")return r["%footnoteEditor_noteType_crossReference_label%"];let a=r["%footnoteEditor_noteType_endNote_label%"];return t==="f"&&(a=r["%footnoteEditor_noteType_footnote_label%"]),B.formatReplacementString(r["%footnoteEditor_noteType_tooltip%"]??"",{noteType:a})};function Qs({noteType:t,handleNoteTypeChange:r,localizedStrings:a,isTypeSwitchable:n}){return e.jsxs(o.DropdownMenu,{children:[e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.DropdownMenuTrigger,{asChild:!0,children:e.jsx(o.Button,{variant:"outline",className:"tw:h-6",children:Zs(t,a)})})}),e.jsx(o.TooltipContent,{children:e.jsx("p",{children:Js(t,a)})})]})}),e.jsxs(o.DropdownMenuContent,{style:{zIndex:o.Z_INDEX_ABOVE_POPOVER},children:[e.jsx(o.DropdownMenuLabel,{children:a["%footnoteEditor_noteTypeDropdown_label%"]}),e.jsx(o.DropdownMenuSeparator,{}),e.jsxs(o.DropdownMenuCheckboxItem,{disabled:t!=="x"&&!n,checked:t==="x",onCheckedChange:()=>r("x"),className:"tw:gap-2",children:[e.jsx(z.SquareX,{}),e.jsx("span",{children:a["%footnoteEditor_noteType_crossReference_label%"]})]}),e.jsxs(o.DropdownMenuCheckboxItem,{disabled:t==="x"&&!n,checked:t==="f",onCheckedChange:()=>r("f"),className:"tw:gap-2",children:[e.jsx(z.FunctionSquare,{}),e.jsx("span",{children:a["%footnoteEditor_noteType_footnote_label%"]})]}),e.jsxs(o.DropdownMenuCheckboxItem,{disabled:t==="x"&&!n,checked:t==="fe",onCheckedChange:()=>r("fe"),className:"tw:gap-2",children:[e.jsx(z.SquareSigma,{}),e.jsx("span",{children:a["%footnoteEditor_noteType_endNote_label%"]})]})]})]})}const qo=Object.freeze(["%markerMenu_deprecated_label%","%markerMenu_disallowed_label%","%markerMenu_noResults%","%markerMenu_searchPlaceholder%","%markerMenu_searchPlaceholder_character%","%markerMenu_searchPlaceholder_insert%","%markerMenu_searchPlaceholder_paragraph%"]);function tc({icon:t,className:r}){const a=t??z.Ban;return e.jsx(a,{className:r,size:16})}function ec({state:t}){return e.jsx("div",{"data-slot":"marker-selection-state",className:"tw:flex tw:w-4 tw:min-w-4 tw:items-center tw:justify-center",children:t!=="none"&&e.jsx(z.Check,{size:16})})}function Ga({item:t,localizedStrings:r}){return e.jsxs(o.CommandItem,{className:"tw:flex tw:gap-2 tw:hover:bg-accent",disabled:t.isDisallowed||t.isDeprecated||t.isDisabled,"aria-checked":t.selectionState===void 0?void 0:{all:!0,partial:"mixed",none:!1}[t.selectionState],onSelect:t.action,children:[t.selectionState!==void 0&&e.jsx(ec,{state:t.selectionState}),e.jsx("div",{className:"tw:w-8 tw:min-w-8",children:t.marker?e.jsx("span",{className:"tw:font-mono tw:text-xs",children:t.marker}):e.jsx("div",{children:e.jsx(tc,{icon:t.icon})})}),e.jsxs("div",{className:"tw:flex tw:min-w-0 tw:flex-1 tw:items-baseline tw:gap-2",children:[e.jsx("p",{className:"tw:min-w-0 tw:shrink tw:truncate tw:text-sm",title:t.title,children:t.title}),t.subtitle&&e.jsx("p",{className:"tw:min-w-0 tw:shrink-[9999] tw:truncate tw:text-end tw:text-xs tw:text-muted-foreground",title:t.subtitle,children:t.subtitle})]}),(t.isDisallowed||t.isDeprecated)&&e.jsx(o.CommandShortcut,{className:"tw:font-sans",children:t.isDisallowed?r["%markerMenu_disallowed_label%"]:r["%markerMenu_deprecated_label%"]})]})}function Yo({localizedStrings:t,markerMenuItems:r,searchRef:a,searchPlaceholder:n}){const[i,l]=s.useState(""),[c,d]=s.useMemo(()=>{const u=o.stripMarkerNestingPrefix(i.trim().toLowerCase());if(!u){const h=r.filter(g=>!g.isDisallowed);return[h.length>0?h:r,[]]}const w=r.filter(h=>{var m;const g=(m=h.marker)==null?void 0:m.toLowerCase();return h.isDisallowed?g===u:g==null?void 0:g.includes(u)}),p=r.filter(h=>h.title.toLowerCase().includes(u)&&!w.includes(h));return[w,p]},[i,r]);return e.jsxs(o.Command,{className:"tw:p-1",shouldFilter:!1,loop:!0,children:[e.jsx(o.CommandInput,{className:"marker-menu-search",ref:a,value:i,onValueChange:u=>l(u),placeholder:n??t["%markerMenu_searchPlaceholder%"],spaceSelectsHighlightedItem:!0}),e.jsxs(o.CommandList,{children:[e.jsx(o.CommandEmpty,{children:t["%markerMenu_noResults%"]}),e.jsx(o.CommandGroup,{children:c.map(u=>{var w;return e.jsx(Ga,{item:u,localizedStrings:t},`item-${u.marker??((w=u.icon)==null?void 0:w.displayName)}-${u.title.replaceAll(" ","")}`)})}),d.length>0&&e.jsxs(e.Fragment,{children:[c.length>0&&e.jsx(o.CommandSeparator,{alwaysRender:!0}),e.jsx(o.CommandGroup,{children:d.map(u=>{var w;return e.jsx(Ga,{item:u,localizedStrings:t},`item-${u.marker??((w=u.icon)==null?void 0:w.displayName)}-${u.title.replaceAll(" ","")}`)})})]})]})]})}function rc(t,r,a,n){if(!n||n==="p")return[];const i=B.usfmMarkers[n];if(!(i!=null&&i.children))return[];const l=[];return Object.entries(i.children).forEach(([,c])=>{l.push(...c.map(d=>({marker:d,title:a[B.usfmMarkers[d].description]??B.usfmMarkers[d].description,action:()=>{var u;(u=t.current)==null||u.insertMarker(d),r()}})))}),l.sort((c,d)=>(c.marker??c.title).localeCompare(d.marker??d.title))}function Xo(t){return{id:t.marker,label:t.marker,description:t.description,badge:t.kind==="closeTag"?"%markerMenu_endTag_label%":void 0,muted:!t.isBasic}}function ac(t){var a;const r=(a=t.attributes)==null?void 0:a.char;r!=null&&r.style&&(r.style==="ft"&&(r.style="xt"),r.style==="fr"&&(r.style="xo"),r.style==="fq"&&(r.style="xq"))}function oc(t){var a;const r=(a=t.attributes)==null?void 0:a.char;r!=null&&r.style&&(r.style==="xt"&&(r.style="ft"),r.style==="xo"&&(r.style="fr"),r.style==="xq"&&(r.style="fq"))}const nc={type:"USJ",version:"3.1",content:[{type:"para"}]};function ic({classNameForEditor:t,noteOps:r,onChange:a,onClose:n,scrRef:i,noteKey:l,editorOptions:c,defaultMarkerMenuTrigger:d,localizedStrings:u,parentEditorRef:w,markerPalette:p,onNoteEdit:h}){var Et;const g=s.useRef(null),m=s.useRef(null),x=s.useRef(null),y=s.useRef(null);s.useLayoutEffect(()=>{if(!y.current)return;const{width:R}=y.current.getBoundingClientRect();R>0&&(y.current.style.width=`${R}px`)},[]);const[f,N]=s.useState("generated"),[k,C]=s.useState("generated"),[j,L]=s.useState("*"),[S,O]=s.useState("*"),[M,E]=s.useState("f"),[D,Y]=s.useState(!1),[X,A]=s.useState(!0),[_,rt]=s.useState(!1),P=s.useRef(!1),W=s.useRef(""),[q,$]=s.useState(!1),[et,dt]=s.useState(),[ct,Q]=s.useState(),[wt,ft]=s.useState(),[ht,_t]=s.useState(),It=s.useRef(null),St=s.useRef(void 0),oe=s.useRef(0),te=s.useRef(void 0),mt=s.useMemo(()=>({...c,contextMenu:void 0,markerMenuTrigger:d,hasExternalUI:!0,view:{...c.view??Ut.getDefaultViewOptions(),noteMode:"expanded",isNoteShellEditable:!1,showParaMarkerPrefixes:!1}}),[c,d]),vt=s.useMemo(()=>rc(g,()=>$(!1),u,ht),[u,ht]);s.useEffect(()=>{var R;q||(R=g.current)==null||R.focus()},[M,q]);const xt=s.useCallback(()=>{var U,J,V;const R=(U=m.current)==null?void 0:U.querySelector(".editor-input"),K=R==null?void 0:R.querySelector("span.note"),Z=(V=(J=m.current)==null?void 0:J.ownerDocument.getSelection())==null?void 0:V.anchorNode;return!!K&&!!Z&&K.contains(Z)},[]);s.useEffect(()=>{var J,V;let R,K,Z;P.current=!1,te.current=void 0,A(!0);const U=r==null?void 0:r.at(0);if(U&&Ut.isInsertEmbedOpOfType("note",U)){const at=(J=U.insert.note)==null?void 0:J.caller;let nt="custom";at===Ut.GENERATOR_NOTE_CALLER?nt="generated":at===Ut.HIDDEN_NOTE_CALLER?nt="hidden":at&&(L(at),O(at)),N(nt),C(nt),E(((V=U.insert.note)==null?void 0:V.style)??"f"),R=setTimeout(()=>{var ot,gt,bt;(ot=g.current)==null||ot.applyUpdate([U]),(gt=g.current)==null||gt.selectNote(0),(bt=g.current)==null||bt.focus(),K=requestAnimationFrame(()=>{Z=setTimeout(()=>{var yt,Bt;xt()||((yt=g.current)==null||yt.selectNote(0),(Bt=g.current)==null||Bt.focus())},0)})},0)}return()=>{R&&clearTimeout(R),K!==void 0&&cancelAnimationFrame(K),Z!==void 0&&clearTimeout(Z)}},[r,l,xt]);const Yt=s.useCallback((R=!1)=>{var Z,U,J;h==null||h();const K=(U=(Z=g.current)==null?void 0:Z.getNoteOps(0))==null?void 0:U.at(0);K&&Ut.isInsertEmbedOpOfType("note",K)&&(a==null||a([K]),R&&w&&l&&((J=w.current)==null||J.replaceEmbedUpdate(l,[K])))},[l,a,h,w]),ne=s.useCallback((R,K)=>{var J,V,at;const Z=(V=(J=g.current)==null?void 0:J.getNoteOps(0))==null?void 0:V.at(0);if(!Z||!Ut.isInsertEmbedOpOfType("note",Z)||!Z.insert.note)return;let U;R==="custom"?U=K:R==="generated"?U=Ut.GENERATOR_NOTE_CALLER:U=Ut.HIDDEN_NOTE_CALLER,Z.insert.note.caller!==U&&(Z.insert.note.caller=U,(at=g.current)==null||at.applyUpdate([Z,{delete:1}]))},[]),jt=s.useCallback(()=>{var R;St.current||(R=g.current)==null||R.commitPendingMarkerEdits(),Yt(!0),n()},[n,Yt]),Ct=s.useRef(jt);s.useLayoutEffect(()=>{Ct.current=jt});const Xt=s.useRef({book:i.book,chapterNum:i.chapterNum});s.useLayoutEffect(()=>{(Xt.current.book!==i.book||Xt.current.chapterNum!==i.chapterNum)&&(Xt.current={book:i.book,chapterNum:i.chapterNum},Ct.current())},[i.book,i.chapterNum]);const le=()=>{var K;const R=(K=m.current)==null?void 0:K.getElementsByClassName("editor-input")[0];R!=null&&R.textContent&&navigator.clipboard.writeText(R.textContent)},ie=s.useCallback((R,K)=>{h==null||h(),N(R),L(K),ne(R,K)},[ne,h]),ge=R=>{var Z,U,J,V,at;E(R);const K=(U=(Z=g.current)==null?void 0:Z.getNoteOps(0))==null?void 0:U.at(0);if(K&&Ut.isInsertEmbedOpOfType("note",K)){K.insert.note&&(K.insert.note.style=R);const nt=(V=(J=K.insert.note)==null?void 0:J.contents)==null?void 0:V.ops;M!=="x"&&R==="x"?nt==null||nt.forEach(ot=>ac(ot)):M==="x"&&R!=="x"&&(nt==null||nt.forEach(ot=>oc(ot))),(at=g.current)==null||at.applyUpdate([K,{delete:1}])}},Zt=R=>{_t(R.contextMarker),rt(R.canRedo)},$t=s.useCallback(R=>{var Z,U,J,V,at;const K=(U=(Z=g.current)==null?void 0:Z.getNoteOps(0))==null?void 0:U.at(0);if(K&&Ut.isInsertEmbedOpOfType("note",K)){R.content.length>1&&setTimeout(()=>{var gt;(gt=g.current)==null||gt.applyUpdate([{retain:2},{delete:1}])},0);const nt=(J=K.insert.note)==null?void 0:J.style,ot=(at=(V=K.insert.note)==null?void 0:V.contents)==null?void 0:at.ops;if(nt||Y(!1),Y(nt==="x"?!!(ot!=null&&ot.every(gt=>{var yt,Bt;if(!((yt=gt.attributes)!=null&&yt.char))return!0;const bt=((Bt=gt.attributes)==null?void 0:Bt.char).style;return bt==="xt"||bt==="xo"||bt==="xq"})):!!(ot!=null&&ot.every(gt=>{var yt,Bt;if(!((yt=gt.attributes)!=null&&yt.char))return!0;const bt=((Bt=gt.attributes)==null?void 0:Bt.char).style;return bt==="ft"||bt==="fr"||bt==="fq"}))),!P.current){P.current=!0,W.current=JSON.stringify(K),A(!0);return}A(JSON.stringify(K)===W.current),Yt()}else Y(!1),A(!0)},[Yt]),Vt=s.useCallback(()=>{const R=window.getSelection();if(x.current&&vt.length&&R&&R.rangeCount>0){const K=R.getRangeAt(0).getBoundingClientRect(),Z=x.current.getBoundingClientRect();dt(K.left-Z.left),Q(K.top-Z.top),ft(K.height),$(!0)}},[vt,x]),Ft=s.useRef(()=>{}),fe=s.useCallback((R,K,Z)=>{const{anchorRect:U}=R;if(!p||!U)return;const{passive:J}=Z;o.runMarkerPaletteSession({items:K,passive:J,sessionCounterRef:oe,setSession:V=>{St.current=V},clearSessionIfCurrent:V=>o.clearPaletteSessionIfCurrent(St,V),runSessionKey:V=>Ft.current(V),show:V=>p.show(K.map(Xo),U,J,V),restoreSelectionIfLost:()=>{var V,at,nt;if(!((V=g.current)!=null&&V.getSelection())){const ot=te.current;ot?(at=g.current)==null||at.setSelection(ot):(nt=g.current)==null||nt.selectNote(0)}},focusEditor:()=>{var V;return(V=g.current)==null?void 0:V.focus()},applyItem:V=>{var at;return(at=g.current)==null?void 0:at.applyMarkerMenuSelection(V,{trigger:"backslash",literalPrefixLanded:!1})},onShowError:V=>{(!B.isPlatformError(V)||V.code!==B.ABORTED)&&console.warn(`FootnoteEditor: the marker palette did not open: ${B.getErrorMessage(V)}`)}})},[p]),I=s.useCallback(()=>{var Z;const R=(Z=g.current)==null?void 0:Z.getMarkerMenuContext();if(!R)return!1;const K=Ut.getMarkerMenuItems(mt.styleInfo??Ut.defaultStyleInfo,R);return K.length===0?!1:(fe(R,K,{passive:!R.hasTextSelection}),!0)},[fe,mt.styleInfo]),Nt=s.useCallback(R=>{const K=St.current;if(!K||!p)return;o.handleMarkerPaletteSessionKeyDown(R,K,{update:U=>p.update(U),commit:()=>p.commit(),dismiss:()=>p.dismiss(),commitTyped:U=>{var J;return(J=g.current)==null?void 0:J.commitTypedMarker(U)},commitTypedAndReopen:U=>{var J;(J=g.current)==null||J.commitTypedMarker(U,{trailingSpace:!1}),I()},commitTypedCloser:U=>{var J;return(J=g.current)==null?void 0:J.commitTypedCloser(U)},commitItem:U=>{var V;const J=K.items.find(at=>at.marker===U);J&&((V=g.current)==null||V.applyMarkerMenuSelection(J,{trigger:"backslash",literalPrefixLanded:!1}))}})==="ended"&&o.clearPaletteSessionIfCurrent(St,K.token)},[p,I]);s.useEffect(()=>{Ft.current=Nt},[Nt]),s.useEffect(()=>{const R=K=>{var J,V;const Z=(J=m.current)==null?void 0:J.querySelector(".editor-input");if(!Z||K.target!==Z)return;const U=(V=g.current)==null?void 0:V.getSelection();U&&(te.current=U)};return document.addEventListener("focusout",R),()=>document.removeEventListener("focusout",R)},[]),s.useEffect(()=>{const R=()=>{q&&$(!1)};return window.addEventListener("click",R),()=>{window.removeEventListener("click",R)}},[q]),s.useEffect(()=>{var R;q&&((R=It.current)==null||R.focus())},[q]),s.useEffect(()=>{var Z;const R=()=>{var U;return((U=m.current)==null?void 0:U.querySelector(".editor-input"))??void 0};if(((Z=mt.view)==null?void 0:Z.markerMode)==="editable"){const U=V=>{var ot,gt,bt,yt;if(o.isImeCompositionKeyEvent(V))return;const at=R();if(!at||document.activeElement!==at)return;if(St.current&&p){Ft.current(V);return}if(V.key==="Enter"&&!xt()){V.preventDefault(),V.stopPropagation(),(ot=g.current)==null||ot.selectNote(0),(gt=g.current)==null||gt.focus();return}if(p&&V.key===d){if(!xt()){V.preventDefault(),V.stopPropagation(),(bt=g.current)==null||bt.selectNote(0),(yt=g.current)==null||yt.focus();return}I()&&(V.preventDefault(),V.stopPropagation())}},J=()=>{var at,nt;const V=R();!V||document.activeElement!==V||xt()||((at=g.current)==null||at.selectNote(0),(nt=g.current)==null||nt.focus())};return document.addEventListener("keydown",U,{capture:!0}),document.addEventListener("paste",J,{capture:!0}),()=>{document.removeEventListener("keydown",U,{capture:!0}),document.removeEventListener("paste",J,{capture:!0})}}const K=U=>{const J=R();!q&&J&&document.activeElement===J&&U.key===d?(U.preventDefault(),Vt()):q&&U.key==="Escape"&&(U.preventDefault(),$(!1))};return document.addEventListener("keydown",K),()=>{document.removeEventListener("keydown",K)}},[q,Vt,d,(Et=mt.view)==null?void 0:Et.markerMode,mt.styleInfo,p,I,xt]),s.useEffect(()=>{const R=()=>{var U,J,V;const K=((U=m.current)==null?void 0:U.querySelector(".editor-input"))??void 0;if(!K||document.activeElement!==K)return;const Z=document.getSelection();Z&&!Z.isCollapsed||xt()||((J=g.current)==null||J.selectNote(0),(V=g.current)==null||V.focus())};return document.addEventListener("pointerup",R),document.addEventListener("selectionchange",R),()=>{document.removeEventListener("pointerup",R),document.removeEventListener("selectionchange",R)}},[xt]);const At=u["%footnoteEditor_copyButton_tooltip%"];return e.jsxs(e.Fragment,{children:[e.jsxs("div",{ref:y,className:"footnote-editor tw:grid tw:gap-[12px]",children:[e.jsxs("div",{className:"tw:flex",children:[e.jsxs("div",{className:"tw:flex tw:gap-4",children:[e.jsx(Qs,{isTypeSwitchable:D,noteType:M,handleNoteTypeChange:ge,localizedStrings:u}),e.jsx(Ws,{callerType:f,customCaller:j,updateCaller:ie,localizedStrings:u})]}),e.jsx("div",{className:"tw:flex tw:w-full tw:justify-end",children:e.jsxs(o.ButtonGroup,{children:[e.jsx(Uo,{onUndoClick:()=>{var R;return(R=g.current)==null?void 0:R.undo()},onRedoClick:()=>{var R;return(R=g.current)==null?void 0:R.redo()},canUndo:!X,canRedo:_,localizedStrings:u}),e.jsx(wa,{onCancelClick:n,onAcceptClick:jt,canAccept:!X||k!==f||f==="custom"&&j!==S,localizedStrings:u,acceptLabel:u["%footnoteEditor_saveButton_tooltip%"]})]})})]}),e.jsxs("div",{ref:m,className:"tw:relative tw:rounded-[6px] tw:border-2 tw:border-ring",children:[e.jsx("div",{className:t,children:e.jsx(Ho,{editorRef:g,canUndo:!X,canRedo:_,children:e.jsx(Ut.Editorial,{options:mt,onStateChange:Zt,onUsjChange:$t,defaultUsj:nc,onScrRefChange:()=>{},scrRef:i,ref:g})})}),e.jsx("div",{className:"tw:absolute tw:bottom-0 tw:right-0",children:e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.Button,{"aria-label":At,onClick:le,className:"tw:h-6 tw:w-6",variant:"ghost",size:"icon",children:e.jsx(z.Copy,{})})}),e.jsx(o.TooltipContent,{children:e.jsx("p",{children:At})})]})})})]})]}),e.jsx("div",{className:"tw:absolute",ref:x,style:{top:0,left:0,height:0,width:0}}),e.jsxs(o.Popover,{open:q,children:[e.jsx(o.PopoverAnchor,{className:"tw:absolute",style:{top:ct,left:et,height:wt,width:0,pointerEvents:"none"}}),e.jsx(o.PopoverContent,{className:"tw:w-[500px] tw:p-0",onClick:R=>{R.preventDefault(),R.stopPropagation()},children:e.jsx(Yo,{markerMenuItems:vt,localizedStrings:u,searchRef:It})})]})]})}const sc=Object.freeze([...qo,...Object.entries(B.usfmMarkers).map(([,t])=>t.description).filter(t=>!!t),"%footnoteEditor_callerDropdown_item_custom%","%footnoteEditor_callerDropdown_item_generated%","%footnoteEditor_callerDropdown_item_hidden%","%footnoteEditor_callerDropdown_label%","%footnoteEditor_callerDropdown_tooltip%","%footnoteEditor_copyButton_tooltip%","%footnoteEditor_noteType_crossReference_label%","%footnoteEditor_noteType_endNote_label%","%footnoteEditor_noteType_footnote_label%","%footnoteEditor_noteType_tooltip%","%footnoteEditor_noteTypeDropdown_label%","%footnoteEditor_saveButton_tooltip%",...Ko,...da]);function cc(t,r,a=!0,n=void 0){if(!r||r.length===0)return;const i=[],l=[];let c=[];return r.forEach(d=>{typeof d!="string"&&d.marker==="fp"?(c.length>0&&l.push(c),c=[d]):c.push(d)}),c.length>0&&l.push(c),l.map((d,u)=>{const w=u===l.length-1;return e.jsxs("p",{children:[pa(t,d,a,!0,i),w&&n]},`para-${u}`)})}function pa(t,r,a=!0,n=!0,i=[]){if(!(!r||r.length===0))return r.map((l,c)=>{const d=`part-${c}`;if(typeof l=="string"){if(n){const u=o.cn(`usfm_${t}`);return e.jsx("span",{className:u,children:l},d)}return e.jsxs("span",{className:"tw:inline-flex tw:items-center tw:gap-1 tw:underline tw:decoration-destructive",children:[e.jsx(z.AlertCircle,{className:"tw:h-4 tw:w-4 tw:fill-destructive"}),e.jsx("span",{children:l}),e.jsx(z.AlertCircle,{className:"tw:h-4 tw:w-4 tw:fill-destructive"})]},d)}return lc(l,d,a,[...i,t??"unknown"])})}function lc(t,r,a,n=[]){const{marker:i}=t;return e.jsxs("span",{children:[i?a&&e.jsx("span",{className:"marker",children:`\\${i} `}):e.jsx(z.AlertCircle,{className:"tw:text-error tw:mr-1 tw:inline-block tw:h-4 tw:w-4","aria-label":"Missing marker"}),pa(i,t.content,a,!0,[...n,i??"unknown"])]},r)}function Wo({footnote:t,layout:r="horizontal",formatCaller:a,showMarkers:n=!0}){const i=a?a(t.caller):t.caller,l=i!==t.caller;let c,d=t.content;Array.isArray(t.content)&&t.content.length>0&&typeof t.content[0]!="string"&&(t.content[0].marker==="fr"||t.content[0].marker==="xo")&&([c,...d]=t.content);const u=n?e.jsx("span",{className:"marker",children:`\\${t.marker}`}):void 0,w=n?e.jsx("span",{className:"marker",children:` \\${t.marker}*`}):void 0,p=i&&e.jsx("span",{className:o.cn("note-caller tw:inline-block",{formatted:l}),children:i}),h=t.category&&e.jsxs("span",{className:"note-category tw:inline-block",children:[n&&e.jsx("span",{className:"marker",children:"\\cat "}),t.category,n&&e.jsx("span",{className:"marker",children:"\\cat*"})]}),g=c&&e.jsxs(e.Fragment,{children:[pa(t.marker,[c],n,!1)," "]}),m=!!u,x=!!p,y=!!h,f=r==="horizontal"?"horizontal":"vertical",N=n?"marker-visible":"",k=r==="horizontal"?"tw:col-span-1":"tw:col-span-2 tw:col-start-1 tw:row-start-2",C=o.cn(f,N);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:o.cn("textual-note-header tw:col-span-1 tw:w-fit tw:text-nowrap",C),children:[u,m&&(x||y)&&" ",p,x&&y&&" ",h]}),e.jsx("div",{className:o.cn("textual-note-header tw:col-span-1 tw:w-fit tw:text-nowrap",C),children:g}),e.jsx("div",{className:o.cn("textual-note-body tw:flex tw:flex-col tw:gap-1",k,C),children:d&&d.length>0&&e.jsx(e.Fragment,{children:cc(t.marker,d,n,w)})})]})}function dc({className:t,classNameForItems:r,footnotes:a,layout:n="horizontal",listId:i,selectedFootnote:l,selectionRequest:c,showMarkers:d=!0,suppressFormatting:u=!1,formatCaller:w,onFootnoteSelected:p}){const h=w??B.getFormatCallerFunction(a,void 0),g=(j,L)=>{p==null||p(j,L,i)},m=l?a.findIndex(j=>j===l):-1,[x,y]=s.useState(m),f=(j,L,S)=>{if(a.length)switch(j.key){case"Enter":case" ":j.preventDefault(),p==null||p(L,S,i);break}},N=j=>{if(a.length)switch(j.key){case"ArrowDown":j.preventDefault(),y(L=>Math.min(L+1,a.length-1));break;case"ArrowUp":j.preventDefault(),y(L=>Math.max(L-1,0));break}},k=s.useRef([]);s.useEffect(()=>{var j;x>=0&&xj===l):-1;return s.useEffect(()=>{var j;C<0||C>=k.current.length||(j=k.current[C])==null||j.scrollIntoView({block:"nearest"})},[C,c]),e.jsx("div",{role:"listbox","aria-label":"Footnotes",tabIndex:x<0?0:-1,className:o.cn("tw:h-full tw:overflow-y-auto",t),onKeyDown:N,children:e.jsx("ul",{className:o.cn("tw:p-0.5 tw:pt-1","tw:grid",n==="horizontal"?"tw:grid-cols-[min-content_min-content_1fr]":"tw:grid-cols-[min-content_1fr]",!u&&"formatted-font"),children:a.map((j,L)=>{const S=j===l,O=`${i}-${L}`;return e.jsxs(s.Fragment,{children:[e.jsx("li",{ref:M=>{k.current[L]=M},role:"option","aria-selected":S,"data-marker":j.marker,"data-state":S?"selected":void 0,tabIndex:L===x?0:-1,className:o.cn("tw:gap-x-3 tw:gap-y-1 tw:p-2 tw:data-[state=selected]:bg-muted",p&&"tw:hover:bg-muted/50","tw:w-full tw:rounded-sm tw:border-0 tw:bg-transparent tw:shadow-none","tw:focus:outline-hidden tw:focus-visible:outline-hidden","tw:focus-visible:ring-offset-0.5 tw:focus-visible:relative tw:focus-visible:z-10 tw:focus-visible:ring-2 tw:focus-visible:ring-ring","tw:grid tw:grid-flow-col tw:grid-cols-subgrid",n==="horizontal"?"tw:col-span-3":"tw:col-span-2 tw:row-span-2",r),onClick:()=>g(j,L),onKeyDown:M=>f(M,j,L),children:e.jsx(Wo,{footnote:j,layout:n,formatCaller:()=>h(j.caller,L),showMarkers:d})}),La&&r.push(t.substring(a,i.index)),r.push(e.jsx("strong",{children:i[1]},i.index)),a=n.lastIndex;return a0?r:[t]}function uc({occurrenceData:t,setScriptureReference:r,localizedStrings:a,classNameForText:n}){const i=a["%webView_inventory_occurrences_table_header_reference%"],l=a["%webView_inventory_occurrences_table_header_occurrence%"],c=s.useMemo(()=>{const d=[],u=new Set;return t.forEach(w=>{const p=`${w.reference.book}:${w.reference.chapterNum}:${w.reference.verseNum}:${w.text}`;u.has(p)||(u.add(p),d.push(w))}),d},[t]);return e.jsxs(o.Table,{stickyHeader:!0,children:[e.jsx(o.TableHeader,{stickyHeader:!0,children:e.jsxs(o.TableRow,{children:[e.jsx(o.TableHead,{children:i}),e.jsx(o.TableHead,{children:l})]})}),e.jsx(o.TableBody,{children:c.length>0&&c.map(d=>e.jsxs(o.TableRow,{onClick:()=>{r(d.reference)},children:[e.jsx(o.TableCell,{children:B.formatScrRef(d.reference,"English")}),e.jsx(o.TableCell,{className:n,children:wc(d.text)})]},`${d.reference.book} ${d.reference.chapterNum}:${d.reference.verseNum}-${d.text}`))})]})}function ha({className:t,...r}){return e.jsx(G.Checkbox.Root,{"data-slot":"checkbox",className:o.cn("pr-twp tw:peer tw:relative tw:flex tw:size-4 tw:shrink-0 tw:items-center tw:justify-center tw:rounded-[4px] tw:border tw:border-input tw:transition-colors tw:outline-none tw:group-has-disabled/field:opacity-50 tw:after:absolute tw:after:-inset-x-3 tw:after:-inset-y-2 tw:focus-visible:border-ring tw:focus-visible:ring-3 tw:focus-visible:ring-ring/50 tw:disabled:cursor-not-allowed tw:disabled:opacity-50 tw:aria-invalid:border-destructive tw:aria-invalid:ring-3 tw:aria-invalid:ring-destructive/20 tw:aria-invalid:aria-checked:border-primary tw:dark:bg-input/30 tw:dark:aria-invalid:border-destructive/50 tw:dark:aria-invalid:ring-destructive/40 tw:data-checked:border-primary tw:data-checked:bg-primary tw:data-checked:text-primary-foreground tw:dark:data-checked:bg-primary",t),...r,children:e.jsx(G.Checkbox.Indicator,{"data-slot":"checkbox-indicator",className:"tw:grid tw:place-content-center tw:text-current tw:transition-none tw:[&>svg]:size-3.5",children:e.jsx(Dt.IconCheck,{})})})}const pc=t=>{if(t==="asc")return e.jsx(z.ArrowUpIcon,{className:"tw:h-4 tw:w-4"});if(t==="desc")return e.jsx(z.ArrowDownIcon,{className:"tw:h-4 tw:w-4"})},Qe=(t,r,a)=>e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsxs(o.TooltipTrigger,{className:o.cn("tw:flex tw:w-full tw:justify-start",a),variant:"ghost",onClick:()=>t.toggleSorting(void 0),children:[e.jsx("span",{className:"tw:w-6 tw:max-w-fit tw:flex-1 tw:overflow-hidden tw:text-ellipsis",children:r}),pc(t.getIsSorted())]}),e.jsx(o.TooltipContent,{side:"bottom",children:r})]})}),hc=t=>({accessorKey:"item",accessorFn:r=>r.items[0],header:({column:r})=>Qe(r,t)}),gc=(t,r)=>({accessorKey:`item${r}`,accessorFn:a=>a.items[r],header:({column:a})=>Qe(a,t)}),fc=t=>({accessorKey:"count",header:({column:r})=>Qe(r,t,"tw:justify-end"),cell:({row:r})=>e.jsx("div",{className:"tw:flex tw:justify-end tw:tabular-nums",children:r.getValue("count")})}),Vr=(t,r,a,n,i,l)=>{let c=[...a];t.forEach(u=>{r==="approved"?c.includes(u)||c.push(u):c=c.filter(w=>w!==u)}),n(c);let d=[...i];t.forEach(u=>{r==="unapproved"?d.includes(u)||d.push(u):d=d.filter(w=>w!==u)}),l(d)},mc=(t,r,a,n,i)=>({accessorKey:"status",header:({column:l})=>Qe(l,t,"tw:justify-center"),cell:({row:l})=>{const c=l.getValue("status"),d=l.getValue("item");return e.jsx("div",{className:"tw:flex tw:justify-center",children:e.jsxs(o.ToggleGroup,{value:c,variant:"outline",type:"single",className:"tw:gap-0",children:[e.jsx(o.ToggleGroupItem,{onClick:u=>{u.stopPropagation(),Vr([d],"approved",r,a,n,i)},value:"approved",className:"tw:rounded-e-none tw:border-e-0",children:e.jsx(z.CircleCheckIcon,{})}),e.jsx(o.ToggleGroupItem,{onClick:u=>{u.stopPropagation(),Vr([d],"unapproved",r,a,n,i)},value:"unapproved",className:"tw:rounded-none",children:e.jsx(z.CircleXIcon,{})}),e.jsx(o.ToggleGroupItem,{onClick:u=>{u.stopPropagation(),Vr([d],"unknown",r,a,n,i)},value:"unknown",className:"tw:rounded-s-none tw:border-s-0",children:e.jsx(z.CircleHelpIcon,{})})]})})}}),vc=t=>t.split(/(?:\r?\n|\r)|(?=(?:\\(?:v|c|id)))/g),bc=t=>{const r=/^\\[vc]\s+(\d+)/,a=t.match(r);if(a)return+a[1]},xc=t=>{const r=t.match(/^\\id\s+([A-Za-z]+)/);return r?r[1]:""},Zo=(t,r,a)=>a.includes(t)?"unapproved":r.includes(t)?"approved":"unknown",yc=Object.freeze(["%webView_inventory_all%","%webView_inventory_approved%","%webView_inventory_unapproved%","%webView_inventory_unknown%","%webView_inventory_scope_currentBook%","%webView_inventory_scope_chapter%","%webView_inventory_scope_verse%","%webView_inventory_filter_text%","%webView_inventory_show_additional_items%","%webView_inventory_occurrences_table_header_reference%","%webView_inventory_occurrences_table_header_occurrence%","%webView_inventory_no_results%"]),kc=(t,r,a)=>{let n=t;return r!=="all"&&(n=n.filter(i=>r==="approved"&&i.status==="approved"||r==="unapproved"&&i.status==="unapproved"||r==="unknown"&&i.status==="unknown")),a!==""&&(n=n.filter(i=>i.items[0].includes(a))),n},_c=(t,r,a)=>t.map(n=>{const i=B.isString(n.key)?n.key:n.key[0];return{items:B.isString(n.key)?[n.key]:n.key,count:n.count,status:n.status||Zo(i,r,a),occurrences:n.occurrences||[]}}),we=(t,r)=>t[r]??r;function jc({inventoryItems:t,setVerseRef:r,localizedStrings:a,additionalItemsLabels:n,approvedItems:i,unapprovedItems:l,scope:c,onScopeChange:d,columns:u,id:w,areInventoryItemsLoading:p=!1,classNameForVerseText:h,onItemSelected:g}){const m=we(a,"%webView_inventory_all%"),x=we(a,"%webView_inventory_approved%"),y=we(a,"%webView_inventory_unapproved%"),f=we(a,"%webView_inventory_unknown%"),N=we(a,"%webView_inventory_scope_currentBook%"),k=we(a,"%webView_inventory_scope_chapter%"),C=we(a,"%webView_inventory_scope_verse%"),j=we(a,"%webView_inventory_filter_text%"),L=we(a,"%webView_inventory_show_additional_items%"),S=we(a,"%webView_inventory_no_results%"),[O,M]=s.useState(!1),[E,D]=s.useState("all"),[Y,X]=s.useState(""),[A,_]=s.useState([]),rt=s.useMemo(()=>{const Q=t??[];return Q.length===0?[]:_c(Q,i,l)},[t,i,l]),P=s.useMemo(()=>{if(O)return rt;const Q=[];return rt.forEach(wt=>{const ft=wt.items[0],ht=Q.find(_t=>_t.items[0]===ft);ht?(ht.count+=wt.count,ht.occurrences=ht.occurrences.concat(wt.occurrences)):Q.push({items:[ft],count:wt.count,occurrences:wt.occurrences,status:wt.status})}),Q},[O,rt]),W=s.useMemo(()=>P.length===0?[]:kc(P,E,Y),[P,E,Y]),q=s.useMemo(()=>{var ft,ht;if(!O)return u;const Q=(ft=n==null?void 0:n.tableHeaders)==null?void 0:ft.length;if(!Q)return u;const wt=[];for(let _t=0;_t{W.length===0?_([]):W.length===1&&_(W[0].items)},[W]);const $=(Q,wt)=>{wt.setRowSelection(()=>{const ht={};return ht[Q.index]=!0,ht});const ft=Q.original.items;_(ft),g&&ft.length>0&&g(ft[0])},et=Q=>{if(Q==="book"||Q==="chapter"||Q==="verse")d(Q);else throw new Error(`Invalid scope value: ${Q}`)},dt=Q=>{if(Q==="all"||Q==="approved"||Q==="unapproved"||Q==="unknown")D(Q);else throw new Error(`Invalid status filter value: ${Q}`)},ct=s.useMemo(()=>{if(P.length===0||A.length===0)return[];const Q=P.filter(wt=>B.deepEqual(O?wt.items:[wt.items[0]],A));if(Q.length>1)throw new Error("Selected item is not unique");return Q.length===0?[]:Q[0].occurrences},[A,O,P]);return e.jsx("div",{id:w,className:"pr-twp tw:h-full tw:overflow-auto",children:e.jsxs("div",{className:"tw:flex tw:h-full tw:w-full tw:min-w-min tw:flex-col",children:[e.jsxs("div",{className:"tw:flex tw:items-stretch",style:{contain:"inline-size"},children:[e.jsxs(Te,{onValueChange:Q=>dt(Q),defaultValue:E,children:[e.jsx(Re,{className:"tw:m-1 tw:w-auto tw:flex-1",children:e.jsx(Se,{placeholder:"Select filter"})}),e.jsxs(Me,{children:[e.jsx(ae,{value:"all",children:m}),e.jsx(ae,{value:"approved",children:x}),e.jsx(ae,{value:"unapproved",children:y}),e.jsx(ae,{value:"unknown",children:f})]})]}),e.jsxs(Te,{onValueChange:Q=>et(Q),defaultValue:c,children:[e.jsx(Re,{className:"tw:m-1 tw:w-auto tw:flex-1",children:e.jsx(Se,{placeholder:"Select scope"})}),e.jsxs(Me,{children:[e.jsx(ae,{value:"book",children:N}),e.jsx(ae,{value:"chapter",children:k}),e.jsx(ae,{value:"verse",children:C})]})]}),e.jsx(o.Input,{className:"tw:m-1 tw:flex-1 tw:rounded-md tw:border",placeholder:j,value:Y,onChange:Q=>{X(Q.target.value)}}),n&&e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsxs("div",{className:"tw:m-1 tw:flex tw:w-fit tw:min-w-[26px] tw:items-center tw:rounded-md tw:border",children:[e.jsx(ha,{className:"tw:m-1 tw:shrink-0",checked:O,onCheckedChange:Q=>{M(Q)}}),e.jsx(o.Label,{className:"tw:m-1 tw:truncate",children:(n==null?void 0:n.checkboxText)??L})]})}),e.jsx(o.TooltipContent,{children:(n==null?void 0:n.checkboxText)??L})]})})]}),e.jsx("div",{className:"tw:m-1 tw:flex-1 tw:overflow-auto tw:rounded-md tw:border",children:e.jsx($o,{columns:q,data:W,onRowClickHandler:$,stickyHeader:!0,isLoading:p,noResultsMessage:S})}),ct.length>0&&e.jsx("div",{className:"tw:m-1 tw:flex-1 tw:overflow-auto tw:rounded-md tw:border",children:e.jsx(uc,{classNameForText:h,occurrenceData:ct,setScriptureReference:r,localizedStrings:a})})]})})}const Cc="16rem",Nc="3rem",Jo=s.createContext(void 0);function tr(){const t=s.useContext(Jo);if(!t)throw new Error("useSidebar must be used within a SidebarProvider.");return t}function Qo({defaultOpen:t=!0,open:r,onOpenChange:a,className:n,style:i,children:l,side:c="primary",...d}){const[u,w]=s.useState(t),p=r??u,h=s.useCallback(C=>{const j=typeof C=="function"?C(p):C;a?a(j):w(j)},[a,p]),g=s.useCallback(()=>h(C=>!C),[h]),m=p?"expanded":"collapsed",f=o.readDirection()==="ltr"?c:c==="primary"?"secondary":"primary",N=s.useMemo(()=>({state:m,open:p,setOpen:h,toggleSidebar:g,side:f}),[m,p,h,g,f]),k={"--sidebar-width":Cc,"--sidebar-width-icon":Nc,...i};return e.jsx(Jo.Provider,{value:N,children:e.jsx("div",{"data-slot":"sidebar-wrapper",style:k,className:o.cn("pr-twp tw:group/sidebar-wrapper tw:flex tw:w-full tw:has-data-[variant=inset]:bg-sidebar",n),...d,children:l})})}function tn({variant:t="sidebar",collapsible:r="offcanvas",className:a,children:n,...i}){const l=tr();return r==="none"?e.jsx("div",{"data-slot":"sidebar",className:o.cn("tw:flex tw:h-full tw:w-(--sidebar-width) tw:flex-col tw:bg-sidebar tw:text-sidebar-foreground",a),...i,children:n}):e.jsxs("div",{className:"tw:group tw:peer tw:hidden tw:text-sidebar-foreground tw:md:block","data-state":l.state,"data-collapsible":l.state==="collapsed"?r:"","data-variant":t,"data-side":l.side,"data-slot":"sidebar",children:[e.jsx("div",{"data-slot":"sidebar-gap",className:o.cn("tw:relative tw:w-(--sidebar-width) tw:bg-transparent tw:transition-[width] tw:duration-200 tw:ease-linear","tw:group-data-[collapsible=offcanvas]:w-0","tw:group-data-[side=secondary]:rotate-180",t==="floating"||t==="inset"?"tw:group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]":"tw:group-data-[collapsible=icon]:w-(--sidebar-width-icon)")}),e.jsx("div",{"data-slot":"sidebar-container","data-side":l.side,className:o.cn("tw:absolute tw:inset-y-0 tw:z-10 tw:hidden tw:h-svh tw:w-(--sidebar-width) tw:transition-[left,right,width] tw:duration-200 tw:ease-linear tw:md:flex",l.side==="primary"?"tw:left-0 tw:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]":"tw:right-0 tw:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",t==="floating"||t==="inset"?"tw:p-2 tw:group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]":"tw:group-data-[collapsible=icon]:w-(--sidebar-width-icon) tw:group-data-[side=primary]:border-e tw:group-data-[side=secondary]:border-s",a),...i,children:e.jsx("div",{"data-sidebar":"sidebar","data-slot":"sidebar-inner",className:"tw:flex tw:size-full tw:flex-col tw:bg-sidebar tw:group-data-[variant=floating]:rounded-lg tw:group-data-[variant=floating]:shadow-sm tw:group-data-[variant=floating]:ring-1 tw:group-data-[variant=floating]:ring-sidebar-border",children:n})})]})}function Ec({className:t,onClick:r,...a}){const{toggleSidebar:n,side:i}=tr();return e.jsxs(o.Button,{"data-sidebar":"trigger","data-slot":"sidebar-trigger",variant:"ghost",size:"icon-sm",className:o.cn(t),onClick:l=>{r==null||r(l),n()},...a,children:[i==="primary"?e.jsx(Dt.IconLayoutSidebar,{}):e.jsx(Dt.IconLayoutSidebarRight,{}),e.jsx("span",{className:"tw:sr-only",children:"Toggle Sidebar"})]})}function Tc({className:t,...r}){const{toggleSidebar:a}=tr();return e.jsx("button",{type:"button","data-sidebar":"rail","data-slot":"sidebar-rail","aria-label":"Toggle Sidebar",tabIndex:-1,onClick:a,title:"Toggle Sidebar",className:o.cn("tw:absolute tw:inset-y-0 tw:z-20 tw:hidden tw:w-4 tw:transition-all tw:ease-linear tw:group-data-[side=primary]:-right-4 tw:group-data-[side=secondary]:left-0 tw:after:absolute tw:after:inset-y-0 tw:after:start-1/2 tw:after:w-[2px] tw:hover:after:bg-sidebar-border tw:sm:flex tw:ltr:-translate-x-1/2 tw:rtl:translate-x-1/2","tw:in-data-[side=primary]:cursor-w-resize tw:rtl:in-data-[side=primary]:cursor-e-resize tw:in-data-[side=secondary]:cursor-e-resize tw:rtl:in-data-[side=secondary]:cursor-w-resize","tw:[[data-side=primary][data-state=collapsed]_&]:cursor-e-resize tw:rtl:[[data-side=primary][data-state=collapsed]_&]:cursor-w-resize tw:[[data-side=secondary][data-state=collapsed]_&]:cursor-w-resize tw:rtl:[[data-side=secondary][data-state=collapsed]_&]:cursor-e-resize","tw:group-data-[collapsible=offcanvas]:translate-x-0 tw:group-data-[collapsible=offcanvas]:after:start-full tw:hover:group-data-[collapsible=offcanvas]:bg-sidebar","tw:[[data-side=primary][data-collapsible=offcanvas]_&]:-end-2","tw:[[data-side=secondary][data-collapsible=offcanvas]_&]:-start-2",t),...r})}function en({className:t,...r}){return e.jsx("main",{"data-slot":"sidebar-inset",className:o.cn("tw:relative tw:flex tw:w-full tw:flex-1 tw:flex-col tw:bg-background tw:md:peer-data-[variant=inset]:m-2 tw:md:peer-data-[variant=inset]:ms-0 tw:md:peer-data-[variant=inset]:rounded-xl tw:md:peer-data-[variant=inset]:shadow-sm tw:md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ms-2",t),...r})}function Sc({className:t,...r}){return e.jsx(o.Input,{"data-slot":"sidebar-input","data-sidebar":"input",className:o.cn("tw:h-8 tw:w-full tw:bg-background tw:shadow-none",t),...r})}function Rc({className:t,...r}){return e.jsx("div",{"data-slot":"sidebar-header","data-sidebar":"header",className:o.cn("tw:flex tw:flex-col tw:gap-2 tw:p-2",t),...r})}function Mc({className:t,...r}){return e.jsx("div",{"data-slot":"sidebar-footer","data-sidebar":"footer",className:o.cn("tw:flex tw:flex-col tw:gap-2 tw:p-2",t),...r})}function Dc({className:t,...r}){return e.jsx(o.Separator,{"data-slot":"sidebar-separator","data-sidebar":"separator",className:o.cn("tw:mx-2 tw:w-auto tw:bg-sidebar-border",t),...r})}function rn({className:t,...r}){return e.jsx("div",{"data-slot":"sidebar-content","data-sidebar":"content",className:o.cn("tw:no-scrollbar tw:flex tw:min-h-0 tw:flex-1 tw:flex-col tw:gap-0 tw:overflow-auto tw:group-data-[collapsible=icon]:overflow-hidden",t),...r})}function Jr({className:t,...r}){return e.jsx("div",{"data-slot":"sidebar-group","data-sidebar":"group",className:o.cn("tw:relative tw:flex tw:w-full tw:min-w-0 tw:flex-col tw:p-2",t),...r})}function Qr({className:t,asChild:r=!1,...a}){const n=r?G.Slot.Root:"div";return e.jsx(n,{"data-slot":"sidebar-group-label","data-sidebar":"group-label",className:o.cn("tw:flex tw:h-8 tw:shrink-0 tw:items-center tw:rounded-md tw:px-2 tw:text-xs tw:font-medium tw:text-sidebar-foreground/70 tw:ring-sidebar-ring tw:outline-hidden tw:transition-[margin,opacity] tw:duration-200 tw:ease-linear tw:group-data-[collapsible=icon]:-mt-8 tw:group-data-[collapsible=icon]:opacity-0 tw:focus-visible:ring-2 tw:[&>svg]:size-4 tw:[&>svg]:shrink-0",t),...a})}function Ic({className:t,asChild:r=!1,...a}){const n=r?G.Slot.Root:"button";return e.jsx(n,{"data-slot":"sidebar-group-action","data-sidebar":"group-action",className:o.cn("tw:absolute tw:top-3.5 tw:end-3 tw:flex tw:aspect-square tw:w-5 tw:items-center tw:justify-center tw:rounded-md tw:p-0 tw:text-sidebar-foreground tw:ring-sidebar-ring tw:outline-hidden tw:transition-transform tw:group-data-[collapsible=icon]:hidden tw:after:absolute tw:after:-inset-2 tw:hover:bg-sidebar-accent tw:hover:text-sidebar-accent-foreground tw:focus-visible:ring-2 tw:md:after:hidden tw:[&>svg]:size-4 tw:[&>svg]:shrink-0",t),...a})}function ta({className:t,...r}){return e.jsx("div",{"data-slot":"sidebar-group-content","data-sidebar":"group-content",className:o.cn("tw:w-full tw:text-sm",t),...r})}function an({className:t,...r}){return e.jsx("ul",{"data-slot":"sidebar-menu","data-sidebar":"menu",className:o.cn("tw:flex tw:w-full tw:min-w-0 tw:flex-col tw:gap-0",t),...r})}function on({className:t,...r}){return e.jsx("li",{"data-slot":"sidebar-menu-item","data-sidebar":"menu-item",className:o.cn("tw:group/menu-item tw:relative",t),...r})}const Oc=Ya.cva("tw:peer/menu-button tw:group/menu-button tw:flex tw:w-full tw:items-center tw:gap-2 tw:overflow-hidden tw:rounded-md tw:p-2 tw:text-start tw:text-sm tw:ring-sidebar-ring tw:outline-hidden tw:transition-[width,height,padding] tw:group-has-data-[sidebar=menu-action]/menu-item:pe-8 tw:group-data-[collapsible=icon]:size-8! tw:group-data-[collapsible=icon]:p-2! tw:hover:bg-sidebar-accent tw:hover:text-sidebar-accent-foreground tw:focus-visible:ring-2 tw:active:bg-sidebar-accent tw:active:text-sidebar-accent-foreground tw:disabled:pointer-events-none tw:disabled:opacity-50 tw:aria-disabled:pointer-events-none tw:aria-disabled:opacity-50 tw:data-open:hover:bg-sidebar-accent tw:data-open:hover:text-sidebar-accent-foreground tw:data-active:bg-sidebar-accent tw:data-active:font-medium tw:data-active:text-sidebar-accent-foreground tw:[&_svg]:size-4 tw:[&_svg]:shrink-0 tw:[&>span:last-child]:truncate",{variants:{variant:{default:"tw:hover:bg-sidebar-accent tw:hover:text-sidebar-accent-foreground",outline:"tw:bg-background tw:shadow-[0_0_0_1px_var(--sidebar-border)] tw:hover:bg-sidebar-accent tw:hover:text-sidebar-accent-foreground tw:hover:shadow-[0_0_0_1px_var(--sidebar-accent)]"},size:{default:"tw:h-8 tw:text-sm",sm:"tw:h-7 tw:text-xs",lg:"tw:h-12 tw:text-sm tw:group-data-[collapsible=icon]:p-0!"}},defaultVariants:{variant:"default",size:"default"}});function nn({asChild:t=!1,isActive:r=!1,variant:a="default",size:n="default",tooltip:i,className:l,...c}){const d=t?G.Slot.Root:"button",{state:u}=tr(),w=e.jsx(d,{"data-slot":"sidebar-menu-button","data-sidebar":"menu-button","data-size":n,"data-active":r,className:o.cn(Oc({variant:a,size:n}),l),...c});if(!i)return w;const p=typeof i=="string"?{children:i}:i;return e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:w}),e.jsx(o.TooltipContent,{side:"right",align:"center",hidden:u!=="collapsed",...p})]})}function Pc({className:t,asChild:r=!1,showOnHover:a=!1,...n}){const i=r?G.Slot.Root:"button";return e.jsx(i,{"data-slot":"sidebar-menu-action","data-sidebar":"menu-action",className:o.cn("tw:absolute tw:top-1.5 tw:end-1 tw:flex tw:aspect-square tw:w-5 tw:items-center tw:justify-center tw:rounded-md tw:p-0 tw:text-sidebar-foreground tw:ring-sidebar-ring tw:outline-hidden tw:transition-transform tw:group-data-[collapsible=icon]:hidden tw:peer-hover/menu-button:text-sidebar-accent-foreground tw:peer-data-[size=default]/menu-button:top-1.5 tw:peer-data-[size=lg]/menu-button:top-2.5 tw:peer-data-[size=sm]/menu-button:top-1 tw:after:absolute tw:after:-inset-2 tw:hover:bg-sidebar-accent tw:hover:text-sidebar-accent-foreground tw:focus-visible:ring-2 tw:md:after:hidden tw:[&>svg]:size-4 tw:[&>svg]:shrink-0",a&&"tw:group-focus-within/menu-item:opacity-100 tw:group-hover/menu-item:opacity-100 tw:peer-data-active/menu-button:text-sidebar-accent-foreground tw:aria-expanded:opacity-100 tw:md:opacity-0",t),...n})}function Lc({className:t,...r}){return e.jsx("div",{"data-slot":"sidebar-menu-badge","data-sidebar":"menu-badge",className:o.cn("tw:pointer-events-none tw:absolute tw:end-1 tw:flex tw:h-5 tw:min-w-5 tw:items-center tw:justify-center tw:rounded-md tw:px-1 tw:text-xs tw:font-medium tw:text-sidebar-foreground tw:tabular-nums tw:select-none tw:group-data-[collapsible=icon]:hidden tw:peer-hover/menu-button:text-sidebar-accent-foreground tw:peer-data-[size=default]/menu-button:top-1.5 tw:peer-data-[size=lg]/menu-button:top-2.5 tw:peer-data-[size=sm]/menu-button:top-1 tw:peer-data-active/menu-button:text-sidebar-accent-foreground",t),...r})}function Ac({className:t,showIcon:r=!1,...a}){const[n]=s.useState(()=>`${Math.floor(Math.random()*40)+50}%`),i={"--skeleton-width":n};return e.jsxs("div",{"data-slot":"sidebar-menu-skeleton","data-sidebar":"menu-skeleton",className:o.cn("tw:flex tw:h-8 tw:items-center tw:gap-2 tw:rounded-md tw:px-2",t),...a,children:[r&&e.jsx(o.Skeleton,{className:"tw:size-4 tw:rounded-md","data-sidebar":"menu-skeleton-icon"}),e.jsx(o.Skeleton,{className:"tw:h-4 tw:max-w-(--skeleton-width) tw:flex-1","data-sidebar":"menu-skeleton-text",style:i})]})}function Bc({className:t,...r}){return e.jsx("ul",{"data-slot":"sidebar-menu-sub","data-sidebar":"menu-sub",className:o.cn("tw:mx-3.5 tw:flex tw:min-w-0 tw:translate-x-px tw:rtl:-translate-x-px tw:flex-col tw:gap-1 tw:border-s tw:border-sidebar-border tw:px-2.5 tw:py-0.5 tw:group-data-[collapsible=icon]:hidden",t),...r})}function zc({className:t,...r}){return e.jsx("li",{"data-slot":"sidebar-menu-sub-item","data-sidebar":"menu-sub-item",className:o.cn("tw:group/menu-sub-item tw:relative",t),...r})}function $c({asChild:t=!1,size:r="md",isActive:a=!1,className:n,...i}){const l=t?G.Slot.Root:"a";return e.jsx(l,{"data-slot":"sidebar-menu-sub-button","data-sidebar":"menu-sub-button","data-size":r,"data-active":a,className:o.cn("tw:flex tw:h-7 tw:min-w-0 tw:-translate-x-px tw:rtl:translate-x-px tw:items-center tw:gap-2 tw:overflow-hidden tw:rounded-md tw:px-2 tw:text-sidebar-foreground tw:ring-sidebar-ring tw:outline-hidden tw:group-data-[collapsible=icon]:hidden tw:hover:bg-sidebar-accent tw:hover:text-sidebar-accent-foreground tw:focus-visible:ring-2 tw:active:bg-sidebar-accent tw:active:text-sidebar-accent-foreground tw:disabled:pointer-events-none tw:disabled:opacity-50 tw:aria-disabled:pointer-events-none tw:aria-disabled:opacity-50 tw:data-[size=md]:text-sm tw:data-[size=sm]:text-xs tw:data-active:bg-sidebar-accent tw:data-active:text-sidebar-accent-foreground tw:[&>span:last-child]:truncate tw:[&>svg]:size-4 tw:[&>svg]:shrink-0 tw:[&>svg]:text-sidebar-accent-foreground",n),...i})}function sn({id:t,extensionLabels:r,projectInfo:a,handleSelectSidebarItem:n,selectedSidebarItem:i,extensionsSidebarGroupLabel:l,projectsSidebarGroupLabel:c,buttonPlaceholderText:d,searchPlaceholderText:u,noResultsText:w,className:p}){const h=s.useCallback((f,N)=>{n(f,N)},[n]),g=s.useCallback(f=>{const N=a.find(k=>k.projectId===f);return N?N.projectName:f},[a]),m=s.useMemo(()=>a.map(f=>({id:f.projectId,shortName:f.projectName,fullName:f.projectName})),[a]),x=s.useMemo(()=>{const f={buttonPlaceholder:d,ariaLabel:c};return u&&(f.searchPlaceholder=u),w&&(f.commandEmptyMessage=w),f},[d,c,u,w]),y=s.useCallback(f=>!i.projectId&&f===i.label,[i]);return e.jsx(tn,{id:t,collapsible:"none",variant:"inset",className:o.cn("tw:w-96 tw:gap-2 tw:overflow-y-auto",p),children:e.jsxs(rn,{children:[e.jsxs(Jr,{children:[e.jsx(Qr,{className:"tw:text-sm",children:l}),e.jsx(ta,{children:e.jsx(an,{children:Object.entries(r).map(([f,N])=>e.jsx(on,{children:e.jsx(nn,{onClick:()=>h(f),isActive:y(f),children:e.jsx("span",{className:"tw:pl-3",children:N})})},f))})})]}),e.jsxs(Jr,{children:[e.jsx(Qr,{className:"tw:text-sm",children:c}),e.jsx(ta,{className:"tw:pl-3",children:e.jsxs("div",{className:o.cn("tw:flex tw:w-full tw:items-center tw:gap-2 tw:rounded-md tw:px-2 tw:py-1",{"tw:bg-sidebar-accent tw:text-sidebar-accent-foreground":i==null?void 0:i.projectId}),children:[e.jsx(z.ScrollText,{className:"tw:h-4 tw:w-4 tw:shrink-0"}),e.jsx(o.ProjectSelector,{mode:"project",projects:m,openTabs:[],selection:{projectId:(i==null?void 0:i.projectId)??""},onChangeSelection:({projectId:f})=>{if(!f)return;const N=g(f);h(N,f)},buttonVariant:"ghost",buttonClassName:"tw:h-8 tw:w-full tw:flex-1 tw:justify-start tw:font-normal",localizedStrings:x})]})})]})]})})}function Vc({id:t,children:r,searchValue:a,onSearch:n,className:i,...l}){return e.jsxs("div",{className:"tw:box-border tw:flex tw:h-full tw:flex-col",children:[e.jsx("div",{className:"tw:box-border tw:flex tw:items-center tw:justify-center tw:py-4",children:e.jsx(o.SearchBar,{className:"tw:w-9/12",value:a,onSearch:n,placeholder:"Search app settings, extension settings, and project settings"})}),e.jsxs(Qo,{id:t,className:"tw:h-full tw:flex-1 tw:gap-4 tw:overflow-auto tw:border-t",children:[e.jsx(sn,{className:o.cn("tw:w-1/2 tw:min-w-[140px] tw:max-w-[220px] tw:border-e",i),...l}),e.jsx(en,{className:"tw:min-w-[215px]",children:r})]})]})}const ke="scrBook",Fc="scrRef",Ee="source",Gc="details",Kc="Scripture Reference",Uc="Scripture Book",cn="Type",Hc="Details";function qc(t,r){const a=r??!1;return[{accessorFn:n=>`${n.start.book} ${n.start.chapterNum}:${n.start.verseNum}`,id:ke,header:(t==null?void 0:t.scriptureReferenceColumnName)??Kc,cell:n=>{const i=n.row.original;return n.row.getIsGrouped()?Lt.Canon.bookIdToEnglishName(i.start.book):n.row.groupingColumnId===ke?B.formatScrRef(i.start):void 0},getGroupingValue:n=>Lt.Canon.bookIdToNumber(n.start.book),sortingFn:(n,i)=>B.compareScrRefs(n.original.start,i.original.start),enableGrouping:!0},{accessorFn:n=>B.formatScrRef(n.start),id:Fc,header:void 0,cell:n=>{const i=n.row.original;return n.row.getIsGrouped()?void 0:B.formatScrRef(i.start)},sortingFn:(n,i)=>B.compareScrRefs(n.original.start,i.original.start),enableGrouping:!1},{accessorFn:n=>n.source.displayName,id:Ee,header:a?(t==null?void 0:t.typeColumnName)??cn:void 0,cell:n=>a||n.row.getIsGrouped()?n.getValue():void 0,getGroupingValue:n=>n.source.id,sortingFn:(n,i)=>n.original.source.displayName.localeCompare(i.original.source.displayName),enableGrouping:!0},{accessorFn:n=>n.detail,id:Gc,header:(t==null?void 0:t.detailsColumnName)??Hc,cell:n=>n.getValue(),enableGrouping:!1}]}const Yc=t=>{if(!("offset"in t.start))throw new Error("No offset available in range start");if(t.end&&!("offset"in t.end))throw new Error("No offset available in range end");const{offset:r}=t.start;let a=0;return t.end&&({offset:a}=t.end),!t.end||B.compareScrRefs(t.start,t.end)===0?`${B.scrRefToBBBCCCVVV(t.start)}+${r}`:`${B.scrRefToBBBCCCVVV(t.start)}+${r}-${B.scrRefToBBBCCCVVV(t.end)}+${a}`},Ka=t=>`${Yc({start:t.start,end:t.end})} ${t.source.displayName} ${t.detail}`;function Xc({sources:t,showColumnHeaders:r=!1,showSourceColumn:a=!1,scriptureReferenceColumnName:n,scriptureBookGroupName:i,typeColumnName:l,detailsColumnName:c,onRowSelected:d,id:u}){const[w,p]=s.useState([]),[h,g]=s.useState([{id:ke,desc:!1}]),[m,x]=s.useState({}),y=s.useMemo(()=>t.flatMap(E=>E.data.map(D=>({...D,source:E.source}))),[t]),f=s.useMemo(()=>qc({scriptureReferenceColumnName:n,typeColumnName:l,detailsColumnName:c},a),[n,l,c,a]);s.useEffect(()=>{w.includes(Ee)?g([{id:Ee,desc:!1},{id:ke,desc:!1}]):g([{id:ke,desc:!1}])},[w]);const N=qt.useReactTable({data:y,columns:f,state:{grouping:w,sorting:h,rowSelection:m},onGroupingChange:p,onSortingChange:g,onRowSelectionChange:x,getExpandedRowModel:qt.getExpandedRowModel(),getGroupedRowModel:qt.getGroupedRowModel(),getCoreRowModel:qt.getCoreRowModel(),getSortedRowModel:qt.getSortedRowModel(),getRowId:Ka,autoResetExpanded:!1,enableMultiRowSelection:!1,enableSubRowSelection:!1});s.useEffect(()=>{if(d){const E=N.getSelectedRowModel().rowsById,D=Object.keys(E);if(D.length===1){const Y=y.find(X=>Ka(X)===D[0])||void 0;Y&&d(Y)}}},[m,y,d,N]);const k=i??Uc,C=l??cn,j=[{label:"No Grouping",value:[]},{label:`Group by ${k}`,value:[ke]},{label:`Group by ${C}`,value:[Ee]},{label:`Group by ${k} and ${C}`,value:[ke,Ee]},{label:`Group by ${C} and ${k}`,value:[Ee,ke]}],L=E=>{p(JSON.parse(E))},S=(E,D)=>{!E.getIsGrouped()&&!E.getIsSelected()&&E.getToggleSelectedHandler()(D)},O=(E,D)=>E.getIsGrouped()?"":o.cn("banded-row",D%2===0?"even":"odd"),M=(E,D,Y)=>{if(!((E==null?void 0:E.length)===0||D.depth{L(E)},children:[e.jsx(Re,{className:"tw:mb-1 tw:mt-2",children:e.jsx(Se,{})}),e.jsx(Me,{position:"item-aligned",children:e.jsx(Ao,{children:j.map(E=>e.jsx(ae,{value:JSON.stringify(E.value),children:E.label},E.label))})})]}),e.jsxs(o.Table,{className:"tw:relative tw:flex tw:flex-col tw:overflow-y-auto tw:p-0",children:[r&&e.jsx(o.TableHeader,{children:N.getHeaderGroups().map(E=>e.jsx(o.TableRow,{children:E.headers.filter(D=>D.column.columnDef.header).map(D=>e.jsx(o.TableHead,{colSpan:D.colSpan,className:"tw:sticky top-0",children:D.isPlaceholder?void 0:e.jsxs("div",{children:[D.column.getCanGroup()?e.jsx(o.Button,{variant:"ghost",title:`Toggle grouping by ${D.column.columnDef.header}`,onClick:D.column.getToggleGroupingHandler(),type:"button",children:D.column.getIsGrouped()?"🛑":"👊 "}):void 0," ",qt.flexRender(D.column.columnDef.header,D.getContext())]})},D.id))},E.id))}),e.jsx(o.TableBody,{children:N.getRowModel().rows.map((E,D)=>{const Y=o.readDirection();return e.jsx(o.TableRow,{"data-state":E.getIsSelected()?"selected":"",className:o.cn(O(E,D)),onClick:X=>S(E,X),children:E.getVisibleCells().map(X=>{if(!(X.getIsPlaceholder()||X.column.columnDef.enableGrouping&&!X.getIsGrouped()&&(X.column.columnDef.id!==Ee||!a)))return e.jsx(o.TableCell,{className:o.cn(X.column.columnDef.id,"tw:p-[1px]",M(w,E,X)),children:X.getIsGrouped()?e.jsxs(o.Button,{variant:"link",onClick:E.getToggleExpandedHandler(),type:"button",children:[E.getIsExpanded()&&e.jsx(z.ChevronDown,{}),!E.getIsExpanded()&&(Y==="ltr"?e.jsx(z.ChevronRight,{}):e.jsx(z.ChevronLeft,{}))," ",qt.flexRender(X.column.columnDef.cell,X.getContext())," (",E.subRows.length,")"]}):qt.flexRender(X.column.columnDef.cell,X.getContext())},X.id)})},E.id)})})]})]})}function ln({availableBookInfo:t,selectedBookIds:r,onChangeSelectedBookIds:a,localizedStrings:n,localizedBookNames:i,disabledSectionExplanations:l}){const c=n["%webView_book_selector_books_selected%"],d=n["%webView_book_selector_select_books%"],u=n["%webView_book_selector_search_books%"],w=n["%webView_book_selector_select_all%"],p=n["%webView_book_selector_clear_all%"],h=n["%webView_book_selector_no_book_found%"],{otLong:g,ntLong:m,dcLong:x,extraLong:y}={otLong:n==null?void 0:n["%scripture_section_ot_long%"],ntLong:n==null?void 0:n["%scripture_section_nt_long%"],dcLong:n==null?void 0:n["%scripture_section_dc_long%"],extraLong:n==null?void 0:n["%scripture_section_extra_long%"]},[f,N]=s.useState(!1),[k,C]=s.useState(""),j=s.useRef(void 0),L=s.useRef(!1),S=s.useMemo(()=>o.getAvailableBookIds(t),[t]),O=s.useMemo(()=>{if(!k.trim()){const P={[B.Section.OT]:[],[B.Section.NT]:[],[B.Section.DC]:[],[B.Section.Extra]:[]};return S.forEach(W=>{const q=B.getSectionForBook(W);P[q].push(W)}),P}const _=S.filter(P=>o.doesBookMatchQuery(P,k,i)),rt={[B.Section.OT]:[],[B.Section.NT]:[],[B.Section.DC]:[],[B.Section.Extra]:[]};return _.forEach(P=>{const W=B.getSectionForBook(P);rt[W].push(P)}),rt},[S,k,i]),M=s.useCallback((_,rt=!1)=>{if(!rt||!j.current){a(r.includes(_)?r.filter(dt=>dt!==_):[...r,_]),j.current=_;return}const P=S.findIndex(dt=>dt===j.current),W=S.findIndex(dt=>dt===_);if(P===-1||W===-1)return;const[q,$]=[Math.min(P,W),Math.max(P,W)],et=S.slice(q,$+1).map(dt=>dt);a(r.includes(_)?r.filter(dt=>!et.includes(dt)):[...new Set([...r,...et])])},[r,a,S]),E=_=>{M(_,L.current),L.current=!1},D=(_,rt)=>{_.preventDefault(),M(rt,_.shiftKey)},Y=()=>{a(S.map(_=>_))},X=()=>{a([])},A=s.useMemo(()=>Object.values(B.Section).filter(_=>(l==null?void 0:l[_])!==void 0&&o.getBooksForSection(S,_).length===0).map(_=>({section:_,explanation:l==null?void 0:l[_]})),[l,S]);return e.jsxs(o.Popover,{open:f,onOpenChange:_=>{N(_),_||C("")},children:[e.jsx(o.PopoverTrigger,{asChild:!0,children:e.jsxs(o.Button,{variant:"outline",role:"combobox","aria-expanded":f,className:"tw:max-w-64 tw:justify-between",children:[r.length>0?`${c}: ${r.length}`:d,e.jsx(z.ChevronsUpDown,{className:"tw:ml-2 tw:h-4 tw:w-4 tw:shrink-0 tw:opacity-50"})]})}),e.jsx(o.PopoverContent,{className:"tw:max-h-(--radix-popover-content-available-height) tw:w-[500px] tw:max-w-[calc(100vw-2rem)] tw:p-0",align:"start",collisionPadding:8,children:e.jsxs(o.Command,{className:"tw:min-h-0",shouldFilter:!1,onKeyDown:_=>{_.key==="Enter"&&(L.current=_.shiftKey)},children:[e.jsx(o.CommandInput,{className:"tw:shrink-0",placeholder:u,value:k,onValueChange:C,spaceSelectsHighlightedItem:!0}),e.jsxs("div",{className:"tw:flex tw:shrink-0 tw:justify-between tw:border-b tw:p-2",children:[e.jsx(o.Button,{variant:"ghost",size:"sm",onClick:Y,disabled:S.length===0,children:w}),e.jsx(o.Button,{variant:"ghost",size:"sm",onClick:X,children:p})]}),e.jsxs(o.CommandList,{className:"tw:max-h-72 tw:min-h-0 tw:flex-1",children:[e.jsx(o.CommandEmpty,{children:h}),Object.values(B.Section).filter(_=>O[_].length>0).map((_,rt)=>{const P=O[_];return e.jsxs(s.Fragment,{children:[rt>0&&e.jsx(o.CommandSeparator,{alwaysRender:!0}),e.jsx(o.CommandGroup,{heading:o.getSectionLongName(_,g,m,x,y),children:P.map(W=>e.jsx(Wa,{bookId:W,isSelected:r.includes(W),onSelect:()=>E(W),onMouseDown:q=>D(q,W),section:B.getSectionForBook(W),showCheck:!0,localizedBookNames:i,commandValue:Kr(W,i),className:"tw:flex tw:items-center"},W))})]},_)})]}),A.length>0&&e.jsx("div",{className:"tw:shrink-0 tw:border-t tw:p-2",children:A.map(({section:_,explanation:rt})=>e.jsx("p",{className:"tw:text-xs tw:text-muted-foreground",children:rt},_))})]})})]})}function dn({disabled:t,tooltipText:r,children:a,className:n}){return e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(Ge,{className:n,isDisabled:t,disabledExplanation:r,children:a})}),t&&e.jsx(o.TooltipContent,{children:e.jsx("p",{className:"tw:max-w-xs tw:whitespace-pre-line",children:r})})]})})}function Wc({section:t,availableBookIds:r,selectedBookIds:a,onToggle:n,localizedStrings:i,disabledExplanation:l}){const c=o.getBooksForSection(r,t).length===0,d=i["%scripture_section_ot_short%"],u=i["%scripture_section_nt_short%"],w=i["%scripture_section_dc_short%"],p=i["%scripture_section_extra_short%"],h=e.jsx(o.Button,{variant:"outline",size:"sm",onClick:()=>n(t),className:o.cn(o.isSectionFullySelected(r,t,a)&&!c&&"tw:bg-primary tw:text-primary-foreground tw:hover:bg-primary/70 tw:hover:text-primary-foreground"),disabled:c,children:o.getSectionShortName(t,d,u,w,p)});return l?e.jsx(dn,{className:"tw:flex",disabled:c,tooltipText:l,children:h}):h}const Ua=5,Fr=6;function wn({availableBookInfo:t,selectedBookIds:r,onChangeSelectedBookIds:a,localizedStrings:n,localizedBookNames:i,disabledSectionExplanations:l}){const c=n["%webView_book_selector_more%"],d=s.useMemo(()=>o.getAvailableBookIds(t),[t]),u=s.useCallback(w=>{const p=o.getBooksForSection(d,w).map(h=>h);a(o.isSectionFullySelected(d,w,r)?r.filter(h=>!p.includes(h)):[...new Set([...r,...p])])},[r,a,d]);return e.jsxs("div",{className:"tw:space-y-2",children:[e.jsx("div",{className:"tw:flex tw:flex-wrap tw:gap-2",children:Object.values(B.Section).map(w=>e.jsx(Wc,{section:w,availableBookIds:d,selectedBookIds:r,onToggle:u,localizedStrings:n,disabledExplanation:l==null?void 0:l[w]},w))}),e.jsx(ln,{availableBookInfo:t,selectedBookIds:r,onChangeSelectedBookIds:a,localizedStrings:n,localizedBookNames:i,disabledSectionExplanations:l}),r.length>0&&e.jsxs("div",{className:"tw:mt-2 tw:flex tw:flex-wrap tw:gap-1",children:[r.slice(0,r.length===Fr?Fr:Ua).map(w=>e.jsx(o.Badge,{className:"tw:hover:bg-secondary",variant:"secondary",children:o.getLocalizedBookName(w,i)},w)),r.length>Fr&&e.jsx(o.Badge,{className:"tw:hover:bg-secondary",variant:"secondary",children:`+${r.length-Ua} ${c}`})]})]})}const un=Object.freeze(["%webView_book_selector_books_selected%","%webView_book_selector_select_books%","%webView_book_selector_search_books%","%webView_book_selector_select_all%","%webView_book_selector_clear_all%","%webView_book_selector_no_book_found%","%webView_book_selector_more%","%scripture_section_ot_long%","%scripture_section_ot_short%","%scripture_section_nt_long%","%scripture_section_nt_short%","%scripture_section_dc_long%","%scripture_section_dc_short%","%scripture_section_extra_long%","%scripture_section_extra_short%"]),Zc=Object.freeze(["%webView_scope_selector_selected_text%","%webView_scope_selector_verse%","%webView_scope_selector_chapter%","%webView_scope_selector_book%","%webView_scope_selector_current_verse%","%webView_scope_selector_current_chapter%","%webView_scope_selector_current_book%","%webView_scope_selector_choose_books%","%webView_scope_selector_scope%","%webView_scope_selector_select_books%","%webView_scope_selector_range%","%webView_scope_selector_select_range%","%webView_scope_selector_range_start%","%webView_scope_selector_range_end%","%webView_scope_selector_ok%","%webView_scope_selector_cancel%","%webView_scope_selector_navigate%",...un]),Pt=(t,r)=>t[r]??r,Jc=Object.freeze([" ","-"]);function Qc({scope:t,availableScopes:r,onScopeChange:a,availableBookInfo:n,selectedBookIds:i,onSelectedBookIdsChange:l,localizedStrings:c,localizedBookNames:d,disabledSectionExplanations:u,disabledScopeExplanations:w,id:p,variant:h="radio",rangeStart:g,rangeEnd:m,onRangeStartChange:x,onRangeEndChange:y,currentScrRef:f,onCurrentScrRefChange:N,bookChapterControlLocalizedStrings:k,getEndVerse:C,hideLabel:j=!1,buttonClassName:L}){const S=Pt(c,"%webView_scope_selector_selected_text%"),O=Pt(c,"%webView_scope_selector_verse%"),M=Pt(c,"%webView_scope_selector_chapter%"),E=Pt(c,"%webView_scope_selector_book%"),D=Pt(c,"%webView_scope_selector_current_verse%"),Y=Pt(c,"%webView_scope_selector_current_chapter%"),X=Pt(c,"%webView_scope_selector_current_book%"),A=Pt(c,"%webView_scope_selector_choose_books%"),_=Pt(c,"%webView_scope_selector_scope%"),rt=Pt(c,"%webView_scope_selector_select_books%"),P=Pt(c,"%webView_scope_selector_range%"),W=Pt(c,"%webView_scope_selector_select_range%"),q=Pt(c,"%webView_scope_selector_range_start%"),$=Pt(c,"%webView_scope_selector_range_end%"),et=Pt(c,"%webView_scope_selector_ok%"),dt=Pt(c,"%webView_scope_selector_cancel%"),ct=Pt(c,"%webView_scope_selector_navigate%"),Q=F=>{if(!f)return;const tt=f.book.toUpperCase();switch(F){case"verse":return B.formatScrRef(f,"id");case"chapter":return`${tt} ${f.chapterNum}`;case"book":return tt;default:return}},wt=[{value:"selectedText",label:S,id:"scope-selected-text"},{value:"verse",label:O,dropdownLabel:D,scrRefSuffix:Q("verse"),id:"scope-verse"},{value:"chapter",label:M,dropdownLabel:Y,scrRefSuffix:Q("chapter"),id:"scope-chapter"},{value:"book",label:E,dropdownLabel:X,scrRefSuffix:Q("book"),id:"scope-book"},{value:"selectedBooks",label:A,id:"scope-selected"},{value:"range",label:P,id:"scope-range"}],ft=(F,tt,Rt=!1)=>e.jsxs(e.Fragment,{children:[F,tt&&!Rt&&e.jsxs("span",{className:"tw:text-muted-foreground",children:[": ",tt]})]}),ht=r?wt.filter(F=>r.includes(F.value)):wt,_t=f??B.defaultScrRef,It=g??_t,St=m??_t,oe=()=>{},te=s.useRef(null),mt=s.useRef(null),vt=s.useRef(!1),xt=s.useRef(null),Yt=s.useRef(!1),[ne,jt]=s.useState(void 0),Ct=s.useRef(!1),Xt=s.useRef(!1),le=s.useRef(null),ie=s.useCallback(F=>{if(F){jt("start"),Ct.current=!1;return}jt(tt=>tt==="start"?void 0:tt),Ct.current&&(Ct.current=!1,requestAnimationFrame(()=>{var Rt;const tt=(Rt=te.current)==null?void 0:Rt.querySelector("button");tt==null||tt.click()}))},[]),ge=s.useCallback(F=>{if(F){jt("end"),Xt.current=!1;return}jt(tt=>tt==="end"?void 0:tt)},[]),Zt=s.useCallback(F=>{x==null||x(F),y==null||y(F),Ct.current=!0},[x,y]),$t=s.useCallback(F=>{y==null||y(F),Xt.current=!0},[y]),Vt=s.useCallback(F=>{a(F),F==="selectedBooks"&&i.length===0&&(f!=null&&f.book)&&l([f.book])},[a,i,f,l]),Ft=ht.find(F=>F.value===t),fe=()=>t==="selectedBooks"&&i.length>0?i.map(F=>F.toUpperCase()).join(", "):t==="range"?B.formatScrRefRange(It,St,{optionOrLocalizedBookName:"id",endRefOptionOrLocalizedBookName:"id",repeatBookName:!0}):Ft?ft(Ft.label,Ft.scrRefSuffix):t,I=ht.filter(F=>F.value!=="selectedBooks"&&F.value!=="range"),Nt=ht.find(F=>F.value==="selectedBooks"),At=ht.find(F=>F.value==="range"),[Et,R]=s.useState(!1),[K,Z]=s.useState(void 0),[U,J]=s.useState(void 0),[V,at]=s.useState(void 0),[nt,ot]=s.useState(void 0),[gt,bt]=s.useState([]),yt=h==="dropdown"&&K==="selectedBooks",Bt=e.jsx(wn,{availableBookInfo:n,selectedBookIds:yt?gt:i,onChangeSelectedBookIds:yt?bt:l,localizedStrings:c,localizedBookNames:d,disabledSectionExplanations:u}),Ce=ne==="end",xe=ne==="start",me="tw:text-muted-foreground",de=h==="dropdown"&&K==="range",De=de?at:Zt,Ie=de?ot:y?$t:oe,T=e.jsxs("div",{className:"tw:flex tw:flex-wrap tw:items-end tw:gap-4",children:[e.jsxs("div",{className:"tw:grid tw:gap-2",children:[e.jsx(o.Label,{htmlFor:"scope-range-start",className:o.cn(Ce&&me),children:q}),e.jsx(gr,{id:"scope-range-start",scrRef:de?V??It:It,handleSubmit:De,localizedBookNames:d,localizedStrings:k,getEndVerse:C,submitKeys:Jc,onOpenChange:ie,className:o.cn(Ce&&me),modal:!0})]}),e.jsxs("div",{ref:te,className:"tw:grid tw:gap-2",children:[e.jsx(o.Label,{htmlFor:"scope-range-end",className:o.cn(xe&&me),children:$}),e.jsx(gr,{id:"scope-range-end",scrRef:de?nt??St:St,handleSubmit:Ie,localizedBookNames:d,localizedStrings:k,getEndVerse:C,disableReferencesUpTo:de?V??It:It,onOpenChange:ge,onCloseAutoFocus:F=>{var tt;Xt.current&&(Xt.current=!1,F.preventDefault(),(tt=le.current)==null||tt.focus())},className:o.cn(xe&&me),modal:!0,align:"start"})]})]}),it=s.useRef({}),lt=s.useCallback(F=>tt=>{it.current[F]=tt},[]),Tt=s.useRef(null);s.useEffect(()=>{if(!Et)return;let F=0;const tt=requestAnimationFrame(()=>{F=requestAnimationFrame(()=>{var Rt;(Rt=it.current[t])==null||Rt.focus()})});return()=>{cancelAnimationFrame(tt),F&&cancelAnimationFrame(F)}},[Et,t]);const[ye,Tr]=s.useState(null),[ve,Oe]=s.useState(null),[Pe,Sr]=s.useState(null),rr=200,[Rr,ar]=s.useState(!1);s.useEffect(()=>{if(!Pe||typeof ResizeObserver>"u")return;const F=new ResizeObserver(([tt])=>{ar(tt.contentRect.widthF.disconnect()},[Pe]);const or=s.useCallback(F=>{J(F),at(It),ot(St),bt(i),R(!1),Z(F)},[It,St,i]),nr=s.useCallback(()=>{U!==void 0&&(U==="range"?(V&&(x==null||x(V)),nt&&(y==null||y(nt))):U==="selectedBooks"&&l(gt),Vt(U),Z(void 0),J(void 0))},[U,V,nt,gt,x,y,l,Vt]),Le=s.useCallback(F=>{F||(Z(void 0),J(void 0))},[]),ir=s.useCallback(F=>{var tt;F.preventDefault(),(tt=Tt.current)==null||tt.focus()},[]),sr=F=>t===F?e.jsx("span",{className:"tw:absolute tw:flex tw:h-3.5 tw:w-3.5 tw:items-center tw:justify-center tw:ltr:left-2 tw:rtl:right-2",children:e.jsx(z.Check,{className:"tw:h-4 tw:w-4"})}):void 0;return e.jsxs("div",{id:p,className:"tw:grid tw:gap-4",children:[e.jsxs("div",{className:"tw:grid tw:gap-2",children:[!j&&e.jsx(o.Label,{children:_}),h==="dropdown"?e.jsxs(o.DropdownMenu,{open:Et,onOpenChange:R,children:[e.jsx(o.DropdownMenuTrigger,{asChild:!0,children:e.jsxs(o.Button,{ref:Tt,variant:"outline",role:"combobox",className:o.cn("tw:w-full tw:justify-between tw:overflow-hidden tw:font-normal",L),children:[e.jsx("span",{className:"tw:min-w-0 tw:flex-1 tw:truncate tw:text-start",children:fe()}),e.jsx(z.ChevronDown,{className:"tw:ms-2 tw:h-4 tw:w-4 tw:shrink-0 tw:opacity-50"})]})}),e.jsx(o.DropdownMenuContent,{ref:Sr,className:"tw:w-[var(--radix-dropdown-menu-trigger-width)] tw:min-w-[12rem]",align:"start",children:e.jsxs(o.PopoverPortalContainerProvider,{container:Pe,children:[I.map(({value:F,label:tt,dropdownLabel:Rt,scrRefSuffix:ee,id:se})=>{const b=w==null?void 0:w[F];return e.jsxs(o.DropdownMenuItem,{ref:lt(F),disabled:!!b,className:"tw:relative tw:ps-8 data-[highlighted]:tw:bg-accent data-[highlighted]:tw:text-accent-foreground",onSelect:()=>Vt(F),"data-selected":t===F?"true":void 0,children:[t===F&&e.jsx("span",{className:"tw:absolute tw:flex tw:h-3.5 tw:w-3.5 tw:items-center tw:justify-center tw:ltr:left-2 tw:rtl:right-2",children:e.jsx(z.Check,{className:"tw:h-4 tw:w-4"})}),e.jsxs("span",{className:"tw:flex tw:min-w-0 tw:flex-col tw:gap-0.5",children:[e.jsx("span",{className:"tw:flex tw:items-center tw:gap-1.5",children:ft(Rt??tt,ee,Rr)}),b&&e.jsx("span",{className:"tw:text-xs tw:whitespace-normal tw:text-foreground",children:b})]})]},se)}),(Nt||At)&&e.jsx(o.DropdownMenuSeparator,{}),Nt&&e.jsxs(o.DropdownMenuItem,{ref:lt("selectedBooks"),className:o.cn("tw:relative tw:ps-8","data-[highlighted]:tw:bg-accent data-[highlighted]:tw:text-accent-foreground"),onSelect:()=>or("selectedBooks"),"data-selected":t==="selectedBooks"?"true":void 0,children:[sr("selectedBooks"),`${Nt.label}…`]}),At&&e.jsxs(o.DropdownMenuItem,{ref:lt("range"),className:o.cn("tw:relative tw:ps-8","data-[highlighted]:tw:bg-accent data-[highlighted]:tw:text-accent-foreground"),onSelect:()=>or("range"),"data-selected":t==="range"?"true":void 0,children:[sr("range"),`${At.label}…`]}),N&&e.jsxs(e.Fragment,{children:[e.jsx(o.DropdownMenuSeparator,{}),e.jsx(o.DropdownMenuLabel,{className:"tw:px-2 tw:py-1.5 tw:text-xs tw:font-medium tw:text-muted-foreground",children:ct}),e.jsx(o.DropdownMenuItem,{ref:xt,className:"tw:p-0",onSelect:F=>{var tt,Rt;if(F.preventDefault(),vt.current){vt.current=!1;return}Yt.current||(Rt=(tt=mt.current)==null?void 0:tt.querySelector("button"))==null||Rt.click()},children:e.jsx("div",{ref:mt,className:"tw:w-full tw:px-1 tw:pb-1",onPointerDownCapture:F=>{const tt=F.target instanceof HTMLElement?F.target:void 0;tt!=null&&tt.closest("button")&&(vt.current=!0,requestAnimationFrame(()=>{vt.current=!1}))},children:e.jsx(gr,{id:"scope-navigate",scrRef:f??B.defaultScrRef,handleSubmit:N,localizedBookNames:d,localizedStrings:k,getEndVerse:C,triggerVariant:"ghost",onOpenChange:F=>{Yt.current=F},onCloseAutoFocus:F=>{var tt;F.preventDefault(),(tt=xt.current)==null||tt.focus()},modal:!0,className:"tw:w-full tw:min-w-0 tw:max-w-none tw:justify-between tw:px-2 tw:font-normal",triggerContent:e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"tw:min-w-0 tw:flex-1 tw:truncate tw:text-start",children:B.formatScrRef(f??B.defaultScrRef,"id")}),e.jsx(z.ChevronDown,{className:"tw:ms-2 tw:h-4 tw:w-4 tw:shrink-0 tw:opacity-50"})]})})})})]})]})})]}):e.jsx(o.RadioGroup,{value:t,onValueChange:Vt,className:"tw:flex tw:flex-col tw:space-y-1",children:ht.map(({value:F,label:tt,scrRefSuffix:Rt,id:ee})=>{const se=w==null?void 0:w[F];return e.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-0.5",children:[e.jsxs("div",{className:"tw:flex tw:items-center",children:[e.jsx(o.RadioGroupItem,{className:"tw:me-2",value:F,id:ee,disabled:!!se,"aria-describedby":se?`${ee}-explanation`:void 0}),e.jsx(o.Label,{htmlFor:ee,children:ft(tt,Rt)})]}),se&&e.jsx("span",{id:`${ee}-explanation`,className:"tw:ms-6 tw:text-xs tw:whitespace-normal tw:text-muted-foreground",children:se})]},ee)})})]}),h==="radio"&&t==="selectedBooks"&&e.jsxs("div",{className:"tw:grid tw:gap-2",children:[e.jsx(o.Label,{children:rt}),Bt]}),h==="radio"&&t==="range"&&T,h==="dropdown"&&Nt&&e.jsx(o.Dialog,{open:K==="selectedBooks",onOpenChange:Le,children:e.jsx(o.DialogContent,{ref:Oe,onCloseAutoFocus:ir,onEscapeKeyDown:F=>{ve!=null&&ve.querySelector('[data-state="open"]')&&F.preventDefault()},children:e.jsxs(o.PopoverPortalContainerProvider,{container:ve,children:[e.jsx(o.DialogHeader,{className:"tw:pe-8",children:e.jsx(o.DialogTitle,{children:A})}),Bt,e.jsxs(o.DialogFooter,{children:[e.jsx(o.Button,{variant:"outline",onClick:()=>Le(!1),children:dt}),e.jsx(o.Button,{onClick:nr,children:et})]})]})})}),h==="dropdown"&&At&&e.jsx(o.Dialog,{open:K==="range",onOpenChange:Le,children:e.jsx(o.DialogContent,{ref:Tr,onCloseAutoFocus:ir,onEscapeKeyDown:F=>{ye!=null&&ye.querySelector('[data-state="open"]')&&F.preventDefault()},children:e.jsxs(o.PopoverPortalContainerProvider,{container:ye,children:[e.jsx(o.DialogHeader,{className:"tw:pe-8",children:e.jsx(o.DialogTitle,{children:W})}),T,e.jsxs(o.DialogFooter,{children:[e.jsx(o.Button,{variant:"outline",onClick:()=>Le(!1),children:dt}),e.jsx(o.Button,{ref:le,onClick:nr,children:et})]})]})})})]})}function tl({availableScrollGroupIds:t,scrollGroupId:r,onChangeScrollGroupId:a,localizedStrings:n={},size:i="sm",className:l,id:c,disabled:d}){const u={...o.dt,...Object.fromEntries(Object.entries(n).map(([p,h])=>[p,p===h&&p in o.dt?o.dt[p]:h]))},w=o.readDirection();return e.jsxs(Te,{value:`${r}`,onValueChange:p=>a(p==="undefined"?void 0:parseInt(p,10)),disabled:d,children:[e.jsx(Re,{size:i,className:o.cn("pr-twp tw:w-auto",l),children:e.jsx(Se,{placeholder:u[B.getLocalizeKeyForScrollGroupId(r)]??r})}),e.jsx(Me,{id:c,align:w==="rtl"?"end":"start",style:{zIndex:o.Z_INDEX_ABOVE_DOCK},children:t.map(p=>e.jsx(ae,{value:`${p}`,children:u[B.getLocalizeKeyForScrollGroupId(p)]},`${p}`))})]})}function el({children:t}){return e.jsx("div",{className:"pr-twp tw:grid",children:t})}function rl({primary:t,secondary:r,children:a,isLoading:n=!1,loadingMessage:i}){return e.jsxs("div",{className:"tw:flex tw:items-center tw:justify-between tw:space-x-4 tw:py-2",children:[e.jsxs("div",{children:[e.jsx("p",{className:"tw:text-sm tw:font-medium tw:leading-none",children:t}),e.jsx("p",{className:"tw:whitespace-normal tw:break-words tw:text-sm tw:text-muted-foreground",children:r})]}),n?e.jsx("p",{className:"tw:text-sm tw:text-muted-foreground",children:i}):e.jsx("div",{children:a})]})}function al({primary:t,secondary:r,includeSeparator:a=!1}){return e.jsxs("div",{className:"tw:space-y-4 tw:py-2",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"tw:text-lg tw:font-medium",children:t}),e.jsx("p",{className:"tw:text-sm tw:text-muted-foreground",children:r})]}),a?e.jsx(o.Separator,{}):""]})}function pn(t,r){var a;return(a=Object.entries(t).find(([,n])=>"menuItem"in n&&n.menuItem===r))==null?void 0:a[0]}function hn(t){return Object.entries(t).flatMap(([r,a])=>typeof a=="object"?[{columnKey:r,column:a}]:[]).sort((r,a)=>r.column.order-a.column.order)}function gn(t,r,a){return"column"in r&&r.column===a||t===a}function ol(t){const r=new Set(t.items.map(n=>n.group)),a=Object.entries(t.groups).filter(([n])=>r.has(n));return hn(t.columns).filter(({columnKey:n})=>a.some(([i,l])=>gn(i,l,n))).map(({columnKey:n,column:i})=>({columnKey:n,label:i.label}))}function Cr({icon:t,menuLabel:r,leading:a}){return t?e.jsx("img",{className:o.cn("tw:max-h-5 tw:max-w-5",a?"tw:me-2":"tw:ms-2"),src:t,alt:`${a?"Leading":"Trailing"} icon for ${r}`}):void 0}const fn=(t,r,a,n)=>a?Object.entries(t).filter(([l,c])=>gn(l,c,a)).sort(([,l],[,c])=>l.order-c.order).flatMap(([l])=>r.filter(d=>d.group===l).sort((d,u)=>d.order-u.order).map(d=>e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:"command"in d?e.jsxs(o.DropdownMenuItem,{onClick:()=>{n(d)},children:[d.iconPathBefore&&e.jsx(Cr,{icon:d.iconPathBefore,menuLabel:d.label,leading:!0}),d.label,d.iconPathAfter&&e.jsx(Cr,{icon:d.iconPathAfter,menuLabel:d.label}),d.shortcut&&e.jsx(o.DropdownMenuShortcut,{children:d.shortcut})]},`dropdown-menu-item-${d.label}-${d.command}`):e.jsxs(o.DropdownMenuSub,{children:[e.jsx(o.DropdownMenuSubTrigger,{children:d.label}),e.jsx(o.DropdownMenuPortal,{children:e.jsx(o.DropdownMenuSubContent,{children:fn(t,r,pn(t,d.id),n)})})]},`dropdown-menu-sub-${d.label}-${d.id}`)}),d.tooltip&&e.jsx(o.TooltipContent,{children:d.tooltip})]},`tooltip-${d.label}-${"command"in d?d.command:d.id}`))):void 0;function Nr({onSelectMenuItem:t,menuData:r,tabLabel:a,icon:n,className:i,showSectionHeadings:l=!1,variant:c,buttonVariant:d="ghost",id:u}){const w=s.useId(),p=ol(r),h=l&&p.length>1;Ja();const g=s.useRef(null),m=()=>o.showFocusRing(g.current??void 0);return e.jsxs(o.DropdownMenu,{variant:c,children:[e.jsx(o.DropdownMenuTrigger,{"aria-label":a,className:i,asChild:!0,id:u,children:e.jsx(o.Button,{ref:g,variant:d,size:"icon",className:o.QUIET_FOCUS_RING_SUPPRESSION,onKeyDown:m,onBlur:m,children:n??e.jsx(z.MenuIcon,{})})}),e.jsx(o.DropdownMenuContent,{align:"start",style:{zIndex:o.Z_INDEX_ABOVE_DOCK},onCloseAutoFocus:()=>{o.getLastInteractionModality()==="pointer"&&o.hideFocusRing(g.current??void 0)},children:p.map(({columnKey:x,label:y},f)=>{const N=`${w}-${x}`;return e.jsxs(s.Fragment,{children:[e.jsxs(o.DropdownMenuGroup,{"aria-labelledby":h?N:void 0,children:[h&&e.jsx(o.DropdownMenuLabel,{id:N,children:y}),e.jsx(o.TooltipProvider,{children:fn(r.groups,r.items,x,t)})]}),ft>=c),i=n===-1?r.length:n;if(a===void 0||i>=a)return i;const l=r.findIndex(c=>t>=c+nl);return l===-1?a:Math.min(a,l)}function ga(t,r){const[a,n]=s.useState(0),i=s.useRef(void 0);return s.useLayoutEffect(()=>{if(!t||typeof ResizeObserver>"u")return;const l=()=>{const{width:d}=t.getBoundingClientRect(),u=i.current;i.current=d;const w=u===void 0||u===0;n(p=>il(d,r,w?void 0:p))};l();const c=new ResizeObserver(l);return c.observe(t),()=>c.disconnect()},[t,r]),a}const sl=Object.freeze([520,420,340]),mn=s.forwardRef(({id:t,className:r,children:a},n)=>{const[i,l]=s.useState(void 0),c=s.useRef(n);c.current=n;const d=s.useCallback(h=>{l(h??void 0);const g=c.current;typeof g=="function"?g(h):g&&(g.current=h)},[]),u=ga(i,sl),w=ra()??u,p=w>=ze.MINIMUM;return e.jsx(Je.Provider,{value:w,children:e.jsx("div",{ref:d,className:o.cn("tw:sticky tw:top-0 tw:box-border tw:h-14 tw:items-center tw:justify-between tw:overflow-clip tw:py-2 tw:text-foreground tw:@container/toolbar",p?"tw:gap-1 tw:px-2":"tw:gap-2 tw:px-4",r,"tw:flex tw:flex-row"),id:t,children:a})})});function cl({onSelectProjectMenuItem:t,onSelectViewInfoMenuItem:r,projectMenuData:a,tabViewMenuData:n,id:i,className:l,startAreaChildren:c,centerAreaChildren:d,endAreaChildren:u,menuButtonIcon:w}){return e.jsxs(mn,{className:`tw:w-full tw:border-b ${l}`,id:i,children:[a&&e.jsx(Nr,{onSelectMenuItem:t,menuData:a,tabLabel:"Project",icon:w??e.jsx(z.Menu,{}),buttonVariant:"ghost",showSectionHeadings:!0}),c&&e.jsx("div",{className:"tw:flex tw:min-w-0 tw:shrink tw:grow-[10] tw:flex-row tw:flex-nowrap tw:items-start tw:gap-x-1 tw:gap-y-2 tw:overflow-clip",children:c}),d&&e.jsx("div",{className:"tw:flex tw:shrink tw:grow-[1] tw:basis-0 tw:flex-row tw:flex-nowrap tw:items-start tw:justify-center tw:gap-x-1 tw:gap-y-2 tw:overflow-clip tw:@sm:basis-auto",children:d}),e.jsxs("div",{className:"tw:flex tw:shrink-0 tw:grow-[1] tw:flex-row-reverse tw:flex-nowrap tw:items-start tw:gap-x-1 tw:gap-y-2 tw:overflow-clip",children:[n&&e.jsx(Nr,{onSelectMenuItem:r,menuData:n,tabLabel:"View Info",icon:e.jsx(z.EllipsisVertical,{}),className:"tw:h-full",showSectionHeadings:!0}),u]})]})}function ll({onSelectProjectMenuItem:t,projectMenuData:r,id:a,className:n,menuButtonIcon:i}){return e.jsx(mn,{className:"tw:pointer-events-none",id:a,children:r&&e.jsx(Nr,{onSelectMenuItem:t,menuData:r,tabLabel:"Project",icon:i,className:`tw:pointer-events-auto tw:shadow-lg ${n}`,buttonVariant:"outline",showSectionHeadings:!0})})}const fa=s.forwardRef(({className:t,...r},a)=>{const n=o.readDirection();return e.jsx(G.Tabs.Root,{orientation:"vertical",ref:a,className:o.cn("tw:flex tw:gap-1 tw:rounded-md tw:text-muted-foreground",t),...r,dir:n})});fa.displayName=G.Tabs.List.displayName;const ma=s.forwardRef(({className:t,...r},a)=>e.jsx(G.Tabs.List,{ref:a,className:o.cn("tw:flex tw:items-center tw:w-[124px] tw:justify-center tw:rounded-md tw:bg-muted tw:p-1 tw:text-muted-foreground",t),...r}));ma.displayName=G.Tabs.List.displayName;const vn=s.forwardRef(({className:t,...r},a)=>e.jsx(G.Tabs.Trigger,{ref:a,...r,className:o.cn("tw:inline-flex tw:w-[116px] tw:cursor-pointer tw:items-center tw:justify-center tw:break-words tw:rounded-sm tw:border-0 tw:bg-muted tw:px-3 tw:py-1.5 tw:text-sm tw:font-medium tw:text-inherit tw:ring-offset-background tw:transition-all tw:hover:text-foreground tw:focus-visible:outline-hidden tw:focus-visible:ring-2 tw:focus-visible:ring-ring tw:focus-visible:ring-offset-2 tw:disabled:pointer-events-none tw:disabled:opacity-50 tw:data-[state=active]:bg-background tw:data-[state=active]:text-foreground tw:data-[state=active]:shadow-sm tw:overflow-clip",t)})),va=s.forwardRef(({className:t,...r},a)=>e.jsx(G.Tabs.Content,{ref:a,className:o.cn("tw:ms-5 tw:flex-grow tw:text-foreground tw:ring-offset-background tw:focus-visible:outline-hidden tw:focus-visible:ring-2 tw:focus-visible:ring-ring tw:focus-visible:ring-offset-2",t),...r}));va.displayName=G.Tabs.Content.displayName;function dl({tabList:t,searchValue:r,onSearch:a,searchPlaceholder:n,headerTitle:i,searchClassName:l,id:c}){return e.jsxs("div",{id:c,className:"pr-twp",children:[e.jsxs("div",{className:"tw:sticky tw:top-0 tw:space-y-2 tw:pb-2",children:[i?e.jsx("h1",{children:i}):"",e.jsx(o.SearchBar,{className:l,value:r,onSearch:a,placeholder:n})]}),e.jsxs(fa,{children:[e.jsx(ma,{children:t.map(d=>e.jsx(vn,{value:d.value,children:d.value},d.key))}),t.map(d=>e.jsx(va,{value:d.value,children:d.content},d.key))]})]})}function wl({className:t,variant:r="default",...a}){const n=s.useMemo(()=>({variant:r}),[r]);return e.jsx(o.MenuContext.Provider,{value:n,children:e.jsx(G.Menubar.Root,{"data-slot":"menubar",className:o.cn("tw:flex tw:h-8 tw:items-center tw:gap-0.5 tw:rounded-lg tw:border tw:p-[3px]",t),...a})})}function ul({...t}){return e.jsx(G.Menubar.Menu,{"data-slot":"menubar-menu",...t})}function pl({...t}){return e.jsx(G.Menubar.Portal,{"data-slot":"menubar-portal",...t})}function hl({className:t,...r}){const a=o.useMenuContext();return e.jsx(G.Menubar.Trigger,{"data-slot":"menubar-trigger",className:o.cn("tw:flex tw:items-center tw:rounded-sm tw:px-1.5 tw:py-[2px] tw:text-sm tw:font-medium tw:outline-hidden tw:select-none tw:hover:bg-muted tw:aria-expanded:bg-muted","pr-twp",o.menuVariants({variant:a.variant,className:t})),...r})}function gl({className:t,align:r="start",alignOffset:a=-4,sideOffset:n=8,style:i,...l}){return e.jsx(pl,{children:e.jsx(G.Menubar.Content,{"data-slot":"menubar-content",align:r,alignOffset:a,sideOffset:n,className:o.cn("tw:min-w-36 tw:origin-(--radix-menubar-content-transform-origin) tw:overflow-hidden tw:rounded-lg tw:bg-popover tw:p-1 tw:text-popover-foreground tw:shadow-md tw:ring-1 tw:ring-foreground/10 tw:duration-100 tw:data-[side=bottom]:slide-in-from-top-2 tw:data-[side=left]:slide-in-from-right-2 tw:data-[side=right]:slide-in-from-left-2 tw:data-[side=top]:slide-in-from-bottom-2 tw:data-open:animate-in tw:data-open:fade-in-0 tw:data-open:zoom-in-95 tw:animate-none! tw:**:data-[slot$=-item]:focus:bg-foreground/10 tw:**:data-[slot$=-item]:data-highlighted:bg-foreground/10 tw:**:data-[slot$=-separator]:bg-foreground/5 tw:**:data-[slot$=-trigger]:focus:bg-foreground/10 tw:**:data-[slot$=-trigger]:aria-expanded:bg-foreground/10! tw:**:data-[variant=destructive]:focus:bg-foreground/10! tw:**:data-[variant=destructive]:text-accent-foreground! tw:**:data-[variant=destructive]:**:text-accent-foreground! tw:relative","pr-twp",t),style:{zIndex:o.Z_INDEX_ABOVE_DOCK,...i},...l})})}function fl({className:t,inset:r,variant:a="default",...n}){const i=o.useMenuContext();return e.jsx(G.Menubar.Item,{"data-slot":"menubar-item","data-inset":r,"data-variant":a,className:o.cn("tw:group/menubar-item tw:relative tw:flex tw:cursor-default tw:items-center tw:gap-1.5 tw:rounded-md tw:px-1.5 tw:py-1 tw:text-sm tw:outline-hidden tw:select-none tw:focus:bg-accent tw:focus:text-accent-foreground tw:not-data-[variant=destructive]:focus:**:text-accent-foreground tw:data-inset:ps-7 tw:data-[variant=destructive]:text-destructive tw:data-[variant=destructive]:focus:bg-destructive/10 tw:data-[variant=destructive]:focus:text-destructive tw:dark:data-[variant=destructive]:focus:bg-destructive/20 tw:data-disabled:pointer-events-none tw:data-disabled:opacity-50 tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0 tw:[&_svg:not([class*=size-])]:size-4 tw:data-[variant=destructive]:*:[svg]:text-destructive!",o.menuVariants({variant:i.variant,className:t})),...n})}function ml({className:t,...r}){return e.jsx(G.Menubar.Separator,{"data-slot":"menubar-separator",className:o.cn("tw:-mx-1 tw:my-1 tw:h-px tw:bg-border",t),...r})}function vl({className:t,...r}){return e.jsx("span",{"data-slot":"menubar-shortcut",className:o.cn("tw:[unicode-bidi:plaintext] tw:ms-auto tw:text-xs tw:tracking-widest tw:text-muted-foreground tw:group-focus/menubar-item:text-accent-foreground",t),...r})}function bl({...t}){return e.jsx(G.Menubar.Sub,{"data-slot":"menubar-sub",...t})}function xl({className:t,inset:r,children:a,...n}){const i=o.useMenuContext();return e.jsxs(G.Menubar.SubTrigger,{"data-slot":"menubar-sub-trigger","data-inset":r,className:o.cn("tw:flex tw:cursor-default tw:items-center tw:gap-1.5 tw:rounded-md tw:px-1.5 tw:py-1 tw:text-sm tw:outline-none tw:select-none tw:focus:bg-accent tw:focus:text-accent-foreground tw:data-inset:ps-7 tw:data-open:bg-accent tw:data-open:text-accent-foreground tw:[&_svg:not([class*=size-])]:size-4",o.menuVariants({variant:i.variant,className:t})),...n,children:[a,e.jsx(Dt.IconChevronRight,{className:"tw:ms-auto tw:size-4"})]})}function yl({className:t,style:r,...a}){return e.jsx(G.Menubar.SubContent,{"data-slot":"menubar-sub-content",className:o.cn("tw:min-w-32 tw:origin-(--radix-menubar-content-transform-origin) tw:overflow-hidden tw:rounded-lg tw:bg-popover tw:p-1 tw:text-popover-foreground tw:shadow-lg tw:ring-1 tw:ring-foreground/10 tw:duration-100 tw:data-[side=bottom]:slide-in-from-top-2 tw:data-[side=left]:slide-in-from-right-2 tw:data-[side=right]:slide-in-from-left-2 tw:data-[side=top]:slide-in-from-bottom-2 tw:data-open:animate-in tw:data-open:fade-in-0 tw:data-open:zoom-in-95 tw:data-closed:animate-out tw:data-closed:fade-out-0 tw:data-closed:zoom-out-95 tw:animate-none! tw:**:data-[slot$=-item]:focus:bg-foreground/10 tw:**:data-[slot$=-item]:data-highlighted:bg-foreground/10 tw:**:data-[slot$=-separator]:bg-foreground/5 tw:**:data-[slot$=-trigger]:focus:bg-foreground/10 tw:**:data-[slot$=-trigger]:aria-expanded:bg-foreground/10! tw:**:data-[variant=destructive]:focus:bg-foreground/10! tw:**:data-[variant=destructive]:text-accent-foreground! tw:**:data-[variant=destructive]:**:text-accent-foreground! tw:relative",t),style:{zIndex:o.Z_INDEX_ABOVE_DOCK,...r},...a})}const qe=(t,r)=>{setTimeout(()=>{r.forEach(a=>{var n;(n=t.current)==null||n.dispatchEvent(new KeyboardEvent("keydown",a))})},0)},bn=(t,r,a,n)=>{if(!a)return;const i=Object.entries(t).filter(([l,c])=>"column"in c&&c.column===a||l===a).sort(([,l],[,c])=>l.order-c.order);return i.flatMap(([l],c)=>{const d=r.filter(w=>w.group===l).sort((w,p)=>w.order-p.order).map(w=>e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:"command"in w?e.jsxs(fl,{onClick:()=>{n(w)},children:[w.iconPathBefore&&e.jsx(Cr,{icon:w.iconPathBefore,menuLabel:w.label,leading:!0}),w.label,w.iconPathAfter&&e.jsx(Cr,{icon:w.iconPathAfter,menuLabel:w.label}),w.shortcut&&e.jsx(vl,{children:w.shortcut})]},`menubar-item-${w.label}-${w.command}`):e.jsxs(bl,{children:[e.jsx(xl,{children:w.label}),e.jsx(yl,{children:bn(t,r,pn(t,w.id),n)})]},`menubar-sub-${w.label}-${w.id}`)}),w.tooltip&&e.jsx(o.TooltipContent,{children:w.tooltip})]},`tooltip-${w.label}-${"command"in w?w.command:w.id}`)),u=[...d];return d.length>0&&c{switch(p){case"platform.app":return l;case"platform.window":return c;case"platform.layout":return d;case"platform.help":return u;default:return}};if(Mn.useHotkeys(["alt","alt+p","alt+l","alt+n","alt+h"],(p,h)=>{var x,y,f,N;p.preventDefault();const g={key:"Escape",code:"Escape",keyCode:27,bubbles:!0},m={key:" ",code:"Space",keyCode:32,bubbles:!0};switch(h.hotkey){case"alt":qe(l,[g]);break;case"alt+p":(x=l.current)==null||x.focus(),qe(l,[g,m]);break;case"alt+l":(y=c.current)==null||y.focus(),qe(c,[g,m]);break;case"alt+n":(f=d.current)==null||f.focus(),qe(d,[g,m]);break;case"alt+h":(N=u.current)==null||N.focus(),qe(u,[g,m]);break}}),s.useEffect(()=>{if(!a||!i.current)return;const p=new MutationObserver(m=>{m.forEach(x=>{if(x.attributeName==="data-state"&&x.target instanceof HTMLElement){const y=x.target.getAttribute("data-state");a(y==="open")}})});return i.current.querySelectorAll("[data-state]").forEach(m=>{p.observe(m,{attributes:!0})}),()=>p.disconnect()},[a]),!!t)return e.jsx(wl,{ref:i,className:"pr-twp tw:border-0 tw:bg-transparent",variant:n,children:hn(t.columns).map(({columnKey:p,column:h})=>e.jsxs(ul,{children:[e.jsx(hl,{ref:w(p),children:h.label}),e.jsx(gl,{style:{zIndex:o.Z_INDEX_ABOVE_DOCK},children:e.jsx(o.TooltipProvider,{children:bn(t.groups,t.items,p,r)})})]},p))})}const _l=Object.freeze([950,800,700]);function jl(t){switch(t){case void 0:return;case"darwin":return"tw:ps-[85px]";default:return"tw:pe-[calc(138px+1rem)]"}}function Cl({menuData:t,onOpenChange:r,onSelectMenuItem:a,className:n,id:i,children:l,appMenuAreaChildren:c,configAreaChildren:d,shouldUseAsAppDragArea:u,menubarVariant:w="default"}){const[p,h]=s.useState(void 0),g=s.useCallback(y=>h(y??void 0),[]),m=ga(p,_l),x=ra()??m;return e.jsx(Je.Provider,{value:x,children:e.jsx("div",{className:o.cn("tw:border tw:px-4 tw:text-foreground",n),style:{position:"relative"},id:i,children:e.jsxs("div",{"data-testid":"toolbar-content-row",className:"tw:flex tw:h-full tw:w-full tw:justify-between tw:overflow-hidden",ref:g,style:u?{WebkitAppRegion:"drag"}:void 0,children:[e.jsx("div",{className:"tw:flex tw:shrink-0 tw:grow tw:basis-0",children:e.jsxs("div",{className:"tw:flex tw:items-center tw:gap-2",style:u?{WebkitAppRegion:"no-drag"}:void 0,children:[c,t&&e.jsx(kl,{menuData:t,onOpenChange:r,onSelectMenuItem:a,variant:w})]})}),e.jsx("div",{"data-testid":"toolbar-content-area",className:"tw:flex tw:min-w-0 tw:shrink tw:items-center tw:gap-2 tw:overflow-clip tw:px-2",style:u?{WebkitAppRegion:"no-drag"}:void 0,children:l}),e.jsx("div",{className:"tw:flex tw:min-w-0 tw:grow tw:basis-0 tw:justify-end",children:e.jsx("div",{className:"tw:flex tw:min-w-0 tw:items-center tw:gap-2 tw:pe-1",style:u?{WebkitAppRegion:"no-drag"}:void 0,children:d})})]})})})}const Nl=(t,r)=>t[r]??r;function El({knownUiLanguages:t,primaryLanguage:r="en",fallbackLanguages:a=[],onLanguagesChange:n,onPrimaryLanguageChange:i,onFallbackLanguagesChange:l,localizedStrings:c,className:d,id:u}){const w=Nl(c,"%settings_uiLanguageSelector_fallbackLanguages%"),[p,h]=s.useState(!1),g=x=>{i&&i(x),n&&n([x,...a.filter(y=>y!==x)]),l&&a.find(y=>y===x)&&l([...a.filter(y=>y!==x)]),h(!1)},m=(x,y)=>{var N,k,C,j,L,S;const f=y!==x?((k=(N=t[x])==null?void 0:N.uiNames)==null?void 0:k[y])??((j=(C=t[x])==null?void 0:C.uiNames)==null?void 0:j.en):void 0;return f?`${(L=t[x])==null?void 0:L.autonym} (${f})`:(S=t[x])==null?void 0:S.autonym};return e.jsxs("div",{id:u,className:o.cn("pr-twp tw:max-w-sm",d),children:[e.jsxs(Te,{name:"uiLanguage",value:r,onValueChange:g,open:p,onOpenChange:x=>h(x),children:[e.jsx(Re,{children:e.jsx(Se,{})}),e.jsx(Me,{style:{zIndex:o.Z_INDEX_ABOVE_DOCK},children:Object.keys(t).map(x=>e.jsx(ae,{value:x,children:m(x,r)},x))})]}),r!=="en"&&e.jsx("div",{className:"tw:pt-3",children:e.jsx(o.Label,{className:"tw:font-normal tw:text-muted-foreground",children:B.formatReplacementString(w,{fallbackLanguages:(a==null?void 0:a.length)>0?a.map(x=>m(x,r)).join(", "):t.en.autonym})})})]})}const Tl=Object.freeze(["%firstRun_language_search_placeholder%","%firstRun_language_noResults%","%firstRun_language_selected%"]);function xn(t){return t.normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase()}function Sl(t,r){if(!r)return t;const a=xn(r);return t.filter(({keywords:n})=>n.some(i=>i.includes(a)))}function Rl(t){return[...t].sort(([r,a],[n,i])=>r==="en"&&n!=="en"?-1:n==="en"&&r!=="en"?1:a.autonym.localeCompare(i.autonym))}function Ml({languages:t,value:r,onChange:a,localizedStrings:n,className:i,id:l}){const[c,d]=s.useState(""),[u,w]=s.useState(),p=s.useRef(null),h=s.useRef(null),g=s.useRef(new Map),[m,x]=s.useState(),y=s.useMemo(()=>Rl(Object.entries(t)).map(([S,O])=>({tag:S,info:O,keywords:[O.autonym,...Object.values(O.uiNames??{}),...O.otherNames??[]].map(xn)})),[t]),f=s.useMemo(()=>Sl(y,c),[y,c]),N=s.useMemo(()=>{var O;const S=M=>!!M&&f.some(E=>E.tag===M);return S(u)?u:S(r)?r:((O=f[0])==null?void 0:O.tag)??""},[u,r,f]),k=y.length>1;s.useLayoutEffect(()=>{var S;x((S=h.current)==null?void 0:S.id)},[]),s.useLayoutEffect(()=>{const S=g.current.get(N),O=k?p.current:void 0;O&&(S?O.setAttribute("aria-activedescendant",S.id):O.removeAttribute("aria-activedescendant")),S&&N!==u&&S.scrollIntoView({block:"nearest"})},[N,u,k]);const C=n["%firstRun_language_search_placeholder%"]??"",j=n["%firstRun_language_noResults%"]??"",L=n["%firstRun_language_selected%"]??"";return e.jsxs(o.Command,{id:l,className:o.cn("pr-twp",i),shouldFilter:!1,value:N,onValueChange:w,children:[k&&e.jsx("div",{"data-slot":"command-input-wrapper",className:"tw:p-1 tw:pb-0",children:e.jsxs(o.InputGroup,{className:"tw:h-8! tw:rounded-lg! tw:border-input/30 tw:bg-input/30 tw:shadow-none! tw:*:data-[slot=input-group-addon]:ps-2!",children:[e.jsx("input",{ref:p,"data-slot":"command-input",type:"text",role:"combobox","aria-expanded":!0,"aria-controls":m,"aria-autocomplete":"list",placeholder:C,"aria-label":C,value:c,onChange:S=>{d(S.currentTarget.value),w(void 0)},className:"tw:w-full tw:text-sm tw:outline-hidden tw:disabled:cursor-not-allowed tw:disabled:opacity-50"}),e.jsx(o.InputGroupAddon,{children:e.jsx(Dt.IconSearch,{className:"tw:size-4 tw:shrink-0 tw:opacity-50"})})]})}),e.jsxs(o.CommandList,{ref:h,children:[e.jsx(o.CommandEmpty,{children:j}),f.map(({tag:S,info:O})=>{const M=S===r;return e.jsxs(o.CommandItem,{ref:E=>{E?g.current.set(S,E):g.current.delete(S)},value:S,"aria-current":M?"true":void 0,"data-checked":M?"true":void 0,onSelect:()=>a(S),children:[e.jsx("span",{dir:"auto",children:O.autonym}),M&&e.jsx("span",{className:"tw:sr-only",children:L})]},S)})]})]})}function Dl({item:t,createLabel:r,createComplexLabel:a}){return r?e.jsx(o.Label,{children:r(t)}):a?e.jsx(o.Label,{children:a(t)}):e.jsx(o.Label,{children:t})}function yn({id:t,className:r,listItems:a,selectedListItems:n,handleSelectListItem:i,createLabel:l,createComplexLabel:c}){return e.jsx("div",{id:t,className:r,children:a.map(d=>e.jsxs("div",{className:"tw:m-2 tw:flex tw:items-center",children:[e.jsx(ha,{className:"tw:me-2 tw:align-middle",checked:n.includes(d),onCheckedChange:u=>i(d,u)}),e.jsx(Dl,{item:d,createLabel:l,createComplexLabel:c})]},d))})}const Il=yn;function Ol(t,r){const[a,n]=s.useState(t),[i,l]=s.useState(r);return t!==a&&(n(t),t&&l(r)),t?r:i}function Pl({open:t,anchorRect:r,message:a,confirmingKeyLabel:n,side:i="bottom",align:l="start",showArrow:c=!0}){const d=t?B.formatReplacementStringToArray(a,{key:n}).join(""):"",{anchorRect:u,message:w,confirmingKeyLabel:p,showArrow:h}=Ol(t,{anchorRect:r,message:a,confirmingKeyLabel:n,showArrow:c});return e.jsxs(o.TooltipProvider,{children:[e.jsx("span",{role:"status",className:"tw:sr-only",children:d}),e.jsxs(o.Tooltip,{open:t,onOpenChange:()=>{},children:[e.jsx(o.TooltipTrigger,{"aria-hidden":"true",tabIndex:-1,className:o.cn("tw:absolute tw:opacity-0 tw:pointer-events-none","tw:p-0 tw:border-0 tw:bg-transparent tw:cursor-default tw:min-w-0 tw:min-h-0"),style:{top:u.top,left:u.left,width:u.width,height:u.height}}),e.jsx(o.TooltipContent,{side:i,align:l,showArrow:h,arrowPadding:8,className:o.cn("tw:p-0 tw:has-data-[slot=kbd]:pe-0 tw:bg-background tw:text-destructive tw:border tw:border-destructive"),arrowClassName:"tw:bg-[color-mix(in_oklab,var(--destructive)_10%,var(--background))] tw:fill-[color-mix(in_oklab,var(--destructive)_10%,var(--background))] tw:border tw:border-destructive",children:e.jsx("div",{className:"tw:w-full tw:h-full tw:rounded-md tw:bg-destructive/10 tw:px-3 tw:py-1.5",children:B.formatReplacementStringToArray(w,{key:e.jsx(o.Kbd,{className:o.cn("tw:border tw:border-destructive tw:in-data-[slot=tooltip-content]:text-destructive","tw:align-middle"),children:p})}).map((g,m)=>e.jsx(s.Fragment,{children:g},`key-${m}`))})})]})]})}function Ll({cardKey:t,isSelected:r,onSelect:a,isDenied:n,isHidden:i=!1,className:l,children:c,selectedButtons:d,hoverButtons:u,dropdownContent:w,additionalContent:p,accentColor:h,showDropdownOnHover:g=!1}){const m=f=>{if(f.key==="Enter"||f.key===" "){if(f.target!==f.currentTarget)return;f.preventDefault(),a()}},[x,y]=s.useState(!1);return e.jsxs("div",{hidden:i,onClick:a,onKeyDown:m,onMouseEnter:()=>y(!0),onFocus:()=>y(!0),role:"button",tabIndex:0,"aria-pressed":r,className:o.cn("tw:group tw:relative tw:min-w-36 tw:rounded-xl tw:border tw:shadow-none tw:hover:bg-muted/50",{"tw:opacity-50 tw:hover:opacity-100":n&&!r},{"tw:bg-accent":r},{"tw:bg-transparent":!r},l),children:[e.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-2 tw:p-4",children:[e.jsxs("div",{className:"tw:flex tw:justify-between tw:overflow-hidden",children:[e.jsx("div",{className:"tw:min-w-0 tw:flex-1",children:c}),r&&d,!r&&u&&e.jsx("div",{className:"tw:invisible tw:group-hover:visible",children:u}),w&&(r||g&&x)&&e.jsx("div",{className:o.cn(!r&&g&&"tw:invisible tw:group-hover:visible"),children:e.jsxs(o.DropdownMenu,{children:[e.jsx(o.DropdownMenuTrigger,{className:o.cn(h&&"tw:me-1"),asChild:!0,children:e.jsx(o.Button,{className:"tw:m-1 tw:h-6 tw:w-6",variant:"ghost",size:"icon",onClick:f=>f.stopPropagation(),onFocus:f=>f.stopPropagation(),children:e.jsx(z.MoreVertical,{})})}),e.jsx(o.DropdownMenuContent,{align:"end",children:w})]})})]}),p&&e.jsx("div",{className:"tw:w-fit tw:min-w-0 tw:max-w-full tw:overflow-hidden",children:p})]}),h&&e.jsx("div",{className:`tw:absolute tw:right-0 tw:top-0 tw:h-full tw:w-2 tw:rounded-r-xl ${h}`})]},t)}function Al({id:t,isDisabled:r=!1,hasError:a=!1,isFullWidth:n=!1,helperText:i,label:l,placeholder:c,isRequired:d=!1,className:u,defaultValue:w,value:p,onChange:h,onFocus:g,onBlur:m}){return e.jsxs("div",{className:o.cn("tw:inline-grid tw:items-center tw:gap-1.5",{"tw:w-full":n}),children:[e.jsx(o.Label,{htmlFor:t,className:o.cn({"tw:text-red-600":a,"tw:hidden":!l}),children:`${l}${d?"*":""}`}),e.jsx(o.Input,{id:t,disabled:r,placeholder:c,required:d,className:o.cn(u,{"tw:border-red-600":a}),defaultValue:w,value:p,onChange:h,onFocus:g,onBlur:m}),e.jsx("p",{className:o.cn({"tw:hidden":!i}),children:i})]})}function Bl({currentStep:t,totalSteps:r,locale:a}){const n=a||"en",i=s.useMemo(()=>{const d=new B.NumberFormat(n);return u=>d.format(u)},[n]),l=Math.min(Math.max(t,1),r),c=Array.from({length:r},(d,u)=>u+1);return e.jsx("div",{className:"tw:flex tw:items-center","aria-hidden":"true",children:c.map(d=>{let u="upcoming";return d===l?u="active":d1&&e.jsx("div",{className:"tw:h-px tw:flex-1 tw:bg-border"}),e.jsx("div",{"data-state":u,className:o.cn("tw:flex tw:h-8 tw:w-8 tw:shrink-0 tw:items-center tw:justify-center tw:rounded-full tw:text-sm tw:font-medium",u==="active"&&"tw:bg-primary tw:text-primary-foreground",u==="complete"&&"tw:bg-muted tw:text-muted-foreground",u==="upcoming"&&"tw:border tw:border-input tw:text-muted-foreground"),children:u==="complete"?e.jsx(z.Check,{className:"tw:h-4 tw:w-4"}):i(d)})]},d)})})}function zl({...t}){return e.jsx(G.ContextMenu.Root,{"data-slot":"context-menu",...t})}function $l({className:t,...r}){return e.jsx(G.ContextMenu.Trigger,{"data-slot":"context-menu-trigger",className:o.cn("tw:select-none",t),...r})}function Vl({...t}){return e.jsx(G.ContextMenu.Group,{"data-slot":"context-menu-group",...t})}function Fl({...t}){return e.jsx(G.ContextMenu.Portal,{"data-slot":"context-menu-portal",...t})}function Gl({...t}){return e.jsx(G.ContextMenu.Sub,{"data-slot":"context-menu-sub",...t})}function Kl({...t}){return e.jsx(G.ContextMenu.RadioGroup,{"data-slot":"context-menu-radio-group",...t})}function Ul({className:t,style:r,...a}){return e.jsx(G.ContextMenu.Portal,{children:e.jsx(G.ContextMenu.Content,{"data-slot":"context-menu-content",className:o.cn("pr-twp tw:max-h-(--radix-context-menu-content-available-height) tw:min-w-36 tw:origin-(--radix-context-menu-content-transform-origin) tw:overflow-x-hidden tw:overflow-y-auto tw:rounded-lg tw:bg-popover tw:p-1 tw:text-popover-foreground tw:shadow-md tw:ring-1 tw:ring-foreground/10 tw:duration-100 tw:data-[side=bottom]:slide-in-from-top-2 tw:data-[side=left]:slide-in-from-right-2 tw:data-[side=right]:slide-in-from-left-2 tw:data-[side=top]:slide-in-from-bottom-2 tw:data-open:animate-in tw:data-open:fade-in-0 tw:data-open:zoom-in-95 tw:data-closed:animate-out tw:data-closed:fade-out-0 tw:data-closed:zoom-out-95 tw:animate-none! tw:**:data-[slot$=-item]:focus:bg-foreground/10 tw:**:data-[slot$=-item]:data-highlighted:bg-foreground/10 tw:**:data-[slot$=-separator]:bg-foreground/5 tw:**:data-[slot$=-trigger]:focus:bg-foreground/10 tw:**:data-[slot$=-trigger]:aria-expanded:bg-foreground/10! tw:**:data-[variant=destructive]:focus:bg-foreground/10! tw:**:data-[variant=destructive]:text-accent-foreground! tw:**:data-[variant=destructive]:**:text-accent-foreground! tw:relative",t),style:{zIndex:o.Z_INDEX_ABOVE_DOCK,...r},...a})})}function Hl({className:t,inset:r,variant:a="default",...n}){return e.jsx(G.ContextMenu.Item,{"data-slot":"context-menu-item","data-inset":r,"data-variant":a,className:o.cn("pr-twp tw:group/context-menu-item tw:relative tw:flex tw:cursor-default tw:items-center tw:gap-1.5 tw:rounded-md tw:px-1.5 tw:py-1 tw:text-sm tw:outline-hidden tw:select-none tw:focus:bg-accent tw:focus:text-accent-foreground tw:data-inset:ps-7 tw:data-[variant=destructive]:text-destructive tw:data-[variant=destructive]:focus:bg-destructive/10 tw:data-[variant=destructive]:focus:text-destructive tw:dark:data-[variant=destructive]:focus:bg-destructive/20 tw:data-disabled:pointer-events-none tw:data-disabled:opacity-50 tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0 tw:[&_svg:not([class*=size-])]:size-4 tw:focus:*:[svg]:text-accent-foreground tw:data-[variant=destructive]:*:[svg]:text-destructive",t),...n})}function ql({className:t,inset:r,children:a,...n}){return e.jsxs(G.ContextMenu.SubTrigger,{"data-slot":"context-menu-sub-trigger","data-inset":r,className:o.cn("pr-twp tw:flex tw:cursor-default tw:items-center tw:gap-1.5 tw:rounded-md tw:px-1.5 tw:py-1 tw:text-sm tw:outline-hidden tw:select-none tw:focus:bg-accent tw:focus:text-accent-foreground tw:data-inset:ps-7 tw:data-open:bg-accent tw:data-open:text-accent-foreground tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0 tw:[&_svg:not([class*=size-])]:size-4",t),...n,children:[a,e.jsx(Dt.IconChevronRight,{className:"tw:ms-auto"})]})}function Yl({className:t,style:r,...a}){return e.jsx(G.ContextMenu.SubContent,{"data-slot":"context-menu-sub-content",className:o.cn("pr-twp tw:min-w-32 tw:origin-(--radix-context-menu-content-transform-origin) tw:overflow-hidden tw:rounded-lg tw:bg-popover tw:p-1 tw:text-popover-foreground tw:shadow-lg tw:ring-1 tw:ring-foreground/10 tw:duration-100 tw:data-[side=bottom]:slide-in-from-top-2 tw:data-[side=left]:slide-in-from-right-2 tw:data-[side=right]:slide-in-from-left-2 tw:data-[side=top]:slide-in-from-bottom-2 tw:data-open:animate-in tw:data-open:fade-in-0 tw:data-open:zoom-in-95 tw:data-closed:animate-out tw:data-closed:fade-out-0 tw:data-closed:zoom-out-95 tw:animate-none! tw:**:data-[slot$=-item]:focus:bg-foreground/10 tw:**:data-[slot$=-item]:data-highlighted:bg-foreground/10 tw:**:data-[slot$=-separator]:bg-foreground/5 tw:**:data-[slot$=-trigger]:focus:bg-foreground/10 tw:**:data-[slot$=-trigger]:aria-expanded:bg-foreground/10! tw:**:data-[variant=destructive]:focus:bg-foreground/10! tw:**:data-[variant=destructive]:text-accent-foreground! tw:**:data-[variant=destructive]:**:text-accent-foreground! tw:relative",t),style:{zIndex:o.Z_INDEX_ABOVE_DOCK,...r},...a})}function Xl({className:t,children:r,checked:a,inset:n,...i}){return e.jsxs(G.ContextMenu.CheckboxItem,{"data-slot":"context-menu-checkbox-item","data-inset":n,className:o.cn("pr-twp tw:relative tw:flex tw:cursor-default tw:items-center tw:gap-1.5 tw:rounded-md tw:py-1 tw:pe-8 tw:ps-1.5 tw:text-sm tw:outline-hidden tw:select-none tw:focus:bg-accent tw:focus:text-accent-foreground tw:data-inset:ps-7 tw:data-disabled:pointer-events-none tw:data-disabled:opacity-50 tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0 tw:[&_svg:not([class*=size-])]:size-4",t),checked:a,...i,children:[e.jsx("span",{className:"tw:pointer-events-none tw:absolute tw:end-2",children:e.jsx(G.ContextMenu.ItemIndicator,{children:e.jsx(Dt.IconCheck,{})})}),r]})}function Wl({className:t,children:r,inset:a,...n}){return e.jsxs(G.ContextMenu.RadioItem,{"data-slot":"context-menu-radio-item","data-inset":a,className:o.cn("pr-twp tw:relative tw:flex tw:cursor-default tw:items-center tw:gap-1.5 tw:rounded-md tw:py-1 tw:pe-8 tw:ps-1.5 tw:text-sm tw:outline-hidden tw:select-none tw:focus:bg-accent tw:focus:text-accent-foreground tw:data-inset:ps-7 tw:data-disabled:pointer-events-none tw:data-disabled:opacity-50 tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0 tw:[&_svg:not([class*=size-])]:size-4",t),...n,children:[e.jsx("span",{className:"tw:pointer-events-none tw:absolute tw:end-2",children:e.jsx(G.ContextMenu.ItemIndicator,{children:e.jsx(Dt.IconCheck,{})})}),r]})}function Zl({className:t,inset:r,...a}){return e.jsx(G.ContextMenu.Label,{"data-slot":"context-menu-label","data-inset":r,className:o.cn("pr-twp tw:px-1.5 tw:py-1 tw:text-xs tw:font-medium tw:text-muted-foreground tw:data-inset:ps-7",t),...a})}function Jl({className:t,...r}){return e.jsx(G.ContextMenu.Separator,{"data-slot":"context-menu-separator",className:o.cn("pr-twp tw:-mx-1 tw:my-1 tw:h-px tw:bg-border",t),...r})}function Ql({className:t,...r}){return e.jsx("span",{"data-slot":"context-menu-shortcut",className:o.cn("pr-twp tw:[unicode-bidi:plaintext] tw:ms-auto tw:text-xs tw:tracking-widest tw:text-muted-foreground tw:group-focus/context-menu-item:text-accent-foreground",t),...r})}function td({...t}){return e.jsx(je.Drawer.Root,{"data-slot":"drawer",...t})}function ed({...t}){return e.jsx(je.Drawer.Trigger,{"data-slot":"drawer-trigger",...t})}function kn({...t}){return e.jsx(je.Drawer.Portal,{"data-slot":"drawer-portal",...t})}function rd({...t}){return e.jsx(je.Drawer.Close,{"data-slot":"drawer-close",...t})}function _n({className:t,...r}){return e.jsx(je.Drawer.Overlay,{"data-slot":"drawer-overlay",className:o.cn("pr-twp tw:fixed tw:inset-0 tw:z-50 tw:bg-black/10 tw:supports-backdrop-filter:backdrop-blur-xs tw:data-open:animate-in tw:data-open:fade-in-0 tw:data-closed:animate-out tw:data-closed:fade-out-0",t),...r})}function ad({className:t,children:r,hideDrawerHandle:a=!1,...n}){const i=o.readDirection();return e.jsxs(kn,{"data-slot":"drawer-portal",children:[e.jsx(_n,{}),e.jsxs(je.Drawer.Content,{"data-slot":"drawer-content",className:o.cn("pr-twp tw:group/drawer-content tw:fixed tw:z-50 tw:flex tw:h-auto tw:flex-col tw:bg-popover tw:text-sm tw:text-popover-foreground tw:data-[vaul-drawer-direction=bottom]:inset-x-0 tw:data-[vaul-drawer-direction=bottom]:bottom-0 tw:data-[vaul-drawer-direction=bottom]:mt-24 tw:data-[vaul-drawer-direction=bottom]:max-h-[80vh] tw:data-[vaul-drawer-direction=bottom]:rounded-t-xl tw:data-[vaul-drawer-direction=bottom]:border-t tw:data-[vaul-drawer-direction=left]:inset-y-0 tw:data-[vaul-drawer-direction=left]:left-0 tw:data-[vaul-drawer-direction=left]:w-3/4 tw:data-[vaul-drawer-direction=left]:rounded-r-xl tw:data-[vaul-drawer-direction=left]:border-r tw:data-[vaul-drawer-direction=left]:flex-row tw:data-[vaul-drawer-direction=right]:inset-y-0 tw:data-[vaul-drawer-direction=right]:right-0 tw:data-[vaul-drawer-direction=right]:w-3/4 tw:data-[vaul-drawer-direction=right]:rounded-l-xl tw:data-[vaul-drawer-direction=right]:border-l tw:data-[vaul-drawer-direction=right]:flex-row tw:data-[vaul-drawer-direction=top]:inset-x-0 tw:data-[vaul-drawer-direction=top]:top-0 tw:data-[vaul-drawer-direction=top]:mb-24 tw:data-[vaul-drawer-direction=top]:max-h-[80vh] tw:data-[vaul-drawer-direction=top]:rounded-b-xl tw:data-[vaul-drawer-direction=top]:border-b tw:data-[vaul-drawer-direction=left]:sm:max-w-sm tw:data-[vaul-drawer-direction=right]:sm:max-w-sm",t),dir:"ltr",...n,children:[!a&&e.jsx("div",{className:"tw:hidden tw:shrink-0 tw:rounded-full tw:bg-muted tw:group-data-[vaul-drawer-direction=bottom]/drawer-content:mx-auto tw:group-data-[vaul-drawer-direction=bottom]/drawer-content:mt-4 tw:group-data-[vaul-drawer-direction=bottom]/drawer-content:h-1.5 tw:group-data-[vaul-drawer-direction=bottom]/drawer-content:w-[100px] tw:group-data-[vaul-drawer-direction=bottom]/drawer-content:block tw:group-data-[vaul-drawer-direction=right]/drawer-content:my-auto tw:group-data-[vaul-drawer-direction=right]/drawer-content:ms-4 tw:group-data-[vaul-drawer-direction=right]/drawer-content:h-[100px] tw:group-data-[vaul-drawer-direction=right]/drawer-content:w-1.5 tw:group-data-[vaul-drawer-direction=right]/drawer-content:block"}),e.jsx("div",{className:"tw:flex tw:min-w-0 tw:flex-1 tw:flex-col",dir:i,children:r}),!a&&e.jsx("div",{className:"tw:hidden tw:shrink-0 tw:rounded-full tw:bg-muted tw:group-data-[vaul-drawer-direction=top]/drawer-content:mx-auto tw:group-data-[vaul-drawer-direction=top]/drawer-content:mb-4 tw:group-data-[vaul-drawer-direction=top]/drawer-content:h-1.5 tw:group-data-[vaul-drawer-direction=top]/drawer-content:w-[100px] tw:group-data-[vaul-drawer-direction=top]/drawer-content:block tw:group-data-[vaul-drawer-direction=left]/drawer-content:my-auto tw:group-data-[vaul-drawer-direction=left]/drawer-content:me-4 tw:group-data-[vaul-drawer-direction=left]/drawer-content:h-[100px] tw:group-data-[vaul-drawer-direction=left]/drawer-content:w-1.5 tw:group-data-[vaul-drawer-direction=left]/drawer-content:block"})]})]})}function od({className:t,...r}){return e.jsx("div",{"data-slot":"drawer-header",className:o.cn("pr-twp tw:flex tw:flex-col tw:gap-0.5 tw:p-4 tw:group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center tw:group-data-[vaul-drawer-direction=top]/drawer-content:text-center tw:md:gap-0.5 tw:md:text-start",t),...r})}function nd({className:t,...r}){return e.jsx("div",{"data-slot":"drawer-footer",className:o.cn("pr-twp tw:mt-auto tw:flex tw:flex-col tw:gap-2 tw:p-4",t),...r})}function id({className:t,...r}){return e.jsx(je.Drawer.Title,{"data-slot":"drawer-title",className:o.cn("pr-twp tw:font-heading tw:text-base tw:font-medium tw:text-foreground",t),...r})}function sd({className:t,...r}){return e.jsx(je.Drawer.Description,{"data-slot":"drawer-description",className:o.cn("pr-twp tw:text-sm tw:text-muted-foreground",t),...r})}function cd({className:t,value:r,...a}){return e.jsx(G.Progress.Root,{"data-slot":"progress",className:o.cn("pr-twp tw:relative tw:flex tw:h-1 tw:w-full tw:items-center tw:overflow-x-hidden tw:rounded-full tw:bg-muted",t),...a,children:e.jsx(G.Progress.Indicator,{"data-slot":"progress-indicator",className:"tw:size-full tw:flex-1 tw:bg-primary tw:transition-all",style:{transform:`translateX(-${100-(r||0)}%)`}})})}function ld({...t}){const{theme:r="system"}=Dn.useTheme(),a=r==="light"||r==="dark"||r==="system"?r:"system",n={"--normal-bg":"var(--popover)","--normal-text":"var(--popover-foreground)","--normal-border":"var(--border)","--border-radius":"var(--radius)"};return e.jsx(Xa.Toaster,{theme:a,className:"tw:toaster tw:group",icons:{success:e.jsx(Dt.IconCircleCheck,{className:"tw:size-4"}),info:e.jsx(Dt.IconInfoCircle,{className:"tw:size-4"}),warning:e.jsx(Dt.IconAlertTriangle,{className:"tw:size-4"}),error:e.jsx(Dt.IconAlertOctagon,{className:"tw:size-4"}),loading:e.jsx(Dt.IconLoader,{className:"tw:size-4 tw:animate-spin"})},style:n,toastOptions:{classNames:{toast:"cn-toast"}},...t})}function dd({className:t,defaultValue:r,value:a,min:n=0,max:i=100,...l}){const c=o.readDirection(),d=s.useMemo(()=>Array.isArray(a)?a:Array.isArray(r)?r:[n,i],[a,r,n,i]);return e.jsxs(G.Slider.Root,{"data-slot":"slider",defaultValue:r,value:a,min:n,max:i,className:o.cn("pr-twp tw:relative tw:flex tw:w-full tw:touch-none tw:items-center tw:select-none tw:data-disabled:opacity-50 tw:data-vertical:h-full tw:data-vertical:min-h-40 tw:data-vertical:w-auto tw:data-vertical:flex-col",t),dir:c,...l,children:[e.jsx(G.Slider.Track,{"data-slot":"slider-track",className:"tw:relative tw:grow tw:overflow-hidden tw:rounded-full tw:bg-muted tw:data-horizontal:h-1 tw:data-horizontal:w-full tw:data-vertical:h-full tw:data-vertical:w-1",children:e.jsx(G.Slider.Range,{"data-slot":"slider-range",className:"tw:absolute tw:bg-primary tw:select-none tw:data-horizontal:h-full tw:data-vertical:w-full"})}),Array.from({length:d.length},(u,w)=>e.jsx(G.Slider.Thumb,{"data-slot":"slider-thumb",className:"tw:relative tw:block tw:size-3 tw:shrink-0 tw:rounded-full tw:border tw:border-ring tw:bg-white tw:ring-ring/50 tw:transition-[color,box-shadow] tw:select-none tw:after:absolute tw:after:-inset-2 tw:hover:ring-3 tw:focus-visible:ring-3 tw:focus-visible:outline-hidden tw:active:ring-3 tw:disabled:pointer-events-none tw:disabled:opacity-50"},w))]})}function wd({className:t,size:r="default",...a}){return e.jsx(G.Switch.Root,{"data-slot":"switch","data-size":r,className:o.cn("tw:peer pr-twp tw:group/switch tw:relative tw:inline-flex tw:shrink-0 tw:items-center tw:rounded-full tw:border tw:border-transparent tw:transition-all tw:outline-none tw:after:absolute tw:after:-inset-x-3 tw:after:-inset-y-2 tw:focus-visible:border-ring tw:focus-visible:ring-3 tw:focus-visible:ring-ring/50 tw:aria-invalid:border-destructive tw:aria-invalid:ring-3 tw:aria-invalid:ring-destructive/20 tw:data-[size=default]:h-[18.4px] tw:data-[size=default]:w-[32px] tw:data-[size=sm]:h-[14px] tw:data-[size=sm]:w-[24px] tw:dark:aria-invalid:border-destructive/50 tw:dark:aria-invalid:ring-destructive/40 tw:data-checked:bg-primary tw:data-unchecked:bg-input tw:dark:data-unchecked:bg-input/80 tw:data-disabled:cursor-not-allowed tw:data-disabled:opacity-50",t),...a,children:e.jsx(G.Switch.Thumb,{"data-slot":"switch-thumb",className:"tw:pointer-events-none tw:block tw:rounded-full tw:bg-background tw:ring-0 tw:transition-transform tw:group-data-[size=default]/switch:size-4 tw:group-data-[size=sm]/switch:size-3 tw:group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] tw:rtl:group-data-[size=default]/switch:data-checked:-translate-x-[calc(100%-2px)] tw:group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] tw:rtl:group-data-[size=sm]/switch:data-checked:-translate-x-[calc(100%-2px)] tw:dark:data-checked:bg-primary-foreground tw:group-data-[size=default]/switch:data-unchecked:translate-x-0 tw:rtl:group-data-[size=default]/switch:data-unchecked:-translate-x-0 tw:group-data-[size=sm]/switch:data-unchecked:translate-x-0 tw:rtl:group-data-[size=sm]/switch:data-unchecked:-translate-x-0 tw:dark:data-unchecked:bg-foreground"})})}function ud({className:t,orientation:r="horizontal",...a}){return e.jsx(G.Tabs.Root,{"data-slot":"tabs","data-orientation":r,className:o.cn("tw:group/tabs tw:flex tw:gap-2 tw:data-horizontal:flex-col",t),...a})}const pd=Ya.cva("tw:group/tabs-list tw:inline-flex tw:w-fit tw:items-center tw:justify-center tw:rounded-lg tw:p-[3px] tw:text-muted-foreground tw:group-data-horizontal/tabs:h-8 tw:group-data-vertical/tabs:h-fit tw:group-data-vertical/tabs:flex-col tw:data-[variant=line]:rounded-none",{variants:{variant:{default:"tw:bg-muted",line:"tw:gap-1 tw:bg-transparent"}},defaultVariants:{variant:"default"}});function hd({className:t,variant:r="default",...a}){const n=o.readDirection();return e.jsx(G.Tabs.List,{"data-slot":"tabs-list","data-variant":r,className:o.cn("pr-twp",pd({variant:r}),t),dir:n,...a})}function gd({className:t,...r}){return e.jsx(G.Tabs.Trigger,{"data-slot":"tabs-trigger",className:o.cn("pr-twp tw:relative tw:inline-flex tw:h-[calc(100%-1px)] tw:flex-1 tw:items-center tw:justify-center tw:gap-1.5 tw:rounded-md tw:border tw:border-transparent tw:px-1.5 tw:py-0.5 tw:text-sm tw:font-medium tw:whitespace-nowrap tw:text-foreground/60 tw:transition-all tw:group-data-vertical/tabs:w-full tw:group-data-vertical/tabs:justify-start tw:hover:text-foreground tw:focus-visible:border-ring tw:focus-visible:ring-[3px] tw:focus-visible:ring-ring/50 tw:focus-visible:outline-1 tw:focus-visible:outline-ring tw:disabled:pointer-events-none tw:disabled:opacity-50 tw:has-data-[icon=inline-end]:pe-1 tw:has-data-[icon=inline-start]:ps-1 tw:dark:text-muted-foreground tw:dark:hover:text-foreground tw:group-data-[variant=default]/tabs-list:data-active:shadow-sm tw:group-data-[variant=line]/tabs-list:data-active:shadow-none tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0 tw:[&_svg:not([class*=size-])]:size-4","tw:group-data-[variant=line]/tabs-list:bg-transparent tw:group-data-[variant=line]/tabs-list:data-active:bg-transparent tw:dark:group-data-[variant=line]/tabs-list:data-active:border-transparent tw:dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent","tw:data-active:bg-background tw:data-active:text-foreground tw:dark:data-active:border-input tw:dark:data-active:bg-input/30 tw:dark:data-active:text-foreground","tw:after:absolute tw:after:bg-foreground tw:after:opacity-0 tw:after:transition-opacity tw:group-data-horizontal/tabs:after:inset-x-0 tw:group-data-horizontal/tabs:after:bottom-[-5px] tw:group-data-horizontal/tabs:after:h-0.5 tw:group-data-vertical/tabs:after:inset-y-0 tw:group-data-vertical/tabs:after:-end-1 tw:group-data-vertical/tabs:after:w-0.5 tw:group-data-[variant=line]/tabs-list:data-active:after:opacity-100",t),...r})}function fd({className:t,...r}){return e.jsx(G.Tabs.Content,{"data-slot":"tabs-content",className:o.cn("pr-twp tw:flex-1 tw:text-sm tw:outline-none",t),...r})}const md=(t,r)=>{s.useEffect(()=>{if(!t)return;let a=!1;const i=t(l=>{a||r(l)});return()=>{a=!0;try{i()}catch(l){console.error("useEvent: error while unsubscribing from event",l)}}},[t,r])},vd=(t,r)=>{s.useEffect(()=>{if(!t)return;let a=!1,n,i=!1;const l=d=>{a||r(d)},c=()=>{if(i||!n)return;i=!0;const d=n;(async()=>{try{await d()}catch(u){console.error("useEventAsync: error while unsubscribing from event",u)}})()};return(async()=>{try{n=await Promise.resolve(t(l)),a&&c()}catch(d){console.error("useEventAsync: error while subscribing to event",d)}})(),()=>{a=!0,c()}},[t,r])};function bd(t){return{preserveValue:!0,...t}}const jn=(t,r,a={})=>{const n=s.useRef(r);n.current=r;const i=s.useRef(a);i.current=bd(i.current);const[l,c]=s.useState(()=>n.current),[d,u]=s.useState(!0);return s.useEffect(()=>{let w=!0;return u(!!t),(async()=>{if(t)try{const p=await t();w&&(c(()=>p),u(!1))}catch(p){w&&u(!1),console.error("usePromise: the promise factory rejected, so there is no new value",p)}})(),()=>{w=!1,i.current.preserveValue||c(()=>n.current)}},[t]),[l,d]},xd=t=>{const[r,a]=s.useState(!1),[n,i]=s.useState(!1),[l,c]=s.useState(0),d=s.useRef(void 0),u=s.useMemo(()=>{if(!t)return;const g=async()=>{try{const m=await t();return d.current===g&&(a(!1),i(!0)),m}catch(m){throw d.current===g&&(a(!0),i(!0)),m}};return g},[t,l]);s.useEffect(()=>{d.current=u,a(!1),i(!u)},[u]);const[w,p]=jn(u,void 0),h=s.useCallback(()=>{d.current&&(a(!1),i(!1),c(g=>g+1))},[]);return s.useMemo(()=>({data:w,isLoading:p,hasError:r,hasSettled:n,refetch:h}),[w,p,r,n,h])};function yd(t){s.useEffect(()=>{let r;return t&&(r=document.createElement("style"),r.appendChild(document.createTextNode(t)),document.head.appendChild(r)),()=>{r&&document.head.removeChild(r)}},[t])}function kd(t){const r=s.useMemo(()=>B.collectUsjMarkers(t).slice().sort().join(" "),[t]);return s.useMemo(()=>r?r.split(" "):[],[r])}const Cn=()=>{const[t,r]=s.useState(()=>document.body.getBoundingClientRect().height>0);return s.useEffect(()=>{const a=new IntersectionObserver(n=>{const i=n[n.length-1];i&&r(i.isIntersecting)});return a.observe(document.body),()=>{a.disconnect()}},[]),t};function _d(t,r){const[a,n]=s.useState(!1),i=s.useRef(r);i.current=r;const l=s.useRef(t);l.current=t;const c=s.useCallback(()=>{l.current?i.current():n(!0)},[]);return s.useEffect(()=>{!t||!a||(n(!1),i.current())},[t,a]),c}function Nn(t,r,a){return t?a.dark:r===void 0?a.lightDefault:a.lightUnselected}function jd(t,r){const a=Cn();return Nn(t,a,r)}function Cd({value:t,children:r}){return e.jsx(ea.Provider,{value:t,children:e.jsx(Je.Provider,{value:t,children:r})})}const Nd=300;exports.Alert=o.Alert;exports.AlertDescription=o.AlertDescription;exports.AlertTitle=o.AlertTitle;exports.Badge=o.Badge;exports.Button=o.Button;exports.ButtonGroup=o.ButtonGroup;exports.ButtonGroupSeparator=o.ButtonGroupSeparator;exports.ButtonGroupText=o.ButtonGroupText;exports.Command=o.Command;exports.CommandEmpty=o.CommandEmpty;exports.CommandGroup=o.CommandGroup;exports.CommandInput=o.CommandInput;exports.CommandItem=o.CommandItem;exports.CommandList=o.CommandList;exports.Dialog=o.Dialog;exports.DialogClose=o.DialogClose;exports.DialogContent=o.DialogContent;exports.DialogDescription=o.DialogDescription;exports.DialogFooter=o.DialogFooter;exports.DialogHeader=o.DialogHeader;exports.DialogOverlay=o.DialogOverlay;exports.DialogPortal=o.DialogPortal;exports.DialogTitle=o.DialogTitle;exports.DialogTrigger=o.DialogTrigger;exports.DropdownMenu=o.DropdownMenu;exports.DropdownMenuCheckboxItem=o.DropdownMenuCheckboxItem;exports.DropdownMenuContent=o.DropdownMenuContent;exports.DropdownMenuGroup=o.DropdownMenuGroup;exports.DropdownMenuItem=o.DropdownMenuItem;exports.DropdownMenuLabel=o.DropdownMenuLabel;exports.DropdownMenuPortal=o.DropdownMenuPortal;exports.DropdownMenuRadioGroup=o.DropdownMenuRadioGroup;exports.DropdownMenuRadioItem=o.DropdownMenuRadioItem;exports.DropdownMenuSeparator=o.DropdownMenuSeparator;exports.DropdownMenuShortcut=o.DropdownMenuShortcut;exports.DropdownMenuSub=o.DropdownMenuSub;exports.DropdownMenuSubContent=o.DropdownMenuSubContent;exports.DropdownMenuSubTrigger=o.DropdownMenuSubTrigger;exports.DropdownMenuTrigger=o.DropdownMenuTrigger;exports.Empty=o.Empty;exports.EmptyContent=o.EmptyContent;exports.EmptyDescription=o.EmptyDescription;exports.EmptyHeader=o.EmptyHeader;exports.EmptyMedia=o.EmptyMedia;exports.EmptyState=o.EmptyState;exports.EmptyTitle=o.EmptyTitle;exports.Input=o.Input;exports.Kbd=o.Kbd;exports.KbdGroup=o.KbdGroup;exports.Label=o.Label;exports.MultiSelectComboBox=o.MultiSelectComboBox;exports.Popover=o.Popover;exports.PopoverAnchor=o.PopoverAnchor;exports.PopoverContent=o.PopoverContent;exports.PopoverDescription=o.PopoverDescription;exports.PopoverHeader=o.PopoverHeader;exports.PopoverPortalContainerProvider=o.PopoverPortalContainerProvider;exports.PopoverTitle=o.PopoverTitle;exports.PopoverTrigger=o.PopoverTrigger;exports.RadioGroup=o.RadioGroup;exports.RadioGroupItem=o.RadioGroupItem;exports.ResizableHandle=o.ResizableHandle;exports.ResizablePanel=o.ResizablePanel;exports.ResizablePanelGroup=o.ResizablePanelGroup;exports.RetryableErrorView=o.RetryableErrorView;exports.SearchBar=o.SearchBar;exports.Separator=o.Separator;exports.Skeleton=o.Skeleton;exports.Spinner=o.Spinner;exports.Table=o.Table;exports.TableBody=o.TableBody;exports.TableCaption=o.TableCaption;exports.TableCell=o.TableCell;exports.TableFooter=o.TableFooter;exports.TableHead=o.TableHead;exports.TableHeader=o.TableHeader;exports.TableRow=o.TableRow;exports.ToggleGroup=o.ToggleGroup;exports.ToggleGroupItem=o.ToggleGroupItem;exports.Tooltip=o.Tooltip;exports.TooltipContent=o.TooltipContent;exports.TooltipProvider=o.TooltipProvider;exports.TooltipTrigger=o.TooltipTrigger;exports.Z_INDEX_ABOVE_DOCK=o.Z_INDEX_ABOVE_DOCK;exports.Z_INDEX_ABOVE_POPOVER=o.Z_INDEX_ABOVE_POPOVER;exports.Z_INDEX_CONNECTION_LOST=o.Z_INDEX_CONNECTION_LOST;exports.Z_INDEX_FIRST_RUN=o.Z_INDEX_FIRST_RUN;exports.Z_INDEX_MODAL=o.Z_INDEX_MODAL;exports.Z_INDEX_MODAL_BACKDROP=o.Z_INDEX_MODAL_BACKDROP;exports.Z_INDEX_NESTED_MODAL=o.Z_INDEX_NESTED_MODAL;exports.Z_INDEX_NESTED_MODAL_BACKDROP=o.Z_INDEX_NESTED_MODAL_BACKDROP;exports.Z_INDEX_ONBOARDING_TOUR=o.Z_INDEX_ONBOARDING_TOUR;exports.Z_INDEX_OVERLAY=o.Z_INDEX_OVERLAY;exports.badgeVariants=o.badgeVariants;exports.buttonGroupVariants=o.buttonGroupVariants;exports.buttonVariants=o.buttonVariants;exports.cn=o.cn;exports.isMacOs=o.isMacOs;exports.isWindows=o.isWindows;exports.useListbox=o.useListbox;exports.useTruncationTooltip=o.useTruncationTooltip;Object.defineProperty(exports,"sonner",{enumerable:!0,get:()=>Xa.toast});exports.Avatar=Mo;exports.AvatarFallback=Do;exports.AvatarImage=Ns;exports.BOOK_CHAPTER_CONTROL_STRING_KEYS=Wn;exports.BOOK_SELECTOR_STRING_KEYS=Jn;exports.BookChapterControl=gr;exports.BookSelector=Qn;exports.CANCEL_ACCEPT_BUTTONS_STRING_KEYS=da;exports.COMMENT_EDITOR_STRING_KEYS=bs;exports.COMMENT_LIST_ELEMENT_ID=To;exports.COMMENT_LIST_STRING_KEYS=xs;exports.CONFLICT_NOTE_STRING_KEYS=gs;exports.CONTENT_ZOOM_ROOT_ATTRIBUTE=Ls;exports.CancelAcceptButtons=wa;exports.Card=So;exports.CardContent=Ro;exports.CardDescription=js;exports.CardFooter=Cs;exports.CardHeader=ks;exports.CardTitle=_s;exports.ChapterRangeSelector=ro;exports.Checkbox=ha;exports.CheckboxGroup=Il;exports.Checklist=yn;exports.ComboBox=qr;exports.CommentEditor=vs;exports.CommentList=Ps;exports.ConflictNoteCard=Po;exports.ContentZoomRoot=Lo;exports.ContextMenu=zl;exports.ContextMenuCheckboxItem=Xl;exports.ContextMenuContent=Ul;exports.ContextMenuGroup=Vl;exports.ContextMenuItem=Hl;exports.ContextMenuLabel=Zl;exports.ContextMenuPortal=Fl;exports.ContextMenuRadioGroup=Kl;exports.ContextMenuRadioItem=Wl;exports.ContextMenuSeparator=Jl;exports.ContextMenuShortcut=Ql;exports.ContextMenuSub=Gl;exports.ContextMenuSubContent=Yl;exports.ContextMenuSubTrigger=ql;exports.ContextMenuTrigger=$l;exports.DataTable=$o;exports.DestructiveKeyConfirmation=Pl;exports.DisabledActionTooltip=dn;exports.DisabledTooltipWrapper=Ge;exports.Drawer=td;exports.DrawerClose=rd;exports.DrawerContent=ad;exports.DrawerDescription=sd;exports.DrawerFooter=nd;exports.DrawerHeader=od;exports.DrawerOverlay=_n;exports.DrawerPortal=kn;exports.DrawerTitle=id;exports.DrawerTrigger=ed;exports.DropdownMenuItemType=Go;exports.ERROR_DUMP_STRING_KEYS=Vo;exports.ERROR_POPOVER_STRING_KEYS=Fs;exports.EditorKeyboardShortcuts=Ho;exports.ErrorDump=Fo;exports.ErrorPopover=Gs;exports.FOOTNOTE_EDITOR_STRING_KEYS=sc;exports.Filter=Ys;exports.FilterDropdown=Ks;exports.Footer=qs;exports.FootnoteEditor=ic;exports.FootnoteItem=Wo;exports.FootnoteList=dc;exports.INTERFACE_LANGUAGE_PICKER_STRING_KEYS=Tl;exports.INVENTORY_STRING_KEYS=yc;exports.InterfaceLanguagePicker=Ml;exports.Inventory=jc;exports.MARKER_MENU_STRING_KEYS=qo;exports.MarkdownRenderer=Vs;exports.MarkerMenu=Yo;exports.MoreInfo=Us;exports.NavigationContentSearch=dl;exports.Progress=cd;exports.RecentSearches=to;exports.ResultsCard=Ll;exports.SCOPE_SELECTOR_STRING_KEYS=Zc;exports.SELECT_BOOKS_STRING_KEYS=un;exports.SHRINK_STEP=ze;exports.ScopeSelector=Qc;exports.ScriptureResultsViewer=Xc;exports.ScrollGroupSelector=tl;exports.Select=Te;exports.SelectBooks=wn;exports.SelectBooksPicker=ln;exports.SelectContent=Me;exports.SelectGroup=Ao;exports.SelectItem=ae;exports.SelectLabel=Bs;exports.SelectScrollDownButton=zo;exports.SelectScrollUpButton=Bo;exports.SelectSeparator=zs;exports.SelectTrigger=Re;exports.SelectValue=Se;exports.SettingsList=el;exports.SettingsListHeader=al;exports.SettingsListItem=rl;exports.SettingsSidebar=sn;exports.SettingsSidebarContentSearch=Vc;exports.ShrinkStepContext=Je;exports.ShrinkStepOverride=Cd;exports.ShrinkStepOverrideContext=ea;exports.Sidebar=tn;exports.SidebarContent=rn;exports.SidebarFooter=Mc;exports.SidebarGroup=Jr;exports.SidebarGroupAction=Ic;exports.SidebarGroupContent=ta;exports.SidebarGroupLabel=Qr;exports.SidebarHeader=Rc;exports.SidebarInput=Sc;exports.SidebarInset=en;exports.SidebarMenu=an;exports.SidebarMenuAction=Pc;exports.SidebarMenuBadge=Lc;exports.SidebarMenuButton=nn;exports.SidebarMenuItem=on;exports.SidebarMenuSkeleton=Ac;exports.SidebarMenuSub=Bc;exports.SidebarMenuSubButton=$c;exports.SidebarMenuSubItem=zc;exports.SidebarProvider=Qo;exports.SidebarRail=Tc;exports.SidebarSeparator=Dc;exports.SidebarTrigger=Ec;exports.Slider=dd;exports.Sonner=ld;exports.Switch=wd;exports.TOOLTIP_DELAY_MS=Nd;exports.TabDropdownMenu=Nr;exports.TabFloatingMenu=ll;exports.TabToolbar=cl;exports.Tabs=ud;exports.TabsContent=fd;exports.TabsList=hd;exports.TabsTrigger=gd;exports.TextField=Al;exports.Textarea=In;exports.Toolbar=Cl;exports.ToolbarCompoundLabel=Qa;exports.UNDO_REDO_BUTTONS_STRING_KEYS=Ko;exports.UiLanguageSelector=El;exports.UndoRedoButtons=Uo;exports.VerticalTabs=fa;exports.VerticalTabsContent=va;exports.VerticalTabsList=ma;exports.VerticalTabsTrigger=vn;exports.WizardStepper=Bl;exports.getBookIdFromUSFM=xc;exports.getCommentThreadElementId=ys;exports.getInventoryHeader=Qe;exports.getLinesFromUSFM=vc;exports.getNumberFromUSFM=bc;exports.getStatusForItem=Zo;exports.getToolbarOSReservedSpaceClassName=jl;exports.inventoryCountColumn=fc;exports.inventoryItemColumn=hc;exports.inventoryStatusColumn=mc;exports.isCommentDraftEmpty=Zr;exports.localizeOrFallback=Qt;exports.markerMenuItemToPaletteItem=Xo;exports.pickTabIconUrl=Nn;exports.useEvent=md;exports.useEventAsync=vd;exports.useExtraValidMarkers=kd;exports.usePromise=jn;exports.useRecentSearches=zn;exports.useRetryablePromise=xd;exports.useRunWhenVisible=_d;exports.useShrinkStep=ga;exports.useShrinkStepOverride=ra;exports.useShrinkStepValue=Za;exports.useSidebar=tr;exports.useStylesheet=yd;exports.useTabIconSelection=jd;exports.useViewVisibility=Cn;function Ed(t,r="top"){if(!t||typeof document>"u")return;const a=document.head||document.querySelector("head"),n=a.querySelector(":first-child"),i=document.createElement("style");i.appendChild(document.createTextNode(t)),r==="top"&&n?a.insertBefore(i,n):a.appendChild(i)}Ed(`/* By default the editor is too tall for the footnote editor, even while empty, so this makes it +"use strict";var Rn=Object.defineProperty;var Mn=(t,r,a)=>r in t?Rn(t,r,{enumerable:!0,configurable:!0,writable:!0,value:a}):t[r]=a;var $t=(t,r,a)=>Mn(t,typeof r!="symbol"?r+"":r,a);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("./resizable-iOJw6YSC.cjs"),e=require("react/jsx-runtime"),Ot=require("@sillsdev/scripture"),$=require("lucide-react"),B=require("platform-bible-utils"),s=require("react"),Rt=require("@tabler/icons-react"),v=require("lexical"),Ur=require("@lexical/rich-text"),_a=require("react-dom"),Dn=require("@lexical/table"),Ha=require("@lexical/headless"),qa=require("@lexical/html"),G=require("radix-ui"),Gt=require("@tanstack/react-table"),In=require("markdown-to-jsx"),Ft=require("@eten-tech-foundation/platform-editor"),Ya=require("class-variance-authority"),On=require("react-hotkeys-hook"),_e=require("vaul"),Pn=require("next-themes"),Za=require("sonner");function An({className:t,...r}){return e.jsx("textarea",{"data-slot":"textarea",className:o.cn("pr-twp tw:flex tw:field-sizing-content tw:min-h-16 tw:w-full tw:rounded-lg tw:border tw:border-input tw:bg-transparent tw:px-2.5 tw:py-2 tw:text-base tw:transition-colors tw:outline-none tw:placeholder:text-muted-foreground tw:focus-visible:border-ring tw:focus-visible:ring-3 tw:focus-visible:ring-ring/50 tw:disabled:cursor-not-allowed tw:disabled:bg-input/50 tw:disabled:opacity-50 tw:aria-invalid:border-destructive tw:aria-invalid:ring-3 tw:aria-invalid:ring-destructive/20 tw:md:text-sm tw:dark:bg-input/30 tw:dark:disabled:bg-input/80 tw:dark:aria-invalid:border-destructive/50 tw:dark:aria-invalid:ring-destructive/40",t),...r})}function Xa({ref:t,bookId:r,isSelected:a,onSelect:n,onMouseDown:i,section:l,className:c,showCheck:d=!1,localizedBookNames:u,commandValue:w,suppressKeyboardHighlight:p=!1,disabled:h=!1,dimmedReason:g,dimmedDescription:m}){const x=s.useRef(!1),y=()=>{h||(x.current||n==null||n(r),setTimeout(()=>{x.current=!1},100))},f=O=>{if(h){O.preventDefault();return}x.current=!0,i?i(O):n==null||n(r)},E=s.useMemo(()=>o.getLocalizedBookName(r,u),[r,u]),k=s.useMemo(()=>o.getLocalizedBookId(r,u),[r,u]),N=!!g&&!h,C=`${E} (${k})`,A=N?m||`${C}, ${g}`:C,R=e.jsxs(o.CommandItem,{ref:t,value:w||`${r} ${Ot.Canon.bookIdToEnglishName(r)}`,onSelect:y,onMouseDown:f,role:"option","aria-selected":a,"aria-disabled":h||void 0,"aria-label":A,disabled:h,className:o.cn(!p&&o.LIST_ITEM_KEYBOARD_FOCUS_RING,"tw:data-selected:bg-transparent tw:data-selected:text-inherit","tw:hover:bg-muted","tw:[&>svg:last-child]:hidden",c,h&&"tw:cursor-not-allowed tw:opacity-50",N&&"tw:bg-muted/50 tw:text-muted-foreground/50 tw:data-selected:bg-muted/50 tw:data-selected:text-muted-foreground/50"),children:[d&&e.jsx($.Check,{className:o.cn("tw:me-2 tw:h-4 tw:w-4 tw:shrink-0",a?"tw:opacity-100":"tw:opacity-0")}),e.jsx("span",{className:"tw:min-w-0 tw:flex-1",children:E}),N&&e.jsx("span",{className:"tw:ms-2 tw:shrink-0 tw:text-xs tw:italic",children:g}),e.jsx("span",{className:o.cn("tw:ms-2 tw:shrink-0 tw:text-xs",!N&&"tw:text-muted-foreground"),children:k})]});return e.jsx("div",{className:o.cn("tw:mx-1 tw:my-1 tw:border-b-0 tw:border-e-0 tw:border-s-2 tw:border-t-0 tw:border-solid",{"tw:border-s-red-200":l===B.Section.OT,"tw:border-s-purple-200":l===B.Section.NT,"tw:border-s-indigo-200":l===B.Section.DC,"tw:border-s-amber-200":l===B.Section.Extra}),children:R})}const Ln=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"];function Bn(t){return Ln.some(r=>r===t)}function ja(t){const r=new RegExp("^\\p{L}$","u").test(t),a=/^[0-9]$/.test(t);return{isLetter:r,isDigit:a}}const ze=Object.freeze({WIDE:0,TIGHT:1,TIGHTER:2,MINIMUM:3}),Je=s.createContext(ze.WIDE);function Wa(){return s.useContext(Je)}const ea=s.createContext(void 0);function ra(){return s.useContext(ea)}function Ja(){s.useEffect(()=>{o.trackInteractionModality()},[])}function Qa({primary:t,secondary:r,separator:a=" ",secondaryFirst:n=!1,showSecondary:i=!0,isPartial:l,fullText:c,className:d}){const{ref:u,open:w,onPointerEnter:p,onPointerLeave:h}=o.useTruncationTooltip(),{ref:g,open:m,onPointerEnter:x,onPointerLeave:y}=o.useTruncationTooltip(),[f,E]=s.useState(!1),[k,N]=s.useState(!1),C=s.useRef(null),A=i&&r!==void 0,R=l??(r!==void 0&&!i);Ja(),s.useEffect(()=>{var K;const L=(K=C.current)==null?void 0:K.closest('button, [role="combobox"], [tabindex]');if(!L)return;const j=W=>!!W&&W.scrollWidth>W.clientWidth,et=()=>{o.getLastInteractionModality()!=="pointer"&&(R||j(g.current)||j(u.current))&&N(!0)},P=()=>N(!1);return L.addEventListener("focus",et),L.addEventListener("blur",P),()=>{L.removeEventListener("focus",et),L.removeEventListener("blur",P)}},[R,g,u]);const O=s.useCallback(()=>{R&&E(!0),x(),A&&p()},[R,A,x,p]),I=s.useCallback(()=>{E(!1),N(!1),y(),h()},[y,h]);s.useEffect(()=>{R||E(!1)},[R]);const S=e.jsx("span",{ref:g,className:"tw:min-w-0 tw:shrink tw:truncate",children:t},"primary"),D=A?e.jsx("span",{ref:u,className:"tw:min-w-0 tw:shrink-[9999] tw:truncate",children:r},"secondary"):void 0,[Y,Z]=n?[D,S]:[S,D];return e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{open:m||w||f||k,onOpenChange:L=>{L||I()},children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsxs("span",{ref:C,onPointerEnter:O,onPointerLeave:I,onPointerDown:I,className:o.cn("tw:flex tw:min-w-0 tw:items-center",d),children:[Y,Y&&Z&&e.jsx("span",{className:"tw:shrink-0 tw:whitespace-pre",children:a},"separator"),Z]})}),e.jsx(o.TooltipContent,{children:c})]})})}function Gr(t,r){return`${t} ${o.ALL_ENGLISH_BOOK_NAMES[t]}${r?` ${o.getLocalizedBookId(t,r)} ${o.getLocalizedBookName(t,r)}`:""}`}function Ve(t,r){return`${t} ${o.ALL_ENGLISH_BOOK_NAMES[t]||""} ${r}`}function pr(t,r,a){return`${Ve(t,r)}:${a}`}function Ye(t){if(t.includes(":"))return;const r=/(\d+)$/.exec(t);if(!r)return;const a=parseInt(r[1],10),n=t.indexOf(" ");if(n<0)return;const i=t.slice(0,n);return t===Ve(i,a)?a:void 0}function cr(t){const r=/:(\d+)$/.exec(t);if(!r)return;const a=t.slice(0,t.length-r[0].length);if(Ye(a)!==void 0)return parseInt(r[1],10)}const zn="top-match",Vn="Show recent searches",$n="Recent";function to({recentSearches:t,onSearchItemSelect:r,renderItem:a=g=>String(g),getItemKey:n=g=>String(g),ariaLabel:i,groupHeading:l,id:c,classNameForItems:d,buttonClassName:u="tw:absolute tw:end-0 tw:top-0 tw:h-full tw:px-3 tw:py-2",buttonVariant:w="ghost",open:p,onOpenChange:h}){const[g,m]=s.useState(!1),[x,y]=s.useState(!1),f=s.useId(),E=s.useRef(!1),k=p!==void 0,N=k?p:g,C=i===""?"":o.resolveLocalizedString(i,Vn),A=o.resolveLocalizedString(l,$n),R=D=>{D||(E.current=!0,y(!1)),k||m(D),h==null||h(D)},O=D=>{if(D&&E.current){E.current=!1;return}y(D)};if(t.length===0)return;const I=D=>{r(D)},S=e.jsx(o.Button,{variant:w,size:"icon",className:u,"aria-label":C,onPointerEnter:()=>{E.current=!1},children:e.jsx($.Clock,{className:"tw:h-4 tw:w-4"})});return e.jsxs(o.DropdownMenu,{open:N,onOpenChange:R,modal:!1,children:[e.jsx(o.TooltipProvider,{children:C?e.jsxs(o.Tooltip,{open:x,onOpenChange:O,children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.DropdownMenuTrigger,{asChild:!0,children:S})}),e.jsx(o.TooltipContent,{children:C})]}):e.jsx(o.DropdownMenuTrigger,{asChild:!0,children:S})}),e.jsxs(o.DropdownMenuContent,{id:c,"aria-labelledby":f,className:"tw:w-[300px]",align:"start",onKeyDown:D=>D.stopPropagation(),children:[e.jsx(o.DropdownMenuLabel,{id:f,children:A}),t.map(D=>e.jsxs(o.DropdownMenuItem,{onSelect:()=>I(D),className:o.cn("tw:flex tw:items-center",d),children:[e.jsx($.Clock,{className:"tw:me-2 tw:h-4 tw:w-4 tw:opacity-50"}),e.jsx("span",{children:a(D)})]},n(D)))]})]})}function Fn(t,r,a=(i,l)=>i===l,n=15){return i=>{const l=t.filter(d=>!a(d,i)),c=[i,...l.slice(0,n-1)];r(c)}}function lr(t,r){return!r||B.compareScrRefs(t,r)===0}function Un(t,r,a,n,i){const l=s.useMemo(()=>o.x(t,r),[t,r]),c=s.useMemo(()=>o.a(t,r),[t,r]),d=s.useMemo(()=>o.B(t,r),[t,r]),u=s.useMemo(()=>o.I(t,r),[t,r]),w=s.useCallback(p=>{p&&n(p)},[n]);return s.useMemo(()=>[{onClick:()=>w(l),disabled:lr(t,l),title:o.resolveLocalizedString(i==null?void 0:i["%webView_bookChapterControl_previousChapter%"],"Previous chapter"),icon:a==="ltr"?$.ChevronsLeft:$.ChevronsRight,group:"chapter"},{onClick:()=>w(c),disabled:lr(t,c),title:o.resolveLocalizedString(i==null?void 0:i["%webView_bookChapterControl_nextChapter%"],"Next chapter"),icon:a==="ltr"?$.ChevronsRight:$.ChevronsLeft,group:"chapter"},{onClick:()=>w(d),disabled:lr(t,d),title:o.resolveLocalizedString(i==null?void 0:i["%webView_bookChapterControl_previousVerse%"],"Previous verse"),icon:$.ChevronUp,group:"verse"},{onClick:()=>w(u),disabled:lr(t,u),title:o.resolveLocalizedString(i==null?void 0:i["%webView_bookChapterControl_nextVerse%"],"Next verse"),icon:$.ChevronDown,group:"verse"}],[t,a,w,l,d,u,c,i])}const hr={BOOK_ONLY:/^([^:\s]+(?:\s+[^:\s]+)*)$/i,BOOK_CHAPTER:/^([^:\s]+(?:\s+[^:\s]+)*)\s+(\d+)$/i,BOOK_CHAPTER_VERSE:/^([^:\s]+(?:\s+[^:\s]+)*)\s+(\d+):(\d*)$/i},Gn=[hr.BOOK_ONLY,hr.BOOK_CHAPTER,hr.BOOK_CHAPTER_VERSE];function Kn(t){return hr.BOOK_CHAPTER_VERSE.test(t.trim())}function Ca(t,r){return Ot.Canon.bookIdToNumber(t)0?!1:r0?!1:rn.chapterNum?!1:a{if(i)return i;const c=l.exec(t.trim());if(c){const[d,u=void 0,w=void 0]=c.slice(1);let p;const h=r.filter(g=>o.doesBookMatchQuery(g,d,a));if(h.length===1&&([p]=h),!p&&u){if(Ot.Canon.isBookIdValid(d)){const g=d.toUpperCase();r.includes(g)&&(p=g)}if(!p&&a){const g=Array.from(a.entries()).find(([,m])=>m.localizedId.toLowerCase()===d.toLowerCase());g&&r.includes(g[0])&&([p]=g)}}if(!p&&u){const m=(x=>Object.keys(o.ALL_ENGLISH_BOOK_NAMES).find(y=>o.ALL_ENGLISH_BOOK_NAMES[y].toLowerCase()===x.toLowerCase()))(d);if(m&&r.includes(m)&&(p=m),!p&&a){const x=Array.from(a.entries()).find(([,y])=>y.localizedName.toLowerCase()===d.toLowerCase());x&&r.includes(x[0])&&([p]=x)}}if(p){let g=u?parseInt(u,10):void 0;g&&g>ke(p)&&(g=Math.max(ke(p),1));const m=w?parseInt(w,10):void 0;return{book:p,chapterNum:g,verseNum:m}}}},void 0);if(n)return n}function Kr(t){return{[B.Section.OT]:t.filter(r=>Ot.Canon.isBookOT(r)),[B.Section.NT]:t.filter(r=>Ot.Canon.isBookNT(r)),[B.Section.DC]:t.filter(r=>Ot.Canon.isBookDC(r)),[B.Section.Extra]:t.filter(r=>Ot.Canon.extraBooks().includes(r))}}function Yn(t,r){const a=new Set(t),n=r.filter(w=>!a.has(w)),i=new Set(n),l=i.size===0?t:Ot.Canon.allBookIds.filter(w=>a.has(w)||i.has(w)),c=Kr(l),d=Object.values(c).flat(),u=Kr(t);return{projectBooksBySection:u,reachableBooksBySection:c,reachableBooks:d,projectBooks:Object.values(u).flat(),booksOutsideProject:new Set(d.filter(w=>!a.has(w)))}}const Hr=6;function Zn(t){return t==="ArrowLeft"?"ArrowRight":t==="ArrowRight"?"ArrowLeft":t}function Xn({current:t,key:r,max:a,direction:n="ltr"}){if(a<=0)return t;if(t<1||t>a)return 1;switch(n==="rtl"?Zn(r):r){case"ArrowLeft":return t>1?t-1:a;case"ArrowRight":return tp+1).map(w=>{const p=(i==null?void 0:i(w))??!1;return e.jsx(o.CommandItem,{value:r(w),onSelect:()=>{p||a(w)},ref:n(w),disabled:p,"aria-disabled":p||void 0,className:o.cn("tw:h-8 tw:w-8 tw:cursor-pointer tw:justify-center tw:rounded-md tw:text-center tw:text-sm","tw:[&>svg]:hidden tw:hover:bg-muted",!d&&o.LIST_ITEM_KEYBOARD_FOCUS_RING,"tw:data-selected:bg-transparent tw:data-selected:text-inherit",{"tw:bg-primary tw:text-primary-foreground tw:hover:bg-primary/90 tw:data-selected:bg-primary tw:data-selected:text-primary-foreground tw:data-selected:ring-primary-foreground/70":(c==null?void 0:c(w))??!1},{"tw:bg-muted/50 tw:text-muted-foreground/50 tw:data-selected:bg-muted/50 tw:data-selected:text-muted-foreground/50":((l==null?void 0:l(w))??!1)&&!p},p&&"tw:cursor-not-allowed tw:opacity-40"),children:w},w)})})})}function Na({bookId:t,scrRef:r,onChapterSelect:a,setChapterRef:n,isChapterDimmed:i,isChapterDisabled:l,suppressKeyboardHighlight:c,className:d}){if(t)return e.jsx(eo,{count:ke(t),valueBuilder:u=>Ve(t,u),onSelect:a,itemRef:n,isDisabled:l,isDimmed:i,isSelected:u=>t===r.book&&u===r.chapterNum,suppressKeyboardHighlight:c,className:d})}function Ea({bookId:t,chapterNum:r,endVerse:a,scrRef:n,onVerseSelect:i,setVerseRef:l,isVerseDimmed:c,isVerseDisabled:d,suppressKeyboardHighlight:u,className:w}){if(!(!t||a<=0))return e.jsx(eo,{count:a,valueBuilder:p=>pr(t,r,p),onSelect:i,itemRef:l,isDisabled:d,isDimmed:c,isSelected:p=>t===n.book&&r===n.chapterNum&&p===n.verseNum,suppressKeyboardHighlight:u,className:w})}const Wn="a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]";function Jn(t){return Array.from(t.querySelectorAll(Wn)).filter(r=>r.tabIndex>=0)}function gr({scrRef:t,handleSubmit:r,className:a,getActiveBookIds:n,getAdditionalBookIds:i,localizedBookNames:l,localizedStrings:c,recentSearches:d,onAddRecentSearch:u,id:w,getEndVerse:p,disableReferencesUpTo:h,submitKeys:g,triggerContent:m,triggerVariant:x="outline",showTriggerChevron:y=!1,onOpenChange:f,onCloseAutoFocus:E,modal:k=!1,align:N="center",ref:C,disabled:A}){const R=o.readDirection(),O=Wa(),[I,S]=s.useState(!1),[D,Y]=s.useState(""),[Z,L]=s.useState(""),[j,et]=s.useState("books"),[P,K]=s.useState(void 0),[W,F]=s.useState(void 0),[tt,lt]=s.useState(void 0),[it,J]=s.useState(!1),[dt,gt]=s.useState(!1),[wt,mt]=s.useState(!1),[vt,Mt]=s.useState(!1),Xt=s.useRef(null),Wt=s.useRef(!1),Nt=s.useRef(void 0),bt=s.useRef(void 0),Lt=s.useRef(void 0),oe=s.useRef(void 0),se=s.useRef({}),Et=s.useRef({}),kt=s.useCallback(b=>{r(b),u&&u(b)},[r,u]),qt=s.useMemo(()=>n?n():o.lt,[n]),Jt=s.useMemo(()=>n&&i?i():[],[n,i]),{projectBooksBySection:Qt,reachableBooksBySection:te,reachableBooks:Kt,projectBooks:Pt,booksOutsideProject:Bt}=s.useMemo(()=>Yn(qt,Jt),[qt,Jt]),M=Bt.has(t.book),q=s.useMemo(()=>Z.trim()?Kr(Kt.filter(b=>o.doesBookMatchQuery(b,Z,l))):dt?te:Qt,[Qt,te,Kt,dt,Z,l]),_=s.useMemo(()=>qn(Z,Kt,l),[Z,Kt,l]),z=s.useMemo(()=>{if(!_)return;const b=D.startsWith(`${_.book} `)?D:"",H=cr(b),ot=Ye(b);return{book:_.book,chapterNum:ot??_.chapterNum??1,verseNum:H??_.verseNum??1}},[_,D]),X=s.useRef(!1);s.useEffect(()=>{if(!X.current){X.current=!0;return}f==null||f(I)},[I,f]);const V=s.useCallback(()=>{z&&(h&&Dr(z.book,z.chapterNum,z.verseNum,h)||(kt(z),S(!1),L(""),Y("")))},[kt,z,h]),rt=s.useCallback(b=>{const H=W??(_==null?void 0:_.book),ot=tt??(_==null?void 0:_.chapterNum);!H||!ot||(kt({book:H,chapterNum:ot,verseNum:b}),S(!1))},[kt,W,tt,_]),st=s.useCallback(b=>{if(h&&Ca(b,h))return;if(ke(b)<=1){kt({book:b,chapterNum:1,verseNum:1}),S(!1),L("");return}K(b),et("chapters")},[kt,h]),nt=s.useCallback(b=>{const H=j==="chapters"?P:_==null?void 0:_.book;if(H){if(p&&p(H,b)>1){F(H),lt(b),et("verses"),Y("");return}kt({book:H,chapterNum:b,verseNum:1}),S(!1)}},[kt,j,P,_,p]),ft=s.useCallback(b=>{kt(b),S(!1),L("")},[kt]),xt=Un(t,dt?Kt:Pt,R,r,c),ht=s.useCallback(b=>{L(b),Mt(!1)},[]),_t=s.useCallback(()=>{et("books"),K(void 0),F(void 0),lt(void 0),Mt(!1),setTimeout(()=>{var b;(b=bt.current)==null||b.focus()},0)},[]),zt=s.useCallback(()=>{const b=W;F(void 0),lt(void 0),b?(K(b),et("chapters"),Y("")):_t()},[W,_t]),jt=s.useCallback(b=>{S(b),b&&(et("books"),K(void 0),F(void 0),lt(void 0),L(""),Mt(!1),mt(!1),gt(M))},[M]);s.useEffect(()=>{A&&jt(!1)},[A,jt]);const[ce,ge]=s.useState(0);s.useEffect(()=>{var b;ce!==0&&((b=bt.current)==null||b.focus())},[ce]),s.useImperativeHandle(C,()=>({open:()=>{A||(jt(!0),ge(b=>b+1))}}),[jt,A]);const{otLong:le,ntLong:je,dcLong:Ce,extraLong:be}={otLong:c==null?void 0:c["%scripture_section_ot_long%"],ntLong:c==null?void 0:c["%scripture_section_nt_long%"],dcLong:c==null?void 0:c["%scripture_section_dc_long%"],extraLong:c==null?void 0:c["%scripture_section_extra_long%"]},fe=s.useCallback(b=>o.getSectionLongName(b,le,je,Ce,be),[le,je,Ce,be]),de=s.useCallback(b=>_?!!_.chapterNum&&!b.toString().includes(_.chapterNum.toString()):!1,[_]),De=s.useMemo(()=>B.formatScrRef(t,l?o.getLocalizedBookName(t.book,l):"English"),[t,l]),er=s.useMemo(()=>O>=ze.TIGHT?o.getLocalizedBookId(t.book,l):o.getLocalizedBookName(t.book,l),[t.book,l,O]),Ie=`${t.chapterNum}:${t.verseNum}`,T=s.useCallback(b=>H=>{se.current[b]=H},[]),at=s.useCallback(b=>H=>{Et.current[b]=H},[]),ct=s.useMemo(()=>Kn(Z),[Z]),Ct=s.useMemo(()=>!p||!_||!_.chapterNum||!ct?!1:p(_.book,_.chapterNum)>0,[p,_,ct]),xe=j==="books"&&!it&&!Z.trim()&&Bt.size>0,Tr=s.useCallback(b=>h?Ca(b,h):!1,[h]),me=s.useCallback(b=>H=>h?Hn(b,H,h):!1,[h]),Oe=s.useCallback((b,H)=>ot=>h?Dr(b,H,ot,h):!1,[h]),Pe=o.resolveLocalizedString(c==null?void 0:c["%webView_bookChapterControl_selectChapter%"],"Select chapter"),Sr=o.resolveLocalizedString(c==null?void 0:c["%webView_bookChapterControl_selectVerse%"],"Select verse"),rr=j==="verses"?o.resolveLocalizedString(c==null?void 0:c["%webView_bookChapterControl_backToChapters%"],"Back to chapters"):o.resolveLocalizedString(c==null?void 0:c["%webView_bookChapterControl_backToBooks%"],"Back to books"),Rr=o.resolveLocalizedString(c==null?void 0:c["%webView_bookChapterControl_bookNotInProject%"],"Not in project"),ar=o.resolveLocalizedString(c==null?void 0:c["%webView_bookChapterControl_bookNotInProjectDescription%"],"{book} is not in this project"),or=s.useCallback(b=>B.formatReplacementString(ar,{book:`${o.getLocalizedBookName(b,l)} (${o.getLocalizedBookId(b,l)})`}),[ar,l]),nr=o.resolveLocalizedString(c==null?void 0:c["%webView_bookChapterControl_showMoreBooks%"],"Show more books"),Ae=o.resolveLocalizedString(c==null?void 0:c["%webView_bookChapterControl_showProjectBooksOnly%"],"Show project books only"),ir=s.useCallback(b=>{(b.key==="Home"||b.key==="End")&&b.stopPropagation(),g&&g.includes(b.key)&&_&&_.chapterNum!==void 0&&_.verseNum!==void 0&&(b.preventDefault(),b.stopPropagation(),V())},[g,_,V]),sr=s.useCallback(b=>{var xa,ya;if(b.ctrlKey)return;const H=b.target instanceof HTMLElement?b.target:void 0;if(!(!!H&&!!((xa=Nt.current)!=null&&xa.contains(H)))&&(H!=null&&H.closest('[role="menu"], [role="menuitem"]')))return;if(b.key==="Tab"){const St=Nt.current?Jn(Nt.current):[];if(St.length===0){b.preventDefault(),b.stopPropagation();return}const re=St[St.length-1],Vt=b.shiftKey?St[0]:re;document.activeElement===Vt&&(b.preventDefault(),b.stopPropagation(),(b.shiftKey?re:St[0]).focus());return}const{isLetter:Dt,isDigit:At}=ja(b.key);if((j==="chapters"||j==="verses")&&(b.key===" "||b.key==="Enter")){if(!!(H!=null&&H.closest('button, a, input, select, textarea, [role="button"]'))){b.stopPropagation();return}const re=(()=>{if(j==="verses"){const Ke=W,ka=tt,Mr=cr(D);return!Ke||!ka||Mr===void 0?void 0:{isDisabled:Oe(Ke,ka)(Mr),activate:()=>rt(Mr)}}const Vt=P,ie=Ye(D);if(!(!Vt||ie===void 0))return{isDisabled:me(Vt)(ie),activate:()=>nt(ie)}})();if(re){b.preventDefault(),b.stopPropagation(),re.isDisabled||re.activate();return}}if(j==="books"&&_&&!it&&b.key==="Enter"&&!(H!==bt.current&&!!(H!=null&&H.closest('button, a, input, select, textarea, [role="button"]')))){b.preventDefault(),b.stopPropagation(),V();return}if((j==="chapters"||j==="verses")&&(Dt||At)){b.preventDefault(),b.stopPropagation();return}if(b.key==="Backspace"&&(j==="chapters"||j==="verses")){b.preventDefault(),b.stopPropagation(),j==="verses"?zt():_t();return}if(!Bn(b.key)||it)return;if(j==="books"&&!vt&&(b.key==="ArrowLeft"||b.key==="ArrowRight")){const St=H===bt.current?bt.current:void 0,re=(St==null?void 0:St.selectionStart)??0,Vt=(St==null?void 0:St.selectionEnd)??0,ie=R==="rtl"?b.key==="ArrowRight":b.key==="ArrowLeft";if(!!St&&(re!==Vt||(ie?re>0:Vt{const St=j==="books"&&_&&Ct&&_.chapterNum?{bookId:_.book,chapterNum:_.chapterNum}:void 0,re=j==="verses"?{bookId:W,chapterNum:tt}:St;if(re){const{bookId:Vt,chapterNum:ie}=re;return!Vt||!ie||!p?void 0:{max:p(Vt,ie),current:cr(D)??0,buildValue:Ke=>pr(Vt,ie,Ke),refs:Et,takeFocus:j==="verses"}}if(j==="chapters"||j==="books"&&_&&ke(_.book)>1){const Vt=j==="chapters"?P:_==null?void 0:_.book;return Vt?{max:ke(Vt),current:Ye(D)??0,buildValue:ie=>Ve(Vt,ie),refs:se,takeFocus:j==="chapters"}:void 0}})();if(!yt||yt.max<=0)return;j==="books"&&Mt(!0),yt.takeFocus&&((ya=Nt.current)==null||ya.focus());const Ht=Xn({current:yt.current,key:b.key,max:yt.max,direction:R});if(b.preventDefault(),b.stopPropagation(),Ht===yt.current)return;Y(yt.buildValue(Ht));const ba=yt.refs.current[Ht];ba&&ba.scrollIntoView({block:"nearest",behavior:"smooth"})},[j,_,Ct,it,vt,R,_t,zt,nt,V,rt,me,Oe,P,W,tt,p,D]),U=s.useCallback(b=>{var Dt,At;if(b.shiftKey||b.key==="Tab"||b.key===" ")return;if(b.key==="Enter"){b.stopPropagation();return}if(b.key==="ArrowUp"||b.key==="ArrowDown"){(Dt=bt.current)==null||Dt.focus();return}const{isLetter:H,isDigit:ot}=ja(b.key);(H||ot)&&(b.preventDefault(),L(yt=>yt+b.key),(At=bt.current)==null||At.focus(),J(!1))},[]);s.useLayoutEffect(()=>{const b=setTimeout(()=>{if(I&&j==="books"&&Lt.current&&oe.current){const H=Lt.current,ot=oe.current,Dt=ot.offsetTop,At=H.clientHeight,yt=ot.clientHeight,Ht=Dt-At/2+yt/2;H.scrollTo({top:Math.max(0,Ht),behavior:"smooth"}),Y(Gr(t.book))}},0);return()=>{clearTimeout(b)}},[I,j,Z,_,t.book]),s.useLayoutEffect(()=>{if(j==="chapters"&&P){const b=P===t.book,H=b?t.chapterNum:1;Y(Ve(P,H)),setTimeout(()=>{if(Lt.current)if(b){const ot=se.current[t.chapterNum];ot&&ot.scrollIntoView({block:"center",behavior:"smooth"})}else Lt.current.scrollTo({top:0});Nt.current&&Nt.current.focus()},0)}},[j,P,_,t.book,t.chapterNum]),s.useLayoutEffect(()=>{if(j==="verses"&&W&&tt!==void 0){const b=W===t.book&&tt===t.chapterNum,H=b?t.verseNum:1;Y(pr(W,tt,H)),setTimeout(()=>{if(Lt.current)if(b){const ot=Et.current[t.verseNum];ot&&ot.scrollIntoView({block:"center",behavior:"smooth"})}else Lt.current.scrollTo({top:0});Nt.current&&Nt.current.focus()},0)}},[j,W,tt,t.book,t.chapterNum,t.verseNum]);const Q=_?`${_.book} ${_.chapterNum??""} ${_.verseNum??""} ${Ct}`:"",Tt=s.useRef(""),ee=s.useRef(""),ne=s.useMemo(()=>{if(j!=="books"||!_||it)return;const{book:b,chapterNum:H,verseNum:ot}=_;if(Ct&&H&&p)return{max:p(b,H),initial:ot??(b===t.book&&H===t.chapterNum?t.verseNum:1),parse:cr,buildValue:At=>pr(b,H,At)};const Dt=ke(b);if(!(Dt<=1))return{max:Dt,initial:H??(b===t.book?t.chapterNum:1),parse:Ye,buildValue:At=>Ve(b,At)}},[j,_,it,Ct,p,t.book,t.chapterNum,t.verseNum]);return s.useLayoutEffect(()=>{if(j!=="books"||!_||!ne||ne.max<=0){Tt.current="";return}const{max:b,initial:H,parse:ot,buildValue:Dt}=ne,At=yt=>{const Ht=ot(yt);return Ht!==void 0&&Ht>=1&&Ht<=b&&yt===Dt(Ht)?Ht:void 0};if(Tt.current!==Q){Tt.current=Q;const yt=Dt(Math.min(Math.max(H,1),b));ee.current=yt,Y(yt);return}if(At(D)!==void 0){ee.current=D;return}Y(At(ee.current)!==void 0?ee.current:Dt(Math.min(Math.max(H,1),b)))},[j,_,ne,Q,D]),e.jsxs(o.Popover,{open:I,onOpenChange:jt,modal:k,children:[e.jsx(o.PopoverTrigger,{asChild:!0,children:e.jsxs(o.Button,{ref:Xt,"aria-label":"book-chapter-trigger",variant:x,role:"combobox","aria-expanded":I,disabled:A,className:o.cn("tw:h-8 tw:w-full tw:min-w-16 tw:max-w-48 tw:shrink tw:overflow-hidden tw:px-1",a),onClick:b=>{Wt.current&&(Wt.current=!1,b.preventDefault())},children:[m??e.jsx(Qa,{primary:er,secondary:Ie,showSecondary:O=ze.TIGHT,fullText:De}),y&&e.jsx(Rt.IconSelector,{"data-testid":"book-chapter-control-chevron",className:"tw:ms-2 tw:size-4 tw:shrink-0 tw:opacity-50"})]})}),e.jsx(o.PopoverContent,{id:w,forceMount:!0,className:"tw:w-[280px] tw:p-0",align:N,onKeyDownCapture:sr,onKeyDown:b=>b.stopPropagation(),onPointerDownOutside:b=>{const{target:H}=b;I&&Xt.current&&H instanceof Node&&Xt.current.contains(H)&&(Wt.current=!0,jt(!1))},onCloseAutoFocus:E,children:e.jsx(o.TooltipProvider,{children:e.jsxs(o.Command,{ref:Nt,loop:!0,value:D,onValueChange:Y,disablePointerSelection:!0,shouldFilter:!1,children:[j==="books"?e.jsxs("div",{className:o.cn("tw:flex tw:items-end",it&&"tw:pb-1"),onFocus:b=>{mt(b.target!==bt.current)},onBlur:b=>{b.currentTarget.contains(b.relatedTarget)||mt(!1)},children:[e.jsxs("div",{className:"tw:relative tw:flex-1",children:[e.jsx(o.CommandInput,{ref:bt,value:Z,onValueChange:ht,onKeyDown:ir,onFocus:()=>J(!1),className:d&&d.length>0?"tw:pe-8!":"",spaceSelectsHighlightedItem:!0}),d&&d.length>0&&e.jsx(to,{recentSearches:d,onSearchItemSelect:ft,renderItem:b=>B.formatScrRef(b,"English"),getItemKey:b=>`${b.book}-${b.chapterNum}-${b.verseNum}`,ariaLabel:c==null?void 0:c["%history_recentSearches_ariaLabel%"],groupHeading:c==null?void 0:c["%history_recent%"],buttonClassName:"tw:absolute tw:end-1 tw:top-1"})]}),e.jsx(o.ButtonGroup,{className:"tw:translate-y-px tw:gap-1 tw:pe-2",children:xt.map(({onClick:b,disabled:H,title:ot,icon:Dt,group:At},yt)=>{const Ht=e.jsx(o.Button,{variant:"ghost",size:"sm",onClick:()=>{J(!0),b()},disabled:H,className:"tw:h-8.5 tw:w-6 tw:rounded-lg! tw:p-0","aria-label":ot,onKeyDown:U,children:e.jsx(Dt,{})});return e.jsxs(s.Fragment,{children:[yt>0&&At!==xt[yt-1].group&&e.jsx(o.ButtonGroupSeparator,{}),H?e.jsx("span",{title:ot,className:"tw:inline-flex",children:Ht}):e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:Ht}),e.jsx(o.TooltipContent,{children:ot})]})]},`${At}-${yt}`)})})]}):e.jsxs("div",{className:"tw:flex tw:items-center tw:border-b tw:px-3 tw:py-1",children:[e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.Button,{variant:"ghost",size:"sm",onClick:j==="verses"?zt:_t,className:"tw:me-2 tw:h-6 tw:w-6 tw:p-0",tabIndex:-1,"aria-label":rr,children:R==="ltr"?e.jsx($.ArrowLeft,{className:"tw:h-4 tw:w-4"}):e.jsx($.ArrowRight,{className:"tw:h-4 tw:w-4"})})}),e.jsx(o.TooltipContent,{children:rr})]}),j==="chapters"&&P&&e.jsx("span",{tabIndex:-1,className:"tw:text-sm tw:font-medium",children:o.getLocalizedBookName(P,l)}),j==="verses"&&W&&tt!==void 0&&e.jsx("span",{tabIndex:-1,className:"tw:text-sm tw:font-medium",children:`${o.getLocalizedBookName(W,l)} ${tt}`}),e.jsx("span",{tabIndex:-1,className:"tw:ms-auto tw:text-sm tw:font-medium tw:text-muted-foreground",children:j==="verses"?Sr:Pe})]}),!it&&e.jsxs(o.CommandList,{ref:Lt,children:[j==="books"&&e.jsxs(e.Fragment,{children:[!_&&Object.entries(q).map(([b,H])=>{if(H.length!==0)return e.jsx(o.CommandGroup,{heading:fe(b),children:H.map(ot=>e.jsx(Xa,{bookId:ot,onSelect:Dt=>st(Dt),section:B.getSectionForBook(ot),commandValue:Gr(ot),suppressKeyboardHighlight:wt,ref:ot===t.book?oe:void 0,localizedBookNames:l,disabled:Tr(ot),dimmedReason:Bt.has(ot)?Rr:void 0,dimmedDescription:Bt.has(ot)?or(ot):void 0},ot))},b)}),_&&z&&e.jsx(o.CommandGroup,{children:e.jsxs(o.CommandItem,{value:zn,onSelect:V,disabled:!!h&&Dr(z.book,z.chapterNum,z.verseNum,h),className:"tw:font-semibold tw:text-primary tw:hover:bg-muted tw:[&>svg:last-child]:hidden",children:[e.jsx("span",{className:"tw:min-w-0 tw:flex-1",children:B.formatScrRef(z,o.getLocalizedBookName(_.book,l))}),e.jsx("span",{className:"tw:ms-2 tw:shrink-0 tw:text-xs tw:text-muted-foreground",children:o.getLocalizedBookId(_.book,l)})]},"top-match")}),_&&Ct&&_.chapterNum&&p&&e.jsx(Ea,{bookId:_.book,chapterNum:_.chapterNum,endVerse:p(_.book,_.chapterNum),scrRef:t,onVerseSelect:rt,setVerseRef:at,isVerseDisabled:Oe(_.book,_.chapterNum),suppressKeyboardHighlight:wt,className:"tw:px-4 tw:pb-4"}),_&&!Ct&&ke(_.book)>1&&e.jsx(Na,{bookId:_.book,scrRef:t,onChapterSelect:nt,setChapterRef:T,isChapterDimmed:de,isChapterDisabled:me(_.book),suppressKeyboardHighlight:wt,className:"tw:px-4 tw:pb-4"})]}),j==="chapters"&&P&&e.jsx(Na,{bookId:P,scrRef:t,onChapterSelect:nt,setChapterRef:T,isChapterDisabled:me(P),className:"tw:p-4"}),j==="verses"&&W&&tt!==void 0&&p&&e.jsx(Ea,{bookId:W,chapterNum:tt,endVerse:p(W,tt),scrRef:t,onVerseSelect:rt,setVerseRef:at,isVerseDisabled:Oe(W,tt),className:"tw:p-4"})]}),xe&&e.jsx("div",{className:"tw:border-t tw:p-1",children:e.jsx(o.Button,{variant:"ghost",size:"sm",className:"tw:w-full tw:justify-start tw:font-normal",onClick:()=>gt(b=>!b),children:dt?Ae:nr})})]})})})]})}const Qn=Object.freeze(["%scripture_section_ot_long%","%scripture_section_nt_long%","%scripture_section_dc_long%","%scripture_section_extra_long%","%history_recent%","%history_recentSearches_ariaLabel%","%webView_bookChapterControl_bookNotInProject%","%webView_bookChapterControl_bookNotInProjectDescription%","%webView_bookChapterControl_selectChapter%","%webView_bookChapterControl_selectVerse%","%webView_bookChapterControl_showMoreBooks%","%webView_bookChapterControl_showProjectBooksOnly%","%webView_bookChapterControl_previousChapter%","%webView_bookChapterControl_nextChapter%","%webView_bookChapterControl_previousVerse%","%webView_bookChapterControl_nextVerse%","%webView_bookChapterControl_backToBooks%","%webView_bookChapterControl_backToChapters%"]);function ti(t){return typeof t=="string"?t:typeof t=="number"?t.toString():t.label}function qr({id:t,options:r=[],className:a,buttonClassName:n,popoverContentClassName:i,popoverContentStyle:l,value:c,onChange:d=()=>{},getOptionLabel:u=ti,getButtonLabel:w,icon:p=void 0,buttonPlaceholder:h="",textPlaceholder:g="",commandEmptyMessage:m="No option found",buttonVariant:x="outline",alignDropDown:y="start",isDisabled:f=!1,ariaLabel:E,...k}){const[N,C]=s.useState(!1),A=w??u,R=I=>I.length>0&&typeof I[0]=="object"&&"options"in I[0],O=(I,S)=>{const D=u(I),Y=typeof I=="object"&&"secondaryLabel"in I?I.secondaryLabel:void 0,Z=`${S??""}${D}${Y??""}`;return e.jsxs(o.CommandItem,{value:D,onSelect:()=>{d(I),C(!1)},className:"tw:gap-1.5!",children:[e.jsx($.Check,{className:o.cn("tw:h-4 tw:w-4 tw:shrink-0",{"tw:opacity-0":!c||u(c)!==D})}),e.jsxs("span",{className:"tw:flex-1 tw:overflow-hidden tw:text-ellipsis tw:whitespace-nowrap",children:[D,Y&&e.jsxs("span",{className:"tw:text-muted-foreground",children:[" · ",Y]})]})]},Z)};return e.jsxs(o.Popover,{open:N,onOpenChange:C,...k,children:[e.jsx(o.PopoverTrigger,{asChild:!0,children:e.jsxs(o.Button,{variant:x,role:"combobox","aria-expanded":N,"aria-label":E,id:t,className:o.cn("tw:flex tw:w-[200px] tw:items-center tw:justify-between tw:overflow-hidden",n??a),disabled:f,children:[e.jsxs("div",{className:"tw:flex tw:min-w-0 tw:flex-1 tw:items-center tw:overflow-hidden",children:[p&&e.jsx("div",{className:"tw:shrink-0 tw:pe-2",children:p}),e.jsx("span",{className:o.cn("tw:min-w-0 tw:overflow-hidden tw:text-ellipsis tw:whitespace-nowrap tw:text-start"),children:c?A(c):h})]}),e.jsx($.ChevronDown,{className:"tw:ms-2 tw:h-4 tw:w-4 tw:shrink-0 tw:opacity-50"})]})}),e.jsx(o.PopoverContent,{align:y,className:o.cn("tw:w-[200px] tw:p-0",i),style:l,children:e.jsxs(o.Command,{children:[e.jsx(o.CommandInput,{placeholder:g,className:"tw:text-inherit",spaceSelectsHighlightedItem:!0}),e.jsx(o.CommandEmpty,{children:m}),e.jsx(o.CommandList,{children:R(r)?r.map(I=>e.jsx(o.CommandGroup,{heading:I.groupHeading,children:I.options.map(S=>O(S,I.groupHeading))},I.groupHeading)):e.jsx(o.CommandGroup,{children:r.map(I=>O(I))})})]})})]})}function ro({startChapter:t,endChapter:r,handleSelectStartChapter:a,handleSelectEndChapter:n,isDisabled:i=!1,chapterCount:l}){const c=s.useMemo(()=>Array.from({length:l},(w,p)=>p+1),[l]),d=w=>{a(w),w>r&&n(w)},u=w=>{n(w),ww.toString(),value:t},"start chapter"),e.jsx(o.Label,{htmlFor:"end-chapters-combobox",children:"to"}),e.jsx(qr,{isDisabled:i,onChange:u,buttonClassName:"tw:ms-2 tw:w-20",options:c,getOptionLabel:w=>w.toString(),value:r},"end chapter")]})}exports.BookSelectionMode=(t=>(t.CurrentBook="current book",t.ChooseBooks="choose books",t))(exports.BookSelectionMode||{});(t=>{t.CURRENT_BOOK="current book",t.CHOOSE_BOOKS="choose books"})(exports.BookSelectionMode||(exports.BookSelectionMode={}));const ei=Object.freeze(["%webView_bookSelector_currentBook%","%webView_bookSelector_choose%","%webView_bookSelector_chooseBooks%"]),Ir=(t,r)=>t[r]??r;function ri({handleBookSelectionModeChange:t,currentBookName:r,onSelectBooks:a,selectedBookIds:n,chapterCount:i,endChapter:l,handleSelectEndChapter:c,startChapter:d,handleSelectStartChapter:u,localizedStrings:w}){const p=Ir(w,"%webView_bookSelector_currentBook%"),h=Ir(w,"%webView_bookSelector_choose%"),g=Ir(w,"%webView_bookSelector_chooseBooks%"),[m,x]=s.useState("current book"),y=f=>{x(f),t(f)};return e.jsx(o.RadioGroup,{className:"pr-twp tw:flex",value:m,onValueChange:f=>y(f),children:e.jsxs("div",{className:"tw:flex tw:w-full tw:flex-col tw:gap-4",children:[e.jsxs("div",{className:"tw:grid tw:grid-cols-[25%_25%_50%]",children:[e.jsxs("div",{className:"tw:flex tw:items-center",children:[e.jsx(o.RadioGroupItem,{value:"current book"}),e.jsx(o.Label,{className:"tw:ms-1",children:p})]}),e.jsx(o.Label,{className:"tw:flex tw:items-center",children:r}),e.jsx("div",{className:"tw:flex tw:items-center tw:justify-end",children:e.jsx(ro,{isDisabled:m==="choose books",handleSelectStartChapter:u,handleSelectEndChapter:c,chapterCount:i,startChapter:d,endChapter:l})})]}),e.jsxs("div",{className:"tw:grid tw:grid-cols-[25%_50%_25%]",children:[e.jsxs("div",{className:"tw:flex tw:items-center",children:[e.jsx(o.RadioGroupItem,{value:"choose books"}),e.jsx(o.Label,{className:"tw:ms-1",children:g})]}),e.jsx(o.Label,{className:"tw:flex tw:items-center",children:n.map(f=>Ot.Canon.bookIdToEnglishName(f)).join(", ")}),e.jsx(o.Button,{disabled:m==="current book",onClick:()=>a(),children:h})]})]})})}const ao=s.createContext(null);function ai(t,r){return{getTheme:function(){return r??null}}}function he(){const t=s.useContext(ao);return t==null&&function(r,...a){const n=new URL("https://lexical.dev/docs/error"),i=new URLSearchParams;i.append("code",r);for(const l of a)i.append("v",l);throw n.search=i.toString(),Error(`Minified Lexical error #${r}; visit ${n.toString()} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}(8),t}const oo=typeof window<"u"&&window.document!==void 0&&window.document.createElement!==void 0,oi=oo?s.useLayoutEffect:s.useEffect,dr={tag:v.HISTORY_MERGE_TAG};function ni({initialConfig:t,children:r}){const a=s.useMemo(()=>{const{theme:n,namespace:i,nodes:l,onError:c,editorState:d,html:u}=t,w=ai(null,n),p=v.createEditor({editable:t.editable,html:u,namespace:i,nodes:l,onError:h=>c(h,p),theme:n});return function(h,g){if(g!==null){if(g===void 0)h.update(()=>{const m=v.$getRoot();if(m.isEmpty()){const x=v.$createParagraphNode();m.append(x);const y=oo?document.activeElement:null;(v.$getSelection()!==null||y!==null&&y===h.getRootElement())&&x.select()}},dr);else if(g!==null)switch(typeof g){case"string":{const m=h.parseEditorState(g);h.setEditorState(m,dr);break}case"object":h.setEditorState(g,dr);break;case"function":h.update(()=>{v.$getRoot().isEmpty()&&g(h)},dr)}}}(p,d),[p,w]},[]);return oi(()=>{const n=t.editable,[i]=a;i.setEditable(n===void 0||n)},[]),e.jsx(ao.Provider,{value:a,children:r})}const ii=typeof window<"u"&&window.document!==void 0&&window.document.createElement!==void 0?s.useLayoutEffect:s.useEffect;function si({ignoreHistoryMergeTagChange:t=!0,ignoreSelectionChange:r=!1,onChange:a}){const[n]=he();return ii(()=>{if(a)return n.registerUpdateListener(({editorState:i,dirtyElements:l,dirtyLeaves:c,prevEditorState:d,tags:u})=>{r&&l.size===0&&c.size===0||t&&u.has(v.HISTORY_MERGE_TAG)||d.isEmpty()||a(i,n,u)})},[n,t,r,a]),null}const aa={ltr:"tw:text-left",rtl:"tw:text-right",heading:{h1:"tw:scroll-m-20 tw:text-4xl tw:font-extrabold tw:tracking-tight tw:lg:text-5xl",h2:"tw:scroll-m-20 tw:border-b tw:pb-2 tw:text-3xl tw:font-semibold tw:tracking-tight tw:first:mt-0",h3:"tw:scroll-m-20 tw:text-2xl tw:font-semibold tw:tracking-tight",h4:"tw:scroll-m-20 tw:text-xl tw:font-semibold tw:tracking-tight",h5:"tw:scroll-m-20 tw:text-lg tw:font-semibold tw:tracking-tight",h6:"tw:scroll-m-20 tw:text-base tw:font-semibold tw:tracking-tight"},paragraph:"tw:outline-hidden",quote:"tw:mt-6 tw:border-l-2 tw:pl-6 tw:italic",link:"tw:text-blue-600 tw:hover:underline tw:hover:cursor-pointer",list:{checklist:"tw:relative",listitem:"tw:mx-8",listitemChecked:'tw:relative tw:mx-2 tw:px-6 tw:list-none tw:outline-hidden tw:line-through tw:before:content-[""] tw:before:w-4 tw:before:h-4 tw:before:top-0.5 tw:before:left-0 tw:before:cursor-pointer tw:before:block tw:before:bg-cover tw:before:absolute tw:before:border tw:before:border-primary tw:before:rounded tw:before:bg-primary tw:before:bg-no-repeat tw:after:content-[""] tw:after:cursor-pointer tw:after:border-white tw:after:border-solid tw:after:absolute tw:after:block tw:after:top-[6px] tw:after:w-[3px] tw:after:left-[7px] tw:after:right-[7px] tw:after:h-[6px] tw:after:rotate-45 tw:after:border-r-2 tw:after:border-b-2 tw:after:border-l-0 tw:after:border-t-0',listitemUnchecked:'tw:relative tw:mx-2 tw:px-6 tw:list-none tw:outline-hidden tw:before:content-[""] tw:before:w-4 tw:before:h-4 tw:before:top-0.5 tw:before:left-0 tw:before:cursor-pointer tw:before:block tw:before:bg-cover tw:before:absolute tw:before:border tw:before:border-primary tw:before:rounded',nested:{listitem:"tw:list-none tw:before:hidden tw:after:hidden"},ol:"tw:m-0 tw:p-0 tw:list-decimal tw:[&>li]:mt-2",olDepth:["tw:list-outside tw:!list-decimal","tw:list-outside tw:!list-[upper-roman]","tw:list-outside tw:!list-[lower-roman]","tw:list-outside tw:!list-[upper-alpha]","tw:list-outside tw:!list-[lower-alpha]"],ul:"tw:m-0 tw:p-0 tw:list-outside tw:[&>li]:mt-2",ulDepth:["tw:list-outside tw:!list-disc","tw:list-outside tw:!list-disc","tw:list-outside tw:!list-disc","tw:list-outside tw:!list-disc","tw:list-outside tw:!list-disc"]},hashtag:"tw:text-blue-600 tw:bg-blue-100 tw:rounded-md tw:px-1",text:{bold:"tw:font-bold",code:"tw:bg-gray-100 tw:p-1 tw:rounded-md",italic:"tw:italic",strikethrough:"tw:line-through",subscript:"tw:sub",superscript:"tw:sup",underline:"tw:underline",underlineStrikethrough:"tw:underline tw:line-through"},image:"tw:relative tw:inline-block tw:user-select-none tw:cursor-default editor-image",inlineImage:"tw:relative tw:inline-block tw:user-select-none tw:cursor-default inline-editor-image",keyword:"tw:text-purple-900 tw:font-bold",code:"EditorTheme__code",codeHighlight:{atrule:"EditorTheme__tokenAttr",attr:"EditorTheme__tokenAttr",boolean:"EditorTheme__tokenProperty",builtin:"EditorTheme__tokenSelector",cdata:"EditorTheme__tokenComment",char:"EditorTheme__tokenSelector",class:"EditorTheme__tokenFunction","class-name":"EditorTheme__tokenFunction",comment:"EditorTheme__tokenComment",constant:"EditorTheme__tokenProperty",deleted:"EditorTheme__tokenProperty",doctype:"EditorTheme__tokenComment",entity:"EditorTheme__tokenOperator",function:"EditorTheme__tokenFunction",important:"EditorTheme__tokenVariable",inserted:"EditorTheme__tokenSelector",keyword:"EditorTheme__tokenAttr",namespace:"EditorTheme__tokenVariable",number:"EditorTheme__tokenProperty",operator:"EditorTheme__tokenOperator",prolog:"EditorTheme__tokenComment",property:"EditorTheme__tokenProperty",punctuation:"EditorTheme__tokenPunctuation",regex:"EditorTheme__tokenVariable",selector:"EditorTheme__tokenSelector",string:"EditorTheme__tokenSelector",symbol:"EditorTheme__tokenProperty",tag:"EditorTheme__tokenProperty",url:"EditorTheme__tokenOperator",variable:"EditorTheme__tokenVariable"},characterLimit:"tw:!bg-destructive/50",table:"EditorTheme__table tw:w-fit tw:overflow-scroll tw:border-collapse",tableCell:"EditorTheme__tableCell tw:w-24 tw:relative tw:border tw:px-4 tw:py-2 tw:text-left tw:[&[align=center]]:text-center tw:[&[align=right]]:text-right",tableCellActionButton:"EditorTheme__tableCellActionButton tw:bg-background tw:block tw:border-0 tw:rounded-2xl tw:w-5 tw:h-5 tw:text-foreground tw:cursor-pointer",tableCellActionButtonContainer:"EditorTheme__tableCellActionButtonContainer tw:block tw:right-1 tw:top-1.5 tw:absolute tw:z-10 tw:w-5 tw:h-5",tableCellEditing:"EditorTheme__tableCellEditing tw:rounded-sm tw:shadow-sm",tableCellHeader:"EditorTheme__tableCellHeader tw:bg-muted tw:border tw:px-4 tw:py-2 tw:text-left tw:font-bold tw:[&[align=center]]:text-center tw:[&[align=right]]:text-right",tableCellPrimarySelected:"EditorTheme__tableCellPrimarySelected tw:border tw:border-primary tw:border-solid tw:block tw:h-[calc(100%-2px)] tw:w-[calc(100%-2px)] tw:absolute tw:-left-[1px] tw:-top-[1px] tw:z-10 ",tableCellResizer:"EditorTheme__tableCellResizer tw:absolute tw:-right-1 tw:h-full tw:w-2 tw:cursor-ew-resize tw:z-10 tw:top-0",tableCellSelected:"EditorTheme__tableCellSelected tw:bg-muted",tableCellSortedIndicator:"EditorTheme__tableCellSortedIndicator tw:block tw:opacity-50 tw:absolute tw:bottom-0 tw:left-0 tw:w-full tw:h-1 tw:bg-muted",tableResizeRuler:"EditorTheme__tableCellResizeRuler tw:block tw:absolute tw:w-[1px] tw:h-full tw:bg-primary tw:top-0",tableRowStriping:"EditorTheme__tableRowStriping tw:m-0 tw:border-t tw:p-0 tw:even:bg-muted",tableSelected:"EditorTheme__tableSelected tw:ring-2 tw:ring-primary tw:ring-offset-2",tableSelection:"EditorTheme__tableSelection tw:bg-transparent",layoutItem:"tw:border tw:border-dashed tw:px-4 tw:py-2",layoutContainer:"tw:grid tw:gap-2.5 tw:my-2.5 tw:mx-0",autocomplete:"tw:text-muted-foreground",blockCursor:"",embedBlock:{base:"tw:user-select-none",focus:"tw:ring-2 tw:ring-primary tw:ring-offset-2"},hr:'tw:p-0.5 tw:border-none tw:my-1 tw:mx-0 tw:cursor-pointer tw:after:content-[""] tw:after:block tw:after:h-0.5 tw:after:bg-muted tw:selected:ring-2 tw:selected:ring-primary tw:selected:ring-offset-2 tw:selected:user-select-none',indent:"[--lexical-indent-base-value:40px]",mark:"",markOverlap:""},oa=[Ur.HeadingNode,v.ParagraphNode,v.TextNode,Ur.QuoteNode],ci=s.createContext(null),Or={didCatch:!1,error:null};class li extends s.Component{constructor(r){super(r),this.resetErrorBoundary=this.resetErrorBoundary.bind(this),this.state=Or}static getDerivedStateFromError(r){return{didCatch:!0,error:r}}resetErrorBoundary(){const{error:r}=this.state;if(r!==null){for(var a,n,i=arguments.length,l=new Array(i),c=0;c0&&arguments[0]!==void 0?arguments[0]:[],r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[];return t.length!==r.length||t.some((a,n)=>!Object.is(a,r[n]))}function wi({children:t,onError:r}){return e.jsx(li,{fallback:e.jsx("div",{style:{border:"1px solid #f00",color:"#f00",padding:"8px"},children:"An error was thrown."}),onError:r,children:t})}const ui=typeof window<"u"&&window.document!==void 0&&window.document.createElement!==void 0?s.useLayoutEffect:s.useEffect;function pi(t){return{initialValueFn:()=>t.isEditable(),subscribe:r=>t.registerEditableListener(r)}}function hi(){return function(t){const[r]=he(),a=s.useMemo(()=>t(r),[r,t]),[n,i]=s.useState(()=>a.initialValueFn()),l=s.useRef(n);return ui(()=>{const{initialValueFn:c,subscribe:d}=a,u=c();return l.current!==u&&(l.current=u,i(u)),d(w=>{l.current=w,i(w)})},[a,t]),n}(pi)}function gi(t,r){const a=t.getRootElement();if(a===null)return[];const n=a.getBoundingClientRect(),i=getComputedStyle(a),l=parseFloat(i.paddingLeft)+parseFloat(i.paddingRight),c=Array.from(r.getClientRects());let d,u=c.length;c.sort((w,p)=>{const h=w.top-p.top;return Math.abs(h)<=3?w.left-p.left:h});for(let w=0;wp.top&&d.left+d.width>p.left,g=p.width+l===n.width;h||g?(c.splice(w--,1),u--):d=p}return c}function xr(t,...r){const a=new URL("https://lexical.dev/docs/error"),n=new URLSearchParams;n.append("code",t);for(const i of r)n.append("v",i);throw a.search=n.toString(),Error(`Minified Lexical error #${t}; visit ${a.toString()} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}const no=typeof window<"u"&&window.document!==void 0&&window.document.createElement!==void 0,fi=no&&"documentMode"in document?document.documentMode:null;!(!no||!("InputEvent"in window)||fi)&&"getTargetRanges"in new window.InputEvent("input");function ue(t){return`${t}px`}const mi={attributes:!0,characterData:!0,childList:!0,subtree:!0};function vi(t,r,a){let n=null,i=null,l=null,c=[];const d=document.createElement("div");function u(){n===null&&xr(182),i===null&&xr(183);const{left:h,top:g}=i.getBoundingClientRect(),m=gi(t,r);var x,y;d.isConnected||(y=d,(x=i).insertBefore(y,x.firstChild));let f=!1;for(let E=0;Em.length;)c.pop();f&&a(c)}function w(){i=null,n=null,l!==null&&l.disconnect(),l=null,d.remove();for(const h of c)h.remove();c=[]}d.style.position="relative";const p=t.registerRootListener(function h(){const g=t.getRootElement();if(g===null)return w();const m=g.parentElement;if(!v.isHTMLElement(m))return w();w(),n=g,i=m,l=new MutationObserver(x=>{const y=t.getRootElement(),f=y&&y.parentElement;if(y!==n||f!==i)return h();for(const E of x)if(!d.contains(E.target))return u()}),l.observe(m,mi),u()});return()=>{p(),w()}}function Ta(t,r,a){if(t.type!=="text"&&v.$isElementNode(r)){const n=r.getDOMSlot(a);return[n.element,n.getFirstChildOffset()+t.offset]}return[v.getDOMTextNode(a)||a,t.offset]}function bi(t){for(const r of t){const a=r.style;a.background!=="Highlight"&&(a.background="Highlight"),a.color!=="HighlightText"&&(a.color="HighlightText"),a.marginTop!==ue(-1.5)&&(a.marginTop=ue(-1.5)),a.paddingTop!==ue(4)&&(a.paddingTop=ue(4)),a.paddingBottom!==ue(0)&&(a.paddingBottom=ue(0))}}function xi(t,r=bi){let a=null,n=null,i=null,l=null,c=null,d=null,u=()=>{};function w(p){p.read(()=>{const h=v.$getSelection();if(!v.$isRangeSelection(h))return a=null,i=null,l=null,d=null,u(),void(u=()=>{});const[g,m]=function(I){const S=I.getStartEndPoints();return I.isBackward()?[S[1],S[0]]:S}(h),x=g.getNode(),y=x.getKey(),f=g.offset,E=m.getNode(),k=E.getKey(),N=m.offset,C=t.getElementByKey(y),A=t.getElementByKey(k),R=a===null||C!==n||f!==i||y!==a.getKey(),O=l===null||A!==c||N!==d||k!==l.getKey();if((R||O)&&C!==null&&A!==null){const I=function(S,D,Y,Z,L,j,et){const P=(S._window?S._window.document:document).createRange();return P.setStart(...Ta(D,Y,Z)),P.setEnd(...Ta(L,j,et)),P}(t,g,x,C,m,E,A);u(),u=vi(t,I,r)}a=x,n=C,i=f,l=E,c=A,d=N})}return w(t.getEditorState()),v.mergeRegister(t.registerUpdateListener(({editorState:p})=>w(p)),()=>{u()})}function yi(t,r){let a=null;const n=()=>{const i=getSelection(),l=i&&i.anchorNode,c=t.getRootElement();l!==null&&c!==null&&c.contains(l)?a!==null&&(a(),a=null):a===null&&(a=xi(t,r))};return t.registerRootListener(i=>{if(i){const l=i.ownerDocument;return l.addEventListener("selectionchange",n),n(),()=>{a!==null&&a(),l.removeEventListener("selectionchange",n)}}})}function ki(t){const r=v.$findMatchingParent(t,a=>v.$isElementNode(a)&&!a.isInline());return v.$isElementNode(r)||xr(4,t.__key),r}function _i(t){const r=v.$getSelection()||v.$getPreviousSelection();let a;if(v.$isRangeSelection(r))a=v.$caretFromPoint(r.focus,"next");else{if(r!=null){const c=r.getNodes(),d=c[c.length-1];d&&(a=v.$getSiblingCaret(d,"next"))}a=a||v.$getChildCaret(v.$getRoot(),"previous").getFlipped().insert(v.$createParagraphNode())}const n=ji(t,a),i=v.$getAdjacentChildCaret(n),l=v.$isChildCaret(i)?v.$normalizeCaret(i):n;return v.$setSelectionFromCaretRange(v.$getCollapsedCaretRange(l)),t.getLatest()}function ji(t,r,a){let n=v.$getCaretInDirection(r,"next");for(let i=n;i;i=v.$splitAtPointCaretNext(i,a))n=i;return v.$isTextPointCaret(n)&&xr(283),n.insert(t.isInline()?v.$createParagraphNode().append(t):t),v.$getCaretInDirection(v.$getSiblingCaret(t.getLatest(),"next"),r.direction)}function Ci(t){const r=v.$getSelection();if(!v.$isRangeSelection(r))return!1;const a=new Set,n=r.getNodes();for(let i=0;iv.$isElementNode(w)&&!w.isInline());if(d===null)continue;const u=d.getKey();d.canIndent()&&!a.has(u)&&(a.add(u),t(d))}return a.size>0}const Ni=Symbol.for("preact-signals");function Er(){if(ve>1)return void ve--;let t,r=!1;for(!function(){let a=yr;for(yr=void 0;a!==void 0;)a.S.v===a.v&&(a.S.i=a.i),a=a.o}();Xe!==void 0;){let a=Xe;for(Xe=void 0,kr++;a!==void 0;){const n=a.u;if(a.u=void 0,a.f&=-3,!(8&a.f)&&io(a))try{a.c()}catch(i){r||(t=i,r=!0)}a=n}}if(kr=0,ve--,r)throw t}function Ei(t){if(ve>0)return t();Yr=++Ti,ve++;try{return t()}finally{Er()}}let ut,Xe;function Sa(t){const r=ut;ut=void 0;try{return t()}finally{ut=r}}let yr,ve=0,kr=0,Ti=0,Yr=0,fr=0;function Ra(t){if(ut===void 0)return;let r=t.n;return r===void 0||r.t!==ut?(r={i:0,S:t,p:ut.s,n:void 0,t:ut,e:void 0,x:void 0,r},ut.s!==void 0&&(ut.s.n=r),ut.s=r,t.n=r,32&ut.f&&t.S(r),r):r.i===-1?(r.i=0,r.n!==void 0&&(r.n.p=r.p,r.p!==void 0&&(r.p.n=r.n),r.p=ut.s,r.n=void 0,ut.s.n=r,ut.s=r),r):void 0}function Ut(t,r){this.v=t,this.i=0,this.n=void 0,this.t=void 0,this.l=0,this.W=r==null?void 0:r.watched,this.Z=r==null?void 0:r.unwatched,this.name=r==null?void 0:r.name}function We(t,r){return new Ut(t,r)}function io(t){for(let r=t.s;r!==void 0;r=r.n)if(r.S.i!==r.i||!r.S.h()||r.S.i!==r.i)return!0;return!1}function Ma(t){for(let r=t.s;r!==void 0;r=r.n){const a=r.S.n;if(a!==void 0&&(r.r=a),r.S.n=r,r.i=-1,r.n===void 0){t.s=r;break}}}function so(t){let r,a=t.s;for(;a!==void 0;){const n=a.p;a.i===-1?(a.S.U(a),n!==void 0&&(n.n=a.n),a.n!==void 0&&(a.n.p=n)):r=a,a.S.n=a.r,a.r!==void 0&&(a.r=void 0),a=n}t.s=r}function Ne(t,r){Ut.call(this,void 0),this.x=t,this.s=void 0,this.g=fr-1,this.f=4,this.W=r==null?void 0:r.watched,this.Z=r==null?void 0:r.unwatched,this.name=r==null?void 0:r.name}function Si(t,r){return new Ne(t,r)}function co(t){const r=t.m;if(t.m=void 0,typeof r=="function"){ve++;const a=ut;ut=void 0;try{r()}catch(n){throw t.f&=-2,t.f|=8,na(t),n}finally{ut=a,Er()}}}function na(t){for(let r=t.s;r!==void 0;r=r.n)r.S.U(r);t.x=void 0,t.s=void 0,co(t)}function Ri(t){if(ut!==this)throw new Error("Out-of-order effect");so(this),ut=t,this.f&=-2,8&this.f&&na(this),Er()}function Be(t,r){this.x=t,this.m=void 0,this.s=void 0,this.u=void 0,this.f=32,this.name=r==null?void 0:r.name}function pe(t,r){const a=new Be(t,r);try{a.c()}catch(i){throw a.d(),i}const n=a.d.bind(a);return n[Symbol.dispose]=n,n}function Ge(t,r={}){const a={};for(const n in t){const i=r[n],l=We(i===void 0?t[n]:i);a[n]=l}return a}Ut.prototype.brand=Ni,Ut.prototype.h=function(){return!0},Ut.prototype.S=function(t){const r=this.t;r!==t&&t.e===void 0&&(t.x=r,this.t=t,r!==void 0?r.e=t:Sa(()=>{var a;(a=this.W)==null||a.call(this)}))},Ut.prototype.U=function(t){if(this.t!==void 0){const r=t.e,a=t.x;r!==void 0&&(r.x=a,t.e=void 0),a!==void 0&&(a.e=r,t.x=void 0),t===this.t&&(this.t=a,a===void 0&&Sa(()=>{var n;(n=this.Z)==null||n.call(this)}))}},Ut.prototype.subscribe=function(t){return pe(()=>{const r=this.value,a=ut;ut=void 0;try{t(r)}finally{ut=a}},{name:"sub"})},Ut.prototype.valueOf=function(){return this.value},Ut.prototype.toString=function(){return this.value+""},Ut.prototype.toJSON=function(){return this.value},Ut.prototype.peek=function(){const t=ut;ut=void 0;try{return this.value}finally{ut=t}},Object.defineProperty(Ut.prototype,"value",{get(){const t=Ra(this);return t!==void 0&&(t.i=this.i),this.v},set(t){if(t!==this.v){if(kr>100)throw new Error("Cycle detected");(function(r){ve!==0&&kr===0&&r.l!==Yr&&(r.l=Yr,yr={S:r,v:r.v,i:r.i,o:yr})})(this),this.v=t,this.i++,fr++,ve++;try{for(let r=this.t;r!==void 0;r=r.x)r.t.N()}finally{Er()}}}}),Ne.prototype=new Ut,Ne.prototype.h=function(){if(this.f&=-3,1&this.f)return!1;if((36&this.f)==32||(this.f&=-5,this.g===fr))return!0;if(this.g=fr,this.f|=1,this.i>0&&!io(this))return this.f&=-2,!0;const t=ut;try{Ma(this),ut=this;const r=this.x();(16&this.f||this.v!==r||this.i===0)&&(this.v=r,this.f&=-17,this.i++)}catch(r){this.v=r,this.f|=16,this.i++}return ut=t,so(this),this.f&=-2,!0},Ne.prototype.S=function(t){if(this.t===void 0){this.f|=36;for(let r=this.s;r!==void 0;r=r.n)r.S.S(r)}Ut.prototype.S.call(this,t)},Ne.prototype.U=function(t){if(this.t!==void 0&&(Ut.prototype.U.call(this,t),this.t===void 0)){this.f&=-33;for(let r=this.s;r!==void 0;r=r.n)r.S.U(r)}},Ne.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(let t=this.t;t!==void 0;t=t.x)t.t.N()}},Object.defineProperty(Ne.prototype,"value",{get(){if(1&this.f)throw new Error("Cycle detected");const t=Ra(this);if(this.h(),t!==void 0&&(t.i=this.i),16&this.f)throw this.v;return this.v}}),Be.prototype.c=function(){const t=this.S();try{if(8&this.f||this.x===void 0)return;const r=this.x();typeof r=="function"&&(this.m=r)}finally{t()}},Be.prototype.S=function(){if(1&this.f)throw new Error("Cycle detected");this.f|=1,this.f&=-9,co(this),Ma(this),ve++;const t=ut;return ut=this,Ri.bind(this,t)},Be.prototype.N=function(){2&this.f||(this.f|=2,this.u=Xe,Xe=this)},Be.prototype.d=function(){this.f|=8,1&this.f||na(this)},Be.prototype.dispose=function(){this.d()};v.defineExtension({build:(t,r,a)=>Ge(r),config:v.safeCast({defaultSelection:"rootEnd",disabled:!1}),name:"@lexical/extension/AutoFocus",register(t,r,a){const n=a.getOutput();return pe(()=>n.disabled.value?void 0:t.registerRootListener(i=>{t.focus(()=>{const l=document.activeElement;i===null||l!==null&&i.contains(l)||i.focus({preventScroll:!0})},{defaultSelection:n.defaultSelection.peek()})}))}});function lo(){const t=v.$getRoot(),r=v.$getSelection(),a=v.$createParagraphNode();t.clear(),t.append(a),r!==null&&a.select(),v.$isRangeSelection(r)&&(r.format=0)}function wo(t,r=lo){return t.registerCommand(v.CLEAR_EDITOR_COMMAND,a=>(t.update(r),!0),v.COMMAND_PRIORITY_EDITOR)}v.defineExtension({build:(t,r,a)=>Ge(r),config:v.safeCast({$onClear:lo}),name:"@lexical/extension/ClearEditor",register(t,r,a){const{$onClear:n}=a.getOutput();return pe(()=>wo(t,n.value))}});function Mi(t){return(typeof t.nodes=="function"?t.nodes():t.nodes)||[]}const Pr=v.createState("format",{parse:t=>typeof t=="number"?t:0});class uo extends v.DecoratorNode{$config(){return this.config("decorator-text",{extends:v.DecoratorNode,stateConfigs:[{flat:!0,stateConfig:Pr}]})}getFormat(){return v.$getState(this,Pr)}getFormatFlags(r,a){return v.toggleTextFormatType(this.getFormat(),r,a)}hasFormat(r){const a=v.TEXT_TYPE_TO_FORMAT[r];return(this.getFormat()&a)!==0}setFormat(r){return v.$setState(this,Pr,r)}toggleFormat(r){const a=this.getFormat(),n=v.toggleTextFormatType(a,r,null);return this.setFormat(n)}isInline(){return!0}createDOM(){return document.createElement("span")}updateDOM(){return!1}}function Di(t){return t instanceof uo}v.defineExtension({name:"@lexical/extension/DecoratorText",nodes:()=>[uo],register:(t,r,a)=>t.registerCommand(v.FORMAT_TEXT_COMMAND,n=>{const i=v.$getSelection();if(v.$isNodeSelection(i)||v.$isRangeSelection(i))for(const l of i.getNodes())Di(l)&&l.toggleFormat(n);return!1},v.COMMAND_PRIORITY_LOW)});function po(t,r){let a;return We(t(),{unwatched(){a&&(a(),a=void 0)},watched(){this.value=t(),a=r(this)}})}const Zr=v.defineExtension({build:t=>po(()=>t.getEditorState(),r=>t.registerUpdateListener(a=>{r.value=a.editorState})),name:"@lexical/extension/EditorState"});function pt(t,...r){const a=new URL("https://lexical.dev/docs/error"),n=new URLSearchParams;n.append("code",t);for(const i of r)n.append("v",i);throw a.search=n.toString(),Error(`Minified Lexical error #${t}; visit ${a.toString()} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}function ho(t,r){if(t&&r&&!Array.isArray(r)&&typeof t=="object"&&typeof r=="object"){const a=t,n=r;for(const i in n)a[i]=ho(a[i],n[i]);return t}return r}const ia=0,Xr=1,go=2,Ar=3,wr=4,Le=5,Lr=6,He=7;function Br(t){return t.id===ia}function fo(t){return t.id===go}function Ii(t){return function(r){return r.id===Xr}(t)||pt(305,String(t.id),String(Xr)),Object.assign(t,{id:go})}const Oi=new Set;class Pi{constructor(r,a){$t(this,"builder");$t(this,"configs");$t(this,"_dependency");$t(this,"_peerNameSet");$t(this,"extension");$t(this,"state");$t(this,"_signal");this.builder=r,this.extension=a,this.configs=new Set,this.state={id:ia}}mergeConfigs(){let r=this.extension.config||{};const a=this.extension.mergeConfig?this.extension.mergeConfig.bind(this.extension):v.shallowMergeConfig;for(const n of this.configs)r=a(r,n);return r}init(r){const a=this.state;fo(a)||pt(306,String(a.id));const n={getDependency:this.getInitDependency.bind(this),getDirectDependentNames:this.getDirectDependentNames.bind(this),getPeer:this.getInitPeer.bind(this),getPeerNameSet:this.getPeerNameSet.bind(this)},i={...n,getDependency:this.getDependency.bind(this),getInitResult:this.getInitResult.bind(this),getPeer:this.getPeer.bind(this)},l=function(d,u,w){return Object.assign(d,{config:u,id:Ar,registerState:w})}(a,this.mergeConfigs(),n);let c;this.state=l,this.extension.init&&(c=this.extension.init(r,l.config,n)),this.state=function(d,u,w){return Object.assign(d,{id:wr,initResult:u,registerState:w})}(l,c,i)}build(r){const a=this.state;let n;a.id!==wr&&pt(307,String(a.id),String(Le)),this.extension.build&&(n=this.extension.build(r,a.config,a.registerState));const i={...a.registerState,getOutput:()=>n,getSignal:this.getSignal.bind(this)};this.state=function(l,c,d){return Object.assign(l,{id:Le,output:c,registerState:d})}(a,n,i)}register(r,a){this._signal=a;const n=this.state;n.id!==Le&&pt(308,String(n.id),String(Le));const i=this.extension.register&&this.extension.register(r,n.config,n.registerState);return this.state=function(l){return Object.assign(l,{id:Lr})}(n),()=>{const l=this.state;l.id!==He&&pt(309,String(n.id),String(He)),this.state=function(c){return Object.assign(c,{id:Le})}(l),i&&i()}}afterRegistration(r){const a=this.state;let n;return a.id!==Lr&&pt(310,String(a.id),String(Lr)),this.extension.afterRegistration&&(n=this.extension.afterRegistration(r,a.config,a.registerState)),this.state=function(i){return Object.assign(i,{id:He})}(a),n}getSignal(){return this._signal===void 0&&pt(311),this._signal}getInitResult(){this.extension.init===void 0&&pt(312,this.extension.name);const r=this.state;return function(a){return a.id>=wr}(r)||pt(313,String(r.id),String(wr)),r.initResult}getInitPeer(r){const a=this.builder.extensionNameMap.get(r);return a?a.getExtensionInitDependency():void 0}getExtensionInitDependency(){const r=this.state;return function(a){return a.id>=Ar}(r)||pt(314,String(r.id),String(Ar)),{config:r.config}}getPeer(r){const a=this.builder.extensionNameMap.get(r);return a?a.getExtensionDependency():void 0}getInitDependency(r){const a=this.builder.getExtensionRep(r);return a===void 0&&pt(315,this.extension.name,r.name),a.getExtensionInitDependency()}getDependency(r){const a=this.builder.getExtensionRep(r);return a===void 0&&pt(315,this.extension.name,r.name),a.getExtensionDependency()}getState(){const r=this.state;return function(a){return a.id>=He}(r)||pt(316,String(r.id),String(He)),r}getDirectDependentNames(){return this.builder.incomingEdges.get(this.extension.name)||Oi}getPeerNameSet(){let r=this._peerNameSet;return r||(r=new Set((this.extension.peerDependencies||[]).map(([a])=>a)),this._peerNameSet=r),r}getExtensionDependency(){if(!this._dependency){const r=this.state;(function(a){return a.id>=Le})(r)||pt(317,this.extension.name),this._dependency={config:r.config,init:r.initResult,output:r.output}}return this._dependency}}const Da={tag:v.HISTORY_MERGE_TAG};function Ai(){const t=v.$getRoot();t.isEmpty()&&t.append(v.$createParagraphNode())}const Li=v.defineExtension({config:v.safeCast({setOptions:Da,updateOptions:Da}),init:({$initialEditorState:t=Ai})=>({$initialEditorState:t,initialized:!1}),afterRegistration(t,{updateOptions:r,setOptions:a},n){const i=n.getInitResult();if(!i.initialized){i.initialized=!0;const{$initialEditorState:l}=i;if(v.$isEditorState(l))t.setEditorState(l,a);else if(typeof l=="function")t.update(()=>{l(t)},r);else if(l&&(typeof l=="string"||typeof l=="object")){const c=t.parseEditorState(l);t.setEditorState(c,a)}}return()=>{}},name:"@lexical/extension/InitialState",nodes:[v.RootNode,v.TextNode,v.LineBreakNode,v.TabNode,v.ParagraphNode]}),Ia=Symbol.for("@lexical/extension/LexicalBuilder");function Oa(){}function Bi(t){throw t}function ur(t){return Array.isArray(t)?t:[t]}const zr="0.43.0+prod.esm";class $e{constructor(r){$t(this,"roots");$t(this,"extensionNameMap");$t(this,"outgoingConfigEdges");$t(this,"incomingEdges");$t(this,"conflicts");$t(this,"_sortedExtensionReps");$t(this,"PACKAGE_VERSION");this.outgoingConfigEdges=new Map,this.incomingEdges=new Map,this.extensionNameMap=new Map,this.conflicts=new Map,this.PACKAGE_VERSION=zr,this.roots=r;for(const a of r)this.addExtension(a)}static fromExtensions(r){const a=[ur(Li)];for(const n of r)a.push(ur(n));return new $e(a)}static maybeFromEditor(r){const a=r[Ia];return a&&(a.PACKAGE_VERSION!==zr&&pt(292,a.PACKAGE_VERSION,zr),a instanceof $e||pt(293)),a}static fromEditor(r){const a=$e.maybeFromEditor(r);return a===void 0&&pt(294),a}constructEditor(){const{$initialEditorState:r,onError:a,...n}=this.buildCreateEditorArgs(),i=Object.assign(v.createEditor({...n,...a?{onError:l=>{a(l,i)}}:{}}),{[Ia]:this});for(const l of this.sortedExtensionReps())l.build(i);return i}buildEditor(){let r=Oa;function a(){try{r()}finally{r=Oa}}const n=Object.assign(this.constructEditor(),{dispose:a,[Symbol.dispose]:a});return r=v.mergeRegister(this.registerEditor(n),()=>n.setRootElement(null)),n}hasExtensionByName(r){return this.extensionNameMap.has(r)}getExtensionRep(r){const a=this.extensionNameMap.get(r.name);if(a)return a.extension!==r&&pt(295,r.name),a}addEdge(r,a,n){const i=this.outgoingConfigEdges.get(r);i?i.set(a,n):this.outgoingConfigEdges.set(r,new Map([[a,n]]));const l=this.incomingEdges.get(a);l?l.add(r):this.incomingEdges.set(a,new Set([r]))}addExtension(r){this._sortedExtensionReps!==void 0&&pt(296);const a=ur(r),[n]=a;typeof n.name!="string"&&pt(297,typeof n.name);let i=this.extensionNameMap.get(n.name);if(i!==void 0&&i.extension!==n&&pt(298,n.name),!i){i=new Pi(this,n),this.extensionNameMap.set(n.name,i);const l=this.conflicts.get(n.name);typeof l=="string"&&pt(299,n.name,l);for(const c of n.conflictsWith||[])this.extensionNameMap.has(c)&&pt(299,n.name,c),this.conflicts.set(c,n.name);for(const c of n.dependencies||[]){const d=ur(c);this.addEdge(n.name,d[0].name,d.slice(1)),this.addExtension(d)}for(const[c,d]of n.peerDependencies||[])this.addEdge(n.name,c,d?[d]:[])}}sortedExtensionReps(){if(this._sortedExtensionReps)return this._sortedExtensionReps;const r=[],a=(n,i)=>{let l=n.state;if(fo(l))return;const c=n.extension.name;var d;Br(l)||pt(300,c,i||"[unknown]"),Br(d=l)||pt(304,String(d.id),String(ia)),l=Object.assign(d,{id:Xr}),n.state=l;const u=this.outgoingConfigEdges.get(c);if(u)for(const w of u.keys()){const p=this.extensionNameMap.get(w);p&&a(p,c)}l=Ii(l),n.state=l,r.push(n)};for(const n of this.extensionNameMap.values())Br(n.state)&&a(n);for(const n of r)for(const[i,l]of this.outgoingConfigEdges.get(n.extension.name)||[])if(l.length>0){const c=this.extensionNameMap.get(i);if(c)for(const d of l)c.configs.add(d)}for(const[n,...i]of this.roots)if(i.length>0){const l=this.extensionNameMap.get(n.name);l===void 0&&pt(301,n.name);for(const c of i)l.configs.add(c)}return this._sortedExtensionReps=r,this._sortedExtensionReps}registerEditor(r){const a=this.sortedExtensionReps(),n=new AbortController,i=[()=>n.abort()],l=n.signal;for(const c of a){const d=c.register(r,l);d&&i.push(d)}for(const c of a){const d=c.afterRegistration(r);d&&i.push(d)}return v.mergeRegister(...i)}buildCreateEditorArgs(){const r={},a=new Set,n=new Map,i=new Map,l={},c={},d=this.sortedExtensionReps();for(const p of d){const{extension:h}=p;if(h.onError!==void 0&&(r.onError=h.onError),h.disableEvents!==void 0&&(r.disableEvents=h.disableEvents),h.parentEditor!==void 0&&(r.parentEditor=h.parentEditor),h.editable!==void 0&&(r.editable=h.editable),h.namespace!==void 0&&(r.namespace=h.namespace),h.$initialEditorState!==void 0&&(r.$initialEditorState=h.$initialEditorState),h.nodes)for(const g of Mi(h)){if(typeof g!="function"){const m=n.get(g.replace);m&&pt(302,h.name,g.replace.name,m.extension.name),n.set(g.replace,p)}a.add(g)}if(h.html){if(h.html.export)for(const[g,m]of h.html.export.entries())i.set(g,m);h.html.import&&Object.assign(l,h.html.import)}h.theme&&ho(c,h.theme)}Object.keys(c).length>0&&(r.theme=c),a.size&&(r.nodes=[...a]);const u=Object.keys(l).length>0,w=i.size>0;(u||w)&&(r.html={},u&&(r.html.import=l),w&&(r.html.export=i));for(const p of d)p.init(r);return r.onError||(r.onError=Bi),r}}const zi=new Set,Pa=v.defineExtension({build(t,r,a){const n=a.getDependency(Zr).output,i=We({watchedNodeKeys:new Map}),l=po(()=>{},()=>pe(()=>{const c=l.peek(),{watchedNodeKeys:d}=i.value;let u,w=!1;n.value.read(()=>{if(v.$getSelection())for(const[p,h]of d.entries()){if(h.size===0){d.delete(p);continue}const g=v.$getNodeByKey(p),m=g&&g.isSelected()||!1;w=w||m!==(!!c&&c.has(p)),m&&(u=u||new Set,u.add(p))}}),!w&&u&&c&&u.size===c.size||(l.value=u)}));return{watchNodeKey:function(c){const d=Si(()=>(l.value||zi).has(c)),{watchedNodeKeys:u}=i.peek();let w=u.get(c);const p=w!==void 0;return w=w||new Set,w.add(d),p||(u.set(c,w),i.value={watchedNodeKeys:u}),d}}},dependencies:[Zr],name:"@lexical/extension/NodeSelection"}),Vi=v.createCommand("INSERT_HORIZONTAL_RULE_COMMAND");class Fe extends v.DecoratorNode{static getType(){return"horizontalrule"}static clone(r){return new Fe(r.__key)}static importJSON(r){return sa().updateFromJSON(r)}static importDOM(){return{hr:()=>({conversion:$i,priority:0})}}exportDOM(){return{element:document.createElement("hr")}}createDOM(r){const a=document.createElement("hr");return v.addClassNamesToElement(a,r.theme.hr),a}getTextContent(){return` +`}isInline(){return!1}updateDOM(){return!1}}function $i(){return{node:sa()}}function sa(){return v.$create(Fe)}function Fi(t){return t instanceof Fe}v.defineExtension({dependencies:[Zr,Pa],name:"@lexical/extension/HorizontalRule",nodes:()=>[Fe],register(t,r,a){const{watchNodeKey:n}=a.getDependency(Pa).output,i=We({nodeSelections:new Map}),l=t._config.theme.hrSelected??"selected";return v.mergeRegister(t.registerCommand(Vi,c=>{const d=v.$getSelection();if(!v.$isRangeSelection(d))return!1;if(d.focus.getNode()!==null){const u=sa();_i(u)}return!0},v.COMMAND_PRIORITY_EDITOR),t.registerCommand(v.CLICK_COMMAND,c=>{if(v.isDOMNode(c.target)){const d=v.$getNodeFromDOMNode(c.target);if(Fi(d))return function(u,w=!1){const p=v.$getSelection(),h=u.isSelected(),g=u.getKey();let m;w&&v.$isNodeSelection(p)?m=p:(m=v.$createNodeSelection(),v.$setSelection(m)),h?m.delete(g):m.add(g)}(d,c.shiftKey),!0}return!1},v.COMMAND_PRIORITY_LOW),t.registerMutationListener(Fe,(c,d)=>{Ei(()=>{let u=!1;const{nodeSelections:w}=i.peek();for(const[p,h]of c.entries())if(h==="destroyed")w.delete(p),u=!0;else{const g=w.get(p),m=t.getElementByKey(p);g?g.domNode.value=m:(u=!0,w.set(p,{domNode:We(m),selectedSignal:n(p)}))}u&&(i.value={nodeSelections:w})})}),pe(()=>{const c=[];for(const{domNode:d,selectedSignal:u}of i.value.nodeSelections.values())c.push(pe(()=>{const w=d.value;w&&(u.value?v.addClassNamesToElement(w,l):v.removeClassNamesFromElement(w,l))}));return v.mergeRegister(...c)}))}});v.defineExtension({build:(t,r)=>Ge({inheritEditableFromParent:r.inheritEditableFromParent}),config:v.safeCast({$getParentEditor:function(){const t=v.$getEditor();return $e.fromEditor(t),t},inheritEditableFromParent:!1}),init:(t,r,a)=>{const n=r.$getParentEditor();t.parentEditor=n,t.theme=t.theme||n._config.theme},name:"@lexical/extension/NestedEditor",register:(t,r,a)=>pe(()=>{const n=t._parentEditor;if(n&&a.getOutput().inheritEditableFromParent.value)return t.setEditable(n.isEditable()),n.registerEditableListener(t.setEditable.bind(t))})});v.defineExtension({build:(t,r,a)=>Ge(r),config:v.safeCast({disabled:!1,onReposition:void 0}),name:"@lexical/utils/SelectionAlwaysOnDisplay",register:(t,r,a)=>{const n=a.getOutput();return pe(()=>{if(!n.disabled.value)return yi(t,n.onReposition.value)})}});function mo(t){return t.canBeEmpty()}function Ui(t,r,a=mo){return v.mergeRegister(t.registerCommand(v.KEY_TAB_COMMAND,n=>{const i=v.$getSelection();if(!v.$isRangeSelection(i))return!1;n.preventDefault();const l=function(c){if(c.getNodes().filter(g=>v.$isBlockElementNode(g)&&g.canIndent()).length>0)return!0;const d=c.anchor,u=c.focus,w=u.isBefore(d)?u:d,p=w.getNode(),h=ki(p);if(h.canIndent()){const g=h.getKey();let m=v.$createRangeSelection();if(m.anchor.set(g,0,"element"),m.focus.set(g,0,"element"),m=v.$normalizeSelection__EXPERIMENTAL(m),m.anchor.is(w))return!0}return!1}(i)?n.shiftKey?v.OUTDENT_CONTENT_COMMAND:v.INDENT_CONTENT_COMMAND:v.INSERT_TAB_COMMAND;return t.dispatchCommand(l,void 0)},v.COMMAND_PRIORITY_EDITOR),t.registerCommand(v.INDENT_CONTENT_COMMAND,()=>{const n=typeof r=="number"?r:r?r.peek():null,i=v.$getSelection();if(!v.$isRangeSelection(i))return!1;const l=typeof a=="function"?a:a.peek();return Ci(c=>{if(l(c)){const d=c.getIndent()+1;(!n||dGe(r),config:v.safeCast({$canIndent:mo,disabled:!1,maxIndent:null}),name:"@lexical/extension/TabIndentation",register(t,r,a){const{disabled:n,maxIndent:i,$canIndent:l}=a.getOutput();return pe(()=>{if(!n.value)return Ui(t,i,l)})}});const Gi=v.defineExtension({name:"@lexical/react/ReactProvider"});function Ki(){return v.$getRoot().getTextContent()}function Hi(t,r=!0){if(t)return!1;let a=Ki();return r&&(a=a.trim()),a===""}function qi(t){if(!Hi(t,!1))return!1;const r=v.$getRoot().getChildren(),a=r.length;if(a>1)return!1;for(let n=0;nqi(t)}function bo(t){const r=window.location.origin,a=n=>{if(n.origin!==r)return;const i=t.getRootElement();if(document.activeElement!==i)return;const l=n.data;if(typeof l=="string"){let c;try{c=JSON.parse(l)}catch{return}if(c&&c.protocol==="nuanria_messaging"&&c.type==="request"){const d=c.payload;if(d&&d.functionId==="makeChanges"){const u=d.args;if(u){const[w,p,h,g,m]=u;t.update(()=>{const x=v.$getSelection();if(v.$isRangeSelection(x)){const y=x.anchor;let f=y.getNode(),E=0,k=0;if(v.$isTextNode(f)&&w>=0&&p>=0&&(E=w,k=w+p,x.setTextNodeRange(f,E,f,k)),E===k&&h===""||(x.insertRawText(h),f=y.getNode()),v.$isTextNode(f)){E=g,k=g+m;const N=f.getTextContentSize();E=E>N?N:E,k=k>N?N:k,x.setTextNodeRange(f,E,f,k)}n.stopImmediatePropagation()}})}}}}};return window.addEventListener("message",a,!0),()=>{window.removeEventListener("message",a,!0)}}v.defineExtension({build:(t,r,a)=>Ge(r),config:v.safeCast({disabled:typeof window>"u"}),name:"@lexical/dragon",register:(t,r,a)=>pe(()=>a.getOutput().disabled.value?void 0:bo(t))});function Yi(t,...r){const a=new URL("https://lexical.dev/docs/error"),n=new URLSearchParams;n.append("code",t);for(const i of r)n.append("v",i);throw a.search=n.toString(),Error(`Minified Lexical error #${t}; visit ${a.toString()} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}const ca=typeof window<"u"&&window.document!==void 0&&window.document.createElement!==void 0?s.useLayoutEffect:s.useEffect;function Zi({editor:t,ErrorBoundary:r}){return function(a,n){const[i,l]=s.useState(()=>a.getDecorators());return ca(()=>a.registerDecoratorListener(c=>{_a.flushSync(()=>{l(c)})}),[a]),s.useEffect(()=>{l(a.getDecorators())},[a]),s.useMemo(()=>{const c=[],d=Object.keys(i);for(let u=0;ua._onError(g),children:e.jsx(s.Suspense,{fallback:null,children:i[w]})}),h=a.getElementByKey(w);h!==null&&c.push(_a.createPortal(p,h,w))}return c},[n,i,a])}(t,r)}function Xi({editor:t,ErrorBoundary:r}){return function(a){const n=$e.maybeFromEditor(a);if(n&&n.hasExtensionByName(Gi.name)){for(const i of["@lexical/plain-text","@lexical/rich-text"])n.hasExtensionByName(i)&&Yi(320,i);return!0}return!1}(t)?null:e.jsx(Zi,{editor:t,ErrorBoundary:r})}function Aa(t){return t.getEditorState().read(vo(t.isComposing()))}function Wi({contentEditable:t,placeholder:r=null,ErrorBoundary:a}){const[n]=he();return function(i){ca(()=>v.mergeRegister(Ur.registerRichText(i),bo(i)),[i])}(n),e.jsxs(e.Fragment,{children:[t,e.jsx(Ji,{content:r}),e.jsx(Xi,{editor:n,ErrorBoundary:a})]})}function Ji({content:t}){const[r]=he(),a=function(i){const[l,c]=s.useState(()=>Aa(i));return ca(()=>{function d(){const u=Aa(i);c(u)}return d(),v.mergeRegister(i.registerUpdateListener(()=>{d()}),i.registerEditableListener(()=>{d()}))},[i]),l}(r),n=hi();return a?typeof t=="function"?t(n):t:null}function Qi({defaultSelection:t}){const[r]=he();return s.useEffect(()=>{r.focus(()=>{const a=document.activeElement,n=r.getRootElement();n===null||a!==null&&n.contains(a)||n.focus({preventScroll:!0})},{defaultSelection:t})},[t,r]),null}const ts=typeof window<"u"&&window.document!==void 0&&window.document.createElement!==void 0?s.useLayoutEffect:s.useEffect;function es({onClear:t}){const[r]=he();return ts(()=>wo(r,t),[r,t]),null}const xo=typeof window<"u"&&window.document!==void 0&&window.document.createElement!==void 0?s.useLayoutEffect:s.useEffect;function rs({editor:t,ariaActiveDescendant:r,ariaAutoComplete:a,ariaControls:n,ariaDescribedBy:i,ariaErrorMessage:l,ariaExpanded:c,ariaInvalid:d,ariaLabel:u,ariaLabelledBy:w,ariaMultiline:p,ariaOwns:h,ariaRequired:g,autoCapitalize:m,className:x,id:y,role:f="textbox",spellCheck:E=!0,style:k,tabIndex:N,"data-testid":C,...A},R){const[O,I]=s.useState(t.isEditable()),S=s.useCallback(Y=>{Y&&Y.ownerDocument&&Y.ownerDocument.defaultView?t.setRootElement(Y):t.setRootElement(null)},[t]),D=s.useMemo(()=>function(...Y){return Z=>{for(const L of Y)typeof L=="function"?L(Z):L!=null&&(L.current=Z)}}(R,S),[S,R]);return xo(()=>(I(t.isEditable()),t.registerEditableListener(Y=>{I(Y)})),[t]),e.jsx("div",{"aria-activedescendant":O?r:void 0,"aria-autocomplete":O?a:"none","aria-controls":O?n:void 0,"aria-describedby":i,...l!=null?{"aria-errormessage":l}:{},"aria-expanded":O&&f==="combobox"?!!c:void 0,...d!=null?{"aria-invalid":d}:{},"aria-label":u,"aria-labelledby":w,"aria-multiline":p,"aria-owns":O?h:void 0,"aria-readonly":!O||void 0,"aria-required":g,autoCapitalize:m,className:x,contentEditable:O,"data-testid":C,id:y,ref:D,role:f,spellCheck:E,style:k,tabIndex:N,...A})}const as=s.forwardRef(rs);function La(t){return t.getEditorState().read(vo(t.isComposing()))}const os=s.forwardRef(ns);function ns(t,r){const{placeholder:a,...n}=t,[i]=he();return e.jsxs(e.Fragment,{children:[e.jsx(as,{editor:i,...n,ref:r}),a!=null&&e.jsx(is,{editor:i,content:a})]})}function is({content:t,editor:r}){const a=function(c){const[d,u]=s.useState(()=>La(c));return xo(()=>{function w(){const p=La(c);u(p)}return w(),v.mergeRegister(c.registerUpdateListener(()=>{w()}),c.registerEditableListener(()=>{w()}))},[c]),d}(r),[n,i]=s.useState(r.isEditable());if(s.useLayoutEffect(()=>(i(r.isEditable()),r.registerEditableListener(c=>{i(c)})),[r]),!a)return null;let l=null;return typeof t=="function"?l=t(n):t!==null&&(l=t),l===null?null:e.jsx("div",{"aria-hidden":!0,children:l})}function ss({placeholder:t,className:r,placeholderClassName:a}){return e.jsx(os,{className:r??"ContentEditable__root tw:relative tw:block tw:min-h-11 tw:overflow-auto tw:px-3 tw:py-3 tw:text-sm tw:outline-hidden","aria-placeholder":t,placeholder:e.jsx("div",{className:a??"tw:pointer-events-none tw:absolute tw:top-0 tw:select-none tw:overflow-hidden tw:text-ellipsis tw:px-3 tw:py-3 tw:text-sm tw:text-muted-foreground",children:t})})}const yo=s.createContext(void 0);function cs({activeEditor:t,$updateToolbar:r,blockType:a,setBlockType:n,showModal:i,children:l}){const c=s.useMemo(()=>({activeEditor:t,$updateToolbar:r,blockType:a,setBlockType:n,showModal:i}),[t,r,a,n,i]);return e.jsx(yo.Provider,{value:c,children:l})}function ko(){const t=s.useContext(yo);if(!t)throw new Error("useToolbarContext must be used within a ToolbarContext provider");return t}function ls(){const[t,r]=s.useState(void 0),a=s.useCallback(()=>{r(void 0)},[]),n=s.useMemo(()=>{if(t===void 0)return;const{title:l,content:c}=t;return e.jsx(o.Dialog,{open:!0,onOpenChange:a,children:e.jsxs(o.DialogContent,{children:[e.jsx(o.DialogHeader,{children:e.jsx(o.DialogTitle,{children:l})}),c]})})},[t,a]),i=s.useCallback((l,c,d=!1)=>{r({closeOnClickOutside:d,content:c(a),title:l})},[a]);return[n,i]}function ds({children:t}){const[r]=he(),[a,n]=s.useState(r),[i,l]=s.useState("paragraph"),[c,d]=ls(),u=()=>{};return s.useEffect(()=>a.registerCommand(v.SELECTION_CHANGE_COMMAND,(w,p)=>(n(p),!1),v.COMMAND_PRIORITY_CRITICAL),[a]),e.jsxs(cs,{activeEditor:a,$updateToolbar:u,blockType:i,setBlockType:l,showModal:d,children:[c,t({blockType:i})]})}function ws(t){const[r]=he(),{activeEditor:a}=ko();s.useEffect(()=>a.registerCommand(v.SELECTION_CHANGE_COMMAND,()=>{const n=v.$getSelection();return n&&t(n),!1},v.COMMAND_PRIORITY_CRITICAL),[r,t]),s.useEffect(()=>{a.getEditorState().read(()=>{const n=v.$getSelection();n&&t(n)})},[a,t])}const Ba=[{format:"bold",icon:$.BoldIcon,label:"Bold"},{format:"italic",icon:$.ItalicIcon,label:"Italic"}];function us(){const{activeEditor:t}=ko(),[r,a]=s.useState([]),n=s.useCallback(i=>{if(v.$isRangeSelection(i)||Dn.$isTableSelection(i)){const l=[];Ba.forEach(({format:c})=>{i.hasFormat(c)&&l.push(c)}),a(c=>c.length!==l.length||!l.every(d=>c.includes(d))?l:c)}},[]);return ws(n),e.jsx(o.ToggleGroup,{type:"multiple",value:r,onValueChange:a,variant:"outline",size:"sm",children:Ba.map(({format:i,icon:l,label:c})=>e.jsx(o.ToggleGroupItem,{value:i,"aria-label":c,onClick:()=>{t.dispatchCommand(v.FORMAT_TEXT_COMMAND,i)},children:e.jsx(l,{className:"tw:h-4 tw:w-4"})},i))})}function ps({onClear:t}){const[r]=he();s.useEffect(()=>{t&&t(()=>{r.dispatchCommand(v.CLEAR_EDITOR_COMMAND,void 0)})},[r,t])}function hs({placeholder:t="Start typing ...",autoFocus:r=!1,onClear:a,actions:n}){const[,i]=s.useState(void 0),l=c=>{c!==void 0&&i(c)};return e.jsxs("div",{className:"tw:relative",children:[e.jsx(ds,{children:()=>e.jsx("div",{"data-testid":"editor-format-toolbar",className:"tw:sticky tw:top-0 tw:flex tw:gap-2 tw:overflow-auto tw:border-b tw:p-1",children:e.jsx(us,{})})}),e.jsxs("div",{className:"tw:relative",children:[e.jsx(Wi,{contentEditable:e.jsx("div",{ref:l,children:e.jsx(ss,{placeholder:t})}),ErrorBoundary:wi}),r&&e.jsx(Qi,{defaultSelection:"rootEnd"}),e.jsx(ps,{onClear:a}),e.jsx(es,{})]}),n&&e.jsx("div",{"data-slot":"editor-actions",className:"tw:flex tw:flex-row tw:items-center tw:gap-2 tw:border-t tw:px-2 tw:py-1.5",children:n})]})}const gs={namespace:"commentEditor",theme:aa,nodes:oa,onError:t=>{console.error(t)}};function _r({editorState:t,editorSerializedState:r,onChange:a,onSerializedChange:n,placeholder:i="Start typing…",autoFocus:l=!1,onClear:c,className:d,actions:u}){const[w]=s.useState(()=>({...gs,...t?{editorState:t}:{},...r?{editorState:JSON.stringify(r)}:{}})),p=s.useCallback(h=>{a==null||a(h),n==null||n(h.toJSON())},[a,n]);return e.jsx("div",{className:o.cn("pr-twp tw:overflow-hidden tw:rounded-lg tw:border tw:bg-background tw:shadow",d),children:e.jsx(ni,{initialConfig:w,children:e.jsxs(o.TooltipProvider,{children:[e.jsx(hs,{placeholder:i,autoFocus:l,onClear:c,actions:u}),e.jsx(si,{ignoreSelectionChange:!0,onChange:p})]})})})}function _o(t){const r=t.querySelector('[contenteditable="true"]');if(!r)return!1;r.focus();const a=window.getSelection(),n=document.createRange();return n.selectNodeContents(r),n.collapse(!1),a==null||a.removeAllRanges(),a==null||a.addRange(n),!0}function jo(t){return t?t.some(r=>r&&"text"in r&&r.text.trim().length>0?!0:!r||!("children"in r)?!1:jo(r.children)):!1}function Yt(t){var r;return(r=t==null?void 0:t.root)!=null&&r.children?jo(t.root.children):!1}function fs(t){if(!t||t.trim()==="")throw new Error("Input HTML is empty");const r=Ha.createHeadlessEditor({namespace:"EditorUtils",theme:aa,nodes:oa,onError:n=>{console.error(n)}});let a;if(r.update(()=>{const i=new DOMParser().parseFromString(t,"text/html"),l=qa.$generateNodesFromDOM(r,i);v.$getRoot().clear(),v.$insertNodes(l)},{discrete:!0}),r.getEditorState().read(()=>{a=r.getEditorState().toJSON()}),!a)throw new Error("Failed to convert HTML to editor state");return a}function jr(t){const r=Ha.createHeadlessEditor({namespace:"EditorUtils",theme:aa,nodes:oa,onError:i=>{console.error(i)}}),a=r.parseEditorState(JSON.stringify(t));r.setEditorState(a);let n="";return r.getEditorState().read(()=>{n=qa.$generateHtmlFromNodes(r)}),n=n.replace(/\s+style="[^"]*"/g,"").replace(/\s+class="[^"]*"/g,"").replace(/(.*?)<\/span>/g,"$1").replace(/]*>(.*?)<\/strong><\/b>/g,"$1").replace(/]*>(.*?)<\/b><\/strong>/g,"$1").replace(/]*>(.*?)<\/em><\/i>/g,"$1").replace(/]*>(.*?)<\/i><\/em>/g,"$1").replace(/]*>(.*?)<\/span><\/u>/g,"$1").replace(/]*>(.*?)<\/span><\/s>/g,"$1").replace(//gi,"
"),n}function la(t){return["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Home","End"].includes(t.key)?(t.stopPropagation(),!0):!1}const da=Object.freeze(["%cancelButton_tooltip%","%acceptButton_tooltip%"]),za=(t,r)=>t[r]??r;function wa({onCancelClick:t,onAcceptClick:r,canAccept:a=!0,localizedStrings:n={},className:i="tw:h-6 tw:w-6",acceptLabel:l}){const c=za(n,"%cancelButton_tooltip%"),d=l??za(n,"%acceptButton_tooltip%");return e.jsxs(o.ButtonGroup,{children:[e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.Button,{"aria-label":c,className:i,size:"icon",onClick:t,variant:"secondary",children:e.jsx($.X,{})})}),e.jsx(o.TooltipContent,{children:e.jsx("p",{children:c})})]})}),e.jsx(o.ButtonGroupSeparator,{}),e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.Button,{"aria-label":d,className:i,size:"icon",onClick:r,disabled:!a,children:e.jsx($.Check,{})})}),e.jsx(o.TooltipContent,{children:e.jsx("p",{children:d})})]})})]})}const ms="verseText",vs=Object.freeze(["%conflict_note_description_verseText%","%conflict_note_choose_aria_label%","%conflict_note_stale_notice%","%conflict_note_resolve_failed%","%conflict_note_choose_prompt%","%conflict_note_option_keep_current%","%conflict_note_option_use_other%","%conflict_note_option_combine%","%conflict_note_save_and_resolve%","%conflict_note_save_disabled_tooltip%","%conflict_note_save_warning%","%conflict_note_no_result%","%conflict_note_outcome_used_other%","%conflict_note_outcome_combined%","%conflict_note_summary_unresolved%","%conflict_note_summary_resolved_kept_current%","%conflict_note_summary_resolved_used_other%","%conflict_note_summary_resolved_combined%"]);function Ze(t){return t!==void 0&&Object.keys(t).length>0}function Wr(t){return t.editorState===void 0&&t.assignedUser===void 0&&!Ze(t.commentEdits)}const Co=["tw:prose tw:max-w-none tw:break-words tw:text-sm tw:font-normal tw:text-foreground","tw:[&>blockquote]:border-s-0 tw:[&>blockquote]:p-0 tw:[&>blockquote]:ps-0 tw:[&>blockquote]:font-normal tw:[&>blockquote]:not-italic tw:[&>blockquote]:text-foreground","tw:prose-quoteless"].join(" ");function No(t){return(t==null?void 0:t.conflictType)===ms}function Eo(t){return t==="replaced"?"reject":t==="merged"?"merged":"accept"}function mr(t,r){return t===""?r["%comment_assign_unassigned%"]??"Unassigned":t==="Team"?r["%comment_assign_team%"]??"Team":t}function ua(t){const r=o.isMacOs();return t.key==="Enter"&&(r&&t.metaKey||!r&&t.ctrlKey)}function Zt(t,r,a){const n=r[t];return n===void 0||n===t?a:n}const bs={root:{children:[{children:[],direction:"ltr",format:"",indent:0,type:"paragraph",version:1,textFormat:0,textStyle:""}],direction:"ltr",format:"",indent:0,type:"root",version:1}},xs={root:{children:[{children:[{detail:0,format:0,mode:"normal",style:"",text:"",type:"text",version:1}],direction:"ltr",format:"",indent:0,type:"paragraph",version:1,textFormat:0,textStyle:""}],direction:"ltr",format:"",indent:0,type:"root",version:1}};function Vr(t,r){return t===""?r["%commentEditor_unassigned%"]??"Unassigned":t==="Team"?r["%commentEditor_team%"]??"Team":t}function ys({assignableUsers:t,onSave:r,onClose:a,localizedStrings:n,initialAssignedUser:i}){const[l,c]=s.useState(xs),[d,u]=s.useState(i),[w,p]=s.useState(!1),h=s.useRef(void 0),g=s.useRef(null);s.useEffect(()=>{let f=!0;const E=g.current;if(!E)return;const k=setTimeout(()=>{f&&_o(E)},300);return()=>{f=!1,clearTimeout(k)}},[]);const m=s.useCallback(()=>{if(!Yt(l))return;const f=jr(l);r(f,d)},[l,r,d]),x=n["%commentEditor_placeholder%"]??"Type your comment here...",y=n["%commentEditor_assignTo_label%"]??"Assign to";return e.jsxs("div",{className:"pr-twp tw:grid tw:gap-3",children:[e.jsxs("div",{className:"tw:flex tw:items-center tw:justify-between",children:[e.jsx("span",{className:"tw:text-sm tw:font-medium",children:y}),e.jsx(wa,{onCancelClick:a,onAcceptClick:m,canAccept:Yt(l),localizedStrings:n,acceptLabel:n["%commentEditor_saveButton_tooltip%"]})]}),e.jsx("div",{className:"tw:flex tw:items-center tw:gap-2",children:e.jsxs(o.Popover,{open:w,onOpenChange:p,children:[e.jsx(o.PopoverTrigger,{asChild:!0,children:e.jsxs(o.Button,{variant:"outline",className:"tw:flex tw:w-full tw:items-center tw:justify-start tw:gap-2",disabled:t.length===0,children:[e.jsx($.AtSign,{className:"tw:h-4 tw:w-4"}),e.jsx("span",{children:Vr(d!==void 0?d:"",n)})]})}),e.jsx(o.PopoverContent,{className:"tw:w-auto tw:p-0",align:"start",onKeyDown:f=>{f.key==="Escape"&&(f.stopPropagation(),p(!1))},children:e.jsx(o.Command,{children:e.jsx(o.CommandList,{children:t.map(f=>e.jsx(o.CommandItem,{onSelect:()=>{u(f||void 0),p(!1)},className:"tw:flex tw:items-center",children:e.jsx("span",{children:Vr(f,n)})},f||"unassigned"))})})})]})}),e.jsx("div",{ref:g,role:"textbox",tabIndex:-1,className:"tw:outline-hidden",onKeyDownCapture:f=>{f.key==="Escape"?(f.preventDefault(),f.stopPropagation(),a()):ua(f)&&(f.preventDefault(),f.stopPropagation(),Yt(l)&&m())},onKeyDown:f=>{la(f),(f.key==="Enter"||f.key===" ")&&f.stopPropagation()},children:e.jsx(_r,{editorSerializedState:l,onSerializedChange:f=>c(f),placeholder:x,onClear:f=>{h.current=f}})})]})}const ks=Object.freeze(["%commentEditor_placeholder%","%commentEditor_assignTo_label%","%commentEditor_saveButton_tooltip%","%commentEditor_unassigned%","%commentEditor_team%",...da]),_s=Object.freeze(["%comment_assign_team%","%comment_assign_unassigned%","%comment_assigned_to%","%comment_assigning_to%","%comment_dateAtTime%","%comment_date_today%","%comment_date_yesterday%","%comment_deleteComment%","%comment_editComment%","%comment_replyOrAssign%","%comment_reopenResolved%","%comment_status_resolved%","%comment_status_todo%","%comment_thread_multiple_replies%","%comment_thread_single_reply%","%comment_aria_assign_user%","%comment_aria_submit_comment%","%comment_aria_mark_as_read%","%comment_aria_mark_as_unread%","%comment_aria_resolve_thread%","%comment_aria_cancel_edit%","%comment_aria_save_edit%"]),To="comment-list";function js(t){return t}function So({className:t,size:r="default",...a}){return e.jsx("div",{"data-slot":"card","data-size":r,className:o.cn("pr-twp tw:group/card tw:flex tw:flex-col tw:gap-4 tw:overflow-hidden tw:rounded-xl tw:bg-card tw:py-4 tw:text-sm tw:text-card-foreground tw:ring-1 tw:ring-foreground/10 tw:has-data-[slot=card-footer]:pb-0 tw:has-[>img:first-child]:pt-0 tw:data-[size=sm]:gap-3 tw:data-[size=sm]:py-3 tw:data-[size=sm]:has-data-[slot=card-footer]:pb-0 tw:*:[img:first-child]:rounded-t-xl tw:*:[img:last-child]:rounded-b-xl",t),...a})}function Cs({className:t,...r}){return e.jsx("div",{"data-slot":"card-header",className:o.cn("pr-twp tw:group/card-header tw:@container/card-header tw:grid tw:auto-rows-min tw:items-start tw:gap-1 tw:rounded-t-xl tw:px-4 tw:group-data-[size=sm]/card:px-3 tw:has-data-[slot=card-action]:grid-cols-[1fr_auto] tw:has-data-[slot=card-description]:grid-rows-[auto_auto] tw:[.border-b]:pb-4 tw:group-data-[size=sm]/card:[.border-b]:pb-3",t),...r})}function Ns({className:t,...r}){return e.jsx("div",{"data-slot":"card-title",className:o.cn("pr-twp tw:font-heading tw:text-base tw:leading-snug tw:font-medium tw:group-data-[size=sm]/card:text-sm",t),...r})}function Es({className:t,...r}){return e.jsx("div",{"data-slot":"card-description",className:o.cn("pr-twp tw:text-sm tw:text-muted-foreground",t),...r})}function Ro({className:t,...r}){return e.jsx("div",{"data-slot":"card-content",className:o.cn("pr-twp tw:px-4 tw:group-data-[size=sm]/card:px-3",t),...r})}function Ts({className:t,...r}){return e.jsx("div",{"data-slot":"card-footer",className:o.cn("pr-twp tw:flex tw:items-center tw:rounded-b-xl tw:border-t tw:bg-muted/50 tw:p-4 tw:group-data-[size=sm]/card:p-3",t),...r})}function Ue({children:t,isDisabled:r,disabledExplanation:a,...n}){return e.jsx("div",{...n,role:r?"group":void 0,tabIndex:r?0:void 0,"aria-label":r?a:void 0,children:t})}function Mo({className:t,size:r="default",...a}){return e.jsx(G.Avatar.Root,{"data-slot":"avatar","data-size":r,className:o.cn("pr-twp tw:group/avatar tw:relative tw:flex tw:size-8 tw:shrink-0 tw:rounded-full tw:select-none tw:after:absolute tw:after:inset-0 tw:after:rounded-full tw:after:border tw:after:border-border tw:after:mix-blend-darken tw:data-[size=lg]:size-10 tw:data-[size=sm]:size-6 tw:dark:after:mix-blend-lighten",t),...a})}function Ss({className:t,...r}){return e.jsx(G.Avatar.Image,{"data-slot":"avatar-image",className:o.cn("pr-twp tw:aspect-square tw:size-full tw:rounded-full tw:object-cover",t),...r})}function Do({className:t,...r}){return e.jsx(G.Avatar.Fallback,{"data-slot":"avatar-fallback",className:o.cn("pr-twp tw:flex tw:size-full tw:items-center tw:justify-center tw:rounded-full tw:bg-muted tw:text-sm tw:text-muted-foreground tw:group-data-[size=sm]/avatar:text-xs",t),...r})}function Va({comment:t,isReply:r=!1,localizedStrings:a,isThreadExpanded:n=!1,handleUpdateComment:i,handleDeleteComment:l,onEditingChange:c,canEditOrDelete:d=!1,draftEditorState:u,onDraftEditorStateChange:w}){const[p,h]=s.useState(),g=u??p,x=g!==void 0&&n,y=w!==void 0,f=s.useCallback(L=>{y||h(L),w==null||w(L)},[y,w]),E=s.useRef(null),k=s.useRef(!1);s.useEffect(()=>{if(!x||!k.current)return;k.current=!1;let L=!0;const j=E.current;if(!j)return;const et=setTimeout(()=>{L&&_o(j)},300);return()=>{L=!1,clearTimeout(et)}},[x]);const N=s.useCallback(L=>{L&&L.stopPropagation(),f(void 0),c==null||c(!1)},[c,f]),C=s.useCallback(async L=>{if(L&&L.stopPropagation(),!g||!i)return;await i(t.id,jr(g))&&(f(void 0),c==null||c(!1))},[g,i,t.id,c,f]),A=s.useMemo(()=>{const L=new Date(t.date),j=B.formatRelativeDate(L,a["%comment_date_today%"],a["%comment_date_yesterday%"]),et=L.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit"});return B.formatReplacementString(a["%comment_dateAtTime%"],{date:j,time:et})},[t.date,a]),R=s.useMemo(()=>t.user,[t.user]),O=s.useMemo(()=>t.user.split(" ").map(L=>L[0]).join("").toUpperCase().slice(0,2),[t.user]),I=s.useMemo(()=>B.sanitizeHtml(t.contents),[t.contents]),S=s.useMemo(()=>t.contents.replace(/<[^>]*>/g,"").trim().length>0,[t.contents]),D=!!t.conflictResolutionAction&&!S,Y=s.useMemo(()=>{if(n&&d)return e.jsxs(e.Fragment,{children:[e.jsxs(o.DropdownMenuItem,{onClick:L=>{L.stopPropagation(),k.current=!0;const j=t.contents.trim()!=="";f(j?fs(t.contents):bs),c==null||c(!0)},children:[e.jsx($.Pencil,{className:"tw:me-2 tw:h-4 tw:w-4"}),a["%comment_editComment%"]]}),e.jsxs(o.DropdownMenuItem,{onClick:async L=>{L.stopPropagation(),l&&await l(t.id)},children:[e.jsx($.Trash2,{className:"tw:me-2 tw:h-4 tw:w-4"}),a["%comment_deleteComment%"]]})]})},[d,n,a,t.contents,t.id,l,c,f]),Z=!Yt(g);return e.jsxs("div",{className:o.cn("tw:flex tw:w-full tw:flex-row tw:items-baseline tw:gap-2",{"tw:text-sm":r}),children:[e.jsx(Mo,{className:"tw:h-8 tw:w-8",children:e.jsx(Do,{className:"tw:text-xs tw:font-medium",children:O})}),e.jsxs("div",{className:"tw:flex tw:flex-1 tw:flex-col tw:gap-1",children:[e.jsxs("div",{className:"tw:flex tw:w-full tw:flex-row tw:flex-wrap tw:items-baseline tw:gap-x-2",children:[e.jsx("p",{className:"tw:text-sm tw:font-medium",children:R}),e.jsx("p",{className:"tw:text-xs tw:font-normal tw:text-muted-foreground",children:A}),e.jsx("div",{className:"tw:flex-1"}),r&&t.assignedUser!==void 0&&e.jsxs(o.Badge,{variant:"secondary",className:"tw:text-xs tw:font-normal",children:["→ ",mr(t.assignedUser,a)]})]}),x&&e.jsx("div",{role:"textbox",tabIndex:-1,className:"tw:flex tw:flex-col tw:gap-2",ref:E,onKeyDownCapture:L=>{L.key==="Escape"?(L.preventDefault(),L.stopPropagation(),N()):ua(L)&&(L.preventDefault(),L.stopPropagation(),Yt(g)&&C())},onKeyDown:L=>{la(L),(L.key==="Enter"||L.key===" ")&&L.stopPropagation()},onClick:L=>{L.stopPropagation()},children:e.jsx(_r,{className:o.cn('tw:[&_[data-lexical-editor="true"]>blockquote]:mt-0 tw:[&_[data-lexical-editor="true"]>blockquote]:border-s-0 tw:[&_[data-lexical-editor="true"]>blockquote]:ps-0 tw:[&_[data-lexical-editor="true"]>blockquote]:font-normal tw:[&_[data-lexical-editor="true"]>blockquote]:not-italic tw:[&_[data-lexical-editor="true"]>blockquote]:text-foreground'),editorSerializedState:g,onSerializedChange:L=>f(L),actions:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"tw:flex-1"}),e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.Button,{size:"icon-sm",onClick:N,variant:"outline",className:"tw:flex tw:items-center tw:justify-center tw:rounded-md","aria-label":Zt("%comment_aria_cancel_edit%",a,"Cancel edit"),children:e.jsx($.Undo2,{})})}),e.jsx(o.TooltipContent,{children:Zt("%comment_aria_cancel_edit%",a,"Cancel edit")})]}),e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(Ue,{isDisabled:Z,disabledExplanation:Zt("%comment_aria_save_edit%",a,"Save edit"),className:"tw:inline-flex",children:e.jsx(o.Button,{size:"icon-sm",onClick:C,className:"tw:flex tw:items-center tw:justify-center tw:rounded-md",disabled:Z,"aria-label":Zt("%comment_aria_save_edit%",a,"Save edit"),children:e.jsx($.ArrowUp,{})})})}),e.jsx(o.TooltipContent,{children:Zt("%comment_aria_save_edit%",a,"Save edit")})]})]})})}),!x&&e.jsxs(e.Fragment,{children:[t.status==="Resolved"&&!D&&e.jsx("div",{className:"tw:text-sm tw:italic",children:a["%comment_status_resolved%"]}),t.status==="Todo"&&r&&e.jsx("div",{className:"tw:text-sm tw:italic",children:a["%comment_status_todo%"]}),D?e.jsx("div",{className:"tw:text-sm tw:italic",children:Eo(t.conflictResolutionAction)==="merged"?a["%conflict_note_outcome_combined%"]??"Combined both changes.":a["%conflict_note_outcome_used_other%"]??"Used the other change instead of the current text."}):e.jsx("div",{className:o.cn(Co,"tw:items-start tw:gap-2",{"tw:line-clamp-3":!n}),dangerouslySetInnerHTML:{__html:I}})]})]}),Y&&e.jsxs(o.DropdownMenu,{children:[e.jsx(o.DropdownMenuTrigger,{asChild:!0,children:e.jsx(o.Button,{variant:"ghost",size:"icon",children:e.jsx($.MoreHorizontal,{})})}),e.jsx(o.DropdownMenuContent,{align:"end",children:Y})]})]})}function Io({show:t,disabled:r=!1,onClick:a,ariaLabel:n}){if(t)return e.jsx(o.Button,{variant:"ghost",size:"icon",disabled:r,className:o.cn("tw:ms-auto","tw:text-primary tw:transition-opacity tw:duration-200 tw:hover:bg-primary/10","tw:opacity-0 tw:group-hover:opacity-100"),onClick:i=>{i.stopPropagation(),a()},"aria-label":n,children:e.jsx($.Check,{className:"tw:h-4 tw:w-4"})})}const Rs={root:{children:[{children:[{detail:0,format:0,mode:"normal",style:"",text:"",type:"text",version:1}],direction:"ltr",format:"",indent:0,type:"paragraph",version:1,textFormat:0,textStyle:""}],direction:"ltr",format:"",indent:0,type:"root",version:1}},Oo=s.memo(function({classNameForVerseText:r,comments:a,localizedStrings:n,isSelected:i=!1,verseRef:l,assignedUser:c,currentUser:d,handleSelectThread:u,threadId:w,thread:p,threadStatus:h,handleAddCommentToThread:g,handleUpdateComment:m,handleDeleteComment:x,handleReadStatusChange:y,assignableUsers:f,canUserAddCommentToThread:E,canUserAssignThreadCallback:k,canUserResolveThreadCallback:N,canUserEditOrDeleteCommentCallback:C,isRead:A=!1,autoReadDelay:R=5,onVerseRefClick:O,initialAssignedUser:I,activeComments:S,rootContentSlot:D,resolveActionSlot:Y,spaceRootContentFromReplies:Z=!1,draft:L,onDraftChange:j}){var Ie;const[et,P]=s.useState({}),K=L??et,W=K.editorState??Rs,F=K.assignedUser,tt=j!==void 0,lt=s.useRef(K);lt.current=K;const it=s.useCallback(T=>{const at={...lt.current,...T};lt.current=at,tt||P(at),j==null||j(w,Wr(at)?void 0:at)},[tt,j,w]),J=s.useCallback((T,at)=>{const ct={...K.commentEdits};at===void 0?delete ct[T]:ct[T]=at,it({commentEdits:Ze(ct)?ct:void 0})},[K.commentEdits,it]),[dt,gt]=s.useState(),wt=i,[mt,vt]=s.useState(!1),[Mt,Xt]=s.useState(!1),[Wt,Nt]=s.useState(!1),[bt,Lt]=s.useState(!1),[oe,se]=s.useState(!1),[Et,kt]=s.useState(A),[qt,Jt]=s.useState(!1),Qt=s.useRef(void 0),[te,Kt]=s.useState(new Map);s.useEffect(()=>{let T=!0;return(async()=>{const ct=N?await N(w):!1;T&&se(ct)})(),()=>{T=!1}},[w,N]),s.useEffect(()=>{let T=!0;if(!i){Lt(!1),Kt(new Map);return}return(async()=>{const ct=k?await k(w):!1;T&&Lt(ct)})(),()=>{T=!1}},[i,w,k]);const Pt=s.useRef("idle");s.useEffect(()=>{if(!i){Pt.current!=="idle"&&(it({assignedUser:void 0}),gt(void 0),Pt.current="idle");return}Pt.current==="idle"&&(Pt.current="pending"),bt?Pt.current==="pending"&&I!==void 0&&I!==c&&(it({assignedUser:I}),Pt.current="auto-populated"):Pt.current==="auto-populated"&&(it({assignedUser:void 0}),Pt.current="pending")},[i,I,bt,c,it]);const Bt=s.useRef(dt);Bt.current=dt;const M=s.useRef(j);M.current=j;const q=s.useRef(w);q.current=w,s.useEffect(()=>()=>{var at;const{current:T}=lt;T.assignedUser!==void 0&&T.assignedUser===Bt.current&&T.editorState===void 0&&!Ze(T.commentEdits)&&((at=M.current)==null||at.call(M,q.current,void 0))},[]);const _=s.useMemo(()=>S??a.filter(T=>!T.deleted),[S,a]),z=s.useMemo(()=>{const{commentEdits:T}=K;if(!T)return T;const at=new Set(_.map(Ct=>Ct.id)),ct=Object.fromEntries(Object.entries(T).filter(([Ct])=>at.has(Ct)));return Ze(ct)?ct:void 0},[K,_]),X=Mt||Ze(z);s.useEffect(()=>{let T=!0;if(!i||!C){Kt(new Map);return}return(async()=>{const ct=new Map;await Promise.all(_.map(async Ct=>{const xe=await C(Ct.id);T&&ct.set(Ct.id,xe)})),T&&Kt(ct)})(),()=>{T=!1}},[i,_,C]);const V=s.useMemo(()=>_[0],[_]),rt=s.useRef(null),st=s.useRef(void 0),nt=s.useCallback(()=>{var T;(T=st.current)==null||T.call(st),it({editorState:void 0})},[it]),ft=s.useCallback(T=>{it({editorState:Yt(T)?T:void 0})},[it]),xt=s.useCallback(()=>{const T=!Et;kt(T),Jt(!T),y==null||y(w,T)},[Et,y,w]);s.useEffect(()=>{vt(!1)},[i]),s.useEffect(()=>{if(i&&!Et&&!qt&&Wr(K)){const T=setTimeout(()=>{kt(!0),y==null||y(w,!0)},R*1e3);return Qt.current=T,()=>clearTimeout(T)}Qt.current&&(clearTimeout(Qt.current),Qt.current=void 0)},[i,Et,qt,R,w,y,K]);const ht=s.useMemo(()=>({singleReply:n["%comment_thread_single_reply%"],multipleReplies:n["%comment_thread_multiple_replies%"]}),[n]),_t=s.useMemo(()=>{if(c===void 0)return;if(c==="")return n["%comment_assign_unassigned%"]??"Unassigned";const T=mr(c,n);return B.formatReplacementString(n["%comment_assigned_to%"],{assignedUser:T})},[c,n]),zt=s.useMemo(()=>_.slice(1),[_]),jt=s.useMemo(()=>zt.length??0,[zt.length]),ce=s.useMemo(()=>jt>0,[jt]),ge=s.useMemo(()=>{if(mt||jt<=2)return zt;const T=new Set(zt.slice(-2).map(at=>at.id));return zt.filter(at=>{var ct;return T.has(at.id)||((ct=K.commentEdits)==null?void 0:ct[at.id])!==void 0})},[zt,jt,mt,K.commentEdits]),le=s.useMemo(()=>mt||jt<=2?0:jt-ge.length,[jt,mt,ge.length]),je=s.useMemo(()=>jt===1?ht.singleReply:B.formatReplacementString(ht.multipleReplies,{count:jt}),[jt,ht]),Ce=s.useMemo(()=>le===1?ht.singleReply:B.formatReplacementString(ht.multipleReplies,{count:le}),[le,ht]);s.useEffect(()=>{!i&&X&&ce&&Xt(!1)},[i,X,ce]);const be=s.useCallback(async T=>{T&&T.stopPropagation();const at=Yt(W)?jr(W):void 0;if(F!==void 0){await g({threadId:w,contents:at,assignedUser:F})&&(gt(F),at&&nt());return}at&&await g({threadId:w,contents:at})&&nt()},[nt,W,g,F,w]),fe=s.useCallback(async T=>{const at=Yt(W)?jr(W):void 0,ct=T.status?T.assignedUser:F??T.assignedUser,Ct=await g({...T,contents:at,assignedUser:ct});return Ct&&(ct!==void 0&>(ct),at&&nt()),Ct},[nt,W,g,F]);if(_.length===0)return;const de=!bt||!f||f.length===0||!f.includes(d),De=!Yt(W)&&(F===void 0||F===dt),er=e.jsx(Va,{comment:V,localizedStrings:n,isThreadExpanded:i,threadStatus:h,handleAddCommentToThread:fe,handleUpdateComment:m,handleDeleteComment:x,onEditingChange:Xt,canEditOrDelete:(!X&&te.get(V.id))??!1,canUserResolveThread:oe,draftEditorState:(Ie=K.commentEdits)==null?void 0:Ie[V.id],onDraftEditorStateChange:T=>J(V.id,T)});return e.jsx(So,{role:"option","aria-selected":i,id:w,className:o.cn("tw:group tw:w-full tw:rounded-none tw:border-s-4 tw:p-3 tw:outline-hidden tw:transition-all tw:duration-200 tw:focus:ring-2 tw:focus:ring-ring tw:focus:ring-offset-1 tw:focus:ring-offset-background",{"tw:cursor-pointer tw:hover:shadow-md":!i},{"tw:border-foreground tw:shadow-md":i,"tw:border-transparent":!i},{"tw:bg-card":h!=="Resolved"&&Et,"tw:bg-muted":h==="Resolved","tw:bg-accent":!Et&&h!=="Resolved"}),onClick:()=>{u(w)},tabIndex:-1,children:e.jsxs(Ro,{className:"tw:flex tw:flex-col tw:gap-2 tw:p-0",children:[e.jsxs("div",{className:"tw:flex tw:flex-col tw:content-center tw:items-start tw:gap-2",children:[e.jsxs("div",{className:"tw:flex tw:items-center tw:gap-2",children:[_t&&e.jsx(o.Badge,{className:"tw:rounded-sm tw:bg-input tw:text-sm tw:font-normal tw:text-primary tw:hover:bg-input",children:_t}),e.jsx(o.Button,{variant:"ghost",size:"icon",onClick:T=>{T.stopPropagation(),xt()},className:"tw:text-muted-foreground tw:transition tw:hover:text-foreground","aria-label":Et?n["%comment_aria_mark_as_unread%"]??"Mark as unread":n["%comment_aria_mark_as_read%"]??"Mark as read",children:Et?e.jsx($.MailOpen,{}):e.jsx($.Mail,{})}),Y===void 0?e.jsx(Io,{show:oe&&h!=="Resolved",onClick:()=>fe({threadId:w,status:"Resolved"}),ariaLabel:n["%comment_aria_resolve_thread%"]??"Resolve thread"}):Y]}),e.jsx("div",{className:"tw:flex tw:max-w-full tw:flex-wrap tw:items-baseline tw:gap-2",children:e.jsxs("p",{ref:rt,className:o.cn("tw:flex-1 tw:overflow-hidden tw:text-ellipsis tw:text-sm tw:font-normal tw:text-muted-foreground",{"tw:overflow-visible tw:text-clip tw:whitespace-normal tw:break-words":wt},{"tw:whitespace-nowrap":!wt}),children:[l&&O?e.jsx(o.Button,{variant:"ghost",size:"sm",className:"tw:h-auto tw:px-1 tw:py-0 tw:text-sm tw:font-normal tw:text-muted-foreground",onClick:T=>{T.stopPropagation(),O(p)},children:l}):l,e.jsxs("span",{className:r,children:[V.contextBefore,e.jsx("span",{className:"tw:font-bold",children:V.selectedText}),V.contextAfter]})]})}),D??er]}),e.jsxs(e.Fragment,{children:[ce&&!i&&e.jsxs("div",{className:"tw:flex tw:items-center tw:gap-5",children:[e.jsx("div",{className:"tw:w-8",children:e.jsx(o.Separator,{})}),e.jsx("p",{className:"tw:text-sm tw:text-muted-foreground",children:je})]}),!i&&Yt(W)&&e.jsx(_r,{editorSerializedState:W,onSerializedChange:ft,placeholder:n["%comment_replyOrAssign%"]}),i&&e.jsxs(e.Fragment,{children:[Z&&ge.length>0&&e.jsx("div",{className:"tw:h-2","data-slot":"root-content-reply-gap","aria-hidden":"true"}),le>0&&e.jsxs("div",{className:"tw:flex tw:cursor-pointer tw:items-center tw:gap-5 tw:py-2",onClick:T=>{T.stopPropagation(),vt(!0)},role:"button",tabIndex:0,onKeyDown:T=>{(T.key==="Enter"||T.key===" ")&&(T.preventDefault(),T.stopPropagation(),vt(!0))},children:[e.jsx("div",{className:"tw:w-8",children:e.jsx(o.Separator,{})}),e.jsxs("div",{className:"tw:flex tw:items-center tw:gap-2",children:[e.jsx("p",{className:"tw:text-sm tw:text-muted-foreground",children:Ce}),mt?e.jsx($.ChevronUp,{}):e.jsx($.ChevronDown,{})]})]}),ge.map(T=>{var at;return e.jsx("div",{children:e.jsx(Va,{comment:T,localizedStrings:n,isReply:!0,isThreadExpanded:i,handleUpdateComment:m,handleDeleteComment:x,onEditingChange:Xt,canEditOrDelete:(!X&&te.get(T.id))??!1,draftEditorState:(at=K.commentEdits)==null?void 0:at[T.id],onDraftEditorStateChange:ct=>J(T.id,ct)})},T.id)}),E!==!1&&(!X||Yt(W))&&e.jsx("div",{role:"textbox",tabIndex:-1,className:"tw:w-full tw:space-y-2",onClick:T=>T.stopPropagation(),onKeyDownCapture:T=>{ua(T)&&(T.preventDefault(),T.stopPropagation(),(Yt(W)||F!==void 0&&F!==dt)&&be())},onKeyDown:T=>{la(T),(T.key==="Enter"||T.key===" ")&&T.stopPropagation()},children:e.jsx(_r,{editorSerializedState:W,onSerializedChange:ft,placeholder:h==="Resolved"?n["%comment_reopenResolved%"]:n["%comment_replyOrAssign%"],autoFocus:!0,onClear:T=>{st.current=T},actions:e.jsxs(e.Fragment,{children:[F!==void 0&&(Yt(W)||F!==dt)?e.jsx("span",{className:"tw:flex-1 tw:text-sm tw:text-muted-foreground",children:B.formatReplacementString(Zt("%comment_assigning_to%",n,"Assigning to: {assignedUser}"),{assignedUser:mr(F,n)})}):e.jsx("div",{className:"tw:flex-1"}),e.jsxs(o.Popover,{open:Wt,onOpenChange:Nt,children:[e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(Ue,{isDisabled:de,disabledExplanation:Zt("%comment_aria_assign_user%",n,"Assign user"),children:e.jsx(o.PopoverTrigger,{asChild:!0,children:e.jsx(o.Button,{size:"icon-sm",variant:"outline",className:"tw:flex tw:items-center tw:justify-center tw:rounded-md",disabled:de,"aria-label":Zt("%comment_aria_assign_user%",n,"Assign user"),children:e.jsx($.AtSign,{})})})})}),e.jsx(o.TooltipContent,{children:Zt("%comment_aria_assign_user%",n,"Assign user")})]}),e.jsx(o.PopoverContent,{className:"tw:w-auto tw:p-0",align:"end",onKeyDown:T=>{T.key==="Escape"&&(T.stopPropagation(),Nt(!1))},children:e.jsx(o.Command,{children:e.jsx(o.CommandList,{children:f==null?void 0:f.map(T=>e.jsx(o.CommandItem,{onSelect:()=>{it({assignedUser:T!==c?T:void 0}),Pt.current="user-selected",gt(void 0),Nt(!1)},className:"tw:flex tw:items-center",children:e.jsx("span",{children:mr(T,n)})},T||"unassigned"))})})})]}),e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(Ue,{isDisabled:De,disabledExplanation:Zt("%comment_aria_submit_comment%",n,"Submit comment"),className:"tw:inline-flex",children:e.jsx(o.Button,{size:"icon-sm",onClick:be,className:"tw:flex tw:items-center tw:justify-center tw:rounded-md",disabled:De,"aria-label":Zt("%comment_aria_submit_comment%",n,"Submit comment"),children:e.jsx($.ArrowUp,{})})})}),e.jsx(o.TooltipContent,{children:Zt("%comment_aria_submit_comment%",n,"Submit comment")})]})]})})})]})]})]})})}),Ms=o.cn(Co,"tw:[&>blockquote]:my-0 tw:[&_p]:my-0","tw:[&_u]:font-semibold tw:[&_u]:text-success-foreground tw:[&_u]:no-underline","tw:[&_s]:text-destructive tw:[&_s]:line-through"),Ds=t=>t.replace(/(\s+)(<\/[us]>)/g,"$2$1"),vr=t=>Ds(B.sanitizeHtml(t));function br({html:t}){return e.jsx("div",{className:Ms,dangerouslySetInnerHTML:{__html:t}})}function Po({comment:t,localizedStrings:r,availableActions:a="acceptOrReject",resolvedResolution:n,onResolve:i,isResolving:l=!1}){const[c,d]=s.useState("accept"),u=s.useId(),w=s.useId(),p=a==="loading",h=a==="accept",g=a==="none",m=a==="acceptRejectOrMerge",x=h?"accept":c,y=s.useMemo(()=>vr(t.rejectedText??""),[t.rejectedText]),f=s.useMemo(()=>vr(t.acceptedText??""),[t.acceptedText]),E=s.useMemo(()=>vr(t.mergedText??""),[t.mergedText]),k=s.useMemo(()=>B.sanitizeHtml(t.contents),[t.contents]);if(!No(t))return e.jsx(br,{html:k});const N=P=>{d(P==="reject"||P==="merge"?P:"accept")},C=r["%conflict_note_stale_notice%"]??"The verse was edited after this conflict was recorded, so 'Use the other change' is no longer available. Keep the current text to resolve.",A=m?[{value:"merge",label:r["%conflict_note_option_combine%"]??"Combine both changes",html:E}]:[],R=[{value:"accept",label:r["%conflict_note_option_keep_current%"]??"Keep the current text",html:f},{value:"reject",label:r["%conflict_note_option_use_other%"]??"Use the other change",html:y},...A],O=x==="accept",I=l||O;let S;O?S=r["%conflict_note_save_disabled_tooltip%"]??"Keeping the current text makes no change — resolve the thread with the ✓ to keep it.":l||(S=r["%conflict_note_save_warning%"]??"This can't be undone.");const D=r["%conflict_note_no_result%"]??"No result preview available.",Y=e.jsx("p",{className:"tw:text-muted-foreground",children:D}),Z=P=>P?e.jsx("p",{className:"tw:whitespace-pre-wrap tw:text-foreground",children:P}):Y,L=()=>{const P=n??"accept";return P==="merged"?t.mergedText?e.jsx(br,{html:E}):Y:Z(P==="reject"?t.rejectedResultText:t.resultText)},j=P=>h&&P.value==="reject",et=P=>{const K=x===P.value,W=`${w}-${P.value}`,F=j(P);return e.jsxs("label",{htmlFor:W,"data-slot":"conflict-resolution-option","data-value":P.value,className:o.cn("tw:flex tw:flex-col tw:gap-1 tw:rounded-md tw:border tw:p-2","tw:focus-within:ring-2 tw:focus-within:ring-ring tw:focus-within:ring-offset-1",K?"tw:border-border tw:bg-accent/50":"tw:border-transparent tw:hover:bg-accent/30",F?"tw:cursor-not-allowed tw:opacity-60":"tw:cursor-pointer"),children:[e.jsxs("div",{className:"tw:flex tw:items-center tw:gap-2",children:[e.jsx(o.RadioGroupItem,{id:W,value:P.value,"aria-label":P.label,disabled:F,"aria-describedby":F?u:void 0}),e.jsx("span",{"aria-hidden":!0,className:"tw:font-medium",children:P.label})]}),F&&e.jsx("span",{id:u,className:"tw:sr-only",children:C}),e.jsx(br,{html:P.html})]},P.value)};return e.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-3 tw:text-sm",onClick:P=>P.stopPropagation(),children:[e.jsx("p",{children:r["%conflict_note_description_verseText%"]??"Conflicting changes were made to the verse text."}),p&&e.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-2","data-slot":"conflict-loading",children:[e.jsx(o.Skeleton,{className:"tw:h-8 tw:w-full"}),e.jsx(o.Skeleton,{className:"tw:h-8 tw:w-full"}),e.jsx(o.Skeleton,{className:"tw:h-8 tw:w-24"})]}),!p&&g&&L(),!p&&!g&&e.jsxs(e.Fragment,{children:[e.jsx("p",{children:r["%conflict_note_choose_prompt%"]??"Select which change to keep:"}),e.jsx(o.RadioGroup,{value:x,onValueChange:N,disabled:l,"aria-label":r["%conflict_note_choose_aria_label%"]??"Choose resolution",children:R.map(P=>j(P)?e.jsx(o.TooltipProvider,{delayDuration:0,children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:et(P)}),e.jsx(o.TooltipContent,{children:C})]})},P.value):et(P))}),e.jsx(o.TooltipProvider,{delayDuration:0,children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(Ue,{isDisabled:I&&S!==void 0,disabledExplanation:S,className:"tw:inline-flex tw:self-start",children:e.jsx(o.Button,{size:"sm",disabled:I,onClick:()=>i==null?void 0:i(x),children:r["%conflict_note_save_and_resolve%"]??"Save and resolve"})})}),S&&e.jsx(o.TooltipContent,{children:S})]})})]})]})}const Is={accept:{key:"%conflict_note_summary_resolved_kept_current%",fallback:"Conflicting edits were resolved. Kept the current text."},reject:{key:"%conflict_note_summary_resolved_used_other%",fallback:"Conflicting edits were resolved. Used the other change."},merged:{key:"%conflict_note_summary_resolved_combined%",fallback:"Conflicting edits were resolved. Combined both changes."}};function Os({comment:t,localizedStrings:r,resolvedResolution:a}){const n=s.useMemo(()=>vr(t.rejectedText??""),[t.rejectedText]);if(a){const{key:l,fallback:c}=Is[a];return e.jsx("p",{className:"tw:text-sm tw:font-normal tw:text-muted-foreground",children:r[l]??c})}const i=r["%conflict_note_summary_unresolved%"]??"Conflicting edits. Choose which change to keep.";return e.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-1",children:[e.jsx("p",{className:"tw:text-sm tw:font-normal tw:text-muted-foreground",children:i}),n?e.jsx(br,{html:n}):void 0]})}function Ps(t){return t==="reject"?"reject":t==="merge"?"merged":"accept"}function As({threadId:t,threadStatus:r,isSelected:a,activeComments:n,conflictResolution:i}){const[l,c]=s.useState("loading"),[d,u]=s.useState(!1),[w,p]=s.useState(),h=i==null?void 0:i.getOptions,g=i==null?void 0:i.resolve;s.useEffect(()=>{let k=!0;if(!a){c("loading");return}return(async()=>{let C;try{C=h?await h(t):"none"}catch{C="none"}k&&(c(C),C!=="none"&&p(void 0))})(),()=>{k=!1}},[a,t,r,h]);const m=s.useRef(!1),x=s.useCallback(async k=>{if(!(!g||m.current)){m.current=!0,u(!0);try{await g(t,k)&&(p(Ps(k)),c("none"))}catch{}finally{m.current=!1,u(!1)}}},[g,t]),f=s.useMemo(()=>{if(r==="Resolved"){for(let k=n.length-1;k>=0;k-=1)if(n[k].status==="Resolved")return Eo(n[k].conflictResolutionAction);return"accept"}},[r,n])??w;return{conflictOptions:l,isResolving:d,resolve:x,resolvedResolution:f,showResolveCheck:l!=="loading"&&l!=="none"}}const Ls=s.memo(function(r){const{comments:a,localizedStrings:n,isSelected:i=!1,threadId:l,threadStatus:c,conflictResolution:d}=r,u=s.useMemo(()=>a.filter(k=>!k.deleted),[a]),w=s.useMemo(()=>u.find(k=>k.conflictType)??u[0],[u]),{conflictOptions:p,isResolving:h,resolve:g,resolvedResolution:m,showResolveCheck:x}=As({threadId:l,threadStatus:c,isSelected:i,activeComments:u,conflictResolution:d}),y=No(w);let f;y&&w&&(f=i?e.jsx(Po,{comment:w,localizedStrings:n,availableActions:p,resolvedResolution:m,onResolve:g,isResolving:h}):e.jsx(Os,{comment:w,localizedStrings:n,resolvedResolution:m}));let E;return y&&(E=e.jsx(Io,{show:x,disabled:h,onClick:()=>g("accept"),ariaLabel:n["%comment_aria_resolve_thread%"]??"Resolve thread"})),e.jsx(Oo,{...r,activeComments:u,rootContentSlot:f,resolveActionSlot:E,spaceRootContentFromReplies:y&&i})});function Bs({className:t="",classNameForVerseText:r,threads:a,currentUser:n,localizedStrings:i,handleAddCommentToThread:l,handleUpdateComment:c,handleDeleteComment:d,handleReadStatusChange:u,assignableUsers:w,canUserAddCommentToThread:p,canUserAssignThreadCallback:h,canUserResolveThreadCallback:g,canUserEditOrDeleteCommentCallback:m,selectedThreadId:x,onSelectedThreadChange:y,onVerseRefClick:f,conflictResolution:E,drafts:k,onDraftChange:N}){const[C,A]=s.useState(new Set),[R,O]=s.useState(),[I,S]=s.useState(),D=s.useCallback(async F=>{const tt=await l(F);return tt!==void 0&&F.assignedUser!==void 0&&F.assignedUser!==""&&S(F.assignedUser),tt},[l]);s.useEffect(()=>{x&&(A(F=>new Set(F).add(x)),O(x))},[x]);const Y=a.filter(F=>F.comments.some(tt=>!tt.deleted)),Z=Y.map(F=>({id:F.id})),L=s.useCallback(F=>{A(tt=>new Set(tt).add(F.id)),O(F.id),y==null||y(F.id)},[y]),j=s.useCallback(F=>{const tt=C.has(F);A(lt=>{const it=new Set(lt);return it.has(F)?it.delete(F):it.add(F),it}),O(F),y==null||y(tt?void 0:F)},[C,y]),{listboxRef:et,activeId:P,handleKeyDown:K}=o.useListbox({options:Z,onOptionSelect:L}),W=s.useCallback(F=>{F.key==="Escape"?(R&&C.has(R)&&(A(tt=>{const lt=new Set(tt);return lt.delete(R),lt}),O(void 0),y==null||y(void 0)),F.preventDefault(),F.stopPropagation()):K(F)},[R,C,K,y]);return e.jsx("div",{id:To,role:"listbox",tabIndex:0,ref:et,"aria-activedescendant":P??void 0,"aria-label":"Comments",className:o.cn("tw:flex tw:w-full tw:flex-col tw:outline-hidden tw:focus:ring-2 tw:focus:ring-ring tw:focus:ring-offset-1 tw:focus:ring-offset-background",t),onKeyDown:W,children:Y.map(F=>{const tt={classNameForVerseText:r,comments:F.comments,localizedStrings:i,verseRef:F.verseRef,handleSelectThread:j,threadId:F.id,thread:F,isRead:F.isRead,isSelected:C.has(F.id),currentUser:n,assignedUser:F.assignedUser,threadStatus:F.status,handleAddCommentToThread:D,handleUpdateComment:c,handleDeleteComment:d,handleReadStatusChange:u,assignableUsers:w,canUserAddCommentToThread:p,canUserAssignThreadCallback:h,canUserResolveThreadCallback:g,canUserEditOrDeleteCommentCallback:m,onVerseRefClick:f,initialAssignedUser:I,draft:k==null?void 0:k[F.id],onDraftChange:N};return e.jsx("div",{className:o.cn("tw:border-b tw:border-border tw:last:border-b-0",{"tw:opacity-60":F.status==="Resolved"}),children:F.type==="Conflict"?e.jsx(Ls,{...tt,conflictResolution:E}):e.jsx(Oo,{...tt})},F.id)})})}const Ao=s.forwardRef(function({area:r,...a},n){return e.jsx(o.ContentZoomAreaProvider,{area:r,children:e.jsx("div",{ref:n,...a,"data-platform-content-zoom-root":r??""})})});Ao.displayName="ContentZoomRoot";function zs({table:t}){return e.jsxs(o.DropdownMenu,{children:[e.jsx(o.DropdownMenuTrigger,{asChild:!0,children:e.jsxs(o.Button,{variant:"outline",size:"sm",className:"tw:ml-auto tw:hidden tw:h-8 tw:lg:flex",children:[e.jsx($.FilterIcon,{className:"tw:mr-2 tw:h-4 tw:w-4"}),"View"]})}),e.jsxs(o.DropdownMenuContent,{align:"end",className:"tw:w-[150px]",children:[e.jsx(o.DropdownMenuLabel,{children:"Toggle columns"}),e.jsx(o.DropdownMenuSeparator,{}),t.getAllColumns().filter(r=>r.getCanHide()).map(r=>e.jsx(o.DropdownMenuCheckboxItem,{className:"tw:capitalize",checked:r.getIsVisible(),onCheckedChange:a=>r.toggleVisibility(!!a),children:r.id},r.id))]})]})}function Te({...t}){return e.jsx(G.Select.Root,{"data-slot":"select",...t})}function Lo({className:t,...r}){return e.jsx(G.Select.Group,{"data-slot":"select-group",className:o.cn("tw:scroll-my-1 tw:p-1",t),...r})}function Se({...t}){return e.jsx(G.Select.Value,{"data-slot":"select-value",...t})}function Re({className:t,size:r="default",children:a,...n}){const i=o.readDirection();return e.jsxs(G.Select.Trigger,{"data-slot":"select-trigger","data-size":r,className:o.cn("pr-twp tw:flex tw:w-fit tw:items-center tw:gap-2 tw:rounded-lg tw:border tw:border-input tw:bg-transparent tw:py-2 tw:pe-2 tw:ps-2.5 tw:text-sm tw:whitespace-nowrap tw:transition-colors tw:outline-none tw:select-none tw:focus-visible:border-ring tw:focus-visible:ring-3 tw:focus-visible:ring-ring/50 tw:disabled:cursor-not-allowed tw:disabled:opacity-50 tw:aria-invalid:border-destructive tw:aria-invalid:ring-3 tw:aria-invalid:ring-destructive/20 tw:data-placeholder:text-muted-foreground tw:data-[size=default]:h-8 tw:data-[size=sm]:h-7 tw:data-[size=sm]:rounded-[min(var(--tw-radius-md),10px)] tw:*:data-[slot=select-value]:line-clamp-1 tw:*:data-[slot=select-value]:flex tw:*:data-[slot=select-value]:flex-1 tw:*:data-[slot=select-value]:items-center tw:*:data-[slot=select-value]:gap-1.5 tw:*:data-[slot=select-value]:text-start tw:dark:bg-input/30 tw:dark:hover:bg-input/50 tw:dark:aria-invalid:border-destructive/50 tw:dark:aria-invalid:ring-destructive/40 tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0 tw:[&_svg:not([class*=size-])]:size-4",t),dir:i,...n,children:[a,e.jsx(G.Select.Icon,{asChild:!0,children:e.jsx(Rt.IconSelector,{className:"tw:pointer-events-none tw:size-4 tw:text-muted-foreground"})})]})}function Me({className:t,children:r,position:a="popper",align:n="center",style:i,...l}){const c=o.readDirection();return e.jsx(G.Select.Portal,{children:e.jsxs(G.Select.Content,{"data-slot":"select-content","data-align-trigger":a==="item-aligned",className:o.cn("pr-twp tw:relative tw:max-h-(--radix-select-content-available-height) tw:data-[align-trigger=true]:min-w-(--radix-select-trigger-width) tw:data-[align-trigger=false]:min-w-36 tw:origin-(--radix-select-content-transform-origin) tw:overflow-x-hidden tw:overflow-y-auto tw:rounded-lg tw:bg-popover tw:text-popover-foreground tw:shadow-md tw:ring-1 tw:ring-foreground/10 tw:duration-100 tw:data-[align-trigger=true]:animate-none tw:data-[side=bottom]:slide-in-from-top-2 tw:data-[side=left]:slide-in-from-right-2 tw:data-[side=right]:slide-in-from-left-2 tw:data-[side=top]:slide-in-from-bottom-2 tw:data-open:animate-in tw:data-open:fade-in-0 tw:data-open:zoom-in-95 tw:data-closed:animate-out tw:data-closed:fade-out-0 tw:data-closed:zoom-out-95 tw:animate-none! tw:**:data-[slot$=-item]:focus:bg-foreground/10 tw:**:data-[slot$=-item]:data-highlighted:bg-foreground/10 tw:**:data-[slot$=-separator]:bg-foreground/5 tw:**:data-[slot$=-trigger]:focus:bg-foreground/10 tw:**:data-[slot$=-trigger]:aria-expanded:bg-foreground/10! tw:**:data-[variant=destructive]:focus:bg-foreground/10! tw:**:data-[variant=destructive]:text-accent-foreground! tw:**:data-[variant=destructive]:**:text-accent-foreground! tw:relative",a==="popper"&&"tw:data-[side=bottom]:translate-y-1 tw:data-[side=left]:-translate-x-1 tw:rtl:data-[side=left]:translate-x-1 tw:data-[side=right]:translate-x-1 tw:rtl:data-[side=right]:-translate-x-1 tw:data-[side=top]:-translate-y-1",t),style:{zIndex:o.Z_INDEX_ABOVE_DOCK,...i},position:a,align:n,...l,children:[e.jsx(Bo,{}),e.jsx(G.Select.Viewport,{"data-position":a,className:o.cn("tw:data-[position=popper]:h-(--radix-select-trigger-height) tw:data-[position=popper]:w-full tw:data-[position=popper]:min-w-(--radix-select-trigger-width)",a==="popper"&&"tw:"),children:e.jsx("div",{dir:c,children:r})}),e.jsx(zo,{})]})})}function Vs({className:t,...r}){return e.jsx(G.Select.Label,{"data-slot":"select-label",className:o.cn("pr-twp tw:px-1.5 tw:py-1 tw:text-xs tw:text-muted-foreground",t),...r})}function ae({className:t,children:r,...a}){return e.jsxs(G.Select.Item,{"data-slot":"select-item",className:o.cn("pr-twp tw:relative tw:flex tw:w-full tw:cursor-default tw:items-center tw:gap-1.5 tw:rounded-md tw:py-1 tw:pe-8 tw:ps-1.5 tw:text-sm tw:outline-hidden tw:select-none tw:focus:bg-accent tw:focus:text-accent-foreground tw:not-data-[variant=destructive]:focus:**:text-accent-foreground tw:data-disabled:pointer-events-none tw:data-disabled:opacity-50 tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0 tw:[&_svg:not([class*=size-])]:size-4 tw:*:[span]:last:flex tw:*:[span]:last:items-center tw:*:[span]:last:gap-2",t),...a,children:[e.jsx("span",{className:"tw:pointer-events-none tw:absolute tw:end-2 tw:flex tw:size-4 tw:items-center tw:justify-center",children:e.jsx(G.Select.ItemIndicator,{children:e.jsx(Rt.IconCheck,{className:"tw:pointer-events-none"})})}),e.jsx(G.Select.ItemText,{children:r})]})}function $s({className:t,...r}){return e.jsx(G.Select.Separator,{"data-slot":"select-separator",className:o.cn("pr-twp tw:pointer-events-none tw:-mx-1 tw:my-1 tw:h-px tw:bg-border",t),...r})}function Bo({className:t,...r}){return e.jsx(G.Select.ScrollUpButton,{"data-slot":"select-scroll-up-button",className:o.cn("pr-twp tw:z-10 tw:flex tw:cursor-default tw:items-center tw:justify-center tw:bg-popover tw:py-1 tw:[&_svg:not([class*=size-])]:size-4",t),...r,children:e.jsx(Rt.IconChevronUp,{})})}function zo({className:t,...r}){return e.jsx(G.Select.ScrollDownButton,{"data-slot":"select-scroll-down-button",className:o.cn("pr-twp tw:z-10 tw:flex tw:cursor-default tw:items-center tw:justify-center tw:bg-popover tw:py-1 tw:[&_svg:not([class*=size-])]:size-4",t),...r,children:e.jsx(Rt.IconChevronDown,{})})}function Fs({table:t}){return e.jsx("div",{className:"tw:flex tw:items-center tw:justify-between tw:px-2 tw:pb-3 tw:pt-3",children:e.jsxs("div",{className:"tw:flex tw:items-center tw:space-x-6 tw:lg:space-x-8",children:[e.jsxs("div",{className:"tw:flex-1 tw:text-sm tw:text-muted-foreground",children:[t.getFilteredSelectedRowModel().rows.length," of"," ",t.getFilteredRowModel().rows.length," row(s) selected"]}),e.jsxs("div",{className:"tw:flex tw:items-center tw:space-x-2",children:[e.jsx("p",{className:"tw:text-nowrap tw:text-sm tw:font-medium",children:"Rows per page"}),e.jsxs(Te,{value:`${t.getState().pagination.pageSize}`,onValueChange:r=>{t.setPageSize(Number(r))},children:[e.jsx(Re,{className:"tw:h-8 tw:w-[70px]",children:e.jsx(Se,{placeholder:t.getState().pagination.pageSize})}),e.jsx(Me,{side:"top",children:[10,20,30,40,50].map(r=>e.jsx(ae,{value:`${r}`,children:r},r))})]})]}),e.jsxs("div",{className:"tw:flex tw:w-[100px] tw:items-center tw:justify-center tw:text-sm tw:font-medium",children:["Page ",t.getState().pagination.pageIndex+1," of ",t.getPageCount()]}),e.jsxs("div",{className:"tw:flex tw:items-center tw:space-x-2",children:[e.jsxs(o.Button,{variant:"outline",size:"icon",className:"tw:hidden tw:h-8 tw:w-8 tw:p-0 tw:lg:flex",onClick:()=>t.setPageIndex(0),disabled:!t.getCanPreviousPage(),children:[e.jsx("span",{className:"tw:sr-only",children:"Go to first page"}),e.jsx($.ArrowLeftIcon,{className:"tw:h-4 tw:w-4"})]}),e.jsxs(o.Button,{variant:"outline",size:"icon",className:"tw:h-8 tw:w-8 tw:p-0",onClick:()=>t.previousPage(),disabled:!t.getCanPreviousPage(),children:[e.jsx("span",{className:"tw:sr-only",children:"Go to previous page"}),e.jsx($.ChevronLeftIcon,{className:"tw:h-4 tw:w-4"})]}),e.jsxs(o.Button,{variant:"outline",size:"icon",className:"tw:h-8 tw:w-8 tw:p-0",onClick:()=>t.nextPage(),disabled:!t.getCanNextPage(),children:[e.jsx("span",{className:"tw:sr-only",children:"Go to next page"}),e.jsx($.ChevronRightIcon,{className:"tw:h-4 tw:w-4"})]}),e.jsxs(o.Button,{variant:"outline",size:"icon",className:"tw:hidden tw:h-8 tw:w-8 tw:p-0 tw:lg:flex",onClick:()=>t.setPageIndex(t.getPageCount()-1),disabled:!t.getCanNextPage(),children:[e.jsx("span",{className:"tw:sr-only",children:"Go to last page"}),e.jsx($.ArrowRightIcon,{className:"tw:h-4 tw:w-4"})]})]})]})})}function Vo({columns:t,data:r,enablePagination:a=!1,showPaginationControls:n=!1,showColumnVisibilityControls:i=!1,stickyHeader:l=!1,onRowClickHandler:c=()=>{},id:d,isLoading:u=!1,noResultsMessage:w}){var R;const[p,h]=s.useState([]),[g,m]=s.useState([]),[x,y]=s.useState({}),[f,E]=s.useState({}),k=s.useMemo(()=>r??[],[r]),N=Gt.useReactTable({data:k,columns:t,getCoreRowModel:Gt.getCoreRowModel(),...a&&{getPaginationRowModel:Gt.getPaginationRowModel()},onSortingChange:h,getSortedRowModel:Gt.getSortedRowModel(),onColumnFiltersChange:m,getFilteredRowModel:Gt.getFilteredRowModel(),onColumnVisibilityChange:y,onRowSelectionChange:E,state:{sorting:p,columnFilters:g,columnVisibility:x,rowSelection:f}}),C=N.getVisibleFlatColumns();let A;return u?A=Array.from({length:10}).map((S,D)=>`skeleton-row-${D}`).map(S=>e.jsx(o.TableRow,{className:"tw:hover:bg-transparent",children:e.jsx(o.TableCell,{colSpan:C.length??t.length,className:"tw:border-0 tw:p-0",children:e.jsx("div",{className:"tw:w-full tw:py-2",children:e.jsx(o.Skeleton,{className:"tw:h-14 tw:w-full tw:rounded-md"})})})},S)):((R=N.getRowModel().rows)==null?void 0:R.length)>0?A=N.getRowModel().rows.map(O=>e.jsx(o.TableRow,{onClick:()=>c(O,N),"data-state":O.getIsSelected()&&"selected",children:O.getVisibleCells().map(I=>e.jsx(o.TableCell,{children:Gt.flexRender(I.column.columnDef.cell,I.getContext())},I.id))},O.id)):A=e.jsx(o.TableRow,{children:e.jsx(o.TableCell,{colSpan:t.length,className:"tw:h-24 tw:text-center",children:w})}),e.jsxs("div",{className:"pr-twp",id:d,children:[i&&e.jsx(zs,{table:N}),e.jsxs(o.Table,{stickyHeader:l,children:[e.jsx(o.TableHeader,{stickyHeader:l,children:N.getHeaderGroups().map(O=>e.jsx(o.TableRow,{children:O.headers.map(I=>e.jsx(o.TableHead,{className:"tw:p-0",children:I.isPlaceholder?void 0:Gt.flexRender(I.column.columnDef.header,I.getContext())},I.id))},O.id))}),e.jsx(o.TableBody,{children:A})]}),a&&e.jsxs("div",{className:"tw:flex tw:items-center tw:justify-end tw:space-x-2 tw:py-4",children:[e.jsx(o.Button,{variant:"outline",size:"sm",onClick:()=>N.previousPage(),disabled:!N.getCanPreviousPage(),children:"Previous"}),e.jsx(o.Button,{variant:"outline",size:"sm",onClick:()=>N.nextPage(),disabled:!N.getCanNextPage(),children:"Next"})]}),a&&n&&e.jsx(Fs,{table:N})]})}function Us({id:t,markdown:r,className:a,anchorTarget:n,truncate:i}){const l=s.useMemo(()=>({overrides:{a:{props:{target:n,rel:n==="_blank"?"noopener noreferrer":void 0}}}}),[n]);return e.jsx("div",{id:t,className:o.cn("pr-twp tw:prose",{"tw:line-clamp-3 tw:max-h-10 tw:overflow-hidden tw:text-ellipsis tw:break-words":i},a),children:e.jsx(In,{options:l,children:r})})}const $o=Object.freeze(["%webView_error_dump_header%","%webView_error_dump_info_message%"]),$a=(t,r)=>t[r]??r;function Fo({errorDetails:t,handleCopyNotify:r,localizedStrings:a,id:n}){const i=$a(a,"%webView_error_dump_header%"),l=$a(a,"%webView_error_dump_info_message%");function c(){navigator.clipboard.writeText(t),r&&r()}return e.jsxs("div",{id:n,className:"tw:inline-flex tw:w-full tw:flex-col tw:items-start tw:justify-start tw:gap-4",children:[e.jsxs("div",{className:"tw:inline-flex tw:items-start tw:justify-start tw:gap-4 tw:self-stretch",children:[e.jsxs("div",{className:"tw:inline-flex tw:flex-1 tw:flex-col tw:items-start tw:justify-start",children:[e.jsx("div",{className:"tw:text-color-text tw:justify-center tw:text-center tw:text-lg tw:font-semibold tw:leading-loose",children:i}),e.jsx("div",{className:"tw:justify-center tw:self-stretch tw:text-sm tw:font-normal tw:leading-tight tw:text-muted-foreground",children:l})]}),e.jsx(o.Button,{variant:"secondary",size:"icon",className:"size-8",onClick:()=>c(),children:e.jsx($.Copy,{})})]}),e.jsx("div",{className:"tw:prose tw:w-full",children:e.jsx("pre",{className:"tw:text-xs",children:t})})]})}const Gs=Object.freeze([...$o,"%webView_error_dump_copied_message%"]);function Ks({errorDetails:t,handleCopyNotify:r,localizedStrings:a,children:n,className:i,id:l}){const[c,d]=s.useState(!1),u=()=>{d(!0),r&&r()},w=p=>{p||d(!1)};return e.jsxs(o.Popover,{onOpenChange:w,children:[e.jsx(o.PopoverTrigger,{asChild:!0,children:n}),e.jsxs(o.PopoverContent,{id:l,className:o.cn("tw:min-w-80 tw:max-w-96",i),children:[c&&a["%webView_error_dump_copied_message%"]&&e.jsx(o.Label,{children:a["%webView_error_dump_copied_message%"]}),e.jsx(Fo,{errorDetails:t,handleCopyNotify:u,localizedStrings:a})]})]})}var Uo=(t=>(t[t.Check=0]="Check",t[t.Radio=1]="Radio",t))(Uo||{});function Hs({id:t,label:r,groups:a}){const[n,i]=s.useState(Object.fromEntries(a.map((w,p)=>w.itemType===0?[p,[]]:void 0).filter(w=>!!w))),[l,c]=s.useState({}),d=(w,p)=>{const h=!n[w][p];i(m=>(m[w][p]=h,{...m}));const g=a[w].items[p];g.onUpdate(g.id,h)},u=(w,p)=>{c(g=>(g[w]=p,{...g}));const h=a[w].items.find(g=>g.id===p);h?h.onUpdate(p):console.error(`Could not find dropdown radio item with id '${p}'!`)};return e.jsx("div",{id:t,children:e.jsxs(o.DropdownMenu,{children:[e.jsx(o.DropdownMenuTrigger,{asChild:!0,children:e.jsxs(o.Button,{variant:"default",children:[e.jsx($.Filter,{size:16,className:"tw:mr-2 tw:h-4 tw:w-4"}),r,e.jsx($.ChevronDown,{size:16,className:"tw:ml-2 tw:h-4 tw:w-4"})]})}),e.jsx(o.DropdownMenuContent,{children:a.map((w,p)=>e.jsxs("div",{children:[e.jsx(o.DropdownMenuLabel,{children:w.label}),e.jsx(o.DropdownMenuGroup,{children:w.itemType===0?e.jsx(e.Fragment,{children:w.items.map((h,g)=>e.jsx("div",{children:e.jsx(o.DropdownMenuCheckboxItem,{checked:n[p][g],onCheckedChange:()=>d(p,g),children:h.label})},h.id))}):e.jsx(o.DropdownMenuRadioGroup,{value:l[p],onValueChange:h=>u(p,h),children:w.items.map(h=>e.jsx("div",{children:e.jsx(o.DropdownMenuRadioItem,{value:h.id,children:h.label})},h.id))})}),e.jsx(o.DropdownMenuSeparator,{})]},w.label))})]})})}function qs({id:t,category:r,downloads:a,languages:n,moreInfoUrl:i,handleMoreInfoLinkClick:l,supportUrl:c,handleSupportLinkClick:d}){const u=new B.NumberFormat("en",{notation:"compact",compactDisplay:"short"}).format(Object.values(a).reduce((p,h)=>p+h,0)),w=()=>{window.scrollTo(0,document.body.scrollHeight)};return e.jsxs("div",{id:t,className:"pr-twp tw:flex tw:items-center tw:justify-center tw:divide-x tw:border-b tw:border-t tw:py-2 tw:text-center",children:[r&&e.jsxs("div",{className:"tw:flex tw:flex-col tw:items-center tw:gap-1 tw:px-4",children:[e.jsx("div",{className:"tw:flex",children:e.jsx("span",{className:"tw:text-xs tw:font-semibold tw:text-foreground",children:r})}),e.jsx("span",{className:"tw:text-xs tw:text-foreground",children:"CATEGORY"})]}),e.jsxs("div",{className:"tw:flex tw:flex-col tw:items-center tw:gap-1 tw:px-4",children:[e.jsxs("div",{className:"tw:flex tw:gap-1",children:[e.jsx($.User,{className:"tw:h-4 tw:w-4"}),e.jsx("span",{className:"tw:text-xs tw:font-semibold tw:text-foreground",children:u})]}),e.jsx("span",{className:"tw:text-xs tw:text-foreground",children:"USERS"})]}),e.jsxs("div",{className:"tw:flex tw:flex-col tw:items-center tw:gap-1 tw:px-4",children:[e.jsx("div",{className:"tw:flex tw:gap-2",children:n.slice(0,3).map(p=>e.jsx("span",{className:"tw:text-xs tw:font-semibold tw:text-foreground",children:p.toUpperCase()},p))}),n.length>3&&e.jsxs("button",{type:"button",onClick:()=>w(),className:"tw:text-xs tw:text-foreground tw:underline",children:["+",n.length-3," more languages"]})]}),(i||c)&&e.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-1 tw:px-4",children:[i&&e.jsx("div",{className:"tw:flex tw:gap-1",children:e.jsxs(o.Button,{onClick:()=>l(),variant:"link",className:"tw:flex tw:h-auto tw:gap-1 tw:py-0 tw:text-xs tw:font-semibold tw:text-foreground",children:["Website",e.jsx($.Link,{className:"tw:h-4 tw:w-4"})]})}),c&&e.jsx("div",{className:"tw:flex tw:gap-1",children:e.jsxs(o.Button,{onClick:()=>d(),variant:"link",className:"tw:flex tw:h-auto tw:gap-1 tw:py-0 tw:text-xs tw:font-semibold tw:text-foreground",children:["Support",e.jsx($.CircleHelp,{className:"tw:h-4 tw:w-4"})]})})]})]})}function Ys({id:t,versionHistory:r}){const[a,n]=s.useState(!1),i=new Date;function l(d){const u=new Date(d),w=new Date(i.getTime()-u.getTime()),p=w.getUTCFullYear()-1970,h=w.getUTCMonth(),g=w.getUTCDate()-1;let m="";return p>0?m=`${p.toString()} year${p===1?"":"s"} ago`:h>0?m=`${h.toString()} month${h===1?"":"s"} ago`:g===0?m="today":m=`${g.toString()} day${g===1?"":"s"} ago`,m}const c=Object.entries(r).sort((d,u)=>u[0].localeCompare(d[0]));return e.jsxs("div",{className:"pr-twp",id:t,children:[e.jsx("h3",{className:"tw:text-md tw:font-semibold",children:"What`s New"}),e.jsx("ul",{className:"tw:list-disc tw:pl-5 tw:pr-4 tw:text-xs tw:text-foreground",children:(a?c:c.slice(0,5)).map(d=>e.jsxs("div",{className:"tw:mt-3 tw:flex tw:justify-between",children:[e.jsx("div",{className:"tw:text-foreground",children:e.jsx("li",{className:"tw:prose tw:text-xs",children:e.jsx("span",{children:d[1].description})})}),e.jsxs("div",{className:"tw:justify-end tw:text-right",children:[e.jsxs("div",{children:["Version ",d[0]]}),e.jsx("div",{children:l(d[1].date)})]})]},d[0]))}),c.length>5&&e.jsx("button",{type:"button",onClick:()=>n(!a),className:"tw:text-xs tw:text-foreground tw:underline",children:a?"Show Less Version History":"Show All Version History"})]})}function Zs({id:t,publisherDisplayName:r,fileSize:a,locales:n,versionHistory:i,currentVersion:l}){const c=s.useMemo(()=>B.formatBytes(a),[a]),u=(w=>{const p=new Intl.DisplayNames(B.getCurrentLocale(),{type:"language"});return w.map(h=>p.of(h))})(n);return e.jsx("div",{id:t,className:"pr-twp tw:border-t tw:py-2",children:e.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-2 tw:divide-y",children:[Object.entries(i).length>0&&e.jsx(Ys,{versionHistory:i}),e.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-2 tw:py-2",children:[e.jsx("h2",{className:"tw:text-md tw:font-semibold",children:"Information"}),e.jsxs("div",{className:"tw:flex tw:items-start tw:justify-between tw:text-xs tw:text-foreground",children:[e.jsxs("p",{className:"tw:flex tw:flex-col tw:justify-start tw:gap-1",children:[e.jsx("span",{children:"Publisher"}),e.jsx("span",{className:"tw:font-semibold",children:r}),e.jsx("span",{children:"Size"}),e.jsx("span",{className:"tw:font-semibold",children:c})]}),e.jsx("div",{className:"tw:flex tw:w-3/4 tw:items-center tw:justify-between tw:text-xs tw:text-foreground",children:e.jsxs("p",{className:"tw:flex tw:flex-col tw:justify-start tw:gap-1",children:[e.jsx("span",{children:"Version"}),e.jsx("span",{className:"tw:font-semibold",children:l}),e.jsx("span",{children:"Languages"}),e.jsx("span",{className:"tw:font-semibold",children:u.join(", ")})]})})]})]})]})})}function Xs({entries:t,selected:r,onChange:a,placeholder:n,commandEmptyMessage:i,customSelectedText:l,isDisabled:c,sortSelected:d,icon:u,className:w,badgesPlaceholder:p,id:h}){return e.jsxs("div",{id:h,className:"tw:flex tw:items-center tw:gap-2",children:[e.jsx(o.MultiSelectComboBox,{entries:t,selected:r,onChange:a,placeholder:n,commandEmptyMessage:i,customSelectedText:l,isDisabled:c,sortSelected:d,icon:u,className:w}),r.length>0?e.jsx("div",{className:"tw:flex tw:flex-wrap tw:items-center tw:gap-2",children:r.map(g=>{var m;return e.jsxs(o.Badge,{variant:"muted",className:"tw:flex tw:items-center tw:gap-1",children:[e.jsx(o.Button,{variant:"ghost",size:"icon",className:"tw:h-4 tw:w-4 tw:p-0 tw:hover:bg-transparent",onClick:()=>a(r.filter(x=>x!==g)),children:e.jsx($.X,{className:"tw:h-3 tw:w-3"})}),(m=t.find(x=>x.value===g))==null?void 0:m.label]},g)})}):e.jsx(o.Label,{children:p})]})}const Go=Object.freeze(["%undoButton_tooltip%","%redoButton_tooltip%"]),Fa=(t,r)=>t[r]??r;function Ko({onUndoClick:t,onRedoClick:r,canUndo:a=!0,canRedo:n=!0,localizedStrings:i={},showKeyboardShortcuts:l=!0,className:c="tw:h-6 tw:w-6",variant:d="ghost"}){const u=o.isMacOs(),w=Fa(i,"%undoButton_tooltip%"),p=Fa(i,"%redoButton_tooltip%"),h=d==="secondary"||d==="default";return e.jsxs(o.ButtonGroup,{children:[e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.Button,{"aria-label":w,className:c,size:"icon",onClick:t,disabled:!a,variant:d,children:e.jsx($.Undo,{})})}),e.jsx(o.TooltipContent,{children:e.jsxs("p",{children:[w,l&&e.jsxs(e.Fragment,{children:[" ",e.jsx(o.Kbd,{children:u?"⌘Z":"Ctrl+Z"})]})]})})]})}),r&&h&&e.jsx(o.ButtonGroupSeparator,{}),r&&e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.Button,{"aria-label":p,className:c,size:"icon",onClick:r,disabled:!n,variant:d,children:e.jsx($.Redo,{})})}),e.jsx(o.TooltipContent,{children:e.jsxs("p",{children:[p,l&&e.jsxs(e.Fragment,{children:[" ",e.jsx(o.Kbd,{children:u?"⌘⇧Z":"Ctrl+Y"})]})]})})]})})]})}function Ho({children:t,editorRef:r,canUndo:a=!0,canRedo:n=!0}){const i=s.useRef(null);return s.useEffect(()=>{var u;const l=o.isMacOs(),c=((u=i.current)==null?void 0:u.querySelector(".editor-input"))??void 0,d=w=>{var h,g,m,x;if(!c||document.activeElement!==c)return;const p=w.key.toLowerCase();if(l){if(!w.metaKey)return;!w.shiftKey&&p==="z"?(w.preventDefault(),a&&((h=r.current)==null||h.undo())):w.shiftKey&&p==="z"&&(w.preventDefault(),n&&((g=r.current)==null||g.redo()))}else{if(!w.ctrlKey)return;!w.shiftKey&&p==="z"?(w.preventDefault(),a&&((m=r.current)==null||m.undo())):(p==="y"||w.shiftKey&&p==="z")&&(w.preventDefault(),n&&((x=r.current)==null||x.redo()))}};return document.addEventListener("keydown",d),()=>document.removeEventListener("keydown",d)},[n,a,r]),e.jsx("div",{ref:i,children:t})}function qo(){const t=s.useRef(void 0),r=s.useRef(new DOMRect),a=s.useRef({getBoundingClientRect:()=>{var l;const i=(l=t.current)==null?void 0:l.measure();return i&&(r.current=i),r.current},get contextElement(){var i;return(i=t.current)==null?void 0:i.contextElement}}),n=s.useCallback(i=>{t.current=i,r.current=i.measure()??new DOMRect},[]);return s.useMemo(()=>({virtualRef:a,setSource:n}),[n])}function Yo(t){if(t.getClientRects().length!==0)return t.getBoundingClientRect()}function Zo(t){return new DOMRect(t.left,t.top,0,t.height)}function Ws(t){if(t.getClientRects().length!==0)return t.getBoundingClientRect()}const Js=(t,r,a)=>t==="generated"?e.jsxs(e.Fragment,{children:[e.jsx("p",{children:"+"})," ",r["%footnoteEditor_callerDropdown_item_generated%"]]}):t==="hidden"?e.jsxs(e.Fragment,{children:[e.jsx("p",{children:"-"})," ",r["%footnoteEditor_callerDropdown_item_hidden%"]]}):e.jsxs(e.Fragment,{children:[e.jsx("p",{children:a})," ",r["%footnoteEditor_callerDropdown_item_custom%"]]});function Qs({callerType:t,customCaller:r,updateCaller:a,localizedStrings:n}){const i=s.useRef(null),l=s.useRef(null),c=s.useRef(!1),[d,u]=s.useState(t),[w,p]=s.useState(r),[h,g]=s.useState(!1),m=s.useRef(!1),x=s.useRef(d);x.current=d;const y=s.useRef(w);y.current=w,s.useEffect(()=>{u(t)},[t]),s.useEffect(()=>{w!==r&&p(r)},[r]);const f=k=>{if(c.current=!1,g(k),!k){const N=x.current,C=y.current;N!=="custom"||C?(N!==t||C!==r)&&a(N,C):(u(t),p(r))}},E=k=>{var N,C,A,R;k.stopPropagation(),document.activeElement===l.current&&k.key==="ArrowDown"||k.key==="ArrowRight"?((N=i.current)==null||N.focus(),c.current=!0):document.activeElement===i.current&&k.key==="ArrowUp"?((C=l.current)==null||C.focus(),c.current=!1):document.activeElement===i.current&&k.key==="ArrowLeft"&&((A=i.current)==null?void 0:A.selectionStart)===0&&((R=l.current)==null||R.focus(),c.current=!1),d==="custom"&&k.key==="Enter"&&(document.activeElement===l.current||document.activeElement===i.current)&&f(!1)};return e.jsxs(o.DropdownMenu,{open:h,onOpenChange:f,children:[e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.DropdownMenuTrigger,{asChild:!0,children:e.jsx(o.Button,{variant:"outline",className:"tw:h-6",children:Js(t,n,r)})})}),e.jsx(o.TooltipContent,{children:n["%footnoteEditor_callerDropdown_tooltip%"]})]})}),e.jsxs(o.DropdownMenuContent,{style:{zIndex:o.Z_INDEX_ABOVE_POPOVER},onClick:()=>{c.current&&(c.current=!1)},onKeyDown:E,onMouseMove:()=>{var k;c.current&&((k=i.current)==null||k.focus())},children:[e.jsx(o.DropdownMenuLabel,{children:n["%footnoteEditor_callerDropdown_label%"]}),e.jsx(o.DropdownMenuSeparator,{}),e.jsx(o.DropdownMenuCheckboxItem,{checked:d==="generated",onCheckedChange:()=>u("generated"),children:e.jsxs("div",{className:"tw:flex tw:w-full tw:justify-between",children:[e.jsx("span",{children:n["%footnoteEditor_callerDropdown_item_generated%"]}),e.jsx("span",{className:"tw:w-10 tw:text-center",children:Ft.GENERATOR_NOTE_CALLER})]})}),e.jsx(o.DropdownMenuCheckboxItem,{checked:d==="hidden",onCheckedChange:()=>u("hidden"),children:e.jsxs("div",{className:"tw:flex tw:w-full tw:justify-between",children:[e.jsx("span",{children:n["%footnoteEditor_callerDropdown_item_hidden%"]}),e.jsx("span",{className:"tw:w-10 tw:text-center",children:Ft.HIDDEN_NOTE_CALLER})]})}),e.jsx(o.DropdownMenuCheckboxItem,{ref:l,checked:d==="custom",onCheckedChange:()=>u("custom"),onPointerDown:()=>{m.current=d==="custom"},onClick:k=>{var N;if(k.stopPropagation(),m.current&&k.target!==i.current){f(!1);return}c.current=!0,(N=i.current)==null||N.focus()},onSelect:k=>k.preventDefault(),children:e.jsxs("div",{className:"tw:flex tw:w-full tw:justify-between",children:[e.jsx("span",{children:n["%footnoteEditor_callerDropdown_item_custom%"]}),e.jsx(o.Input,{tabIndex:0,onMouseDown:k=>{k.stopPropagation(),u("custom"),c.current=!0},ref:i,className:"tw:h-auto tw:w-10 tw:p-0 tw:text-center",value:w,onKeyDown:k=>{k.key==="Enter"||k.key==="ArrowUp"||k.key==="ArrowDown"||k.key==="ArrowLeft"||k.key==="ArrowRight"||k.stopPropagation()},maxLength:1,onChange:k=>p(k.target.value)})]})})]})]})}const tc=(t,r)=>t==="f"?e.jsxs(e.Fragment,{children:[e.jsx($.FunctionSquare,{})," ",r["%footnoteEditor_noteType_footnote_label%"]]}):t==="fe"?e.jsxs(e.Fragment,{children:[e.jsx($.SquareSigma,{})," ",r["%footnoteEditor_noteType_endNote_label%"]]}):e.jsxs(e.Fragment,{children:[e.jsx($.SquareX,{})," ",r["%footnoteEditor_noteType_crossReference_label%"]]}),ec=(t,r)=>{if(t==="x")return r["%footnoteEditor_noteType_crossReference_label%"];let a=r["%footnoteEditor_noteType_endNote_label%"];return t==="f"&&(a=r["%footnoteEditor_noteType_footnote_label%"]),B.formatReplacementString(r["%footnoteEditor_noteType_tooltip%"]??"",{noteType:a})};function rc({noteType:t,handleNoteTypeChange:r,localizedStrings:a,isTypeSwitchable:n}){return e.jsxs(o.DropdownMenu,{children:[e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.DropdownMenuTrigger,{asChild:!0,children:e.jsx(o.Button,{variant:"outline",className:"tw:h-6",children:tc(t,a)})})}),e.jsx(o.TooltipContent,{children:e.jsx("p",{children:ec(t,a)})})]})}),e.jsxs(o.DropdownMenuContent,{style:{zIndex:o.Z_INDEX_ABOVE_POPOVER},children:[e.jsx(o.DropdownMenuLabel,{children:a["%footnoteEditor_noteTypeDropdown_label%"]}),e.jsx(o.DropdownMenuSeparator,{}),e.jsxs(o.DropdownMenuCheckboxItem,{disabled:t!=="x"&&!n,checked:t==="x",onCheckedChange:()=>r("x"),className:"tw:gap-2",children:[e.jsx($.SquareX,{}),e.jsx("span",{children:a["%footnoteEditor_noteType_crossReference_label%"]})]}),e.jsxs(o.DropdownMenuCheckboxItem,{disabled:t==="x"&&!n,checked:t==="f",onCheckedChange:()=>r("f"),className:"tw:gap-2",children:[e.jsx($.FunctionSquare,{}),e.jsx("span",{children:a["%footnoteEditor_noteType_footnote_label%"]})]}),e.jsxs(o.DropdownMenuCheckboxItem,{disabled:t==="x"&&!n,checked:t==="fe",onCheckedChange:()=>r("fe"),className:"tw:gap-2",children:[e.jsx($.SquareSigma,{}),e.jsx("span",{children:a["%footnoteEditor_noteType_endNote_label%"]})]})]})]})}const Xo=Object.freeze(["%markerMenu_deprecated_label%","%markerMenu_disallowed_label%","%markerMenu_noResults%","%markerMenu_searchPlaceholder%","%markerMenu_searchPlaceholder_character%","%markerMenu_searchPlaceholder_insert%","%markerMenu_searchPlaceholder_paragraph%"]);function ac({icon:t,className:r}){const a=t??$.Ban;return e.jsx(a,{className:r,size:16})}function oc({state:t}){return e.jsx("div",{"data-slot":"marker-selection-state",className:"tw:flex tw:w-4 tw:min-w-4 tw:items-center tw:justify-center",children:t!=="none"&&e.jsx($.Check,{size:16})})}function Ua({item:t,localizedStrings:r}){return e.jsxs(o.CommandItem,{className:"tw:flex tw:gap-2 tw:hover:bg-accent",disabled:t.isDisallowed||t.isDeprecated||t.isDisabled,"aria-checked":t.selectionState===void 0?void 0:{all:!0,partial:"mixed",none:!1}[t.selectionState],onSelect:t.action,children:[t.selectionState!==void 0&&e.jsx(oc,{state:t.selectionState}),e.jsx("div",{className:"tw:w-8 tw:min-w-8",children:t.marker?e.jsx("span",{className:"tw:font-mono tw:text-xs",children:t.marker}):e.jsx("div",{children:e.jsx(ac,{icon:t.icon})})}),e.jsxs("div",{className:"tw:flex tw:min-w-0 tw:flex-1 tw:items-baseline tw:gap-2",children:[e.jsx("p",{className:"tw:min-w-0 tw:shrink tw:truncate tw:text-sm",title:t.title,children:t.title}),t.subtitle&&e.jsx("p",{className:"tw:min-w-0 tw:shrink-[9999] tw:truncate tw:text-end tw:text-xs tw:text-muted-foreground",title:t.subtitle,children:t.subtitle})]}),(t.isDisallowed||t.isDeprecated)&&e.jsx(o.CommandShortcut,{className:"tw:font-sans",children:t.isDisallowed?r["%markerMenu_disallowed_label%"]:r["%markerMenu_deprecated_label%"]})]})}function Wo({localizedStrings:t,markerMenuItems:r,searchRef:a,searchPlaceholder:n}){const[i,l]=s.useState(""),[c,d]=s.useMemo(()=>{const u=o.stripMarkerNestingPrefix(i.trim().toLowerCase());if(!u){const h=r.filter(g=>!g.isDisallowed);return[h.length>0?h:r,[]]}const w=r.filter(h=>{var m;const g=(m=h.marker)==null?void 0:m.toLowerCase();return h.isDisallowed?g===u:g==null?void 0:g.includes(u)}),p=r.filter(h=>h.title.toLowerCase().includes(u)&&!w.includes(h));return[w,p]},[i,r]);return e.jsxs(o.Command,{className:"tw:p-1",shouldFilter:!1,loop:!0,children:[e.jsx(o.CommandInput,{className:"marker-menu-search",ref:a,value:i,onValueChange:u=>l(u),placeholder:n??t["%markerMenu_searchPlaceholder%"],spaceSelectsHighlightedItem:!0}),e.jsxs(o.CommandList,{children:[e.jsx(o.CommandEmpty,{children:t["%markerMenu_noResults%"]}),e.jsx(o.CommandGroup,{children:c.map(u=>{var w;return e.jsx(Ua,{item:u,localizedStrings:t},`item-${u.marker??((w=u.icon)==null?void 0:w.displayName)}-${u.title.replaceAll(" ","")}`)})}),d.length>0&&e.jsxs(e.Fragment,{children:[c.length>0&&e.jsx(o.CommandSeparator,{alwaysRender:!0}),e.jsx(o.CommandGroup,{children:d.map(u=>{var w;return e.jsx(Ua,{item:u,localizedStrings:t},`item-${u.marker??((w=u.icon)==null?void 0:w.displayName)}-${u.title.replaceAll(" ","")}`)})})]})]})]})}function nc(t,r,a,n){if(!n||n==="p")return[];const i=B.usfmMarkers[n];if(!(i!=null&&i.children))return[];const l=[];return Object.entries(i.children).forEach(([,c])=>{l.push(...c.map(d=>({marker:d,title:a[B.usfmMarkers[d].description]??B.usfmMarkers[d].description,action:()=>{var u;(u=t.current)==null||u.insertMarker(d),r()}})))}),l.sort((c,d)=>(c.marker??c.title).localeCompare(d.marker??d.title))}function Jo(t){return{id:t.marker,label:t.marker,description:t.description,badge:t.kind==="closeTag"?"%markerMenu_endTag_label%":void 0,muted:!t.isBasic}}function ic(t){var a;const r=(a=t.attributes)==null?void 0:a.char;r!=null&&r.style&&(r.style==="ft"&&(r.style="xt"),r.style==="fr"&&(r.style="xo"),r.style==="fq"&&(r.style="xq"))}function sc(t){var a;const r=(a=t.attributes)==null?void 0:a.char;r!=null&&r.style&&(r.style==="xt"&&(r.style="ft"),r.style==="xo"&&(r.style="fr"),r.style==="xq"&&(r.style="fq"))}const cc={type:"USJ",version:"3.1",content:[{type:"para"}]};function lc({classNameForEditor:t,noteOps:r,onChange:a,onClose:n,scrRef:i,noteKey:l,editorOptions:c,defaultMarkerMenuTrigger:d,localizedStrings:u,parentEditorRef:w,markerPalette:p,onNoteEdit:h}){var Bt;const g=s.useRef(null),m=s.useRef(null),x=s.useRef(null);s.useLayoutEffect(()=>{if(!x.current)return;const M=parseFloat(getComputedStyle(x.current).width);M>0&&(x.current.style.width=`${M}px`)},[]);const[y,f]=s.useState("generated"),[E,k]=s.useState("generated"),[N,C]=s.useState("*"),[A,R]=s.useState("*"),[O,I]=s.useState("f"),[S,D]=s.useState(!1),[Y,Z]=s.useState(!0),[L,j]=s.useState(!1),et=s.useRef(!1),P=s.useRef(""),[K,W]=s.useState(!1),F=qo(),[tt,lt]=s.useState(),it=s.useRef(null),J=s.useRef(void 0),dt=s.useRef(0),gt=s.useRef(void 0),wt=s.useMemo(()=>({...c,contextMenu:void 0,markerMenuTrigger:d,hasExternalUI:!0,view:{...c.view??Ft.getDefaultViewOptions(),noteMode:"expanded",isNoteShellEditable:!1,showParaMarkerPrefixes:!1}}),[c,d]),mt=s.useMemo(()=>nc(g,()=>W(!1),u,tt),[u,tt]);s.useEffect(()=>{var M;K||(M=g.current)==null||M.focus()},[O,K]);const vt=s.useCallback(()=>{var z,X,V;const M=(z=m.current)==null?void 0:z.querySelector(".editor-input"),q=M==null?void 0:M.querySelector("span.note"),_=(V=(X=m.current)==null?void 0:X.ownerDocument.getSelection())==null?void 0:V.anchorNode;return!!q&&!!_&&q.contains(_)},[]);s.useEffect(()=>{var X,V;let M,q,_;et.current=!1,gt.current=void 0,Z(!0);const z=r==null?void 0:r.at(0);if(z&&Ft.isInsertEmbedOpOfType("note",z)){const rt=(X=z.insert.note)==null?void 0:X.caller;let st="custom";rt===Ft.GENERATOR_NOTE_CALLER?st="generated":rt===Ft.HIDDEN_NOTE_CALLER?st="hidden":rt&&(C(rt),R(rt)),f(st),k(st),I(((V=z.insert.note)==null?void 0:V.style)??"f"),M=setTimeout(()=>{var nt,ft,xt;(nt=g.current)==null||nt.applyUpdate([z]),(ft=g.current)==null||ft.selectNote(0),(xt=g.current)==null||xt.focus(),q=requestAnimationFrame(()=>{_=setTimeout(()=>{var ht,_t;vt()||((ht=g.current)==null||ht.selectNote(0),(_t=g.current)==null||_t.focus())},0)})},0)}return()=>{M&&clearTimeout(M),q!==void 0&&cancelAnimationFrame(q),_!==void 0&&clearTimeout(_)}},[r,l,vt]);const Mt=s.useCallback((M=!1)=>{var _,z,X;h==null||h();const q=(z=(_=g.current)==null?void 0:_.getNoteOps(0))==null?void 0:z.at(0);q&&Ft.isInsertEmbedOpOfType("note",q)&&(a==null||a([q]),M&&w&&l&&((X=w.current)==null||X.replaceEmbedUpdate(l,[q])))},[l,a,h,w]),Xt=s.useCallback((M,q)=>{var X,V,rt;const _=(V=(X=g.current)==null?void 0:X.getNoteOps(0))==null?void 0:V.at(0);if(!_||!Ft.isInsertEmbedOpOfType("note",_)||!_.insert.note)return;let z;M==="custom"?z=q:M==="generated"?z=Ft.GENERATOR_NOTE_CALLER:z=Ft.HIDDEN_NOTE_CALLER,_.insert.note.caller!==z&&(_.insert.note.caller=z,(rt=g.current)==null||rt.applyUpdate([_,{delete:1}]))},[]),Wt=s.useCallback(()=>{var M;J.current||(M=g.current)==null||M.commitPendingMarkerEdits(),Mt(!0),n()},[n,Mt]),Nt=s.useRef(Wt);s.useLayoutEffect(()=>{Nt.current=Wt});const bt=s.useRef({book:i.book,chapterNum:i.chapterNum});s.useLayoutEffect(()=>{(bt.current.book!==i.book||bt.current.chapterNum!==i.chapterNum)&&(bt.current={book:i.book,chapterNum:i.chapterNum},Nt.current())},[i.book,i.chapterNum]);const Lt=()=>{var q;const M=(q=m.current)==null?void 0:q.getElementsByClassName("editor-input")[0];M!=null&&M.textContent&&navigator.clipboard.writeText(M.textContent)},oe=s.useCallback((M,q)=>{h==null||h(),f(M),C(q),Xt(M,q)},[Xt,h]),se=M=>{var _,z,X,V,rt;I(M);const q=(z=(_=g.current)==null?void 0:_.getNoteOps(0))==null?void 0:z.at(0);if(q&&Ft.isInsertEmbedOpOfType("note",q)){q.insert.note&&(q.insert.note.style=M);const st=(V=(X=q.insert.note)==null?void 0:X.contents)==null?void 0:V.ops;O!=="x"&&M==="x"?st==null||st.forEach(nt=>ic(nt)):O==="x"&&M!=="x"&&(st==null||st.forEach(nt=>sc(nt))),(rt=g.current)==null||rt.applyUpdate([q,{delete:1}])}},Et=M=>{lt(M.contextMarker),j(M.canRedo)},kt=s.useCallback(M=>{var _,z,X,V,rt;const q=(z=(_=g.current)==null?void 0:_.getNoteOps(0))==null?void 0:z.at(0);if(q&&Ft.isInsertEmbedOpOfType("note",q)){M.content.length>1&&setTimeout(()=>{var ft;(ft=g.current)==null||ft.applyUpdate([{retain:2},{delete:1}])},0);const st=(X=q.insert.note)==null?void 0:X.style,nt=(rt=(V=q.insert.note)==null?void 0:V.contents)==null?void 0:rt.ops;if(st||D(!1),D(st==="x"?!!(nt!=null&&nt.every(ft=>{var ht,_t;if(!((ht=ft.attributes)!=null&&ht.char))return!0;const xt=((_t=ft.attributes)==null?void 0:_t.char).style;return xt==="xt"||xt==="xo"||xt==="xq"})):!!(nt!=null&&nt.every(ft=>{var ht,_t;if(!((ht=ft.attributes)!=null&&ht.char))return!0;const xt=((_t=ft.attributes)==null?void 0:_t.char).style;return xt==="ft"||xt==="fr"||xt==="fq"}))),!et.current){et.current=!0,P.current=JSON.stringify(q),Z(!0);return}Z(JSON.stringify(q)===P.current),Mt()}else D(!1),Z(!0)},[Mt]),qt=s.useCallback(()=>{const M=window.getSelection();if(!mt.length||!M||M.rangeCount===0)return;const q=m.current;if(!q)return;const _=M.getRangeAt(0).cloneRange();F.setSource({measure:()=>{const z=Yo(_);return z&&Zo(z)},contextElement:q}),W(!0)},[mt,F]),Jt=s.useRef(()=>{}),Qt=s.useCallback((M,q,_)=>{const{anchorRect:z}=M;if(!p||!z)return;const{passive:X}=_;o.runMarkerPaletteSession({items:q,passive:X,sessionCounterRef:dt,setSession:V=>{J.current=V},clearSessionIfCurrent:V=>o.clearPaletteSessionIfCurrent(J,V),runSessionKey:V=>Jt.current(V),show:V=>p.show(q.map(Jo),z,X,V),restoreSelectionIfLost:()=>{var V,rt,st;if(!((V=g.current)!=null&&V.getSelection())){const nt=gt.current;nt?(rt=g.current)==null||rt.setSelection(nt):(st=g.current)==null||st.selectNote(0)}},focusEditor:()=>{var V;return(V=g.current)==null?void 0:V.focus()},applyItem:V=>{var rt;return(rt=g.current)==null?void 0:rt.applyMarkerMenuSelection(V,{trigger:"backslash",literalPrefixLanded:!1})},onShowError:V=>{(!B.isPlatformError(V)||V.code!==B.ABORTED)&&console.warn(`FootnoteEditor: the marker palette did not open: ${B.getErrorMessage(V)}`)}})},[p]),te=s.useCallback(()=>{var _;const M=(_=g.current)==null?void 0:_.getMarkerMenuContext();if(!M)return!1;const q=Ft.getMarkerMenuItems(wt.styleInfo??Ft.defaultStyleInfo,M);return q.length===0?!1:(Qt(M,q,{passive:!M.hasTextSelection}),!0)},[Qt,wt.styleInfo]),Kt=s.useCallback(M=>{const q=J.current;if(!q||!p)return;o.handleMarkerPaletteSessionKeyDown(M,q,{update:z=>p.update(z),commit:()=>p.commit(),dismiss:()=>p.dismiss(),commitTyped:z=>{var X;return(X=g.current)==null?void 0:X.commitTypedMarker(z)},commitTypedAndReopen:z=>{var X;(X=g.current)==null||X.commitTypedMarker(z,{trailingSpace:!1}),te()},commitTypedCloser:z=>{var X;return(X=g.current)==null?void 0:X.commitTypedCloser(z)},commitItem:z=>{var V;const X=q.items.find(rt=>rt.marker===z);X&&((V=g.current)==null||V.applyMarkerMenuSelection(X,{trigger:"backslash",literalPrefixLanded:!1}))}})==="ended"&&o.clearPaletteSessionIfCurrent(J,q.token)},[p,te]);s.useEffect(()=>{Jt.current=Kt},[Kt]),s.useEffect(()=>{const M=q=>{var X,V;const _=(X=m.current)==null?void 0:X.querySelector(".editor-input");if(!_||q.target!==_)return;const z=(V=g.current)==null?void 0:V.getSelection();z&&(gt.current=z)};return document.addEventListener("focusout",M),()=>document.removeEventListener("focusout",M)},[]),s.useEffect(()=>{const M=()=>{K&&W(!1)};return window.addEventListener("click",M),()=>{window.removeEventListener("click",M)}},[K]),s.useEffect(()=>{var M;K&&((M=it.current)==null||M.focus())},[K]),s.useEffect(()=>{var _;const M=()=>{var z;return((z=m.current)==null?void 0:z.querySelector(".editor-input"))??void 0};if(((_=wt.view)==null?void 0:_.markerMode)==="editable"){const z=V=>{var nt,ft,xt,ht;if(o.isImeCompositionKeyEvent(V))return;const rt=M();if(!rt||document.activeElement!==rt)return;if(J.current&&p){Jt.current(V);return}if(V.key==="Enter"&&!vt()){V.preventDefault(),V.stopPropagation(),(nt=g.current)==null||nt.selectNote(0),(ft=g.current)==null||ft.focus();return}if(p&&V.key===d){if(!vt()){V.preventDefault(),V.stopPropagation(),(xt=g.current)==null||xt.selectNote(0),(ht=g.current)==null||ht.focus();return}te()&&(V.preventDefault(),V.stopPropagation())}},X=()=>{var rt,st;const V=M();!V||document.activeElement!==V||vt()||((rt=g.current)==null||rt.selectNote(0),(st=g.current)==null||st.focus())};return document.addEventListener("keydown",z,{capture:!0}),document.addEventListener("paste",X,{capture:!0}),()=>{document.removeEventListener("keydown",z,{capture:!0}),document.removeEventListener("paste",X,{capture:!0})}}const q=z=>{const X=M();!K&&X&&document.activeElement===X&&z.key===d?(z.preventDefault(),qt()):K&&z.key==="Escape"&&(z.preventDefault(),W(!1))};return document.addEventListener("keydown",q),()=>{document.removeEventListener("keydown",q)}},[K,qt,d,(Bt=wt.view)==null?void 0:Bt.markerMode,wt.styleInfo,p,te,vt]),s.useEffect(()=>{const M=()=>{var z,X,V;const q=((z=m.current)==null?void 0:z.querySelector(".editor-input"))??void 0;if(!q||document.activeElement!==q)return;const _=document.getSelection();_&&!_.isCollapsed||vt()||((X=g.current)==null||X.selectNote(0),(V=g.current)==null||V.focus())};return document.addEventListener("pointerup",M),document.addEventListener("selectionchange",M),()=>{document.removeEventListener("pointerup",M),document.removeEventListener("selectionchange",M)}},[vt]);const Pt=u["%footnoteEditor_copyButton_tooltip%"];return e.jsxs(e.Fragment,{children:[e.jsxs("div",{ref:x,className:"footnote-editor tw:grid tw:max-w-full tw:gap-[12px]",children:[e.jsxs("div",{className:"tw:flex tw:flex-wrap tw:gap-y-2",children:[e.jsxs("div",{className:"tw:flex tw:gap-4",children:[e.jsx(rc,{isTypeSwitchable:S,noteType:O,handleNoteTypeChange:se,localizedStrings:u}),e.jsx(Qs,{callerType:y,customCaller:N,updateCaller:oe,localizedStrings:u})]}),e.jsx("div",{className:"tw:flex tw:flex-1 tw:justify-end",children:e.jsxs(o.ButtonGroup,{children:[e.jsx(Ko,{onUndoClick:()=>{var M;return(M=g.current)==null?void 0:M.undo()},onRedoClick:()=>{var M;return(M=g.current)==null?void 0:M.redo()},canUndo:!Y,canRedo:L,localizedStrings:u}),e.jsx(wa,{onCancelClick:n,onAcceptClick:Wt,canAccept:!Y||E!==y||y==="custom"&&N!==A,localizedStrings:u,acceptLabel:u["%footnoteEditor_saveButton_tooltip%"]})]})})]}),e.jsxs("div",{ref:m,className:"tw:relative tw:rounded-[6px] tw:border-2 tw:border-ring",children:[e.jsx("div",{className:t,children:e.jsx(Ho,{editorRef:g,canUndo:!Y,canRedo:L,children:e.jsx(Ft.Editorial,{options:wt,onStateChange:Et,onUsjChange:kt,defaultUsj:cc,onScrRefChange:()=>{},scrRef:i,ref:g})})}),e.jsx("div",{className:"tw:absolute tw:bottom-0 tw:right-0",children:e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(o.Button,{"aria-label":Pt,onClick:Lt,className:"tw:h-6 tw:w-6",variant:"ghost",size:"icon",children:e.jsx($.Copy,{})})}),e.jsx(o.TooltipContent,{children:e.jsx("p",{children:Pt})})]})})})]})]}),e.jsxs(o.Popover,{open:K,children:[e.jsx(o.PopoverAnchor,{virtualRef:F.virtualRef}),e.jsx(o.PopoverContent,{className:"tw:w-[500px] tw:p-0",onClick:M=>{M.preventDefault(),M.stopPropagation()},children:e.jsx(Wo,{markerMenuItems:mt,localizedStrings:u,searchRef:it})})]})]})}const dc=Object.freeze([...Xo,...Object.entries(B.usfmMarkers).map(([,t])=>t.description).filter(t=>!!t),"%footnoteEditor_callerDropdown_item_custom%","%footnoteEditor_callerDropdown_item_generated%","%footnoteEditor_callerDropdown_item_hidden%","%footnoteEditor_callerDropdown_label%","%footnoteEditor_callerDropdown_tooltip%","%footnoteEditor_copyButton_tooltip%","%footnoteEditor_noteType_crossReference_label%","%footnoteEditor_noteType_endNote_label%","%footnoteEditor_noteType_footnote_label%","%footnoteEditor_noteType_tooltip%","%footnoteEditor_noteTypeDropdown_label%","%footnoteEditor_saveButton_tooltip%",...Go,...da]);function wc(t,r,a=!0,n=void 0){if(!r||r.length===0)return;const i=[],l=[];let c=[];return r.forEach(d=>{typeof d!="string"&&d.marker==="fp"?(c.length>0&&l.push(c),c=[d]):c.push(d)}),c.length>0&&l.push(c),l.map((d,u)=>{const w=u===l.length-1;return e.jsxs("p",{children:[pa(t,d,a,!0,i),w&&n]},`para-${u}`)})}function pa(t,r,a=!0,n=!0,i=[]){if(!(!r||r.length===0))return r.map((l,c)=>{const d=`part-${c}`;if(typeof l=="string"){if(n){const u=o.cn(`usfm_${t}`);return e.jsx("span",{className:u,children:l},d)}return e.jsxs("span",{className:"tw:inline-flex tw:items-center tw:gap-1 tw:underline tw:decoration-destructive",children:[e.jsx($.AlertCircle,{className:"tw:h-4 tw:w-4 tw:fill-destructive"}),e.jsx("span",{children:l}),e.jsx($.AlertCircle,{className:"tw:h-4 tw:w-4 tw:fill-destructive"})]},d)}return uc(l,d,a,[...i,t??"unknown"])})}function uc(t,r,a,n=[]){const{marker:i}=t;return e.jsxs("span",{children:[i?a&&e.jsx("span",{className:"marker",children:`\\${i} `}):e.jsx($.AlertCircle,{className:"tw:text-error tw:mr-1 tw:inline-block tw:h-4 tw:w-4","aria-label":"Missing marker"}),pa(i,t.content,a,!0,[...n,i??"unknown"])]},r)}function Qo({footnote:t,layout:r="horizontal",formatCaller:a,showMarkers:n=!0}){const i=a?a(t.caller):t.caller,l=i!==t.caller;let c,d=t.content;Array.isArray(t.content)&&t.content.length>0&&typeof t.content[0]!="string"&&(t.content[0].marker==="fr"||t.content[0].marker==="xo")&&([c,...d]=t.content);const u=n?e.jsx("span",{className:"marker",children:`\\${t.marker}`}):void 0,w=n?e.jsx("span",{className:"marker",children:` \\${t.marker}*`}):void 0,p=i&&e.jsx("span",{className:o.cn("note-caller tw:inline-block",{formatted:l}),children:i}),h=t.category&&e.jsxs("span",{className:"note-category tw:inline-block",children:[n&&e.jsx("span",{className:"marker",children:"\\cat "}),t.category,n&&e.jsx("span",{className:"marker",children:"\\cat*"})]}),g=c&&e.jsxs(e.Fragment,{children:[pa(t.marker,[c],n,!1)," "]}),m=!!u,x=!!p,y=!!h,f=r==="horizontal"?"horizontal":"vertical",E=n?"marker-visible":"",k=r==="horizontal"?"tw:col-span-1":"tw:col-span-2 tw:col-start-1 tw:row-start-2",N=o.cn(f,E);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:o.cn("textual-note-header tw:col-span-1 tw:w-fit tw:text-nowrap",N),children:[u,m&&(x||y)&&" ",p,x&&y&&" ",h]}),e.jsx("div",{className:o.cn("textual-note-header tw:col-span-1 tw:w-fit tw:text-nowrap",N),children:g}),e.jsx("div",{className:o.cn("textual-note-body tw:flex tw:flex-col tw:gap-1",k,N),children:d&&d.length>0&&e.jsx(e.Fragment,{children:wc(t.marker,d,n,w)})})]})}function pc({className:t,classNameForItems:r,footnotes:a,layout:n="horizontal",listId:i,selectedFootnote:l,selectionRequest:c,showMarkers:d=!0,suppressFormatting:u=!1,formatCaller:w,onFootnoteSelected:p}){const h=w??B.getFormatCallerFunction(a,void 0),g=(C,A)=>{p==null||p(C,A,i)},m=l?a.findIndex(C=>C===l):-1,[x,y]=s.useState(m),f=(C,A,R)=>{if(a.length)switch(C.key){case"Enter":case" ":C.preventDefault(),p==null||p(A,R,i);break}},E=C=>{if(a.length)switch(C.key){case"ArrowDown":C.preventDefault(),y(A=>Math.min(A+1,a.length-1));break;case"ArrowUp":C.preventDefault(),y(A=>Math.max(A-1,0));break}},k=s.useRef([]);s.useEffect(()=>{var C;x>=0&&xC===l):-1;return s.useEffect(()=>{var C;N<0||N>=k.current.length||(C=k.current[N])==null||C.scrollIntoView({block:"nearest"})},[N,c]),e.jsx("div",{role:"listbox","aria-label":"Footnotes",tabIndex:x<0?0:-1,className:o.cn("tw:h-full tw:overflow-y-auto",t),onKeyDown:E,children:e.jsx("ul",{className:o.cn("tw:p-0.5 tw:pt-1","tw:grid",n==="horizontal"?"tw:grid-cols-[min-content_min-content_1fr]":"tw:grid-cols-[min-content_1fr]",!u&&"formatted-font"),children:a.map((C,A)=>{const R=C===l,O=`${i}-${A}`;return e.jsxs(s.Fragment,{children:[e.jsx("li",{ref:I=>{k.current[A]=I},role:"option","aria-selected":R,"data-marker":C.marker,"data-state":R?"selected":void 0,tabIndex:A===x?0:-1,className:o.cn("tw:gap-x-3 tw:gap-y-1 tw:p-2 tw:data-[state=selected]:bg-muted",p&&"tw:hover:bg-muted/50","tw:w-full tw:rounded-sm tw:border-0 tw:bg-transparent tw:shadow-none","tw:focus:outline-hidden tw:focus-visible:outline-hidden","tw:focus-visible:ring-offset-0.5 tw:focus-visible:relative tw:focus-visible:z-10 tw:focus-visible:ring-2 tw:focus-visible:ring-ring","tw:grid tw:grid-flow-col tw:grid-cols-subgrid",n==="horizontal"?"tw:col-span-3":"tw:col-span-2 tw:row-span-2",r),onClick:()=>g(C,A),onKeyDown:I=>f(I,C,A),children:e.jsx(Qo,{footnote:C,layout:n,formatCaller:()=>h(C.caller,A),showMarkers:d})}),Aa&&r.push(t.substring(a,i.index)),r.push(e.jsx("strong",{children:i[1]},i.index)),a=n.lastIndex;return a0?r:[t]}function gc({occurrenceData:t,setScriptureReference:r,localizedStrings:a,classNameForText:n}){const i=a["%webView_inventory_occurrences_table_header_reference%"],l=a["%webView_inventory_occurrences_table_header_occurrence%"],c=s.useMemo(()=>{const d=[],u=new Set;return t.forEach(w=>{const p=`${w.reference.book}:${w.reference.chapterNum}:${w.reference.verseNum}:${w.text}`;u.has(p)||(u.add(p),d.push(w))}),d},[t]);return e.jsxs(o.Table,{stickyHeader:!0,children:[e.jsx(o.TableHeader,{stickyHeader:!0,children:e.jsxs(o.TableRow,{children:[e.jsx(o.TableHead,{children:i}),e.jsx(o.TableHead,{children:l})]})}),e.jsx(o.TableBody,{children:c.length>0&&c.map(d=>e.jsxs(o.TableRow,{onClick:()=>{r(d.reference)},children:[e.jsx(o.TableCell,{children:B.formatScrRef(d.reference,"English")}),e.jsx(o.TableCell,{className:n,children:hc(d.text)})]},`${d.reference.book} ${d.reference.chapterNum}:${d.reference.verseNum}-${d.text}`))})]})}function ha({className:t,...r}){return e.jsx(G.Checkbox.Root,{"data-slot":"checkbox",className:o.cn("pr-twp tw:peer tw:relative tw:flex tw:size-4 tw:shrink-0 tw:items-center tw:justify-center tw:rounded-[4px] tw:border tw:border-input tw:transition-colors tw:outline-none tw:group-has-disabled/field:opacity-50 tw:after:absolute tw:after:-inset-x-3 tw:after:-inset-y-2 tw:focus-visible:border-ring tw:focus-visible:ring-3 tw:focus-visible:ring-ring/50 tw:disabled:cursor-not-allowed tw:disabled:opacity-50 tw:aria-invalid:border-destructive tw:aria-invalid:ring-3 tw:aria-invalid:ring-destructive/20 tw:aria-invalid:aria-checked:border-primary tw:dark:bg-input/30 tw:dark:aria-invalid:border-destructive/50 tw:dark:aria-invalid:ring-destructive/40 tw:data-checked:border-primary tw:data-checked:bg-primary tw:data-checked:text-primary-foreground tw:dark:data-checked:bg-primary",t),...r,children:e.jsx(G.Checkbox.Indicator,{"data-slot":"checkbox-indicator",className:"tw:grid tw:place-content-center tw:text-current tw:transition-none tw:[&>svg]:size-3.5",children:e.jsx(Rt.IconCheck,{})})})}const fc=t=>{if(t==="asc")return e.jsx($.ArrowUpIcon,{className:"tw:h-4 tw:w-4"});if(t==="desc")return e.jsx($.ArrowDownIcon,{className:"tw:h-4 tw:w-4"})},Qe=(t,r,a)=>e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsxs(o.TooltipTrigger,{className:o.cn("tw:flex tw:w-full tw:justify-start",a),variant:"ghost",onClick:()=>t.toggleSorting(void 0),children:[e.jsx("span",{className:"tw:w-6 tw:max-w-fit tw:flex-1 tw:overflow-hidden tw:text-ellipsis",children:r}),fc(t.getIsSorted())]}),e.jsx(o.TooltipContent,{side:"bottom",children:r})]})}),mc=t=>({accessorKey:"item",accessorFn:r=>r.items[0],header:({column:r})=>Qe(r,t)}),vc=(t,r)=>({accessorKey:`item${r}`,accessorFn:a=>a.items[r],header:({column:a})=>Qe(a,t)}),bc=t=>({accessorKey:"count",header:({column:r})=>Qe(r,t,"tw:justify-end"),cell:({row:r})=>e.jsx("div",{className:"tw:flex tw:justify-end tw:tabular-nums",children:r.getValue("count")})}),$r=(t,r,a,n,i,l)=>{let c=[...a];t.forEach(u=>{r==="approved"?c.includes(u)||c.push(u):c=c.filter(w=>w!==u)}),n(c);let d=[...i];t.forEach(u=>{r==="unapproved"?d.includes(u)||d.push(u):d=d.filter(w=>w!==u)}),l(d)},xc=(t,r,a,n,i)=>({accessorKey:"status",header:({column:l})=>Qe(l,t,"tw:justify-center"),cell:({row:l})=>{const c=l.getValue("status"),d=l.getValue("item");return e.jsx("div",{className:"tw:flex tw:justify-center",children:e.jsxs(o.ToggleGroup,{value:c,variant:"outline",type:"single",className:"tw:gap-0",children:[e.jsx(o.ToggleGroupItem,{onClick:u=>{u.stopPropagation(),$r([d],"approved",r,a,n,i)},value:"approved",className:"tw:rounded-e-none tw:border-e-0",children:e.jsx($.CircleCheckIcon,{})}),e.jsx(o.ToggleGroupItem,{onClick:u=>{u.stopPropagation(),$r([d],"unapproved",r,a,n,i)},value:"unapproved",className:"tw:rounded-none",children:e.jsx($.CircleXIcon,{})}),e.jsx(o.ToggleGroupItem,{onClick:u=>{u.stopPropagation(),$r([d],"unknown",r,a,n,i)},value:"unknown",className:"tw:rounded-s-none tw:border-s-0",children:e.jsx($.CircleHelpIcon,{})})]})})}}),yc=t=>t.split(/(?:\r?\n|\r)|(?=(?:\\(?:v|c|id)))/g),kc=t=>{const r=/^\\[vc]\s+(\d+)/,a=t.match(r);if(a)return+a[1]},_c=t=>{const r=t.match(/^\\id\s+([A-Za-z]+)/);return r?r[1]:""},tn=(t,r,a)=>a.includes(t)?"unapproved":r.includes(t)?"approved":"unknown",jc=Object.freeze(["%webView_inventory_all%","%webView_inventory_approved%","%webView_inventory_unapproved%","%webView_inventory_unknown%","%webView_inventory_scope_currentBook%","%webView_inventory_scope_chapter%","%webView_inventory_scope_verse%","%webView_inventory_filter_text%","%webView_inventory_show_additional_items%","%webView_inventory_occurrences_table_header_reference%","%webView_inventory_occurrences_table_header_occurrence%","%webView_inventory_no_results%"]),Cc=(t,r,a)=>{let n=t;return r!=="all"&&(n=n.filter(i=>r==="approved"&&i.status==="approved"||r==="unapproved"&&i.status==="unapproved"||r==="unknown"&&i.status==="unknown")),a!==""&&(n=n.filter(i=>i.items[0].includes(a))),n},Nc=(t,r,a)=>t.map(n=>{const i=B.isString(n.key)?n.key:n.key[0];return{items:B.isString(n.key)?[n.key]:n.key,count:n.count,status:n.status||tn(i,r,a),occurrences:n.occurrences||[]}}),we=(t,r)=>t[r]??r;function Ec({inventoryItems:t,setVerseRef:r,localizedStrings:a,additionalItemsLabels:n,approvedItems:i,unapprovedItems:l,scope:c,onScopeChange:d,columns:u,id:w,areInventoryItemsLoading:p=!1,classNameForVerseText:h,onItemSelected:g}){const m=we(a,"%webView_inventory_all%"),x=we(a,"%webView_inventory_approved%"),y=we(a,"%webView_inventory_unapproved%"),f=we(a,"%webView_inventory_unknown%"),E=we(a,"%webView_inventory_scope_currentBook%"),k=we(a,"%webView_inventory_scope_chapter%"),N=we(a,"%webView_inventory_scope_verse%"),C=we(a,"%webView_inventory_filter_text%"),A=we(a,"%webView_inventory_show_additional_items%"),R=we(a,"%webView_inventory_no_results%"),[O,I]=s.useState(!1),[S,D]=s.useState("all"),[Y,Z]=s.useState(""),[L,j]=s.useState([]),et=s.useMemo(()=>{const J=t??[];return J.length===0?[]:Nc(J,i,l)},[t,i,l]),P=s.useMemo(()=>{if(O)return et;const J=[];return et.forEach(dt=>{const gt=dt.items[0],wt=J.find(mt=>mt.items[0]===gt);wt?(wt.count+=dt.count,wt.occurrences=wt.occurrences.concat(dt.occurrences)):J.push({items:[gt],count:dt.count,occurrences:dt.occurrences,status:dt.status})}),J},[O,et]),K=s.useMemo(()=>P.length===0?[]:Cc(P,S,Y),[P,S,Y]),W=s.useMemo(()=>{var gt,wt;if(!O)return u;const J=(gt=n==null?void 0:n.tableHeaders)==null?void 0:gt.length;if(!J)return u;const dt=[];for(let mt=0;mt{K.length===0?j([]):K.length===1&&j(K[0].items)},[K]);const F=(J,dt)=>{dt.setRowSelection(()=>{const wt={};return wt[J.index]=!0,wt});const gt=J.original.items;j(gt),g&>.length>0&&g(gt[0])},tt=J=>{if(J==="book"||J==="chapter"||J==="verse")d(J);else throw new Error(`Invalid scope value: ${J}`)},lt=J=>{if(J==="all"||J==="approved"||J==="unapproved"||J==="unknown")D(J);else throw new Error(`Invalid status filter value: ${J}`)},it=s.useMemo(()=>{if(P.length===0||L.length===0)return[];const J=P.filter(dt=>B.deepEqual(O?dt.items:[dt.items[0]],L));if(J.length>1)throw new Error("Selected item is not unique");return J.length===0?[]:J[0].occurrences},[L,O,P]);return e.jsx("div",{id:w,className:"pr-twp tw:h-full tw:overflow-auto",children:e.jsxs("div",{className:"tw:flex tw:h-full tw:w-full tw:min-w-min tw:flex-col",children:[e.jsxs("div",{className:"tw:flex tw:items-stretch",style:{contain:"inline-size"},children:[e.jsxs(Te,{onValueChange:J=>lt(J),defaultValue:S,children:[e.jsx(Re,{className:"tw:m-1 tw:w-auto tw:flex-1",children:e.jsx(Se,{placeholder:"Select filter"})}),e.jsxs(Me,{children:[e.jsx(ae,{value:"all",children:m}),e.jsx(ae,{value:"approved",children:x}),e.jsx(ae,{value:"unapproved",children:y}),e.jsx(ae,{value:"unknown",children:f})]})]}),e.jsxs(Te,{onValueChange:J=>tt(J),defaultValue:c,children:[e.jsx(Re,{className:"tw:m-1 tw:w-auto tw:flex-1",children:e.jsx(Se,{placeholder:"Select scope"})}),e.jsxs(Me,{children:[e.jsx(ae,{value:"book",children:E}),e.jsx(ae,{value:"chapter",children:k}),e.jsx(ae,{value:"verse",children:N})]})]}),e.jsx(o.Input,{className:"tw:m-1 tw:flex-1 tw:rounded-md tw:border",placeholder:C,value:Y,onChange:J=>{Z(J.target.value)}}),n&&e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsxs("div",{className:"tw:m-1 tw:flex tw:w-fit tw:min-w-[26px] tw:items-center tw:rounded-md tw:border",children:[e.jsx(ha,{className:"tw:m-1 tw:shrink-0",checked:O,onCheckedChange:J=>{I(J)}}),e.jsx(o.Label,{className:"tw:m-1 tw:truncate",children:(n==null?void 0:n.checkboxText)??A})]})}),e.jsx(o.TooltipContent,{children:(n==null?void 0:n.checkboxText)??A})]})})]}),e.jsx("div",{className:"tw:m-1 tw:flex-1 tw:overflow-auto tw:rounded-md tw:border",children:e.jsx(Vo,{columns:W,data:K,onRowClickHandler:F,stickyHeader:!0,isLoading:p,noResultsMessage:R})}),it.length>0&&e.jsx("div",{className:"tw:m-1 tw:flex-1 tw:overflow-auto tw:rounded-md tw:border",children:e.jsx(gc,{classNameForText:h,occurrenceData:it,setScriptureReference:r,localizedStrings:a})})]})})}const Tc="16rem",Sc="3rem",en=s.createContext(void 0);function tr(){const t=s.useContext(en);if(!t)throw new Error("useSidebar must be used within a SidebarProvider.");return t}function rn({defaultOpen:t=!0,open:r,onOpenChange:a,className:n,style:i,children:l,side:c="primary",...d}){const[u,w]=s.useState(t),p=r??u,h=s.useCallback(N=>{const C=typeof N=="function"?N(p):N;a?a(C):w(C)},[a,p]),g=s.useCallback(()=>h(N=>!N),[h]),m=p?"expanded":"collapsed",f=o.readDirection()==="ltr"?c:c==="primary"?"secondary":"primary",E=s.useMemo(()=>({state:m,open:p,setOpen:h,toggleSidebar:g,side:f}),[m,p,h,g,f]),k={"--sidebar-width":Tc,"--sidebar-width-icon":Sc,...i};return e.jsx(en.Provider,{value:E,children:e.jsx("div",{"data-slot":"sidebar-wrapper",style:k,className:o.cn("pr-twp tw:group/sidebar-wrapper tw:flex tw:w-full tw:has-data-[variant=inset]:bg-sidebar",n),...d,children:l})})}function an({variant:t="sidebar",collapsible:r="offcanvas",className:a,children:n,...i}){const l=tr();return r==="none"?e.jsx("div",{"data-slot":"sidebar",className:o.cn("tw:flex tw:h-full tw:w-(--sidebar-width) tw:flex-col tw:bg-sidebar tw:text-sidebar-foreground",a),...i,children:n}):e.jsxs("div",{className:"tw:group tw:peer tw:hidden tw:text-sidebar-foreground tw:md:block","data-state":l.state,"data-collapsible":l.state==="collapsed"?r:"","data-variant":t,"data-side":l.side,"data-slot":"sidebar",children:[e.jsx("div",{"data-slot":"sidebar-gap",className:o.cn("tw:relative tw:w-(--sidebar-width) tw:bg-transparent tw:transition-[width] tw:duration-200 tw:ease-linear","tw:group-data-[collapsible=offcanvas]:w-0","tw:group-data-[side=secondary]:rotate-180",t==="floating"||t==="inset"?"tw:group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]":"tw:group-data-[collapsible=icon]:w-(--sidebar-width-icon)")}),e.jsx("div",{"data-slot":"sidebar-container","data-side":l.side,className:o.cn("tw:absolute tw:inset-y-0 tw:z-10 tw:hidden tw:h-svh tw:w-(--sidebar-width) tw:transition-[left,right,width] tw:duration-200 tw:ease-linear tw:md:flex",l.side==="primary"?"tw:left-0 tw:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]":"tw:right-0 tw:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",t==="floating"||t==="inset"?"tw:p-2 tw:group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]":"tw:group-data-[collapsible=icon]:w-(--sidebar-width-icon) tw:group-data-[side=primary]:border-e tw:group-data-[side=secondary]:border-s",a),...i,children:e.jsx("div",{"data-sidebar":"sidebar","data-slot":"sidebar-inner",className:"tw:flex tw:size-full tw:flex-col tw:bg-sidebar tw:group-data-[variant=floating]:rounded-lg tw:group-data-[variant=floating]:shadow-sm tw:group-data-[variant=floating]:ring-1 tw:group-data-[variant=floating]:ring-sidebar-border",children:n})})]})}function Rc({className:t,onClick:r,...a}){const{toggleSidebar:n,side:i}=tr();return e.jsxs(o.Button,{"data-sidebar":"trigger","data-slot":"sidebar-trigger",variant:"ghost",size:"icon-sm",className:o.cn(t),onClick:l=>{r==null||r(l),n()},...a,children:[i==="primary"?e.jsx(Rt.IconLayoutSidebar,{}):e.jsx(Rt.IconLayoutSidebarRight,{}),e.jsx("span",{className:"tw:sr-only",children:"Toggle Sidebar"})]})}function Mc({className:t,...r}){const{toggleSidebar:a}=tr();return e.jsx("button",{type:"button","data-sidebar":"rail","data-slot":"sidebar-rail","aria-label":"Toggle Sidebar",tabIndex:-1,onClick:a,title:"Toggle Sidebar",className:o.cn("tw:absolute tw:inset-y-0 tw:z-20 tw:hidden tw:w-4 tw:transition-all tw:ease-linear tw:group-data-[side=primary]:-right-4 tw:group-data-[side=secondary]:left-0 tw:after:absolute tw:after:inset-y-0 tw:after:start-1/2 tw:after:w-[2px] tw:hover:after:bg-sidebar-border tw:sm:flex tw:ltr:-translate-x-1/2 tw:rtl:translate-x-1/2","tw:in-data-[side=primary]:cursor-w-resize tw:rtl:in-data-[side=primary]:cursor-e-resize tw:in-data-[side=secondary]:cursor-e-resize tw:rtl:in-data-[side=secondary]:cursor-w-resize","tw:[[data-side=primary][data-state=collapsed]_&]:cursor-e-resize tw:rtl:[[data-side=primary][data-state=collapsed]_&]:cursor-w-resize tw:[[data-side=secondary][data-state=collapsed]_&]:cursor-w-resize tw:rtl:[[data-side=secondary][data-state=collapsed]_&]:cursor-e-resize","tw:group-data-[collapsible=offcanvas]:translate-x-0 tw:group-data-[collapsible=offcanvas]:after:start-full tw:hover:group-data-[collapsible=offcanvas]:bg-sidebar","tw:[[data-side=primary][data-collapsible=offcanvas]_&]:-end-2","tw:[[data-side=secondary][data-collapsible=offcanvas]_&]:-start-2",t),...r})}function on({className:t,...r}){return e.jsx("main",{"data-slot":"sidebar-inset",className:o.cn("tw:relative tw:flex tw:w-full tw:flex-1 tw:flex-col tw:bg-background tw:md:peer-data-[variant=inset]:m-2 tw:md:peer-data-[variant=inset]:ms-0 tw:md:peer-data-[variant=inset]:rounded-xl tw:md:peer-data-[variant=inset]:shadow-sm tw:md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ms-2",t),...r})}function Dc({className:t,...r}){return e.jsx(o.Input,{"data-slot":"sidebar-input","data-sidebar":"input",className:o.cn("tw:h-8 tw:w-full tw:bg-background tw:shadow-none",t),...r})}function Ic({className:t,...r}){return e.jsx("div",{"data-slot":"sidebar-header","data-sidebar":"header",className:o.cn("tw:flex tw:flex-col tw:gap-2 tw:p-2",t),...r})}function Oc({className:t,...r}){return e.jsx("div",{"data-slot":"sidebar-footer","data-sidebar":"footer",className:o.cn("tw:flex tw:flex-col tw:gap-2 tw:p-2",t),...r})}function Pc({className:t,...r}){return e.jsx(o.Separator,{"data-slot":"sidebar-separator","data-sidebar":"separator",className:o.cn("tw:mx-2 tw:w-auto tw:bg-sidebar-border",t),...r})}function nn({className:t,...r}){return e.jsx("div",{"data-slot":"sidebar-content","data-sidebar":"content",className:o.cn("tw:no-scrollbar tw:flex tw:min-h-0 tw:flex-1 tw:flex-col tw:gap-0 tw:overflow-auto tw:group-data-[collapsible=icon]:overflow-hidden",t),...r})}function Jr({className:t,...r}){return e.jsx("div",{"data-slot":"sidebar-group","data-sidebar":"group",className:o.cn("tw:relative tw:flex tw:w-full tw:min-w-0 tw:flex-col tw:p-2",t),...r})}function Qr({className:t,asChild:r=!1,...a}){const n=r?G.Slot.Root:"div";return e.jsx(n,{"data-slot":"sidebar-group-label","data-sidebar":"group-label",className:o.cn("tw:flex tw:h-8 tw:shrink-0 tw:items-center tw:rounded-md tw:px-2 tw:text-xs tw:font-medium tw:text-sidebar-foreground/70 tw:ring-sidebar-ring tw:outline-hidden tw:transition-[margin,opacity] tw:duration-200 tw:ease-linear tw:group-data-[collapsible=icon]:-mt-8 tw:group-data-[collapsible=icon]:opacity-0 tw:focus-visible:ring-2 tw:[&>svg]:size-4 tw:[&>svg]:shrink-0",t),...a})}function Ac({className:t,asChild:r=!1,...a}){const n=r?G.Slot.Root:"button";return e.jsx(n,{"data-slot":"sidebar-group-action","data-sidebar":"group-action",className:o.cn("tw:absolute tw:top-3.5 tw:end-3 tw:flex tw:aspect-square tw:w-5 tw:items-center tw:justify-center tw:rounded-md tw:p-0 tw:text-sidebar-foreground tw:ring-sidebar-ring tw:outline-hidden tw:transition-transform tw:group-data-[collapsible=icon]:hidden tw:after:absolute tw:after:-inset-2 tw:hover:bg-sidebar-accent tw:hover:text-sidebar-accent-foreground tw:focus-visible:ring-2 tw:md:after:hidden tw:[&>svg]:size-4 tw:[&>svg]:shrink-0",t),...a})}function ta({className:t,...r}){return e.jsx("div",{"data-slot":"sidebar-group-content","data-sidebar":"group-content",className:o.cn("tw:w-full tw:text-sm",t),...r})}function sn({className:t,...r}){return e.jsx("ul",{"data-slot":"sidebar-menu","data-sidebar":"menu",className:o.cn("tw:flex tw:w-full tw:min-w-0 tw:flex-col tw:gap-0",t),...r})}function cn({className:t,...r}){return e.jsx("li",{"data-slot":"sidebar-menu-item","data-sidebar":"menu-item",className:o.cn("tw:group/menu-item tw:relative",t),...r})}const Lc=Ya.cva("tw:peer/menu-button tw:group/menu-button tw:flex tw:w-full tw:items-center tw:gap-2 tw:overflow-hidden tw:rounded-md tw:p-2 tw:text-start tw:text-sm tw:ring-sidebar-ring tw:outline-hidden tw:transition-[width,height,padding] tw:group-has-data-[sidebar=menu-action]/menu-item:pe-8 tw:group-data-[collapsible=icon]:size-8! tw:group-data-[collapsible=icon]:p-2! tw:hover:bg-sidebar-accent tw:hover:text-sidebar-accent-foreground tw:focus-visible:ring-2 tw:active:bg-sidebar-accent tw:active:text-sidebar-accent-foreground tw:disabled:pointer-events-none tw:disabled:opacity-50 tw:aria-disabled:pointer-events-none tw:aria-disabled:opacity-50 tw:data-open:hover:bg-sidebar-accent tw:data-open:hover:text-sidebar-accent-foreground tw:data-active:bg-sidebar-accent tw:data-active:font-medium tw:data-active:text-sidebar-accent-foreground tw:[&_svg]:size-4 tw:[&_svg]:shrink-0 tw:[&>span:last-child]:truncate",{variants:{variant:{default:"tw:hover:bg-sidebar-accent tw:hover:text-sidebar-accent-foreground",outline:"tw:bg-background tw:shadow-[0_0_0_1px_var(--sidebar-border)] tw:hover:bg-sidebar-accent tw:hover:text-sidebar-accent-foreground tw:hover:shadow-[0_0_0_1px_var(--sidebar-accent)]"},size:{default:"tw:h-8 tw:text-sm",sm:"tw:h-7 tw:text-xs",lg:"tw:h-12 tw:text-sm tw:group-data-[collapsible=icon]:p-0!"}},defaultVariants:{variant:"default",size:"default"}});function ln({asChild:t=!1,isActive:r=!1,variant:a="default",size:n="default",tooltip:i,className:l,...c}){const d=t?G.Slot.Root:"button",{state:u}=tr(),w=e.jsx(d,{"data-slot":"sidebar-menu-button","data-sidebar":"menu-button","data-size":n,"data-active":r,className:o.cn(Lc({variant:a,size:n}),l),...c});if(!i)return w;const p=typeof i=="string"?{children:i}:i;return e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:w}),e.jsx(o.TooltipContent,{side:"right",align:"center",hidden:u!=="collapsed",...p})]})}function Bc({className:t,asChild:r=!1,showOnHover:a=!1,...n}){const i=r?G.Slot.Root:"button";return e.jsx(i,{"data-slot":"sidebar-menu-action","data-sidebar":"menu-action",className:o.cn("tw:absolute tw:top-1.5 tw:end-1 tw:flex tw:aspect-square tw:w-5 tw:items-center tw:justify-center tw:rounded-md tw:p-0 tw:text-sidebar-foreground tw:ring-sidebar-ring tw:outline-hidden tw:transition-transform tw:group-data-[collapsible=icon]:hidden tw:peer-hover/menu-button:text-sidebar-accent-foreground tw:peer-data-[size=default]/menu-button:top-1.5 tw:peer-data-[size=lg]/menu-button:top-2.5 tw:peer-data-[size=sm]/menu-button:top-1 tw:after:absolute tw:after:-inset-2 tw:hover:bg-sidebar-accent tw:hover:text-sidebar-accent-foreground tw:focus-visible:ring-2 tw:md:after:hidden tw:[&>svg]:size-4 tw:[&>svg]:shrink-0",a&&"tw:group-focus-within/menu-item:opacity-100 tw:group-hover/menu-item:opacity-100 tw:peer-data-active/menu-button:text-sidebar-accent-foreground tw:aria-expanded:opacity-100 tw:md:opacity-0",t),...n})}function zc({className:t,...r}){return e.jsx("div",{"data-slot":"sidebar-menu-badge","data-sidebar":"menu-badge",className:o.cn("tw:pointer-events-none tw:absolute tw:end-1 tw:flex tw:h-5 tw:min-w-5 tw:items-center tw:justify-center tw:rounded-md tw:px-1 tw:text-xs tw:font-medium tw:text-sidebar-foreground tw:tabular-nums tw:select-none tw:group-data-[collapsible=icon]:hidden tw:peer-hover/menu-button:text-sidebar-accent-foreground tw:peer-data-[size=default]/menu-button:top-1.5 tw:peer-data-[size=lg]/menu-button:top-2.5 tw:peer-data-[size=sm]/menu-button:top-1 tw:peer-data-active/menu-button:text-sidebar-accent-foreground",t),...r})}function Vc({className:t,showIcon:r=!1,...a}){const[n]=s.useState(()=>`${Math.floor(Math.random()*40)+50}%`),i={"--skeleton-width":n};return e.jsxs("div",{"data-slot":"sidebar-menu-skeleton","data-sidebar":"menu-skeleton",className:o.cn("tw:flex tw:h-8 tw:items-center tw:gap-2 tw:rounded-md tw:px-2",t),...a,children:[r&&e.jsx(o.Skeleton,{className:"tw:size-4 tw:rounded-md","data-sidebar":"menu-skeleton-icon"}),e.jsx(o.Skeleton,{className:"tw:h-4 tw:max-w-(--skeleton-width) tw:flex-1","data-sidebar":"menu-skeleton-text",style:i})]})}function $c({className:t,...r}){return e.jsx("ul",{"data-slot":"sidebar-menu-sub","data-sidebar":"menu-sub",className:o.cn("tw:mx-3.5 tw:flex tw:min-w-0 tw:translate-x-px tw:rtl:-translate-x-px tw:flex-col tw:gap-1 tw:border-s tw:border-sidebar-border tw:px-2.5 tw:py-0.5 tw:group-data-[collapsible=icon]:hidden",t),...r})}function Fc({className:t,...r}){return e.jsx("li",{"data-slot":"sidebar-menu-sub-item","data-sidebar":"menu-sub-item",className:o.cn("tw:group/menu-sub-item tw:relative",t),...r})}function Uc({asChild:t=!1,size:r="md",isActive:a=!1,className:n,...i}){const l=t?G.Slot.Root:"a";return e.jsx(l,{"data-slot":"sidebar-menu-sub-button","data-sidebar":"menu-sub-button","data-size":r,"data-active":a,className:o.cn("tw:flex tw:h-7 tw:min-w-0 tw:-translate-x-px tw:rtl:translate-x-px tw:items-center tw:gap-2 tw:overflow-hidden tw:rounded-md tw:px-2 tw:text-sidebar-foreground tw:ring-sidebar-ring tw:outline-hidden tw:group-data-[collapsible=icon]:hidden tw:hover:bg-sidebar-accent tw:hover:text-sidebar-accent-foreground tw:focus-visible:ring-2 tw:active:bg-sidebar-accent tw:active:text-sidebar-accent-foreground tw:disabled:pointer-events-none tw:disabled:opacity-50 tw:aria-disabled:pointer-events-none tw:aria-disabled:opacity-50 tw:data-[size=md]:text-sm tw:data-[size=sm]:text-xs tw:data-active:bg-sidebar-accent tw:data-active:text-sidebar-accent-foreground tw:[&>span:last-child]:truncate tw:[&>svg]:size-4 tw:[&>svg]:shrink-0 tw:[&>svg]:text-sidebar-accent-foreground",n),...i})}function dn({id:t,extensionLabels:r,projectInfo:a,handleSelectSidebarItem:n,selectedSidebarItem:i,extensionsSidebarGroupLabel:l,projectsSidebarGroupLabel:c,buttonPlaceholderText:d,searchPlaceholderText:u,noResultsText:w,className:p}){const h=s.useCallback((f,E)=>{n(f,E)},[n]),g=s.useCallback(f=>{const E=a.find(k=>k.projectId===f);return E?E.projectName:f},[a]),m=s.useMemo(()=>a.map(f=>({id:f.projectId,shortName:f.projectName,fullName:f.projectName})),[a]),x=s.useMemo(()=>{const f={buttonPlaceholder:d,ariaLabel:c};return u&&(f.searchPlaceholder=u),w&&(f.commandEmptyMessage=w),f},[d,c,u,w]),y=s.useCallback(f=>!i.projectId&&f===i.label,[i]);return e.jsx(an,{id:t,collapsible:"none",variant:"inset",className:o.cn("tw:w-96 tw:gap-2 tw:overflow-y-auto",p),children:e.jsxs(nn,{children:[e.jsxs(Jr,{children:[e.jsx(Qr,{className:"tw:text-sm",children:l}),e.jsx(ta,{children:e.jsx(sn,{children:Object.entries(r).map(([f,E])=>e.jsx(cn,{children:e.jsx(ln,{onClick:()=>h(f),isActive:y(f),children:e.jsx("span",{className:"tw:pl-3",children:E})})},f))})})]}),e.jsxs(Jr,{children:[e.jsx(Qr,{className:"tw:text-sm",children:c}),e.jsx(ta,{className:"tw:pl-3",children:e.jsxs("div",{className:o.cn("tw:flex tw:w-full tw:items-center tw:gap-2 tw:rounded-md tw:px-2 tw:py-1",{"tw:bg-sidebar-accent tw:text-sidebar-accent-foreground":i==null?void 0:i.projectId}),children:[e.jsx($.ScrollText,{className:"tw:h-4 tw:w-4 tw:shrink-0"}),e.jsx(o.ProjectSelector,{mode:"project",projects:m,openTabs:[],selection:{projectId:(i==null?void 0:i.projectId)??""},onChangeSelection:({projectId:f})=>{if(!f)return;const E=g(f);h(E,f)},buttonVariant:"ghost",buttonClassName:"tw:h-8 tw:w-full tw:flex-1 tw:justify-start tw:font-normal",localizedStrings:x})]})})]})]})})}function Gc({id:t,children:r,searchValue:a,onSearch:n,className:i,...l}){return e.jsxs("div",{className:"tw:box-border tw:flex tw:h-full tw:flex-col",children:[e.jsx("div",{className:"tw:box-border tw:flex tw:items-center tw:justify-center tw:py-4",children:e.jsx(o.SearchBar,{className:"tw:w-9/12",value:a,onSearch:n,placeholder:"Search app settings, extension settings, and project settings"})}),e.jsxs(rn,{id:t,className:"tw:h-full tw:flex-1 tw:gap-4 tw:overflow-auto tw:border-t",children:[e.jsx(dn,{className:o.cn("tw:w-1/2 tw:min-w-[140px] tw:max-w-[220px] tw:border-e",i),...l}),e.jsx(on,{className:"tw:min-w-[215px]",children:r})]})]})}const ye="scrBook",Kc="scrRef",Ee="source",Hc="details",qc="Scripture Reference",Yc="Scripture Book",wn="Type",Zc="Details";function Xc(t,r){const a=r??!1;return[{accessorFn:n=>`${n.start.book} ${n.start.chapterNum}:${n.start.verseNum}`,id:ye,header:(t==null?void 0:t.scriptureReferenceColumnName)??qc,cell:n=>{const i=n.row.original;return n.row.getIsGrouped()?Ot.Canon.bookIdToEnglishName(i.start.book):n.row.groupingColumnId===ye?B.formatScrRef(i.start):void 0},getGroupingValue:n=>Ot.Canon.bookIdToNumber(n.start.book),sortingFn:(n,i)=>B.compareScrRefs(n.original.start,i.original.start),enableGrouping:!0},{accessorFn:n=>B.formatScrRef(n.start),id:Kc,header:void 0,cell:n=>{const i=n.row.original;return n.row.getIsGrouped()?void 0:B.formatScrRef(i.start)},sortingFn:(n,i)=>B.compareScrRefs(n.original.start,i.original.start),enableGrouping:!1},{accessorFn:n=>n.source.displayName,id:Ee,header:a?(t==null?void 0:t.typeColumnName)??wn:void 0,cell:n=>a||n.row.getIsGrouped()?n.getValue():void 0,getGroupingValue:n=>n.source.id,sortingFn:(n,i)=>n.original.source.displayName.localeCompare(i.original.source.displayName),enableGrouping:!0},{accessorFn:n=>n.detail,id:Hc,header:(t==null?void 0:t.detailsColumnName)??Zc,cell:n=>n.getValue(),enableGrouping:!1}]}const Wc=t=>{if(!("offset"in t.start))throw new Error("No offset available in range start");if(t.end&&!("offset"in t.end))throw new Error("No offset available in range end");const{offset:r}=t.start;let a=0;return t.end&&({offset:a}=t.end),!t.end||B.compareScrRefs(t.start,t.end)===0?`${B.scrRefToBBBCCCVVV(t.start)}+${r}`:`${B.scrRefToBBBCCCVVV(t.start)}+${r}-${B.scrRefToBBBCCCVVV(t.end)}+${a}`},Ga=t=>`${Wc({start:t.start,end:t.end})} ${t.source.displayName} ${t.detail}`;function Jc({sources:t,showColumnHeaders:r=!1,showSourceColumn:a=!1,scriptureReferenceColumnName:n,scriptureBookGroupName:i,typeColumnName:l,detailsColumnName:c,onRowSelected:d,id:u}){const[w,p]=s.useState([]),[h,g]=s.useState([{id:ye,desc:!1}]),[m,x]=s.useState({}),y=s.useMemo(()=>t.flatMap(S=>S.data.map(D=>({...D,source:S.source}))),[t]),f=s.useMemo(()=>Xc({scriptureReferenceColumnName:n,typeColumnName:l,detailsColumnName:c},a),[n,l,c,a]);s.useEffect(()=>{w.includes(Ee)?g([{id:Ee,desc:!1},{id:ye,desc:!1}]):g([{id:ye,desc:!1}])},[w]);const E=Gt.useReactTable({data:y,columns:f,state:{grouping:w,sorting:h,rowSelection:m},onGroupingChange:p,onSortingChange:g,onRowSelectionChange:x,getExpandedRowModel:Gt.getExpandedRowModel(),getGroupedRowModel:Gt.getGroupedRowModel(),getCoreRowModel:Gt.getCoreRowModel(),getSortedRowModel:Gt.getSortedRowModel(),getRowId:Ga,autoResetExpanded:!1,enableMultiRowSelection:!1,enableSubRowSelection:!1});s.useEffect(()=>{if(d){const S=E.getSelectedRowModel().rowsById,D=Object.keys(S);if(D.length===1){const Y=y.find(Z=>Ga(Z)===D[0])||void 0;Y&&d(Y)}}},[m,y,d,E]);const k=i??Yc,N=l??wn,C=[{label:"No Grouping",value:[]},{label:`Group by ${k}`,value:[ye]},{label:`Group by ${N}`,value:[Ee]},{label:`Group by ${k} and ${N}`,value:[ye,Ee]},{label:`Group by ${N} and ${k}`,value:[Ee,ye]}],A=S=>{p(JSON.parse(S))},R=(S,D)=>{!S.getIsGrouped()&&!S.getIsSelected()&&S.getToggleSelectedHandler()(D)},O=(S,D)=>S.getIsGrouped()?"":o.cn("banded-row",D%2===0?"even":"odd"),I=(S,D,Y)=>{if(!((S==null?void 0:S.length)===0||D.depth{A(S)},children:[e.jsx(Re,{className:"tw:mb-1 tw:mt-2",children:e.jsx(Se,{})}),e.jsx(Me,{position:"item-aligned",children:e.jsx(Lo,{children:C.map(S=>e.jsx(ae,{value:JSON.stringify(S.value),children:S.label},S.label))})})]}),e.jsxs(o.Table,{className:"tw:relative tw:flex tw:flex-col tw:overflow-y-auto tw:p-0",children:[r&&e.jsx(o.TableHeader,{children:E.getHeaderGroups().map(S=>e.jsx(o.TableRow,{children:S.headers.filter(D=>D.column.columnDef.header).map(D=>e.jsx(o.TableHead,{colSpan:D.colSpan,className:"tw:sticky top-0",children:D.isPlaceholder?void 0:e.jsxs("div",{children:[D.column.getCanGroup()?e.jsx(o.Button,{variant:"ghost",title:`Toggle grouping by ${D.column.columnDef.header}`,onClick:D.column.getToggleGroupingHandler(),type:"button",children:D.column.getIsGrouped()?"🛑":"👊 "}):void 0," ",Gt.flexRender(D.column.columnDef.header,D.getContext())]})},D.id))},S.id))}),e.jsx(o.TableBody,{children:E.getRowModel().rows.map((S,D)=>{const Y=o.readDirection();return e.jsx(o.TableRow,{"data-state":S.getIsSelected()?"selected":"",className:o.cn(O(S,D)),onClick:Z=>R(S,Z),children:S.getVisibleCells().map(Z=>{if(!(Z.getIsPlaceholder()||Z.column.columnDef.enableGrouping&&!Z.getIsGrouped()&&(Z.column.columnDef.id!==Ee||!a)))return e.jsx(o.TableCell,{className:o.cn(Z.column.columnDef.id,"tw:p-[1px]",I(w,S,Z)),children:Z.getIsGrouped()?e.jsxs(o.Button,{variant:"link",onClick:S.getToggleExpandedHandler(),type:"button",children:[S.getIsExpanded()&&e.jsx($.ChevronDown,{}),!S.getIsExpanded()&&(Y==="ltr"?e.jsx($.ChevronRight,{}):e.jsx($.ChevronLeft,{}))," ",Gt.flexRender(Z.column.columnDef.cell,Z.getContext())," (",S.subRows.length,")"]}):Gt.flexRender(Z.column.columnDef.cell,Z.getContext())},Z.id)})},S.id)})})]})]})}function un({availableBookInfo:t,selectedBookIds:r,onChangeSelectedBookIds:a,localizedStrings:n,localizedBookNames:i,disabledSectionExplanations:l}){const c=n["%webView_book_selector_books_selected%"],d=n["%webView_book_selector_select_books%"],u=n["%webView_book_selector_search_books%"],w=n["%webView_book_selector_select_all%"],p=n["%webView_book_selector_clear_all%"],h=n["%webView_book_selector_no_book_found%"],{otLong:g,ntLong:m,dcLong:x,extraLong:y}={otLong:n==null?void 0:n["%scripture_section_ot_long%"],ntLong:n==null?void 0:n["%scripture_section_nt_long%"],dcLong:n==null?void 0:n["%scripture_section_dc_long%"],extraLong:n==null?void 0:n["%scripture_section_extra_long%"]},[f,E]=s.useState(!1),[k,N]=s.useState(""),C=s.useRef(void 0),A=s.useRef(!1),R=s.useMemo(()=>o.getAvailableBookIds(t),[t]),O=s.useMemo(()=>{if(!k.trim()){const P={[B.Section.OT]:[],[B.Section.NT]:[],[B.Section.DC]:[],[B.Section.Extra]:[]};return R.forEach(K=>{const W=B.getSectionForBook(K);P[W].push(K)}),P}const j=R.filter(P=>o.doesBookMatchQuery(P,k,i)),et={[B.Section.OT]:[],[B.Section.NT]:[],[B.Section.DC]:[],[B.Section.Extra]:[]};return j.forEach(P=>{const K=B.getSectionForBook(P);et[K].push(P)}),et},[R,k,i]),I=s.useCallback((j,et=!1)=>{if(!et||!C.current){a(r.includes(j)?r.filter(lt=>lt!==j):[...r,j]),C.current=j;return}const P=R.findIndex(lt=>lt===C.current),K=R.findIndex(lt=>lt===j);if(P===-1||K===-1)return;const[W,F]=[Math.min(P,K),Math.max(P,K)],tt=R.slice(W,F+1).map(lt=>lt);a(r.includes(j)?r.filter(lt=>!tt.includes(lt)):[...new Set([...r,...tt])])},[r,a,R]),S=j=>{I(j,A.current),A.current=!1},D=(j,et)=>{j.preventDefault(),I(et,j.shiftKey)},Y=()=>{a(R.map(j=>j))},Z=()=>{a([])},L=s.useMemo(()=>Object.values(B.Section).filter(j=>(l==null?void 0:l[j])!==void 0&&o.getBooksForSection(R,j).length===0).map(j=>({section:j,explanation:l==null?void 0:l[j]})),[l,R]);return e.jsxs(o.Popover,{open:f,onOpenChange:j=>{E(j),j||N("")},children:[e.jsx(o.PopoverTrigger,{asChild:!0,children:e.jsxs(o.Button,{variant:"outline",role:"combobox","aria-expanded":f,className:"tw:max-w-64 tw:justify-between",children:[r.length>0?`${c}: ${r.length}`:d,e.jsx($.ChevronsUpDown,{className:"tw:ml-2 tw:h-4 tw:w-4 tw:shrink-0 tw:opacity-50"})]})}),e.jsx(o.PopoverContent,{className:"tw:max-h-(--radix-popover-content-available-height) tw:w-[500px] tw:max-w-[calc(100vw-2rem)] tw:p-0",align:"start",collisionPadding:8,children:e.jsxs(o.Command,{className:"tw:min-h-0",shouldFilter:!1,onKeyDown:j=>{j.key==="Enter"&&(A.current=j.shiftKey)},children:[e.jsx(o.CommandInput,{className:"tw:shrink-0",placeholder:u,value:k,onValueChange:N,spaceSelectsHighlightedItem:!0}),e.jsxs("div",{className:"tw:flex tw:shrink-0 tw:justify-between tw:border-b tw:p-2",children:[e.jsx(o.Button,{variant:"ghost",size:"sm",onClick:Y,disabled:R.length===0,children:w}),e.jsx(o.Button,{variant:"ghost",size:"sm",onClick:Z,children:p})]}),e.jsxs(o.CommandList,{className:"tw:max-h-72 tw:min-h-0 tw:flex-1",children:[e.jsx(o.CommandEmpty,{children:h}),Object.values(B.Section).filter(j=>O[j].length>0).map((j,et)=>{const P=O[j];return e.jsxs(s.Fragment,{children:[et>0&&e.jsx(o.CommandSeparator,{alwaysRender:!0}),e.jsx(o.CommandGroup,{heading:o.getSectionLongName(j,g,m,x,y),children:P.map(K=>e.jsx(Xa,{bookId:K,isSelected:r.includes(K),onSelect:()=>S(K),onMouseDown:W=>D(W,K),section:B.getSectionForBook(K),showCheck:!0,localizedBookNames:i,commandValue:Gr(K,i),className:"tw:flex tw:items-center"},K))})]},j)})]}),L.length>0&&e.jsx("div",{className:"tw:shrink-0 tw:border-t tw:p-2",children:L.map(({section:j,explanation:et})=>e.jsx("p",{className:"tw:text-xs tw:text-muted-foreground",children:et},j))})]})})]})}function pn({disabled:t,tooltipText:r,children:a,className:n}){return e.jsx(o.TooltipProvider,{children:e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:e.jsx(Ue,{className:n,isDisabled:t,disabledExplanation:r,children:a})}),t&&e.jsx(o.TooltipContent,{children:e.jsx("p",{className:"tw:max-w-xs tw:whitespace-pre-line",children:r})})]})})}function Qc({section:t,availableBookIds:r,selectedBookIds:a,onToggle:n,localizedStrings:i,disabledExplanation:l}){const c=o.getBooksForSection(r,t).length===0,d=i["%scripture_section_ot_short%"],u=i["%scripture_section_nt_short%"],w=i["%scripture_section_dc_short%"],p=i["%scripture_section_extra_short%"],h=e.jsx(o.Button,{variant:"outline",size:"sm",onClick:()=>n(t),className:o.cn(o.isSectionFullySelected(r,t,a)&&!c&&"tw:bg-primary tw:text-primary-foreground tw:hover:bg-primary/70 tw:hover:text-primary-foreground"),disabled:c,children:o.getSectionShortName(t,d,u,w,p)});return l?e.jsx(pn,{className:"tw:flex",disabled:c,tooltipText:l,children:h}):h}const Ka=5,Fr=6;function hn({availableBookInfo:t,selectedBookIds:r,onChangeSelectedBookIds:a,localizedStrings:n,localizedBookNames:i,disabledSectionExplanations:l}){const c=n["%webView_book_selector_more%"],d=s.useMemo(()=>o.getAvailableBookIds(t),[t]),u=s.useCallback(w=>{const p=o.getBooksForSection(d,w).map(h=>h);a(o.isSectionFullySelected(d,w,r)?r.filter(h=>!p.includes(h)):[...new Set([...r,...p])])},[r,a,d]);return e.jsxs("div",{className:"tw:space-y-2",children:[e.jsx("div",{className:"tw:flex tw:flex-wrap tw:gap-2",children:Object.values(B.Section).map(w=>e.jsx(Qc,{section:w,availableBookIds:d,selectedBookIds:r,onToggle:u,localizedStrings:n,disabledExplanation:l==null?void 0:l[w]},w))}),e.jsx(un,{availableBookInfo:t,selectedBookIds:r,onChangeSelectedBookIds:a,localizedStrings:n,localizedBookNames:i,disabledSectionExplanations:l}),r.length>0&&e.jsxs("div",{className:"tw:mt-2 tw:flex tw:flex-wrap tw:gap-1",children:[r.slice(0,r.length===Fr?Fr:Ka).map(w=>e.jsx(o.Badge,{className:"tw:hover:bg-secondary",variant:"secondary",children:o.getLocalizedBookName(w,i)},w)),r.length>Fr&&e.jsx(o.Badge,{className:"tw:hover:bg-secondary",variant:"secondary",children:`+${r.length-Ka} ${c}`})]})]})}const gn=Object.freeze(["%webView_book_selector_books_selected%","%webView_book_selector_select_books%","%webView_book_selector_search_books%","%webView_book_selector_select_all%","%webView_book_selector_clear_all%","%webView_book_selector_no_book_found%","%webView_book_selector_more%","%scripture_section_ot_long%","%scripture_section_ot_short%","%scripture_section_nt_long%","%scripture_section_nt_short%","%scripture_section_dc_long%","%scripture_section_dc_short%","%scripture_section_extra_long%","%scripture_section_extra_short%"]),tl=Object.freeze(["%webView_scope_selector_selected_text%","%webView_scope_selector_verse%","%webView_scope_selector_chapter%","%webView_scope_selector_book%","%webView_scope_selector_current_verse%","%webView_scope_selector_current_chapter%","%webView_scope_selector_current_book%","%webView_scope_selector_choose_books%","%webView_scope_selector_scope%","%webView_scope_selector_select_books%","%webView_scope_selector_range%","%webView_scope_selector_select_range%","%webView_scope_selector_range_start%","%webView_scope_selector_range_end%","%webView_scope_selector_ok%","%webView_scope_selector_cancel%","%webView_scope_selector_navigate%",...gn]),It=(t,r)=>t[r]??r,el=Object.freeze([" ","-"]);function rl({scope:t,availableScopes:r,onScopeChange:a,availableBookInfo:n,selectedBookIds:i,onSelectedBookIdsChange:l,localizedStrings:c,localizedBookNames:d,disabledSectionExplanations:u,disabledScopeExplanations:w,id:p,variant:h="radio",rangeStart:g,rangeEnd:m,onRangeStartChange:x,onRangeEndChange:y,currentScrRef:f,onCurrentScrRefChange:E,bookChapterControlLocalizedStrings:k,getEndVerse:N,hideLabel:C=!1,buttonClassName:A}){const R=It(c,"%webView_scope_selector_selected_text%"),O=It(c,"%webView_scope_selector_verse%"),I=It(c,"%webView_scope_selector_chapter%"),S=It(c,"%webView_scope_selector_book%"),D=It(c,"%webView_scope_selector_current_verse%"),Y=It(c,"%webView_scope_selector_current_chapter%"),Z=It(c,"%webView_scope_selector_current_book%"),L=It(c,"%webView_scope_selector_choose_books%"),j=It(c,"%webView_scope_selector_scope%"),et=It(c,"%webView_scope_selector_select_books%"),P=It(c,"%webView_scope_selector_range%"),K=It(c,"%webView_scope_selector_select_range%"),W=It(c,"%webView_scope_selector_range_start%"),F=It(c,"%webView_scope_selector_range_end%"),tt=It(c,"%webView_scope_selector_ok%"),lt=It(c,"%webView_scope_selector_cancel%"),it=It(c,"%webView_scope_selector_navigate%"),J=U=>{if(!f)return;const Q=f.book.toUpperCase();switch(U){case"verse":return B.formatScrRef(f,"id");case"chapter":return`${Q} ${f.chapterNum}`;case"book":return Q;default:return}},dt=[{value:"selectedText",label:R,id:"scope-selected-text"},{value:"verse",label:O,dropdownLabel:D,scrRefSuffix:J("verse"),id:"scope-verse"},{value:"chapter",label:I,dropdownLabel:Y,scrRefSuffix:J("chapter"),id:"scope-chapter"},{value:"book",label:S,dropdownLabel:Z,scrRefSuffix:J("book"),id:"scope-book"},{value:"selectedBooks",label:L,id:"scope-selected"},{value:"range",label:P,id:"scope-range"}],gt=(U,Q,Tt=!1)=>e.jsxs(e.Fragment,{children:[U,Q&&!Tt&&e.jsxs("span",{className:"tw:text-muted-foreground",children:[": ",Q]})]}),wt=r?dt.filter(U=>r.includes(U.value)):dt,mt=f??B.defaultScrRef,vt=g??mt,Mt=m??mt,Xt=()=>{},Wt=s.useRef(null),Nt=s.useRef(null),bt=s.useRef(!1),Lt=s.useRef(null),oe=s.useRef(!1),[se,Et]=s.useState(void 0),kt=s.useRef(!1),qt=s.useRef(!1),Jt=s.useRef(null),Qt=s.useCallback(U=>{if(U){Et("start"),kt.current=!1;return}Et(Q=>Q==="start"?void 0:Q),kt.current&&(kt.current=!1,requestAnimationFrame(()=>{var Tt;const Q=(Tt=Wt.current)==null?void 0:Tt.querySelector("button");Q==null||Q.click()}))},[]),te=s.useCallback(U=>{if(U){Et("end"),qt.current=!1;return}Et(Q=>Q==="end"?void 0:Q)},[]),Kt=s.useCallback(U=>{x==null||x(U),y==null||y(U),kt.current=!0},[x,y]),Pt=s.useCallback(U=>{y==null||y(U),qt.current=!0},[y]),Bt=s.useCallback(U=>{a(U),U==="selectedBooks"&&i.length===0&&(f!=null&&f.book)&&l([f.book])},[a,i,f,l]),M=wt.find(U=>U.value===t),q=()=>t==="selectedBooks"&&i.length>0?i.map(U=>U.toUpperCase()).join(", "):t==="range"?B.formatScrRefRange(vt,Mt,{optionOrLocalizedBookName:"id",endRefOptionOrLocalizedBookName:"id",repeatBookName:!0}):M?gt(M.label,M.scrRefSuffix):t,_=wt.filter(U=>U.value!=="selectedBooks"&&U.value!=="range"),z=wt.find(U=>U.value==="selectedBooks"),X=wt.find(U=>U.value==="range"),[V,rt]=s.useState(!1),[st,nt]=s.useState(void 0),[ft,xt]=s.useState(void 0),[ht,_t]=s.useState(void 0),[zt,jt]=s.useState(void 0),[ce,ge]=s.useState([]),le=h==="dropdown"&&st==="selectedBooks",je=e.jsx(hn,{availableBookInfo:n,selectedBookIds:le?ce:i,onChangeSelectedBookIds:le?ge:l,localizedStrings:c,localizedBookNames:d,disabledSectionExplanations:u}),Ce=se==="end",be=se==="start",fe="tw:text-muted-foreground",de=h==="dropdown"&&st==="range",De=de?_t:Kt,Ie=de?jt:y?Pt:Xt,T=e.jsxs("div",{className:"tw:flex tw:flex-wrap tw:items-end tw:gap-4",children:[e.jsxs("div",{className:"tw:grid tw:gap-2",children:[e.jsx(o.Label,{htmlFor:"scope-range-start",className:o.cn(Ce&&fe),children:W}),e.jsx(gr,{id:"scope-range-start",scrRef:de?ht??vt:vt,handleSubmit:De,localizedBookNames:d,localizedStrings:k,getEndVerse:N,submitKeys:el,onOpenChange:Qt,className:o.cn(Ce&&fe),modal:!0})]}),e.jsxs("div",{ref:Wt,className:"tw:grid tw:gap-2",children:[e.jsx(o.Label,{htmlFor:"scope-range-end",className:o.cn(be&&fe),children:F}),e.jsx(gr,{id:"scope-range-end",scrRef:de?zt??Mt:Mt,handleSubmit:Ie,localizedBookNames:d,localizedStrings:k,getEndVerse:N,disableReferencesUpTo:de?ht??vt:vt,onOpenChange:te,onCloseAutoFocus:U=>{var Q;qt.current&&(qt.current=!1,U.preventDefault(),(Q=Jt.current)==null||Q.focus())},className:o.cn(be&&fe),modal:!0,align:"start"})]})]}),at=s.useRef({}),ct=s.useCallback(U=>Q=>{at.current[U]=Q},[]),Ct=s.useRef(null);s.useEffect(()=>{if(!V)return;let U=0;const Q=requestAnimationFrame(()=>{U=requestAnimationFrame(()=>{var Tt;(Tt=at.current[t])==null||Tt.focus()})});return()=>{cancelAnimationFrame(Q),U&&cancelAnimationFrame(U)}},[V,t]);const[xe,Tr]=s.useState(null),[me,Oe]=s.useState(null),[Pe,Sr]=s.useState(null),rr=200,[Rr,ar]=s.useState(!1);s.useEffect(()=>{if(!Pe||typeof ResizeObserver>"u")return;const U=new ResizeObserver(([Q])=>{ar(Q.contentRect.widthU.disconnect()},[Pe]);const or=s.useCallback(U=>{xt(U),_t(vt),jt(Mt),ge(i),rt(!1),nt(U)},[vt,Mt,i]),nr=s.useCallback(()=>{ft!==void 0&&(ft==="range"?(ht&&(x==null||x(ht)),zt&&(y==null||y(zt))):ft==="selectedBooks"&&l(ce),Bt(ft),nt(void 0),xt(void 0))},[ft,ht,zt,ce,x,y,l,Bt]),Ae=s.useCallback(U=>{U||(nt(void 0),xt(void 0))},[]),ir=s.useCallback(U=>{var Q;U.preventDefault(),(Q=Ct.current)==null||Q.focus()},[]),sr=U=>t===U?e.jsx("span",{className:"tw:absolute tw:flex tw:h-3.5 tw:w-3.5 tw:items-center tw:justify-center tw:ltr:left-2 tw:rtl:right-2",children:e.jsx($.Check,{className:"tw:h-4 tw:w-4"})}):void 0;return e.jsxs("div",{id:p,className:"tw:grid tw:gap-4",children:[e.jsxs("div",{className:"tw:grid tw:gap-2",children:[!C&&e.jsx(o.Label,{children:j}),h==="dropdown"?e.jsxs(o.DropdownMenu,{open:V,onOpenChange:rt,children:[e.jsx(o.DropdownMenuTrigger,{asChild:!0,children:e.jsxs(o.Button,{ref:Ct,variant:"outline",role:"combobox",className:o.cn("tw:w-full tw:justify-between tw:overflow-hidden tw:font-normal",A),children:[e.jsx("span",{className:"tw:min-w-0 tw:flex-1 tw:truncate tw:text-start",children:q()}),e.jsx($.ChevronDown,{className:"tw:ms-2 tw:h-4 tw:w-4 tw:shrink-0 tw:opacity-50"})]})}),e.jsx(o.DropdownMenuContent,{ref:Sr,className:"tw:w-[var(--radix-dropdown-menu-trigger-width)] tw:min-w-[12rem]",align:"start",children:e.jsxs(o.PopoverPortalContainerProvider,{container:Pe,children:[_.map(({value:U,label:Q,dropdownLabel:Tt,scrRefSuffix:ee,id:ne})=>{const b=w==null?void 0:w[U];return e.jsxs(o.DropdownMenuItem,{ref:ct(U),disabled:!!b,className:"tw:relative tw:ps-8 data-[highlighted]:tw:bg-accent data-[highlighted]:tw:text-accent-foreground",onSelect:()=>Bt(U),"data-selected":t===U?"true":void 0,children:[t===U&&e.jsx("span",{className:"tw:absolute tw:flex tw:h-3.5 tw:w-3.5 tw:items-center tw:justify-center tw:ltr:left-2 tw:rtl:right-2",children:e.jsx($.Check,{className:"tw:h-4 tw:w-4"})}),e.jsxs("span",{className:"tw:flex tw:min-w-0 tw:flex-col tw:gap-0.5",children:[e.jsx("span",{className:"tw:flex tw:items-center tw:gap-1.5",children:gt(Tt??Q,ee,Rr)}),b&&e.jsx("span",{className:"tw:text-xs tw:whitespace-normal tw:text-foreground",children:b})]})]},ne)}),(z||X)&&e.jsx(o.DropdownMenuSeparator,{}),z&&e.jsxs(o.DropdownMenuItem,{ref:ct("selectedBooks"),className:o.cn("tw:relative tw:ps-8","data-[highlighted]:tw:bg-accent data-[highlighted]:tw:text-accent-foreground"),onSelect:()=>or("selectedBooks"),"data-selected":t==="selectedBooks"?"true":void 0,children:[sr("selectedBooks"),`${z.label}…`]}),X&&e.jsxs(o.DropdownMenuItem,{ref:ct("range"),className:o.cn("tw:relative tw:ps-8","data-[highlighted]:tw:bg-accent data-[highlighted]:tw:text-accent-foreground"),onSelect:()=>or("range"),"data-selected":t==="range"?"true":void 0,children:[sr("range"),`${X.label}…`]}),E&&e.jsxs(e.Fragment,{children:[e.jsx(o.DropdownMenuSeparator,{}),e.jsx(o.DropdownMenuLabel,{className:"tw:px-2 tw:py-1.5 tw:text-xs tw:font-medium tw:text-muted-foreground",children:it}),e.jsx(o.DropdownMenuItem,{ref:Lt,className:"tw:p-0",onSelect:U=>{var Q,Tt;if(U.preventDefault(),bt.current){bt.current=!1;return}oe.current||(Tt=(Q=Nt.current)==null?void 0:Q.querySelector("button"))==null||Tt.click()},children:e.jsx("div",{ref:Nt,className:"tw:w-full tw:px-1 tw:pb-1",onPointerDownCapture:U=>{const Q=U.target instanceof HTMLElement?U.target:void 0;Q!=null&&Q.closest("button")&&(bt.current=!0,requestAnimationFrame(()=>{bt.current=!1}))},children:e.jsx(gr,{id:"scope-navigate",scrRef:f??B.defaultScrRef,handleSubmit:E,localizedBookNames:d,localizedStrings:k,getEndVerse:N,triggerVariant:"ghost",onOpenChange:U=>{oe.current=U},onCloseAutoFocus:U=>{var Q;U.preventDefault(),(Q=Lt.current)==null||Q.focus()},modal:!0,className:"tw:w-full tw:min-w-0 tw:max-w-none tw:justify-between tw:px-2 tw:font-normal",triggerContent:e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"tw:min-w-0 tw:flex-1 tw:truncate tw:text-start",children:B.formatScrRef(f??B.defaultScrRef,"id")}),e.jsx($.ChevronDown,{className:"tw:ms-2 tw:h-4 tw:w-4 tw:shrink-0 tw:opacity-50"})]})})})})]})]})})]}):e.jsx(o.RadioGroup,{value:t,onValueChange:Bt,className:"tw:flex tw:flex-col tw:space-y-1",children:wt.map(({value:U,label:Q,scrRefSuffix:Tt,id:ee})=>{const ne=w==null?void 0:w[U];return e.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-0.5",children:[e.jsxs("div",{className:"tw:flex tw:items-center",children:[e.jsx(o.RadioGroupItem,{className:"tw:me-2",value:U,id:ee,disabled:!!ne,"aria-describedby":ne?`${ee}-explanation`:void 0}),e.jsx(o.Label,{htmlFor:ee,children:gt(Q,Tt)})]}),ne&&e.jsx("span",{id:`${ee}-explanation`,className:"tw:ms-6 tw:text-xs tw:whitespace-normal tw:text-muted-foreground",children:ne})]},ee)})})]}),h==="radio"&&t==="selectedBooks"&&e.jsxs("div",{className:"tw:grid tw:gap-2",children:[e.jsx(o.Label,{children:et}),je]}),h==="radio"&&t==="range"&&T,h==="dropdown"&&z&&e.jsx(o.Dialog,{open:st==="selectedBooks",onOpenChange:Ae,children:e.jsx(o.DialogContent,{ref:Oe,onCloseAutoFocus:ir,onEscapeKeyDown:U=>{me!=null&&me.querySelector('[data-state="open"]')&&U.preventDefault()},children:e.jsxs(o.PopoverPortalContainerProvider,{container:me,children:[e.jsx(o.DialogHeader,{className:"tw:pe-8",children:e.jsx(o.DialogTitle,{children:L})}),je,e.jsxs(o.DialogFooter,{children:[e.jsx(o.Button,{variant:"outline",onClick:()=>Ae(!1),children:lt}),e.jsx(o.Button,{onClick:nr,children:tt})]})]})})}),h==="dropdown"&&X&&e.jsx(o.Dialog,{open:st==="range",onOpenChange:Ae,children:e.jsx(o.DialogContent,{ref:Tr,onCloseAutoFocus:ir,onEscapeKeyDown:U=>{xe!=null&&xe.querySelector('[data-state="open"]')&&U.preventDefault()},children:e.jsxs(o.PopoverPortalContainerProvider,{container:xe,children:[e.jsx(o.DialogHeader,{className:"tw:pe-8",children:e.jsx(o.DialogTitle,{children:K})}),T,e.jsxs(o.DialogFooter,{children:[e.jsx(o.Button,{variant:"outline",onClick:()=>Ae(!1),children:lt}),e.jsx(o.Button,{ref:Jt,onClick:nr,children:tt})]})]})})})]})}function al({availableScrollGroupIds:t,scrollGroupId:r,onChangeScrollGroupId:a,localizedStrings:n={},size:i="sm",className:l,id:c,disabled:d}){const u={...o.dt,...Object.fromEntries(Object.entries(n).map(([p,h])=>[p,p===h&&p in o.dt?o.dt[p]:h]))},w=o.readDirection();return e.jsxs(Te,{value:`${r}`,onValueChange:p=>a(p==="undefined"?void 0:parseInt(p,10)),disabled:d,children:[e.jsx(Re,{size:i,className:o.cn("pr-twp tw:w-auto",l),children:e.jsx(Se,{placeholder:u[B.getLocalizeKeyForScrollGroupId(r)]??r})}),e.jsx(Me,{id:c,align:w==="rtl"?"end":"start",style:{zIndex:o.Z_INDEX_ABOVE_DOCK},children:t.map(p=>e.jsx(ae,{value:`${p}`,children:u[B.getLocalizeKeyForScrollGroupId(p)]},`${p}`))})]})}function ol({children:t}){return e.jsx("div",{className:"pr-twp tw:grid",children:t})}function nl({primary:t,secondary:r,children:a,isLoading:n=!1,loadingMessage:i}){return e.jsxs("div",{className:"tw:flex tw:items-center tw:justify-between tw:space-x-4 tw:py-2",children:[e.jsxs("div",{children:[e.jsx("p",{className:"tw:text-sm tw:font-medium tw:leading-none",children:t}),e.jsx("p",{className:"tw:whitespace-normal tw:break-words tw:text-sm tw:text-muted-foreground",children:r})]}),n?e.jsx("p",{className:"tw:text-sm tw:text-muted-foreground",children:i}):e.jsx("div",{children:a})]})}function il({primary:t,secondary:r,includeSeparator:a=!1}){return e.jsxs("div",{className:"tw:space-y-4 tw:py-2",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"tw:text-lg tw:font-medium",children:t}),e.jsx("p",{className:"tw:text-sm tw:text-muted-foreground",children:r})]}),a?e.jsx(o.Separator,{}):""]})}function fn(t,r){var a;return(a=Object.entries(t).find(([,n])=>"menuItem"in n&&n.menuItem===r))==null?void 0:a[0]}function mn(t){return Object.entries(t).flatMap(([r,a])=>typeof a=="object"?[{columnKey:r,column:a}]:[]).sort((r,a)=>r.column.order-a.column.order)}function vn(t,r,a){return"column"in r&&r.column===a||t===a}function sl(t){const r=new Set(t.items.map(n=>n.group)),a=Object.entries(t.groups).filter(([n])=>r.has(n));return mn(t.columns).filter(({columnKey:n})=>a.some(([i,l])=>vn(i,l,n))).map(({columnKey:n,column:i})=>({columnKey:n,label:i.label}))}function Cr({icon:t,menuLabel:r,leading:a}){return t?e.jsx("img",{className:o.cn("tw:max-h-5 tw:max-w-5",a?"tw:me-2":"tw:ms-2"),src:t,alt:`${a?"Leading":"Trailing"} icon for ${r}`}):void 0}const bn=(t,r,a,n)=>a?Object.entries(t).filter(([l,c])=>vn(l,c,a)).sort(([,l],[,c])=>l.order-c.order).flatMap(([l])=>r.filter(d=>d.group===l).sort((d,u)=>d.order-u.order).map(d=>e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:"command"in d?e.jsxs(o.DropdownMenuItem,{onClick:()=>{n(d)},children:[d.iconPathBefore&&e.jsx(Cr,{icon:d.iconPathBefore,menuLabel:d.label,leading:!0}),d.label,d.iconPathAfter&&e.jsx(Cr,{icon:d.iconPathAfter,menuLabel:d.label}),d.shortcut&&e.jsx(o.DropdownMenuShortcut,{children:d.shortcut})]},`dropdown-menu-item-${d.label}-${d.command}`):e.jsxs(o.DropdownMenuSub,{children:[e.jsx(o.DropdownMenuSubTrigger,{children:d.label}),e.jsx(o.DropdownMenuPortal,{children:e.jsx(o.DropdownMenuSubContent,{children:bn(t,r,fn(t,d.id),n)})})]},`dropdown-menu-sub-${d.label}-${d.id}`)}),d.tooltip&&e.jsx(o.TooltipContent,{children:d.tooltip})]},`tooltip-${d.label}-${"command"in d?d.command:d.id}`))):void 0;function Nr({onSelectMenuItem:t,menuData:r,tabLabel:a,icon:n,className:i,showSectionHeadings:l=!1,variant:c,buttonVariant:d="ghost",id:u}){const w=s.useId(),p=sl(r),h=l&&p.length>1;Ja();const g=s.useRef(null),m=()=>o.showFocusRing(g.current??void 0);return e.jsxs(o.DropdownMenu,{variant:c,children:[e.jsx(o.DropdownMenuTrigger,{"aria-label":a,className:i,asChild:!0,id:u,children:e.jsx(o.Button,{ref:g,variant:d,size:"icon",className:o.QUIET_FOCUS_RING_SUPPRESSION,onKeyDown:m,onBlur:m,children:n??e.jsx($.MenuIcon,{})})}),e.jsx(o.DropdownMenuContent,{align:"start",style:{zIndex:o.Z_INDEX_ABOVE_DOCK},onCloseAutoFocus:()=>{o.getLastInteractionModality()==="pointer"&&o.hideFocusRing(g.current??void 0)},children:p.map(({columnKey:x,label:y},f)=>{const E=`${w}-${x}`;return e.jsxs(s.Fragment,{children:[e.jsxs(o.DropdownMenuGroup,{"aria-labelledby":h?E:void 0,children:[h&&e.jsx(o.DropdownMenuLabel,{id:E,children:y}),e.jsx(o.TooltipProvider,{children:bn(r.groups,r.items,x,t)})]}),ft>=c),i=n===-1?r.length:n;if(a===void 0||i>=a)return i;const l=r.findIndex(c=>t>=c+cl);return l===-1?a:Math.min(a,l)}function ga(t,r){const[a,n]=s.useState(0),i=s.useRef(void 0);return s.useLayoutEffect(()=>{if(!t||typeof ResizeObserver>"u")return;const l=()=>{const{width:d}=t.getBoundingClientRect(),u=i.current;i.current=d;const w=u===void 0||u===0;n(p=>ll(d,r,w?void 0:p))};l();const c=new ResizeObserver(l);return c.observe(t),()=>c.disconnect()},[t,r]),a}const dl=Object.freeze([520,420,340]),xn=s.forwardRef(({id:t,className:r,children:a},n)=>{const[i,l]=s.useState(void 0),c=s.useRef(n);c.current=n;const d=s.useCallback(h=>{l(h??void 0);const g=c.current;typeof g=="function"?g(h):g&&(g.current=h)},[]),u=ga(i,dl),w=ra()??u,p=w>=ze.MINIMUM;return e.jsx(Je.Provider,{value:w,children:e.jsx("div",{ref:d,className:o.cn("tw:sticky tw:top-0 tw:box-border tw:h-14 tw:items-center tw:justify-between tw:overflow-clip tw:py-2 tw:text-foreground tw:@container/toolbar",p?"tw:gap-1 tw:px-2":"tw:gap-2 tw:px-4",r,"tw:flex tw:flex-row"),id:t,children:a})})});function wl({onSelectProjectMenuItem:t,onSelectViewInfoMenuItem:r,projectMenuData:a,tabViewMenuData:n,id:i,className:l,startAreaChildren:c,centerAreaChildren:d,endAreaChildren:u,menuButtonIcon:w}){return e.jsxs(xn,{className:`tw:w-full tw:border-b ${l}`,id:i,children:[a&&e.jsx(Nr,{onSelectMenuItem:t,menuData:a,tabLabel:"Project",icon:w??e.jsx($.Menu,{}),buttonVariant:"ghost",showSectionHeadings:!0}),c&&e.jsx("div",{className:"tw:flex tw:min-w-0 tw:shrink tw:grow-[10] tw:flex-row tw:flex-nowrap tw:items-start tw:gap-x-1 tw:gap-y-2 tw:overflow-clip",children:c}),d&&e.jsx("div",{className:"tw:flex tw:shrink tw:grow-[1] tw:basis-0 tw:flex-row tw:flex-nowrap tw:items-start tw:justify-center tw:gap-x-1 tw:gap-y-2 tw:overflow-clip tw:@sm:basis-auto",children:d}),e.jsxs("div",{className:"tw:flex tw:shrink-0 tw:grow-[1] tw:flex-row-reverse tw:flex-nowrap tw:items-start tw:gap-x-1 tw:gap-y-2 tw:overflow-clip",children:[n&&e.jsx(Nr,{onSelectMenuItem:r,menuData:n,tabLabel:"View Info",icon:e.jsx($.EllipsisVertical,{}),className:"tw:h-full",showSectionHeadings:!0}),u]})]})}function ul({onSelectProjectMenuItem:t,projectMenuData:r,id:a,className:n,menuButtonIcon:i}){return e.jsx(xn,{className:"tw:pointer-events-none",id:a,children:r&&e.jsx(Nr,{onSelectMenuItem:t,menuData:r,tabLabel:"Project",icon:i,className:`tw:pointer-events-auto tw:shadow-lg ${n}`,buttonVariant:"outline",showSectionHeadings:!0})})}const fa=s.forwardRef(({className:t,...r},a)=>{const n=o.readDirection();return e.jsx(G.Tabs.Root,{orientation:"vertical",ref:a,className:o.cn("tw:flex tw:gap-1 tw:rounded-md tw:text-muted-foreground",t),...r,dir:n})});fa.displayName=G.Tabs.List.displayName;const ma=s.forwardRef(({className:t,...r},a)=>e.jsx(G.Tabs.List,{ref:a,className:o.cn("tw:flex tw:items-center tw:w-[124px] tw:justify-center tw:rounded-md tw:bg-muted tw:p-1 tw:text-muted-foreground",t),...r}));ma.displayName=G.Tabs.List.displayName;const yn=s.forwardRef(({className:t,...r},a)=>e.jsx(G.Tabs.Trigger,{ref:a,...r,className:o.cn("tw:inline-flex tw:w-[116px] tw:cursor-pointer tw:items-center tw:justify-center tw:break-words tw:rounded-sm tw:border-0 tw:bg-muted tw:px-3 tw:py-1.5 tw:text-sm tw:font-medium tw:text-inherit tw:ring-offset-background tw:transition-all tw:hover:text-foreground tw:focus-visible:outline-hidden tw:focus-visible:ring-2 tw:focus-visible:ring-ring tw:focus-visible:ring-offset-2 tw:disabled:pointer-events-none tw:disabled:opacity-50 tw:data-[state=active]:bg-background tw:data-[state=active]:text-foreground tw:data-[state=active]:shadow-sm tw:overflow-clip",t)})),va=s.forwardRef(({className:t,...r},a)=>e.jsx(G.Tabs.Content,{ref:a,className:o.cn("tw:ms-5 tw:flex-grow tw:text-foreground tw:ring-offset-background tw:focus-visible:outline-hidden tw:focus-visible:ring-2 tw:focus-visible:ring-ring tw:focus-visible:ring-offset-2",t),...r}));va.displayName=G.Tabs.Content.displayName;function pl({tabList:t,searchValue:r,onSearch:a,searchPlaceholder:n,headerTitle:i,searchClassName:l,id:c}){return e.jsxs("div",{id:c,className:"pr-twp",children:[e.jsxs("div",{className:"tw:sticky tw:top-0 tw:space-y-2 tw:pb-2",children:[i?e.jsx("h1",{children:i}):"",e.jsx(o.SearchBar,{className:l,value:r,onSearch:a,placeholder:n})]}),e.jsxs(fa,{children:[e.jsx(ma,{children:t.map(d=>e.jsx(yn,{value:d.value,children:d.value},d.key))}),t.map(d=>e.jsx(va,{value:d.value,children:d.content},d.key))]})]})}function hl({className:t,variant:r="default",...a}){const n=s.useMemo(()=>({variant:r}),[r]);return e.jsx(o.MenuContext.Provider,{value:n,children:e.jsx(G.Menubar.Root,{"data-slot":"menubar",className:o.cn("tw:flex tw:h-8 tw:items-center tw:gap-0.5 tw:rounded-lg tw:border tw:p-[3px]",t),...a})})}function gl({...t}){return e.jsx(G.Menubar.Menu,{"data-slot":"menubar-menu",...t})}function fl({...t}){return e.jsx(G.Menubar.Portal,{"data-slot":"menubar-portal",...t})}function ml({className:t,...r}){const a=o.useMenuContext();return e.jsx(G.Menubar.Trigger,{"data-slot":"menubar-trigger",className:o.cn("tw:flex tw:items-center tw:rounded-sm tw:px-1.5 tw:py-[2px] tw:text-sm tw:font-medium tw:outline-hidden tw:select-none tw:hover:bg-muted tw:aria-expanded:bg-muted","pr-twp",o.menuVariants({variant:a.variant,className:t})),...r})}function vl({className:t,align:r="start",alignOffset:a=-4,sideOffset:n=8,style:i,...l}){return e.jsx(fl,{children:e.jsx(G.Menubar.Content,{"data-slot":"menubar-content",align:r,alignOffset:a,sideOffset:n,className:o.cn("tw:min-w-36 tw:origin-(--radix-menubar-content-transform-origin) tw:overflow-hidden tw:rounded-lg tw:bg-popover tw:p-1 tw:text-popover-foreground tw:shadow-md tw:ring-1 tw:ring-foreground/10 tw:duration-100 tw:data-[side=bottom]:slide-in-from-top-2 tw:data-[side=left]:slide-in-from-right-2 tw:data-[side=right]:slide-in-from-left-2 tw:data-[side=top]:slide-in-from-bottom-2 tw:data-open:animate-in tw:data-open:fade-in-0 tw:data-open:zoom-in-95 tw:animate-none! tw:**:data-[slot$=-item]:focus:bg-foreground/10 tw:**:data-[slot$=-item]:data-highlighted:bg-foreground/10 tw:**:data-[slot$=-separator]:bg-foreground/5 tw:**:data-[slot$=-trigger]:focus:bg-foreground/10 tw:**:data-[slot$=-trigger]:aria-expanded:bg-foreground/10! tw:**:data-[variant=destructive]:focus:bg-foreground/10! tw:**:data-[variant=destructive]:text-accent-foreground! tw:**:data-[variant=destructive]:**:text-accent-foreground! tw:relative","pr-twp",t),style:{zIndex:o.Z_INDEX_ABOVE_DOCK,...i},...l})})}function bl({className:t,inset:r,variant:a="default",...n}){const i=o.useMenuContext();return e.jsx(G.Menubar.Item,{"data-slot":"menubar-item","data-inset":r,"data-variant":a,className:o.cn("tw:group/menubar-item tw:relative tw:flex tw:cursor-default tw:items-center tw:gap-1.5 tw:rounded-md tw:px-1.5 tw:py-1 tw:text-sm tw:outline-hidden tw:select-none tw:focus:bg-accent tw:focus:text-accent-foreground tw:not-data-[variant=destructive]:focus:**:text-accent-foreground tw:data-inset:ps-7 tw:data-[variant=destructive]:text-destructive tw:data-[variant=destructive]:focus:bg-destructive/10 tw:data-[variant=destructive]:focus:text-destructive tw:dark:data-[variant=destructive]:focus:bg-destructive/20 tw:data-disabled:pointer-events-none tw:data-disabled:opacity-50 tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0 tw:[&_svg:not([class*=size-])]:size-4 tw:data-[variant=destructive]:*:[svg]:text-destructive!",o.menuVariants({variant:i.variant,className:t})),...n})}function xl({className:t,...r}){return e.jsx(G.Menubar.Separator,{"data-slot":"menubar-separator",className:o.cn("tw:-mx-1 tw:my-1 tw:h-px tw:bg-border",t),...r})}function yl({className:t,...r}){return e.jsx("span",{"data-slot":"menubar-shortcut",className:o.cn("tw:[unicode-bidi:plaintext] tw:ms-auto tw:text-xs tw:tracking-widest tw:text-muted-foreground tw:group-focus/menubar-item:text-accent-foreground",t),...r})}function kl({...t}){return e.jsx(G.Menubar.Sub,{"data-slot":"menubar-sub",...t})}function _l({className:t,inset:r,children:a,...n}){const i=o.useMenuContext();return e.jsxs(G.Menubar.SubTrigger,{"data-slot":"menubar-sub-trigger","data-inset":r,className:o.cn("tw:flex tw:cursor-default tw:items-center tw:gap-1.5 tw:rounded-md tw:px-1.5 tw:py-1 tw:text-sm tw:outline-none tw:select-none tw:focus:bg-accent tw:focus:text-accent-foreground tw:data-inset:ps-7 tw:data-open:bg-accent tw:data-open:text-accent-foreground tw:[&_svg:not([class*=size-])]:size-4",o.menuVariants({variant:i.variant,className:t})),...n,children:[a,e.jsx(Rt.IconChevronRight,{className:"tw:ms-auto tw:size-4"})]})}function jl({className:t,style:r,...a}){return e.jsx(G.Menubar.SubContent,{"data-slot":"menubar-sub-content",className:o.cn("tw:min-w-32 tw:origin-(--radix-menubar-content-transform-origin) tw:overflow-hidden tw:rounded-lg tw:bg-popover tw:p-1 tw:text-popover-foreground tw:shadow-lg tw:ring-1 tw:ring-foreground/10 tw:duration-100 tw:data-[side=bottom]:slide-in-from-top-2 tw:data-[side=left]:slide-in-from-right-2 tw:data-[side=right]:slide-in-from-left-2 tw:data-[side=top]:slide-in-from-bottom-2 tw:data-open:animate-in tw:data-open:fade-in-0 tw:data-open:zoom-in-95 tw:data-closed:animate-out tw:data-closed:fade-out-0 tw:data-closed:zoom-out-95 tw:animate-none! tw:**:data-[slot$=-item]:focus:bg-foreground/10 tw:**:data-[slot$=-item]:data-highlighted:bg-foreground/10 tw:**:data-[slot$=-separator]:bg-foreground/5 tw:**:data-[slot$=-trigger]:focus:bg-foreground/10 tw:**:data-[slot$=-trigger]:aria-expanded:bg-foreground/10! tw:**:data-[variant=destructive]:focus:bg-foreground/10! tw:**:data-[variant=destructive]:text-accent-foreground! tw:**:data-[variant=destructive]:**:text-accent-foreground! tw:relative",t),style:{zIndex:o.Z_INDEX_ABOVE_DOCK,...r},...a})}const qe=(t,r)=>{setTimeout(()=>{r.forEach(a=>{var n;(n=t.current)==null||n.dispatchEvent(new KeyboardEvent("keydown",a))})},0)},kn=(t,r,a,n)=>{if(!a)return;const i=Object.entries(t).filter(([l,c])=>"column"in c&&c.column===a||l===a).sort(([,l],[,c])=>l.order-c.order);return i.flatMap(([l],c)=>{const d=r.filter(w=>w.group===l).sort((w,p)=>w.order-p.order).map(w=>e.jsxs(o.Tooltip,{children:[e.jsx(o.TooltipTrigger,{asChild:!0,children:"command"in w?e.jsxs(bl,{onClick:()=>{n(w)},children:[w.iconPathBefore&&e.jsx(Cr,{icon:w.iconPathBefore,menuLabel:w.label,leading:!0}),w.label,w.iconPathAfter&&e.jsx(Cr,{icon:w.iconPathAfter,menuLabel:w.label}),w.shortcut&&e.jsx(yl,{children:w.shortcut})]},`menubar-item-${w.label}-${w.command}`):e.jsxs(kl,{children:[e.jsx(_l,{children:w.label}),e.jsx(jl,{children:kn(t,r,fn(t,w.id),n)})]},`menubar-sub-${w.label}-${w.id}`)}),w.tooltip&&e.jsx(o.TooltipContent,{children:w.tooltip})]},`tooltip-${w.label}-${"command"in w?w.command:w.id}`)),u=[...d];return d.length>0&&c{switch(p){case"platform.app":return l;case"platform.window":return c;case"platform.layout":return d;case"platform.help":return u;default:return}};if(On.useHotkeys(["alt","alt+p","alt+l","alt+n","alt+h"],(p,h)=>{var x,y,f,E;p.preventDefault();const g={key:"Escape",code:"Escape",keyCode:27,bubbles:!0},m={key:" ",code:"Space",keyCode:32,bubbles:!0};switch(h.hotkey){case"alt":qe(l,[g]);break;case"alt+p":(x=l.current)==null||x.focus(),qe(l,[g,m]);break;case"alt+l":(y=c.current)==null||y.focus(),qe(c,[g,m]);break;case"alt+n":(f=d.current)==null||f.focus(),qe(d,[g,m]);break;case"alt+h":(E=u.current)==null||E.focus(),qe(u,[g,m]);break}}),s.useEffect(()=>{if(!a||!i.current)return;const p=new MutationObserver(m=>{m.forEach(x=>{if(x.attributeName==="data-state"&&x.target instanceof HTMLElement){const y=x.target.getAttribute("data-state");a(y==="open")}})});return i.current.querySelectorAll("[data-state]").forEach(m=>{p.observe(m,{attributes:!0})}),()=>p.disconnect()},[a]),!!t)return e.jsx(hl,{ref:i,className:"pr-twp tw:border-0 tw:bg-transparent",variant:n,children:mn(t.columns).map(({columnKey:p,column:h})=>e.jsxs(gl,{children:[e.jsx(ml,{ref:w(p),children:h.label}),e.jsx(vl,{style:{zIndex:o.Z_INDEX_ABOVE_DOCK},children:e.jsx(o.TooltipProvider,{children:kn(t.groups,t.items,p,r)})})]},p))})}const Nl=Object.freeze([950,800,700]);function El(t){switch(t){case void 0:return;case"darwin":return"tw:ps-[85px]";default:return"tw:pe-[calc(138px+1rem)]"}}function Tl({menuData:t,onOpenChange:r,onSelectMenuItem:a,className:n,id:i,children:l,appMenuAreaChildren:c,configAreaChildren:d,shouldUseAsAppDragArea:u,menubarVariant:w="default"}){const[p,h]=s.useState(void 0),g=s.useCallback(y=>h(y??void 0),[]),m=ga(p,Nl),x=ra()??m;return e.jsx(Je.Provider,{value:x,children:e.jsx("div",{className:o.cn("tw:border tw:px-4 tw:text-foreground",n),style:{position:"relative"},id:i,children:e.jsxs("div",{"data-testid":"toolbar-content-row",className:"tw:flex tw:h-full tw:w-full tw:justify-between tw:overflow-hidden",ref:g,style:u?{WebkitAppRegion:"drag"}:void 0,children:[e.jsx("div",{className:"tw:flex tw:shrink-0 tw:grow tw:basis-0",children:e.jsxs("div",{className:"tw:flex tw:items-center tw:gap-2",style:u?{WebkitAppRegion:"no-drag"}:void 0,children:[c,t&&e.jsx(Cl,{menuData:t,onOpenChange:r,onSelectMenuItem:a,variant:w})]})}),e.jsx("div",{"data-testid":"toolbar-content-area",className:"tw:flex tw:min-w-0 tw:shrink tw:items-center tw:gap-2 tw:overflow-clip tw:px-2",style:u?{WebkitAppRegion:"no-drag"}:void 0,children:l}),e.jsx("div",{className:"tw:flex tw:min-w-0 tw:grow tw:basis-0 tw:justify-end",children:e.jsx("div",{className:"tw:flex tw:min-w-0 tw:items-center tw:gap-2 tw:pe-1",style:u?{WebkitAppRegion:"no-drag"}:void 0,children:d})})]})})})}const Sl=(t,r)=>t[r]??r;function Rl({knownUiLanguages:t,primaryLanguage:r="en",fallbackLanguages:a=[],onLanguagesChange:n,onPrimaryLanguageChange:i,onFallbackLanguagesChange:l,localizedStrings:c,className:d,id:u}){const w=Sl(c,"%settings_uiLanguageSelector_fallbackLanguages%"),[p,h]=s.useState(!1),g=x=>{i&&i(x),n&&n([x,...a.filter(y=>y!==x)]),l&&a.find(y=>y===x)&&l([...a.filter(y=>y!==x)]),h(!1)},m=(x,y)=>{var E,k,N,C,A,R;const f=y!==x?((k=(E=t[x])==null?void 0:E.uiNames)==null?void 0:k[y])??((C=(N=t[x])==null?void 0:N.uiNames)==null?void 0:C.en):void 0;return f?`${(A=t[x])==null?void 0:A.autonym} (${f})`:(R=t[x])==null?void 0:R.autonym};return e.jsxs("div",{id:u,className:o.cn("pr-twp tw:max-w-sm",d),children:[e.jsxs(Te,{name:"uiLanguage",value:r,onValueChange:g,open:p,onOpenChange:x=>h(x),children:[e.jsx(Re,{children:e.jsx(Se,{})}),e.jsx(Me,{style:{zIndex:o.Z_INDEX_ABOVE_DOCK},children:Object.keys(t).map(x=>e.jsx(ae,{value:x,children:m(x,r)},x))})]}),r!=="en"&&e.jsx("div",{className:"tw:pt-3",children:e.jsx(o.Label,{className:"tw:font-normal tw:text-muted-foreground",children:B.formatReplacementString(w,{fallbackLanguages:(a==null?void 0:a.length)>0?a.map(x=>m(x,r)).join(", "):t.en.autonym})})})]})}const Ml=Object.freeze(["%firstRun_language_search_placeholder%","%firstRun_language_noResults%","%firstRun_language_selected%"]);function _n(t){return t.normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase()}function Dl(t,r){if(!r)return t;const a=_n(r);return t.filter(({keywords:n})=>n.some(i=>i.includes(a)))}function Il(t){return[...t].sort(([r,a],[n,i])=>r==="en"&&n!=="en"?-1:n==="en"&&r!=="en"?1:a.autonym.localeCompare(i.autonym))}function Ol({languages:t,value:r,onChange:a,localizedStrings:n,className:i,id:l}){const[c,d]=s.useState(""),[u,w]=s.useState(),p=s.useRef(null),h=s.useRef(null),g=s.useRef(new Map),[m,x]=s.useState(),y=s.useMemo(()=>Il(Object.entries(t)).map(([R,O])=>({tag:R,info:O,keywords:[O.autonym,...Object.values(O.uiNames??{}),...O.otherNames??[]].map(_n)})),[t]),f=s.useMemo(()=>Dl(y,c),[y,c]),E=s.useMemo(()=>{var O;const R=I=>!!I&&f.some(S=>S.tag===I);return R(u)?u:R(r)?r:((O=f[0])==null?void 0:O.tag)??""},[u,r,f]),k=y.length>1;s.useLayoutEffect(()=>{var R;x((R=h.current)==null?void 0:R.id)},[]),s.useLayoutEffect(()=>{const R=g.current.get(E),O=k?p.current:void 0;O&&(R?O.setAttribute("aria-activedescendant",R.id):O.removeAttribute("aria-activedescendant")),R&&E!==u&&R.scrollIntoView({block:"nearest"})},[E,u,k]);const N=n["%firstRun_language_search_placeholder%"]??"",C=n["%firstRun_language_noResults%"]??"",A=n["%firstRun_language_selected%"]??"";return e.jsxs(o.Command,{id:l,className:o.cn("pr-twp",i),shouldFilter:!1,value:E,onValueChange:w,children:[k&&e.jsx("div",{"data-slot":"command-input-wrapper",className:"tw:p-1 tw:pb-0",children:e.jsxs(o.InputGroup,{className:"tw:h-8! tw:rounded-lg! tw:border-input/30 tw:bg-input/30 tw:shadow-none! tw:*:data-[slot=input-group-addon]:ps-2!",children:[e.jsx("input",{ref:p,"data-slot":"command-input",type:"text",role:"combobox","aria-expanded":!0,"aria-controls":m,"aria-autocomplete":"list",placeholder:N,"aria-label":N,value:c,onChange:R=>{d(R.currentTarget.value),w(void 0)},className:"tw:w-full tw:text-sm tw:outline-hidden tw:disabled:cursor-not-allowed tw:disabled:opacity-50"}),e.jsx(o.InputGroupAddon,{children:e.jsx(Rt.IconSearch,{className:"tw:size-4 tw:shrink-0 tw:opacity-50"})})]})}),e.jsxs(o.CommandList,{ref:h,children:[e.jsx(o.CommandEmpty,{children:C}),f.map(({tag:R,info:O})=>{const I=R===r;return e.jsxs(o.CommandItem,{ref:S=>{S?g.current.set(R,S):g.current.delete(R)},value:R,"aria-current":I?"true":void 0,"data-checked":I?"true":void 0,onSelect:()=>a(R),children:[e.jsx("span",{dir:"auto",children:O.autonym}),I&&e.jsx("span",{className:"tw:sr-only",children:A})]},R)})]})]})}function Pl({item:t,createLabel:r,createComplexLabel:a}){return r?e.jsx(o.Label,{children:r(t)}):a?e.jsx(o.Label,{children:a(t)}):e.jsx(o.Label,{children:t})}function jn({id:t,className:r,listItems:a,selectedListItems:n,handleSelectListItem:i,createLabel:l,createComplexLabel:c}){return e.jsx("div",{id:t,className:r,children:a.map(d=>e.jsxs("div",{className:"tw:m-2 tw:flex tw:items-center",children:[e.jsx(ha,{className:"tw:me-2 tw:align-middle",checked:n.includes(d),onCheckedChange:u=>i(d,u)}),e.jsx(Pl,{item:d,createLabel:l,createComplexLabel:c})]},d))})}const Al=jn;function Ll(t,r){const[a,n]=s.useState(t),[i,l]=s.useState(r);return t!==a&&(n(t),t&&l(r)),t?r:i}function Bl({open:t,anchorRect:r,message:a,confirmingKeyLabel:n,side:i="bottom",align:l="start",showArrow:c=!0}){const d=t?B.formatReplacementStringToArray(a,{key:n}).join(""):"",{anchorRect:u,message:w,confirmingKeyLabel:p,showArrow:h}=Ll(t,{anchorRect:r,message:a,confirmingKeyLabel:n,showArrow:c});return e.jsxs(o.TooltipProvider,{children:[e.jsx("span",{role:"status",className:"tw:sr-only",children:d}),e.jsxs(o.Tooltip,{open:t,onOpenChange:()=>{},children:[e.jsx(o.TooltipTrigger,{"aria-hidden":"true",tabIndex:-1,className:o.cn("tw:absolute tw:opacity-0 tw:pointer-events-none","tw:p-0 tw:border-0 tw:bg-transparent tw:cursor-default tw:min-w-0 tw:min-h-0"),style:{top:u.top,left:u.left,width:u.width,height:u.height}}),e.jsx(o.TooltipContent,{side:i,align:l,showArrow:h,arrowPadding:8,className:o.cn("tw:p-0 tw:has-data-[slot=kbd]:pe-0 tw:bg-background tw:text-destructive tw:border tw:border-destructive"),arrowClassName:"tw:bg-[color-mix(in_oklab,var(--destructive)_10%,var(--background))] tw:fill-[color-mix(in_oklab,var(--destructive)_10%,var(--background))] tw:border tw:border-destructive",children:e.jsx("div",{className:"tw:w-full tw:h-full tw:rounded-md tw:bg-destructive/10 tw:px-3 tw:py-1.5",children:B.formatReplacementStringToArray(w,{key:e.jsx(o.Kbd,{className:o.cn("tw:border tw:border-destructive tw:in-data-[slot=tooltip-content]:text-destructive","tw:align-middle"),children:p})}).map((g,m)=>e.jsx(s.Fragment,{children:g},`key-${m}`))})})]})]})}function zl({cardKey:t,isSelected:r,onSelect:a,isDenied:n,isHidden:i=!1,className:l,children:c,selectedButtons:d,hoverButtons:u,dropdownContent:w,additionalContent:p,accentColor:h,showDropdownOnHover:g=!1}){const m=f=>{if(f.key==="Enter"||f.key===" "){if(f.target!==f.currentTarget)return;f.preventDefault(),a()}},[x,y]=s.useState(!1);return e.jsxs("div",{hidden:i,onClick:a,onKeyDown:m,onMouseEnter:()=>y(!0),onFocus:()=>y(!0),role:"button",tabIndex:0,"aria-pressed":r,className:o.cn("tw:group tw:relative tw:min-w-36 tw:rounded-xl tw:border tw:shadow-none tw:hover:bg-muted/50",{"tw:opacity-50 tw:hover:opacity-100":n&&!r},{"tw:bg-accent":r},{"tw:bg-transparent":!r},l),children:[e.jsxs("div",{className:"tw:flex tw:flex-col tw:gap-2 tw:p-4",children:[e.jsxs("div",{className:"tw:flex tw:justify-between tw:overflow-hidden",children:[e.jsx("div",{className:"tw:min-w-0 tw:flex-1",children:c}),r&&d,!r&&u&&e.jsx("div",{className:"tw:invisible tw:group-hover:visible",children:u}),w&&(r||g&&x)&&e.jsx("div",{className:o.cn(!r&&g&&"tw:invisible tw:group-hover:visible"),children:e.jsxs(o.DropdownMenu,{children:[e.jsx(o.DropdownMenuTrigger,{className:o.cn(h&&"tw:me-1"),asChild:!0,children:e.jsx(o.Button,{className:"tw:m-1 tw:h-6 tw:w-6",variant:"ghost",size:"icon",onClick:f=>f.stopPropagation(),onFocus:f=>f.stopPropagation(),children:e.jsx($.MoreVertical,{})})}),e.jsx(o.DropdownMenuContent,{align:"end",children:w})]})})]}),p&&e.jsx("div",{className:"tw:w-fit tw:min-w-0 tw:max-w-full tw:overflow-hidden",children:p})]}),h&&e.jsx("div",{className:`tw:absolute tw:right-0 tw:top-0 tw:h-full tw:w-2 tw:rounded-r-xl ${h}`})]},t)}function Vl({id:t,isDisabled:r=!1,hasError:a=!1,isFullWidth:n=!1,helperText:i,label:l,placeholder:c,isRequired:d=!1,className:u,defaultValue:w,value:p,onChange:h,onFocus:g,onBlur:m}){return e.jsxs("div",{className:o.cn("tw:inline-grid tw:items-center tw:gap-1.5",{"tw:w-full":n}),children:[e.jsx(o.Label,{htmlFor:t,className:o.cn({"tw:text-red-600":a,"tw:hidden":!l}),children:`${l}${d?"*":""}`}),e.jsx(o.Input,{id:t,disabled:r,placeholder:c,required:d,className:o.cn(u,{"tw:border-red-600":a}),defaultValue:w,value:p,onChange:h,onFocus:g,onBlur:m}),e.jsx("p",{className:o.cn({"tw:hidden":!i}),children:i})]})}function $l({currentStep:t,totalSteps:r,locale:a}){const n=a||"en",i=s.useMemo(()=>{const d=new B.NumberFormat(n);return u=>d.format(u)},[n]),l=Math.min(Math.max(t,1),r),c=Array.from({length:r},(d,u)=>u+1);return e.jsx("div",{className:"tw:flex tw:items-center","aria-hidden":"true",children:c.map(d=>{let u="upcoming";return d===l?u="active":d1&&e.jsx("div",{className:"tw:h-px tw:flex-1 tw:bg-border"}),e.jsx("div",{"data-state":u,className:o.cn("tw:flex tw:h-8 tw:w-8 tw:shrink-0 tw:items-center tw:justify-center tw:rounded-full tw:text-sm tw:font-medium",u==="active"&&"tw:bg-primary tw:text-primary-foreground",u==="complete"&&"tw:bg-muted tw:text-muted-foreground",u==="upcoming"&&"tw:border tw:border-input tw:text-muted-foreground"),children:u==="complete"?e.jsx($.Check,{className:"tw:h-4 tw:w-4"}):i(d)})]},d)})})}function Fl({...t}){return e.jsx(G.ContextMenu.Root,{"data-slot":"context-menu",...t})}function Ul({className:t,...r}){return e.jsx(G.ContextMenu.Trigger,{"data-slot":"context-menu-trigger",className:o.cn("tw:select-none",t),...r})}function Gl({...t}){return e.jsx(G.ContextMenu.Group,{"data-slot":"context-menu-group",...t})}function Kl({...t}){return e.jsx(G.ContextMenu.Portal,{"data-slot":"context-menu-portal",...t})}function Hl({...t}){return e.jsx(G.ContextMenu.Sub,{"data-slot":"context-menu-sub",...t})}function ql({...t}){return e.jsx(G.ContextMenu.RadioGroup,{"data-slot":"context-menu-radio-group",...t})}function Yl({className:t,style:r,...a}){return e.jsx(G.ContextMenu.Portal,{children:e.jsx(G.ContextMenu.Content,{"data-slot":"context-menu-content",className:o.cn("pr-twp tw:max-h-(--radix-context-menu-content-available-height) tw:min-w-36 tw:origin-(--radix-context-menu-content-transform-origin) tw:overflow-x-hidden tw:overflow-y-auto tw:rounded-lg tw:bg-popover tw:p-1 tw:text-popover-foreground tw:shadow-md tw:ring-1 tw:ring-foreground/10 tw:duration-100 tw:data-[side=bottom]:slide-in-from-top-2 tw:data-[side=left]:slide-in-from-right-2 tw:data-[side=right]:slide-in-from-left-2 tw:data-[side=top]:slide-in-from-bottom-2 tw:data-open:animate-in tw:data-open:fade-in-0 tw:data-open:zoom-in-95 tw:data-closed:animate-out tw:data-closed:fade-out-0 tw:data-closed:zoom-out-95 tw:animate-none! tw:**:data-[slot$=-item]:focus:bg-foreground/10 tw:**:data-[slot$=-item]:data-highlighted:bg-foreground/10 tw:**:data-[slot$=-separator]:bg-foreground/5 tw:**:data-[slot$=-trigger]:focus:bg-foreground/10 tw:**:data-[slot$=-trigger]:aria-expanded:bg-foreground/10! tw:**:data-[variant=destructive]:focus:bg-foreground/10! tw:**:data-[variant=destructive]:text-accent-foreground! tw:**:data-[variant=destructive]:**:text-accent-foreground! tw:relative",t),style:{zIndex:o.Z_INDEX_ABOVE_DOCK,...r},...a})})}function Zl({className:t,inset:r,variant:a="default",...n}){return e.jsx(G.ContextMenu.Item,{"data-slot":"context-menu-item","data-inset":r,"data-variant":a,className:o.cn("pr-twp tw:group/context-menu-item tw:relative tw:flex tw:cursor-default tw:items-center tw:gap-1.5 tw:rounded-md tw:px-1.5 tw:py-1 tw:text-sm tw:outline-hidden tw:select-none tw:focus:bg-accent tw:focus:text-accent-foreground tw:data-inset:ps-7 tw:data-[variant=destructive]:text-destructive tw:data-[variant=destructive]:focus:bg-destructive/10 tw:data-[variant=destructive]:focus:text-destructive tw:dark:data-[variant=destructive]:focus:bg-destructive/20 tw:data-disabled:pointer-events-none tw:data-disabled:opacity-50 tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0 tw:[&_svg:not([class*=size-])]:size-4 tw:focus:*:[svg]:text-accent-foreground tw:data-[variant=destructive]:*:[svg]:text-destructive",t),...n})}function Xl({className:t,inset:r,children:a,...n}){return e.jsxs(G.ContextMenu.SubTrigger,{"data-slot":"context-menu-sub-trigger","data-inset":r,className:o.cn("pr-twp tw:flex tw:cursor-default tw:items-center tw:gap-1.5 tw:rounded-md tw:px-1.5 tw:py-1 tw:text-sm tw:outline-hidden tw:select-none tw:focus:bg-accent tw:focus:text-accent-foreground tw:data-inset:ps-7 tw:data-open:bg-accent tw:data-open:text-accent-foreground tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0 tw:[&_svg:not([class*=size-])]:size-4",t),...n,children:[a,e.jsx(Rt.IconChevronRight,{className:"tw:ms-auto"})]})}function Wl({className:t,style:r,...a}){return e.jsx(G.ContextMenu.SubContent,{"data-slot":"context-menu-sub-content",className:o.cn("pr-twp tw:min-w-32 tw:origin-(--radix-context-menu-content-transform-origin) tw:overflow-hidden tw:rounded-lg tw:bg-popover tw:p-1 tw:text-popover-foreground tw:shadow-lg tw:ring-1 tw:ring-foreground/10 tw:duration-100 tw:data-[side=bottom]:slide-in-from-top-2 tw:data-[side=left]:slide-in-from-right-2 tw:data-[side=right]:slide-in-from-left-2 tw:data-[side=top]:slide-in-from-bottom-2 tw:data-open:animate-in tw:data-open:fade-in-0 tw:data-open:zoom-in-95 tw:data-closed:animate-out tw:data-closed:fade-out-0 tw:data-closed:zoom-out-95 tw:animate-none! tw:**:data-[slot$=-item]:focus:bg-foreground/10 tw:**:data-[slot$=-item]:data-highlighted:bg-foreground/10 tw:**:data-[slot$=-separator]:bg-foreground/5 tw:**:data-[slot$=-trigger]:focus:bg-foreground/10 tw:**:data-[slot$=-trigger]:aria-expanded:bg-foreground/10! tw:**:data-[variant=destructive]:focus:bg-foreground/10! tw:**:data-[variant=destructive]:text-accent-foreground! tw:**:data-[variant=destructive]:**:text-accent-foreground! tw:relative",t),style:{zIndex:o.Z_INDEX_ABOVE_DOCK,...r},...a})}function Jl({className:t,children:r,checked:a,inset:n,...i}){return e.jsxs(G.ContextMenu.CheckboxItem,{"data-slot":"context-menu-checkbox-item","data-inset":n,className:o.cn("pr-twp tw:relative tw:flex tw:cursor-default tw:items-center tw:gap-1.5 tw:rounded-md tw:py-1 tw:pe-8 tw:ps-1.5 tw:text-sm tw:outline-hidden tw:select-none tw:focus:bg-accent tw:focus:text-accent-foreground tw:data-inset:ps-7 tw:data-disabled:pointer-events-none tw:data-disabled:opacity-50 tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0 tw:[&_svg:not([class*=size-])]:size-4",t),checked:a,...i,children:[e.jsx("span",{className:"tw:pointer-events-none tw:absolute tw:end-2",children:e.jsx(G.ContextMenu.ItemIndicator,{children:e.jsx(Rt.IconCheck,{})})}),r]})}function Ql({className:t,children:r,inset:a,...n}){return e.jsxs(G.ContextMenu.RadioItem,{"data-slot":"context-menu-radio-item","data-inset":a,className:o.cn("pr-twp tw:relative tw:flex tw:cursor-default tw:items-center tw:gap-1.5 tw:rounded-md tw:py-1 tw:pe-8 tw:ps-1.5 tw:text-sm tw:outline-hidden tw:select-none tw:focus:bg-accent tw:focus:text-accent-foreground tw:data-inset:ps-7 tw:data-disabled:pointer-events-none tw:data-disabled:opacity-50 tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0 tw:[&_svg:not([class*=size-])]:size-4",t),...n,children:[e.jsx("span",{className:"tw:pointer-events-none tw:absolute tw:end-2",children:e.jsx(G.ContextMenu.ItemIndicator,{children:e.jsx(Rt.IconCheck,{})})}),r]})}function td({className:t,inset:r,...a}){return e.jsx(G.ContextMenu.Label,{"data-slot":"context-menu-label","data-inset":r,className:o.cn("pr-twp tw:px-1.5 tw:py-1 tw:text-xs tw:font-medium tw:text-muted-foreground tw:data-inset:ps-7",t),...a})}function ed({className:t,...r}){return e.jsx(G.ContextMenu.Separator,{"data-slot":"context-menu-separator",className:o.cn("pr-twp tw:-mx-1 tw:my-1 tw:h-px tw:bg-border",t),...r})}function rd({className:t,...r}){return e.jsx("span",{"data-slot":"context-menu-shortcut",className:o.cn("pr-twp tw:[unicode-bidi:plaintext] tw:ms-auto tw:text-xs tw:tracking-widest tw:text-muted-foreground tw:group-focus/context-menu-item:text-accent-foreground",t),...r})}function ad({...t}){return e.jsx(_e.Drawer.Root,{"data-slot":"drawer",...t})}function od({...t}){return e.jsx(_e.Drawer.Trigger,{"data-slot":"drawer-trigger",...t})}function Cn({...t}){return e.jsx(_e.Drawer.Portal,{"data-slot":"drawer-portal",...t})}function nd({...t}){return e.jsx(_e.Drawer.Close,{"data-slot":"drawer-close",...t})}function Nn({className:t,...r}){return e.jsx(_e.Drawer.Overlay,{"data-slot":"drawer-overlay",className:o.cn("pr-twp tw:fixed tw:inset-0 tw:z-50 tw:bg-black/10 tw:supports-backdrop-filter:backdrop-blur-xs tw:data-open:animate-in tw:data-open:fade-in-0 tw:data-closed:animate-out tw:data-closed:fade-out-0",t),...r})}function id({className:t,children:r,hideDrawerHandle:a=!1,...n}){const i=o.readDirection();return e.jsxs(Cn,{"data-slot":"drawer-portal",children:[e.jsx(Nn,{}),e.jsxs(_e.Drawer.Content,{"data-slot":"drawer-content",className:o.cn("pr-twp tw:group/drawer-content tw:fixed tw:z-50 tw:flex tw:h-auto tw:flex-col tw:bg-popover tw:text-sm tw:text-popover-foreground tw:data-[vaul-drawer-direction=bottom]:inset-x-0 tw:data-[vaul-drawer-direction=bottom]:bottom-0 tw:data-[vaul-drawer-direction=bottom]:mt-24 tw:data-[vaul-drawer-direction=bottom]:max-h-[80vh] tw:data-[vaul-drawer-direction=bottom]:rounded-t-xl tw:data-[vaul-drawer-direction=bottom]:border-t tw:data-[vaul-drawer-direction=left]:inset-y-0 tw:data-[vaul-drawer-direction=left]:left-0 tw:data-[vaul-drawer-direction=left]:w-3/4 tw:data-[vaul-drawer-direction=left]:rounded-r-xl tw:data-[vaul-drawer-direction=left]:border-r tw:data-[vaul-drawer-direction=left]:flex-row tw:data-[vaul-drawer-direction=right]:inset-y-0 tw:data-[vaul-drawer-direction=right]:right-0 tw:data-[vaul-drawer-direction=right]:w-3/4 tw:data-[vaul-drawer-direction=right]:rounded-l-xl tw:data-[vaul-drawer-direction=right]:border-l tw:data-[vaul-drawer-direction=right]:flex-row tw:data-[vaul-drawer-direction=top]:inset-x-0 tw:data-[vaul-drawer-direction=top]:top-0 tw:data-[vaul-drawer-direction=top]:mb-24 tw:data-[vaul-drawer-direction=top]:max-h-[80vh] tw:data-[vaul-drawer-direction=top]:rounded-b-xl tw:data-[vaul-drawer-direction=top]:border-b tw:data-[vaul-drawer-direction=left]:sm:max-w-sm tw:data-[vaul-drawer-direction=right]:sm:max-w-sm",t),dir:"ltr",...n,children:[!a&&e.jsx("div",{className:"tw:hidden tw:shrink-0 tw:rounded-full tw:bg-muted tw:group-data-[vaul-drawer-direction=bottom]/drawer-content:mx-auto tw:group-data-[vaul-drawer-direction=bottom]/drawer-content:mt-4 tw:group-data-[vaul-drawer-direction=bottom]/drawer-content:h-1.5 tw:group-data-[vaul-drawer-direction=bottom]/drawer-content:w-[100px] tw:group-data-[vaul-drawer-direction=bottom]/drawer-content:block tw:group-data-[vaul-drawer-direction=right]/drawer-content:my-auto tw:group-data-[vaul-drawer-direction=right]/drawer-content:ms-4 tw:group-data-[vaul-drawer-direction=right]/drawer-content:h-[100px] tw:group-data-[vaul-drawer-direction=right]/drawer-content:w-1.5 tw:group-data-[vaul-drawer-direction=right]/drawer-content:block"}),e.jsx("div",{className:"tw:flex tw:min-w-0 tw:flex-1 tw:flex-col",dir:i,children:r}),!a&&e.jsx("div",{className:"tw:hidden tw:shrink-0 tw:rounded-full tw:bg-muted tw:group-data-[vaul-drawer-direction=top]/drawer-content:mx-auto tw:group-data-[vaul-drawer-direction=top]/drawer-content:mb-4 tw:group-data-[vaul-drawer-direction=top]/drawer-content:h-1.5 tw:group-data-[vaul-drawer-direction=top]/drawer-content:w-[100px] tw:group-data-[vaul-drawer-direction=top]/drawer-content:block tw:group-data-[vaul-drawer-direction=left]/drawer-content:my-auto tw:group-data-[vaul-drawer-direction=left]/drawer-content:me-4 tw:group-data-[vaul-drawer-direction=left]/drawer-content:h-[100px] tw:group-data-[vaul-drawer-direction=left]/drawer-content:w-1.5 tw:group-data-[vaul-drawer-direction=left]/drawer-content:block"})]})]})}function sd({className:t,...r}){return e.jsx("div",{"data-slot":"drawer-header",className:o.cn("pr-twp tw:flex tw:flex-col tw:gap-0.5 tw:p-4 tw:group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center tw:group-data-[vaul-drawer-direction=top]/drawer-content:text-center tw:md:gap-0.5 tw:md:text-start",t),...r})}function cd({className:t,...r}){return e.jsx("div",{"data-slot":"drawer-footer",className:o.cn("pr-twp tw:mt-auto tw:flex tw:flex-col tw:gap-2 tw:p-4",t),...r})}function ld({className:t,...r}){return e.jsx(_e.Drawer.Title,{"data-slot":"drawer-title",className:o.cn("pr-twp tw:font-heading tw:text-base tw:font-medium tw:text-foreground",t),...r})}function dd({className:t,...r}){return e.jsx(_e.Drawer.Description,{"data-slot":"drawer-description",className:o.cn("pr-twp tw:text-sm tw:text-muted-foreground",t),...r})}function wd({className:t,value:r,...a}){return e.jsx(G.Progress.Root,{"data-slot":"progress",className:o.cn("pr-twp tw:relative tw:flex tw:h-1 tw:w-full tw:items-center tw:overflow-x-hidden tw:rounded-full tw:bg-muted",t),...a,children:e.jsx(G.Progress.Indicator,{"data-slot":"progress-indicator",className:"tw:size-full tw:flex-1 tw:bg-primary tw:transition-all",style:{transform:`translateX(-${100-(r||0)}%)`}})})}function ud({...t}){const{theme:r="system"}=Pn.useTheme(),a=r==="light"||r==="dark"||r==="system"?r:"system",n={"--normal-bg":"var(--popover)","--normal-text":"var(--popover-foreground)","--normal-border":"var(--border)","--border-radius":"var(--radius)"};return e.jsx(Za.Toaster,{theme:a,className:"tw:toaster tw:group",icons:{success:e.jsx(Rt.IconCircleCheck,{className:"tw:size-4"}),info:e.jsx(Rt.IconInfoCircle,{className:"tw:size-4"}),warning:e.jsx(Rt.IconAlertTriangle,{className:"tw:size-4"}),error:e.jsx(Rt.IconAlertOctagon,{className:"tw:size-4"}),loading:e.jsx(Rt.IconLoader,{className:"tw:size-4 tw:animate-spin"})},style:n,toastOptions:{classNames:{toast:"cn-toast"}},...t})}function pd({className:t,defaultValue:r,value:a,min:n=0,max:i=100,...l}){const c=o.readDirection(),d=s.useMemo(()=>Array.isArray(a)?a:Array.isArray(r)?r:[n,i],[a,r,n,i]);return e.jsxs(G.Slider.Root,{"data-slot":"slider",defaultValue:r,value:a,min:n,max:i,className:o.cn("pr-twp tw:relative tw:flex tw:w-full tw:touch-none tw:items-center tw:select-none tw:data-disabled:opacity-50 tw:data-vertical:h-full tw:data-vertical:min-h-40 tw:data-vertical:w-auto tw:data-vertical:flex-col",t),dir:c,...l,children:[e.jsx(G.Slider.Track,{"data-slot":"slider-track",className:"tw:relative tw:grow tw:overflow-hidden tw:rounded-full tw:bg-muted tw:data-horizontal:h-1 tw:data-horizontal:w-full tw:data-vertical:h-full tw:data-vertical:w-1",children:e.jsx(G.Slider.Range,{"data-slot":"slider-range",className:"tw:absolute tw:bg-primary tw:select-none tw:data-horizontal:h-full tw:data-vertical:w-full"})}),Array.from({length:d.length},(u,w)=>e.jsx(G.Slider.Thumb,{"data-slot":"slider-thumb",className:"tw:relative tw:block tw:size-3 tw:shrink-0 tw:rounded-full tw:border tw:border-ring tw:bg-white tw:ring-ring/50 tw:transition-[color,box-shadow] tw:select-none tw:after:absolute tw:after:-inset-2 tw:hover:ring-3 tw:focus-visible:ring-3 tw:focus-visible:outline-hidden tw:active:ring-3 tw:disabled:pointer-events-none tw:disabled:opacity-50"},w))]})}function hd({className:t,size:r="default",...a}){return e.jsx(G.Switch.Root,{"data-slot":"switch","data-size":r,className:o.cn("tw:peer pr-twp tw:group/switch tw:relative tw:inline-flex tw:shrink-0 tw:items-center tw:rounded-full tw:border tw:border-transparent tw:transition-all tw:outline-none tw:after:absolute tw:after:-inset-x-3 tw:after:-inset-y-2 tw:focus-visible:border-ring tw:focus-visible:ring-3 tw:focus-visible:ring-ring/50 tw:aria-invalid:border-destructive tw:aria-invalid:ring-3 tw:aria-invalid:ring-destructive/20 tw:data-[size=default]:h-[18.4px] tw:data-[size=default]:w-[32px] tw:data-[size=sm]:h-[14px] tw:data-[size=sm]:w-[24px] tw:dark:aria-invalid:border-destructive/50 tw:dark:aria-invalid:ring-destructive/40 tw:data-checked:bg-primary tw:data-unchecked:bg-input tw:dark:data-unchecked:bg-input/80 tw:data-disabled:cursor-not-allowed tw:data-disabled:opacity-50",t),...a,children:e.jsx(G.Switch.Thumb,{"data-slot":"switch-thumb",className:"tw:pointer-events-none tw:block tw:rounded-full tw:bg-background tw:ring-0 tw:transition-transform tw:group-data-[size=default]/switch:size-4 tw:group-data-[size=sm]/switch:size-3 tw:group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] tw:rtl:group-data-[size=default]/switch:data-checked:-translate-x-[calc(100%-2px)] tw:group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] tw:rtl:group-data-[size=sm]/switch:data-checked:-translate-x-[calc(100%-2px)] tw:dark:data-checked:bg-primary-foreground tw:group-data-[size=default]/switch:data-unchecked:translate-x-0 tw:rtl:group-data-[size=default]/switch:data-unchecked:-translate-x-0 tw:group-data-[size=sm]/switch:data-unchecked:translate-x-0 tw:rtl:group-data-[size=sm]/switch:data-unchecked:-translate-x-0 tw:dark:data-unchecked:bg-foreground"})})}function gd({className:t,orientation:r="horizontal",...a}){return e.jsx(G.Tabs.Root,{"data-slot":"tabs","data-orientation":r,className:o.cn("tw:group/tabs tw:flex tw:gap-2 tw:data-horizontal:flex-col",t),...a})}const fd=Ya.cva("tw:group/tabs-list tw:inline-flex tw:w-fit tw:items-center tw:justify-center tw:rounded-lg tw:p-[3px] tw:text-muted-foreground tw:group-data-horizontal/tabs:h-8 tw:group-data-vertical/tabs:h-fit tw:group-data-vertical/tabs:flex-col tw:data-[variant=line]:rounded-none",{variants:{variant:{default:"tw:bg-muted",line:"tw:gap-1 tw:bg-transparent"}},defaultVariants:{variant:"default"}});function md({className:t,variant:r="default",...a}){const n=o.readDirection();return e.jsx(G.Tabs.List,{"data-slot":"tabs-list","data-variant":r,className:o.cn("pr-twp",fd({variant:r}),t),dir:n,...a})}function vd({className:t,...r}){return e.jsx(G.Tabs.Trigger,{"data-slot":"tabs-trigger",className:o.cn("pr-twp tw:relative tw:inline-flex tw:h-[calc(100%-1px)] tw:flex-1 tw:items-center tw:justify-center tw:gap-1.5 tw:rounded-md tw:border tw:border-transparent tw:px-1.5 tw:py-0.5 tw:text-sm tw:font-medium tw:whitespace-nowrap tw:text-foreground/60 tw:transition-all tw:group-data-vertical/tabs:w-full tw:group-data-vertical/tabs:justify-start tw:hover:text-foreground tw:focus-visible:border-ring tw:focus-visible:ring-[3px] tw:focus-visible:ring-ring/50 tw:focus-visible:outline-1 tw:focus-visible:outline-ring tw:disabled:pointer-events-none tw:disabled:opacity-50 tw:has-data-[icon=inline-end]:pe-1 tw:has-data-[icon=inline-start]:ps-1 tw:dark:text-muted-foreground tw:dark:hover:text-foreground tw:group-data-[variant=default]/tabs-list:data-active:shadow-sm tw:group-data-[variant=line]/tabs-list:data-active:shadow-none tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0 tw:[&_svg:not([class*=size-])]:size-4","tw:group-data-[variant=line]/tabs-list:bg-transparent tw:group-data-[variant=line]/tabs-list:data-active:bg-transparent tw:dark:group-data-[variant=line]/tabs-list:data-active:border-transparent tw:dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent","tw:data-active:bg-background tw:data-active:text-foreground tw:dark:data-active:border-input tw:dark:data-active:bg-input/30 tw:dark:data-active:text-foreground","tw:after:absolute tw:after:bg-foreground tw:after:opacity-0 tw:after:transition-opacity tw:group-data-horizontal/tabs:after:inset-x-0 tw:group-data-horizontal/tabs:after:bottom-[-5px] tw:group-data-horizontal/tabs:after:h-0.5 tw:group-data-vertical/tabs:after:inset-y-0 tw:group-data-vertical/tabs:after:-end-1 tw:group-data-vertical/tabs:after:w-0.5 tw:group-data-[variant=line]/tabs-list:data-active:after:opacity-100",t),...r})}function bd({className:t,...r}){return e.jsx(G.Tabs.Content,{"data-slot":"tabs-content",className:o.cn("pr-twp tw:flex-1 tw:text-sm tw:outline-none",t),...r})}const xd=(t,r)=>{s.useEffect(()=>{if(!t)return;let a=!1;const i=t(l=>{a||r(l)});return()=>{a=!0;try{i()}catch(l){console.error("useEvent: error while unsubscribing from event",l)}}},[t,r])},yd=(t,r)=>{s.useEffect(()=>{if(!t)return;let a=!1,n,i=!1;const l=d=>{a||r(d)},c=()=>{if(i||!n)return;i=!0;const d=n;(async()=>{try{await d()}catch(u){console.error("useEventAsync: error while unsubscribing from event",u)}})()};return(async()=>{try{n=await Promise.resolve(t(l)),a&&c()}catch(d){console.error("useEventAsync: error while subscribing to event",d)}})(),()=>{a=!0,c()}},[t,r])};function kd(t){return{preserveValue:!0,...t}}const En=(t,r,a={})=>{const n=s.useRef(r);n.current=r;const i=s.useRef(a);i.current=kd(i.current);const[l,c]=s.useState(()=>n.current),[d,u]=s.useState(!0);return s.useEffect(()=>{let w=!0;return u(!!t),(async()=>{if(t)try{const p=await t();w&&(c(()=>p),u(!1))}catch(p){w&&u(!1),console.error("usePromise: the promise factory rejected, so there is no new value",p)}})(),()=>{w=!1,i.current.preserveValue||c(()=>n.current)}},[t]),[l,d]},_d=t=>{const[r,a]=s.useState(!1),[n,i]=s.useState(!1),[l,c]=s.useState(0),d=s.useRef(void 0),u=s.useMemo(()=>{if(!t)return;const g=async()=>{try{const m=await t();return d.current===g&&(a(!1),i(!0)),m}catch(m){throw d.current===g&&(a(!0),i(!0)),m}};return g},[t,l]);s.useEffect(()=>{d.current=u,a(!1),i(!u)},[u]);const[w,p]=En(u,void 0),h=s.useCallback(()=>{d.current&&(a(!1),i(!1),c(g=>g+1))},[]);return s.useMemo(()=>({data:w,isLoading:p,hasError:r,hasSettled:n,refetch:h}),[w,p,r,n,h])};function jd(t){s.useEffect(()=>{let r;return t&&(r=document.createElement("style"),r.appendChild(document.createTextNode(t)),document.head.appendChild(r)),()=>{r&&document.head.removeChild(r)}},[t])}function Cd(t){const r=s.useMemo(()=>B.collectUsjMarkers(t).slice().sort().join(" "),[t]);return s.useMemo(()=>r?r.split(" "):[],[r])}const Tn=()=>{const[t,r]=s.useState(()=>document.body.getBoundingClientRect().height>0);return s.useEffect(()=>{const a=new IntersectionObserver(n=>{const i=n[n.length-1];i&&r(i.isIntersecting)});return a.observe(document.body),()=>{a.disconnect()}},[]),t};function Nd(t,r){const[a,n]=s.useState(!1),i=s.useRef(r);i.current=r;const l=s.useRef(t);l.current=t;const c=s.useCallback(()=>{l.current?i.current():n(!0)},[]);return s.useEffect(()=>{!t||!a||(n(!1),i.current())},[t,a]),c}function Sn(t,r,a){return t?a.dark:r===void 0?a.lightDefault:a.lightUnselected}function Ed(t,r){const a=Tn();return Sn(t,a,r)}function Td({value:t,children:r}){return e.jsx(ea.Provider,{value:t,children:e.jsx(Je.Provider,{value:t,children:r})})}const Sd=300;exports.Alert=o.Alert;exports.AlertDescription=o.AlertDescription;exports.AlertTitle=o.AlertTitle;exports.Badge=o.Badge;exports.Button=o.Button;exports.ButtonGroup=o.ButtonGroup;exports.ButtonGroupSeparator=o.ButtonGroupSeparator;exports.ButtonGroupText=o.ButtonGroupText;exports.CONTENT_ZOOM_CSS_VARIABLE_PREFIX=o.CONTENT_ZOOM_CSS_VARIABLE_PREFIX;exports.CONTENT_ZOOM_DEFAULT_CSS_VARIABLE=o.CONTENT_ZOOM_DEFAULT_CSS_VARIABLE;exports.CONTENT_ZOOM_POPUP_ATTRIBUTE=o.CONTENT_ZOOM_POPUP_ATTRIBUTE;exports.CONTENT_ZOOM_ROOT_ATTRIBUTE=o.CONTENT_ZOOM_ROOT_ATTRIBUTE;exports.Command=o.Command;exports.CommandEmpty=o.CommandEmpty;exports.CommandGroup=o.CommandGroup;exports.CommandInput=o.CommandInput;exports.CommandItem=o.CommandItem;exports.CommandList=o.CommandList;exports.ContentZoomAreaProvider=o.ContentZoomAreaProvider;exports.Dialog=o.Dialog;exports.DialogClose=o.DialogClose;exports.DialogContent=o.DialogContent;exports.DialogDescription=o.DialogDescription;exports.DialogFooter=o.DialogFooter;exports.DialogHeader=o.DialogHeader;exports.DialogOverlay=o.DialogOverlay;exports.DialogPortal=o.DialogPortal;exports.DialogTitle=o.DialogTitle;exports.DialogTrigger=o.DialogTrigger;exports.DropdownMenu=o.DropdownMenu;exports.DropdownMenuCheckboxItem=o.DropdownMenuCheckboxItem;exports.DropdownMenuContent=o.DropdownMenuContent;exports.DropdownMenuGroup=o.DropdownMenuGroup;exports.DropdownMenuItem=o.DropdownMenuItem;exports.DropdownMenuLabel=o.DropdownMenuLabel;exports.DropdownMenuPortal=o.DropdownMenuPortal;exports.DropdownMenuRadioGroup=o.DropdownMenuRadioGroup;exports.DropdownMenuRadioItem=o.DropdownMenuRadioItem;exports.DropdownMenuSeparator=o.DropdownMenuSeparator;exports.DropdownMenuShortcut=o.DropdownMenuShortcut;exports.DropdownMenuSub=o.DropdownMenuSub;exports.DropdownMenuSubContent=o.DropdownMenuSubContent;exports.DropdownMenuSubTrigger=o.DropdownMenuSubTrigger;exports.DropdownMenuTrigger=o.DropdownMenuTrigger;exports.Empty=o.Empty;exports.EmptyContent=o.EmptyContent;exports.EmptyDescription=o.EmptyDescription;exports.EmptyHeader=o.EmptyHeader;exports.EmptyMedia=o.EmptyMedia;exports.EmptyState=o.EmptyState;exports.EmptyTitle=o.EmptyTitle;exports.Input=o.Input;exports.Kbd=o.Kbd;exports.KbdGroup=o.KbdGroup;exports.Label=o.Label;exports.MAIN_CONTENT_ZOOM_AREA_ID=o.MAIN_CONTENT_ZOOM_AREA_ID;exports.MultiSelectComboBox=o.MultiSelectComboBox;exports.Popover=o.Popover;exports.PopoverAnchor=o.PopoverAnchor;exports.PopoverContent=o.PopoverContent;exports.PopoverDescription=o.PopoverDescription;exports.PopoverHeader=o.PopoverHeader;exports.PopoverPortalContainerProvider=o.PopoverPortalContainerProvider;exports.PopoverTitle=o.PopoverTitle;exports.PopoverTrigger=o.PopoverTrigger;exports.RadioGroup=o.RadioGroup;exports.RadioGroupItem=o.RadioGroupItem;exports.ResizableHandle=o.ResizableHandle;exports.ResizablePanel=o.ResizablePanel;exports.ResizablePanelGroup=o.ResizablePanelGroup;exports.RetryableErrorView=o.RetryableErrorView;exports.SearchBar=o.SearchBar;exports.Separator=o.Separator;exports.Skeleton=o.Skeleton;exports.Spinner=o.Spinner;exports.Table=o.Table;exports.TableBody=o.TableBody;exports.TableCaption=o.TableCaption;exports.TableCell=o.TableCell;exports.TableFooter=o.TableFooter;exports.TableHead=o.TableHead;exports.TableHeader=o.TableHeader;exports.TableRow=o.TableRow;exports.ToggleGroup=o.ToggleGroup;exports.ToggleGroupItem=o.ToggleGroupItem;exports.Tooltip=o.Tooltip;exports.TooltipContent=o.TooltipContent;exports.TooltipProvider=o.TooltipProvider;exports.TooltipTrigger=o.TooltipTrigger;exports.Z_INDEX_ABOVE_DOCK=o.Z_INDEX_ABOVE_DOCK;exports.Z_INDEX_ABOVE_POPOVER=o.Z_INDEX_ABOVE_POPOVER;exports.Z_INDEX_CONNECTION_LOST=o.Z_INDEX_CONNECTION_LOST;exports.Z_INDEX_FIRST_RUN=o.Z_INDEX_FIRST_RUN;exports.Z_INDEX_MODAL=o.Z_INDEX_MODAL;exports.Z_INDEX_MODAL_BACKDROP=o.Z_INDEX_MODAL_BACKDROP;exports.Z_INDEX_NESTED_MODAL=o.Z_INDEX_NESTED_MODAL;exports.Z_INDEX_NESTED_MODAL_BACKDROP=o.Z_INDEX_NESTED_MODAL_BACKDROP;exports.Z_INDEX_ONBOARDING_TOUR=o.Z_INDEX_ONBOARDING_TOUR;exports.Z_INDEX_OVERLAY=o.Z_INDEX_OVERLAY;exports.badgeVariants=o.badgeVariants;exports.buttonGroupVariants=o.buttonGroupVariants;exports.buttonVariants=o.buttonVariants;exports.cn=o.cn;exports.isMacOs=o.isMacOs;exports.isWindows=o.isWindows;exports.useContentZoomArea=o.useContentZoomArea;exports.useListbox=o.useListbox;exports.useTruncationTooltip=o.useTruncationTooltip;Object.defineProperty(exports,"sonner",{enumerable:!0,get:()=>Za.toast});exports.Avatar=Mo;exports.AvatarFallback=Do;exports.AvatarImage=Ss;exports.BOOK_CHAPTER_CONTROL_STRING_KEYS=Qn;exports.BOOK_SELECTOR_STRING_KEYS=ei;exports.BookChapterControl=gr;exports.BookSelector=ri;exports.CANCEL_ACCEPT_BUTTONS_STRING_KEYS=da;exports.COMMENT_EDITOR_STRING_KEYS=ks;exports.COMMENT_LIST_ELEMENT_ID=To;exports.COMMENT_LIST_STRING_KEYS=_s;exports.CONFLICT_NOTE_STRING_KEYS=vs;exports.CancelAcceptButtons=wa;exports.Card=So;exports.CardContent=Ro;exports.CardDescription=Es;exports.CardFooter=Ts;exports.CardHeader=Cs;exports.CardTitle=Ns;exports.ChapterRangeSelector=ro;exports.Checkbox=ha;exports.CheckboxGroup=Al;exports.Checklist=jn;exports.ComboBox=qr;exports.CommentEditor=ys;exports.CommentList=Bs;exports.ConflictNoteCard=Po;exports.ContentZoomRoot=Ao;exports.ContextMenu=Fl;exports.ContextMenuCheckboxItem=Jl;exports.ContextMenuContent=Yl;exports.ContextMenuGroup=Gl;exports.ContextMenuItem=Zl;exports.ContextMenuLabel=td;exports.ContextMenuPortal=Kl;exports.ContextMenuRadioGroup=ql;exports.ContextMenuRadioItem=Ql;exports.ContextMenuSeparator=ed;exports.ContextMenuShortcut=rd;exports.ContextMenuSub=Hl;exports.ContextMenuSubContent=Wl;exports.ContextMenuSubTrigger=Xl;exports.ContextMenuTrigger=Ul;exports.DataTable=Vo;exports.DestructiveKeyConfirmation=Bl;exports.DisabledActionTooltip=pn;exports.DisabledTooltipWrapper=Ue;exports.Drawer=ad;exports.DrawerClose=nd;exports.DrawerContent=id;exports.DrawerDescription=dd;exports.DrawerFooter=cd;exports.DrawerHeader=sd;exports.DrawerOverlay=Nn;exports.DrawerPortal=Cn;exports.DrawerTitle=ld;exports.DrawerTrigger=od;exports.DropdownMenuItemType=Uo;exports.ERROR_DUMP_STRING_KEYS=$o;exports.ERROR_POPOVER_STRING_KEYS=Gs;exports.EditorKeyboardShortcuts=Ho;exports.ErrorDump=Fo;exports.ErrorPopover=Ks;exports.FOOTNOTE_EDITOR_STRING_KEYS=dc;exports.Filter=Xs;exports.FilterDropdown=Hs;exports.Footer=Zs;exports.FootnoteEditor=lc;exports.FootnoteItem=Qo;exports.FootnoteList=pc;exports.INTERFACE_LANGUAGE_PICKER_STRING_KEYS=Ml;exports.INVENTORY_STRING_KEYS=jc;exports.InterfaceLanguagePicker=Ol;exports.Inventory=Ec;exports.MARKER_MENU_STRING_KEYS=Xo;exports.MarkdownRenderer=Us;exports.MarkerMenu=Wo;exports.MoreInfo=qs;exports.NavigationContentSearch=pl;exports.Progress=wd;exports.RecentSearches=to;exports.ResultsCard=zl;exports.SCOPE_SELECTOR_STRING_KEYS=tl;exports.SELECT_BOOKS_STRING_KEYS=gn;exports.SHRINK_STEP=ze;exports.ScopeSelector=rl;exports.ScriptureResultsViewer=Jc;exports.ScrollGroupSelector=al;exports.Select=Te;exports.SelectBooks=hn;exports.SelectBooksPicker=un;exports.SelectContent=Me;exports.SelectGroup=Lo;exports.SelectItem=ae;exports.SelectLabel=Vs;exports.SelectScrollDownButton=zo;exports.SelectScrollUpButton=Bo;exports.SelectSeparator=$s;exports.SelectTrigger=Re;exports.SelectValue=Se;exports.SettingsList=ol;exports.SettingsListHeader=il;exports.SettingsListItem=nl;exports.SettingsSidebar=dn;exports.SettingsSidebarContentSearch=Gc;exports.ShrinkStepContext=Je;exports.ShrinkStepOverride=Td;exports.ShrinkStepOverrideContext=ea;exports.Sidebar=an;exports.SidebarContent=nn;exports.SidebarFooter=Oc;exports.SidebarGroup=Jr;exports.SidebarGroupAction=Ac;exports.SidebarGroupContent=ta;exports.SidebarGroupLabel=Qr;exports.SidebarHeader=Ic;exports.SidebarInput=Dc;exports.SidebarInset=on;exports.SidebarMenu=sn;exports.SidebarMenuAction=Bc;exports.SidebarMenuBadge=zc;exports.SidebarMenuButton=ln;exports.SidebarMenuItem=cn;exports.SidebarMenuSkeleton=Vc;exports.SidebarMenuSub=$c;exports.SidebarMenuSubButton=Uc;exports.SidebarMenuSubItem=Fc;exports.SidebarProvider=rn;exports.SidebarRail=Mc;exports.SidebarSeparator=Pc;exports.SidebarTrigger=Rc;exports.Slider=pd;exports.Sonner=ud;exports.Switch=hd;exports.TOOLTIP_DELAY_MS=Sd;exports.TabDropdownMenu=Nr;exports.TabFloatingMenu=ul;exports.TabToolbar=wl;exports.Tabs=gd;exports.TabsContent=bd;exports.TabsList=md;exports.TabsTrigger=vd;exports.TextField=Vl;exports.Textarea=An;exports.Toolbar=Tl;exports.ToolbarCompoundLabel=Qa;exports.UNDO_REDO_BUTTONS_STRING_KEYS=Go;exports.UiLanguageSelector=Rl;exports.UndoRedoButtons=Ko;exports.VerticalTabs=fa;exports.VerticalTabsContent=va;exports.VerticalTabsList=ma;exports.VerticalTabsTrigger=yn;exports.WizardStepper=$l;exports.getBookIdFromUSFM=_c;exports.getCommentThreadElementId=js;exports.getInventoryHeader=Qe;exports.getLinesFromUSFM=yc;exports.getNumberFromUSFM=kc;exports.getStatusForItem=tn;exports.getToolbarOSReservedSpaceClassName=El;exports.inventoryCountColumn=bc;exports.inventoryItemColumn=mc;exports.inventoryStatusColumn=xc;exports.isCommentDraftEmpty=Wr;exports.leftEdgeRect=Zo;exports.localizeOrFallback=Zt;exports.markerMenuItemToPaletteItem=Jo;exports.measureElement=Ws;exports.measureRange=Yo;exports.pickTabIconUrl=Sn;exports.useEvent=xd;exports.useEventAsync=yd;exports.useExtraValidMarkers=Cd;exports.useLivePopoverAnchor=qo;exports.usePromise=En;exports.useRecentSearches=Fn;exports.useRetryablePromise=_d;exports.useRunWhenVisible=Nd;exports.useShrinkStep=ga;exports.useShrinkStepOverride=ra;exports.useShrinkStepValue=Wa;exports.useSidebar=tr;exports.useStylesheet=jd;exports.useTabIconSelection=Ed;exports.useViewVisibility=Tn;function Rd(t,r="top"){if(!t||typeof document>"u")return;const a=document.head||document.querySelector("head"),n=a.querySelector(":first-child"),i=document.createElement("style");i.appendChild(document.createTextNode(t)),r==="top"&&n?a.insertBefore(i,n):a.appendChild(i)}Rd(`/* By default the editor is too tall for the footnote editor, even while empty, so this makes it shorter. */ .footnote-editor .editor-input { min-height: 75px; @@ -154,6 +154,6 @@ list-style-type: disclosure-open; } /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--tw-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--tw-color-red-100:oklch(93.6% .032 17.717);--tw-color-red-200:oklch(88.5% .062 18.334);--tw-color-red-300:oklch(80.8% .114 19.571);--tw-color-red-400:oklch(70.4% .191 22.216);--tw-color-red-500:oklch(63.7% .237 25.331);--tw-color-red-600:oklch(57.7% .245 27.325);--tw-color-red-700:oklch(50.5% .213 27.518);--tw-color-red-800:oklch(44.4% .177 26.899);--tw-color-orange-100:oklch(95.4% .038 75.164);--tw-color-orange-800:oklch(47% .157 37.304);--tw-color-amber-200:oklch(92.4% .12 95.746);--tw-color-amber-400:oklch(82.8% .189 84.429);--tw-color-amber-500:oklch(76.9% .188 70.08);--tw-color-amber-600:oklch(66.6% .179 58.318);--tw-color-yellow-50:oklch(98.7% .026 102.212);--tw-color-yellow-100:oklch(97.3% .071 103.193);--tw-color-yellow-400:oklch(85.2% .199 91.936);--tw-color-yellow-500:oklch(79.5% .184 86.047);--tw-color-yellow-600:oklch(68.1% .162 75.834);--tw-color-yellow-700:oklch(55.4% .135 66.442);--tw-color-green-50:oklch(98.2% .018 155.826);--tw-color-green-100:oklch(96.2% .044 156.743);--tw-color-green-500:oklch(72.3% .219 149.579);--tw-color-green-600:oklch(62.7% .194 149.214);--tw-color-green-700:oklch(52.7% .154 150.069);--tw-color-green-800:oklch(44.8% .119 151.328);--tw-color-teal-400:oklch(77.7% .152 181.912);--tw-color-teal-500:oklch(70.4% .14 182.503);--tw-color-teal-600:oklch(60% .118 184.704);--tw-color-sky-400:oklch(74.6% .16 232.661);--tw-color-sky-500:oklch(68.5% .169 237.323);--tw-color-sky-600:oklch(58.8% .158 241.966);--tw-color-blue-50:oklch(97% .014 254.604);--tw-color-blue-100:oklch(93.2% .032 255.585);--tw-color-blue-400:oklch(70.7% .165 254.624);--tw-color-blue-500:oklch(62.3% .214 259.815);--tw-color-blue-600:oklch(54.6% .245 262.881);--tw-color-blue-800:oklch(42.4% .199 265.638);--tw-color-indigo-200:oklch(87% .065 274.039);--tw-color-purple-50:oklch(97.7% .014 308.299);--tw-color-purple-200:oklch(90.2% .063 306.703);--tw-color-purple-900:oklch(38.1% .176 304.987);--tw-color-rose-400:oklch(71.2% .194 13.428);--tw-color-rose-500:oklch(64.5% .246 16.439);--tw-color-rose-600:oklch(58.6% .253 17.585);--tw-color-slate-300:oklch(86.9% .022 252.894);--tw-color-slate-400:oklch(70.4% .04 256.788);--tw-color-slate-900:oklch(20.8% .042 265.755);--tw-color-gray-50:oklch(98.5% .002 247.839);--tw-color-gray-100:oklch(96.7% .003 264.542);--tw-color-gray-300:oklch(87.2% .01 258.338);--tw-color-gray-500:oklch(55.1% .027 264.364);--tw-color-gray-600:oklch(44.6% .03 256.802);--tw-color-gray-700:oklch(37.3% .034 259.733);--tw-color-gray-800:oklch(27.8% .033 256.848);--tw-color-zinc-400:oklch(70.5% .015 286.067);--tw-color-neutral-300:oklch(87% 0 0);--tw-color-black:#000;--tw-color-white:#fff;--tw-container-xs:20rem;--tw-container-sm:24rem;--tw-container-md:28rem;--tw-container-lg:32rem;--tw-container-2xl:42rem;--tw-container-3xl:48rem;--tw-container-4xl:56rem;--tw-container-6xl:72rem;--tw-text-xs:.75rem;--tw-text-xs--line-height:calc(1 / .75);--tw-text-sm:.875rem;--tw-text-sm--line-height:calc(1.25 / .875);--tw-text-base:1rem;--tw-text-base--line-height:calc(1.5 / 1);--tw-text-lg:1.125rem;--tw-text-lg--line-height:calc(1.75 / 1.125);--tw-text-xl:1.25rem;--tw-text-xl--line-height:calc(1.75 / 1.25);--tw-text-2xl:1.5rem;--tw-text-2xl--line-height:calc(2 / 1.5);--tw-text-3xl:1.875rem;--tw-text-3xl--line-height:calc(2.25 / 1.875);--tw-text-4xl:2.25rem;--tw-text-4xl--line-height:calc(2.5 / 2.25);--tw-text-5xl:3rem;--tw-text-5xl--line-height:1;--tw-font-weight-normal:400;--tw-font-weight-medium:500;--tw-font-weight-semibold:600;--tw-font-weight-bold:700;--tw-font-weight-extrabold:800;--tw-tracking-tight:-.025em;--tw-tracking-wider:.05em;--tw-tracking-widest:.1em;--tw-leading-tight:1.25;--tw-leading-snug:1.375;--tw-leading-relaxed:1.625;--tw-leading-loose:2;--tw-radius-xs:.125rem;--tw-radius-md:calc(var(--radius) * .8);--tw-drop-shadow-sm:0 1px 2px #00000026;--tw-animate-spin:spin 1s linear infinite;--tw-animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--tw-blur-xs:4px;--tw-default-transition-duration:.15s;--tw-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--tw-default-font-family:"IBM Plex Sans Variable", sans-serif;--tw-default-mono-font-family:var(--tw-font-mono)}}@layer base{.pr-twp,.pr-twp *{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.pr-twp,.pr-twp *{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body.pr-twp{background-color:var(--background);color:var(--foreground)}html.pr-twp{font-family:IBM Plex Sans Variable,sans-serif}:where(.pr-twp,.pr-twp *),:where(.pr-twp,.pr-twp *):after,:where(.pr-twp,.pr-twp *):before,:where(.pr-twp,.pr-twp *) ::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}:where(.pr-twp,.pr-twp *) ::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}.pr-twp{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--tw-default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--tw-default-font-feature-settings,normal);font-variation-settings:var(--tw-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr:where(.pr-twp,.pr-twp *){height:0;color:inherit;border-top-width:1px}abbr:where([title]):where(.pr-twp,.pr-twp *){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1:where(.pr-twp,.pr-twp *),h2:where(.pr-twp,.pr-twp *),h3:where(.pr-twp,.pr-twp *),h4:where(.pr-twp,.pr-twp *),h5:where(.pr-twp,.pr-twp *),h6:where(.pr-twp,.pr-twp *){font-size:inherit;font-weight:inherit}a:where(.pr-twp,.pr-twp *){color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b:where(.pr-twp,.pr-twp *),strong:where(.pr-twp,.pr-twp *){font-weight:bolder}code:where(.pr-twp,.pr-twp *),kbd:where(.pr-twp,.pr-twp *),samp:where(.pr-twp,.pr-twp *),pre:where(.pr-twp,.pr-twp *){font-family:var(--tw-default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--tw-default-mono-font-feature-settings,normal);font-variation-settings:var(--tw-default-mono-font-variation-settings,normal);font-size:1em}small:where(.pr-twp,.pr-twp *){font-size:80%}sub:where(.pr-twp,.pr-twp *),sup:where(.pr-twp,.pr-twp *){vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub:where(.pr-twp,.pr-twp *){bottom:-.25em}sup:where(.pr-twp,.pr-twp *){top:-.5em}table:where(.pr-twp,.pr-twp *){text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(.pr-twp,.pr-twp *){outline:auto}progress:where(.pr-twp,.pr-twp *){vertical-align:baseline}summary:where(.pr-twp,.pr-twp *){display:list-item}ol:where(.pr-twp,.pr-twp *),ul:where(.pr-twp,.pr-twp *),menu:where(.pr-twp,.pr-twp *){list-style:none}img:where(.pr-twp,.pr-twp *),svg:where(.pr-twp,.pr-twp *),video:where(.pr-twp,.pr-twp *),canvas:where(.pr-twp,.pr-twp *),audio:where(.pr-twp,.pr-twp *),iframe:where(.pr-twp,.pr-twp *),embed:where(.pr-twp,.pr-twp *),object:where(.pr-twp,.pr-twp *){vertical-align:middle;display:block}img:where(.pr-twp,.pr-twp *),video:where(.pr-twp,.pr-twp *){max-width:100%;height:auto}button:where(.pr-twp,.pr-twp *),input:where(.pr-twp,.pr-twp *),select:where(.pr-twp,.pr-twp *),optgroup:where(.pr-twp,.pr-twp *),textarea:where(.pr-twp,.pr-twp *){font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(.pr-twp,.pr-twp *) ::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup:where(.pr-twp,.pr-twp *){font-weight:bolder}:where(select:is([multiple],[size])) optgroup option:where(.pr-twp,.pr-twp *){padding-inline-start:20px}:where(.pr-twp,.pr-twp *) ::file-selector-button{margin-inline-end:4px}:where(.pr-twp,.pr-twp *) ::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){:where(.pr-twp,.pr-twp *) ::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){:where(.pr-twp,.pr-twp *) ::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea:where(.pr-twp,.pr-twp *){resize:vertical}:where(.pr-twp,.pr-twp *) ::-webkit-search-decoration{-webkit-appearance:none}:where(.pr-twp,.pr-twp *) ::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit{display:inline-flex}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-fields-wrapper{padding:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-year-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-month-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-day-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-hour-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-minute-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-second-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-millisecond-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-meridiem-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid:where(.pr-twp,.pr-twp *){box-shadow:none}button:where(.pr-twp,.pr-twp *),input:where([type=button],[type=reset],[type=submit]):where(.pr-twp,.pr-twp *){appearance:button}:where(.pr-twp,.pr-twp *) ::file-selector-button{appearance:button}:where(.pr-twp,.pr-twp *) ::-webkit-inner-spin-button{height:auto}:where(.pr-twp,.pr-twp *) ::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])):where(.pr-twp,.pr-twp *){display:none!important}}@layer components;@layer utilities{.tw\\:\\@container\\/card-header{container:card-header/inline-size}.tw\\:\\@container\\/search{container:search/inline-size}.tw\\:\\@container\\/toolbar{container:toolbar/inline-size}.tw\\:pointer-events-auto{pointer-events:auto}.tw\\:pointer-events-none{pointer-events:none}.tw\\:invisible{visibility:hidden}.tw\\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.tw\\:absolute{position:absolute}.tw\\:fixed{position:fixed}.tw\\:relative{position:relative}.tw\\:sticky{position:sticky}.tw\\:inset-0{inset:calc(calc(var(--spacing)) * 0)}.tw\\:inset-y-0{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:inset-s-3{inset-inline-start:calc(calc(var(--spacing)) * 3)}.tw\\:start-1\\.5{inset-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:start-1\\/2{inset-inline-start:50%}.tw\\:end-0{inset-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:end-1{inset-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:end-2{inset-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:end-3{inset-inline-end:calc(calc(var(--spacing)) * 3)}.tw\\:inset-e-0{inset-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:-top-\\[1px\\]{top:-1px}.tw\\:top-0{top:calc(calc(var(--spacing)) * 0)}.tw\\:top-1{top:calc(calc(var(--spacing)) * 1)}.tw\\:top-1\\.5{top:calc(calc(var(--spacing)) * 1.5)}.tw\\:top-1\\/2{top:50%}.tw\\:top-1\\/3{top:33.3333%}.tw\\:top-2{top:calc(calc(var(--spacing)) * 2)}.tw\\:top-2\\.5{top:calc(calc(var(--spacing)) * 2.5)}.tw\\:top-3\\.5{top:calc(calc(var(--spacing)) * 3.5)}.tw\\:top-\\[-1px\\]{top:-1px}.tw\\:top-full{top:100%}.tw\\:-right-1{right:calc(calc(var(--spacing)) * -1)}.tw\\:right-0{right:calc(calc(var(--spacing)) * 0)}.tw\\:right-1{right:calc(calc(var(--spacing)) * 1)}.tw\\:right-3{right:calc(calc(var(--spacing)) * 3)}.tw\\:bottom-0{bottom:calc(calc(var(--spacing)) * 0)}.tw\\:-left-\\[1px\\]{left:-1px}.tw\\:left-0{left:calc(calc(var(--spacing)) * 0)}.tw\\:left-1\\/2{left:50%}.tw\\:left-2{left:calc(calc(var(--spacing)) * 2)}.tw\\:left-3{left:calc(calc(var(--spacing)) * 3)}.tw\\:isolate{isolation:isolate}.tw\\:z-10{z-index:10}.tw\\:z-20{z-index:20}.tw\\:z-50{z-index:50}.tw\\:order-first{order:-9999}.tw\\:order-last{order:9999}.tw\\:col-span-1{grid-column:span 1/span 1}.tw\\:col-span-2{grid-column:span 2/span 2}.tw\\:col-span-3{grid-column:span 3/span 3}.tw\\:col-start-1{grid-column-start:1}.tw\\:col-start-2{grid-column-start:2}.tw\\:row-span-2{grid-row:span 2/span 2}.tw\\:row-start-1{grid-row-start:1}.tw\\:row-start-2{grid-row-start:2}.tw\\:m-0{margin:calc(calc(var(--spacing)) * 0)}.tw\\:m-1{margin:calc(calc(var(--spacing)) * 1)}.tw\\:m-2{margin:calc(calc(var(--spacing)) * 2)}.tw\\:-mx-1{margin-inline:calc(calc(var(--spacing)) * -1)}.tw\\:-mx-4{margin-inline:calc(calc(var(--spacing)) * -4)}.tw\\:mx-0{margin-inline:calc(calc(var(--spacing)) * 0)}.tw\\:mx-1{margin-inline:calc(calc(var(--spacing)) * 1)}.tw\\:mx-2{margin-inline:calc(calc(var(--spacing)) * 2)}.tw\\:mx-3\\.5{margin-inline:calc(calc(var(--spacing)) * 3.5)}.tw\\:mx-4{margin-inline:calc(calc(var(--spacing)) * 4)}.tw\\:mx-8{margin-inline:calc(calc(var(--spacing)) * 8)}.tw\\:my-1{margin-block:calc(calc(var(--spacing)) * 1)}.tw\\:my-2\\.5{margin-block:calc(calc(var(--spacing)) * 2.5)}.tw\\:my-4{margin-block:calc(calc(var(--spacing)) * 4)}.tw\\:my-auto{margin-block:auto}.tw\\:ms-1{margin-inline-start:calc(calc(var(--spacing)) * 1)}.tw\\:ms-2{margin-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:ms-5{margin-inline-start:calc(calc(var(--spacing)) * 5)}.tw\\:ms-6{margin-inline-start:calc(calc(var(--spacing)) * 6)}.tw\\:ms-auto{margin-inline-start:auto}.tw\\:me-1{margin-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:me-2{margin-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:prose{color:var(--tw-prose-body);max-width:65ch}.tw\\:prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.tw\\:prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);margin-top:1.2em;margin-bottom:1.2em;font-size:1.25em;line-height:1.6}.tw\\:prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.tw\\:prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.tw\\:prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:decimal}.tw\\:prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.tw\\:prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.tw\\:prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.tw\\:prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.tw\\:prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.tw\\:prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.tw\\:prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.tw\\:prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.tw\\:prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.tw\\:prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:disc}.tw\\:prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.tw\\:prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.tw\\:prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.25em;font-weight:600}.tw\\:prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.tw\\:prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;font-style:italic;font-weight:500}.tw\\:prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.tw\\:prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.tw\\:prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:0;margin-bottom:.888889em;font-size:2.25em;font-weight:800;line-height:1.11111}.tw\\:prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.tw\\:prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:2em;margin-bottom:1em;font-size:1.5em;font-weight:700;line-height:1.33333}.tw\\:prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.tw\\:prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.6em;margin-bottom:.6em;font-size:1.25em;font-weight:600;line-height:1.6}.tw\\:prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.tw\\:prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.5}.tw\\:prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.tw\\:prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em;display:block}.tw\\:prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-kbd);box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%), 0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%);padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;border-radius:.3125rem;padding-inline-start:.375em;font-family:inherit;font-size:.875em;font-weight:500}.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"\`"}.tw\\:prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.tw\\:prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.tw\\:prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);padding-top:.857143em;padding-inline-end:1.14286em;padding-bottom:.857143em;border-radius:.375rem;margin-top:1.71429em;margin-bottom:1.71429em;padding-inline-start:1.14286em;font-size:.875em;font-weight:400;line-height:1.71429;overflow-x:auto}.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit;background-color:#0000;border-width:0;border-radius:0;padding:0}.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.tw\\:prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){table-layout:auto;width:100%;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.71429}.tw\\:prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.tw\\:prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);vertical-align:bottom;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em;font-weight:600}.tw\\:prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.tw\\:prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.tw\\:prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.tw\\:prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.tw\\:prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.tw\\:prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.tw\\:prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);margin-top:.857143em;font-size:.875em;line-height:1.42857}.tw\\:prose{--tw-prose-body:var(--foreground);--tw-prose-headings:var(--foreground);--tw-prose-lead:var(--muted-foreground);--tw-prose-links:var(--primary);--tw-prose-bold:var(--foreground);--tw-prose-counters:var(--muted-foreground);--tw-prose-bullets:var(--muted-foreground);--tw-prose-hr:var(--border);--tw-prose-quotes:var(--foreground);--tw-prose-quote-borders:var(--border);--tw-prose-captions:var(--muted-foreground);--tw-prose-kbd:oklch(21% .034 264.665);--tw-prose-kbd-shadows:NaN NaN NaN;--tw-prose-code:var(--foreground);--tw-prose-pre-code:var(--muted-foreground);--tw-prose-pre-bg:var(--muted);--tw-prose-th-borders:var(--border);--tw-prose-td-borders:var(--border);--tw-prose-invert-body:var(--foreground);--tw-prose-invert-headings:var(--foreground);--tw-prose-invert-lead:var(--muted-foreground);--tw-prose-invert-links:var(--primary);--tw-prose-invert-bold:var(--foreground);--tw-prose-invert-counters:var(--muted-foreground);--tw-prose-invert-bullets:var(--muted-foreground);--tw-prose-invert-hr:var(--border);--tw-prose-invert-quotes:var(--foreground);--tw-prose-invert-quote-borders:var(--border);--tw-prose-invert-captions:var(--muted-foreground);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:var(--foreground);--tw-prose-invert-pre-code:var(--muted-foreground);--tw-prose-invert-pre-bg:var(--muted);--tw-prose-invert-th-borders:var(--border);--tw-prose-invert-td-borders:var(--border);font-size:1rem;line-height:1.75}.tw\\:prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.tw\\:prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.tw\\:prose :where(.tw\\:prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.tw\\:prose :where(.tw\\:prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.tw\\:prose :where(.tw\\:prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.tw\\:prose :where(.tw\\:prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.tw\\:prose :where(.tw\\:prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.tw\\:prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.tw\\:prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.tw\\:prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.tw\\:prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.571429em;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em}.tw\\:prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(.tw\\:prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose :where(.tw\\:prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.tw\\:prose-sm{font-size:.875rem;line-height:1.71429}.tw\\:prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.tw\\:prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.888889em;margin-bottom:.888889em;font-size:1.28571em;line-height:1.55556}.tw\\:prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.33333em;margin-bottom:1.33333em;padding-inline-start:1.11111em}.tw\\:prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:.8em;font-size:2.14286em;line-height:1.2}.tw\\:prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6em;margin-bottom:.8em;font-size:1.42857em;line-height:1.4}.tw\\:prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.55556em;margin-bottom:.444444em;font-size:1.28571em;line-height:1.55556}.tw\\:prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.42857em;margin-bottom:.571429em;line-height:1.42857}.tw\\:prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.142857em;padding-inline-end:.357143em;padding-bottom:.142857em;border-radius:.3125rem;padding-inline-start:.357143em;font-size:.857143em}.tw\\:prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em}.tw\\:prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.tw\\:prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.888889em}.tw\\:prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;border-radius:.25rem;margin-top:1.66667em;margin-bottom:1.66667em;padding-inline-start:1em;font-size:.857143em;line-height:1.66667}.tw\\:prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em;padding-inline-start:1.57143em}.tw\\:prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;margin-bottom:.285714em}.tw\\:prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.428571em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.tw\\:prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.tw\\:prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.tw\\:prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;padding-inline-start:1.57143em}.tw\\:prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.85714em;margin-bottom:2.85714em}.tw\\:prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em;line-height:1.5}.tw\\:prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.tw\\:prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.tw\\:prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.666667em;font-size:.857143em;line-height:1.33333}.tw\\:prose-sm :where(.tw\\:prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose-sm :where(.tw\\:prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.tw\\:-mt-4{margin-top:calc(calc(var(--spacing)) * -4)}.tw\\:mt-0\\.5{margin-top:calc(calc(var(--spacing)) * .5)}.tw\\:mt-1{margin-top:calc(calc(var(--spacing)) * 1)}.tw\\:mt-2{margin-top:calc(calc(var(--spacing)) * 2)}.tw\\:mt-3{margin-top:calc(calc(var(--spacing)) * 3)}.tw\\:mt-4{margin-top:calc(calc(var(--spacing)) * 4)}.tw\\:mt-6{margin-top:calc(calc(var(--spacing)) * 6)}.tw\\:mt-auto{margin-top:auto}.tw\\:mr-1{margin-right:calc(calc(var(--spacing)) * 1)}.tw\\:mr-2{margin-right:calc(calc(var(--spacing)) * 2)}.tw\\:mr-3{margin-right:calc(calc(var(--spacing)) * 3)}.tw\\:-mb-4{margin-bottom:calc(calc(var(--spacing)) * -4)}.tw\\:mb-1{margin-bottom:calc(calc(var(--spacing)) * 1)}.tw\\:mb-2{margin-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:mb-3{margin-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:mb-4{margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:ml-1{margin-left:calc(calc(var(--spacing)) * 1)}.tw\\:ml-2{margin-left:calc(calc(var(--spacing)) * 2)}.tw\\:ml-4{margin-left:calc(calc(var(--spacing)) * 4)}.tw\\:ml-auto{margin-left:auto}.tw\\:box-border{box-sizing:border-box}.tw\\:line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.tw\\:no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.tw\\:no-scrollbar::-webkit-scrollbar{display:none}.tw\\:block{display:block}.tw\\:flex{display:flex}.tw\\:grid{display:grid}.tw\\:hidden{display:none}.tw\\:inline-block{display:inline-block}.tw\\:inline-flex{display:inline-flex}.tw\\:inline-grid{display:inline-grid}.tw\\:field-sizing-content{field-sizing:content}.tw\\:aspect-square{aspect-ratio:1}.tw\\:size-2{width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:size-2\\.5{width:calc(calc(var(--spacing)) * 2.5);height:calc(calc(var(--spacing)) * 2.5)}.tw\\:size-3{width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:size-3\\.5{width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:size-4{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:size-6{width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:size-7{width:calc(calc(var(--spacing)) * 7);height:calc(calc(var(--spacing)) * 7)}.tw\\:size-8{width:calc(calc(var(--spacing)) * 8);height:calc(calc(var(--spacing)) * 8)}.tw\\:size-9{width:calc(calc(var(--spacing)) * 9);height:calc(calc(var(--spacing)) * 9)}.tw\\:size-10{width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:size-full{width:100%;height:100%}.tw\\:h-1{height:calc(calc(var(--spacing)) * 1)}.tw\\:h-2{height:calc(calc(var(--spacing)) * 2)}.tw\\:h-3{height:calc(calc(var(--spacing)) * 3)}.tw\\:h-3\\.5{height:calc(calc(var(--spacing)) * 3.5)}.tw\\:h-4{height:calc(calc(var(--spacing)) * 4)}.tw\\:h-5{height:calc(calc(var(--spacing)) * 5)}.tw\\:h-6{height:calc(calc(var(--spacing)) * 6)}.tw\\:h-7{height:calc(calc(var(--spacing)) * 7)}.tw\\:h-8{height:calc(calc(var(--spacing)) * 8)}.tw\\:h-8\\!{height:calc(calc(var(--spacing)) * 8)!important}.tw\\:h-8\\.5{height:calc(calc(var(--spacing)) * 8.5)}.tw\\:h-9{height:calc(calc(var(--spacing)) * 9)}.tw\\:h-10{height:calc(calc(var(--spacing)) * 10)}.tw\\:h-12{height:calc(calc(var(--spacing)) * 12)}.tw\\:h-14{height:calc(calc(var(--spacing)) * 14)}.tw\\:h-20{height:calc(calc(var(--spacing)) * 20)}.tw\\:h-24{height:calc(calc(var(--spacing)) * 24)}.tw\\:h-32{height:calc(calc(var(--spacing)) * 32)}.tw\\:h-40{height:calc(calc(var(--spacing)) * 40)}.tw\\:h-64{height:calc(calc(var(--spacing)) * 64)}.tw\\:h-80{height:calc(calc(var(--spacing)) * 80)}.tw\\:h-96{height:calc(calc(var(--spacing)) * 96)}.tw\\:h-\\[5px\\]{height:5px}.tw\\:h-\\[260px\\]{height:260px}.tw\\:h-\\[300px\\]{height:300px}.tw\\:h-\\[400px\\]{height:400px}.tw\\:h-\\[600px\\]{height:600px}.tw\\:h-\\[calc\\(100\\%-1px\\)\\]{height:calc(100% - 1px)}.tw\\:h-\\[calc\\(100\\%-2px\\)\\]{height:calc(100% - 2px)}.tw\\:h-auto{height:auto}.tw\\:h-full{height:100%}.tw\\:h-px{height:1px}.tw\\:h-screen{height:100vh}.tw\\:h-svh{height:100svh}.tw\\:max-h-\\(--radix-context-menu-content-available-height\\){max-height:var(--radix-context-menu-content-available-height)}.tw\\:max-h-\\(--radix-dropdown-menu-content-available-height\\){max-height:var(--radix-dropdown-menu-content-available-height)}.tw\\:max-h-\\(--radix-popover-content-available-height\\){max-height:var(--radix-popover-content-available-height)}.tw\\:max-h-\\(--radix-select-content-available-height\\){max-height:var(--radix-select-content-available-height)}.tw\\:max-h-5{max-height:calc(calc(var(--spacing)) * 5)}.tw\\:max-h-10{max-height:calc(calc(var(--spacing)) * 10)}.tw\\:max-h-72{max-height:calc(calc(var(--spacing)) * 72)}.tw\\:max-h-80{max-height:calc(calc(var(--spacing)) * 80)}.tw\\:max-h-\\[96\\%\\]{max-height:96%}.tw\\:max-h-\\[300px\\]{max-height:300px}.tw\\:min-h-0{min-height:calc(calc(var(--spacing)) * 0)}.tw\\:min-h-11{min-height:calc(calc(var(--spacing)) * 11)}.tw\\:min-h-16{min-height:calc(calc(var(--spacing)) * 16)}.tw\\:min-h-\\[200px\\]{min-height:200px}.tw\\:min-h-full{min-height:100%}.tw\\:min-h-svh{min-height:100svh}.tw\\:w-\\(--radix-dropdown-menu-trigger-width\\){width:var(--radix-dropdown-menu-trigger-width)}.tw\\:w-\\(--sidebar-width\\){width:var(--sidebar-width)}.tw\\:w-1{width:calc(calc(var(--spacing)) * 1)}.tw\\:w-1\\/2{width:50%}.tw\\:w-1\\/4{width:25%}.tw\\:w-1\\/6{width:16.6667%}.tw\\:w-2{width:calc(calc(var(--spacing)) * 2)}.tw\\:w-3{width:calc(calc(var(--spacing)) * 3)}.tw\\:w-3\\.5{width:calc(calc(var(--spacing)) * 3.5)}.tw\\:w-3\\/4{width:75%}.tw\\:w-4{width:calc(calc(var(--spacing)) * 4)}.tw\\:w-4\\/5{width:80%}.tw\\:w-4\\/6{width:66.6667%}.tw\\:w-5{width:calc(calc(var(--spacing)) * 5)}.tw\\:w-5\\/6{width:83.3333%}.tw\\:w-6{width:calc(calc(var(--spacing)) * 6)}.tw\\:w-7{width:calc(calc(var(--spacing)) * 7)}.tw\\:w-8{width:calc(calc(var(--spacing)) * 8)}.tw\\:w-9{width:calc(calc(var(--spacing)) * 9)}.tw\\:w-9\\/12{width:75%}.tw\\:w-10{width:calc(calc(var(--spacing)) * 10)}.tw\\:w-12{width:calc(calc(var(--spacing)) * 12)}.tw\\:w-14{width:calc(calc(var(--spacing)) * 14)}.tw\\:w-20{width:calc(calc(var(--spacing)) * 20)}.tw\\:w-24{width:calc(calc(var(--spacing)) * 24)}.tw\\:w-32{width:calc(calc(var(--spacing)) * 32)}.tw\\:w-48{width:calc(calc(var(--spacing)) * 48)}.tw\\:w-56{width:calc(calc(var(--spacing)) * 56)}.tw\\:w-60{width:calc(calc(var(--spacing)) * 60)}.tw\\:w-64{width:calc(calc(var(--spacing)) * 64)}.tw\\:w-72{width:calc(calc(var(--spacing)) * 72)}.tw\\:w-80{width:calc(calc(var(--spacing)) * 80)}.tw\\:w-96{width:calc(calc(var(--spacing)) * 96)}.tw\\:w-\\[1px\\]{width:1px}.tw\\:w-\\[5px\\]{width:5px}.tw\\:w-\\[70px\\]{width:70px}.tw\\:w-\\[100px\\]{width:100px}.tw\\:w-\\[116px\\]{width:116px}.tw\\:w-\\[124px\\]{width:124px}.tw\\:w-\\[150px\\]{width:150px}.tw\\:w-\\[180px\\]{width:180px}.tw\\:w-\\[200px\\]{width:200px}.tw\\:w-\\[250px\\]{width:250px}.tw\\:w-\\[260px\\]{width:260px}.tw\\:w-\\[280px\\]{width:280px}.tw\\:w-\\[300px\\]{width:300px}.tw\\:w-\\[320px\\]{width:320px}.tw\\:w-\\[350px\\]{width:350px}.tw\\:w-\\[400px\\]{width:400px}.tw\\:w-\\[420px\\]{width:420px}.tw\\:w-\\[500px\\]{width:500px}.tw\\:w-\\[560px\\]{width:560px}.tw\\:w-\\[600px\\]{width:600px}.tw\\:w-\\[calc\\(100\\%-2px\\)\\]{width:calc(100% - 2px)}.tw\\:w-\\[var\\(--radix-dropdown-menu-trigger-width\\)\\]{width:var(--radix-dropdown-menu-trigger-width)}.tw\\:w-auto{width:auto}.tw\\:w-fit{width:fit-content}.tw\\:w-full{width:100%}.tw\\:w-max{width:max-content}.tw\\:w-px{width:1px}.tw\\:max-w-\\(--skeleton-width\\){max-width:var(--skeleton-width)}.tw\\:max-w-0{max-width:calc(calc(var(--spacing)) * 0)}.tw\\:max-w-2xl{max-width:var(--tw-container-2xl)}.tw\\:max-w-3xl{max-width:var(--tw-container-3xl)}.tw\\:max-w-4xl{max-width:var(--tw-container-4xl)}.tw\\:max-w-5{max-width:calc(calc(var(--spacing)) * 5)}.tw\\:max-w-6xl{max-width:var(--tw-container-6xl)}.tw\\:max-w-40{max-width:calc(calc(var(--spacing)) * 40)}.tw\\:max-w-48{max-width:calc(calc(var(--spacing)) * 48)}.tw\\:max-w-64{max-width:calc(calc(var(--spacing)) * 64)}.tw\\:max-w-96{max-width:calc(calc(var(--spacing)) * 96)}.tw\\:max-w-\\[200px\\]{max-width:200px}.tw\\:max-w-\\[220px\\]{max-width:220px}.tw\\:max-w-\\[calc\\(100\\%-2rem\\)\\]{max-width:calc(100% - 2rem)}.tw\\:max-w-\\[calc\\(100vw-2rem\\)\\]{max-width:calc(100vw - 2rem)}.tw\\:max-w-fit{max-width:fit-content}.tw\\:max-w-full{max-width:100%}.tw\\:max-w-lg{max-width:var(--tw-container-lg)}.tw\\:max-w-md{max-width:var(--tw-container-md)}.tw\\:max-w-none{max-width:none}.tw\\:max-w-sm{max-width:var(--tw-container-sm)}.tw\\:max-w-xs{max-width:var(--tw-container-xs)}.tw\\:min-w-0{min-width:calc(calc(var(--spacing)) * 0)}.tw\\:min-w-4{min-width:calc(calc(var(--spacing)) * 4)}.tw\\:min-w-5{min-width:calc(calc(var(--spacing)) * 5)}.tw\\:min-w-7{min-width:calc(calc(var(--spacing)) * 7)}.tw\\:min-w-8{min-width:calc(calc(var(--spacing)) * 8)}.tw\\:min-w-9{min-width:calc(calc(var(--spacing)) * 9)}.tw\\:min-w-16{min-width:calc(calc(var(--spacing)) * 16)}.tw\\:min-w-32{min-width:calc(calc(var(--spacing)) * 32)}.tw\\:min-w-36{min-width:calc(calc(var(--spacing)) * 36)}.tw\\:min-w-80{min-width:calc(calc(var(--spacing)) * 80)}.tw\\:min-w-\\[12rem\\]{min-width:12rem}.tw\\:min-w-\\[26px\\]{min-width:26px}.tw\\:min-w-\\[96px\\]{min-width:96px}.tw\\:min-w-\\[140px\\]{min-width:140px}.tw\\:min-w-\\[215px\\]{min-width:215px}.tw\\:min-w-\\[500px\\]{min-width:500px}.tw\\:min-w-min{min-width:min-content}.tw\\:flex-1{flex:1}.tw\\:shrink{flex-shrink:1}.tw\\:shrink\\!{flex-shrink:1!important}.tw\\:shrink-0{flex-shrink:0}.tw\\:shrink-\\[9999\\]{flex-shrink:9999}.tw\\:flex-grow,.tw\\:grow,.tw\\:grow-\\[1\\]{flex-grow:1}.tw\\:grow-\\[10\\]{flex-grow:10}.tw\\:basis-0{flex-basis:calc(calc(var(--spacing)) * 0)}.tw\\:table-fixed{table-layout:fixed}.tw\\:caption-bottom{caption-side:bottom}.tw\\:border-collapse{border-collapse:collapse}.tw\\:origin-\\(--radix-context-menu-content-transform-origin\\){transform-origin:var(--radix-context-menu-content-transform-origin)}.tw\\:origin-\\(--radix-dropdown-menu-content-transform-origin\\){transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.tw\\:origin-\\(--radix-menubar-content-transform-origin\\){transform-origin:var(--radix-menubar-content-transform-origin)}.tw\\:origin-\\(--radix-popover-content-transform-origin\\){transform-origin:var(--radix-popover-content-transform-origin)}.tw\\:origin-\\(--radix-select-content-transform-origin\\){transform-origin:var(--radix-select-content-transform-origin)}.tw\\:origin-\\(--radix-tooltip-content-transform-origin\\){transform-origin:var(--radix-tooltip-content-transform-origin)}.tw\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-y-0{--tw-translate-y:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-y-px{--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rotate-45{rotate:45deg}.tw\\:rotate-180{rotate:180deg}.tw\\:transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.tw\\:animate-none\\!{animation:none!important}.tw\\:animate-pulse{animation:var(--tw-animate-pulse)}.tw\\:animate-spin{animation:var(--tw-animate-spin)}.tw\\:cursor-default{cursor:default}.tw\\:cursor-ew-resize{cursor:ew-resize}.tw\\:cursor-not-allowed{cursor:not-allowed}.tw\\:cursor-pointer{cursor:pointer}.tw\\:cursor-text{cursor:text}.tw\\:touch-none{touch-action:none}.tw\\:resize{resize:both}.tw\\:resize-none{resize:none}.tw\\:scroll-m-20{scroll-margin:calc(calc(var(--spacing)) * 20)}.tw\\:scroll-my-1{scroll-margin-block:calc(calc(var(--spacing)) * 1)}.tw\\:scroll-py-1{scroll-padding-block:calc(calc(var(--spacing)) * 1)}.tw\\:list-inside{list-style-position:inside}.tw\\:list-outside{list-style-position:outside}.tw\\:\\!list-\\[lower-alpha\\]{list-style-type:lower-alpha!important}.tw\\:\\!list-\\[lower-roman\\]{list-style-type:lower-roman!important}.tw\\:\\!list-\\[upper-alpha\\]{list-style-type:upper-alpha!important}.tw\\:\\!list-\\[upper-roman\\]{list-style-type:upper-roman!important}.tw\\:\\!list-decimal{list-style-type:decimal!important}.tw\\:\\!list-disc{list-style-type:disc!important}.tw\\:list-decimal{list-style-type:decimal}.tw\\:list-disc{list-style-type:disc}.tw\\:list-none{list-style-type:none}.tw\\:grid-flow-col{grid-auto-flow:column}.tw\\:grid-flow-row{grid-auto-flow:row}.tw\\:auto-rows-min{grid-auto-rows:min-content}.tw\\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.tw\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.tw\\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.tw\\:grid-cols-\\[25\\%_25\\%_50\\%\\]{grid-template-columns:25% 25% 50%}.tw\\:grid-cols-\\[25\\%_50\\%_25\\%\\]{grid-template-columns:25% 50% 25%}.tw\\:grid-cols-\\[auto_auto_auto_auto\\]{grid-template-columns:auto auto auto auto}.tw\\:grid-cols-\\[min-content_1fr\\]{grid-template-columns:min-content 1fr}.tw\\:grid-cols-\\[min-content_min-content_1fr\\]{grid-template-columns:min-content min-content 1fr}.tw\\:grid-cols-subgrid{grid-template-columns:subgrid}.tw\\:flex-col{flex-direction:column}.tw\\:flex-col-reverse{flex-direction:column-reverse}.tw\\:flex-row{flex-direction:row}.tw\\:flex-row-reverse{flex-direction:row-reverse}.tw\\:flex-nowrap{flex-wrap:nowrap}.tw\\:flex-wrap{flex-wrap:wrap}.tw\\:place-content-center{place-content:center}.tw\\:content-center{align-content:center}.tw\\:items-baseline{align-items:baseline}.tw\\:items-center{align-items:center}.tw\\:items-end{align-items:flex-end}.tw\\:items-start{align-items:flex-start}.tw\\:items-stretch{align-items:stretch}.tw\\:justify-between{justify-content:space-between}.tw\\:justify-center{justify-content:center}.tw\\:justify-end{justify-content:flex-end}.tw\\:justify-start{justify-content:flex-start}.tw\\:gap-0{gap:calc(calc(var(--spacing)) * 0)}.tw\\:gap-0\\.5{gap:calc(calc(var(--spacing)) * .5)}.tw\\:gap-1{gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-1\\.5{gap:calc(calc(var(--spacing)) * 1.5)}.tw\\:gap-1\\.5\\!{gap:calc(calc(var(--spacing)) * 1.5)!important}.tw\\:gap-2{gap:calc(calc(var(--spacing)) * 2)}.tw\\:gap-2\\.5{gap:calc(calc(var(--spacing)) * 2.5)}.tw\\:gap-3{gap:calc(calc(var(--spacing)) * 3)}.tw\\:gap-4{gap:calc(calc(var(--spacing)) * 4)}.tw\\:gap-5{gap:calc(calc(var(--spacing)) * 5)}.tw\\:gap-6{gap:calc(calc(var(--spacing)) * 6)}.tw\\:gap-8{gap:calc(calc(var(--spacing)) * 8)}.tw\\:gap-16{gap:calc(calc(var(--spacing)) * 16)}.tw\\:gap-\\[--spacing\\(var\\(--gap\\)\\)\\]{gap:calc(calc(var(--spacing)) * var(--gap))}.tw\\:gap-\\[12px\\]{gap:12px}:where(.tw\\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-1\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 8) * calc(1 - var(--tw-space-y-reverse)))}.tw\\:gap-x-1{column-gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-x-2{column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:gap-x-3{column-gap:calc(calc(var(--spacing)) * 3)}.tw\\:gap-x-4{column-gap:calc(calc(var(--spacing)) * 4)}:where(.tw\\:-space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * -2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * -2) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 3) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 3) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 4) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 6) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 6) * calc(1 - var(--tw-space-x-reverse)))}.tw\\:gap-y-1{row-gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-y-2{row-gap:calc(calc(var(--spacing)) * 2)}:where(.tw\\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.tw\\:divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}.tw\\:self-start{align-self:flex-start}.tw\\:self-stretch{align-self:stretch}.tw\\:justify-self-end{justify-self:flex-end}.tw\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tw\\:overflow-auto{overflow:auto}.tw\\:overflow-clip{overflow:clip}.tw\\:overflow-hidden{overflow:hidden}.tw\\:overflow-scroll{overflow:scroll}.tw\\:overflow-visible{overflow:visible}.tw\\:overflow-x-auto{overflow-x:auto}.tw\\:overflow-x-hidden{overflow-x:hidden}.tw\\:overflow-y-auto{overflow-y:auto}.tw\\:overflow-y-hidden{overflow-y:hidden}.tw\\:rounded{border-radius:.25rem}.tw\\:rounded-2xl{border-radius:calc(var(--radius) * 1.8)}.tw\\:rounded-4xl{border-radius:calc(var(--radius) * 2.6)}.tw\\:rounded-\\[4px\\]{border-radius:4px}.tw\\:rounded-\\[6px\\]{border-radius:6px}.tw\\:rounded-\\[calc\\(var\\(--radius\\)-3px\\)\\]{border-radius:calc(var(--radius) - 3px)}.tw\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,10px\\)\\]{border-radius:min(var(--tw-radius-md), 10px)}.tw\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,12px\\)\\]{border-radius:min(var(--tw-radius-md), 12px)}.tw\\:rounded-full{border-radius:3.40282e38px}.tw\\:rounded-lg{border-radius:var(--radius)}.tw\\:rounded-lg\\!{border-radius:var(--radius)!important}.tw\\:rounded-md{border-radius:calc(var(--radius) * .8)}.tw\\:rounded-none{border-radius:0}.tw\\:rounded-sm{border-radius:calc(var(--radius) * .6)}.tw\\:rounded-xl{border-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-xl\\!{border-radius:calc(var(--radius) * 1.4)!important}.tw\\:rounded-xs{border-radius:var(--tw-radius-xs)}.tw\\:rounded-s-none{border-start-start-radius:0;border-end-start-radius:0}.tw\\:rounded-e-none{border-start-end-radius:0;border-end-end-radius:0}.tw\\:rounded-t-xl{border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-l-lg{border-top-left-radius:var(--radius);border-bottom-left-radius:var(--radius)}.tw\\:rounded-r-xl{border-top-right-radius:calc(var(--radius) * 1.4);border-bottom-right-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-b-xl{border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:border{border-style:var(--tw-border-style);border-width:1px}.tw\\:border-0{border-style:var(--tw-border-style);border-width:0}.tw\\:border-2{border-style:var(--tw-border-style);border-width:2px}.tw\\:border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:border-s-0{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:border-s-2{border-inline-start-style:var(--tw-border-style);border-inline-start-width:2px}.tw\\:border-s-4{border-inline-start-style:var(--tw-border-style);border-inline-start-width:4px}.tw\\:border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.tw\\:border-e-0{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.tw\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.tw\\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.tw\\:border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.tw\\:border-dashed{--tw-border-style:dashed;border-style:dashed}.tw\\:border-none{--tw-border-style:none;border-style:none}.tw\\:border-solid{--tw-border-style:solid;border-style:solid}.tw\\:border-black{border-color:var(--tw-color-black)}.tw\\:border-blue-400{border-color:var(--tw-color-blue-400)}.tw\\:border-blue-500{border-color:var(--tw-color-blue-500)}.tw\\:border-border,.tw\\:border-border\\/50{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-border\\/50{border-color:color-mix(in oklab, var(--border) 50%, transparent)}}.tw\\:border-destructive{border-color:var(--destructive)}.tw\\:border-foreground{border-color:var(--foreground)}.tw\\:border-gray-300{border-color:var(--tw-color-gray-300)}.tw\\:border-input,.tw\\:border-input\\/30{border-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-input\\/30{border-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:border-muted-foreground,.tw\\:border-muted-foreground\\/40{border-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-muted-foreground\\/40{border-color:color-mix(in oklab, var(--muted-foreground) 40%, transparent)}}.tw\\:border-primary{border-color:var(--primary)}.tw\\:border-red-300{border-color:var(--tw-color-red-300)}.tw\\:border-red-400{border-color:var(--tw-color-red-400)}.tw\\:border-red-500{border-color:var(--tw-color-red-500)}.tw\\:border-red-600{border-color:var(--tw-color-red-600)}.tw\\:border-ring{border-color:var(--ring)}.tw\\:border-sidebar-border{border-color:var(--sidebar-border)}.tw\\:border-slate-300{border-color:var(--tw-color-slate-300)}.tw\\:border-transparent{border-color:#0000}.tw\\:border-yellow-400{border-color:var(--tw-color-yellow-400)}.tw\\:border-yellow-500{border-color:var(--tw-color-yellow-500)}.tw\\:border-s-amber-200{border-inline-start-color:var(--tw-color-amber-200)}.tw\\:border-s-indigo-200{border-inline-start-color:var(--tw-color-indigo-200)}.tw\\:border-s-purple-200{border-inline-start-color:var(--tw-color-purple-200)}.tw\\:border-s-red-200{border-inline-start-color:var(--tw-color-red-200)}.tw\\:\\!bg-destructive\\/50{background-color:var(--destructive)!important}@supports (color:color-mix(in lab, red, red)){.tw\\:\\!bg-destructive\\/50{background-color:color-mix(in oklab, var(--destructive) 50%, transparent)!important}}.tw\\:bg-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{background-color:color-mix(in oklab,var(--destructive) 10%,var(--background))}}.tw\\:bg-accent,.tw\\:bg-accent\\/50{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-accent\\/50{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.tw\\:bg-amber-500,.tw\\:bg-amber-500\\/5{background-color:var(--tw-color-amber-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-amber-500\\/5{background-color:color-mix(in oklab, var(--tw-color-amber-500) 5%, transparent)}}.tw\\:bg-amber-500\\/15{background-color:var(--tw-color-amber-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-amber-500\\/15{background-color:color-mix(in oklab, var(--tw-color-amber-500) 15%, transparent)}}.tw\\:bg-background,.tw\\:bg-background\\/50{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-background\\/50{background-color:color-mix(in oklab, var(--background) 50%, transparent)}}.tw\\:bg-black\\/10{background-color:var(--tw-color-black)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-black\\/10{background-color:color-mix(in oklab, var(--tw-color-black) 10%, transparent)}}.tw\\:bg-blue-50{background-color:var(--tw-color-blue-50)}.tw\\:bg-blue-100{background-color:var(--tw-color-blue-100)}.tw\\:bg-blue-400{background-color:var(--tw-color-blue-400)}.tw\\:bg-blue-500{background-color:var(--tw-color-blue-500)}.tw\\:bg-border{background-color:var(--border)}.tw\\:bg-card{background-color:var(--card)}.tw\\:bg-destructive\\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-destructive\\/10{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.tw\\:bg-foreground{background-color:var(--foreground)}.tw\\:bg-gray-50{background-color:var(--tw-color-gray-50)}.tw\\:bg-gray-100{background-color:var(--tw-color-gray-100)}.tw\\:bg-gray-500{background-color:var(--tw-color-gray-500)}.tw\\:bg-green-50{background-color:var(--tw-color-green-50)}.tw\\:bg-green-100{background-color:var(--tw-color-green-100)}.tw\\:bg-green-500{background-color:var(--tw-color-green-500)}.tw\\:bg-input,.tw\\:bg-input\\/30{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-input\\/30{background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:bg-muted,.tw\\:bg-muted\\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-muted\\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:bg-neutral-300{background-color:var(--tw-color-neutral-300)}.tw\\:bg-orange-100{background-color:var(--tw-color-orange-100)}.tw\\:bg-popover,.tw\\:bg-popover\\/70{background-color:var(--popover)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-popover\\/70{background-color:color-mix(in oklab, var(--popover) 70%, transparent)}}.tw\\:bg-primary{background-color:var(--primary)}.tw\\:bg-primary-foreground{background-color:var(--primary-foreground)}.tw\\:bg-primary\\/30{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-primary\\/30{background-color:color-mix(in oklab, var(--primary) 30%, transparent)}}.tw\\:bg-purple-50{background-color:var(--tw-color-purple-50)}.tw\\:bg-red-100{background-color:var(--tw-color-red-100)}.tw\\:bg-red-500{background-color:var(--tw-color-red-500)}.tw\\:bg-rose-500,.tw\\:bg-rose-500\\/5{background-color:var(--tw-color-rose-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-rose-500\\/5{background-color:color-mix(in oklab, var(--tw-color-rose-500) 5%, transparent)}}.tw\\:bg-rose-500\\/15{background-color:var(--tw-color-rose-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-rose-500\\/15{background-color:color-mix(in oklab, var(--tw-color-rose-500) 15%, transparent)}}.tw\\:bg-secondary{background-color:var(--secondary)}.tw\\:bg-sidebar{background-color:var(--sidebar)}.tw\\:bg-sidebar-accent{background-color:var(--sidebar-accent)}.tw\\:bg-sidebar-border{background-color:var(--sidebar-border)}.tw\\:bg-sky-500,.tw\\:bg-sky-500\\/5{background-color:var(--tw-color-sky-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-sky-500\\/5{background-color:color-mix(in oklab, var(--tw-color-sky-500) 5%, transparent)}}.tw\\:bg-sky-500\\/15{background-color:var(--tw-color-sky-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-sky-500\\/15{background-color:color-mix(in oklab, var(--tw-color-sky-500) 15%, transparent)}}.tw\\:bg-teal-500,.tw\\:bg-teal-500\\/5{background-color:var(--tw-color-teal-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-teal-500\\/5{background-color:color-mix(in oklab, var(--tw-color-teal-500) 5%, transparent)}}.tw\\:bg-teal-500\\/15{background-color:var(--tw-color-teal-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-teal-500\\/15{background-color:color-mix(in oklab, var(--tw-color-teal-500) 15%, transparent)}}.tw\\:bg-transparent{background-color:#0000}.tw\\:bg-white{background-color:var(--tw-color-white)}.tw\\:bg-yellow-50{background-color:var(--tw-color-yellow-50)}.tw\\:bg-yellow-100{background-color:var(--tw-color-yellow-100)}.tw\\:bg-yellow-500{background-color:var(--tw-color-yellow-500)}.tw\\:bg-zinc-400{background-color:var(--tw-color-zinc-400)}.tw\\:bg-clip-padding{background-clip:padding-box}.tw\\:fill-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{fill:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:fill-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{fill:color-mix(in oklab,var(--destructive) 10%,var(--background))}}.tw\\:fill-destructive{fill:var(--destructive)}.tw\\:fill-foreground{fill:var(--foreground)}.tw\\:fill-yellow-400,.tw\\:fill-yellow-400\\/50{fill:var(--tw-color-yellow-400)}@supports (color:color-mix(in lab, red, red)){.tw\\:fill-yellow-400\\/50{fill:color-mix(in oklab, var(--tw-color-yellow-400) 50%, transparent)}}.tw\\:object-cover{object-fit:cover}.tw\\:\\!p-4{padding:calc(calc(var(--spacing)) * 4)!important}.tw\\:p-0{padding:calc(calc(var(--spacing)) * 0)}.tw\\:p-0\\.5{padding:calc(calc(var(--spacing)) * .5)}.tw\\:p-1{padding:calc(calc(var(--spacing)) * 1)}.tw\\:p-2{padding:calc(calc(var(--spacing)) * 2)}.tw\\:p-2\\.5{padding:calc(calc(var(--spacing)) * 2.5)}.tw\\:p-3{padding:calc(calc(var(--spacing)) * 3)}.tw\\:p-4{padding:calc(calc(var(--spacing)) * 4)}.tw\\:p-6{padding:calc(calc(var(--spacing)) * 6)}.tw\\:p-8{padding:calc(calc(var(--spacing)) * 8)}.tw\\:p-\\[1px\\]{padding:1px}.tw\\:p-\\[3px\\]{padding:3px}.tw\\:p-\\[10px\\]{padding:10px}.tw\\:p-\\[16px\\]{padding:16px}.tw\\:px-0{padding-inline:calc(calc(var(--spacing)) * 0)}.tw\\:px-0\\.5{padding-inline:calc(calc(var(--spacing)) * .5)}.tw\\:px-1{padding-inline:calc(calc(var(--spacing)) * 1)}.tw\\:px-1\\.5{padding-inline:calc(calc(var(--spacing)) * 1.5)}.tw\\:px-2{padding-inline:calc(calc(var(--spacing)) * 2)}.tw\\:px-2\\.5{padding-inline:calc(calc(var(--spacing)) * 2.5)}.tw\\:px-3{padding-inline:calc(calc(var(--spacing)) * 3)}.tw\\:px-4{padding-inline:calc(calc(var(--spacing)) * 4)}.tw\\:px-6{padding-inline:calc(calc(var(--spacing)) * 6)}.tw\\:py-0{padding-block:calc(calc(var(--spacing)) * 0)}.tw\\:py-0\\.5{padding-block:calc(calc(var(--spacing)) * .5)}.tw\\:py-1{padding-block:calc(calc(var(--spacing)) * 1)}.tw\\:py-1\\.5{padding-block:calc(calc(var(--spacing)) * 1.5)}.tw\\:py-2{padding-block:calc(calc(var(--spacing)) * 2)}.tw\\:py-3{padding-block:calc(calc(var(--spacing)) * 3)}.tw\\:py-4{padding-block:calc(calc(var(--spacing)) * 4)}.tw\\:py-6{padding-block:calc(calc(var(--spacing)) * 6)}.tw\\:py-8{padding-block:calc(calc(var(--spacing)) * 8)}.tw\\:py-\\[2px\\]{padding-block:2px}.tw\\:ps-1\\.5{padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:ps-2{padding-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:ps-2\\.5{padding-inline-start:calc(calc(var(--spacing)) * 2.5)}.tw\\:ps-4{padding-inline-start:calc(calc(var(--spacing)) * 4)}.tw\\:ps-6{padding-inline-start:calc(calc(var(--spacing)) * 6)}.tw\\:ps-7{padding-inline-start:calc(calc(var(--spacing)) * 7)}.tw\\:ps-8{padding-inline-start:calc(calc(var(--spacing)) * 8)}.tw\\:ps-9{padding-inline-start:calc(calc(var(--spacing)) * 9)}.tw\\:ps-12{padding-inline-start:calc(calc(var(--spacing)) * 12)}.tw\\:ps-\\[85px\\]{padding-inline-start:85px}.tw\\:pe-1{padding-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:pe-1\\.5{padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:pe-2{padding-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:pe-4{padding-inline-end:calc(calc(var(--spacing)) * 4)}.tw\\:pe-8{padding-inline-end:calc(calc(var(--spacing)) * 8)}.tw\\:pe-8\\!{padding-inline-end:calc(calc(var(--spacing)) * 8)!important}.tw\\:pe-9{padding-inline-end:calc(calc(var(--spacing)) * 9)}.tw\\:pe-\\[calc\\(138px\\+1rem\\)\\]{padding-inline-end:calc(138px + 1rem)}.tw\\:pe-\\[…\\]{padding-inline-end:…}.tw\\:pt-1{padding-top:calc(calc(var(--spacing)) * 1)}.tw\\:pt-2{padding-top:calc(calc(var(--spacing)) * 2)}.tw\\:pt-3{padding-top:calc(calc(var(--spacing)) * 3)}.tw\\:pt-4{padding-top:calc(calc(var(--spacing)) * 4)}.tw\\:pt-6{padding-top:calc(calc(var(--spacing)) * 6)}.tw\\:pr-0{padding-right:calc(calc(var(--spacing)) * 0)}.tw\\:pr-3{padding-right:calc(calc(var(--spacing)) * 3)}.tw\\:pr-4{padding-right:calc(calc(var(--spacing)) * 4)}.tw\\:pb-0{padding-bottom:calc(calc(var(--spacing)) * 0)}.tw\\:pb-1{padding-bottom:calc(calc(var(--spacing)) * 1)}.tw\\:pb-2{padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:pb-3{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:pb-4{padding-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:pb-8{padding-bottom:calc(calc(var(--spacing)) * 8)}.tw\\:pb-12{padding-bottom:calc(calc(var(--spacing)) * 12)}.tw\\:pb-16{padding-bottom:calc(calc(var(--spacing)) * 16)}.tw\\:pb-24{padding-bottom:calc(calc(var(--spacing)) * 24)}.tw\\:pl-2{padding-left:calc(calc(var(--spacing)) * 2)}.tw\\:pl-3{padding-left:calc(calc(var(--spacing)) * 3)}.tw\\:pl-4{padding-left:calc(calc(var(--spacing)) * 4)}.tw\\:pl-5{padding-left:calc(calc(var(--spacing)) * 5)}.tw\\:pl-6{padding-left:calc(calc(var(--spacing)) * 6)}.tw\\:pl-8{padding-left:calc(calc(var(--spacing)) * 8)}.tw\\:text-center{text-align:center}.tw\\:text-end{text-align:end}.tw\\:text-left{text-align:left}.tw\\:text-right{text-align:right}.tw\\:text-start{text-align:start}.tw\\:align-middle{vertical-align:middle}.tw\\:font-heading{font-family:var(--font-sans)}.tw\\:font-mono{font-family:var(--tw-font-mono)}.tw\\:font-sans{font-family:IBM Plex Sans Variable,sans-serif}.tw\\:text-2xl{font-size:var(--tw-text-2xl);line-height:var(--tw-leading,var(--tw-text-2xl--line-height))}.tw\\:text-3xl{font-size:var(--tw-text-3xl);line-height:var(--tw-leading,var(--tw-text-3xl--line-height))}.tw\\:text-4xl{font-size:var(--tw-text-4xl);line-height:var(--tw-leading,var(--tw-text-4xl--line-height))}.tw\\:text-base{font-size:var(--tw-text-base);line-height:var(--tw-leading,var(--tw-text-base--line-height))}.tw\\:text-lg{font-size:var(--tw-text-lg);line-height:var(--tw-leading,var(--tw-text-lg--line-height))}.tw\\:text-sm{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:text-sm\\/relaxed{font-size:var(--tw-text-sm);line-height:var(--tw-leading-relaxed)}.tw\\:text-xl{font-size:var(--tw-text-xl);line-height:var(--tw-leading,var(--tw-text-xl--line-height))}.tw\\:text-xs{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:text-\\[0\\.8rem\\]{font-size:.8rem}.tw\\:leading-6{--tw-leading:calc(calc(var(--spacing)) * 6);line-height:calc(calc(var(--spacing)) * 6)}.tw\\:leading-loose{--tw-leading:var(--tw-leading-loose);line-height:var(--tw-leading-loose)}.tw\\:leading-none{--tw-leading:1;line-height:1}.tw\\:leading-relaxed{--tw-leading:var(--tw-leading-relaxed);line-height:var(--tw-leading-relaxed)}.tw\\:leading-snug{--tw-leading:var(--tw-leading-snug);line-height:var(--tw-leading-snug)}.tw\\:leading-tight{--tw-leading:var(--tw-leading-tight);line-height:var(--tw-leading-tight)}.tw\\:font-bold{--tw-font-weight:var(--tw-font-weight-bold);font-weight:var(--tw-font-weight-bold)}.tw\\:font-extrabold{--tw-font-weight:var(--tw-font-weight-extrabold);font-weight:var(--tw-font-weight-extrabold)}.tw\\:font-medium{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:font-normal{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:font-semibold{--tw-font-weight:var(--tw-font-weight-semibold);font-weight:var(--tw-font-weight-semibold)}.tw\\:tracking-tight{--tw-tracking:var(--tw-tracking-tight);letter-spacing:var(--tw-tracking-tight)}.tw\\:tracking-wider{--tw-tracking:var(--tw-tracking-wider);letter-spacing:var(--tw-tracking-wider)}.tw\\:tracking-widest{--tw-tracking:var(--tw-tracking-widest);letter-spacing:var(--tw-tracking-widest)}.tw\\:text-balance{text-wrap:balance}.tw\\:text-nowrap{text-wrap:nowrap}.tw\\:break-words{overflow-wrap:break-word}.tw\\:text-clip{text-overflow:clip}.tw\\:text-ellipsis{text-overflow:ellipsis}.tw\\:whitespace-normal{white-space:normal}.tw\\:whitespace-nowrap{white-space:nowrap}.tw\\:whitespace-pre{white-space:pre}.tw\\:whitespace-pre-line{white-space:pre-line}.tw\\:whitespace-pre-wrap{white-space:pre-wrap}.tw\\:\\[color\\:blue\\]{color:#00f}.tw\\:text-accent-foreground{color:var(--accent-foreground)}.tw\\:text-amber-600{color:var(--tw-color-amber-600)}.tw\\:text-background{color:var(--background)}.tw\\:text-blue-400{color:var(--tw-color-blue-400)}.tw\\:text-blue-500{color:var(--tw-color-blue-500)}.tw\\:text-blue-600{color:var(--tw-color-blue-600)}.tw\\:text-blue-800{color:var(--tw-color-blue-800)}.tw\\:text-card-foreground{color:var(--card-foreground)}.tw\\:text-current{color:currentColor}.tw\\:text-destructive{color:var(--destructive)}.tw\\:text-foreground{color:var(--foreground)}.tw\\:text-foreground\\!{color:var(--foreground)!important}.tw\\:text-foreground\\/30{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/30{color:color-mix(in oklab, var(--foreground) 30%, transparent)}}.tw\\:text-foreground\\/50{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/50{color:color-mix(in oklab, var(--foreground) 50%, transparent)}}.tw\\:text-foreground\\/60{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/60{color:color-mix(in oklab, var(--foreground) 60%, transparent)}}.tw\\:text-foreground\\/70{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/70{color:color-mix(in oklab, var(--foreground) 70%, transparent)}}.tw\\:text-gray-300{color:var(--tw-color-gray-300)}.tw\\:text-gray-500{color:var(--tw-color-gray-500)}.tw\\:text-gray-600{color:var(--tw-color-gray-600)}.tw\\:text-gray-700{color:var(--tw-color-gray-700)}.tw\\:text-gray-800{color:var(--tw-color-gray-800)}.tw\\:text-green-600{color:var(--tw-color-green-600)}.tw\\:text-green-700{color:var(--tw-color-green-700)}.tw\\:text-green-800{color:var(--tw-color-green-800)}.tw\\:text-inherit{color:inherit}.tw\\:text-muted-foreground,.tw\\:text-muted-foreground\\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-muted-foreground\\/50{color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.tw\\:text-orange-800{color:var(--tw-color-orange-800)}.tw\\:text-popover-foreground{color:var(--popover-foreground)}.tw\\:text-primary{color:var(--primary)}.tw\\:text-primary-foreground{color:var(--primary-foreground)}.tw\\:text-purple-900{color:var(--tw-color-purple-900)}.tw\\:text-red-500{color:var(--tw-color-red-500)}.tw\\:text-red-600{color:var(--tw-color-red-600)}.tw\\:text-red-700{color:var(--tw-color-red-700)}.tw\\:text-red-800{color:var(--tw-color-red-800)}.tw\\:text-rose-600{color:var(--tw-color-rose-600)}.tw\\:text-secondary-foreground{color:var(--secondary-foreground)}.tw\\:text-sidebar-accent-foreground{color:var(--sidebar-accent-foreground)}.tw\\:text-sidebar-foreground,.tw\\:text-sidebar-foreground\\/70{color:var(--sidebar-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-sidebar-foreground\\/70{color:color-mix(in oklab, var(--sidebar-foreground) 70%, transparent)}}.tw\\:text-sky-600{color:var(--tw-color-sky-600)}.tw\\:text-slate-900{color:var(--tw-color-slate-900)}.tw\\:text-teal-600{color:var(--tw-color-teal-600)}.tw\\:text-white{color:var(--tw-color-white)}.tw\\:text-yellow-400{color:var(--tw-color-yellow-400)}.tw\\:text-yellow-600{color:var(--tw-color-yellow-600)}.tw\\:text-yellow-700{color:var(--tw-color-yellow-700)}.tw\\:capitalize{text-transform:capitalize}.tw\\:uppercase{text-transform:uppercase}.tw\\:italic{font-style:italic}.tw\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tw\\:line-through{text-decoration-line:line-through}.tw\\:underline{text-decoration-line:underline}.tw\\:decoration-destructive{-webkit-text-decoration-color:var(--destructive);-webkit-text-decoration-color:var(--destructive);text-decoration-color:var(--destructive)}.tw\\:underline-offset-4{text-underline-offset:4px}.tw\\:opacity-0{opacity:0}.tw\\:opacity-40{opacity:.4}.tw\\:opacity-50{opacity:.5}.tw\\:opacity-60{opacity:.6}.tw\\:opacity-100{opacity:1}.tw\\:bg-blend-color{background-blend-mode:color}.tw\\:shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-\\[0_0_0_1px_var\\(--sidebar-border\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-border));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-none\\!{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.tw\\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-background{--tw-ring-color:var(--background)}.tw\\:ring-foreground\\/10{--tw-ring-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:ring-foreground\\/10{--tw-ring-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}.tw\\:ring-primary{--tw-ring-color:var(--primary)}.tw\\:ring-ring\\/50{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:ring-ring\\/50{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:ring-sidebar-ring{--tw-ring-color:var(--sidebar-ring)}.tw\\:ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:ring-offset-background{--tw-ring-offset-color:var(--background)}.tw\\:ring-offset-white{--tw-ring-offset-color:var(--tw-color-white)}.tw\\:outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:outline-hidden{outline-offset:2px;outline:2px solid #0000}}.tw\\:drop-shadow-sm{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--tw-drop-shadow-sm));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.tw\\:transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[color\\,box-shadow\\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[left\\,right\\,width\\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[margin\\,opacity\\]{transition-property:margin,opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[width\\,height\\,padding\\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-none{transition-property:none}.tw\\:duration-100{--tw-duration:.1s;transition-duration:.1s}.tw\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.tw\\:ease-linear{--tw-ease:linear;transition-timing-function:linear}.tw\\:prose-quoteless :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose-quoteless :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.tw\\:outline-none{--tw-outline-style:none;outline-style:none}.tw\\:select-none{-webkit-user-select:none;user-select:none}.tw\\:\\[unicode-bidi\\:plaintext\\]{unicode-bidi:plaintext}.tw\\:group-focus-within\\/menu-item\\:opacity-100:is(:where(.tw\\:group\\/menu-item):focus-within *){opacity:1}@media (hover:hover){.tw\\:group-hover\\:visible:is(:where(.tw\\:group):hover *){visibility:visible}.tw\\:group-hover\\:hidden:is(:where(.tw\\:group):hover *){display:none}.tw\\:group-hover\\:opacity-100:is(:where(.tw\\:group):hover *),.tw\\:group-hover\\/menu-item\\:opacity-100:is(:where(.tw\\:group\\/menu-item):hover *){opacity:1}}.tw\\:group-focus\\/context-menu-item\\:text-accent-foreground:is(:where(.tw\\:group\\/context-menu-item):focus *),.tw\\:group-focus\\/dropdown-menu-item\\:text-accent-foreground:is(:where(.tw\\:group\\/dropdown-menu-item):focus *),.tw\\:group-focus\\/menubar-item\\:text-accent-foreground:is(:where(.tw\\:group\\/menubar-item):focus *){color:var(--accent-foreground)}.tw\\:group-has-disabled\\/field\\:opacity-50:is(:where(.tw\\:group\\/field):has(:disabled) *){opacity:.5}.tw\\:group-has-data-\\[sidebar\\=menu-action\\]\\/menu-item\\:pe-8:is(:where(.tw\\:group\\/menu-item):has([data-sidebar=menu-action]) *){padding-inline-end:calc(calc(var(--spacing)) * 8)}.tw\\:group-has-data-\\[size\\=lg\\]\\/avatar-group\\:size-10:is(:where(.tw\\:group\\/avatar-group):has([data-size=lg]) *){width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:group-has-data-\\[size\\=sm\\]\\/avatar-group\\:size-6:is(:where(.tw\\:group\\/avatar-group):has([data-size=sm]) *){width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:group-has-data-\\[slot\\=command-shortcut\\]\\/command-item\\:hidden:is(:where(.tw\\:group\\/command-item):has([data-slot=command-shortcut]) *){display:none}.tw\\:group-has-\\[\\>input\\]\\/input-group\\:pt-2:is(:where(.tw\\:group\\/input-group):has(>input) *){padding-top:calc(calc(var(--spacing)) * 2)}.tw\\:group-has-\\[\\>input\\]\\/input-group\\:pb-2:is(:where(.tw\\:group\\/input-group):has(>input) *){padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:group-has-\\[\\>svg\\]\\/alert\\:col-start-2:is(:where(.tw\\:group\\/alert):has(>svg) *){grid-column-start:2}.tw\\:group-data-\\[checked\\=true\\]\\/command-item\\:opacity-100:is(:where(.tw\\:group\\/command-item)[data-checked=true] *){opacity:1}.tw\\:group-data-\\[collapsible\\=icon\\]\\:-mt-8:is(:where(.tw\\:group)[data-collapsible=icon] *){margin-top:calc(calc(var(--spacing)) * -8)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:hidden:is(:where(.tw\\:group)[data-collapsible=icon] *){display:none}.tw\\:group-data-\\[collapsible\\=icon\\]\\:size-8\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(calc(var(--spacing)) * 8)!important;height:calc(calc(var(--spacing)) * 8)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\(--sidebar-width-icon\\):is(:where(.tw\\:group)[data-collapsible=icon] *){width:var(--sidebar-width-icon)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\)\\]:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(calc(var(--spacing)) * 4)))}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\+2px\\)\\]:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(calc(var(--spacing)) * 4)) + 2px)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:overflow-hidden:is(:where(.tw\\:group)[data-collapsible=icon] *){overflow:hidden}.tw\\:group-data-\\[collapsible\\=icon\\]\\:p-0\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){padding:calc(calc(var(--spacing)) * 0)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:p-2\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){padding:calc(calc(var(--spacing)) * 2)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:opacity-0:is(:where(.tw\\:group)[data-collapsible=icon] *){opacity:0}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:right-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\]:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:left-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\]:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:w-0:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){width:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:translate-x-0:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:group-data-\\[disabled\\=true\\]\\:pointer-events-none:is(:where(.tw\\:group)[data-disabled=true] *){pointer-events:none}.tw\\:group-data-\\[disabled\\=true\\]\\:opacity-50:is(:where(.tw\\:group)[data-disabled=true] *),.tw\\:group-data-\\[disabled\\=true\\]\\/input-group\\:opacity-50:is(:where(.tw\\:group\\/input-group)[data-disabled=true] *){opacity:.5}.tw\\:group-data-\\[side\\=primary\\]\\:-right-4:is(:where(.tw\\:group)[data-side=primary] *){right:calc(calc(var(--spacing)) * -4)}.tw\\:group-data-\\[side\\=primary\\]\\:border-e:is(:where(.tw\\:group)[data-side=primary] *){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.tw\\:group-data-\\[side\\=secondary\\]\\:left-0:is(:where(.tw\\:group)[data-side=secondary] *){left:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-\\[side\\=secondary\\]\\:rotate-180:is(:where(.tw\\:group)[data-side=secondary] *){rotate:180deg}.tw\\:group-data-\\[side\\=secondary\\]\\:border-s:is(:where(.tw\\:group)[data-side=secondary] *){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:group-data-\\[size\\=default\\]\\/avatar\\:size-2\\.5:is(:where(.tw\\:group\\/avatar)[data-size=default] *){width:calc(calc(var(--spacing)) * 2.5);height:calc(calc(var(--spacing)) * 2.5)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:size-4:is(:where(.tw\\:group\\/switch)[data-size=default] *){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[size\\=lg\\]\\/avatar\\:size-3:is(:where(.tw\\:group\\/avatar)[data-size=lg] *){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=sm] *){width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:text-xs:is(:where(.tw\\:group\\/avatar)[data-size=sm] *){font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:p-3:is(:where(.tw\\:group\\/card)[data-size=sm] *){padding:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:px-3:is(:where(.tw\\:group\\/card)[data-size=sm] *){padding-inline:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:text-sm:is(:where(.tw\\:group\\/card)[data-size=sm] *){font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:size-3:is(:where(.tw\\:group\\/switch)[data-size=sm] *){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:rounded-none:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *){border-radius:0}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:px-2:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *){padding-inline:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[variant\\=floating\\]\\:rounded-lg:is(:where(.tw\\:group)[data-variant=floating] *){border-radius:var(--radius)}.tw\\:group-data-\\[variant\\=floating\\]\\:shadow-sm:is(:where(.tw\\:group)[data-variant=floating] *){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=floating\\]\\:ring-1:is(:where(.tw\\:group)[data-variant=floating] *){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=floating\\]\\:ring-sidebar-border:is(:where(.tw\\:group)[data-variant=floating] *){--tw-ring-color:var(--sidebar-border)}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *){background-color:#0000}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:mx-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){margin-inline:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:mt-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){margin-top:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:h-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){height:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:w-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){width:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:text-center:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){text-align:center}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:my-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){margin-block:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:me-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){margin-inline-end:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:h-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){height:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:w-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){width:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:my-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){margin-block:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:ms-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){margin-inline-start:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:h-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){height:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:w-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){width:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:mx-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){margin-inline:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:mb-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:h-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){height:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:w-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){width:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:text-center:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){text-align:center}.tw\\:group-data-selected\\/command-item\\:text-foreground:is(:where(.tw\\:group\\/command-item):where([data-selected=true]) *){color:var(--foreground)}.tw\\:group-data-horizontal\\/tabs\\:h-8:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *){height:calc(calc(var(--spacing)) * 8)}.tw\\:group-data-vertical\\/tabs\\:h-fit:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){height:fit-content}.tw\\:group-data-vertical\\/tabs\\:w-full:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){width:100%}.tw\\:group-data-vertical\\/tabs\\:flex-col:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){flex-direction:column}.tw\\:group-data-vertical\\/tabs\\:justify-start:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){justify-content:flex-start}@media (hover:hover){.tw\\:peer-hover\\/menu-button\\:text-sidebar-accent-foreground:is(:where(.tw\\:peer\\/menu-button):hover~*){color:var(--sidebar-accent-foreground)}.tw\\:peer-focus\\:group-hover\\:text-blue-500:is(:where(.tw\\:peer):focus~*):is(:where(.tw\\:group):hover *){color:var(--tw-color-blue-500)}}.tw\\:peer-disabled\\:cursor-not-allowed:is(:where(.tw\\:peer):disabled~*){cursor:not-allowed}.tw\\:peer-disabled\\:opacity-50:is(:where(.tw\\:peer):disabled~*){opacity:.5}.tw\\:peer-data-\\[size\\=default\\]\\/menu-button\\:top-1\\.5:is(:where(.tw\\:peer\\/menu-button)[data-size=default]~*){top:calc(calc(var(--spacing)) * 1.5)}.tw\\:peer-data-\\[size\\=lg\\]\\/menu-button\\:top-2\\.5:is(:where(.tw\\:peer\\/menu-button)[data-size=lg]~*){top:calc(calc(var(--spacing)) * 2.5)}.tw\\:peer-data-\\[size\\=sm\\]\\/menu-button\\:top-1:is(:where(.tw\\:peer\\/menu-button)[data-size=sm]~*){top:calc(calc(var(--spacing)) * 1)}.tw\\:peer-data-active\\/menu-button\\:text-sidebar-accent-foreground:is(:is(:where(.tw\\:peer\\/menu-button):where([data-state=active]),:where(.tw\\:peer\\/menu-button):where([data-active]:not([data-active=false])))~*){color:var(--sidebar-accent-foreground)}.tw\\:file\\:inline-flex::file-selector-button{display:inline-flex}.tw\\:file\\:h-6::file-selector-button{height:calc(calc(var(--spacing)) * 6)}.tw\\:file\\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.tw\\:file\\:bg-transparent::file-selector-button{background-color:#0000}.tw\\:file\\:text-sm::file-selector-button{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:file\\:font-medium::file-selector-button{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:file\\:text-foreground::file-selector-button{color:var(--foreground)}.tw\\:placeholder\\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.tw\\:placeholder\\:text-slate-400::placeholder{color:var(--tw-color-slate-400)}.tw\\:before\\:absolute:before{content:var(--tw-content);position:absolute}.tw\\:before\\:top-0\\.5:before{content:var(--tw-content);top:calc(calc(var(--spacing)) * .5)}.tw\\:before\\:left-0:before{content:var(--tw-content);left:calc(calc(var(--spacing)) * 0)}.tw\\:before\\:block:before{content:var(--tw-content);display:block}.tw\\:before\\:hidden:before{content:var(--tw-content);display:none}.tw\\:before\\:h-4:before{content:var(--tw-content);height:calc(calc(var(--spacing)) * 4)}.tw\\:before\\:w-4:before{content:var(--tw-content);width:calc(calc(var(--spacing)) * 4)}.tw\\:before\\:cursor-pointer:before{content:var(--tw-content);cursor:pointer}.tw\\:before\\:rounded:before{content:var(--tw-content);border-radius:.25rem}.tw\\:before\\:border:before{content:var(--tw-content);border-style:var(--tw-border-style);border-width:1px}.tw\\:before\\:border-primary:before{content:var(--tw-content);border-color:var(--primary)}.tw\\:before\\:bg-primary:before{content:var(--tw-content);background-color:var(--primary)}.tw\\:before\\:bg-cover:before{content:var(--tw-content);background-size:cover}.tw\\:before\\:bg-no-repeat:before{content:var(--tw-content);background-repeat:no-repeat}.tw\\:before\\:content-\\[\\"\\"\\]:before{--tw-content:"";content:var(--tw-content)}.tw\\:before\\:content-\\[\\\\\\"\\\\\\"\\]:before{--tw-content:\\"\\";content:var(--tw-content)}.tw\\:after\\:absolute:after{content:var(--tw-content);position:absolute}.tw\\:after\\:-inset-2:after{content:var(--tw-content);inset:calc(calc(var(--spacing)) * -2)}.tw\\:after\\:inset-0:after{content:var(--tw-content);inset:calc(calc(var(--spacing)) * 0)}.tw\\:after\\:-inset-x-3:after{content:var(--tw-content);inset-inline:calc(calc(var(--spacing)) * -3)}.tw\\:after\\:-inset-y-2:after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * -2)}.tw\\:after\\:inset-y-0:after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:after\\:start-1\\/2:after{content:var(--tw-content);inset-inline-start:50%}.tw\\:after\\:top-\\[6px\\]:after{content:var(--tw-content);top:6px}.tw\\:after\\:right-\\[7px\\]:after{content:var(--tw-content);right:7px}.tw\\:after\\:left-\\[7px\\]:after{content:var(--tw-content);left:7px}.tw\\:after\\:block:after{content:var(--tw-content);display:block}.tw\\:after\\:hidden:after{content:var(--tw-content);display:none}.tw\\:after\\:h-0\\.5:after{content:var(--tw-content);height:calc(calc(var(--spacing)) * .5)}.tw\\:after\\:h-\\[6px\\]:after{content:var(--tw-content);height:6px}.tw\\:after\\:w-1:after{content:var(--tw-content);width:calc(calc(var(--spacing)) * 1)}.tw\\:after\\:w-\\[2px\\]:after{content:var(--tw-content);width:2px}.tw\\:after\\:w-\\[3px\\]:after{content:var(--tw-content);width:3px}.tw\\:after\\:-translate-x-1\\/2:after{content:var(--tw-content);--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:after\\:rotate-45:after{content:var(--tw-content);rotate:45deg}.tw\\:after\\:cursor-pointer:after{content:var(--tw-content);cursor:pointer}.tw\\:after\\:rounded-full:after{content:var(--tw-content);border-radius:3.40282e38px}.tw\\:after\\:border:after{content:var(--tw-content);border-style:var(--tw-border-style);border-width:1px}.tw\\:after\\:border-t-0:after{content:var(--tw-content);border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:after\\:border-r-2:after{content:var(--tw-content);border-right-style:var(--tw-border-style);border-right-width:2px}.tw\\:after\\:border-b-2:after{content:var(--tw-content);border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.tw\\:after\\:border-l-0:after{content:var(--tw-content);border-left-style:var(--tw-border-style);border-left-width:0}.tw\\:after\\:border-solid:after{content:var(--tw-content);--tw-border-style:solid;border-style:solid}.tw\\:after\\:border-border:after{content:var(--tw-content);border-color:var(--border)}.tw\\:after\\:border-white:after{content:var(--tw-content);border-color:var(--tw-color-white)}.tw\\:after\\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.tw\\:after\\:bg-muted:after{content:var(--tw-content);background-color:var(--muted)}.tw\\:after\\:opacity-0:after{content:var(--tw-content);opacity:0}.tw\\:after\\:mix-blend-darken:after{content:var(--tw-content);mix-blend-mode:darken}.tw\\:after\\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:after\\:content-\\[\\"\\"\\]:after{--tw-content:"";content:var(--tw-content)}.tw\\:after\\:content-\\[\\\\\\"\\\\\\"\\]:after{--tw-content:\\"\\";content:var(--tw-content)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:after\\:start-full:is(:where(.tw\\:group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);inset-inline-start:100%}.tw\\:group-data-horizontal\\/tabs\\:after\\:inset-x-0:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-horizontal\\/tabs\\:after\\:bottom-\\[-5px\\]:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);bottom:-5px}.tw\\:group-data-horizontal\\/tabs\\:after\\:h-0\\.5:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);height:calc(calc(var(--spacing)) * .5)}.tw\\:group-data-vertical\\/tabs\\:after\\:inset-y-0:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-vertical\\/tabs\\:after\\:-end-1:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);inset-inline-end:calc(calc(var(--spacing)) * -1)}.tw\\:group-data-vertical\\/tabs\\:after\\:w-0\\.5:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);width:calc(calc(var(--spacing)) * .5)}.tw\\:first\\:mt-0:first-child{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:last\\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:even\\:bg-muted:nth-child(2n){background-color:var(--muted)}.tw\\:focus-within\\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-within\\:ring-ring:focus-within{--tw-ring-color:var(--ring)}.tw\\:focus-within\\:ring-offset-1:focus-within{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}@media (hover:hover){.tw\\:hover\\:-mt-4:hover{margin-top:calc(calc(var(--spacing)) * -4)}.tw\\:hover\\:cursor-pointer:hover{cursor:pointer}.tw\\:hover\\:bg-accent:hover,.tw\\:hover\\:bg-accent\\/30:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-accent\\/30:hover{background-color:color-mix(in oklab, var(--accent) 30%, transparent)}}.tw\\:hover\\:bg-accent\\/80:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-accent\\/80:hover{background-color:color-mix(in oklab, var(--accent) 80%, transparent)}}.tw\\:hover\\:bg-blue-600:hover{background-color:var(--tw-color-blue-600)}.tw\\:hover\\:bg-destructive\\/20:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-destructive\\/20:hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:hover\\:bg-gray-50:hover{background-color:var(--tw-color-gray-50)}.tw\\:hover\\:bg-input:hover{background-color:var(--input)}.tw\\:hover\\:bg-muted:hover,.tw\\:hover\\:bg-muted\\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-muted\\/50:hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:hover\\:bg-muted\\/80:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-muted\\/80:hover{background-color:color-mix(in oklab, var(--muted) 80%, transparent)}}.tw\\:hover\\:bg-primary\\/10:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/10:hover{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.tw\\:hover\\:bg-primary\\/70:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/70:hover{background-color:color-mix(in oklab, var(--primary) 70%, transparent)}}.tw\\:hover\\:bg-primary\\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.tw\\:hover\\:bg-red-500:hover{background-color:var(--tw-color-red-500)}.tw\\:hover\\:bg-secondary:hover,.tw\\:hover\\:bg-secondary\\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-secondary\\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.tw\\:hover\\:bg-sidebar-accent:hover{background-color:var(--sidebar-accent)}.tw\\:hover\\:bg-transparent:hover{background-color:#0000}.tw\\:hover\\:text-foreground:hover{color:var(--foreground)}.tw\\:hover\\:text-muted-foreground:hover{color:var(--muted-foreground)}.tw\\:hover\\:text-primary-foreground:hover{color:var(--primary-foreground)}.tw\\:hover\\:text-sidebar-accent-foreground:hover{color:var(--sidebar-accent-foreground)}.tw\\:hover\\:underline:hover{text-decoration-line:underline}.tw\\:hover\\:opacity-80:hover{opacity:.8}.tw\\:hover\\:opacity-100:hover{opacity:1}.tw\\:hover\\:shadow-\\[0_0_0_1px_var\\(--sidebar-accent\\)\\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-accent));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:ring-3:hover{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:group-data-\\[collapsible\\=offcanvas\\]\\:bg-sidebar:hover:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){background-color:var(--sidebar)}.tw\\:hover\\:after\\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:var(--sidebar-border)}}.tw\\:focus\\:relative:focus{position:relative}.tw\\:focus\\:z-10:focus{z-index:10}.tw\\:focus\\:bg-accent:focus{background-color:var(--accent)}.tw\\:focus\\:bg-muted:focus{background-color:var(--muted)}.tw\\:focus\\:text-accent-foreground:focus{color:var(--accent-foreground)}.tw\\:focus\\:text-foreground:focus{color:var(--foreground)}.tw\\:focus\\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus\\:ring-ring:focus{--tw-ring-color:var(--ring)}.tw\\:focus\\:ring-offset-1:focus{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:focus\\:ring-offset-background:focus{--tw-ring-offset-color:var(--background)}.tw\\:focus\\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:focus\\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}:is(.tw\\:focus\\:\\*\\*\\:text-accent-foreground:focus *),:is(.tw\\:not-data-\\[variant\\=destructive\\]\\:focus\\:\\*\\*\\:text-accent-foreground:not([data-variant=destructive]):focus *){color:var(--accent-foreground)}.tw\\:focus-visible\\:relative:focus-visible{position:relative}.tw\\:focus-visible\\:z-10:focus-visible{z-index:10}.tw\\:focus-visible\\:border-destructive\\/40:focus-visible{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:border-destructive\\/40:focus-visible{border-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:focus-visible\\:border-ring:focus-visible{border-color:var(--ring)}.tw\\:focus-visible\\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-3:focus-visible,.tw\\:focus-visible\\:ring-\\[3px\\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-\\[color\\:hsl\\(240\\,5\\%\\,64\\.9\\%\\)\\]:focus-visible{--tw-ring-color:#a1a1aa}.tw\\:focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:focus-visible\\:ring-ring:focus-visible,.tw\\:focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:focus-visible\\:ring-slate-400:focus-visible{--tw-ring-color:var(--tw-color-slate-400)}.tw\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:focus-visible\\:outline-hidden:focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:focus-visible\\:outline-hidden:focus-visible{outline-offset:2px;outline:2px solid #0000}}.tw\\:focus-visible\\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.tw\\:focus-visible\\:outline-ring:focus-visible{outline-color:var(--ring)}.tw\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}:is(.tw\\:\\*\\:focus-visible\\:relative>*):focus-visible{position:relative}:is(.tw\\:\\*\\:focus-visible\\:z-10>*):focus-visible{z-index:10}.tw\\:active\\:bg-sidebar-accent:active{background-color:var(--sidebar-accent)}.tw\\:active\\:text-sidebar-accent-foreground:active{color:var(--sidebar-accent-foreground)}.tw\\:active\\:ring-3:active{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:active\\:not-aria-\\[haspopup\\]\\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:active\\:not-aria-\\[haspopup\\]\\:transform-\\[translateY\\(1px\\)\\]:active:not([aria-haspopup]){transform:translateY(1px)}.tw\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.tw\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.tw\\:disabled\\:bg-input\\/50:disabled{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:disabled\\:bg-input\\/50:disabled{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:disabled\\:bg-transparent:disabled{background-color:#0000}.tw\\:disabled\\:opacity-50:disabled{opacity:.5}:where([data-side=bottom]) .tw\\:in-data-\\[side\\=bottom\\]\\:translate-y-\\[calc\\(-50\\%-1px\\)\\]{--tw-translate-y:calc(-50% - 1px);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=bottom]) .tw\\:in-data-\\[side\\=bottom\\]\\:\\[clip-path\\:polygon\\(100\\%_0\\,100\\%_100\\%\\,0_100\\%\\)\\]{clip-path:polygon(100% 0,100% 100%,0 100%)}:where([data-side=primary]) .tw\\:in-data-\\[side\\=primary\\]\\:cursor-w-resize{cursor:w-resize}:where([data-side=secondary]) .tw\\:in-data-\\[side\\=secondary\\]\\:cursor-e-resize{cursor:e-resize}:where([data-side=top]) .tw\\:in-data-\\[side\\=top\\]\\:translate-y-\\[calc\\(-50\\%-1px\\)\\]{--tw-translate-y:calc(-50% - 1px);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=top]) .tw\\:in-data-\\[side\\=top\\]\\:\\[clip-path\\:polygon\\(100\\%_0\\,100\\%_100\\%\\,0_100\\%\\)\\]{clip-path:polygon(100% 0,100% 100%,0 100%)}:where([data-slot=button-group]) .tw\\:in-data-\\[slot\\=button-group\\]\\:rounded-lg{border-radius:var(--radius)}:where([data-slot=combobox-content]) .tw\\:in-data-\\[slot\\=combobox-content\\]\\:focus-within\\:border-inherit:focus-within{border-color:inherit}:where([data-slot=combobox-content]) .tw\\:in-data-\\[slot\\=combobox-content\\]\\:focus-within\\:ring-0:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:where([data-slot=dialog-content]) .tw\\:in-data-\\[slot\\=dialog-content\\]\\:rounded-lg\\!{border-radius:var(--radius)!important}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/20{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/20{background-color:color-mix(in oklab, var(--background) 20%, transparent)}}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:text-background{color:var(--background)}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:text-destructive{color:var(--destructive)}.tw\\:has-disabled\\:bg-input\\/50:has(:disabled){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-disabled\\:bg-input\\/50:has(:disabled){background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:has-disabled\\:opacity-50:has(:disabled){opacity:.5}.tw\\:has-aria-expanded\\:bg-muted\\/50:has([aria-expanded=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-aria-expanded\\:bg-muted\\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-1:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-1\\.5:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-2:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:has-data-\\[icon\\=inline-end\\]\\:pe-1\\.5:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *):has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-1:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-1\\.5:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-2:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:has-data-\\[icon\\=inline-start\\]\\:ps-1\\.5:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *):has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[slot\\=alert-action\\]\\:relative:has([data-slot=alert-action]){position:relative}.tw\\:has-data-\\[slot\\=alert-action\\]\\:pe-18:has([data-slot=alert-action]){padding-inline-end:calc(calc(var(--spacing)) * 18)}.tw\\:has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.tw\\:has-data-\\[slot\\=card-description\\]\\:grid-rows-\\[auto_auto\\]:has([data-slot=card-description]){grid-template-rows:auto auto}.tw\\:has-data-\\[slot\\=card-footer\\]\\:pb-0:has([data-slot=card-footer]){padding-bottom:calc(calc(var(--spacing)) * 0)}.tw\\:has-data-\\[slot\\=kbd\\]\\:pe-0:has([data-slot=kbd]){padding-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:has-data-\\[slot\\=kbd\\]\\:pe-1\\.5:has([data-slot=kbd]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[variant\\=inset\\]\\:bg-sidebar:has([data-variant=inset]){background-color:var(--sidebar)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:border-ring:has([data-slot=input-group-control]:focus-visible){border-color:var(--ring)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-3:has([data-slot=input-group-control]:focus-visible){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-ring\\/50:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-ring\\/50:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:border-destructive:has([data-slot][aria-invalid=true]){border-color:var(--destructive)}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-3:has([data-slot][aria-invalid=true]){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/20:has([data-slot][aria-invalid=true]){--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/20:has([data-slot][aria-invalid=true]){--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:h-auto:has(>[data-align=block-end]){height:auto}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:flex-col:has(>[data-align=block-end]){flex-direction:column}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:h-auto:has(>[data-align=block-start]){height:auto}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:flex-col:has(>[data-align=block-start]){flex-direction:column}.tw\\:has-\\[\\>\\[data-slot\\=button-group\\]\\]\\:gap-2:has(>[data-slot=button-group]){gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>button\\]\\:ms-\\[-0\\.3rem\\]:has(>button){margin-inline-start:-.3rem}.tw\\:has-\\[\\>button\\]\\:me-\\[-0\\.3rem\\]:has(>button){margin-inline-end:-.3rem}.tw\\:has-\\[\\>img\\]\\:grid-cols-\\[auto_1fr\\]:has(>img){grid-template-columns:auto 1fr}.tw\\:has-\\[\\>img\\]\\:gap-x-2:has(>img){column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>img\\:first-child\\]\\:pt-0:has(>img:first-child){padding-top:calc(calc(var(--spacing)) * 0)}.tw\\:has-\\[\\>kbd\\]\\:ms-\\[-0\\.15rem\\]:has(>kbd){margin-inline-start:-.15rem}.tw\\:has-\\[\\>kbd\\]\\:me-\\[-0\\.15rem\\]:has(>kbd){margin-inline-end:-.15rem}.tw\\:has-\\[\\>svg\\]\\:grid-cols-\\[auto_1fr\\]:has(>svg){grid-template-columns:auto 1fr}.tw\\:has-\\[\\>svg\\]\\:gap-x-2:has(>svg){column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>svg\\]\\:p-0:has(>svg){padding:calc(calc(var(--spacing)) * 0)}.tw\\:has-\\[\\>textarea\\]\\:h-auto:has(>textarea){height:auto}.tw\\:aria-disabled\\:pointer-events-none[aria-disabled=true]{pointer-events:none}.tw\\:aria-disabled\\:opacity-50[aria-disabled=true]{opacity:.5}.tw\\:aria-expanded\\:bg-muted[aria-expanded=true]{background-color:var(--muted)}.tw\\:aria-expanded\\:bg-secondary[aria-expanded=true]{background-color:var(--secondary)}.tw\\:aria-expanded\\:text-foreground[aria-expanded=true]{color:var(--foreground)}.tw\\:aria-expanded\\:text-secondary-foreground[aria-expanded=true]{color:var(--secondary-foreground)}.tw\\:aria-expanded\\:opacity-100[aria-expanded=true]{opacity:1}.tw\\:aria-invalid\\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.tw\\:aria-invalid\\:ring-0[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:aria-invalid\\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:aria-invalid\\:aria-checked\\:border-primary[aria-invalid=true][aria-checked=true]{border-color:var(--primary)}.tw\\:aria-pressed\\:bg-muted[aria-pressed=true]{background-color:var(--muted)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:h-px[aria-orientation=horizontal]{height:1px}.tw\\:aria-\\[orientation\\=horizontal\\]\\:w-full[aria-orientation=horizontal]{width:100%}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:start-0[aria-orientation=horizontal]:after{content:var(--tw-content);inset-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:h-1[aria-orientation=horizontal]:after{content:var(--tw-content);height:calc(calc(var(--spacing)) * 1)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:w-full[aria-orientation=horizontal]:after{content:var(--tw-content);width:100%}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:translate-x-0[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:-translate-y-1\\/2[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:aria-\\[orientation\\=vertical\\]\\:flex-col[aria-orientation=vertical]{flex-direction:column}.tw\\:data-inset\\:ps-7[data-inset]{padding-inline-start:calc(calc(var(--spacing)) * 7)}.tw\\:data-placeholder\\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.tw\\:data-quiet-focus\\:focus-visible\\:border-transparent[data-quiet-focus]:focus-visible{border-color:#0000}.tw\\:data-quiet-focus\\:focus-visible\\:ring-0[data-quiet-focus]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-quiet-focus\\:focus-visible\\:outline-none[data-quiet-focus]:focus-visible{--tw-outline-style:none;outline-style:none}.tw\\:data-\\[align-trigger\\=false\\]\\:min-w-36[data-align-trigger=false]{min-width:calc(calc(var(--spacing)) * 36)}.tw\\:data-\\[align-trigger\\=true\\]\\:min-w-\\(--radix-select-trigger-width\\)[data-align-trigger=true]{min-width:var(--radix-select-trigger-width)}.tw\\:data-\\[align-trigger\\=true\\]\\:animate-none[data-align-trigger=true]{animation:none}.tw\\:data-\\[disabled\\=true\\]\\:pointer-events-none[data-disabled=true]{pointer-events:none}.tw\\:data-\\[disabled\\=true\\]\\:opacity-50[data-disabled=true]{opacity:.5}.tw\\:data-\\[position\\=popper\\]\\:h-\\(--radix-select-trigger-height\\)[data-position=popper]{height:var(--radix-select-trigger-height)}.tw\\:data-\\[position\\=popper\\]\\:w-full[data-position=popper]{width:100%}.tw\\:data-\\[position\\=popper\\]\\:min-w-\\(--radix-select-trigger-width\\)[data-position=popper]{min-width:var(--radix-select-trigger-width)}.tw\\:data-\\[side\\=bottom\\]\\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.tw\\:data-\\[side\\=left\\]\\:-translate-x-1[data-side=left]{--tw-translate-x:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.tw\\:data-\\[side\\=right\\]\\:translate-x-1[data-side=right]{--tw-translate-x:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.tw\\:data-\\[side\\=top\\]\\:-translate-y-1[data-side=top]{--tw-translate-y:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.tw\\:data-\\[size\\=default\\]\\:h-8[data-size=default]{height:calc(calc(var(--spacing)) * 8)}.tw\\:data-\\[size\\=default\\]\\:h-\\[18\\.4px\\][data-size=default]{height:18.4px}.tw\\:data-\\[size\\=default\\]\\:w-\\[32px\\][data-size=default]{width:32px}.tw\\:data-\\[size\\=lg\\]\\:size-10[data-size=lg]{width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:data-\\[size\\=md\\]\\:text-sm[data-size=md]{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:data-\\[size\\=sm\\]\\:size-6[data-size=sm]{width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:data-\\[size\\=sm\\]\\:h-7[data-size=sm]{height:calc(calc(var(--spacing)) * 7)}.tw\\:data-\\[size\\=sm\\]\\:h-\\[14px\\][data-size=sm]{height:14px}.tw\\:data-\\[size\\=sm\\]\\:w-\\[24px\\][data-size=sm]{width:24px}.tw\\:data-\\[size\\=sm\\]\\:gap-3[data-size=sm]{gap:calc(calc(var(--spacing)) * 3)}.tw\\:data-\\[size\\=sm\\]\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,10px\\)\\][data-size=sm]{border-radius:min(var(--tw-radius-md), 10px)}.tw\\:data-\\[size\\=sm\\]\\:py-3[data-size=sm]{padding-block:calc(calc(var(--spacing)) * 3)}.tw\\:data-\\[size\\=sm\\]\\:text-xs[data-size=sm]{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:data-\\[size\\=sm\\]\\:has-data-\\[slot\\=card-footer\\]\\:pb-0[data-size=sm]:has([data-slot=card-footer]){padding-bottom:calc(calc(var(--spacing)) * 0)}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-item]:focus{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-item]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:data-highlighted\\:bg-foreground\\/10 *)[data-slot$=-item][data-highlighted]{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:data-highlighted\\:bg-foreground\\/10 *)[data-slot$=-item][data-highlighted]{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-separator\\]\\:bg-foreground\\/5 *)[data-slot$=-separator]{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-separator\\]\\:bg-foreground\\/5 *)[data-slot$=-separator]{background-color:color-mix(in oklab, var(--foreground) 5%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-trigger]:focus{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-trigger]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:aria-expanded\\:bg-foreground\\/10\\! *)[data-slot$=-trigger][aria-expanded=true]{background-color:var(--foreground)!important}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:aria-expanded\\:bg-foreground\\/10\\! *)[data-slot$=-trigger][aria-expanded=true]{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)!important}}:is(.tw\\:\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90>*)[data-slot=alert-description]{color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90>*)[data-slot=alert-description]{color:color-mix(in oklab, var(--destructive) 90%, transparent)}}:is(.tw\\:\\*\\:data-\\[slot\\=avatar\\]\\:ring-2>*)[data-slot=avatar]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:is(.tw\\:\\*\\:data-\\[slot\\=avatar\\]\\:ring-background>*)[data-slot=avatar]{--tw-ring-color:var(--background)}:is(.tw\\:\\*\\:data-\\[slot\\=input-group-addon\\]\\:ps-2\\!>*)[data-slot=input-group-addon]{padding-inline-start:calc(calc(var(--spacing)) * 2)!important}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:relative *)[data-slot=kbd]{position:relative}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:isolate *)[data-slot=kbd]{isolation:isolate}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:z-50 *)[data-slot=kbd]{z-index:50}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:rounded-sm *)[data-slot=kbd]{border-radius:calc(var(--radius) * .6)}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:flex>*)[data-slot=select-value]{display:flex}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:flex-1>*)[data-slot=select-value]{flex:1}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:items-center>*)[data-slot=select-value]{align-items:center}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:gap-1\\.5>*)[data-slot=select-value]{gap:calc(calc(var(--spacing)) * 1.5)}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:text-start>*)[data-slot=select-value]{text-align:start}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:first\\:rounded-s-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"]:first-child{border-start-start-radius:var(--radius);border-end-start-radius:var(--radius)}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:first\\:rounded-t-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"]:first-child{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:last\\:rounded-e-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"]:last-child{border-start-end-radius:var(--radius);border-end-end-radius:var(--radius)}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:last\\:rounded-b-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"]:last-child{border-bottom-right-radius:var(--radius);border-bottom-left-radius:var(--radius)}.tw\\:data-\\[state\\=active\\]\\:bg-background[data-state=active]{background-color:var(--background)}.tw\\:data-\\[state\\=active\\]\\:text-foreground[data-state=active]{color:var(--foreground)}.tw\\:data-\\[state\\=active\\]\\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-\\[state\\=closed\\]\\:overflow-hidden[data-state=closed]{overflow:hidden}.tw\\:data-\\[state\\=delayed-open\\]\\:animate-in[data-state=delayed-open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-\\[state\\=delayed-open\\]\\:fade-in-0[data-state=delayed-open]{--tw-enter-opacity:0}.tw\\:data-\\[state\\=delayed-open\\]\\:zoom-in-95[data-state=delayed-open]{--tw-enter-scale:.95}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-approved\\)\\][data-state=on]{background-color:var(--inv-soft-approved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-unapproved\\)\\][data-state=on]{background-color:var(--inv-soft-unapproved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-unknown\\)\\][data-state=on]{background-color:var(--inv-soft-unknown)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-approved\\)\\][data-state=on]{background-color:var(--inv-vivid-approved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-unapproved\\)\\][data-state=on]{background-color:var(--inv-vivid-unapproved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-unknown\\)\\][data-state=on]{background-color:var(--inv-vivid-unknown)}.tw\\:data-\\[state\\=on\\]\\:bg-muted[data-state=on]{background-color:var(--muted)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-approved\\)\\][data-state=on]{color:var(--inv-icon-approved)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-unapproved\\)\\][data-state=on]{color:var(--inv-icon-unapproved)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-unknown\\)\\][data-state=on]{color:var(--inv-icon-unknown)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-on\\)\\][data-state=on]{color:var(--inv-on)}.tw\\:data-\\[state\\=on\\]\\:text-foreground[data-state=on]{color:var(--foreground)}.tw\\:data-\\[state\\=open\\]\\:bg-accent[data-state=open]{background-color:var(--accent)}.tw\\:data-\\[state\\=open\\]\\:bg-muted[data-state=open]{background-color:var(--muted)}.tw\\:data-\\[state\\=open\\]\\:text-foreground[data-state=open]{color:var(--foreground)}.tw\\:data-\\[state\\=selected\\]\\:bg-muted[data-state=selected]{background-color:var(--muted)}.tw\\:data-\\[variant\\=destructive\\]\\:text-destructive[data-variant=destructive]{color:var(--destructive)}:is(:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:\\*\\*\\:text-accent-foreground\\! *)[data-variant=destructive] *),:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:text-accent-foreground\\! *)[data-variant=destructive]{color:var(--accent-foreground)!important}.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:text-destructive[data-variant=destructive]:focus{color:var(--destructive)}:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-foreground\\/10\\! *)[data-variant=destructive]:focus{background-color:var(--foreground)!important}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-foreground\\/10\\! *)[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)!important}}.tw\\:data-\\[variant\\=line\\]\\:rounded-none[data-variant=line]{border-radius:0}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:border-s-0:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"][data-variant=outline]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:border-t-0:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"][data-variant=outline]{border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:first\\:border-s:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"][data-variant=outline]:first-child{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:first\\:border-t:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"][data-variant=outline]:first-child{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:inset-x-0[data-vaul-drawer-direction=bottom]{inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:bottom-0[data-vaul-drawer-direction=bottom]{bottom:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:mt-24[data-vaul-drawer-direction=bottom]{margin-top:calc(calc(var(--spacing)) * 24)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:max-h-\\[80vh\\][data-vaul-drawer-direction=bottom]{max-height:80vh}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:rounded-t-xl[data-vaul-drawer-direction=bottom]{border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:border-t[data-vaul-drawer-direction=bottom]{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:inset-y-0[data-vaul-drawer-direction=left]{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:left-0[data-vaul-drawer-direction=left]{left:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:w-3\\/4[data-vaul-drawer-direction=left]{width:75%}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:flex-row[data-vaul-drawer-direction=left]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:rounded-r-xl[data-vaul-drawer-direction=left]{border-top-right-radius:calc(var(--radius) * 1.4);border-bottom-right-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:border-r[data-vaul-drawer-direction=left]{border-right-style:var(--tw-border-style);border-right-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=left\\/right\\]\\:flex-row[data-vaul-drawer-direction=left\\/right]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:inset-y-0[data-vaul-drawer-direction=right]{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:right-0[data-vaul-drawer-direction=right]{right:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:w-3\\/4[data-vaul-drawer-direction=right]{width:75%}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:flex-row[data-vaul-drawer-direction=right]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:rounded-l-xl[data-vaul-drawer-direction=right]{border-top-left-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:border-l[data-vaul-drawer-direction=right]{border-left-style:var(--tw-border-style);border-left-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:inset-x-0[data-vaul-drawer-direction=top]{inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:top-0[data-vaul-drawer-direction=top]{top:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:mb-24[data-vaul-drawer-direction=top]{margin-bottom:calc(calc(var(--spacing)) * 24)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:max-h-\\[80vh\\][data-vaul-drawer-direction=top]{max-height:80vh}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:rounded-b-xl[data-vaul-drawer-direction=top]{border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:border-b[data-vaul-drawer-direction=top]{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.tw\\:supports-backdrop-filter\\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--tw-blur-xs));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}}@media (min-width:40rem){.tw\\:sm\\:flex{display:flex}.tw\\:sm\\:max-w-sm{max-width:var(--tw-container-sm)}.tw\\:sm\\:flex-row{flex-direction:row}.tw\\:sm\\:justify-end{justify-content:flex-end}.tw\\:sm\\:p-8{padding:calc(calc(var(--spacing)) * 8)}.tw\\:sm\\:text-start{text-align:start}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:sm\\:max-w-sm[data-vaul-drawer-direction=left],.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:sm\\:max-w-sm[data-vaul-drawer-direction=right]{max-width:var(--tw-container-sm)}}@media (min-width:48rem){.tw\\:md\\:block{display:block}.tw\\:md\\:flex{display:flex}.tw\\:md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:md\\:gap-0\\.5{gap:calc(calc(var(--spacing)) * .5)}.tw\\:md\\:text-start{text-align:start}.tw\\:md\\:text-sm{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:md\\:text-pretty{text-wrap:pretty}.tw\\:md\\:opacity-0{opacity:0}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:m-2:is(:where(.tw\\:peer)[data-variant=inset]~*){margin:calc(calc(var(--spacing)) * 2)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:ms-0:is(:where(.tw\\:peer)[data-variant=inset]~*){margin-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:rounded-xl:is(:where(.tw\\:peer)[data-variant=inset]~*){border-radius:calc(var(--radius) * 1.4)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:shadow-sm:is(:where(.tw\\:peer)[data-variant=inset]~*){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:peer-data-\\[state\\=collapsed\\]\\:ms-2:is(:where(.tw\\:peer)[data-variant=inset]~*):is(:where(.tw\\:peer)[data-state=collapsed]~*){margin-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:md\\:after\\:hidden:after{content:var(--tw-content);display:none}}@media (min-width:64rem){.tw\\:lg\\:flex{display:flex}.tw\\:lg\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}:where(.tw\\:lg\\:space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 8) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 8) * calc(1 - var(--tw-space-x-reverse)))}.tw\\:lg\\:text-5xl{font-size:var(--tw-text-5xl);line-height:var(--tw-leading,var(--tw-text-5xl--line-height))}}@media (min-width:48rem){@media (min-width:64rem){.tw\\:md\\:lg\\:hidden{display:none}}}@media (min-width:80rem){.tw\\:xl\\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.tw\\:xl\\:grid-flow-col{grid-auto-flow:column}.tw\\:xl\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:xl\\:grid-cols-none{grid-template-columns:none}.tw\\:xl\\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}}@container search not (min-width:7rem){.tw\\:\\@max-\\[7rem\\]\\/search\\:hidden{display:none}.tw\\:\\@max-\\[7rem\\]\\/search\\:ps-3{padding-inline-start:calc(calc(var(--spacing)) * 3)}}@container search not (min-width:4rem){.tw\\:\\@max-\\[4rem\\]\\/search\\:hidden{display:none}.tw\\:\\@max-\\[4rem\\]\\/search\\:pe-3{padding-inline-end:calc(calc(var(--spacing)) * 3)}}@container search not (min-width:3rem){.tw\\:\\@max-\\[3rem\\]\\/search\\:ps-0{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\@max-\\[3rem\\]\\/search\\:pe-0{padding-inline-end:calc(calc(var(--spacing)) * 0)}}@container (min-width:24rem){.tw\\:\\@sm\\:basis-auto{flex-basis:auto}}.tw\\:ltr\\:left-2:where(:dir(ltr),[dir=ltr],[dir=ltr] *){left:calc(calc(var(--spacing)) * 2)}.tw\\:ltr\\:-translate-x-1\\/2:where(:dir(ltr),[dir=ltr],[dir=ltr] *){--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:right-2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:calc(calc(var(--spacing)) * 2)}.tw\\:rtl\\:flex:where(:dir(rtl),[dir=rtl],[dir=rtl] *){display:flex}.tw\\:rtl\\:-translate-x-px:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:translate-x-1\\/2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:translate-x-px:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:after\\:translate-x-1\\/2:where(:dir(rtl),[dir=rtl],[dir=rtl] *):after{content:var(--tw-content);--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=primary]) .tw\\:rtl\\:in-data-\\[side\\=primary\\]\\:cursor-e-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:e-resize}:where([data-side=secondary]) .tw\\:rtl\\:in-data-\\[side\\=secondary\\]\\:cursor-w-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:w-resize}.tw\\:rtl\\:aria-\\[orientation\\=horizontal\\]\\:after\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:data-\\[side\\=left\\]\\:translate-x-1:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-side=left]{--tw-translate-x:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:data-\\[side\\=right\\]\\:-translate-x-1:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-side=right]{--tw-translate-x:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:border-input:is(.dark *){border-color:var(--input)}.tw\\:dark\\:bg-destructive\\/20:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:bg-destructive\\/20:is(.dark *){background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:dark\\:bg-input\\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:bg-input\\/30:is(.dark *){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:dark\\:bg-transparent:is(.dark *){background-color:#0000}.tw\\:dark\\:text-amber-400:is(.dark *){color:var(--tw-color-amber-400)}.tw\\:dark\\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}.tw\\:dark\\:text-rose-400:is(.dark *){color:var(--tw-color-rose-400)}.tw\\:dark\\:text-sky-400:is(.dark *){color:var(--tw-color-sky-400)}.tw\\:dark\\:text-teal-400:is(.dark *){color:var(--tw-color-teal-400)}.tw\\:dark\\:after\\:mix-blend-lighten:is(.dark *):after{content:var(--tw-content);mix-blend-mode:lighten}@media (hover:hover){.tw\\:dark\\:hover\\:bg-blue-500:is(.dark *):hover{background-color:var(--tw-color-blue-500)}.tw\\:dark\\:hover\\:bg-destructive\\/30:is(.dark *):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-destructive\\/30:is(.dark *):hover{background-color:color-mix(in oklab, var(--destructive) 30%, transparent)}}.tw\\:dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:dark\\:hover\\:bg-muted\\/50:is(.dark *):hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-muted\\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:dark\\:hover\\:text-foreground:is(.dark *):hover{color:var(--foreground)}}.tw\\:dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:disabled\\:bg-input\\/80:is(.dark *):disabled{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:disabled\\:bg-input\\/80:is(.dark *):disabled{background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:dark\\:disabled\\:bg-transparent:is(.dark *):disabled{background-color:#0000}:where([data-slot=tooltip-content]) .tw\\:dark\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/10:is(.dark *){background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){:where([data-slot=tooltip-content]) .tw\\:dark\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/10:is(.dark *){background-color:color-mix(in oklab, var(--background) 10%, transparent)}}.tw\\:dark\\:has-disabled\\:bg-input\\/80:is(.dark *):has(:disabled){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:has-disabled\\:bg-input\\/80:is(.dark *):has(:disabled){background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:dark\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/40:is(.dark *):has([data-slot][aria-invalid=true]){--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/40:is(.dark *):has([data-slot][aria-invalid=true]){--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:aria-invalid\\:border-destructive\\/50:is(.dark *)[aria-invalid=true]{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:aria-invalid\\:border-destructive\\/50:is(.dark *)[aria-invalid=true]{border-color:color-mix(in oklab, var(--destructive) 50%, transparent)}}.tw\\:dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:data-open\\:animate-in:where([data-state=open]),.tw\\:data-open\\:animate-in:where([data-open]:not([data-open=false])){animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-open\\:bg-accent:where([data-state=open]),.tw\\:data-open\\:bg-accent:where([data-open]:not([data-open=false])){background-color:var(--accent)}.tw\\:data-open\\:text-accent-foreground:where([data-state=open]),.tw\\:data-open\\:text-accent-foreground:where([data-open]:not([data-open=false])){color:var(--accent-foreground)}.tw\\:data-open\\:fade-in-0:where([data-state=open]),.tw\\:data-open\\:fade-in-0:where([data-open]:not([data-open=false])){--tw-enter-opacity:0}.tw\\:data-open\\:zoom-in-95:where([data-state=open]),.tw\\:data-open\\:zoom-in-95:where([data-open]:not([data-open=false])){--tw-enter-scale:.95}@media (hover:hover){:is(.tw\\:data-open\\:hover\\:bg-sidebar-accent:where([data-state=open]),.tw\\:data-open\\:hover\\:bg-sidebar-accent:where([data-open]:not([data-open=false]))):hover{background-color:var(--sidebar-accent)}:is(.tw\\:data-open\\:hover\\:text-sidebar-accent-foreground:where([data-state=open]),.tw\\:data-open\\:hover\\:text-sidebar-accent-foreground:where([data-open]:not([data-open=false]))):hover{color:var(--sidebar-accent-foreground)}}.tw\\:data-closed\\:animate-out:where([data-state=closed]),.tw\\:data-closed\\:animate-out:where([data-closed]:not([data-closed=false])){animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-closed\\:fade-out-0:where([data-state=closed]),.tw\\:data-closed\\:fade-out-0:where([data-closed]:not([data-closed=false])){--tw-exit-opacity:0}.tw\\:data-closed\\:zoom-out-95:where([data-state=closed]),.tw\\:data-closed\\:zoom-out-95:where([data-closed]:not([data-closed=false])){--tw-exit-scale:.95}.tw\\:data-checked\\:border-primary:where([data-state=checked]),.tw\\:data-checked\\:border-primary:where([data-checked]:not([data-checked=false])){border-color:var(--primary)}.tw\\:data-checked\\:bg-primary:where([data-state=checked]),.tw\\:data-checked\\:bg-primary:where([data-checked]:not([data-checked=false])){background-color:var(--primary)}.tw\\:data-checked\\:text-primary-foreground:where([data-state=checked]),.tw\\:data-checked\\:text-primary-foreground:where([data-checked]:not([data-checked=false])){color:var(--primary-foreground)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=checked]),.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-checked]:not([data-checked=false])),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=checked]),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-checked]:not([data-checked=false])){--tw-translate-x:calc(100% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=checked]),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-checked]:not([data-checked=false])),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=checked]),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-checked]:not([data-checked=false])){--tw-translate-x:calc(calc(100% - 2px) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:data-checked\\:bg-primary:is(.dark *):where([data-state=checked]),.tw\\:dark\\:data-checked\\:bg-primary:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--primary)}.tw\\:dark\\:data-checked\\:bg-primary-foreground:is(.dark *):where([data-state=checked]),.tw\\:dark\\:data-checked\\:bg-primary-foreground:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--primary-foreground)}.tw\\:data-unchecked\\:bg-input:where([data-state=unchecked]),.tw\\:data-unchecked\\:bg-input:where([data-unchecked]:not([data-unchecked=false])){background-color:var(--input)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=unchecked]),.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=unchecked]),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=unchecked]),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=unchecked]),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-unchecked]:not([data-unchecked=false])){--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:data-unchecked\\:bg-foreground:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-foreground:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:var(--foreground)}.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:data-selected\\:bg-muted:where([data-selected=true]),.tw\\:data-selected\\:bg-muted\\/50:where([data-selected=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:bg-muted\\/50:where([data-selected=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:data-selected\\:bg-primary:where([data-selected=true]){background-color:var(--primary)}.tw\\:data-selected\\:bg-transparent:where([data-selected=true]){background-color:#0000}.tw\\:data-selected\\:text-foreground:where([data-selected=true]){color:var(--foreground)}.tw\\:data-selected\\:text-inherit:where([data-selected=true]){color:inherit}.tw\\:data-selected\\:text-muted-foreground\\/50:where([data-selected=true]){color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:text-muted-foreground\\/50:where([data-selected=true]){color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.tw\\:data-selected\\:text-primary-foreground:where([data-selected=true]){color:var(--primary-foreground)}.tw\\:data-selected\\:ring-2:where([data-selected=true]){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-selected\\:ring-primary-foreground\\/70:where([data-selected=true]){--tw-ring-color:var(--primary-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:ring-primary-foreground\\/70:where([data-selected=true]){--tw-ring-color:color-mix(in oklab, var(--primary-foreground) 70%, transparent)}}.tw\\:data-selected\\:ring-ring\\/50:where([data-selected=true]){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:ring-ring\\/50:where([data-selected=true]){--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:data-selected\\:ring-inset:where([data-selected=true]){--tw-ring-inset:inset}@media (forced-colors:active){.tw\\:forced-colors\\:data-selected\\:outline-2:where([data-selected=true]){outline-style:var(--tw-outline-style);outline-width:2px}.tw\\:forced-colors\\:data-selected\\:-outline-offset-2:where([data-selected=true]){outline-offset:calc(2px * -1)}.tw\\:forced-colors\\:data-selected\\:outline-\\[color\\:Highlight\\]:where([data-selected=true]){outline-color:highlight}}.tw\\:data-disabled\\:pointer-events-none:where([data-disabled=true]),.tw\\:data-disabled\\:pointer-events-none:where([data-disabled]:not([data-disabled=false])){pointer-events:none}.tw\\:data-disabled\\:cursor-not-allowed:where([data-disabled=true]),.tw\\:data-disabled\\:cursor-not-allowed:where([data-disabled]:not([data-disabled=false])){cursor:not-allowed}.tw\\:data-disabled\\:opacity-50:where([data-disabled=true]),.tw\\:data-disabled\\:opacity-50:where([data-disabled]:not([data-disabled=false])){opacity:.5}.tw\\:data-active\\:bg-background:where([data-state=active]),.tw\\:data-active\\:bg-background:where([data-active]:not([data-active=false])){background-color:var(--background)}.tw\\:data-active\\:bg-sidebar-accent:where([data-state=active]),.tw\\:data-active\\:bg-sidebar-accent:where([data-active]:not([data-active=false])){background-color:var(--sidebar-accent)}.tw\\:data-active\\:font-medium:where([data-state=active]),.tw\\:data-active\\:font-medium:where([data-active]:not([data-active=false])){--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:data-active\\:text-foreground:where([data-state=active]),.tw\\:data-active\\:text-foreground:where([data-active]:not([data-active=false])){color:var(--foreground)}.tw\\:data-active\\:text-sidebar-accent-foreground:where([data-state=active]),.tw\\:data-active\\:text-sidebar-accent-foreground:where([data-active]:not([data-active=false])){color:var(--sidebar-accent-foreground)}.tw\\:group-data-\\[variant\\=default\\]\\/tabs-list\\:data-active\\:shadow-sm:is(:where(.tw\\:group\\/tabs-list)[data-variant=default] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=default\\]\\/tabs-list\\:data-active\\:shadow-sm:is(:where(.tw\\:group\\/tabs-list)[data-variant=default] *):where([data-active]:not([data-active=false])){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:shadow-none:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:shadow-none:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:is(.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:after\\:opacity-100:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:after\\:opacity-100:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false]))):after{content:var(--tw-content);opacity:1}.tw\\:dark\\:data-active\\:border-input:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:border-input:is(.dark *):where([data-active]:not([data-active=false])){border-color:var(--input)}.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:dark\\:data-active\\:text-foreground:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:text-foreground:is(.dark *):where([data-active]:not([data-active=false])){color:var(--foreground)}.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:border-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:border-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){border-color:#0000}.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.tw\\:data-horizontal\\:mx-px:where([data-orientation=horizontal]){margin-inline:1px}.tw\\:data-horizontal\\:h-1:where([data-orientation=horizontal]){height:calc(calc(var(--spacing)) * 1)}.tw\\:data-horizontal\\:h-full:where([data-orientation=horizontal]){height:100%}.tw\\:data-horizontal\\:h-px:where([data-orientation=horizontal]){height:1px}.tw\\:data-horizontal\\:w-auto:where([data-orientation=horizontal]){width:auto}.tw\\:data-horizontal\\:w-full:where([data-orientation=horizontal]){width:100%}.tw\\:data-horizontal\\:flex-col:where([data-orientation=horizontal]){flex-direction:column}.tw\\:data-vertical\\:my-px:where([data-orientation=vertical]){margin-block:1px}.tw\\:data-vertical\\:h-auto:where([data-orientation=vertical]){height:auto}.tw\\:data-vertical\\:h-full:where([data-orientation=vertical]){height:100%}.tw\\:data-vertical\\:min-h-40:where([data-orientation=vertical]){min-height:calc(calc(var(--spacing)) * 40)}.tw\\:data-vertical\\:w-1:where([data-orientation=vertical]){width:calc(calc(var(--spacing)) * 1)}.tw\\:data-vertical\\:w-auto:where([data-orientation=vertical]){width:auto}.tw\\:data-vertical\\:w-full:where([data-orientation=vertical]){width:100%}.tw\\:data-vertical\\:w-px:where([data-orientation=vertical]){width:1px}.tw\\:data-vertical\\:flex-col:where([data-orientation=vertical]){flex-direction:column}.tw\\:data-vertical\\:items-stretch:where([data-orientation=vertical]){align-items:stretch}.tw\\:data-vertical\\:self-stretch:where([data-orientation=vertical]){align-self:stretch}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:mt-0 [data-lexical-editor=true]>blockquote{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:border-s-0 [data-lexical-editor=true]>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:ps-0 [data-lexical-editor=true]>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:font-normal [data-lexical-editor=true]>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:text-foreground [data-lexical-editor=true]>blockquote{color:var(--foreground)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:not-italic [data-lexical-editor=true]>blockquote{font-style:normal}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:mt-0 [data-lexical-editor=\\"true\\"]>blockquote{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:border-s-0 [data-lexical-editor=\\"true\\"]>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:ps-0 [data-lexical-editor=\\"true\\"]>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:font-normal [data-lexical-editor=\\"true\\"]>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:text-foreground [data-lexical-editor=\\"true\\"]>blockquote{color:var(--foreground)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:not-italic [data-lexical-editor=\\"true\\"]>blockquote{font-style:normal}.tw\\:\\[\\&_a\\]\\:underline a{text-decoration-line:underline}.tw\\:\\[\\&_a\\]\\:underline-offset-3 a{text-underline-offset:3px}@media (hover:hover){.tw\\:\\[\\&_a\\]\\:hover\\:text-foreground a:hover{color:var(--foreground)}}.tw\\:\\[\\&_p\\]\\:my-0 p{margin-block:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_p\\:not\\(\\:last-child\\)\\]\\:mb-4 p:not(:last-child){margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_s\\]\\:text-destructive s{color:var(--destructive)}.tw\\:\\[\\&_s\\]\\:line-through s{text-decoration-line:line-through}.tw\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.tw\\:\\[\\&_svg\\]\\:size-4 svg{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3\\.5 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_tr\\]\\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.tw\\:\\[\\&_tr\\:last-child\\]\\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.tw\\:\\[\\&_u\\]\\:font-semibold u{--tw-font-weight:var(--tw-font-weight-semibold);font-weight:var(--tw-font-weight-semibold)}.tw\\:\\[\\&_u\\]\\:text-success-foreground u{color:var(--success-foreground)}.tw\\:\\[\\&_u\\]\\:no-underline u{text-decoration-line:none}.tw\\:\\[\\&\\:has\\(\\[role\\=checkbox\\]\\)\\]\\:pe-0:has([role=checkbox]){padding-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\.border-b\\]\\:pb-2.border-b{padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:\\[\\.border-b\\]\\:pb-4.border-b{padding-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:\\[\\.border-b\\]\\:pb-3:is(:where(.tw\\:group\\/card)[data-size=sm] *).border-b{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:\\[\\.border-t\\]\\:pt-2.border-t{padding-top:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:px-2 *)[cmdk-group-heading]{padding-inline:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:py-1\\.5 *)[cmdk-group-heading]{padding-block:calc(calc(var(--spacing)) * 1.5)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:text-xs *)[cmdk-group-heading]{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:font-medium *)[cmdk-group-heading]{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:text-muted-foreground *)[cmdk-group-heading]{color:var(--muted-foreground)}:is(.tw\\:\\*\\:\\[a\\]\\:underline>*):is(a){text-decoration-line:underline}:is(.tw\\:\\*\\:\\[a\\]\\:underline-offset-3>*):is(a){text-underline-offset:3px}@media (hover:hover){.tw\\:\\[a\\]\\:hover\\:bg-destructive\\/20:is(a):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-destructive\\/20:is(a):hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:\\[a\\]\\:hover\\:bg-muted:is(a):hover{background-color:var(--muted)}.tw\\:\\[a\\]\\:hover\\:bg-primary\\/80:is(a):hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-primary\\/80:is(a):hover{background-color:color-mix(in oklab, var(--primary) 80%, transparent)}}.tw\\:\\[a\\]\\:hover\\:bg-secondary\\/80:is(a):hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-secondary\\/80:is(a):hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.tw\\:\\[a\\]\\:hover\\:text-muted-foreground:is(a):hover{color:var(--muted-foreground)}:is(.tw\\:\\*\\:\\[a\\]\\:hover\\:text-foreground>*):is(a):hover{color:var(--foreground)}}:is(.tw\\:\\*\\:\\[img\\]\\:row-span-2>*):is(img){grid-row:span 2/span 2}:is(.tw\\:\\*\\:\\[img\\]\\:translate-y-0\\.5>*):is(img){--tw-translate-y:calc(calc(var(--spacing)) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.tw\\:\\*\\:\\[img\\]\\:text-current>*):is(img){color:currentColor}:is(.tw\\:\\*\\:\\[img\\:first-child\\]\\:rounded-t-xl>*):is(img:first-child){border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}:is(.tw\\:\\*\\:\\[img\\:last-child\\]\\:rounded-b-xl>*):is(img:last-child){border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}:is(.tw\\:\\*\\:\\[img\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>*):is(img:not([class*=size-])){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:flex>*):is(span):last-child{display:flex}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:items-center>*):is(span):last-child{align-items:center}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:gap-2>*):is(span):last-child{gap:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\:\\[svg\\]\\:row-span-2>*):is(svg){grid-row:span 2/span 2}:is(.tw\\:\\*\\:\\[svg\\]\\:translate-y-0\\.5>*):is(svg){--tw-translate-y:calc(calc(var(--spacing)) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.tw\\:\\*\\:\\[svg\\]\\:text-current>*):is(svg){color:currentColor}:is(.tw\\:focus\\:\\*\\:\\[svg\\]\\:text-accent-foreground:focus>*):is(svg){color:var(--accent-foreground)}:is(.tw\\:data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:text-destructive[data-variant=destructive]>*):is(svg){color:var(--destructive)}:is(.tw\\:data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:text-destructive\\![data-variant=destructive]>*):is(svg){color:var(--destructive)!important}:is(.tw\\:data-selected\\:\\*\\:\\[svg\\]\\:text-foreground:where([data-selected=true])>*):is(svg){color:var(--foreground)}:is(.tw\\:\\*\\:\\[svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>*):is(svg:not([class*=size-])){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-s-none>:not(:first-child){border-start-start-radius:0;border-end-start-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-t-none>:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-s-0>:not(:first-child){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-t-0>:not(:first-child){border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-e-none>:not(:last-child){border-start-end-radius:0;border-end-end-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-b-none>:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.tw\\:has-\\[select\\[aria-hidden\\=true\\]\\:last-child\\]\\:\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:last-of-type\\]\\:rounded-e-lg:has(:is(select[aria-hidden=true]:last-child))>[data-slot=select-trigger]:last-of-type{border-start-end-radius:var(--radius);border-end-end-radius:var(--radius)}.tw\\:\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:not\\(\\[class\\*\\=w-\\]\\)\\]\\:w-fit>[data-slot=select-trigger]:not([class*=w-]){width:fit-content}.tw\\:\\[\\&\\>\\[data-slot\\]\\:not\\(\\:has\\(\\~\\[data-slot\\]\\)\\)\\]\\:rounded-e-lg\\!>[data-slot]:not(:has(~[data-slot])){border-start-end-radius:var(--radius)!important;border-end-end-radius:var(--radius)!important}.tw\\:\\[\\&\\>\\[data-slot\\]\\:not\\(\\:has\\(\\~\\[data-slot\\]\\)\\)\\]\\:rounded-b-lg\\!>[data-slot]:not(:has(~[data-slot])){border-bottom-right-radius:var(--radius)!important;border-bottom-left-radius:var(--radius)!important}.tw\\:\\[\\&\\>a\\]\\:underline>a{text-decoration-line:underline}.tw\\:\\[\\&\\>a\\]\\:underline-offset-4>a{text-underline-offset:4px}.tw\\:\\[\\&\\>a\\:hover\\]\\:text-primary>a:hover{color:var(--primary)}.tw\\:\\[\\&\\>blockquote\\]\\:my-0>blockquote{margin-block:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:border-s-0>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&\\>blockquote\\]\\:p-0>blockquote{padding:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:ps-0>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:font-normal>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&\\>blockquote\\]\\:text-foreground>blockquote{color:var(--foreground)}.tw\\:\\[\\&\\>blockquote\\]\\:not-italic>blockquote{font-style:normal}.tw\\:\\[\\&\\>input\\]\\:flex-1>input{flex:1}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:\\[\\&\\>input\\]\\:pt-3:has(>[data-align=block-end])>input{padding-top:calc(calc(var(--spacing)) * 3)}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:\\[\\&\\>input\\]\\:pb-3:has(>[data-align=block-start])>input{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:has-\\[\\>\\[data-align\\=inline-end\\]\\]\\:\\[\\&\\>input\\]\\:pe-1\\.5:has(>[data-align=inline-end])>input{padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-\\[\\>\\[data-align\\=inline-start\\]\\]\\:\\[\\&\\>input\\]\\:ps-1\\.5:has(>[data-align=inline-start])>input{padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:\\[\\&\\>kbd\\]\\:rounded-\\[calc\\(var\\(--radius\\)-5px\\)\\]>kbd{border-radius:calc(var(--radius) - 5px)}.tw\\:\\[\\&\\>li\\]\\:mt-2>li{margin-top:calc(calc(var(--spacing)) * 2)}.tw\\:\\[\\&\\>span\\:last-child\\]\\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tw\\:\\[\\&\\>svg\\]\\:pointer-events-none>svg{pointer-events:none}.tw\\:\\[\\&\\>svg\\]\\:hidden>svg{display:none}.tw\\:\\[\\&\\>svg\\]\\:size-3\\!>svg{width:calc(calc(var(--spacing)) * 3)!important;height:calc(calc(var(--spacing)) * 3)!important}.tw\\:\\[\\&\\>svg\\]\\:size-3\\.5>svg{width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&\\>svg\\]\\:size-4>svg{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>svg\\]\\:shrink-0>svg{flex-shrink:0}.tw\\:\\[\\&\\>svg\\]\\:text-sidebar-accent-foreground>svg{color:var(--sidebar-accent-foreground)}.tw\\:group-has-data-\\[size\\=lg\\]\\/avatar-group\\:\\[\\&\\>svg\\]\\:size-5:is(:where(.tw\\:group\\/avatar-group):has([data-size=lg]) *)>svg{width:calc(calc(var(--spacing)) * 5);height:calc(calc(var(--spacing)) * 5)}.tw\\:group-has-data-\\[size\\=sm\\]\\/avatar-group\\:\\[\\&\\>svg\\]\\:size-3:is(:where(.tw\\:group\\/avatar-group):has([data-size=sm]) *)>svg{width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=default\\]\\/avatar\\:\\[\\&\\>svg\\]\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=default] *)>svg,.tw\\:group-data-\\[size\\=lg\\]\\/avatar\\:\\[\\&\\>svg\\]\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=lg] *)>svg{width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:\\[\\&\\>svg\\]\\:hidden:is(:where(.tw\\:group\\/avatar)[data-size=sm] *)>svg,.tw\\:\\[\\&\\>svg\\:last-child\\]\\:hidden>svg:last-child{display:none}.tw\\:\\[\\&\\>svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3\\.5>svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&\\>svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>tr\\]\\:last\\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:\\[\\&\\[align\\=center\\]\\]\\:text-center[align=center]{text-align:center}.tw\\:\\[\\&\\[align\\=right\\]\\]\\:text-right[align=right]{text-align:right}.tw\\:\\[\\&\\[aria-orientation\\=horizontal\\]\\>div\\]\\:rotate-90[aria-orientation=horizontal]>div{rotate:90deg}[data-side=primary][data-collapsible=offcanvas] .tw\\:\\[\\[data-side\\=primary\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-end-2{inset-inline-end:calc(calc(var(--spacing)) * -2)}[data-side=primary][data-state=collapsed] .tw\\:\\[\\[data-side\\=primary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-e-resize{cursor:e-resize}[data-side=primary][data-state=collapsed] .tw\\:rtl\\:\\[\\[data-side\\=primary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-w-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:w-resize}[data-side=secondary][data-collapsible=offcanvas] .tw\\:\\[\\[data-side\\=secondary\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-start-2{inset-inline-start:calc(calc(var(--spacing)) * -2)}[data-side=secondary][data-state=collapsed] .tw\\:\\[\\[data-side\\=secondary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-w-resize{cursor:w-resize}[data-side=secondary][data-state=collapsed] .tw\\:rtl\\:\\[\\[data-side\\=secondary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-e-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:e-resize}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-cyrillic-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-cyrillic-wght-normal.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-greek-wght-normal.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-vietnamese-wght-normal.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-latin-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-latin-wght-normal.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}.light,:root{--radius:.625rem;--spacing:.25rem;--background:oklch(100% 0 0);--foreground:oklch(13.71% .036 258.53);--card:oklch(100% 0 0);--card-foreground:oklch(13.71% .036 258.53);--popover:oklch(98.43% .0018 248.56);--popover-foreground:oklch(13.71% .036 258.53);--primary:oklch(20.79% .0399 265.73);--primary-foreground:oklch(98.38% .0036 248.23);--secondary:oklch(95.89% .011 248.06);--secondary-foreground:oklch(20.79% .0399 265.73);--muted:oklch(95.89% .011 248.06);--muted-foreground:oklch(55.47% .0408 257.45);--accent:oklch(95.89% .011 248.06);--accent-foreground:oklch(20.79% .0399 265.73);--destructive:oklch(63.69% .2077 25.32);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(62.7% .194 149.214);--diff-deleted:oklch(57.7% .245 27.325);--warning:oklch(84% .16 84);--warning-foreground:oklch(28% .07 46);--border:oklch(92.9% .0127 255.58);--input:oklch(92.9% .0127 255.58);--ring:oklch(13.71% .036 258.53);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.43% .0018 248.56);--sidebar-foreground:oklch(13.71% .036 258.53);--sidebar-primary:oklch(20.79% .0399 265.73);--sidebar-primary-foreground:oklch(98.38% .0036 248.23);--sidebar-accent:oklch(95.89% .011 248.06);--sidebar-accent-foreground:oklch(20.79% .0399 265.73);--sidebar-border:oklch(92.9% .0127 255.58);--sidebar-ring:oklch(13.71% .036 258.53)}.dark{--background:oklch(13.71% .036 258.53);--foreground:oklch(98.38% .0036 248.23);--card:oklch(13.71% .036 258.53);--card-foreground:oklch(98.38% .0036 248.23);--popover:oklch(13.71% .036 258.53);--popover-foreground:oklch(98.38% .0036 248.23);--primary:oklch(98.38% .0036 248.23);--primary-foreground:oklch(20.79% .0399 265.73);--secondary:oklch(28% .037 259.98);--secondary-foreground:oklch(98.38% .0036 248.23);--muted:oklch(28% .037 259.98);--muted-foreground:oklch(71.07% .0351 256.8);--accent:oklch(28% .037 259.98);--accent-foreground:oklch(98.38% .0036 248.23);--destructive:oklch(39.6% .1331 25.71);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(79.2% .209 151.711);--diff-deleted:oklch(70.4% .191 22.216);--warning:oklch(41% .11 46);--warning-foreground:oklch(99% .02 95);--border:oklch(44.54% .0374 257.3);--input:oklch(44.54% .0374 257.3);--ring:oklch(86.88% .0199 252.89);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(13.71% .036 258.53);--sidebar-foreground:oklch(71.07% .0351 256.8);--sidebar-primary:oklch(98.38% .0036 248.23);--sidebar-primary-foreground:oklch(20.79% .0399 265.73);--sidebar-accent:oklch(28% .037 259.98);--sidebar-accent-foreground:oklch(71.07% .0351 256.8);--sidebar-border:oklch(28% .037 259.98);--sidebar-ring:oklch(86.88% .0199 252.89)}.paratext-light{--background:oklch(100% 0 0);--foreground:oklch(15.3% .006 107.1);--card:oklch(100% 0 0);--card-foreground:oklch(15.3% .006 107.1);--popover:oklch(100% 0 0);--popover-foreground:oklch(15.3% .006 107.1);--primary:oklch(55.5% .163 48.998);--primary-foreground:oklch(98.7% .022 95.277);--secondary:oklch(96.7% .001 286.375);--secondary-foreground:oklch(21% .006 285.885);--muted:oklch(96.6% .005 106.5);--muted-foreground:oklch(58% .031 107.3);--accent:oklch(96.6% .005 106.5);--accent-foreground:oklch(22.8% .013 107.4);--destructive:oklch(57.7% .245 27.325);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(62.7% .194 149.214);--diff-deleted:oklch(57.7% .245 27.325);--warning:oklch(84% .16 84);--warning-foreground:oklch(28% .07 46);--border:oklch(93% .007 106.5);--input:oklch(93% .007 106.5);--ring:oklch(73.7% .021 106.9);--chart-1:oklch(88% .011 106.6);--chart-2:oklch(58% .031 107.3);--chart-3:oklch(46.6% .025 107.3);--chart-4:oklch(39.4% .023 107.4);--chart-5:oklch(28.6% .016 107.4);--sidebar:oklch(98.8% .003 106.5);--sidebar-foreground:oklch(15.3% .006 107.1);--sidebar-primary:oklch(66.6% .179 58.318);--sidebar-primary-foreground:oklch(98.7% .022 95.277);--sidebar-accent:oklch(96.6% .005 106.5);--sidebar-accent-foreground:oklch(22.8% .013 107.4);--sidebar-border:oklch(93% .007 106.5);--sidebar-ring:oklch(73.7% .021 106.9)}.paratext-dark{--background:oklch(15.3% .006 107.1);--foreground:oklch(98.8% .003 106.5);--card:oklch(22.8% .013 107.4);--card-foreground:oklch(98.8% .003 106.5);--popover:oklch(22.8% .013 107.4);--popover-foreground:oklch(98.8% .003 106.5);--primary:oklch(47.3% .137 46.201);--primary-foreground:oklch(98.7% .022 95.277);--secondary:oklch(27.4% .006 286.033);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(28.6% .016 107.4);--muted-foreground:oklch(73.7% .021 106.9);--accent:oklch(28.6% .016 107.4);--accent-foreground:oklch(98.8% .003 106.5);--destructive:oklch(70.4% .191 22.216);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(79.2% .209 151.711);--diff-deleted:oklch(70.4% .191 22.216);--warning:oklch(41% .11 46);--warning-foreground:oklch(99% .02 95);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(58% .031 107.3);--chart-1:oklch(88% .011 106.6);--chart-2:oklch(58% .031 107.3);--chart-3:oklch(46.6% .025 107.3);--chart-4:oklch(39.4% .023 107.4);--chart-5:oklch(28.6% .016 107.4);--sidebar:oklch(22.8% .013 107.4);--sidebar-foreground:oklch(98.8% .003 106.5);--sidebar-primary:oklch(76.9% .188 70.08);--sidebar-primary-foreground:oklch(27.9% .077 45.635);--sidebar-accent:oklch(28.6% .016 107.4);--sidebar-accent-foreground:oklch(98.8% .003 106.5);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(58% .031 107.3)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}} +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--tw-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--tw-color-red-100:oklch(93.6% .032 17.717);--tw-color-red-200:oklch(88.5% .062 18.334);--tw-color-red-300:oklch(80.8% .114 19.571);--tw-color-red-400:oklch(70.4% .191 22.216);--tw-color-red-500:oklch(63.7% .237 25.331);--tw-color-red-600:oklch(57.7% .245 27.325);--tw-color-red-700:oklch(50.5% .213 27.518);--tw-color-red-800:oklch(44.4% .177 26.899);--tw-color-orange-100:oklch(95.4% .038 75.164);--tw-color-orange-800:oklch(47% .157 37.304);--tw-color-amber-200:oklch(92.4% .12 95.746);--tw-color-amber-400:oklch(82.8% .189 84.429);--tw-color-amber-500:oklch(76.9% .188 70.08);--tw-color-amber-600:oklch(66.6% .179 58.318);--tw-color-yellow-50:oklch(98.7% .026 102.212);--tw-color-yellow-100:oklch(97.3% .071 103.193);--tw-color-yellow-400:oklch(85.2% .199 91.936);--tw-color-yellow-500:oklch(79.5% .184 86.047);--tw-color-yellow-600:oklch(68.1% .162 75.834);--tw-color-yellow-700:oklch(55.4% .135 66.442);--tw-color-green-50:oklch(98.2% .018 155.826);--tw-color-green-100:oklch(96.2% .044 156.743);--tw-color-green-500:oklch(72.3% .219 149.579);--tw-color-green-600:oklch(62.7% .194 149.214);--tw-color-green-700:oklch(52.7% .154 150.069);--tw-color-green-800:oklch(44.8% .119 151.328);--tw-color-teal-400:oklch(77.7% .152 181.912);--tw-color-teal-500:oklch(70.4% .14 182.503);--tw-color-teal-600:oklch(60% .118 184.704);--tw-color-sky-400:oklch(74.6% .16 232.661);--tw-color-sky-500:oklch(68.5% .169 237.323);--tw-color-sky-600:oklch(58.8% .158 241.966);--tw-color-blue-50:oklch(97% .014 254.604);--tw-color-blue-100:oklch(93.2% .032 255.585);--tw-color-blue-400:oklch(70.7% .165 254.624);--tw-color-blue-500:oklch(62.3% .214 259.815);--tw-color-blue-600:oklch(54.6% .245 262.881);--tw-color-blue-800:oklch(42.4% .199 265.638);--tw-color-indigo-200:oklch(87% .065 274.039);--tw-color-purple-50:oklch(97.7% .014 308.299);--tw-color-purple-200:oklch(90.2% .063 306.703);--tw-color-purple-900:oklch(38.1% .176 304.987);--tw-color-rose-400:oklch(71.2% .194 13.428);--tw-color-rose-500:oklch(64.5% .246 16.439);--tw-color-rose-600:oklch(58.6% .253 17.585);--tw-color-slate-300:oklch(86.9% .022 252.894);--tw-color-slate-400:oklch(70.4% .04 256.788);--tw-color-slate-900:oklch(20.8% .042 265.755);--tw-color-gray-50:oklch(98.5% .002 247.839);--tw-color-gray-100:oklch(96.7% .003 264.542);--tw-color-gray-300:oklch(87.2% .01 258.338);--tw-color-gray-500:oklch(55.1% .027 264.364);--tw-color-gray-600:oklch(44.6% .03 256.802);--tw-color-gray-700:oklch(37.3% .034 259.733);--tw-color-gray-800:oklch(27.8% .033 256.848);--tw-color-zinc-400:oklch(70.5% .015 286.067);--tw-color-neutral-300:oklch(87% 0 0);--tw-color-black:#000;--tw-color-white:#fff;--tw-container-xs:20rem;--tw-container-sm:24rem;--tw-container-md:28rem;--tw-container-lg:32rem;--tw-container-2xl:42rem;--tw-container-3xl:48rem;--tw-container-4xl:56rem;--tw-container-6xl:72rem;--tw-text-xs:.75rem;--tw-text-xs--line-height:calc(1 / .75);--tw-text-sm:.875rem;--tw-text-sm--line-height:calc(1.25 / .875);--tw-text-base:1rem;--tw-text-base--line-height:calc(1.5 / 1);--tw-text-lg:1.125rem;--tw-text-lg--line-height:calc(1.75 / 1.125);--tw-text-xl:1.25rem;--tw-text-xl--line-height:calc(1.75 / 1.25);--tw-text-2xl:1.5rem;--tw-text-2xl--line-height:calc(2 / 1.5);--tw-text-3xl:1.875rem;--tw-text-3xl--line-height:calc(2.25 / 1.875);--tw-text-4xl:2.25rem;--tw-text-4xl--line-height:calc(2.5 / 2.25);--tw-text-5xl:3rem;--tw-text-5xl--line-height:1;--tw-font-weight-normal:400;--tw-font-weight-medium:500;--tw-font-weight-semibold:600;--tw-font-weight-bold:700;--tw-font-weight-extrabold:800;--tw-tracking-tight:-.025em;--tw-tracking-wider:.05em;--tw-tracking-widest:.1em;--tw-leading-tight:1.25;--tw-leading-snug:1.375;--tw-leading-relaxed:1.625;--tw-leading-loose:2;--tw-radius-xs:.125rem;--tw-radius-md:calc(var(--radius) * .8);--tw-drop-shadow-sm:0 1px 2px #00000026;--tw-animate-spin:spin 1s linear infinite;--tw-animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--tw-blur-xs:4px;--tw-blur-2xl:40px;--tw-default-transition-duration:.15s;--tw-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--tw-default-font-family:"IBM Plex Sans Variable", sans-serif;--tw-default-mono-font-family:var(--tw-font-mono)}}@layer base{.pr-twp,.pr-twp *{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.pr-twp,.pr-twp *{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body.pr-twp{background-color:var(--background);color:var(--foreground)}html.pr-twp{font-family:IBM Plex Sans Variable,sans-serif}:where(.pr-twp,.pr-twp *),:where(.pr-twp,.pr-twp *):after,:where(.pr-twp,.pr-twp *):before,:where(.pr-twp,.pr-twp *) ::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}:where(.pr-twp,.pr-twp *) ::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}.pr-twp{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--tw-default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--tw-default-font-feature-settings,normal);font-variation-settings:var(--tw-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr:where(.pr-twp,.pr-twp *){height:0;color:inherit;border-top-width:1px}abbr:where([title]):where(.pr-twp,.pr-twp *){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1:where(.pr-twp,.pr-twp *),h2:where(.pr-twp,.pr-twp *),h3:where(.pr-twp,.pr-twp *),h4:where(.pr-twp,.pr-twp *),h5:where(.pr-twp,.pr-twp *),h6:where(.pr-twp,.pr-twp *){font-size:inherit;font-weight:inherit}a:where(.pr-twp,.pr-twp *){color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b:where(.pr-twp,.pr-twp *),strong:where(.pr-twp,.pr-twp *){font-weight:bolder}code:where(.pr-twp,.pr-twp *),kbd:where(.pr-twp,.pr-twp *),samp:where(.pr-twp,.pr-twp *),pre:where(.pr-twp,.pr-twp *){font-family:var(--tw-default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--tw-default-mono-font-feature-settings,normal);font-variation-settings:var(--tw-default-mono-font-variation-settings,normal);font-size:1em}small:where(.pr-twp,.pr-twp *){font-size:80%}sub:where(.pr-twp,.pr-twp *),sup:where(.pr-twp,.pr-twp *){vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub:where(.pr-twp,.pr-twp *){bottom:-.25em}sup:where(.pr-twp,.pr-twp *){top:-.5em}table:where(.pr-twp,.pr-twp *){text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(.pr-twp,.pr-twp *){outline:auto}progress:where(.pr-twp,.pr-twp *){vertical-align:baseline}summary:where(.pr-twp,.pr-twp *){display:list-item}ol:where(.pr-twp,.pr-twp *),ul:where(.pr-twp,.pr-twp *),menu:where(.pr-twp,.pr-twp *){list-style:none}img:where(.pr-twp,.pr-twp *),svg:where(.pr-twp,.pr-twp *),video:where(.pr-twp,.pr-twp *),canvas:where(.pr-twp,.pr-twp *),audio:where(.pr-twp,.pr-twp *),iframe:where(.pr-twp,.pr-twp *),embed:where(.pr-twp,.pr-twp *),object:where(.pr-twp,.pr-twp *){vertical-align:middle;display:block}img:where(.pr-twp,.pr-twp *),video:where(.pr-twp,.pr-twp *){max-width:100%;height:auto}button:where(.pr-twp,.pr-twp *),input:where(.pr-twp,.pr-twp *),select:where(.pr-twp,.pr-twp *),optgroup:where(.pr-twp,.pr-twp *),textarea:where(.pr-twp,.pr-twp *){font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(.pr-twp,.pr-twp *) ::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup:where(.pr-twp,.pr-twp *){font-weight:bolder}:where(select:is([multiple],[size])) optgroup option:where(.pr-twp,.pr-twp *){padding-inline-start:20px}:where(.pr-twp,.pr-twp *) ::file-selector-button{margin-inline-end:4px}:where(.pr-twp,.pr-twp *) ::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){:where(.pr-twp,.pr-twp *) ::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){:where(.pr-twp,.pr-twp *) ::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea:where(.pr-twp,.pr-twp *){resize:vertical}:where(.pr-twp,.pr-twp *) ::-webkit-search-decoration{-webkit-appearance:none}:where(.pr-twp,.pr-twp *) ::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit{display:inline-flex}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-fields-wrapper{padding:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-year-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-month-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-day-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-hour-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-minute-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-second-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-millisecond-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-datetime-edit-meridiem-field{padding-block:0}:where(.pr-twp,.pr-twp *) ::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid:where(.pr-twp,.pr-twp *){box-shadow:none}button:where(.pr-twp,.pr-twp *),input:where([type=button],[type=reset],[type=submit]):where(.pr-twp,.pr-twp *){appearance:button}:where(.pr-twp,.pr-twp *) ::file-selector-button{appearance:button}:where(.pr-twp,.pr-twp *) ::-webkit-inner-spin-button{height:auto}:where(.pr-twp,.pr-twp *) ::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])):where(.pr-twp,.pr-twp *){display:none!important}}@layer components;@layer utilities{.tw\\:\\@container\\/card-header{container:card-header/inline-size}.tw\\:\\@container\\/search{container:search/inline-size}.tw\\:\\@container\\/toolbar{container:toolbar/inline-size}.tw\\:pointer-events-auto{pointer-events:auto}.tw\\:pointer-events-none{pointer-events:none}.tw\\:invisible{visibility:hidden}.tw\\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.tw\\:absolute{position:absolute}.tw\\:fixed{position:fixed}.tw\\:relative{position:relative}.tw\\:sticky{position:sticky}.tw\\:inset-0{inset:calc(calc(var(--spacing)) * 0)}.tw\\:inset-y-0{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:inset-s-3{inset-inline-start:calc(calc(var(--spacing)) * 3)}.tw\\:start-1\\.5{inset-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:start-1\\/2{inset-inline-start:50%}.tw\\:end-0{inset-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:end-1{inset-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:end-2{inset-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:end-3{inset-inline-end:calc(calc(var(--spacing)) * 3)}.tw\\:inset-e-0{inset-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:-top-\\[1px\\]{top:-1px}.tw\\:top-0{top:calc(calc(var(--spacing)) * 0)}.tw\\:top-1{top:calc(calc(var(--spacing)) * 1)}.tw\\:top-1\\.5{top:calc(calc(var(--spacing)) * 1.5)}.tw\\:top-1\\/2{top:50%}.tw\\:top-1\\/3{top:33.3333%}.tw\\:top-2{top:calc(calc(var(--spacing)) * 2)}.tw\\:top-2\\.5{top:calc(calc(var(--spacing)) * 2.5)}.tw\\:top-3\\.5{top:calc(calc(var(--spacing)) * 3.5)}.tw\\:top-\\[-1px\\]{top:-1px}.tw\\:top-full{top:100%}.tw\\:-right-1{right:calc(calc(var(--spacing)) * -1)}.tw\\:right-0{right:calc(calc(var(--spacing)) * 0)}.tw\\:right-1{right:calc(calc(var(--spacing)) * 1)}.tw\\:right-3{right:calc(calc(var(--spacing)) * 3)}.tw\\:bottom-0{bottom:calc(calc(var(--spacing)) * 0)}.tw\\:-left-\\[1px\\]{left:-1px}.tw\\:left-0{left:calc(calc(var(--spacing)) * 0)}.tw\\:left-1\\/2{left:50%}.tw\\:left-2{left:calc(calc(var(--spacing)) * 2)}.tw\\:left-3{left:calc(calc(var(--spacing)) * 3)}.tw\\:isolate{isolation:isolate}.tw\\:z-10{z-index:10}.tw\\:z-20{z-index:20}.tw\\:z-50{z-index:50}.tw\\:order-first{order:-9999}.tw\\:order-last{order:9999}.tw\\:col-span-1{grid-column:span 1/span 1}.tw\\:col-span-2{grid-column:span 2/span 2}.tw\\:col-span-3{grid-column:span 3/span 3}.tw\\:col-start-1{grid-column-start:1}.tw\\:col-start-2{grid-column-start:2}.tw\\:row-span-2{grid-row:span 2/span 2}.tw\\:row-start-1{grid-row-start:1}.tw\\:row-start-2{grid-row-start:2}.tw\\:m-0{margin:calc(calc(var(--spacing)) * 0)}.tw\\:m-1{margin:calc(calc(var(--spacing)) * 1)}.tw\\:m-2{margin:calc(calc(var(--spacing)) * 2)}.tw\\:-mx-1{margin-inline:calc(calc(var(--spacing)) * -1)}.tw\\:-mx-4{margin-inline:calc(calc(var(--spacing)) * -4)}.tw\\:mx-0{margin-inline:calc(calc(var(--spacing)) * 0)}.tw\\:mx-1{margin-inline:calc(calc(var(--spacing)) * 1)}.tw\\:mx-2{margin-inline:calc(calc(var(--spacing)) * 2)}.tw\\:mx-3\\.5{margin-inline:calc(calc(var(--spacing)) * 3.5)}.tw\\:mx-4{margin-inline:calc(calc(var(--spacing)) * 4)}.tw\\:mx-8{margin-inline:calc(calc(var(--spacing)) * 8)}.tw\\:my-1{margin-block:calc(calc(var(--spacing)) * 1)}.tw\\:my-2\\.5{margin-block:calc(calc(var(--spacing)) * 2.5)}.tw\\:my-4{margin-block:calc(calc(var(--spacing)) * 4)}.tw\\:my-auto{margin-block:auto}.tw\\:ms-1{margin-inline-start:calc(calc(var(--spacing)) * 1)}.tw\\:ms-2{margin-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:ms-5{margin-inline-start:calc(calc(var(--spacing)) * 5)}.tw\\:ms-6{margin-inline-start:calc(calc(var(--spacing)) * 6)}.tw\\:ms-auto{margin-inline-start:auto}.tw\\:me-1{margin-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:me-2{margin-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:prose{color:var(--tw-prose-body);max-width:65ch}.tw\\:prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.tw\\:prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);margin-top:1.2em;margin-bottom:1.2em;font-size:1.25em;line-height:1.6}.tw\\:prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.tw\\:prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.tw\\:prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:decimal}.tw\\:prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.tw\\:prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.tw\\:prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.tw\\:prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.tw\\:prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.tw\\:prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.tw\\:prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.tw\\:prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.tw\\:prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.tw\\:prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:disc}.tw\\:prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.tw\\:prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.tw\\:prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.25em;font-weight:600}.tw\\:prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.tw\\:prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;font-style:italic;font-weight:500}.tw\\:prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.tw\\:prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.tw\\:prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:0;margin-bottom:.888889em;font-size:2.25em;font-weight:800;line-height:1.11111}.tw\\:prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.tw\\:prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:2em;margin-bottom:1em;font-size:1.5em;font-weight:700;line-height:1.33333}.tw\\:prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.tw\\:prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.6em;margin-bottom:.6em;font-size:1.25em;font-weight:600;line-height:1.6}.tw\\:prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.tw\\:prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.5}.tw\\:prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.tw\\:prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em;display:block}.tw\\:prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-kbd);box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%), 0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%);padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;border-radius:.3125rem;padding-inline-start:.375em;font-family:inherit;font-size:.875em;font-weight:500}.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"\`"}.tw\\:prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.tw\\:prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.tw\\:prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.tw\\:prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);padding-top:.857143em;padding-inline-end:1.14286em;padding-bottom:.857143em;border-radius:.375rem;margin-top:1.71429em;margin-bottom:1.71429em;padding-inline-start:1.14286em;font-size:.875em;font-weight:400;line-height:1.71429;overflow-x:auto}.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit;background-color:#0000;border-width:0;border-radius:0;padding:0}.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.tw\\:prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){table-layout:auto;width:100%;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.71429}.tw\\:prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.tw\\:prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);vertical-align:bottom;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em;font-weight:600}.tw\\:prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.tw\\:prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.tw\\:prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.tw\\:prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.tw\\:prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.tw\\:prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.tw\\:prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);margin-top:.857143em;font-size:.875em;line-height:1.42857}.tw\\:prose{--tw-prose-body:var(--foreground);--tw-prose-headings:var(--foreground);--tw-prose-lead:var(--muted-foreground);--tw-prose-links:var(--primary);--tw-prose-bold:var(--foreground);--tw-prose-counters:var(--muted-foreground);--tw-prose-bullets:var(--muted-foreground);--tw-prose-hr:var(--border);--tw-prose-quotes:var(--foreground);--tw-prose-quote-borders:var(--border);--tw-prose-captions:var(--muted-foreground);--tw-prose-kbd:oklch(21% .034 264.665);--tw-prose-kbd-shadows:NaN NaN NaN;--tw-prose-code:var(--foreground);--tw-prose-pre-code:var(--muted-foreground);--tw-prose-pre-bg:var(--muted);--tw-prose-th-borders:var(--border);--tw-prose-td-borders:var(--border);--tw-prose-invert-body:var(--foreground);--tw-prose-invert-headings:var(--foreground);--tw-prose-invert-lead:var(--muted-foreground);--tw-prose-invert-links:var(--primary);--tw-prose-invert-bold:var(--foreground);--tw-prose-invert-counters:var(--muted-foreground);--tw-prose-invert-bullets:var(--muted-foreground);--tw-prose-invert-hr:var(--border);--tw-prose-invert-quotes:var(--foreground);--tw-prose-invert-quote-borders:var(--border);--tw-prose-invert-captions:var(--muted-foreground);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:var(--foreground);--tw-prose-invert-pre-code:var(--muted-foreground);--tw-prose-invert-pre-bg:var(--muted);--tw-prose-invert-th-borders:var(--border);--tw-prose-invert-td-borders:var(--border);font-size:1rem;line-height:1.75}.tw\\:prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.tw\\:prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.tw\\:prose :where(.tw\\:prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.tw\\:prose :where(.tw\\:prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.tw\\:prose :where(.tw\\:prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.tw\\:prose :where(.tw\\:prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.tw\\:prose :where(.tw\\:prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.tw\\:prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.tw\\:prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.tw\\:prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.tw\\:prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.571429em;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em}.tw\\:prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.tw\\:prose :where(.tw\\:prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose :where(.tw\\:prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.tw\\:prose-sm{font-size:.875rem;line-height:1.71429}.tw\\:prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.tw\\:prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.888889em;margin-bottom:.888889em;font-size:1.28571em;line-height:1.55556}.tw\\:prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.33333em;margin-bottom:1.33333em;padding-inline-start:1.11111em}.tw\\:prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:.8em;font-size:2.14286em;line-height:1.2}.tw\\:prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6em;margin-bottom:.8em;font-size:1.42857em;line-height:1.4}.tw\\:prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.55556em;margin-bottom:.444444em;font-size:1.28571em;line-height:1.55556}.tw\\:prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.42857em;margin-bottom:.571429em;line-height:1.42857}.tw\\:prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.142857em;padding-inline-end:.357143em;padding-bottom:.142857em;border-radius:.3125rem;padding-inline-start:.357143em;font-size:.857143em}.tw\\:prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em}.tw\\:prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.tw\\:prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.888889em}.tw\\:prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;border-radius:.25rem;margin-top:1.66667em;margin-bottom:1.66667em;padding-inline-start:1em;font-size:.857143em;line-height:1.66667}.tw\\:prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em;padding-inline-start:1.57143em}.tw\\:prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;margin-bottom:.285714em}.tw\\:prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.428571em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(.tw\\:prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.tw\\:prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.tw\\:prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.tw\\:prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.tw\\:prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;padding-inline-start:1.57143em}.tw\\:prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.85714em;margin-bottom:2.85714em}.tw\\:prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.tw\\:prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em;line-height:1.5}.tw\\:prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.tw\\:prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.tw\\:prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.tw\\:prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.tw\\:prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.tw\\:prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.tw\\:prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.666667em;font-size:.857143em;line-height:1.33333}.tw\\:prose-sm :where(.tw\\:prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.tw\\:prose-sm :where(.tw\\:prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.tw\\:-mt-4{margin-top:calc(calc(var(--spacing)) * -4)}.tw\\:mt-0\\.5{margin-top:calc(calc(var(--spacing)) * .5)}.tw\\:mt-1{margin-top:calc(calc(var(--spacing)) * 1)}.tw\\:mt-2{margin-top:calc(calc(var(--spacing)) * 2)}.tw\\:mt-3{margin-top:calc(calc(var(--spacing)) * 3)}.tw\\:mt-4{margin-top:calc(calc(var(--spacing)) * 4)}.tw\\:mt-6{margin-top:calc(calc(var(--spacing)) * 6)}.tw\\:mt-auto{margin-top:auto}.tw\\:mr-1{margin-right:calc(calc(var(--spacing)) * 1)}.tw\\:mr-2{margin-right:calc(calc(var(--spacing)) * 2)}.tw\\:mr-3{margin-right:calc(calc(var(--spacing)) * 3)}.tw\\:-mb-4{margin-bottom:calc(calc(var(--spacing)) * -4)}.tw\\:mb-1{margin-bottom:calc(calc(var(--spacing)) * 1)}.tw\\:mb-2{margin-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:mb-3{margin-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:mb-4{margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:ml-1{margin-left:calc(calc(var(--spacing)) * 1)}.tw\\:ml-2{margin-left:calc(calc(var(--spacing)) * 2)}.tw\\:ml-4{margin-left:calc(calc(var(--spacing)) * 4)}.tw\\:ml-auto{margin-left:auto}.tw\\:box-border{box-sizing:border-box}.tw\\:line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.tw\\:no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.tw\\:no-scrollbar::-webkit-scrollbar{display:none}.tw\\:block{display:block}.tw\\:flex{display:flex}.tw\\:grid{display:grid}.tw\\:hidden{display:none}.tw\\:inline-block{display:inline-block}.tw\\:inline-flex{display:inline-flex}.tw\\:inline-grid{display:inline-grid}.tw\\:field-sizing-content{field-sizing:content}.tw\\:aspect-square{aspect-ratio:1}.tw\\:size-2{width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:size-2\\.5{width:calc(calc(var(--spacing)) * 2.5);height:calc(calc(var(--spacing)) * 2.5)}.tw\\:size-3{width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:size-3\\.5{width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:size-4{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:size-6{width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:size-7{width:calc(calc(var(--spacing)) * 7);height:calc(calc(var(--spacing)) * 7)}.tw\\:size-8{width:calc(calc(var(--spacing)) * 8);height:calc(calc(var(--spacing)) * 8)}.tw\\:size-9{width:calc(calc(var(--spacing)) * 9);height:calc(calc(var(--spacing)) * 9)}.tw\\:size-10{width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:size-full{width:100%;height:100%}.tw\\:h-1{height:calc(calc(var(--spacing)) * 1)}.tw\\:h-2{height:calc(calc(var(--spacing)) * 2)}.tw\\:h-3{height:calc(calc(var(--spacing)) * 3)}.tw\\:h-3\\.5{height:calc(calc(var(--spacing)) * 3.5)}.tw\\:h-4{height:calc(calc(var(--spacing)) * 4)}.tw\\:h-5{height:calc(calc(var(--spacing)) * 5)}.tw\\:h-6{height:calc(calc(var(--spacing)) * 6)}.tw\\:h-7{height:calc(calc(var(--spacing)) * 7)}.tw\\:h-8{height:calc(calc(var(--spacing)) * 8)}.tw\\:h-8\\!{height:calc(calc(var(--spacing)) * 8)!important}.tw\\:h-8\\.5{height:calc(calc(var(--spacing)) * 8.5)}.tw\\:h-9{height:calc(calc(var(--spacing)) * 9)}.tw\\:h-10{height:calc(calc(var(--spacing)) * 10)}.tw\\:h-12{height:calc(calc(var(--spacing)) * 12)}.tw\\:h-14{height:calc(calc(var(--spacing)) * 14)}.tw\\:h-20{height:calc(calc(var(--spacing)) * 20)}.tw\\:h-24{height:calc(calc(var(--spacing)) * 24)}.tw\\:h-32{height:calc(calc(var(--spacing)) * 32)}.tw\\:h-40{height:calc(calc(var(--spacing)) * 40)}.tw\\:h-64{height:calc(calc(var(--spacing)) * 64)}.tw\\:h-80{height:calc(calc(var(--spacing)) * 80)}.tw\\:h-96{height:calc(calc(var(--spacing)) * 96)}.tw\\:h-\\[5px\\]{height:5px}.tw\\:h-\\[260px\\]{height:260px}.tw\\:h-\\[300px\\]{height:300px}.tw\\:h-\\[400px\\]{height:400px}.tw\\:h-\\[600px\\]{height:600px}.tw\\:h-\\[calc\\(100\\%-1px\\)\\]{height:calc(100% - 1px)}.tw\\:h-\\[calc\\(100\\%-2px\\)\\]{height:calc(100% - 2px)}.tw\\:h-auto{height:auto}.tw\\:h-full{height:100%}.tw\\:h-px{height:1px}.tw\\:h-screen{height:100vh}.tw\\:h-svh{height:100svh}.tw\\:max-h-\\(--radix-context-menu-content-available-height\\){max-height:var(--radix-context-menu-content-available-height)}.tw\\:max-h-\\(--radix-dropdown-menu-content-available-height\\){max-height:var(--radix-dropdown-menu-content-available-height)}.tw\\:max-h-\\(--radix-popover-content-available-height\\){max-height:var(--radix-popover-content-available-height)}.tw\\:max-h-\\(--radix-select-content-available-height\\){max-height:var(--radix-select-content-available-height)}.tw\\:max-h-5{max-height:calc(calc(var(--spacing)) * 5)}.tw\\:max-h-10{max-height:calc(calc(var(--spacing)) * 10)}.tw\\:max-h-72{max-height:calc(calc(var(--spacing)) * 72)}.tw\\:max-h-80{max-height:calc(calc(var(--spacing)) * 80)}.tw\\:max-h-\\[96\\%\\]{max-height:96%}.tw\\:max-h-\\[300px\\]{max-height:300px}.tw\\:max-h-\\[calc\\(var\\(--radix-dropdown-menu-content-available-height\\,100vh\\)\\/var\\(--platform-content-zoom-popup-factor\\,1\\)\\)\\]{max-height:calc(var(--radix-dropdown-menu-content-available-height,100vh) / var(--platform-content-zoom-popup-factor,1))}.tw\\:max-h-\\[calc\\(var\\(--radix-popover-content-available-height\\,100vh\\)\\/var\\(--platform-content-zoom-popup-factor\\,1\\)\\)\\]{max-height:calc(var(--radix-popover-content-available-height,100vh) / var(--platform-content-zoom-popup-factor,1))}.tw\\:min-h-0{min-height:calc(calc(var(--spacing)) * 0)}.tw\\:min-h-11{min-height:calc(calc(var(--spacing)) * 11)}.tw\\:min-h-16{min-height:calc(calc(var(--spacing)) * 16)}.tw\\:min-h-\\[200px\\]{min-height:200px}.tw\\:min-h-full{min-height:100%}.tw\\:min-h-svh{min-height:100svh}.tw\\:w-\\(--radix-dropdown-menu-trigger-width\\){width:var(--radix-dropdown-menu-trigger-width)}.tw\\:w-\\(--sidebar-width\\){width:var(--sidebar-width)}.tw\\:w-1{width:calc(calc(var(--spacing)) * 1)}.tw\\:w-1\\/2{width:50%}.tw\\:w-1\\/4{width:25%}.tw\\:w-1\\/6{width:16.6667%}.tw\\:w-2{width:calc(calc(var(--spacing)) * 2)}.tw\\:w-3{width:calc(calc(var(--spacing)) * 3)}.tw\\:w-3\\.5{width:calc(calc(var(--spacing)) * 3.5)}.tw\\:w-3\\/4{width:75%}.tw\\:w-4{width:calc(calc(var(--spacing)) * 4)}.tw\\:w-4\\/5{width:80%}.tw\\:w-4\\/6{width:66.6667%}.tw\\:w-5{width:calc(calc(var(--spacing)) * 5)}.tw\\:w-5\\/6{width:83.3333%}.tw\\:w-6{width:calc(calc(var(--spacing)) * 6)}.tw\\:w-7{width:calc(calc(var(--spacing)) * 7)}.tw\\:w-8{width:calc(calc(var(--spacing)) * 8)}.tw\\:w-9{width:calc(calc(var(--spacing)) * 9)}.tw\\:w-9\\/12{width:75%}.tw\\:w-10{width:calc(calc(var(--spacing)) * 10)}.tw\\:w-12{width:calc(calc(var(--spacing)) * 12)}.tw\\:w-14{width:calc(calc(var(--spacing)) * 14)}.tw\\:w-20{width:calc(calc(var(--spacing)) * 20)}.tw\\:w-24{width:calc(calc(var(--spacing)) * 24)}.tw\\:w-32{width:calc(calc(var(--spacing)) * 32)}.tw\\:w-48{width:calc(calc(var(--spacing)) * 48)}.tw\\:w-56{width:calc(calc(var(--spacing)) * 56)}.tw\\:w-60{width:calc(calc(var(--spacing)) * 60)}.tw\\:w-64{width:calc(calc(var(--spacing)) * 64)}.tw\\:w-72{width:calc(calc(var(--spacing)) * 72)}.tw\\:w-80{width:calc(calc(var(--spacing)) * 80)}.tw\\:w-96{width:calc(calc(var(--spacing)) * 96)}.tw\\:w-\\[1px\\]{width:1px}.tw\\:w-\\[5px\\]{width:5px}.tw\\:w-\\[70px\\]{width:70px}.tw\\:w-\\[100px\\]{width:100px}.tw\\:w-\\[116px\\]{width:116px}.tw\\:w-\\[124px\\]{width:124px}.tw\\:w-\\[150px\\]{width:150px}.tw\\:w-\\[180px\\]{width:180px}.tw\\:w-\\[200px\\]{width:200px}.tw\\:w-\\[250px\\]{width:250px}.tw\\:w-\\[260px\\]{width:260px}.tw\\:w-\\[280px\\]{width:280px}.tw\\:w-\\[300px\\]{width:300px}.tw\\:w-\\[320px\\]{width:320px}.tw\\:w-\\[350px\\]{width:350px}.tw\\:w-\\[400px\\]{width:400px}.tw\\:w-\\[420px\\]{width:420px}.tw\\:w-\\[500px\\]{width:500px}.tw\\:w-\\[560px\\]{width:560px}.tw\\:w-\\[600px\\]{width:600px}.tw\\:w-\\[calc\\(100\\%-2px\\)\\]{width:calc(100% - 2px)}.tw\\:w-\\[var\\(--radix-dropdown-menu-trigger-width\\)\\]{width:var(--radix-dropdown-menu-trigger-width)}.tw\\:w-auto{width:auto}.tw\\:w-fit{width:fit-content}.tw\\:w-full{width:100%}.tw\\:w-max{width:max-content}.tw\\:w-px{width:1px}.tw\\:max-w-\\(--skeleton-width\\){max-width:var(--skeleton-width)}.tw\\:max-w-0{max-width:calc(calc(var(--spacing)) * 0)}.tw\\:max-w-2xl{max-width:var(--tw-container-2xl)}.tw\\:max-w-3xl{max-width:var(--tw-container-3xl)}.tw\\:max-w-4xl{max-width:var(--tw-container-4xl)}.tw\\:max-w-5{max-width:calc(calc(var(--spacing)) * 5)}.tw\\:max-w-6xl{max-width:var(--tw-container-6xl)}.tw\\:max-w-40{max-width:calc(calc(var(--spacing)) * 40)}.tw\\:max-w-48{max-width:calc(calc(var(--spacing)) * 48)}.tw\\:max-w-64{max-width:calc(calc(var(--spacing)) * 64)}.tw\\:max-w-96{max-width:calc(calc(var(--spacing)) * 96)}.tw\\:max-w-\\[200px\\]{max-width:200px}.tw\\:max-w-\\[220px\\]{max-width:220px}.tw\\:max-w-\\[calc\\(100\\%-2rem\\)\\]{max-width:calc(100% - 2rem)}.tw\\:max-w-\\[calc\\(100vw-2rem\\)\\]{max-width:calc(100vw - 2rem)}.tw\\:max-w-\\[calc\\(var\\(--radix-dropdown-menu-content-available-width\\,100vw\\)\\/var\\(--platform-content-zoom-popup-factor\\,1\\)\\)\\]{max-width:calc(var(--radix-dropdown-menu-content-available-width,100vw) / var(--platform-content-zoom-popup-factor,1))}.tw\\:max-w-\\[calc\\(var\\(--radix-popover-content-available-width\\,100vw\\)\\/var\\(--platform-content-zoom-popup-factor\\,1\\)\\)\\]{max-width:calc(var(--radix-popover-content-available-width,100vw) / var(--platform-content-zoom-popup-factor,1))}.tw\\:max-w-\\[min\\(20rem\\,calc\\(var\\(--radix-tooltip-content-available-width\\,100vw\\)\\/var\\(--platform-content-zoom-popup-factor\\,1\\)\\)\\)\\]{max-width:min(20rem, calc(var(--radix-tooltip-content-available-width,100vw) / var(--platform-content-zoom-popup-factor,1)))}.tw\\:max-w-fit{max-width:fit-content}.tw\\:max-w-full{max-width:100%}.tw\\:max-w-lg{max-width:var(--tw-container-lg)}.tw\\:max-w-md{max-width:var(--tw-container-md)}.tw\\:max-w-none{max-width:none}.tw\\:max-w-sm{max-width:var(--tw-container-sm)}.tw\\:max-w-xs{max-width:var(--tw-container-xs)}.tw\\:min-w-0{min-width:calc(calc(var(--spacing)) * 0)}.tw\\:min-w-4{min-width:calc(calc(var(--spacing)) * 4)}.tw\\:min-w-5{min-width:calc(calc(var(--spacing)) * 5)}.tw\\:min-w-7{min-width:calc(calc(var(--spacing)) * 7)}.tw\\:min-w-8{min-width:calc(calc(var(--spacing)) * 8)}.tw\\:min-w-9{min-width:calc(calc(var(--spacing)) * 9)}.tw\\:min-w-16{min-width:calc(calc(var(--spacing)) * 16)}.tw\\:min-w-32{min-width:calc(calc(var(--spacing)) * 32)}.tw\\:min-w-36{min-width:calc(calc(var(--spacing)) * 36)}.tw\\:min-w-80{min-width:calc(calc(var(--spacing)) * 80)}.tw\\:min-w-\\[12rem\\]{min-width:12rem}.tw\\:min-w-\\[26px\\]{min-width:26px}.tw\\:min-w-\\[96px\\]{min-width:96px}.tw\\:min-w-\\[140px\\]{min-width:140px}.tw\\:min-w-\\[215px\\]{min-width:215px}.tw\\:min-w-\\[500px\\]{min-width:500px}.tw\\:min-w-min{min-width:min-content}.tw\\:flex-1{flex:1}.tw\\:shrink{flex-shrink:1}.tw\\:shrink\\!{flex-shrink:1!important}.tw\\:shrink-0{flex-shrink:0}.tw\\:shrink-\\[9999\\]{flex-shrink:9999}.tw\\:flex-grow,.tw\\:grow,.tw\\:grow-\\[1\\]{flex-grow:1}.tw\\:grow-\\[10\\]{flex-grow:10}.tw\\:basis-0{flex-basis:calc(calc(var(--spacing)) * 0)}.tw\\:table-fixed{table-layout:fixed}.tw\\:caption-bottom{caption-side:bottom}.tw\\:border-collapse{border-collapse:collapse}.tw\\:origin-\\(--radix-context-menu-content-transform-origin\\){transform-origin:var(--radix-context-menu-content-transform-origin)}.tw\\:origin-\\(--radix-dropdown-menu-content-transform-origin\\){transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.tw\\:origin-\\(--radix-menubar-content-transform-origin\\){transform-origin:var(--radix-menubar-content-transform-origin)}.tw\\:origin-\\(--radix-popover-content-transform-origin\\){transform-origin:var(--radix-popover-content-transform-origin)}.tw\\:origin-\\(--radix-select-content-transform-origin\\){transform-origin:var(--radix-select-content-transform-origin)}.tw\\:origin-\\(--radix-tooltip-content-transform-origin\\){transform-origin:var(--radix-tooltip-content-transform-origin)}.tw\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-y-0{--tw-translate-y:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:translate-y-px{--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rotate-45{rotate:45deg}.tw\\:rotate-180{rotate:180deg}.tw\\:transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.tw\\:animate-none\\!{animation:none!important}.tw\\:animate-pulse{animation:var(--tw-animate-pulse)}.tw\\:animate-spin{animation:var(--tw-animate-spin)}.tw\\:cursor-default{cursor:default}.tw\\:cursor-ew-resize{cursor:ew-resize}.tw\\:cursor-not-allowed{cursor:not-allowed}.tw\\:cursor-pointer{cursor:pointer}.tw\\:cursor-text{cursor:text}.tw\\:touch-none{touch-action:none}.tw\\:resize{resize:both}.tw\\:resize-none{resize:none}.tw\\:scroll-m-20{scroll-margin:calc(calc(var(--spacing)) * 20)}.tw\\:scroll-my-1{scroll-margin-block:calc(calc(var(--spacing)) * 1)}.tw\\:scroll-py-1{scroll-padding-block:calc(calc(var(--spacing)) * 1)}.tw\\:list-inside{list-style-position:inside}.tw\\:list-outside{list-style-position:outside}.tw\\:\\!list-\\[lower-alpha\\]{list-style-type:lower-alpha!important}.tw\\:\\!list-\\[lower-roman\\]{list-style-type:lower-roman!important}.tw\\:\\!list-\\[upper-alpha\\]{list-style-type:upper-alpha!important}.tw\\:\\!list-\\[upper-roman\\]{list-style-type:upper-roman!important}.tw\\:\\!list-decimal{list-style-type:decimal!important}.tw\\:\\!list-disc{list-style-type:disc!important}.tw\\:list-decimal{list-style-type:decimal}.tw\\:list-disc{list-style-type:disc}.tw\\:list-none{list-style-type:none}.tw\\:grid-flow-col{grid-auto-flow:column}.tw\\:grid-flow-row{grid-auto-flow:row}.tw\\:auto-rows-min{grid-auto-rows:min-content}.tw\\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.tw\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.tw\\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.tw\\:grid-cols-\\[25\\%_25\\%_50\\%\\]{grid-template-columns:25% 25% 50%}.tw\\:grid-cols-\\[25\\%_50\\%_25\\%\\]{grid-template-columns:25% 50% 25%}.tw\\:grid-cols-\\[auto_auto_auto_auto\\]{grid-template-columns:auto auto auto auto}.tw\\:grid-cols-\\[min-content_1fr\\]{grid-template-columns:min-content 1fr}.tw\\:grid-cols-\\[min-content_min-content_1fr\\]{grid-template-columns:min-content min-content 1fr}.tw\\:grid-cols-subgrid{grid-template-columns:subgrid}.tw\\:flex-col{flex-direction:column}.tw\\:flex-col-reverse{flex-direction:column-reverse}.tw\\:flex-row{flex-direction:row}.tw\\:flex-row-reverse{flex-direction:row-reverse}.tw\\:flex-nowrap{flex-wrap:nowrap}.tw\\:flex-wrap{flex-wrap:wrap}.tw\\:place-content-center{place-content:center}.tw\\:content-center{align-content:center}.tw\\:items-baseline{align-items:baseline}.tw\\:items-center{align-items:center}.tw\\:items-end{align-items:flex-end}.tw\\:items-start{align-items:flex-start}.tw\\:items-stretch{align-items:stretch}.tw\\:justify-between{justify-content:space-between}.tw\\:justify-center{justify-content:center}.tw\\:justify-end{justify-content:flex-end}.tw\\:justify-start{justify-content:flex-start}.tw\\:gap-0{gap:calc(calc(var(--spacing)) * 0)}.tw\\:gap-0\\.5{gap:calc(calc(var(--spacing)) * .5)}.tw\\:gap-1{gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-1\\.5{gap:calc(calc(var(--spacing)) * 1.5)}.tw\\:gap-1\\.5\\!{gap:calc(calc(var(--spacing)) * 1.5)!important}.tw\\:gap-2{gap:calc(calc(var(--spacing)) * 2)}.tw\\:gap-2\\.5{gap:calc(calc(var(--spacing)) * 2.5)}.tw\\:gap-3{gap:calc(calc(var(--spacing)) * 3)}.tw\\:gap-4{gap:calc(calc(var(--spacing)) * 4)}.tw\\:gap-5{gap:calc(calc(var(--spacing)) * 5)}.tw\\:gap-6{gap:calc(calc(var(--spacing)) * 6)}.tw\\:gap-8{gap:calc(calc(var(--spacing)) * 8)}.tw\\:gap-16{gap:calc(calc(var(--spacing)) * 16)}.tw\\:gap-\\[--spacing\\(var\\(--gap\\)\\)\\]{gap:calc(calc(var(--spacing)) * var(--gap))}.tw\\:gap-\\[12px\\]{gap:12px}:where(.tw\\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-1\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.tw\\:space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(calc(var(--spacing)) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(calc(var(--spacing)) * 8) * calc(1 - var(--tw-space-y-reverse)))}.tw\\:gap-x-1{column-gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-x-2{column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:gap-x-3{column-gap:calc(calc(var(--spacing)) * 3)}.tw\\:gap-x-4{column-gap:calc(calc(var(--spacing)) * 4)}:where(.tw\\:-space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * -2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * -2) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 3) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 3) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 4) * calc(1 - var(--tw-space-x-reverse)))}:where(.tw\\:space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 6) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 6) * calc(1 - var(--tw-space-x-reverse)))}.tw\\:gap-y-1{row-gap:calc(calc(var(--spacing)) * 1)}.tw\\:gap-y-2{row-gap:calc(calc(var(--spacing)) * 2)}:where(.tw\\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.tw\\:divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}.tw\\:self-start{align-self:flex-start}.tw\\:self-stretch{align-self:stretch}.tw\\:justify-self-end{justify-self:flex-end}.tw\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tw\\:overflow-auto{overflow:auto}.tw\\:overflow-clip{overflow:clip}.tw\\:overflow-hidden{overflow:hidden}.tw\\:overflow-scroll{overflow:scroll}.tw\\:overflow-visible{overflow:visible}.tw\\:overflow-x-auto{overflow-x:auto}.tw\\:overflow-x-hidden{overflow-x:hidden}.tw\\:overflow-y-auto{overflow-y:auto}.tw\\:overflow-y-hidden{overflow-y:hidden}.tw\\:rounded{border-radius:.25rem}.tw\\:rounded-2xl{border-radius:calc(var(--radius) * 1.8)}.tw\\:rounded-4xl{border-radius:calc(var(--radius) * 2.6)}.tw\\:rounded-\\[4px\\]{border-radius:4px}.tw\\:rounded-\\[6px\\]{border-radius:6px}.tw\\:rounded-\\[calc\\(var\\(--radius\\)-3px\\)\\]{border-radius:calc(var(--radius) - 3px)}.tw\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,10px\\)\\]{border-radius:min(var(--tw-radius-md), 10px)}.tw\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,12px\\)\\]{border-radius:min(var(--tw-radius-md), 12px)}.tw\\:rounded-full{border-radius:3.40282e38px}.tw\\:rounded-lg{border-radius:var(--radius)}.tw\\:rounded-lg\\!{border-radius:var(--radius)!important}.tw\\:rounded-md{border-radius:calc(var(--radius) * .8)}.tw\\:rounded-none{border-radius:0}.tw\\:rounded-sm{border-radius:calc(var(--radius) * .6)}.tw\\:rounded-xl{border-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-xl\\!{border-radius:calc(var(--radius) * 1.4)!important}.tw\\:rounded-xs{border-radius:var(--tw-radius-xs)}.tw\\:rounded-s-none{border-start-start-radius:0;border-end-start-radius:0}.tw\\:rounded-e-none{border-start-end-radius:0;border-end-end-radius:0}.tw\\:rounded-t-xl{border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-l-lg{border-top-left-radius:var(--radius);border-bottom-left-radius:var(--radius)}.tw\\:rounded-r-xl{border-top-right-radius:calc(var(--radius) * 1.4);border-bottom-right-radius:calc(var(--radius) * 1.4)}.tw\\:rounded-b-xl{border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:border{border-style:var(--tw-border-style);border-width:1px}.tw\\:border-0{border-style:var(--tw-border-style);border-width:0}.tw\\:border-2{border-style:var(--tw-border-style);border-width:2px}.tw\\:border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:border-s-0{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:border-s-2{border-inline-start-style:var(--tw-border-style);border-inline-start-width:2px}.tw\\:border-s-4{border-inline-start-style:var(--tw-border-style);border-inline-start-width:4px}.tw\\:border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.tw\\:border-e-0{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.tw\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.tw\\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.tw\\:border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.tw\\:border-dashed{--tw-border-style:dashed;border-style:dashed}.tw\\:border-none{--tw-border-style:none;border-style:none}.tw\\:border-solid{--tw-border-style:solid;border-style:solid}.tw\\:border-black{border-color:var(--tw-color-black)}.tw\\:border-blue-400{border-color:var(--tw-color-blue-400)}.tw\\:border-blue-500{border-color:var(--tw-color-blue-500)}.tw\\:border-border,.tw\\:border-border\\/50{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-border\\/50{border-color:color-mix(in oklab, var(--border) 50%, transparent)}}.tw\\:border-destructive{border-color:var(--destructive)}.tw\\:border-foreground{border-color:var(--foreground)}.tw\\:border-gray-300{border-color:var(--tw-color-gray-300)}.tw\\:border-input,.tw\\:border-input\\/30{border-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-input\\/30{border-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:border-muted-foreground,.tw\\:border-muted-foreground\\/40{border-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:border-muted-foreground\\/40{border-color:color-mix(in oklab, var(--muted-foreground) 40%, transparent)}}.tw\\:border-primary{border-color:var(--primary)}.tw\\:border-red-300{border-color:var(--tw-color-red-300)}.tw\\:border-red-400{border-color:var(--tw-color-red-400)}.tw\\:border-red-500{border-color:var(--tw-color-red-500)}.tw\\:border-red-600{border-color:var(--tw-color-red-600)}.tw\\:border-ring{border-color:var(--ring)}.tw\\:border-sidebar-border{border-color:var(--sidebar-border)}.tw\\:border-slate-300{border-color:var(--tw-color-slate-300)}.tw\\:border-transparent{border-color:#0000}.tw\\:border-yellow-400{border-color:var(--tw-color-yellow-400)}.tw\\:border-yellow-500{border-color:var(--tw-color-yellow-500)}.tw\\:border-s-amber-200{border-inline-start-color:var(--tw-color-amber-200)}.tw\\:border-s-indigo-200{border-inline-start-color:var(--tw-color-indigo-200)}.tw\\:border-s-purple-200{border-inline-start-color:var(--tw-color-purple-200)}.tw\\:border-s-red-200{border-inline-start-color:var(--tw-color-red-200)}.tw\\:\\!bg-destructive\\/50{background-color:var(--destructive)!important}@supports (color:color-mix(in lab, red, red)){.tw\\:\\!bg-destructive\\/50{background-color:color-mix(in oklab, var(--destructive) 50%, transparent)!important}}.tw\\:bg-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{background-color:color-mix(in oklab,var(--destructive) 10%,var(--background))}}.tw\\:bg-accent,.tw\\:bg-accent\\/50{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-accent\\/50{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.tw\\:bg-amber-500,.tw\\:bg-amber-500\\/5{background-color:var(--tw-color-amber-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-amber-500\\/5{background-color:color-mix(in oklab, var(--tw-color-amber-500) 5%, transparent)}}.tw\\:bg-amber-500\\/15{background-color:var(--tw-color-amber-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-amber-500\\/15{background-color:color-mix(in oklab, var(--tw-color-amber-500) 15%, transparent)}}.tw\\:bg-background,.tw\\:bg-background\\/50{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-background\\/50{background-color:color-mix(in oklab, var(--background) 50%, transparent)}}.tw\\:bg-black\\/10{background-color:var(--tw-color-black)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-black\\/10{background-color:color-mix(in oklab, var(--tw-color-black) 10%, transparent)}}.tw\\:bg-blue-50{background-color:var(--tw-color-blue-50)}.tw\\:bg-blue-100{background-color:var(--tw-color-blue-100)}.tw\\:bg-blue-400{background-color:var(--tw-color-blue-400)}.tw\\:bg-blue-500{background-color:var(--tw-color-blue-500)}.tw\\:bg-border{background-color:var(--border)}.tw\\:bg-card{background-color:var(--card)}.tw\\:bg-destructive\\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-destructive\\/10{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.tw\\:bg-foreground{background-color:var(--foreground)}.tw\\:bg-gray-50{background-color:var(--tw-color-gray-50)}.tw\\:bg-gray-100{background-color:var(--tw-color-gray-100)}.tw\\:bg-gray-500{background-color:var(--tw-color-gray-500)}.tw\\:bg-green-50{background-color:var(--tw-color-green-50)}.tw\\:bg-green-100{background-color:var(--tw-color-green-100)}.tw\\:bg-green-500{background-color:var(--tw-color-green-500)}.tw\\:bg-input,.tw\\:bg-input\\/30{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-input\\/30{background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:bg-muted,.tw\\:bg-muted\\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-muted\\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:bg-neutral-300{background-color:var(--tw-color-neutral-300)}.tw\\:bg-orange-100{background-color:var(--tw-color-orange-100)}.tw\\:bg-popover,.tw\\:bg-popover\\/70{background-color:var(--popover)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-popover\\/70{background-color:color-mix(in oklab, var(--popover) 70%, transparent)}}.tw\\:bg-primary{background-color:var(--primary)}.tw\\:bg-primary-foreground{background-color:var(--primary-foreground)}.tw\\:bg-primary\\/30{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-primary\\/30{background-color:color-mix(in oklab, var(--primary) 30%, transparent)}}.tw\\:bg-purple-50{background-color:var(--tw-color-purple-50)}.tw\\:bg-red-100{background-color:var(--tw-color-red-100)}.tw\\:bg-red-500{background-color:var(--tw-color-red-500)}.tw\\:bg-rose-500,.tw\\:bg-rose-500\\/5{background-color:var(--tw-color-rose-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-rose-500\\/5{background-color:color-mix(in oklab, var(--tw-color-rose-500) 5%, transparent)}}.tw\\:bg-rose-500\\/15{background-color:var(--tw-color-rose-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-rose-500\\/15{background-color:color-mix(in oklab, var(--tw-color-rose-500) 15%, transparent)}}.tw\\:bg-secondary{background-color:var(--secondary)}.tw\\:bg-sidebar{background-color:var(--sidebar)}.tw\\:bg-sidebar-accent{background-color:var(--sidebar-accent)}.tw\\:bg-sidebar-border{background-color:var(--sidebar-border)}.tw\\:bg-sky-500,.tw\\:bg-sky-500\\/5{background-color:var(--tw-color-sky-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-sky-500\\/5{background-color:color-mix(in oklab, var(--tw-color-sky-500) 5%, transparent)}}.tw\\:bg-sky-500\\/15{background-color:var(--tw-color-sky-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-sky-500\\/15{background-color:color-mix(in oklab, var(--tw-color-sky-500) 15%, transparent)}}.tw\\:bg-teal-500,.tw\\:bg-teal-500\\/5{background-color:var(--tw-color-teal-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-teal-500\\/5{background-color:color-mix(in oklab, var(--tw-color-teal-500) 5%, transparent)}}.tw\\:bg-teal-500\\/15{background-color:var(--tw-color-teal-500)}@supports (color:color-mix(in lab, red, red)){.tw\\:bg-teal-500\\/15{background-color:color-mix(in oklab, var(--tw-color-teal-500) 15%, transparent)}}.tw\\:bg-transparent{background-color:#0000}.tw\\:bg-white{background-color:var(--tw-color-white)}.tw\\:bg-yellow-50{background-color:var(--tw-color-yellow-50)}.tw\\:bg-yellow-100{background-color:var(--tw-color-yellow-100)}.tw\\:bg-yellow-500{background-color:var(--tw-color-yellow-500)}.tw\\:bg-zinc-400{background-color:var(--tw-color-zinc-400)}.tw\\:bg-clip-padding{background-clip:padding-box}.tw\\:fill-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{fill:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:fill-\\[color-mix\\(in_oklab\\,var\\(--destructive\\)_10\\%\\,var\\(--background\\)\\)\\]{fill:color-mix(in oklab,var(--destructive) 10%,var(--background))}}.tw\\:fill-destructive{fill:var(--destructive)}.tw\\:fill-foreground{fill:var(--foreground)}.tw\\:fill-yellow-400,.tw\\:fill-yellow-400\\/50{fill:var(--tw-color-yellow-400)}@supports (color:color-mix(in lab, red, red)){.tw\\:fill-yellow-400\\/50{fill:color-mix(in oklab, var(--tw-color-yellow-400) 50%, transparent)}}.tw\\:object-cover{object-fit:cover}.tw\\:\\!p-4{padding:calc(calc(var(--spacing)) * 4)!important}.tw\\:p-0{padding:calc(calc(var(--spacing)) * 0)}.tw\\:p-0\\.5{padding:calc(calc(var(--spacing)) * .5)}.tw\\:p-1{padding:calc(calc(var(--spacing)) * 1)}.tw\\:p-2{padding:calc(calc(var(--spacing)) * 2)}.tw\\:p-2\\.5{padding:calc(calc(var(--spacing)) * 2.5)}.tw\\:p-3{padding:calc(calc(var(--spacing)) * 3)}.tw\\:p-4{padding:calc(calc(var(--spacing)) * 4)}.tw\\:p-6{padding:calc(calc(var(--spacing)) * 6)}.tw\\:p-8{padding:calc(calc(var(--spacing)) * 8)}.tw\\:p-\\[1px\\]{padding:1px}.tw\\:p-\\[3px\\]{padding:3px}.tw\\:p-\\[10px\\]{padding:10px}.tw\\:p-\\[16px\\]{padding:16px}.tw\\:px-0{padding-inline:calc(calc(var(--spacing)) * 0)}.tw\\:px-0\\.5{padding-inline:calc(calc(var(--spacing)) * .5)}.tw\\:px-1{padding-inline:calc(calc(var(--spacing)) * 1)}.tw\\:px-1\\.5{padding-inline:calc(calc(var(--spacing)) * 1.5)}.tw\\:px-2{padding-inline:calc(calc(var(--spacing)) * 2)}.tw\\:px-2\\.5{padding-inline:calc(calc(var(--spacing)) * 2.5)}.tw\\:px-3{padding-inline:calc(calc(var(--spacing)) * 3)}.tw\\:px-4{padding-inline:calc(calc(var(--spacing)) * 4)}.tw\\:px-6{padding-inline:calc(calc(var(--spacing)) * 6)}.tw\\:py-0{padding-block:calc(calc(var(--spacing)) * 0)}.tw\\:py-0\\.5{padding-block:calc(calc(var(--spacing)) * .5)}.tw\\:py-1{padding-block:calc(calc(var(--spacing)) * 1)}.tw\\:py-1\\.5{padding-block:calc(calc(var(--spacing)) * 1.5)}.tw\\:py-2{padding-block:calc(calc(var(--spacing)) * 2)}.tw\\:py-3{padding-block:calc(calc(var(--spacing)) * 3)}.tw\\:py-4{padding-block:calc(calc(var(--spacing)) * 4)}.tw\\:py-6{padding-block:calc(calc(var(--spacing)) * 6)}.tw\\:py-8{padding-block:calc(calc(var(--spacing)) * 8)}.tw\\:py-\\[2px\\]{padding-block:2px}.tw\\:ps-1\\.5{padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:ps-2{padding-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:ps-2\\.5{padding-inline-start:calc(calc(var(--spacing)) * 2.5)}.tw\\:ps-4{padding-inline-start:calc(calc(var(--spacing)) * 4)}.tw\\:ps-6{padding-inline-start:calc(calc(var(--spacing)) * 6)}.tw\\:ps-7{padding-inline-start:calc(calc(var(--spacing)) * 7)}.tw\\:ps-8{padding-inline-start:calc(calc(var(--spacing)) * 8)}.tw\\:ps-9{padding-inline-start:calc(calc(var(--spacing)) * 9)}.tw\\:ps-12{padding-inline-start:calc(calc(var(--spacing)) * 12)}.tw\\:ps-\\[85px\\]{padding-inline-start:85px}.tw\\:pe-1{padding-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:pe-1\\.5{padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:pe-2{padding-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:pe-4{padding-inline-end:calc(calc(var(--spacing)) * 4)}.tw\\:pe-8{padding-inline-end:calc(calc(var(--spacing)) * 8)}.tw\\:pe-8\\!{padding-inline-end:calc(calc(var(--spacing)) * 8)!important}.tw\\:pe-9{padding-inline-end:calc(calc(var(--spacing)) * 9)}.tw\\:pe-\\[calc\\(138px\\+1rem\\)\\]{padding-inline-end:calc(138px + 1rem)}.tw\\:pe-\\[…\\]{padding-inline-end:…}.tw\\:pt-1{padding-top:calc(calc(var(--spacing)) * 1)}.tw\\:pt-2{padding-top:calc(calc(var(--spacing)) * 2)}.tw\\:pt-3{padding-top:calc(calc(var(--spacing)) * 3)}.tw\\:pt-4{padding-top:calc(calc(var(--spacing)) * 4)}.tw\\:pt-6{padding-top:calc(calc(var(--spacing)) * 6)}.tw\\:pr-0{padding-right:calc(calc(var(--spacing)) * 0)}.tw\\:pr-3{padding-right:calc(calc(var(--spacing)) * 3)}.tw\\:pr-4{padding-right:calc(calc(var(--spacing)) * 4)}.tw\\:pb-0{padding-bottom:calc(calc(var(--spacing)) * 0)}.tw\\:pb-1{padding-bottom:calc(calc(var(--spacing)) * 1)}.tw\\:pb-2{padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:pb-3{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:pb-4{padding-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:pb-8{padding-bottom:calc(calc(var(--spacing)) * 8)}.tw\\:pb-12{padding-bottom:calc(calc(var(--spacing)) * 12)}.tw\\:pb-16{padding-bottom:calc(calc(var(--spacing)) * 16)}.tw\\:pb-24{padding-bottom:calc(calc(var(--spacing)) * 24)}.tw\\:pl-2{padding-left:calc(calc(var(--spacing)) * 2)}.tw\\:pl-3{padding-left:calc(calc(var(--spacing)) * 3)}.tw\\:pl-4{padding-left:calc(calc(var(--spacing)) * 4)}.tw\\:pl-5{padding-left:calc(calc(var(--spacing)) * 5)}.tw\\:pl-6{padding-left:calc(calc(var(--spacing)) * 6)}.tw\\:pl-8{padding-left:calc(calc(var(--spacing)) * 8)}.tw\\:text-center{text-align:center}.tw\\:text-end{text-align:end}.tw\\:text-left{text-align:left}.tw\\:text-right{text-align:right}.tw\\:text-start{text-align:start}.tw\\:align-middle{vertical-align:middle}.tw\\:font-heading{font-family:var(--font-sans)}.tw\\:font-mono{font-family:var(--tw-font-mono)}.tw\\:font-sans{font-family:IBM Plex Sans Variable,sans-serif}.tw\\:text-2xl{font-size:var(--tw-text-2xl);line-height:var(--tw-leading,var(--tw-text-2xl--line-height))}.tw\\:text-3xl{font-size:var(--tw-text-3xl);line-height:var(--tw-leading,var(--tw-text-3xl--line-height))}.tw\\:text-4xl{font-size:var(--tw-text-4xl);line-height:var(--tw-leading,var(--tw-text-4xl--line-height))}.tw\\:text-base{font-size:var(--tw-text-base);line-height:var(--tw-leading,var(--tw-text-base--line-height))}.tw\\:text-lg{font-size:var(--tw-text-lg);line-height:var(--tw-leading,var(--tw-text-lg--line-height))}.tw\\:text-sm{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:text-sm\\/relaxed{font-size:var(--tw-text-sm);line-height:var(--tw-leading-relaxed)}.tw\\:text-xl{font-size:var(--tw-text-xl);line-height:var(--tw-leading,var(--tw-text-xl--line-height))}.tw\\:text-xs{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:text-\\[0\\.8rem\\]{font-size:.8rem}.tw\\:leading-6{--tw-leading:calc(calc(var(--spacing)) * 6);line-height:calc(calc(var(--spacing)) * 6)}.tw\\:leading-loose{--tw-leading:var(--tw-leading-loose);line-height:var(--tw-leading-loose)}.tw\\:leading-none{--tw-leading:1;line-height:1}.tw\\:leading-relaxed{--tw-leading:var(--tw-leading-relaxed);line-height:var(--tw-leading-relaxed)}.tw\\:leading-snug{--tw-leading:var(--tw-leading-snug);line-height:var(--tw-leading-snug)}.tw\\:leading-tight{--tw-leading:var(--tw-leading-tight);line-height:var(--tw-leading-tight)}.tw\\:font-bold{--tw-font-weight:var(--tw-font-weight-bold);font-weight:var(--tw-font-weight-bold)}.tw\\:font-extrabold{--tw-font-weight:var(--tw-font-weight-extrabold);font-weight:var(--tw-font-weight-extrabold)}.tw\\:font-medium{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:font-normal{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:font-semibold{--tw-font-weight:var(--tw-font-weight-semibold);font-weight:var(--tw-font-weight-semibold)}.tw\\:tracking-tight{--tw-tracking:var(--tw-tracking-tight);letter-spacing:var(--tw-tracking-tight)}.tw\\:tracking-wider{--tw-tracking:var(--tw-tracking-wider);letter-spacing:var(--tw-tracking-wider)}.tw\\:tracking-widest{--tw-tracking:var(--tw-tracking-widest);letter-spacing:var(--tw-tracking-widest)}.tw\\:text-balance{text-wrap:balance}.tw\\:text-nowrap{text-wrap:nowrap}.tw\\:break-words{overflow-wrap:break-word}.tw\\:text-clip{text-overflow:clip}.tw\\:text-ellipsis{text-overflow:ellipsis}.tw\\:whitespace-normal{white-space:normal}.tw\\:whitespace-nowrap{white-space:nowrap}.tw\\:whitespace-pre{white-space:pre}.tw\\:whitespace-pre-line{white-space:pre-line}.tw\\:whitespace-pre-wrap{white-space:pre-wrap}.tw\\:\\[color\\:blue\\]{color:#00f}.tw\\:text-accent-foreground{color:var(--accent-foreground)}.tw\\:text-amber-600{color:var(--tw-color-amber-600)}.tw\\:text-background{color:var(--background)}.tw\\:text-blue-400{color:var(--tw-color-blue-400)}.tw\\:text-blue-500{color:var(--tw-color-blue-500)}.tw\\:text-blue-600{color:var(--tw-color-blue-600)}.tw\\:text-blue-800{color:var(--tw-color-blue-800)}.tw\\:text-card-foreground{color:var(--card-foreground)}.tw\\:text-current{color:currentColor}.tw\\:text-destructive{color:var(--destructive)}.tw\\:text-foreground{color:var(--foreground)}.tw\\:text-foreground\\!{color:var(--foreground)!important}.tw\\:text-foreground\\/30{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/30{color:color-mix(in oklab, var(--foreground) 30%, transparent)}}.tw\\:text-foreground\\/50{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/50{color:color-mix(in oklab, var(--foreground) 50%, transparent)}}.tw\\:text-foreground\\/60{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/60{color:color-mix(in oklab, var(--foreground) 60%, transparent)}}.tw\\:text-foreground\\/70{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-foreground\\/70{color:color-mix(in oklab, var(--foreground) 70%, transparent)}}.tw\\:text-gray-300{color:var(--tw-color-gray-300)}.tw\\:text-gray-500{color:var(--tw-color-gray-500)}.tw\\:text-gray-600{color:var(--tw-color-gray-600)}.tw\\:text-gray-700{color:var(--tw-color-gray-700)}.tw\\:text-gray-800{color:var(--tw-color-gray-800)}.tw\\:text-green-600{color:var(--tw-color-green-600)}.tw\\:text-green-700{color:var(--tw-color-green-700)}.tw\\:text-green-800{color:var(--tw-color-green-800)}.tw\\:text-inherit{color:inherit}.tw\\:text-muted-foreground,.tw\\:text-muted-foreground\\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-muted-foreground\\/50{color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.tw\\:text-orange-800{color:var(--tw-color-orange-800)}.tw\\:text-popover-foreground{color:var(--popover-foreground)}.tw\\:text-primary{color:var(--primary)}.tw\\:text-primary-foreground{color:var(--primary-foreground)}.tw\\:text-purple-900{color:var(--tw-color-purple-900)}.tw\\:text-red-500{color:var(--tw-color-red-500)}.tw\\:text-red-600{color:var(--tw-color-red-600)}.tw\\:text-red-700{color:var(--tw-color-red-700)}.tw\\:text-red-800{color:var(--tw-color-red-800)}.tw\\:text-rose-600{color:var(--tw-color-rose-600)}.tw\\:text-secondary-foreground{color:var(--secondary-foreground)}.tw\\:text-sidebar-accent-foreground{color:var(--sidebar-accent-foreground)}.tw\\:text-sidebar-foreground,.tw\\:text-sidebar-foreground\\/70{color:var(--sidebar-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:text-sidebar-foreground\\/70{color:color-mix(in oklab, var(--sidebar-foreground) 70%, transparent)}}.tw\\:text-sky-600{color:var(--tw-color-sky-600)}.tw\\:text-slate-900{color:var(--tw-color-slate-900)}.tw\\:text-teal-600{color:var(--tw-color-teal-600)}.tw\\:text-white{color:var(--tw-color-white)}.tw\\:text-yellow-400{color:var(--tw-color-yellow-400)}.tw\\:text-yellow-600{color:var(--tw-color-yellow-600)}.tw\\:text-yellow-700{color:var(--tw-color-yellow-700)}.tw\\:capitalize{text-transform:capitalize}.tw\\:uppercase{text-transform:uppercase}.tw\\:italic{font-style:italic}.tw\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tw\\:line-through{text-decoration-line:line-through}.tw\\:underline{text-decoration-line:underline}.tw\\:decoration-destructive{-webkit-text-decoration-color:var(--destructive);-webkit-text-decoration-color:var(--destructive);text-decoration-color:var(--destructive)}.tw\\:underline-offset-4{text-underline-offset:4px}.tw\\:opacity-0{opacity:0}.tw\\:opacity-40{opacity:.4}.tw\\:opacity-50{opacity:.5}.tw\\:opacity-60{opacity:.6}.tw\\:opacity-100{opacity:1}.tw\\:bg-blend-color{background-blend-mode:color}.tw\\:shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-\\[0_0_0_1px_var\\(--sidebar-border\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-border));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-none\\!{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.tw\\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:ring-background{--tw-ring-color:var(--background)}.tw\\:ring-foreground\\/10{--tw-ring-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:ring-foreground\\/10{--tw-ring-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}.tw\\:ring-primary{--tw-ring-color:var(--primary)}.tw\\:ring-ring\\/50{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:ring-ring\\/50{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:ring-sidebar-ring{--tw-ring-color:var(--sidebar-ring)}.tw\\:ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:ring-offset-background{--tw-ring-offset-color:var(--background)}.tw\\:ring-offset-white{--tw-ring-offset-color:var(--tw-color-white)}.tw\\:outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:outline-hidden{outline-offset:2px;outline:2px solid #0000}}.tw\\:drop-shadow-sm{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--tw-drop-shadow-sm));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.tw\\:transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[color\\,box-shadow\\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[left\\,right\\,width\\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[margin\\,opacity\\]{transition-property:margin,opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[width\\,height\\,padding\\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:transition-none{transition-property:none}.tw\\:duration-100{--tw-duration:.1s;transition-duration:.1s}.tw\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.tw\\:ease-linear{--tw-ease:linear;transition-timing-function:linear}.tw\\:prose-quoteless :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before,.tw\\:prose-quoteless :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.tw\\:outline-none{--tw-outline-style:none;outline-style:none}.tw\\:select-none{-webkit-user-select:none;user-select:none}.tw\\:\\[unicode-bidi\\:plaintext\\]{unicode-bidi:plaintext}.tw\\:group-focus-within\\/menu-item\\:opacity-100:is(:where(.tw\\:group\\/menu-item):focus-within *){opacity:1}@media (hover:hover){.tw\\:group-hover\\:visible:is(:where(.tw\\:group):hover *){visibility:visible}.tw\\:group-hover\\:hidden:is(:where(.tw\\:group):hover *){display:none}.tw\\:group-hover\\:opacity-100:is(:where(.tw\\:group):hover *),.tw\\:group-hover\\/menu-item\\:opacity-100:is(:where(.tw\\:group\\/menu-item):hover *){opacity:1}}.tw\\:group-focus\\/context-menu-item\\:text-accent-foreground:is(:where(.tw\\:group\\/context-menu-item):focus *),.tw\\:group-focus\\/dropdown-menu-item\\:text-accent-foreground:is(:where(.tw\\:group\\/dropdown-menu-item):focus *),.tw\\:group-focus\\/menubar-item\\:text-accent-foreground:is(:where(.tw\\:group\\/menubar-item):focus *){color:var(--accent-foreground)}.tw\\:group-has-disabled\\/field\\:opacity-50:is(:where(.tw\\:group\\/field):has(:disabled) *){opacity:.5}.tw\\:group-has-data-\\[sidebar\\=menu-action\\]\\/menu-item\\:pe-8:is(:where(.tw\\:group\\/menu-item):has([data-sidebar=menu-action]) *){padding-inline-end:calc(calc(var(--spacing)) * 8)}.tw\\:group-has-data-\\[size\\=lg\\]\\/avatar-group\\:size-10:is(:where(.tw\\:group\\/avatar-group):has([data-size=lg]) *){width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:group-has-data-\\[size\\=sm\\]\\/avatar-group\\:size-6:is(:where(.tw\\:group\\/avatar-group):has([data-size=sm]) *){width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:group-has-data-\\[slot\\=command-shortcut\\]\\/command-item\\:hidden:is(:where(.tw\\:group\\/command-item):has([data-slot=command-shortcut]) *){display:none}.tw\\:group-has-\\[\\>input\\]\\/input-group\\:pt-2:is(:where(.tw\\:group\\/input-group):has(>input) *){padding-top:calc(calc(var(--spacing)) * 2)}.tw\\:group-has-\\[\\>input\\]\\/input-group\\:pb-2:is(:where(.tw\\:group\\/input-group):has(>input) *){padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:group-has-\\[\\>svg\\]\\/alert\\:col-start-2:is(:where(.tw\\:group\\/alert):has(>svg) *){grid-column-start:2}.tw\\:group-data-\\[checked\\=true\\]\\/command-item\\:opacity-100:is(:where(.tw\\:group\\/command-item)[data-checked=true] *){opacity:1}.tw\\:group-data-\\[collapsible\\=icon\\]\\:-mt-8:is(:where(.tw\\:group)[data-collapsible=icon] *){margin-top:calc(calc(var(--spacing)) * -8)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:hidden:is(:where(.tw\\:group)[data-collapsible=icon] *){display:none}.tw\\:group-data-\\[collapsible\\=icon\\]\\:size-8\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(calc(var(--spacing)) * 8)!important;height:calc(calc(var(--spacing)) * 8)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\(--sidebar-width-icon\\):is(:where(.tw\\:group)[data-collapsible=icon] *){width:var(--sidebar-width-icon)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\)\\]:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(calc(var(--spacing)) * 4)))}.tw\\:group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\+2px\\)\\]:is(:where(.tw\\:group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(calc(var(--spacing)) * 4)) + 2px)}.tw\\:group-data-\\[collapsible\\=icon\\]\\:overflow-hidden:is(:where(.tw\\:group)[data-collapsible=icon] *){overflow:hidden}.tw\\:group-data-\\[collapsible\\=icon\\]\\:p-0\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){padding:calc(calc(var(--spacing)) * 0)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:p-2\\!:is(:where(.tw\\:group)[data-collapsible=icon] *){padding:calc(calc(var(--spacing)) * 2)!important}.tw\\:group-data-\\[collapsible\\=icon\\]\\:opacity-0:is(:where(.tw\\:group)[data-collapsible=icon] *){opacity:0}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:right-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\]:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:left-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\]:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:w-0:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){width:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:translate-x-0:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:group-data-\\[disabled\\=true\\]\\:pointer-events-none:is(:where(.tw\\:group)[data-disabled=true] *){pointer-events:none}.tw\\:group-data-\\[disabled\\=true\\]\\:opacity-50:is(:where(.tw\\:group)[data-disabled=true] *),.tw\\:group-data-\\[disabled\\=true\\]\\/input-group\\:opacity-50:is(:where(.tw\\:group\\/input-group)[data-disabled=true] *){opacity:.5}.tw\\:group-data-\\[side\\=primary\\]\\:-right-4:is(:where(.tw\\:group)[data-side=primary] *){right:calc(calc(var(--spacing)) * -4)}.tw\\:group-data-\\[side\\=primary\\]\\:border-e:is(:where(.tw\\:group)[data-side=primary] *){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.tw\\:group-data-\\[side\\=secondary\\]\\:left-0:is(:where(.tw\\:group)[data-side=secondary] *){left:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-\\[side\\=secondary\\]\\:rotate-180:is(:where(.tw\\:group)[data-side=secondary] *){rotate:180deg}.tw\\:group-data-\\[side\\=secondary\\]\\:border-s:is(:where(.tw\\:group)[data-side=secondary] *){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:group-data-\\[size\\=default\\]\\/avatar\\:size-2\\.5:is(:where(.tw\\:group\\/avatar)[data-size=default] *){width:calc(calc(var(--spacing)) * 2.5);height:calc(calc(var(--spacing)) * 2.5)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:size-4:is(:where(.tw\\:group\\/switch)[data-size=default] *){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[size\\=lg\\]\\/avatar\\:size-3:is(:where(.tw\\:group\\/avatar)[data-size=lg] *){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=sm] *){width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:text-xs:is(:where(.tw\\:group\\/avatar)[data-size=sm] *){font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:p-3:is(:where(.tw\\:group\\/card)[data-size=sm] *){padding:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:px-3:is(:where(.tw\\:group\\/card)[data-size=sm] *){padding-inline:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:text-sm:is(:where(.tw\\:group\\/card)[data-size=sm] *){font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:size-3:is(:where(.tw\\:group\\/switch)[data-size=sm] *){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:rounded-none:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *){border-radius:0}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:px-2:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *){padding-inline:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[variant\\=floating\\]\\:rounded-lg:is(:where(.tw\\:group)[data-variant=floating] *){border-radius:var(--radius)}.tw\\:group-data-\\[variant\\=floating\\]\\:shadow-sm:is(:where(.tw\\:group)[data-variant=floating] *){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=floating\\]\\:ring-1:is(:where(.tw\\:group)[data-variant=floating] *){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=floating\\]\\:ring-sidebar-border:is(:where(.tw\\:group)[data-variant=floating] *){--tw-ring-color:var(--sidebar-border)}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *){background-color:#0000}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:mx-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){margin-inline:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:mt-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){margin-top:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:h-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){height:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:w-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){width:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:text-center:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){text-align:center}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:my-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){margin-block:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:me-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){margin-inline-end:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:h-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){height:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=left\\]\\/drawer-content\\:w-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=left] *){width:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:my-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){margin-block:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:ms-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){margin-inline-start:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:h-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){height:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=right\\]\\/drawer-content\\:w-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=right] *){width:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:mx-auto:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){margin-inline:auto}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:mb-4:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:block:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){display:block}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:h-1\\.5:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){height:calc(calc(var(--spacing)) * 1.5)}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:w-\\[100px\\]:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){width:100px}.tw\\:group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:text-center:is(:where(.tw\\:group\\/drawer-content)[data-vaul-drawer-direction=top] *){text-align:center}.tw\\:group-data-selected\\/command-item\\:text-foreground:is(:where(.tw\\:group\\/command-item):where([data-selected=true]) *){color:var(--foreground)}.tw\\:group-data-horizontal\\/tabs\\:h-8:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *){height:calc(calc(var(--spacing)) * 8)}.tw\\:group-data-vertical\\/tabs\\:h-fit:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){height:fit-content}.tw\\:group-data-vertical\\/tabs\\:w-full:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){width:100%}.tw\\:group-data-vertical\\/tabs\\:flex-col:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){flex-direction:column}.tw\\:group-data-vertical\\/tabs\\:justify-start:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *){justify-content:flex-start}@media (hover:hover){.tw\\:peer-hover\\/menu-button\\:text-sidebar-accent-foreground:is(:where(.tw\\:peer\\/menu-button):hover~*){color:var(--sidebar-accent-foreground)}.tw\\:peer-focus\\:group-hover\\:text-blue-500:is(:where(.tw\\:peer):focus~*):is(:where(.tw\\:group):hover *){color:var(--tw-color-blue-500)}}.tw\\:peer-disabled\\:cursor-not-allowed:is(:where(.tw\\:peer):disabled~*){cursor:not-allowed}.tw\\:peer-disabled\\:opacity-50:is(:where(.tw\\:peer):disabled~*){opacity:.5}.tw\\:peer-data-\\[size\\=default\\]\\/menu-button\\:top-1\\.5:is(:where(.tw\\:peer\\/menu-button)[data-size=default]~*){top:calc(calc(var(--spacing)) * 1.5)}.tw\\:peer-data-\\[size\\=lg\\]\\/menu-button\\:top-2\\.5:is(:where(.tw\\:peer\\/menu-button)[data-size=lg]~*){top:calc(calc(var(--spacing)) * 2.5)}.tw\\:peer-data-\\[size\\=sm\\]\\/menu-button\\:top-1:is(:where(.tw\\:peer\\/menu-button)[data-size=sm]~*){top:calc(calc(var(--spacing)) * 1)}.tw\\:peer-data-active\\/menu-button\\:text-sidebar-accent-foreground:is(:is(:where(.tw\\:peer\\/menu-button):where([data-state=active]),:where(.tw\\:peer\\/menu-button):where([data-active]:not([data-active=false])))~*){color:var(--sidebar-accent-foreground)}.tw\\:file\\:inline-flex::file-selector-button{display:inline-flex}.tw\\:file\\:h-6::file-selector-button{height:calc(calc(var(--spacing)) * 6)}.tw\\:file\\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.tw\\:file\\:bg-transparent::file-selector-button{background-color:#0000}.tw\\:file\\:text-sm::file-selector-button{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:file\\:font-medium::file-selector-button{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:file\\:text-foreground::file-selector-button{color:var(--foreground)}.tw\\:placeholder\\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.tw\\:placeholder\\:text-slate-400::placeholder{color:var(--tw-color-slate-400)}.tw\\:before\\:absolute:before{content:var(--tw-content);position:absolute}.tw\\:before\\:top-0\\.5:before{content:var(--tw-content);top:calc(calc(var(--spacing)) * .5)}.tw\\:before\\:left-0:before{content:var(--tw-content);left:calc(calc(var(--spacing)) * 0)}.tw\\:before\\:block:before{content:var(--tw-content);display:block}.tw\\:before\\:hidden:before{content:var(--tw-content);display:none}.tw\\:before\\:h-4:before{content:var(--tw-content);height:calc(calc(var(--spacing)) * 4)}.tw\\:before\\:w-4:before{content:var(--tw-content);width:calc(calc(var(--spacing)) * 4)}.tw\\:before\\:cursor-pointer:before{content:var(--tw-content);cursor:pointer}.tw\\:before\\:rounded:before{content:var(--tw-content);border-radius:.25rem}.tw\\:before\\:border:before{content:var(--tw-content);border-style:var(--tw-border-style);border-width:1px}.tw\\:before\\:border-primary:before{content:var(--tw-content);border-color:var(--primary)}.tw\\:before\\:bg-primary:before{content:var(--tw-content);background-color:var(--primary)}.tw\\:before\\:bg-cover:before{content:var(--tw-content);background-size:cover}.tw\\:before\\:bg-no-repeat:before{content:var(--tw-content);background-repeat:no-repeat}.tw\\:before\\:content-\\[\\"\\"\\]:before{--tw-content:"";content:var(--tw-content)}.tw\\:before\\:content-\\[\\\\\\"\\\\\\"\\]:before{--tw-content:\\"\\";content:var(--tw-content)}.tw\\:after\\:absolute:after{content:var(--tw-content);position:absolute}.tw\\:after\\:-inset-2:after{content:var(--tw-content);inset:calc(calc(var(--spacing)) * -2)}.tw\\:after\\:inset-0:after{content:var(--tw-content);inset:calc(calc(var(--spacing)) * 0)}.tw\\:after\\:-inset-x-3:after{content:var(--tw-content);inset-inline:calc(calc(var(--spacing)) * -3)}.tw\\:after\\:-inset-y-2:after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * -2)}.tw\\:after\\:inset-y-0:after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:after\\:start-1\\/2:after{content:var(--tw-content);inset-inline-start:50%}.tw\\:after\\:top-\\[6px\\]:after{content:var(--tw-content);top:6px}.tw\\:after\\:right-\\[7px\\]:after{content:var(--tw-content);right:7px}.tw\\:after\\:left-\\[7px\\]:after{content:var(--tw-content);left:7px}.tw\\:after\\:block:after{content:var(--tw-content);display:block}.tw\\:after\\:hidden:after{content:var(--tw-content);display:none}.tw\\:after\\:h-0\\.5:after{content:var(--tw-content);height:calc(calc(var(--spacing)) * .5)}.tw\\:after\\:h-\\[6px\\]:after{content:var(--tw-content);height:6px}.tw\\:after\\:w-1:after{content:var(--tw-content);width:calc(calc(var(--spacing)) * 1)}.tw\\:after\\:w-\\[2px\\]:after{content:var(--tw-content);width:2px}.tw\\:after\\:w-\\[3px\\]:after{content:var(--tw-content);width:3px}.tw\\:after\\:-translate-x-1\\/2:after{content:var(--tw-content);--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:after\\:rotate-45:after{content:var(--tw-content);rotate:45deg}.tw\\:after\\:cursor-pointer:after{content:var(--tw-content);cursor:pointer}.tw\\:after\\:rounded-full:after{content:var(--tw-content);border-radius:3.40282e38px}.tw\\:after\\:border:after{content:var(--tw-content);border-style:var(--tw-border-style);border-width:1px}.tw\\:after\\:border-t-0:after{content:var(--tw-content);border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:after\\:border-r-2:after{content:var(--tw-content);border-right-style:var(--tw-border-style);border-right-width:2px}.tw\\:after\\:border-b-2:after{content:var(--tw-content);border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.tw\\:after\\:border-l-0:after{content:var(--tw-content);border-left-style:var(--tw-border-style);border-left-width:0}.tw\\:after\\:border-solid:after{content:var(--tw-content);--tw-border-style:solid;border-style:solid}.tw\\:after\\:border-border:after{content:var(--tw-content);border-color:var(--border)}.tw\\:after\\:border-white:after{content:var(--tw-content);border-color:var(--tw-color-white)}.tw\\:after\\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.tw\\:after\\:bg-muted:after{content:var(--tw-content);background-color:var(--muted)}.tw\\:after\\:opacity-0:after{content:var(--tw-content);opacity:0}.tw\\:after\\:mix-blend-darken:after{content:var(--tw-content);mix-blend-mode:darken}.tw\\:after\\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--tw-default-transition-timing-function));transition-duration:var(--tw-duration,var(--tw-default-transition-duration))}.tw\\:after\\:content-\\[\\"\\"\\]:after{--tw-content:"";content:var(--tw-content)}.tw\\:after\\:content-\\[\\\\\\"\\\\\\"\\]:after{--tw-content:\\"\\";content:var(--tw-content)}.tw\\:group-data-\\[collapsible\\=offcanvas\\]\\:after\\:start-full:is(:where(.tw\\:group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);inset-inline-start:100%}.tw\\:group-data-horizontal\\/tabs\\:after\\:inset-x-0:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-horizontal\\/tabs\\:after\\:bottom-\\[-5px\\]:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);bottom:-5px}.tw\\:group-data-horizontal\\/tabs\\:after\\:h-0\\.5:is(:where(.tw\\:group\\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);height:calc(calc(var(--spacing)) * .5)}.tw\\:group-data-vertical\\/tabs\\:after\\:inset-y-0:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:group-data-vertical\\/tabs\\:after\\:-end-1:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);inset-inline-end:calc(calc(var(--spacing)) * -1)}.tw\\:group-data-vertical\\/tabs\\:after\\:w-0\\.5:is(:where(.tw\\:group\\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);width:calc(calc(var(--spacing)) * .5)}.tw\\:first\\:mt-0:first-child{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:last\\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:even\\:bg-muted:nth-child(2n){background-color:var(--muted)}.tw\\:focus-within\\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-within\\:ring-ring:focus-within{--tw-ring-color:var(--ring)}.tw\\:focus-within\\:ring-offset-1:focus-within{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}@media (hover:hover){.tw\\:hover\\:-mt-4:hover{margin-top:calc(calc(var(--spacing)) * -4)}.tw\\:hover\\:cursor-pointer:hover{cursor:pointer}.tw\\:hover\\:bg-accent:hover,.tw\\:hover\\:bg-accent\\/30:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-accent\\/30:hover{background-color:color-mix(in oklab, var(--accent) 30%, transparent)}}.tw\\:hover\\:bg-accent\\/80:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-accent\\/80:hover{background-color:color-mix(in oklab, var(--accent) 80%, transparent)}}.tw\\:hover\\:bg-blue-600:hover{background-color:var(--tw-color-blue-600)}.tw\\:hover\\:bg-destructive\\/20:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-destructive\\/20:hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:hover\\:bg-gray-50:hover{background-color:var(--tw-color-gray-50)}.tw\\:hover\\:bg-input:hover{background-color:var(--input)}.tw\\:hover\\:bg-muted:hover,.tw\\:hover\\:bg-muted\\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-muted\\/50:hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:hover\\:bg-muted\\/80:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-muted\\/80:hover{background-color:color-mix(in oklab, var(--muted) 80%, transparent)}}.tw\\:hover\\:bg-primary\\/10:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/10:hover{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.tw\\:hover\\:bg-primary\\/70:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/70:hover{background-color:color-mix(in oklab, var(--primary) 70%, transparent)}}.tw\\:hover\\:bg-primary\\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.tw\\:hover\\:bg-red-500:hover{background-color:var(--tw-color-red-500)}.tw\\:hover\\:bg-secondary:hover,.tw\\:hover\\:bg-secondary\\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.tw\\:hover\\:bg-secondary\\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.tw\\:hover\\:bg-sidebar-accent:hover{background-color:var(--sidebar-accent)}.tw\\:hover\\:bg-transparent:hover{background-color:#0000}.tw\\:hover\\:text-foreground:hover{color:var(--foreground)}.tw\\:hover\\:text-muted-foreground:hover{color:var(--muted-foreground)}.tw\\:hover\\:text-primary-foreground:hover{color:var(--primary-foreground)}.tw\\:hover\\:text-sidebar-accent-foreground:hover{color:var(--sidebar-accent-foreground)}.tw\\:hover\\:underline:hover{text-decoration-line:underline}.tw\\:hover\\:opacity-80:hover{opacity:.8}.tw\\:hover\\:opacity-100:hover{opacity:1}.tw\\:hover\\:shadow-\\[0_0_0_1px_var\\(--sidebar-accent\\)\\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-accent));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:ring-3:hover{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:hover\\:group-data-\\[collapsible\\=offcanvas\\]\\:bg-sidebar:hover:is(:where(.tw\\:group)[data-collapsible=offcanvas] *){background-color:var(--sidebar)}.tw\\:hover\\:after\\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:var(--sidebar-border)}}.tw\\:focus\\:relative:focus{position:relative}.tw\\:focus\\:z-10:focus{z-index:10}.tw\\:focus\\:bg-accent:focus{background-color:var(--accent)}.tw\\:focus\\:bg-muted:focus{background-color:var(--muted)}.tw\\:focus\\:text-accent-foreground:focus{color:var(--accent-foreground)}.tw\\:focus\\:text-foreground:focus{color:var(--foreground)}.tw\\:focus\\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus\\:ring-ring:focus{--tw-ring-color:var(--ring)}.tw\\:focus\\:ring-offset-1:focus{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:focus\\:ring-offset-background:focus{--tw-ring-offset-color:var(--background)}.tw\\:focus\\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:focus\\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}:is(.tw\\:focus\\:\\*\\*\\:text-accent-foreground:focus *),:is(.tw\\:not-data-\\[variant\\=destructive\\]\\:focus\\:\\*\\*\\:text-accent-foreground:not([data-variant=destructive]):focus *){color:var(--accent-foreground)}.tw\\:focus-visible\\:relative:focus-visible{position:relative}.tw\\:focus-visible\\:z-10:focus-visible{z-index:10}.tw\\:focus-visible\\:border-destructive\\/40:focus-visible{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:border-destructive\\/40:focus-visible{border-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:focus-visible\\:border-ring:focus-visible{border-color:var(--ring)}.tw\\:focus-visible\\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-3:focus-visible,.tw\\:focus-visible\\:ring-\\[3px\\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:focus-visible\\:ring-\\[color\\:hsl\\(240\\,5\\%\\,64\\.9\\%\\)\\]:focus-visible{--tw-ring-color:#a1a1aa}.tw\\:focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:focus-visible\\:ring-ring:focus-visible,.tw\\:focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:focus-visible\\:ring-slate-400:focus-visible{--tw-ring-color:var(--tw-color-slate-400)}.tw\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.tw\\:focus-visible\\:outline-hidden:focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tw\\:focus-visible\\:outline-hidden:focus-visible{outline-offset:2px;outline:2px solid #0000}}.tw\\:focus-visible\\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.tw\\:focus-visible\\:outline-ring:focus-visible{outline-color:var(--ring)}.tw\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}:is(.tw\\:\\*\\:focus-visible\\:relative>*):focus-visible{position:relative}:is(.tw\\:\\*\\:focus-visible\\:z-10>*):focus-visible{z-index:10}.tw\\:active\\:bg-sidebar-accent:active{background-color:var(--sidebar-accent)}.tw\\:active\\:text-sidebar-accent-foreground:active{color:var(--sidebar-accent-foreground)}.tw\\:active\\:ring-3:active{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:active\\:not-aria-\\[haspopup\\]\\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:active\\:not-aria-\\[haspopup\\]\\:transform-\\[translateY\\(1px\\)\\]:active:not([aria-haspopup]){transform:translateY(1px)}.tw\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.tw\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.tw\\:disabled\\:bg-input\\/50:disabled{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:disabled\\:bg-input\\/50:disabled{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:disabled\\:bg-transparent:disabled{background-color:#0000}.tw\\:disabled\\:opacity-50:disabled{opacity:.5}:where([data-side=bottom]) .tw\\:in-data-\\[side\\=bottom\\]\\:translate-y-\\[calc\\(-50\\%-1px\\)\\]{--tw-translate-y:calc(-50% - 1px);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=bottom]) .tw\\:in-data-\\[side\\=bottom\\]\\:\\[clip-path\\:polygon\\(100\\%_0\\,100\\%_100\\%\\,0_100\\%\\)\\]{clip-path:polygon(100% 0,100% 100%,0 100%)}:where([data-side=primary]) .tw\\:in-data-\\[side\\=primary\\]\\:cursor-w-resize{cursor:w-resize}:where([data-side=secondary]) .tw\\:in-data-\\[side\\=secondary\\]\\:cursor-e-resize{cursor:e-resize}:where([data-side=top]) .tw\\:in-data-\\[side\\=top\\]\\:translate-y-\\[calc\\(-50\\%-1px\\)\\]{--tw-translate-y:calc(-50% - 1px);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=top]) .tw\\:in-data-\\[side\\=top\\]\\:\\[clip-path\\:polygon\\(100\\%_0\\,100\\%_100\\%\\,0_100\\%\\)\\]{clip-path:polygon(100% 0,100% 100%,0 100%)}:where([data-slot=button-group]) .tw\\:in-data-\\[slot\\=button-group\\]\\:rounded-lg{border-radius:var(--radius)}:where([data-slot=combobox-content]) .tw\\:in-data-\\[slot\\=combobox-content\\]\\:focus-within\\:border-inherit:focus-within{border-color:inherit}:where([data-slot=combobox-content]) .tw\\:in-data-\\[slot\\=combobox-content\\]\\:focus-within\\:ring-0:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:where([data-slot=dialog-content]) .tw\\:in-data-\\[slot\\=dialog-content\\]\\:rounded-lg\\!{border-radius:var(--radius)!important}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/20{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/20{background-color:color-mix(in oklab, var(--background) 20%, transparent)}}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:text-background{color:var(--background)}:where([data-slot=tooltip-content]) .tw\\:in-data-\\[slot\\=tooltip-content\\]\\:text-destructive{color:var(--destructive)}.tw\\:has-disabled\\:bg-input\\/50:has(:disabled){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-disabled\\:bg-input\\/50:has(:disabled){background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:has-disabled\\:opacity-50:has(:disabled){opacity:.5}.tw\\:has-aria-expanded\\:bg-muted\\/50:has([aria-expanded=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-aria-expanded\\:bg-muted\\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-1:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1)}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-1\\.5:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-end\\]\\:pe-2:has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:has-data-\\[icon\\=inline-end\\]\\:pe-1\\.5:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *):has([data-icon=inline-end]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-1:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-1\\.5:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[icon\\=inline-start\\]\\:ps-2:has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[spacing\\=0\\]\\/toggle-group\\:has-data-\\[icon\\=inline-start\\]\\:ps-1\\.5:is(:where(.tw\\:group\\/toggle-group)[data-spacing="0"] *):has([data-icon=inline-start]){padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[slot\\=alert-action\\]\\:relative:has([data-slot=alert-action]){position:relative}.tw\\:has-data-\\[slot\\=alert-action\\]\\:pe-18:has([data-slot=alert-action]){padding-inline-end:calc(calc(var(--spacing)) * 18)}.tw\\:has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.tw\\:has-data-\\[slot\\=card-description\\]\\:grid-rows-\\[auto_auto\\]:has([data-slot=card-description]){grid-template-rows:auto auto}.tw\\:has-data-\\[slot\\=card-footer\\]\\:pb-0:has([data-slot=card-footer]){padding-bottom:calc(calc(var(--spacing)) * 0)}.tw\\:has-data-\\[slot\\=kbd\\]\\:pe-0:has([data-slot=kbd]){padding-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:has-data-\\[slot\\=kbd\\]\\:pe-1\\.5:has([data-slot=kbd]){padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-data-\\[variant\\=inset\\]\\:bg-sidebar:has([data-variant=inset]){background-color:var(--sidebar)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:border-ring:has([data-slot=input-group-control]:focus-visible){border-color:var(--ring)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-3:has([data-slot=input-group-control]:focus-visible){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-ring\\/50:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-ring\\/50:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:border-destructive:has([data-slot][aria-invalid=true]){border-color:var(--destructive)}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-3:has([data-slot][aria-invalid=true]){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/20:has([data-slot][aria-invalid=true]){--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/20:has([data-slot][aria-invalid=true]){--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:h-auto:has(>[data-align=block-end]){height:auto}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:flex-col:has(>[data-align=block-end]){flex-direction:column}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:h-auto:has(>[data-align=block-start]){height:auto}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:flex-col:has(>[data-align=block-start]){flex-direction:column}.tw\\:has-\\[\\>\\[data-slot\\=button-group\\]\\]\\:gap-2:has(>[data-slot=button-group]){gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>button\\]\\:ms-\\[-0\\.3rem\\]:has(>button){margin-inline-start:-.3rem}.tw\\:has-\\[\\>button\\]\\:me-\\[-0\\.3rem\\]:has(>button){margin-inline-end:-.3rem}.tw\\:has-\\[\\>img\\]\\:grid-cols-\\[auto_1fr\\]:has(>img){grid-template-columns:auto 1fr}.tw\\:has-\\[\\>img\\]\\:gap-x-2:has(>img){column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>img\\:first-child\\]\\:pt-0:has(>img:first-child){padding-top:calc(calc(var(--spacing)) * 0)}.tw\\:has-\\[\\>kbd\\]\\:ms-\\[-0\\.15rem\\]:has(>kbd){margin-inline-start:-.15rem}.tw\\:has-\\[\\>kbd\\]\\:me-\\[-0\\.15rem\\]:has(>kbd){margin-inline-end:-.15rem}.tw\\:has-\\[\\>svg\\]\\:grid-cols-\\[auto_1fr\\]:has(>svg){grid-template-columns:auto 1fr}.tw\\:has-\\[\\>svg\\]\\:gap-x-2:has(>svg){column-gap:calc(calc(var(--spacing)) * 2)}.tw\\:has-\\[\\>svg\\]\\:p-0:has(>svg){padding:calc(calc(var(--spacing)) * 0)}.tw\\:has-\\[\\>textarea\\]\\:h-auto:has(>textarea){height:auto}.tw\\:aria-disabled\\:pointer-events-none[aria-disabled=true]{pointer-events:none}.tw\\:aria-disabled\\:opacity-50[aria-disabled=true]{opacity:.5}.tw\\:aria-expanded\\:bg-muted[aria-expanded=true]{background-color:var(--muted)}.tw\\:aria-expanded\\:bg-secondary[aria-expanded=true]{background-color:var(--secondary)}.tw\\:aria-expanded\\:text-foreground[aria-expanded=true]{color:var(--foreground)}.tw\\:aria-expanded\\:text-secondary-foreground[aria-expanded=true]{color:var(--secondary-foreground)}.tw\\:aria-expanded\\:opacity-100[aria-expanded=true]{opacity:1}.tw\\:aria-invalid\\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.tw\\:aria-invalid\\:ring-0[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:aria-invalid\\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:aria-invalid\\:aria-checked\\:border-primary[aria-invalid=true][aria-checked=true]{border-color:var(--primary)}.tw\\:aria-pressed\\:bg-muted[aria-pressed=true]{background-color:var(--muted)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:h-px[aria-orientation=horizontal]{height:1px}.tw\\:aria-\\[orientation\\=horizontal\\]\\:w-full[aria-orientation=horizontal]{width:100%}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:start-0[aria-orientation=horizontal]:after{content:var(--tw-content);inset-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:h-1[aria-orientation=horizontal]:after{content:var(--tw-content);height:calc(calc(var(--spacing)) * 1)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:w-full[aria-orientation=horizontal]:after{content:var(--tw-content);width:100%}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:translate-x-0[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:aria-\\[orientation\\=horizontal\\]\\:after\\:-translate-y-1\\/2[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:aria-\\[orientation\\=vertical\\]\\:flex-col[aria-orientation=vertical]{flex-direction:column}.tw\\:data-inset\\:ps-7[data-inset]{padding-inline-start:calc(calc(var(--spacing)) * 7)}.tw\\:data-placeholder\\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.tw\\:data-quiet-focus\\:focus-visible\\:border-transparent[data-quiet-focus]:focus-visible{border-color:#0000}.tw\\:data-quiet-focus\\:focus-visible\\:ring-0[data-quiet-focus]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-quiet-focus\\:focus-visible\\:outline-none[data-quiet-focus]:focus-visible{--tw-outline-style:none;outline-style:none}.tw\\:data-\\[align-trigger\\=false\\]\\:min-w-36[data-align-trigger=false]{min-width:calc(calc(var(--spacing)) * 36)}.tw\\:data-\\[align-trigger\\=true\\]\\:min-w-\\(--radix-select-trigger-width\\)[data-align-trigger=true]{min-width:var(--radix-select-trigger-width)}.tw\\:data-\\[align-trigger\\=true\\]\\:animate-none[data-align-trigger=true]{animation:none}.tw\\:data-\\[disabled\\=true\\]\\:pointer-events-none[data-disabled=true]{pointer-events:none}.tw\\:data-\\[disabled\\=true\\]\\:opacity-50[data-disabled=true]{opacity:.5}.tw\\:data-\\[position\\=popper\\]\\:h-\\(--radix-select-trigger-height\\)[data-position=popper]{height:var(--radix-select-trigger-height)}.tw\\:data-\\[position\\=popper\\]\\:w-full[data-position=popper]{width:100%}.tw\\:data-\\[position\\=popper\\]\\:min-w-\\(--radix-select-trigger-width\\)[data-position=popper]{min-width:var(--radix-select-trigger-width)}.tw\\:data-\\[side\\=bottom\\]\\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.tw\\:data-\\[side\\=left\\]\\:-translate-x-1[data-side=left]{--tw-translate-x:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.tw\\:data-\\[side\\=right\\]\\:translate-x-1[data-side=right]{--tw-translate-x:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.tw\\:data-\\[side\\=top\\]\\:-translate-y-1[data-side=top]{--tw-translate-y:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.tw\\:data-\\[size\\=default\\]\\:h-8[data-size=default]{height:calc(calc(var(--spacing)) * 8)}.tw\\:data-\\[size\\=default\\]\\:h-\\[18\\.4px\\][data-size=default]{height:18.4px}.tw\\:data-\\[size\\=default\\]\\:w-\\[32px\\][data-size=default]{width:32px}.tw\\:data-\\[size\\=lg\\]\\:size-10[data-size=lg]{width:calc(calc(var(--spacing)) * 10);height:calc(calc(var(--spacing)) * 10)}.tw\\:data-\\[size\\=md\\]\\:text-sm[data-size=md]{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:data-\\[size\\=sm\\]\\:size-6[data-size=sm]{width:calc(calc(var(--spacing)) * 6);height:calc(calc(var(--spacing)) * 6)}.tw\\:data-\\[size\\=sm\\]\\:h-7[data-size=sm]{height:calc(calc(var(--spacing)) * 7)}.tw\\:data-\\[size\\=sm\\]\\:h-\\[14px\\][data-size=sm]{height:14px}.tw\\:data-\\[size\\=sm\\]\\:w-\\[24px\\][data-size=sm]{width:24px}.tw\\:data-\\[size\\=sm\\]\\:gap-3[data-size=sm]{gap:calc(calc(var(--spacing)) * 3)}.tw\\:data-\\[size\\=sm\\]\\:rounded-\\[min\\(var\\(--tw-radius-md\\)\\,10px\\)\\][data-size=sm]{border-radius:min(var(--tw-radius-md), 10px)}.tw\\:data-\\[size\\=sm\\]\\:py-3[data-size=sm]{padding-block:calc(calc(var(--spacing)) * 3)}.tw\\:data-\\[size\\=sm\\]\\:text-xs[data-size=sm]{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}.tw\\:data-\\[size\\=sm\\]\\:has-data-\\[slot\\=card-footer\\]\\:pb-0[data-size=sm]:has([data-slot=card-footer]){padding-bottom:calc(calc(var(--spacing)) * 0)}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-item]:focus{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-item]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:data-highlighted\\:bg-foreground\\/10 *)[data-slot$=-item][data-highlighted]{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-item\\]\\:data-highlighted\\:bg-foreground\\/10 *)[data-slot$=-item][data-highlighted]{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-separator\\]\\:bg-foreground\\/5 *)[data-slot$=-separator]{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-separator\\]\\:bg-foreground\\/5 *)[data-slot$=-separator]{background-color:color-mix(in oklab, var(--foreground) 5%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-trigger]:focus{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:focus\\:bg-foreground\\/10 *)[data-slot$=-trigger]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:aria-expanded\\:bg-foreground\\/10\\! *)[data-slot$=-trigger][aria-expanded=true]{background-color:var(--foreground)!important}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[slot\\$\\=-trigger\\]\\:aria-expanded\\:bg-foreground\\/10\\! *)[data-slot$=-trigger][aria-expanded=true]{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)!important}}:is(.tw\\:\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90>*)[data-slot=alert-description]{color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90>*)[data-slot=alert-description]{color:color-mix(in oklab, var(--destructive) 90%, transparent)}}:is(.tw\\:\\*\\:data-\\[slot\\=avatar\\]\\:ring-2>*)[data-slot=avatar]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:is(.tw\\:\\*\\:data-\\[slot\\=avatar\\]\\:ring-background>*)[data-slot=avatar]{--tw-ring-color:var(--background)}:is(.tw\\:\\*\\:data-\\[slot\\=input-group-addon\\]\\:ps-2\\!>*)[data-slot=input-group-addon]{padding-inline-start:calc(calc(var(--spacing)) * 2)!important}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:relative *)[data-slot=kbd]{position:relative}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:isolate *)[data-slot=kbd]{isolation:isolate}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:z-50 *)[data-slot=kbd]{z-index:50}:is(.tw\\:\\*\\*\\:data-\\[slot\\=kbd\\]\\:rounded-sm *)[data-slot=kbd]{border-radius:calc(var(--radius) * .6)}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:flex>*)[data-slot=select-value]{display:flex}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:flex-1>*)[data-slot=select-value]{flex:1}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:items-center>*)[data-slot=select-value]{align-items:center}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:gap-1\\.5>*)[data-slot=select-value]{gap:calc(calc(var(--spacing)) * 1.5)}:is(.tw\\:\\*\\:data-\\[slot\\=select-value\\]\\:text-start>*)[data-slot=select-value]{text-align:start}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:first\\:rounded-s-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"]:first-child{border-start-start-radius:var(--radius);border-end-start-radius:var(--radius)}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:first\\:rounded-t-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"]:first-child{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:last\\:rounded-e-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"]:last-child{border-start-end-radius:var(--radius);border-end-end-radius:var(--radius)}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:last\\:rounded-b-lg:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"]:last-child{border-bottom-right-radius:var(--radius);border-bottom-left-radius:var(--radius)}.tw\\:data-\\[state\\=active\\]\\:bg-background[data-state=active]{background-color:var(--background)}.tw\\:data-\\[state\\=active\\]\\:text-foreground[data-state=active]{color:var(--foreground)}.tw\\:data-\\[state\\=active\\]\\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-\\[state\\=closed\\]\\:overflow-hidden[data-state=closed]{overflow:hidden}.tw\\:data-\\[state\\=delayed-open\\]\\:animate-in[data-state=delayed-open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-\\[state\\=delayed-open\\]\\:fade-in-0[data-state=delayed-open]{--tw-enter-opacity:0}.tw\\:data-\\[state\\=delayed-open\\]\\:zoom-in-95[data-state=delayed-open]{--tw-enter-scale:.95}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-approved\\)\\][data-state=on]{background-color:var(--inv-soft-approved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-unapproved\\)\\][data-state=on]{background-color:var(--inv-soft-unapproved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-soft-unknown\\)\\][data-state=on]{background-color:var(--inv-soft-unknown)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-approved\\)\\][data-state=on]{background-color:var(--inv-vivid-approved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-unapproved\\)\\][data-state=on]{background-color:var(--inv-vivid-unapproved)}.tw\\:data-\\[state\\=on\\]\\:bg-\\[var\\(--inv-vivid-unknown\\)\\][data-state=on]{background-color:var(--inv-vivid-unknown)}.tw\\:data-\\[state\\=on\\]\\:bg-muted[data-state=on]{background-color:var(--muted)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-approved\\)\\][data-state=on]{color:var(--inv-icon-approved)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-unapproved\\)\\][data-state=on]{color:var(--inv-icon-unapproved)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-icon-unknown\\)\\][data-state=on]{color:var(--inv-icon-unknown)}.tw\\:data-\\[state\\=on\\]\\:text-\\[var\\(--inv-on\\)\\][data-state=on]{color:var(--inv-on)}.tw\\:data-\\[state\\=on\\]\\:text-foreground[data-state=on]{color:var(--foreground)}.tw\\:data-\\[state\\=open\\]\\:bg-accent[data-state=open]{background-color:var(--accent)}.tw\\:data-\\[state\\=open\\]\\:bg-muted[data-state=open]{background-color:var(--muted)}.tw\\:data-\\[state\\=open\\]\\:text-foreground[data-state=open]{color:var(--foreground)}.tw\\:data-\\[state\\=selected\\]\\:bg-muted[data-state=selected]{background-color:var(--muted)}.tw\\:data-\\[variant\\=destructive\\]\\:text-destructive[data-variant=destructive]{color:var(--destructive)}:is(:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:\\*\\*\\:text-accent-foreground\\! *)[data-variant=destructive] *),:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:text-accent-foreground\\! *)[data-variant=destructive]{color:var(--accent-foreground)!important}.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.tw\\:data-\\[variant\\=destructive\\]\\:focus\\:text-destructive[data-variant=destructive]:focus{color:var(--destructive)}:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-foreground\\/10\\! *)[data-variant=destructive]:focus{background-color:var(--foreground)!important}@supports (color:color-mix(in lab, red, red)){:is(.tw\\:\\*\\*\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-foreground\\/10\\! *)[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--foreground) 10%, transparent)!important}}.tw\\:data-\\[variant\\=line\\]\\:rounded-none[data-variant=line]{border-radius:0}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:border-s-0:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"][data-variant=outline]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:border-t-0:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"][data-variant=outline]{border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:group-data-horizontal\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:first\\:border-s:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"][data-variant=outline]:first-child{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.tw\\:group-data-vertical\\/toggle-group\\:data-\\[spacing\\=0\\]\\:data-\\[variant\\=outline\\]\\:first\\:border-t:is(:where(.tw\\:group\\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"][data-variant=outline]:first-child{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:inset-x-0[data-vaul-drawer-direction=bottom]{inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:bottom-0[data-vaul-drawer-direction=bottom]{bottom:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:mt-24[data-vaul-drawer-direction=bottom]{margin-top:calc(calc(var(--spacing)) * 24)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:max-h-\\[80vh\\][data-vaul-drawer-direction=bottom]{max-height:80vh}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:rounded-t-xl[data-vaul-drawer-direction=bottom]{border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=bottom\\]\\:border-t[data-vaul-drawer-direction=bottom]{border-top-style:var(--tw-border-style);border-top-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:inset-y-0[data-vaul-drawer-direction=left]{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:left-0[data-vaul-drawer-direction=left]{left:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:w-3\\/4[data-vaul-drawer-direction=left]{width:75%}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:flex-row[data-vaul-drawer-direction=left]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:rounded-r-xl[data-vaul-drawer-direction=left]{border-top-right-radius:calc(var(--radius) * 1.4);border-bottom-right-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:border-r[data-vaul-drawer-direction=left]{border-right-style:var(--tw-border-style);border-right-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=left\\/right\\]\\:flex-row[data-vaul-drawer-direction=left\\/right]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:inset-y-0[data-vaul-drawer-direction=right]{inset-block:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:right-0[data-vaul-drawer-direction=right]{right:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:w-3\\/4[data-vaul-drawer-direction=right]{width:75%}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:flex-row[data-vaul-drawer-direction=right]{flex-direction:row}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:rounded-l-xl[data-vaul-drawer-direction=right]{border-top-left-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:border-l[data-vaul-drawer-direction=right]{border-left-style:var(--tw-border-style);border-left-width:1px}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:inset-x-0[data-vaul-drawer-direction=top]{inset-inline:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:top-0[data-vaul-drawer-direction=top]{top:calc(calc(var(--spacing)) * 0)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:mb-24[data-vaul-drawer-direction=top]{margin-bottom:calc(calc(var(--spacing)) * 24)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:max-h-\\[80vh\\][data-vaul-drawer-direction=top]{max-height:80vh}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:rounded-b-xl[data-vaul-drawer-direction=top]{border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.tw\\:data-\\[vaul-drawer-direction\\=top\\]\\:border-b[data-vaul-drawer-direction=top]{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.tw\\:supports-backdrop-filter\\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--tw-blur-xs));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}}@media (min-width:40rem){.tw\\:sm\\:flex{display:flex}.tw\\:sm\\:max-w-sm{max-width:var(--tw-container-sm)}.tw\\:sm\\:flex-row{flex-direction:row}.tw\\:sm\\:justify-end{justify-content:flex-end}.tw\\:sm\\:p-8{padding:calc(calc(var(--spacing)) * 8)}.tw\\:sm\\:text-start{text-align:start}.tw\\:data-\\[vaul-drawer-direction\\=left\\]\\:sm\\:max-w-sm[data-vaul-drawer-direction=left],.tw\\:data-\\[vaul-drawer-direction\\=right\\]\\:sm\\:max-w-sm[data-vaul-drawer-direction=right]{max-width:var(--tw-container-sm)}}@media (min-width:48rem){.tw\\:md\\:block{display:block}.tw\\:md\\:flex{display:flex}.tw\\:md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:md\\:gap-0\\.5{gap:calc(calc(var(--spacing)) * .5)}.tw\\:md\\:text-start{text-align:start}.tw\\:md\\:text-sm{font-size:var(--tw-text-sm);line-height:var(--tw-leading,var(--tw-text-sm--line-height))}.tw\\:md\\:text-pretty{text-wrap:pretty}.tw\\:md\\:opacity-0{opacity:0}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:m-2:is(:where(.tw\\:peer)[data-variant=inset]~*){margin:calc(calc(var(--spacing)) * 2)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:ms-0:is(:where(.tw\\:peer)[data-variant=inset]~*){margin-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:rounded-xl:is(:where(.tw\\:peer)[data-variant=inset]~*){border-radius:calc(var(--radius) * 1.4)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:shadow-sm:is(:where(.tw\\:peer)[data-variant=inset]~*){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:md\\:peer-data-\\[variant\\=inset\\]\\:peer-data-\\[state\\=collapsed\\]\\:ms-2:is(:where(.tw\\:peer)[data-variant=inset]~*):is(:where(.tw\\:peer)[data-state=collapsed]~*){margin-inline-start:calc(calc(var(--spacing)) * 2)}.tw\\:md\\:after\\:hidden:after{content:var(--tw-content);display:none}}@media (min-width:64rem){.tw\\:lg\\:flex{display:flex}.tw\\:lg\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}:where(.tw\\:lg\\:space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(calc(var(--spacing)) * 8) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(calc(var(--spacing)) * 8) * calc(1 - var(--tw-space-x-reverse)))}.tw\\:lg\\:text-5xl{font-size:var(--tw-text-5xl);line-height:var(--tw-leading,var(--tw-text-5xl--line-height))}}@media (min-width:48rem){@media (min-width:64rem){.tw\\:md\\:lg\\:hidden{display:none}}}@media (min-width:80rem){.tw\\:xl\\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.tw\\:xl\\:grid-flow-col{grid-auto-flow:column}.tw\\:xl\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\\:xl\\:grid-cols-none{grid-template-columns:none}.tw\\:xl\\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}}@container search not (min-width:7rem){.tw\\:\\@max-\\[7rem\\]\\/search\\:hidden{display:none}.tw\\:\\@max-\\[7rem\\]\\/search\\:ps-3{padding-inline-start:calc(calc(var(--spacing)) * 3)}}@container search not (min-width:4rem){.tw\\:\\@max-\\[4rem\\]\\/search\\:hidden{display:none}.tw\\:\\@max-\\[4rem\\]\\/search\\:pe-3{padding-inline-end:calc(calc(var(--spacing)) * 3)}}@container search not (min-width:3rem){.tw\\:\\@max-\\[3rem\\]\\/search\\:ps-0{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\@max-\\[3rem\\]\\/search\\:pe-0{padding-inline-end:calc(calc(var(--spacing)) * 0)}}@container (min-width:24rem){.tw\\:\\@sm\\:basis-auto{flex-basis:auto}}.tw\\:ltr\\:left-2:where(:dir(ltr),[dir=ltr],[dir=ltr] *){left:calc(calc(var(--spacing)) * 2)}.tw\\:ltr\\:-translate-x-1\\/2:where(:dir(ltr),[dir=ltr],[dir=ltr] *){--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:right-2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:calc(calc(var(--spacing)) * 2)}.tw\\:rtl\\:flex:where(:dir(rtl),[dir=rtl],[dir=rtl] *){display:flex}.tw\\:rtl\\:-translate-x-px:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:translate-x-1\\/2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:translate-x-px:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:after\\:translate-x-1\\/2:where(:dir(rtl),[dir=rtl],[dir=rtl] *):after{content:var(--tw-content);--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-side=primary]) .tw\\:rtl\\:in-data-\\[side\\=primary\\]\\:cursor-e-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:e-resize}:where([data-side=secondary]) .tw\\:rtl\\:in-data-\\[side\\=secondary\\]\\:cursor-w-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:w-resize}.tw\\:rtl\\:aria-\\[orientation\\=horizontal\\]\\:after\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:data-\\[side\\=left\\]\\:translate-x-1:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-side=left]{--tw-translate-x:calc(calc(var(--spacing)) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:data-\\[side\\=right\\]\\:-translate-x-1:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-side=right]{--tw-translate-x:calc(calc(var(--spacing)) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:border-input:is(.dark *){border-color:var(--input)}.tw\\:dark\\:bg-destructive\\/20:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:bg-destructive\\/20:is(.dark *){background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:dark\\:bg-input\\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:bg-input\\/30:is(.dark *){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:dark\\:bg-transparent:is(.dark *){background-color:#0000}.tw\\:dark\\:text-amber-400:is(.dark *){color:var(--tw-color-amber-400)}.tw\\:dark\\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}.tw\\:dark\\:text-rose-400:is(.dark *){color:var(--tw-color-rose-400)}.tw\\:dark\\:text-sky-400:is(.dark *){color:var(--tw-color-sky-400)}.tw\\:dark\\:text-teal-400:is(.dark *){color:var(--tw-color-teal-400)}.tw\\:dark\\:after\\:mix-blend-lighten:is(.dark *):after{content:var(--tw-content);mix-blend-mode:lighten}@media (hover:hover){.tw\\:dark\\:hover\\:bg-blue-500:is(.dark *):hover{background-color:var(--tw-color-blue-500)}.tw\\:dark\\:hover\\:bg-destructive\\/30:is(.dark *):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-destructive\\/30:is(.dark *):hover{background-color:color-mix(in oklab, var(--destructive) 30%, transparent)}}.tw\\:dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.tw\\:dark\\:hover\\:bg-muted\\/50:is(.dark *):hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:hover\\:bg-muted\\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:dark\\:hover\\:text-foreground:is(.dark *):hover{color:var(--foreground)}}.tw\\:dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:disabled\\:bg-input\\/80:is(.dark *):disabled{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:disabled\\:bg-input\\/80:is(.dark *):disabled{background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:dark\\:disabled\\:bg-transparent:is(.dark *):disabled{background-color:#0000}:where([data-slot=tooltip-content]) .tw\\:dark\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/10:is(.dark *){background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){:where([data-slot=tooltip-content]) .tw\\:dark\\:in-data-\\[slot\\=tooltip-content\\]\\:bg-background\\/10:is(.dark *){background-color:color-mix(in oklab, var(--background) 10%, transparent)}}.tw\\:dark\\:has-disabled\\:bg-input\\/80:is(.dark *):has(:disabled){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:has-disabled\\:bg-input\\/80:is(.dark *):has(:disabled){background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:dark\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/40:is(.dark *):has([data-slot][aria-invalid=true]){--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/40:is(.dark *):has([data-slot][aria-invalid=true]){--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:aria-invalid\\:border-destructive\\/50:is(.dark *)[aria-invalid=true]{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:aria-invalid\\:border-destructive\\/50:is(.dark *)[aria-invalid=true]{border-color:color-mix(in oklab, var(--destructive) 50%, transparent)}}.tw\\:dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.tw\\:dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:data-open\\:animate-in:where([data-state=open]),.tw\\:data-open\\:animate-in:where([data-open]:not([data-open=false])){animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-open\\:bg-accent:where([data-state=open]),.tw\\:data-open\\:bg-accent:where([data-open]:not([data-open=false])){background-color:var(--accent)}.tw\\:data-open\\:text-accent-foreground:where([data-state=open]),.tw\\:data-open\\:text-accent-foreground:where([data-open]:not([data-open=false])){color:var(--accent-foreground)}.tw\\:data-open\\:fade-in-0:where([data-state=open]),.tw\\:data-open\\:fade-in-0:where([data-open]:not([data-open=false])){--tw-enter-opacity:0}.tw\\:data-open\\:zoom-in-95:where([data-state=open]),.tw\\:data-open\\:zoom-in-95:where([data-open]:not([data-open=false])){--tw-enter-scale:.95}@media (hover:hover){:is(.tw\\:data-open\\:hover\\:bg-sidebar-accent:where([data-state=open]),.tw\\:data-open\\:hover\\:bg-sidebar-accent:where([data-open]:not([data-open=false]))):hover{background-color:var(--sidebar-accent)}:is(.tw\\:data-open\\:hover\\:text-sidebar-accent-foreground:where([data-state=open]),.tw\\:data-open\\:hover\\:text-sidebar-accent-foreground:where([data-open]:not([data-open=false]))):hover{color:var(--sidebar-accent-foreground)}}.tw\\:data-closed\\:animate-out:where([data-state=closed]),.tw\\:data-closed\\:animate-out:where([data-closed]:not([data-closed=false])){animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.tw\\:data-closed\\:fade-out-0:where([data-state=closed]),.tw\\:data-closed\\:fade-out-0:where([data-closed]:not([data-closed=false])){--tw-exit-opacity:0}.tw\\:data-closed\\:zoom-out-95:where([data-state=closed]),.tw\\:data-closed\\:zoom-out-95:where([data-closed]:not([data-closed=false])){--tw-exit-scale:.95}.tw\\:data-checked\\:border-primary:where([data-state=checked]),.tw\\:data-checked\\:border-primary:where([data-checked]:not([data-checked=false])){border-color:var(--primary)}.tw\\:data-checked\\:bg-primary:where([data-state=checked]),.tw\\:data-checked\\:bg-primary:where([data-checked]:not([data-checked=false])){background-color:var(--primary)}.tw\\:data-checked\\:text-primary-foreground:where([data-state=checked]),.tw\\:data-checked\\:text-primary-foreground:where([data-checked]:not([data-checked=false])){color:var(--primary-foreground)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=checked]),.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-checked]:not([data-checked=false])),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=checked]),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:translate-x-\\[calc\\(100\\%-2px\\)\\]:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-checked]:not([data-checked=false])){--tw-translate-x:calc(100% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=checked]),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-checked]:not([data-checked=false])),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=checked]),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-checked\\:-translate-x-\\[calc\\(100\\%-2px\\)\\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-checked]:not([data-checked=false])){--tw-translate-x:calc(calc(100% - 2px) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:data-checked\\:bg-primary:is(.dark *):where([data-state=checked]),.tw\\:dark\\:data-checked\\:bg-primary:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--primary)}.tw\\:dark\\:data-checked\\:bg-primary-foreground:is(.dark *):where([data-state=checked]),.tw\\:dark\\:data-checked\\:bg-primary-foreground:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--primary-foreground)}.tw\\:data-unchecked\\:bg-input:where([data-state=unchecked]),.tw\\:data-unchecked\\:bg-input:where([data-unchecked]:not([data-unchecked=false])){background-color:var(--input)}.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=unchecked]),.tw\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=unchecked]),.tw\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:translate-x-0:is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-state=unchecked]),.tw\\:rtl\\:group-data-\\[size\\=default\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=default] *):where([data-unchecked]:not([data-unchecked=false])),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-state=unchecked]),.tw\\:rtl\\:group-data-\\[size\\=sm\\]\\/switch\\:data-unchecked\\:-translate-x-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.tw\\:group\\/switch)[data-size=sm] *):where([data-unchecked]:not([data-unchecked=false])){--tw-translate-x:calc(calc(var(--spacing)) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.tw\\:dark\\:data-unchecked\\:bg-foreground:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-foreground:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:var(--foreground)}.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-state=unchecked]),.tw\\:dark\\:data-unchecked\\:bg-input\\/80:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.tw\\:data-selected\\:bg-muted:where([data-selected=true]),.tw\\:data-selected\\:bg-muted\\/50:where([data-selected=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:bg-muted\\/50:where([data-selected=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.tw\\:data-selected\\:bg-primary:where([data-selected=true]){background-color:var(--primary)}.tw\\:data-selected\\:bg-transparent:where([data-selected=true]){background-color:#0000}.tw\\:data-selected\\:text-foreground:where([data-selected=true]){color:var(--foreground)}.tw\\:data-selected\\:text-inherit:where([data-selected=true]){color:inherit}.tw\\:data-selected\\:text-muted-foreground\\/50:where([data-selected=true]){color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:text-muted-foreground\\/50:where([data-selected=true]){color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.tw\\:data-selected\\:text-primary-foreground:where([data-selected=true]){color:var(--primary-foreground)}.tw\\:data-selected\\:ring-2:where([data-selected=true]){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:data-selected\\:ring-primary-foreground\\/70:where([data-selected=true]){--tw-ring-color:var(--primary-foreground)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:ring-primary-foreground\\/70:where([data-selected=true]){--tw-ring-color:color-mix(in oklab, var(--primary-foreground) 70%, transparent)}}.tw\\:data-selected\\:ring-ring\\/50:where([data-selected=true]){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.tw\\:data-selected\\:ring-ring\\/50:where([data-selected=true]){--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.tw\\:data-selected\\:ring-inset:where([data-selected=true]){--tw-ring-inset:inset}@media (forced-colors:active){.tw\\:forced-colors\\:data-selected\\:outline-2:where([data-selected=true]){outline-style:var(--tw-outline-style);outline-width:2px}.tw\\:forced-colors\\:data-selected\\:-outline-offset-2:where([data-selected=true]){outline-offset:calc(2px * -1)}.tw\\:forced-colors\\:data-selected\\:outline-\\[color\\:Highlight\\]:where([data-selected=true]){outline-color:highlight}}.tw\\:data-disabled\\:pointer-events-none:where([data-disabled=true]),.tw\\:data-disabled\\:pointer-events-none:where([data-disabled]:not([data-disabled=false])){pointer-events:none}.tw\\:data-disabled\\:cursor-not-allowed:where([data-disabled=true]),.tw\\:data-disabled\\:cursor-not-allowed:where([data-disabled]:not([data-disabled=false])){cursor:not-allowed}.tw\\:data-disabled\\:opacity-50:where([data-disabled=true]),.tw\\:data-disabled\\:opacity-50:where([data-disabled]:not([data-disabled=false])){opacity:.5}.tw\\:data-active\\:bg-background:where([data-state=active]),.tw\\:data-active\\:bg-background:where([data-active]:not([data-active=false])){background-color:var(--background)}.tw\\:data-active\\:bg-sidebar-accent:where([data-state=active]),.tw\\:data-active\\:bg-sidebar-accent:where([data-active]:not([data-active=false])){background-color:var(--sidebar-accent)}.tw\\:data-active\\:font-medium:where([data-state=active]),.tw\\:data-active\\:font-medium:where([data-active]:not([data-active=false])){--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}.tw\\:data-active\\:text-foreground:where([data-state=active]),.tw\\:data-active\\:text-foreground:where([data-active]:not([data-active=false])){color:var(--foreground)}.tw\\:data-active\\:text-sidebar-accent-foreground:where([data-state=active]),.tw\\:data-active\\:text-sidebar-accent-foreground:where([data-active]:not([data-active=false])){color:var(--sidebar-accent-foreground)}.tw\\:group-data-\\[variant\\=default\\]\\/tabs-list\\:data-active\\:shadow-sm:is(:where(.tw\\:group\\/tabs-list)[data-variant=default] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=default\\]\\/tabs-list\\:data-active\\:shadow-sm:is(:where(.tw\\:group\\/tabs-list)[data-variant=default] *):where([data-active]:not([data-active=false])){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:shadow-none:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:shadow-none:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:is(.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:after\\:opacity-100:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:after\\:opacity-100:is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false]))):after{content:var(--tw-content);opacity:1}.tw\\:dark\\:data-active\\:border-input:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:border-input:is(.dark *):where([data-active]:not([data-active=false])){border-color:var(--input)}.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:bg-input\\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.tw\\:dark\\:data-active\\:text-foreground:is(.dark *):where([data-state=active]),.tw\\:dark\\:data-active\\:text-foreground:is(.dark *):where([data-active]:not([data-active=false])){color:var(--foreground)}.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:border-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:border-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){border-color:#0000}.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-state=active]),.tw\\:dark\\:group-data-\\[variant\\=line\\]\\/tabs-list\\:data-active\\:bg-transparent:is(.dark *):is(:where(.tw\\:group\\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.tw\\:data-horizontal\\:mx-px:where([data-orientation=horizontal]){margin-inline:1px}.tw\\:data-horizontal\\:h-1:where([data-orientation=horizontal]){height:calc(calc(var(--spacing)) * 1)}.tw\\:data-horizontal\\:h-full:where([data-orientation=horizontal]){height:100%}.tw\\:data-horizontal\\:h-px:where([data-orientation=horizontal]){height:1px}.tw\\:data-horizontal\\:w-auto:where([data-orientation=horizontal]){width:auto}.tw\\:data-horizontal\\:w-full:where([data-orientation=horizontal]){width:100%}.tw\\:data-horizontal\\:flex-col:where([data-orientation=horizontal]){flex-direction:column}.tw\\:data-vertical\\:my-px:where([data-orientation=vertical]){margin-block:1px}.tw\\:data-vertical\\:h-auto:where([data-orientation=vertical]){height:auto}.tw\\:data-vertical\\:h-full:where([data-orientation=vertical]){height:100%}.tw\\:data-vertical\\:min-h-40:where([data-orientation=vertical]){min-height:calc(calc(var(--spacing)) * 40)}.tw\\:data-vertical\\:w-1:where([data-orientation=vertical]){width:calc(calc(var(--spacing)) * 1)}.tw\\:data-vertical\\:w-auto:where([data-orientation=vertical]){width:auto}.tw\\:data-vertical\\:w-full:where([data-orientation=vertical]){width:100%}.tw\\:data-vertical\\:w-px:where([data-orientation=vertical]){width:1px}.tw\\:data-vertical\\:flex-col:where([data-orientation=vertical]){flex-direction:column}.tw\\:data-vertical\\:items-stretch:where([data-orientation=vertical]){align-items:stretch}.tw\\:data-vertical\\:self-stretch:where([data-orientation=vertical]){align-self:stretch}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:mt-0 [data-lexical-editor=true]>blockquote{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:border-s-0 [data-lexical-editor=true]>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:ps-0 [data-lexical-editor=true]>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:font-normal [data-lexical-editor=true]>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:text-foreground [data-lexical-editor=true]>blockquote{color:var(--foreground)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\"true\\"\\]\\>blockquote\\]\\:not-italic [data-lexical-editor=true]>blockquote{font-style:normal}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:mt-0 [data-lexical-editor=\\"true\\"]>blockquote{margin-top:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:border-s-0 [data-lexical-editor=\\"true\\"]>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:ps-0 [data-lexical-editor=\\"true\\"]>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:font-normal [data-lexical-editor=\\"true\\"]>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:text-foreground [data-lexical-editor=\\"true\\"]>blockquote{color:var(--foreground)}.tw\\:\\[\\&_\\[data-lexical-editor\\=\\\\\\"true\\\\\\"\\]\\>blockquote\\]\\:not-italic [data-lexical-editor=\\"true\\"]>blockquote{font-style:normal}.tw\\:\\[\\&_a\\]\\:underline a{text-decoration-line:underline}.tw\\:\\[\\&_a\\]\\:underline-offset-3 a{text-underline-offset:3px}@media (hover:hover){.tw\\:\\[\\&_a\\]\\:hover\\:text-foreground a:hover{color:var(--foreground)}}.tw\\:\\[\\&_p\\]\\:my-0 p{margin-block:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&_p\\:not\\(\\:last-child\\)\\]\\:mb-4 p:not(:last-child){margin-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_s\\]\\:text-destructive s{color:var(--destructive)}.tw\\:\\[\\&_s\\]\\:line-through s{text-decoration-line:line-through}.tw\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.tw\\:\\[\\&_svg\\]\\:size-4 svg{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3\\.5 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&_svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&_tr\\]\\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.tw\\:\\[\\&_tr\\:last-child\\]\\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.tw\\:\\[\\&_u\\]\\:font-semibold u{--tw-font-weight:var(--tw-font-weight-semibold);font-weight:var(--tw-font-weight-semibold)}.tw\\:\\[\\&_u\\]\\:text-success-foreground u{color:var(--success-foreground)}.tw\\:\\[\\&_u\\]\\:no-underline u{text-decoration-line:none}.tw\\:\\[\\&\\:has\\(\\[role\\=checkbox\\]\\)\\]\\:pe-0:has([role=checkbox]){padding-inline-end:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\.border-b\\]\\:pb-2.border-b{padding-bottom:calc(calc(var(--spacing)) * 2)}.tw\\:\\[\\.border-b\\]\\:pb-4.border-b{padding-bottom:calc(calc(var(--spacing)) * 4)}.tw\\:group-data-\\[size\\=sm\\]\\/card\\:\\[\\.border-b\\]\\:pb-3:is(:where(.tw\\:group\\/card)[data-size=sm] *).border-b{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:\\[\\.border-t\\]\\:pt-2.border-t{padding-top:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:px-2 *)[cmdk-group-heading]{padding-inline:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:py-1\\.5 *)[cmdk-group-heading]{padding-block:calc(calc(var(--spacing)) * 1.5)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:text-xs *)[cmdk-group-heading]{font-size:var(--tw-text-xs);line-height:var(--tw-leading,var(--tw-text-xs--line-height))}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:font-medium *)[cmdk-group-heading]{--tw-font-weight:var(--tw-font-weight-medium);font-weight:var(--tw-font-weight-medium)}:is(.tw\\:\\*\\*\\:\\[\\[cmdk-group-heading\\]\\]\\:text-muted-foreground *)[cmdk-group-heading]{color:var(--muted-foreground)}:is(.tw\\:\\*\\:\\[a\\]\\:underline>*):is(a){text-decoration-line:underline}:is(.tw\\:\\*\\:\\[a\\]\\:underline-offset-3>*):is(a){text-underline-offset:3px}@media (hover:hover){.tw\\:\\[a\\]\\:hover\\:bg-destructive\\/20:is(a):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-destructive\\/20:is(a):hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.tw\\:\\[a\\]\\:hover\\:bg-muted:is(a):hover{background-color:var(--muted)}.tw\\:\\[a\\]\\:hover\\:bg-primary\\/80:is(a):hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-primary\\/80:is(a):hover{background-color:color-mix(in oklab, var(--primary) 80%, transparent)}}.tw\\:\\[a\\]\\:hover\\:bg-secondary\\/80:is(a):hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.tw\\:\\[a\\]\\:hover\\:bg-secondary\\/80:is(a):hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.tw\\:\\[a\\]\\:hover\\:text-muted-foreground:is(a):hover{color:var(--muted-foreground)}:is(.tw\\:\\*\\:\\[a\\]\\:hover\\:text-foreground>*):is(a):hover{color:var(--foreground)}}:is(.tw\\:\\*\\:\\[img\\]\\:row-span-2>*):is(img){grid-row:span 2/span 2}:is(.tw\\:\\*\\:\\[img\\]\\:translate-y-0\\.5>*):is(img){--tw-translate-y:calc(calc(var(--spacing)) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.tw\\:\\*\\:\\[img\\]\\:text-current>*):is(img){color:currentColor}:is(.tw\\:\\*\\:\\[img\\:first-child\\]\\:rounded-t-xl>*):is(img:first-child){border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}:is(.tw\\:\\*\\:\\[img\\:last-child\\]\\:rounded-b-xl>*):is(img:last-child){border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}:is(.tw\\:\\*\\:\\[img\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>*):is(img:not([class*=size-])){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:flex>*):is(span):last-child{display:flex}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:items-center>*):is(span):last-child{align-items:center}:is(.tw\\:\\*\\:\\[span\\]\\:last\\:gap-2>*):is(span):last-child{gap:calc(calc(var(--spacing)) * 2)}:is(.tw\\:\\*\\:\\[svg\\]\\:row-span-2>*):is(svg){grid-row:span 2/span 2}:is(.tw\\:\\*\\:\\[svg\\]\\:translate-y-0\\.5>*):is(svg){--tw-translate-y:calc(calc(var(--spacing)) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.tw\\:\\*\\:\\[svg\\]\\:text-current>*):is(svg){color:currentColor}:is(.tw\\:focus\\:\\*\\:\\[svg\\]\\:text-accent-foreground:focus>*):is(svg){color:var(--accent-foreground)}:is(.tw\\:data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:text-destructive[data-variant=destructive]>*):is(svg){color:var(--destructive)}:is(.tw\\:data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:text-destructive\\![data-variant=destructive]>*):is(svg){color:var(--destructive)!important}:is(.tw\\:data-selected\\:\\*\\:\\[svg\\]\\:text-foreground:where([data-selected=true])>*):is(svg){color:var(--foreground)}:is(.tw\\:\\*\\:\\[svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>*):is(svg:not([class*=size-])){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-s-none>:not(:first-child){border-start-start-radius:0;border-end-start-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-t-none>:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-s-0>:not(:first-child){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-t-0>:not(:first-child){border-top-style:var(--tw-border-style);border-top-width:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-e-none>:not(:last-child){border-start-end-radius:0;border-end-end-radius:0}.tw\\:\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-b-none>:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.tw\\:has-\\[select\\[aria-hidden\\=true\\]\\:last-child\\]\\:\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:last-of-type\\]\\:rounded-e-lg:has(:is(select[aria-hidden=true]:last-child))>[data-slot=select-trigger]:last-of-type{border-start-end-radius:var(--radius);border-end-end-radius:var(--radius)}.tw\\:\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:not\\(\\[class\\*\\=w-\\]\\)\\]\\:w-fit>[data-slot=select-trigger]:not([class*=w-]){width:fit-content}.tw\\:\\[\\&\\>\\[data-slot\\]\\:not\\(\\:has\\(\\~\\[data-slot\\]\\)\\)\\]\\:rounded-e-lg\\!>[data-slot]:not(:has(~[data-slot])){border-start-end-radius:var(--radius)!important;border-end-end-radius:var(--radius)!important}.tw\\:\\[\\&\\>\\[data-slot\\]\\:not\\(\\:has\\(\\~\\[data-slot\\]\\)\\)\\]\\:rounded-b-lg\\!>[data-slot]:not(:has(~[data-slot])){border-bottom-right-radius:var(--radius)!important;border-bottom-left-radius:var(--radius)!important}.tw\\:\\[\\&\\>a\\]\\:underline>a{text-decoration-line:underline}.tw\\:\\[\\&\\>a\\]\\:underline-offset-4>a{text-underline-offset:4px}.tw\\:\\[\\&\\>a\\:hover\\]\\:text-primary>a:hover{color:var(--primary)}.tw\\:\\[\\&\\>blockquote\\]\\:my-0>blockquote{margin-block:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:border-s-0>blockquote{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.tw\\:\\[\\&\\>blockquote\\]\\:p-0>blockquote{padding:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:ps-0>blockquote{padding-inline-start:calc(calc(var(--spacing)) * 0)}.tw\\:\\[\\&\\>blockquote\\]\\:font-normal>blockquote{--tw-font-weight:var(--tw-font-weight-normal);font-weight:var(--tw-font-weight-normal)}.tw\\:\\[\\&\\>blockquote\\]\\:text-foreground>blockquote{color:var(--foreground)}.tw\\:\\[\\&\\>blockquote\\]\\:not-italic>blockquote{font-style:normal}.tw\\:\\[\\&\\>input\\]\\:flex-1>input{flex:1}.tw\\:has-\\[\\>\\[data-align\\=block-end\\]\\]\\:\\[\\&\\>input\\]\\:pt-3:has(>[data-align=block-end])>input{padding-top:calc(calc(var(--spacing)) * 3)}.tw\\:has-\\[\\>\\[data-align\\=block-start\\]\\]\\:\\[\\&\\>input\\]\\:pb-3:has(>[data-align=block-start])>input{padding-bottom:calc(calc(var(--spacing)) * 3)}.tw\\:has-\\[\\>\\[data-align\\=inline-end\\]\\]\\:\\[\\&\\>input\\]\\:pe-1\\.5:has(>[data-align=inline-end])>input{padding-inline-end:calc(calc(var(--spacing)) * 1.5)}.tw\\:has-\\[\\>\\[data-align\\=inline-start\\]\\]\\:\\[\\&\\>input\\]\\:ps-1\\.5:has(>[data-align=inline-start])>input{padding-inline-start:calc(calc(var(--spacing)) * 1.5)}.tw\\:\\[\\&\\>kbd\\]\\:rounded-\\[calc\\(var\\(--radius\\)-5px\\)\\]>kbd{border-radius:calc(var(--radius) - 5px)}.tw\\:\\[\\&\\>li\\]\\:mt-2>li{margin-top:calc(calc(var(--spacing)) * 2)}.tw\\:\\[\\&\\>span\\:last-child\\]\\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tw\\:\\[\\&\\>svg\\]\\:pointer-events-none>svg{pointer-events:none}.tw\\:\\[\\&\\>svg\\]\\:hidden>svg{display:none}.tw\\:\\[\\&\\>svg\\]\\:size-3\\!>svg{width:calc(calc(var(--spacing)) * 3)!important;height:calc(calc(var(--spacing)) * 3)!important}.tw\\:\\[\\&\\>svg\\]\\:size-3\\.5>svg{width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&\\>svg\\]\\:size-4>svg{width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>svg\\]\\:shrink-0>svg{flex-shrink:0}.tw\\:\\[\\&\\>svg\\]\\:text-sidebar-accent-foreground>svg{color:var(--sidebar-accent-foreground)}.tw\\:group-has-data-\\[size\\=lg\\]\\/avatar-group\\:\\[\\&\\>svg\\]\\:size-5:is(:where(.tw\\:group\\/avatar-group):has([data-size=lg]) *)>svg{width:calc(calc(var(--spacing)) * 5);height:calc(calc(var(--spacing)) * 5)}.tw\\:group-has-data-\\[size\\=sm\\]\\/avatar-group\\:\\[\\&\\>svg\\]\\:size-3:is(:where(.tw\\:group\\/avatar-group):has([data-size=sm]) *)>svg{width:calc(calc(var(--spacing)) * 3);height:calc(calc(var(--spacing)) * 3)}.tw\\:group-data-\\[size\\=default\\]\\/avatar\\:\\[\\&\\>svg\\]\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=default] *)>svg,.tw\\:group-data-\\[size\\=lg\\]\\/avatar\\:\\[\\&\\>svg\\]\\:size-2:is(:where(.tw\\:group\\/avatar)[data-size=lg] *)>svg{width:calc(calc(var(--spacing)) * 2);height:calc(calc(var(--spacing)) * 2)}.tw\\:group-data-\\[size\\=sm\\]\\/avatar\\:\\[\\&\\>svg\\]\\:hidden:is(:where(.tw\\:group\\/avatar)[data-size=sm] *)>svg,.tw\\:\\[\\&\\>svg\\:last-child\\]\\:hidden>svg:last-child{display:none}.tw\\:\\[\\&\\>svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-3\\.5>svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 3.5);height:calc(calc(var(--spacing)) * 3.5)}.tw\\:\\[\\&\\>svg\\:not\\(\\[class\\*\\=size-\\]\\)\\]\\:size-4>svg:not([class*=size-]){width:calc(calc(var(--spacing)) * 4);height:calc(calc(var(--spacing)) * 4)}.tw\\:\\[\\&\\>tr\\]\\:last\\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.tw\\:\\[\\&\\[align\\=center\\]\\]\\:text-center[align=center]{text-align:center}.tw\\:\\[\\&\\[align\\=right\\]\\]\\:text-right[align=right]{text-align:right}.tw\\:\\[\\&\\[aria-orientation\\=horizontal\\]\\>div\\]\\:rotate-90[aria-orientation=horizontal]>div{rotate:90deg}[data-side=primary][data-collapsible=offcanvas] .tw\\:\\[\\[data-side\\=primary\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-end-2{inset-inline-end:calc(calc(var(--spacing)) * -2)}[data-side=primary][data-state=collapsed] .tw\\:\\[\\[data-side\\=primary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-e-resize{cursor:e-resize}[data-side=primary][data-state=collapsed] .tw\\:rtl\\:\\[\\[data-side\\=primary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-w-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:w-resize}[data-side=secondary][data-collapsible=offcanvas] .tw\\:\\[\\[data-side\\=secondary\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-start-2{inset-inline-start:calc(calc(var(--spacing)) * -2)}[data-side=secondary][data-state=collapsed] .tw\\:\\[\\[data-side\\=secondary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-w-resize{cursor:w-resize}[data-side=secondary][data-state=collapsed] .tw\\:rtl\\:\\[\\[data-side\\=secondary\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-e-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *){cursor:e-resize}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-cyrillic-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-cyrillic-wght-normal.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-greek-wght-normal.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-vietnamese-wght-normal.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-latin-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./files/ibm-plex-sans-latin-wght-normal.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}.light,:root{--radius:.625rem;--spacing:.25rem;--background:oklch(100% 0 0);--foreground:oklch(13.71% .036 258.53);--card:oklch(100% 0 0);--card-foreground:oklch(13.71% .036 258.53);--popover:oklch(98.43% .0018 248.56);--popover-foreground:oklch(13.71% .036 258.53);--primary:oklch(20.79% .0399 265.73);--primary-foreground:oklch(98.38% .0036 248.23);--secondary:oklch(95.89% .011 248.06);--secondary-foreground:oklch(20.79% .0399 265.73);--muted:oklch(95.89% .011 248.06);--muted-foreground:oklch(55.47% .0408 257.45);--accent:oklch(95.89% .011 248.06);--accent-foreground:oklch(20.79% .0399 265.73);--destructive:oklch(63.69% .2077 25.32);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(62.7% .194 149.214);--diff-deleted:oklch(57.7% .245 27.325);--warning:oklch(84% .16 84);--warning-foreground:oklch(28% .07 46);--border:oklch(92.9% .0127 255.58);--input:oklch(92.9% .0127 255.58);--ring:oklch(13.71% .036 258.53);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.43% .0018 248.56);--sidebar-foreground:oklch(13.71% .036 258.53);--sidebar-primary:oklch(20.79% .0399 265.73);--sidebar-primary-foreground:oklch(98.38% .0036 248.23);--sidebar-accent:oklch(95.89% .011 248.06);--sidebar-accent-foreground:oklch(20.79% .0399 265.73);--sidebar-border:oklch(92.9% .0127 255.58);--sidebar-ring:oklch(13.71% .036 258.53)}.dark{--background:oklch(13.71% .036 258.53);--foreground:oklch(98.38% .0036 248.23);--card:oklch(13.71% .036 258.53);--card-foreground:oklch(98.38% .0036 248.23);--popover:oklch(13.71% .036 258.53);--popover-foreground:oklch(98.38% .0036 248.23);--primary:oklch(98.38% .0036 248.23);--primary-foreground:oklch(20.79% .0399 265.73);--secondary:oklch(28% .037 259.98);--secondary-foreground:oklch(98.38% .0036 248.23);--muted:oklch(28% .037 259.98);--muted-foreground:oklch(71.07% .0351 256.8);--accent:oklch(28% .037 259.98);--accent-foreground:oklch(98.38% .0036 248.23);--destructive:oklch(39.6% .1331 25.71);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(79.2% .209 151.711);--diff-deleted:oklch(70.4% .191 22.216);--warning:oklch(41% .11 46);--warning-foreground:oklch(99% .02 95);--border:oklch(44.54% .0374 257.3);--input:oklch(44.54% .0374 257.3);--ring:oklch(86.88% .0199 252.89);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(13.71% .036 258.53);--sidebar-foreground:oklch(71.07% .0351 256.8);--sidebar-primary:oklch(98.38% .0036 248.23);--sidebar-primary-foreground:oklch(20.79% .0399 265.73);--sidebar-accent:oklch(28% .037 259.98);--sidebar-accent-foreground:oklch(71.07% .0351 256.8);--sidebar-border:oklch(28% .037 259.98);--sidebar-ring:oklch(86.88% .0199 252.89)}.paratext-light{--background:oklch(100% 0 0);--foreground:oklch(15.3% .006 107.1);--card:oklch(100% 0 0);--card-foreground:oklch(15.3% .006 107.1);--popover:oklch(100% 0 0);--popover-foreground:oklch(15.3% .006 107.1);--primary:oklch(55.5% .163 48.998);--primary-foreground:oklch(98.7% .022 95.277);--secondary:oklch(96.7% .001 286.375);--secondary-foreground:oklch(21% .006 285.885);--muted:oklch(96.6% .005 106.5);--muted-foreground:oklch(58% .031 107.3);--accent:oklch(96.6% .005 106.5);--accent-foreground:oklch(22.8% .013 107.4);--destructive:oklch(57.7% .245 27.325);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(62.7% .194 149.214);--diff-deleted:oklch(57.7% .245 27.325);--warning:oklch(84% .16 84);--warning-foreground:oklch(28% .07 46);--border:oklch(93% .007 106.5);--input:oklch(93% .007 106.5);--ring:oklch(73.7% .021 106.9);--chart-1:oklch(88% .011 106.6);--chart-2:oklch(58% .031 107.3);--chart-3:oklch(46.6% .025 107.3);--chart-4:oklch(39.4% .023 107.4);--chart-5:oklch(28.6% .016 107.4);--sidebar:oklch(98.8% .003 106.5);--sidebar-foreground:oklch(15.3% .006 107.1);--sidebar-primary:oklch(66.6% .179 58.318);--sidebar-primary-foreground:oklch(98.7% .022 95.277);--sidebar-accent:oklch(96.6% .005 106.5);--sidebar-accent-foreground:oklch(22.8% .013 107.4);--sidebar-border:oklch(93% .007 106.5);--sidebar-ring:oklch(73.7% .021 106.9)}.paratext-dark{--background:oklch(15.3% .006 107.1);--foreground:oklch(98.8% .003 106.5);--card:oklch(22.8% .013 107.4);--card-foreground:oklch(98.8% .003 106.5);--popover:oklch(22.8% .013 107.4);--popover-foreground:oklch(98.8% .003 106.5);--primary:oklch(47.3% .137 46.201);--primary-foreground:oklch(98.7% .022 95.277);--secondary:oklch(27.4% .006 286.033);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(28.6% .016 107.4);--muted-foreground:oklch(73.7% .021 106.9);--accent:oklch(28.6% .016 107.4);--accent-foreground:oklch(98.8% .003 106.5);--destructive:oklch(70.4% .191 22.216);--destructive-foreground:oklch(98.38% .0036 248.23);--success-foreground:oklch(79.2% .209 151.711);--diff-deleted:oklch(70.4% .191 22.216);--warning:oklch(41% .11 46);--warning-foreground:oklch(99% .02 95);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(58% .031 107.3);--chart-1:oklch(88% .011 106.6);--chart-2:oklch(58% .031 107.3);--chart-3:oklch(46.6% .025 107.3);--chart-4:oklch(39.4% .023 107.4);--chart-5:oklch(28.6% .016 107.4);--sidebar:oklch(22.8% .013 107.4);--sidebar-foreground:oklch(98.8% .003 106.5);--sidebar-primary:oklch(76.9% .188 70.08);--sidebar-primary-foreground:oklch(27.9% .077 45.635);--sidebar-accent:oklch(28.6% .016 107.4);--sidebar-accent-foreground:oklch(98.8% .003 106.5);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(58% .031 107.3)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}} `,"after-all"); //# sourceMappingURL=index.cjs.map diff --git a/lib/platform-bible-react/dist/index.cjs.map b/lib/platform-bible-react/dist/index.cjs.map index 499f93fac5e..6a4b013986c 100644 --- a/lib/platform-bible-react/dist/index.cjs.map +++ b/lib/platform-bible-react/dist/index.cjs.map @@ -1 +1 @@ -{"version":3,"file":"index.cjs","sources":["../src/components/shadcn-ui/textarea.tsx","../src/components/shared/book-item.component.tsx","../src/utils/keyboard.util.ts","../src/context/shrink-step.context.ts","../src/hooks/use-interaction-modality.hook.ts","../src/components/advanced/toolbar-compound-label/toolbar-compound-label.component.tsx","../src/components/shared/book-item.utils.ts","../src/components/advanced/recent-searches.component.tsx","../src/components/advanced/book-chapter-control/book-chapter-control.navigation.ts","../src/components/advanced/book-chapter-control/book-chapter-control.utils.ts","../src/components/advanced/book-chapter-control/numbered-item-grid.component.tsx","../src/components/advanced/book-chapter-control/chapter-grid.component.tsx","../src/components/advanced/book-chapter-control/verse-grid.component.tsx","../src/components/advanced/book-chapter-control/book-chapter-control.component.tsx","../src/components/advanced/book-chapter-control/book-chapter-control.types.ts","../src/components/basics/combo-box.component.tsx","../src/components/basics/chapter-range-selector.component.tsx","../src/components/advanced/book-selector.component.tsx","../../../node_modules/@lexical/react/LexicalComposerContext.prod.mjs","../../../node_modules/@lexical/react/LexicalComposer.prod.mjs","../../../node_modules/@lexical/react/LexicalOnChangePlugin.prod.mjs","../src/components/advanced/editor/themes/editor-theme.ts","../src/components/advanced/editor/nodes.ts","../../../node_modules/react-error-boundary/dist/react-error-boundary.js","../../../node_modules/@lexical/react/LexicalErrorBoundary.prod.mjs","../../../node_modules/@lexical/react/useLexicalEditable.prod.mjs","../../../node_modules/@lexical/selection/LexicalSelection.prod.mjs","../../../node_modules/@lexical/utils/LexicalUtils.prod.mjs","../../../node_modules/@lexical/extension/LexicalExtension.prod.mjs","../../../node_modules/@lexical/react/LexicalReactProviderExtension.prod.mjs","../../../node_modules/@lexical/text/LexicalText.prod.mjs","../../../node_modules/@lexical/dragon/LexicalDragon.prod.mjs","../../../node_modules/@lexical/react/LexicalRichTextPlugin.prod.mjs","../../../node_modules/@lexical/react/LexicalAutoFocusPlugin.prod.mjs","../../../node_modules/@lexical/react/LexicalClearEditorPlugin.prod.mjs","../../../node_modules/@lexical/react/LexicalContentEditable.prod.mjs","../src/components/advanced/editor/editor-ui/content-editable.tsx","../src/components/advanced/editor/context/toolbar-context.tsx","../src/components/advanced/editor/editor-hooks/use-modal.tsx","../src/components/advanced/editor/plugins/toolbar/toolbar-plugin.tsx","../src/components/advanced/editor/editor-hooks/use-update-toolbar.ts","../src/components/advanced/editor/plugins/toolbar/font-format-toolbar-plugin.tsx","../src/components/advanced/editor/plugins.tsx","../src/components/advanced/editor/editor.tsx","../src/components/advanced/editor/editor-utils.ts","../src/components/basics/cancel-accept-buttons.component.tsx","../src/components/advanced/comment-list/conflict-note-card.types.ts","../src/components/advanced/comment-list/comment-list.utils.ts","../src/components/advanced/comment-editor/comment-editor.component.tsx","../src/components/advanced/comment-editor/comment-editor.types.ts","../src/components/advanced/comment-list/comment-list.types.ts","../src/components/shadcn-ui/card.tsx","../src/components/basics/disabled-tooltip-wrapper.component.tsx","../src/components/shadcn-ui/avatar.tsx","../src/components/advanced/comment-list/comment-item.component.tsx","../src/components/advanced/comment-list/resolve-check-button.component.tsx","../src/components/advanced/comment-list/comment-thread.component.tsx","../src/components/advanced/comment-list/conflict-diff.tsx","../src/components/advanced/comment-list/conflict-note-card.component.tsx","../src/components/advanced/comment-list/conflict-thread-summary.component.tsx","../src/components/advanced/comment-list/use-conflict-resolution.hook.ts","../src/components/advanced/comment-list/conflict-thread.component.tsx","../src/components/advanced/comment-list/comment-list.component.tsx","../src/components/advanced/content-zoom-root.component.tsx","../src/components/advanced/data-table/data-table-column-toggle.component.tsx","../src/components/shadcn-ui/select.tsx","../src/components/advanced/data-table/data-table-pagination.component.tsx","../src/components/advanced/data-table/data-table.component.tsx","../src/components/advanced/extension-marketplace/markdown-renderer.component.tsx","../src/components/basics/error-dump.component.tsx","../src/components/advanced/error-popover.component.tsx","../src/components/advanced/extension-marketplace/filter-dropdown.component.tsx","../src/components/advanced/extension-marketplace/more-info.component.tsx","../src/components/advanced/extension-marketplace/version-history.component.tsx","../src/components/advanced/extension-marketplace/footer.component.tsx","../src/components/advanced/filter.component.tsx","../src/components/basics/undo-redo-buttons.component.tsx","../src/components/basics/editor-keyboard-shortcuts.component.tsx","../src/components/advanced/footnote-editor/footnote-caller-dropdown.component.tsx","../src/components/advanced/footnote-editor/footnote-type-dropdown.component.tsx","../src/components/advanced/marker-menu.component.tsx","../src/components/advanced/footnote-editor/footnote-editor.utils.ts","../src/components/advanced/footnote-editor/footnote-editor.component.tsx","../src/components/advanced/footnote-editor/footnote-editor.types.ts","../src/components/advanced/footnotes/footnote-item.component.tsx","../src/components/advanced/footnotes/footnote-list.component.tsx","../src/components/advanced/inventory/occurrences-table.component.tsx","../src/components/shadcn-ui/checkbox.tsx","../src/components/advanced/inventory/inventory-columns.tsx","../src/components/advanced/inventory/inventory-utils.ts","../src/components/advanced/inventory/inventory.component.tsx","../src/components/shadcn-ui/sidebar.tsx","../src/components/advanced/settings-components/settings-sidebar.component.tsx","../src/components/advanced/settings-components/settings-sidebar-content-search.component.tsx","../src/components/advanced/scripture-results-viewer/scripture-results-viewer.component.tsx","../src/components/advanced/scope-selector/select-books-picker.component.tsx","../src/components/basics/disabled-action-tooltip.component.tsx","../src/components/advanced/scope-selector/section-button.component.tsx","../src/components/advanced/scope-selector/select-books.component.tsx","../src/components/advanced/scope-selector/select-books.types.ts","../src/components/advanced/scope-selector/scope-selector.component.tsx","../src/components/advanced/scroll-group-selector.component.tsx","../src/components/advanced/settings-components/settings-list.component.tsx","../src/components/advanced/menus/menu.util.ts","../src/components/advanced/menus/menu-icon.component.tsx","../src/components/advanced/menus/tab-dropdown-menu.component.tsx","../src/hooks/use-shrink-step.hook.ts","../src/components/advanced/tab-toolbar/tab-toolbar-container.component.tsx","../src/components/advanced/tab-toolbar/tab-toolbar.component.tsx","../src/components/advanced/tab-toolbar/tab-floating-menu.component.tsx","../src/components/basics/tabs-vertical.tsx","../src/components/advanced/tab-navigation-content-search.component.tsx","../src/components/shadcn-ui/menubar.tsx","../src/components/advanced/menus/platform-menubar.component.tsx","../src/components/advanced/toolbar.component.tsx","../src/components/advanced/ui-language-selector.component.tsx","../src/components/advanced/interface-language-picker/interface-language-picker.component.tsx","../src/components/basics/smart-label.component.tsx","../src/components/basics/checkbox-group.component.tsx","../src/components/basics/destructive-key-confirmation.component.tsx","../src/components/basics/results-card.component.tsx","../src/components/basics/text-field.component.tsx","../src/components/basics/wizard-stepper/wizard-stepper.component.tsx","../src/components/shadcn-ui/context-menu.tsx","../src/components/shadcn-ui/drawer.tsx","../src/components/shadcn-ui/progress.tsx","../src/components/shadcn-ui/sonner.tsx","../src/components/shadcn-ui/slider.tsx","../src/components/shadcn-ui/switch.tsx","../src/components/shadcn-ui/tabs.tsx","../src/hooks/use-event.hook.ts","../src/hooks/use-event-async.hook.ts","../src/hooks/use-promise.hook.ts","../src/hooks/use-retryable-promise.hook.ts","../src/hooks/use-stylesheet.hook.ts","../src/hooks/use-extra-valid-markers.hook.ts","../src/hooks/use-view-visibility.hook.ts","../src/hooks/use-run-when-visible.hook.ts","../src/hooks/use-tab-icon-selection.hook.ts","../src/context/shrink-step-override.component.tsx","../src/components/tooltip-delay.ts"],"sourcesContent":["import React from 'react';\n\nimport { cn } from '@/utils/shadcn-ui/utils';\n\n// CUSTOM: Added TSDoc with link to shadcn/ui documentation for this component\n/**\n * Displays a form textarea or a component that looks like a textarea. This component is from Shadcn\n * UI.\n *\n * @see Shadcn UI Documentation: {@link https://ui.shadcn.com/docs/components/textarea}\n */\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n return (\n \n );\n}\n\nexport { Textarea };\n","import { CommandItem } from '@/components/shadcn-ui/command';\nimport { getLocalizedBookId, getLocalizedBookName } from '@/components/shared/book.utils';\nimport { LIST_ITEM_KEYBOARD_FOCUS_RING } from '@/utils/focus.util';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { Canon } from '@sillsdev/scripture';\nimport { Check } from 'lucide-react';\nimport { Section } from 'platform-bible-utils';\nimport { MouseEvent, Ref, useMemo, useRef } from 'react';\n\ntype BookItemProps = {\n /** Forwarded to the underlying CommandItem (a `
` rendered by cmdk). */\n ref?: Ref;\n /** The book ID (e.g., 'GEN', 'EXO') */\n bookId: string;\n /** Whether this book is currently selected */\n isSelected?: boolean;\n /** Callback function to handle book selection/deselection */\n onSelect?: (bookId: string) => void;\n /** Optional custom mouse down handler */\n onMouseDown?: (e: MouseEvent) => void;\n /** The section this book belongs to */\n section: Section;\n /** Additional CSS classes for the wrapper CommandItem */\n className?: string;\n /** Whether to show the check icon (for multiselect mode) */\n showCheck?: boolean;\n /**\n * Optional map of localized book IDs/short names and full names. Key is the (English) book ID,\n * value contains localized versions of the ID and full book name\n */\n localizedBookNames?: Map;\n /** Value to use for Command component matching */\n commandValue?: string;\n /**\n * When true, the item paints no keyboard focus ring even while cmdk still marks it\n * `data-selected`. Set it while a control outside the list holds focus, so the list and that\n * control never show a focus indicator at the same time — two at once leave the user no way to\n * tell which surface the next keystroke reaches.\n *\n * Suppresses the paint, not the state: cmdk keeps its highlighted item, so the ring returns to\n * exactly where the user left it. Clearing the highlight instead would hand it to cmdk's\n * select-first-item fallback, which moves it rather than removing it.\n */\n suppressKeyboardHighlight?: boolean;\n /** When true, renders the item as disabled: suppresses onSelect and dims the visuals. */\n disabled?: boolean;\n /**\n * Short localized label naming why this item is greyed (e.g. \"Not in project\"). Passing a value\n * renders the item greyed but fully selectable — the state for an item that is reachable yet\n * outside the current context, such as a book present in an open resource but not in the active\n * project.\n *\n * Distinct from `disabled`, which also suppresses selection; `disabled` takes precedence and a\n * disabled item is never additionally dimmed. The label renders as visible text beside the book\n * id, so the greying is never a colour-only signal and stays readable while the row is\n * highlighted — the state and its explanation are one prop precisely so they cannot drift apart.\n *\n * An empty string counts as no reason, so the item renders undimmed. Callers resolving this from\n * a localized string should fall back with `||` rather than `??`, since `??` passes an empty\n * translation through and would silently drop the dimming.\n */\n dimmedReason?: string;\n /**\n * Complete localized sentence describing why this item is greyed, e.g. \"Hebrews is not in this\n * project\" — used as the item's accessible name so a screen reader hears a full sentence rather\n * than the bare `dimmedReason` label. Resolve it from a localized template that places the book\n * name itself (`formatReplacementString`) rather than concatenating around a fragment, so\n * translations control word order and punctuation.\n *\n * Ignored unless `dimmedReason` is also set. Falls back to `dimmedReason` when absent.\n */\n dimmedDescription?: string;\n};\n\n/**\n * A reusable component that represents a single book item in book selectors. The component shows\n * the book's localized name, its ID, and visually indicates its testament (OT/NT/DC/Extra) through\n * color coding.\n *\n * For simple selection, use the `onSelect` prop. For complex interactions (like shift-click range\n * selection), implement custom `onSelect` and `onMouseDown` handlers that manage the logic\n * externally.\n */\nexport function BookItem({\n ref,\n bookId,\n isSelected,\n onSelect,\n onMouseDown,\n section,\n className,\n showCheck = false,\n localizedBookNames,\n commandValue,\n suppressKeyboardHighlight = false,\n disabled = false,\n dimmedReason,\n dimmedDescription,\n}: BookItemProps) {\n const isMouseClick = useRef(false);\n\n const handleSelect = () => {\n if (disabled) return;\n if (!isMouseClick.current) {\n onSelect?.(bookId);\n }\n // Reset the mouse flag after a short delay\n setTimeout(() => {\n isMouseClick.current = false;\n }, 100);\n };\n\n const handleMouseDown = (e: MouseEvent) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n isMouseClick.current = true;\n\n if (onMouseDown) {\n onMouseDown(e);\n } else {\n // If no custom mouse handler, fall back to calling onSelect\n onSelect?.(bookId);\n }\n };\n\n const bookDisplayName = useMemo(\n () => getLocalizedBookName(bookId, localizedBookNames),\n [bookId, localizedBookNames],\n );\n\n const bookDisplayId = useMemo(\n () => getLocalizedBookId(bookId, localizedBookNames),\n [bookId, localizedBookNames],\n );\n\n const isDimmed = !!dimmedReason && !disabled;\n // Built from the same localized values the row renders, not from the English canon name, so a\n // localized name is never announced next to an English one. Both fall back to English when the\n // caller passes no localized names, so the undimmed case is unchanged.\n const baseAriaLabel = `${bookDisplayName} (${bookDisplayId})`;\n // A dimmed row announces the caller's whole localized sentence instead of this name plus an\n // appended fragment: the qualifier's position, punctuation, and any inflection of the book name\n // belong to the translation, not to string concatenation here.\n const ariaLabel = isDimmed\n ? dimmedDescription || `${baseAriaLabel}, ${dimmedReason}`\n : baseAriaLabel;\n\n const commandItem = (\n svg:last-child]:hidden',\n className,\n disabled && 'tw:cursor-not-allowed tw:opacity-50',\n // Mirrors NumberedItemGrid's dimmed-vs-disabled split — same tokens, so chapter/verse cells\n // and book rows grey identically inside one popover: dimmed is presentation only, so it\n // never sets aria-disabled or blocks onSelect, and it yields to disabled. Restated under\n // data-selected so a dimmed row keeps its dimming while the keyboard highlight is on it,\n // rather than losing it to the suppression rule above.\n isDimmed &&\n 'tw:bg-muted/50 tw:text-muted-foreground/50 tw:data-selected:bg-muted/50 tw:data-selected:text-muted-foreground/50',\n )}\n >\n {showCheck && (\n \n )}\n {bookDisplayName}\n {isDimmed && (\n // Visible rather than hover-only: cmdk never moves DOM focus onto an item (the input keeps\n // it and highlights via data-selected), so a tooltip would never open for a keyboard user.\n // Rendered text also survives the highlight, which recolours the row.\n {dimmedReason}\n )}\n \n {bookDisplayId}\n \n \n );\n\n return (\n \n {commandItem}\n
\n );\n}\n","/**\n * Shared keyboard primitives for components that implement their own keyboard navigation. Generic,\n * reusable key helpers belong here — arrow-key constants and guards, character classification — so\n * components don't each re-declare inline `'ArrowUp'` string literals and ad-hoc regexes.\n * Component-specific navigation math (2D grid arithmetic, for instance) belongs with that\n * component; the building blocks below are deliberately domain-agnostic.\n */\n\n/** The four keyboard arrow keys, matching `KeyboardEvent.key` values. */\nexport const ARROW_KEYS = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'] as const;\n\n/** A keyboard `event.key` value for one of the four arrow keys. */\nexport type ArrowKey = (typeof ARROW_KEYS)[number];\n\n/**\n * Type guard narrowing an arbitrary keyboard `event.key` string to an {@link ArrowKey}, so callers\n * can hand `event.key` to arrow-key-typed helpers without a type assertion.\n */\nexport function isArrowKey(key: string): key is ArrowKey {\n return ARROW_KEYS.some((arrowKey) => arrowKey === key);\n}\n\n/**\n * Classifies a keyboard `event.key` as a single letter and/or digit. Used by components that route\n * typed characters into a search input while focus is elsewhere.\n *\n * Letters are matched script-agnostically (`\\p{L}`), so a translator typing Cyrillic, Greek,\n * Hebrew, or Devanagari reaches the search box the same way a Latin-script user does. Digits stay\n * ASCII on purpose: the Scripture reference parser only understands ASCII digits, so classifying\n * e.g. Arabic-Indic numerals as digits would route keystrokes into a query that cannot be parsed.\n *\n * @param key The keyboard `event.key` value.\n * @returns `isLetter` and `isDigit`, both false for named keys like `'Enter'` or `'ArrowUp'`.\n */\nexport function getKeyCharacterType(key: string) {\n const isLetter = /^\\p{L}$/u.test(key);\n const isDigit = /^[0-9]$/.test(key);\n return { isLetter, isDigit };\n}\n","import { createContext, useContext } from 'react';\n\n/**\n * Named shrink steps, ordered widest to narrowest. Consumers compare against these (`step >=\n * SHRINK_STEP.MINIMUM`), so the ascending order is part of the contract.\n *\n * Not every surface uses all four. `BookChapterControl` walks the whole ladder, while a control\n * with only one shorter form — the project selector, the paragraph style label — reads a single\n * boundary (`step >= SHRINK_STEP.MINIMUM`) and ignores the rest.\n */\nexport const SHRINK_STEP = Object.freeze({\n /** Full labels. */\n WIDE: 0,\n /** Abbreviated primary label form. */\n TIGHT: 1,\n /** Secondary field clipped with an ellipsis — CSS does this on its own. */\n TIGHTER: 2,\n /** Secondary field dropped entirely; primary field alone. */\n MINIMUM: 3,\n});\n\n/**\n * The shrink step published by the nearest toolbar root.\n *\n * Deliberately defaults to `SHRINK_STEP.WIDE` rather than throwing the way `useMenuContext` does:\n * every component that reads this is also usable standalone (a `BookChapterControl` in a dialog, a\n * story, a test), and those must keep rendering their full-width form when no toolbar is above\n * them.\n */\nexport const ShrinkStepContext = createContext(SHRINK_STEP.WIDE);\n\n/**\n * Reads the shrink step published by the nearest toolbar root.\n *\n * The value is resolved at the position of the component that calls this. A component that\n * _renders_ the provider sits above it and will always read the default — so anything that needs\n * the real step must be a child of the toolbar, not the thing that builds it.\n *\n * @returns The current step, or `SHRINK_STEP.WIDE` when there is no provider.\n */\nexport function useShrinkStepValue(): number {\n return useContext(ShrinkStepContext);\n}\n\n/**\n * A shrink step forced from outside, overriding what a toolbar would measure from its own width.\n *\n * Separate from {@link ShrinkStepContext} because the two answer different questions. A toolbar\n * _publishes_ to `ShrinkStepContext` and cannot read its own value back, and that context defaults\n * to `SHRINK_STEP.WIDE` rather than being unset — so a publisher reading it could never tell \"no\n * one is overriding me\" from \"someone is overriding me with the widest step\". This context is\n * `undefined` until something sets it, which is the distinction a publisher needs.\n *\n * Set it with {@link ShrinkStepOverride} rather than reaching for the provider directly.\n */\nexport const ShrinkStepOverrideContext = createContext(undefined);\n\n/**\n * Reads a shrink step forced from outside, if any.\n *\n * Toolbars that measure their own width call this and prefer its value over their measurement, so\n * stories and tests can pin a step in an environment with no layout engine. Components that only\n * _read_ a step have no use for this — they call {@link useShrinkStepValue} instead.\n *\n * @returns The overriding step, or `undefined` when nothing is overriding.\n */\nexport function useShrinkStepOverride(): number | undefined {\n return useContext(ShrinkStepOverrideContext);\n}\n","import { useEffect } from 'react';\nimport { trackInteractionModality } from '@/utils/focus.util';\n\n/**\n * Starts the document-wide tracking that `getLastInteractionModality` reads, for a component whose\n * behavior depends on whether the user last used the pointer or the keyboard.\n *\n * The underlying registration is idempotent, so calling this from several components costs one pair\n * of document listeners in total. It exists so that no consumer has to decide where to put the\n * call: registering from an effect keeps render pure, and the listeners are in place long before\n * any interaction can reach the component that mounted them.\n */\nexport function useInteractionModality() {\n useEffect(() => {\n trackInteractionModality();\n }, []);\n}\n","import { ReactNode, useCallback, useEffect, useRef, useState } from 'react';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/shadcn-ui/tooltip';\nimport { useTruncationTooltip } from '@/hooks/use-truncation-tooltip.hook';\nimport { getLastInteractionModality } from '@/utils/focus.util';\nimport { useInteractionModality } from '@/hooks/use-interaction-modality.hook';\n\nexport type ToolbarCompoundLabelProps = {\n /** The field that identifies the item — a book abbreviation, project short name, marker code. */\n primary: ReactNode;\n /** The field that gives way first: clipped with an ellipsis, then dropped entirely. */\n secondary?: ReactNode;\n /**\n * Text placed between the two fields. Rendered as a real text node, so it survives into\n * `textContent` where a CSS `gap` would not — assertions and screen readers both read it.\n */\n separator?: string;\n /**\n * Render `secondary` before `primary`, for labels that read that way round — a project selector\n * shows `Translation Project 1 (TP1)`, full name first, short name last.\n */\n secondaryFirst?: boolean;\n /** Whether the secondary field is rendered at all. Defaults to `true`. */\n showSecondary?: boolean;\n /**\n * Whether what is rendered is only part of {@link ToolbarCompoundLabelProps.fullText}, so the\n * tooltip should open on hover even though nothing is visibly clipped. Set this when the primary\n * field is an abbreviation — `GEN` for `Genesis` — which CSS cannot detect.\n *\n * Defaults to true whenever the secondary field has been dropped.\n */\n isPartial?: boolean;\n /** The complete label. Shown in the tooltip whenever the rendered form is not the whole thing. */\n fullText: string;\n /** Additional classes for the label row. */\n className?: string;\n};\n\n/**\n * A two-field toolbar label that degrades predictably as its slot narrows: the secondary field\n * clips with an ellipsis, then disappears, leaving the primary field alone. A tooltip carries the\n * complete text whenever what is rendered is not all of it.\n *\n * The ellipsis step needs no JavaScript. Both fields can shrink, but the secondary is weighted to\n * absorb ~all of it, so it clips to nothing before the primary gives up a character — and the\n * primary keeps an ellipsis of its own rather than being cut mid-glyph by the trigger's\n * `overflow-hidden`. Only the abbreviation and dropped steps need the caller to say so.\n */\nexport function ToolbarCompoundLabel({\n primary,\n secondary,\n separator = ' ',\n secondaryFirst = false,\n showSecondary = true,\n isPartial,\n fullText,\n className,\n}: ToolbarCompoundLabelProps) {\n // Opens only when a field's text actually overflows its box, so a label that fits gets no\n // redundant tooltip. Both fields are watched: the secondary is weighted to give way first, but\n // once it has nothing left the primary is what clips, and that is exactly when the full text is\n // most worth offering.\n const {\n ref: secondaryRef,\n open: isSecondaryClipHovered,\n onPointerEnter: onSecondaryClipPointerEnter,\n onPointerLeave: onSecondaryClipPointerLeave,\n } = useTruncationTooltip();\n const {\n ref: primaryRef,\n open: isPrimaryClipHovered,\n onPointerEnter: onPrimaryClipPointerEnter,\n onPointerLeave: onPrimaryClipPointerLeave,\n } = useTruncationTooltip();\n\n // An abbreviated or dropped field is incomplete without being measurably clipped, so hover alone\n // has to open the tooltip. Same two-source pattern `project-selector.component.tsx` uses.\n const [isIncompleteHovered, setIsIncompleteHovered] = useState(false);\n\n // Keyboard reveal. These labels render inside a button or select trigger, so focus lands on that\n // ancestor and never on the span below — a React `onFocus` here would not fire. Without this the\n // shortened text is a pointer-only affordance: a keyboard user tabbing to an abbreviated\n // reference has no way at all to see what it stands for.\n const [isFocusRevealed, setIsFocusRevealed] = useState(false);\n const rootRef = useRef(\n // React's ref API requires `null` as the initial value for DOM refs.\n // eslint-disable-next-line no-null/no-null\n null,\n );\n\n const isSecondaryRendered = showSecondary && secondary !== undefined;\n const isShowingPartialLabel = isPartial ?? (secondary !== undefined && !showSecondary);\n\n useInteractionModality();\n\n useEffect(() => {\n const focusable = rootRef.current?.closest('button, [role=\"combobox\"], [tabindex]');\n if (!focusable) return undefined;\n\n const isClipped = (element: HTMLSpanElement | null) =>\n !!element && element.scrollWidth > element.clientWidth;\n\n const reveal = () => {\n // Only a keyboard arrival reveals — see `getLastInteractionModality`. A pointer user who just\n // dismissed a menu gets focus back without asking for an explanation of a label they can see.\n if (getLastInteractionModality() === 'pointer') return;\n // Same two sources as hover: a label that is short by construction, or one CSS has clipped.\n // Anything that already reads in full needs no tooltip on focus either.\n if (isShowingPartialLabel || isClipped(primaryRef.current) || isClipped(secondaryRef.current))\n setIsFocusRevealed(true);\n };\n const hide = () => setIsFocusRevealed(false);\n\n focusable.addEventListener('focus', reveal);\n focusable.addEventListener('blur', hide);\n return () => {\n focusable.removeEventListener('focus', reveal);\n focusable.removeEventListener('blur', hide);\n };\n }, [isShowingPartialLabel, primaryRef, secondaryRef]);\n\n const handlePointerEnter = useCallback(() => {\n if (isShowingPartialLabel) setIsIncompleteHovered(true);\n onPrimaryClipPointerEnter();\n if (isSecondaryRendered) onSecondaryClipPointerEnter();\n }, [\n isShowingPartialLabel,\n isSecondaryRendered,\n onPrimaryClipPointerEnter,\n onSecondaryClipPointerEnter,\n ]);\n\n // Wired to both pointer-leave and pointer-down. The press case is not redundant: these labels sit\n // inside popover and select triggers, and without it the tooltip stays open on top of the popover\n // the click just opened, because the pointer never \"leaves\".\n const closeTooltip = useCallback(() => {\n setIsIncompleteHovered(false);\n setIsFocusRevealed(false);\n onPrimaryClipPointerLeave();\n onSecondaryClipPointerLeave();\n }, [onPrimaryClipPointerLeave, onSecondaryClipPointerLeave]);\n\n // The open state is latched at event time, so a label that grows back to its full form while the\n // tooltip is up would otherwise keep showing a tooltip that now just repeats what is on screen.\n // Widening is exactly when that happens: the shrink step drops and `showSecondary` flips back on\n // under a pointer or focus that never moved.\n useEffect(() => {\n if (!isShowingPartialLabel) setIsIncompleteHovered(false);\n }, [isShowingPartialLabel]);\n\n const primaryNode = (\n \n {primary}\n \n );\n\n const secondaryNode = isSecondaryRendered ? (\n // Weighted to absorb essentially all of the shrinking, so the primary field only starts losing\n // characters once this one has none left.\n \n {secondary}\n \n ) : undefined;\n\n const [first, second] = secondaryFirst\n ? [secondaryNode, primaryNode]\n : [primaryNode, secondaryNode];\n\n return (\n // Nested TooltipProviders are harmless in Radix, so carrying our own means this works in any\n // host, including toolbars that never set one up.\n \n {/* `onOpenChange` is what makes this dismissable. A controlled Radix tooltip routes every\n close it decides on — Escape, an outside pointer press — through this callback, so\n without it the tooltip's own dismiss handler is a no-op AND its dismissable layer still\n calls `preventDefault()` on that Escape, swallowing the keypress from whatever popover\n sits underneath. Only closes are honoured; opening stays ours to decide. */}\n {\n if (!isOpen) closeTooltip();\n }}\n >\n \n \n {first}\n {/* Only between two rendered fields — never leading or trailing, which is what a\n naive \"is there a second slot\" check produces once one field is dropped. */}\n {first && second && (\n \n {separator}\n \n )}\n {second}\n
\n \n {fullText}\n \n \n );\n}\n\nexport default ToolbarCompoundLabel;\n","import {\n ALL_ENGLISH_BOOK_NAMES,\n getLocalizedBookId,\n getLocalizedBookName,\n} from '@/components/shared/book.utils';\n\n/**\n * Builds the cmdk `CommandItem` value for a book row. Localized parts are included when they are\n * available because cmdk filters book rows by their value, so a query typed in the user's language\n * has to be able to match.\n *\n * Deliberately carries no chapter: a book row names a book and nothing more. Appending a chapter\n * here would spell a string {@link parseChapterFromItemValue} has to read as a chapter cell, which\n * is exactly the confusion the round-trip check there exists to prevent.\n */\nexport function generateCommandValue(\n bookId: string,\n localizedBookNames?: Map,\n): string {\n return `${bookId} ${ALL_ENGLISH_BOOK_NAMES[bookId]}${localizedBookNames ? ` ${getLocalizedBookId(bookId, localizedBookNames)} ${getLocalizedBookName(bookId, localizedBookNames)}` : ''}`;\n}\n\n/**\n * Builds the cmdk `CommandItem` value for one cell of the chapter grid.\n *\n * The format is deliberately **not** localized. The chapter grid renders its `CommandItem value`\n * from this function and `BookChapterControl` sets its controlled `commandValue` from it, so both\n * sides must produce byte-identical strings for cmdk to find the item to highlight. Localized parts\n * — which `generateCommandValue` adds for book rows, because cmdk filters those — would break the\n * match as soon as `localizedBookNames` is supplied.\n */\nexport function chapterItemValue(bookId: string, chapter: number): string {\n return `${bookId} ${ALL_ENGLISH_BOOK_NAMES[bookId] || ''} ${chapter}`;\n}\n\n/** Builds the cmdk `CommandItem` value for one cell of the verse grid. @see chapterItemValue */\nexport function verseItemValue(bookId: string, chapterNum: number, verse: number): string {\n return `${chapterItemValue(bookId, chapterNum)}:${verse}`;\n}\n\n/**\n * Reads the chapter number back out of a {@link chapterItemValue}, or `undefined` when the value\n * does not identify a chapter cell (a book row, or a verse cell — a verse value ends in digits too,\n * so the colon has to be excluded explicitly).\n *\n * Ending in digits is not sufficient evidence: several canon books have English names that end in a\n * number (`PS2` → \"Psalm 151\", `PS3` → \"Psalms 152-155\"), so a plain trailing-number match reads a\n * book row for one of those as a chapter cell. The candidate is therefore round-tripped through\n * {@link chapterItemValue} and only accepted when it reproduces the value byte for byte.\n */\nexport function parseChapterFromItemValue(value: string): number | undefined {\n if (value.includes(':')) return undefined;\n const match = /(\\d+)$/.exec(value);\n if (!match) return undefined;\n const chapter = parseInt(match[1], 10);\n const firstSpaceIndex = value.indexOf(' ');\n if (firstSpaceIndex < 0) return undefined;\n const bookId = value.slice(0, firstSpaceIndex);\n return value === chapterItemValue(bookId, chapter) ? chapter : undefined;\n}\n\n/**\n * Reads the verse number back out of a {@link verseItemValue}, or `undefined` when the value does\n * not identify a verse cell.\n *\n * The part before the colon has to be a chapter cell for the whole value to be a verse cell, so\n * this inherits {@link parseChapterFromItemValue}'s round-trip check.\n */\nexport function parseVerseFromItemValue(value: string): number | undefined {\n const match = /:(\\d+)$/.exec(value);\n if (!match) return undefined;\n const chapterPart = value.slice(0, value.length - match[0].length);\n if (parseChapterFromItemValue(chapterPart) === undefined) return undefined;\n return parseInt(match[1], 10);\n}\n\n/**\n * Value for the top-match row's `CommandItem`. It is a fixed sentinel rather than a\n * reference-shaped string so it can never collide with a chapter or verse cell's value, and so\n * parsing it yields neither a chapter nor a verse.\n */\nexport const TOP_MATCH_ITEM_VALUE = 'top-match';\n","import { Clock } from 'lucide-react';\nimport { useId, useRef, useState } from 'react';\nimport { Button, ButtonProps } from '@/components/shadcn-ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from '@/components/shadcn-ui/dropdown-menu';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/shadcn-ui/tooltip';\nimport { resolveLocalizedString } from '@/utils/localization.util';\nimport { cn } from '@/utils/shadcn-ui/utils';\n\nconst DEFAULT_ARIA_LABEL = 'Show recent searches';\nconst DEFAULT_GROUP_HEADING = 'Recent';\n\n/** Interface defining the properties for the RecentSearches component */\nexport interface RecentSearchesProps {\n /** Array of recent search items */\n recentSearches: T[];\n /** Callback when a recent search item is selected */\n onSearchItemSelect: (item: T) => void;\n /** Function to render each search item as a string for display */\n renderItem?: (item: T) => string;\n /** Function to create a unique key for each item */\n getItemKey?: (item: T) => string;\n /**\n * Accessible name for the trigger button, which is also rendered as the button's visible tooltip\n * text. Write it as user-visible microcopy (sentence case), not as a screen-reader-only phrase.\n *\n * Passing an empty string suppresses the tooltip AND leaves the icon-only button without an\n * accessible name, so prefer omitting the prop — which falls back to a sensible default — over\n * passing `''`.\n *\n * A value that is still a raw `%localization_key%` is treated as not-yet-localized and falls back\n * to the default, so a key can never reach the screen as tooltip text.\n */\n ariaLabel?: string;\n /**\n * Heading for the recent searches list. Rendered as the list's visible heading and used as its\n * accessible name, so a screen reader announces what the list is rather than a bare \"menu\". Falls\n * back to the default when omitted or still a raw `%localization_key%`.\n */\n groupHeading?: string;\n /** Optional ID for the dropdown menu content for accessibility */\n id?: string;\n /** Class name for styling the `DropdownMenuItem` for each recent search result */\n classNameForItems?: string;\n /**\n * Class name for the trigger button. Defaults to absolute positioning inside an input field. Pass\n * a custom value to render the button standalone (e.g. `\"tw:h-9 tw:w-9\"`)\n */\n buttonClassName?: string;\n /** Variant for the trigger button. Defaults to `\"ghost\"` */\n buttonVariant?: ButtonProps['variant'];\n /** Controlled open state of the dropdown menu. If provided, the component becomes controlled. */\n open?: boolean;\n /** Called when the open state changes. Required when `open` is provided. */\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Generic component that displays a button to show recent searches in a dropdown menu. Only renders\n * if there are recent searches available. Works with any data type T.\n */\nexport default function RecentSearches({\n recentSearches,\n onSearchItemSelect,\n renderItem = (item) => String(item),\n getItemKey = (item) => String(item),\n ariaLabel,\n groupHeading,\n id,\n classNameForItems,\n buttonClassName = 'tw:absolute tw:end-0 tw:top-0 tw:h-full tw:px-3 tw:py-2',\n buttonVariant = 'ghost',\n open: openProp,\n onOpenChange,\n}: RecentSearchesProps) {\n const [isOpenInternal, setIsOpenInternal] = useState(false);\n const [isTooltipOpen, setIsTooltipOpen] = useState(false);\n const headingId = useId();\n // Set while the list is closing, so the focus Radix restores to the trigger is not mistaken for\n // the user pointing at it. Read and cleared once, by the very next open request.\n const isRestoringFocusFromListRef = useRef(false);\n const isControlled = openProp !== undefined;\n const isOpen = isControlled ? openProp : isOpenInternal;\n // An empty string is a deliberate \"no label\" (documented on the prop), so only `undefined` and a\n // raw localization key fall back.\n const resolvedAriaLabel =\n ariaLabel === '' ? '' : resolveLocalizedString(ariaLabel, DEFAULT_ARIA_LABEL);\n const resolvedGroupHeading = resolveLocalizedString(groupHeading, DEFAULT_GROUP_HEADING);\n\n const setIsOpen = (value: boolean) => {\n if (!value) {\n // Radix hands focus back to this trigger as the list closes, and `TooltipTrigger` reads any\n // focus as a reason to open. The pointer is wherever the user clicked — a row of the list, or\n // outside it — and never on the button, so no `pointerleave` would ever arrive to close that\n // tooltip again: it would sit over the search input beside it until the button happened to\n // blur. Mark the close so the restore is ignored, and shut any tooltip that is already up.\n isRestoringFocusFromListRef.current = true;\n setIsTooltipOpen(false);\n }\n if (!isControlled) setIsOpenInternal(value);\n onOpenChange?.(value);\n };\n\n const handleTooltipOpenChange = (value: boolean) => {\n if (value && isRestoringFocusFromListRef.current) {\n // One-shot: a later hover or Tab is a real request and opens normally.\n isRestoringFocusFromListRef.current = false;\n return;\n }\n setIsTooltipOpen(value);\n };\n\n if (recentSearches.length === 0) {\n return undefined;\n }\n\n // Radix closes the list itself when an item is selected, which already routes through `setIsOpen`\n // and reports the close once. Closing it again here would report it twice per selection.\n const handleSearchItemSelect = (item: T) => {\n onSearchItemSelect(item);\n };\n\n const button = (\n {\n isRestoringFocusFromListRef.current = false;\n }}\n >\n \n \n );\n\n // `modal={false}` because Radix menus default to modal, which traps focus and sets\n // `pointer-events: none` on the body for as long as the list is open. This list opens beside a\n // search input the user is still working in — usually inside another popover — so the\n // surrounding controls have to stay clickable.\n return (\n \n {/* This component is exported standalone and may be rendered anywhere, so it carries its\n own TooltipProvider rather than assuming a host tree already has one. */}\n \n {resolvedAriaLabel ? (\n \n \n {button}\n \n {resolvedAriaLabel}\n \n ) : (\n {button}\n )}\n \n {/* `aria-labelledby` rather than a bare heading: Radix's menu label is a plain `div` that\n nothing references, so without this the list announces as an unnamed menu of N items and\n a screen-reader user is never told these are recent searches. */}\n event.stopPropagation()}\n >\n {resolvedGroupHeading}\n {recentSearches.map((item) => (\n handleSearchItemSelect(item)}\n className={cn('tw:flex tw:items-center', classNameForItems)}\n >\n \n {renderItem(item)}\n \n ))}\n \n \n );\n}\n\n/** Generic hook for managing recent searches state and operations. */\nexport function useRecentSearches(\n recentSearches: T[],\n setRecentSearches: (items: T[]) => void,\n areItemsEqual: (a: T, b: T) => boolean = (a, b) => a === b,\n maxItems: number = 15,\n) {\n return (item: T) => {\n // Add the current item to recent searches, moving it to the top if it already exists\n const recentSearchesWithoutCurrent = recentSearches.filter(\n (existingItem) => !areItemsEqual(existingItem, item),\n );\n const updatedRecentSearches = [item, ...recentSearchesWithoutCurrent.slice(0, maxItems - 1)];\n setRecentSearches(updatedRecentSearches);\n };\n}\n","import { Direction } from '@/utils/dir-helper.util';\nimport { SerializedVerseRef } from '@sillsdev/scripture';\nimport { ChevronDown, ChevronsLeft, ChevronsRight, ChevronUp } from 'lucide-react';\nimport { ComponentType, useCallback, useMemo } from 'react';\nimport { compareScrRefs, LanguageStrings } from 'platform-bible-utils';\nimport { resolveLocalizedString } from '@/utils/localization.util';\nimport {\n getNextChapterRef,\n getNextVerseRef,\n getPreviousChapterRef,\n getPreviousVerseRef,\n} from 'platform-bible-utils/experimental';\n\nexport interface QuickNavButton {\n onClick: () => void;\n disabled?: boolean;\n title: string;\n icon: ComponentType<{ className?: string }>;\n group: 'chapter' | 'verse';\n}\n\n/** Whether stepping to `newRef` would do nothing: there is no target, or it equals `scrRef`. */\nfunction isNoOpNavigation(\n scrRef: SerializedVerseRef,\n newRef: SerializedVerseRef | undefined,\n): boolean {\n return !newRef || compareScrRefs(scrRef, newRef) === 0;\n}\n\nexport function useQuickNavButtons(\n scrRef: SerializedVerseRef,\n availableBooks: string[],\n direction: Direction,\n handleSubmit: (scrRef: SerializedVerseRef) => void,\n localizedStrings?: LanguageStrings,\n): QuickNavButton[] {\n // The buttons pass availableBooks (so navigation honors books-present and rolls across book\n // boundaries the way the keyboard commands do) but intentionally pass no ScriptureBounds — there\n // is no versification source here, so verse navigation keeps its pre-versification\n // floor-at-0 / unbounded-increment behavior within a book. Making the buttons versification-aware\n // to match the keyboard commands is tracked in PT-4379.\n //\n // Each target ref is computed once and reused for both the click handler and the disabled state,\n // so the button is disabled exactly when the step would be a no-op (no target, or the same ref).\n const previousChapterRef = useMemo(\n () => getPreviousChapterRef(scrRef, availableBooks),\n [scrRef, availableBooks],\n );\n const nextChapterRef = useMemo(\n () => getNextChapterRef(scrRef, availableBooks),\n [scrRef, availableBooks],\n );\n const previousVerseRef = useMemo(\n () => getPreviousVerseRef(scrRef, availableBooks),\n [scrRef, availableBooks],\n );\n const nextVerseRef = useMemo(\n () => getNextVerseRef(scrRef, availableBooks),\n [scrRef, availableBooks],\n );\n\n const submitIfChanged = useCallback(\n (newRef: SerializedVerseRef | undefined) => {\n if (newRef) handleSubmit(newRef);\n },\n [handleSubmit],\n );\n\n return useMemo(() => {\n return [\n {\n onClick: () => submitIfChanged(previousChapterRef),\n disabled: isNoOpNavigation(scrRef, previousChapterRef),\n title: resolveLocalizedString(\n localizedStrings?.['%webView_bookChapterControl_previousChapter%'],\n 'Previous chapter',\n ),\n icon: direction === 'ltr' ? ChevronsLeft : ChevronsRight,\n group: 'chapter' as const,\n },\n {\n onClick: () => submitIfChanged(nextChapterRef),\n disabled: isNoOpNavigation(scrRef, nextChapterRef),\n title: resolveLocalizedString(\n localizedStrings?.['%webView_bookChapterControl_nextChapter%'],\n 'Next chapter',\n ),\n icon: direction === 'ltr' ? ChevronsRight : ChevronsLeft,\n group: 'chapter' as const,\n },\n {\n onClick: () => submitIfChanged(previousVerseRef),\n disabled: isNoOpNavigation(scrRef, previousVerseRef),\n title: resolveLocalizedString(\n localizedStrings?.['%webView_bookChapterControl_previousVerse%'],\n 'Previous verse',\n ),\n icon: ChevronUp,\n group: 'verse' as const,\n },\n {\n onClick: () => submitIfChanged(nextVerseRef),\n disabled: isNoOpNavigation(scrRef, nextVerseRef),\n title: resolveLocalizedString(\n localizedStrings?.['%webView_bookChapterControl_nextVerse%'],\n 'Next verse',\n ),\n icon: ChevronDown,\n group: 'verse' as const,\n },\n ];\n }, [\n scrRef,\n direction,\n submitIfChanged,\n previousChapterRef,\n previousVerseRef,\n nextVerseRef,\n nextChapterRef,\n localizedStrings,\n ]);\n}\n","import { Canon, SerializedVerseRef } from '@sillsdev/scripture';\nimport { getChaptersForBook, Section } from 'platform-bible-utils';\nimport { ALL_ENGLISH_BOOK_NAMES, doesBookMatchQuery } from '@/components/shared/book.utils';\nimport { ArrowKey } from '@/utils/keyboard.util';\nimport { Direction } from '@/utils/dir-helper.util';\nimport { BookWithOptionalChapterAndVerse } from './book-chapter-control.types';\n\n// Smart parsing regex patterns\nexport const SCRIPTURE_REGEX_PATTERNS = {\n // Matches start of string (`^`), one or more non-colon/space words, optionally followed by space and more words (`([^:\\s]+(?:\\s+[^:\\s]+)*)`), end of string (`$`), case-insensitive (`i`)\n BOOK_ONLY: /^([^:\\s]+(?:\\s+[^:\\s]+)*)$/i,\n // Same as above, but followed by a space and a chapter number (`\\s+(\\d+)`)\n BOOK_CHAPTER: /^([^:\\s]+(?:\\s+[^:\\s]+)*)\\s+(\\d+)$/i,\n // Same as above, but followed by a colon and optionally a verse number (`:(\\d*)`)\n BOOK_CHAPTER_VERSE: /^([^:\\s]+(?:\\s+[^:\\s]+)*)\\s+(\\d+):(\\d*)$/i,\n} as const;\n\nexport const SEARCH_QUERY_FORMATS = [\n SCRIPTURE_REGEX_PATTERNS.BOOK_ONLY,\n SCRIPTURE_REGEX_PATTERNS.BOOK_CHAPTER,\n SCRIPTURE_REGEX_PATTERNS.BOOK_CHAPTER_VERSE,\n];\n\n/**\n * Returns true if the query contains a chapter-verse separator (`:`) following a chapter number.\n * Used to decide whether to switch to verse selection when the user is typing.\n */\nexport function hasChapterVerseSeparator(query: string): boolean {\n return SCRIPTURE_REGEX_PATTERNS.BOOK_CHAPTER_VERSE.test(query.trim());\n}\n\n/** Returns true if `bookId` appears strictly before `lowerBound.book` in canon order. */\nexport function isBookBefore(bookId: string, lowerBound: SerializedVerseRef): boolean {\n return Canon.bookIdToNumber(bookId) < Canon.bookIdToNumber(lowerBound.book);\n}\n\n/**\n * Returns true if the chapter in `bookId` is strictly before `lowerBound`. Chapters in books\n * earlier than `lowerBound.book` are treated as before. Chapters in later books are never before.\n */\nexport function isChapterBefore(\n bookId: string,\n chapterNum: number,\n lowerBound: SerializedVerseRef,\n): boolean {\n const bookCmp = Canon.bookIdToNumber(bookId) - Canon.bookIdToNumber(lowerBound.book);\n if (bookCmp < 0) return true;\n if (bookCmp > 0) return false;\n return chapterNum < lowerBound.chapterNum;\n}\n\n/**\n * Returns true if the verse in `bookId` / `chapterNum` is strictly before `lowerBound`. Verses in\n * earlier books or earlier chapters of the same book are treated as before.\n */\nexport function isVerseBefore(\n bookId: string,\n chapterNum: number,\n verseNum: number,\n lowerBound: SerializedVerseRef,\n): boolean {\n const bookCmp = Canon.bookIdToNumber(bookId) - Canon.bookIdToNumber(lowerBound.book);\n if (bookCmp < 0) return true;\n if (bookCmp > 0) return false;\n if (chapterNum < lowerBound.chapterNum) return true;\n if (chapterNum > lowerBound.chapterNum) return false;\n return verseNum < lowerBound.verseNum;\n}\n\nexport function fetchEndChapter(bookId: string) {\n // getChaptersForBook returns -1 if not found in scrBookData\n // scrBookData only includes OT and NT, so all DC will return -1\n return getChaptersForBook(Canon.bookIdToNumber(bookId));\n}\n\nexport function calculateTopMatch(\n query: string,\n availableBooks: string[],\n localizedBookNames?: Map,\n): BookWithOptionalChapterAndVerse | undefined {\n if (!query.trim() || availableBooks.length === 0) return undefined;\n\n // First try smart parsing with regex patterns\n const topMatch = SEARCH_QUERY_FORMATS.reduce(\n (result: BookWithOptionalChapterAndVerse | undefined, format) => {\n if (result) return result;\n\n const matches = format.exec(query.trim());\n if (matches) {\n const [book, chapter = undefined, verse = undefined] = matches.slice(1);\n\n let validBookId: string | undefined;\n\n // Match for partial book name or id\n\n const allPotentialMatches = availableBooks.filter((bookId) => {\n return doesBookMatchQuery(bookId, book, localizedBookNames);\n });\n\n // Only create a topMatch if exactly one book could match\n if (allPotentialMatches.length === 1) {\n [validBookId] = allPotentialMatches;\n }\n\n // Match for exact book id (English or localized)\n // This is only performed when a chapter number is provided, to prevent edge cases where\n // a search for e.g. `jud` would generate a top match for 'Jude', even though 'Judges' would\n // also be a valid match\n if (!validBookId && chapter) {\n // Check exact English book ID\n if (Canon.isBookIdValid(book)) {\n const bookIdUpperCase = book.toUpperCase();\n if (availableBooks.includes(bookIdUpperCase)) {\n validBookId = bookIdUpperCase;\n }\n }\n\n // Check exact localized book ID\n if (!validBookId && localizedBookNames) {\n const matchingLocalizedBookId = Array.from(localizedBookNames.entries()).find(\n ([, localizedBook]) => localizedBook.localizedId.toLowerCase() === book.toLowerCase(),\n );\n if (matchingLocalizedBookId && availableBooks.includes(matchingLocalizedBookId[0])) {\n [validBookId] = matchingLocalizedBookId;\n }\n }\n }\n\n // Match for exact full book name (English or localized)\n // This is only performed when a chapter number is provided, to prevent edge cases where\n // a search for e.g. `john` only matches `John` but not `1 John`, `2 John` and `3 John`\n if (!validBookId && chapter) {\n // Check exact English book name\n const getBookIdFromEnglishName = (bookName: string): string | undefined => {\n return Object.keys(ALL_ENGLISH_BOOK_NAMES).find(\n (bookId) => ALL_ENGLISH_BOOK_NAMES[bookId].toLowerCase() === bookName.toLowerCase(),\n );\n };\n\n const matchingBookIdForFullName = getBookIdFromEnglishName(book);\n if (matchingBookIdForFullName && availableBooks.includes(matchingBookIdForFullName)) {\n validBookId = matchingBookIdForFullName;\n }\n\n // Check exact localized book name\n if (!validBookId && localizedBookNames) {\n const matchingLocalizedBookName = Array.from(localizedBookNames.entries()).find(\n ([, localizedBook]) =>\n localizedBook.localizedName.toLowerCase() === book.toLowerCase(),\n );\n if (\n matchingLocalizedBookName &&\n availableBooks.includes(matchingLocalizedBookName[0])\n ) {\n [validBookId] = matchingLocalizedBookName;\n }\n }\n }\n\n if (validBookId) {\n let chapterNum = chapter ? parseInt(chapter, 10) : undefined;\n if (chapterNum && chapterNum > fetchEndChapter(validBookId))\n chapterNum = Math.max(fetchEndChapter(validBookId), 1);\n const verseNum = verse ? parseInt(verse, 10) : undefined;\n\n return {\n book: validBookId,\n chapterNum,\n verseNum,\n };\n }\n }\n\n return undefined;\n },\n undefined,\n );\n\n if (topMatch) return topMatch;\n\n return undefined;\n}\n\n/** Grouped and flattened book lists a `BookChapterControl` renders. */\nexport type BookChapterControlBookLists = {\n /** The active project's books, grouped by section — what the control browses by default. */\n projectBooksBySection: Record;\n /** Every reachable book, grouped by section — what searching spans. */\n reachableBooksBySection: Record;\n /**\n * `reachableBooksBySection` flattened — the candidate list for searching, top-match parsing, and\n * quick navigation. Searching spans this list whether or not the widened list is on screen, so a\n * book in an open resource is findable by name without expanding first; every match it surfaces\n * is still rendered greyed and labelled, so search never presents one as a project book.\n * Deliberately the flattened GROUPED list rather than the raw reachable ids: section grouping\n * drops the peripheral ids no section claims (FRT, BAK, OTH, INT, CNC, GLO, TDX, NDX) and orders\n * DC/Extra differently from raw canon order, so the raw list would offer callers books they have\n * never been offered.\n */\n reachableBooks: string[];\n /**\n * `projectBooksBySection` flattened — the navigation universe while the list is collapsed. Only\n * the project's books, so quick navigation stays inside the books the user has opted into.\n */\n projectBooks: string[];\n /** Reachable books the project does not have. These render greyed but stay selectable. */\n booksOutsideProject: ReadonlySet;\n};\n\n/**\n * Groups book ids into the sections the control renders. Ids no section claims — the peripheral\n * ones (FRT, BAK, OTH, INT, CNC, GLO, TDX, NDX) — are dropped, which is what keeps the control from\n * offering a book it cannot browse to.\n *\n * Deliberately NOT built on `getSectionForBook`, despite answering a similar question: that\n * function classifies a book already known to belong to a section and throws otherwise, and it\n * tests Extra with `Canon.isExtraMaterial`, which claims all eight peripheral ids. Routing this\n * through it would turn front and back matter into browsable Extra books and throw on anything else\n * — the opposite of the filtering this exists to do. `Canon.extraBooks()` is the narrow membership\n * test that keeps peripheral ids out.\n *\n * @param bookIds Book ids to group, in the order they should appear within their section\n */\nexport function groupBooksBySection(bookIds: readonly string[]): Record {\n return {\n [Section.OT]: bookIds.filter((bookId) => Canon.isBookOT(bookId)),\n [Section.NT]: bookIds.filter((bookId) => Canon.isBookNT(bookId)),\n [Section.DC]: bookIds.filter((bookId) => Canon.isBookDC(bookId)),\n [Section.Extra]: bookIds.filter((bookId) => Canon.extraBooks().includes(bookId)),\n };\n}\n\n/**\n * Derives every book list the control renders from the two inputs that determine them.\n *\n * Purely a function of its inputs: a book is reachable only if the caller passes it. A caller that\n * wants the book of the current reference reachable while the project lacks it must include that\n * book in `additionalBookIds`.\n *\n * @param projectBookIds Books the active project has\n * @param additionalBookIds Books reachable elsewhere, e.g. present in an open resource. Ids the\n * project already has are ignored — this arrives from a public callback that may include them.\n */\nexport function deriveBookChapterControlBookLists(\n projectBookIds: readonly string[],\n additionalBookIds: readonly string[],\n): BookChapterControlBookLists {\n const projectBookIdSet = new Set(projectBookIds);\n const extraBookIds = additionalBookIds.filter((bookId) => !projectBookIdSet.has(bookId));\n const extraBookIdSet = new Set(extraBookIds);\n\n // Canon-ordered so an extra book lands among its neighbours instead of after the project's books.\n // Ordered from `Canon.allBookIds` rather than `ALL_BOOK_IDS` so the widened list is always a\n // superset of the project's books: `ALL_BOOK_IDS` drops the ids the Canon library marks obsolete\n // (JSA, JDB, TBS, SST, DNT, BLT, 3ES), which a project's `booksPresent` can still claim and which\n // the collapsed list therefore offers. An obsolete book reachable through an open resource is\n // offered for the same reason - a book present in an open scripture stays browsable.\n // The fast path preserves the caller's array when nothing widens the list.\n const reachableBookIds =\n extraBookIdSet.size === 0\n ? projectBookIds\n : Canon.allBookIds.filter(\n (bookId) => projectBookIdSet.has(bookId) || extraBookIdSet.has(bookId),\n );\n\n const reachableBooksBySection = groupBooksBySection(reachableBookIds);\n const reachableBooks = Object.values(reachableBooksBySection).flat();\n\n const projectBooksBySection = groupBooksBySection(projectBookIds);\n\n return {\n projectBooksBySection,\n reachableBooksBySection,\n reachableBooks,\n // Grouped and flattened like `reachableBooks`, so it inherits the same peripheral-id exclusion.\n projectBooks: Object.values(projectBooksBySection).flat(),\n // Derived from the grouped-and-flattened list, so a peripheral id that grouping dropped can\n // never be marked dimmed for a list it is not part of.\n booksOutsideProject: new Set(reachableBooks.filter((bookId) => !projectBookIdSet.has(bookId))),\n };\n}\n\n/**\n * Number of columns in the chapter and verse grids. Drives both the arrow-key arithmetic in\n * {@link computeTargetGridItem} and the grids' rendered `gridTemplateColumns`, so the two cannot\n * drift out of sync and leave arrow navigation landing on the wrong cell.\n */\nexport const GRID_COLUMNS = 6;\n\n/** In a right-to-left grid the horizontal arrows point at the opposite neighbour. */\nfunction mirrorHorizontalKey(key: ArrowKey): ArrowKey {\n if (key === 'ArrowLeft') return 'ArrowRight';\n if (key === 'ArrowRight') return 'ArrowLeft';\n return key;\n}\n\n/**\n * Computes where the highlight moves when an arrow key is pressed in a numbered grid — the chapter\n * grid and the verse grid share this arithmetic.\n *\n * Horizontal movement wraps around the whole grid; vertical movement clamps at the first and last\n * item, so a partial last row can be reached from any column above it.\n *\n * @param current The currently highlighted item, 1-based. Callers seed a valid highlight when a\n * grid becomes visible, so an out-of-range value here means the seed did not happen; the helper\n * lands on the first item rather than moving from an unknown position.\n * @param key The arrow key that was pressed.\n * @param max The number of items in the grid. Values of 0 or less mean the count is unknown (the\n * Scripture data returns -1 for books it has no chapter count for), and the highlight is left\n * alone.\n * @param direction Layout direction. In `'rtl'` the horizontal arrows are mirrored so they follow\n * what the user sees; the vertical arrows are unaffected.\n * @returns The item the highlight should move to, 1-based.\n */\nexport function computeTargetGridItem({\n current,\n key,\n max,\n direction = 'ltr',\n}: {\n current: number;\n key: ArrowKey;\n max: number;\n direction?: Direction;\n}): number {\n if (max <= 0) return current;\n if (current < 1 || current > max) return 1;\n\n const effectiveKey = direction === 'rtl' ? mirrorHorizontalKey(key) : key;\n\n switch (effectiveKey) {\n case 'ArrowLeft':\n return current > 1 ? current - 1 : max;\n case 'ArrowRight':\n return current < max ? current + 1 : 1;\n case 'ArrowUp':\n return Math.max(1, current - GRID_COLUMNS);\n case 'ArrowDown':\n return Math.min(max, current + GRID_COLUMNS);\n default:\n return current;\n }\n}\n","import { CommandGroup, CommandItem } from '@/components/shadcn-ui/command';\nimport { LIST_ITEM_KEYBOARD_FOCUS_RING } from '@/utils/focus.util';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { GRID_COLUMNS } from './book-chapter-control.utils';\n\nexport interface NumberedItemGridProps {\n /** Number of items to render (1..count, inclusive). Returns null if count <= 0. */\n count: number;\n /**\n * Builds the cmdk `value` for item `n`. Whatever steers the highlight must produce a\n * byte-identical string, so build it with the shared helpers in `book-item.utils` —\n * `chapterItemValue` / `verseItemValue` — rather than composing the format here.\n */\n valueBuilder: (n: number) => string;\n /** Callback when item `n` is selected (only fires when not disabled). */\n onSelect: (n: number) => void;\n /** Returns the `ref` callback for item `n` (used for keyboard navigation). */\n itemRef: (n: number) => (element: HTMLDivElement | null) => void;\n /** Whether item `n` is disabled (not selectable). Defaults to false. */\n isDisabled?: (n: number) => boolean;\n /** Whether item `n` should be visually dimmed. Defaults to false. */\n isDimmed?: (n: number) => boolean;\n /** Whether item `n` is the currently-selected item (highlighted). Defaults to false. */\n isSelected?: (n: number) => boolean;\n /**\n * When true, cells paint no keyboard focus ring even while cmdk still marks one `data-selected`.\n * Set it while a control outside the grid holds focus, so the grid and that control never show a\n * focus indicator at the same time. Suppresses the paint, not the state — see the matching prop\n * on `BookItem`.\n */\n suppressKeyboardHighlight?: boolean;\n /** Optional additional class name applied to the grid wrapper. */\n className?: string;\n}\n\n/**\n * Internal helper that renders a grid of numbered cmdk `CommandItem`s for use by `ChapterGrid` and\n * `VerseGrid`. Encapsulates the shared layout, Tailwind classes, and disabled / dimmed / selected\n * state styling so the two public components only need to supply the per-item differences.\n *\n * Not part of the public `platform-bible-react` API.\n */\nexport function NumberedItemGrid({\n count,\n valueBuilder,\n onSelect,\n itemRef,\n isDisabled,\n isDimmed,\n isSelected,\n suppressKeyboardHighlight = false,\n className,\n}: NumberedItemGridProps) {\n if (count <= 0) return undefined;\n\n return (\n \n {/* Column count is read from the shared constant rather than taken as a prop: the arrow-key\n arithmetic in `computeTargetGridItem` reads the same constant, and a per-instance override\n here would let the rendered layout and the keyboard arithmetic disagree — arrows would\n land on the wrong cell with nothing to catch it. */}\n \n {Array.from({ length: count }, (_, i) => i + 1).map((n) => {\n const disabled = isDisabled?.(n) ?? false;\n return (\n {\n if (disabled) return;\n onSelect(n);\n }}\n ref={itemRef(n)}\n disabled={disabled}\n aria-disabled={disabled || undefined}\n className={cn(\n 'tw:h-8 tw:w-8 tw:cursor-pointer tw:justify-center tw:rounded-md tw:text-center tw:text-sm',\n // Hide CommandItem's own trailing check icon (a multiselect affordance this grid\n // doesn't use) and give cells pointer feedback distinct from the keyboard focus ring.\n 'tw:[&>svg]:hidden tw:hover:bg-muted',\n !suppressKeyboardHighlight && LIST_ITEM_KEYBOARD_FOCUS_RING,\n // cmdk highlights the focused cell with its own data-selected background/text; this\n // grid shows keyboard focus with the ring above instead, so neutralize that here.\n // The selected-cell rule below re-asserts its own colors under data-selected so the\n // current chapter/verse keeps its highlight even while the keyboard focus is on it.\n 'tw:data-selected:bg-transparent tw:data-selected:text-inherit',\n {\n // The keyboard ring switches to `ring-primary-foreground` on this cell. The shared\n // `ring-ring/50` composites to within ~0.04 lightness of `bg-primary`, which makes\n // the ring all but invisible on exactly the cell the highlight is seeded onto when\n // the popover opens. `primary-foreground` is the token already guaranteed to read\n // against `primary`. `cn` merges away the earlier ring color, so this wins by\n // argument order rather than by CSS output order.\n //\n // Hover keeps the filled treatment (`bg-primary`) instead of taking the shared\n // `hover:bg-muted` above. This cell's text is `primary-foreground` — near-white,\n // chosen to read against the fill — so swapping the fill for a pale muted\n // background on hover leaves near-white text on a near-white ground and the\n // current chapter all but disappears under the pointer. `/90` keeps the pointer\n // feedback that hover owes the user without touching the contrast.\n 'tw:bg-primary tw:text-primary-foreground tw:hover:bg-primary/90 tw:data-selected:bg-primary tw:data-selected:text-primary-foreground tw:data-selected:ring-primary-foreground/70':\n isSelected?.(n) ?? false,\n },\n {\n // Same tokens as BookItem, so book rows and chapter/verse cells grey identically\n // inside one popover. Restated under data-selected so a dimmed cell keeps its\n // dimming while the keyboard highlight is on it, rather than losing it to the\n // suppression rule above.\n 'tw:bg-muted/50 tw:text-muted-foreground/50 tw:data-selected:bg-muted/50 tw:data-selected:text-muted-foreground/50':\n (isDimmed?.(n) ?? false) && !disabled,\n },\n disabled && 'tw:cursor-not-allowed tw:opacity-40',\n )}\n >\n {n}\n \n );\n })}\n \n \n );\n}\n\nexport default NumberedItemGrid;\n","import { chapterItemValue } from '@/components/shared/book-item.utils';\nimport { fetchEndChapter } from './book-chapter-control.utils';\nimport { NumberedItemGrid } from './numbered-item-grid.component';\n\nexport interface ChapterGridProps {\n /** The book ID to render chapters for */\n bookId: string;\n /** Current scripture reference for highlighting */\n scrRef: { book: string; chapterNum: number };\n /** Callback when a chapter is selected */\n onChapterSelect: (chapter: number) => void;\n /** Function to set chapter refs for keyboard navigation */\n setChapterRef: (chapter: number) => (element: HTMLDivElement | null) => void;\n /** Optional function to determine if a chapter should be dimmed */\n isChapterDimmed?: (chapter: number) => boolean;\n /** Optional function to determine if a chapter should be disabled (not selectable). */\n isChapterDisabled?: (chapter: number) => boolean;\n /** Forwarded to `NumberedItemGrid` — see `suppressKeyboardHighlight` there. */\n suppressKeyboardHighlight?: boolean;\n /** Optional additional class name for styling */\n className?: string;\n}\n\n/**\n * Renders a grid of chapter numbers for a given book, with highlighting for the current chapter and\n * optional dimmed chapters based on state logic.\n */\nexport function ChapterGrid({\n bookId,\n scrRef,\n onChapterSelect,\n setChapterRef,\n isChapterDimmed,\n isChapterDisabled,\n suppressKeyboardHighlight,\n className,\n}: ChapterGridProps) {\n if (!bookId) return undefined;\n\n return (\n chapterItemValue(bookId, chapter)}\n onSelect={onChapterSelect}\n itemRef={setChapterRef}\n isDisabled={isChapterDisabled}\n isDimmed={isChapterDimmed}\n isSelected={(chapter) => bookId === scrRef.book && chapter === scrRef.chapterNum}\n suppressKeyboardHighlight={suppressKeyboardHighlight}\n className={className}\n />\n );\n}\n","import { verseItemValue } from '@/components/shared/book-item.utils';\nimport { NumberedItemGrid } from './numbered-item-grid.component';\n\nexport interface VerseGridProps {\n /** The book ID the verses belong to */\n bookId: string;\n /** The chapter number the verses belong to */\n chapterNum: number;\n /** The number of verses to render (from 1 to endVerse, inclusive) */\n endVerse: number;\n /** Current scripture reference for highlighting */\n scrRef: { book: string; chapterNum: number; verseNum: number };\n /** Callback when a verse is selected */\n onVerseSelect: (verse: number) => void;\n /** Function to set verse refs for keyboard navigation */\n setVerseRef: (verse: number) => (element: HTMLDivElement | null) => void;\n /** Optional function to determine if a verse should be dimmed */\n isVerseDimmed?: (verse: number) => boolean;\n /** Optional function to determine if a verse should be disabled (not selectable). */\n isVerseDisabled?: (verse: number) => boolean;\n /** Forwarded to `NumberedItemGrid` — see `suppressKeyboardHighlight` there. */\n suppressKeyboardHighlight?: boolean;\n /** Optional additional class name for styling */\n className?: string;\n}\n\n/**\n * Renders a grid of verse numbers for a given book and chapter, with highlighting for the current\n * verse and optional dimmed verses based on state logic.\n */\nexport function VerseGrid({\n bookId,\n chapterNum,\n endVerse,\n scrRef,\n onVerseSelect,\n setVerseRef,\n isVerseDimmed,\n isVerseDisabled,\n suppressKeyboardHighlight,\n className,\n}: VerseGridProps) {\n if (!bookId || endVerse <= 0) return undefined;\n\n return (\n verseItemValue(bookId, chapterNum, verse)}\n onSelect={onVerseSelect}\n itemRef={setVerseRef}\n isDisabled={isVerseDisabled}\n isDimmed={isVerseDimmed}\n isSelected={(verse) =>\n bookId === scrRef.book && chapterNum === scrRef.chapterNum && verse === scrRef.verseNum\n }\n suppressKeyboardHighlight={suppressKeyboardHighlight}\n className={className}\n />\n );\n}\n\nexport default VerseGrid;\n","import { BookItem } from '@/components/shared/book-item.component';\nimport { Button } from '@/components/shadcn-ui/button';\nimport { ButtonGroup, ButtonGroupSeparator } from '@/components/shadcn-ui/button-group';\nimport {\n Command,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/components/shadcn-ui/command';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/shadcn-ui/popover';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/shadcn-ui/tooltip';\nimport { Direction, readDirection } from '@/utils/dir-helper.util';\nimport { getKeyCharacterType, isArrowKey } from '@/utils/keyboard.util';\nimport { resolveLocalizedString } from '@/utils/localization.util';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { SerializedVerseRef } from '@sillsdev/scripture';\nimport { ArrowLeft, ArrowRight } from 'lucide-react';\nimport { IconSelector } from '@tabler/icons-react';\nimport {\n formatReplacementString,\n formatScrRef,\n getSectionForBook,\n Section,\n} from 'platform-bible-utils';\nimport {\n getSectionLongName,\n getLocalizedBookName,\n getLocalizedBookId,\n ALL_BOOK_IDS,\n doesBookMatchQuery,\n} from '@/components/shared/book.utils';\nimport {\n Fragment,\n KeyboardEvent,\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { SHRINK_STEP, useShrinkStepValue } from '@/context/shrink-step.context';\nimport { ToolbarCompoundLabel } from '@/components/advanced/toolbar-compound-label/toolbar-compound-label.component';\nimport {\n chapterItemValue,\n generateCommandValue,\n parseChapterFromItemValue,\n parseVerseFromItemValue,\n TOP_MATCH_ITEM_VALUE,\n verseItemValue,\n} from '@/components/shared/book-item.utils';\nimport RecentSearches from '../recent-searches.component';\nimport { useQuickNavButtons } from './book-chapter-control.navigation';\nimport { BookChapterControlProps, ViewMode } from './book-chapter-control.types';\nimport {\n calculateTopMatch,\n deriveBookChapterControlBookLists,\n computeTargetGridItem,\n fetchEndChapter,\n groupBooksBySection,\n hasChapterVerseSeparator,\n isBookBefore,\n isChapterBefore,\n isVerseBefore,\n} from './book-chapter-control.utils';\nimport { ChapterGrid } from './chapter-grid.component';\nimport { VerseGrid } from './verse-grid.component';\n\n/**\n * Elements that can hold a tab stop. Deliberately narrower than `getFocusableElements` in\n * `focus.util`: that answers \"can this be focused at all\", which includes the back button this\n * control keeps out of the tab order on purpose, and it also filters on rendered geometry — which\n * jsdom reports as zero for everything, so Tab handling built on it could not be tested. Every\n * element inside an open popover is rendered, so `tabindex` alone is the right question here.\n */\nconst TAB_STOP_SELECTOR =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]';\n\n/** The tab stops inside `container`, in document order. */\nfunction getTabStops(container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll(TAB_STOP_SELECTOR)).filter(\n (element) => element.tabIndex >= 0,\n );\n}\n\n/**\n * `BookChapterControl` is a component that provides an interactive UI for selecting book chapters.\n * It allows users to input a search query to find specific books and chapters, navigate through\n * options with keyboard interactions, and submit selections. The component handles various\n * interactions such as opening and closing the dropdown menu, filtering book lists based on search\n * input, and managing highlighted selections. It also integrates with external handlers for\n * submitting selected references and retrieving active book IDs.\n */\nexport function BookChapterControl({\n scrRef,\n handleSubmit,\n className,\n getActiveBookIds,\n getAdditionalBookIds,\n localizedBookNames,\n localizedStrings,\n recentSearches,\n onAddRecentSearch,\n id,\n getEndVerse,\n disableReferencesUpTo,\n submitKeys,\n triggerContent,\n triggerVariant = 'outline',\n showTriggerChevron = false,\n onOpenChange,\n onCloseAutoFocus,\n modal = false,\n align = 'center',\n ref,\n disabled,\n}: BookChapterControlProps) {\n const direction: Direction = readDirection();\n\n const shrinkStep = useShrinkStepValue();\n\n // Indicates if the Command popover is open or not\n const [isCommandOpen, setIsCommandOpen] = useState(false);\n // The value of the Command, mainly needed for reliable keyboard navigation\n const [commandValue, setCommandValue] = useState('');\n // The value of the Input inside the Command\n const [inputValue, setInputValue] = useState('');\n // The current view mode (books or chapters)\n const [viewMode, setViewMode] = useState('books');\n // The book currently selected for chapter view, if any\n const [selectedBookForChaptersView, setSelectedBookForChaptersView] = useState<\n string | undefined\n >(undefined);\n // The book/chapter currently selected for verse view, if any\n const [selectedBookForVersesView, setSelectedBookForVersesView] = useState(\n undefined,\n );\n const [selectedChapterForVersesView, setSelectedChapterForVersesView] = useState<\n number | undefined\n >(undefined);\n const [isCommandListHidden, setIsCommandListHidden] = useState(false);\n // Whether the book list is expanded past the active project's books. Governs browsing only —\n // searching always spans every reachable book.\n const [isShowingMoreBooks, setIsShowingMoreBooks] = useState(false);\n // Whether a control in the books-view header (a quick-nav arrow, the recent-searches trigger)\n // rather than the search input holds focus. Those controls draw their own focus ring, so the\n // list below must stop drawing one: two focus indicators at once leave the user no way to tell\n // which surface the next keystroke reaches.\n const [isHeaderControlFocused, setIsHeaderControlFocused] = useState(false);\n // Whether the books view's preview grid has taken over the keyboard from the search input. The\n // vertical arrows are the only way in — they are never caret keys — and editing the query is the\n // way back out. Until then the caret keeps the horizontal arrows, so a user typing a reference\n // can still move through what they typed. See `handleCommandKeyDown`.\n const [hasPreviewGridKeyboardControl, setHasPreviewGridKeyboardControl] = useState(false);\n\n // Reference to the PopoverTrigger button. Used by `onPointerDownOutside` to detect\n // clicks on our own trigger while the popover is open — see that handler for the full\n // story. `null` is React's canonical \"not yet attached\" ref value; there's no undefined\n // equivalent in the DOM/ref API.\n // eslint-disable-next-line no-null/no-null\n const triggerRef = useRef(null);\n // Set in `onPointerDownOutside` when we detect a click on our trigger while the popover\n // is open. Consumed in Button's `onClick` to call `event.preventDefault()` before Radix's\n // own `onOpenToggle` handler runs — `composeEventHandlers` skips `onOpenToggle` when\n // `defaultPrevented` is true, so the popover stays closed instead of toggling back open.\n const justClosedByTriggerRef = useRef(false);\n // Reference to the Command component\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const commandRef = useRef(undefined!);\n // Reference to the Input component inside the Command\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const commandInputRef = useRef(undefined!);\n // Reference to the CommandList inside the Command\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const commandListRef = useRef(undefined!);\n // Reference to the selected book item in the CommandList\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const selectedBookItemRef = useRef(undefined!);\n // References to the chapters that are shown as CommandItems\n const chapterRefs = useRef>({});\n // References to the verses that are shown as CommandItems\n const verseRefs = useRef>({});\n\n // Wrapper function to handle submit and add to recent searches\n const handleSubmitAndAddToRecent = useCallback(\n (newScrRef: SerializedVerseRef) => {\n handleSubmit(newScrRef);\n if (onAddRecentSearch) {\n onAddRecentSearch(newScrRef);\n }\n },\n [handleSubmit, onAddRecentSearch],\n );\n\n // #region Available books, filtering and top match logic\n\n const activeBookIds = useMemo(() => {\n return getActiveBookIds ? getActiveBookIds() : ALL_BOOK_IDS;\n }, [getActiveBookIds]);\n\n // Books offered beyond the active project. Ignored when there is no project list to be outside of\n // (no getActiveBookIds means the control already offers the whole canon).\n const additionalBookIds = useMemo(\n () => (getActiveBookIds && getAdditionalBookIds ? getAdditionalBookIds() : []),\n [getActiveBookIds, getAdditionalBookIds],\n );\n\n const {\n projectBooksBySection,\n reachableBooksBySection,\n reachableBooks,\n projectBooks,\n booksOutsideProject,\n } = useMemo(\n () => deriveBookChapterControlBookLists(activeBookIds, additionalBookIds),\n [activeBookIds, additionalBookIds],\n );\n\n // Deliberately the boolean and not `scrRef` or the set it comes from: handleOpenChange closes\n // over this and its identity feeds useImperativeHandle, so depending on either of those would\n // re-register the consumer's imperative handle on every reference change. Depending on the\n // boolean re-registers only when the current book actually crosses in or out of the project.\n const isCurrentBookOutsideProject = booksOutsideProject.has(scrRef.book);\n\n // Filter books based on search input\n const filteredBooksByType = useMemo(() => {\n if (!inputValue.trim())\n return isShowingMoreBooks ? reachableBooksBySection : projectBooksBySection;\n\n // Searching always spans every reachable book, whatever the toggle says\n return groupBooksBySection(\n reachableBooks.filter((bookId) => doesBookMatchQuery(bookId, inputValue, localizedBookNames)),\n );\n }, [\n projectBooksBySection,\n reachableBooksBySection,\n reachableBooks,\n isShowingMoreBooks,\n inputValue,\n localizedBookNames,\n ]);\n\n // Get the current top match\n const topMatch = useMemo(\n () => calculateTopMatch(inputValue, reachableBooks, localizedBookNames),\n [inputValue, reachableBooks, localizedBookNames],\n );\n\n // The reference the top-match row shows, and the one selecting that row submits. Both read this\n // single value so the row can never submit something other than what it displays. The highlighted\n // preview cell is the more specific of the two sources — the user moved the highlight there — so\n // it wins over the chapter/verse parsed out of the typed query.\n const topMatchReference = useMemo((): SerializedVerseRef | undefined => {\n if (!topMatch) return undefined;\n // Only a highlight on this book's own grid refines the reference. A value left over from an\n // earlier query names another book's cell, and mixing it in would compose a reference that was\n // never on screen.\n const highlight = commandValue.startsWith(`${topMatch.book} `) ? commandValue : '';\n const highlightedVerse = parseVerseFromItemValue(highlight);\n const highlightedChapter = parseChapterFromItemValue(highlight);\n // A value cannot name both a chapter cell and a verse cell, so no case-split on which kind of\n // highlight is present is needed: whichever one the value is, the other parse yields\n // `undefined` and falls through.\n return {\n book: topMatch.book,\n chapterNum: highlightedChapter ?? topMatch.chapterNum ?? 1,\n verseNum: highlightedVerse ?? topMatch.verseNum ?? 1,\n };\n }, [topMatch, commandValue]);\n\n // Surface open/close transitions to the parent. Fires only on the true boolean flip, not on\n // internal back-navigation (verses → chapters → books) which is handled without closing the\n // popover. Skip the initial mount run so callers don't see a spurious `onOpenChange(false)`\n // before any interaction — that phantom close has tripped parent focus-restore logic.\n const didMountRef = useRef(false);\n useEffect(() => {\n if (!didMountRef.current) {\n didMountRef.current = true;\n return;\n }\n onOpenChange?.(isCommandOpen);\n }, [isCommandOpen, onOpenChange]);\n\n // #endregion\n\n // #region Submitting references\n\n const handleTopMatchSelect = useCallback(() => {\n if (!topMatchReference) return;\n if (\n disableReferencesUpTo &&\n isVerseBefore(\n topMatchReference.book,\n topMatchReference.chapterNum,\n topMatchReference.verseNum,\n disableReferencesUpTo,\n )\n ) {\n return;\n }\n handleSubmitAndAddToRecent(topMatchReference);\n setIsCommandOpen(false);\n setInputValue('');\n setCommandValue(''); // Reset command value\n }, [handleSubmitAndAddToRecent, topMatchReference, disableReferencesUpTo]);\n\n const handleVerseSelect = useCallback(\n (verseNumber: number) => {\n const bookId = selectedBookForVersesView ?? topMatch?.book;\n const chapterNum = selectedChapterForVersesView ?? topMatch?.chapterNum;\n if (!bookId || !chapterNum) return;\n\n handleSubmitAndAddToRecent({\n book: bookId,\n chapterNum,\n verseNum: verseNumber,\n });\n // Don't reset view / selection state here — `handleOpenChange(true)` does that\n // when the popover reopens. Resetting now causes a flicker: the popover's fade-out\n // animation would otherwise render the book list for a frame before unmounting.\n setIsCommandOpen(false);\n },\n [handleSubmitAndAddToRecent, selectedBookForVersesView, selectedChapterForVersesView, topMatch],\n );\n\n const handleBookSelect = useCallback(\n (bookId: string) => {\n if (disableReferencesUpTo && isBookBefore(bookId, disableReferencesUpTo)) return;\n // Check if book has chapters - if not, submit immediately\n const endChapter = fetchEndChapter(bookId);\n if (endChapter <= 1) {\n handleSubmitAndAddToRecent({\n book: bookId,\n chapterNum: 1,\n verseNum: 1,\n });\n setIsCommandOpen(false);\n setInputValue('');\n return;\n }\n\n // Book has multiple chapters - transition to chapter view\n setSelectedBookForChaptersView(bookId);\n setViewMode('chapters');\n },\n [handleSubmitAndAddToRecent, disableReferencesUpTo],\n );\n\n const handleChapterSelect = useCallback(\n (chapterNumber: number) => {\n // Determine which book we're selecting a chapter for\n const bookId = viewMode === 'chapters' ? selectedBookForChaptersView : topMatch?.book;\n if (!bookId) return;\n\n // If verse selection is enabled and the chapter has multiple verses, transition to verse view\n if (getEndVerse) {\n const endVerse = getEndVerse(bookId, chapterNumber);\n if (endVerse > 1) {\n setSelectedBookForVersesView(bookId);\n setSelectedChapterForVersesView(chapterNumber);\n setViewMode('verses');\n setCommandValue('');\n return;\n }\n }\n\n handleSubmitAndAddToRecent({\n book: bookId,\n chapterNum: chapterNumber,\n verseNum: 1,\n });\n // See `handleVerseSelect` — skip the view/selection reset to avoid a flicker\n // back to the book list during the popover's fade-out animation.\n setIsCommandOpen(false);\n },\n [handleSubmitAndAddToRecent, viewMode, selectedBookForChaptersView, topMatch, getEndVerse],\n );\n\n const handleRecentItemSelect = useCallback(\n (item: SerializedVerseRef) => {\n handleSubmitAndAddToRecent(item);\n setIsCommandOpen(false);\n setInputValue('');\n },\n [handleSubmitAndAddToRecent],\n );\n\n // #endregion\n\n // #region Navigation and view changes\n\n // Hook that provides navigation buttons for quick chapter/verse navigation\n // The collapsed list is the books the user has opted into, so quick navigation stays inside them\n // until the list is expanded.\n const quickNavButtons = useQuickNavButtons(\n scrRef,\n isShowingMoreBooks ? reachableBooks : projectBooks,\n direction,\n handleSubmit,\n localizedStrings,\n );\n\n // Editing the query hands the keyboard back to the text: the user is typing a reference again,\n // so the horizontal arrows have to be able to reach what they typed.\n const handleInputValueChange = useCallback((nextInputValue: string) => {\n setInputValue(nextInputValue);\n setHasPreviewGridKeyboardControl(false);\n }, []);\n\n const handleBackToBooks = useCallback(() => {\n setViewMode('books');\n setSelectedBookForChaptersView(undefined);\n setSelectedBookForVersesView(undefined);\n setSelectedChapterForVersesView(undefined);\n // The books view is reached with the caret back in the search input, so the preview grid starts\n // without the keyboard however the user left it last time.\n setHasPreviewGridKeyboardControl(false);\n\n // Focus the search input when returning to book view\n setTimeout(() => {\n commandInputRef.current?.focus();\n }, 0);\n }, []);\n\n const handleBackToChapters = useCallback(() => {\n // Preserve selectedBookForChaptersView for the chapter view; reset verse state\n const previouslySelectedBook = selectedBookForVersesView;\n setSelectedBookForVersesView(undefined);\n setSelectedChapterForVersesView(undefined);\n\n if (previouslySelectedBook) {\n setSelectedBookForChaptersView(previouslySelectedBook);\n setViewMode('chapters');\n setCommandValue('');\n } else {\n handleBackToBooks();\n }\n }, [selectedBookForVersesView, handleBackToBooks]);\n\n // Reset view state when popover opens. Close requests always close the popover —\n // `Escape`, outside-click, and any other Radix-initiated dismiss route through here and\n // the user expects them to dismiss the whole picker. Stepping back through views is the\n // back button's job; trying to double-duty dismiss as \"go up one level\" silently rewinds\n // the user's selection when Radix fires a close for a transient reason (focus blip, click\n // in a non-item padding area, etc.).\n const handleOpenChange = useCallback(\n (shouldCommandBeOpen: boolean) => {\n setIsCommandOpen(shouldCommandBeOpen);\n if (shouldCommandBeOpen) {\n setViewMode('books');\n setSelectedBookForChaptersView(undefined);\n setSelectedBookForVersesView(undefined);\n setSelectedChapterForVersesView(undefined);\n setInputValue('');\n setHasPreviewGridKeyboardControl(false);\n setIsHeaderControlFocused(false);\n // Seed, don't force: the list opens expanded when the current book is outside the project so\n // that book is visible, and the toggle still collapses from there.\n setIsShowingMoreBooks(isCurrentBookOutsideProject);\n }\n },\n [isCurrentBookOutsideProject],\n );\n\n // `disabled` on the trigger button only prevents OPENING the popover — it does not affect one\n // that is already open, which would otherwise keep accepting input and submit a reference for a\n // control the UI reports as non-interactive (e.g. the toolbar's navigation target disappearing\n // mid-interaction). Close it when the control becomes disabled.\n useEffect(() => {\n if (disabled) handleOpenChange(false);\n }, [disabled, handleOpenChange]);\n\n // Imperative `open()` goes through handleOpenChange (not setIsCommandOpen directly) so the\n // deferred view-state reset runs: the control deliberately leaves stale chapters/verses view\n // state behind on close (see handleVerseSelect / handleChapterSelect) and only resets it when\n // the popover opens. Callers like the Ctrl+B command can't know what view the control was last\n // left in, and CommandInput only renders in 'books' view — without the reset, focus would no-op.\n //\n // Focusing the search input is driven by this request counter (each `open()` call increments\n // it) rather than a `setTimeout` so the focus effect below runs after the commit that actually\n // rendered the popover's books-view CommandInput, even if that render takes longer than a tick.\n const [focusSearchInputRequestId, setFocusSearchInputRequestId] = useState(0);\n\n useEffect(() => {\n if (focusSearchInputRequestId === 0) return;\n commandInputRef.current?.focus();\n }, [focusSearchInputRequestId]);\n\n useImperativeHandle(\n ref,\n () => ({\n open: () => {\n // Match the trigger button: a disabled control cannot be opened imperatively either\n if (disabled) return;\n handleOpenChange(true);\n setFocusSearchInputRequestId((requestId) => requestId + 1);\n },\n }),\n [handleOpenChange, disabled],\n );\n\n // #endregion\n\n // #region Helper functions and variables\n\n const { otLong, ntLong, dcLong, extraLong } = {\n otLong: localizedStrings?.['%scripture_section_ot_long%'],\n ntLong: localizedStrings?.['%scripture_section_nt_long%'],\n dcLong: localizedStrings?.['%scripture_section_dc_long%'],\n extraLong: localizedStrings?.['%scripture_section_extra_long%'],\n };\n\n const getSectionLabel = useCallback(\n (section: Section): string => {\n return getSectionLongName(section, otLong, ntLong, dcLong, extraLong);\n },\n [otLong, ntLong, dcLong, extraLong],\n );\n\n const doesChapterMatch = useCallback(\n (chapter: number) => {\n if (!topMatch) return false;\n return !!topMatch.chapterNum && !chapter.toString().includes(topMatch.chapterNum.toString());\n },\n [topMatch],\n );\n\n /** The complete reference. Rendered at the widest step, and carried in the tooltip at every step. */\n const currentDisplayValue = useMemo(\n () =>\n formatScrRef(\n scrRef,\n localizedBookNames ? getLocalizedBookName(scrRef.book, localizedBookNames) : 'English',\n ),\n [scrRef, localizedBookNames],\n );\n\n /**\n * The book in whichever form the current step calls for: spelled out when there is room, the\n * abbreviated id from step 1 on. Both helpers already handle the no-localization fallback\n * (`Canon.bookIdToEnglishName` / the uppercase id), so this needs no new data and no new\n * localized strings.\n */\n const bookLabel = useMemo(\n () =>\n shrinkStep >= SHRINK_STEP.TIGHT\n ? getLocalizedBookId(scrRef.book, localizedBookNames)\n : getLocalizedBookName(scrRef.book, localizedBookNames),\n [scrRef.book, localizedBookNames, shrinkStep],\n );\n\n const chapterVerseLabel = `${scrRef.chapterNum}:${scrRef.verseNum}`;\n\n const setChapterRef = useCallback((chapter: number) => {\n return (element: HTMLDivElement | null) => {\n chapterRefs.current[chapter] = element;\n };\n }, []);\n\n const setVerseRef = useCallback((verse: number) => {\n return (element: HTMLDivElement | null) => {\n verseRefs.current[verse] = element;\n };\n }, []);\n\n // Whether the current input contains a chapter-verse separator (colon)\n const hasVerseSeparatorInInput = useMemo(\n () => hasChapterVerseSeparator(inputValue),\n [inputValue],\n );\n\n // Whether we should show a verse grid for the current top match\n const shouldShowVerseGridForTopMatch = useMemo(() => {\n if (!getEndVerse || !topMatch || !topMatch.chapterNum) return false;\n if (!hasVerseSeparatorInInput) return false;\n return getEndVerse(topMatch.book, topMatch.chapterNum) > 0;\n }, [getEndVerse, topMatch, hasVerseSeparatorInInput]);\n\n // Only offer the expansion while browsing: searching already spans every reachable book, so the\n // control would sit there doing nothing.\n // `!isCommandListHidden` because the toggle governs that list: quick navigation hides it while\n // leaving viewMode 'books', and a control offering to expand a list that is not on screen does\n // nothing a user can see.\n const canShowMoreBooksToggle =\n viewMode === 'books' &&\n !isCommandListHidden &&\n !inputValue.trim() &&\n booksOutsideProject.size > 0;\n\n const isBookDisabled = useCallback(\n (bookId: string) =>\n disableReferencesUpTo ? isBookBefore(bookId, disableReferencesUpTo) : false,\n [disableReferencesUpTo],\n );\n\n const makeIsChapterDisabled = useCallback(\n (bookId: string) => (chapter: number) =>\n disableReferencesUpTo ? isChapterBefore(bookId, chapter, disableReferencesUpTo) : false,\n [disableReferencesUpTo],\n );\n\n const makeIsVerseDisabled = useCallback(\n (bookId: string, chapterNum: number) => (verse: number) =>\n disableReferencesUpTo\n ? isVerseBefore(bookId, chapterNum, verse, disableReferencesUpTo)\n : false,\n [disableReferencesUpTo],\n );\n\n // `||`, not `??`, throughout: an absent translation can come back as an empty string, which `??`\n // would pass straight through as a blank label. `||` falls back to the English text instead.\n // A key with no entry at all resolves to the key itself, which is truthy and so renders raw as\n // `%key%`; that case is guarded by `book-chapter-control-localization.test.ts`, which fails if any\n // key in `BOOK_CHAPTER_CONTROL_STRING_KEYS` lacks an English value.\n const selectChapterTitle = resolveLocalizedString(\n localizedStrings?.['%webView_bookChapterControl_selectChapter%'],\n 'Select chapter',\n );\n const selectVerseTitle = resolveLocalizedString(\n localizedStrings?.['%webView_bookChapterControl_selectVerse%'],\n 'Select verse',\n );\n const backLabel =\n viewMode === 'verses'\n ? resolveLocalizedString(\n localizedStrings?.['%webView_bookChapterControl_backToChapters%'],\n 'Back to chapters',\n )\n : resolveLocalizedString(\n localizedStrings?.['%webView_bookChapterControl_backToBooks%'],\n 'Back to books',\n );\n const bookNotInProjectLabel = resolveLocalizedString(\n localizedStrings?.['%webView_bookChapterControl_bookNotInProject%'],\n 'Not in project',\n );\n const bookNotInProjectDescriptionTemplate = resolveLocalizedString(\n localizedStrings?.['%webView_bookChapterControl_bookNotInProjectDescription%'],\n '{book} is not in this project',\n );\n // A localized template that places the book itself, rather than appending the short label to a\n // name here: word order, punctuation, and any inflection of the name belong to the translation.\n // Substitutes the same `Name (ID)` form BookItem announces for an undimmed row, so the id is not\n // dropped from a dimmed row's accessible name and both read alike.\n const getBookNotInProjectDescription = useCallback(\n (bookId: string) =>\n formatReplacementString(bookNotInProjectDescriptionTemplate, {\n book: `${getLocalizedBookName(bookId, localizedBookNames)} (${getLocalizedBookId(\n bookId,\n localizedBookNames,\n )})`,\n }),\n [bookNotInProjectDescriptionTemplate, localizedBookNames],\n );\n const showMoreBooksLabel = resolveLocalizedString(\n localizedStrings?.['%webView_bookChapterControl_showMoreBooks%'],\n 'Show more books',\n );\n const showProjectBooksOnlyLabel = resolveLocalizedString(\n localizedStrings?.['%webView_bookChapterControl_showProjectBooksOnly%'],\n 'Show project books only',\n );\n\n // #endregion\n\n // #region Keyboard handling\n\n // Handle keyboard navigation for CommandInput\n const handleInputKeyDown = useCallback(\n (event: KeyboardEvent) => {\n // Override default Home and End key behavior to work normally for cursor movement.\n // Default behavior was to jump to the start/end of the list of items in the Command\n if (event.key === 'Home' || event.key === 'End') {\n event.stopPropagation(); // Prevent Command component from handling these\n }\n\n // Callers can declare extra submit keys (e.g. space and `-` for range pickers). We\n // only submit when the typed input resolves to a fully-qualified reference (book\n // AND chapter AND verse) — a partial match like \"GEN\" or \"GEN 1\" would be ambiguous\n // as an auto-complete from a separator keystroke, so we leave those for the user to\n // finish. When we do submit, consume the keystroke so the character doesn't end up\n // in the input after the popover closes.\n if (\n submitKeys &&\n submitKeys.includes(event.key) &&\n topMatch &&\n topMatch.chapterNum !== undefined &&\n topMatch.verseNum !== undefined\n ) {\n event.preventDefault();\n event.stopPropagation();\n handleTopMatchSelect();\n }\n },\n [submitKeys, topMatch, handleTopMatchSelect],\n );\n\n // Grid-aware keyboard navigation using Command's controlled value\n const handleCommandKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (event.ctrlKey) return;\n\n const eventTarget = event.target instanceof HTMLElement ? event.target : undefined;\n\n // The recent-searches list portals out to `body`, but it stays a React child of this popover,\n // so its keydowns still arrive at this capture-phase handler — ahead of the list's own\n // bubble-phase navigation. Not one of them is ours to claim: while that list is open it owns\n // every key the user presses, and taking arrows or Enter here would leave it unnavigable and\n // submit a reference out from under it. Both roles matter, because the list is focused in two\n // stages: Radix focuses the CONTENT (`role=\"menu\"`) when it opens and only moves focus onto a\n // row (`role=\"menuitem\"`) once the user arrows.\n //\n // Asking only \"is this inside a menu?\" is not enough, because THIS PICKER can itself live\n // inside one: `ScopeSelector`'s Navigate footer renders it in a `DropdownMenuItem` and\n // portals its popover into the `DropdownMenuContent` (`PopoverPortalContainerProvider`, a\n // pattern `popover.tsx` documents). Every keystroke in the grid would then have `role=\"menu\"`\n // as an ancestor, and this bail would disable the whole control there. So the question is\n // whether the keystroke landed OUTSIDE the cmdk surface this handler drives.\n const isInOwnCommandSurface = !!eventTarget && !!commandRef.current?.contains(eventTarget);\n if (!isInOwnCommandSurface && eventTarget?.closest('[role=\"menu\"], [role=\"menuitem\"]'))\n return;\n\n // Tab keeps focus inside the picker instead of dismissing it. Radix closes a non-modal\n // popover as soon as focus leaves it, and the chapter and verse views offer no tab stop of\n // their own — the back button is deliberately out of the tab order — so every Tab there lands\n // outside and takes the whole picker down, dropping the user back to the trigger with their\n // book and chapter choice discarded. Cycle through the current view's own stops instead (the\n // books view has the search input, the recent-searches trigger, the quick-nav arrows and the\n // show-more toggle) and swallow the key outright when the view has none. Escape still\n // dismisses, so this traps Tab rather than the user.\n if (event.key === 'Tab') {\n const tabStops = commandRef.current ? getTabStops(commandRef.current) : [];\n if (tabStops.length === 0) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n const lastStop = tabStops[tabStops.length - 1];\n const edge = event.shiftKey ? tabStops[0] : lastStop;\n if (document.activeElement === edge) {\n event.preventDefault();\n event.stopPropagation();\n (event.shiftKey ? lastStop : tabStops[0]).focus();\n }\n return;\n }\n\n const { isLetter, isDigit } = getKeyCharacterType(event.key);\n\n // Enter / Space pick the highlighted chapter / verse. cmdk binds Enter natively on\n // the Command root, but a grid picker reads more like \"activate the focused cell\"\n // than an input form, so we centralize both keys here and let the `data-selected`\n // item drive the submit. When focus is on a natively interactive element (the back\n // button), yield: the browser's own activation (click on Enter keydown / Space\n // keyup) should run the button's `onClick`, not submit a grid cell. We still\n // `stopPropagation` so cmdk's Enter handler doesn't ALSO fire in parallel and\n // submit the highlighted chapter while the back button is being pressed.\n if (\n (viewMode === 'chapters' || viewMode === 'verses') &&\n (event.key === ' ' || event.key === 'Enter')\n ) {\n const isTargetInteractive = !!eventTarget?.closest(\n 'button, a, input, select, textarea, [role=\"button\"]',\n );\n if (isTargetInteractive) {\n // Don't preventDefault — browser-native activation (Enter → click, Space →\n // click on keyup) must still reach the button's onClick.\n event.stopPropagation();\n return;\n }\n // Activate the highlighted cell by calling the same handler its onSelect would, using the\n // item number we already hold in `commandValue`. Reading cmdk's private DOM attributes\n // (`cmdk-item`, `data-selected`, `data-disabled`) and synthesizing a click would tie\n // activation to library internals that nothing of ours pins.\n const activation = (() => {\n if (viewMode === 'verses') {\n const bookId = selectedBookForVersesView;\n const chapterNum = selectedChapterForVersesView;\n const verse = parseVerseFromItemValue(commandValue);\n if (!bookId || !chapterNum || verse === undefined) return undefined;\n return {\n isDisabled: makeIsVerseDisabled(bookId, chapterNum)(verse),\n activate: () => handleVerseSelect(verse),\n };\n }\n const bookId = selectedBookForChaptersView;\n const chapter = parseChapterFromItemValue(commandValue);\n if (!bookId || chapter === undefined) return undefined;\n return {\n isDisabled: makeIsChapterDisabled(bookId)(chapter),\n activate: () => handleChapterSelect(chapter),\n };\n })();\n\n if (activation) {\n event.preventDefault();\n event.stopPropagation();\n // Skip activation when the cell is disabled, checking the same predicate the grid\n // renders it with — activation has no DOM node here to read a disabled state from.\n if (!activation.isDisabled) activation.activate();\n return;\n }\n }\n\n // Enter over a top match submits the reference its row displays. The preview grid owns the\n // highlight, so cmdk would otherwise dispatch Enter at the highlighted cell — which knows\n // only a chapter and would drop the verse the user typed. Space is deliberately not included:\n // the books view is a text field, where a space is a character.\n //\n // `!isCommandListHidden` for the same reason the arrow branch below checks it: quick\n // navigation unmounts the list, taking the top-match row with it, while `topMatch` still\n // reflects the stale query. Submitting it there would silently undo the quick-nav step the\n // user just took, with nothing on screen that named the reference being submitted.\n if (viewMode === 'books' && topMatch && !isCommandListHidden && event.key === 'Enter') {\n // The header's own controls (quick navigation, the recent-searches trigger) keep their\n // activation, and so does any input that isn't this picker's search box. The\n // recent-searches list itself never gets this far — the portalled-menu bail at the top of\n // this handler returns before any of these branches run.\n //\n // Excluding the search box is load-bearing, not a special case: it is itself an `input`, so\n // without this it would match the selector below and Enter — the normal way to commit a\n // typed reference — would never submit anything. The chapters/verses branch above needs no\n // such exclusion because the search box is not rendered in those views.\n const isTargetInteractive =\n eventTarget !== commandInputRef.current &&\n !!eventTarget?.closest('button, a, input, select, textarea, [role=\"button\"]');\n if (!isTargetInteractive) {\n event.preventDefault();\n event.stopPropagation();\n handleTopMatchSelect();\n return;\n }\n }\n\n // Letter / digit keys in chapter or verse view do nothing: the filter input isn't\n // visible there, so forwarding keystrokes to it would silently exit the grid\n // (jumping back to the book list and typing into the hidden input). Users stay\n // on the current page; Backspace is the explicit way back.\n if ((viewMode === 'chapters' || viewMode === 'verses') && (isLetter || isDigit)) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n // Backspace steps back one level: verses to chapters, chapters to books. This is the\n // keyboard counterpart to the header's back button, which is deliberately out of the tab\n // order, so it is the only way a keyboard user leaves a grid without committing a reference.\n if (event.key === 'Backspace' && (viewMode === 'chapters' || viewMode === 'verses')) {\n event.preventDefault();\n event.stopPropagation();\n if (viewMode === 'verses') handleBackToChapters();\n else handleBackToBooks();\n return;\n }\n\n // Narrows `event.key` to `ArrowKey` for `computeTargetGridItem` below, and leaves every\n // non-arrow key to cmdk.\n if (!isArrowKey(event.key)) return;\n\n // Quick navigation hides the whole list, and with it the top-match row and the preview grid\n // this handler would be steering. There is nothing on screen for an arrow to move, so\n // claiming one would swallow the keystroke — denying it both to cmdk and to the quick-nav\n // buttons' own focus-restore. The `fetchEndChapter(...) > 1` conjunct in the grid resolver\n // below exists for the same reason; this is the other half of \"is a grid actually rendered\".\n if (isCommandListHidden) return;\n\n // In the books view the search input keeps focus, so a horizontal arrow is first of all a\n // caret key: it belongs to the grid only once the caret has nowhere left to go in that\n // direction — the same rule a combobox uses, and the same reasoning that forwards Home and End\n // to the input. Claiming it unconditionally freezes the caret mid-query AND quietly retargets\n // what Enter submits, because the top-match row prefers the highlighted cell over the parsed\n // query: pressing ArrowLeft to edit the verse in \"mat 12:15\" would step the highlight to 14\n // and submit a verse that was never typed. The dedicated chapter and verse views render no\n // input and take all four arrows.\n //\n // Once the user has stepped into the preview grid, though, they are navigating cells and the\n // whole grid answers to the arrows. Leaving the horizontal pair on the caret strands them\n // there: able to move the highlight down a row but never back along one. The vertical arrows\n // are the way in (they were never caret keys) and editing the query is the way out, so the\n // caret is never taken away from someone who is still typing.\n if (\n viewMode === 'books' &&\n !hasPreviewGridKeyboardControl &&\n (event.key === 'ArrowLeft' || event.key === 'ArrowRight')\n ) {\n // Only when the caret is actually IN the input. An `` keeps its selection offsets\n // after blur, so reading them unconditionally would yield the key to a caret that cannot\n // move — and cmdk binds no horizontal arrows on the Command root, so the keystroke would do\n // nothing at all.\n const input = eventTarget === commandInputRef.current ? commandInputRef.current : undefined;\n const caretStart = input?.selectionStart ?? 0;\n const caretEnd = input?.selectionEnd ?? 0;\n // Which arrow walks toward the start of the text is a property of the layout, not of the\n // key: in a right-to-left field the leftmost character is the LAST one.\n const isTowardTextStart =\n direction === 'rtl' ? event.key === 'ArrowRight' : event.key === 'ArrowLeft';\n const canCaretMove =\n !!input &&\n (caretStart !== caretEnd ||\n (isTowardTextStart ? caretStart > 0 : caretEnd < input.value.length));\n if (canCaretMove) return;\n }\n\n // Shift+arrow is a selection gesture, not a navigation one: in the search box it extends the\n // text selection, and the grid has no notion of a range. Leave it to whatever has focus.\n if (event.shiftKey) return;\n\n // Arrows aimed at a focused header control belong to that control — the quick-nav buttons use\n // ArrowUp / ArrowDown to hand focus back to the search input. The books view's preview grid is\n // steered from the input and never holds focus itself, so it has no claim on those.\n if (\n viewMode === 'books' &&\n eventTarget !== commandInputRef.current &&\n eventTarget?.closest('button, a, [role=\"button\"]')\n )\n return;\n\n // Chapters and verses differ only in where the item count comes from and how an item's\n // cmdk value is spelled. Everything else — reading the current highlight, computing the\n // target, writing it back, scrolling it into view — is identical, so it lives in one place\n // and a fix cannot land in only one grid.\n //\n // Select by the grid that is actually rendered, not by view mode: the books view shows a\n // VERSE preview grid whenever the query carries a chapter-verse separator, and driving that\n // with chapter arithmetic writes a value no verse cell can match, blanking the highlight.\n const grid = (() => {\n const versePreviewInBooksView =\n viewMode === 'books' && topMatch && shouldShowVerseGridForTopMatch && topMatch.chapterNum\n ? { bookId: topMatch.book, chapterNum: topMatch.chapterNum }\n : undefined;\n const verseTarget =\n viewMode === 'verses'\n ? { bookId: selectedBookForVersesView, chapterNum: selectedChapterForVersesView }\n : versePreviewInBooksView;\n\n if (verseTarget) {\n const { bookId, chapterNum } = verseTarget;\n if (!bookId || !chapterNum || !getEndVerse) return undefined;\n return {\n max: getEndVerse(bookId, chapterNum),\n current: parseVerseFromItemValue(commandValue) ?? 0,\n buildValue: (item: number) => verseItemValue(bookId, chapterNum, item),\n refs: verseRefs,\n // In books view focus stays on the CommandInput so the user can keep typing; only\n // the dedicated grid views pull focus off the back button.\n takeFocus: viewMode === 'verses',\n };\n }\n\n // The books view renders its chapter preview only for books with more than one chapter, so\n // a single-chapter top match (Jude, Obadiah, Philemon, 2-3 John) has no grid to drive. Claim\n // the keystroke there and it would write a chapter value no rendered item carries, blanking\n // the highlight; let it fall through to cmdk so the list stays navigable instead.\n if (\n viewMode === 'chapters' ||\n (viewMode === 'books' && topMatch && fetchEndChapter(topMatch.book) > 1)\n ) {\n const bookId = viewMode === 'chapters' ? selectedBookForChaptersView : topMatch?.book;\n if (!bookId) return undefined;\n return {\n max: fetchEndChapter(bookId),\n current: parseChapterFromItemValue(commandValue) ?? 0,\n buildValue: (item: number) => chapterItemValue(bookId, item),\n refs: chapterRefs,\n takeFocus: viewMode === 'chapters',\n };\n }\n return undefined;\n })();\n\n if (!grid) return;\n\n // A non-positive count means the Scripture data has no chapter/verse count for this book\n // (deuterocanonical books come back as -1). Navigating with it produces a highlight value\n // no grid cell can match, which silently blanks the highlight.\n if (grid.max <= 0) return;\n\n // The grid is taking this key, so from here it owns the keyboard and the horizontal arrows\n // follow the vertical ones into it. Set before the clamp below, because entering the grid is\n // the point even on the press that cannot move the highlight — in a single-row grid\n // (Lamentations has five chapters) ArrowDown has nowhere to go, and a user who could not get\n // the arrows to follow would have no way in at all. Only the books view tracks this; the\n // dedicated grid views have no caret competing for the keys.\n if (viewMode === 'books') setHasPreviewGridKeyboardControl(true);\n\n if (grid.takeFocus) {\n // Arrow keys drive the grid now — pull focus off the back button (the only natively\n // focusable element in these views) so its focus ring doesn't compete with the grid's\n // highlight. The Command root carries tabIndex={-1} from cmdk, so it is a valid focus\n // target and PopoverContent's capture-phase key handling keeps working.\n commandRef.current?.focus();\n }\n\n const target = computeTargetGridItem({\n current: grid.current,\n key: event.key,\n max: grid.max,\n direction,\n });\n\n // An arrow key aimed at the grid belongs to the grid even when the highlight does not move.\n // The Command root navigates with `loop`, so releasing a clamped keystroke to it would wrap\n // the highlight to the opposite edge — precisely what clamping exists to prevent.\n event.preventDefault();\n event.stopPropagation();\n\n if (target === grid.current) return;\n\n setCommandValue(grid.buildValue(target));\n\n const targetElement = grid.refs.current[target];\n if (targetElement) targetElement.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n },\n [\n viewMode,\n topMatch,\n shouldShowVerseGridForTopMatch,\n isCommandListHidden,\n hasPreviewGridKeyboardControl,\n direction,\n handleBackToBooks,\n handleBackToChapters,\n handleChapterSelect,\n handleTopMatchSelect,\n handleVerseSelect,\n makeIsChapterDisabled,\n makeIsVerseDisabled,\n selectedBookForChaptersView,\n selectedBookForVersesView,\n selectedChapterForVersesView,\n getEndVerse,\n commandValue,\n ],\n );\n\n const handleQuickNavButtonKeyDown = useCallback((event: KeyboardEvent) => {\n if (event.shiftKey || event.key === 'Tab' || event.key === ' ') return;\n\n // Enter must activate the focused quick-nav button the way any other button\n // would. The browser turns keydown Enter into a click automatically, but cmdk's\n // onKeyDown on the Command root (an ancestor) would fire next and call\n // `event.preventDefault()` in its Enter branch — canceling that click synthesis\n // and submitting the highlighted book list item instead of running the\n // quick-nav handler. Stop propagation here (button onKeyDown runs before the\n // ancestor's) so cmdk never sees the Enter. Do NOT preventDefault — that's\n // what the browser uses to produce the click on the button.\n if (event.key === 'Enter') {\n event.stopPropagation();\n return;\n }\n\n // Up / Down signal the user wants to walk the book list. cmdk's arrow-key\n // handler on the Command root takes care of moving the `data-selected`\n // highlight (the keydown keeps bubbling up past us to reach it), but the\n // quick-nav button's focus ring would otherwise linger and compete with\n // the cmdk highlight. Pull focus to the search input — the visual focus\n // state that a user expects to see during book-list navigation.\n if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {\n commandInputRef.current?.focus();\n return;\n }\n\n const { isLetter, isDigit } = getKeyCharacterType(event.key);\n\n if (isLetter || isDigit) {\n event.preventDefault();\n\n setInputValue((prevValue) => prevValue + event.key);\n commandInputRef.current?.focus();\n\n setIsCommandListHidden(false);\n }\n }, []);\n\n // #endregion\n\n // #region Auto-scroll\n\n // Auto-scroll to currently selected book when dropdown opens in book view\n useLayoutEffect(() => {\n const scrollTimeout = setTimeout(() => {\n if (\n isCommandOpen &&\n viewMode === 'books' &&\n commandListRef.current &&\n selectedBookItemRef.current\n ) {\n const listElement = commandListRef.current;\n const itemElement = selectedBookItemRef.current;\n\n // Calculate scroll position to center the selected item\n const itemOffsetTop = itemElement.offsetTop;\n const listHeight = listElement.clientHeight;\n const itemHeight = itemElement.clientHeight;\n const scrollPosition = itemOffsetTop - listHeight / 2 + itemHeight / 2;\n\n listElement.scrollTo({\n top: Math.max(0, scrollPosition),\n behavior: 'smooth',\n });\n\n // Set the selected book as the active item for keyboard navigation\n setCommandValue(generateCommandValue(scrRef.book));\n }\n }, 0);\n\n return () => {\n clearTimeout(scrollTimeout);\n };\n }, [isCommandOpen, viewMode, inputValue, topMatch, scrRef.book]);\n\n // Auto-scroll to appropriate chapter\n useLayoutEffect(() => {\n if (viewMode === 'chapters' && selectedBookForChaptersView) {\n // Check if we're entering chapter view for the currently selected book\n const isCurrentlySelectedBook = selectedBookForChaptersView === scrRef.book;\n const initialChapter = isCurrentlySelectedBook ? scrRef.chapterNum : 1;\n\n // Seed commandValue to the starting chapter so arrow-key navigation has a concrete\n // starting point (see handleCommandKeyDown) and cmdk visibly highlights that chapter\n // even when focus is pinned on the PopoverContent wrapper by Radix's FocusScope in\n // modal mode.\n setCommandValue(chapterItemValue(selectedBookForChaptersView, initialChapter));\n\n // Reset scroll position to top, except when viewing the currently selected book\n setTimeout(() => {\n if (commandListRef.current) {\n if (isCurrentlySelectedBook) {\n // Scroll to the currently selected chapter\n const targetElement = chapterRefs.current[scrRef.chapterNum];\n if (targetElement) {\n targetElement.scrollIntoView({ block: 'center', behavior: 'smooth' });\n }\n } else {\n // Reset to top for other books\n commandListRef.current.scrollTo({ top: 0 });\n }\n }\n\n // Ensure Command component has focus for keyboard navigation\n if (commandRef.current) {\n commandRef.current.focus();\n }\n }, 0);\n }\n }, [viewMode, selectedBookForChaptersView, topMatch, scrRef.book, scrRef.chapterNum]);\n\n // Auto-scroll to appropriate verse\n useLayoutEffect(() => {\n if (\n viewMode === 'verses' &&\n selectedBookForVersesView &&\n selectedChapterForVersesView !== undefined\n ) {\n const isCurrentlySelectedChapter =\n selectedBookForVersesView === scrRef.book &&\n selectedChapterForVersesView === scrRef.chapterNum;\n const initialVerse = isCurrentlySelectedChapter ? scrRef.verseNum : 1;\n\n // Seed commandValue so arrow-key navigation has a concrete starting verse and cmdk\n // highlights it when focus is pinned on the PopoverContent wrapper (modal FocusScope).\n setCommandValue(\n verseItemValue(selectedBookForVersesView, selectedChapterForVersesView, initialVerse),\n );\n\n setTimeout(() => {\n if (commandListRef.current) {\n if (isCurrentlySelectedChapter) {\n const targetElement = verseRefs.current[scrRef.verseNum];\n if (targetElement) {\n targetElement.scrollIntoView({ block: 'center', behavior: 'smooth' });\n }\n } else {\n commandListRef.current.scrollTo({ top: 0 });\n }\n }\n if (commandRef.current) {\n commandRef.current.focus();\n }\n }, 0);\n }\n }, [\n viewMode,\n selectedBookForVersesView,\n selectedChapterForVersesView,\n scrRef.book,\n scrRef.chapterNum,\n scrRef.verseNum,\n ]);\n\n // Identity of the reference the preview grid is seeded from. Built out of the parsed reference\n // and the kind of grid on screen, so it changes exactly when a fresh seed is wanted — editing\n // the query to a different reference — and not when the highlight merely moves.\n const previewSeedKey = topMatch\n ? `${topMatch.book} ${topMatch.chapterNum ?? ''} ${topMatch.verseNum ?? ''} ${shouldShowVerseGridForTopMatch}`\n : '';\n const seededPreviewKeyRef = useRef('');\n // The cmdk value of the preview cell the highlight last named.\n const highlightedPreviewCellRef = useRef('');\n\n // The preview grid the books view renders under the top-match row, or `undefined` when there is\n // none on screen. Both the seeding effect below and the controlled-value handler read this, so\n // they cannot disagree about whether a grid exists to hold the highlight.\n const previewGrid = useMemo(() => {\n if (viewMode !== 'books' || !topMatch || isCommandListHidden) return undefined;\n\n const { book, chapterNum, verseNum } = topMatch;\n if (shouldShowVerseGridForTopMatch && chapterNum && getEndVerse) {\n return {\n max: getEndVerse(book, chapterNum),\n initial:\n verseNum ??\n (book === scrRef.book && chapterNum === scrRef.chapterNum ? scrRef.verseNum : 1),\n parse: parseVerseFromItemValue,\n buildValue: (item: number) => verseItemValue(book, chapterNum, item),\n };\n }\n // A single-chapter book renders no chapter preview, so there is no cell for a seed to land on;\n // writing one would blank the highlight instead of placing it.\n const endChapter = fetchEndChapter(book);\n if (endChapter <= 1) return undefined;\n return {\n max: endChapter,\n initial: chapterNum ?? (book === scrRef.book ? scrRef.chapterNum : 1),\n parse: parseChapterFromItemValue,\n buildValue: (item: number) => chapterItemValue(book, item),\n };\n }, [\n viewMode,\n topMatch,\n isCommandListHidden,\n shouldShowVerseGridForTopMatch,\n getEndVerse,\n scrRef.book,\n scrRef.chapterNum,\n scrRef.verseNum,\n ]);\n\n // The books view shows a chapter (or verse) preview grid under the top-match row. Seed its\n // highlight the same way the chapters and verses views seed theirs, so every grid surface obeys\n // the same rule: exactly one cell is highlighted for as long as the grid is on screen, and arrow\n // keys only ever move it.\n //\n // Seeding is still an effect rather than part of the value handler above, because a fresh\n // reference arrives as a render (the query changed), not as a value request from cmdk. Running it\n // in a LAYOUT effect keeps the seed in the same commit, so no frame is ever painted with the\n // highlight off the grid. A new parsed reference seeds afresh; a highlight the user moved\n // survives.\n useLayoutEffect(() => {\n if (viewMode !== 'books' || !topMatch || !previewGrid || previewGrid.max <= 0) {\n seededPreviewKeyRef.current = '';\n return;\n }\n\n const { max, initial, parse, buildValue } = previewGrid;\n // Only a value this grid actually renders can carry the highlight, so anything out of range or\n // belonging to another book counts as \"off the grid\".\n const cellNamedBy = (value: string) => {\n const item = parse(value);\n return item !== undefined && item >= 1 && item <= max && value === buildValue(item)\n ? item\n : undefined;\n };\n\n if (seededPreviewKeyRef.current !== previewSeedKey) {\n seededPreviewKeyRef.current = previewSeedKey;\n const seeded = buildValue(Math.min(Math.max(initial, 1), max));\n highlightedPreviewCellRef.current = seeded;\n setCommandValue(seeded);\n return;\n }\n\n if (cellNamedBy(commandValue) !== undefined) {\n highlightedPreviewCellRef.current = commandValue;\n return;\n }\n\n setCommandValue(\n cellNamedBy(highlightedPreviewCellRef.current) !== undefined\n ? highlightedPreviewCellRef.current\n : buildValue(Math.min(Math.max(initial, 1), max)),\n );\n }, [viewMode, topMatch, previewGrid, previewSeedKey, commandValue]);\n\n // #endregion\n\n return (\n \n \n {\n // When `onPointerDownOutside` detected our trigger was clicked while the\n // popover was open, it already closed the popover and set this flag. Without\n // this guard, the click event reaches Radix's `onOpenToggle` which sees\n // `open=false` (we already closed it) and toggles it back to `true`, causing\n // the reopen. `event.preventDefault()` makes `composeEventHandlers` skip\n // `onOpenToggle` so the popover stays closed.\n if (justClosedByTriggerRef.current) {\n justClosedByTriggerRef.current = false;\n event.preventDefault();\n }\n }}\n >\n {triggerContent ?? (\n = SHRINK_STEP.TIGHT}\n fullText={currentDisplayValue}\n />\n )}\n {showTriggerChevron && (\n \n )}\n \n \n event.stopPropagation()}\n // Close-on-trigger-click while open: Radix's built-in DismissableLayer prevents\n // dismissal when the pointer target is the trigger (it treats that as \"user intends\n // to toggle, let the trigger's own onClick handle it\"). But in our controlled\n // Popover the trigger's `onOpenToggle` calls `onOpenChange(!open)` — by the time\n // the click fires, React may have already re-rendered with `open=false` (from a\n // prior close), so `!open = true` and the popover reopens. We intercept here:\n // close the popover early (before Radix's own dismiss path) and set\n // `justClosedByTriggerRef` so the trigger's `onClick` can call `preventDefault()`\n // which makes Radix's `composeEventHandlers` skip `onOpenToggle` entirely.\n //\n // Guard with `isCommandOpen`: PopoverContent stays mounted during the fade-out\n // animation after close, so this handler still fires for trigger clicks made while\n // the popover is animating out. Treating those as \"close\" would set the\n // `justClosedByTriggerRef` interlock and block the legitimate reopen click. Only\n // intercept when the popover is logically open.\n onPointerDownOutside={(event) => {\n const { target } = event;\n if (\n isCommandOpen &&\n triggerRef.current &&\n target instanceof Node &&\n triggerRef.current.contains(target)\n ) {\n // Mark that we're closing due to a trigger click so the subsequent `click`\n // event on the button (which would reopen the popover via Radix's\n // `onOpenToggle`) can be blocked. See `justClosedByTriggerRef`.\n justClosedByTriggerRef.current = true;\n handleOpenChange(false);\n }\n }}\n onCloseAutoFocus={onCloseAutoFocus}\n >\n \n \n {/* Header: Input (with quick nav buttons) for book view, fixed header for chapter view */}\n {viewMode === 'books' ? (\n {\n setIsHeaderControlFocused(event.target !== commandInputRef.current);\n }}\n onBlur={(event) => {\n // Moving between two buttons in this row fires a blur before the next focus.\n // Ignore it while focus is still landing inside the row, so the ring does not\n // flicker back on between the quick-nav arrows.\n if (event.currentTarget.contains(event.relatedTarget)) return;\n setIsHeaderControlFocused(false);\n }}\n >\n
\n setIsCommandListHidden(false)}\n className={recentSearches && recentSearches.length > 0 ? 'tw:pe-8!' : ''}\n // Picker semantics: with nothing typed, Space picks the highlighted book (the\n // Enter UX). Neither of this control's own Space handlers covers that state —\n // `handleInputKeyDown` claims a key only for a FULLY-qualified `submitKeys`\n // match (an empty input has no top match at all), and the `data-selected` grid\n // pick in `handleCommandKeyDown` is gated on the chapters and verses views,\n // while this input exists only in the books view. Space is still an ordinary\n // character once anything is typed, so \"1 Samuel\" stays searchable.\n spaceSelectsHighlightedItem\n />\n {recentSearches && recentSearches.length > 0 && (\n formatScrRef(verseRef, 'English')}\n getItemKey={(verseRef) =>\n `${verseRef.book}-${verseRef.chapterNum}-${verseRef.verseNum}`\n }\n ariaLabel={localizedStrings?.['%history_recentSearches_ariaLabel%']}\n groupHeading={localizedStrings?.['%history_recent%']}\n buttonClassName=\"tw:absolute tw:end-1 tw:top-1\"\n />\n )}\n
\n {/* Navigation buttons for previous/next chapter/verse. `ButtonGroup` (rather than a\n plain flex row) supplies the `role=\"group\"` that names these four as one control\n and matches NavigationHistoryButtons, the neighbouring toolbar control. `gap-1`\n overrides the group's default flush-edge packing, which would run the ghost\n buttons together. A separator marks each change of `group`, so chapter and verse\n controls stay visually distinct. */}\n {/* `h-8.5` on the buttons and `translate-y-px` here are tuned against the\n `CommandInput` beside them, which InputGroup fixes at `h-8`, in this `items-end`\n row — change them together if that height changes. */}\n \n {quickNavButtons.map(\n (\n { onClick, disabled: isQuickNavDisabled, title, icon: Icon, group },\n index,\n ) => {\n const quickNavButton = (\n {\n setIsCommandListHidden(true);\n onClick();\n }}\n disabled={isQuickNavDisabled}\n // `rounded-lg!` re-asserts all four corners against `ButtonGroup`'s\n // horizontal variant, which squares off the inner edges so that flush\n // buttons read as one bar. These four are not flush — `gap-1` on the\n // group separates them — so the squared edges buy nothing and cost\n // something: the focus ring traces the border radius, so tabbing along\n // the row produced a ring that changed shape from button to button. The\n // radius matches what `size=\"sm\"` already applies inside a button group,\n // so only the corners the group removed come back.\n className=\"tw:h-8.5 tw:w-6 tw:rounded-lg! tw:p-0\"\n aria-label={title}\n onKeyDown={handleQuickNavButtonKeyDown}\n >\n \n \n );\n\n return (\n // Keyed by position, not by `title`: the titles are localized, so they all\n // change together the moment the strings resolve or the UI language does.\n // Keying on them would remount all four buttons at that instant, dropping\n // focus off whichever one the user was on and destroying an open tooltip.\n // The set is fixed in size and order, so the index is stable.\n // eslint-disable-next-line react/no-array-index-key\n \n {index > 0 && group !== quickNavButtons[index - 1].group && (\n \n )}\n {isQuickNavDisabled ? (\n // A disabled Button carries `pointer-events: none` from its own base\n // variants, so it is not hit-tested: neither a Radix tooltip nor a\n // `title` ON THE BUTTON can ever fire. These arrows come back disabled\n // at the edges of the canon — Genesis 1:1 is the default state of a\n // freshly opened project — which is exactly where a user asks what the\n // button was for. The wrapper is still hit-tested, so the native\n // tooltip it carries is the one hover explanation available here.\n \n {quickNavButton}\n \n ) : (\n \n {quickNavButton}\n {title}\n \n )}\n \n );\n },\n )}\n \n \n ) : (\n
\n \n \n \n {direction === 'ltr' ? (\n \n ) : (\n \n )}\n \n \n {backLabel}\n \n {viewMode === 'chapters' && selectedBookForChaptersView && (\n \n {getLocalizedBookName(selectedBookForChaptersView, localizedBookNames)}\n \n )}\n {viewMode === 'verses' &&\n selectedBookForVersesView &&\n selectedChapterForVersesView !== undefined && (\n \n {`${getLocalizedBookName(selectedBookForVersesView, localizedBookNames)} ${selectedChapterForVersesView}`}\n \n )}\n \n {viewMode === 'verses' ? selectVerseTitle : selectChapterTitle}\n \n
\n )}\n\n {/** Body */}\n {!isCommandListHidden && (\n \n {/** Book list mode (also used in case of top matches) */}\n {viewMode === 'books' && (\n <>\n {/* Book List - Show when we don't have a top match */}\n {!topMatch &&\n Object.entries(filteredBooksByType).map(([type, books]) => {\n if (books.length === 0) return undefined;\n\n return (\n // We are mapping over filteredBooksByType, which uses Section as key type\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n \n {books.map((bookId) => (\n \n handleBookSelect(selectedBookId)\n }\n section={getSectionForBook(bookId)}\n commandValue={generateCommandValue(bookId)}\n suppressKeyboardHighlight={isHeaderControlFocused}\n ref={bookId === scrRef.book ? selectedBookItemRef : undefined}\n localizedBookNames={localizedBookNames}\n disabled={isBookDisabled(bookId)}\n dimmedReason={\n booksOutsideProject.has(bookId)\n ? bookNotInProjectLabel\n : undefined\n }\n dimmedDescription={\n booksOutsideProject.has(bookId)\n ? getBookNotInProjectDescription(bookId)\n : undefined\n }\n />\n ))}\n \n );\n })}\n\n {/* Top match scripture reference */}\n {topMatch && topMatchReference && (\n \n svg:last-child]:hidden\"\n >\n \n {formatScrRef(\n topMatchReference,\n getLocalizedBookName(topMatch.book, localizedBookNames),\n )}\n \n \n {getLocalizedBookId(topMatch.book, localizedBookNames)}\n \n \n \n )}\n\n {/* Verse selector - when chapter-verse separator is present in the input */}\n {topMatch &&\n shouldShowVerseGridForTopMatch &&\n topMatch.chapterNum &&\n getEndVerse && (\n // No heading over this grid: the top-match row sits directly above it and\n // already names the book and the reference the grid is refining, so a\n // heading here only repeated the book back to the user one line later. The\n // dedicated verses view still carries one, because there it is the only\n // thing naming the book.\n \n )}\n\n {/* Chapter Selector - Show when we have a top match without a verse separator */}\n {topMatch &&\n !shouldShowVerseGridForTopMatch &&\n fetchEndChapter(topMatch.book) > 1 && (\n // No heading here either, for the same reason as the verse preview above:\n // the top-match row directly above already names the book.\n \n )}\n \n )}\n\n {/* Basic chapter view mode */}\n {viewMode === 'chapters' && selectedBookForChaptersView && (\n \n )}\n\n {/* Verse view mode */}\n {viewMode === 'verses' &&\n selectedBookForVersesView &&\n selectedChapterForVersesView !== undefined &&\n getEndVerse && (\n \n )}\n \n )}\n\n {/* Outside CommandList on purpose: inside it, cmdk would register this as an option —\n arrow-navigable and matched by typing — instead of a control. */}\n {canShowMoreBooksToggle && (\n
\n setIsShowingMoreBooks((wasShowing) => !wasShowing)}\n >\n {isShowingMoreBooks ? showProjectBooksOnlyLabel : showMoreBooksLabel}\n \n
\n )}\n \n
\n \n
\n );\n}\n\nexport default BookChapterControl;\n","import { SerializedVerseRef } from '@sillsdev/scripture';\nimport { LanguageStrings } from 'platform-bible-utils';\nimport { ComponentPropsWithoutRef, ReactNode, Ref } from 'react';\nimport { ButtonProps } from '@/components/shadcn-ui/button';\nimport { Popover as PopoverPrimitive } from 'radix-ui';\n\n/**\n * Object containing all keys used for localization in the BookChapterControl component. If you're\n * using this component in an extension, you can pass it into the useLocalizedStrings hook to easily\n * obtain the localized strings and pass them into the localizedStrings prop of this component\n */\nexport const BOOK_CHAPTER_CONTROL_STRING_KEYS = Object.freeze([\n '%scripture_section_ot_long%',\n '%scripture_section_nt_long%',\n '%scripture_section_dc_long%',\n '%scripture_section_extra_long%',\n '%history_recent%',\n '%history_recentSearches_ariaLabel%',\n '%webView_bookChapterControl_bookNotInProject%',\n '%webView_bookChapterControl_bookNotInProjectDescription%',\n '%webView_bookChapterControl_selectChapter%',\n '%webView_bookChapterControl_selectVerse%',\n '%webView_bookChapterControl_showMoreBooks%',\n '%webView_bookChapterControl_showProjectBooksOnly%',\n '%webView_bookChapterControl_previousChapter%',\n '%webView_bookChapterControl_nextChapter%',\n '%webView_bookChapterControl_previousVerse%',\n '%webView_bookChapterControl_nextVerse%',\n '%webView_bookChapterControl_backToBooks%',\n '%webView_bookChapterControl_backToChapters%',\n] as const);\n\n/** Type definition for the localized strings used in the BookChapterControl component */\nexport type BookChapterControlLocalizedStrings = {\n [localizedKey in (typeof BOOK_CHAPTER_CONTROL_STRING_KEYS)[number]]?: string;\n};\n\nexport type BookWithOptionalChapterAndVerse = Omit &\n Partial>;\n\nexport type ViewMode = 'books' | 'chapters' | 'verses';\n\n/**\n * Imperative handle for controlling a {@link BookChapterControl} from outside React — e.g. the\n * `platform.openBookChapterControl` command opening it in response to Ctrl+B\n *\n * @experimental This export is unstable and may change shape or disappear without notice\n */\nexport type BookChapterControlHandle = {\n /**\n * Opens the reference dropdown and focuses its search input, ready for typing. No-op while the\n * control is disabled.\n */\n open: () => void;\n};\n\nexport type BookChapterControlProps = {\n /** The current scripture reference */\n scrRef: SerializedVerseRef;\n /** Callback to handle the submission of a selected reference */\n handleSubmit: (scrRef: SerializedVerseRef) => void;\n /** Optional additional class name for styling */\n className?: string;\n /** Callback to retrieve book IDs that are available in the current context */\n getActiveBookIds?: () => string[];\n /**\n * Optional callback returning book ids that exist outside the active project — e.g. books present\n * in an open resource. They are hidden from the default list, revealed by the \"show more books\"\n * control, and always searchable; those not also returned by `getActiveBookIds` render dimmed but\n * remain selectable.\n *\n * Ignored unless `getActiveBookIds` is also passed: without a project list the control already\n * offers the whole canon, so there is nothing left for this to add.\n *\n * WARNING: MUST BE STABLE - const or wrapped in useState, useMemo, etc. The reference must not be\n * updated every render\n */\n getAdditionalBookIds?: () => string[];\n /**\n * Optional map of localized book IDs/short names and full names. The key is the standard book ID\n * (e.g., \"2CH\"), the value contains a localized version of the ID and related book name (e.g. {\n * localizedId: '2CR', localizedName: '2 Crónicas' })\n */\n localizedBookNames?: Map;\n /** Optional localized strings for the component */\n localizedStrings?: LanguageStrings;\n /** Array of recent scripture references for quick access */\n recentSearches?: SerializedVerseRef[];\n /** Callback to add a new recent scripture reference */\n onAddRecentSearch?: (scrRef: SerializedVerseRef) => void;\n /** Optional ID for the popover content for accessibility */\n id?: string;\n /**\n * Optional callback returning the number of verses for a given book and chapter. When provided,\n * the control enables verse selection: clicking a chapter transitions to a verse selection\n * sub-screen, and typing a reference with a chapter:verse separator shows a verse grid. When\n * omitted, the control selects `verseNum: 1` after a chapter is chosen (current behavior).\n */\n getEndVerse?: (bookId: string, chapterNum: number) => number;\n /**\n * Optional lower bound. When provided, any reference that comes strictly before this one in canon\n * order is disabled in the UI (books, chapters, and verses). Used to prevent selecting an \"end\"\n * reference that precedes a \"start\" reference (e.g., in a range picker).\n */\n disableReferencesUpTo?: SerializedVerseRef;\n /**\n * Optional list of extra keys that submit the currently-matched reference from the search input\n * (in addition to `Enter`, which always submits). When one of these keys is pressed while the\n * typed input resolves to a valid top-match reference, that match is submitted and the key is\n * consumed (not inserted into the input). Intended for flows where a \"separator\" keystroke\n * implies completion — e.g. a range picker that uses space or `-` to confirm the start of a range\n * and advance to the end.\n */\n submitKeys?: readonly string[];\n /**\n * Optional override for the contents of the trigger button. When provided, this replaces the\n * default current-reference label (`\"MAT 5:3\"`) rendered inside the button — useful when the\n * current reference is already shown elsewhere and the trigger only needs an icon (e.g. an inline\n * \"change reference\" affordance). The Button itself is still the PopoverTrigger; only its inner\n * content is swapped.\n */\n triggerContent?: ReactNode;\n /**\n * Optional Button variant applied to the trigger. Defaults to `\"outline\"` (the standard inline\n * picker look); pass `\"ghost\"` when the control is embedded in a menu / list where a bordered\n * button would feel out of place.\n */\n triggerVariant?: ButtonProps['variant'];\n /**\n * Set to `true` to render an up-down chevron indicator at the end of the trigger, signaling that\n * it opens a picker. Defaults to `false` (no chevron) — most existing embeddings show the current\n * reference alone and don't need one.\n */\n showTriggerChevron?: boolean;\n /**\n * Optional callback fired whenever the control's popover open state changes. Useful when the\n * parent needs to react to the picker opening or closing — e.g. dimming a sibling control while\n * this one is active. Internal back-navigation within the popover (verses → chapters → books)\n * does not toggle this: only true open/close transitions do.\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * Optional handler forwarded to the underlying Radix `Popover.Content`. Fires as the popover\n * closes and decides where focus should land next — by default Radix returns focus to the trigger\n * button. Call `event.preventDefault()` and focus a different element when the trigger isn't the\n * right landing spot (e.g. the picker is nested inside a DropdownMenuItem and focus should return\n * to the menu item so arrow-key navigation continues to work).\n */\n onCloseAutoFocus?: ComponentPropsWithoutRef['onCloseAutoFocus'];\n /**\n * Optional flag forwarded to the underlying Radix `Popover.Root`. Defaults to `false`. Set to\n * `true` when the control is opened from inside another focus-trapping primitive (a Radix Dialog\n * or DropdownMenu) — the transient focus blip that happens when the picker transitions between\n * book/chapter/verse views would otherwise collide with the outer scope's focus trap and dismiss\n * the popover. Modal mode gives the popover its own FocusScope that pauses the outer scope while\n * it's open, avoiding the collision.\n */\n modal?: boolean;\n /**\n * Optional alignment for the popover relative to its trigger along the cross-axis. Forwarded to\n * the underlying Radix `Popover.Content`. Defaults to `\"center\"`. Use `\"start\"` when the control\n * sits on the right edge of a constrained container (e.g. the second picker in a range dialog) to\n * keep the popover anchored to the trigger's leading edge rather than spilling off-screen.\n */\n align?: ComponentPropsWithoutRef['align'];\n /**\n * Ref that receives a {@link BookChapterControlHandle} for imperative control\n *\n * @experimental This property is unstable and may change shape or disappear without notice\n */\n ref?: Ref;\n /**\n * When true, the control is disabled (e.g. no target to navigate): the trigger button cannot be\n * clicked, an already-open dropdown closes, and the imperative\n * {@link BookChapterControlHandle.open} is a no-op\n */\n disabled?: boolean;\n};\n","import { type CSSProperties, type ComponentProps, ReactNode, useState } from 'react';\nimport { Check, ChevronDown } from 'lucide-react';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { Button, ButtonProps } from '@/components/shadcn-ui/button';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/shadcn-ui/popover';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/components/shadcn-ui/command';\n\nexport type ComboBoxLabelOption = { label: string; secondaryLabel?: string };\nexport type ComboBoxOption = string | number | ComboBoxLabelOption;\n\n/** Represents a group of options with an optional heading */\nexport type ComboBoxGroup = {\n /** The heading text for this group of options */\n groupHeading: string;\n /** The options within this group */\n options: readonly T[];\n};\n\nexport type ComboBoxProps = {\n /** Optional unique identifier */\n id?: string;\n /**\n * List of available options for the dropdown menu. Can be either:\n *\n * - A flat array of options (single group, no heading)\n * - An array of group objects. Each group has a heading and an array of options\n */\n options?: readonly T[] | readonly ComboBoxGroup[];\n /** @deprecated 3 December 2024. Renamed to `buttonClassName` */\n className?: string;\n /** Additional css classes to help with unique styling of the combo box button */\n buttonClassName?: string;\n /** Additional css classes to help with unique styling of the combo box popover */\n popoverContentClassName?: string;\n /**\n * Additional inline styles for the combo box popover. Use for z-index overrides instead of\n * className to avoid being overridden by PopoverContent's inline default z-index.\n */\n popoverContentStyle?: CSSProperties;\n /**\n * The selected value that the combo box currently holds. Must be shallow equal to one of the\n * options entries.\n */\n value?: T;\n /** Triggers when content of textfield is changed */\n onChange?: (newValue: T) => void;\n /** Used to determine the string value for a given option. */\n getOptionLabel?: (option: T) => string;\n /**\n * Used to determine the string value to display on the button for the selected value. If not\n * provided, falls back to `getOptionLabel`.\n */\n getButtonLabel?: (option: T) => string;\n /** Icon to be displayed on the trigger */\n icon?: ReactNode;\n /** Text displayed on button if `value` is undefined */\n buttonPlaceholder?: string;\n /** Placeholder text for text field */\n textPlaceholder?: string;\n /** Text to display when no options match input */\n commandEmptyMessage?: string;\n /** Variant of button */\n buttonVariant?: ButtonProps['variant'];\n /** Control how the popover menu should be aligned. Defaults to start */\n alignDropDown?: 'start' | 'center' | 'end';\n /** Optional boolean to set if trigger should be disabled */\n isDisabled?: boolean;\n /** Optional aria-label for the trigger button for accessibility */\n ariaLabel?: string;\n} & ComponentProps;\n\nfunction getOptionLabelDefault(option: ComboBoxOption): string {\n if (typeof option === 'string') {\n return option;\n }\n if (typeof option === 'number') {\n return option.toString();\n }\n return option.label;\n}\n\n/**\n * Autocomplete input and command palette with a list of suggestions.\n *\n * Thanks to Shadcn for heavy inspiration and documentation\n * https://ui.shadcn.com/docs/components/combobox\n */\nexport function ComboBox({\n id,\n options = [],\n className,\n buttonClassName,\n popoverContentClassName,\n popoverContentStyle,\n value,\n onChange = () => {},\n getOptionLabel = getOptionLabelDefault,\n getButtonLabel,\n icon = undefined,\n buttonPlaceholder = '',\n textPlaceholder = '',\n commandEmptyMessage = 'No option found',\n buttonVariant = 'outline',\n alignDropDown = 'start',\n isDisabled = false,\n ariaLabel,\n ...props\n}: ComboBoxProps) {\n const [open, setOpen] = useState(false);\n\n const buttonLabel = getButtonLabel ?? getOptionLabel;\n\n const isGroupedOptions = (\n groupOptions: readonly T[] | readonly ComboBoxGroup[],\n ): groupOptions is readonly ComboBoxGroup[] => {\n return Boolean(\n groupOptions.length > 0 &&\n typeof groupOptions[0] === 'object' &&\n 'options' in groupOptions[0],\n );\n };\n\n const renderCommandItem = (option: T, groupHeading?: string) => {\n const optionLabel = getOptionLabel(option);\n const secondaryLabel =\n typeof option === 'object' && 'secondaryLabel' in option ? option.secondaryLabel : undefined;\n\n const key = `${groupHeading ?? ''}${optionLabel}${secondaryLabel ?? ''}`;\n\n return (\n {\n onChange(option);\n setOpen(false);\n }}\n className=\"tw:gap-1.5!\"\n >\n \n \n {optionLabel}\n {secondaryLabel && · {secondaryLabel}}\n \n \n );\n };\n\n return (\n \n \n \n
\n {icon &&
{icon}
}\n \n {value ? buttonLabel(value) : buttonPlaceholder}\n \n
\n\n \n \n
\n \n \n \n {commandEmptyMessage}\n \n {isGroupedOptions(options) ? (\n options.map((group) => (\n \n {group.options.map((option) => renderCommandItem(option, group.groupHeading))}\n \n ))\n ) : (\n {options.map((option) => renderCommandItem(option))}\n )}\n \n \n \n
\n );\n}\n\nexport default ComboBox;\n","import { ComboBox } from '@/components/basics/combo-box.component';\nimport { Label } from '@/components/shadcn-ui/label';\nimport { useMemo } from 'react';\n\nexport type ChapterRangeSelectorProps = {\n /** The selected start chapter */\n startChapter: number;\n /** The selected end chapter */\n endChapter: number;\n /** Callback function to handle the selection of the start chapter */\n handleSelectStartChapter: (chapter: number) => void;\n /** Callback function to handle the selection of the end chapter */\n handleSelectEndChapter: (chapter: number) => void;\n /** Flag to disable the component */\n isDisabled?: boolean;\n /** The total number of chapters available */\n chapterCount: number;\n};\n\n/**\n * ChapterRangeSelector is a component that provides a UI for selecting a range of chapters. It\n * consists of two combo boxes for selecting the start and end chapters. The component ensures that\n * the selected start chapter is always less than or equal to the end chapter, and vice versa.\n *\n * @deprecated Jul 18 2025. This component is no longer supported or tested. Use of this component\n * is discouraged and it may be removed in the future.\n * @param {ChapterRangeSelectorProps} props - The props for the component.\n */\n\nexport function ChapterRangeSelector({\n startChapter,\n endChapter,\n handleSelectStartChapter,\n handleSelectEndChapter,\n isDisabled = false,\n chapterCount,\n}: ChapterRangeSelectorProps) {\n const chapterOptions = useMemo(\n () => Array.from({ length: chapterCount }, (_, index) => index + 1),\n [chapterCount],\n );\n\n const onChangeStartChapter = (value: number) => {\n handleSelectStartChapter(value);\n if (value > endChapter) {\n handleSelectEndChapter(value);\n }\n };\n\n const onChangeEndChapter = (value: number) => {\n handleSelectEndChapter(value);\n if (value < startChapter) {\n handleSelectStartChapter(value);\n }\n };\n\n return (\n <>\n \n option.toString()}\n value={startChapter}\n />\n\n \n option.toString()}\n value={endChapter}\n />\n \n );\n}\n\nexport default ChapterRangeSelector;\n","import { Button } from '@/components/shadcn-ui/button';\nimport { Label } from '@/components/shadcn-ui/label';\nimport { RadioGroup, RadioGroupItem } from '@/components/shadcn-ui/radio-group';\nimport { Canon } from '@sillsdev/scripture';\nimport { LocalizedStringValue } from 'platform-bible-utils';\nimport { useState } from 'react';\nimport {\n ChapterRangeSelector,\n ChapterRangeSelectorProps,\n} from '../basics/chapter-range-selector.component';\n\n/** Enumeration of possible book selection modes */\nexport enum BookSelectionMode {\n CurrentBook = 'current book',\n ChooseBooks = 'choose books',\n}\n\nexport namespace BookSelectionMode {\n /** @deprecated Use BookSelectionMode.CurrentBook instead. */\n export const CURRENT_BOOK: BookSelectionMode = BookSelectionMode.CurrentBook;\n /** @deprecated Use BookSelectionMode.ChooseBooks instead. */\n export const CHOOSE_BOOKS: BookSelectionMode = BookSelectionMode.ChooseBooks;\n}\n\n/**\n * Object containing all keys used for localization in this component. If you're using this\n * component in an extension, you can pass it into the useLocalizedStrings hook to easily obtain the\n * localized strings and pass them into the localizedStrings prop of this component\n */\nexport const BOOK_SELECTOR_STRING_KEYS = Object.freeze([\n '%webView_bookSelector_currentBook%',\n '%webView_bookSelector_choose%',\n '%webView_bookSelector_chooseBooks%',\n] as const);\n\nexport type BookSelectorLocalizedStrings = {\n [localizedBookSelectorKey in (typeof BOOK_SELECTOR_STRING_KEYS)[number]]?: LocalizedStringValue;\n};\n\n/**\n * Gets the localized value for the provided key\n *\n * @param strings Object containing localized string\n * @param key Key for a localized string\n * @returns The localized value for the provided key, if available. Returns the key if no localized\n * value is available\n */\nconst localizeString = (\n strings: BookSelectorLocalizedStrings,\n key: keyof BookSelectorLocalizedStrings,\n) => {\n return strings[key] ?? key;\n};\n\ntype BookSelectorProps = ChapterRangeSelectorProps & {\n handleBookSelectionModeChange: (newMode: BookSelectionMode) => void;\n currentBookName: string;\n onSelectBooks: () => void;\n selectedBookIds: string[];\n localizedStrings: BookSelectorLocalizedStrings;\n};\n\n/**\n * BookSelector is a component that provides an interactive UI for selecting books. It can be set to\n * either allow the user to select a single book or to choose multiple books. In the former case, it\n * will display the range of chapters in the selected book, and in the latter case it will display a\n * list of the selected books.\n *\n * @deprecated Jul 18 2025. This component is no longer supported or tested and will be removed in a\n * later version. To let users select books, use the `SelectBooks` component instead (or\n * `ScopeSelector` to combine scope and book selection).\n * @param {BookSelectorProps} props\n * @param {function} props.handleBookSelectionModeChange - Callback function to handle changes in\n * book selection mode.\n * @param {string} props.currentBookName - The name of the currently selected book.\n * @param {function} props.onSelectBooks - Callback function to handle book selection.\n * @param {string[]} props.selectedBookIds - An array of book IDs that have been selected.\n * @param {BookSelectorLocalizedStrings} props.localizedStrings - Object containing localized\n * strings for the component.\n */\nexport function BookSelector({\n handleBookSelectionModeChange,\n currentBookName,\n onSelectBooks,\n selectedBookIds,\n chapterCount,\n endChapter,\n handleSelectEndChapter,\n startChapter,\n handleSelectStartChapter,\n localizedStrings,\n}: BookSelectorProps) {\n const currentBookText = localizeString(localizedStrings, '%webView_bookSelector_currentBook%');\n const chooseText = localizeString(localizedStrings, '%webView_bookSelector_choose%');\n const chooseBooksText = localizeString(localizedStrings, '%webView_bookSelector_chooseBooks%');\n\n const [bookSelectionMode, setBookSelectionMode] = useState(\n BookSelectionMode.CurrentBook,\n );\n\n const onSelectionModeChange = (newMode: BookSelectionMode) => {\n setBookSelectionMode(newMode);\n handleBookSelectionModeChange(newMode);\n };\n\n return (\n onSelectionModeChange(value as BookSelectionMode)}\n >\n
\n
\n
\n \n \n
\n \n
\n \n
\n
\n
\n
\n \n \n
\n \n onSelectBooks()}\n >\n {chooseText}\n \n
\n
\n \n );\n}\n\nexport default BookSelector;\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{createContext as n,useContext as e}from\"react\";const r=n(null);function t(n,e){let r=null;return null!=n&&(r=n[1]),{getTheme:function(){return null!=e?e:null!=r?r.getTheme():null}}}function o(){const n=e(r);return null==n&&function(n,...e){const r=new URL(\"https://lexical.dev/docs/error\"),t=new URLSearchParams;t.append(\"code\",n);for(const n of e)t.append(\"v\",n);throw r.search=t.toString(),Error(`Minified Lexical error #${n}; visit ${r.toString()} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}(8),n}export{r as LexicalComposerContext,t as createLexicalComposerContext,o as useLexicalComposerContext};\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{createLexicalComposerContext as e,LexicalComposerContext as t}from\"@lexical/react/LexicalComposerContext\";import{createEditor as o,$getRoot as n,$createParagraphNode as i,$getSelection as r,HISTORY_MERGE_TAG as a}from\"lexical\";import{useLayoutEffect as c,useEffect as l,useMemo as d}from\"react\";import{jsx as s}from\"react/jsx-runtime\";const m=\"undefined\"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement,u=m?c:l,p={tag:a};function f({initialConfig:a,children:c}){const l=d(()=>{const{theme:t,namespace:c,nodes:l,onError:d,editorState:s,html:u}=a,f=e(null,t),E=o({editable:a.editable,html:u,namespace:c,nodes:l,onError:e=>d(e,E),theme:t});return function(e,t){if(null===t)return;if(void 0===t)e.update(()=>{const t=n();if(t.isEmpty()){const o=i();t.append(o);const n=m?document.activeElement:null;(null!==r()||null!==n&&n===e.getRootElement())&&o.select()}},p);else if(null!==t)switch(typeof t){case\"string\":{const o=e.parseEditorState(t);e.setEditorState(o,p);break}case\"object\":e.setEditorState(t,p);break;case\"function\":e.update(()=>{n().isEmpty()&&t(e)},p)}}(E,s),[E,f]},[]);return u(()=>{const e=a.editable,[t]=l;t.setEditable(void 0===e||e)},[]),s(t.Provider,{value:l,children:c})}export{f as LexicalComposer};\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{useLexicalComposerContext as e}from\"@lexical/react/LexicalComposerContext\";import{HISTORY_MERGE_TAG as t}from\"lexical\";import{useLayoutEffect as o,useEffect as i}from\"react\";const r=\"undefined\"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?o:i;function n({ignoreHistoryMergeTagChange:o=!0,ignoreSelectionChange:i=!1,onChange:n}){const[a]=e();return r(()=>{if(n)return a.registerUpdateListener(({editorState:e,dirtyElements:r,dirtyLeaves:d,prevEditorState:s,tags:c})=>{i&&0===r.size&&0===d.size||o&&c.has(t)||s.isEmpty()||n(e,a,c)})},[a,o,i,n]),null}export{n as OnChangePlugin};\n","/**\n * This file was automatically generated on installation of the Shadcn/Lexical editor. The default\n * location of this file has been changed to integrate better with our project structure. Also,\n * modifications have been made to integrate with our codebase.\n *\n * Original file location: src/components/editor/themes/editor-theme.ts\n *\n * Shadcn/Lexical Editor Documentation: https://shadcn-editor.vercel.app/docs/\n */\n\nimport { EditorThemeClasses } from 'lexical';\n\nimport './editor-theme.css';\n\nexport const editorTheme: EditorThemeClasses = {\n ltr: 'tw:text-left',\n rtl: 'tw:text-right',\n heading: {\n h1: 'tw:scroll-m-20 tw:text-4xl tw:font-extrabold tw:tracking-tight tw:lg:text-5xl',\n h2: 'tw:scroll-m-20 tw:border-b tw:pb-2 tw:text-3xl tw:font-semibold tw:tracking-tight tw:first:mt-0',\n h3: 'tw:scroll-m-20 tw:text-2xl tw:font-semibold tw:tracking-tight',\n h4: 'tw:scroll-m-20 tw:text-xl tw:font-semibold tw:tracking-tight',\n h5: 'tw:scroll-m-20 tw:text-lg tw:font-semibold tw:tracking-tight',\n h6: 'tw:scroll-m-20 tw:text-base tw:font-semibold tw:tracking-tight',\n },\n paragraph: 'tw:outline-hidden',\n quote: 'tw:mt-6 tw:border-l-2 tw:pl-6 tw:italic',\n link: 'tw:text-blue-600 tw:hover:underline tw:hover:cursor-pointer',\n list: {\n checklist: 'tw:relative',\n listitem: 'tw:mx-8',\n listitemChecked:\n 'tw:relative tw:mx-2 tw:px-6 tw:list-none tw:outline-hidden tw:line-through tw:before:content-[\"\"] tw:before:w-4 tw:before:h-4 tw:before:top-0.5 tw:before:left-0 tw:before:cursor-pointer tw:before:block tw:before:bg-cover tw:before:absolute tw:before:border tw:before:border-primary tw:before:rounded tw:before:bg-primary tw:before:bg-no-repeat tw:after:content-[\"\"] tw:after:cursor-pointer tw:after:border-white tw:after:border-solid tw:after:absolute tw:after:block tw:after:top-[6px] tw:after:w-[3px] tw:after:left-[7px] tw:after:right-[7px] tw:after:h-[6px] tw:after:rotate-45 tw:after:border-r-2 tw:after:border-b-2 tw:after:border-l-0 tw:after:border-t-0',\n listitemUnchecked:\n 'tw:relative tw:mx-2 tw:px-6 tw:list-none tw:outline-hidden tw:before:content-[\"\"] tw:before:w-4 tw:before:h-4 tw:before:top-0.5 tw:before:left-0 tw:before:cursor-pointer tw:before:block tw:before:bg-cover tw:before:absolute tw:before:border tw:before:border-primary tw:before:rounded',\n nested: {\n listitem: 'tw:list-none tw:before:hidden tw:after:hidden',\n },\n ol: 'tw:m-0 tw:p-0 tw:list-decimal tw:[&>li]:mt-2',\n olDepth: [\n 'tw:list-outside tw:!list-decimal',\n 'tw:list-outside tw:!list-[upper-roman]',\n 'tw:list-outside tw:!list-[lower-roman]',\n 'tw:list-outside tw:!list-[upper-alpha]',\n 'tw:list-outside tw:!list-[lower-alpha]',\n ],\n ul: 'tw:m-0 tw:p-0 tw:list-outside tw:[&>li]:mt-2',\n ulDepth: [\n 'tw:list-outside tw:!list-disc',\n 'tw:list-outside tw:!list-disc',\n 'tw:list-outside tw:!list-disc',\n 'tw:list-outside tw:!list-disc',\n 'tw:list-outside tw:!list-disc',\n ],\n },\n hashtag: 'tw:text-blue-600 tw:bg-blue-100 tw:rounded-md tw:px-1',\n text: {\n bold: 'tw:font-bold',\n code: 'tw:bg-gray-100 tw:p-1 tw:rounded-md',\n italic: 'tw:italic',\n strikethrough: 'tw:line-through',\n subscript: 'tw:sub',\n superscript: 'tw:sup',\n underline: 'tw:underline',\n underlineStrikethrough: 'tw:underline tw:line-through',\n },\n image: 'tw:relative tw:inline-block tw:user-select-none tw:cursor-default editor-image',\n inlineImage:\n 'tw:relative tw:inline-block tw:user-select-none tw:cursor-default inline-editor-image',\n keyword: 'tw:text-purple-900 tw:font-bold',\n code: 'EditorTheme__code',\n codeHighlight: {\n atrule: 'EditorTheme__tokenAttr',\n attr: 'EditorTheme__tokenAttr',\n boolean: 'EditorTheme__tokenProperty',\n builtin: 'EditorTheme__tokenSelector',\n cdata: 'EditorTheme__tokenComment',\n char: 'EditorTheme__tokenSelector',\n class: 'EditorTheme__tokenFunction',\n 'class-name': 'EditorTheme__tokenFunction',\n comment: 'EditorTheme__tokenComment',\n constant: 'EditorTheme__tokenProperty',\n deleted: 'EditorTheme__tokenProperty',\n doctype: 'EditorTheme__tokenComment',\n entity: 'EditorTheme__tokenOperator',\n function: 'EditorTheme__tokenFunction',\n important: 'EditorTheme__tokenVariable',\n inserted: 'EditorTheme__tokenSelector',\n keyword: 'EditorTheme__tokenAttr',\n namespace: 'EditorTheme__tokenVariable',\n number: 'EditorTheme__tokenProperty',\n operator: 'EditorTheme__tokenOperator',\n prolog: 'EditorTheme__tokenComment',\n property: 'EditorTheme__tokenProperty',\n punctuation: 'EditorTheme__tokenPunctuation',\n regex: 'EditorTheme__tokenVariable',\n selector: 'EditorTheme__tokenSelector',\n string: 'EditorTheme__tokenSelector',\n symbol: 'EditorTheme__tokenProperty',\n tag: 'EditorTheme__tokenProperty',\n url: 'EditorTheme__tokenOperator',\n variable: 'EditorTheme__tokenVariable',\n },\n characterLimit: 'tw:!bg-destructive/50',\n table: 'EditorTheme__table tw:w-fit tw:overflow-scroll tw:border-collapse',\n tableCell:\n 'EditorTheme__tableCell tw:w-24 tw:relative tw:border tw:px-4 tw:py-2 tw:text-left tw:[&[align=center]]:text-center tw:[&[align=right]]:text-right',\n tableCellActionButton:\n 'EditorTheme__tableCellActionButton tw:bg-background tw:block tw:border-0 tw:rounded-2xl tw:w-5 tw:h-5 tw:text-foreground tw:cursor-pointer',\n tableCellActionButtonContainer:\n 'EditorTheme__tableCellActionButtonContainer tw:block tw:right-1 tw:top-1.5 tw:absolute tw:z-10 tw:w-5 tw:h-5',\n tableCellEditing: 'EditorTheme__tableCellEditing tw:rounded-sm tw:shadow-sm',\n tableCellHeader:\n 'EditorTheme__tableCellHeader tw:bg-muted tw:border tw:px-4 tw:py-2 tw:text-left tw:font-bold tw:[&[align=center]]:text-center tw:[&[align=right]]:text-right',\n tableCellPrimarySelected:\n 'EditorTheme__tableCellPrimarySelected tw:border tw:border-primary tw:border-solid tw:block tw:h-[calc(100%-2px)] tw:w-[calc(100%-2px)] tw:absolute tw:-left-[1px] tw:-top-[1px] tw:z-10 ',\n tableCellResizer:\n 'EditorTheme__tableCellResizer tw:absolute tw:-right-1 tw:h-full tw:w-2 tw:cursor-ew-resize tw:z-10 tw:top-0',\n tableCellSelected: 'EditorTheme__tableCellSelected tw:bg-muted',\n tableCellSortedIndicator:\n 'EditorTheme__tableCellSortedIndicator tw:block tw:opacity-50 tw:absolute tw:bottom-0 tw:left-0 tw:w-full tw:h-1 tw:bg-muted',\n tableResizeRuler:\n 'EditorTheme__tableCellResizeRuler tw:block tw:absolute tw:w-[1px] tw:h-full tw:bg-primary tw:top-0',\n tableRowStriping: 'EditorTheme__tableRowStriping tw:m-0 tw:border-t tw:p-0 tw:even:bg-muted',\n tableSelected: 'EditorTheme__tableSelected tw:ring-2 tw:ring-primary tw:ring-offset-2',\n tableSelection: 'EditorTheme__tableSelection tw:bg-transparent',\n layoutItem: 'tw:border tw:border-dashed tw:px-4 tw:py-2',\n layoutContainer: 'tw:grid tw:gap-2.5 tw:my-2.5 tw:mx-0',\n autocomplete: 'tw:text-muted-foreground',\n blockCursor: '',\n embedBlock: {\n base: 'tw:user-select-none',\n focus: 'tw:ring-2 tw:ring-primary tw:ring-offset-2',\n },\n hr: 'tw:p-0.5 tw:border-none tw:my-1 tw:mx-0 tw:cursor-pointer tw:after:content-[\"\"] tw:after:block tw:after:h-0.5 tw:after:bg-muted tw:selected:ring-2 tw:selected:ring-primary tw:selected:ring-offset-2 tw:selected:user-select-none',\n indent: '[--lexical-indent-base-value:40px]',\n mark: '',\n markOverlap: '',\n};\n","/**\n * This file was automatically generated on installation of the Shadcn/Lexical editor. The default\n * location of this file has been changed to integrate better with our project structure.\n *\n * Original file location: src/components/blocks/editor-00/nodes.ts\n *\n * Shadcn/Lexical Editor Documentation: https://shadcn-editor.vercel.app/docs/\n */\n\nimport { HeadingNode, QuoteNode } from '@lexical/rich-text';\nimport { Klass, LexicalNode, LexicalNodeReplacement, ParagraphNode, TextNode } from 'lexical';\n\nexport const nodes: ReadonlyArray | LexicalNodeReplacement> = [\n HeadingNode,\n ParagraphNode,\n TextNode,\n QuoteNode,\n];\n","'use client';\nimport { createContext, Component, createElement, useContext, useState, useMemo, forwardRef } from 'react';\n\nconst ErrorBoundaryContext = createContext(null);\n\nconst initialState = {\n didCatch: false,\n error: null\n};\nclass ErrorBoundary extends Component {\n constructor(props) {\n super(props);\n this.resetErrorBoundary = this.resetErrorBoundary.bind(this);\n this.state = initialState;\n }\n static getDerivedStateFromError(error) {\n return {\n didCatch: true,\n error\n };\n }\n resetErrorBoundary() {\n const {\n error\n } = this.state;\n if (error !== null) {\n var _this$props$onReset, _this$props;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n (_this$props$onReset = (_this$props = this.props).onReset) === null || _this$props$onReset === void 0 ? void 0 : _this$props$onReset.call(_this$props, {\n args,\n reason: \"imperative-api\"\n });\n this.setState(initialState);\n }\n }\n componentDidCatch(error, info) {\n var _this$props$onError, _this$props2;\n (_this$props$onError = (_this$props2 = this.props).onError) === null || _this$props$onError === void 0 ? void 0 : _this$props$onError.call(_this$props2, error, info);\n }\n componentDidUpdate(prevProps, prevState) {\n const {\n didCatch\n } = this.state;\n const {\n resetKeys\n } = this.props;\n\n // There's an edge case where if the thing that triggered the error happens to *also* be in the resetKeys array,\n // we'd end up resetting the error boundary immediately.\n // This would likely trigger a second error to be thrown.\n // So we make sure that we don't check the resetKeys on the first call of cDU after the error is set.\n\n if (didCatch && prevState.error !== null && hasArrayChanged(prevProps.resetKeys, resetKeys)) {\n var _this$props$onReset2, _this$props3;\n (_this$props$onReset2 = (_this$props3 = this.props).onReset) === null || _this$props$onReset2 === void 0 ? void 0 : _this$props$onReset2.call(_this$props3, {\n next: resetKeys,\n prev: prevProps.resetKeys,\n reason: \"keys\"\n });\n this.setState(initialState);\n }\n }\n render() {\n const {\n children,\n fallbackRender,\n FallbackComponent,\n fallback\n } = this.props;\n const {\n didCatch,\n error\n } = this.state;\n let childToRender = children;\n if (didCatch) {\n const props = {\n error,\n resetErrorBoundary: this.resetErrorBoundary\n };\n if (typeof fallbackRender === \"function\") {\n childToRender = fallbackRender(props);\n } else if (FallbackComponent) {\n childToRender = createElement(FallbackComponent, props);\n } else if (fallback !== undefined) {\n childToRender = fallback;\n } else {\n throw error;\n }\n }\n return createElement(ErrorBoundaryContext.Provider, {\n value: {\n didCatch,\n error,\n resetErrorBoundary: this.resetErrorBoundary\n }\n }, childToRender);\n }\n}\nfunction hasArrayChanged() {\n let a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n let b = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n return a.length !== b.length || a.some((item, index) => !Object.is(item, b[index]));\n}\n\nfunction assertErrorBoundaryContext(value) {\n if (value == null || typeof value.didCatch !== \"boolean\" || typeof value.resetErrorBoundary !== \"function\") {\n throw new Error(\"ErrorBoundaryContext not found\");\n }\n}\n\nfunction useErrorBoundary() {\n const context = useContext(ErrorBoundaryContext);\n assertErrorBoundaryContext(context);\n const [state, setState] = useState({\n error: null,\n hasError: false\n });\n const memoized = useMemo(() => ({\n resetBoundary: () => {\n context.resetErrorBoundary();\n setState({\n error: null,\n hasError: false\n });\n },\n showBoundary: error => setState({\n error,\n hasError: true\n })\n }), [context.resetErrorBoundary]);\n if (state.hasError) {\n throw state.error;\n }\n return memoized;\n}\n\nfunction withErrorBoundary(component, errorBoundaryProps) {\n const Wrapped = forwardRef((props, ref) => createElement(ErrorBoundary, errorBoundaryProps, createElement(component, {\n ...props,\n ref\n })));\n\n // Format for display in DevTools\n const name = component.displayName || component.name || \"Unknown\";\n Wrapped.displayName = \"withErrorBoundary(\".concat(name, \")\");\n return Wrapped;\n}\n\nexport { ErrorBoundary, ErrorBoundaryContext, useErrorBoundary, withErrorBoundary };\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{ErrorBoundary as r}from\"react-error-boundary\";import{jsx as o}from\"react/jsx-runtime\";function n({children:n,onError:e}){return o(r,{fallback:o(\"div\",{style:{border:\"1px solid #f00\",color:\"#f00\",padding:\"8px\"},children:\"An error was thrown.\"}),onError:e,children:n})}export{n as LexicalErrorBoundary};\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{useLexicalComposerContext as e}from\"@lexical/react/LexicalComposerContext\";import{useLayoutEffect as n,useEffect as t,useMemo as i,useState as r,useRef as o}from\"react\";const c=\"undefined\"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?n:t;function u(e){return{initialValueFn:()=>e.isEditable(),subscribe:n=>e.registerEditableListener(n)}}function a(){return function(n){const[t]=e(),u=i(()=>n(t),[t,n]),[a,l]=r(()=>u.initialValueFn()),d=o(a);return c(()=>{const{initialValueFn:e,subscribe:n}=u,t=e();return d.current!==t&&(d.current=t,l(t)),n(e=>{d.current=e,l(e)})},[u,n]),a}(u)}export{a as useLexicalEditable};\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{$isTextNode as e,$getEditor as t,$isRootNode as n,$getSelection as o,$isRangeSelection as l,$caretRangeFromSelection as r,$isTokenOrSegmented as s,$isElementNode as i,$getCharacterOffsets as c,$cloneWithPropertiesEphemeral as f,$getNodeByKey as u,$getPreviousSelection as g,$createTextNode as a,$createRangeSelection as d,$findMatchingParent as p,INTERNAL_$isBlock as h,$setSelection as y,$caretFromPoint as m,$isExtendableTextPointCaret as S,$extendCaretToRange as x,$isChildCaret as T,$isDecoratorNode as N,$isRootOrShadowRoot as w,$hasAncestor as C,$isLeafNode as v}from\"lexical\";export{$cloneWithProperties,$selectAll}from\"lexical\";function K(e,...t){const n=new URL(\"https://lexical.dev/docs/error\"),o=new URLSearchParams;o.append(\"code\",e);for(const e of t)o.append(\"v\",e);throw n.search=o.toString(),Error(`Minified Lexical error #${e}; visit ${n.toString()} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}const E=new Map;function P(e){let t=e;for(;null!=t;){if(t.nodeType===Node.TEXT_NODE)return t;t=t.firstChild}return null}function k(e){const t=e.parentNode;if(null==t)throw new Error(\"Should never happen\");return[t,Array.from(t.childNodes).indexOf(e)]}function I(t,n,o,l,r){const s=n.getKey(),i=l.getKey(),c=document.createRange();let f=t.getElementByKey(s),u=t.getElementByKey(i),g=o,a=r;if(e(n)&&(f=P(f)),e(l)&&(u=P(u)),void 0===n||void 0===l||null===f||null===u)return null;\"BR\"===f.nodeName&&([f,g]=k(f)),\"BR\"===u.nodeName&&([u,a]=k(u));const d=f.firstChild;f===u&&null!=d&&\"BR\"===d.nodeName&&0===g&&0===a&&(a=1);try{c.setStart(f,g),c.setEnd(u,a)}catch(e){return null}return!c.collapsed||g===a&&s===i||(c.setStart(u,a),c.setEnd(f,g)),c}function B(e,t){const n=e.getRootElement();if(null===n)return[];const o=n.getBoundingClientRect(),l=getComputedStyle(n),r=parseFloat(l.paddingLeft)+parseFloat(l.paddingRight),s=Array.from(t.getClientRects());let i,c=s.length;s.sort((e,t)=>{const n=e.top-t.top;return Math.abs(n)<=3?e.left-t.left:n});for(let e=0;et.top&&i.left+i.width>t.left,l=t.width+r===o.width;n||l?(s.splice(e--,1),c--):i=t}return s}function F(e){const t={};if(!e)return t;const n=e.split(\";\");for(const e of n)if(\"\"!==e){const[n,o]=e.split(/:([^]+)/);n&&o&&(t[n.trim()]=o.trim())}return t}function b(e){let t=E.get(e);return void 0===t&&(t=F(e),E.set(e,t)),t}function z(e){let t=\"\";for(const n in e)n&&(t+=`${n}: ${e[n]};`);return t}function R(e){const n=t().getElementByKey(e.getKey());if(null===n)return null;const o=n.ownerDocument.defaultView;return null===o?null:o.getComputedStyle(n)}function O(e){return R(n(e)?e:e.getParentOrThrow())}function A(e){const t=O(e);return null!==t&&\"rtl\"===t.direction}function M(e,t,n=\"self\"){const o=e.getStartEndPoints();if(t.isSelected(e)&&!s(t)&&null!==o){const[l,r]=o,s=e.isBackward(),i=l.getNode(),u=r.getNode(),g=t.is(i),a=t.is(u);if(g||a){const[o,l]=c(e),r=i.is(u),g=t.is(s?u:i),a=t.is(s?i:u);let d,p=0;if(r)p=o>l?l:o,d=o>l?o:l;else if(g){p=s?l:o,d=void 0}else if(a){p=0,d=s?o:l}const h=t.__text.slice(p,d);h!==t.__text&&(\"clone\"===n&&(t=f(t)),t.__text=h)}}return t}function _(e){if(\"text\"===e.type)return e.offset===e.getNode().getTextContentSize();const t=e.getNode();return i(t)||K(177),e.offset===t.getChildrenSize()}function L(t,o,r){let s=o.getNode(),c=r;if(i(s)){const e=s.getDescendantByIndex(o.offset);null!==e&&(s=e)}for(;c>0&&null!==s;){if(i(s)){const e=s.getLastDescendant();null!==e&&(s=e)}let r=s.getPreviousSibling(),f=0;if(null===r){let e=s.getParentOrThrow(),t=e.getPreviousSibling();for(;null===t;){if(e=e.getParent(),null===e){r=null;break}t=e.getPreviousSibling()}null!==e&&(f=e.isInline()?0:2,r=t)}let d=s.getTextContent();\"\"===d&&i(s)&&!s.isInline()&&(d=\"\\n\\n\");const p=d.length;if(!e(s)||c>=p){const e=s.getParent();s.remove(),null==e||0!==e.getChildrenSize()||n(e)||e.remove(),c-=p+f,s=r}else{const n=s.getKey(),r=t.getEditorState().read(()=>{const t=u(n);return e(t)&&t.isSimpleText()?t.getTextContent():null}),i=p-c,f=d.slice(0,i);if(null!==r&&r!==d){const e=g();let t=s;if(s.isSimpleText())s.setTextContent(r);else{const e=a(r);s.replace(e),t=e}if(l(e)&&e.isCollapsed()){const n=e.anchor.offset;t.select(n,n)}}else if(s.isSimpleText()){const e=o.key===n;let t=o.offset;t(\"function\"==typeof l?e[n]=l(o[n],t):null===l?delete e[n]:e[n]=l,e),{...o}),s=z(r);l(t)||e(t)?t.setStyle(s):t.setTextStyle(s),E.set(s,r)}function U(e,t){if(l(e)&&e.isCollapsed()){D(e,t);const n=e.anchor.getNode();i(n)&&n.isEmpty()&&D(n,t)}j(e=>{D(e,t)});const n=e.getNodes();if(n.length>0){const e=new Set;for(const o of n){if(!i(o)||!o.canBeEmpty()||0!==o.getChildrenSize())continue;const n=o.getKey();e.has(n)||(e.add(n),D(o,t))}}}function j(t){const n=o();if(!n)return;const i=new Map,c=e=>i.get(e.getKey())||[0,e.getTextContentSize()];if(l(n))for(const e of r(n).getTextSlices())e&&i.set(e.caret.origin.getKey(),e.getSliceIndices());const f=n.getNodes();for(const n of f){if(!e(n)||!n.canHaveFormat())continue;const[o,l]=c(n);if(l!==o)if(s(n)||0===o&&l===n.getTextContentSize())t(n);else{t(n.splitText(o,l)[0===o?0:1])}}l(n)&&\"text\"===n.anchor.type&&\"text\"===n.focus.type&&n.anchor.key===n.focus.key&&H(n)}function H(e){if(e.isBackward()){const{anchor:t,focus:n}=e,{key:o,offset:l,type:r}=t;t.set(n.key,n.offset,n.type),n.set(o,l,r)}}function V(e,t){const n=e.getFormatType(),o=e.getIndent();n!==t.getFormatType()&&t.setFormat(n),o!==t.getIndent()&&t.setIndent(o)}function W(e,t,n=V){if(null===e)return;const l=e.getStartEndPoints(),r=new Map;let s=null;if(l){const[e,t]=l;s=d(),s.anchor.set(e.key,e.offset,e.type),s.focus.set(t.key,t.offset,t.type);const n=p(e.getNode(),h),o=p(t.getNode(),h);i(n)&&r.set(n.getKey(),n),i(o)&&r.set(o.getKey(),o)}for(const t of e.getNodes())if(i(t)&&h(t))r.set(t.getKey(),t);else if(null===l){const e=p(t,h);i(e)&&r.set(e.getKey(),e)}for(const[e,o]of r){const l=t();n(o,l),o.replace(l,!0),s&&(e===s.anchor.key&&s.anchor.set(l.getKey(),s.anchor.offset,s.anchor.type),e===s.focus.key&&s.focus.set(l.getKey(),s.focus.offset,s.focus.type))}s&&e.is(o())&&y(s)}function X(e){return e.getNode().isAttached()}function q(e){let t=e;for(;null!==t&&!w(t);){const e=t.getLatest(),n=t.getParent();0===e.getChildrenSize()&&t.remove(!0),t=n}}function G(e,t,n=null){const o=e.getStartEndPoints(),l=o?o[0]:null,r=e.getNodes(),s=r.length;if(null!==l&&(0===s||1===s&&\"element\"===l.type&&0===l.getNode().getChildrenSize())){const e=\"text\"===l.type?l.getNode().getParentOrThrow():l.getNode(),o=e.getChildren();let r=t();return r.setFormat(e.getFormatType()),r.setIndent(e.getIndent()),o.forEach(e=>r.append(e)),n&&(r=n.append(r)),void e.replace(r)}let i=null,c=[];for(let o=0;o{t.append(e),p.add(e.getKey()),i(e)&&e.getChildrenKeys().forEach(e=>p.add(e))}),q(l)}}else if(d.has(n.getKey())){i(n)||K(179);const e=o();e.setFormat(n.getFormatType()),e.setIndent(n.getIndent()),f.push(e),n.remove(!0)}}if(null!==r)for(let e=0;e=0;e--){const t=f[e];u.insertAfter(t)}else{const e=u.getFirstChild();if(i(e)&&(u=e),null===e)if(r)u.append(r);else for(let e=0;e=0;e--){const t=f[e];u.insertAfter(t),h=t}const m=g();l(m)&&X(m.anchor)&&X(m.focus)?y(m.clone()):null!==h?h.selectEnd():e.dirty=!0}function Q(e){const t=Y(e);return null!==t&&\"vertical-rl\"===t.writingMode}function Y(e){const t=e.anchor.getNode();return i(t)?R(t):O(t)}function Z(e,t){let n=Q(e)?!t:t;te(e)&&(n=!n);const o=m(e.focus,n?\"previous\":\"next\");if(S(o))return!1;for(const e of x(o)){if(T(e))return!e.origin.isInline();if(!i(e.origin)){if(N(e.origin))return!0;break}}return!1}function ee(e,t,n,o){e.modify(t?\"extend\":\"move\",n,o)}function te(e){const t=Y(e);return null!==t&&\"rtl\"===t.direction}function ne(e,t,n){const o=te(e);let l;l=Q(e)||o?!n:n,ee(e,t,l,\"character\")}function oe(e,t,n){const o=b(e.getStyle());return null!==o&&o[t]||n}function le(t,n,o=\"\"){let r=null;const s=t.getNodes(),i=t.anchor,c=t.focus,f=t.isBackward(),u=f?c.getNode():i.getNode(),g=f?i.getNode():c.getNode(),a=f?c.offset:i.offset,d=f?i.offset:c.offset;if(l(t)&&t.isCollapsed()&&\"\"!==t.style){const e=b(t.style);if(null!==e&&n in e)return e[n]}for(let t=0;tc.length;)s.pop();d&&o(s)}function a(){i=null,r=null,null!==l&&l.disconnect(),l=null,u.remove();for(const t of s)t.remove();s=[]}u.style.position=\"relative\";const f=e.registerRootListener(function n(){const o=e.getRootElement();if(null===o)return a();const s=o.parentElement;if(!t(s))return a();a(),r=o,i=s,l=new MutationObserver(t=>{const o=e.getRootElement(),l=o&&o.parentElement;if(o!==r||l!==i)return n();for(const e of t)if(!u.contains(e.target))return c()}),l.observe(s,q),c()});return()=>{f(),a()}}function Q(t,e,n){if(\"text\"!==t.type&&r(e)){const o=e.getDOMSlot(n);return[o.element,o.getFirstChildOffset()+t.offset]}return[i(n)||n,t.offset]}function X(t){for(const e of t){const t=e.style;\"Highlight\"!==t.background&&(t.background=\"Highlight\"),\"HighlightText\"!==t.color&&(t.color=\"HighlightText\"),t.marginTop!==G(-1.5)&&(t.marginTop=G(-1.5)),t.paddingTop!==G(4)&&(t.paddingTop=G(4)),t.paddingBottom!==G(0)&&(t.paddingBottom=G(0))}}function Y(t,r=X){let i=null,l=null,s=null,u=null,c=null,a=null,f=()=>{};function d(e){e.read(()=>{const e=n();if(!o(e))return i=null,s=null,u=null,a=null,f(),void(f=()=>{});const[d,g]=function(t){const e=t.getStartEndPoints();return t.isBackward()?[e[1],e[0]]:e}(e),p=d.getNode(),m=p.getKey(),h=d.offset,v=g.getNode(),y=v.getKey(),w=g.offset,x=t.getElementByKey(m),E=t.getElementByKey(y),S=null===i||x!==l||h!==s||m!==i.getKey(),C=null===u||E!==c||w!==a||y!==u.getKey();if((S||C)&&null!==x&&null!==E){const e=function(t,e,n,o,r,i,l){const s=(t._window?t._window.document:document).createRange();return s.setStart(...Q(e,n,o)),s.setEnd(...Q(r,i,l)),s}(t,d,p,x,g,v,E);f(),f=J(t,e,r)}i=p,l=x,s=h,u=v,c=E,a=w})}return d(t.getEditorState()),e(t.registerUpdateListener(({editorState:t})=>d(t)),()=>{f()})}function Z(t,e){let n=null;const o=()=>{const o=getSelection(),r=o&&o.anchorNode,i=t.getRootElement();null!==r&&null!==i&&i.contains(r)?null!==n&&(n(),n=null):null===n&&(n=Y(t,e))};return t.registerRootListener(t=>{if(t){const e=t.ownerDocument;return e.addEventListener(\"selectionchange\",o),o(),()=>{null!==n&&n(),e.removeEventListener(\"selectionchange\",o)}}})}const tt=F,et=$,nt=j,ot=V,rt=O,it=W,lt=U,st=D,ut=H,ct=z;function at(t,e){for(const n of e)if(t.type.startsWith(n))return!0;return!1}function ft(t,e){const n=t[Symbol.iterator]();return new Promise((t,o)=>{const r=[],i=()=>{const{done:l,value:s}=n.next();if(l)return t(r);const u=new FileReader;u.addEventListener(\"error\",o),u.addEventListener(\"load\",()=>{const t=u.result;\"string\"==typeof t&&r.push({file:s,result:t}),i()}),at(s,e)?u.readAsDataURL(s):i()};i()})}function dt(t,e){return Array.from(mt(t,e))}function gt(t){return t?t.getAdjacentCaret():null}function pt(t,e){return Array.from(Et(t,e))}function mt(t,e){return vt(\"next\",t,e)}function ht(t,e){const n=a(c(t,e));return n&&n[0]}function vt(t,e,n){const o=x(),i=e||o,s=r(i)?l(i,t):c(i,t),f=wt(i),d=n?S(u(c(n,t)))||ht(n,t):ht(i,t);let g=f;return M({hasNext:t=>null!==t,initial:s,map:t=>({depth:g,node:t.origin}),step:t=>{if(t.isSameNodeCaret(d))return null;C(t)&&g++;const e=a(t);return!e||e[0].isSameNodeCaret(d)?null:(g+=e[1],e[0])}})}function yt(t){const e=a(c(t,\"next\"));return e&&[e[0].origin,e[1]]}function wt(t){let e=-1;for(let n=t;null!==n;n=n.getParent())e++;return e}function xt(t){const e=u(c(t,\"previous\")),n=a(e,\"root\");return n&&n[0].origin}function Et(t,e){return vt(\"previous\",t,e)}function St(t,e){let n=t;for(;null!=n;){if(n instanceof e)return n;n=n.getParent()}return null}function Ct(t){const e=s(t,t=>r(t)&&!t.isInline());return r(e)||k(4,t.__key),e}function At(t,e,n,o){const r=t=>t instanceof e;return t.registerNodeTransform(e,t=>{const e=(t=>{const e=t.getChildren();for(let t=0;tr(t)&&!t.isInline());if(null===u)continue;const c=u.getKey();u.canIndent()&&!i.has(c)&&(i.add(c),t(u))}return i.size>0}function _t(t,e){l(t,\"next\").insert(e)}let Kt=!(st||!et)&&void 0;function kt(t,e=!1){let n=1;if(function(){if(void 0===Kt){const t=document.createElement(\"div\");t.style.cssText=\"position: absolute; opacity: 0; width: 100px; left: -1000px;\",document.body.appendChild(t);const e=t.getBoundingClientRect();t.style.setProperty(\"zoom\",\"2\"),Kt=t.getBoundingClientRect().width===e.width,document.body.removeChild(t)}return Kt}()||e)for(;t;)n*=Number(window.getComputedStyle(t).getPropertyValue(\"zoom\")),t=t.parentElement;return n}function $t(t){return null!==t._parentEditor}function It(t,e){return Ot(t,e,null)}function Ot(t,e,n){let o=!1;for(const i of Ht(t))e(i)?null!==n&&n(i):(o=!0,r(i)&&Ot(i,e,n||(t=>i.insertAfter(t))),i.remove());return o}function Dt(t,e){const n=[],o=Array.from(t).reverse();for(let t=o.pop();void 0!==t;t=o.pop())if(e(t))n.push(t);else if(r(t))for(const e of Ht(t))o.push(e);return n}function Ft(t){return jt(l(t,\"next\"))}function Ht(t){return jt(l(t,\"previous\"))}function jt(t){return M({hasNext:T,initial:t.getAdjacentCaret(),map:t=>t.origin.getLatest(),step:t=>t.getAdjacentCaret()})}function zt(t){R(c(t,\"next\")).splice(1,t.getChildren())}function Ut(t){const e=e=>B(e,t),n=(e,n)=>_(e,t,n);return{$get:e,$set:n,accessors:[e,n],makeGetterMethod:()=>function(){return e(this)},makeSetterMethod:()=>function(t){return n(this,t)},stateConfig:t}}export{Dt as $descendantsMatching,dt as $dfs,mt as $dfsIterator,Tt as $filter,Ft as $firstToLastIterator,gt as $getAdjacentCaret,wt as $getDepth,Ct as $getNearestBlockElementAncestorOrThrow,St as $getNearestNodeOfType,xt as $getNextRightPreorderNode,yt as $getNextSiblingOrParentSibling,Bt as $handleIndentAndOutdent,_t as $insertFirst,Pt as $insertNodeIntoLeaf,bt as $insertNodeToNearestRoot,Lt as $insertNodeToNearestRootAtCaret,$t as $isEditorIsNestedEditor,Ht as $lastToFirstIterator,Nt as $restoreEditorState,pt as $reverseDfs,Et as $reverseDfsIterator,It as $unwrapAndFilterDescendants,zt as $unwrapNode,Rt as $wrapNodeInElement,tt as CAN_USE_BEFORE_INPUT,et as CAN_USE_DOM,nt as IS_ANDROID,ot as IS_ANDROID_CHROME,rt as IS_APPLE,it as IS_APPLE_WEBKIT,lt as IS_CHROME,st as IS_FIREFOX,ut as IS_IOS,ct as IS_SAFARI,kt as calculateZoomLevel,at as isMimeType,Ut as makeStateWrapper,Y as markSelection,ft as mediaFileReader,Mt as objectKlassEquals,J as positionNodeOnRange,At as registerNestedElementResolver,Z as selectionAlwaysOnDisplay};\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{defineExtension as t,safeCast as e,CLEAR_EDITOR_COMMAND as n,COMMAND_PRIORITY_EDITOR as i,$getRoot as o,$getSelection as s,$createParagraphNode as r,$isRangeSelection as c,FORMAT_TEXT_COMMAND as a,$isNodeSelection as d,COMMAND_PRIORITY_LOW as u,DecoratorNode as f,$getState as l,toggleTextFormatType as h,$setState as g,TEXT_TYPE_TO_FORMAT as p,createState as m,shallowMergeConfig as v,RootNode as x,TextNode as E,LineBreakNode as y,TabNode as S,ParagraphNode as b,$isEditorState as w,HISTORY_MERGE_TAG as N,createEditor as O,mergeRegister as R,$getNodeByKey as C,$create as D,CLICK_COMMAND as F,isDOMNode as M,$getNodeFromDOMNode as I,addClassNamesToElement as _,createCommand as P,$createNodeSelection as A,$setSelection as j,removeClassNamesFromElement as k,$getEditor as $,KEY_TAB_COMMAND as K,OUTDENT_CONTENT_COMMAND as z,INDENT_CONTENT_COMMAND as L,INSERT_TAB_COMMAND as U,COMMAND_PRIORITY_CRITICAL as T,$isBlockElementNode as B,$createRangeSelection as W,$normalizeSelection__EXPERIMENTAL as G}from\"lexical\";export{configExtension,declarePeerDependency,defineExtension,safeCast,shallowMergeConfig}from\"lexical\";import{$insertNodeToNearestRoot as V,selectionAlwaysOnDisplay as Z,$handleIndentAndOutdent as J,$getNearestBlockElementAncestorOrThrow as H}from\"@lexical/utils\";const q=Symbol.for(\"preact-signals\");function Q(){if(it>1)return void it--;let t,e=!1;for(!function(){let t=nt;for(nt=void 0;void 0!==t;)t.S.v===t.v&&(t.S.i=t.i),t=t.o}();void 0!==tt;){let n=tt;for(tt=void 0,ot++;void 0!==n;){const i=n.u;if(n.u=void 0,n.f&=-3,!(8&n.f)&&ft(n))try{n.c()}catch(n){e||(t=n,e=!0)}n=i}}if(ot=0,it--,e)throw t}function X(t){if(it>0)return t();rt=++st,it++;try{return t()}finally{Q()}}let Y,tt;function et(t){const e=Y;Y=void 0;try{return t()}finally{Y=e}}let nt,it=0,ot=0,st=0,rt=0,ct=0;function at(t){if(void 0===Y)return;let e=t.n;return void 0===e||e.t!==Y?(e={i:0,S:t,p:Y.s,n:void 0,t:Y,e:void 0,x:void 0,r:e},void 0!==Y.s&&(Y.s.n=e),Y.s=e,t.n=e,32&Y.f&&t.S(e),e):-1===e.i?(e.i=0,void 0!==e.n&&(e.n.p=e.p,void 0!==e.p&&(e.p.n=e.n),e.p=Y.s,e.n=void 0,Y.s.n=e,Y.s=e),e):void 0}function dt(t,e){this.v=t,this.i=0,this.n=void 0,this.t=void 0,this.l=0,this.W=null==e?void 0:e.watched,this.Z=null==e?void 0:e.unwatched,this.name=null==e?void 0:e.name}function ut(t,e){return new dt(t,e)}function ft(t){for(let e=t.s;void 0!==e;e=e.n)if(e.S.i!==e.i||!e.S.h()||e.S.i!==e.i)return!0;return!1}function lt(t){for(let e=t.s;void 0!==e;e=e.n){const n=e.S.n;if(void 0!==n&&(e.r=n),e.S.n=e,e.i=-1,void 0===e.n){t.s=e;break}}}function ht(t){let e,n=t.s;for(;void 0!==n;){const t=n.p;-1===n.i?(n.S.U(n),void 0!==t&&(t.n=n.n),void 0!==n.n&&(n.n.p=t)):e=n,n.S.n=n.r,void 0!==n.r&&(n.r=void 0),n=t}t.s=e}function gt(t,e){dt.call(this,void 0),this.x=t,this.s=void 0,this.g=ct-1,this.f=4,this.W=null==e?void 0:e.watched,this.Z=null==e?void 0:e.unwatched,this.name=null==e?void 0:e.name}function pt(t,e){return new gt(t,e)}function mt(t){const e=t.m;if(t.m=void 0,\"function\"==typeof e){it++;const n=Y;Y=void 0;try{e()}catch(e){throw t.f&=-2,t.f|=8,vt(t),e}finally{Y=n,Q()}}}function vt(t){for(let e=t.s;void 0!==e;e=e.n)e.S.U(e);t.x=void 0,t.s=void 0,mt(t)}function xt(t){if(Y!==this)throw new Error(\"Out-of-order effect\");ht(this),Y=t,this.f&=-2,8&this.f&&vt(this),Q()}function Et(t,e){this.x=t,this.m=void 0,this.s=void 0,this.u=void 0,this.f=32,this.name=null==e?void 0:e.name}function yt(t,e){const n=new Et(t,e);try{n.c()}catch(t){throw n.d(),t}const i=n.d.bind(n);return i[Symbol.dispose]=i,i}function St(t,e={}){const n={};for(const i in t){const o=e[i],s=ut(void 0===o?t[i]:o);n[i]=s}return n}dt.prototype.brand=q,dt.prototype.h=function(){return!0},dt.prototype.S=function(t){const e=this.t;e!==t&&void 0===t.e&&(t.x=e,this.t=t,void 0!==e?e.e=t:et(()=>{var t;null==(t=this.W)||t.call(this)}))},dt.prototype.U=function(t){if(void 0!==this.t){const e=t.e,n=t.x;void 0!==e&&(e.x=n,t.e=void 0),void 0!==n&&(n.e=e,t.x=void 0),t===this.t&&(this.t=n,void 0===n&&et(()=>{var t;null==(t=this.Z)||t.call(this)}))}},dt.prototype.subscribe=function(t){return yt(()=>{const e=this.value,n=Y;Y=void 0;try{t(e)}finally{Y=n}},{name:\"sub\"})},dt.prototype.valueOf=function(){return this.value},dt.prototype.toString=function(){return this.value+\"\"},dt.prototype.toJSON=function(){return this.value},dt.prototype.peek=function(){const t=Y;Y=void 0;try{return this.value}finally{Y=t}},Object.defineProperty(dt.prototype,\"value\",{get(){const t=at(this);return void 0!==t&&(t.i=this.i),this.v},set(t){if(t!==this.v){if(ot>100)throw new Error(\"Cycle detected\");!function(t){0!==it&&0===ot&&t.l!==rt&&(t.l=rt,nt={S:t,v:t.v,i:t.i,o:nt})}(this),this.v=t,this.i++,ct++,it++;try{for(let t=this.t;void 0!==t;t=t.x)t.t.N()}finally{Q()}}}}),gt.prototype=new dt,gt.prototype.h=function(){if(this.f&=-3,1&this.f)return!1;if(32==(36&this.f))return!0;if(this.f&=-5,this.g===ct)return!0;if(this.g=ct,this.f|=1,this.i>0&&!ft(this))return this.f&=-2,!0;const t=Y;try{lt(this),Y=this;const t=this.x();(16&this.f||this.v!==t||0===this.i)&&(this.v=t,this.f&=-17,this.i++)}catch(t){this.v=t,this.f|=16,this.i++}return Y=t,ht(this),this.f&=-2,!0},gt.prototype.S=function(t){if(void 0===this.t){this.f|=36;for(let t=this.s;void 0!==t;t=t.n)t.S.S(t)}dt.prototype.S.call(this,t)},gt.prototype.U=function(t){if(void 0!==this.t&&(dt.prototype.U.call(this,t),void 0===this.t)){this.f&=-33;for(let t=this.s;void 0!==t;t=t.n)t.S.U(t)}},gt.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(let t=this.t;void 0!==t;t=t.x)t.t.N()}},Object.defineProperty(gt.prototype,\"value\",{get(){if(1&this.f)throw new Error(\"Cycle detected\");const t=at(this);if(this.h(),void 0!==t&&(t.i=this.i),16&this.f)throw this.v;return this.v}}),Et.prototype.c=function(){const t=this.S();try{if(8&this.f)return;if(void 0===this.x)return;const t=this.x();\"function\"==typeof t&&(this.m=t)}finally{t()}},Et.prototype.S=function(){if(1&this.f)throw new Error(\"Cycle detected\");this.f|=1,this.f&=-9,mt(this),lt(this),it++;const t=Y;return Y=this,xt.bind(this,t)},Et.prototype.N=function(){2&this.f||(this.f|=2,this.u=tt,tt=this)},Et.prototype.d=function(){this.f|=8,1&this.f||vt(this)},Et.prototype.dispose=function(){this.d()};const bt=t({build:(t,e,n)=>St(e),config:e({defaultSelection:\"rootEnd\",disabled:!1}),name:\"@lexical/extension/AutoFocus\",register(t,e,n){const i=n.getOutput();return yt(()=>i.disabled.value?void 0:t.registerRootListener(e=>{t.focus(()=>{const t=document.activeElement;null===e||null!==t&&e.contains(t)||e.focus({preventScroll:!0})},{defaultSelection:i.defaultSelection.peek()})}))}});function wt(){const t=o(),e=s(),n=r();t.clear(),t.append(n),null!==e&&n.select(),c(e)&&(e.format=0)}function Nt(t,e=wt){return t.registerCommand(n,n=>(t.update(e),!0),i)}const Ot=t({build:(t,e,n)=>St(e),config:e({$onClear:wt}),name:\"@lexical/extension/ClearEditor\",register(t,e,n){const{$onClear:i}=n.getOutput();return yt(()=>Nt(t,i.value))}});function Rt(t){const e=new Set,n=new Set;for(const i of Ct(t)){const t=\"function\"==typeof i?i:i.replace;e.add(t.getType()),n.add(t)}return{nodes:n,types:e}}function Ct(t){return(\"function\"==typeof t.nodes?t.nodes():t.nodes)||[]}const Dt=m(\"format\",{parse:t=>\"number\"==typeof t?t:0});class Ft extends f{$config(){return this.config(\"decorator-text\",{extends:f,stateConfigs:[{flat:!0,stateConfig:Dt}]})}getFormat(){return l(this,Dt)}getFormatFlags(t,e){return h(this.getFormat(),t,e)}hasFormat(t){const e=p[t];return 0!==(this.getFormat()&e)}setFormat(t){return g(this,Dt,t)}toggleFormat(t){const e=this.getFormat(),n=h(e,t,null);return this.setFormat(n)}isInline(){return!0}createDOM(){return document.createElement(\"span\")}updateDOM(){return!1}}function Mt(t){return t instanceof Ft}function It(t,e,n){const i=e.fontWeight,o=e.textDecoration.split(\" \"),s=\"700\"===i||\"bold\"===i,r=o.includes(\"line-through\"),c=\"italic\"===e.fontStyle,a=o.includes(\"underline\"),d=e.verticalAlign;return s&&!t.hasFormat(\"bold\")&&t.toggleFormat(\"bold\"),r&&!t.hasFormat(\"strikethrough\")&&t.toggleFormat(\"strikethrough\"),c&&!t.hasFormat(\"italic\")&&t.toggleFormat(\"italic\"),a&&!t.hasFormat(\"underline\")&&t.toggleFormat(\"underline\"),\"sub\"!==d||t.hasFormat(\"subscript\")||t.toggleFormat(\"subscript\"),\"super\"!==d||t.hasFormat(\"superscript\")||t.toggleFormat(\"superscript\"),n&&!t.hasFormat(n)&&t.toggleFormat(n),t}function _t(t,e,n=At){for(const[i,o]of Object.entries(n))t.hasFormat(o)&&(e=Pt(e,i));return e}function Pt(t,e){const n=document.createElement(e);return n.appendChild(t),n}const At={b:\"bold\",code:\"code\",em:\"italic\",i:\"italic\",mark:\"highlight\",s:\"strikethrough\",strong:\"bold\",sub:\"subscript\",sup:\"superscript\",u:\"underline\"},jt=t({name:\"@lexical/extension/DecoratorText\",nodes:()=>[Ft],register:(t,e,n)=>t.registerCommand(a,t=>{const e=s();if(d(e)||c(e))for(const n of e.getNodes())Mt(n)&&n.toggleFormat(t);return!1},u)});function kt(t,e){let n;return ut(t(),{unwatched(){n&&(n(),n=void 0)},watched(){this.value=t(),n=e(this)}})}const $t=t({build:t=>kt(()=>t.getEditorState(),e=>t.registerUpdateListener(t=>{e.value=t.editorState})),name:\"@lexical/extension/EditorState\"});function Kt(t,...e){const n=new URL(\"https://lexical.dev/docs/error\"),i=new URLSearchParams;i.append(\"code\",t);for(const t of e)i.append(\"v\",t);throw n.search=i.toString(),Error(`Minified Lexical error #${t}; visit ${n.toString()} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}function zt(t,e){if(t&&e&&!Array.isArray(e)&&\"object\"==typeof t&&\"object\"==typeof e){const n=t,i=e;for(const t in i)n[t]=zt(n[t],i[t]);return t}return e}const Lt=0,Ut=1,Tt=2,Bt=3,Wt=4,Gt=5,Vt=6,Zt=7;function Jt(t){return t.id===Lt}function Ht(t){return t.id===Tt}function qt(t){return function(t){return t.id===Ut}(t)||Kt(305,String(t.id),String(Ut)),Object.assign(t,{id:Tt})}const Qt=new Set;class Xt{builder;configs;_dependency;_peerNameSet;extension;state;_signal;constructor(t,e){this.builder=t,this.extension=e,this.configs=new Set,this.state={id:Lt}}mergeConfigs(){let t=this.extension.config||{};const e=this.extension.mergeConfig?this.extension.mergeConfig.bind(this.extension):v;for(const n of this.configs)t=e(t,n);return t}init(t){const e=this.state;Ht(e)||Kt(306,String(e.id));const n={getDependency:this.getInitDependency.bind(this),getDirectDependentNames:this.getDirectDependentNames.bind(this),getPeer:this.getInitPeer.bind(this),getPeerNameSet:this.getPeerNameSet.bind(this)},i={...n,getDependency:this.getDependency.bind(this),getInitResult:this.getInitResult.bind(this),getPeer:this.getPeer.bind(this)},o=function(t,e,n){return Object.assign(t,{config:e,id:Bt,registerState:n})}(e,this.mergeConfigs(),n);let s;this.state=o,this.extension.init&&(s=this.extension.init(t,o.config,n)),this.state=function(t,e,n){return Object.assign(t,{id:Wt,initResult:e,registerState:n})}(o,s,i)}build(t){const e=this.state;let n;e.id!==Wt&&Kt(307,String(e.id),String(Gt)),this.extension.build&&(n=this.extension.build(t,e.config,e.registerState));const i={...e.registerState,getOutput:()=>n,getSignal:this.getSignal.bind(this)};this.state=function(t,e,n){return Object.assign(t,{id:Gt,output:e,registerState:n})}(e,n,i)}register(t,e){this._signal=e;const n=this.state;n.id!==Gt&&Kt(308,String(n.id),String(Gt));const i=this.extension.register&&this.extension.register(t,n.config,n.registerState);return this.state=function(t){return Object.assign(t,{id:Vt})}(n),()=>{const t=this.state;t.id!==Zt&&Kt(309,String(n.id),String(Zt)),this.state=function(t){return Object.assign(t,{id:Gt})}(t),i&&i()}}afterRegistration(t){const e=this.state;let n;return e.id!==Vt&&Kt(310,String(e.id),String(Vt)),this.extension.afterRegistration&&(n=this.extension.afterRegistration(t,e.config,e.registerState)),this.state=function(t){return Object.assign(t,{id:Zt})}(e),n}getSignal(){return void 0===this._signal&&Kt(311),this._signal}getInitResult(){void 0===this.extension.init&&Kt(312,this.extension.name);const t=this.state;return function(t){return t.id>=Wt}(t)||Kt(313,String(t.id),String(Wt)),t.initResult}getInitPeer(t){const e=this.builder.extensionNameMap.get(t);return e?e.getExtensionInitDependency():void 0}getExtensionInitDependency(){const t=this.state;return function(t){return t.id>=Bt}(t)||Kt(314,String(t.id),String(Bt)),{config:t.config}}getPeer(t){const e=this.builder.extensionNameMap.get(t);return e?e.getExtensionDependency():void 0}getInitDependency(t){const e=this.builder.getExtensionRep(t);return void 0===e&&Kt(315,this.extension.name,t.name),e.getExtensionInitDependency()}getDependency(t){const e=this.builder.getExtensionRep(t);return void 0===e&&Kt(315,this.extension.name,t.name),e.getExtensionDependency()}getState(){const t=this.state;return function(t){return t.id>=Zt}(t)||Kt(316,String(t.id),String(Zt)),t}getDirectDependentNames(){return this.builder.incomingEdges.get(this.extension.name)||Qt}getPeerNameSet(){let t=this._peerNameSet;return t||(t=new Set((this.extension.peerDependencies||[]).map(([t])=>t)),this._peerNameSet=t),t}getExtensionDependency(){if(!this._dependency){const t=this.state;(function(t){return t.id>=Gt})(t)||Kt(317,this.extension.name),this._dependency={config:t.config,init:t.initResult,output:t.output}}return this._dependency}}const Yt={tag:N};function te(){const t=o();t.isEmpty()&&t.append(r())}const ee=t({config:e({setOptions:Yt,updateOptions:Yt}),init:({$initialEditorState:t=te})=>({$initialEditorState:t,initialized:!1}),afterRegistration(t,{updateOptions:e,setOptions:n},i){const o=i.getInitResult();if(!o.initialized){o.initialized=!0;const{$initialEditorState:i}=o;if(w(i))t.setEditorState(i,n);else if(\"function\"==typeof i)t.update(()=>{i(t)},e);else if(i&&(\"string\"==typeof i||\"object\"==typeof i)){const e=t.parseEditorState(i);t.setEditorState(e,n)}}return()=>{}},name:\"@lexical/extension/InitialState\",nodes:[x,E,y,S,b]}),ne=Symbol.for(\"@lexical/extension/LexicalBuilder\");function ie(...t){return ae.fromExtensions(t).buildEditor()}function oe(){}function se(t){throw t}function re(t){return Array.isArray(t)?t:[t]}const ce=\"0.43.0+prod.esm\";class ae{roots;extensionNameMap;outgoingConfigEdges;incomingEdges;conflicts;_sortedExtensionReps;PACKAGE_VERSION;constructor(t){this.outgoingConfigEdges=new Map,this.incomingEdges=new Map,this.extensionNameMap=new Map,this.conflicts=new Map,this.PACKAGE_VERSION=ce,this.roots=t;for(const e of t)this.addExtension(e)}static fromExtensions(t){const e=[re(ee)];for(const n of t)e.push(re(n));return new ae(e)}static maybeFromEditor(t){const e=t[ne];return e&&(e.PACKAGE_VERSION!==ce&&Kt(292,e.PACKAGE_VERSION,ce),e instanceof ae||Kt(293)),e}static fromEditor(t){const e=ae.maybeFromEditor(t);return void 0===e&&Kt(294),e}constructEditor(){const{$initialEditorState:t,onError:e,...n}=this.buildCreateEditorArgs(),i=Object.assign(O({...n,...e?{onError:t=>{e(t,i)}}:{}}),{[ne]:this});for(const t of this.sortedExtensionReps())t.build(i);return i}buildEditor(){let t=oe;function e(){try{t()}finally{t=oe}}const n=Object.assign(this.constructEditor(),{dispose:e,[Symbol.dispose]:e});return t=R(this.registerEditor(n),()=>n.setRootElement(null)),n}hasExtensionByName(t){return this.extensionNameMap.has(t)}getExtensionRep(t){const e=this.extensionNameMap.get(t.name);if(e)return e.extension!==t&&Kt(295,t.name),e}addEdge(t,e,n){const i=this.outgoingConfigEdges.get(t);i?i.set(e,n):this.outgoingConfigEdges.set(t,new Map([[e,n]]));const o=this.incomingEdges.get(e);o?o.add(t):this.incomingEdges.set(e,new Set([t]))}addExtension(t){void 0!==this._sortedExtensionReps&&Kt(296);const e=re(t),[n]=e;\"string\"!=typeof n.name&&Kt(297,typeof n.name);let i=this.extensionNameMap.get(n.name);if(void 0!==i&&i.extension!==n&&Kt(298,n.name),!i){i=new Xt(this,n),this.extensionNameMap.set(n.name,i);const t=this.conflicts.get(n.name);\"string\"==typeof t&&Kt(299,n.name,t);for(const t of n.conflictsWith||[])this.extensionNameMap.has(t)&&Kt(299,n.name,t),this.conflicts.set(t,n.name);for(const t of n.dependencies||[]){const e=re(t);this.addEdge(n.name,e[0].name,e.slice(1)),this.addExtension(e)}for(const[t,e]of n.peerDependencies||[])this.addEdge(n.name,t,e?[e]:[])}}sortedExtensionReps(){if(this._sortedExtensionReps)return this._sortedExtensionReps;const t=[],e=(n,i)=>{let o=n.state;if(Ht(o))return;const s=n.extension.name;var r;Jt(o)||Kt(300,s,i||\"[unknown]\"),Jt(r=o)||Kt(304,String(r.id),String(Lt)),o=Object.assign(r,{id:Ut}),n.state=o;const c=this.outgoingConfigEdges.get(s);if(c)for(const t of c.keys()){const n=this.extensionNameMap.get(t);n&&e(n,s)}o=qt(o),n.state=o,t.push(n)};for(const t of this.extensionNameMap.values())Jt(t.state)&&e(t);for(const e of t)for(const[t,n]of this.outgoingConfigEdges.get(e.extension.name)||[])if(n.length>0){const e=this.extensionNameMap.get(t);if(e)for(const t of n)e.configs.add(t)}for(const[t,...e]of this.roots)if(e.length>0){const n=this.extensionNameMap.get(t.name);void 0===n&&Kt(301,t.name);for(const t of e)n.configs.add(t)}return this._sortedExtensionReps=t,this._sortedExtensionReps}registerEditor(t){const e=this.sortedExtensionReps(),n=new AbortController,i=[()=>n.abort()],o=n.signal;for(const n of e){const e=n.register(t,o);e&&i.push(e)}for(const n of e){const e=n.afterRegistration(t);e&&i.push(e)}return R(...i)}buildCreateEditorArgs(){const t={},e=new Set,n=new Map,i=new Map,o={},s={},r=this.sortedExtensionReps();for(const c of r){const{extension:r}=c;if(void 0!==r.onError&&(t.onError=r.onError),void 0!==r.disableEvents&&(t.disableEvents=r.disableEvents),void 0!==r.parentEditor&&(t.parentEditor=r.parentEditor),void 0!==r.editable&&(t.editable=r.editable),void 0!==r.namespace&&(t.namespace=r.namespace),void 0!==r.$initialEditorState&&(t.$initialEditorState=r.$initialEditorState),r.nodes)for(const t of Ct(r)){if(\"function\"!=typeof t){const e=n.get(t.replace);e&&Kt(302,r.name,t.replace.name,e.extension.name),n.set(t.replace,c)}e.add(t)}if(r.html){if(r.html.export)for(const[t,e]of r.html.export.entries())i.set(t,e);r.html.import&&Object.assign(o,r.html.import)}r.theme&&zt(s,r.theme)}Object.keys(s).length>0&&(t.theme=s),e.size&&(t.nodes=[...e]);const c=Object.keys(o).length>0,a=i.size>0;(c||a)&&(t.html={},c&&(t.html.import=o),a&&(t.html.export=i));for(const e of r)e.init(t);return t.onError||(t.onError=se),t}}function de(t,e){const n=ae.fromEditor(t).getExtensionRep(e);return void 0===n&&Kt(303,e.name),n.getExtensionDependency()}function ue(t,e){const n=ae.fromEditor(t).extensionNameMap.get(e);return n?n.getExtensionDependency():void 0}function fe(t,e){const n=ue(t,e);return void 0===n&&Kt(291,e),n}const le=new Set,he=t({build(t,e,n){const i=n.getDependency($t).output,o=ut({watchedNodeKeys:new Map}),r=kt(()=>{},()=>yt(()=>{const t=r.peek(),{watchedNodeKeys:e}=o.value;let n,c=!1;i.value.read(()=>{if(s())for(const[i,o]of e.entries()){if(0===o.size){e.delete(i);continue}const s=C(i),r=s&&s.isSelected()||!1;c=c||r!==(!!t&&t.has(i)),r&&(n=n||new Set,n.add(i))}}),!c&&n&&t&&n.size===t.size||(r.value=n)}));return{watchNodeKey:function(t){const e=pt(()=>(r.value||le).has(t)),{watchedNodeKeys:n}=o.peek();let i=n.get(t);const s=void 0!==i;return i=i||new Set,i.add(e),s||(n.set(t,i),o.value={watchedNodeKeys:n}),e}}},dependencies:[$t],name:\"@lexical/extension/NodeSelection\"}),ge=P(\"INSERT_HORIZONTAL_RULE_COMMAND\");class pe extends f{static getType(){return\"horizontalrule\"}static clone(t){return new pe(t.__key)}static importJSON(t){return ve().updateFromJSON(t)}static importDOM(){return{hr:()=>({conversion:me,priority:0})}}exportDOM(){return{element:document.createElement(\"hr\")}}createDOM(t){const e=document.createElement(\"hr\");return _(e,t.theme.hr),e}getTextContent(){return\"\\n\"}isInline(){return!1}updateDOM(){return!1}}function me(){return{node:ve()}}function ve(){return D(pe)}function xe(t){return t instanceof pe}const Ee=t({dependencies:[$t,he],name:\"@lexical/extension/HorizontalRule\",nodes:()=>[pe],register(t,e,n){const{watchNodeKey:o}=n.getDependency(he).output,r=ut({nodeSelections:new Map}),a=t._config.theme.hrSelected??\"selected\";return R(t.registerCommand(ge,t=>{const e=s();if(!c(e))return!1;if(null!==e.focus.getNode()){const t=ve();V(t)}return!0},i),t.registerCommand(F,t=>{if(M(t.target)){const e=I(t.target);if(xe(e))return function(t,e=!1){const n=s(),i=t.isSelected(),o=t.getKey();let r;e&&d(n)?r=n:(r=A(),j(r)),i?r.delete(o):r.add(o)}(e,t.shiftKey),!0}return!1},u),t.registerMutationListener(pe,(e,n)=>{X(()=>{let n=!1;const{nodeSelections:i}=r.peek();for(const[s,r]of e.entries())if(\"destroyed\"===r)i.delete(s),n=!0;else{const e=i.get(s),r=t.getElementByKey(s);e?e.domNode.value=r:(n=!0,i.set(s,{domNode:ut(r),selectedSignal:o(s)}))}n&&(r.value={nodeSelections:i})})}),yt(()=>{const t=[];for(const{domNode:e,selectedSignal:n}of r.value.nodeSelections.values())t.push(yt(()=>{const t=e.value;if(t){n.value?_(t,a):k(t,a)}}));return R(...t)}))}});const ye=t({build:(t,e)=>St({inheritEditableFromParent:e.inheritEditableFromParent}),config:e({$getParentEditor:function(){const t=$();return ae.fromEditor(t),t},inheritEditableFromParent:!1}),init:(t,e,n)=>{const i=e.$getParentEditor();t.parentEditor=i,t.theme=t.theme||i._config.theme},name:\"@lexical/extension/NestedEditor\",register:(t,e,n)=>yt(()=>{const e=t._parentEditor;if(e&&n.getOutput().inheritEditableFromParent.value)return t.setEditable(e.isEditable()),e.registerEditableListener(t.setEditable.bind(t))})}),Se=t({build:(t,e,n)=>St(e),config:e({disabled:!1,onReposition:void 0}),name:\"@lexical/utils/SelectionAlwaysOnDisplay\",register:(t,e,n)=>{const i=n.getOutput();return yt(()=>{if(!i.disabled.value)return Z(t,i.onReposition.value)})}});function be(t){return t.canBeEmpty()}function we(t,e,n=be){return R(t.registerCommand(K,e=>{const n=s();if(!c(n))return!1;e.preventDefault();const i=function(t){if(t.getNodes().filter(t=>B(t)&&t.canIndent()).length>0)return!0;const e=t.anchor,n=t.focus,i=n.isBefore(e)?n:e,o=i.getNode(),s=H(o);if(s.canIndent()){const t=s.getKey();let e=W();if(e.anchor.set(t,0,\"element\"),e.focus.set(t,0,\"element\"),e=G(e),e.anchor.is(i))return!0}return!1}(n)?e.shiftKey?z:L:U;return t.dispatchCommand(i,void 0)},i),t.registerCommand(L,()=>{const t=\"number\"==typeof e?e:e?e.peek():null,i=s();if(!c(i))return!1;const o=\"function\"==typeof n?n:n.peek();return J(e=>{if(o(e)){const n=e.getIndent()+1;(!t||nSt(e),config:e({$canIndent:be,disabled:!1,maxIndent:null}),name:\"@lexical/extension/TabIndentation\",register(t,e,n){const{disabled:i,maxIndent:o,$canIndent:s}=n.getOutput();return yt(()=>{if(!i.value)return we(t,o,s)})}});export{ve as $createHorizontalRuleNode,Mt as $isDecoratorTextNode,xe as $isHorizontalRuleNode,bt as AutoFocusExtension,Ot as ClearEditorExtension,jt as DecoratorTextExtension,Ft as DecoratorTextNode,$t as EditorStateExtension,Ee as HorizontalRuleExtension,pe as HorizontalRuleNode,ge as INSERT_HORIZONTAL_RULE_COMMAND,ee as InitialStateExtension,ae as LexicalBuilder,ye as NestedEditorExtension,he as NodeSelectionExtension,Se as SelectionAlwaysOnDisplayExtension,Ne as TabIndentationExtension,It as applyFormatFromStyle,_t as applyFormatToDom,X as batch,ie as buildEditorFromExtensions,pt as computed,yt as effect,de as getExtensionDependencyFromEditor,Rt as getKnownTypesAndNodes,ue as getPeerDependencyFromEditor,fe as getPeerDependencyFromEditorOrThrow,St as namedSignals,Nt as registerClearEditor,we as registerTabIndentation,ut as signal,et as untracked,kt as watchedSignal};\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{defineExtension as e}from\"lexical\";const r=e({name:\"@lexical/react/ReactProvider\"});export{r as ReactProviderExtension};\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{$getRoot as t,$isDecoratorNode as e,$isElementNode as n,$isParagraphNode as r,$isTextNode as i,TextNode as o,$createTextNode as l}from\"lexical\";function s(){return t().getTextContent()}function f(t,e=!0){if(t)return!1;let n=s();return e&&(n=n.trim()),\"\"===n}function u(t,e){return()=>f(t,e)}function c(o){if(!f(o,!1))return!1;const l=t().getChildren(),s=l.length;if(s>1)return!1;for(let t=0;tc(t)}function a(t,e){let r=t.getFirstChild(),o=0;t:for(;null!==r;){if(n(r)){const t=r.getFirstChild();if(null!==t){r=t;continue}}else if(i(r)){const t=r.getTextContentSize();if(o+t>e)return{node:r,offset:e-o};o+=t}const t=r.getNextSibling();if(null!==t){r=t;continue}let l=r.getParent();for(;null!==l;){const t=l.getNextSibling();if(null!==t){r=t;continue t}l=l.getParent()}break}return null}function d(t,...e){const n=new URL(\"https://lexical.dev/docs/error\"),r=new URLSearchParams;r.append(\"code\",t);for(const t of e)r.append(\"v\",t);throw n.search=r.toString(),Error(`Minified Lexical error #${t}; visit ${n.toString()} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}function x(t,e,n,r){const s=t=>t instanceof n,f=t=>{const e=l(t.getTextContent());e.setFormat(t.getFormat()),t.replace(e)};return[t.registerNodeTransform(o,t=>{if(!t.isSimpleText())return;let n,o=t.getPreviousSibling(),l=t.getTextContent(),u=t;if(i(o)){const n=o.getTextContent(),r=e(n+l);if(s(o)){if(null===r||0!==(t=>t.getLatest().__mode)(o))return void f(o);{const e=r.end-n.length;if(e>0){const r=n+l.slice(0,e);if(o.select(),o.setTextContent(r),e===l.length)t.remove();else{const n=l.slice(e);t.setTextContent(n)}return}}}else if(null===r||r.start{const n=t.getTextContent(),r=e(n);if(null===r||0!==r.start)return void f(t);if(n.length>r.end)return void t.splitText(r.end);const o=t.getPreviousSibling();i(o)&&o.isTextEntity()&&(f(o),f(t));const l=t.getNextSibling();i(l)&&l.isTextEntity()&&(f(l),s(t)&&f(t))})]}export{c as $canShowPlaceholder,g as $canShowPlaceholderCurry,a as $findTextIntersectionFromCharacters,f as $isRootTextContentEmpty,u as $isRootTextContentEmptyCurry,s as $rootTextContent,x as registerLexicalTextEntity};\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{effect as e,namedSignals as t}from\"@lexical/extension\";import{defineExtension as n,safeCast as o,$getSelection as i,$isRangeSelection as a,$isTextNode as r}from\"lexical\";function s(e){const t=window.location.origin,n=n=>{if(n.origin!==t)return;const o=e.getRootElement();if(document.activeElement!==o)return;const s=n.data;if(\"string\"==typeof s){let t;try{t=JSON.parse(s)}catch(e){return}if(t&&\"nuanria_messaging\"===t.protocol&&\"request\"===t.type){const o=t.payload;if(o&&\"makeChanges\"===o.functionId){const t=o.args;if(t){const[o,s,d,c,g]=t;e.update(()=>{const e=i();if(a(e)){const t=e.anchor;let i=t.getNode(),a=0,l=0;if(r(i)&&o>=0&&s>=0&&(a=o,l=o+s,e.setTextNodeRange(i,a,i,l)),a===l&&\"\"===d||(e.insertRawText(d),i=t.getNode()),r(i)){a=c,l=c+g;const t=i.getTextContentSize();a=a>t?t:a,l=l>t?t:l,e.setTextNodeRange(i,a,i,l)}n.stopImmediatePropagation()}})}}}}};return window.addEventListener(\"message\",n,!0),()=>{window.removeEventListener(\"message\",n,!0)}}const d=n({build:(e,n,o)=>t(n),config:o({disabled:\"undefined\"==typeof window}),name:\"@lexical/dragon\",register:(t,n,o)=>e(()=>o.getOutput().disabled.value?void 0:s(t))});export{d as DragonExtension,s as registerDragonSupport};\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{useLexicalComposerContext as r}from\"@lexical/react/LexicalComposerContext\";import{useLexicalEditable as e}from\"@lexical/react/useLexicalEditable\";import{LexicalBuilder as t}from\"@lexical/extension\";import{ReactProviderExtension as o}from\"@lexical/react/ReactProviderExtension\";import{useLayoutEffect as n,useEffect as i,useState as c,useMemo as a,Suspense as l}from\"react\";import{flushSync as s,createPortal as u}from\"react-dom\";import{jsx as d,jsxs as f,Fragment as m}from\"react/jsx-runtime\";import{$canShowPlaceholderCurry as p}from\"@lexical/text\";import{mergeRegister as x}from\"@lexical/utils\";import{registerDragonSupport as E}from\"@lexical/dragon\";import{registerRichText as h}from\"@lexical/rich-text\";function g(r,...e){const t=new URL(\"https://lexical.dev/docs/error\"),o=new URLSearchParams;o.append(\"code\",r);for(const r of e)o.append(\"v\",r);throw t.search=o.toString(),Error(`Minified Lexical error #${r}; visit ${t.toString()} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}const y=\"undefined\"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?n:i;function w({editor:r,ErrorBoundary:e}){return function(r,e){const[t,o]=c(()=>r.getDecorators());return y(()=>r.registerDecoratorListener(r=>{s(()=>{o(r)})}),[r]),i(()=>{o(r.getDecorators())},[r]),a(()=>{const o=[],n=Object.keys(t);for(let i=0;ir._onError(e),children:d(l,{fallback:null,children:t[c]})}),s=r.getElementByKey(c);null!==s&&o.push(u(a,s,c))}return o},[e,t,r])}(r,e)}function v({editor:r,ErrorBoundary:e}){return function(r){const e=t.maybeFromEditor(r);if(e&&e.hasExtensionByName(o.name)){for(const r of[\"@lexical/plain-text\",\"@lexical/rich-text\"])e.hasExtensionByName(r)&&g(320,r);return!0}return!1}(r)?null:d(w,{editor:r,ErrorBoundary:e})}function B(r){return r.getEditorState().read(p(r.isComposing()))}function L({contentEditable:e,placeholder:t=null,ErrorBoundary:o}){const[n]=r();return function(r){y(()=>x(h(r),E(r)),[r])}(n),f(m,{children:[e,d(b,{content:t}),d(v,{editor:n,ErrorBoundary:o})]})}function b({content:t}){const[o]=r(),n=function(r){const[e,t]=c(()=>B(r));return y(()=>{function e(){const e=B(r);t(e)}return e(),x(r.registerUpdateListener(()=>{e()}),r.registerEditableListener(()=>{e()}))},[r]),e}(o),i=e();return n?\"function\"==typeof t?t(i):t:null}export{L as RichTextPlugin};\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{useLexicalComposerContext as e}from\"@lexical/react/LexicalComposerContext\";import{useEffect as t}from\"react\";function o({defaultSelection:o}){const[l]=e();return t(()=>{l.focus(()=>{const e=document.activeElement,t=l.getRootElement();null===t||null!==e&&t.contains(e)||t.focus({preventScroll:!0})},{defaultSelection:o})},[o,l]),null}export{o as AutoFocusPlugin};\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{registerClearEditor as o}from\"@lexical/extension\";import{useLexicalComposerContext as e}from\"@lexical/react/LexicalComposerContext\";import{useLayoutEffect as n,useEffect as t}from\"react\";const i=\"undefined\"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?n:t;function r({onClear:n}){const[t]=e();return i(()=>o(t,n),[t,n]),null}export{r as ClearEditorPlugin};\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{useLexicalComposerContext as e}from\"@lexical/react/LexicalComposerContext\";import{useLayoutEffect as t,useEffect as i,forwardRef as a,useState as r,useCallback as n,useMemo as o}from\"react\";import{jsx as l,jsxs as d,Fragment as c}from\"react/jsx-runtime\";import{$canShowPlaceholderCurry as s}from\"@lexical/text\";import{mergeRegister as u}from\"@lexical/utils\";const m=\"undefined\"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?t:i;function f({editor:e,ariaActiveDescendant:t,ariaAutoComplete:i,ariaControls:a,ariaDescribedBy:d,ariaErrorMessage:c,ariaExpanded:s,ariaInvalid:u,ariaLabel:f,ariaLabelledBy:b,ariaMultiline:p,ariaOwns:x,ariaRequired:E,autoCapitalize:v,className:w,id:y,role:C=\"textbox\",spellCheck:g=!0,style:L,tabIndex:h,\"data-testid\":D,...I},R){const[k,q]=r(e.isEditable()),z=n(t=>{t&&t.ownerDocument&&t.ownerDocument.defaultView?e.setRootElement(t):e.setRootElement(null)},[e]),A=o(()=>function(...e){return t=>{for(const i of e)\"function\"==typeof i?i(t):null!=i&&(i.current=t)}}(R,z),[z,R]);return m(()=>(q(e.isEditable()),e.registerEditableListener(e=>{q(e)})),[e]),l(\"div\",{\"aria-activedescendant\":k?t:void 0,\"aria-autocomplete\":k?i:\"none\",\"aria-controls\":k?a:void 0,\"aria-describedby\":d,...null!=c?{\"aria-errormessage\":c}:{},\"aria-expanded\":k&&\"combobox\"===C?!!s:void 0,...null!=u?{\"aria-invalid\":u}:{},\"aria-label\":f,\"aria-labelledby\":b,\"aria-multiline\":p,\"aria-owns\":k?x:void 0,\"aria-readonly\":!k||void 0,\"aria-required\":E,autoCapitalize:v,className:w,contentEditable:k,\"data-testid\":D,id:y,ref:A,role:C,spellCheck:g,style:L,tabIndex:h,...I})}const b=a(f);function p(e){return e.getEditorState().read(s(e.isComposing()))}const x=a(E);function E(t,i){const{placeholder:a,...r}=t,[n]=e();return d(c,{children:[l(b,{editor:n,...r,ref:i}),null!=a&&l(v,{editor:n,content:a})]})}function v({content:e,editor:i}){const a=function(e){const[t,i]=r(()=>p(e));return m(()=>{function t(){const t=p(e);i(t)}return t(),u(e.registerUpdateListener(()=>{t()}),e.registerEditableListener(()=>{t()}))},[e]),t}(i),[n,o]=r(i.isEditable());if(t(()=>(o(i.isEditable()),i.registerEditableListener(e=>{o(e)})),[i]),!a)return null;let d=null;return\"function\"==typeof e?d=e(n):null!==e&&(d=e),null===d?null:l(\"div\",{\"aria-hidden\":!0,children:d})}export{x as ContentEditable,b as ContentEditableElement};\n","/**\n * This file was automatically generated on installation of the Shadcn/Lexical editor. The default\n * location of this file has been changed to integrate better with our project structure. Also,\n * modifications have been made to integrate with our codebase.\n *\n * Original file location: src/components/editor/editor-ui/content-editable.tsx\n *\n * Shadcn/Lexical Editor Documentation: https://shadcn-editor.vercel.app/docs/\n */\n\nimport { ReactNode } from 'react';\nimport { ContentEditable as LexicalContentEditable } from '@lexical/react/LexicalContentEditable';\n\ntype Props = {\n placeholder: string;\n className?: string;\n placeholderClassName?: string;\n};\n\nexport function ContentEditable({\n placeholder,\n className,\n placeholderClassName,\n}: Props): ReactNode {\n return (\n \n {placeholder}\n \n }\n />\n );\n}\n","/**\n * This file was automatically generated on installation of the Shadcn/Lexical editor. The default\n * location of this file has been changed to integrate better with our project structure.\n *\n * Original file location: src/components/editor/context/toolbar-context.tsx\n *\n * Shadcn/Lexical Editor Documentation: https://shadcn-editor.vercel.app/docs/\n */\n\n'use client';\n\nimport { createContext, ReactNode, useContext, useMemo } from 'react';\nimport { LexicalEditor } from 'lexical';\n\nconst Context = createContext<\n | {\n activeEditor: LexicalEditor;\n $updateToolbar: () => void;\n blockType: string;\n setBlockType: (blockType: string) => void;\n showModal: (title: string, showModal: (onClose: () => void) => ReactNode) => void;\n }\n | undefined\n>(undefined);\n\nexport function ToolbarContext({\n activeEditor,\n $updateToolbar,\n blockType,\n setBlockType,\n showModal,\n children,\n}: {\n activeEditor: LexicalEditor;\n $updateToolbar: () => void;\n blockType: string;\n setBlockType: (blockType: string) => void;\n showModal: (title: string, showModal: (onClose: () => void) => ReactNode) => void;\n children: ReactNode;\n}) {\n const contextValue = useMemo(\n () => ({\n activeEditor,\n $updateToolbar,\n blockType,\n setBlockType,\n showModal,\n }),\n [activeEditor, $updateToolbar, blockType, setBlockType, showModal],\n );\n\n return {children};\n}\n\nexport function useToolbarContext() {\n const context = useContext(Context);\n if (!context) {\n throw new Error('useToolbarContext must be used within a ToolbarContext provider');\n }\n return context;\n}\n","/**\n * This file was automatically generated on installation of the Shadcn/Lexical editor. The default\n * location of this file has been changed to integrate better with our project structure.\n *\n * Original file location: src/components/editor/editor-hooks/use-modal.tsx\n *\n * Shadcn/Lexical Editor Documentation: https://shadcn-editor.vercel.app/docs/\n */\n\nimport { ReactNode, useCallback, useMemo, useState } from 'react';\n\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/shadcn-ui/dialog';\n\nexport function useEditorModal(): [\n ReactNode | undefined,\n (title: string, showModal: (onClose: () => void) => ReactNode) => void,\n] {\n const [modalContent, setModalContent] = useState<\n | {\n closeOnClickOutside: boolean;\n content: ReactNode;\n title: string;\n }\n | undefined\n >(undefined);\n\n const onClose = useCallback(() => {\n setModalContent(undefined);\n }, []);\n\n const modal = useMemo(() => {\n if (modalContent === undefined) {\n return undefined;\n }\n const { title, content } = modalContent;\n return (\n \n \n \n {title}\n \n {content}\n \n \n );\n }, [modalContent, onClose]);\n\n const showModal = useCallback(\n (\n title: string,\n getContent: (onClose: () => void) => ReactNode,\n closeOnClickOutside = false,\n ) => {\n setModalContent({\n closeOnClickOutside,\n content: getContent(onClose),\n title,\n });\n },\n [onClose],\n );\n\n return [modal, showModal];\n}\n","/**\n * This file was automatically generated on installation of the Shadcn/Lexical editor. The default\n * location of this file has been changed to integrate better with our project structure.\n *\n * Original file location: src/components/editor/plugins/toolbar/toolbar-plugin.tsx\n *\n * Shadcn/Lexical Editor Documentation: https://shadcn-editor.vercel.app/docs/\n *\n * Documentation for the Toolbar Plugin-framework:\n * https://shadcn-editor.vercel.app/docs/plugins/toolbar\n */\n\nimport { ReactNode, useEffect, useState } from 'react';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { COMMAND_PRIORITY_CRITICAL, SELECTION_CHANGE_COMMAND } from 'lexical';\n\nimport { ToolbarContext } from '@/components/advanced/editor/context/toolbar-context';\nimport { useEditorModal } from '@/components/advanced/editor/editor-hooks/use-modal';\n\nexport function ToolbarPlugin({\n children,\n}: {\n children: (props: { blockType: string }) => ReactNode;\n}) {\n const [editor] = useLexicalComposerContext();\n\n const [activeEditor, setActiveEditor] = useState(editor);\n const [blockType, setBlockType] = useState('paragraph');\n\n const [modal, showModal] = useEditorModal();\n\n const $updateToolbar = () => {};\n\n useEffect(() => {\n return activeEditor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n (_payload, newEditor) => {\n setActiveEditor(newEditor);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n );\n }, [activeEditor]);\n\n return (\n \n {modal}\n\n {children({ blockType })}\n \n );\n}\n","/**\n * This file was automatically generated on installation of the Shadcn/Lexical editor. The default\n * location of this file has been changed to integrate better with our project structure.\n *\n * Original file location: src/components/editor/editor-hooks/use-update-toolbar.ts\n *\n * Shadcn/Lexical Editor Documentation: https://shadcn-editor.vercel.app/docs/\n */\n\nimport { useEffect } from 'react';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport {\n $getSelection,\n BaseSelection,\n COMMAND_PRIORITY_CRITICAL,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical';\n\nimport { useToolbarContext } from '@/components/advanced/editor/context/toolbar-context';\n\nexport function useUpdateToolbarHandler(callback: (selection: BaseSelection) => void) {\n const [editor] = useLexicalComposerContext();\n const { activeEditor } = useToolbarContext();\n\n useEffect(() => {\n return activeEditor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n const selection = $getSelection();\n if (selection) {\n callback(selection);\n }\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n );\n /**\n * We use `editor` (not `activeEditor`) in the dependency array because `activeEditor` can\n * change frequently. Re-registering the command on every `activeEditor` change would be\n * unnecessary. We only need to re-register when the main editor instance or callback changes.\n */\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editor, callback]);\n\n useEffect(() => {\n activeEditor.getEditorState().read(() => {\n const selection = $getSelection();\n if (selection) {\n callback(selection);\n }\n });\n }, [activeEditor, callback]);\n}\n","/**\n * This file was automatically generated on installation of the Shadcn/Lexical editor. The default\n * location of this file has been changed to integrate better with our project structure.\n *\n * Original file location: src/components/editor/plugins/toolbar/font-format-toolbar-plugin.tsx\n *\n * Shadcn/Lexical Editor Documentation: https://shadcn-editor.vercel.app/docs/\n *\n * Documentation for this specific plugin:\n * https://shadcn-editor.vercel.app/docs/plugins/toolbar/font-format-toolbar\n */\n\nimport { useCallback, useState } from 'react';\nimport { $isTableSelection } from '@lexical/table';\nimport { $isRangeSelection, BaseSelection, FORMAT_TEXT_COMMAND } from 'lexical';\nimport { BoldIcon, ItalicIcon } from 'lucide-react';\n\nimport { useToolbarContext } from '@/components/advanced/editor/context/toolbar-context';\nimport { useUpdateToolbarHandler } from '@/components/advanced/editor/editor-hooks/use-update-toolbar';\nimport { ToggleGroup, ToggleGroupItem } from '@/components/shadcn-ui/toggle-group';\n\nconst FORMATS = [\n { format: 'bold', icon: BoldIcon, label: 'Bold' },\n { format: 'italic', icon: ItalicIcon, label: 'Italic' },\n // CUSTOM: TJ removed underline and strikethrough as they are not supported by the current comment\n // data conversion and are not in P9 anyway. We can add these back if we ever get this supported.\n /* { format: 'underline', icon: UnderlineIcon, label: 'Underline' },\n { format: 'strikethrough', icon: StrikethroughIcon, label: 'Strikethrough' }, */\n] as const;\n\nexport function FontFormatToolbarPlugin() {\n const { activeEditor } = useToolbarContext();\n const [activeFormats, setActiveFormats] = useState([]);\n\n const $updateToolbar = useCallback((selection: BaseSelection) => {\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n const formats: string[] = [];\n FORMATS.forEach(({ format }) => {\n if (selection.hasFormat(format)) {\n formats.push(format);\n }\n });\n setActiveFormats((prev) => {\n // Only update if formats have changed\n if (prev.length !== formats.length || !formats.every((f) => prev.includes(f))) {\n return formats;\n }\n return prev;\n });\n }\n }, []);\n\n useUpdateToolbarHandler($updateToolbar);\n\n return (\n \n {FORMATS.map(({ format, icon: Icon, label }) => (\n {\n activeEditor.dispatchCommand(FORMAT_TEXT_COMMAND, format);\n }}\n >\n \n \n ))}\n \n );\n}\n","/**\n * This file was automatically generated on installation of the Shadcn/Lexical editor. The default\n * location of this file has been changed to integrate better with our project structure. Also,\n * modifications have been made to integrate with our codebase.\n *\n * Original file location: src/components/blocks/editor-00/plugins.tsx\n *\n * Shadcn/Lexical Editor Documentation: https://shadcn-editor.vercel.app/docs/\n */\n\nimport { ReactNode, useEffect, useState } from 'react';\nimport { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary';\nimport { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin';\nimport { AutoFocusPlugin } from '@lexical/react/LexicalAutoFocusPlugin';\nimport { ClearEditorPlugin } from '@lexical/react/LexicalClearEditorPlugin';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { CLEAR_EDITOR_COMMAND } from 'lexical';\n\nimport { ContentEditable } from '@/components/advanced/editor/editor-ui/content-editable';\nimport { ToolbarPlugin } from '@/components/advanced/editor/plugins/toolbar/toolbar-plugin';\nimport { FontFormatToolbarPlugin } from '@/components/advanced/editor/plugins/toolbar/font-format-toolbar-plugin';\n\nfunction ClearEditorBridge({ onClear }: { onClear?: (clearFn: () => void) => void }) {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (onClear) {\n onClear(() => {\n editor.dispatchCommand(CLEAR_EDITOR_COMMAND, undefined);\n });\n }\n }, [editor, onClear]);\n\n return undefined;\n}\n\nexport function Plugins({\n placeholder = 'Start typing ...',\n autoFocus = false,\n onClear,\n actions,\n}: {\n placeholder?: string;\n autoFocus?: boolean;\n onClear?: (clearFn: () => void) => void;\n actions?: ReactNode;\n}) {\n const [, setFloatingAnchorElem] = useState(undefined);\n\n const onRef = (_floatingAnchorElem: HTMLDivElement) => {\n if (_floatingAnchorElem !== undefined) {\n setFloatingAnchorElem(_floatingAnchorElem);\n }\n };\n\n return (\n
\n {/* toolbar plugins */}\n \n {() => (\n // Sticky, but deliberately with no z-index of its own. `position: sticky` pins relative\n // to the nearest scrolling ancestor, not this element's own overflow — `Plugins` is\n // shared by consumers (e.g. the comments panel's editor, whose scrolling ancestor is the\n // thread list) where the toolbar does need to stay pinned while its container scrolls.\n // With z-index left at its default (auto), this box establishes no stacking level of its\n // own, so a host's positioned chrome with an explicit z-index (e.g. a sticky panel\n // header) paints above it on stacking order rather than losing to it on DOM position.\n \n \n
\n )}\n \n\n
\n \n \n
\n }\n ErrorBoundary={LexicalErrorBoundary}\n />\n {autoFocus && }\n\n \n \n {/* editor plugins */}\n \n {actions && (\n \n {actions}\n \n )}\n \n );\n}\n","/**\n * This file was automatically generated on installation of the Shadcn/Lexical editor. The default\n * location of this file has been changed to integrate better with our project structure. Also,\n * modifications have been made to integrate with our codebase.\n *\n * Original file location: src/components/blocks/editor-00/editor.tsx\n *\n * Shadcn/Lexical Editor Documentation: https://shadcn-editor.vercel.app/docs/\n */\n\nimport { InitialConfigType, LexicalComposer } from '@lexical/react/LexicalComposer';\nimport { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin';\nimport { EditorState, SerializedEditorState } from 'lexical';\nimport { ReactNode, useCallback, useState } from 'react';\n\nimport { editorTheme } from '@/components/advanced/editor/themes/editor-theme';\nimport { TooltipProvider } from '@/components/shadcn-ui/tooltip';\nimport { cn } from '@/utils/shadcn-ui/utils';\n\nimport { nodes } from './nodes';\nimport { Plugins } from './plugins';\n\nconst editorConfig: InitialConfigType = {\n namespace: 'commentEditor',\n theme: editorTheme,\n nodes,\n onError: (error: Error) => {\n console.error(error);\n },\n};\n\n/**\n * Shadcn UI based Lexical Editor component\n *\n * Documentation: https://shadcn-editor.vercel.app/docs/\n */\nexport function Editor({\n editorState,\n editorSerializedState,\n onChange,\n onSerializedChange,\n placeholder = 'Start typing…',\n autoFocus = false,\n onClear,\n className,\n actions,\n}: {\n editorState?: EditorState;\n editorSerializedState?: SerializedEditorState;\n onChange?: (editorState: EditorState) => void;\n onSerializedChange?: (editorSerializedState: SerializedEditorState) => void;\n placeholder?: string;\n autoFocus?: boolean;\n onClear?: (clearFn: () => void) => void;\n className?: string;\n /**\n * Optional controls rendered inside the editor's bordered box, below the content area — e.g. a\n * comment's assign and submit buttons. Placed after the content in DOM order so tab order runs\n * from the text to the actions.\n */\n actions?: ReactNode;\n}) {\n // `LexicalComposer` reads `initialConfig` only once, at mount (it is genuinely an \"initial\"\n // config, not a controlled prop) — so building it fresh on every render, `JSON.stringify` of\n // `editorSerializedState` included, redoes work whose result is thrown away on every render but\n // the first. `useState`'s lazy initializer runs exactly once (unlike `useMemo`, which React does\n // not guarantee to cache permanently), matching how the value is actually consumed.\n const [initialConfig] = useState(() => ({\n ...editorConfig,\n ...(editorState ? { editorState } : {}),\n ...(editorSerializedState ? { editorState: JSON.stringify(editorSerializedState) } : {}),\n }));\n\n const handleChange = useCallback(\n (latestEditorState: EditorState) => {\n onChange?.(latestEditorState);\n onSerializedChange?.(latestEditorState.toJSON());\n },\n [onChange, onSerializedChange],\n );\n\n return (\n // CUSTOM: Added `className` prop\n \n \n \n \n\n \n \n \n \n );\n}\n","import { editorTheme } from '@/components/advanced/editor/themes/editor-theme';\nimport { createHeadlessEditor } from '@lexical/headless';\nimport { $generateHtmlFromNodes, $generateNodesFromDOM } from '@lexical/html';\nimport {\n $getRoot,\n $insertNodes,\n SerializedEditorState,\n SerializedElementNode,\n SerializedLexicalNode,\n SerializedTextNode,\n} from 'lexical';\nimport React from 'react';\nimport { nodes } from './nodes';\n\n/**\n * Focus a content-editable element within a container and move the cursor to the end\n *\n * @param container - The container element to search within\n * @returns True if a content-editable element was found and focused, false otherwise\n */\nexport function focusContentEditable(container: HTMLElement): boolean {\n const contentEditableField = container.querySelector('[contenteditable=\"true\"]');\n if (!contentEditableField) return false;\n\n contentEditableField.focus();\n\n // Move cursor to the end\n const selection = window.getSelection();\n const range = document.createRange();\n range.selectNodeContents(contentEditableField);\n range.collapse(false); // false = collapse to end\n selection?.removeAllRanges();\n selection?.addRange(range);\n\n return true;\n}\n\n/**\n * Recursively check if any children have meaningful editor content\n *\n * @param children - Array of serialized lexical nodes to check\n * @returns True if any child has content, false otherwise\n */\nfunction doChildrenHaveEditorContent(\n children: (SerializedLexicalNode | SerializedElementNode | SerializedTextNode)[] | undefined,\n): boolean {\n if (!children) return false;\n\n return children.some(\n (child: SerializedLexicalNode | SerializedElementNode | SerializedTextNode) => {\n if (child && 'text' in child && child.text.trim().length > 0) return true;\n\n if (!child || !('children' in child)) return false;\n\n return doChildrenHaveEditorContent(child.children);\n },\n );\n}\n\n/**\n * Check if the editor state has any meaningful content\n *\n * @param editorState - SerializedEditorState to check\n * @returns True if the editor has content, false if it's empty\n */\nexport function hasEditorContent(editorState: SerializedEditorState | undefined): boolean {\n if (!editorState?.root?.children) return false;\n return doChildrenHaveEditorContent(editorState.root.children);\n}\n\n/**\n * Convert HTML string to Lexical SerializedEditorState\n *\n * @param html - HTML string to convert\n * @returns SerializedEditorState that can be used with the Editor component\n */\nexport function htmlToEditorState(html: string): SerializedEditorState {\n if (!html || html.trim() === '') {\n throw new Error('Input HTML is empty');\n }\n\n const editor = createHeadlessEditor({\n namespace: 'EditorUtils',\n theme: editorTheme,\n nodes,\n onError: (error: Error) => {\n console.error(error);\n },\n });\n\n let serializedState: SerializedEditorState | undefined;\n\n editor.update(\n () => {\n const parser = new DOMParser();\n const dom = parser.parseFromString(html, 'text/html');\n const generatedNodes = $generateNodesFromDOM(editor, dom);\n\n $getRoot().clear();\n $insertNodes(generatedNodes);\n },\n {\n discrete: true,\n },\n );\n\n editor.getEditorState().read(() => {\n serializedState = editor.getEditorState().toJSON();\n });\n\n if (!serializedState) {\n throw new Error('Failed to convert HTML to editor state');\n }\n\n return serializedState;\n}\n\n/**\n * Convert Lexical SerializedEditorState to HTML string\n *\n * @param editorState - SerializedEditorState to convert\n * @returns HTML string\n */\nexport function editorStateToHtml(editorState: SerializedEditorState): string {\n const editor = createHeadlessEditor({\n namespace: 'EditorUtils',\n theme: editorTheme,\n nodes,\n onError: (error: Error) => {\n console.error(error);\n },\n });\n\n const parsedEditorState = editor.parseEditorState(JSON.stringify(editorState));\n editor.setEditorState(parsedEditorState);\n\n let html = '';\n\n editor.getEditorState().read(() => {\n html = $generateHtmlFromNodes(editor);\n });\n\n // Clean up the HTML to remove Shadcn/Lexical-specific attributes and simplify structure\n html = html\n // Remove style attributes\n .replace(/\\s+style=\"[^\"]*\"/g, '')\n // Remove all class attributes (including Tailwind classes)\n .replace(/\\s+class=\"[^\"]*\"/g, '')\n // Remove empty spans\n .replace(/(.*?)<\\/span>/g, '$1')\n // Simplify nested bold tags (e.g., text -> text)\n .replace(/]*>(.*?)<\\/strong><\\/b>/g, '$1')\n .replace(/]*>(.*?)<\\/b><\\/strong>/g, '$1')\n // Simplify nested italic tags (e.g., text -> text)\n .replace(/]*>(.*?)<\\/em><\\/i>/g, '$1')\n .replace(/]*>(.*?)<\\/i><\\/em>/g, '$1')\n // Simplify nested underline tags (e.g., text -> text)\n .replace(/]*>(.*?)<\\/span><\\/u>/g, '$1')\n // Simplify nested strikethrough tags (e.g., text -> text)\n .replace(/]*>(.*?)<\\/span><\\/s>/g, '$1')\n // Convert all
variants to XML-compatible
for Paratext\n .replace(//gi, '
');\n\n return html;\n}\n\n/**\n * Handle keyboard events for editor navigation to prevent parent listbox from intercepting\n * navigation keys. This should be used on a container wrapping the Editor component.\n *\n * @param event - The keyboard event\n * @returns True if the event was handled (and should be stopped from propagating), false otherwise\n */\nexport function handleEditorKeyNavigation(event: React.KeyboardEvent): boolean {\n // Keys that should be kept within the editor for navigation\n const navigationKeys = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End'];\n\n if (navigationKeys.includes(event.key)) {\n event.stopPropagation();\n return true;\n }\n\n return false;\n}\n","import { Button } from '@/components/shadcn-ui/button';\nimport { ButtonGroup, ButtonGroupSeparator } from '@/components/shadcn-ui/button-group';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/shadcn-ui/tooltip';\nimport { Check, X } from 'lucide-react';\n\n/**\n * Object containing all keys used for localization in this component. If you're using this\n * component in an extension, you can pass it into the useLocalizedStrings hook to easily obtain the\n * localized strings and pass them into the localizedStrings prop of this component.\n */\nexport const CANCEL_ACCEPT_BUTTONS_STRING_KEYS = Object.freeze([\n '%cancelButton_tooltip%',\n '%acceptButton_tooltip%',\n] as const);\n\nexport type CancelAcceptButtonsLocalizedStrings = {\n [key in (typeof CANCEL_ACCEPT_BUTTONS_STRING_KEYS)[number]]?: string;\n};\n\nconst localizeString = (\n strings: CancelAcceptButtonsLocalizedStrings,\n key: keyof CancelAcceptButtonsLocalizedStrings,\n) => strings[key] ?? key;\n\nexport type CancelAcceptButtonsProps = {\n /** Function to call when Cancel is clicked. */\n onCancelClick: () => void;\n /** Function to call when Accept is clicked. */\n onAcceptClick: () => void;\n /** Whether the Accept button is enabled. */\n canAccept?: boolean;\n /**\n * Localized strings for button tooltips and aria-labels. Falls back to the key itself if not\n * provided.\n */\n localizedStrings?: CancelAcceptButtonsLocalizedStrings;\n /** CSS class name for the buttons. Defaults to \"tw:h-6 tw:w-6\". */\n className?: string;\n /**\n * Optional context-specific label for the accept button (e.g. \"Save Comment\", \"Save Footnote\").\n * When provided, overrides the generic `%acceptButton_tooltip%` localized string.\n */\n acceptLabel?: string;\n};\n\n/**\n * Cancel and Accept buttons with tooltips in a ButtonGroup. Suitable for use in any editor toolbar.\n * Tooltip text defaults to the localization key if no localized strings are provided.\n */\nexport function CancelAcceptButtons({\n onCancelClick,\n onAcceptClick,\n canAccept = true,\n localizedStrings = {},\n className = 'tw:h-6 tw:w-6',\n acceptLabel,\n}: CancelAcceptButtonsProps) {\n const cancelLocalized = localizeString(localizedStrings, '%cancelButton_tooltip%');\n const acceptLocalized = acceptLabel ?? localizeString(localizedStrings, '%acceptButton_tooltip%');\n\n return (\n \n \n \n \n \n \n \n \n \n

{cancelLocalized}

\n
\n
\n
\n \n \n \n \n \n \n \n \n \n

{acceptLocalized}

\n
\n
\n
\n
\n );\n}\n\nexport default CancelAcceptButtons;\n","import { ConflictResolutionOptions, LanguageStrings, LegacyComment } from 'platform-bible-utils';\n\n// Re-export so this module (and the platform-bible-react barrel) stays the import site for the\n// ConflictNoteCard's resolution types. The single definition lives in platform-bible-utils.\nexport type { ConflictResolutionOptions };\n\n/**\n * The conflict card's action state. Extends the backend {@link ConflictResolutionOptions} with a\n * client-only `'loading'` sentinel used while the getConflictResolutionOptions result is in flight,\n * so the card can render a skeleton instead of momentarily flashing the read-only \"resolved\" view.\n * `'loading'` is deliberately NOT part of the platform-bible-utils contract - it never crosses the\n * C#<->TS boundary.\n */\nexport type ConflictCardActions = ConflictResolutionOptions | 'loading';\n\n/**\n * The one conflict type whose root note carries discrete diff/result text and drives the\n * ConflictNoteCard. Shared so the card and the comment thread test the same literal.\n */\nexport const VERSE_TEXT_CONFLICT = 'verseText';\n\n/**\n * The resolution a user picks for a conflict: keep the accepted (winning) side, take the rejected\n * (losing) side, or merge (combine) both sides.\n */\nexport type ConflictResolution = 'accept' | 'reject' | 'merge';\n\n/**\n * How an already-resolved conflict was resolved, derived from the resolution comment's\n * `conflictResolutionAction`:\n *\n * - `'accept'`: resolved by accepting (no text was written); the accepted side stands.\n * - `'reject'`: resolved by rejecting (the rejected side was written into the verse).\n * - `'merged'`: resolved by combining both changes (PT10's \"Combine both changes\" option, or a PT9\n * three-way merge). The card shows the merged verse text (`mergedText`); the outcome itself is\n * stated in prose by CommentItem's resolution-reply banner, not on the card.\n *\n * Distinct from {@link ConflictResolution} (the live accept/reject choice) because it adds the\n * `'merged'` legacy outcome and is only meaningful for a conflict that is already resolved.\n */\nexport type ConflictResolutionOutcome = 'accept' | 'reject' | 'merged';\n\n/**\n * Localization keys used by the ConflictNoteCard. Pass into the useLocalizedStrings hook (in the\n * consuming extension) and forward the result via the localizedStrings prop.\n */\nexport const CONFLICT_NOTE_STRING_KEYS = Object.freeze([\n '%conflict_note_description_verseText%',\n // Accessible name for the resolution radio group (the group has no other visible \n );\n };\n\n return (\n // Contain every click inside the card (selecting an option, pressing Save) so it never bubbles\n // up to toggle the enclosing CommentThread open/closed. The thread toggles on click only, so a\n // single onClick guard at the root is enough; this container is not itself an interactive control\n // and needs no keyboard handler (the thread has no keyboard toggle to intercept).\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events\n
e.stopPropagation()}>\n

\n {localizedStrings['%conflict_note_description_verseText%'] ??\n 'Conflicting changes were made to the verse text.'}\n

\n\n {isLoading && (\n
\n \n \n \n
\n )}\n {!isLoading && isReadOnly && renderResolvedResult()}\n {!isLoading && !isReadOnly && (\n <>\n

\n {localizedStrings['%conflict_note_choose_prompt%'] ?? 'Select which change to keep:'}\n

\n\n {/* The whole group is disabled while resolving. When stale, accept stays enabled\n (it's the only still-valid resolution) and only the reject option below is\n individually disabled. */}\n \n {radioOptions.map((option) => {\n const isStaleReject = isStaleRejectOption(option);\n if (!isStaleReject) return renderOptionCard(option);\n return (\n \n \n {/* asChild so the tooltip wraps the disabled option card and still receives\n pointer events over it */}\n {renderOptionCard(option)}\n {staleNotice}\n \n \n );\n })}\n \n\n {/* Stays mounted (present but disabled) even when stale, so the selection never shifts the\n layout. The tooltip message switches on whether Save is a no-op. */}\n \n \n \n {/* Disabled buttons are removed from the tab order and don't fire the\n pointer/focus events Tooltip listens for, so without this wrapper a keyboard\n or screen-reader user gets no explanation for why Save is disabled. Only\n treated as \"disabled\" here when there's an explanation to give — the\n isResolving-only case intentionally shows no tooltip to anyone (see\n `saveTooltip` above), so the wrapper stays inert then too, matching that. */}\n \n onResolve?.(effectiveResolution)}\n >\n {localizedStrings['%conflict_note_save_and_resolve%'] ?? 'Save and resolve'}\n \n \n \n {saveTooltip && {saveTooltip}}\n \n \n \n )}\n
\n );\n}\n\nexport default ConflictNoteCard;\n","import { LanguageStrings, LegacyComment, LocalizeKey } from 'platform-bible-utils';\nimport { useMemo } from 'react';\nimport { ConflictResolutionOutcome } from './conflict-note-card.types';\nimport { DiffHtml, sanitizeDiffHtml } from './conflict-diff';\n\n/** The localized resolved-outcome sentence for each resolution, keyed by resolvedResolution. */\nconst RESOLVED_SUMMARY: Record =\n {\n accept: {\n key: '%conflict_note_summary_resolved_kept_current%',\n fallback: 'Conflicting edits were resolved. Kept the current text.',\n },\n reject: {\n key: '%conflict_note_summary_resolved_used_other%',\n fallback: 'Conflicting edits were resolved. Used the other change.',\n },\n merged: {\n key: '%conflict_note_summary_resolved_combined%',\n fallback: 'Conflicting edits were resolved. Combined both changes.',\n },\n };\n\n/** Props for {@link ConflictThreadSummary}. */\nexport interface ConflictThreadSummaryProps {\n /** The conflict thread's root note. Unresolved: its `rejectedText` diff is previewed. */\n comment: LegacyComment;\n /** Localized strings (the same set passed to ConflictNoteCard). */\n localizedStrings: LanguageStrings;\n /**\n * How the conflict was resolved, or undefined while unresolved. When set, the summary shows only\n * the matching outcome sentence (no verse text); when undefined, it shows the prompt plus the\n * diff.\n */\n resolvedResolution?: ConflictResolutionOutcome;\n}\n\n/**\n * The collapsed preview of a verseText conflict thread. Replaces the raw PT9 note body (which\n * references an \"in red\" coloring the collapsed view never applied, and never updates after\n * resolution) with a status-aware one-liner. Unresolved: a prompt sentence plus the note's diff\n * rendered with the shared red/green coloring. Resolved: only the outcome sentence, no verse text.\n */\nexport function ConflictThreadSummary({\n comment,\n localizedStrings,\n resolvedResolution,\n}: ConflictThreadSummaryProps) {\n // Hooks must run unconditionally on every render, so this is computed before the early return\n // below even though it's only used in the unresolved branch.\n const diffHtml = useMemo(\n () => sanitizeDiffHtml(comment.rejectedText ?? ''),\n [comment.rejectedText],\n );\n\n if (resolvedResolution) {\n const { key, fallback } = RESOLVED_SUMMARY[resolvedResolution];\n return (\n

\n {localizedStrings[key] ?? fallback}\n

\n );\n }\n\n const prompt =\n localizedStrings['%conflict_note_summary_unresolved%'] ??\n 'Conflicting edits. Choose which change to keep.';\n\n return (\n
\n

{prompt}

\n {diffHtml ? : undefined}\n
\n );\n}\n","import { CommentStatus, LegacyComment } from 'platform-bible-utils';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ConflictResolutionCallbacks } from './comment-list.types';\nimport {\n ConflictCardActions,\n ConflictResolution,\n ConflictResolutionOutcome,\n} from './conflict-note-card.types';\nimport { actionToOutcome } from './comment-list.utils';\n\n/** Maps a live resolution choice to the already-resolved outcome it produces. */\nfunction resolutionToOutcome(resolution: ConflictResolution): ConflictResolutionOutcome {\n if (resolution === 'reject') return 'reject';\n if (resolution === 'merge') return 'merged';\n return 'accept';\n}\n\n/** Inputs {@link useConflictResolution} needs from the thread it serves. */\nexport interface UseConflictResolutionParams {\n /** The conflict thread's id. */\n threadId: string;\n /** The thread's current status (drives when the resolved outcome is derived). */\n threadStatus?: CommentStatus;\n /** Whether the thread is expanded (the options fetch is deferred until it is). */\n isSelected: boolean;\n /** The thread's non-deleted comments, newest-last (scanned for the resolution stamp). */\n activeComments: LegacyComment[];\n /** The resolve + getOptions callbacks; absent renders a read-only card. */\n conflictResolution?: ConflictResolutionCallbacks;\n}\n\n/** What {@link useConflictResolution} returns to ConflictThread. */\nexport interface UseConflictResolutionResult {\n /** The card's action state, including the `'loading'` sentinel while options are in flight. */\n conflictOptions: ConflictCardActions;\n /** True while a resolve call is in flight. */\n isResolving: boolean;\n /** Applies a resolution; on success optimistically shows the chosen outcome (no result flash). */\n resolve: (resolution: ConflictResolution) => Promise;\n /** How the conflict was resolved (status-aware); `undefined` while it is still unresolved. */\n resolvedResolution: ConflictResolutionOutcome | undefined;\n /** Whether to show the header resolve check (options are loaded AND actually resolvable). */\n showResolveCheck: boolean;\n}\n\n/**\n * Owns all conflict-resolution state and logic for a conflict thread: it fetches the resolution\n * options only once the thread is open (a `'loading'` sentinel renders a skeleton meanwhile, never\n * the read-only view), applies a resolution optimistically so a reject/merge shows the correct\n * result immediately instead of flashing the accepted text, derives the resolved outcome in a\n * status-aware way, and gates the resolve check on real resolvability.\n */\nexport function useConflictResolution({\n threadId,\n threadStatus,\n isSelected,\n activeComments,\n conflictResolution,\n}: UseConflictResolutionParams): UseConflictResolutionResult {\n // Starts 'loading' and is fetched only when the thread is selected, so a card that isn't open\n // never spends a round-trip. 'loading' renders a skeleton, never the read-only \"resolved\" view.\n const [conflictOptions, setConflictOptions] = useState('loading');\n const [isResolving, setIsResolving] = useState(false);\n // Set on a successful resolve so the card shows the chosen result immediately, before the\n // fire-and-forget data update round-trips and flips threadStatus to 'Resolved'.\n const [optimisticOutcome, setOptimisticOutcome] = useState<\n ConflictResolutionOutcome | undefined\n >();\n\n const getOptions = conflictResolution?.getOptions;\n const resolveCallback = conflictResolution?.resolve;\n\n // Fetch the resolution options only when the thread is open; re-run on status change (resolve and\n // reopen both change availability). Degrades to 'none' on any failure so the skeleton never hangs.\n // A fresh resolvable result clears any stale optimistic outcome (a reopened, re-resolvable thread).\n useEffect(() => {\n let isCurrent = true;\n if (!isSelected) {\n setConflictOptions('loading');\n return undefined;\n }\n const check = async () => {\n let options: ConflictCardActions;\n try {\n options = getOptions ? await getOptions(threadId) : 'none';\n } catch {\n options = 'none';\n }\n if (!isCurrent) return;\n setConflictOptions(options);\n if (options !== 'none') setOptimisticOutcome(undefined);\n };\n check();\n return () => {\n isCurrent = false;\n };\n }, [isSelected, threadId, threadStatus, getOptions]);\n\n // Reentrancy guard read/written synchronously so a second click that lands before React re-renders\n // (and disables the button) can't fire a second resolve. `isResolving` state drives the disabled UI;\n // this ref is the source of truth within a single tick.\n const isResolvingRef = useRef(false);\n const resolve = useCallback(\n async (resolution: ConflictResolution) => {\n if (!resolveCallback || isResolvingRef.current) return;\n isResolvingRef.current = true;\n setIsResolving(true);\n try {\n const success = await resolveCallback(threadId, resolution);\n if (success) {\n // Show the chosen result now (optimistic) and lock the controls; the data-update refetch\n // confirms via threadStatus. Prevents the read-only view from flashing the accepted text.\n setOptimisticOutcome(resolutionToOutcome(resolution));\n setConflictOptions('none');\n }\n } catch {\n // A consumer's resolve should report failure by resolving to false, not by throwing. If it\n // throws anyway, swallow it here: resolve() is invoked from un-awaited onClicks, so an\n // uncaught rejection would surface as an unhandled promise rejection. The card simply stays\n // resolvable (success never applied) so the user can retry.\n } finally {\n // Always clear the busy state, even on a rejecting resolve, otherwise the card stays locked\n // in its isResolving state.\n isResolvingRef.current = false;\n setIsResolving(false);\n }\n },\n [resolveCallback, threadId],\n );\n\n // The outcome an already-resolved conflict was resolved with, read off the MOST-RECENT resolution\n // comment's conflictResolutionAction. Only the newest resolution counts: a re-resolve leaves the\n // earlier resolution comment in place (reject -> reopen -> accept keeps the old 'replaced'\n // comment), and an accept stamps no action, so scanning for the first non-accept action found\n // would report the stale reject. Match on the resolution comment (status 'Resolved') instead;\n // absent action on it means accept. Only meaningful once the thread itself is 'Resolved' — while\n // still 'Todo' (a reopened conflict) this stays undefined so the collapsed summary and the card\n // don't contradict the live selector.\n const derivedResolution = useMemo(() => {\n if (threadStatus !== 'Resolved') return undefined;\n for (let i = activeComments.length - 1; i >= 0; i -= 1) {\n if (activeComments[i].status === 'Resolved') {\n return actionToOutcome(activeComments[i].conflictResolutionAction);\n }\n }\n return 'accept';\n }, [threadStatus, activeComments]);\n\n const resolvedResolution = derivedResolution ?? optimisticOutcome;\n\n const showResolveCheck = conflictOptions !== 'loading' && conflictOptions !== 'none';\n\n return { conflictOptions, isResolving, resolve, resolvedResolution, showResolveCheck };\n}\n","import { memo, ReactNode, useMemo } from 'react';\nimport { ConflictThreadProps } from './comment-list.types';\nimport { CommentThread } from './comment-thread.component';\nimport { ConflictNoteCard } from './conflict-note-card.component';\nimport { ConflictThreadSummary } from './conflict-thread-summary.component';\nimport { ResolveCheckButton } from './resolve-check-button.component';\nimport { isVerseTextConflictNote } from './comment-list.utils';\nimport { useConflictResolution } from './use-conflict-resolution.hook';\n\n/**\n * The conflict-thread container. Wraps the conflict-agnostic {@link CommentThread} shell and fills\n * its slots with conflict-specific content:\n *\n * - A verseText conflict shows the resolution UI - the ConflictNoteCard when the thread is open, the\n * collapsed ConflictThreadSummary otherwise - plus a conflict-gated resolve check.\n * - Any other conflict type falls through to the shell's default CommentItem (keeping its\n * author/date/status/menu) and the shell's generic status-resolve check, since a non-verseText\n * conflict is resolved through a plain status change, not resolveConflict.\n *\n * All conflict state and logic live in {@link useConflictResolution}.\n *\n * Wrapped in `memo` for the same reason as {@link CommentThread}: this container builds fresh\n * `rootContentSlot`/`resolveActionSlot` JSX every render it actually runs, which would otherwise\n * defeat `CommentThread`'s own memoization on every unrelated re-render of the list above it.\n */\nexport const ConflictThread = memo(function ConflictThread(props: ConflictThreadProps) {\n const {\n comments,\n localizedStrings,\n isSelected = false,\n threadId,\n threadStatus,\n conflictResolution,\n } = props;\n\n const activeComments = useMemo(() => comments.filter((comment) => !comment.deleted), [comments]);\n // The conflict root is not reliably comments[0]: a fragment-merged thread (PT9 FB-22392) tail-\n // appends the older fragment's comments, leaving the genuine root mid-list (see\n // LegacyCommentThread.comments and C# RootCommentId). Only the root carries conflictType and the\n // diff/result fields the card reads, so locate it by that field, not by position.\n const rootComment = useMemo(\n () => activeComments.find((comment) => comment.conflictType) ?? activeComments[0],\n [activeComments],\n );\n\n const { conflictOptions, isResolving, resolve, resolvedResolution, showResolveCheck } =\n useConflictResolution({\n threadId,\n threadStatus,\n isSelected,\n activeComments,\n conflictResolution,\n });\n\n const isVerseText = isVerseTextConflictNote(rootComment);\n\n // verseText conflicts render the resolution UI; other conflict types leave rootContentSlot\n // undefined so the shell renders its default CommentItem (the non-verseText chrome fix).\n let rootContentSlot: ReactNode;\n if (isVerseText && rootComment) {\n rootContentSlot = isSelected ? (\n \n ) : (\n \n );\n }\n\n // For a verseText conflict, override the header check with the conflict-gated resolve.\n // ResolveCheckButton self-gates on `show` (renders nothing when false), and passing the element\n // rather than a bare `false` still overrides the shell's generic status-resolve default — so a\n // non-resolvable verseText conflict shows no ✓. For a non-verseText conflict, leave the slot\n // undefined so the shell renders its generic status-resolve check.\n let resolveActionSlot: ReactNode;\n if (isVerseText) {\n resolveActionSlot = (\n resolve('accept')}\n ariaLabel={localizedStrings['%comment_aria_resolve_thread%'] ?? 'Resolve thread'}\n />\n );\n }\n\n return (\n \n );\n});\n\nexport default ConflictThread;\n","import { ListboxOption, useListbox } from '@/hooks/listbox-keyboard-navigation.hook';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport React, { RefObject, useCallback, useEffect, useState } from 'react';\nimport {\n AddCommentToThreadOptions,\n COMMENT_LIST_ELEMENT_ID,\n CommentListProps,\n} from './comment-list.types';\nimport { CommentThread } from './comment-thread.component';\nimport { ConflictThread } from './conflict-thread.component';\n\n/**\n * Component for rendering a list of comment threads\n *\n * @param CommentListProps Props for the CommentList component\n */\nexport default function CommentList({\n className = '',\n classNameForVerseText,\n threads,\n currentUser,\n localizedStrings,\n handleAddCommentToThread,\n handleUpdateComment,\n handleDeleteComment,\n handleReadStatusChange,\n assignableUsers,\n canUserAddCommentToThread,\n canUserAssignThreadCallback,\n canUserResolveThreadCallback,\n canUserEditOrDeleteCommentCallback,\n selectedThreadId: externalSelectedThreadId,\n onSelectedThreadChange,\n onVerseRefClick,\n conflictResolution,\n drafts,\n onDraftChange,\n}: CommentListProps) {\n const [expandedThreadIds, setExpandedThreadIds] = useState>(new Set());\n const [lastInteractedThreadId, setLastInteractedThreadId] = useState();\n const [lastAssignedUser, setLastAssignedUser] = useState();\n\n const handleAddCommentToThreadWithTracking = useCallback(\n async (options: AddCommentToThreadOptions) => {\n const result = await handleAddCommentToThread(options);\n // result === undefined means the submission failed or produced no output; only update the\n // last assigned user when the submission succeeded and an explicit non-empty assignment was\n // made. Exclude '' (Unassigned) so that selecting \"Unassigned\" doesn't become sticky and\n // silently clear the assignee on other threads via auto-population.\n if (\n result !== undefined &&\n options.assignedUser !== undefined &&\n options.assignedUser !== ''\n ) {\n setLastAssignedUser(options.assignedUser);\n }\n return result;\n },\n [handleAddCommentToThread],\n );\n\n // When external selection changes, add it to expanded set\n useEffect(() => {\n if (externalSelectedThreadId) {\n setExpandedThreadIds((prev) => new Set(prev).add(externalSelectedThreadId));\n setLastInteractedThreadId(externalSelectedThreadId);\n }\n }, [externalSelectedThreadId]);\n\n const activeThreads = threads.filter((thread) =>\n thread.comments.some((comment) => !comment.deleted),\n );\n\n const options: ListboxOption[] = activeThreads.map((thread) => ({ id: thread.id }));\n\n const handleKeyboardSelectThread = useCallback(\n (option: ListboxOption) => {\n setExpandedThreadIds((prev) => new Set(prev).add(option.id));\n setLastInteractedThreadId(option.id);\n onSelectedThreadChange?.(option.id);\n },\n [onSelectedThreadChange],\n );\n\n const handleSelectThread = useCallback(\n (threadId: string) => {\n const isCollapsing = expandedThreadIds.has(threadId);\n setExpandedThreadIds((prev) => {\n const next = new Set(prev);\n if (next.has(threadId)) {\n next.delete(threadId);\n } else {\n next.add(threadId);\n }\n return next;\n });\n setLastInteractedThreadId(threadId);\n onSelectedThreadChange?.(isCollapsing ? undefined : threadId);\n },\n [expandedThreadIds, onSelectedThreadChange],\n );\n\n const { listboxRef, activeId, handleKeyDown } = useListbox({\n options,\n onOptionSelect: handleKeyboardSelectThread,\n });\n\n // Collapse the last interacted thread when Escape is pressed\n const handleKeyDownWithEscape = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n if (lastInteractedThreadId && expandedThreadIds.has(lastInteractedThreadId)) {\n setExpandedThreadIds((prev) => {\n const next = new Set(prev);\n next.delete(lastInteractedThreadId);\n return next;\n });\n setLastInteractedThreadId(undefined);\n onSelectedThreadChange?.(undefined);\n }\n event.preventDefault();\n event.stopPropagation();\n } else {\n handleKeyDown(event);\n }\n },\n [lastInteractedThreadId, expandedThreadIds, handleKeyDown, onSelectedThreadChange],\n );\n\n return (\n }\n aria-activedescendant={activeId ?? undefined}\n aria-label=\"Comments\"\n className={cn(\n 'tw:flex tw:w-full tw:flex-col tw:outline-hidden tw:focus:ring-2 tw:focus:ring-ring tw:focus:ring-offset-1 tw:focus:ring-offset-background',\n\n className,\n )}\n onKeyDown={handleKeyDownWithEscape}\n >\n {activeThreads.map((thread) => {\n // The generic shell props both thread variants share. Conflict threads render through\n // ConflictThread (which owns the resolve UI and forwards these slots to the shared\n // CommentThread shell) and additionally receive the conflict-resolution callbacks; every\n // other thread renders CommentThread directly, keeping the shell conflict-agnostic.\n const commonThreadProps = {\n classNameForVerseText,\n comments: thread.comments,\n localizedStrings,\n verseRef: thread.verseRef,\n handleSelectThread,\n threadId: thread.id,\n thread,\n isRead: thread.isRead,\n isSelected: expandedThreadIds.has(thread.id),\n currentUser,\n assignedUser: thread.assignedUser,\n threadStatus: thread.status,\n handleAddCommentToThread: handleAddCommentToThreadWithTracking,\n handleUpdateComment,\n handleDeleteComment,\n handleReadStatusChange,\n assignableUsers,\n canUserAddCommentToThread,\n canUserAssignThreadCallback,\n canUserResolveThreadCallback,\n canUserEditOrDeleteCommentCallback,\n onVerseRefClick,\n initialAssignedUser: lastAssignedUser,\n draft: drafts?.[thread.id],\n onDraftChange,\n };\n return (\n \n {thread.type === 'Conflict' ? (\n \n ) : (\n \n )}\n \n );\n })}\n \n );\n}\n","import { forwardRef, HTMLAttributes } from 'react';\n\n/**\n * Attribute a content-zoom-eligible element carries to mark it as one zoom area. Its value is the\n * zoom area id; an empty value marks the view's `main` area. Mirrors `CONTENT_ZOOM_ROOT_ATTRIBUTE`\n * in paranext-core's `src/shared/models/web-view.model.ts`. This library cannot import that module\n * (it lives under core's `src/shared`, outside this package's reach), and `@papi/core` publishes\n * the constant as a type-only declaration whose value is not importable at runtime, so the literal\n * is duplicated here; a platform test compares the two constants so they cannot drift silently.\n *\n * @experimental This export is unstable and may change shape or disappear without notice\n */\nexport const CONTENT_ZOOM_ROOT_ATTRIBUTE = 'data-platform-content-zoom-root';\n\n/**\n * Props for {@link ContentZoomRoot}.\n *\n * @experimental This export is unstable and may change shape or disappear without notice\n */\nexport type ContentZoomRootProps = HTMLAttributes & {\n /**\n * Id of the zoom area this element wraps: lower-case letters, digits and hyphens, starting with a\n * letter (`[a-z][a-z0-9-]*`). `default` is reserved by the platform and is ignored. Omit this\n * prop for the view's main area. A view with several independently zoomable panes gives each its\n * own id — the Scripture editor uses `footnotes` for its footnotes pane.\n *\n * This library does not validate the id at runtime; the platform ignores a malformed one and logs\n * a warning once.\n *\n * @experimental This property is unstable and may change shape or disappear without notice\n */\n area?: string;\n};\n\n/**\n * Marks one independently zoomable content area within a web view.\n *\n * The platform scales a marked area in response to Ctrl/⌘+`+`/`-`/`0`, Ctrl/⌘+wheel, and the tab\n * context menu; it remembers the chosen level per area and shows the zoom indicator. The view\n * itself writes nothing else to make zoom work.\n *\n * Several elements may share one area id and zoom together. Areas must not nest — a marked element\n * found inside another marked element is ignored. Keep toolbars, dividers and headers outside the\n * marked element so they are not scaled along with the content.\n *\n * This component renders a plain `div` in normal flow and applies no classes of its own — the\n * caller supplies whatever layout classes its parent expects.\n *\n * Measurement caveat: inside a zoomed area, `getBoundingClientRect()` reports zoomed pixels, while\n * `getComputedStyle(el).fontSize` does not reflect the zoom factor. To read the factor itself, look\n * up the `--platform-content-zoom-` custom property (`--platform-content-zoom-main` for the\n * unnamed area, `--platform-content-zoom-default` as a fallback) on the view's `documentElement`.\n *\n * A view that marks no area at all is scaled as a whole at the Settings default zoom level and gets\n * no per-pane zoom control.\n *\n * @example\n *\n * ```tsx\n * \n * \n * \n * \n * ```\n *\n * @experimental This export is unstable and may change shape or disappear without notice\n */\nexport const ContentZoomRoot = forwardRef(\n function ContentZoomRoot({ area, ...props }, ref) {\n return (\n \n );\n },\n);\n\nContentZoomRoot.displayName = 'ContentZoomRoot';\n","import { FilterIcon } from 'lucide-react';\nimport { Table } from '@tanstack/react-table';\n\nimport { Button } from '@/components/shadcn-ui/button';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/shadcn-ui/dropdown-menu';\n\ninterface DataTableViewOptionsProps {\n table: Table;\n}\n\nexport function DataTableViewOptions({ table }: DataTableViewOptionsProps) {\n return (\n \n \n \n \n \n Toggle columns\n \n {table\n .getAllColumns()\n .filter((column) => column.getCanHide())\n .map((column) => {\n return (\n column.toggleVisibility(!!value)}\n >\n {column.id}\n \n );\n })}\n \n \n );\n}\n\nexport default DataTableViewOptions;\n","'use client';\n\nimport React from 'react';\nimport { Select as SelectPrimitive } from 'radix-ui';\n\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { IconSelector, IconCheck, IconChevronUp, IconChevronDown } from '@tabler/icons-react';\n// CUSTOM: Added Direction and readDirection imports for RTL support in SelectTrigger and SelectContent\nimport { type Direction, readDirection } from '@/utils/dir-helper.util';\n// CUSTOM: Added Z_INDEX_ABOVE_DOCK import so SelectContent can render above modal dialogs (see\n// its usage below) — matches the fix already applied to PopoverContent for the same reason.\nimport { Z_INDEX_ABOVE_DOCK } from '@/components/z-index';\n\n/**\n * Select components display a list of options for the user to pick from—triggered by a button.\n * These components are built on Radix UI primitives and styled with Shadcn UI.\n *\n * @see Shadcn UI Documentation: {@link https://ui.shadcn.com/docs/components/select}\n * @see Radix UI Documentation: {@link https://www.radix-ui.com/primitives/docs/components/select}\n */\n// CUSTOM: Added TSDoc with links to shadcn/ui and Radix UI documentation\nfunction Select({ ...props }: React.ComponentProps) {\n return ;\n}\n\n/** @inheritdoc Select */\nfunction SelectGroup({ className, ...props }: React.ComponentProps) {\n return (\n \n );\n}\n\n/** @inheritdoc Select */\nfunction SelectValue({ ...props }: React.ComponentProps) {\n return ;\n}\n\n// CUSTOM: Defined SelectTriggerProps as a named type alias so extensions composing their\n// own select triggers have a public prop shape to import.\ntype SelectTriggerProps = React.ComponentProps & {\n size?: 'sm' | 'default';\n};\n\n/** @inheritdoc Select */\n// CUSTOM: Lifted the SelectTrigger prop shape out of the function signature into the named\n// SelectTriggerProps type above so it can be exported for downstream composition.\nfunction SelectTrigger({ className, size = 'default', children, ...props }: SelectTriggerProps) {\n // CUSTOM: Added readDirection() call and dir prop for RTL layout support\n const dir: Direction = readDirection();\n return (\n \n {children}\n \n \n \n \n );\n}\n\n/** @inheritdoc Select */\nfunction SelectContent({\n className,\n children,\n // CUSTOM: Restored 'popper' as the default position (was changed to 'item-aligned' by the shadcn\n // upgrade). In 'popper' mode Radix exposes --radix-select-trigger-width, which is required for\n // min-w-(--radix-select-trigger-width) to work. In 'item-aligned' mode that variable is not set,\n // making the popup width unconstrained. Existing callers all expected popper (dropdown) behavior.\n position = 'popper',\n align = 'center',\n // CUSTOM: Destructure style to merge with the shared z-index constant below\n style,\n ...props\n}: React.ComponentProps) {\n // CUSTOM: Added readDirection() call; children wrapped in
for RTL text direction\n const dir: Direction = readDirection();\n return (\n \n \n \n \n {/* CUSTOM: Wrapped children in
so item text renders in correct RTL/LTR direction */}\n
{children}
\n \n \n \n \n );\n}\n\n/** @inheritdoc Select */\n// CUSTOM: Added TSDoc via @inheritdoc\nfunction SelectLabel({ className, ...props }: React.ComponentProps) {\n return (\n \n );\n}\n\n/** @inheritdoc Select */\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n );\n}\n\n/** @inheritdoc Select */\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n );\n}\n\n/** @inheritdoc Select */\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n );\n}\n\n/** @inheritdoc Select */\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n );\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n// CUSTOM: Exported SelectTriggerProps as a named type so extensions composing their own\n// select triggers can share the prop shape.\nexport type { SelectTriggerProps };\n","import { ChevronLeftIcon, ChevronRightIcon, ArrowLeftIcon, ArrowRightIcon } from 'lucide-react';\nimport { Table } from '@tanstack/react-table';\n\nimport { Button } from '@/components/shadcn-ui/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/shadcn-ui/select';\n\ninterface DataTablePaginationProps {\n table: Table;\n}\n\nexport function DataTablePagination({ table }: DataTablePaginationProps) {\n return (\n
\n
\n
\n {table.getFilteredSelectedRowModel().rows.length} of{' '}\n {table.getFilteredRowModel().rows.length} row(s) selected\n
\n
\n

Rows per page

\n {\n table.setPageSize(Number(value));\n }}\n >\n \n \n \n \n {[10, 20, 30, 40, 50].map((pageSize) => (\n \n {pageSize}\n \n ))}\n \n \n
\n
\n Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()}\n
\n
\n table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n Go to first page\n \n \n table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n Go to previous page\n \n \n table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n Go to next page\n \n \n table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n >\n Go to last page\n \n \n
\n
\n
\n );\n}\n\nexport default DataTablePagination;\n","import React, { useMemo, useState } from 'react';\n\nimport {\n ColumnFiltersState,\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n SortingState,\n ColumnDef as TSColumnDef,\n Row as TSRow,\n RowSelectionState as TSRowSelectionState,\n SortDirection as TSSortDirection,\n Table as TSTable,\n useReactTable,\n VisibilityState,\n} from '@tanstack/react-table';\n\nimport { DataTableViewOptions } from '@/components/advanced/data-table/data-table-column-toggle.component';\nimport { DataTablePagination } from '@/components/advanced/data-table/data-table-pagination.component';\nimport { Button } from '@/components/shadcn-ui/button';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/shadcn-ui/table';\nimport { Skeleton } from '@/components/shadcn-ui/skeleton';\n\nexport type ColumnDef = TSColumnDef;\nexport type RowContents = TSRow;\nexport type TableContents = TSTable;\nexport type SortDirection = TSSortDirection;\nexport type RowSelectionState = TSRowSelectionState;\n\ninterface DataTableProps {\n columns: ColumnDef[];\n data: TData[] | undefined;\n enablePagination?: boolean;\n showPaginationControls?: boolean;\n showColumnVisibilityControls?: boolean;\n stickyHeader?: boolean;\n onRowClickHandler?: (row: RowContents, table: TableContents) => void;\n id?: string;\n isLoading?: boolean;\n noResultsMessage: string;\n}\n\n/**\n * Feature-rich table component that infuses our basic shadcn-based Table component with features\n * from TanStack's React Table library\n */\nexport function DataTable({\n columns,\n data,\n enablePagination = false,\n showPaginationControls = false,\n showColumnVisibilityControls = false,\n stickyHeader = false,\n onRowClickHandler = () => {},\n id,\n isLoading = false,\n noResultsMessage,\n}: DataTableProps) {\n const [sorting, setSorting] = useState([]);\n const [columnFilters, setColumnFilters] = useState([]);\n const [columnVisibility, setColumnVisibility] = useState({});\n const [rowSelection, setRowSelection] = useState({});\n\n const normalizedData = useMemo(() => data ?? [], [data]);\n\n const table = useReactTable({\n data: normalizedData,\n columns,\n getCoreRowModel: getCoreRowModel(),\n ...(enablePagination && { getPaginationRowModel: getPaginationRowModel() }),\n onSortingChange: setSorting,\n getSortedRowModel: getSortedRowModel(),\n onColumnFiltersChange: setColumnFilters,\n getFilteredRowModel: getFilteredRowModel(),\n onColumnVisibilityChange: setColumnVisibility,\n onRowSelectionChange: setRowSelection,\n state: {\n sorting,\n columnFilters,\n columnVisibility,\n rowSelection,\n },\n });\n\n const visibleColumns = table.getVisibleFlatColumns();\n let bodyContent: React.ReactNode;\n\n if (isLoading) {\n const rowCount = 10;\n const skeletonRowIds = Array.from({ length: rowCount }).map((_, idx) => `skeleton-row-${idx}`);\n bodyContent = skeletonRowIds.map((rowId) => (\n \n \n
\n \n
\n
\n
\n ));\n } else if (table.getRowModel().rows?.length > 0) {\n bodyContent = table.getRowModel().rows.map((row) => (\n onRowClickHandler(row, table)}\n key={row.id}\n data-state={row.getIsSelected() && 'selected'}\n >\n {row.getVisibleCells().map((cell) => (\n \n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n \n ))}\n \n ));\n } else {\n bodyContent = (\n \n \n {noResultsMessage}\n \n \n );\n }\n\n return (\n
\n {showColumnVisibilityControls && }\n \n \n {table.getHeaderGroups().map((headerGroup) => (\n \n {headerGroup.headers.map((header) => {\n return (\n \n {header.isPlaceholder\n ? undefined\n : flexRender(header.column.columnDef.header, header.getContext())}\n \n );\n })}\n \n ))}\n \n {bodyContent}\n
\n {enablePagination && (\n
\n table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n Previous\n \n table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n Next\n \n
\n )}\n {enablePagination && showPaginationControls && }\n
\n );\n}\n\nexport default DataTable;\n","import { cn } from '@/utils/shadcn-ui/utils';\nimport Markdown, { MarkdownToJSX } from 'markdown-to-jsx';\nimport { useMemo } from 'react';\n\ninterface MarkdownRendererProps {\n /** Optional unique identifier */\n id?: string;\n /** The markdown string to render */\n markdown: string;\n className?: string;\n /**\n * The [`target` attribute for `a` html\n * tags](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#target). Defaults to not\n * adding a `target` to `a` tags\n */\n anchorTarget?: string;\n /** Optional flag to truncate the content to 3 lines */\n truncate?: boolean;\n}\n\n/**\n * This component renders markdown content given a markdown string. It uses typography styles from\n * the platform.\n *\n * @param MarkdownRendererProps\n * @returns A div containing the rendered markdown content.\n */\nexport function MarkdownRenderer({\n id,\n markdown,\n className,\n anchorTarget,\n truncate,\n}: MarkdownRendererProps) {\n const options: MarkdownToJSX.Options = useMemo(\n () => ({\n overrides: {\n a: {\n props: {\n target: anchorTarget,\n // Harden links opened in a new tab against reverse-tabnabbing (the opened page can\n // otherwise reach back through window.opener).\n rel: anchorTarget === '_blank' ? 'noopener noreferrer' : undefined,\n },\n },\n },\n }),\n [anchorTarget],\n );\n return (\n \n {markdown}\n
\n );\n}\n\nexport default MarkdownRenderer;\n","import { Copy } from 'lucide-react';\nimport { Button } from '@/components/shadcn-ui/button';\nimport { LocalizedStringValue } from 'platform-bible-utils';\n\n/**\n * Object containing all keys used for localization in this component. If you're using this\n * component in an extension, you can pass it into the useLocalizedStrings hook to easily obtain the\n * localized strings and pass them into the localizedStrings prop of this component\n */\nexport const ERROR_DUMP_STRING_KEYS = Object.freeze([\n '%webView_error_dump_header%',\n '%webView_error_dump_info_message%',\n] as const);\n\nexport type ErrorDumpLocalizedStrings = {\n [localizedInventoryKey in (typeof ERROR_DUMP_STRING_KEYS)[number]]?: LocalizedStringValue;\n};\n\n/**\n * Gets the localized value for the provided key\n *\n * @param strings Object containing localized string\n * @param key Key for a localized string\n * @returns The localized value for the provided key, if available. Returns the key if no localized\n * value is available\n */\nconst localizeString = (\n strings: ErrorDumpLocalizedStrings,\n key: keyof ErrorDumpLocalizedStrings,\n) => {\n return strings[key] ?? key;\n};\n\n/** Interface to store the parameters for the ErrorDump component */\nexport interface ErrorDumpProps {\n /** String containing the error details to show */\n errorDetails: string;\n /** Handler function to notify the frontend when the error is copied */\n handleCopyNotify?: () => void;\n /**\n * List of localized strings to localize the strings in this component. Relevant keys can be found\n * in `ERROR_DUMP_STRING_KEYS`\n */\n localizedStrings: ErrorDumpLocalizedStrings;\n /** Optional id for the root element */\n id?: string;\n}\n\n/** Component to render an error dump */\nexport function ErrorDump({\n errorDetails,\n handleCopyNotify,\n localizedStrings,\n id,\n}: ErrorDumpProps) {\n const headerText = localizeString(localizedStrings, '%webView_error_dump_header%');\n const infoMessage = localizeString(localizedStrings, '%webView_error_dump_info_message%');\n\n function handleCopy() {\n navigator.clipboard.writeText(errorDetails);\n if (handleCopyNotify) {\n handleCopyNotify();\n }\n }\n\n return (\n \n
\n
\n
\n {headerText}\n
\n
\n {infoMessage}\n
\n
\n \n
\n
\n
{errorDetails}
\n
\n
\n );\n}\n","import { PropsWithChildren, useState } from 'react';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { ErrorDump, ErrorDumpProps, ERROR_DUMP_STRING_KEYS } from '../basics/error-dump.component';\nimport { Popover, PopoverContent, PopoverTrigger } from '../shadcn-ui/popover';\nimport { Label } from '../shadcn-ui/label';\n\n/**\n * Object containing all keys used for localization in the ErrorPopover component. This extends\n * ERROR_DUMP_STRING_KEYS with additional keys specific to the ErrorPopover. If you're using this\n * component in an extension, you can pass it into the useLocalizedStrings hook to easily obtain the\n * localized strings and pass them into the localizedStrings prop of this component\n */\nexport const ERROR_POPOVER_STRING_KEYS = Object.freeze([\n ...ERROR_DUMP_STRING_KEYS,\n '%webView_error_dump_copied_message%',\n] as const);\n\nexport type ErrorPopoverLocalizedStrings = {\n [localizedKey in (typeof ERROR_POPOVER_STRING_KEYS)[number]]?: string;\n};\n\n/** Interface to store the parameters for the ErrorPopover component */\nexport type ErrorPopoverProps = PropsWithChildren &\n Omit & {\n /**\n * List of localized strings to localize the strings in this component. Relevant keys can be\n * found in `ERROR_POPOVER_STRING_KEYS`\n */\n localizedStrings: ErrorPopoverLocalizedStrings;\n /** Optional CSS classes to insert into the `PopoverContent` */\n className?: string;\n /** Optional ID for the popover content for accessibility */\n id?: string;\n };\n\n/** A popover component that displays detailed error information using the ErrorDump component. */\nexport function ErrorPopover({\n errorDetails,\n handleCopyNotify,\n localizedStrings,\n children,\n className,\n id,\n}: ErrorPopoverProps) {\n const [isCopySuccess, setIsCopySuccess] = useState(false);\n\n const handleCopyWithNotification = () => {\n setIsCopySuccess(true);\n if (handleCopyNotify) {\n handleCopyNotify();\n }\n };\n\n const handleOpenChange = (open: boolean) => {\n if (!open) {\n setIsCopySuccess(false);\n }\n };\n\n return (\n \n {children}\n \n {isCopySuccess && localizedStrings['%webView_error_dump_copied_message%'] && (\n \n )}\n \n \n \n );\n}\n","import {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuGroup,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuRadioGroup,\n} from '@/components/shadcn-ui/dropdown-menu';\nimport { Button } from '@/components/shadcn-ui/button';\nimport { ChevronDown, Filter } from 'lucide-react';\nimport { useState } from 'react';\n\n/** The DropdownMenuItemType enum is used to determine the type of the dropdown item */\nexport enum DropdownMenuItemType {\n Check,\n Radio,\n}\n\nexport type DropdownItem = {\n /** Unique identifier for this dropdown */\n id: string;\n /** The label is the text that will be displayed on the dropdown item. */\n label: string;\n /** The onUpdate function is called when the state of a dropdown item is changed. */\n onUpdate: (id: string, checked?: boolean) => void;\n};\n\nexport type DropdownGroup = {\n /**\n * The label is the text that will be displayed on the dropdown group. It is used to categorize\n * the items in the group.\n */\n label: string;\n /** The itemType determines the DropdownMenuItemType type as either Check or Radio. */\n itemType: DropdownMenuItemType;\n /** The items array contains the items that will be displayed in the dropdown group */\n items: DropdownItem[];\n};\n\nexport type FilterDropdownProps = {\n /** Object unique identifier */\n id?: string;\n /** Label for the trigger button */\n label: string;\n /** The groups array contains the groups that will be displayed in the dropdown */\n groups: DropdownGroup[];\n}; // TODO: extend the props later\n\n/**\n * The FilterDropdown component is a dropdown designed for filtering content. It includes groups of\n * items that can be checkboxes or radio items.\n *\n * @param FilterDropdownProps\n * @returns A filter dropdown.\n */\nexport function FilterDropdown({ id, label, groups }: FilterDropdownProps) {\n // Populates the boolean Arrays for the group indexes that are checkbox groups\n const [checkedStates, setCheckedStates] = useState>(\n Object.fromEntries(\n groups\n .map((group, index) =>\n group.itemType === DropdownMenuItemType.Check ? [index, []] : undefined,\n )\n .filter((entry) => !!entry),\n ),\n );\n const [radioStates, setRadioStates] = useState>({});\n\n const handleCheckboxUpdate = (groupIndex: number, index: number) => {\n const newCheckedState = !checkedStates[groupIndex][index];\n // Update the checked state first\n setCheckedStates((oldCheckedStates) => {\n oldCheckedStates[groupIndex][index] = newCheckedState;\n return { ...oldCheckedStates };\n });\n\n // Calls the `onUpdate()` handler function for the dropdown item\n const item = groups[groupIndex].items[index];\n item.onUpdate(item.id, newCheckedState);\n };\n\n const handleRadioUpdate = (groupIndex: number, value: string) => {\n // Updates the radio state first\n setRadioStates((oldRadioStates) => {\n oldRadioStates[groupIndex] = value;\n return { ...oldRadioStates };\n });\n\n // Calls the `onUpdate()` handler function for the dropdown item\n const currentItem = groups[groupIndex].items.find((item) => item.id === value);\n if (currentItem) {\n currentItem.onUpdate(value);\n } else {\n console.error(`Could not find dropdown radio item with id '${value}'!`);\n }\n };\n\n return (\n
\n {/* TODO: remove this once the DropDown Menu shadcn has an id prop */}\n \n \n \n \n \n {groups.map((group, groupIndex) => (\n
\n {group.label}\n \n {group.itemType === DropdownMenuItemType.Check ? (\n <>\n {group.items.map((item, index) => (\n
\n handleCheckboxUpdate(groupIndex, index)}\n >\n {item.label}\n \n
\n ))}\n \n ) : (\n handleRadioUpdate(groupIndex, value)}\n >\n {group.items.map((item) => (\n
\n {item.label}\n
\n ))}\n \n )}\n
\n \n
\n ))}\n
\n
\n
\n );\n}\n\nexport default FilterDropdown;\n","import { Button } from '@/components/shadcn-ui/button';\nimport { CircleHelp, Link as LucideLink, User } from 'lucide-react';\nimport { NumberFormat } from 'platform-bible-utils';\n\n/** Interface that stores the parameters passed to the More Info component */\ninterface MoreInfoProps {\n /** Optional unique identifier */\n id?: string;\n /** The category of the extension */\n category: string;\n /** The number of downloads for the extension */\n downloads: Record;\n /** The languages supported by the extension */\n languages: string[];\n /** The URL to the more info page of the extension */\n moreInfoUrl: string;\n /** Handler function triggered when the more info (Website) link is clicked */\n handleMoreInfoLinkClick: () => void;\n /** Optional URL to a website link to get support for the extension */\n supportUrl: string;\n /** Handler function triggered when the support link is clicked */\n handleSupportLinkClick: () => void;\n}\n/**\n * This component displays the more info section of the extension which includes the category,\n * number of downloads, languages, and links to the website and support\n *\n * @param MoreInfoProps\n * @returns The more info component that displays the category, number of downloads, languages, and\n * links to the website and support\n */\nexport function MoreInfo({\n id,\n category,\n downloads,\n languages,\n moreInfoUrl,\n handleMoreInfoLinkClick,\n supportUrl,\n handleSupportLinkClick,\n}: MoreInfoProps) {\n /**\n * This constant formats the number of downloads into a more readable format.\n *\n * @example 1000 -> 1K\n *\n * @example 1000000 -> 1M\n *\n * @returns The formatted number of downloads\n */\n const numberFormatted = new NumberFormat('en', {\n notation: 'compact',\n compactDisplay: 'short',\n }).format(Object.values(downloads).reduce((a: number, b: number) => a + b, 0));\n\n /** This function scrolls the window to the bottom of the page. */\n const handleScrollToBottom = () => {\n window.scrollTo(0, document.body.scrollHeight);\n };\n\n // Tailwind v4's `divide-x` adds the divider border to the inline-end of each non-last child (v3\n // added it to the inline-start of each non-first child). Use symmetric horizontal padding\n // (`tw:px-4`) on the children instead of a parent `tw:gap-4` + per-child `tw:ps-4` so dividers\n // stay centered between columns rather than hugging the end of each column's content.\n return (\n \n {category && (\n
\n
\n {category}\n
\n CATEGORY\n
\n )}\n
\n
\n \n {numberFormatted}\n
\n USERS\n
\n
\n
\n {languages.slice(0, 3).map((locale) => (\n \n {locale.toUpperCase()}\n \n ))}\n
\n {languages.length > 3 && (\n handleScrollToBottom()}\n className=\"tw:text-xs tw:text-foreground tw:underline\"\n >\n +{languages.length - 3} more languages\n \n )}\n
\n {(moreInfoUrl || supportUrl) && (\n
\n {moreInfoUrl && (\n
\n handleMoreInfoLinkClick()}\n variant=\"link\"\n className=\"tw:flex tw:h-auto tw:gap-1 tw:py-0 tw:text-xs tw:font-semibold tw:text-foreground\"\n >\n Website\n \n \n
\n )}\n {supportUrl && (\n
\n handleSupportLinkClick()}\n variant=\"link\"\n className=\"tw:flex tw:h-auto tw:gap-1 tw:py-0 tw:text-xs tw:font-semibold tw:text-foreground\"\n >\n Support\n \n \n
\n )}\n
\n )}\n \n );\n}\n","import { useState } from 'react';\n\nexport type VersionInformation = {\n /** Date the version was published */\n date: string;\n /** Description of the changes in the version */\n description: string;\n};\n\n/** Type to store the version history information */\nexport type VersionHistoryType = Record;\n\n/** Interface that stores the parameters passed to the Version History component */\ninterface VersionHistoryProps {\n /** Optional unique identifier */\n id?: string;\n /** Object containing the versions mapped with their information */\n versionHistory: VersionHistoryType;\n}\n\n/**\n * Component to render the version history information shown in the footer component. Lists the 5\n * most recent versions, with the options to show all versions by pressing a button.\n *\n * @param VersionHistoryProps\n * @returns Rendered version history for the Footer component\n */\nexport function VersionHistory({ id, versionHistory }: VersionHistoryProps) {\n const [showAllVersions, setShowAllVersions] = useState(false);\n const currentDate = new Date();\n\n /**\n * Function to format the time string for the version history in the form of 'X year(s) ago'.\n *\n * @param dateString ISO Date string to determine the time string from\n * @returns Formatted time string\n */\n function formatTimeString(dateString: string) {\n const date = new Date(dateString);\n const dateDiff = new Date(currentDate.getTime() - date.getTime());\n const yearDiff = dateDiff.getUTCFullYear() - 1970;\n const monthDiff = dateDiff.getUTCMonth();\n const dayDiff = dateDiff.getUTCDate() - 1;\n\n // Determines how long ago the version was published\n let timeString = '';\n if (yearDiff > 0) {\n timeString = `${yearDiff.toString()} year${yearDiff === 1 ? '' : 's'} ago`;\n } else if (monthDiff > 0) {\n timeString = `${monthDiff.toString()} month${monthDiff === 1 ? '' : 's'} ago`;\n } else if (dayDiff === 0) {\n timeString = 'today';\n } else {\n timeString = `${dayDiff.toString()} day${dayDiff === 1 ? '' : 's'} ago`;\n }\n\n return timeString;\n }\n\n // Sorts the version history by version number\n const sortedEntries = Object.entries(versionHistory).sort((a, b) => b[0].localeCompare(a[0]));\n\n return (\n
\n

What`s New

\n
    \n {(showAllVersions ? sortedEntries : sortedEntries.slice(0, 5)).map((entry) => (\n
    \n
    \n
  • \n {entry[1].description}\n
  • \n
    \n
    \n
    Version {entry[0]}
    \n
    {formatTimeString(entry[1].date)}
    \n
    \n
    \n ))}\n
\n {sortedEntries.length > 5 && (\n setShowAllVersions(!showAllVersions)}\n className=\"tw:text-xs tw:text-foreground tw:underline\"\n >\n {showAllVersions ? 'Show Less Version History' : 'Show All Version History'}\n \n )}\n
\n );\n}\n\nexport default VersionHistory;\n","import { useMemo } from 'react';\nimport { formatBytes, getCurrentLocale } from 'platform-bible-utils';\nimport { VersionHistory, VersionHistoryType } from './version-history.component';\n\n/** Interface to store the parameters passed to the Footer component */\ninterface FooterProps {\n /** Optional unique identifier */\n id?: string;\n /** Name of the publisher */\n publisherDisplayName: string;\n /** Size of the extension file in bytes */\n fileSize: number;\n /** List of language codes supported by the extension */\n locales: string[];\n /** Object containing the version history mapped with their information */\n versionHistory: VersionHistoryType;\n /** Current version of the extension */\n currentVersion: string;\n}\n\n/**\n * Component to render the footer for the extension details which contains information on the\n * publisher, version history, languages, and file size.\n *\n * @param FooterProps\n * @returns The rendered Footer component\n */\nexport function Footer({\n id,\n publisherDisplayName,\n fileSize,\n locales,\n versionHistory,\n currentVersion,\n}: FooterProps) {\n /** Formats the file size into a human-readable format */\n const formattedFileSize = useMemo(() => formatBytes(fileSize), [fileSize]);\n\n /**\n * This function gets the display names of the languages based on the language codes.\n *\n * @param codes The list of language codes\n * @returns The list of language names\n */\n const getLanguageNames = (codes: string[]) => {\n const displayNames = new Intl.DisplayNames(getCurrentLocale(), { type: 'language' });\n return codes.map((code) => displayNames.of(code));\n };\n\n const languageNames = getLanguageNames(locales);\n\n return (\n
\n
\n {Object.entries(versionHistory).length > 0 && (\n \n )}\n
\n

Information

\n
\n

\n Publisher\n {publisherDisplayName}\n Size\n {formattedFileSize}\n

\n
\n

\n Version\n {currentVersion}\n Languages\n {languageNames.join(', ')}\n

\n
\n
\n
\n
\n
\n );\n}\n\nexport default Footer;\n","import { Badge } from '@/components/shadcn-ui/badge';\nimport { Button } from '@/components/shadcn-ui/button';\nimport { Label } from '@/components/shadcn-ui/label';\nimport { X } from 'lucide-react';\nimport { MultiSelectComboBox, MultiSelectComboBoxProps } from './multi-select-combo-box.component';\n\ninterface FilterProps extends MultiSelectComboBoxProps {\n /**\n * Placeholder text that will be displayed when no items are selected. It will appear at the\n * location where the badges would be if any items were selected.\n */\n badgesPlaceholder: string;\n /** Optional id for the component */\n id?: string;\n}\n\n/**\n * This is a variant of the {@link MultiSelectComboBox}, that shows a {@link Badge} component for each\n * selected item in the combo box. Clicking the 'X' icon on the badge will clear the item from the\n * selected options. A placeholder text must be provided through 'badgesPlaceholder'. This will be\n * displayed if no items are selected,\n */\nexport function Filter({\n entries,\n selected,\n onChange,\n placeholder,\n commandEmptyMessage,\n customSelectedText,\n isDisabled,\n sortSelected,\n icon,\n className,\n badgesPlaceholder,\n id,\n}: FilterProps) {\n return (\n
\n \n {selected.length > 0 ? (\n
\n {selected.map((type) => (\n \n onChange(selected.filter((selectedType) => selectedType !== type))}\n >\n \n \n {entries.find((entry) => entry.value === type)?.label}\n \n ))}\n
\n ) : (\n \n )}\n
\n );\n}\n\nexport default Filter;\n","import { Button, type ButtonProps } from '@/components/shadcn-ui/button';\nimport { ButtonGroup, ButtonGroupSeparator } from '@/components/shadcn-ui/button-group';\nimport { Kbd } from '@/components/shadcn-ui/kbd';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/shadcn-ui/tooltip';\nimport { isMacOs } from '@/utils/platform.util';\nimport { Redo, Undo } from 'lucide-react';\n\n/**\n * Object containing all keys used for localization in this component. If you're using this\n * component in an extension, you can pass it into the useLocalizedStrings hook to easily obtain the\n * localized strings and pass them into the localizedStrings prop of this component.\n */\nexport const UNDO_REDO_BUTTONS_STRING_KEYS = Object.freeze([\n '%undoButton_tooltip%',\n '%redoButton_tooltip%',\n] as const);\n\nexport type UndoRedoButtonsLocalizedStrings = {\n [key in (typeof UNDO_REDO_BUTTONS_STRING_KEYS)[number]]?: string;\n};\n\nconst localizeString = (\n strings: UndoRedoButtonsLocalizedStrings,\n key: keyof UndoRedoButtonsLocalizedStrings,\n) => strings[key] ?? key;\n\nexport type UndoRedoButtonsProps = {\n /** Function to call when Undo is clicked. */\n onUndoClick: () => void;\n /** Function to call when Redo is clicked. If undefined, the Redo button is not rendered. */\n onRedoClick?: () => void;\n /** Whether the Undo button is enabled. */\n canUndo?: boolean;\n /** Whether the Redo button is enabled. */\n canRedo?: boolean;\n /** Localized strings for button tooltips. Falls back to the key itself if not provided. */\n localizedStrings?: UndoRedoButtonsLocalizedStrings;\n /**\n * Whether to show OS-specific keyboard shortcut hints in the tooltips. Defaults to `true`. If\n * being used with an `Editorial` component, wrap it in `EditorKeyboardShortcuts` to make the\n * shortcuts functional.\n */\n showKeyboardShortcuts?: boolean;\n /** CSS class name for the buttons. Defaults to \"tw:h-6 tw:w-6\". */\n className?: string;\n /** Variant for the buttons. Defaults to \"ghost\". */\n variant?: ButtonProps['variant'];\n};\n\n/**\n * Undo and (optionally) Redo buttons with tooltips. Suitable for use in any editor toolbar. The\n * Redo button is only rendered when `onRedoClick` is provided. Tooltip text defaults to the\n * localization key if no localized strings are provided. OS-specific keyboard shortcut hints are\n * shown in the tooltips by default; wrap the `Editorial` component in `EditorKeyboardShortcuts` to\n * make those shortcuts functional.\n */\nexport function UndoRedoButtons({\n onUndoClick,\n onRedoClick,\n canUndo = true,\n canRedo = true,\n localizedStrings = {},\n showKeyboardShortcuts = true,\n className = 'tw:h-6 tw:w-6',\n variant = 'ghost',\n}: UndoRedoButtonsProps) {\n const isMac = isMacOs();\n const undoLocalized = localizeString(localizedStrings, '%undoButton_tooltip%');\n const redoLocalized = localizeString(localizedStrings, '%redoButton_tooltip%');\n const getsSeparator = variant === 'secondary' || variant === 'default';\n\n return (\n \n \n \n \n \n \n \n \n \n

\n {undoLocalized}\n {showKeyboardShortcuts && (\n <>\n {' '}\n {isMac ? '⌘Z' : 'Ctrl+Z'}\n \n )}\n

\n
\n
\n
\n {onRedoClick && getsSeparator && }\n {onRedoClick && (\n \n \n \n \n \n \n \n \n

\n {redoLocalized}\n {showKeyboardShortcuts && (\n <>\n {' '}\n {isMac ? '⌘⇧Z' : 'Ctrl+Y'}\n \n )}\n

\n
\n
\n
\n )}\n
\n );\n}\n\nexport default UndoRedoButtons;\n","import { EditorRef } from '@eten-tech-foundation/platform-editor';\nimport { isMacOs } from '@/utils/platform.util';\nimport { MutableRefObject, PropsWithChildren, useEffect, useRef } from 'react';\n\n/** Properties for the `KeyboardShortcutsPlugin` component */\ntype EditorKeyboardShortcutsProps = PropsWithChildren & {\n /** The `editorRef` of the editor that this undo/redo plugin is applied to */\n editorRef: MutableRefObject;\n /** Whether the Undo button is enabled. */\n canUndo?: boolean;\n /** Whether the Redo button is enabled. */\n canRedo?: boolean;\n};\n\n/**\n * Component that provides common undo/redo capability for a scripture `Editorial` component. Must\n * have the `Editorial` component instance as a child of this component.\n */\nexport function EditorKeyboardShortcuts({\n children,\n editorRef,\n canUndo = true,\n canRedo = true,\n}: EditorKeyboardShortcutsProps) {\n // These refs must have default values of `null` to be accepted by the React elements as refs\n // eslint-disable-next-line no-null/no-null\n const divRef = useRef(null);\n\n // Listen for the standard undo/redo shortcuts for the current OS.\n useEffect(() => {\n const isMac = isMacOs();\n const editorInput = divRef.current?.querySelector('.editor-input') ?? undefined;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!editorInput || document.activeElement !== editorInput) return;\n\n const key = event.key.toLowerCase();\n\n if (isMac) {\n if (!event.metaKey) return;\n\n // Undo: ⌘Z\n if (!event.shiftKey && key === 'z') {\n event.preventDefault();\n if (canUndo) {\n editorRef.current?.undo();\n }\n }\n\n // Redo: ⌘⇧Z\n else if (event.shiftKey && key === 'z') {\n event.preventDefault();\n if (canRedo) {\n editorRef.current?.redo();\n }\n }\n } else {\n if (!event.ctrlKey) return;\n\n // Undo: Ctrl+Z\n if (!event.shiftKey && key === 'z') {\n event.preventDefault();\n if (canUndo) {\n editorRef.current?.undo();\n }\n }\n\n // Redo: Ctrl+Y or Ctrl+Shift+Z\n else if (key === 'y' || (event.shiftKey && key === 'z')) {\n event.preventDefault();\n if (canRedo) {\n editorRef.current?.redo();\n }\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [canRedo, canUndo, editorRef]);\n\n return
{children}
;\n}\n","import {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/shadcn-ui/dropdown-menu';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/shadcn-ui/tooltip';\nimport { Button } from '@/components/shadcn-ui/button';\nimport { GENERATOR_NOTE_CALLER, HIDDEN_NOTE_CALLER } from '@eten-tech-foundation/platform-editor';\nimport { Input } from '@/components/shadcn-ui/input';\nimport { KeyboardEvent, useEffect, useRef, useState } from 'react';\nimport { Z_INDEX_ABOVE_POPOVER } from '@/components/z-index';\nimport { FootnoteCallerType, FootnoteEditorLocalizedStrings } from './footnote-editor.types';\n\ninterface FootnoteCallerDropdownProps {\n /** The caller type value to pass to the dropdown */\n callerType: FootnoteCallerType;\n /** The custom caller to pass to the custom caller input field */\n customCaller: string;\n /**\n * Applies the caller the user settled on. Both halves travel together because they are ONE\n * choice, and the applied caller is a function of both: a type of `custom` means nothing without\n * its character. Split into a call per half, each would have to read the other from state its\n * sibling had not updated yet, and a visit that changes both — choosing Custom and typing its\n * character — would write neither.\n */\n updateCaller: (newCallerType: FootnoteCallerType, newCustomCaller: string) => void;\n /** Localized strings from the parent component */\n localizedStrings: FootnoteEditorLocalizedStrings;\n}\n\nconst renderCallerButtonContent = (\n callerType: FootnoteCallerType,\n localizedStrings: FootnoteEditorLocalizedStrings,\n customCaller: string,\n) => {\n if (callerType === 'generated') {\n return (\n <>\n

+

{localizedStrings['%footnoteEditor_callerDropdown_item_generated%']}\n \n );\n }\n\n if (callerType === 'hidden') {\n return (\n <>\n

-

{localizedStrings['%footnoteEditor_callerDropdown_item_hidden%']}\n \n );\n }\n\n return (\n <>\n

{customCaller}

{localizedStrings['%footnoteEditor_callerDropdown_item_custom%']}\n \n );\n};\n\nexport function FootnoteCallerDropdown({\n callerType,\n customCaller,\n updateCaller,\n localizedStrings,\n}: FootnoteCallerDropdownProps) {\n // The ref must start with being null to be passed as an element ref\n // eslint-disable-next-line no-null/no-null\n const customCallerInputRef = useRef(null);\n // The ref must start with being null to be passed as an element ref\n // eslint-disable-next-line no-null/no-null\n const customCallerSelectRef = useRef(null);\n // The ref must start with being null to be passed as an element ref\n // eslint-disable-next-line no-null/no-null\n const isCustomCallerInputFocused = useRef(false);\n const [selectedCallerType, setSelectedCallerType] = useState(callerType);\n const [newCustomCaller, setNewCustomCaller] = useState(customCaller);\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n // Whether the Custom row was already checked when the pointer went down on it — see its\n // `onPointerDown` for why the click itself can no longer tell.\n const wasCustomBeforePressRef = useRef(false);\n\n // The selection is COMMITTED when the menu closes (below), and choosing an item closes the menu\n // — so both happen in one React batch and the close handler's closure still holds the\n // pre-selection values. Reading the pending choice through refs is what makes the commit see\n // what the user just picked instead of what was selected when the menu opened; without them\n // every selection committed the value it was replacing.\n const selectedCallerTypeRef = useRef(selectedCallerType);\n selectedCallerTypeRef.current = selectedCallerType;\n const newCustomCallerRef = useRef(newCustomCaller);\n newCustomCallerRef.current = newCustomCaller;\n\n // If the caller type changes, the selected caller type needs to change also\n useEffect(() => {\n setSelectedCallerType(callerType);\n }, [callerType]);\n\n // If the parent custom caller changes, then the new custom caller should reflect the changes\n useEffect(() => {\n if (newCustomCaller !== customCaller) {\n setNewCustomCaller(customCaller);\n }\n // This can't be triggered when the new custom caller updates because otherwise this will\n // completely prevent the input field from being edited\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [customCaller]);\n\n const handleDropdownOpenChange = (open: boolean) => {\n isCustomCallerInputFocused.current = false;\n setIsDropdownOpen(open);\n if (!open) {\n const pendingCallerType = selectedCallerTypeRef.current;\n const pendingCustomCaller = newCustomCallerRef.current;\n // This makes it so that if the custom caller is invalid, then reverts back to the previous\n // selected caller\n if (pendingCallerType !== 'custom' || pendingCustomCaller) {\n // One call for one choice: this is a save, and the note is replaced in the popover's\n // editor on the way through, so a close must never produce two of them.\n if (pendingCallerType !== callerType || pendingCustomCaller !== customCaller)\n updateCaller(pendingCallerType, pendingCustomCaller);\n } else {\n setSelectedCallerType(callerType);\n setNewCustomCaller(customCaller);\n }\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n event.stopPropagation();\n // Allow to navigate to the input field\n if (\n (document.activeElement === customCallerSelectRef.current && event.key === 'ArrowDown') ||\n event.key === 'ArrowRight'\n ) {\n customCallerInputRef.current?.focus();\n isCustomCallerInputFocused.current = true;\n } else if (document.activeElement === customCallerInputRef.current && event.key === 'ArrowUp') {\n customCallerSelectRef.current?.focus();\n isCustomCallerInputFocused.current = false;\n } else if (\n document.activeElement === customCallerInputRef.current &&\n event.key === 'ArrowLeft' &&\n customCallerInputRef.current?.selectionStart === 0\n ) {\n customCallerSelectRef.current?.focus();\n isCustomCallerInputFocused.current = false;\n }\n\n // Allow the dropdown menu to be submitted if the custom caller is selected when you press enter\n if (\n selectedCallerType === 'custom' &&\n event.key === 'Enter' &&\n (document.activeElement === customCallerSelectRef.current ||\n document.activeElement === customCallerInputRef.current)\n ) {\n handleDropdownOpenChange(false);\n }\n };\n\n return (\n \n \n \n \n \n \n \n \n \n {localizedStrings['%footnoteEditor_callerDropdown_tooltip%']}\n \n \n \n {\n if (isCustomCallerInputFocused.current) isCustomCallerInputFocused.current = false;\n }}\n onKeyDown={handleKeyDown}\n onMouseMove={() => {\n if (isCustomCallerInputFocused.current) customCallerInputRef.current?.focus();\n }}\n >\n \n {localizedStrings['%footnoteEditor_callerDropdown_label%']}\n \n \n setSelectedCallerType('generated')}\n >\n
\n {localizedStrings['%footnoteEditor_callerDropdown_item_generated%']}\n {GENERATOR_NOTE_CALLER}\n
\n \n setSelectedCallerType('hidden')}\n >\n
\n {localizedStrings['%footnoteEditor_callerDropdown_item_hidden%']}\n {HIDDEN_NOTE_CALLER}\n
\n \n setSelectedCallerType('custom')}\n // Radix selects a menu item on POINTER-UP, so by the time the click arrives this row is\n // already checked and the click handler can no longer tell an arming click from a\n // confirming one. The answer is only available before the press is resolved, so it is\n // taken here.\n onPointerDown={() => {\n wasCustomBeforePressRef.current = selectedCallerType === 'custom';\n }}\n onClick={(event) => {\n event.stopPropagation();\n // Choosing Custom deliberately keeps the menu OPEN (see `onSelect` below) so a caller\n // can be typed, which leaves this row's own check as the pointer gesture that confirms\n // one — the same commit Enter performs, through the same close handler. The check's\n // indicator is `pointer-events-none`, so a click on it arrives here, on the row.\n //\n // Only a row that was ALREADY checked commits: the first click is what selects Custom\n // and focuses the field, and committing there would apply whatever the field held\n // before the user typed. A click that landed in the FIELD is the user reaching for the\n // text, never a confirmation — closing on that would make a caller impossible to type.\n if (wasCustomBeforePressRef.current && event.target !== customCallerInputRef.current) {\n handleDropdownOpenChange(false);\n return;\n }\n isCustomCallerInputFocused.current = true;\n customCallerInputRef.current?.focus();\n }}\n onSelect={(event) => event.preventDefault()}\n >\n
\n {localizedStrings['%footnoteEditor_callerDropdown_item_custom%']}\n {\n event.stopPropagation();\n setSelectedCallerType('custom');\n isCustomCallerInputFocused.current = true;\n }}\n ref={customCallerInputRef}\n className=\"tw:h-auto tw:w-10 tw:p-0 tw:text-center\"\n value={newCustomCaller}\n onKeyDown={(event) => {\n if (\n !(\n event.key === 'Enter' ||\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown' ||\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight'\n )\n )\n event.stopPropagation();\n }}\n maxLength={1}\n onChange={(event) => setNewCustomCaller(event.target.value)}\n />\n
\n \n \n
\n );\n}\n","import { Button } from '@/components/shadcn-ui/button';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/shadcn-ui/dropdown-menu';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/shadcn-ui/tooltip';\nimport { FunctionSquare, SquareSigma, SquareX } from 'lucide-react';\nimport { formatReplacementString } from 'platform-bible-utils';\nimport { Z_INDEX_ABOVE_POPOVER } from '@/components/z-index';\nimport { FootnoteEditorLocalizedStrings } from './footnote-editor.types';\n\ninterface FootnoteTypeDropdownProps {\n noteType: string;\n handleNoteTypeChange: (newNoteType: string) => void;\n localizedStrings: FootnoteEditorLocalizedStrings;\n isTypeSwitchable: boolean;\n}\n\nconst renderNoteTypeButtonContent = (\n noteType: string,\n localizedStrings: FootnoteEditorLocalizedStrings,\n) => {\n if (noteType === 'f') {\n return (\n <>\n {localizedStrings['%footnoteEditor_noteType_footnote_label%']}\n \n );\n }\n\n if (noteType === 'fe') {\n return (\n <>\n {localizedStrings['%footnoteEditor_noteType_endNote_label%']}\n \n );\n }\n\n return (\n <>\n {localizedStrings['%footnoteEditor_noteType_crossReference_label%']}\n \n );\n};\n\nconst formatNoteTypeTooltip = (\n noteType: string,\n localizedStrings: FootnoteEditorLocalizedStrings,\n) => {\n if (noteType === 'x') {\n return localizedStrings['%footnoteEditor_noteType_crossReference_label%'];\n }\n\n let noteTypeString = localizedStrings['%footnoteEditor_noteType_endNote_label%'];\n if (noteType === 'f') {\n noteTypeString = localizedStrings['%footnoteEditor_noteType_footnote_label%'];\n }\n\n return formatReplacementString(localizedStrings['%footnoteEditor_noteType_tooltip%'] ?? '', {\n noteType: noteTypeString,\n });\n};\n\nexport function FootnoteTypeDropdown({\n noteType,\n handleNoteTypeChange,\n localizedStrings,\n isTypeSwitchable,\n}: FootnoteTypeDropdownProps) {\n return (\n \n \n \n \n \n \n \n \n \n

{formatNoteTypeTooltip(noteType, localizedStrings)}

\n
\n
\n
\n \n \n {localizedStrings['%footnoteEditor_noteTypeDropdown_label%']}\n \n \n handleNoteTypeChange('x')}\n className=\"tw:gap-2\"\n >\n \n {localizedStrings['%footnoteEditor_noteType_crossReference_label%']}\n \n handleNoteTypeChange('f')}\n className=\"tw:gap-2\"\n >\n \n {localizedStrings['%footnoteEditor_noteType_footnote_label%']}\n \n handleNoteTypeChange('fe')}\n className=\"tw:gap-2\"\n >\n \n {localizedStrings['%footnoteEditor_noteType_endNote_label%']}\n \n \n
\n );\n}\n","import { FC, LegacyRef, useMemo, useState } from 'react';\nimport { Ban, Check } from 'lucide-react';\nimport { stripMarkerNestingPrefix } from '@/components/advanced/marker-palette-filter.util';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n CommandShortcut,\n} from '../shadcn-ui/command';\n\n/**\n * Object containing all keys used for localization in the MarkerMenu component. If you're using\n * this component in an extension, you can pass it into the useLocalizedStrings hook to easily\n * obtain the localized strings and pass them into the localizedStrings prop of this component\n */\nexport const MARKER_MENU_STRING_KEYS = Object.freeze([\n '%markerMenu_deprecated_label%',\n '%markerMenu_disallowed_label%',\n '%markerMenu_noResults%',\n '%markerMenu_searchPlaceholder%',\n // These three keys are not read by this component directly; they are provided here so callers\n // can localize them and pass the result into the optional `searchPlaceholder` prop to override\n // the default search-field placeholder.\n '%markerMenu_searchPlaceholder_character%',\n '%markerMenu_searchPlaceholder_insert%',\n '%markerMenu_searchPlaceholder_paragraph%',\n] as const);\n\nexport type MarkerMenuLocalizedStrings = {\n [localizedKey in (typeof MARKER_MENU_STRING_KEYS)[number]]?: string;\n};\n\n/** Interface that includes the properties that the provided icon element should have */\nexport interface MarkerIconProps {\n /** CSS class name to apply to the icon */\n className?: string;\n /** Size in px that the icon should be */\n size?: string | number;\n}\n\n/** Type for the markers that contain all necessary information to be displayed in the list */\nexport interface MarkerMenuItem {\n /** If the item is a marker, then this is the marker code */\n marker?: string;\n /** The main title for the marker or command */\n title: string;\n /** An optional subtitle for the marker */\n subtitle?: string;\n /** Optional name of icon to use instead of the marker */\n icon?: FC;\n /**\n * Whether the command/marker is deprecated. Deprecated items stay visible in the menu (even when\n * the search query is empty) but are rendered disabled so they cannot be selected.\n */\n isDeprecated?: boolean;\n /**\n * Whether the command/marker is disallowed for this project (e.g. blocked while structure is\n * protected). Unlike {@link MarkerMenuItem.isDeprecated}, this flag affects visibility as well as\n * selectability: while the search query is empty, disallowed items are hidden if any allowed\n * items exist (to reduce clutter) but are shown when every item is disallowed (so the menu isn't\n * empty). A non-empty query reveals a disallowed item only on an exact marker-code match or a\n * title match. Whenever a disallowed item is shown it is rendered disabled so it cannot be\n * selected.\n */\n isDisallowed?: boolean;\n /**\n * How much of the consumer's current selection this marker covers: `'all'`, `'partial'`, or\n * `'none'`. Optional and additive — with no value, no selection affordance renders and no\n * `aria-checked` is set, which is how consumers that do not track a selection behave.\n *\n * Unlike {@link MarkerMenuItem.isDeprecated} and {@link MarkerMenuItem.isDisallowed}, this affects\n * neither visibility nor selectability. It is display only.\n */\n selectionState?: 'all' | 'partial' | 'none';\n /**\n * Whether the consumer currently has no operation for this row, so it must not be selectable.\n * Optional and additive — with no value the row is selectable exactly as it has always been.\n *\n * Unlike {@link MarkerMenuItem.isDeprecated} and {@link MarkerMenuItem.isDisallowed}, this says\n * nothing about the marker itself and so renders no trailing label: those two describe a property\n * of the marker, while this describes the consumer's momentary inability to act on it. It also\n * does not affect visibility — the row stays listed, because a row that disappears reads as \"this\n * marker does not exist here\" rather than \"you cannot do that to it right now.\"\n */\n isDisabled?: boolean;\n /** Function to be triggered when the marker or command is selected */\n action: () => void;\n}\n\n/** Props for the marker menu component */\nexport interface MarkerMenuProps {\n /** Localized strings to pass through for the marker menu */\n localizedStrings: MarkerMenuLocalizedStrings;\n /**\n * A list of the marker menu items which can either be a marker to insert or some basic command\n * actions\n */\n markerMenuItems: MarkerMenuItem[];\n /** Optional ref for the command search input to be able to focus it manually */\n searchRef?: LegacyRef;\n /**\n * Optional placeholder text for the search input. When provided, overrides the default\n * `%markerMenu_searchPlaceholder%` localized string.\n */\n searchPlaceholder?: string;\n}\n\n/** Function to format the marker menu icon and size it accordingly */\nfunction MenuMarkerIcon({ icon, className }: { icon?: FC; className?: string }) {\n const IconComponent = icon ?? Ban;\n return ;\n}\n\n/**\n * Leading selection indicator for a marker row, on the start side per the Component Choices\n * guideline. Rendered only when the consumer supplies a selection state, so rows without one keep\n * the layout they have always had.\n *\n * A checked row means the marker is on the selection — whether on all of it or only part of it. UX\n * chose this two-glyph reading over a three-glyph one (decided 2026-08-06): a dash for partial read\n * as a disabled checkbox rather than as \"some of this\", and an empty box for `'none'` made a\n * single-select picker look multi-select. The distinction is not lost, only moved: `aria-checked`\n * still reports `mixed` for a partial row, so the tri-state survives for screen-reader users while\n * the visual stays binary. The `'none'` box still reserves its width so rows stay aligned.\n */\nfunction MarkerSelectionStateIndicator({ state }: { state: 'all' | 'partial' | 'none' }) {\n return (\n \n {state !== 'none' && }\n \n );\n}\n\n/**\n * Function that renders the marker menu command item for both the marker matches and the title\n * matches\n */\nfunction MarkerMenuCommandItem({\n item,\n localizedStrings,\n}: {\n item: MarkerMenuItem;\n localizedStrings: MarkerMenuLocalizedStrings;\n}) {\n return (\n \n {item.selectionState !== undefined && (\n \n )}\n
\n {item.marker ? (\n // Monospace: a USFM marker is a code, not prose, and should read as one. Deliberately\n // inherits the row's own foreground rather than taking a marker-specific colour.\n {item.marker}\n ) : (\n
\n \n
\n )}\n
\n {/* Title and detail sit side by side, detail trailing and subordinate. Both truncate rather\n than wrap — consumers pin this popover as narrow as 200px — and the detail's much larger\n shrink factor means it gives up its space first, so the title, which identifies the row,\n keeps as much as it can.\n\n Native `title` attributes rather than the Tooltip component: a Radix tooltip inside a cmdk\n list fights the list's own hover and focus handling. */}\n
\n

\n {item.title}\n

\n {item.subtitle && (\n \n {item.subtitle}\n

\n )}\n
\n {(item.isDisallowed || item.isDeprecated) && (\n \n {item.isDisallowed\n ? localizedStrings['%markerMenu_disallowed_label%']\n : localizedStrings['%markerMenu_deprecated_label%']}\n \n )}\n \n );\n}\n\n/** Marker menu component to render the list of markers and a few commands in the scripture editor */\nexport function MarkerMenu({\n localizedStrings,\n markerMenuItems,\n searchRef,\n searchPlaceholder,\n}: MarkerMenuProps) {\n const [commandSearch, setCommandSearch] = useState('');\n\n const [codeMatchItems, titleMatchItems] = useMemo(() => {\n // A leading `+` is USFM nesting syntax (`\\+nd` nests inside an open char span), not part of the\n // marker code — strip it so `+nd` resolves to the bare `nd` item. The shared helper is the one\n // strip rule for every marker-matching site, so this menu and the palettes cannot drift.\n const query = stripMarkerNestingPrefix(commandSearch.trim().toLowerCase());\n if (!query) {\n // Hide disallowed markers until specifically searched, so the menu isn't cluttered with\n // entries the user cannot insert.\n const allowedItems = markerMenuItems.filter((markerItem) => !markerItem.isDisallowed);\n // ...but when every item is disallowed (e.g. all of a parent's markers are blocked while\n // structure is protected), fall back to showing the disallowed items (disabled) so the menu\n // surfaces the locked options instead of reading as an empty \"No results\" state.\n return [allowedItems.length > 0 ? allowedItems : markerMenuItems, []];\n }\n\n // Marker-code matches first. Disallowed markers require an exact code match (never a substring),\n // so a broad query doesn't surface sibling markers the user cannot use.\n const filteredCodeMatchItems = markerMenuItems.filter((markerItem) => {\n const code = markerItem.marker?.toLowerCase();\n return markerItem.isDisallowed ? code === query : code?.includes(query);\n });\n // Then title matches. A disallowed marker's title match is itself its reveal condition, so it\n // needs no extra gate here.\n const filteredTitleMatchItems = markerMenuItems.filter(\n (markerItem) =>\n markerItem.title.toLowerCase().includes(query) &&\n !filteredCodeMatchItems.includes(markerItem),\n );\n\n return [filteredCodeMatchItems, filteredTitleMatchItems];\n }, [commandSearch, markerMenuItems]);\n\n return (\n \n setCommandSearch(value)}\n placeholder={searchPlaceholder ?? localizedStrings['%markerMenu_searchPlaceholder%']}\n // Picker semantics: the list is the whole point here, and nothing else in this menu claims\n // Space. Only a LEADING space is intercepted, so titles containing spaces (\"Cross\n // Reference\") are still searchable.\n spaceSelectsHighlightedItem\n />\n \n {localizedStrings['%markerMenu_noResults%']}\n \n {codeMatchItems.map((item) => (\n \n ))}\n \n {titleMatchItems.length > 0 && (\n <>\n {codeMatchItems.length > 0 && }\n \n {titleMatchItems.map((item) => (\n \n ))}\n \n \n )}\n \n \n );\n}\n","import { EditorRef } from '@eten-tech-foundation/platform-editor';\nimport { LanguageStrings, usfmMarkers } from 'platform-bible-utils';\nimport { MutableRefObject } from 'react';\nimport { MarkerMenuItem } from '../marker-menu.component';\n\n/**\n * Function that generates the inline marker menu items that will update as the cursor location\n * changes.\n *\n * TODO(PT-4199): The menu is built from the static `usfmMarkers` table, so a project's custom.sty\n * markers are missing from it and a marker the project redefined is described by the stock entry.\n * Take the marker set from the project's stylesheet instead.\n *\n * @param editorRef The ref for the editor component to be able to insert markers\n * @param parentMarker The current parent marker which is used to determine which markers to include\n * @returns The list of inline marker menu items\n */\nexport function generateInlineMarkerMenuListItems(\n editorRef: MutableRefObject,\n closeMarkersMenu: () => void,\n localizedStrings: LanguageStrings,\n parentMarker?: string,\n): MarkerMenuItem[] {\n // Makes it so that if the parent marker is a paragraph, won't show the marker menu\n if (!parentMarker || parentMarker === 'p') return [];\n\n const markerDetails = usfmMarkers[parentMarker];\n if (!markerDetails?.children) return [];\n\n const markerMenuItems: MarkerMenuItem[] = [];\n Object.entries(markerDetails.children).forEach(([, markers]) => {\n markerMenuItems.push(\n ...markers.map((marker) => {\n return {\n marker,\n title:\n localizedStrings[usfmMarkers[marker].description] ?? usfmMarkers[marker].description,\n action: () => {\n editorRef.current?.insertMarker(marker);\n closeMarkersMenu();\n },\n };\n }),\n );\n });\n return markerMenuItems.sort((a, b) => (a.marker ?? a.title).localeCompare(b.marker ?? b.title));\n}\n","import { Button } from '@/components/shadcn-ui/button';\nimport { ButtonGroup } from '@/components/shadcn-ui/button-group';\nimport { CancelAcceptButtons } from '@/components/basics/cancel-accept-buttons.component';\nimport {\n defaultStyleInfo,\n DeltaOp,\n DeltaOpInsertNoteEmbed,\n Editorial,\n EditorOptions,\n EditorRef,\n GENERATOR_NOTE_CALLER,\n getDefaultViewOptions,\n getMarkerMenuItems,\n HIDDEN_NOTE_CALLER,\n isInsertEmbedOpOfType,\n MarkerMenuItem as EditorMarkerMenuItem,\n SelectionRange,\n StateChangeSnapshot,\n} from '@eten-tech-foundation/platform-editor';\nimport { Copy } from 'lucide-react';\nimport {\n clearPaletteSessionIfCurrent,\n handleMarkerPaletteSessionKeyDown,\n isImeCompositionKeyEvent,\n type MarkerPaletteKeyEvent,\n} from '@/components/advanced/marker-palette-keydown.util';\nimport {\n runMarkerPaletteSession,\n type MarkerPaletteOpenSession,\n} from '@/components/advanced/marker-palette-session.util';\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n RefObject,\n} from 'react';\nimport '@/components/advanced/footnote-editor/editor-overrides.css';\nimport { ABORTED, getErrorMessage, isPlatformError, type PaletteItem } from 'platform-bible-utils';\nimport type { PaletteDriver, PaletteKeyForwarding } from 'platform-bible-utils/experimental';\nimport { SerializedVerseRef } from '@sillsdev/scripture';\nimport {\n Tooltip,\n TooltipProvider,\n TooltipTrigger,\n TooltipContent,\n} from '@/components/shadcn-ui/tooltip';\nimport { UndoRedoButtons } from '@/components/basics/undo-redo-buttons.component';\nimport { Usj } from '@eten-tech-foundation/scripture-utilities';\nimport { Popover, PopoverAnchor, PopoverContent } from '@/components/shadcn-ui/popover';\nimport { EditorKeyboardShortcuts } from '@/components/basics/editor-keyboard-shortcuts.component';\nimport { FootnoteCallerDropdown } from './footnote-caller-dropdown.component';\nimport { FootnoteTypeDropdown } from './footnote-type-dropdown.component';\nimport { FootnoteCallerType, FootnoteEditorLocalizedStrings } from './footnote-editor.types';\nimport { MarkerMenu } from '../marker-menu.component';\nimport { generateInlineMarkerMenuListItems } from './footnote-editor.utils';\n\n/** Interface containing the types of the properties that are passed to the `FootnoteEditor` */\nexport interface FootnoteEditorProps {\n /** Class name for styling the embedded `Editor` component in this editor popover */\n classNameForEditor?: string;\n /** Delta ops for the current note being edited that are applied to the note editorial */\n noteOps: DeltaOpInsertNoteEmbed[] | undefined;\n /** External function to handle closing the footnote editor */\n onClose: () => void;\n /** The scripture reference for the parent editor */\n scrRef: SerializedVerseRef;\n /** The unique note key to identify the note being edited used to apply changes to the note */\n noteKey: string | undefined;\n /** View options of the parent editor */\n editorOptions: EditorOptions;\n /** Trigger key to open the footnote editor marker menu */\n defaultMarkerMenuTrigger: string;\n /** Localized strings to be passed to the footnote editor component */\n localizedStrings: FootnoteEditorLocalizedStrings;\n /**\n * Called on every change to the footnote with the updated note ops. An implementation of this\n * function is required only if the parent does not supply `parentEditorRef` or if some additional\n * logic is needed to handle the changes. The note ops passed in this function are the full ops\n * for the note, not just the changes since the last call.\n */\n onChange?: (noteOps: DeltaOpInsertNoteEmbed[]) => void;\n /**\n * Ref to the parent editor. When provided, the footnote editor will apply changes directly to the\n * parent editor, so the client does not need to handle this in the `onChange` callback.\n */\n parentEditorRef?: RefObject;\n /**\n * Optional marker-palette driver (standard-view host wiring for PT9 parity). When provided in\n * editable marker mode, a typed `\\` inside this popover's own editor opens the same palette the\n * main editor uses instead of the built-in inline markers menu below; when absent, editable mode\n * falls back to pass-through-only behavior (literal typing works, no menu) — a graceful\n * degradation for hosts that haven't wired one up. Never consulted outside editable marker mode —\n * the built-in `MarkerMenu` popup below owns that path unconditionally.\n */\n markerPalette?: FootnoteEditorMarkerPalette;\n /**\n * Called whenever the user edits the note in this popover: a content change (the auto-save path),\n * a caller-type change, or a custom-caller change. NOT called for programmatic initialization\n * (popover mount / initial content load). Carries no data — `onChange` is the data path — so\n * hosts can use it as a pure liveness signal for the editing session (e.g. refreshing a staleness\n * clock so a long live edit is never treated as an abandoned session).\n */\n onNoteEdit?: () => void;\n}\n\n/**\n * Driver for the standard-view `\\` marker palette (PT9 parity), supplied by a host that wires it to\n * its own overlay/command-palette implementation (e.g. `papi.overlays.*` keyed by `webViewId` in\n * the platform-scripture-editor web view). Extends the shared `PaletteDriver` contract\n * (update/commit/dismiss — from `platform-bible-utils/experimental`, outside this package's docs\n * entry, so a code reference rather than a link) with the open step.\n */\nexport interface FootnoteEditorMarkerPalette extends PaletteDriver {\n /**\n * Shows the palette anchored at the given position. `passive` mirrors\n * `CommandPaletteRequest.passive` — when true, the palette never steals focus and its filter and\n * highlighted selection are driven externally via the driver's `update`.\n *\n * @returns The selected item's `id`, or `undefined` if dismissed.\n */\n show(\n items: PaletteItem[],\n anchor: { x: number; y: number; width?: number; height?: number },\n passive: boolean,\n /**\n * Keys the session claims while the palette is open. The palette forwards exactly these back\n * instead of acting on them, so the session's semantics run whichever document holds focus —\n * without it, a palette that takes focus silently takes the session's keys with it.\n */\n keyForwarding?: PaletteKeyForwarding,\n ): Promise;\n}\n\n/**\n * Maps a library marker-menu item to the shared palette-item shape — THE one converter for marker\n * palettes (the platform-scripture-editor web view consumes it too).\n *\n * `label` is always a plain string (never a `LocalizeKey`): passive palettes filter and commit on\n * the RAW `label`. The badge carries no such constraint — filtering is label-only, so descriptions\n * and badges never take part in matching or commit resolution (see `marker-palette-filter.util.ts`)\n * — and the palette host resolves a `LocalizeKey` badge to a localized string before rendering, so\n * the close-tag badge is a key.\n *\n * Items are mapped in the library's PT9-derived order and never regrouped — a `group` key would\n * visually pull close tags out of the PT9 basic-first interleaved ordering, so close tags are\n * instead marked in place with an end badge, and PT9's grey cue for non-basic markers maps to\n * `muted`.\n */\nexport function markerMenuItemToPaletteItem(item: EditorMarkerMenuItem): PaletteItem {\n return {\n id: item.marker,\n label: item.marker,\n description: item.description,\n badge: item.kind === 'closeTag' ? '%markerMenu_endTag_label%' : undefined,\n muted: !item.isBasic,\n };\n}\n\n/**\n * Function to convert a footnote/endnote type node to a cross-reference type node\n *\n * An op with no `char` attributes carries no style to convert — a note whose content is bare text\n * (`\\f + plain text\\f*`) has one, and `isTypeSwitchable` deliberately treats such an op as\n * switchable, so this must tolerate it rather than assume the attributes are there.\n *\n * @param op The node to be converted\n */\nfunction footnoteToCrossReferenceOp(op: DeltaOp) {\n // The built-in type for the delta note ops does not contain the types for the attributes\n // so have to cast it here\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const opCharAttribute = op.attributes?.char as Record | undefined;\n if (opCharAttribute?.style) {\n if (opCharAttribute.style === 'ft') {\n opCharAttribute.style = 'xt';\n }\n\n if (opCharAttribute.style === 'fr') {\n opCharAttribute.style = 'xo';\n }\n\n if (opCharAttribute.style === 'fq') {\n opCharAttribute.style = 'xq';\n }\n }\n}\n\n/**\n * Function to convert a cross-reference type node to a footnote/endnote type node\n *\n * Tolerates an op with no `char` attributes for the same reason as its footnote twin above.\n *\n * @param op The node to be converted\n */\nfunction crossReferenceToFootnoteOp(op: DeltaOp) {\n // The built-in type for the delta note ops does not contain the types for the attributes\n // so have to cast it here\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const opCharAttribute = op.attributes?.char as Record | undefined;\n if (opCharAttribute?.style) {\n if (opCharAttribute.style === 'xt') {\n opCharAttribute.style = 'ft';\n }\n\n if (opCharAttribute.style === 'xo') {\n opCharAttribute.style = 'fr';\n }\n\n if (opCharAttribute.style === 'xq') {\n opCharAttribute.style = 'fq';\n }\n }\n}\n\n// TODO: Remove this once the new marker menu is implemented with correct logic\n/**\n * This is for a temporary fix to get the markers menu to work by having the default usj include a\n * parent paragraph node.\n *\n * The paragraph is SCAFFOLDING, not content: it exists so the editor has an element to host the\n * note being edited, and it never reaches a save (the save path reads the note ops alone — see\n * `saveCurrentNoteOp`). The editor would default its missing marker to `\\p` and render that\n * marker's visible prefix in front of the footnote's own text, so the options below pass\n * `showParaMarkerPrefixes: false` — the editor then never builds the prefix bytes at all (no\n * invisible bytes for the caret to traverse), the wrapper paragraph renders empty until the note op\n * arrives at OT index 0, and the note is its only child.\n */\nconst PARAGRAPH_USJ: Usj = {\n type: 'USJ',\n version: '3.1',\n content: [\n {\n type: 'para',\n },\n ],\n};\n\n/**\n * Component to edit footnotes from within the editor component\n *\n * @param FootnoteEditorProps - The properties for the footnote editor component\n */\nexport default function FootnoteEditor({\n classNameForEditor,\n noteOps,\n onChange,\n onClose,\n scrRef,\n noteKey,\n editorOptions,\n defaultMarkerMenuTrigger,\n localizedStrings,\n parentEditorRef,\n markerPalette,\n onNoteEdit,\n}: FootnoteEditorProps) {\n // These refs must have default values of `null` to be accepted by the React elements as refs\n /* eslint-disable no-null/no-null */\n const editorRef = useRef(null);\n const editorParentRef = useRef(null);\n const outerBorderRef = useRef(null);\n const containerRef = useRef(null);\n /* eslint-enable no-null/no-null */\n\n // Lock the container width to its natural rendered width so content changes (e.g. switching\n // language, undo/redo enabling) don't cause the popover to resize while editing.\n // useLayoutEffect fires after DOM layout but before paint, so getBoundingClientRect() returns\n // the natural width. The parent PopoverContent unmounts this component on close, so the effect\n // re-runs fresh on each open.\n useLayoutEffect(() => {\n if (!containerRef.current) return;\n const { width } = containerRef.current.getBoundingClientRect();\n if (width > 0) containerRef.current.style.width = `${width}px`;\n }, []);\n\n const [callerType, setCallerType] = useState('generated');\n const [originalCallerType, setOriginalCallerType] = useState('generated');\n const [customCaller, setCustomCaller] = useState('*');\n const [originalCustomCaller, setOriginalCustomCaller] = useState('*');\n\n const [noteType, setNoteType] = useState('f');\n\n const [isTypeSwitchable, setIsTypeSwitchable] = useState(false);\n // Tracks whether the editor content matches the state when the note was first loaded, so we\n // can disable Undo when there are no user edits left to undo\n const [isAtInitialState, setIsAtInitialState] = useState(true);\n const [canRedo, setCanRedo] = useState(false);\n const hasInitializedEditor = useRef(false);\n const initialNoteOpsJson = useRef('');\n\n // These control the placement of the inline markers menu by setting the location of the anchor\n const [showMarkersMenu, setShowMarkersMenu] = useState(false);\n const [markersMenuAnchorX, setMarkersMenuAnchorX] = useState();\n const [markersMenuAnchorY, setMarkersMenuAnchorY] = useState();\n const [markersMenuAnchorHeight, setMarkersMenuAnchorHeight] = useState();\n\n const [contextMarker, setContextMarker] = useState();\n\n // The refs needs to start out with null for it to work as a element ref\n // eslint-disable-next-line no-null/no-null\n const markerMenuSearchRef = useRef(null);\n\n /**\n * Session state for a `\\`-triggered marker palette open inside this popover's own editor (single\n * owner: the keydown flow below). Mirrors the main editor's `paletteSession` in\n * `platform-scripture-editor.web-view.tsx` — see there for the full session-shape rationale —\n * scoped to this popover's own `.editor-input` and driven by its own `editorRef`. Both kinds are\n * ACTIVE: the trigger is claimed and never lands, and typed characters filter the palette through\n * the shared capture-phase table (`handleMarkerPaletteSessionKeyDown`) — never the document. The\n * collapsed-caret trigger opens a non-focus-stealing palette (`kind: 'backslash'`); the\n * selection-wrap trigger opens a FOCUSED palette tracked as `kind: 'selection'`, whose keys the\n * table claims wholesale because the cross-frame focus handoff can lose, and an unclaimed\n * keystroke would replace the wrapped selection.\n */\n const paletteSession = useRef | undefined>(\n undefined,\n );\n\n /** Monotonic allocator for {@link paletteSession} tokens. */\n const paletteSessionCounter = useRef(0);\n\n /**\n * Last live USJ selection of this popover's editor, captured as focus left it (the focusout\n * listener below). A palette mouse click steals focus BEFORE the commit round-trips, and\n * Lexical's blur processing can null the live selection outright; the palette commit path\n * restores this capture so the apply still lands at the caret the user last saw. Reset when a new\n * note loads so a stale capture can never place a commit inside the wrong note.\n */\n const lastFocusOutSelectionRef = useRef(undefined);\n\n // Options for the editorial component\n const options = useMemo(\n () => ({\n ...editorOptions,\n // Drop any inherited context-menu extras (e.g. the main editor's \"Insert footnote\" /\n // \"Insert cross-reference\" / \"Insert comment\" items). Those items' onSelect closures are\n // bound to the OUTER main-document editorRef, so surfacing them inside this popover would\n // let a right-click here silently mutate the main document. The popover keeps only the\n // built-in Cut/Copy/Paste context-menu items.\n contextMenu: undefined,\n markerMenuTrigger: defaultMarkerMenuTrigger,\n hasExternalUI: true,\n view: {\n ...(editorOptions.view ?? getDefaultViewOptions()),\n noteMode: 'expanded',\n // The note's marker and caller are governed by this popover's two dropdowns, so they are\n // not text to type into — the same division Paratext 9 draws. Left editable they read as\n // editable and are not: the edit does not persist, and because the note-scoped rebuild\n // refuses a caller it cannot recognize, anything else typed into that slot goes with it\n // (a `\\cat` category run typed after the caller was silently discarded). Atomic here\n // routes that typing to the note's CONTENT, which is where it belongs and where the\n // category folds from.\n isNoteShellEditable: false,\n // The wrapper paragraph is scaffolding (see PARAGRAPH_USJ above): suppress its `\\p`\n // marker prefix so the popover's text starts with the footnote's own first glyph.\n showParaMarkerPrefixes: false,\n },\n }),\n [editorOptions, defaultMarkerMenuTrigger],\n );\n\n const inlineMarkerMenuItems = useMemo(\n () =>\n generateInlineMarkerMenuListItems(\n editorRef,\n () => setShowMarkersMenu(false),\n localizedStrings,\n contextMarker,\n ),\n [localizedStrings, contextMarker],\n );\n\n // Makes it so that the footnote type change tooltip doesn't automatically focus when the\n // component opens by focusing the editor\n useEffect(() => {\n // This needs to be run when the marker menu closes to move the focus back to the editor.\n // The editor shouldn't be focused, however, when the markers menu is first being shown.\n if (!showMarkersMenu) editorRef.current?.focus();\n }, [noteType, showMarkersMenu]);\n\n /**\n * True when the DOM selection's anchor sits inside this popover's note content (the `span.note`\n * element). The popover's document is a lone prefix-less wrapper paragraph hosting exactly one\n * note, so a caret anywhere else (e.g. parked at the wrapper-para start by Radix's\n * open-autofocus) is never where the user means to edit.\n */\n const isDomCaretInsideNote = useCallback(() => {\n const editorInput = editorParentRef.current?.querySelector('.editor-input');\n const noteElement = editorInput?.querySelector('span.note');\n const anchorNode = editorParentRef.current?.ownerDocument.getSelection()?.anchorNode;\n return !!noteElement && !!anchorNode && noteElement.contains(anchorNode);\n }, []);\n\n // When the component loads, applies the note ops to the current editor, gets the note ref and caller\n useEffect(() => {\n let timeout: ReturnType;\n let reassertFrame: ReturnType | undefined;\n let reassertTimeout: ReturnType | undefined;\n hasInitializedEditor.current = false;\n lastFocusOutSelectionRef.current = undefined;\n setIsAtInitialState(true);\n const noteOp = noteOps?.at(0);\n if (noteOp && isInsertEmbedOpOfType('note', noteOp)) {\n const rawCaller = noteOp.insert.note?.caller;\n // Parses the current caller\n let parsedCallerType: FootnoteCallerType = 'custom';\n if (rawCaller === GENERATOR_NOTE_CALLER) {\n parsedCallerType = 'generated';\n } else if (rawCaller === HIDDEN_NOTE_CALLER) {\n parsedCallerType = 'hidden';\n } else if (rawCaller) {\n setCustomCaller(rawCaller);\n setOriginalCustomCaller(rawCaller);\n }\n setCallerType(parsedCallerType);\n setOriginalCallerType(parsedCallerType);\n // Assigns note type\n setNoteType(noteOp.insert.note?.style ?? 'f');\n timeout = setTimeout(() => {\n // Inserts the note node to be edited as a delta operation, at OT index 0: the wrapper\n // paragraph renders NO marker prefix in any marker mode (`showParaMarkerPrefixes: false`\n // in the options above), so there are no prefix bytes to retain past — index 0 IS the\n // start of the paragraph's content.\n editorRef.current?.applyUpdate([noteOp]);\n // Land the caret at the end of the last footnote-text char span (`\\ft`/`\\xt`) to match\n // PT9 behavior of being ready to type immediately. `0` is this popover's own note index —\n // it always holds exactly one note (see the other `getNoteOps(0)` call sites below).\n // Applies to REOPENED notes too: each popover instance mounts fresh, so there is never a\n // prior caret to preserve — only Radix's open-autofocus parking the DOM caret at the\n // wrapper-para start (outside the note body), where Enter plain-split and the `\\`\n // palette both resolved against the WRONG context.\n editorRef.current?.selectNote(0);\n editorRef.current?.focus();\n // Radix's open-autofocus (load-bearing for the focus handoff into this popover —\n // preventing it was falsified live) can land AFTER this and park the DOM caret at the\n // wrapper-para start, where Enter plain-splits instead of inserting \\fp.\n // Re-assert the note selection once the autofocus has settled (a frame plus a\n // macrotask later); skipped when the caret is already inside the note so a user's own\n // click is never overridden.\n reassertFrame = requestAnimationFrame(() => {\n reassertTimeout = setTimeout(() => {\n if (isDomCaretInsideNote()) return;\n editorRef.current?.selectNote(0);\n editorRef.current?.focus();\n }, 0);\n });\n }, 0);\n }\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n }\n if (reassertFrame !== undefined) cancelAnimationFrame(reassertFrame);\n if (reassertTimeout !== undefined) clearTimeout(reassertTimeout);\n };\n }, [noteOps, noteKey, isDomCaretInsideNote]);\n\n /**\n * Gets the current note op from the editor, applies the given caller, calls onChange, and\n * optionally applies the change to the parent editor via replaceEmbedUpdate.\n */\n const saveCurrentNoteOp = useCallback(\n (applyToParent = false) => {\n // Every user-driven save funnels through here — the auto-save content path\n // (handleUsjChange) and, through it, the caller and note-type changes — and the initial\n // content load never does (handleUsjChange's hasInitializedEditor guard skips its first\n // call), so this is the one place that reports user edits to the host.\n //\n // Saves what the EDITOR holds, and rewrites nothing on the way out. The caller must NOT be\n // re-derived from this component's `callerType`/`customCaller` state here — that would make\n // every save a chance to write a stale value: the state is set in the same React batch as\n // the change, so a save triggered from inside that batch still reads the pre-change value.\n // Applying a caller change to the editor (below) and reading it back is what removes that\n // class of bug rather than sequencing around it.\n onNoteEdit?.();\n const currentNoteOp = editorRef.current?.getNoteOps(0)?.at(0);\n if (currentNoteOp && isInsertEmbedOpOfType('note', currentNoteOp)) {\n onChange?.([currentNoteOp]);\n if (applyToParent && parentEditorRef && noteKey) {\n parentEditorRef.current?.replaceEmbedUpdate(noteKey, [currentNoteOp]);\n }\n }\n },\n [noteKey, onChange, onNoteEdit, parentEditorRef],\n );\n\n /**\n * Writes a new caller into the note the popover is editing, exactly as\n * {@link handleNoteTypeChange} writes a new style: mutate the embed and replace it in the editor.\n * The editor is what the caller is DISPLAYED from in editable marker mode (`+` is text the user\n * can see), so this is what makes the dropdown's effect visible — and the resulting editor change\n * drives the save through `handleUsjChange`, so there is exactly one save per change and it reads\n * the caller back out of the editor rather than from React state.\n */\n const applyCallerToEditor = useCallback(\n (resolvedCallerType: FootnoteCallerType, resolvedCustomCaller: string) => {\n const currentNoteOp = editorRef.current?.getNoteOps(0)?.at(0);\n if (!currentNoteOp || !isInsertEmbedOpOfType('note', currentNoteOp)) return;\n if (!currentNoteOp.insert.note) return;\n let caller: string;\n if (resolvedCallerType === 'custom') {\n caller = resolvedCustomCaller;\n } else if (resolvedCallerType === 'generated') {\n caller = GENERATOR_NOTE_CALLER;\n } else {\n caller = HIDDEN_NOTE_CALLER;\n }\n if (currentNoteOp.insert.note.caller === caller) return;\n currentNoteOp.insert.note.caller = caller;\n // Insert the rewritten embed, then delete the one unit it replaces.\n editorRef.current?.applyUpdate([currentNoteOp, { delete: 1 }]);\n },\n [],\n );\n\n const closeAndSave = useCallback(() => {\n // Abandonment window: settle pending mid-edit marker text before the final read\n // of the note ops, so a marker rename walked away from mid-edit saves as what's on screen\n // rather than the stale pre-rename marker. Clicking Save blurs this popover's editor, so\n // the settle covers everything; skipped while this popover's own marker-palette session is\n // open (the palette's apply must be the one to consume the typed literal). Deliberately\n // NOT in saveCurrentNoteOp: the auto-save path runs inside a Lexical update listener,\n // where dispatching another (discrete) update mid-commit is unsafe.\n if (!paletteSession.current) editorRef.current?.commitPendingMarkerEdits();\n saveCurrentNoteOp(true);\n onClose();\n }, [onClose, saveCurrentNoteOp]);\n\n // Keep a stable ref to closeAndSave so the chapter-change effect below only needs to depend on\n // scrRef.book and scrRef.chapterNum (not on caller state that changes during editing).\n const closeAndSaveRef = useRef(closeAndSave);\n useLayoutEffect(() => {\n closeAndSaveRef.current = closeAndSave;\n });\n\n // Close when the book or chapter changes — verse changes don't require closing.\n // useLayoutEffect runs before useEffect, so the save via replaceEmbedUpdate (which is a\n // synchronous discrete Lexical update) completes before the parent editor's useEffect loads\n // the new chapter's content.\n const prevScrRefBookChapter = useRef({ book: scrRef.book, chapterNum: scrRef.chapterNum });\n useLayoutEffect(() => {\n if (\n prevScrRefBookChapter.current.book !== scrRef.book ||\n prevScrRefBookChapter.current.chapterNum !== scrRef.chapterNum\n ) {\n prevScrRefBookChapter.current = { book: scrRef.book, chapterNum: scrRef.chapterNum };\n closeAndSaveRef.current();\n }\n }, [scrRef.book, scrRef.chapterNum]);\n\n const handleCopy = () => {\n const editorInput = editorParentRef.current?.getElementsByClassName('editor-input')[0];\n if (editorInput?.textContent) {\n navigator.clipboard.writeText(editorInput.textContent);\n }\n };\n\n const handleCallerChange = useCallback(\n (newCallerType: FootnoteCallerType, newCustomCaller: string) => {\n // Stamped on the INTERACTION, not on the resulting save: this refreshes the host's\n // note-session staleness clock, and a user who opens the dropdown and re-picks what was\n // already selected has still just told us they are alive. The save that follows a real\n // change stamps it again, which is a no-op.\n onNoteEdit?.();\n setCallerType(newCallerType);\n setCustomCaller(newCustomCaller);\n // Applied from the REPORTED values, never from the state set just above: those setters are\n // asynchronous, so a read of `callerType`/`customCaller` here still holds what the user\n // replaced. One call carrying both halves is also what keeps a single choice to a single\n // save — the note is replaced in the editor on the way through.\n applyCallerToEditor(newCallerType, newCustomCaller);\n },\n [applyCallerToEditor, onNoteEdit],\n );\n\n const handleNoteTypeChange = (value: string) => {\n setNoteType(value);\n\n // Changes the note type for the current note that is being edited\n const currentNoteOp = editorRef.current?.getNoteOps(0)?.at(0);\n if (currentNoteOp && isInsertEmbedOpOfType('note', currentNoteOp)) {\n if (currentNoteOp.insert.note) currentNoteOp.insert.note.style = value;\n\n // If switching between cross-reference and footnote/endnote, need to switch the nodes inside\n const innerNoteOps = currentNoteOp.insert.note?.contents?.ops;\n if (noteType !== 'x' && value === 'x') {\n innerNoteOps?.forEach((op) => footnoteToCrossReferenceOp(op));\n } else if (noteType === 'x' && value !== 'x') {\n innerNoteOps?.forEach((op) => crossReferenceToFootnoteOp(op));\n }\n\n // Inserts the new footnote/cross-reference and deletes the old one — triggers handleUsjChange\n editorRef.current?.applyUpdate([currentNoteOp, { delete: 1 }]);\n }\n };\n\n const handleStateChange = (state: StateChangeSnapshot) => {\n setContextMarker(state.contextMarker);\n setCanRedo(state.canRedo);\n };\n\n const handleUsjChange = useCallback(\n (usj: Usj) => {\n const noteOp = editorRef.current?.getNoteOps(0)?.at(0);\n if (noteOp && isInsertEmbedOpOfType('note', noteOp)) {\n // Prevents adding additional note nodes or other nodes after the main footnote node\n if (usj.content.length > 1) {\n setTimeout(() => {\n // Retains the first two nodes which are the added paragraph node (for now) and the\n // footnote/cross-reference and deletes the unwanted node that was just inserted\n editorRef.current?.applyUpdate([{ retain: 2 }, { delete: 1 }]);\n }, 0);\n }\n const currentNoteType = noteOp.insert.note?.style;\n const innerNoteOps = noteOp.insert.note?.contents?.ops;\n if (!currentNoteType) setIsTypeSwitchable(false);\n\n if (currentNoteType === 'x') {\n setIsTypeSwitchable(\n !!innerNoteOps?.every((op) => {\n if (!op.attributes?.char) return true;\n // The built-in type for the delta note ops does not contain the types for the attributes\n // so have to cast it here\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const nodeType = (op.attributes?.char as Record).style;\n return nodeType === 'xt' || nodeType === 'xo' || nodeType === 'xq';\n }),\n );\n } else {\n setIsTypeSwitchable(\n !!innerNoteOps?.every((op) => {\n if (!op.attributes?.char) return true;\n // The built-in type for the delta note ops does not contain the types for the attributes\n // so have to cast it here\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const nodeType = (op.attributes?.char as Record).style;\n return nodeType === 'ft' || nodeType === 'fr' || nodeType === 'fq';\n }),\n );\n }\n\n // On the first call after loading a note, snapshot the initial state and skip auto-save\n if (!hasInitializedEditor.current) {\n hasInitializedEditor.current = true;\n initialNoteOpsJson.current = JSON.stringify(noteOp);\n setIsAtInitialState(true);\n return;\n }\n\n // Track whether the user has undone all their edits back to the initial state\n setIsAtInitialState(JSON.stringify(noteOp) === initialNoteOpsJson.current);\n\n // Auto-save on every content change (does not apply to parent editor)\n saveCurrentNoteOp();\n } else {\n setIsTypeSwitchable(false);\n setIsAtInitialState(true);\n }\n },\n [saveCurrentNoteOp],\n );\n\n const showInlineMarkersMenu = useCallback(() => {\n // Only shows the markers menu if there is currently a selection in the editor and there are\n // existing marker menu items to be shown\n const currentSelection = window.getSelection();\n if (\n outerBorderRef.current &&\n inlineMarkerMenuItems.length &&\n currentSelection &&\n currentSelection.rangeCount > 0\n ) {\n const selectionRect = currentSelection.getRangeAt(0).getBoundingClientRect();\n const footnoteEditorRect = outerBorderRef.current.getBoundingClientRect();\n setMarkersMenuAnchorX(selectionRect.left - footnoteEditorRect.left);\n setMarkersMenuAnchorY(selectionRect.top - footnoteEditorRect.top);\n setMarkersMenuAnchorHeight(selectionRect.height);\n setShowMarkersMenu(true);\n }\n }, [inlineMarkerMenuItems, outerBorderRef]);\n\n /**\n * Always-current {@link runPaletteSessionKey} (assigned below, once it exists). The palette\n * captures its forwarded-key callback ONCE, when shown, while the handler it must run is rebuilt\n * whenever the session or its dependencies change — the ref is what keeps a long-lived callback\n * pointing at the current one.\n */\n const runPaletteSessionKeyRef = useRef<(event: MarkerPaletteKeyEvent) => void>(() => {});\n\n /**\n * Opens this popover's `\\`-triggered marker palette via the host-supplied `markerPalette` prop\n * (PT9 parity, scoped to this popover's own editor). The session spine — token, session record,\n * key forwarding, settle handling — is the shared `runMarkerPaletteSession`, the same spine\n * `openMarkerPalette` in `platform-scripture-editor.web-view.tsx` runs on; only this popover's\n * genuine differences are supplied here (driving `markerPalette` instead of `papi.overlays`\n * directly, so platform-bible-react never depends on the overlay service, and this editor's own\n * caret-restore fallback).\n */\n const openMarkerPalette = useCallback(\n (\n ctx: { anchorRect?: { x: number; y: number; width: number; height: number } },\n items: EditorMarkerMenuItem[],\n openOptions: { passive: boolean },\n ) => {\n const { anchorRect } = ctx;\n if (!markerPalette || !anchorRect) return;\n const { passive } = openOptions;\n runMarkerPaletteSession({\n items,\n passive,\n // No `shouldSpaceCommit`, deliberately: the Space note-marker exception exists for\n // Standard-view BODY text, where a materialized `\\f ` literal absorbs the following word\n // as the new footnote's caller. This palette offers note-INTERNAL markers for content\n // already inside a note, so Space keeps its plain typed-literal commit here.\n sessionCounterRef: paletteSessionCounter,\n setSession: (session) => {\n paletteSession.current = session;\n },\n clearSessionIfCurrent: (token) => clearPaletteSessionIfCurrent(paletteSession, token),\n // Through the ref so the palette always runs the CURRENT handler — the callback is\n // captured once, at show time, while the session it drives is replaced on every reopen.\n runSessionKey: (event) => runPaletteSessionKeyRef.current(event),\n show: (keyForwarding) =>\n markerPalette.show(\n items.map(markerMenuItemToPaletteItem),\n anchorRect,\n passive,\n keyForwarding,\n ),\n restoreSelectionIfLost: () => {\n // A nulled selection would send focus() to the document END — here the note's closing\n // marker, where the apply lands the marker as an invalid trailing span while the typed\n // literal strands at the real caret (live-observed: a red `\\fq` after `\\f*`). Restore\n // the focus-out capture (exactly where the user last saw the caret), or land at the\n // end of the note content as a last resort. A still-live selection is left completely\n // alone.\n if (!editorRef.current?.getSelection()) {\n const lastFocusOutSelection = lastFocusOutSelectionRef.current;\n if (lastFocusOutSelection) editorRef.current?.setSelection(lastFocusOutSelection);\n else editorRef.current?.selectNote(0);\n }\n },\n focusEditor: () => editorRef.current?.focus(),\n applyItem: (selected) =>\n editorRef.current?.applyMarkerMenuSelection(selected, {\n trigger: 'backslash',\n // ACTIVE palette: the trigger was claimed and never landed, so there is never a\n // literal prefix for the apply to clean up.\n literalPrefixLanded: false,\n }),\n onShowError: (error) => {\n // ABORTED is routine — the `\\` commit key reopens the palette, which replaces the\n // previous one. Anything else means the palette never opened (a request the host\n // rejected, e.g. more items than its cap allows), and swallowing that leaves a `\\` that\n // silently does nothing with no record of why.\n if (!isPlatformError(error) || error.code !== ABORTED)\n console.warn(\n `FootnoteEditor: the marker palette did not open: ${getErrorMessage(error)}`,\n );\n },\n });\n },\n [markerPalette],\n );\n\n /**\n * Opens the marker palette at the CURRENT caret, exactly as the `\\` trigger does — the reopen\n * path for the `\\` commit key, so the new session gets identical items, ranking, search bar and\n * zero-match rules rather than a second, subtly different open.\n */\n const openMarkerPaletteAtCaret = useCallback((): boolean => {\n const ctx = editorRef.current?.getMarkerMenuContext();\n if (!ctx) return false;\n const items = getMarkerMenuItems(options.styleInfo ?? defaultStyleInfo, ctx);\n if (items.length === 0) return false;\n openMarkerPalette(ctx, items, { passive: !ctx.hasTextSelection });\n return true;\n }, [openMarkerPalette, options.styleInfo]);\n\n /**\n * Routes ONE key through the open session — the single implementation behind both entry points:\n * this popover's capture-phase listener (used while the editor holds focus) and the keys the\n * palette forwards back (used while the palette holds focus). Two entry points, one semantics.\n */\n const runPaletteSessionKey = useCallback(\n (event: MarkerPaletteKeyEvent) => {\n const session = paletteSession.current;\n if (!session || !markerPalette) return;\n const outcome = handleMarkerPaletteSessionKeyDown(event, session, {\n // Overlay ops delegate to the host-supplied driver; the commit ops are EDITOR-side\n // applies this popover owns (it holds the editor ref). The table calls `dismiss()` right\n // after each, resolving the show promise `undefined` — which the openMarkerPalette\n // `.then` treats as a dismissal, so nothing double-applies.\n update: (update) => markerPalette.update(update),\n commit: () => markerPalette.commit(),\n dismiss: () => markerPalette.dismiss(),\n commitTyped: (typed) => editorRef.current?.commitTypedMarker(typed),\n commitTypedAndReopen: (typed) => {\n // The `\\` commit: same materialization as Space with NO terminating space, then a\n // fresh palette for the backslash just pressed. Showing a new palette replaces the\n // current overlay (the old show promise rejects ABORTED, handled below), so there is\n // no explicit dismiss to sequence against the commit.\n editorRef.current?.commitTypedMarker(typed, { trailingSpace: false });\n openMarkerPaletteAtCaret();\n },\n commitTypedCloser: (typed) => editorRef.current?.commitTypedCloser(typed),\n commitItem: (marker) => {\n const selected = session.items.find((item) => item.marker === marker);\n if (!selected) return;\n editorRef.current?.applyMarkerMenuSelection(selected, {\n trigger: 'backslash',\n literalPrefixLanded: false,\n });\n },\n });\n // Clear only if this session is still the current one: a `\\` commit opens a REPLACEMENT\n // session synchronously inside the table call, and an unconditional clear would kill it.\n if (outcome === 'ended') clearPaletteSessionIfCurrent(paletteSession, session.token);\n },\n [markerPalette, openMarkerPaletteAtCaret],\n );\n\n useEffect(() => {\n runPaletteSessionKeyRef.current = runPaletteSessionKey;\n }, [runPaletteSessionKey]);\n\n // Capture the last live selection whenever focus leaves this popover's editor. A palette mouse\n // click (an overlay OUTSIDE this document) steals focus BEFORE the commit round-trips, and\n // Lexical's blur-path selection processing can NULL the editor-state selection — after which\n // focus() no longer restores the caret: with no selection it falls back to selecting the\n // document END, which here is the note's closing marker. focusout fires synchronously at the\n // moment of the steal, ahead of that nulling, so the selection read here is the caret the user\n // last saw; the palette commit path in openMarkerPalette restores it when it finds the live\n // selection gone. Only overwrite when readable: if the selection is already gone at focusout,\n // the previous capture is the best remaining approximation.\n useEffect(() => {\n const handleFocusOut = (event: FocusEvent) => {\n const editorInput = editorParentRef.current?.querySelector('.editor-input');\n if (!editorInput || event.target !== editorInput) return;\n const selection = editorRef.current?.getSelection();\n if (selection) lastFocusOutSelectionRef.current = selection;\n };\n document.addEventListener('focusout', handleFocusOut);\n return () => document.removeEventListener('focusout', handleFocusOut);\n }, []);\n\n // Need to add a window listener for click events that will close the markers menu when you click\n // outside. There is another `onClick` listener for the marker menu that prevents click events\n // from being passed to this listener if the marker menu is being clicked. Those click events are\n // handled separately.\n useEffect(() => {\n const clickListener = () => {\n if (showMarkersMenu) setShowMarkersMenu(false);\n };\n\n window.addEventListener('click', clickListener);\n\n return () => {\n window.removeEventListener('click', clickListener);\n };\n }, [showMarkersMenu]);\n\n // When the inline markers menu is showed, makes sure the search input is focused\n useEffect(() => {\n if (showMarkersMenu) {\n markerMenuSearchRef.current?.focus();\n }\n }, [showMarkersMenu]);\n\n // Listens for the marker menu trigger to open the markers menu (non-editable modes) or to drive\n // the standard-view `\\` marker palette (editable mode with a host-supplied `markerPalette`).\n useEffect(() => {\n // Resolved PER-EVENT, never captured at effect setup: the popover's inner editor can remount\n // while this effect stays live, and a captured element goes stale across that remount — the\n // Enter guard, the `\\` trigger, in-session key routing and the paste guard all gated on\n // `document.activeElement !== editorInput` against a DETACHED node and went dead. Same\n // treatment as the web view's own capture-phase listener.\n const getEditorInput = () =>\n editorParentRef.current?.querySelector('.editor-input') ?? undefined;\n\n if (options.view?.markerMode === 'editable') {\n // In editable marker mode (e.g. Standard view) a typed backslash IS content — the editor's\n // marker-editing engine resolves typed markers itself. Without a host-supplied\n // `markerPalette` there is no palette to wire up: every keystroke lands as a literal\n // character (pass-through-only degradation for non-P10 consumers). The Enter guard below\n // still applies either way.\n\n // CAPTURE phase (semantics ported from the web view): session-ending keys must be claimed\n // BEFORE Lexical's own root-element keydown\n // listener runs, otherwise an in-session Enter lets MarkerEditPlugin's KEY_ENTER insert\n // `\\fp`/split FIRST and the palette commit then applies on top (double mutation with an\n // uncleaned `\\fr`-style literal). The shared forwarding table also claims every key during\n // a selection-wrap session so typing cannot replace the wrapped selection.\n const handleKeyDown = (event: KeyboardEvent) => {\n // Never intercept IME composition keys: an Enter (or `\\`) that confirms or feeds a\n // CJK/complex-script candidate must reach the editor's own composition-guarded handlers,\n // not open a palette or trip the outside-the-note Enter guard mid-composition. This\n // capture-phase listener runs ahead of the editor's `isComposing()` guard, so it needs\n // its own. (The shared forwarding table repeats the check for its in-session keys, so\n // this outer guard covers only this handler's own trigger paths.)\n if (isImeCompositionKeyEvent(event)) return;\n const editorInput = getEditorInput();\n if (!editorInput || document.activeElement !== editorInput) return;\n const session = paletteSession.current;\n\n if (session && markerPalette) {\n // Through the ref so this listener and the palette's forwarded keys provably run the\n // same handler (and so this effect needs no dependency on it).\n runPaletteSessionKeyRef.current(event);\n return;\n }\n\n // Enter with the DOM caret OUTSIDE the note content (Radix's\n // open-autofocus can park it at the wrapper-para start; Lexical's keydown path follows\n // the DOM) plain-splits the wrapper instead of inserting `\\fp`. Enter has no legitimate\n // job outside the note in this popover — the wrapper para exists only to host the note —\n // so claim the key and route the caret into the note; the next Enter lands on the\n // library's `\\fp` path ($handleEnterInNote). Enter with the caret inside the note is\n // deliberately left alone.\n if (event.key === 'Enter' && !isDomCaretInsideNote()) {\n event.preventDefault();\n event.stopPropagation();\n editorRef.current?.selectNote(0);\n editorRef.current?.focus();\n return;\n }\n\n if (!markerPalette) return;\n if (event.key !== defaultMarkerMenuTrigger) return;\n // Same caret discipline as Enter above (defense in depth behind the open-placement): a\n // `\\` typed while the caret sits OUTSIDE the note body would open the palette against the\n // wrapper-para context (offering paragraph markers instead of \\ft/\\fq) and land the\n // literal outside the note. Route the caret into the note first; the user re-types `\\`.\n if (!isDomCaretInsideNote()) {\n event.preventDefault();\n event.stopPropagation();\n editorRef.current?.selectNote(0);\n editorRef.current?.focus();\n return;\n }\n // ACTIVE palette: the trigger never lands, whatever the selection shape — typing filters\n // the palette, not the document. In capture, the claim keeps Lexical from ever seeing\n // the `\\`. (`passive` still selects the overlay's non-focus-stealing display for the\n // collapsed caret.)\n // Claimed only when a palette actually opens: with nothing to offer, the `\\` is an\n // ordinary character and must still reach the document.\n if (openMarkerPaletteAtCaret()) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n // Paste with the DOM caret OUTSIDE the note content is the same stray-caret class as the\n // Enter/`\\` guards above: the editor's paste handling resolves against the caret, so a\n // paste into the wrapper-para dead space plain-splits the wrapper paragraph instead of\n // landing in the note. The pointerup/selectionchange snap below normalizes most stray\n // carets, but both run from async events and can lose the race to the paste itself. Snap\n // the caret into the note FIRST and let the paste proceed: document-level capture runs\n // before Lexical's root-element paste listener, and the snap's selection update is\n // committed on the microtask checkpoint between the two listeners, so the paste lands at\n // the restored in-note caret. A paste with the caret already inside the note is left\n // completely alone.\n const handlePaste = () => {\n const editorInput = getEditorInput();\n if (!editorInput || document.activeElement !== editorInput) return;\n if (isDomCaretInsideNote()) return;\n editorRef.current?.selectNote(0);\n editorRef.current?.focus();\n };\n\n document.addEventListener('keydown', handleKeyDown, { capture: true });\n document.addEventListener('paste', handlePaste, { capture: true });\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, { capture: true });\n document.removeEventListener('paste', handlePaste, { capture: true });\n };\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const editorInput = getEditorInput();\n // Shows the marker menu if it isn't already being shown and if the editor is currently selected\n if (\n !showMarkersMenu &&\n editorInput &&\n document.activeElement === editorInput &&\n event.key === defaultMarkerMenuTrigger\n ) {\n event.preventDefault();\n showInlineMarkersMenu();\n } else if (showMarkersMenu && event.key === 'Escape') {\n event.preventDefault();\n setShowMarkersMenu(false);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [\n showMarkersMenu,\n showInlineMarkersMenu,\n defaultMarkerMenuTrigger,\n options.view?.markerMode,\n options.styleInfo,\n markerPalette,\n openMarkerPaletteAtCaret,\n isDomCaretInsideNote,\n ]);\n\n // Snaps the DOM caret back into the note whenever a selection lands in the popover's wrapper-para\n // \"dead space\" (the wrapper paragraph's own text/margins, outside `span.note`). The open-time\n // placement/re-assert effect above and the Enter/`\\` keydown guards in the effect above only\n // intercept SPECIFIC keys; a click into the dead space followed by ORDINARY letters needs no\n // keydown interception at all — those letters just land wherever the DOM caret already is, on the\n // wrapper paragraph outside the note. `pointerup` catches mouse-driven dead-space clicks;\n // `selectionchange` catches every other way the selection can move there (keyboard navigation,\n // drag-select, etc.) — mirroring the `document`-level scoping of the keydown listeners above.\n // Guarded against loops by only acting when the caret is actually OUTSIDE the note: a caret\n // already inside it (the overwhelmingly common case, since users normally click their own note\n // text) is left completely alone, so calling `selectNote(0)` here can never re-trigger itself.\n useEffect(() => {\n const snapStrayCaretIntoNote = () => {\n // Resolved per-event for the same remount-staleness reason as the keydown/paste guards\n // above: a captured `.editor-input` detaches when the inner editor remounts and the snap\n // silently dies with it.\n const editorInput =\n editorParentRef.current?.querySelector('.editor-input') ?? undefined;\n if (!editorInput || document.activeElement !== editorInput) return;\n // Only a COLLAPSED caret is snapped. A drag-select that merely STARTS in the wrapper\n // dead space is a selection the user is still building (its live end may be inside the\n // note), and collapsing it via selectNote(0) destroyed the drag mid-gesture — in every\n // marker mode, for the popover's whole lifetime.\n const domSelection = document.getSelection();\n if (domSelection && !domSelection.isCollapsed) return;\n if (isDomCaretInsideNote()) return;\n editorRef.current?.selectNote(0);\n editorRef.current?.focus();\n };\n\n document.addEventListener('pointerup', snapStrayCaretIntoNote);\n document.addEventListener('selectionchange', snapStrayCaretIntoNote);\n\n return () => {\n document.removeEventListener('pointerup', snapStrayCaretIntoNote);\n document.removeEventListener('selectionchange', snapStrayCaretIntoNote);\n };\n }, [isDomCaretInsideNote]);\n\n const copyButtonTooltip = localizedStrings['%footnoteEditor_copyButton_tooltip%'];\n\n return (\n <>\n
\n
\n
\n \n \n
\n
\n \n editorRef.current?.undo()}\n onRedoClick={() => editorRef.current?.redo()}\n canUndo={!isAtInitialState}\n canRedo={canRedo}\n localizedStrings={localizedStrings}\n />\n \n \n
\n
\n \n
\n \n {}}\n scrRef={scrRef}\n ref={editorRef}\n />\n \n
\n
\n \n \n \n \n \n \n \n \n

{copyButtonTooltip}

\n
\n
\n
\n
\n
\n \n \n {/** Inline markers menu components */}\n \n \n {\n event.preventDefault();\n event.stopPropagation();\n }}\n >\n \n \n \n \n );\n}\n","import { usfmMarkers } from 'platform-bible-utils';\nimport { CANCEL_ACCEPT_BUTTONS_STRING_KEYS } from '@/components/basics/cancel-accept-buttons.component';\nimport { UNDO_REDO_BUTTONS_STRING_KEYS } from '@/components/basics/undo-redo-buttons.component';\nimport { MARKER_MENU_STRING_KEYS } from '../marker-menu.component';\n\n/**\n * Object containing all keys used for localization in the FootnoteEditor component. If you're using\n * this component in an extension, you can pass it into the useLocalizedStrings hook to easily\n * obtain the localized strings and pass them into the localizedStrings prop of this component\n */\nexport const FOOTNOTE_EDITOR_STRING_KEYS = Object.freeze([\n ...MARKER_MENU_STRING_KEYS,\n ...Object.entries(usfmMarkers)\n .map(([, markerDetails]) => markerDetails.description)\n .filter((item) => !!item),\n '%footnoteEditor_callerDropdown_item_custom%',\n '%footnoteEditor_callerDropdown_item_generated%',\n '%footnoteEditor_callerDropdown_item_hidden%',\n '%footnoteEditor_callerDropdown_label%',\n '%footnoteEditor_callerDropdown_tooltip%',\n '%footnoteEditor_copyButton_tooltip%',\n '%footnoteEditor_noteType_crossReference_label%',\n '%footnoteEditor_noteType_endNote_label%',\n '%footnoteEditor_noteType_footnote_label%',\n '%footnoteEditor_noteType_tooltip%',\n '%footnoteEditor_noteTypeDropdown_label%',\n '%footnoteEditor_saveButton_tooltip%',\n ...UNDO_REDO_BUTTONS_STRING_KEYS,\n ...CANCEL_ACCEPT_BUTTONS_STRING_KEYS,\n] as const);\n\nexport type FootnoteEditorLocalizedStrings = {\n [localizedKey in (typeof FOOTNOTE_EDITOR_STRING_KEYS)[number]]: string;\n};\n\nexport type FootnoteCallerType = 'generated' | 'hidden' | 'custom';\n","import React from 'react';\nimport { MarkerContent, MarkerObject } from '@eten-tech-foundation/scripture-utilities';\nimport { AlertCircle } from 'lucide-react';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { FootnoteItemProps } from './footnotes.types';\n\n// Keys below are POSITIONAL (the child's index within its own siblings), not derived from the\n// content. A footnote's parts are frequently indistinguishable by content — two `\\fp` paragraphs,\n// or two spans sharing a marker and leading text — so a content-derived key collides, and React\n// then duplicates or omits children. Position is unique among siblings by construction, which is\n// the only uniqueness React requires. These lists are a read-only projection re-rendered wholesale\n// from `footnote`, so there is no reordering for a positional key to lose identity across.\n\nfunction renderParagraphs(\n parentMarker: string | undefined,\n content?: MarkerContent[],\n showMarkers = true,\n footnoteClosing: React.ReactNode | undefined = undefined,\n): React.ReactNode {\n if (!content || content.length === 0) return undefined;\n\n const markerHierarchy: string[] = [];\n\n const paragraphs: MarkerContent[][] = [];\n let current: MarkerContent[] = [];\n\n content.forEach((part) => {\n if (typeof part !== 'string' && part.marker === 'fp') {\n // End current paragraph before starting new one\n if (current.length > 0) paragraphs.push(current);\n\n // Start new paragraph that *includes* the fp marker itself\n current = [part];\n } else {\n current.push(part);\n }\n });\n\n if (current.length > 0) paragraphs.push(current);\n\n return paragraphs.map((para, i) => {\n const isLast = i === paragraphs.length - 1;\n return (\n // A footnote's paragraphs have no stable id, and keying on their CONTENT is what produced\n // duplicate keys (two `\\fp` paragraphs collide). This list is a read-only projection\n // re-rendered wholesale and never reordered, so the identity the rule protects cannot be\n // lost here. See the note above.\n // eslint-disable-next-line react/no-array-index-key\n

\n {renderContent(parentMarker, para, showMarkers, true, markerHierarchy)}\n {isLast && footnoteClosing}\n

\n );\n });\n}\n\nfunction renderContent(\n parentMarker: string | undefined,\n content?: MarkerContent[],\n showMarkers = true,\n allowUnmarkedText = true,\n markerHierarchy: string[] = [],\n): React.ReactNode {\n if (!content || content.length === 0) return undefined;\n\n return content.map((footnotePart, partIndex) => {\n const key = `part-${partIndex}`;\n if (typeof footnotePart === 'string') {\n if (allowUnmarkedText) {\n const classes = cn(`usfm_${parentMarker}`);\n return (\n \n {footnotePart}\n \n );\n }\n return (\n \n \n {footnotePart}\n \n
\n );\n }\n\n return renderMarkerObject(footnotePart, key, showMarkers, [\n ...markerHierarchy,\n parentMarker ?? 'unknown',\n ]);\n });\n}\n\nfunction renderMarkerObject(\n markerObj: MarkerObject,\n key: React.Key,\n showMarkers: boolean,\n markerHierarchy: string[] = [],\n): React.ReactNode {\n const { marker } = markerObj;\n\n return (\n \n {marker ? (\n showMarkers && {`\\\\${marker} `}\n ) : (\n \n )}\n {renderContent(marker, markerObj.content, showMarkers, true, [\n ...markerHierarchy,\n marker ?? 'unknown',\n ])}\n \n );\n}\n\n/** `FootnoteItem` is a component that provides a read-only display of a single USFM/JSX footnote. */\nexport function FootnoteItem({\n footnote,\n layout = 'horizontal',\n formatCaller,\n showMarkers = true,\n}: FootnoteItemProps) {\n const caller = formatCaller ? formatCaller(footnote.caller) : footnote.caller;\n const isCallerFormatted = caller !== footnote.caller;\n\n // Split out target reference (first top-level fr/xo, if any)\n let targetRef: MarkerContent | undefined;\n let remainingContent = footnote.content;\n\n if (\n Array.isArray(footnote.content) &&\n footnote.content.length > 0 &&\n typeof footnote.content[0] !== 'string' &&\n (footnote.content[0].marker === 'fr' || footnote.content[0].marker === 'xo')\n ) {\n [targetRef, ...remainingContent] = footnote.content;\n }\n\n const footnoteOpening = showMarkers ? (\n {`\\\\${footnote.marker}`}\n ) : undefined;\n\n const footnoteClosing = showMarkers ? (\n {` \\\\${footnote.marker}*`}\n ) : undefined;\n\n const footnoteCaller = caller && (\n // USFM does not specify a marker for caller, so instead of a usfm_* class, we use a\n // specific class name in case styling is needed.\n \n {caller}\n \n );\n // The category is the one part of a footnote that never appears in `content`: it rides in the\n // file as a `\\cat` run directly after the caller (`\\f + \\cat People\\cat*\\fr 1.1 …`), and the USJ\n // parser folds it onto the note as a field — so nothing renders it unless the note's own field\n // is read. Placed after the caller so the pane reads in the file's order. Given its own class\n // rather than a `usfm_*` one for the same reason the caller has one: `\\cat` delimits the value\n // but is not a style for it.\n const footnoteCategory = footnote.category && (\n \n {showMarkers && {`\\\\cat `}}\n {footnote.category}\n {showMarkers && {`\\\\cat*`}}\n \n );\n const footnoteTargetRef = targetRef && (\n <>{renderContent(footnote.marker, [targetRef], showMarkers, false)} \n );\n\n // The spaces separating the header's parts belong BETWEEN them, not inside them: CSS removes a\n // collapsible space at the end of an inline-block's last line, so a trailing space in the caller\n // or category box is in the DOM and yet invisible, running the two together (`+People`). Keeping\n // them out here also draws them at the header's own size rather than the 0.7em the `.marker`\n // glyphs use, which is what makes `\\f + \\cat People\\cat*` read as separated rather than `\\f+`.\n const hasOpening = !!footnoteOpening;\n const hasCaller = !!footnoteCaller;\n const hasCategory = !!footnoteCategory;\n\n const layoutClass = layout === 'horizontal' ? 'horizontal' : 'vertical';\n const markerClass = showMarkers ? 'marker-visible' : '';\n const footnoteBodyClass =\n layout === 'horizontal' ? 'tw:col-span-1' : 'tw:col-span-2 tw:col-start-1 tw:row-start-2';\n const baseClasses = cn(layoutClass, markerClass);\n\n return (\n <>\n
\n {footnoteOpening}\n {hasOpening && (hasCaller || hasCategory) && ' '}\n {footnoteCaller}\n {hasCaller && hasCategory && ' '}\n {footnoteCategory}\n
\n
\n {footnoteTargetRef}\n
\n \n {remainingContent && remainingContent.length > 0 && (\n <>{renderParagraphs(footnote.marker, remainingContent, showMarkers, footnoteClosing)}\n )}\n \n \n );\n}\n\nexport default FootnoteItem;\n","import { MarkerObject } from '@eten-tech-foundation/scripture-utilities';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { Separator } from '@/components/shadcn-ui/separator';\nimport { getFormatCallerFunction } from 'platform-bible-utils';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { FootnoteItem } from './footnote-item.component';\nimport { FootnoteListProps } from './footnotes.types';\n\n/** `FootnoteList` is a component that provides a read-only display of a list of USFM/JSX footnote. */\nexport function FootnoteList({\n className,\n classNameForItems,\n footnotes,\n layout = 'horizontal',\n listId,\n selectedFootnote,\n selectionRequest,\n showMarkers = true,\n suppressFormatting = false,\n formatCaller,\n onFootnoteSelected,\n}: FootnoteListProps) {\n const handleFormatCaller = formatCaller ?? getFormatCallerFunction(footnotes, undefined);\n const handleFootnoteClick = (footnote: MarkerObject, index: number) => {\n onFootnoteSelected?.(footnote, index, listId);\n };\n\n const initialFocusedIndex = selectedFootnote\n ? footnotes.findIndex((f) => f === selectedFootnote)\n : -1;\n\n const [focusedIndex, setFocusedIndex] = useState(initialFocusedIndex);\n\n const handleFootnoteKeyDown = (\n e: React.KeyboardEvent,\n footnote: MarkerObject,\n index: number,\n ) => {\n if (!footnotes.length) return;\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n onFootnoteSelected?.(footnote, index, listId);\n break;\n\n default:\n break;\n }\n };\n\n const handleListKeyDown = (e: React.KeyboardEvent) => {\n if (!footnotes.length) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setFocusedIndex((prev) => Math.min(prev + 1, footnotes.length - 1));\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n setFocusedIndex((prev) => Math.max(prev - 1, 0));\n break;\n\n default:\n break;\n }\n };\n\n const rowRefs = useRef<(HTMLLIElement | null)[]>([]);\n\n useEffect(() => {\n if (focusedIndex >= 0 && focusedIndex < rowRefs.current.length) {\n rowRefs.current[focusedIndex]?.focus();\n }\n }, [focusedIndex]);\n\n const selectedIndex = selectedFootnote\n ? footnotes.findIndex((footnote) => footnote === selectedFootnote)\n : -1;\n\n // Bring the selected row into view when the selection changes. The host drives selection from\n // OUTSIDE this list — clicking a note caller in the editor (PT9 navigate-to-note) — so the\n // selected row is frequently outside the scrollport, where it would highlight invisibly.\n // `block: 'nearest'` scrolls only far enough to reveal it, leaving an already-visible row put.\n //\n // Deliberately does NOT call `focus()` (unlike the arrow-key path above): the gesture that drives\n // this happens in the EDITOR, and pulling keyboard focus into the pane would interrupt editing.\n //\n // `selectionRequest` is a dependency-only identity key: a REPEAT selection of the same footnote\n // derives the same index, so keying on the index alone would never re-reveal a row the user has\n // since scrolled away from (see `FootnoteListProps.selectionRequest`).\n useEffect(() => {\n if (selectedIndex < 0 || selectedIndex >= rowRefs.current.length) return;\n rowRefs.current[selectedIndex]?.scrollIntoView({ block: 'nearest' });\n }, [selectedIndex, selectionRequest]);\n\n /*\n * TODO(PT-3743): After upgrading to Tailwind v4, move to using @container and @sm/@lg css\n * styling to replace the use of the `layout` variable to distinguish between\n * wide/skinny layouts.\n */\n return (\n \n \n {footnotes.map((footnote, idx) => {\n const isSelected = footnote === selectedFootnote;\n const key = `${listId}-${idx}`;\n return (\n // The key belongs on the outermost node returned from the map — the Fragment — not on\n // the `
  • ` nested inside it, which leaves the Fragment itself unkeyed.\n \n {\n rowRefs.current[idx] = el;\n }}\n role=\"option\"\n aria-selected={isSelected}\n data-marker={footnote.marker}\n data-state={isSelected ? 'selected' : undefined}\n tabIndex={idx === focusedIndex ? 0 : -1}\n className={cn(\n 'tw:gap-x-3 tw:gap-y-1 tw:p-2 tw:data-[state=selected]:bg-muted',\n onFootnoteSelected && 'tw:hover:bg-muted/50',\n 'tw:w-full tw:rounded-sm tw:border-0 tw:bg-transparent tw:shadow-none',\n 'tw:focus:outline-hidden tw:focus-visible:outline-hidden',\n /* ENHANCE: After considerable fiddling, this set of styles makes a focus ring\n that looks great in Storybook. However, the left edge of the ring is clipped in\n P.B app. These are similar, but not identical to, the customizations made in\n our shadcn table component.\n */\n 'tw:focus-visible:ring-offset-0.5 tw:focus-visible:relative tw:focus-visible:z-10 tw:focus-visible:ring-2 tw:focus-visible:ring-ring',\n 'tw:grid tw:grid-flow-col tw:grid-cols-subgrid',\n layout === 'horizontal' ? 'tw:col-span-3' : 'tw:col-span-2 tw:row-span-2',\n classNameForItems,\n )}\n onClick={() => handleFootnoteClick(footnote, idx)}\n onKeyDown={(e) => handleFootnoteKeyDown(e, footnote, idx)}\n >\n handleFormatCaller(footnote.caller, idx)}\n showMarkers={showMarkers}\n />\n
  • \n {/* Only render separator if not the last item */}\n {idx < footnotes.length - 1 && layout === 'vertical' && (\n \n )}\n \n );\n })}\n \n \n );\n}\n\nexport default FootnoteList;\n","import {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/shadcn-ui/table';\nimport { SerializedVerseRef } from '@sillsdev/scripture';\nimport { formatScrRef, LanguageStrings } from 'platform-bible-utils';\nimport { ReactNode, useMemo } from 'react';\nimport { InventoryItemOccurrence } from './inventory-utils';\n\n/**\n * Convert text with `\\\\word\\\\` markers to React elements with bold formatting.\n *\n * @param text Text containing `\\\\word\\\\` markers for bolding\n * @returns Array of React nodes with text and bold elements\n */\nfunction formatTextWithBold(text: string): ReactNode[] {\n const parts: ReactNode[] = [];\n let lastIndex = 0;\n // Look for text wrapped in double backslashes (e.g., \\\\bolded text\\\\)\n const regex = /\\\\\\\\(.+?)\\\\\\\\/g;\n let match;\n\n // regex.exec() returns null when no match is found\n // eslint-disable-next-line no-null/no-null, no-cond-assign\n while ((match = regex.exec(text)) !== null) {\n // Add text before the match\n if (match.index > lastIndex) {\n parts.push(text.substring(lastIndex, match.index));\n }\n // Add the bold text\n parts.push({match[1]});\n lastIndex = regex.lastIndex;\n }\n\n // Add any remaining text after the last match\n if (lastIndex < text.length) {\n parts.push(text.substring(lastIndex));\n }\n\n return parts.length > 0 ? parts : [text];\n}\n\n/** Props for the OccurrencesTable component */\ntype OccurrencesTableProps = {\n /** Data that contains scriptures references and snippets of scripture */\n occurrenceData: InventoryItemOccurrence[];\n /** Callback function that is executed when the scripture reference is changed */\n setScriptureReference: (scriptureReference: SerializedVerseRef) => void;\n /**\n * Object with all localized strings that the OccurrencesTable needs to work well across multiple\n * languages\n */\n localizedStrings: LanguageStrings;\n /** Class name to apply to the occurrence text */\n classNameForText?: string;\n};\n\n/**\n * Table that shows occurrences of specified inventory item(s). The first column shows the related\n * scripture reference. The second column shows the snippet of scripture that contains the specified\n * inventory item\n */\nexport function OccurrencesTable({\n occurrenceData,\n setScriptureReference,\n localizedStrings,\n classNameForText,\n}: OccurrencesTableProps) {\n const referenceHeaderText =\n localizedStrings['%webView_inventory_occurrences_table_header_reference%'];\n const occurrenceHeaderText =\n localizedStrings['%webView_inventory_occurrences_table_header_occurrence%'];\n\n const occurrences: InventoryItemOccurrence[] = useMemo(() => {\n const uniqueOccurrences: InventoryItemOccurrence[] = [];\n const seen = new Set();\n\n occurrenceData.forEach((occurrence) => {\n const key = `${occurrence.reference.book}:${occurrence.reference.chapterNum}:${occurrence.reference.verseNum}:${occurrence.text}`;\n\n if (!seen.has(key)) {\n seen.add(key);\n uniqueOccurrences.push(occurrence);\n }\n });\n\n return uniqueOccurrences;\n }, [occurrenceData]);\n\n return (\n \n \n \n {referenceHeaderText}\n {occurrenceHeaderText}\n \n \n \n {occurrences.length > 0 &&\n occurrences.map((occurrence) => (\n {\n setScriptureReference(occurrence.reference);\n }}\n >\n {formatScrRef(occurrence.reference, 'English')}\n \n {formatTextWithBold(occurrence.text)}\n \n \n ))}\n \n
    \n );\n}\n\nexport default OccurrencesTable;\n","'use client';\n\nimport React from 'react';\nimport { Checkbox as CheckboxPrimitive } from 'radix-ui';\n\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { IconCheck } from '@tabler/icons-react';\n\n/**\n * Checkbox component provides a control that allows the user to toggle between checked and not\n * checked. This component is built on Radix UI primitives and styled with Shadcn UI.\n *\n * @see Shadcn UI Documentation: {@link https://ui.shadcn.com/docs/components/checkbox}\n * @see Radix UI Documentation: {@link https://www.radix-ui.com/primitives/docs/components/checkbox}\n */\n// CUSTOM: Added TSDoc comment with links to upstream shadcn/ui and Radix UI documentation.\nfunction Checkbox({ className, ...props }: React.ComponentProps) {\n return (\n \n svg]:size-3.5\"\n >\n \n \n \n );\n}\n\nexport { Checkbox };\n","import { ColumnDef, SortDirection } from '@/components/advanced/data-table/data-table.component';\nimport { ToggleGroup, ToggleGroupItem } from '@/components/shadcn-ui/toggle-group';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/shadcn-ui/tooltip';\nimport { Column } from '@tanstack/react-table';\nimport {\n ArrowDownIcon,\n ArrowUpIcon,\n CircleCheckIcon,\n CircleHelpIcon,\n CircleXIcon,\n} from 'lucide-react';\nimport { ReactNode } from 'react';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { InventoryTableData, Status } from './inventory-utils';\n\n/**\n * Gets an icon that indicates the current sorting direction based on the provided input\n *\n * @param sortDirection Sorting direction. Can be ascending ('asc'), descending ('desc') or false (\n * i.e. not sorted)\n * @returns The appropriate sorting icon for the provided sorting direction\n */\nconst getSortingIcon = (sortDirection: false | SortDirection): ReactNode => {\n if (sortDirection === 'asc') {\n return ;\n }\n if (sortDirection === 'desc') {\n return ;\n }\n return undefined;\n};\n\n/**\n * Generates a responsive column header for inventory columns with tooltip and sorting functionality\n *\n * @param column The column received from ColumnDef.header\n * @param label The label field to display in the header and tooltip\n * @returns A ReactNode representing the header\n */\nexport const getInventoryHeader = (\n column: Column,\n label: string,\n buttonClassName?: string,\n): ReactNode => {\n return (\n \n \n column.toggleSorting(undefined)}\n >\n \n {label}\n \n {getSortingIcon(column.getIsSorted())}\n \n {label}\n \n \n );\n};\n\n/**\n * Function that creates the item column for inventories\n *\n * @param itemLabel Localized label for the item column (e.g. 'Character', 'Repeated Word', etc.)\n * @returns Column that shows the inventory items. Should be used with the DataTable component\n */\nexport const inventoryItemColumn = (itemLabel: string): ColumnDef => {\n return {\n accessorKey: 'item',\n accessorFn: (row: InventoryTableData) => row.items[0],\n header: ({ column }) => getInventoryHeader(column, itemLabel),\n };\n};\n\n/**\n * Function that creates the additional item columns for inventories\n *\n * @param additionalItemLabel Localized label for the additional item column (e.g. 'Preceding\n * Marker')\n * @param additionalItemIndex Index that locates the desired item in the items array of the\n * inventory\n * @returns Column that shows additional inventory items. Should be used with the DataTable\n * component\n */\nexport const inventoryAdditionalItemColumn = (\n additionalItemLabel: string,\n additionalItemIndex: number,\n): ColumnDef => {\n return {\n accessorKey: `item${additionalItemIndex}`,\n accessorFn: (row: InventoryTableData) => row.items[additionalItemIndex],\n header: ({ column }) => getInventoryHeader(column, additionalItemLabel),\n };\n};\n\n/**\n * Function that creates the count column for inventories. Should be used with the DataTable\n * component.\n *\n * @param countLabel Localized label for the count column\n * @returns Column that shows the number of occurrences of the related inventory items\n */\nexport const inventoryCountColumn = (countLabel: string): ColumnDef => {\n return {\n accessorKey: 'count',\n header: ({ column }) => getInventoryHeader(column, countLabel, 'tw:justify-end'),\n cell: ({ row }) => (\n
    {row.getValue('count')}
    \n ),\n };\n};\n\n/**\n * Function that updates project settings when status for item(s) changes\n *\n * @param changedItems Array of items for which the status is being updated\n * @param newStatus The status that the items are being given\n * @param approvedItems Array of currently approved items\n * @param onApprovedItemsChange Callback function that stores the updated list of approved items\n * @param unapprovedItems Array of currently unapproved items\n * @param onUnapprovedItemsChange Callback function that stores the updated list of unapproved items\n */\nconst statusChangeHandler = (\n changedItems: string[],\n newStatus: Status,\n approvedItems: string[],\n onApprovedItemsChange: (items: string[]) => void,\n unapprovedItems: string[],\n onUnapprovedItemsChange: (items: string[]) => void,\n) => {\n let newApprovedItems: string[] = [...approvedItems];\n changedItems.forEach((item) => {\n if (newStatus === 'approved') {\n if (!newApprovedItems.includes(item)) {\n newApprovedItems.push(item);\n }\n } else {\n newApprovedItems = newApprovedItems.filter((validItem) => validItem !== item);\n }\n });\n onApprovedItemsChange(newApprovedItems);\n\n let newUnapprovedItems: string[] = [...unapprovedItems];\n changedItems.forEach((item) => {\n if (newStatus === 'unapproved') {\n if (!newUnapprovedItems.includes(item)) {\n newUnapprovedItems.push(item);\n }\n } else {\n newUnapprovedItems = newUnapprovedItems.filter((unapprovedItem) => unapprovedItem !== item);\n }\n });\n onUnapprovedItemsChange(newUnapprovedItems);\n};\n\n/**\n * Function that creates the status column for inventories. Should be used with the DataTable\n * component.\n *\n * @param statusLabel Localized label for the status column\n * @param approvedItems Array of approved items, typically as defined in `Settings.xml`\n * @param onApprovedItemsChange Callback function that stores the updated list of approved items\n * @param unapprovedItems Array of unapproved items, typically as defined in `Settings.xml`\n * @param onUnapprovedItemsChange Callback function that stores the updated list of unapproved items\n * @returns Column that shows the status buttons for the related inventory item. The button for the\n * current status of the item is selected\n */\nexport const inventoryStatusColumn = (\n statusLabel: string,\n approvedItems: string[],\n onApprovedItemsChange: (items: string[]) => void,\n unapprovedItems: string[],\n onUnapprovedItemsChange: (items: string[]) => void,\n): ColumnDef => {\n return {\n accessorKey: 'status',\n header: ({ column }) => getInventoryHeader(column, statusLabel, 'tw:justify-center'),\n cell: ({ row }) => {\n const status: Status = row.getValue('status');\n const item: string = row.getValue('item');\n return (\n // Center the status buttons in the cell to match the centered status column header (the\n // ToggleGroup would otherwise sit left-aligned).\n
    \n \n {\n event.stopPropagation();\n statusChangeHandler(\n [item],\n 'approved',\n approvedItems,\n onApprovedItemsChange,\n unapprovedItems,\n onUnapprovedItemsChange,\n );\n }}\n value=\"approved\"\n className=\"tw:rounded-e-none tw:border-e-0\"\n >\n \n \n {\n event.stopPropagation();\n statusChangeHandler(\n [item],\n 'unapproved',\n approvedItems,\n onApprovedItemsChange,\n unapprovedItems,\n onUnapprovedItemsChange,\n );\n }}\n value=\"unapproved\"\n className=\"tw:rounded-none\"\n >\n \n \n {\n event.stopPropagation();\n statusChangeHandler(\n [item],\n 'unknown',\n approvedItems,\n onApprovedItemsChange,\n unapprovedItems,\n onUnapprovedItemsChange,\n );\n }}\n value=\"unknown\"\n className=\"tw:rounded-s-none tw:border-s-0\"\n >\n \n \n \n
    \n );\n },\n };\n};\n","import { SerializedVerseRef } from '@sillsdev/scripture';\n\n/* #region Types */\n\n/**\n * Status of items that appear in inventories. 'approved' and 'unapproved' items are defined in the\n * project's `Settings.xml`. All other items are defined as 'unknown'\n */\nexport type Status = 'approved' | 'unapproved' | 'unknown';\n\n/** Occurrence of item in inventory. Primarily used by table that shows occurrences */\nexport type InventoryItemOccurrence = {\n /** Reference to scripture where the item appears */\n reference: SerializedVerseRef;\n /** Snippet of scripture that contains the occurrence */\n text: string;\n};\n\n/** Data structure that contains all information on an item that is shown in an inventory */\nexport type InventoryTableData = {\n /**\n * The item (e.g. a character in the characters inventory, a marker in the marker inventory) In\n * most cases the array will only have one element. In case of additional items (e.g. the\n * preceding marker in the markers check), the primary item should be stored in the first index.\n * To show additional items in the inventory, make sure to configure the `additionalItemsLabels`\n * prop for the Inventory component\n */\n items: string[];\n /** The number of times this item occurs in the selected scope */\n count: number;\n /** The status of this item (see documentation for `Status` type for more information) */\n status: Status;\n /** Occurrences of this item in the scripture text for the selected scope */\n occurrences: InventoryItemOccurrence[];\n};\n\n/* #endregion */\n\n/* #region Functions */\n\n/**\n * Splits USFM string into shorter line-like segments\n *\n * @param text A single (likely very large) USFM string\n * @returns An array containing the input text, split into shorter segments\n */\nexport const getLinesFromUSFM = (text: string) => {\n // Splits on (CR)LF, CR, \\v, \\c and \\id\n return text.split(/(?:\\r?\\n|\\r)|(?=(?:\\\\(?:v|c|id)))/g);\n};\n\n/**\n * Extracts chapter or verse number from USFM strings that start with a \\c or \\v marker\n *\n * @param text USFM string that is expected to start with \\c or \\v marker\n * @returns Chapter or verse number if one is found. Else returns 0.\n */\nexport const getNumberFromUSFM = (text: string): number | undefined => {\n // Captures all digits that follow \\v or \\c markers followed by whitespace located at the start of a string\n const regex = /^\\\\[vc]\\s+(\\d+)/;\n const match = text.match(regex);\n\n if (match) {\n return +match[1];\n }\n return undefined;\n};\n\n/**\n * Gets book ID from USFM string that starts with the \\id marker, and returns book number for it\n *\n * @param text USFM string that is expected to start with \\id marker\n * @returns Book number corresponding to the \\id marker in the input text. Returns 0 if no marker is\n * found or the marker is not valid\n */\nexport const getBookIdFromUSFM = (text: string): string => {\n // Captures all digits that follow an \\id marker followed by whitespace located at the start of a string\n const match = text.match(/^\\\\id\\s+([A-Za-z]+)/);\n if (match) {\n return match[1];\n }\n return '';\n};\n\n/**\n * Gets the status for an item, typically used in the Inventory component\n *\n * @param item The item for which the status is being requested\n * @param approvedItems Array of approved items, typically as defined in `Settings.xml`\n * @param unapprovedItems Array of unapproved items, typically as defined in `Settings.xml`\n * @returns The status for the specified item\n */\nexport const getStatusForItem = (\n item: string,\n approvedItems: string[],\n unapprovedItems: string[],\n): Status => {\n if (unapprovedItems.includes(item)) return 'unapproved';\n if (approvedItems.includes(item)) return 'approved';\n return 'unknown';\n};\n\n/* #endregion */\n","import {\n ColumnDef,\n DataTable,\n RowContents,\n RowSelectionState,\n TableContents,\n} from '@/components/advanced/data-table/data-table.component';\nimport { OccurrencesTable } from '@/components/advanced/inventory/occurrences-table.component';\nimport { Checkbox } from '@/components/shadcn-ui/checkbox';\nimport { Input } from '@/components/shadcn-ui/input';\nimport { Label } from '@/components/shadcn-ui/label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/shadcn-ui/select';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/shadcn-ui/tooltip';\nimport { Scope } from '@/components/utils/scripture.util';\nimport { SerializedVerseRef } from '@sillsdev/scripture';\nimport { deepEqual, isString, LocalizedStringValue } from 'platform-bible-utils';\nimport { useEffect, useMemo, useState } from 'react';\nimport { inventoryAdditionalItemColumn } from './inventory-columns';\nimport {\n getStatusForItem,\n InventoryItemOccurrence,\n InventoryTableData,\n Status,\n} from './inventory-utils';\n\n/**\n * Represents an item in the inventory with associated text and verse reference.\n *\n * @deprecated 12 January 2026. Use InventorySummaryItem instead for better performance and\n * functionality.\n */\nexport type InventoryItem = {\n /**\n * The label by which the item is shown in the inventory (e.g. the word that is repeated in case\n * of the Repeated Words check). It serves as a unique identifier for the item. It usually is a\n * string, but can be a string[] when there are multiple defining attributes (e.g. when 'show\n * preceding marker' is enabled for the Markers Inventory, the preceding marker will be stored as\n * the second item in the array)\n */\n inventoryText: string | string[];\n /** The snippet of scripture where this occurrence of the `inventoryItem` is found */\n verse: string;\n /** The reference to the location where the `verse` can be found in scripture */\n verseRef: SerializedVerseRef;\n /**\n * Offset used to locate the `inventoryText` (or inventoryText[0] in case of an array) in the\n * `verse` string\n */\n offset: number;\n};\n\n/**\n * Represents a summary item in the inventory with aggregated count and optional detailed\n * occurrences. This type is used for displaying inventory data in a summarized format, where each\n * item shows the total count and can optionally include detailed occurrence information that gets\n * loaded dynamically when the user selects the item.\n */\nexport type InventorySummaryItem = {\n /** The item key (e.g., character, word, etc.) */\n key: string | string[];\n /** Total count of occurrences */\n count: number;\n /** Status of the item */\n status?: Status;\n /** Detailed occurrences - optional, loaded on demand */\n occurrences?: InventoryItemOccurrence[];\n};\n\n/**\n * Object containing all keys used for localization in this component. If you're using this\n * component in an extension, you can pass it into the useLocalizedStrings hook to easily obtain the\n * localized strings and pass them into the localizedStrings prop of this component\n */\nexport const INVENTORY_STRING_KEYS = Object.freeze([\n '%webView_inventory_all%',\n '%webView_inventory_approved%',\n '%webView_inventory_unapproved%',\n '%webView_inventory_unknown%',\n '%webView_inventory_scope_currentBook%',\n '%webView_inventory_scope_chapter%',\n '%webView_inventory_scope_verse%',\n '%webView_inventory_filter_text%',\n '%webView_inventory_show_additional_items%',\n '%webView_inventory_occurrences_table_header_reference%',\n '%webView_inventory_occurrences_table_header_occurrence%',\n '%webView_inventory_no_results%',\n] as const);\n\nexport type InventoryLocalizedStrings = {\n [localizedInventoryKey in (typeof INVENTORY_STRING_KEYS)[number]]?: LocalizedStringValue;\n};\n\n/** Status values that the status filter can select from */\ntype StatusFilter = Status | 'all';\n\n/** Text labels for the inventory columns and the control components of additional inventory items */\ntype AdditionalItemsLabels = {\n checkboxText?: string;\n tableHeaders?: string[];\n};\n\n/**\n * Filters data that is shown in the DataTable section of the Inventory\n *\n * @param itemData All inventory items and their related information\n * @param statusFilter Allows filtering by status (i.e. show all items, or only items that are\n * 'approved', 'unapproved' or 'unknown')\n * @param textFilter Allows filtering by text. All items that include the filter text will be\n * selected.\n * @returns Array of items and their related information that are matched by the specified filters\n */\nconst filterItemData = (\n itemData: InventoryTableData[],\n statusFilter: StatusFilter,\n textFilter: string,\n): InventoryTableData[] => {\n let filteredItemData: InventoryTableData[] = itemData;\n\n if (statusFilter !== 'all') {\n filteredItemData = filteredItemData.filter(\n (item) =>\n (statusFilter === 'approved' && item.status === 'approved') ||\n (statusFilter === 'unapproved' && item.status === 'unapproved') ||\n (statusFilter === 'unknown' && item.status === 'unknown'),\n );\n }\n\n if (textFilter !== '')\n filteredItemData = filteredItemData.filter((item) => item.items[0].includes(textFilter));\n\n return filteredItemData;\n};\n\n/**\n * Processes InventorySummaryItem array into InventoryTableData for display\n *\n * @param inventoryItems Summary items with counts and optional occurrences\n * @param approvedItems Array of approved items\n * @param unapprovedItems Array of unapproved items\n * @returns Array of table data for display\n */\nconst processSummaryItems = (\n inventoryItems: InventorySummaryItem[],\n approvedItems: string[],\n unapprovedItems: string[],\n): InventoryTableData[] => {\n return inventoryItems.map((item) => {\n const itemKey = isString(item.key) ? item.key : item.key[0];\n const items = isString(item.key) ? [item.key] : item.key;\n\n return {\n items,\n count: item.count,\n status: item.status || getStatusForItem(itemKey, approvedItems, unapprovedItems),\n occurrences: item.occurrences || [],\n };\n });\n};\n\n/**\n * Gets the localized value for the provided key\n *\n * @param strings Object containing localized string\n * @param key Key for a localized string\n * @returns The localized value for the provided key, if available. Returns the key if no localized\n * value is available\n */\nconst localizeString = (\n strings: InventoryLocalizedStrings,\n key: keyof InventoryLocalizedStrings,\n) => {\n return strings[key] ?? key;\n};\n\n/** Props for the Inventory component */\ntype InventoryProps = {\n /** The inventory items that the inventory should be populated with */\n inventoryItems: InventorySummaryItem[] | undefined;\n /** Callback function that is executed when the scripture reference is changed */\n setVerseRef: (scriptureReference: SerializedVerseRef) => void;\n /**\n * Object with all localized strings that the Inventory needs to work well across multiple\n * languages. When using this component with Platform.Bible, you can import\n * `INVENTORY_STRING_KEYS` from this library, pass it in to the Platform's localization hook, and\n * pass the localized keys that are returned by the hook into this prop.\n */\n localizedStrings: InventoryLocalizedStrings;\n /**\n * Text labels for control elements and additional column headers in case your Inventory has more\n * than one item to show (e.g. The 'Preceding Marker' in the Markers Inventory)\n */\n additionalItemsLabels?: AdditionalItemsLabels;\n /** Array of approved items, typically as defined in `Settings.xml` */\n approvedItems: string[];\n /** Array of unapproved items, typically as defined in `Settings.xml` */\n unapprovedItems: string[];\n /** Scope of scripture that the inventory will operate on */\n scope: Scope;\n /** Callback function that is executed when the scope is changed from the Inventory */\n onScopeChange: (scope: Scope) => void;\n /**\n * Column definitions for the Inventory data table. The most commonly used column definitions are\n * pre-configured for your convenience and can be imported (e.g. inventoryItemColumn,\n * inventoryAdditionalItemColumn inventoryCountColumn, and inventoryStatusColumn). If you need any\n * other columns you can add these yourself\n */\n columns: ColumnDef[];\n /** Unique identifier for the Inventory component */\n id?: string;\n /** Whether the inventory items are still loading */\n areInventoryItemsLoading?: boolean;\n /** Class name to apply to the provided occurrence verse text in the `OccurrencesTable` component */\n classNameForVerseText?: string;\n /** Optional callback that is called when an item is selected. Receives the selected item key. */\n onItemSelected?: (itemKey: string) => void;\n};\n\n/** Inventory component that is used to view and control the status of provided project settings */\nexport function Inventory({\n inventoryItems,\n setVerseRef,\n localizedStrings,\n additionalItemsLabels,\n approvedItems,\n unapprovedItems,\n scope,\n onScopeChange,\n columns,\n id,\n areInventoryItemsLoading = false,\n classNameForVerseText,\n onItemSelected,\n}: InventoryProps) {\n const allItemsText = localizeString(localizedStrings, '%webView_inventory_all%');\n const approvedItemsText = localizeString(localizedStrings, '%webView_inventory_approved%');\n const unapprovedItemsText = localizeString(localizedStrings, '%webView_inventory_unapproved%');\n const unknownItemsText = localizeString(localizedStrings, '%webView_inventory_unknown%');\n const scopeBookText = localizeString(localizedStrings, '%webView_inventory_scope_currentBook%');\n const scopeChapterText = localizeString(localizedStrings, '%webView_inventory_scope_chapter%');\n const scopeVerseText = localizeString(localizedStrings, '%webView_inventory_scope_verse%');\n const filterText = localizeString(localizedStrings, '%webView_inventory_filter_text%');\n const showAdditionalItemsText = localizeString(\n localizedStrings,\n '%webView_inventory_show_additional_items%',\n );\n const noResultsText = localizeString(localizedStrings, '%webView_inventory_no_results%');\n\n const [showAdditionalItems, setShowAdditionalItems] = useState(false);\n const [statusFilter, setStatusFilter] = useState('all');\n const [textFilter, setTextFilter] = useState('');\n const [selectedItem, setSelectedItem] = useState([]);\n\n const tableData: InventoryTableData[] = useMemo(() => {\n const safeInventoryItems = inventoryItems ?? [];\n if (safeInventoryItems.length === 0) return [];\n return processSummaryItems(safeInventoryItems, approvedItems, unapprovedItems);\n }, [inventoryItems, approvedItems, unapprovedItems]);\n\n const reducedTableData: InventoryTableData[] = useMemo(() => {\n if (showAdditionalItems) return tableData;\n\n const newTableData: InventoryTableData[] = [];\n\n tableData.forEach((tableEntry) => {\n const firstItem = tableEntry.items[0];\n\n const existingEntry = newTableData.find(\n (newTableEntry) => newTableEntry.items[0] === firstItem,\n );\n\n if (existingEntry) {\n existingEntry.count += tableEntry.count;\n existingEntry.occurrences = existingEntry.occurrences.concat(tableEntry.occurrences);\n } else {\n newTableData.push({\n items: [firstItem],\n count: tableEntry.count,\n occurrences: tableEntry.occurrences,\n status: tableEntry.status,\n });\n }\n });\n\n return newTableData;\n }, [showAdditionalItems, tableData]);\n\n const filteredTableData: InventoryTableData[] = useMemo(() => {\n if (reducedTableData.length === 0) return [];\n return filterItemData(reducedTableData, statusFilter, textFilter);\n }, [reducedTableData, statusFilter, textFilter]);\n\n const allColumns: ColumnDef[] = useMemo(() => {\n if (!showAdditionalItems) return columns;\n\n const numberOfAdditionalItems = additionalItemsLabels?.tableHeaders?.length;\n if (!numberOfAdditionalItems) return columns;\n\n const additionalColumns: ColumnDef[] = [];\n\n for (let index = 0; index < numberOfAdditionalItems; index++) {\n additionalColumns.push(\n inventoryAdditionalItemColumn(\n additionalItemsLabels?.tableHeaders?.[index] || 'Additional Item',\n index + 1,\n ),\n );\n }\n\n return [...additionalColumns, ...columns];\n }, [additionalItemsLabels?.tableHeaders, columns, showAdditionalItems]);\n\n useEffect(() => {\n if (filteredTableData.length === 0) {\n setSelectedItem([]);\n } else if (filteredTableData.length === 1) {\n setSelectedItem(filteredTableData[0].items);\n }\n }, [filteredTableData]);\n\n const rowClickHandler = (\n row: RowContents,\n table: TableContents,\n ) => {\n table.setRowSelection(() => {\n const newSelection: RowSelectionState = {};\n newSelection[row.index] = true;\n return newSelection;\n });\n\n const selectedItems = row.original.items;\n setSelectedItem(selectedItems);\n\n // Call the callback if provided, passing the first item as the key\n if (onItemSelected && selectedItems.length > 0) {\n onItemSelected(selectedItems[0]);\n }\n };\n\n const handleScopeChange = (value: string) => {\n if (value === 'book' || value === 'chapter' || value === 'verse') {\n onScopeChange(value);\n } else {\n throw new Error(`Invalid scope value: ${value}`);\n }\n };\n\n const handleStatusFilterChange = (value: string) => {\n if (value === 'all' || value === 'approved' || value === 'unapproved' || value === 'unknown') {\n setStatusFilter(value);\n } else {\n throw new Error(`Invalid status filter value: ${value}`);\n }\n };\n\n const occurrenceData: InventoryItemOccurrence[] = useMemo(() => {\n if (reducedTableData.length === 0 || selectedItem.length === 0) return [];\n const occurrence = reducedTableData.filter((tableEntry: InventoryTableData) => {\n return deepEqual(\n showAdditionalItems ? tableEntry.items : [tableEntry.items[0]],\n selectedItem,\n );\n });\n if (occurrence.length > 1) throw new Error('Selected item is not unique');\n if (occurrence.length === 0) return [];\n return occurrence[0].occurrences;\n }, [selectedItem, showAdditionalItems, reducedTableData]);\n\n return (\n
    \n
    \n {/* contain: inline-size excludes toolbar from wrapper's min-width calculation\n so the checkbox label can truncate before the scrollbar appears */}\n {/* eslint-disable-next-line react/forbid-dom-props */}\n
    \n handleStatusFilterChange(value)}\n defaultValue={statusFilter}\n >\n \n \n \n \n {allItemsText}\n {approvedItemsText}\n {unapprovedItemsText}\n {unknownItemsText}\n \n \n \n {\n setTextFilter(event.target.value);\n }}\n />\n {additionalItemsLabels && (\n \n \n \n
    \n {\n setShowAdditionalItems(checked);\n }}\n />\n \n
    \n
    \n \n {additionalItemsLabels?.checkboxText ?? showAdditionalItemsText}\n \n
    \n
    \n )}\n
    \n
    \n \n
    \n {occurrenceData.length > 0 && (\n
    \n \n
    \n )}\n
    \n
    \n );\n}\n\nexport default Inventory;\n","/**\n * CUSTOM: Changes from the original code from Shadcn: Removed uses of useIsMobile, Sheet, and\n * SheetContent. Also removed the parts setting COOKIES.\n */\n\nimport React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Slot } from 'radix-ui';\n\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { Button } from '@/components/shadcn-ui/button';\nimport { Input } from '@/components/shadcn-ui/input';\nimport { Separator } from '@/components/shadcn-ui/separator';\nimport { Skeleton } from '@/components/shadcn-ui/skeleton';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/shadcn-ui/tooltip';\n// CUSTOM: Added PanelRight import so SidebarTrigger can flip its icon based on the active side\nimport { IconLayoutSidebar, IconLayoutSidebarRight } from '@tabler/icons-react';\n// CUSTOM: Added Direction and readDirection imports for RTL-aware side computation\nimport { type Direction, readDirection } from '@/utils/dir-helper.util';\n\nconst SIDEBAR_WIDTH = '16rem';\nconst SIDEBAR_WIDTH_ICON = '3rem';\n// CUSTOM: Commented this out pending a discussion with UX about keyboard shortcuts\n// const SIDEBAR_KEYBOARD_SHORTCUT = 'b';\n\ntype Side = 'primary' | 'secondary';\n\ntype SidebarContextProps = {\n state: 'expanded' | 'collapsed';\n open: boolean;\n setOpen: (open: boolean) => void;\n toggleSidebar: () => void;\n // CUSTOM: 'side' was moved from Sidebar into the context so that SidebarTrigger can flip its icon\n // (PanelLeft vs PanelRight) based on the active side\n side: Side;\n};\n\n// CUSTOM: Use undefined instead of null as createContext default - avoids no-null/no-null lint rule.\n// The useSidebar() guard (if (!context)) works correctly for undefined.\nconst SidebarContext = React.createContext(undefined);\n\n/** @inheritdoc SidebarProvider */\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.');\n }\n\n return context;\n}\n\n/**\n * Sidebar components providing an accessible sidebar along with all the sub components that can be\n * used to populate and style it. These components are adapted from Shadcn UI.\n *\n * @see Shadcn UI Documentation: {@link https://ui.shadcn.com/docs/components/sidebar}\n */\n// CUSTOM: Added TSDoc with link to shadcn/ui documentation\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n // CUSTOM: Added 'side' prop at provider level so direction-aware side can be propagated via context\n side = 'primary',\n ...props\n}: React.ComponentProps<'div'> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** The side of the sidebar. */\n side?: Side;\n}) {\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n // CUSTOM: Removed isMobile, openMobile, setOpenMobile state (useIsMobile removed)\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n // CUSTOM: Removed cookie-setting logic (not applicable in Platform.Bible)\n },\n [setOpenProp, open],\n );\n\n // Helper to toggle the sidebar.\n // CUSTOM: Removed isMobile branch from toggleSidebar (mobile support removed)\n const toggleSidebar = React.useCallback(() => {\n return setOpen((prevOpen) => !prevOpen);\n }, [setOpen]);\n\n // CUSTOM: Commented out keyboard shortcut pending a discussion with UX about keyboard shortcuts\n // Adds a keyboard shortcut to toggle the sidebar.\n // React.useEffect(() => {\n // const handleKeyDown = (event: KeyboardEvent) => {\n // if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n // event.preventDefault();\n // toggleSidebar();\n // }\n // };\n //\n // window.addEventListener('keydown', handleKeyDown);\n // return () => window.removeEventListener('keydown', handleKeyDown);\n // }, [toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? 'expanded' : 'collapsed';\n\n // CUSTOM: Added RTL-aware side computation so 'primary' always maps to the correct physical side\n const dir: Direction = readDirection();\n const oppositeSide: Side = side === 'primary' ? 'secondary' : 'primary';\n const directionAwareSide = dir === 'ltr' ? side : oppositeSide;\n\n const contextValue = React.useMemo(\n () => ({\n state,\n open,\n setOpen,\n toggleSidebar,\n // CUSTOM: Passes direction-aware side into context so SidebarTrigger icon and Sidebar\n // positioning both respond correctly in RTL layouts\n side: directionAwareSide,\n }),\n [state, open, setOpen, toggleSidebar, directionAwareSide],\n );\n\n // CUSTOM: CSS custom properties (--*) are not in React.CSSProperties; 'as React.CSSProperties'\n // is the standard React pattern for passing CSS variables via the style prop. Extracted to a\n // single-line const so the eslint-disable-next-line can target the assertion precisely.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const wrapperStyle = {\n '--sidebar-width': SIDEBAR_WIDTH,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties;\n\n return (\n \n \n {children}\n \n \n );\n}\n\n/** @inheritdoc SidebarProvider */\n// CUSTOM: Added TSDoc via @inheritdoc\nfunction Sidebar({\n // CUSTOM: Removed 'side' prop from Sidebar - it is now read from context (moved to SidebarProvider)\n variant = 'sidebar',\n collapsible = 'offcanvas',\n className,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n variant?: 'sidebar' | 'floating' | 'inset';\n collapsible?: 'offcanvas' | 'icon' | 'none';\n}) {\n // CUSTOM: Read side from context instead of accepting it as a prop\n const context = useSidebar();\n\n if (collapsible === 'none') {\n return (\n \n {children}\n \n );\n }\n\n return (\n \n {/* This is what handles the sidebar gap on desktop */}\n \n \n \n {children}\n \n \n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps) {\n const { toggleSidebar, side } = useSidebar();\n\n return (\n {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n {/* CUSTOM: Renders PanelLeft or PanelRight based on context.side so the icon always points\n toward the sidebar's current position (accounting for RTL direction) */}\n {side === 'primary' ? : }\n Toggle Sidebar\n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarInset({ className, ...props }: React.ComponentProps<'main'>) {\n return (\n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarInput({ className, ...props }: React.ComponentProps) {\n return (\n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarSeparator({ className, ...props }: React.ComponentProps) {\n return (\n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'div'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : 'div';\n\n return (\n svg]:size-4 tw:[&>svg]:shrink-0',\n className,\n )}\n {...props}\n />\n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : 'button';\n\n return (\n svg]:size-4 tw:[&>svg]:shrink-0',\n className,\n )}\n {...props}\n />\n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n \n );\n}\n\nconst sidebarMenuButtonVariants = cva(\n 'tw:peer/menu-button tw:group/menu-button tw:flex tw:w-full tw:items-center tw:gap-2 tw:overflow-hidden tw:rounded-md tw:p-2 tw:text-start tw:text-sm tw:ring-sidebar-ring tw:outline-hidden tw:transition-[width,height,padding] tw:group-has-data-[sidebar=menu-action]/menu-item:pe-8 tw:group-data-[collapsible=icon]:size-8! tw:group-data-[collapsible=icon]:p-2! tw:hover:bg-sidebar-accent tw:hover:text-sidebar-accent-foreground tw:focus-visible:ring-2 tw:active:bg-sidebar-accent tw:active:text-sidebar-accent-foreground tw:disabled:pointer-events-none tw:disabled:opacity-50 tw:aria-disabled:pointer-events-none tw:aria-disabled:opacity-50 tw:data-open:hover:bg-sidebar-accent tw:data-open:hover:text-sidebar-accent-foreground tw:data-active:bg-sidebar-accent tw:data-active:font-medium tw:data-active:text-sidebar-accent-foreground tw:[&_svg]:size-4 tw:[&_svg]:shrink-0 tw:[&>span:last-child]:truncate',\n {\n variants: {\n variant: {\n default: 'tw:hover:bg-sidebar-accent tw:hover:text-sidebar-accent-foreground',\n // CUSTOM: Updated shadow color values from hsl(var(--...)) to var(--...) to use the\n // updated CSS variable format that includes the color space directly in the variable value\n outline:\n 'tw:bg-background tw:shadow-[0_0_0_1px_var(--sidebar-border)] tw:hover:bg-sidebar-accent tw:hover:text-sidebar-accent-foreground tw:hover:shadow-[0_0_0_1px_var(--sidebar-accent)]',\n },\n size: {\n default: 'tw:h-8 tw:text-sm',\n sm: 'tw:h-7 tw:text-xs',\n lg: 'tw:h-12 tw:text-sm tw:group-data-[collapsible=icon]:p-0!',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = 'default',\n size = 'default',\n tooltip,\n className,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps;\n} & VariantProps) {\n const Comp = asChild ? Slot.Root : 'button';\n const { state } = useSidebar();\n\n const button = (\n \n );\n\n if (!tooltip) {\n return button;\n }\n\n // CUSTOM: Avoid reassigning function parameter (no-param-reassign) by using a new const variable\n const resolvedTooltip: React.ComponentProps =\n typeof tooltip === 'string' ? { children: tooltip } : tooltip;\n\n return (\n \n {button}\n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? Slot.Root : 'button';\n\n return (\n svg]:size-4 tw:[&>svg]:shrink-0',\n showOnHover &&\n 'tw:group-focus-within/menu-item:opacity-100 tw:group-hover/menu-item:opacity-100 tw:peer-data-active/menu-button:text-sidebar-accent-foreground tw:aria-expanded:opacity-100 tw:md:opacity-0',\n className,\n )}\n {...props}\n />\n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<'div'> & {\n showIcon?: boolean;\n}) {\n // Random width between 50 to 90%.\n const [width] = React.useState(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n });\n // CUSTOM: CSS custom properties (--*) are not in React.CSSProperties; 'as React.CSSProperties'\n // is the standard React pattern for passing CSS variables via the style prop. Extracted to a\n // single-line const so the eslint-disable-next-line can target the assertion precisely.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const skeletonStyle = { '--skeleton-width': width } as React.CSSProperties;\n\n return (\n \n {showIcon && (\n \n )}\n \n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n \n );\n}\n\n/** @inheritdoc SidebarProvider */\nfunction SidebarMenuSubButton({\n asChild = false,\n size = 'md',\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean;\n size?: 'sm' | 'md';\n isActive?: boolean;\n}) {\n const Comp = asChild ? Slot.Root : 'a';\n\n return (\n span:last-child]:truncate tw:[&>svg]:size-4 tw:[&>svg]:shrink-0 tw:[&>svg]:text-sidebar-accent-foreground',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n};\n","import {\n ProjectSelector,\n type ProjectSelectorLocalizedStrings,\n type ProjectSelectorProject,\n} from '@/components/advanced/project-selector/project-selector.component';\nimport {\n Sidebar,\n SidebarContent,\n SidebarGroup,\n SidebarGroupLabel,\n SidebarGroupContent,\n SidebarMenu,\n SidebarMenuItem,\n SidebarMenuButton,\n} from '@/components/shadcn-ui/sidebar';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { ScrollText } from 'lucide-react';\nimport { useCallback, useMemo } from 'react';\n\nexport type SelectedSettingsSidebarItem = {\n label: string;\n projectId?: string;\n};\n\nexport type ProjectInfo = { projectId: string; projectName: string };\n\nexport type SettingsSidebarProps = {\n /** Optional id for testing */\n id?: string;\n\n /** Extension labels from contribution */\n extensionLabels: Record;\n\n /** Project names and ids */\n projectInfo: ProjectInfo[];\n\n /** Handler for selecting a sidebar item */\n handleSelectSidebarItem: (key: string, projectId?: string) => void;\n\n /** The current selected value in the sidebar */\n selectedSidebarItem: SelectedSettingsSidebarItem;\n\n /** Label for the group of extensions setting groups */\n extensionsSidebarGroupLabel: string;\n\n /** Label for the group of projects settings */\n projectsSidebarGroupLabel: string;\n\n /** Placeholder text for the button */\n buttonPlaceholderText: string;\n\n /**\n * Placeholder text for the project picker's search box. Falls back to the picker's English string\n * when omitted.\n */\n searchPlaceholderText?: string;\n\n /**\n * Message the project picker shows when no project matches the search. Falls back to the picker's\n * English string when omitted.\n */\n noResultsText?: string;\n\n /** Additional css classes to help with unique styling of the sidebar */\n className?: string;\n};\n\n/**\n * The SettingsSidebar component is a sidebar that displays a list of extension settings and project\n * settings. It can be used to navigate to different settings pages. Must be wrapped in a\n * SidebarProvider component otherwise produces errors.\n *\n * @param props - {@link SettingsSidebarProps} The props for the component.\n */\nexport function SettingsSidebar({\n id,\n extensionLabels,\n projectInfo,\n handleSelectSidebarItem,\n selectedSidebarItem,\n extensionsSidebarGroupLabel,\n projectsSidebarGroupLabel,\n buttonPlaceholderText,\n searchPlaceholderText,\n noResultsText,\n className,\n}: SettingsSidebarProps) {\n const handleSelectItem = useCallback(\n (item: string, projectId?: string) => {\n handleSelectSidebarItem(item, projectId);\n },\n [handleSelectSidebarItem],\n );\n\n const getProjectNameFromProjectId = useCallback(\n (projectId: string) => {\n const project = projectInfo.find((info) => info.projectId === projectId);\n return project ? project.projectName : projectId;\n },\n [projectInfo],\n );\n\n // Adapt the public `ProjectInfo[]` shape to `ProjectSelectorProject[]` for the canonical\n // trigger. We only have a single name string in the public API, so reuse it\n // as both `shortName` (the trigger label) and `fullName` (the popover row's secondary line).\n // The public prop shape is intentionally preserved so downstream consumers don't need to change.\n const projectSelectorProjects = useMemo(\n () =>\n projectInfo.map((info) => ({\n id: info.projectId,\n shortName: info.projectName,\n fullName: info.projectName,\n })),\n [projectInfo],\n );\n\n // `buttonPlaceholder` and `ariaLabel` are this sidebar's own copy; the popover's two strings are\n // optional. Unsupplied entries are left off the bag rather than set to `undefined`, because\n // ProjectSelector layers this bag over its own English defaults with a plain spread — an explicit\n // `undefined` would blank the default it lands on instead of falling back to it.\n const projectSelectorStrings = useMemo((): ProjectSelectorLocalizedStrings => {\n const strings: ProjectSelectorLocalizedStrings = {\n buttonPlaceholder: buttonPlaceholderText,\n ariaLabel: projectsSidebarGroupLabel,\n };\n if (searchPlaceholderText) strings.searchPlaceholder = searchPlaceholderText;\n if (noResultsText) strings.commandEmptyMessage = noResultsText;\n return strings;\n }, [buttonPlaceholderText, projectsSidebarGroupLabel, searchPlaceholderText, noResultsText]);\n\n const getIsActive: (label: string) => boolean = useCallback(\n (label: string) => !selectedSidebarItem.projectId && label === selectedSidebarItem.label,\n [selectedSidebarItem],\n );\n\n return (\n \n \n \n \n {extensionsSidebarGroupLabel}\n \n \n \n {Object.entries(extensionLabels).map(([key, label]) => (\n \n handleSelectItem(key)}\n isActive={getIsActive(key)}\n >\n {label}\n \n \n ))}\n \n \n \n \n {projectsSidebarGroupLabel}\n \n {/*\n Flex wrapper hosts the leading icon outside the ProjectSelector's\n trigger button. ProjectSelector has no built-in icon slot, and adding one solely for\n this consumer would expand its API. The icon was decorative on the prior ComboBox\n (no click handler), so keeping it adjacent to — rather than inside — the trigger\n preserves the visual affordance without bloating the canonical component.\n\n No groupings at all are offered here, and that is deliberate rather than an\n oversight. platform-bible-react is intentionally PAPI-free (see CLAUDE.md\n \"Symlinked Directories\" / lib boundaries), so this component cannot reach project\n settings or the recently-opened-projects service, and its public `ProjectInfo` prop\n carries only an id and a name — there is no language, type, or recency to group by.\n `useOpenProjectTabs` likewise lives in the extension layer, so `openTabs={[]}` keeps\n the ProjectSelector on a flat (non-grouped) list. A consumer that wants grouping\n passes `openTabs` and richer rows in via new props on this component.\n */}\n \n \n {\n if (!nextId) return;\n const selectedProjectName = getProjectNameFromProjectId(nextId);\n handleSelectItem(selectedProjectName, nextId);\n }}\n buttonVariant=\"ghost\"\n buttonClassName=\"tw:h-8 tw:w-full tw:flex-1 tw:justify-start tw:font-normal\"\n localizedStrings={projectSelectorStrings}\n />\n \n \n \n \n \n );\n}\n\nexport default SettingsSidebar;\n","import { SidebarInset, SidebarProvider } from '@/components/shadcn-ui/sidebar';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { PropsWithChildren } from 'react';\nimport { SearchBar } from '@/components/basics/search-bar.component';\nimport { SettingsSidebar, SettingsSidebarProps } from './settings-sidebar.component';\n\nexport type SettingsSidebarContentSearchProps = SettingsSidebarProps &\n PropsWithChildren & {\n /** The search query in the search bar */\n searchValue: string;\n\n /** Handler to run when the value of the search bar changes */\n onSearch: (searchQuery: string) => void;\n };\n\n/**\n * A component that wraps a search bar and a settings sidebar, providing a way to search and\n * navigate to different settings pages.\n *\n * @param {SettingsSidebarContentSearchProps} props - The props for the component.\n * @param {string} props.id - The id of the sidebar.\n */\nexport function SettingsSidebarContentSearch({\n id,\n children,\n searchValue,\n onSearch,\n className,\n // Everything else on this type comes from `SettingsSidebarProps`, so forward it wholesale: a\n // prop added to the sidebar reaches it without a matching edit here. `id` is destructured out\n // because it belongs to the SidebarProvider below, not to the sidebar.\n ...sidebarProps\n}: SettingsSidebarContentSearchProps) {\n return (\n
    \n
    \n \n
    \n \n \n {children}\n \n
    \n );\n}\n\nexport default SettingsSidebarContentSearch;\n","import { Button } from '@/components/shadcn-ui/button';\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/shadcn-ui/select';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/shadcn-ui/table';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { Canon } from '@sillsdev/scripture';\nimport {\n Cell,\n ColumnDef,\n flexRender,\n getCoreRowModel,\n getExpandedRowModel,\n getGroupedRowModel,\n getSortedRowModel,\n GroupingState,\n Row,\n RowSelectionState,\n SortingState,\n useReactTable,\n} from '@tanstack/react-table';\nimport '@/components/advanced/scripture-results-viewer/scripture-results-viewer.component.css';\nimport {\n compareScrRefs,\n formatScrRef,\n ScriptureSelection,\n scrRefToBBBCCCVVV,\n} from 'platform-bible-utils';\nimport { MouseEvent, useEffect, useMemo, useState } from 'react';\nimport { ChevronDown, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { Direction, readDirection } from '@/utils/dir-helper.util';\n\n/**\n * Information (e.g., a checking error or some other type of \"transient\" annotation) about something\n * noteworthy at a specific place in an instance of the Scriptures.\n */\nexport type ScriptureItemDetail = ScriptureSelection & {\n /**\n * Text of the error, note, etc. In the future, we might want to support something more than just\n * text so that a JSX element could be provided with a link or some other controls related to the\n * issue being reported.\n */\n detail: string;\n};\n\n/**\n * A uniquely identifiable source of results that can be displayed in the ScriptureResultsViewer.\n * Generally, the source will be a particular Scripture check, but there may be other types of\n * sources.\n */\nexport type ResultsSource = {\n /**\n * Uniquely identifies the source.\n *\n * @type {string}\n */\n id: string;\n\n /**\n * Name (potentially localized) of the source, suitable for display in the UI.\n *\n * @type {string}\n */\n displayName: string;\n};\n\nexport type ScriptureSrcItemDetail = ScriptureItemDetail & {\n /** Source/type of detail. Can be used for grouping. */\n source: ResultsSource;\n};\n\n/**\n * Represents a set of results keyed by Scripture reference. Generally, the source will be a\n * particular Scripture check, but this type also allows for other types of uniquely identifiable\n * sources.\n */\nexport type ResultsSet = {\n /**\n * The backing source associated with this set of results.\n *\n * @type {ResultsSource}\n */\n source: ResultsSource;\n\n /**\n * Array of Scripture item details (messages keyed by Scripture reference).\n *\n * @type {ScriptureItemDetail[]}\n */\n data: ScriptureItemDetail[];\n};\n\nconst scrBookColId = 'scrBook';\nconst scrRefColId = 'scrRef';\nconst typeColId = 'source';\nconst detailsColId = 'details';\n\nconst defaultScrRefColumnName = 'Scripture Reference';\nconst defaultScrBookGroupName = 'Scripture Book';\nconst defaultTypeColumnName = 'Type';\nconst defaultDetailsColumnName = 'Details';\n\nexport type ScriptureResultsViewerColumnInfo = {\n /** Optional header to display for the Reference column. Default value: 'Scripture Reference'. */\n scriptureReferenceColumnName?: string;\n\n /** Optional text to display to refer to the Scripture book group. Default value: 'Scripture Book'. */\n scriptureBookGroupName?: string;\n\n /** Optional header to display for the Type column. Default value: 'Type'. */\n typeColumnName?: string;\n\n /** Optional header to display for the Details column. Default value: 'Details' */\n detailsColumnName?: string;\n};\n\nexport type ScriptureResultsViewerProps = ScriptureResultsViewerColumnInfo & {\n /** Groups of ScriptureItemDetail objects from particular sources (e.g., Scripture checks) */\n sources: ResultsSet[];\n\n /** Flag indicating whether to display column headers. Default is false. */\n showColumnHeaders?: boolean;\n\n /** Flag indicating whether to display source column. Default is false. */\n showSourceColumn?: boolean;\n\n /** Callback function to notify when a row is selected */\n onRowSelected?: (selectedRow: ScriptureSrcItemDetail | undefined) => void;\n\n /** Optional id attribute for the outermost element */\n id?: string;\n};\n\nfunction getColumns(\n colInfo?: ScriptureResultsViewerColumnInfo,\n showSourceColumn?: boolean,\n): ColumnDef[] {\n const showSrcCol = showSourceColumn ?? false;\n return [\n {\n accessorFn: (row) => `${row.start.book} ${row.start.chapterNum}:${row.start.verseNum}`,\n id: scrBookColId,\n header: colInfo?.scriptureReferenceColumnName ?? defaultScrRefColumnName,\n cell: (info) => {\n const row = info.row.original;\n if (info.row.getIsGrouped()) {\n return Canon.bookIdToEnglishName(row.start.book);\n }\n return info.row.groupingColumnId === scrBookColId ? formatScrRef(row.start) : undefined;\n },\n getGroupingValue: (row) => Canon.bookIdToNumber(row.start.book),\n sortingFn: (a, b) => {\n return compareScrRefs(a.original.start, b.original.start);\n },\n enableGrouping: true,\n },\n {\n accessorFn: (row) => formatScrRef(row.start),\n id: scrRefColId,\n header: undefined,\n cell: (info) => {\n const row = info.row.original;\n return info.row.getIsGrouped() ? undefined : formatScrRef(row.start);\n },\n sortingFn: (a, b) => {\n return compareScrRefs(a.original.start, b.original.start);\n },\n enableGrouping: false,\n },\n {\n accessorFn: (row) => row.source.displayName,\n id: typeColId,\n header: showSrcCol ? (colInfo?.typeColumnName ?? defaultTypeColumnName) : undefined,\n cell: (info) => (showSrcCol || info.row.getIsGrouped() ? info.getValue() : undefined),\n getGroupingValue: (row) => row.source.id,\n sortingFn: (a, b) =>\n a.original.source.displayName.localeCompare(b.original.source.displayName),\n enableGrouping: true,\n },\n {\n accessorFn: (row) => row.detail,\n id: detailsColId,\n header: colInfo?.detailsColumnName ?? defaultDetailsColumnName,\n cell: (info) => info.getValue(),\n enableGrouping: false,\n },\n ];\n}\n\nconst toRefOrRange = (scriptureSelection: ScriptureSelection) => {\n if (!('offset' in scriptureSelection.start))\n throw new Error('No offset available in range start');\n if (scriptureSelection.end && !('offset' in scriptureSelection.end))\n throw new Error('No offset available in range end');\n const { offset: offsetStart } = scriptureSelection.start;\n let offsetEnd: number = 0;\n if (scriptureSelection.end) ({ offset: offsetEnd } = scriptureSelection.end);\n if (\n !scriptureSelection.end ||\n compareScrRefs(scriptureSelection.start, scriptureSelection.end) === 0\n )\n return `${scrRefToBBBCCCVVV(scriptureSelection.start)}+${offsetStart}`;\n return `${scrRefToBBBCCCVVV(scriptureSelection.start)}+${offsetStart}-${scrRefToBBBCCCVVV(scriptureSelection.end)}+${offsetEnd}`;\n};\n\nconst getRowKey = (row: ScriptureSrcItemDetail) =>\n `${toRefOrRange({ start: row.start, end: row.end })} ${row.source.displayName} ${row.detail}`;\n\n/**\n * Component to display a combined list of detailed items from one or more sources, where the items\n * are keyed primarily by Scripture reference. This is particularly useful for displaying a list of\n * results from Scripture checks, but more generally could be used to display any \"results\" from any\n * source(s). The component allows for grouping by Scripture book, source, or both. By default, it\n * displays somewhat \"tree-like\" which allows it to be more horizontally compact and intuitive. But\n * it also has the option of displaying as a traditional table with column headings (with or without\n * the source column showing).\n */\nexport function ScriptureResultsViewer({\n sources,\n showColumnHeaders = false,\n showSourceColumn = false,\n scriptureReferenceColumnName,\n scriptureBookGroupName,\n typeColumnName,\n detailsColumnName,\n onRowSelected,\n id,\n}: ScriptureResultsViewerProps) {\n const [grouping, setGrouping] = useState([]);\n const [sorting, setSorting] = useState([{ id: scrBookColId, desc: false }]);\n const [rowSelection, setRowSelection] = useState({});\n\n const scriptureResults = useMemo(\n () =>\n sources.flatMap((source) => {\n return source.data.map((item) => ({\n ...item,\n source: source.source,\n }));\n }),\n [sources],\n );\n\n const columns = useMemo(\n () =>\n getColumns(\n {\n scriptureReferenceColumnName,\n typeColumnName,\n detailsColumnName,\n },\n showSourceColumn,\n ),\n [scriptureReferenceColumnName, typeColumnName, detailsColumnName, showSourceColumn],\n );\n\n useEffect(() => {\n // Ensure sorting is applied correctly when grouped by type\n if (grouping.includes(typeColId)) {\n setSorting([\n { id: typeColId, desc: false },\n { id: scrBookColId, desc: false },\n ]);\n } else {\n setSorting([{ id: scrBookColId, desc: false }]);\n }\n }, [grouping]);\n\n const table = useReactTable({\n data: scriptureResults,\n columns,\n state: {\n grouping,\n sorting,\n rowSelection,\n },\n onGroupingChange: setGrouping,\n onSortingChange: setSorting,\n onRowSelectionChange: setRowSelection,\n getExpandedRowModel: getExpandedRowModel(),\n getGroupedRowModel: getGroupedRowModel(),\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getRowId: getRowKey,\n autoResetExpanded: false,\n enableMultiRowSelection: false,\n enableSubRowSelection: false,\n });\n\n useEffect(() => {\n if (onRowSelected) {\n const selectedRows = table.getSelectedRowModel().rowsById;\n const keys = Object.keys(selectedRows);\n if (keys.length === 1) {\n const selectedRow = scriptureResults.find((row) => getRowKey(row) === keys[0]) || undefined;\n if (selectedRow) onRowSelected(selectedRow);\n }\n }\n }, [rowSelection, scriptureResults, onRowSelected, table]);\n\n // Define possible grouping options\n const scrBookGroupName = scriptureBookGroupName ?? defaultScrBookGroupName;\n const typeGroupName = typeColumnName ?? defaultTypeColumnName;\n\n const groupingOptions = [\n { label: 'No Grouping', value: [] },\n { label: `Group by ${scrBookGroupName}`, value: [scrBookColId] },\n { label: `Group by ${typeGroupName}`, value: [typeColId] },\n {\n label: `Group by ${scrBookGroupName} and ${typeGroupName}`,\n value: [scrBookColId, typeColId],\n },\n {\n label: `Group by ${typeGroupName} and ${scrBookGroupName}`,\n value: [typeColId, scrBookColId],\n },\n ];\n\n const handleSelectChange = (selectedGrouping: string) => {\n setGrouping(JSON.parse(selectedGrouping));\n };\n\n const handleRowClick = (row: Row, event: MouseEvent) => {\n if (!row.getIsGrouped() && !row.getIsSelected()) {\n row.getToggleSelectedHandler()(event);\n }\n };\n\n const getEvenOrOddBandingStyle = (row: Row, index: number) => {\n if (row.getIsGrouped()) return '';\n // UX has now said they don't think they want banding. I'm leaving in the code to\n // set even and odd styles, but there's nothing in the CSS to style them differently.\n // The \"even\" style used to also have tw:bg-neutral-300 (along with even) to create\n // a visual banding effect. That could be added back in if UX changes the decision.\n return cn('banded-row', index % 2 === 0 ? 'even' : 'odd');\n };\n\n const getIndent = (\n groupingState: GroupingState,\n row: Row,\n cell: Cell,\n ) => {\n if (groupingState?.length === 0 || row.depth < cell.column.getGroupedIndex()) return undefined;\n if (row.getIsGrouped()) {\n switch (row.depth) {\n case 1:\n return 'tw:ps-4';\n default:\n return undefined;\n }\n }\n switch (row.depth) {\n case 1:\n return 'tw:ps-8';\n case 2:\n return 'tw:ps-12';\n default:\n return undefined;\n }\n };\n\n return (\n
    \n {!showColumnHeaders && (\n {\n handleSelectChange(value);\n }}\n >\n \n \n \n \n \n {groupingOptions.map((option) => (\n \n {option.label}\n \n ))}\n \n \n \n )}\n \n {showColumnHeaders && (\n \n {table.getHeaderGroups().map((headerGroup) => (\n \n {headerGroup.headers\n .filter((h) => h.column.columnDef.header)\n .map((header) => (\n /* For sticky column headers to work, we probably need to change the default definition of the shadcn Table component. See https://github.com/shadcn-ui/ui/issues/1151 */\n \n {header.isPlaceholder ? undefined : (\n
    \n {header.column.getCanGroup() ? (\n \n {header.column.getIsGrouped() ? `🛑` : `👊 `}\n \n ) : undefined}{' '}\n {flexRender(header.column.columnDef.header, header.getContext())}\n
    \n )}\n
    \n ))}\n
    \n ))}\n
    \n )}\n \n {table.getRowModel().rows.map((row, rowIndex) => {\n const dir: Direction = readDirection();\n return (\n handleRowClick(row, event)}\n >\n {row.getVisibleCells().map((cell) => {\n if (\n cell.getIsPlaceholder() ||\n (cell.column.columnDef.enableGrouping &&\n !cell.getIsGrouped() &&\n (cell.column.columnDef.id !== typeColId || !showSourceColumn))\n )\n return undefined;\n return (\n \n {(() => {\n if (cell.getIsGrouped()) {\n return (\n \n {row.getIsExpanded() && }\n {!row.getIsExpanded() &&\n (dir === 'ltr' ? : )}{' '}\n {flexRender(cell.column.columnDef.cell, cell.getContext())} (\n {row.subRows.length})\n \n );\n }\n\n // if (cell.getIsAggregated()) {\n // flexRender(\n // cell.column.columnDef.aggregatedCell ?? cell.column.columnDef.cell,\n // cell.getContext(),\n // );\n // }\n\n return flexRender(cell.column.columnDef.cell, cell.getContext());\n })()}\n \n );\n })}\n \n );\n })}\n \n
    \n
    \n );\n}\n\nexport default ScriptureResultsViewer;\n","import { BookItem } from '@/components/shared/book-item.component';\nimport { Button } from '@/components/shadcn-ui/button';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandList,\n CommandSeparator,\n} from '@/components/shadcn-ui/command';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/shadcn-ui/popover';\nimport { ChevronsUpDown } from 'lucide-react';\nimport { getSectionForBook, Section } from 'platform-bible-utils';\nimport { getSectionLongName, doesBookMatchQuery } from '@/components/shared/book.utils';\nimport { Fragment, MouseEvent, useCallback, useMemo, useRef, useState } from 'react';\nimport { generateCommandValue } from '@/components/shared/book-item.utils';\nimport { getAvailableBookIds, getBooksForSection } from './scope-selector.utils';\nimport { SelectBooksLocalizedStrings } from './select-books.types';\n\ntype SelectBooksPickerProps = {\n /**\n * Information about available books, formatted as a 123 character long string as defined in a\n * projects BooksPresent setting\n */\n availableBookInfo: string;\n /** Array of currently selected book IDs */\n selectedBookIds: string[];\n /** Callback function that is executed when the book selection changes */\n onChangeSelectedBookIds: (books: string[]) => void;\n /**\n * Object containing the localized strings for the component. The picker uses a subset of\n * {@link SelectBooksLocalizedStrings} (the badge and section-button keys are not used here)\n */\n localizedStrings: SelectBooksLocalizedStrings;\n /**\n * Optional map of localized book IDs/short names and full names. Key is the (English) book ID,\n * value contains localized versions of the ID and full book name\n */\n localizedBookNames?: Map;\n /**\n * Optional explanations, by section, for why that section has no available books. A section with\n * no books renders no group at all, so its explanation is shown as a note under the list —\n * otherwise a search for one of its books lands on the bare \"no book found\".\n */\n disabledSectionExplanations?: Partial>;\n};\n\n/**\n * A searchable dropdown (combobox) for picking multiple books from the Bible canon. It provides:\n *\n * - A trigger button summarizing how many books are selected\n * - A searchable list of all available books, grouped by section\n * - \"Select all\" / \"Clear all\" shortcuts\n * - Support for shift-click and shift-Enter range selection\n *\n * This is the standalone picker used by {@link SelectBooks}, which additionally renders section\n * quick-select buttons and badges for the current selection.\n */\nexport function SelectBooksPicker({\n availableBookInfo,\n selectedBookIds,\n onChangeSelectedBookIds,\n localizedStrings,\n localizedBookNames,\n disabledSectionExplanations,\n}: SelectBooksPickerProps) {\n const booksSelectedText = localizedStrings['%webView_book_selector_books_selected%'];\n const selectBooksText = localizedStrings['%webView_book_selector_select_books%'];\n const searchBooksText = localizedStrings['%webView_book_selector_search_books%'];\n const selectAllText = localizedStrings['%webView_book_selector_select_all%'];\n const clearAllText = localizedStrings['%webView_book_selector_clear_all%'];\n const noBookFoundText = localizedStrings['%webView_book_selector_no_book_found%'];\n\n const { otLong, ntLong, dcLong, extraLong } = {\n otLong: localizedStrings?.['%scripture_section_ot_long%'],\n ntLong: localizedStrings?.['%scripture_section_nt_long%'],\n dcLong: localizedStrings?.['%scripture_section_dc_long%'],\n extraLong: localizedStrings?.['%scripture_section_extra_long%'],\n };\n\n const [isBooksSelectorOpen, setIsBooksSelectorOpen] = useState(false);\n const [inputValue, setInputValue] = useState('');\n const lastSelectedBookRef = useRef(undefined);\n const lastKeyEventShiftKey = useRef(false);\n\n // Empty while the `BooksPresent` project setting is still resolving, and permanently empty if\n // that read errors — so every control that acts on the whole list has to handle \"no books known\".\n const availableBookIds = useMemo(\n () => getAvailableBookIds(availableBookInfo),\n [availableBookInfo],\n );\n\n const filteredBooksBySection = useMemo(() => {\n if (!inputValue.trim()) {\n const allBooks: Record = {\n [Section.OT]: [],\n [Section.NT]: [],\n [Section.DC]: [],\n [Section.Extra]: [],\n };\n\n availableBookIds.forEach((bookId) => {\n const section = getSectionForBook(bookId);\n allBooks[section].push(bookId);\n });\n\n return allBooks;\n }\n\n const filteredBooks = availableBookIds.filter((bookId) =>\n doesBookMatchQuery(bookId, inputValue, localizedBookNames),\n );\n\n const matchingBooks: Record = {\n [Section.OT]: [],\n [Section.NT]: [],\n [Section.DC]: [],\n [Section.Extra]: [],\n };\n\n filteredBooks.forEach((bookId) => {\n const section = getSectionForBook(bookId);\n matchingBooks[section].push(bookId);\n });\n\n return matchingBooks;\n }, [availableBookIds, inputValue, localizedBookNames]);\n\n const toggleBook = useCallback(\n (bookId: string, shiftKey = false) => {\n if (!shiftKey || !lastSelectedBookRef.current) {\n onChangeSelectedBookIds(\n selectedBookIds.includes(bookId)\n ? selectedBookIds.filter((id) => id !== bookId)\n : [...selectedBookIds, bookId],\n );\n lastSelectedBookRef.current = bookId;\n return;\n }\n\n const lastIndex = availableBookIds.findIndex((id) => id === lastSelectedBookRef.current);\n const currentIndex = availableBookIds.findIndex((id) => id === bookId);\n\n if (lastIndex === -1 || currentIndex === -1) return;\n\n const [startIndex, endIndex] = [\n Math.min(lastIndex, currentIndex),\n Math.max(lastIndex, currentIndex),\n ];\n const booksInRange = availableBookIds.slice(startIndex, endIndex + 1).map((id) => id);\n\n onChangeSelectedBookIds(\n selectedBookIds.includes(bookId)\n ? selectedBookIds.filter((shortname) => !booksInRange.includes(shortname))\n : [...new Set([...selectedBookIds, ...booksInRange])],\n );\n },\n [selectedBookIds, onChangeSelectedBookIds, availableBookIds],\n );\n\n const handleKeyboardSelect = (bookId: string) => {\n toggleBook(bookId, lastKeyEventShiftKey.current);\n lastKeyEventShiftKey.current = false;\n };\n\n const handleMouseDown = (event: MouseEvent, bookId: string) => {\n event.preventDefault();\n toggleBook(bookId, event.shiftKey);\n };\n\n const handleSelectAll = () => {\n onChangeSelectedBookIds(availableBookIds.map((bookId) => bookId));\n };\n\n const handleClearAll = () => {\n onChangeSelectedBookIds([]);\n };\n\n // Sections the consumer explained AND that have no books at all — not merely none matching the\n // current search, which is what the \"no book found\" empty state already covers.\n const missingSectionExplanations = useMemo(\n () =>\n Object.values(Section)\n .filter(\n (section) =>\n disabledSectionExplanations?.[section] !== undefined &&\n getBooksForSection(availableBookIds, section).length === 0,\n )\n .map((section) => ({ section, explanation: disabledSectionExplanations?.[section] })),\n [disabledSectionExplanations, availableBookIds],\n );\n\n return (\n {\n setIsBooksSelectorOpen(open);\n if (!open) {\n setInputValue(''); // Reset search when closing\n }\n }}\n >\n \n \n {selectedBookIds.length > 0\n ? `${booksSelectedText}: ${selectedBookIds.length}`\n : selectBooksText}\n \n \n \n {/* Fixed 500px width (clamped to the viewport) so the book grid lays out\n consistently instead of tracking the trigger width — carried over from\n the pre-refactor BookSelector (markers-checklist work).\n\n Height is capped to the space Radix actually has on whichever side it lands.\n Without the cap, a trigger sitting low in its container makes Radix flip the\n popover upward, and the full-height content (input + section buttons + a\n max-h-72 list) overruns the top of the viewport — inside a web view's iframe\n that clips the search input away entirely, leaving no way to filter.\n The list below shrinks instead so the input stays put. */}\n \n {\n if (e.key === 'Enter') {\n // Store shift state in a ref that will be used by onSelect\n lastKeyEventShiftKey.current = e.shiftKey;\n }\n }}\n >\n \n
    \n {/* Selecting all of nothing would commit an empty selection, wiping whatever the user\n already had — so the control is unavailable until the project's books are known. */}\n \n {selectAllText}\n \n \n
    \n {/* min-h-0 + flex-1 let the list shrink below its content inside the flex column, so it\n absorbs the height-capped popover's shortfall (and still scrolls) while the search\n input and section buttons stay put. CommandList's own max-height is kept as the\n upper bound for when there is room to spare — a max-height never blocks shrinking. */}\n \n {noBookFoundText}\n {Object.values(Section)\n .filter((section) => filteredBooksBySection[section].length > 0)\n .map((section, index) => {\n const sectionBooks = filteredBooksBySection[section];\n\n return (\n \n {/* Separator goes BEFORE each group but the first, counted over the sections\n actually rendered. Emitting it after each group instead would leave a dangling\n rule below the last one whenever a later section has no books.\n\n `alwaysRender` because cmdk hides a separator whenever its search box is\n non-empty, on the assumption that cmdk itself did the filtering. This picker sets\n `shouldFilter={false}` and filters into sections on its own, so the groups below\n are real and still need dividing. */}\n {index > 0 && }\n \n {sectionBooks.map((bookId) => (\n handleKeyboardSelect(bookId)}\n onMouseDown={(event) => handleMouseDown(event, bookId)}\n section={getSectionForBook(bookId)}\n showCheck\n localizedBookNames={localizedBookNames}\n commandValue={generateCommandValue(bookId, localizedBookNames)}\n className=\"tw:flex tw:items-center\"\n />\n ))}\n \n \n );\n })}\n \n {/* Explanations for the sections that render no group at all. Inside the popover but\n outside CommandList so cmdk's filtering can't hide the note behind the very search\n (\"glossary\") that makes the omission visible. */}\n {missingSectionExplanations.length > 0 && (\n
    \n {missingSectionExplanations.map(({ section, explanation }) => (\n

    \n {explanation}\n

    \n ))}\n
    \n )}\n \n \n \n );\n}\n","import { ReactNode } from 'react';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/shadcn-ui/tooltip';\nimport { DisabledTooltipWrapper } from './disabled-tooltip-wrapper.component';\n\nexport type DisabledActionTooltipProps = {\n /**\n * Whether the wrapped action(s) are currently disabled. While `true`, the wrapper becomes\n * focusable and labeled with `tooltipText` so the explanation stays reachable for keyboard and\n * screen-reader users.\n */\n disabled: boolean;\n /** Explanation shown in the tooltip, and used as the wrapper's `aria-label`, while `disabled`. */\n tooltipText: string;\n /** The action(s) to render — one or more buttons, a popover trigger, etc. */\n children: ReactNode;\n /** Optional class name for the focusable wrapper `div`. */\n className?: string;\n};\n\n/**\n * Wraps one or more actions (buttons, a popover trigger, etc.) that may be disabled, surfacing a\n * tooltip explanation while they are, via {@link DisabledTooltipWrapper}. This is the convenience\n * shape for the common case of a single tooltip message driving both the wrapper's accessible name\n * and the tooltip body — use `DisabledTooltipWrapper` directly if the accessible name and the\n * tooltip content need to differ, or the `Tooltip` needs non-default props.\n */\nexport function DisabledActionTooltip({\n disabled,\n tooltipText,\n children,\n className,\n}: DisabledActionTooltipProps) {\n return (\n \n \n \n \n {children}\n \n \n {disabled && (\n \n

    {tooltipText}

    \n
    \n )}\n
    \n
    \n );\n}\n\nexport default DisabledActionTooltip;\n","import { Button } from '@/components/shadcn-ui/button';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { Section } from 'platform-bible-utils';\nimport { getSectionShortName } from '@/components/shared/book.utils';\nimport { DisabledActionTooltip } from '@/components/basics/disabled-action-tooltip.component';\nimport { getBooksForSection, isSectionFullySelected } from './scope-selector.utils';\nimport { SelectBooksLocalizedStrings } from './select-books.types';\n\n/**\n * A button component that represents a scripture section (testament) in the book selector. The\n * button shows a different state when all books in its section are selected and becomes disabled\n * when no books are available in its section.\n */\nfunction SectionButton({\n section,\n availableBookIds,\n selectedBookIds,\n onToggle,\n localizedStrings,\n disabledExplanation,\n}: {\n section: Section;\n availableBookIds: string[];\n selectedBookIds: string[];\n onToggle: (section: Section) => void;\n localizedStrings: SelectBooksLocalizedStrings;\n /**\n * Why this section has no available books, shown as a tooltip while the button is disabled. Worth\n * supplying when the consumer withholds a section's books deliberately, since a bare disabled\n * button otherwise reads as \"this project has none\".\n */\n disabledExplanation?: string;\n}) {\n const isDisabled = getBooksForSection(availableBookIds, section).length === 0;\n\n const sectionOtShortText = localizedStrings['%scripture_section_ot_short%'];\n const sectionNtShortText = localizedStrings['%scripture_section_nt_short%'];\n const sectionDcShortText = localizedStrings['%scripture_section_dc_short%'];\n const sectionExtraShortText = localizedStrings['%scripture_section_extra_short%'];\n\n const button = (\n onToggle(section)}\n className={cn(\n isSectionFullySelected(availableBookIds, section, selectedBookIds) &&\n !isDisabled &&\n 'tw:bg-primary tw:text-primary-foreground tw:hover:bg-primary/70 tw:hover:text-primary-foreground',\n )}\n disabled={isDisabled}\n >\n {getSectionShortName(\n section,\n sectionOtShortText,\n sectionNtShortText,\n sectionDcShortText,\n sectionExtraShortText,\n )}\n \n );\n\n if (!disabledExplanation) return button;\n\n // Wrapped whenever an explanation is supplied, not only while disabled: swapping the element type\n // at this position on an `isDisabled` flip would remount the Button and drop keyboard focus. The\n // wrapper is inert while `disabled` is false. `tw:flex` keeps it from breaking the button row it\n // becomes a flex item of.\n return (\n \n {button}\n \n );\n}\n\nexport default SectionButton;\n","import { Badge } from '@/components/shadcn-ui/badge';\nimport { Section } from 'platform-bible-utils';\nimport { getLocalizedBookName } from '@/components/shared/book.utils';\nimport { useCallback, useMemo } from 'react';\nimport {\n getAvailableBookIds,\n getBooksForSection,\n isSectionFullySelected,\n} from './scope-selector.utils';\nimport { SelectBooksLocalizedStrings } from './select-books.types';\nimport { SelectBooksPicker } from './select-books-picker.component';\nimport SectionButton from './section-button.component';\n\n/** Maximum number of badges to show before collapsing into a \"+X more\" badge */\nconst VISIBLE_BADGES_COUNT = 5;\n/** Maximum number of badges that can be shown without triggering the collapse */\nconst MAX_VISIBLE_BADGES = 6;\n\ntype SelectBooksProps = {\n /**\n * Information about available books, formatted as a 123 character long string as defined in a\n * projects BooksPresent setting\n */\n availableBookInfo: string;\n /** Array of currently selected book IDs */\n selectedBookIds: string[];\n /** Callback function that is executed when the book selection changes */\n onChangeSelectedBookIds: (books: string[]) => void;\n /** Object containing the localized strings for the component */\n localizedStrings: SelectBooksLocalizedStrings;\n /**\n * Optional map of localized book IDs/short names and full names. Key is the (English) book ID,\n * value contains localized versions of the ID and full book name\n */\n localizedBookNames?: Map;\n /**\n * Optional explanations, by section, for why that section has no available books. Each is shown\n * as a tooltip on that section's quick-select button while it is disabled. Supply one for any\n * section whose books the consumer withholds deliberately, so the disabled button reads as \"not\n * searched here\" rather than \"this project has none\".\n */\n disabledSectionExplanations?: Partial>;\n};\n\n/**\n * A component for selecting multiple books from the Bible canon. It provides:\n *\n * - Quick selection buttons for major sections (OT, NT, DC, Extra)\n * - A searchable dropdown with all available books (see {@link SelectBooksPicker})\n * - Support for shift-click range selection\n * - Visual feedback with badges showing selected books\n */\nexport function SelectBooks({\n availableBookInfo,\n selectedBookIds,\n onChangeSelectedBookIds,\n localizedStrings,\n localizedBookNames,\n disabledSectionExplanations,\n}: SelectBooksProps) {\n const moreText = localizedStrings['%webView_book_selector_more%'];\n\n const availableBooksIds = useMemo(\n () => getAvailableBookIds(availableBookInfo),\n [availableBookInfo],\n );\n\n const toggleSection = useCallback(\n (section: Section) => {\n const sectionBooks = getBooksForSection(availableBooksIds, section).map((bookId) => bookId);\n onChangeSelectedBookIds(\n isSectionFullySelected(availableBooksIds, section, selectedBookIds)\n ? selectedBookIds.filter((shortname) => !sectionBooks.includes(shortname))\n : [...new Set([...selectedBookIds, ...sectionBooks])],\n );\n },\n [selectedBookIds, onChangeSelectedBookIds, availableBooksIds],\n );\n\n return (\n
    \n
    \n {Object.values(Section).map((section) => {\n return (\n \n );\n })}\n
    \n\n \n\n {selectedBookIds.length > 0 && (\n
    \n {selectedBookIds\n .slice(\n 0,\n selectedBookIds.length === MAX_VISIBLE_BADGES\n ? MAX_VISIBLE_BADGES\n : VISIBLE_BADGES_COUNT,\n )\n .map((bookId) => (\n \n {getLocalizedBookName(bookId, localizedBookNames)}\n \n ))}\n {selectedBookIds.length > MAX_VISIBLE_BADGES && (\n {`+${selectedBookIds.length - VISIBLE_BADGES_COUNT} ${moreText}`}\n )}\n
    \n )}\n
    \n );\n}\n","import { LocalizedStringValue } from 'platform-bible-utils';\n\n/**\n * Object containing all keys used for localization in the SelectBooks component. If you're using\n * this component in an extension, you can pass it into the useLocalizedStrings hook to easily\n * obtain the localized strings and pass them into the localizedStrings prop of this component\n */\nexport const SELECT_BOOKS_STRING_KEYS = Object.freeze([\n '%webView_book_selector_books_selected%',\n '%webView_book_selector_select_books%',\n '%webView_book_selector_search_books%',\n '%webView_book_selector_select_all%',\n '%webView_book_selector_clear_all%',\n '%webView_book_selector_no_book_found%',\n '%webView_book_selector_more%',\n '%scripture_section_ot_long%',\n '%scripture_section_ot_short%',\n '%scripture_section_nt_long%',\n '%scripture_section_nt_short%',\n '%scripture_section_dc_long%',\n '%scripture_section_dc_short%',\n '%scripture_section_extra_long%',\n '%scripture_section_extra_short%',\n] as const);\n\n/** Type definition for the localized strings used in the SelectBooks component */\nexport type SelectBooksLocalizedStrings = {\n [selectBooksKey in (typeof SELECT_BOOKS_STRING_KEYS)[number]]?: LocalizedStringValue;\n};\n","import { SelectBooks } from '@/components/advanced/scope-selector/select-books.component';\nimport { SELECT_BOOKS_STRING_KEYS } from '@/components/advanced/scope-selector/select-books.types';\nimport { BookChapterControl } from '@/components/advanced/book-chapter-control/book-chapter-control.component';\nimport { BookChapterControlLocalizedStrings } from '@/components/advanced/book-chapter-control/book-chapter-control.types';\nimport { Button } from '@/components/shadcn-ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/shadcn-ui/dialog';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/shadcn-ui/dropdown-menu';\nimport { Label } from '@/components/shadcn-ui/label';\nimport { PopoverPortalContainerProvider } from '@/components/shadcn-ui/popover';\nimport { RadioGroup, RadioGroupItem } from '@/components/shadcn-ui/radio-group';\nimport { Scope, ScopeWithRange } from '@/components/utils/scripture.util';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { SerializedVerseRef } from '@sillsdev/scripture';\nimport { Check, ChevronDown } from 'lucide-react';\nimport {\n defaultScrRef,\n formatScrRef,\n formatScrRefRange,\n LocalizedStringValue,\n Section,\n} from 'platform-bible-utils';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\n/**\n * Object containing all keys used for localization in this component. If you're using this\n * component in an extension, you can pass it into the useLocalizedStrings hook to easily obtain the\n * localized strings and pass them into the localizedStrings prop of this component\n */\nexport const SCOPE_SELECTOR_STRING_KEYS = Object.freeze([\n '%webView_scope_selector_selected_text%',\n '%webView_scope_selector_verse%',\n '%webView_scope_selector_chapter%',\n '%webView_scope_selector_book%',\n '%webView_scope_selector_current_verse%',\n '%webView_scope_selector_current_chapter%',\n '%webView_scope_selector_current_book%',\n '%webView_scope_selector_choose_books%',\n '%webView_scope_selector_scope%',\n '%webView_scope_selector_select_books%',\n '%webView_scope_selector_range%',\n '%webView_scope_selector_select_range%',\n '%webView_scope_selector_range_start%',\n '%webView_scope_selector_range_end%',\n '%webView_scope_selector_ok%',\n '%webView_scope_selector_cancel%',\n '%webView_scope_selector_navigate%',\n // The ScopeSelector renders a SelectBooks component, so it also needs its\n // localized strings (these cover the former inline book_selector and\n // scripture_section keys).\n ...SELECT_BOOKS_STRING_KEYS,\n] as const);\n\n/** Type definition for the localized strings used in this component */\nexport type ScopeSelectorLocalizedStrings = {\n [localizedInventoryKey in (typeof SCOPE_SELECTOR_STRING_KEYS)[number]]?: LocalizedStringValue;\n};\n\n/**\n * Gets the localized value for the provided key\n *\n * @param strings Object containing localized string\n * @param key Key for a localized string\n * @returns The localized value for the provided key, if available. Returns the key if no localized\n * value is available\n */\nconst localizeString = (\n strings: ScopeSelectorLocalizedStrings,\n key: keyof ScopeSelectorLocalizedStrings,\n) => {\n return strings[key] ?? key;\n};\n\n/** Visual layout variant for the scope options. */\nexport type ScopeSelectorVariant = 'radio' | 'dropdown';\n\n/**\n * Keys that submit the start reference in the range picker in addition to Enter. Space and `-` are\n * the natural separators a user types between a start and end reference, so we treat them as \"I'm\n * done with the start, take me to the end\" signals.\n */\nconst RANGE_START_SUBMIT_KEYS = Object.freeze([' ', '-']);\n\n/** Props for configuring the ScopeSelector component */\ninterface ScopeSelectorProps {\n /** The current scope selection */\n scope: ScopeWithRange;\n\n /**\n * Optional array of scopes that should be available in the selector. If not provided, all scopes\n * will be shown as defined in the ScopeWithRange type\n */\n availableScopes?: ScopeWithRange[];\n\n /** Callback function that is executed when the user changes the scope selection */\n onScopeChange: (scope: ScopeWithRange) => void;\n\n /**\n * Information about available books, formatted as a 123 character long string as defined in a\n * projects BooksPresent setting\n */\n availableBookInfo: string;\n\n /** Array of currently selected book IDs */\n selectedBookIds: string[];\n\n /** Callback function that is executed when the user changes the book selection */\n onSelectedBookIdsChange: (books: string[]) => void;\n\n /**\n * Object with all localized strings that the component needs to work well across multiple\n * languages. When using this component with Platform.Bible, you can import\n * `SCOPE_SELECTOR_STRING_KEYS` from this library, pass it in to the Platform's localization hook,\n * and pass the localized keys that are returned by the hook into this prop.\n */\n localizedStrings: ScopeSelectorLocalizedStrings;\n /**\n * Optional map of localized book IDs/short names and full names. Key is the (English) book ID,\n * value contains localized versions of the ID and full book name\n */\n localizedBookNames?: Map;\n /**\n * Optional explanations, by section, for why that section has no available books. Forwarded to\n * {@link SelectBooks} and shown as a tooltip on that section's disabled quick-select button.\n */\n disabledSectionExplanations?: Partial>;\n /**\n * Optional explanations, by scope, for why that scope cannot be chosen right now. A scope with an\n * entry renders disabled, with its explanation as muted text beneath the option's label. Both\n * variants render it inline rather than as a tooltip: a disabled control — a radio or a Radix\n * menu item — is out of the tab order, so hover- or focus-only affordances reach nobody. Keep\n * explanations short enough to read in a menu row.\n *\n * `'selectedBooks'` and `'range'` are honored in the `'radio'` variant only. In the `'dropdown'`\n * variant those two are menu items that open a dialog rather than scope options, and they ignore\n * an entry here — a consumer that must block them in a dropdown should drop them from\n * {@link ScopeSelectorProps.availableScopes} instead.\n *\n * Only for a scope that is genuinely unavailable in the CURRENT state — a scope the consumer\n * never offers at all belongs out of {@link ScopeSelectorProps.availableScopes} instead. Disabling\n * is only an affordance: the consumer still has to reject the query itself, since a scope already\n * selected when the state changed never passes through a disabled control.\n */\n disabledScopeExplanations?: Partial>;\n /** Optional ID that is applied to the root element of this component */\n id?: string;\n\n /**\n * Controls how the scope options are presented. `'radio'` (default) renders a vertical list of\n * radio buttons. `'dropdown'` renders a single Select trigger whose popover contains the\n * options.\n */\n variant?: ScopeSelectorVariant;\n\n /**\n * The start of the verse range. Only used when `scope === 'range'`. Defaults to `defaultScrRef`\n * (GEN 1:1) if neither this nor `currentScrRef` is provided.\n */\n rangeStart?: SerializedVerseRef;\n /**\n * The end of the verse range. Only used when `scope === 'range'`. Every time the user submits a\n * new `rangeStart`, `onRangeEndChange` is also fired with that same reference so the end mirrors\n * the start; the user is free to narrow the end afterward. Defaults to `defaultScrRef` (GEN 1:1)\n * if neither this nor `currentScrRef` is provided.\n */\n rangeEnd?: SerializedVerseRef;\n /** Callback when the range start reference changes. Required to make the range UI functional. */\n onRangeStartChange?: (scrRef: SerializedVerseRef) => void;\n /** Callback when the range end reference changes. Required to make the range UI functional. */\n onRangeEndChange?: (scrRef: SerializedVerseRef) => void;\n /**\n * Optional current scripture reference. When provided and no explicit `rangeStart` or `rangeEnd`\n * is supplied, it is used as the initial value for the range controls.\n */\n currentScrRef?: SerializedVerseRef;\n /**\n * Optional callback fired when the user picks a new scripture reference from the \"Navigate\"\n * footer entry at the bottom of the dropdown variant. Provide this alongside `currentScrRef` (and\n * using `variant=\"dropdown\"`) to surface the footer button — a BookChapterControl picker prefixed\n * with a \"Navigate\" headline and the current reference. Without this callback the footer is not\n * rendered.\n */\n onCurrentScrRefChange?: (scrRef: SerializedVerseRef) => void;\n /**\n * Optional localized strings passed to the range BCV controls. When omitted, the BCV controls\n * will fall back to their internal defaults.\n */\n bookChapterControlLocalizedStrings?: BookChapterControlLocalizedStrings;\n /**\n * Optional callback returning the number of verses for a given book and chapter. When provided,\n * the range BCV controls enable verse selection. See `BookChapterControlProps.getEndVerse`.\n */\n getEndVerse?: (bookId: string, chapterNum: number) => number;\n /**\n * When true, suppresses the \"Scope\" label rendered above the trigger. Useful for compact\n * placements (e.g. inside a tab toolbar) where the trigger speaks for itself and the extra\n * vertical space pushes the trigger off-screen.\n */\n hideLabel?: boolean;\n /**\n * Additional Tailwind classes applied to the trigger button. Use this to control the trigger\n * height in compact contexts (e.g. `'tw:h-8'` to align with other toolbar controls).\n */\n buttonClassName?: string;\n}\n\n/**\n * A component that allows users to select the scope of their search or operation. Available scopes\n * are defined in the ScopeWithRange type. When 'selectedBooks' is chosen as the scope, a\n * SelectBooks component is displayed to allow users to choose specific books. When 'range' is\n * chosen, two BookChapterControl pickers are displayed for selecting the start and end verse of the\n * range.\n */\nexport function ScopeSelector({\n scope,\n availableScopes,\n onScopeChange,\n availableBookInfo,\n selectedBookIds,\n onSelectedBookIdsChange,\n localizedStrings,\n localizedBookNames,\n disabledSectionExplanations,\n disabledScopeExplanations,\n id,\n variant = 'radio',\n rangeStart,\n rangeEnd,\n onRangeStartChange,\n onRangeEndChange,\n currentScrRef,\n onCurrentScrRefChange,\n bookChapterControlLocalizedStrings,\n getEndVerse,\n hideLabel = false,\n buttonClassName,\n}: ScopeSelectorProps) {\n const selectedTextText = localizeString(\n localizedStrings,\n '%webView_scope_selector_selected_text%',\n );\n const verseText = localizeString(localizedStrings, '%webView_scope_selector_verse%');\n const chapterText = localizeString(localizedStrings, '%webView_scope_selector_chapter%');\n const bookText = localizeString(localizedStrings, '%webView_scope_selector_book%');\n const currentVerseText = localizeString(\n localizedStrings,\n '%webView_scope_selector_current_verse%',\n );\n const currentChapterText = localizeString(\n localizedStrings,\n '%webView_scope_selector_current_chapter%',\n );\n const currentBookText = localizeString(localizedStrings, '%webView_scope_selector_current_book%');\n const chooseBooksText = localizeString(localizedStrings, '%webView_scope_selector_choose_books%');\n const scopeText = localizeString(localizedStrings, '%webView_scope_selector_scope%');\n const selectBooksText = localizeString(localizedStrings, '%webView_scope_selector_select_books%');\n const rangeText = localizeString(localizedStrings, '%webView_scope_selector_range%');\n const selectRangeText = localizeString(localizedStrings, '%webView_scope_selector_select_range%');\n const rangeStartText = localizeString(localizedStrings, '%webView_scope_selector_range_start%');\n const rangeEndText = localizeString(localizedStrings, '%webView_scope_selector_range_end%');\n const okText = localizeString(localizedStrings, '%webView_scope_selector_ok%');\n const cancelText = localizeString(localizedStrings, '%webView_scope_selector_cancel%');\n const navigateText = localizeString(localizedStrings, '%webView_scope_selector_navigate%');\n\n // For the verse / chapter / book scopes we surface the current scripture reference alongside the\n // base label (e.g. \"Verse: GEN 1:1\"). The suffix is kept separate from the base label so the\n // rendering can style it differently (muted foreground). When no `currentScrRef` is provided we\n // fall through to just the bare label.\n const getScrRefSuffix = (scopeValue: Scope): string | undefined => {\n if (!currentScrRef) return undefined;\n const upperBook = currentScrRef.book.toUpperCase();\n switch (scopeValue) {\n case 'verse':\n return formatScrRef(currentScrRef, 'id');\n case 'chapter':\n return `${upperBook} ${currentScrRef.chapterNum}`;\n case 'book':\n return upperBook;\n default:\n return undefined;\n }\n };\n\n // Each option carries a `label` (used in the trigger button) and an optional `dropdownLabel`\n // (used in the dropdown menu items). For verse / chapter / book the dropdown form prefixes\n // \"Current\" so users browsing the menu see the semantics up front; the trigger stays terse\n // so the selected value stays compact (\"Verse: GEN 1:1\" rather than \"Current verse: GEN 1:1\").\n const SCOPE_OPTIONS: Array<{\n value: ScopeWithRange;\n label: string;\n dropdownLabel?: string;\n scrRefSuffix?: string;\n id: string;\n }> = [\n { value: 'selectedText', label: selectedTextText, id: 'scope-selected-text' },\n {\n value: 'verse',\n label: verseText,\n dropdownLabel: currentVerseText,\n scrRefSuffix: getScrRefSuffix('verse'),\n id: 'scope-verse',\n },\n {\n value: 'chapter',\n label: chapterText,\n dropdownLabel: currentChapterText,\n scrRefSuffix: getScrRefSuffix('chapter'),\n id: 'scope-chapter',\n },\n {\n value: 'book',\n label: bookText,\n dropdownLabel: currentBookText,\n scrRefSuffix: getScrRefSuffix('book'),\n id: 'scope-book',\n },\n { value: 'selectedBooks', label: chooseBooksText, id: 'scope-selected' },\n { value: 'range', label: rangeText, id: 'scope-range' },\n ];\n\n // Renders a scope option label with its optional ScrRef suffix styled in muted foreground. Kept\n // inline so every render site (dropdown items, radio labels, trigger content) is visually\n // consistent. `hideScrRef` is true only for the trigger in the dropdown variant when the\n // trigger width is too narrow to fit both the label and the reference — the dropdown menu\n // items and radio labels always show the suffix.\n const renderScopeLabel = (\n label: string,\n scrRefSuffix: string | undefined,\n hideScrRef = false,\n ) => (\n <>\n {label}\n {scrRefSuffix && !hideScrRef && (\n : {scrRefSuffix}\n )}\n \n );\n\n const displayedScopes = availableScopes\n ? SCOPE_OPTIONS.filter((option) => availableScopes.includes(option.value))\n : SCOPE_OPTIONS;\n\n // Both range pickers default to the caller-supplied current scripture reference, falling back\n // to GEN 1:1 when nothing is provided. `rangeStart` / `rangeEnd` always win when explicitly\n // supplied so the component stays controlled.\n const fallbackScrRef = currentScrRef ?? defaultScrRef;\n const resolvedRangeStart = rangeStart ?? fallbackScrRef;\n const resolvedRangeEnd = rangeEnd ?? fallbackScrRef;\n\n const noopScrRefChange = () => {};\n\n // Wrapper around the end BCV, used to find its trigger button so we can programmatically\n // open the end picker after the user submits the start reference. Clicking a DOM node\n // from a callback is a bit blunt, but BCV doesn't expose an imperative API and the\n // trigger is a stable child of this wrapper (a single `\n \n \n \n {simpleScopes.map(({ value, label, dropdownLabel, scrRefSuffix, id: scopeId }) => {\n const disabledExplanation = disabledScopeExplanations?.[value];\n return (\n handleScopeChange(value)}\n data-selected={scope === value ? 'true' : undefined}\n >\n {scope === value && (\n \n \n \n )}\n {/* The explanation renders inline rather than as a tooltip or a `title`:\n Radix drops a disabled item out of the menu's roving focus, so anything\n that surfaces on hover or focus alone is unreachable for exactly the\n keyboard and screen-reader users who need it, and a Tooltip inside\n DropdownMenuContent competes with the menu for the same pointer. Inline\n text needs neither. Only a disabled scope carries it, so the menu keeps\n its normal density whenever nothing is unavailable.\n\n The inner row matters: `renderScopeLabel` returns the label and the\n reference suffix as two siblings, which are laid out as flex items by\n whatever contains them. They are the menu item's own row items without\n this wrapper, so the column here has to re-establish a row around them or\n every reference-derived label in the menu stacks onto two lines.\n\n `tw:min-w-0` lets a long explanation wrap instead of widening the menu\n past `--radix-dropdown-menu-trigger-width`. It is `tw:text-foreground`\n rather than muted because `DropdownMenuItem` already renders a disabled\n item at half opacity, and a muted color under that veil falls below the\n contrast the explanation needs to be readable at all. */}\n \n \n {renderScopeLabel(dropdownLabel ?? label, scrRefSuffix, isDropdownNarrow)}\n \n {disabledExplanation && (\n \n {disabledExplanation}\n \n )}\n \n \n );\n })}\n {(selectedBooksScope || rangeScope) && }\n {selectedBooksScope && (\n openDialogFallback('selectedBooks')}\n data-selected={scope === 'selectedBooks' ? 'true' : undefined}\n >\n {renderDialogLauncherCheck('selectedBooks')}\n {/* Trailing ellipsis — standard affordance for a menu item that opens a\n dialog. */}\n {`${selectedBooksScope.label}…`}\n \n )}\n {rangeScope && (\n openDialogFallback('range')}\n data-selected={scope === 'range' ? 'true' : undefined}\n >\n {renderDialogLauncherCheck('range')}\n {`${rangeScope.label}…`}\n \n )}\n {/* Navigate footer: a \"Navigate\" DropdownMenuLabel headline above a BCV\n styled as a full-width ghost menu-item-looking button showing the\n current reference. Only rendered when the caller wires up\n `onCurrentScrRefChange`, since the footer's whole purpose is to\n change the current ref. The BCV's own Popover portals inside\n `DropdownMenuContent` thanks to the enclosing\n `PopoverPortalContainerProvider`, and the row is wrapped in a\n DropdownMenuItem so arrow-key navigation can reach it alongside the\n other menu entries (see onSelect / pointer-down guard below). */}\n {onCurrentScrRefChange && (\n <>\n \n {/* Match cmdk's `[cmdk-group-heading]` styling used elsewhere in\n the app (see `CommandGroup`): xs muted-foreground medium-weight\n text with compact padding. Applied via className override on\n DropdownMenuLabel so we still get its semantic role while\n visually aligning with in-app command-palette section headings. */}\n \n {navigateText}\n \n {\n // Preserve the open dropdown menu: activating this row should\n // open the BCV popover, not dismiss the outer menu the way a\n // normal menu item would.\n event.preventDefault();\n // Radix fires onSelect for both mouse pointerdown and keyboard\n // Enter/Space. For a mouse click on the BCV button the button's\n // own onClick already opened the popover; re-invoking click()\n // here would toggle it back closed. The capture-phase handler\n // below flags pointer activations so we can skip re-entry in\n // that case; keyboard activations fall through and trigger the\n // BCV via its trigger button.\n if (navBcvPointerActivatedRef.current) {\n navBcvPointerActivatedRef.current = false;\n return;\n }\n // When the BCV popover is already open, Space / Enter on the\n // menu item (or on its descendant trigger button, since React\n // synthetic events bubble through the virtual tree to the\n // DropdownMenuItem) would otherwise re-click the trigger and\n // toggle the popover shut. Treat the activation as a no-op in\n // that state — the picker is already visible.\n if (isNavBcvOpenRef.current) return;\n navBcvWrapperRef.current?.querySelector('button')?.click();\n }}\n >\n {\n // Pointer activations that land inside the BCV button are\n // handled by the button's own onClick; remember that so the\n // subsequent DropdownMenuItem onSelect skips the programmatic\n // re-click. Padding-only clicks fall through to onSelect so\n // the row still opens BCV when the user clicks near the edge.\n const target = e.target instanceof HTMLElement ? e.target : undefined;\n if (!target?.closest('button')) return;\n navBcvPointerActivatedRef.current = true;\n // Guarantee the flag doesn't outlive this gesture: click /\n // onSelect fire synchronously in the same frame as the\n // pointer gesture, so onSelect still sees the true value;\n // if the user cancels the click (drag-away), the RAF reset\n // keeps a later keyboard Enter from being wrongly skipped.\n requestAnimationFrame(() => {\n navBcvPointerActivatedRef.current = false;\n });\n }}\n >\n {\n isNavBcvOpenRef.current = open;\n }}\n onCloseAutoFocus={(event) => {\n // By default Radix Popover restores focus to the BCV trigger\n // button — which lives inside this DropdownMenuItem. The outer\n // DropdownMenu only routes arrow-key navigation to focused\n // DropdownMenuItems, so leaving focus on the nested button\n // dead-ends keyboard navigation (arrow keys would instead\n // render the button's focus ring). Intercept the restore and\n // pull focus up to the menu item so the menu's roving focus\n // picks up from there.\n event.preventDefault();\n navMenuItemRef.current?.focus();\n }}\n // Modal so the picker gets its own FocusScope: opening BCV\n // from inside the modal DropdownMenu would otherwise collide\n // with the dropdown's focus trap whenever BCV's internal\n // view transitions (books → chapters → verses) cause a focus\n // blip, and the dropdown would yank focus out mid-transition\n // causing the popover to close before the user can select\n // a chapter.\n modal\n // Override BCV's default compact trigger into a full-width\n // left-aligned row that looks at home inside a menu list, and\n // drop the button's `tw:font-medium` so the reference reads at\n // normal weight alongside the other menu items. tailwind-merge's\n // last-wins conflict resolution picks these over BCV's defaults.\n className=\"tw:w-full tw:min-w-0 tw:max-w-none tw:justify-between tw:px-2 tw:font-normal\"\n triggerContent={\n <>\n \n {formatScrRef(currentScrRef ?? defaultScrRef, 'id')}\n \n \n \n }\n />\n \n \n \n )}\n \n \n \n ) : (\n \n {displayedScopes.map(({ value, label, scrRefSuffix, id: scopeId }) => {\n const disabledExplanation = disabledScopeExplanations?.[value];\n // The explanation renders inline rather than through a focusable tooltip wrapper.\n // A disabled radio is not in the tab order, so a wrapper would have to take a tab\n // stop of its own to host the tooltip — and that puts a `role=\"group\"`, tabbable\n // element between the `radiogroup` and its `radio` children, which is not an owned\n // role the grouping allows and adds stops to a roving-focus group that specifies\n // exactly one. Inline text needs neither focus nor hover, so it reaches every user\n // without touching the group's semantics, and it matches what the dropdown variant\n // renders for the same reason.\n return (\n
    \n
    \n \n \n
    \n {disabledExplanation && (\n // Indented to clear the radio so it reads as belonging to this row's label.\n \n {disabledExplanation}\n \n )}\n
    \n );\n })}\n \n )}\n \n\n {/* In the radio variant, render the picker inline below the scope chooser. In the dropdown\n variant, the picker lives inside a modal dialog (see the Dialog blocks below). */}\n {variant === 'radio' && scope === 'selectedBooks' && (\n
    \n \n {bookSelectorBlock}\n
    \n )}\n\n {variant === 'radio' && scope === 'range' && rangeBlock}\n\n {/* Dropdown variant: selectedBooks and range entries always open in a modal dialog\n (no flyout submenu path). `tw:pe-8` on the header reserves space for the\n absolute-positioned close button so it can't overlap a long title. */}\n {variant === 'dropdown' && selectedBooksScope && (\n \n {\n if (booksDialogEl?.querySelector('[data-state=\"open\"]')) {\n event.preventDefault();\n }\n }}\n >\n \n \n {chooseBooksText}\n \n {bookSelectorBlock}\n \n \n \n \n \n \n \n )}\n {variant === 'dropdown' && rangeScope && (\n \n {\n if (rangeDialogEl?.querySelector('[data-state=\"open\"]')) {\n event.preventDefault();\n }\n }}\n >\n \n \n {selectRangeText}\n \n {rangeBlock}\n \n \n \n \n \n \n \n )}\n \n );\n}\n\nexport default ScopeSelector;\n","import {\n getLocalizeKeyForScrollGroupId,\n LanguageStrings,\n ScrollGroupId,\n} from 'platform-bible-utils';\nimport { DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS } from 'platform-bible-utils/experimental';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/shadcn-ui/select';\nimport { Direction, readDirection } from '@/utils/dir-helper.util';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { Z_INDEX_ABOVE_DOCK } from '@/components/z-index';\n\nexport type ScrollGroupSelectorProps = {\n /**\n * List of scroll group ids to show to the user. Either a `ScrollGroupId` or `undefined` for no\n * scroll group\n */\n availableScrollGroupIds: (ScrollGroupId | undefined)[];\n /** Currently selected scroll group id. `undefined` for no scroll group */\n scrollGroupId: ScrollGroupId | undefined;\n /** Callback function run when the user tries to change the scroll group id */\n onChangeScrollGroupId: (newScrollGroupId: ScrollGroupId | undefined) => void;\n /**\n * Localized strings to use for displaying scroll group ids. Must be an object whose keys are\n * `getLocalizeKeyForScrollGroupId(scrollGroupId)` for all scroll group ids (and `undefined` if\n * included) in {@link ScrollGroupSelectorProps.availableScrollGroupIds} and whose values are the\n * localized strings to use for those scroll group ids.\n *\n * Defaults to English localizations of English alphabet for scroll groups 0-25 (e.g. 0 is A) and\n * Ø for `undefined`. Will fill in any that are not provided with these English localizations.\n * Also, if any values match the keys, the English localization will be used. This is useful in\n * case you want to pass in a temporary version of the localized strings while your localized\n * strings load.\n *\n * @example\n *\n * ```typescript\n * const myScrollGroupIdLocalizedStrings = {\n * [getLocalizeKeyForScrollGroupId('undefined')]: 'Ø',\n * [getLocalizeKeyForScrollGroupId(0)]: 'A',\n * [getLocalizeKeyForScrollGroupId(1)]: 'B',\n * [getLocalizeKeyForScrollGroupId(2)]: 'C',\n * [getLocalizeKeyForScrollGroupId(3)]: 'D',\n * [getLocalizeKeyForScrollGroupId(4)]: 'E',\n * };\n * ```\n *\n * @example\n *\n * ```tsx\n * const availableScrollGroupIds = [undefined, 0, 1, 2, 3, 4];\n *\n * const localizeKeys = getLocalizeKeysForScrollGroupIds();\n *\n * const [localizedStrings] = useLocalizedStrings(localizeKeys);\n *\n * ...\n *\n * \n * ```\n */\n localizedStrings?: LanguageStrings;\n\n /** Size of the scroll group dropdown button. Defaults to 'sm' */\n size?: 'default' | 'sm';\n\n /** Additional css classes to help with unique styling */\n className?: string;\n\n /** Optional id for the select element */\n id?: string;\n\n /** When true, the selector is disabled */\n disabled?: boolean;\n};\n\n/** Selector component for choosing a scroll group */\nexport function ScrollGroupSelector({\n availableScrollGroupIds,\n scrollGroupId,\n onChangeScrollGroupId,\n localizedStrings = {},\n size = 'sm',\n className,\n id,\n disabled,\n}: ScrollGroupSelectorProps) {\n const localizedStringsDefaulted = {\n ...DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS,\n ...Object.fromEntries(\n Object.entries(localizedStrings).map(\n ([localizedStringKey, localizedStringValue]: [string, string]) => [\n localizedStringKey,\n localizedStringKey === localizedStringValue &&\n localizedStringKey in DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS\n ? DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS[localizedStringKey]\n : localizedStringValue,\n ],\n ),\n ),\n };\n\n const dir: Direction = readDirection();\n\n return (\n \n onChangeScrollGroupId(\n newScrollGroupString === 'undefined' ? undefined : parseInt(newScrollGroupString, 10),\n )\n }\n disabled={disabled}\n >\n \n \n \n \n {availableScrollGroupIds.map((scrollGroupOptionId) => (\n \n {localizedStringsDefaulted[getLocalizeKeyForScrollGroupId(scrollGroupOptionId)]}\n \n ))}\n \n \n );\n}\n\nexport default ScrollGroupSelector;\n","import { PropsWithChildren } from 'react';\nimport { Separator } from '@/components/shadcn-ui/separator';\n\n/** Props for the SettingsList component, currently just children */\ntype SettingsListProps = PropsWithChildren;\n\n/**\n * SettingsList component is a wrapper for list items. Rendered with a formatted div\n *\n * @deprecated Jul 18 2025. This component is no longer supported or tested. Use of this component\n * is discouraged and it may be removed in the future.\n * @param children To populate the list with\n * @returns Formatted div encompassing the children\n */\nexport function SettingsList({ children }: SettingsListProps) {\n return
    {children}
    ;\n}\n\n/** Props for SettingsListItem component */\ntype SettingsListItemProps = PropsWithChildren & {\n /** Primary text of the list item */\n primary: string;\n\n /** Optional text of the list item */\n secondary?: string | undefined;\n\n /** Optional boolean to display a message if the children aren't loaded yet. Defaults to false */\n isLoading?: boolean;\n\n /** Optional message to display if isLoading */\n loadingMessage?: string;\n};\n\n/**\n * SettingsListItem component is a common list item. Rendered with a formatted div\n *\n * @deprecated Jul 18 2025. This component is no longer supported or tested. Use of this component\n * is discouraged and it may be removed in the future.\n * @param SettingsListItemProps\n * @returns Formatted div encompassing the list item content\n */\nexport function SettingsListItem({\n primary,\n secondary,\n children,\n isLoading = false,\n loadingMessage,\n}: SettingsListItemProps) {\n return (\n
    \n
    \n

    {primary}

    \n

    \n {secondary}\n

    \n
    \n\n {isLoading ? (\n

    {loadingMessage}

    \n ) : (\n
    {children}
    \n )}\n
    \n );\n}\n\n/** Props for SettingsListHeader component */\ntype SettingsListHeaderProps = {\n /** The primary text of the list header */\n primary: string;\n\n /** Optional secondary text of the list header */\n secondary?: string | undefined;\n\n /** Optional boolean to include a separator underneath the secondary text. Defaults to false */\n includeSeparator?: boolean;\n};\n\n/**\n * SettingsListHeader component displays text above the list\n *\n * @deprecated Jul 18 2025. This component is no longer supported or tested. Use of this component\n * is discouraged and it may be removed in the future.\n * @param SettingsListHeaderProps\n * @returns Formatted div with list header content\n */\nexport function SettingsListHeader({\n primary,\n secondary,\n includeSeparator = false,\n}: SettingsListHeaderProps) {\n return (\n
    \n
    \n

    {primary}

    \n

    {secondary}

    \n
    \n {includeSeparator ? : ''}\n
    \n );\n}\n","import {\n ColumnsWithHeaders,\n GroupsInMultiColumnMenu,\n Localized,\n MenuColumnWithHeader,\n MenuGroupDetailsInColumn,\n MenuGroupDetailsInSubMenu,\n MultiColumnMenu,\n} from 'platform-bible-utils';\n\n/**\n * Function that looks up the key of a sub-menu group using the value of it's `menuItem` property.\n *\n * @example\n *\n * ```ts\n * const groups = {\n * 'platform.subMenu': { menuItem: 'platform.subMenuId', order: 1 },\n * 'platform.subSubMenu': { menuItem: 'platform.subSubMenuId', order: 2 },\n * };\n * const id = 'platform.subMenuId';\n * const groupKey = getSubMenuGroupKeyForMenuItemId(groups, id);\n * console.log(groupKey); // Output: 'platform.subMenu'\n * ```\n *\n * @param groups The JSON Object containing the group definitions\n * @param id The value of the `menuItem` property of the group to look up\n * @returns The key of the group that has the `menuItem` property with the value of `id` or\n * `undefined` if no such group exists.\n */\nexport function getSubMenuGroupKeyForMenuItemId(\n groups: Localized,\n id: string,\n): string | undefined {\n return Object.entries(groups).find(\n ([, value]) => 'menuItem' in value && value.menuItem === id,\n )?.[0];\n}\n\n/** A column of a multi-column menu, paired with the key it is stored under */\nexport type MenuColumnEntry = {\n /** Key of the column */\n columnKey: string;\n /** The column itself */\n column: Localized;\n};\n\n/**\n * Gets the columns of a multi-column menu, sorted by `order`.\n *\n * @param columns The localized menu's columns\n * @returns The columns, sorted by `order`\n */\nexport function getSortedMenuColumns(columns: Localized): MenuColumnEntry[] {\n return (\n Object.entries(columns)\n // `columns` also holds boolean flags (`isExtensible`, `isExperimental`); skip them\n .flatMap(([columnKey, column]) => (typeof column === 'object' ? [{ columnKey, column }] : []))\n .sort((a, b) => a.column.order - b.column.order)\n );\n}\n\n/**\n * Whether a group's items render under `columnOrSubMenuKey`: either the group names it as its\n * `column`, or the group is the one keyed by it, which is how a submenu addresses its own group.\n *\n * `TabDropdownMenu` picks a column's groups with this and {@link getMenuSectionsWithItems} decides\n * which columns have something to show with it, so \"this column renders nothing\" can never mean two\n * different things.\n *\n * @param groupKey The key the group is stored under\n * @param group The group itself\n * @param columnOrSubMenuKey The key of the column or submenu being rendered\n * @returns `true` if the group's items belong under `columnOrSubMenuKey`\n */\nexport function isGroupUnderColumnOrSubMenu(\n groupKey: string,\n group: Localized,\n columnOrSubMenuKey: string,\n): boolean {\n return (\n ('column' in group && group.column === columnOrSubMenuKey) || groupKey === columnOrSubMenuKey\n );\n}\n\n/** A column of a multi-column menu that has something to show */\nexport type MenuSection = {\n /** Key of the column */\n columnKey: string;\n /** The column's localized label */\n label: string;\n};\n\n/**\n * Gets the columns of a multi-column menu that directly contain at least one item, sorted by\n * `order`. A submenu item counts even when its submenu is empty.\n *\n * @param menuData The localized menu\n * @returns The columns that directly contain items, sorted by `order`\n */\nexport function getMenuSectionsWithItems(menuData: Localized): MenuSection[] {\n const groupKeysWithItems = new Set(menuData.items.map((item) => item.group));\n const groupsWithItems = Object.entries(menuData.groups).filter(([groupKey]) =>\n groupKeysWithItems.has(groupKey),\n );\n return getSortedMenuColumns(menuData.columns)\n .filter(({ columnKey }) =>\n groupsWithItems.some(([groupKey, group]) =>\n isGroupUnderColumnOrSubMenu(groupKey, group, columnKey),\n ),\n )\n .map(({ columnKey, column }) => ({ columnKey, label: column.label }));\n}\n","import { cn } from '@/utils/shadcn-ui/utils';\n\ntype MenuItemIconProps = {\n /** The icon to display */\n icon: string;\n /** The label of the menu item */\n menuLabel: string;\n /** Whether the icon is leading or trailing */\n leading?: boolean;\n};\n\nfunction MenuItemIcon({ icon, menuLabel, leading }: MenuItemIconProps) {\n return icon ? (\n \n ) : undefined;\n}\n\nexport default MenuItemIcon;\n","import {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from '@/components/shadcn-ui/dropdown-menu';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/shadcn-ui/tooltip';\nimport { MenuIcon } from 'lucide-react';\nimport {\n GroupsInMultiColumnMenu,\n Localized,\n MenuItemContainingCommand,\n MenuItemContainingSubmenu,\n MultiColumnMenu,\n} from 'platform-bible-utils';\nimport { Fragment, ReactNode, useId, useRef } from 'react';\nimport { Button } from '@/components/shadcn-ui/button';\nimport { Z_INDEX_ABOVE_DOCK } from '@/components/z-index';\nimport {\n getLastInteractionModality,\n hideFocusRing,\n QUIET_FOCUS_RING_SUPPRESSION,\n showFocusRing,\n} from '@/utils/focus.util';\nimport { useInteractionModality } from '@/hooks/use-interaction-modality.hook';\nimport {\n getMenuSectionsWithItems,\n getSubMenuGroupKeyForMenuItemId,\n isGroupUnderColumnOrSubMenu,\n} from './menu.util';\nimport { SelectMenuItemHandler } from './platform-menubar.component';\nimport MenuItemIcon from './menu-icon.component';\n\nconst getGroupContent = (\n groups: Localized,\n items: Localized<(MenuItemContainingCommand | MenuItemContainingSubmenu)[]>,\n columnOrSubMenuKey: string | undefined,\n onSelectMenuItem: SelectMenuItemHandler,\n) => {\n if (!columnOrSubMenuKey) return undefined;\n\n const sortedGroupsForColumn = Object.entries(groups)\n .filter(([key, group]) => isGroupUnderColumnOrSubMenu(key, group, columnOrSubMenuKey))\n .sort(([, a], [, b]) => a.order - b.order);\n\n return sortedGroupsForColumn.flatMap(([groupKey]) => {\n const groupItems = items\n .filter((item) => item.group === groupKey)\n .sort((a, b) => a.order - b.order)\n .map((item: Localized) => {\n return (\n \n \n {'command' in item ? (\n {\n // Since the item has a command, we know it is a MenuItemContainingCommand.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n onSelectMenuItem(item as MenuItemContainingCommand);\n }}\n >\n {item.iconPathBefore && (\n \n )}\n {item.label}\n {item.iconPathAfter && (\n \n )}\n {item.shortcut && {item.shortcut}}\n \n ) : (\n \n {item.label}\n\n \n \n {getGroupContent(\n groups,\n items,\n getSubMenuGroupKeyForMenuItemId(groups, item.id),\n onSelectMenuItem,\n )}\n \n \n \n )}\n \n {item.tooltip && {item.tooltip}}\n \n );\n });\n\n return groupItems;\n });\n};\n\nexport type TabDropdownMenuProps = {\n /** The handler to use for menu commands */\n onSelectMenuItem: SelectMenuItemHandler;\n\n /** The menu data to show on the dropdown menu */\n menuData: Localized;\n\n /** Defines a string value that labels the current element */\n tabLabel: string;\n\n /** Optional icon for the dropdown menu trigger. Defaults to hamburger icon. */\n icon?: ReactNode;\n\n /** Additional css class(es) to help with unique styling of the tab dropdown menu */\n className?: string;\n\n /**\n * Whether to head each section with its column label. Only takes effect when two or more sections\n * have items, since a lone section has nothing to be told apart from.\n *\n * Defaults to `false`, so a menu built by hand keeps its column labels hidden. Platform.Bible's\n * tab chrome — `TabToolbar` and `TabFloatingMenu` — turns it on for the contributed menu data it\n * renders.\n */\n showSectionHeadings?: boolean;\n\n /** Style variant for the app menubar component. */\n variant?: 'default' | 'muted';\n\n buttonVariant?: 'default' | 'ghost' | 'outline' | 'secondary';\n\n /** Optional unique identifier */\n id?: string;\n};\n\n/**\n * Dropdown menu for Platform.Bible menu data. Each column that has items is a section, divided from\n * the next by a line; columns without items are left out. Groups within a column are not\n * distinguished. Items show their tooltip on hover and their `shortcut`, if any, at the end of the\n * row. With `showSectionHeadings`, each section is headed by its column label.\n *\n * A child component can be passed in to show as an icon on the menu trigger button.\n */\nexport default function TabDropdownMenu({\n onSelectMenuItem,\n menuData,\n tabLabel,\n icon,\n className,\n showSectionHeadings = false,\n variant,\n buttonVariant = 'ghost',\n id,\n}: TabDropdownMenuProps) {\n const headingIdPrefix = useId();\n const sections = getMenuSectionsWithItems(menuData);\n const showHeadings = showSectionHeadings && sections.length > 1;\n\n // Radix restores focus to the trigger on every close, and the tab order depends on that. The focus\n // ring does not belong there after a pointer close, though — it would sit on a button the pointer\n // has long left. Mark the trigger so CSS hides the ring, and clear the mark on the next keydown so\n // keyboard users get it back.\n // Only the tab menus behave this way; every other menu keeps Radix's default.\n // TODO(PT-4727): Lift this into DropdownMenuContent so all menus close alike, and drop it here.\n useInteractionModality();\n // `null` is React's canonical \"not yet attached\" ref value; there's no undefined equivalent in the\n // DOM/ref API (same pattern as navigation-history-buttons' button refs)\n // eslint-disable-next-line no-null/no-null\n const triggerRef = useRef(null);\n const restoreFocusRing = () => showFocusRing(triggerRef.current ?? undefined);\n\n return (\n \n \n \n {icon ?? }\n \n \n {\n // Radix composes this ahead of its own restore, so the mark is in place before it\n // focuses. Deliberately does not preventDefault: Radix's handler also resets the\n // bookkeeping that decides when the trigger must not be refocused at all.\n if (getLastInteractionModality() === 'pointer')\n hideFocusRing(triggerRef.current ?? undefined);\n }}\n >\n {sections.map(({ columnKey, label }, index) => {\n const headingId = `${headingIdPrefix}-${columnKey}`;\n return (\n \n \n {showHeadings && {label}}\n \n {getGroupContent(menuData.groups, menuData.items, columnKey, onSelectMenuItem)}\n \n \n\n {index < sections.length - 1 && }\n \n );\n })}\n \n \n );\n}\n","import { useLayoutEffect, useRef, useState } from 'react';\n\n/**\n * Extra width, in pixels, a container must regain before a shrink step is relaxed. Sub-pixel\n * `ResizeObserver` deliveries around a threshold would otherwise flip a label back and forth while\n * the user drags the window edge. Narrowing is never delayed — only widening.\n */\nexport const SHRINK_STEP_HYSTERESIS_PX = 8;\n\n/**\n * Picks the shrink step for a container width.\n *\n * `thresholds` is ordered widest-first: step 0 applies at or above `thresholds[0]`, step 1 between\n * `thresholds[1]` and `thresholds[0]`, and so on. A width below every threshold yields\n * `thresholds.length`, the narrowest step. A higher number means narrower.\n *\n * @param width Current inline size of the observed container, in pixels.\n * @param thresholds Widest-first list of pixel breakpoints.\n * @param previousStep The step currently applied, used to apply hysteresis when widening. Pass\n * `undefined` when there is no meaningful previous measurement to be sticky about — a first\n * measurement, or the one after the element was hidden — and the width is taken at face value.\n * @returns The step to apply.\n */\nexport function getShrinkStep(\n width: number,\n thresholds: readonly number[],\n previousStep?: number,\n): number {\n const matchedIndex = thresholds.findIndex((threshold) => width >= threshold);\n // `findIndex` returns -1 when the width is below every threshold: that is the narrowest step.\n const nextStep = matchedIndex === -1 ? thresholds.length : matchedIndex;\n\n // Hysteresis damps a drag. With no previous measurement there is no drag, so nothing to damp.\n if (previousStep === undefined) return nextStep;\n\n // Narrowing (or holding) applies at once; only widening waits out the hysteresis band. Delaying a\n // narrow step would leave text visibly clipped for the duration of the drag.\n if (nextStep >= previousStep) return nextStep;\n\n // Widening: relax to the widest step whose band this width actually clears, rather than not at\n // all, so a drag that crosses several bands in one delivery is not left partway. `relaxedStep` is\n // never narrower than `nextStep` — clearing `threshold + 8` implies clearing `threshold` — so it\n // alone is the answer, bounded by the step already applied.\n const relaxedStep = thresholds.findIndex(\n (threshold) => width >= threshold + SHRINK_STEP_HYSTERESIS_PX,\n );\n if (relaxedStep === -1) return previousStep;\n return Math.min(previousStep, relaxedStep);\n}\n\n/**\n * Observes an element's inline size and reports a discrete shrink step for it.\n *\n * Takes the element itself rather than a ref: mutating `ref.current` does not re-run an effect, so\n * a ref-based version would silently never observe a node that attaches after mount. Callers keep\n * the node in state behind a callback ref.\n *\n * Observe the element whose box IS the space available to content — a padding-free inner row rather\n * than a wrapper that reserves space with padding. The measurement is a border box, so padding on\n * the observed element counts as usable width; where a toolbar's reserved space lives can differ\n * between platforms for the same window, which would otherwise make the steps platform-dependent.\n *\n * `thresholds` must be a stable reference (a module-level constant). A fresh array on every render\n * would tear down and rebuild the observer on every render.\n *\n * Hidden views: rc-dock keeps an inactive tab's web view mounted with `display: none`, where the\n * width reads 0 and the step pins to the narrowest value. `ResizeObserver` fires again with the\n * real width when the tab is shown, so no catch-up mechanism is needed — but a width of 0 is not a\n * measurement, and the step taken from it must not make the next real one sticky. Being shown again\n * is a reveal, not a drag, so hysteresis is skipped for that first width. Without this a consumer\n * with a single threshold has no other band to relax into and stays at its narrowest form at a\n * width where it should not be. See `.claude/rules/cross-view-sync-hidden-views.md`.\n *\n * @param element The container to observe, or `undefined` before it mounts.\n * @param thresholds Widest-first list of pixel breakpoints.\n * @returns The current shrink step; `0` (widest) until the first measurement lands.\n */\nexport function useShrinkStep(\n element: HTMLElement | undefined,\n thresholds: readonly number[],\n): number {\n const [step, setStep] = useState(0);\n // Width of the last delivery, so the next one can tell a drag from a reveal. A hidden element\n // reports 0, which is an absence of layout rather than a width worth being sticky about.\n const previousWidthRef = useRef(undefined);\n\n // Layout effect, not a passive one: a passive effect runs after paint, so a toolbar mounted into\n // a narrow panel would paint its full-width form for a frame and then snap — the layout jump this\n // whole mechanism exists to remove.\n useLayoutEffect(() => {\n // The `typeof` guard keeps this a no-op in jsdom, which ships no `ResizeObserver`: consumers'\n // render tests then simply stay at the widest step instead of throwing.\n if (!element || typeof ResizeObserver === 'undefined') return undefined;\n\n // Always re-measure the element rather than reading the observer entry: `contentRect` is the\n // content box while this seed reads the border box, so mixing the two would shift the\n // thresholds by the observed element's padding between mount and the first resize.\n const measure = () => {\n const { width } = element.getBoundingClientRect();\n const previousWidth = previousWidthRef.current;\n previousWidthRef.current = width;\n const isFirstRealWidth = previousWidth === undefined || previousWidth === 0;\n setStep((previousStep) =>\n getShrinkStep(width, thresholds, isFirstRealWidth ? undefined : previousStep),\n );\n };\n\n measure();\n\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n\n return () => observer.disconnect();\n }, [element, thresholds]);\n\n return step;\n}\n\nexport default useShrinkStep;\n","import { Localized, MultiColumnMenu } from 'platform-bible-utils';\nimport React, { PropsWithChildren, ReactNode, useCallback, useRef, useState } from 'react';\nimport {\n SHRINK_STEP,\n ShrinkStepContext,\n useShrinkStepOverride,\n} from '@/context/shrink-step.context';\nimport { useShrinkStep } from '@/hooks/use-shrink-step.hook';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { SelectMenuItemHandler } from '../menus/platform-menubar.component';\n\nexport type TabToolbarCommonProps = {\n /**\n * The handler to use for toolbar item commands related to the project menu. Here is a basic\n * example of how to create this:\n *\n * @example\n *\n * ```tsx\n * const projectMenuCommandHandler: SelectMenuItemHandler = async (selectedMenuItem) => {\n * const commandName = selectedMenuItem.command;\n * try {\n * // Assert the more specific type. Assert the more specific type. The menu data should\n * // specify a valid command name here. If not, the error will be caught.\n * // eslint-disable-next-line no-type-assertion/no-type-assertion\n * await papi.commands.sendCommand(commandName as CommandNames);\n * } catch (e) {\n * throw new Error(\n * `handleMenuCommand error: command: ${commandName}. ${JSON.stringify(e)}`,\n * );\n * }\n * };\n * ```\n */\n onSelectProjectMenuItem: SelectMenuItemHandler;\n\n /**\n * Menu data that is used to populate the Menubar component for the project menu. In an extension,\n * the menu data comes from menus.json in the contributions folder. To access that info, use\n * useMemo to get the WebViewMenu.\n */\n projectMenuData?: Localized;\n\n /** Optional unique identifier */\n id?: string;\n\n /** Additional css classes to help with unique styling of the extensible toolbar */\n className?: string;\n\n /** Icon that will be displayed on the Menu Button. Defaults to the hamburger menu icon. */\n menuButtonIcon?: ReactNode;\n};\n\nexport type TabToolbarContainerProps = PropsWithChildren<{\n /** Optional unique identifier */\n id?: string;\n /** Additional css classes to help with unique styling of the extensible toolbar */\n className?: string;\n}>;\n\n/**\n * Breakpoints for the tab toolbar, widest first, measured against the container's own outer box.\n * That box includes the container's horizontal padding, so roughly 32px of each number is padding\n * rather than room for controls — 16px below the narrowest threshold, where the container tightens\n * its padding and gaps to give the space to its controls. Unlike the application titlebar — where\n * the caption-button reserve lands inside or outside the measured box depending on the platform, so\n * `Toolbar` observes its padding-free inner row instead — this padding is the same everywhere, so\n * there is no cross-platform skew to correct.\n *\n * Estimated from the widths of the controls the toolbar carries rather than measured, so expect to\n * adjust them the first time this is watched in a running app.\n */\nexport const TAB_TOOLBAR_SHRINK_THRESHOLDS_PX = Object.freeze([520, 420, 340]);\n\n/** Wrapper that allows consistent styling for both TabToolbar and TabFloatingMenu. */\nexport const TabToolbarContainer = React.forwardRef(\n ({ id, className, children }, ref) => {\n // The root node lives in state, not a ref: mutating `ref.current` does not re-run the effect\n // inside `useShrinkStep`, so a ref would leave the observer permanently unattached. The\n // forwarded ref is still populated alongside it so callers keep the node they expect.\n const [rootNode, setRootNode] = useState(undefined);\n\n // The forwarded ref is read through a ref of its own so `attachRoot` can have a stable\n // identity. Depending on `ref` directly would rebuild this callback whenever the caller passes\n // an inline one — React then detaches the old callback ref with `null` and attaches the new one\n // with the node on every render, and since each of those writes state, the render that follows\n // rebuilds the callback again. That is a render loop, and it is invisible until some caller\n // stops memoizing its ref.\n const forwardedRef = useRef(ref);\n forwardedRef.current = ref;\n\n const attachRoot = useCallback((node: HTMLDivElement | null) => {\n setRootNode(node ?? undefined);\n const currentRef = forwardedRef.current;\n if (typeof currentRef === 'function') currentRef(node);\n // Writing `ref.current` IS how an object ref is populated — React itself does exactly this\n // for a non-callback ref. There is no non-mutating alternative when forwarding one by hand,\n // which this component must do because it also needs the node in state for the observer.\n // eslint-disable-next-line no-param-reassign\n else if (currentRef) currentRef.current = node;\n }, []);\n\n const measuredShrinkStep = useShrinkStep(rootNode, TAB_TOOLBAR_SHRINK_THRESHOLDS_PX);\n // A `ShrinkStepOverride` above this wins, so stories and tests can pin a step where there is no\n // layout engine to measure with.\n const shrinkStep = useShrinkStepOverride() ?? measuredShrinkStep;\n\n // At the narrowest step the padding and inter-zone gaps below cost 48px of a ~300px row, while\n // the start zone is out of room for controls that have nothing shorter left to fall back to.\n // Halving both hands ~24px back, and it all lands in the start zone because that is the only\n // item in this row that grows and shrinks.\n //\n // Keying this off the step is safe: `useShrinkStep` measures this element's BORDER box, which\n // its own padding does not change, so tightening cannot feed back into which step is chosen.\n // For the same reason the thresholds above stay as written — what changes is how much of each\n // band's width reaches the controls, not where the bands fall.\n const isTightened = shrinkStep >= SHRINK_STEP.MINIMUM;\n\n return (\n \n \n {children}\n \n \n );\n },\n);\n\nexport default TabToolbarContainer;\n","import { ReactNode } from 'react';\nimport { Localized, MultiColumnMenu } from 'platform-bible-utils';\nimport { Menu, EllipsisVertical } from 'lucide-react';\nimport TabDropdownMenu from '../menus/tab-dropdown-menu.component';\nimport { SelectMenuItemHandler } from '../menus/platform-menubar.component';\nimport { TabToolbarCommonProps, TabToolbarContainer } from './tab-toolbar-container.component';\n\nexport type TabToolbarProps = TabToolbarCommonProps & {\n /**\n * The handler to use for toolbar item commands related to the tab view menu. Here is a basic\n * example of how to create this from the hello-rock3 extension:\n *\n * @example\n *\n * ```tsx\n * const projectMenuCommandHandler: SelectMenuItemHandler = async (selectedMenuItem) => {\n * const commandName = selectedMenuItem.command;\n * try {\n * // Assert the more specific type. Assert the more specific type. The menu data should\n * // specify a valid command name here. If not, the error will be caught.\n * // eslint-disable-next-line no-type-assertion/no-type-assertion\n * await papi.commands.sendCommand(commandName as CommandNames);\n * } catch (e) {\n * throw new Error(\n * `handleMenuCommand error: command: ${commandName}. ${JSON.stringify(e)}`,\n * );\n * }\n * };\n * ```\n */\n onSelectViewInfoMenuItem: SelectMenuItemHandler;\n\n /** Menu data that is used to populate the Menubar component for the view info menu */\n tabViewMenuData?: Localized;\n\n /**\n * Toolbar children to be put at the start of the the toolbar after the project menu icon (left\n * side in ltr, right side in rtl). Recommended for inner navigation.\n */\n startAreaChildren?: ReactNode;\n\n /** Toolbar children to be put in the center area of the the toolbar. Recommended for tools. */\n centerAreaChildren?: ReactNode;\n\n /**\n * Toolbar children to be put at the end of the the toolbar before the tab view menu icon (right\n * side in ltr, left side in rtl). Recommended for secondary tools and view options.\n */\n endAreaChildren?: ReactNode;\n};\n\n/**\n * Toolbar that holds the project menu icon on one side followed by three different areas/categories\n * for toolbar icons followed by an optional view info menu icon. See the Tab Floating Menu Button\n * component for a menu component that takes up less screen real estate yet is always visible.\n */\nexport function TabToolbar({\n onSelectProjectMenuItem,\n onSelectViewInfoMenuItem,\n projectMenuData,\n tabViewMenuData,\n id,\n className,\n startAreaChildren,\n centerAreaChildren,\n endAreaChildren,\n menuButtonIcon,\n}: TabToolbarProps) {\n return (\n \n {projectMenuData && (\n }\n buttonVariant=\"ghost\"\n showSectionHeadings\n />\n )}\n {/* Absorbing zone. `tw:min-w-0` is what lets the flex algorithm shrink this below its content\n width — without it a flex item's `min-width: auto` pins it at min-content, and the space\n is taken out of the end zone instead, which the container then clips. That is the\n \"toolbar items silently disappear\" bug. `tw:overflow-clip` stays as the backstop for\n consumers whose children have no shorter form of their own. */}\n {startAreaChildren && (\n
    \n {startAreaChildren}\n
    \n )}\n {/* Deliberately NOT `tw:min-w-0`, unlike the start zone. This zone's flex base is 0 below the\n `@sm` container width, and a zero-basis item absorbs none of a deficit — its used size is\n whatever its floor says. `min-width: auto` (min-content) is therefore the only thing\n keeping its contents on screen at narrow widths; adding `tw:min-w-0` here would resolve\n the zone to 0px and `tw:overflow-clip` would erase it outright. Center-zone content is\n typically a single toggle with no shorter form, so that is the disappearing-item bug\n rather than a graceful degradation. */}\n {centerAreaChildren && (\n
    \n {centerAreaChildren}\n
    \n )}\n {/* Rigid zone: `tw:shrink-0` and deliberately NOT `tw:min-w-0`. This holds the view-info menu\n and small icon buttons, none of which have a shorter form to fall back to, so shrinking\n must flow to the start and center zones instead. `tw:grow-[1]` is kept — grow and shrink\n are independent, and dropping it would change how leftover space is split at wide widths\n and visibly shift the center zone. */}\n
    \n {tabViewMenuData && (\n }\n className=\"tw:h-full\"\n showSectionHeadings\n />\n )}\n {endAreaChildren}\n
    \n
    \n );\n}\n\nexport default TabToolbar;\n","import TabDropdownMenu from '../menus/tab-dropdown-menu.component';\nimport { TabToolbarCommonProps, TabToolbarContainer } from './tab-toolbar-container.component';\n\n/**\n * Renders a TabDropdownMenu with a trigger button that looks like the menuButtonIcon or like the\n * default of three stacked horizontal lines (aka the hamburger). The menu \"floats\" over the content\n * so it is always visible. When clicked, it displays a dropdown menu with the projectMenuData.\n */\nexport function TabFloatingMenu({\n onSelectProjectMenuItem,\n projectMenuData,\n id,\n className,\n menuButtonIcon,\n}: TabToolbarCommonProps) {\n return (\n \n {projectMenuData && (\n \n )}\n \n );\n}\n\nexport default TabFloatingMenu;\n","// adapted from: https://github.com/shadcn-ui/ui/discussions/752\n\n'use client';\n\nimport { TabsContentProps, TabsListProps, TabsTriggerProps } from '@/components/shadcn-ui/tabs';\nimport { Direction, readDirection } from '@/utils/dir-helper.util';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { Tabs as RadixTabs } from 'radix-ui';\nimport React from 'react';\n\nexport type VerticalTabsProps = React.ComponentPropsWithoutRef & {\n className?: string;\n};\n\nexport type LeftTabsTriggerProps = TabsTriggerProps & {\n value: string;\n ref?: React.Ref;\n};\n\n/**\n * Tabs components provide a set of layered sections of content—known as tab panels–that are\n * displayed one at a time. These components are built on Radix UI primitives and styled with Shadcn\n * UI. See Shadcn UI Documentation: https://ui.shadcn.com/docs/components/tabs See Radix UI\n * Documentation: https://www.radix-ui.com/primitives/docs/components/tabs\n */\nexport const VerticalTabs = React.forwardRef<\n React.ElementRef,\n VerticalTabsProps\n>(({ className, ...props }, ref) => {\n const dir: Direction = readDirection();\n return (\n \n );\n});\n\nVerticalTabs.displayName = RadixTabs.List.displayName;\n\n/** @inheritdoc VerticalTabs */\nexport const VerticalTabsList = React.forwardRef<\n React.ElementRef,\n TabsListProps\n>(({ className, ...props }, ref) => (\n \n));\nVerticalTabsList.displayName = RadixTabs.List.displayName;\n\n/** @inheritdoc VerticalTabs */\nexport const VerticalTabsTrigger = React.forwardRef<\n React.ElementRef,\n LeftTabsTriggerProps\n>(({ className, ...props }, ref) => (\n \n));\n\n/** @inheritdoc VerticalTabs */\nexport const VerticalTabsContent = React.forwardRef<\n React.ElementRef,\n TabsContentProps\n>(({ className, ...props }, ref) => (\n \n));\nVerticalTabsContent.displayName = RadixTabs.Content.displayName;\n","import { SearchBar } from '@/components/basics/search-bar.component';\nimport {\n VerticalTabs,\n VerticalTabsContent,\n VerticalTabsList,\n VerticalTabsTrigger,\n} from '@/components/basics/tabs-vertical';\nimport { ReactNode } from 'react';\n\nexport type TabKeyValueContent = {\n key: string;\n value: string;\n content: ReactNode;\n};\n\nexport type TabNavigationContentSearchProps = {\n /** List of values and keys for each tab this component should provide */\n tabList: TabKeyValueContent[];\n\n /** The search query in the search bar */\n searchValue: string;\n\n /** Handler to run when the value of the search bar changes */\n onSearch: (searchQuery: string) => void;\n\n /** Optional placeholder for the search bar */\n searchPlaceholder?: string;\n\n /** Optional title to include in the header */\n headerTitle?: string;\n\n /** Optional className to modify the search input */\n searchClassName?: string;\n\n /** Optional id for the root element */\n id?: string;\n};\n\n/**\n * TabNavigationContentSearch component provides a vertical tab navigation interface with a search\n * bar at the top. This component allows users to filter content within tabs based on a search\n * query.\n *\n * @param {TabNavigationContentSearchProps} props\n * @param {TabKeyValueContent[]} props.tabList - List of objects containing keys, values, and\n * content for each tab to be displayed.\n * @param {string} props.searchValue - The current value of the search input.\n * @param {function} props.onSearch - Callback function called when the search input changes;\n * receives the new search query as an argument.\n * @param {string} [props.searchPlaceholder] - Optional placeholder text for the search input.\n * @param {string} [props.headerTitle] - Optional title to display above the search input.\n * @param {string} [props.searchClassName] - Optional CSS class name to apply custom styles to the\n * search input.\n * @param {string} [props.id] - Optional id for the root element.\n */\nexport function TabNavigationContentSearch({\n tabList,\n searchValue,\n onSearch,\n searchPlaceholder,\n headerTitle,\n searchClassName,\n id,\n}: TabNavigationContentSearchProps) {\n return (\n
    \n
    \n {headerTitle ?

    {headerTitle}

    : ''}\n \n
    \n \n \n {tabList.map((tab) => (\n \n {tab.value}\n \n ))}\n \n {tabList.map((tab) => (\n \n {tab.content}\n \n ))}\n \n
    \n );\n}\n\nexport default TabNavigationContentSearch;\n","import React from 'react';\nimport { Menubar as MenubarPrimitive } from 'radix-ui';\n\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { IconCheck, IconChevronRight } from '@tabler/icons-react';\n// CUSTOM: Import menu context and variants to support variant prop propagation down the menu tree\nimport {\n MenuContext,\n MenuContextProps,\n menuVariants,\n useMenuContext,\n} from '@/context/menu.context';\n// CUSTOM: Import the shared z-index constant so the menubar joins the same overlay tier as popover,\n// select, dropdown-menu and context-menu instead of falling back to Tailwind's tw:z-50. The tooltip\n// tier is documented as sitting above \"the menubar\", which is only true once the menubar is\n// actually on this tier.\nimport { Z_INDEX_ABOVE_DOCK } from '@/components/z-index';\n\n/**\n * The Menubar component provides a visually persistent menu that is commonly triggered by a menu\n * bar. This component is built on Radix UI primitives and styled with Shadcn UI.\n *\n * @see Shadcn UI Documentation: {@link https://ui.shadcn.com/docs/components/menubar}\n * @see Radix UI Documentation: {@link https://www.radix-ui.com/primitives/docs/components/menubar}\n */\nfunction Menubar({\n className,\n // CUSTOM: Added variant prop to allow callers to apply visual style variants to all menu items\n variant = 'default',\n ...props\n}: React.ComponentProps & {\n // CUSTOM: variant prop that propagates down the menu tree via context\n variant?: MenuContextProps['variant'];\n}) {\n /* #region CUSTOM provide context to propagate variant to all menu children */\n const contextValue = React.useMemo(\n () => ({\n variant,\n }),\n [variant],\n );\n return (\n \n {/* #endregion CUSTOM */}\n \n \n );\n}\n\n/** @inheritdoc Menubar */\nfunction MenubarMenu({ ...props }: React.ComponentProps) {\n return ;\n}\n\n/** @inheritdoc Menubar */\nfunction MenubarGroup({ ...props }: React.ComponentProps) {\n return ;\n}\n\n/** @inheritdoc Menubar */\nfunction MenubarPortal({ ...props }: React.ComponentProps) {\n return ;\n}\n\n/** @inheritdoc Menubar */\nfunction MenubarRadioGroup({ ...props }: React.ComponentProps) {\n return ;\n}\n\n/** @inheritdoc Menubar */\nfunction MenubarTrigger({\n className,\n ...props\n}: React.ComponentProps) {\n // CUSTOM: Read menu context to apply variant-driven styles to the trigger\n const context = useMenuContext();\n return (\n \n );\n}\n\n/** @inheritdoc Menubar */\nfunction MenubarContent({\n className,\n align = 'start',\n alignOffset = -4,\n sideOffset = 8,\n // CUSTOM: Pull `style` out so the shared z-index can be applied under any caller-supplied style\n style,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n );\n}\n\n/** @inheritdoc Menubar */\nfunction MenubarItem({\n className,\n inset,\n variant = 'default',\n ...props\n}: React.ComponentProps & {\n inset?: boolean;\n variant?: 'default' | 'destructive';\n}) {\n // CUSTOM: Read menu context to apply variant-driven styles to each menu item\n const context = useMenuContext();\n return (\n \n );\n}\n\n/** @inheritdoc Menubar */\nfunction MenubarCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps & {\n inset?: boolean;\n}) {\n // CUSTOM: Read menu context to apply variant-driven styles to each checkbox item\n const context = useMenuContext();\n return (\n \n \n \n \n \n \n {children}\n \n );\n}\n\n/** @inheritdoc Menubar */\nfunction MenubarRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps & {\n inset?: boolean;\n}) {\n // CUSTOM: Read menu context to apply variant-driven styles to each radio item\n const context = useMenuContext();\n return (\n \n \n \n \n \n \n {children}\n \n );\n}\n\n/** @inheritdoc Menubar */\nfunction MenubarLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps & {\n inset?: boolean;\n}) {\n return (\n \n );\n}\n\n/** @inheritdoc Menubar */\nfunction MenubarSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n );\n}\n\n/** @inheritdoc Menubar */\nfunction MenubarShortcut({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n \n );\n}\n\n/** @inheritdoc Menubar */\nfunction MenubarSub({ ...props }: React.ComponentProps) {\n return ;\n}\n\n/** @inheritdoc Menubar */\nfunction MenubarSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps & {\n inset?: boolean;\n}) {\n // CUSTOM: Read menu context to apply variant-driven styles to the sub-trigger\n const context = useMenuContext();\n return (\n \n {children}\n \n \n );\n}\n\n/** @inheritdoc Menubar */\nfunction MenubarSubContent({\n className,\n // CUSTOM: Pull `style` out so the shared z-index can be applied under any caller-supplied style\n style,\n ...props\n}: React.ComponentProps) {\n return (\n \n );\n}\n\nexport {\n Menubar,\n MenubarPortal,\n MenubarMenu,\n MenubarTrigger,\n MenubarContent,\n MenubarGroup,\n MenubarSeparator,\n MenubarLabel,\n MenubarItem,\n MenubarShortcut,\n MenubarCheckboxItem,\n MenubarRadioGroup,\n MenubarRadioItem,\n MenubarSub,\n MenubarSubTrigger,\n MenubarSubContent,\n};\n","import {\n Menubar,\n MenubarContent,\n MenubarItem,\n MenubarMenu,\n MenubarSeparator,\n MenubarShortcut,\n MenubarSub,\n MenubarSubContent,\n MenubarSubTrigger,\n MenubarTrigger,\n} from '@/components/shadcn-ui/menubar';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/shadcn-ui/tooltip';\nimport {\n GroupsInMultiColumnMenu,\n Localized,\n MenuItemContainingCommand,\n MenuItemContainingSubmenu,\n MultiColumnMenu,\n} from 'platform-bible-utils';\nimport { RefObject, useEffect, useRef } from 'react';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { Z_INDEX_ABOVE_DOCK } from '@/components/z-index';\nimport { getSortedMenuColumns, getSubMenuGroupKeyForMenuItemId } from './menu.util';\nimport MenuItemIcon from './menu-icon.component';\n\n/**\n * Callback function that is invoked when a user selects a menu item. Receives the full\n * `MenuItemContainingCommand` object as an argument.\n */\nexport interface SelectMenuItemHandler {\n (selectedMenuItem: MenuItemContainingCommand): void;\n}\n\nconst simulateKeyPress = (ref: RefObject, keys: KeyboardEventInit[]) => {\n setTimeout(() => {\n keys.forEach((key) => {\n ref.current?.dispatchEvent(new KeyboardEvent('keydown', key));\n });\n }, 0);\n};\n\nconst getMenubarContent = (\n groups: Localized,\n items: Localized<(MenuItemContainingCommand | MenuItemContainingSubmenu)[]>,\n columnOrSubMenuKey: string | undefined,\n onSelectMenuItem: SelectMenuItemHandler,\n) => {\n if (!columnOrSubMenuKey) return undefined;\n\n const sortedGroupsForColumn = Object.entries(groups)\n .filter(\n ([key, group]) =>\n ('column' in group && group.column === columnOrSubMenuKey) || key === columnOrSubMenuKey,\n )\n .sort(([, a], [, b]) => a.order - b.order);\n\n return sortedGroupsForColumn.flatMap(([groupKey], index) => {\n const groupItems = items\n .filter((item) => item.group === groupKey)\n .sort((a, b) => a.order - b.order)\n .map((item: Localized) => {\n return (\n \n \n {'command' in item ? (\n {\n // Since the item has a command, we know it is a MenuItemContainingCommand.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n onSelectMenuItem(item as MenuItemContainingCommand);\n }}\n >\n {item.iconPathBefore && (\n \n )}\n {item.label}\n {item.iconPathAfter && (\n \n )}\n {item.shortcut && {item.shortcut}}\n \n ) : (\n \n {item.label}\n \n {getMenubarContent(\n groups,\n items,\n getSubMenuGroupKeyForMenuItemId(groups, item.id),\n onSelectMenuItem,\n )}\n \n \n )}\n \n {item.tooltip && {item.tooltip}}\n \n );\n });\n\n const itemsWithSeparator = [...groupItems];\n if (groupItems.length > 0 && index < sortedGroupsForColumn.length - 1) {\n itemsWithSeparator.push();\n }\n\n return itemsWithSeparator;\n });\n};\n\ntype PlatformMenubarProps = {\n /** Menu data that is used to populate the Menubar component. */\n menuData: Localized;\n\n /** The handler to use for menu commands. */\n onSelectMenuItem: SelectMenuItemHandler;\n\n /**\n * Optional callback function that is executed whenever a menu on the Menubar is opened or closed.\n * Helpful for handling updates to the menu, as changing menu data when the menu is opened is not\n * desirable.\n */\n onOpenChange?: (isOpen: boolean) => void;\n\n /** Style variant for the app menubar component. */\n variant?: 'default' | 'muted';\n};\n\n/**\n * Menubar component tailored to work with Platform.Bible menu data. Items show their `shortcut`, if\n * any, at the end of the row.\n */\nexport function PlatformMenubar({\n menuData,\n onSelectMenuItem,\n onOpenChange,\n variant,\n}: PlatformMenubarProps) {\n // These refs will always be defined — using undefined! avoids a null check on every use\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const menubarRef = useRef(undefined!);\n // Ref is always defined before use; the non-null assertion avoids redundant null checks\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const projectMenuRef = useRef(undefined!);\n // Ref is always defined before use; the non-null assertion avoids redundant null checks\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const windowMenuRef = useRef(undefined!);\n // Ref is always defined before use; the non-null assertion avoids redundant null checks\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const layoutMenuRef = useRef(undefined!);\n // Ref is always defined before use; the non-null assertion avoids redundant null checks\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n const helpMenuRef = useRef(undefined!);\n\n const getRefForColumn = (columnKey: string) => {\n switch (columnKey) {\n case 'platform.app':\n return projectMenuRef;\n case 'platform.window':\n return windowMenuRef;\n case 'platform.layout':\n return layoutMenuRef;\n case 'platform.help':\n return helpMenuRef;\n default:\n return undefined;\n }\n };\n\n // This is a quick and dirty way to implement some shortcuts by simulating key presses\n useHotkeys(['alt', 'alt+p', 'alt+l', 'alt+n', 'alt+h'], (event, handler) => {\n event.preventDefault();\n\n const escKey: KeyboardEventInit = { key: 'Escape', code: 'Escape', keyCode: 27, bubbles: true };\n const spaceKey: KeyboardEventInit = { key: ' ', code: 'Space', keyCode: 32, bubbles: true };\n\n switch (handler.hotkey) {\n case 'alt':\n simulateKeyPress(projectMenuRef, [escKey]);\n break;\n case 'alt+p':\n projectMenuRef.current?.focus();\n simulateKeyPress(projectMenuRef, [escKey, spaceKey]);\n break;\n case 'alt+l':\n windowMenuRef.current?.focus();\n simulateKeyPress(windowMenuRef, [escKey, spaceKey]);\n break;\n case 'alt+n':\n layoutMenuRef.current?.focus();\n simulateKeyPress(layoutMenuRef, [escKey, spaceKey]);\n break;\n case 'alt+h':\n helpMenuRef.current?.focus();\n simulateKeyPress(helpMenuRef, [escKey, spaceKey]);\n break;\n default:\n break;\n }\n });\n\n useEffect(() => {\n if (!onOpenChange || !menubarRef.current) return;\n\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.attributeName === 'data-state' && mutation.target instanceof HTMLElement) {\n const state = mutation.target.getAttribute('data-state');\n\n if (state === 'open') {\n onOpenChange(true);\n } else {\n onOpenChange(false);\n }\n }\n });\n });\n\n const menubarElement = menubarRef.current;\n const dataStateAttributes = menubarElement.querySelectorAll('[data-state]');\n\n dataStateAttributes.forEach((element) => {\n observer.observe(element, { attributes: true });\n });\n\n return () => observer.disconnect();\n }, [onOpenChange]);\n\n if (!menuData) return undefined;\n\n return (\n \n {getSortedMenuColumns(menuData.columns).map(({ columnKey, column }) => (\n \n {column.label}\n \n \n {getMenubarContent(menuData.groups, menuData.items, columnKey, onSelectMenuItem)}\n \n \n \n ))}\n \n );\n}\n\nexport default PlatformMenubar;\n","import {\n SelectMenuItemHandler,\n PlatformMenubar,\n} from '@/components/advanced/menus/platform-menubar.component';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { ShrinkStepContext, useShrinkStepOverride } from '@/context/shrink-step.context';\nimport { useShrinkStep } from '@/hooks/use-shrink-step.hook';\nimport { Localized, MultiColumnMenu } from 'platform-bible-utils';\nimport { PropsWithChildren, ReactNode, useCallback, useState } from 'react';\n\nexport type ToolbarProps = PropsWithChildren<{\n /** The handler to use for menu commands (and eventually toolbar commands). */\n onSelectMenuItem: SelectMenuItemHandler;\n\n /**\n * Menu data that is used to populate the Menubar component. If empty object, no menus will be\n * shown on the App Menubar\n */\n menuData?: Localized;\n\n /**\n * Optional callback function that is executed whenever a menu on the App Menubar is opened or\n * closed. Helpful for handling updates to the menu, as changing menu data when the menu is opened\n * is not desirable.\n */\n onOpenChange?: (isOpen: boolean) => void;\n\n /** Optional unique identifier */\n id?: string;\n\n /** Additional css classes to help with unique styling of the toolbar */\n className?: string;\n\n /**\n * Whether the toolbar should be used as a draggable area for moving the application. This will\n * add an electron specific style `WebkitAppRegion: 'drag'` to the toolbar in order to make it\n * draggable. See:\n * https://www.electronjs.org/docs/latest/tutorial/custom-title-bar#create-a-custom-title-bar\n */\n shouldUseAsAppDragArea?: boolean;\n\n /** Toolbar children to be put at the start of the toolbar (left side in ltr, right side in rtl) */\n appMenuAreaChildren?: ReactNode;\n\n /** Toolbar children to be put at the end of the toolbar (right side in ltr, left side in rtl) */\n configAreaChildren?: ReactNode;\n\n /** Variant of the menubar */\n menubarVariant?: 'default' | 'muted';\n}>;\n\n/**\n * Breakpoints for the application titlebar, widest first, measured against the width actually\n * available to the toolbar's content — the inner row, inside whatever padding reserves the OS\n * caption buttons — and never against the window's width.\n *\n * Which box is measured is load-bearing here. The caption-button reserve sits INSIDE the toolbar's\n * own box on macOS (`tw:ps-[85px]`) and on the Windows/Linux fallback (`tw:pe-[…]`), but OUTSIDE it\n * when Electron reports a live overlay rect and the wrapper reserves the space instead (see\n * `platform-bible-toolbar.tsx`). Measuring the outer box would therefore report up to ~150px more\n * room on one path than another for the same window width, and the same window would abbreviate the\n * scripture reference on one OS but not on the next. The inner row is the space the controls really\n * get, on every path.\n *\n * Estimated from the widths of the controls the toolbar carries rather than measured, so expect to\n * adjust them the first time this is watched in a running app.\n */\nexport const APP_TOOLBAR_SHRINK_THRESHOLDS_PX = Object.freeze([950, 800, 700]);\n\n/**\n * Get tailwind class for reserved space for the window controls / macos \"traffic lights\". Passing\n * 'darwin' will reserve the necessary space for macos traffic lights at the start, otherwise a\n * different amount of space at the end for the window controls.\n *\n * Apply to the toolbar like: `` or ``\n *\n * @param operatingSystem The os platform: 'darwin' (macos) | anything else\n * @returns The class name to apply to the toolbar if os specific space should be reserved\n */\nexport function getToolbarOSReservedSpaceClassName(\n operatingSystem: string | undefined,\n): string | undefined {\n switch (operatingSystem) {\n case undefined:\n return undefined;\n case 'darwin':\n return 'tw:ps-[85px]';\n default:\n return 'tw:pe-[calc(138px+1rem)]';\n }\n}\n\n/**\n * A customizable toolbar component with a menubar, content area, and configure area.\n *\n * This component is designed to be used in the window title bar of an electron application.\n *\n * Two `data-testid` hooks are relied on by end-to-end tests outside this package, so they are part\n * of this component's contract: `toolbar-content-row` (the row that clips when contents do not fit)\n * and `toolbar-content-area` (the area receiving `children`). Renaming either is a breaking\n * change.\n *\n * @param {ToolbarProps} props - The props for the component.\n */\nexport function Toolbar({\n menuData,\n onOpenChange,\n onSelectMenuItem,\n className,\n id,\n children,\n appMenuAreaChildren,\n configAreaChildren,\n shouldUseAsAppDragArea,\n menubarVariant = 'default',\n}: ToolbarProps) {\n // The content row lives in state, not a ref: mutating `ref.current` does not re-run the effect\n // inside `useShrinkStep`, so a ref would leave the observer permanently unattached.\n const [contentRowNode, setContentRowNode] = useState(undefined);\n const attachContentRow = useCallback(\n (node: HTMLDivElement | null) => setContentRowNode(node ?? undefined),\n [],\n );\n const measuredShrinkStep = useShrinkStep(contentRowNode, APP_TOOLBAR_SHRINK_THRESHOLDS_PX);\n // A `ShrinkStepOverride` above this wins, so stories and tests can pin a step where there is no\n // layout engine to measure with.\n const shrinkStep = useShrinkStepOverride() ?? measuredShrinkStep;\n\n return (\n \n \n {/* Observed for the shrink step, not the bordered wrapper above: this row's box is the\n space the controls actually have, with the OS caption-button reserve already taken out of\n it however the current platform reserves that space. See\n APP_TOOLBAR_SHRINK_THRESHOLDS_PX. */}\n \n {/* App Menu area — rigid. Deliberately NOT `tw:min-w-0`: letting the logo and main menubar\n shrink would clip menu titles, which is the failure this design exists to prevent.\n Shrinking flows to the content area instead. */}\n
    \n \n {appMenuAreaChildren}\n\n {menuData && (\n \n )}\n
    \n \n\n {/* Content area — absorbing. Holds the project selector, reference-history buttons and\n BookChapterControl, each of which has a shorter label form to fall back to.\n `tw:overflow-clip` is the same backstop every TabToolbar zone carries, and it is needed\n for the same reason: these children have width floors of their own, so once the zone is\n squeezed past their sum they overflow it. Sibling flex items do not clip each other and\n the nearest clipping ancestor is the row edge, past the Configure area — so without it\n the overrun paints on top of the Send/Receive, settings and profile buttons and makes\n them partly un-clickable. Tooltips and popovers are portalled, so nothing that needs to\n escape the box is clipped by this. */}\n \n {children}\n \n\n {/* Configure area */}\n
    \n \n {configAreaChildren}\n
    \n \n \n \n
    \n );\n}\n\nexport default Toolbar;\n","import { useState } from 'react';\nimport { LocalizedStringValue, formatReplacementString } from 'platform-bible-utils';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { Z_INDEX_ABOVE_DOCK } from '@/components/z-index';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../shadcn-ui/select';\nimport { Label } from '../shadcn-ui/label';\n\n/**\n * Immutable array containing all keys used for localization in this component. If you're using this\n * component in an extension, you can pass it into the useLocalizedStrings hook to easily obtain the\n * localized strings and pass them into the localizedStrings prop of this component\n */\nexport const UI_LANGUAGE_SELECTOR_STRING_KEYS = Object.freeze([\n '%settings_uiLanguageSelector_fallbackLanguages%',\n] as const);\n\nexport type UiLanguageSelectorLocalizedStrings = {\n [localizedUiLanguageSelectorKey in (typeof UI_LANGUAGE_SELECTOR_STRING_KEYS)[number]]?: LocalizedStringValue;\n};\n\n/**\n * Gets the localized value for the provided key\n *\n * @param strings Object containing localized string\n * @param key Key for a localized string\n * @returns The localized value for the provided key, if available. Returns the key if no localized\n * value is available\n */\nconst localizeString = (\n strings: UiLanguageSelectorLocalizedStrings,\n key: keyof UiLanguageSelectorLocalizedStrings,\n) => {\n return strings[key] ?? key;\n};\n\nexport type LanguageInfo = {\n /** The name of the language to be displayed (in its native script) */\n autonym: string;\n /**\n * The name of the language in other languages, so that the language can also be displayed in the\n * current UI language, if known.\n */\n uiNames?: Record;\n /**\n * Other known names of the language (for searching). This can include pejorative names and should\n * never be displayed unless typed by the user.\n */\n otherNames?: string[];\n};\n\nexport type UiLanguageSelectorProps = {\n /** Full set of known languages to display. The keys are valid BCP-47 tags. */\n knownUiLanguages: Record;\n /** IETF BCP-47 language tag of the current primary UI language. `undefined` => 'en' */\n primaryLanguage: string;\n /**\n * Ordered list of fallback language tags to use if the localization key can't be found in the\n * current primary UI language. This list never contains English ('en') because it is the ultimate\n * fallback.\n */\n fallbackLanguages: string[] | undefined;\n /**\n * Handler for when either the primary or the fallback languages change (or both). For this\n * handler, the primary UI language is the first one in the array, followed by the fallback\n * languages in order of decreasing preference.\n */\n onLanguagesChange?: (newUiLanguages: string[]) => void;\n /** Handler for the primary language changes. */\n onPrimaryLanguageChange?: (newPrimaryUiLanguage: string) => void;\n /**\n * Handler for when the fallback languages change. The array contains the fallback languages in\n * order of decreasing preference.\n */\n onFallbackLanguagesChange?: (newFallbackLanguages: string[]) => void;\n /**\n * Map whose keys are localized string keys as contained in UI_LANGUAGE_SELECTOR_STRING_KEYS and\n * whose values are the localized strings (in the current UI language).\n */\n localizedStrings: UiLanguageSelectorLocalizedStrings;\n /** Additional css classes to help with unique styling of the control */\n className?: string;\n /** Optional id for the root element */\n id?: string;\n};\n\n/**\n * A component for selecting the user interface language and managing fallback languages. Allows\n * users to choose a primary UI language and optionally select fallback languages.\n *\n * @param {UiLanguageSelectorProps} props - The props for the component.\n */\nexport function UiLanguageSelector({\n knownUiLanguages,\n primaryLanguage = 'en',\n fallbackLanguages = [],\n onLanguagesChange,\n onPrimaryLanguageChange,\n onFallbackLanguagesChange,\n localizedStrings,\n className,\n id,\n}: UiLanguageSelectorProps) {\n const fallbackLanguagesText = localizeString(\n localizedStrings,\n '%settings_uiLanguageSelector_fallbackLanguages%',\n );\n const [isOpen, setIsOpen] = useState(false);\n\n const handleLanguageChange = (code: string) => {\n if (onPrimaryLanguageChange) onPrimaryLanguageChange(code);\n // REVIEW: Should fallback languages be preserved when primary language changes?\n if (onLanguagesChange)\n onLanguagesChange([code, ...fallbackLanguages.filter((lang) => lang !== code)]);\n if (onFallbackLanguagesChange && fallbackLanguages.find((l) => l === code))\n onFallbackLanguagesChange([...fallbackLanguages.filter((lang) => lang !== code)]);\n setIsOpen(false); // Close the dropdown when a selection is made\n };\n\n /**\n * Gets the display name for the given language. This will typically include the autonym (in the\n * native script), along with the name of the language in the current UI locale if known, with a\n * fallback to the English name (if known).\n *\n * @param {string} lang - The BCP-47 code of the language whose display name is being requested.\n * @param {string} uiLang - The BCP-47 code of the current user-interface language used used to\n * try to look up the name of the language in a form that is likely to be helpful to the user if\n * they do not recognize the autonym.\n * @returns {string} The display name of the language.\n */\n const getLanguageDisplayName = (lang: string, uiLang: string) => {\n const altName =\n uiLang !== lang\n ? (knownUiLanguages[lang]?.uiNames?.[uiLang] ?? knownUiLanguages[lang]?.uiNames?.en)\n : undefined;\n\n return altName\n ? `${knownUiLanguages[lang]?.autonym} (${altName})`\n : knownUiLanguages[lang]?.autonym;\n };\n\n return (\n
    \n {/* Language Selector */}\n setIsOpen(open)}\n >\n \n \n \n \n {Object.keys(knownUiLanguages).map((key) => {\n return (\n \n {getLanguageDisplayName(key, primaryLanguage)}\n \n );\n })}\n \n \n\n {/* Fallback Language Button */}\n {primaryLanguage !== 'en' && (\n
    \n \n
    \n )}\n
    \n );\n}\n\nexport default UiLanguageSelector;\n","import { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { LocalizedStringValue } from 'platform-bible-utils';\nimport { IconSearch } from '@tabler/icons-react';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { InputGroup, InputGroupAddon } from '@/components/shadcn-ui/input-group';\nimport { Command, CommandEmpty, CommandItem, CommandList } from '../../shadcn-ui/command';\nimport { LanguageInfo } from '../ui-language-selector.component';\n\n/**\n * Immutable array of localization keys this component uses. Pass into `useLocalizedStrings` and\n * feed the result to the `localizedStrings` prop.\n *\n * @experimental\n */\nexport const INTERFACE_LANGUAGE_PICKER_STRING_KEYS = Object.freeze([\n '%firstRun_language_search_placeholder%',\n '%firstRun_language_noResults%',\n '%firstRun_language_selected%',\n] as const);\n\n/** @experimental */\nexport type InterfaceLanguagePickerLocalizedStrings = {\n [K in (typeof INTERFACE_LANGUAGE_PICKER_STRING_KEYS)[number]]?: LocalizedStringValue;\n};\n\n/** @experimental */\nexport type InterfaceLanguagePickerProps = {\n /** Languages to offer, keyed by BCP-47 tag. Displayed by autonym (native script). */\n languages: Record;\n /** Currently selected BCP-47 tag. */\n value: string;\n /** Called with the chosen BCP-47 tag. */\n onChange: (tag: string) => void;\n /** Localized strings (search placeholder, no-results, selected label). */\n localizedStrings: InterfaceLanguagePickerLocalizedStrings;\n className?: string;\n id?: string;\n};\n\n/**\n * Folds text for searching: decomposes characters and drops the Combining Diacritical Marks\n * (U+0300–U+036F), so an unaccented query (`francais`) still matches an accented name (`Français`),\n * and likewise for Greek tonos and Vietnamese tone marks. Marks outside that block, such as\n * Devanagari matras and Khmer vowel signs, survive untouched.\n *\n * The block is not specific to one script, so this also merges some letters that are distinct\n * rather than accented, such as Cyrillic `й`/`и` and `ё`/`е`. The query is folded the same way as\n * the names, so that only broadens what matches. Letters whose diacritic does not decompose (`Ø`,\n * `Ł`, `Đ`, `Æ`, `ß`) are not folded: `foroyskt` does not find `Føroyskt`.\n */\nfunction foldForSearch(text: string): string {\n return text\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase();\n}\n\ntype LanguageEntry = {\n tag: string;\n info: LanguageInfo;\n /** Folded names this entry matches on. Never displayed. */\n keywords: string[];\n};\n\n/** Entries with at least one keyword containing the query. An empty query matches everything. */\nfunction filterEntries(entries: LanguageEntry[], query: string): LanguageEntry[] {\n if (!query) return entries;\n const folded = foldForSearch(query);\n return entries.filter(({ keywords }) => keywords.some((keyword) => keyword.includes(folded)));\n}\n\n/** English first, then by autonym (locale-aware). */\nfunction sortLanguages(entries: [string, LanguageInfo][]): [string, LanguageInfo][] {\n return [...entries].sort(([aTag, aInfo], [bTag, bInfo]) => {\n if (aTag === 'en' && bTag !== 'en') return -1;\n if (bTag === 'en' && aTag !== 'en') return 1;\n return aInfo.autonym.localeCompare(bInfo.autonym);\n });\n}\n\n/**\n * Searchable, scrollable list for choosing the interface language. Each option is shown by its\n * autonym (native script); search matches the autonym, names in other UI languages, and other known\n * names (the latter for matching only — never displayed). Scales to hundreds of languages.\n *\n * @experimental\n */\nexport function InterfaceLanguagePicker({\n languages,\n value,\n onChange,\n localizedStrings,\n className,\n id,\n}: InterfaceLanguagePickerProps) {\n // Using a plain instead of cmdk's CommandPrimitive.Input entirely decouples the\n // search box from cmdk's internal store. cmdk v1 updates CommandPrimitive.Input's value\n // after item selection (whether via onValueChange or store sync), contaminating the search\n // and triggering our visibleEntries filter. A plain with React-controlled\n // value={search} is immune to cmdk touching it; keydown events still bubble up to the\n // Command root div so arrow-key / Enter navigation continues to work.\n const [search, setSearch] = useState('');\n\n // The row the user moved cmdk's highlight onto (arrow keys, hover, or click). Cleared whenever the\n // query changes, so a row chosen under the old query doesn't outrank the new query's matches.\n const [preferredTag, setPreferredTag] = useState();\n\n // null is the canonical initial value for React DOM refs.\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n // null is the canonical initial value for React DOM refs.\n // eslint-disable-next-line no-null/no-null\n const listRef = useRef(null);\n const rowRefs = useRef(new Map());\n const [listId, setListId] = useState();\n\n // Precompute the folded search keywords per language here so they aren't rebuilt on every render.\n const entries = useMemo(\n () =>\n sortLanguages(Object.entries(languages)).map(([tag, info]) => ({\n tag,\n info,\n keywords: [\n info.autonym,\n ...Object.values(info.uiNames ?? {}),\n ...(info.otherNames ?? []),\n ].map(foldForSearch),\n })),\n [languages],\n );\n\n const visibleEntries = useMemo(() => filterEntries(entries, search), [entries, search]);\n\n // cmdk's keyboard highlight: the row Enter chooses. With `shouldFilter={false}` cmdk can't tell\n // the list changed, and a controlled cmdk value naming no rendered row highlights nothing and\n // swallows Enter. So derive it from what is rendered now, however that changed (typing, or\n // `value` / `languages` arriving after mount): the row the user moved to, else the current\n // language (so Enter without typing re-picks it), else the top match.\n const highlightedTag = useMemo(() => {\n const isVisible = (tag: string | undefined): tag is string =>\n !!tag && visibleEntries.some((entry) => entry.tag === tag);\n if (isVisible(preferredTag)) return preferredTag;\n if (isVisible(value)) return value;\n return visibleEntries[0]?.tag ?? '';\n }, [preferredTag, value, visibleEntries]);\n\n const showSearch = entries.length > 1;\n\n // cmdk overwrites the ids of its list and rows with its own, so they are read back from the DOM.\n useLayoutEffect(() => {\n setListId(listRef.current?.id);\n }, []);\n\n // A controlled cmdk value skips the follow-up cmdk does when it moves the highlight itself, so\n // do it here. The active descendant changes on every highlight move, so it is written straight to\n // the input rather than through state, which would render twice per keystroke. Scroll only when\n // this component moved the highlight: cmdk already scrolls for arrow keys, and deliberately never\n // scrolls the row under the pointer.\n useLayoutEffect(() => {\n const row = rowRefs.current.get(highlightedTag);\n // Absent while there is only one language; `showSearch` re-runs this when the box appears.\n const input = showSearch ? inputRef.current : undefined;\n if (input) {\n if (row) input.setAttribute('aria-activedescendant', row.id);\n else input.removeAttribute('aria-activedescendant');\n }\n if (row && highlightedTag !== preferredTag) row.scrollIntoView({ block: 'nearest' });\n }, [highlightedTag, preferredTag, showSearch]);\n\n const searchPlaceholder = localizedStrings['%firstRun_language_search_placeholder%'] ?? '';\n const noResults = localizedStrings['%firstRun_language_noResults%'] ?? '';\n const selectedLabel = localizedStrings['%firstRun_language_selected%'] ?? '';\n\n return (\n \n {showSearch && (\n // Plain (not CommandPrimitive.Input) so cmdk cannot update this field after\n // item selection. Arrow-key and Enter events from here bubble to the Command root div\n // where cmdk's keydown handler picks them up for list navigation.\n
    \n \n {\n setSearch(e.currentTarget.value);\n setPreferredTag(undefined);\n }}\n className=\"tw:w-full tw:text-sm tw:outline-hidden tw:disabled:cursor-not-allowed tw:disabled:opacity-50\"\n />\n \n \n \n \n
    \n )}\n \n {noResults}\n {visibleEntries.map(({ tag, info }) => {\n const isSelected = tag === value;\n return (\n {\n if (row) rowRefs.current.set(tag, row);\n else rowRefs.current.delete(tag);\n }}\n value={tag}\n // aria-current (not aria-selected, which cmdk uses for the keyboard-highlighted item).\n // `data-checked` drives the check mark the vendored CommandItem ALREADY renders\n // (command.tsx appends an IconCheck gated on `group-data-[checked=true]`), so we don't\n // render our own icon (that would double it up). We still add a visually-hidden label\n // so screen readers announce the selection.\n aria-current={isSelected ? 'true' : undefined}\n data-checked={isSelected ? 'true' : undefined}\n onSelect={() => onChange(tag)}\n >\n {/* dir=\"auto\" so each autonym lays out per its own script (e.g. RTL Arabic, or the\n parentheses in 中文(简体)) regardless of the wizard's ambient direction. */}\n {info.autonym}\n {isSelected && {selectedLabel}}\n \n );\n })}\n \n \n );\n}\n\nexport default InterfaceLanguagePicker;\n","import { Label } from '@/components/shadcn-ui/label';\nimport { ReactNode } from 'react';\n\ntype SmartLabelProps = {\n item: string;\n createLabel?: (item: string) => string;\n createComplexLabel?: (item: string) => ReactNode;\n};\n\n/** Create labels with text, react elements (e.g. links), or text + react elements */\nfunction SmartLabel({ item, createLabel, createComplexLabel }: SmartLabelProps): ReactNode {\n if (createLabel) {\n return ;\n }\n if (createComplexLabel) {\n return ;\n }\n return ;\n}\n\nexport default SmartLabel;\n","import { Checkbox } from '@/components/shadcn-ui/checkbox';\nimport { ReactNode } from 'react';\nimport SmartLabel from './smart-label.component';\n\n/**\n * @deprecated 2026-06-08 Use {@link CheckboxGroupProps} instead. `ChecklistProps` is kept as the\n * existing export for backward compatibility and will be removed in a future release.\n */\nexport type ChecklistProps = {\n /** Optional string representing the id attribute of the Checklist */\n id?: string;\n /** Optional string representing CSS class name(s) for styling */\n className?: string;\n /** Array of strings representing the checkable items */\n listItems: string[];\n /** Array of strings representing the checked items */\n selectedListItems: string[];\n /**\n * Function that is called when a checkbox item is selected or deselected\n *\n * @param item The string description for this item\n * @param selected True if selected, false if not selected\n */\n handleSelectListItem: (item: string, selected: boolean) => void;\n\n /**\n * Optional function creates a label for a provided checkable item\n *\n * @param item The item for which a label is to be created\n * @returns A string representing the label text for the checkbox associated with that item\n */\n createLabel?: (item: string) => string;\n\n /**\n * Optional function creates a label for a provided checkable item\n *\n * @param item The item for which a label is to be created, including text and any additional\n * elements (e.g. links)\n * @returns A react node representing the label text and any additional elements (e.g. links) for\n * the checkbox associated with that item\n */\n createComplexLabel?: (item: string) => ReactNode;\n};\n\n/**\n * Renders a list of checkboxes. Each checkbox corresponds to an item from the `listItems` array.\n *\n * @deprecated 2026-06-08 Use {@link CheckboxGroup} instead. `Checklist` is kept as the existing\n * export for backward compatibility and will be removed in a future release.\n */\nexport function Checklist({\n id,\n className,\n listItems,\n selectedListItems,\n handleSelectListItem,\n createLabel,\n createComplexLabel,\n}: ChecklistProps) {\n return (\n
    \n {listItems.map((item) => (\n
    \n handleSelectListItem(item, value)}\n />\n \n
    \n ))}\n
    \n );\n}\n\nexport default Checklist;\n\n/** Renders a list of checkboxes. Each checkbox corresponds to an item from the `listItems` array. */\nexport const CheckboxGroup = Checklist;\n\n/** Props for {@link CheckboxGroup}. */\nexport type CheckboxGroupProps = ChecklistProps;\n","import { Fragment, useState } from 'react';\nimport { formatReplacementStringToArray } from 'platform-bible-utils';\nimport { cn } from '@/utils/shadcn-ui/utils';\nimport { Kbd } from '@/components/shadcn-ui/kbd';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/shadcn-ui/tooltip';\n\n/** Props for {@link DestructiveKeyConfirmation}. */\nexport type DestructiveKeyConfirmationProps = {\n /** Whether the confirmation hint is currently showing. */\n open: boolean;\n /**\n * Position and size of the invisible anchor, in the coordinates of the nearest `position:\n * relative` ancestor. Typically the bounding rect of the element the hint should point at (e.g. a\n * verse marker), recomputed by the caller as it moves/scrolls.\n */\n anchorRect: { top: number; left: number; width: number; height: number };\n /** Localized message to display. Include a `{key}` placeholder where the confirming key belongs. */\n message: string;\n /**\n * Localized/display label for the key that confirms the action on a second press (e.g.\n * \"Backspace\").\n */\n confirmingKeyLabel: string;\n /**\n * Tooltip placement side. Defaults to `'bottom'`.\n *\n * Only `'top'`/`'bottom'` are supported — the bordered arrow this component renders relies on\n * clip-path/translate math in `tooltip.tsx` that has only been worked out for those two sides;\n * the equivalent math for `'left'`/`'right'` was tried and found visibly broken (see\n * tooltip.tsx), so those two values are omitted from this component's public API rather than\n * silently degrading to a borderless arrow.\n */\n side?: 'top' | 'bottom';\n /** Tooltip placement alignment. Defaults to `'start'`. */\n align?: 'start' | 'center' | 'end';\n /** Whether to render the pointer arrow. Defaults to `true`. */\n showArrow?: boolean;\n};\n\n/**\n * Returns `value` while `open` is true. Once `open` goes false, keeps returning whatever `value`\n * was the moment `open` was last true, instead of tracking further changes to it.\n *\n * For a caller that resets its props to \"closed\" defaults in the very same render that `open` flips\n * false (as `DestructiveKeyConfirmation`'s caller does), this lets consumers keep rendering the\n * last real content instead of going blank while something else — e.g. Radix `Presence`,\n * mid-exit-animation — keeps the element mounted a while longer.\n */\nexport function useFrozenWhileClosed(open: boolean, value: T): T {\n const [wasOpen, setWasOpen] = useState(open);\n const [frozen, setFrozen] = useState(value);\n if (open !== wasOpen) {\n setWasOpen(open);\n if (open) setFrozen(value);\n }\n return open ? value : frozen;\n}\n\n/**\n * A destructive-styled \"press again to confirm\" hint, anchored to an arbitrary point (`anchorRect`)\n * rather than a rendered trigger element. Built for two-step destructive actions (e.g. deleting a\n * verse marker on a second Backspace/Delete) where the caller owns detecting the \"armed\" state and\n * this component only renders the hint.\n */\nexport function DestructiveKeyConfirmation({\n open,\n anchorRect,\n message,\n confirmingKeyLabel,\n side = 'bottom',\n align = 'start',\n showArrow = true,\n}: DestructiveKeyConfirmationProps) {\n // The TooltipTrigger below is aria-hidden and never receives hover/focus (arming is driven by the\n // caller's own DOM detection, not pointer/focus events), so the visual tooltip is invisible to\n // assistive tech. Announce the same message through a separate visually-hidden live region: a\n // plain-text render of `message` (the Kbd's styling doesn't matter for a screen reader) that\n // becomes non-empty only while armed, so its change is what triggers the announcement.\n const srMessage = open\n ? formatReplacementStringToArray(message, { key: confirmingKeyLabel }).join('')\n : '';\n\n // The caller typically flips anchorRect/message/confirmingKeyLabel/showArrow back to their\n // \"unarmed\" values (e.g. an empty confirmingKeyLabel, a zeroed anchorRect) in the very same\n // render that `open` goes false. TooltipContent, though, stays mounted for its Radix\n // fade-out-0/zoom-out-95 exit animation (tooltip.tsx), so rendering directly off current props\n // during that animation would shrink an already-empty, wrongly-positioned box. Freeze the last\n // armed snapshot while `open` is true and keep rendering from it once `open` goes false, so the\n // exit animation fades the real hint away instead of an empty box.\n const {\n anchorRect: displayAnchorRect,\n message: displayMessage,\n confirmingKeyLabel: displayConfirmingKeyLabel,\n showArrow: displayShowArrow,\n } = useFrozenWhileClosed(open, { anchorRect, message, confirmingKeyLabel, showArrow });\n\n return (\n \n \n {srMessage}\n \n {/* onOpenChange no-op satisfies Radix's controlled-component contract and silences the dev warning */}\n {}}>\n \n \n {/* Rendered unconditionally (not gated on `open`) so the frozen armedSnapshot content\n above stays mounted through Radix's exit animation instead of vanishing to an empty\n box the instant `open` goes false — see the freezing comment above. Before the hint\n is ever armed once, TooltipContent itself isn't in the DOM yet (Radix's Presence\n doesn't mount it until the first `open`), so there's nothing to render prematurely. */}\n {/* Plain block/inline flow, not flex: the message text and the Kbd need to share one\n inline formatting context so wrapping behaves like ordinary text. With inline-flex,\n each text chunk around {key} becomes its own flex item, and when the trailing chunk\n wraps, its second line stays indented under wherever that flex item started (right\n after the Kbd) instead of returning to this div's left edge. Plain flow treats the\n Kbd as one atomic inline box inline with the surrounding text, so a wrapped line\n re-wraps to the container edge like a normal paragraph. This relies on each localized\n `message` having real whitespace around its `{key}` placeholder for the visual gap\n (flex's artificial `gap` is gone), which is true of every string in\n localizedStrings.json today. */}\n
    \n {formatReplacementStringToArray(displayMessage, {\n key: (\n \n {displayConfirmingKeyLabel}\n \n ),\n }).map((part, index) => (\n // The array is static per render (one fixed localized string + one kbd), so index is\n // a stable, safe key — same rationale as source-language-indexed-list.component.tsx's\n // disable.\n // eslint-disable-next-line react/no-array-index-key\n {part}\n ))}\n
    \n \n
    \n
    \n );\n}\n\nexport default DestructiveKeyConfirmation;\n","import { cn } from '@/utils/shadcn-ui/utils';\nimport { MoreVertical } from 'lucide-react';\nimport React, { ReactNode, useState } from 'react';\nimport { Button } from '../shadcn-ui/button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from '../shadcn-ui/dropdown-menu';\n\n/** Props interface for the ResultsCard base component */\nexport interface ResultsCardProps {\n /** Unique key for the card */\n cardKey: string;\n /** Whether this card is currently selected/focused */\n isSelected: boolean;\n /** Callback function called when the card is clicked */\n onSelect: () => void;\n /** Whether the content of this card are in a denied state */\n isDenied?: boolean;\n /** Whether the card should be hidden */\n isHidden?: boolean;\n /** Additional CSS classes to apply to the card */\n className?: string;\n /** Main content to display on the card */\n children: ReactNode;\n /** Additional buttons to show to the end of the card when selected, before the dropdown menu */\n selectedButtons?: ReactNode;\n /** Additional buttons to show when the card is hovered but not selected */\n hoverButtons?: ReactNode;\n /** Content to show in the dropdown menu when selected */\n dropdownContent?: ReactNode;\n /** Whether to show the dropdown menu button on hover even when not selected. Defaults to false */\n showDropdownOnHover?: boolean;\n /** Additional content to show below the main content */\n additionalContent?: ReactNode;\n /** Color to use for the card's accent border */\n accentColor?: string;\n}\n\n/**\n * ResultsCard is a base component for displaying scripture-related results in a card format, even\n * though it is not based on the Card component. It provides common functionality like selection\n * state, dropdown menus, and expandable content.\n */\nexport function ResultsCard({\n cardKey,\n isSelected,\n onSelect,\n isDenied,\n isHidden = false,\n className,\n children,\n selectedButtons,\n hoverButtons,\n dropdownContent,\n additionalContent,\n accentColor,\n showDropdownOnHover = false,\n}: ResultsCardProps) {\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n // Only handle keyboard activation on the card itself, not on focusable children\n // (e.g. buttons inside the card). Child elements handle their own keyboard events.\n if (event.target !== event.currentTarget) return;\n event.preventDefault();\n onSelect();\n }\n };\n\n // Only mount the DropdownMenu (and its portal) once the card has been hovered or selected.\n // This prevents dozens of DropdownMenuContent portals from mounting and crashing on teardown\n // when the webview is closed while many results are visible.\n // NOTE: this is a workaround that avoids mounting the portals, not a fix for the underlying\n // portal-teardown crash in the dropdown/portal layer; if that root cause is fixed this deferral\n // can be removed.\n const [hasBeenHovered, setHasBeenHovered] = useState(false);\n\n return (\n