@aiquants/markdown-explorer 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +26 -7
  3. package/dist/{ExplorerSplit-DB37U7Kh.js → ExplorerSplit-B7pmzR8t.js} +2 -2
  4. package/dist/{ExplorerSplit-D2plJRRe.cjs → ExplorerSplit-Bi3yU6NG.cjs} +1 -1
  5. package/dist/{MultiLayout-DCPDu1-l.js → MultiLayout-BxeXOLX1.js} +4 -4
  6. package/dist/{MultiLayout-UyWxs6Xy.cjs → MultiLayout-DtFrFRmS.cjs} +1 -1
  7. package/dist/{TreeLayout-CLWbWjOc.cjs → TreeLayout-BQUfVNlA.cjs} +1 -1
  8. package/dist/{TreeLayout-BoyFelK2.js → TreeLayout-D6hCSihW.js} +3 -3
  9. package/dist/core/config.d.cts +4 -2
  10. package/dist/core/config.d.ts +4 -2
  11. package/dist/{dataRoute-CKbdwkQ7.cjs → dataRoute-B9Wk-G7A.cjs} +1 -1
  12. package/dist/{dataRoute-Bkfwfp1R.js → dataRoute-zUX-oR9j.js} +39 -38
  13. package/dist/{index-BfuAu2GV.js → index-BJTmp0lR.js} +3 -3
  14. package/dist/{index-Cx3-jSna.cjs → index-DkiGlM7C.cjs} +1 -1
  15. package/dist/index.cjs +1 -1
  16. package/dist/index.js +13 -13
  17. package/dist/location-DfYTzfFS.cjs +1 -0
  18. package/dist/{location-fVl2R1ee.js → location-V5BKeWNs.js} +178 -164
  19. package/dist/sanitizeWorker.cjs +1 -1
  20. package/dist/sanitizeWorker.js +1 -1
  21. package/dist/server/anonymous.d.cts +2 -2
  22. package/dist/server/anonymous.d.ts +2 -2
  23. package/dist/server/ports.d.cts +4 -1
  24. package/dist/server/ports.d.ts +4 -1
  25. package/dist/server.cjs +1 -1
  26. package/dist/server.d.cts +1 -1
  27. package/dist/server.d.ts +1 -1
  28. package/dist/server.js +631 -603
  29. package/docs/behavior/security.md +16 -2
  30. package/package.json +3 -3
  31. package/dist/location-Oo21lTyV.cjs +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0 (2026-10-08)
4
+
5
+ ### Breaking
6
+
7
+ - **`authenticate` takes a mode**: the port is `(request: Request, mode: ExplorerAuthenticationMode) => Promise<ExplorerAuthentication<P>>`, with `ExplorerAuthenticationMode = { readonly readOnly: boolean }` (exported from `@aiquants/markdown-explorer/server`).
8
+ The page loader and every data operation but `link-card` pass `{ readOnly: false }`; the `link-card` operation passes `{ readOnly: true }`, in which the host only reads the session: it never refreshes a token, writes no cookie and returns no `headers` (cards ask in the background, and a refreshed cookie arriving after a sign-out would sign the reader back in).
9
+ The explorer fails closed: a read-only authentication that carries any header is logged through `logger` (operation `authenticate`) and answered `failed` with `private, no-store` and none of its headers; a throw is logged and answered `failed` the same way (an `ExplorerError` answers its own reason unlogged and an aborted request is not logged, as on every operation), never with `Set-Cookie`. `anonymousAccess` returns no headers in any mode and needs no change.
10
+ - **`embeds.linkCardEndpoint` is replaced by `embeds.linkCards`**: `defineExplorerConfig({ embeds: { providers?, linkCards?, linkCardSize? } })`. `linkCards: true` points the cards at the data route's own `link-card` operation, so the host's separate card endpoint and its route go away; `linkCardEndpoint` is now an unknown key and throws a `RangeError`, as does a `linkCards` that is not a boolean.
11
+ The resolved `config.embeds` stays the `MarkdownEmbeds` of `@aiquants/markdown/embeds`: `linkCardEndpoint` is `<dataPath>/link-card` when link cards are on, otherwise `null`. A resolved configuration is no longer a valid input of `defineExplorerConfig`; `createMarkdownExplorer` still validates the frozen value it receives again (it reads the resolved embeds back into the option and requires the endpoint `dataPath` derives); a resolved `embeds` that carries the option-only `linkCards`, whatever its value, throws a `RangeError` instead of being overwritten by what the endpoint implies.
12
+ - **`@aiquants/markdown` 6.1**: the peer range becomes `^6.1.0` when the package is published (the handler `createLinkCardHandler` of `@aiquants/markdown/server` and `linkCardSize`). Node.js: `engines.node` stays `>=22.22.0`, which already covers the `>=22.13.0` `@aiquants/markdown` now declares for its handler.
13
+
14
+ ### Added
15
+
16
+ - **The `link-card` operation**: with `embeds: { linkCards: true }`, `GET` and `HEAD` `<dataPath>/link-card?url=<href>` serve the cards through `@aiquants/markdown`'s `createLinkCardHandler`, created once in `createMarkdownExplorer` behind the read-only authentication. Its answers pass through unchanged: a card (`200`, `private, max-age=1800`), a link without a card (`204 No Content` with `X-Link-Card-Skip`: `private-network`, `forbidden-url`, `unreachable` or `not-html`) or the handler's own errors (`no-store`).
17
+ `signed-out` and `forbidden` mean no card. With link cards off, `link-card` answers `not-found` exactly as an unknown operation does. Internal addresses never become cards: the SSRF guards live in `@aiquants/markdown`, and neither the handler nor the explorer has an option to allow them. The endpoint is same-origin, so a content security policy needs no extra `connect-src`.
18
+ - **Card size**: `embeds.linkCardSize` (`compact`, `banner` or `full`, `LINK_CARD_SIZES` of `@aiquants/markdown/embeds`) passes into the resolved `MarkdownEmbeds.linkCardSize`; absent means `@aiquants/markdown`'s `banner`. An unknown size, or a size without `linkCards: true`, throws a `RangeError`.
19
+ - **Build check**: `verify-dist` proves both server builds keep `@aiquants/markdown/server` external and serve `link-card` through it (an internal address answered by the real handler's `204 private-network` after a read-only authentication, `not-found` with link cards off), and that no browser, storage or sanitizer-worker build reaches it.
20
+
21
+ ### Fixed
22
+
23
+ - **No header value in the log**: `headers` that `Headers` cannot read are refused with a fixed message instead of the runtime's, which quoted the value (a session cookie or token), in the page loader and on every data operation, `link-card` included; and a `Response` that `authenticate` throws in a data request (React Router's `throw redirect(...)`) is logged as a `TypeError` naming its status instead of with its headers.
24
+ The answers do not change (`failed`, `private, no-store`, no `Set-Cookie`); unreadable `headers` of a data request are now logged as `authenticate` instead of under the operation's name.
25
+
3
26
  ## 0.2.0 (2026-10-07)
4
27
 
5
28
  ### Changed
package/README.md CHANGED
@@ -19,7 +19,7 @@ reloaded document is announced, and a failed reload keeps the document under a n
19
19
  announced too and stays until a newer copy of the document replaces or confirms it, the reader moves to another
20
20
  document, or the next refresh starts.
21
21
  A single-view (embedding) page never downloads the tree and multi-panel views, which load on demand.
22
- - **Embeds and link cards** — with `embeds` in the configuration, a link alone in a paragraph shows its post or video from up to ten providers (YouTube, X, Instagram, Threads, TikTok, Bluesky, LinkedIn, Reddit, note and niconico) in a cross-origin frame, with no provider script in the page, or a card from your own link-card endpoint; the link itself always stays, under the frame, as the card or as the paragraph.
22
+ - **Embeds and link cards** — with `embeds` in the configuration, a link alone in a paragraph shows its post or video from up to ten providers (YouTube, X, Instagram, Threads, TikTok, Bluesky, LinkedIn, Reddit, note and niconico) in a cross-origin frame, with no provider script in the page, or a link card the explorer's own data route reads (`{dataPath}/link-card`, through `@aiquants/markdown`'s link-card handler: internal addresses never become cards); the link itself always stays, under the frame, as the card or as the paragraph.
23
23
  - **Secure by default** — Markdown HTML is sanitized on the server with an allow-list (scripts, event handlers, `srcdoc` and foreign iframes never reach the browser), and the document viewer applies its own on every render (a document keeps only the converter's class tokens, and ids only on headings, footnotes and `user-content-…` targets); document paths are validated, and deny rules hide environment files, keys and version-control metadata through up to three percent-decoding levels; tokens, principals, server paths and raw error messages never leave the server.
24
24
  - **Multi-panel reading** — open documents as panels, rearrange them by dragging (on a touch screen or with a pen, after a long-press on a panel's header), with the move buttons in each panel's header, or with Alt + Shift + arrow keys, hide, maximize (Escape restores), and navigate inside a panel; the arrangement survives reloads, and a document reopened later returns to its column.
25
25
  - **Accessible and localized** — named landmarks and controls, a keyboard-operable tree with one Tab stop on the shown document, keyboard-operable menus, panel headers and resize handle, polite announcements (spoken from the sheet while it is open), WCAG 2.2 contrast in light and dark; English (default) and Japanese built in — the tree's and the panel headers' strings included —, every string overridable.
@@ -28,7 +28,8 @@ A single-view (embedding) page never downloads the tree and multi-panel views, w
28
28
 
29
29
  - React 19.2.7 or later and React Router 8 in framework mode (route modules with `loader` / `headers`).
30
30
  - Node.js 22.22 or later (the floor React Router 8 declares). The package ships ES modules and CommonJS; the CommonJS entries load the ESM-only `react-router` through `require(esm)`.
31
- - The peer packages, at these versions or later within the caret ranges the package declares: `@aiquants/markdown` ^6.0.0 (document rendering; its math diagnostics, gantt sizing, embeds and link cards, and the React-free `@aiquants/markdown/embeds` the sanitizer worker loads), `@aiquants/directory-tree` ^4.1.0 (reveals of rows under the scroll bar's buttons), `@aiquants/drag-drop-panels` ^0.9.1, `@aiquants/resize-panels` ^2.1.0 (the source of each layout change, by which the tree pane's width is saved) and `@aiquants/virtualscroll` ^3.11.4.
31
+ - The peer packages, at these versions or later within the caret ranges the package declares: `@aiquants/markdown` ^6.1.0 (document rendering; its math diagnostics, gantt sizing, embeds, link cards and their sizes, the React-free `@aiquants/markdown/embeds` the sanitizer worker loads, and the Node-only link-card handler of `@aiquants/markdown/server`, which needs Node.js 22.13 or later — below the explorer's own floor),
32
+ `@aiquants/directory-tree` ^4.1.0 (reveals of rows under the scroll bar's buttons), `@aiquants/drag-drop-panels` ^0.9.1, `@aiquants/resize-panels` ^2.1.0 (the source of each layout change, by which the tree pane's width is saved) and `@aiquants/virtualscroll` ^3.11.4.
32
33
  The client depends on these floors, while a package manager may only warn about an older peer.
33
34
  - A Markdown parser of your choice on the server that produces HTML and its headings (the explorer sanitizes the HTML before it is sent).
34
35
  - Browsers: the multi view's panel-limit notice uses the Popover API (Chrome and Edge 114, Firefox 125, Safari 17 and later). In browsers without it (for example iOS 16), the notice is drawn in place at the stage's corner instead of in the top layer (while the sheet is open it spans the sheet's header, as in every browser).
@@ -72,7 +73,7 @@ The source ids are not part of it: they are the ids of the server's `sources` (a
72
73
  | `expandAll?` | `{ maxFolders?, maxDepth? }` | Expand all's budget per press (see [Expand all and Collapse all](#expand-all-and-collapse-all)): the folder listings a press may start (1–10,000, default 500, `EXPAND_ALL_FOLDER_LIMITS`) and the deepest level (the top being 1) at which it opens a folder of unknown contents (1–64, default 16, `EXPAND_ALL_DEPTH_LIMITS`). Each field defaults on its own, also when given as `undefined`; a value that is not an integer within its bounds or an unknown key throws a `RangeError` naming the field, and anything but a plain object a `TypeError`. |
73
74
  | `documentStyles?` | `readonly { name, className }[]` | Document styles, the first being the default; `@aiquants/markdown`'s `DEFAULT_MARKDOWN_STYLES` (None, GitHub, Zenn; also exported without React from `@aiquants/markdown/viewer-settings`) when omitted. |
74
75
  | `iframeHosts?` | `readonly string[]` | Host names whose `https:` iframes written in documents may load (exact match); none when omitted. They gate only iframes written in documents; provider frames come from `embeds`, and no iframe of the page's own origin ever renders, whatever is listed. |
75
- | `embeds?` | `{ providers?, linkCardEndpoint? }` | What `@aiquants/markdown` makes of a link alone in a paragraph. `providers` lists the ids (`EMBED_PROVIDER_IDS` of `@aiquants/markdown/embeds`: `youtube`, `x`, `instagram`, `threads`, `tiktok`, `bluesky`, `linkedin`, `reddit`, `note`, `niconico`) whose posts and videos documents embed as cross-origin frames, whatever the link's text; `linkCardEndpoint` is the same-origin path of your link-card endpoint (the mount-path grammar), which turns a link written as its own URL into a card. Each field defaults to none, also when given as `undefined` (`null` is also none for the endpoint, as in `MarkdownEmbeds`), so without the option such a link stays its paragraph. Repeated ids are removed. An unknown id, a malformed endpoint or an unknown key throws a `RangeError` (`[markdown-explorer] embeds…`), and anything but a plain object a `TypeError`. The endpoint answers `GET <path>?url=<href>` with JSON `{ title?, description?, site_name?, image?, icon? }`, sets no cookie and refreshes no credential (the request runs in the background and can be in flight during a sign-out); a redirect, a 401, any other non-OK status or a non-JSON answer means no card. See `@aiquants/markdown`'s README (Embeds) for the URLs each provider recognizes and the frames' sizes. |
76
+ | `embeds?` | `{ providers?, linkCards?, linkCardSize? }` | What `@aiquants/markdown` makes of a link alone in a paragraph. `providers` lists the ids (`EMBED_PROVIDER_IDS` of `@aiquants/markdown/embeds`: `youtube`, `x`, `instagram`, `threads`, `tiktok`, `bluesky`, `linkedin`, `reddit`, `note`, `niconico`) whose posts and videos documents embed as cross-origin frames, whatever the link's text. `linkCards: true` turns a link written as its own URL into a card, which the data route's own `link-card` operation serves (see [Link cards](#link-cards)): no route of yours is needed. `linkCardSize` picks the size of every card, `compact`, `banner` or `full` (`LINK_CARD_SIZES` of `@aiquants/markdown/embeds`; `@aiquants/markdown`'s `banner` when omitted), and needs `linkCards: true`. Each field defaults to none (`[]`, `false`, omitted), also when given as `undefined`, so without the option such a link stays its paragraph. Repeated ids are removed. An unknown id, a `linkCards` that is not a boolean, an unknown size, a size without `linkCards: true` or an unknown key (`linkCardEndpoint` included) throws a `RangeError` (`[markdown-explorer] embeds…`), and anything but a plain object a `TypeError`. The resolved `config.embeds` is the `MarkdownEmbeds` the viewer takes: `linkCardEndpoint` is `<dataPath>/link-card` when link cards are on and `null` otherwise, and `linkCardSize` is present only when given. See `@aiquants/markdown`'s README (Embeds) for the URLs each provider recognizes, the frames' sizes and the cards' sizes. |
76
77
  | `defaultTreeSettings?` | `Partial<TreeSettings>` | The reader's tree settings before they change any, merged over the package's `DEFAULT_TREE_SETTINGS` (the source's own order, folders not first, Single selection, a recursive double click, 8 px expand icons, nothing kept expanded, the root indent kept, lines, expand icons and folder and file icons on). Each value is one the settings menu offers: `sortMode` `"native"`, `"asc"` or `"desc"`; `selectionMode` `"single"`, `"multiple"` or `"none"`; `doubleClickAction` `"recursive"` or `"toggle"`; `expandIconSize` `8`, `13` or `5`; the other settings (`directoriesFirst`, `alwaysExpanded`, `removeRootIndent`, `lines`, `expandIcons`, `directoryIcons`, `fileIcons`) `true` or `false`. An unknown key or any other value throws a `RangeError`, and anything but a plain object (a `Map`, a class instance, an object inheriting its settings) throws a `TypeError`; a setting given as `undefined` keeps the package default. The server render and the hydration draw these defaults (see [Tree settings](#tree-settings)). |
77
78
 
78
79
  For example, `defaultTreeSettings: { sortMode: "desc" }` lists every folder's entries by name, Z to A, until the reader picks another order.
@@ -261,7 +262,7 @@ The full contract, including canonicalization, is in [URL contract](docs/behavio
261
262
  | Option | Type | Purpose |
262
263
  | --- | --- | --- |
263
264
  | `config` | `ExplorerConfig` | The shared configuration; the source ids come from `sources`. |
264
- | `authenticate` | `(request) => Promise<ExplorerAuthentication<P>>` | `signed-in` with a principal, `signed-out`, or `forbidden`; `headers` (for example a refreshed session cookie) are added to every response. |
265
+ | `authenticate` | `(request, mode) => Promise<ExplorerAuthentication<P>>` | `signed-in` with a principal, `signed-out`, or `forbidden`; `headers` (for example a refreshed session cookie) are added to every response. `mode` is an `ExplorerAuthenticationMode`, `{ readOnly: boolean }`: the page loader and every data operation but `link-card` pass `{ readOnly: false }`; the `link-card` operation passes `{ readOnly: true }`, and then the host only reads the session — it never refreshes a token, writes no cookie and returns no `headers` — because cards ask in the background and a refreshed cookie arriving after a sign-out would sign the reader back in. The explorer fails closed: a read-only authentication that carries any header is logged and answered as a failure (see [Link cards](#link-cards)). |
265
266
  | `principalKey` | `(principal) => string` | A stable identity of the principal (it must not change when a token refreshes); used to isolate caches and, through an HMAC under `scopeSecret`, as the browser's pseudonymous scope. |
266
267
  | `scopeSecret` | `string` | The deployment's secret for the readers' scopes: at least 32 characters (a shorter one throws a `RangeError`) and the same on every server instance. |
267
268
  | `sources` | `ExplorerSource<P>[]` | The sources in switcher order (at least one; the first is the default): `id` (lowercase letters, digits and `-`, starting with a letter or digit, unique; the URL's `source` value), `label` (a string, or a function of the principal), `boundary` (where the source's documents may lie, see [Source boundaries](#source-boundaries)), `tree(context)` (lists the source's roots), `children?(context, path, readPath)` for lazy folders (asked only while the tree shows the folder open — the reader opened it, Expand all opened it (a press keeps opening folders as their listings land, within `expandAll`), or a remembered expansion opened it — and only for a path inside the source's boundary; a listing no tree wants any more is aborted through `context.signal`, which the source should honour), `cacheScope?` (`"principal"`, the default, or `"shared"`). The `context` is described under [Entries and notices](#entries-and-notices). |
@@ -274,7 +275,7 @@ The full contract, including canonicalization, is in [URL contract](docs/behavio
274
275
  | `treeCache?` | `{ ttlMs?, maxEntries?, maxBytes? } \| false` | The server's tree cache, each limit defaulting on its own (5 minutes, 64 entries, 64 MiB of the trees' JSON, counted at two bytes per character). The time to live counts from the moment the tree's walk began, and an expired tree is never answered: a page load or tree request after it waits for one new walk, which every concurrent request shares. Each cached tree is also kept parsed beside its JSON, which `maxBytes` does not count; its share falls as names get longer and is higher for non-ASCII names (measured on trees of 20,000 entries: about 1.0 to 1.9 times the counted bytes for ASCII names of 40 down to 4 characters, 1.4 to 2.2 times for non-ASCII names), and a tree with any non-ASCII name keeps a two-byte JSON as large as its count, so plan for up to about 2.4 times `maxBytes` of memory per process with ASCII names and up to about 3.2 times with short non-ASCII names. `false` turns the cache off. |
275
276
  | `sanitizer?` | `{ workers?, deadlineMs?, maxHtmlBytes?, cacheBytes?, workerHeapMb?, jobsPerScope?, maxQueuedJobs? }` | The HTML sanitizer, each field defaulting on its own: 2 worker threads, a 30 s deadline per document, HTML up to 4 MiB, a 64 MiB cache of outcomes, 512 MiB of heap per worker (`workerHeapMb`), at most `multiView.maxPanels` + max(1, `workers` − 1) + 3 documents per reader running or waiting (`maxPanels` + 4 with the default two workers, 16 with the default 12 panels) and four times `jobsPerScope` waiting in all, also when `jobsPerScope` is set. Neither `jobsPerScope` nor `maxQueuedJobs` may be set below `multiView.maxPanels`, because a page sends the document of every panel at once and a reader who finds every worker busy waits with all of them; a smaller value throws a `RangeError` naming both options at startup, as does a `workerHeapMb` that leaves room for fewer than 4,096 parsed nodes beside HTML of `maxHtmlBytes`. A document over the size, nesting, node, comment or attribute limits, whose sanitized HTML is longer than four characters per byte of `maxHtmlBytes` (16,777,216 by default), past the deadline, or one that runs a worker out of heap is `too-large`; one beyond either admission limit, or one whose worker could not start, is `failed` (logged without the principal) and a later request tries again. A reader runs at most `workers` − 1 documents at once (one when there is a single worker): with the default two workers, one reader — or all anonymous readers, who share one scope and so one admission budget — uses one. |
276
277
  | `deferredTimeoutMs?` | `number` | How long the page loader waits for a streamed value (default 4000 ms; keep it below your server entry's `streamTimeout`). A late value renders the loading state on the server (never a failure) and is fetched by the browser once a pane shows it. The work behind a late tree or document keeps running for another `deferredTimeoutMs`, so the browser's data request for it can join that work instead of starting over (a host that joins requests for the same work keeps it for that request), and its `signal` aborts then; the work behind late notices, which the browser never fetches again, is aborted as soon as they are given up. |
277
- | `logger?` | `{ error(message, detail) }` | Where adapter failures and malformed source output are reported (default `console.error`). A tree or children entry with an empty name, or with a path the browser cannot address (empty, too long, a lone surrogate, a control character or a backslash — for example macOS's `Icon\r`), or outside its source's boundary, is left out together with its subtree and reported with the message `[markdown-explorer] <operation> left out an entry` and the detail `{ operation, sourceId, path, error }`, whose `error` names the reason; any other malformed listing becomes `failed`. A boundary that throws or answers malformed values is reported with the operation `boundary`, and so is the rejection of a promise a `contains` answers (it is not awaited and counts as outside). |
278
+ | `logger?` | `{ error(message, detail) }` | Where adapter failures and malformed source output are reported (default `console.error`). A tree or children entry with an empty name, or with a path the browser cannot address (empty, too long, a lone surrogate, a control character or a backslash — for example macOS's `Icon\r`), or outside its source's boundary, is left out together with its subtree and reported with the message `[markdown-explorer] <operation> left out an entry` and the detail `{ operation, sourceId, path, error }`, whose `error` names the reason; any other malformed listing becomes `failed`. A boundary that throws or answers malformed values is reported with the operation `boundary`, and so is the rejection of a promise a `contains` answers (it is not awaited and counts as outside). A failed authentication of a data request is reported with the operation `authenticate` and never quotes a header: `headers` that `Headers` cannot read are reported by a fixed message, and a `Response` that `authenticate` throws (React Router's `throw redirect(...)`) by its status alone; any other exception of your adapters is logged as thrown, so keep secrets out of it. |
278
279
  | `onTreeRefreshed?` | `(key: string) => void` | Called once per tree refresh, after its reload settled (whatever its result) unless the request went away, with the refreshed tree's cache key (opaque). A multi-process host relays the key to its other processes, which call `forgetTree(key)` (see [Hosting notes](#hosting-notes)). Its return value is ignored, but a promise it returns (an asynchronous relay) is observed, never awaited: a throw, or the rejection of that promise, is logged with the operation `refresh` and does not change the response. |
279
280
 
280
281
  It returns `{ loader, headers, dataLoader, dataAction, forgetTree }`. `forgetTree(key)` drops this process's cached tree for a key another process refreshed and supersedes a load of it that already began (its waiting requests still receive that tree, which is not kept); it starts no load and throws a `TypeError` for a non-string key. Export `headers` from the page route: it carries the loader's `Cache-Control: private, no-store` to both the HTML and the single-fetch responses.
@@ -454,15 +455,31 @@ and `Cache-Control: private, max-age=60, stale-while-revalidate=600, no-transfor
454
455
  The body of a 200 or 206 with a `Content-Length` carries exactly that many bytes: the explorer drops the bytes past it and cancels the stream `open` returned, and fails the response when that stream ends short, so a file that changes while it is served never gets a body that disagrees with its length and ETag.
455
456
  The URL carries the path in its query, so no name needs an extra escape and the request's own path never ends in `.data`; a document's URL carries `v=<version>` as a cache-buster, which the server never reads (the ETag is always the current version).
456
457
 
458
+ ### Link cards
459
+
460
+ With `embeds: { linkCards: true }`, the data route has a `link-card` operation: `GET` or `HEAD` `<dataPath>/link-card?url=<href>`, which `@aiquants/markdown`'s link card asks (same-origin, in the background, once the card nears the viewport). It is the only route of the cards: the explorer creates `@aiquants/markdown`'s `createLinkCardHandler` once, in `createMarkdownExplorer`, behind the read-only authentication, and passes every answer of it through unchanged — status, headers and cache headers. In order:
461
+
462
+ 1. A single-fetch request (`<dataPath>/link-card.data`) answers `not-found` (404), as every operation does; with link cards off, `link-card` answers `not-found` exactly as an unknown operation does, whatever the method.
463
+ 2. A method other than `GET` and `HEAD` answers 405 with `Allow: GET, HEAD`, before authenticating.
464
+ 3. `authenticate(request, { readOnly: true })` runs. `signed-in` lets the handler answer; `signed-out` and `forbidden` both mean no card (the handler's 401, `no-store`).
465
+ An authentication that carries any header — even a non-empty `headers` with `signed-out` — breaks the read-only contract: none of its headers is forwarded, the failure is logged once through `logger` (operation `authenticate`), and the answer is a `failed` failure (500, `private, no-store`, no `Set-Cookie`). An `authenticate` that throws is handled the same way (an `ExplorerError` answers its reason unlogged, as everywhere; an aborted request is not logged).
466
+ The log never quotes a header: `headers` that `Headers` cannot read are logged by a fixed message, and a `Response` that `authenticate` throws (React Router's `throw redirect(...)`) by its status alone.
467
+ 4. The handler answers: `200` with the card's JSON (`private, max-age=1800`), `204 No Content` with `X-Link-Card-Skip: <reason>` when the link gets no card (`private-network`, `forbidden-url`, `unreachable` or `not-html`), or its own `400`, `401` and `500` JSON with `no-store`. It never sets a cookie.
468
+
469
+ Internal addresses never become cards, in any environment: the handler refuses loopback, private, link-local and every other non-global address, internal names, names that resolve to such addresses and redirects to them, before connecting (see `@aiquants/markdown`'s README, Link-card endpoint). There is no option to allow them, in the handler or in the explorer. A skipped link renders as a compact card that keeps the link, and `@aiquants/markdown` writes one `console.info` line for it; the explorer logs nothing of its own for cards.
470
+
471
+ The cards need nothing extra in your content security policy: they ask the page's own origin, so `connect-src 'self'` covers them (only the cards' images and icons need `https:` in `img-src`, see [Hosting notes](#hosting-notes)). The handler needs Node.js 22.13 or later and keeps its own cache (cards 1 hour, skips as long as their `Cache-Control`, 1000 URLs) and connection pool per explorer.
472
+
457
473
  ### `anonymousAccess`
458
474
 
459
- Spread it into the configuration when your application has no sign-in: it provides `authenticate`, `principalKey` and `signedOutPage`.
475
+ Spread it into the configuration when your application has no sign-in: it provides `authenticate`, `principalKey` and `signedOutPage`. Its `authenticate` returns no `headers` in any mode, so it honours read-only mode as it is.
460
476
 
461
477
  ### Hosting notes
462
478
 
463
479
  - The HTML sanitizer runs in worker threads started from `sanitizeWorker.js` (`sanitizeWorker.cjs` for the CommonJS entry) next to the server entry, and creating the explorer fails when that file is missing: keep the package external in your server bundle instead of bundling it into your own file. Each worker has its own DOMPurify, so nothing else in your server shares its configuration. Running the package from its TypeScript sources (tests, a dev server aliased to `src/`) needs Node's type stripping (22.18+, 23.6+ or 24).
464
480
  - Serve a content security policy of your own; the explorer's sanitizer is the first line of defence, not the only one. In a single-page app a policy binds to the document, which client-side navigations keep, so set one policy for every page (at the root route or the document handler, or at the edge), never on the explorer's route responses alone: a policy sent only there is missing when the reader arrives by a client-side navigation, and stays on every page the reader visits next.
465
481
  The explorer needs `frame-src`, `img-src` and `media-src` to allow `'self'`, the origin of its own asset URLs (PDF documents open in a frame from that URL), plus `frame-src https://<host>` for each `iframeHosts` entry and each host of `embedFrameHostsOf(config.embeds.providers)` (from `@aiquants/markdown/embeds`); a policy with `connect-src` also needs `embedConnectOriginsOf(config.embeds.providers)` (the Bluesky handle lookup), and one with `img-src` needs `https:` for card images and icons.
482
+ Link cards need no extra `connect-src`: the card endpoint is the data route's own `link-card` operation, same-origin.
466
483
  It renders no `<object>` or `<embed>`, so `object-src 'none'` and `base-uri 'none'` hold for it; prefer a nonce-based `script-src` if your framework's inline hydration scripts allow it.
467
484
  A host that enables providers should also send `Cross-Origin-Opener-Policy: same-origin`: provider frames may open popups that escape their sandbox (`allow-popups-to-escape-sandbox`), and the policy severs such a popup's opener.
468
485
  - Every GET route on the explorer's origin is reachable from a document: a rendered document makes the reader's browser send credentialed same-origin GET requests through its images (`![](/path)`, `<img src>`), media (`<video poster>`, `<audio src>`) and frames without the reader's interaction, and through its links once the reader follows one; the sanitizer keeps relative and root-relative URLs because a document's own images are legitimate.
@@ -574,6 +591,7 @@ The reader's own explorer width is remembered per view as a percentage, and only
574
591
  - Every source is confined to its boundary: its tree and children list only paths inside it, a children request reaches the host only for a path the named source's boundary admits, and a document or a file's bytes reach the host only when the boundary of at least one source admits its path (see [Source boundaries](#source-boundaries)). A source whose boundary admits everything a reader can read in a store confines nothing in that store.
575
592
  - File bytes are served only by the explorer's `asset` operation, after the deny rules and the document admission, inline only for raster images, audio, video and PDF, always with `nosniff` and a `same-origin` resource policy, and with a sandboxing policy except for PDF, under which inline audio and video keep the URL's origin (`allow-same-origin`, no `allow-scripts`) (see [Serving files](#serving-files)).
576
593
  - Data responses are `private, no-store` JSON with `nosniff`, a sandboxing content security policy and `same-origin` resource policy, and the data route refuses React Router's single-fetch requests (`.data`), whose answers would carry none of those headers; the tree refresh, and a document request marked as triggered by a refresh (`X-Markdown-Explorer: refresh`, which makes the host skip its caches), require the custom request header and a same-origin fetch.
594
+ - Link cards are read by `@aiquants/markdown`'s handler behind a read-only authentication (no token refresh, no `Set-Cookie`; an authentication that carries headers is refused and logged), and its guards keep every internal address from becoming a card; see [Link cards](#link-cards).
577
595
  - Each data response carries an opaque, pseudonymous scope (an HMAC of the principal key under `scopeSecret`); when it changes, the browser drops every cache and remembered path. Browser storage is also checked against the page's scope on every page load, before anything reads it.
578
596
 
579
597
  Details: [Security](docs/behavior/security.md).
@@ -599,7 +617,8 @@ Tests and host styling may rely on the `data-testid` and `data-aqmx-*` attribute
599
617
  ## Demo
600
618
 
601
619
  The source repository holds a runnable demo next to the package (`packages/markdown-explorer/demo`): three file-system sources with anonymous access (`guide` and `notes`, kept apart by their path prefix, with one folder of the guide, `guide/a`, served lazily through `children`; and `reference`, rooted at the folder `guide/reference` inside `guide`, so a document under it appears in two trees under the same path),
602
- the page and data routes, the error boundary, document and asset ports that route each path to the first source whose boundary contains it (no asset route of its own), a Markdown parser that produces document links and image targets, GitHub alerts, Zenn's message and details containers, embed placeholders, and footnotes, task lists and formulas in the Go converter's markup, every embed provider with an offline link-card endpoint (`/api/link-card`, answering from fixtures; `guide/reference/embeds.md` and `guide/reference/link-cards.md` show them), and the end-to-end tests' fixtures.
620
+ the page and data routes, the error boundary, document and asset ports that route each path to the first source whose boundary contains it (no asset route of its own), a Markdown parser that produces document links and image targets, GitHub alerts, Zenn's message and details containers, embed placeholders, and footnotes, task lists and formulas in the Go converter's markup,
621
+ every embed provider and link cards served by the data route (`embeds: { providers, linkCards: true }`; `guide/reference/embeds.md` and `guide/reference/link-cards.md` show them; the end-to-end tests answer the browser's card requests from their own fixtures, so they stay offline), and the end-to-end tests' fixtures.
603
622
  Run it with `pnpm run demo:dev` from the package folder.
604
623
 
605
624
  ## License
@@ -1,8 +1,8 @@
1
1
  import { jsx as m, jsxs as S, Fragment as _e } from "react/jsx-runtime";
2
- import { u as k, F as ct, d as ge, f as Ie, g as it, E as dt, h as ut, i as mt, L as pt, j as ft } from "./index-BfuAu2GV.js";
2
+ import { u as k, F as ct, d as ge, f as Ie, g as it, E as dt, h as ut, i as mt, L as pt, j as ft } from "./index-BJTmp0lR.js";
3
3
  import * as p from "react";
4
4
  import { use as ie, createContext as ve, useState as N, useCallback as x, useMemo as C, useRef as v, useLayoutEffect as P, useSyncExternalStore as de, useEffect as H, Suspense as De, useId as ue } from "react";
5
- import { C as ht, k as xt, l as He, v as wt, m as gt, n as vt, E as bt, o as qe, q as Et, s as yt, S as ce, t as Rt, F as St, A as Tt } from "./location-fVl2R1ee.js";
5
+ import { C as ht, k as xt, l as He, v as wt, m as gt, n as vt, E as bt, o as qe, q as Et, s as yt, S as ce, t as Rt, F as St, A as Tt } from "./location-V5BKeWNs.js";
6
6
  import { useDirectoryTreeState as Lt, DirectoryTree as Nt } from "@aiquants/directory-tree";
7
7
  import { tapScrollCircleSampleVisual as kt } from "@aiquants/virtualscroll";
8
8
  import { s as qt } from "./storage-DA4ItHzl.js";
@@ -1 +1 @@
1
- "use strict";const i=require("react/jsx-runtime"),R=require("./index-Cx3-jSna.cjs"),r=require("react"),T=require("./location-Oo21lTyV.cjs"),ye=require("@aiquants/directory-tree"),Ue=require("@aiquants/virtualscroll"),We=require("./storage-Bkb2Axdi.cjs"),re=require("@aiquants/resize-panels"),Ge=require("react-router");function Ye(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const a=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,a.get?a:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const p=Ye(r);function Qe({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M19.5 21a3 3 0 0 0 3-3V9a3 3 0 0 0-3-3h-5.379a.75.75 0 0 1-.53-.22L11.47 3.66A2.25 2.25 0 0 0 9.879 3H4.5a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3h15ZM9 12.75a.75.75 0 0 0 0 1.5h6a.75.75 0 0 0 0-1.5H9Z",clipRule:"evenodd"}))}const Je=p.forwardRef(Qe);function et({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M19.5 21a3 3 0 0 0 3-3V9a3 3 0 0 0-3-3h-5.379a.75.75 0 0 1-.53-.22L11.47 3.66A2.25 2.25 0 0 0 9.879 3H4.5a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3h15Zm-6.75-10.5a.75.75 0 0 0-1.5 0v2.25H9a.75.75 0 0 0 0 1.5h2.25v2.25a.75.75 0 0 0 1.5 0v-2.25H15a.75.75 0 0 0 0-1.5h-2.25V10.5Z",clipRule:"evenodd"}))}const tt=p.forwardRef(et);function nt({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{d:"M16.5 6a3 3 0 0 0-3-3H6a3 3 0 0 0-3 3v7.5a3 3 0 0 0 3 3v-6A4.5 4.5 0 0 1 10.5 6h6Z"}),p.createElement("path",{d:"M18 7.5a3 3 0 0 1 3 3V18a3 3 0 0 1-3 3h-7.5a3 3 0 0 1-3-3v-7.5a3 3 0 0 1 3-3H18Z"}))}const rt=p.forwardRef(nt);function at({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M3 6a3 3 0 0 1 3-3h2.25a3 3 0 0 1 3 3v2.25a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3V6Zm9.75 0a3 3 0 0 1 3-3H18a3 3 0 0 1 3 3v2.25a3 3 0 0 1-3 3h-2.25a3 3 0 0 1-3-3V6ZM3 15.75a3 3 0 0 1 3-3h2.25a3 3 0 0 1 3 3V18a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3v-2.25Zm9.75 0a3 3 0 0 1 3-3H18a3 3 0 0 1 3 3V18a3 3 0 0 1-3 3h-2.25a3 3 0 0 1-3-3v-2.25Z",clipRule:"evenodd"}))}const lt=p.forwardRef(at),ot=()=>{const{notices:e}=R.useExplorer(),t=r.use(e);return t.length===0?null:i.jsx("div",{className:"aqmx-explorer-notices",children:t.map(n=>i.jsxs("div",{className:"aqmx-callout","data-aqmx-tone":n.tone,"data-testid":"markdown-explorer-notice","data-aqmx-notice":n.id,children:[i.jsx("p",{className:"aqmx-callout-title",children:n.title}),n.body===void 0?null:i.jsx("p",{className:"aqmx-callout-body",children:n.body}),n.action===void 0?null:i.jsx("a",{className:"aqmx-callout-action",href:n.action.href,children:n.action.label})]},n.id))})};function st({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M6.912 3a3 3 0 0 0-2.868 2.118l-2.411 7.838a3 3 0 0 0-.133.882V18a3 3 0 0 0 3 3h15a3 3 0 0 0 3-3v-4.162c0-.299-.045-.596-.133-.882l-2.412-7.838A3 3 0 0 0 17.088 3H6.912Zm13.823 9.75-2.213-7.191A1.5 1.5 0 0 0 17.088 4.5H6.912a1.5 1.5 0 0 0-1.434 1.059L3.265 12.75H6.11a3 3 0 0 1 2.684 1.658l.256.513a1.5 1.5 0 0 0 1.342.829h3.218a1.5 1.5 0 0 0 1.342-.83l.256-.512a3 3 0 0 1 2.684-1.658h2.844Z",clipRule:"evenodd"}))}const ct=p.forwardRef(st),ue=r.createContext(!0),ke="\0loop\0",Te="\0",it=()=>{const e=new WeakMap,t=new WeakMap,n=new WeakMap,a=l=>{const o=e.get(l);if(o!==void 0)return o;const c=Object.freeze({type:"loop",name:l.name,path:l.path});return e.set(l,c),c},s=(l,o,c)=>{let m=!1;const f=l.map(h=>{const x=u(h,o,c);return x!==h&&(m=!0),x});if(!m)return l;const d=n.get(l);return d!==void 0&&d.length===f.length&&d.every((h,x)=>h===f[x])?d:(n.set(l,f),f)},u=(l,o,c)=>{if(l.type!=="directory")return l;if(c.has(l.path))return a(l);const m=l.lazy===!0?o(l.path):void 0,f=m?.status==="loaded",d=f?m.entries:l.children;if(d===void 0)return l;c.add(l.path);const h=s(d,o,c);if(c.delete(l.path),!f&&h===l.children)return l;const x=t.get(l);if(x!==void 0&&x.state===m&&x.children===h)return x.grafted;const w={...l,children:h,lazy:f?!1:l.lazy};return t.set(l,{state:m,children:h,grafted:w}),w};return(l,o)=>s(l,o,new Set)},ut=(e,t)=>`${ke}${e}${Te}${t}`,J=e=>e.startsWith(ke),dt=e=>e.slice(e.lastIndexOf(Te)+1),G="data-aqmx-path",ft=(e,t,n,a,s)=>{const u={aqmxPath:e.path};return n&&(u.aqmxOpen=!0),(a==="loading"||a==="failed")&&(u.aqmxChildren=a),{name:e.name,type:e.type,absolutePath:e.path,relativePath:e.path,mimeType:e.mimeType,children:t,label:s,data:u}},mt=(e,t,n,a)=>{const s=ut(t,e.path);return{name:n,type:"directory",absolutePath:s,relativePath:s,children:a,data:{aqmxLoop:e.path}}},pt=()=>{const e=new WeakMap,t=new WeakMap,n=new WeakMap,a=[],s=(o,c,m)=>{const f=o.map(h=>h.type==="loop"?u(h,c,m):l(h,c)),d=n.get(o);return d!==void 0&&d.length===f.length&&d.every((h,x)=>h===f[x])?d:(n.set(o,f),f)},u=(o,c,m)=>{const f=t.get(o);if(f!==void 0&&f.parentKey===m&&f.loopFolderName===c.loopFolderName)return f.row;const d=mt(o,m,c.loopFolderName(o.name),a);return t.set(o,{row:d,parentKey:m,loopFolderName:c.loopFolderName}),d},l=(o,c)=>{const m=o.type==="directory"?o.children===void 0?a:s(o.children,c,o.path):void 0,f=c.openPaths.has(o.path),d=o.type==="directory"&&o.lazy===!0?c.childrenOf(o.path)?.status:void 0,h=d==="failed"?c.renderFailedFolder:void 0,x=e.get(o);if(x!==void 0&&x.open===f&&x.childrenStatus===d&&x.children===m&&x.renderFailedFolder===h)return x.row;const w=ft(o,m,f,d,h===void 0?void 0:h(o));return e.set(o,{row:w,open:f,childrenStatus:d,children:m,renderFailedFolder:h}),w};return(o,c)=>s(o,c,"")},ht=e=>{if(e===void 0)return;const t=n=>({name:n.name,path:n.absolutePath,type:n.type});return(n,a)=>e(t(n),t(a))},ie=(e,t)=>{const n=e.filter(a=>a.type==="directory");return t===void 0?n:n.sort(t)},xt=(e,t)=>{const n=new Map;let a=0;const s=u=>{for(const l of ie(u,t.compare))if(t.isShownExpanded(l.path)){if(l.lazy!==!0){l.children!==void 0&&s(l.children);continue}n.has(l.path)||(n.set(l.path,t.isDirect(l.path)?"direct":"bulk"),t.childrenOf(l.path)?.status!=="failed"&&(a+=1))}};return s(e),{folders:n,waiting:a}},wt=e=>{const t=new Set,n=a=>{for(const s of a)s.type==="directory"&&(s.lazy===!0&&t.add(s.path),s.children!==void 0&&n(s.children))};return n(e),t},Ce=(e,t)=>{for(const n of e){if(n.type!=="directory")continue;if(n.path===t)return n;const a=n.children===void 0?null:Ce(n.children,t);if(a!==null)return a}return null},Ee=new Set,gt=(e,t)=>e.has(t)?e:new Set(e).add(t),Et=(e,t)=>{if(!t.some(a=>e.has(a)))return e;const n=new Set(t);return new Set([...e].filter(a=>!n.has(a)))},bt=(e,t)=>[...e].every(n=>t.has(n))?e:new Set([...e].filter(n=>t.has(n))),vt=()=>{const[e,t]=r.useState(Ee),n=r.useCallback(l=>t(o=>gt(o,l)),[]),a=r.useCallback(l=>t(o=>Et(o,l)),[]),s=r.useCallback(l=>t(o=>bt(o,l)),[]),u=r.useCallback(()=>t(Ee),[]);return r.useMemo(()=>({direct:e,markDirect:n,unmarkDirect:a,pruneDirect:s,clearDirect:u}),[e,n,a,s,u])},Rt=e=>({budget:e,handled:new Set,loads:new Set,opened:0,folderLimited:!1,depthLimited:!1,announcedStart:!1,issuedAgainst:null}),St=(e,t)=>{const n=[];let a=ie(t.entries,t.compare);for(let s=1;a.length>0;s+=1){const u=[];for(const l of a){const{path:o}=l;if(t.isShownExpanded(o))e.handled.add(o);else{if(e.handled.has(o))continue;if(e.handled.add(o),l.lazy===!0&&t.childrenOf(o)===void 0){if(s>e.budget.maxDepth){e.depthLimited=!0;continue}if(e.loads.size>=e.budget.maxFolders){e.folderLimited=!0;continue}e.loads.add(o)}n.push(o),e.opened+=1}l.lazy!==!0&&l.children!==void 0&&u.push(...ie(l.children,t.compare))}a=u}return n},Le=(e,t)=>e.every(n=>n.type!=="directory"||t(n.path)&&(n.lazy===!0||n.children===void 0||Le(n.children,t))),yt=(e,t)=>{if(e.folderLimited)return{kind:"folder-limit",opened:e.opened};if(e.depthLimited)return{kind:"depth-limit",opened:e.opened};let n=0;for(const a of e.loads)t.childrenOf(a)?.status==="failed"&&(n+=1);return{kind:"done",opened:e.opened,failed:n,complete:Le(t.entries,t.isShownExpanded)}},ce=Object.freeze({state:"idle"}),kt=e=>{const t=r.useRef(null),n=r.useRef(e),[a,s]=r.useState(ce);r.useLayoutEffect(()=>{n.current=e});const u=r.useCallback(()=>{t.current===null&&(t.current=Rt(n.current.budget),s({state:"running",opened:0}))},[]),l=r.useCallback(()=>{t.current=null,s(ce)},[]),o=r.useCallback(c=>{const m=t.current;if(m===null)return;const f=St(m,c);if(f.length>0&&(m.issuedAgainst=c.expanded,n.current.expandMultiple([...f])),!m.announcedStart&&(m.loads.size>0||c.waiting>0)&&(m.announcedStart=!0,n.current.onStart()),f.length===0&&!c.expansionPending&&c.expanded!==m.issuedAgainst&&c.waiting===0){t.current=null;const h=yt(m,c);s(h.kind==="done"?ce:{state:"stopped",stop:h.kind,opened:h.opened}),n.current.onFinish(h);return}const{opened:d}=m;s(h=>h.state==="running"&&h.opened===d?h:{state:"running",opened:d})},[]);return r.useMemo(()=>({status:a,start:u,end:l,advance:o}),[a,u,l,o])},Tt="--aqmx-tree-line",Ct=Object.freeze(["(forced-colors: active)","(prefers-color-scheme: dark)"]),Lt="data-aqmx-tree-probe",jt=Object.freeze({rowHeight:T.CONTROL_BLOCK_PIXELS,lineColor:null}),Nt=/^rgb\((\d{1,3}), (\d{1,3}), (\d{1,3})\)$/u,qt=e=>{const t=Nt.exec(e);return t===null?e:`#${t.slice(1).map(n=>Number(n).toString(16).padStart(2,"0")).join("")}`},Pt=(e,t)=>{const[n,a]=r.useState(jt);return r.useLayoutEffect(()=>{const s=e.current;if(s===null)return;const u=()=>{const c=Math.round(s.getBoundingClientRect().height),m=getComputedStyle(s),f=m.getPropertyValue(Tt).trim()===""?null:qt(m.color);a(d=>{const h=Number.isFinite(c)&&c>0?c:d.rowHeight;return d.rowHeight===h&&d.lineColor===f?d:{rowHeight:h,lineColor:f}})};u();const l=Ct.map(c=>window.matchMedia(c));for(const c of l)c.addEventListener("change",u);const o=typeof ResizeObserver>"u"?null:new ResizeObserver(u);return o?.observe(s),()=>{for(const c of l)c.removeEventListener("change",u);o?.disconnect()}},[e,t]),n},Ot={renderVisual:Ue.tapScrollCircleSampleVisual,minSpeedMultiplier:.25,maxSpeedMultiplier:18},At="markdown-explorer-tree-scroll",Mt={testId:At,overscanCount:13,callbackThrottleMs:13,scrollBarOptions:{width:8,enableTrackClick:!0,enableThumbDrag:!0,enableArrowButtons:!0,enableArrowButtonTabStops:!1,enableScrollToTopBottomButtons:!0,tapScrollCircleOptions:Ot},behaviorOptions:{enablePointerDrag:!0}},Ft={hoverClassName:"",directorySelectedClassName:"",itemSelectedClassName:""},_t={color:"inherit"},It={paddingBlock:0},Dt=new Set,Ht=new Map,Zt={color:"var(--aqmx-tree-line)"},be=["pointerdown","wheel","touchstart","keydown","focusin"],$t=(e,t,n)=>{const a=r.useRef(null),s=r.useRef(null),u=r.useCallback(()=>{const l=t.current;a.current===null||s.current!==null||l===null||l.getClientRects().length===0||(s.current=requestAnimationFrame(()=>{s.current=null;const o=a.current;o!==null&&e.current?.scrollToPath(o,{align:"nearest"})===!1&&(a.current=null)}))},[e,t]);r.useEffect(()=>{const l=t.current;if(l===null)return;const o=()=>{a.current=null},c=typeof ResizeObserver>"u"?null:new ResizeObserver(u);c?.observe(l);for(const m of be)l.addEventListener(m,o,{passive:!0});return()=>{c?.disconnect();for(const m of be)l.removeEventListener(m,o);s.current!==null&&cancelAnimationFrame(s.current),s.current=null}},[t,u]),r.useEffect(()=>{const l=t.current;a.current=n===null||l===null||l.contains(l.ownerDocument.activeElement)?null:n,u()},[n,t,u])},Bt=e=>{const t=e instanceof Element?e.closest(`[${G}]`):null;return t===null||t.getAttribute("data-entry-type")!=="file"?null:t.getAttribute(G)},je=(e,t,n,a)=>n==="folder-limit"?e.expandAllFolderLimit(a,t.maxFolders,e.expandAll):e.expandAllDepthLimit(a,t.maxDepth),zt=(e,t,n)=>n.kind==="done"?e.expandAllDone(n.opened,n.failed,n.complete):je(e,t,n.kind,n.opened),Ne=()=>{const{labels:e}=R.useExplorer();return i.jsxs("div",{className:"aqmx-explorer-loading","aria-busy":"true","data-testid":"markdown-explorer-tree-loading",children:[i.jsx("p",{className:"aqmx-explorer-loading-text",children:e.treeLoading}),i.jsxs("div",{className:"aqmx-skeleton","aria-hidden":"true",children:[i.jsx("span",{}),i.jsx("span",{}),i.jsx("span",{}),i.jsx("span",{}),i.jsx("span",{})]})]})},Vt=()=>{const{labels:e}=R.useExplorer();return i.jsxs("div",{className:"aqmx-empty","data-testid":"markdown-explorer-tree-empty",children:[i.jsx(ct,{className:"aqmx-explorer-empty-icon","aria-hidden":"true"}),i.jsx("p",{className:"aqmx-empty-title",children:e.treeEmptyTitle}),i.jsx("p",{className:"aqmx-explorer-empty-body",children:e.treeEmptyBody})]})},Kt=({name:e,onRetry:t})=>{const{labels:n}=R.useExplorer(),a=r.useId();return i.jsxs("span",{className:"aqmx-explorer-folder-failed",children:[i.jsx("span",{className:"aqmx-explorer-folder-name",children:e}),i.jsx("span",{id:a,className:"aqmx-explorer-folder-error",children:n.folderLoadFailed}),i.jsxs("button",{type:"button",className:"aqmx-explorer-folder-retry","aria-describedby":a,"data-testid":"markdown-explorer-folder-retry",onClick:s=>{s.stopPropagation();const u=s.currentTarget,l=u.ownerDocument.activeElement===u?u.closest('[role="treeitem"]'):null;l instanceof HTMLElement&&R.focusWithoutScroll(l),t()},onKeyDown:s=>{s.key!=="Escape"&&s.stopPropagation()},children:[i.jsx(R.ForwardRef,{className:"aqmx-explorer-folder-retry-icon","aria-hidden":"true"}),i.jsx("span",{className:"aqmx-explorer-folder-retry-text",children:n.retry})]})]})},Xt=({entries:e,version:t,mode:n,sourceId:a,settings:s,openPaths:u,selection:l,onOpenDocument:o,expansion:c,onShown:m,marks:f,claimsHeld:d,expandAll:h})=>{const{trees:x,documents:w,labels:v,locale:C,theme:y}=R.useExplorer(),M=r.use(ue),[k]=r.useState(pt),_=r.useRef(null),{rowHeight:D,lineColor:I}=Pt(_,y),{isExpanded:b,toggle:L,expandMultiple:E,collapseMultiple:N,expanded:P,isPending:z}=c,{alwaysExpanded:V,sortMode:O,directoriesFirst:Y}=s,{direct:K,markDirect:H,unmarkDirect:F,pruneDirect:A}=f,{running:Z,advance:ee}=h,Q=r.useRef(null),W=r.useRef(null);$t(Q,W,l.shownPath);const X=r.useMemo(()=>T.createEntryComparator({sortMode:O,directoriesFirst:Y}),[O,Y]),le=r.useMemo(()=>ht(X),[X]),$=r.useCallback(g=>x.children(a,g),[x,a]),S=r.useMemo(()=>wt(e),[e]),j=r.useCallback(g=>!J(g)&&(b(g)||V&&!S.has(g)),[b,V,S]),B=r.useRef({shownExpanded:j,isExpanded:b,unloadedFolders:S});r.useLayoutEffect(()=>{B.current={shownExpanded:j,isExpanded:b,unloadedFolders:S}},[j,b,S]);const pe=r.useCallback(g=>{Q.current?.scrollToPath(g,{align:"nearest"}),requestAnimationFrame(()=>{const q=W.current;if(q===null)return;const U=[...q.querySelectorAll(`[role="treeitem"][${G}]`)].find(Xe=>Xe.getAttribute(G)===g);U!==void 0&&R.focusWithoutScroll(U)})},[]),Ie=r.useCallback(g=>{if(J(g)){pe(dt(g));return}B.current.isExpanded(g)?F([g]):B.current.unloadedFolders.has(g)&&H(g),L(g)},[pe,H,F,L]),oe=r.useCallback(g=>{const q=g.filter(U=>!J(U));q.length!==0&&(F(q),N(q))},[F,N]),De=r.useCallback(g=>{const q=g.filter(U=>!J(U));q.length!==0&&(q.length<g.length&&q.every(U=>B.current.shownExpanded(U))?oe(q):E(q))},[E,oe]),he=r.useCallback(g=>i.jsx(Kt,{name:g.name,onRetry:()=>{H(g.path),x.retryChildren(a,g.path),B.current.shownExpanded(g.path)||E([g.path])}}),[x,a,H,E]),xe=n==="multi"?u:Dt,{loopFolderName:we}=v,He=r.useMemo(()=>k(e,{openPaths:xe,childrenOf:$,renderFailedFolder:he,loopFolderName:we}),[k,e,xe,$,he,we,t]),Ze=R.useIntentPrefetch(w,Bt),ge=r.useCallback(g=>K.has(g),[K]),te=r.useMemo(()=>xt(e,{isShownExpanded:j,childrenOf:$,compare:X,isDirect:ge}),[e,j,$,X,ge,t]),ne=M&&d;r.useLayoutEffect(()=>{m(e)},[e,m]),r.useLayoutEffect(()=>()=>m(null),[m]),r.useEffect(()=>x.claimChildren(a,ne?te.folders:Ht),[x,a,ne,te]),r.useEffect(()=>A(S),[A,S]),r.useEffect(()=>{ne&&Z&&ee({entries:e,isShownExpanded:j,childrenOf:$,compare:X,expanded:P,waiting:te.waiting,expansionPending:z})},[ne,Z,ee,e,j,$,X,P,te,z]);const $e=r.useCallback(g=>{g.isDirectory||o(g.entry.absolutePath)},[o]),{onChange:se}=l,Be=r.useMemo(()=>se===null?void 0:(g,q)=>{J(g.absolutePath)||se({path:g.absolutePath,name:g.name,selected:q})},[se]),ze=r.useMemo(()=>new Set(l.items),[l.items]),Ve=r.useMemo(()=>({entryKindDirectory:v.treeEntryKindDirectory,entryKindFile:v.treeEntryKindFile,scrollUp:v.treeScrollUp,scrollDown:v.treeScrollDown,scrollToTop:v.treeScrollToTop,scrollToBottom:v.treeScrollToBottom}),[v]),Ke=I===null?{showTreeLines:!1}:{showTreeLines:s.lines,lineColor:I};return i.jsxs("div",{ref:W,className:"aqmx-explorer-tree","data-testid":"markdown-explorer-tree",...Ze,children:[i.jsx("span",{ref:_,className:"aqmx-explorer-tree-probe","aria-hidden":"true",[Lt]:""}),i.jsx(ye.DirectoryTree,{ref:Q,entries:He,expansion:{toggle:Ie,isExpanded:j,expandMultiple:De,collapseMultiple:oe,isPending:z&&!Z,doubleClickAction:s.doubleClickAction},selection:{mode:l.mode,selectedPath:l.shownPath,currentPath:l.shownPath,selectedItems:ze,onEntryClick:$e,onSelectionChange:Be},visual:{className:"aqmx-explorer-tree-view",ariaLabel:v.treeRegion,...Ke,showExpandIcons:s.expandIcons,expandIconStyle:Zt,showDirectoryIcons:s.directoryIcons,showFileIcons:s.fileIcons,expandIconSize:s.expandIconSize,itemHeight:D,removeRootIndent:s.removeRootIndent,highlightStyles:Ft,entryStyle:It,nameStyle:_t},virtualScroll:Mt,sort:le,locale:C,labels:Ve})]})},Ut=({pending:e,status:t})=>{const{labels:n}=R.useExplorer(),a=t.state!=="running",[s,u]=r.useState(0),l=r.useRef(!0);r.useLayoutEffect(()=>{const c=l.current;if(l.current=a,!a||e>0&&!c){u(0);return}if(e>0){u(e);return}if(s===0)return;const m=setTimeout(()=>u(0),0);return()=>clearTimeout(m)},[a,e,s]);const o=a&&e===0?s:e;return o===0&&a?null:i.jsxs("p",{className:"aqmx-explorer-tree-progress","data-testid":"markdown-explorer-tree-progress","data-aqmx-loading":String(o),"data-aqmx-expand-all":t.state,children:[o>0?i.jsx(R.ForwardRef,{className:"aqmx-explorer-tree-progress-icon","aria-hidden":"true"}):null,i.jsx("span",{children:t.state==="running"?n.expandAllProgress(t.opened,o):n.foldersLoading(o)})]})},Wt=({stop:e,opened:t,budget:n})=>{const{labels:a}=R.useExplorer();return i.jsx("p",{className:"aqmx-explorer-expand-all-stop","data-testid":"markdown-explorer-expand-all-stop","data-aqmx-stop":e,children:je(a,n,e,t)})},Gt=({entries:e,...t})=>{const{trees:n}=R.useExplorer(),a=r.useSyncExternalStore(n.subscribe,n.version,n.version),{sourceId:s}=t,[u]=r.useState(it),l=r.useMemo(()=>u(e,o=>n.children(s,o)),[u,e,n,s,a]);return l.length===0?i.jsx(Vt,{}):i.jsx(Xt,{entries:l,version:a,...t})},Yt=({result:e,onRetry:t,...n})=>{const{renderTreeFailure:a}=R.useExplorer(),s=r.use(e);if(s.status==="deferred")return i.jsx(Ne,{});if(s.status==="ok")return i.jsx(Gt,{entries:s.entries,...n});const u=a?.(s.failure);return i.jsx("div",{className:"aqmx-explorer-tree-message","data-testid":"markdown-explorer-tree-failure","data-aqmx-failure":s.failure.reason,children:u!==void 0?u:i.jsx(R.FailureView,{failure:s.failure,alert:!0,onRetry:t,testId:null})})},Qt=({onControls:e,...t})=>{const{trees:n,storageNamespace:a,labels:s,announcer:u,config:l}=R.useExplorer(),{sourceId:o}=t,c=ye.useDirectoryTreeState({storageKey:We.storageKeys(a).treeExpansion(o)});r.useSyncExternalStore(n.subscribe,n.version,n.version);const m=n.read(o),f=r.useCallback(()=>n.retry(o),[n,o]);r.useLayoutEffect(()=>n.open(o),[n,o]);const d=vt(),{expanded:h,expandMultiple:x,collapseAll:w}=c,[v,C]=r.useState(null),y=v!==h,M=r.useRef(h);r.useLayoutEffect(()=>{M.current=h},[h]);const k=l.expandAll,_=r.useCallback(()=>u.announce(s.expandAllStarted),[u,s]),D=r.useCallback(A=>u.announce(zt(s,k,A)),[u,s,k]),I=kt({budget:k,expandMultiple:x,onStart:_,onFinish:D}),{status:b,start:L,end:E,advance:N}=I,P=b.state==="running",z=r.useMemo(()=>({running:P,advance:N}),[P,N]),V=r.useRef(null),[O,Y]=r.useState(!1),K=r.useCallback(A=>{V.current=A,Y(A!==null)},[]);r.useEffect(()=>n.subscribeChildrenFailures(A=>{const Z=A.sourceId===o&&V.current!==null?Ce(V.current,A.path):null;Z!==null&&u.announce({list:s.foldersLoadFailedNamed,item:Z.name})}),[n,o,u,s]);const{clearDirect:H}=d,F=r.useCallback(()=>{E(),H(),C(M.current),w()},[E,H,w]);return r.useEffect(()=>{e({collapseAll:F,expandAll:O?L:null,expanding:P})},[e,F,L,O,P]),r.useEffect(()=>()=>e(null),[e]),r.useEffect(()=>{O||E()},[O,E]),i.jsxs(i.Fragment,{children:[b.state==="stopped"?i.jsx(Wt,{stop:b.stop,opened:b.opened,budget:k}):null,i.jsxs("div",{className:"aqmx-explorer-tree-area",children:[i.jsx(r.Suspense,{fallback:i.jsx(Ne,{}),children:i.jsx(Yt,{result:m,onRetry:f,expansion:c,onShown:K,marks:d,claimsHeld:y,expandAll:z,...t})}),i.jsx(Ut,{pending:n.pendingChildren(o),status:b})]})]})};function Jt({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M5.47 5.47a.75.75 0 0 1 1.06 0L12 10.94l5.47-5.47a.75.75 0 1 1 1.06 1.06L13.06 12l5.47 5.47a.75.75 0 1 1-1.06 1.06L12 13.06l-5.47 5.47a.75.75 0 0 1-1.06-1.06L10.94 12 5.47 6.53a.75.75 0 0 1 0-1.06Z",clipRule:"evenodd"}))}const qe=p.forwardRef(Jt),ve="markdown-explorer-selection-remove",en=({selection:e,onRemove:t,onClear:n,onOpenSelection:a,onLeave:s})=>{const{labels:u}=R.useExplorer(),l=r.useId(),o=r.useRef(null),c=[...e],m=(d,h)=>{if(h.ownerDocument.activeElement===h){const x=o.current===null?[]:[...o.current.querySelectorAll(`[data-testid="${ve}"]`)],w=x.indexOf(h),v=[x[w+1],x[w-1]].find(C=>C!==void 0);v===void 0?s():v.focus()}t(d)},f=()=>{const d=o.current;d!==null&&d.contains(d.ownerDocument.activeElement)&&s(),n()};return i.jsxs("section",{ref:o,className:"aqmx-explorer-tray","aria-labelledby":l,"data-testid":"markdown-explorer-selection-tray",children:[i.jsxs("div",{className:"aqmx-explorer-tray-header",children:[i.jsx("p",{id:l,className:"aqmx-explorer-tray-title",children:u.selectionTitle(c.length)}),i.jsx("button",{type:"button",className:"aqmx-explorer-tray-button","data-testid":"markdown-explorer-selection-clear",onClick:f,children:u.clearSelection})]}),i.jsx("ul",{className:"aqmx-explorer-tray-list",children:c.map(([d,h])=>i.jsxs("li",{className:"aqmx-explorer-tray-item",children:[i.jsx("span",{className:"aqmx-explorer-tray-name",title:d,children:h}),i.jsx("button",{type:"button",className:"aqmx-icon-button aqmx-explorer-tray-remove","aria-label":u.removeFromSelection(h),title:u.removeFromSelection(h),"data-testid":ve,"data-aqmx-path":d,onClick:x=>m(d,x.currentTarget),children:i.jsx(qe,{"aria-hidden":"true"})})]},d))}),a===void 0?null:i.jsx("button",{type:"button",className:"aqmx-explorer-tray-open","data-testid":"markdown-explorer-selection-open",onClick:()=>a(c.map(([d])=>d)),children:u.openSelectionInMulti(c.length)})]})},ae=new Map,tn=(e,t)=>{if(t.selected===e.has(t.path))return e;const n=new Map(e);return t.selected?n.set(t.path,t.name):n.delete(t.path),n},nn=(e,t)=>{if(!e.has(t))return e;const n=new Map(e);return n.delete(t),n},Pe=r.createContext(null),rn=e=>{const t=r.use(Pe);r.useLayoutEffect(()=>{if(t!==null)return t(e),()=>t(!1)},[t,e])};function an({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M15 3.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0V5.56l-3.97 3.97a.75.75 0 1 1-1.06-1.06l3.97-3.97h-2.69a.75.75 0 0 1-.75-.75Zm-12 0A.75.75 0 0 1 3.75 3h4.5a.75.75 0 0 1 0 1.5H5.56l3.97 3.97a.75.75 0 0 1-1.06 1.06L4.5 5.56v2.69a.75.75 0 0 1-1.5 0v-4.5Zm11.47 11.78a.75.75 0 1 1 1.06-1.06l3.97 3.97v-2.69a.75.75 0 0 1 1.5 0v4.5a.75.75 0 0 1-.75.75h-4.5a.75.75 0 0 1 0-1.5h2.69l-3.97-3.97Zm-4.94-1.06a.75.75 0 0 1 0 1.06L5.56 19.5h2.69a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75v-4.5a.75.75 0 0 1 1.5 0v2.69l3.97-3.97a.75.75 0 0 1 1.06 0Z",clipRule:"evenodd"}))}const ln=p.forwardRef(an);function on({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M6.97 2.47a.75.75 0 0 1 1.06 0l4.5 4.5a.75.75 0 0 1-1.06 1.06L8.25 4.81V16.5a.75.75 0 0 1-1.5 0V4.81L3.53 8.03a.75.75 0 0 1-1.06-1.06l4.5-4.5Zm9.53 4.28a.75.75 0 0 1 .75.75v11.69l3.22-3.22a.75.75 0 1 1 1.06 1.06l-4.5 4.5a.75.75 0 0 1-1.06 0l-4.5-4.5a.75.75 0 1 1 1.06-1.06l3.22 3.22V7.5a.75.75 0 0 1 .75-.75Z",clipRule:"evenodd"}))}const sn=p.forwardRef(on);function cn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z",clipRule:"evenodd"}))}const un=p.forwardRef(cn);function dn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M7.72 12.53a.75.75 0 0 1 0-1.06l7.5-7.5a.75.75 0 1 1 1.06 1.06L9.31 12l6.97 6.97a.75.75 0 1 1-1.06 1.06l-7.5-7.5Z",clipRule:"evenodd"}))}const fn=p.forwardRef(dn);function mn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M11.47 4.72a.75.75 0 0 1 1.06 0l3.75 3.75a.75.75 0 0 1-1.06 1.06L12 6.31 8.78 9.53a.75.75 0 0 1-1.06-1.06l3.75-3.75Zm-3.75 9.75a.75.75 0 0 1 1.06 0L12 17.69l3.22-3.22a.75.75 0 1 1 1.06 1.06l-3.75 3.75a.75.75 0 0 1-1.06 0l-3.75-3.75a.75.75 0 0 1 0-1.06Z",clipRule:"evenodd"}))}const pn=p.forwardRef(mn);function hn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M11.078 2.25c-.917 0-1.699.663-1.85 1.567L9.05 4.889c-.02.12-.115.26-.297.348a7.493 7.493 0 0 0-.986.57c-.166.115-.334.126-.45.083L6.3 5.508a1.875 1.875 0 0 0-2.282.819l-.922 1.597a1.875 1.875 0 0 0 .432 2.385l.84.692c.095.078.17.229.154.43a7.598 7.598 0 0 0 0 1.139c.015.2-.059.352-.153.43l-.841.692a1.875 1.875 0 0 0-.432 2.385l.922 1.597a1.875 1.875 0 0 0 2.282.818l1.019-.382c.115-.043.283-.031.45.082.312.214.641.405.985.57.182.088.277.228.297.35l.178 1.071c.151.904.933 1.567 1.85 1.567h1.844c.916 0 1.699-.663 1.85-1.567l.178-1.072c.02-.12.114-.26.297-.349.344-.165.673-.356.985-.57.167-.114.335-.125.45-.082l1.02.382a1.875 1.875 0 0 0 2.28-.819l.923-1.597a1.875 1.875 0 0 0-.432-2.385l-.84-.692c-.095-.078-.17-.229-.154-.43a7.614 7.614 0 0 0 0-1.139c-.016-.2.059-.352.153-.43l.84-.692c.708-.582.891-1.59.433-2.385l-.922-1.597a1.875 1.875 0 0 0-2.282-.818l-1.02.382c-.114.043-.282.031-.449-.083a7.49 7.49 0 0 0-.985-.57c-.183-.087-.277-.227-.297-.348l-.179-1.072a1.875 1.875 0 0 0-1.85-1.567h-1.843ZM12 15.75a3.75 3.75 0 1 0 0-7.5 3.75 3.75 0 0 0 0 7.5Z",clipRule:"evenodd"}))}const xn=p.forwardRef(hn);function wn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M12 1.5a.75.75 0 0 1 .75.75V4.5a.75.75 0 0 1-1.5 0V2.25A.75.75 0 0 1 12 1.5ZM5.636 4.136a.75.75 0 0 1 1.06 0l1.592 1.591a.75.75 0 0 1-1.061 1.06l-1.591-1.59a.75.75 0 0 1 0-1.061Zm12.728 0a.75.75 0 0 1 0 1.06l-1.591 1.592a.75.75 0 0 1-1.06-1.061l1.59-1.591a.75.75 0 0 1 1.061 0Zm-6.816 4.496a.75.75 0 0 1 .82.311l5.228 7.917a.75.75 0 0 1-.777 1.148l-2.097-.43 1.045 3.9a.75.75 0 0 1-1.45.388l-1.044-3.899-1.601 1.42a.75.75 0 0 1-1.247-.606l.569-9.47a.75.75 0 0 1 .554-.68ZM3 10.5a.75.75 0 0 1 .75-.75H6a.75.75 0 0 1 0 1.5H3.75A.75.75 0 0 1 3 10.5Zm14.25 0a.75.75 0 0 1 .75-.75h2.25a.75.75 0 0 1 0 1.5H18a.75.75 0 0 1-.75-.75Zm-8.962 3.712a.75.75 0 0 1 0 1.061l-1.591 1.591a.75.75 0 1 1-1.061-1.06l1.591-1.592a.75.75 0 0 1 1.06 0Z",clipRule:"evenodd"}))}const gn=p.forwardRef(wn);function En({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z",clipRule:"evenodd"}),p.createElement("path",{d:"M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z"}))}const bn=p.forwardRef(En);function vn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{d:"M19.5 21a3 3 0 0 0 3-3v-4.5a3 3 0 0 0-3-3h-15a3 3 0 0 0-3 3V18a3 3 0 0 0 3 3h15ZM1.5 10.146V6a3 3 0 0 1 3-3h5.379a2.25 2.25 0 0 1 1.59.659l2.122 2.121c.14.141.331.22.53.22H19.5a3 3 0 0 1 3 3v1.146A4.483 4.483 0 0 0 19.5 9h-15a4.483 4.483 0 0 0-3 1.146Z"}))}const Rn=p.forwardRef(vn);function Sn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{d:"M19.906 9c.382 0 .749.057 1.094.162V9a3 3 0 0 0-3-3h-3.879a.75.75 0 0 1-.53-.22L11.47 3.66A2.25 2.25 0 0 0 9.879 3H6a3 3 0 0 0-3 3v3.162A3.756 3.756 0 0 1 4.094 9h15.812ZM4.094 10.5a2.25 2.25 0 0 0-2.227 2.568l.857 6A2.25 2.25 0 0 0 4.951 21H19.05a2.25 2.25 0 0 0 2.227-1.932l.857-6a2.25 2.25 0 0 0-2.227-2.568H4.094Z"}))}const yn=p.forwardRef(Sn);function kn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M10.5 3.75a6.75 6.75 0 1 0 0 13.5 6.75 6.75 0 0 0 0-13.5ZM2.25 10.5a8.25 8.25 0 1 1 14.59 5.28l4.69 4.69a.75.75 0 1 1-1.06 1.06l-4.69-4.69A8.25 8.25 0 0 1 2.25 10.5Zm8.25-3.75a.75.75 0 0 1 .75.75v2.25h2.25a.75.75 0 0 1 0 1.5h-2.25v2.25a.75.75 0 0 1-1.5 0v-2.25H7.5a.75.75 0 0 1 0-1.5h2.25V7.5a.75.75 0 0 1 .75-.75Z",clipRule:"evenodd"}))}const Tn=p.forwardRef(kn);function Cn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{d:"M5.625 3.75a2.625 2.625 0 1 0 0 5.25h12.75a2.625 2.625 0 0 0 0-5.25H5.625ZM3.75 11.25a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75ZM3 15.75a.75.75 0 0 1 .75-.75h16.5a.75.75 0 0 1 0 1.5H3.75a.75.75 0 0 1-.75-.75ZM3.75 18.75a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75Z"}))}const Ln=p.forwardRef(Cn),de=e=>{e.preventDefault(),e.stopPropagation()},jn=Object.freeze({sortMode:sn,directoriesFirst:Rn,selectionMode:un,doubleClickAction:gn,expandIconSize:Tn,alwaysExpanded:ln,removeRootIndent:fn,lines:Ln,expandIcons:pn,directoryIcons:yn,fileIcons:bn}),Oe=(e,t)=>{const n=e[t.labelKey];if(typeof n!="string")throw new TypeError(`[markdown-explorer] the tree setting ${t.key} must name a string label; labels.${t.labelKey} is a ${typeof n}`);return n},Nn=({id:e,settings:t,descriptors:n,onAdvance:a,onClose:s,ref:u})=>{const{labels:l}=R.useExplorer(),o=r.useRef([]);r.useEffect(()=>{o.current[0]?.focus()},[]);const c=r.useCallback(f=>{const d=n.length;o.current[(f%d+d)%d]?.focus()},[n.length]),m=r.useCallback((f,d)=>{switch(f.key){case"ArrowDown":f.preventDefault(),c(d+1);break;case"ArrowUp":f.preventDefault(),c(d-1);break;case"Home":f.preventDefault(),c(0);break;case"End":f.preventDefault(),c(n.length-1);break;case"Escape":de(f),s();break;case"Tab":s();break}},[n.length,c,s]);return i.jsx("div",{ref:u,id:e,role:"menu","aria-label":l.treeSettings,className:"aqmx-explorer-menu","data-testid":"markdown-explorer-tree-settings-menu",children:n.map((f,d)=>{const h=jn[f.key],x=Oe(l,f),w=T.formatTreeSettingValue(l,t,f.key),v=t[f.key],C=typeof v=="boolean"?{role:"menuitemcheckbox","aria-checked":v,"aria-label":x}:{role:"menuitem","aria-label":`${x}: ${w}`};return i.jsxs("button",{ref:y=>{o.current[d]=y},type:"button",tabIndex:-1,...C,title:`${x}: ${w}`,className:"aqmx-explorer-menu-item","data-testid":"markdown-explorer-tree-settings-item","data-aqmx-setting":f.key,onClick:()=>a(f),onKeyDown:y=>m(y,d),children:[i.jsx(h,{className:"aqmx-explorer-menu-icon","aria-hidden":"true"}),i.jsx("span",{className:"aqmx-explorer-menu-name",children:x}),i.jsx("span",{className:"aqmx-explorer-menu-value",children:w})]},f.key)})})},qn=({settings:e,descriptors:t,onAdvance:n})=>{const{labels:a,announcer:s}=R.useExplorer(),[u,l]=r.useState(!1),o=r.useRef(null),c=r.useRef(null),m=r.useRef(null),f=r.useId(),d=r.useCallback(()=>{o.current?.focus(),l(!1)},[]);r.useEffect(()=>{if(!u)return;const w=v=>{v.target instanceof Node&&(o.current?.contains(v.target)===!0||c.current?.contains(v.target)===!0)||(l(!1),m.current!==null&&window.clearTimeout(m.current),m.current=window.setTimeout(()=>{m.current=null,(document.activeElement===null||document.activeElement===document.body)&&o.current?.focus()},0))};return document.addEventListener("pointerdown",w),()=>document.removeEventListener("pointerdown",w)},[u]),r.useEffect(()=>()=>{m.current!==null&&window.clearTimeout(m.current)},[]);const h=r.useCallback(w=>{w.key!=="Escape"||!u||(de(w),d())},[u,d]),x=r.useCallback(w=>{const v=n(w.key);s.announce(a.settingAnnouncement(Oe(a,w),T.formatTreeSettingValue(a,v,w.key)))},[s,a,n]);return{trigger:i.jsx("button",{ref:o,type:"button",className:"aqmx-icon-button","aria-haspopup":"menu","aria-expanded":u,"aria-controls":u?f:void 0,"aria-label":a.treeSettings,title:a.treeSettings,"data-testid":"markdown-explorer-tree-settings",onClick:()=>l(w=>!w),onKeyDown:h,children:i.jsx(xn,{"aria-hidden":"true"})}),menu:u?i.jsx(Nn,{ref:c,id:f,settings:e,descriptors:t,onAdvance:x,onClose:d}):null}},Pn=()=>{const{treeSettings:e}=R.useExplorer();return{settings:r.useSyncExternalStore(e.subscribe,e.getSnapshot,e.getServerSnapshot),advance:e.advance}},Re=new Set,On='[role="tree"] [role="treeitem"][tabindex="0"]',An="[data-directory-tree-tab-stop]",Mn=e=>{const{mode:t,sourceId:n,currentPath:a,openPaths:s,onOpenDocument:u,onSourceChange:l,viewSwitch:o}=e,{labels:c,sources:m,trees:f,documents:d,announcer:h}=R.useExplorer(),{settings:x,advance:w}=Pn(),v=r.useMemo(()=>T.visibleTreeSettingDescriptors(t==="tree"),[t]),C=t==="tree"&&x.selectionMode==="multiple";rn(C);const y=e.mode==="tree"?e.tray.onGatheredChange:null,M=e.mode==="tree"?e.onOpenSelection:void 0,k=e.mode==="tree"&&C?e.tray.gathered:ae,_=r.useCallback(S=>{const j=w(S);return j.selectionMode!=="multiple"&&y?.(ae),j},[w,y]),D=qn({settings:x,descriptors:v,onAdvance:_}),I=r.useCallback(S=>y?.(j=>tn(j,S)),[y]),b=r.useCallback(S=>y?.(j=>nn(j,S)),[y]),L=r.useCallback(()=>y?.(ae),[y]),E=r.useRef(null),N=r.useCallback(()=>{const S=E.current;if(S===null)return;[On,An,'[data-testid="markdown-explorer-tree-settings"]'].map(B=>S.querySelector(B)).find(B=>B!==null)?.focus()},[]),P=r.useMemo(()=>new Set(k.keys()),[k]),z=r.useMemo(()=>a===null?Re:new Set([a]),[a]),V=r.useMemo(()=>{if(t==="multi")return{mode:"multiple",items:s,shownPath:null,onChange:null};switch(x.selectionMode){case"single":return{mode:"single",items:z,shownPath:a,onChange:null};case"multiple":return{mode:"multiple",items:P,shownPath:a,onChange:I};case"none":return{mode:"none",items:Re,shownPath:null,onChange:null}}},[t,s,x.selectionMode,z,a,P,I]),[O,Y]=r.useState(null),[K,H]=r.useState(!1),[F,A]=r.useState(null),Z=r.useRef(!1),ee=r.useCallback(async()=>{if(!Z.current){Z.current=!0,H(!0),A(null);try{const S=await f.refresh(n);if(S.status==="superseded")return;d.invalidate(),S.status==="failed"?A({sourceId:n,failure:S.failure}):h.announce(c.treeRefreshed)}finally{Z.current=!1,H(!1)}}},[f,d,n,h,c]),Q=O===null?null:O.expandAll,W=O?.expanding===!0,X=m.find(S=>S.id===n),le=o.target==="multi"?lt:rt,$=o.target==="multi"?c.switchToMulti:c.switchToTree;return i.jsxs("nav",{ref:E,"aria-label":c.explorerRegion,className:"aqmx-explorer","data-testid":"markdown-explorer-explorer","data-aqmx-mode":t,children:[i.jsxs("div",{className:"aqmx-explorer-header",children:[m.length>1?i.jsx("select",{className:"aqmx-explorer-source","aria-label":c.sourceLabel,title:X?.label,value:n,onChange:S=>l(S.currentTarget.value),"data-testid":"markdown-explorer-source-select",children:m.map(S=>i.jsx("option",{value:S.id,children:S.label},S.id))}):null,i.jsxs("div",{className:"aqmx-explorer-actions",children:[i.jsx(R.ExplorerLink,{to:o.href,navigation:"switch-view",className:"aqmx-icon-button","aria-label":$,title:$,"data-testid":"markdown-explorer-view-switch","data-aqmx-target":o.target,children:i.jsx(le,{"aria-hidden":"true"})}),i.jsxs("button",{type:"button",className:"aqmx-icon-button aqmx-labelled-button",title:c.refreshTree,"aria-disabled":K,"aria-busy":K,"data-aqmx-busy":K?"true":void 0,"data-testid":"markdown-explorer-refresh",onClick:()=>{ee()},children:[i.jsx(R.ForwardRef,{"aria-hidden":"true"}),i.jsx("span",{children:c.refreshTreeLabel})]}),i.jsx("button",{type:"button",className:"aqmx-icon-button","aria-label":c.expandAll,title:c.expandAll,"aria-disabled":Q===null||W,"aria-busy":W,"data-aqmx-busy":W?"true":void 0,"data-testid":"markdown-explorer-expand-all",onClick:()=>Q?.(),children:i.jsx(tt,{"aria-hidden":"true"})}),i.jsx("button",{type:"button",className:"aqmx-icon-button","aria-label":c.collapseAll,title:c.collapseAll,"aria-disabled":O===null,"data-testid":"markdown-explorer-collapse-all",onClick:()=>O?.collapseAll(),children:i.jsx(Je,{"aria-hidden":"true"})}),D.trigger]})]}),i.jsxs("div",{className:"aqmx-explorer-body","data-aqmx-explorer-body":"",children:[F!==null&&F.sourceId===n?i.jsx("p",{role:"alert",className:"aqmx-explorer-refresh-failure","data-testid":"markdown-explorer-refresh-failure","data-aqmx-failure":F.failure.reason,children:c.treeRefreshFailed(R.failureTitleOf(c,F.failure.reason))}):null,i.jsx(r.Suspense,{fallback:null,children:i.jsx(ot,{})}),i.jsx(Qt,{mode:t,sourceId:n,settings:x,openPaths:s,selection:V,onOpenDocument:u,onControls:Y},n),C&&k.size>0?i.jsx(en,{selection:k,onRemove:b,onClear:L,onOpenSelection:M,onLeave:N}):null,D.menu]})]})},Ae="(pointer: coarse)",Fn=e=>{const t=window.matchMedia(Ae);return t.addEventListener("change",e),()=>t.removeEventListener("change",e)},_n=()=>window.matchMedia(Ae).matches,In=()=>!1,Dn=()=>r.useSyncExternalStore(Fn,_n,In);function Hn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M3 6.75A.75.75 0 0 1 3.75 6h16.5a.75.75 0 0 1 0 1.5H3.75A.75.75 0 0 1 3 6.75ZM3 12a.75.75 0 0 1 .75-.75h16.5a.75.75 0 0 1 0 1.5H3.75A.75.75 0 0 1 3 12Zm0 5.25a.75.75 0 0 1 .75-.75h16.5a.75.75 0 0 1 0 1.5H3.75a.75.75 0 0 1-.75-.75Z",clipRule:"evenodd"}))}const Zn=p.forwardRef(Hn),$n=({explorer:e,toggleRef:t,covered:n,onNoticeSlotChange:a,dismissals:s})=>{const{labels:u}=R.useExplorer(),l=Ge.useLocation(),{location:o}=R.useExplorerLocation(),[c,m]=r.useState(!1),[f,d]=r.useState({navigated:l,source:o.source}),[h,x]=r.useState(!1);f.navigated!==l&&(d({navigated:l,source:o.source}),f.source===o.source&&!h&&m(!1));const[w,v]=r.useState(s);w!==s&&(v(s),m(!1));const C=r.useRef(null),y=r.useRef(null),M=r.useRef(null),k=r.useRef(!1),_=r.useId();r.useLayoutEffect(()=>{const E=C.current;E!==null&&(c&&!E.open?(E.showModal(),y.current?.focus()):!c&&E.open&&(E.close(),t.current?.focus()),a(c?M.current:null))},[c,t,a]),r.useLayoutEffect(()=>()=>a(null),[a]);const D=r.useCallback(E=>{E.key!=="Escape"||E.defaultPrevented||(de(E),m(!1))},[]),I=r.useCallback(E=>{k.current=E.target===E.currentTarget},[]),b=r.useCallback(E=>{const N=k.current;k.current=!1,N&&E.target===E.currentTarget&&m(!1)},[]),L=r.useCallback(()=>{m(!1)},[]);return i.jsxs(i.Fragment,{children:[i.jsx("div",{className:"aqmx-sheet-bar",inert:n,children:i.jsxs("button",{ref:t,type:"button",className:"aqmx-sheet-toggle","aria-haspopup":"dialog","aria-expanded":c,"aria-controls":_,"data-testid":"markdown-explorer-sheet-toggle",onClick:()=>m(!0),children:[i.jsx(Zn,{"aria-hidden":"true"}),i.jsx("span",{children:u.showExplorer})]})}),i.jsx("dialog",{ref:C,id:_,className:"aqmx-sheet","aria-label":u.explorerRegion,"data-testid":"markdown-explorer-sheet",onKeyDown:D,onPointerDown:I,onClick:b,onClose:L,children:i.jsxs("div",{className:"aqmx-sheet-panel",children:[i.jsxs("div",{className:"aqmx-sheet-header",children:[i.jsx("div",{ref:M,className:"aqmx-sheet-notice-slot"}),i.jsx("button",{ref:y,type:"button",className:"aqmx-sheet-close","aria-label":u.hideExplorer,title:u.hideExplorer,"data-testid":"markdown-explorer-sheet-close",onClick:()=>m(!1),children:i.jsx(qe,{"aria-hidden":"true"})})]}),i.jsx("div",{className:"aqmx-sheet-body",children:i.jsx(ue,{value:c,children:i.jsx(Pe,{value:x,children:e})})}),i.jsx(R.LiveRegion,{holds:c,testId:"markdown-explorer-sheet-announcer"})]})})]})},Me=r.createContext(null),fe="aqmx-explorer",Fe="aqmx-content",me='[role="tree"] [role="treeitem"]',Bn=`${me}[tabindex="0"]`,zn="[data-directory-tree-tab-stop]",Vn=(e,t)=>{for(const n of e.querySelectorAll(`[data-panel-id="${fe}"] ${me}`))if(n.getAttribute(G)===t)return n;return null},Se=(e,t)=>({inlineSize:e>0?e:null,rootFontPixels:t>0?t:T.ASSUMED_ROOT_FONT_PIXELS}),Kn=(e,t)=>{const[n,a]=r.useState(()=>Se(0,0));return r.useLayoutEffect(()=>{const s=e.current,u=t.current;if(s===null||u===null)throw new Error("[markdown-explorer] the split frame is not mounted");const l={frame:s.getBoundingClientRect().width,rem:u.getBoundingClientRect().width},o=()=>{const m=Se(l.frame,l.rem);a(f=>f.inlineSize===m.inlineSize&&f.rootFontPixels===m.rootFontPixels?f:m)};o();const c=new ResizeObserver(m=>{for(const f of m){const[d]=f.borderBoxSize;d!==void 0&&(f.target===s&&(l.frame=d.inlineSize),f.target===u&&(l.rem=d.inlineSize))}o()});return c.observe(s),c.observe(u),()=>c.disconnect()},[e,t]),n},_e=e=>`aqmx-split-handle-${e}`,Xn=(e,{frameRef:t,sheetToggleRef:n,handleId:a})=>{const s=r.useRef(!1),u=r.useRef(null),l=r.useRef(!1);r.useLayoutEffect(()=>{const c=t.current;if(c===null)throw new Error("[markdown-explorer] the split frame is not mounted");const m=d=>{const h=d.target instanceof Element?d.target:null;s.current=h!==null&&h.closest(`[data-panel-id="${Fe}"]`)===null,!l.current&&(u.current=h?.closest(`${me}[${G}]`)?.getAttribute(G)??null)},f=d=>{d.relatedTarget instanceof Node&&!c.contains(d.relatedTarget)&&(s.current=!1)};return c.addEventListener("focusin",m),c.addEventListener("focusout",f),()=>{c.removeEventListener("focusin",m),c.removeEventListener("focusout",f)}},[t]);const o=r.useRef(e);r.useLayoutEffect(()=>{if(o.current===e)return;o.current=e;const c=t.current;if(c===null||!s.current)return;const m=f=>{const{activeElement:d,body:h}=c.ownerDocument;if(d!==null&&d!==h)return;const x=f.find(w=>w!==null);if(x!=null){l.current=!0;try{x.focus()}finally{l.current=!1}}};if(e){m([n.current]);return}queueMicrotask(()=>{if(o.current!==e||!s.current)return;const f=u.current,d=`[data-panel-id="${fe}"]`;m([f===null?null:Vn(c,f),c.querySelector(`${d} ${Bn}`),c.querySelector(`${d} ${zn}`),c.querySelector(`[data-resize-handle-id="${a}"]`)])})},[e,t,n,a])},Un=({view:e,explorer:t,content:n,contentCoversPage:a=!1,sheetDismissals:s=0,onDraggingChange:u})=>{const l=r.useRef(null),[o,c]=r.useState(null),m=r.useRef(null),f=r.useRef(null),{inlineSize:d,rootFontPixels:h}=Kn(l,m),x=d!==null&&d<T.explorerSheetBelowPixels(h);return Xn(x,{frameRef:l,sheetToggleRef:f,handleId:_e(e)}),i.jsxs("div",{ref:l,className:"aqmx-split-frame","data-aqmx-explorer-mode":x?"sheet":"split",children:[i.jsx("span",{ref:m,className:"aqmx-rem-probe","aria-hidden":"true","data-aqmx-rem-probe":""}),x?i.jsx($n,{explorer:t,toggleRef:f,covered:a,onNoticeSlotChange:c,dismissals:s}):null,i.jsx(Me,{value:x?o:null,children:i.jsx(Wn,{view:e,sheet:x,explorer:t,content:n,contentCoversPage:a,onDraggingChange:u,explorerMinPixels:T.explorerMinPixels(h)})})]})},Wn=({view:e,sheet:t,explorer:n,content:a,contentCoversPage:s,onDraggingChange:u,explorerMinPixels:l})=>{const{viewSettings:o,labels:c}=R.useExplorer(),f=R.useViewSetting(b=>e==="tree"?b.treeExplorer:b.multiExplorer)??(e==="tree"?T.EXPLORER_DEFAULT_PERCENT:T.EXPLORER_MULTI_DEFAULT_PERCENT),d=r.useRef(null),h=r.useRef(null),x=r.useRef(!1),w=r.useRef(!1),[v,C]=r.useState(!1),y=r.useRef(u);r.useLayoutEffect(()=>{y.current=u},[u]);const M=r.useCallback(()=>{const b=d.current;if(b===null||b.length!==2)return;const[L=0,E=0]=b,N=L+E;if(N<=0||L<=0)return;const P=Math.min(T.EXPLORER_MAX_PERCENT,L/N*100);o.update(e==="tree"?{treeExplorer:P}:{multiExplorer:P})},[o,e]),k=r.useCallback(()=>{h.current!==null&&clearTimeout(h.current),h.current=setTimeout(()=>{h.current=null,M()},T.EXPLORER_WIDTH_PERSIST_DELAY_MS)},[M]);r.useEffect(()=>()=>{h.current!==null&&clearTimeout(h.current),w.current&&y.current?.(!1)},[]);const _=Dn(),D=r.useCallback((b,L)=>{d.current=b;const[E=0,N=0]=b;b.length===2&&N>0&&C(E<=0),L.source==="keyboard"?k():L.source==="pointer"&&(x.current=!0)},[k]),I=r.useCallback(b=>{if(w.current=b,u?.(b),b){x.current=!1;return}x.current&&(x.current=!1,k())},[u,k]);return i.jsxs(re.PanelGroup,{id:`aqmx-split-${e}`,direction:"horizontal",onLayout:D,className:"aqmx-split","data-aqmx-split":e,children:[t?null:i.jsx(re.Panel,{id:fe,defaultSize:{value:f,unit:"percentage"},minSize:{value:l,unit:"pixels"},maxSize:{value:T.EXPLORER_MAX_PERCENT,unit:"percentage"},collapsible:{from:"end"},pixelAdjustPriority:1,inert:s,className:"aqmx-split-explorer",children:i.jsx(ue,{value:!v,children:n})}),t?null:i.jsx(re.PanelResizeHandle,{id:_e(e),thickness:_?T.COARSE_TARGET_PIXELS:T.FINE_TARGET_PIXELS,indicator:{visible:!0,thickness:T.SPLIT_HANDLE_PIXELS.gripThickness,length:T.SPLIT_HANDLE_PIXELS.gripLength,barThickness:T.SPLIT_HANDLE_PIXELS.barThickness,barLength:T.SPLIT_HANDLE_PIXELS.barLength},title:c.resizeExplorer,"aria-label":c.resizeExplorer,onDragging:I,inert:s,className:"aqmx-split-handle"}),i.jsx(re.Panel,{id:Fe,defaultSize:{value:100-f,unit:"percentage"},contentOverflow:"hidden",className:"aqmx-split-content",...s?{style:{isolation:"auto"}}:{},children:a})]})};exports.EMPTY_SELECTION=ae;exports.ExplorerPane=Mn;exports.ExplorerSplit=Un;exports.SheetNoticeSlotContext=Me;
1
+ "use strict";const i=require("react/jsx-runtime"),R=require("./index-DkiGlM7C.cjs"),r=require("react"),T=require("./location-DfYTzfFS.cjs"),ye=require("@aiquants/directory-tree"),Ue=require("@aiquants/virtualscroll"),We=require("./storage-Bkb2Axdi.cjs"),re=require("@aiquants/resize-panels"),Ge=require("react-router");function Ye(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const a=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,a.get?a:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const p=Ye(r);function Qe({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M19.5 21a3 3 0 0 0 3-3V9a3 3 0 0 0-3-3h-5.379a.75.75 0 0 1-.53-.22L11.47 3.66A2.25 2.25 0 0 0 9.879 3H4.5a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3h15ZM9 12.75a.75.75 0 0 0 0 1.5h6a.75.75 0 0 0 0-1.5H9Z",clipRule:"evenodd"}))}const Je=p.forwardRef(Qe);function et({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M19.5 21a3 3 0 0 0 3-3V9a3 3 0 0 0-3-3h-5.379a.75.75 0 0 1-.53-.22L11.47 3.66A2.25 2.25 0 0 0 9.879 3H4.5a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3h15Zm-6.75-10.5a.75.75 0 0 0-1.5 0v2.25H9a.75.75 0 0 0 0 1.5h2.25v2.25a.75.75 0 0 0 1.5 0v-2.25H15a.75.75 0 0 0 0-1.5h-2.25V10.5Z",clipRule:"evenodd"}))}const tt=p.forwardRef(et);function nt({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{d:"M16.5 6a3 3 0 0 0-3-3H6a3 3 0 0 0-3 3v7.5a3 3 0 0 0 3 3v-6A4.5 4.5 0 0 1 10.5 6h6Z"}),p.createElement("path",{d:"M18 7.5a3 3 0 0 1 3 3V18a3 3 0 0 1-3 3h-7.5a3 3 0 0 1-3-3v-7.5a3 3 0 0 1 3-3H18Z"}))}const rt=p.forwardRef(nt);function at({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M3 6a3 3 0 0 1 3-3h2.25a3 3 0 0 1 3 3v2.25a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3V6Zm9.75 0a3 3 0 0 1 3-3H18a3 3 0 0 1 3 3v2.25a3 3 0 0 1-3 3h-2.25a3 3 0 0 1-3-3V6ZM3 15.75a3 3 0 0 1 3-3h2.25a3 3 0 0 1 3 3V18a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3v-2.25Zm9.75 0a3 3 0 0 1 3-3H18a3 3 0 0 1 3 3V18a3 3 0 0 1-3 3h-2.25a3 3 0 0 1-3-3v-2.25Z",clipRule:"evenodd"}))}const lt=p.forwardRef(at),ot=()=>{const{notices:e}=R.useExplorer(),t=r.use(e);return t.length===0?null:i.jsx("div",{className:"aqmx-explorer-notices",children:t.map(n=>i.jsxs("div",{className:"aqmx-callout","data-aqmx-tone":n.tone,"data-testid":"markdown-explorer-notice","data-aqmx-notice":n.id,children:[i.jsx("p",{className:"aqmx-callout-title",children:n.title}),n.body===void 0?null:i.jsx("p",{className:"aqmx-callout-body",children:n.body}),n.action===void 0?null:i.jsx("a",{className:"aqmx-callout-action",href:n.action.href,children:n.action.label})]},n.id))})};function st({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M6.912 3a3 3 0 0 0-2.868 2.118l-2.411 7.838a3 3 0 0 0-.133.882V18a3 3 0 0 0 3 3h15a3 3 0 0 0 3-3v-4.162c0-.299-.045-.596-.133-.882l-2.412-7.838A3 3 0 0 0 17.088 3H6.912Zm13.823 9.75-2.213-7.191A1.5 1.5 0 0 0 17.088 4.5H6.912a1.5 1.5 0 0 0-1.434 1.059L3.265 12.75H6.11a3 3 0 0 1 2.684 1.658l.256.513a1.5 1.5 0 0 0 1.342.829h3.218a1.5 1.5 0 0 0 1.342-.83l.256-.512a3 3 0 0 1 2.684-1.658h2.844Z",clipRule:"evenodd"}))}const ct=p.forwardRef(st),ue=r.createContext(!0),ke="\0loop\0",Te="\0",it=()=>{const e=new WeakMap,t=new WeakMap,n=new WeakMap,a=l=>{const o=e.get(l);if(o!==void 0)return o;const c=Object.freeze({type:"loop",name:l.name,path:l.path});return e.set(l,c),c},s=(l,o,c)=>{let m=!1;const f=l.map(h=>{const x=u(h,o,c);return x!==h&&(m=!0),x});if(!m)return l;const d=n.get(l);return d!==void 0&&d.length===f.length&&d.every((h,x)=>h===f[x])?d:(n.set(l,f),f)},u=(l,o,c)=>{if(l.type!=="directory")return l;if(c.has(l.path))return a(l);const m=l.lazy===!0?o(l.path):void 0,f=m?.status==="loaded",d=f?m.entries:l.children;if(d===void 0)return l;c.add(l.path);const h=s(d,o,c);if(c.delete(l.path),!f&&h===l.children)return l;const x=t.get(l);if(x!==void 0&&x.state===m&&x.children===h)return x.grafted;const w={...l,children:h,lazy:f?!1:l.lazy};return t.set(l,{state:m,children:h,grafted:w}),w};return(l,o)=>s(l,o,new Set)},ut=(e,t)=>`${ke}${e}${Te}${t}`,J=e=>e.startsWith(ke),dt=e=>e.slice(e.lastIndexOf(Te)+1),G="data-aqmx-path",ft=(e,t,n,a,s)=>{const u={aqmxPath:e.path};return n&&(u.aqmxOpen=!0),(a==="loading"||a==="failed")&&(u.aqmxChildren=a),{name:e.name,type:e.type,absolutePath:e.path,relativePath:e.path,mimeType:e.mimeType,children:t,label:s,data:u}},mt=(e,t,n,a)=>{const s=ut(t,e.path);return{name:n,type:"directory",absolutePath:s,relativePath:s,children:a,data:{aqmxLoop:e.path}}},pt=()=>{const e=new WeakMap,t=new WeakMap,n=new WeakMap,a=[],s=(o,c,m)=>{const f=o.map(h=>h.type==="loop"?u(h,c,m):l(h,c)),d=n.get(o);return d!==void 0&&d.length===f.length&&d.every((h,x)=>h===f[x])?d:(n.set(o,f),f)},u=(o,c,m)=>{const f=t.get(o);if(f!==void 0&&f.parentKey===m&&f.loopFolderName===c.loopFolderName)return f.row;const d=mt(o,m,c.loopFolderName(o.name),a);return t.set(o,{row:d,parentKey:m,loopFolderName:c.loopFolderName}),d},l=(o,c)=>{const m=o.type==="directory"?o.children===void 0?a:s(o.children,c,o.path):void 0,f=c.openPaths.has(o.path),d=o.type==="directory"&&o.lazy===!0?c.childrenOf(o.path)?.status:void 0,h=d==="failed"?c.renderFailedFolder:void 0,x=e.get(o);if(x!==void 0&&x.open===f&&x.childrenStatus===d&&x.children===m&&x.renderFailedFolder===h)return x.row;const w=ft(o,m,f,d,h===void 0?void 0:h(o));return e.set(o,{row:w,open:f,childrenStatus:d,children:m,renderFailedFolder:h}),w};return(o,c)=>s(o,c,"")},ht=e=>{if(e===void 0)return;const t=n=>({name:n.name,path:n.absolutePath,type:n.type});return(n,a)=>e(t(n),t(a))},ie=(e,t)=>{const n=e.filter(a=>a.type==="directory");return t===void 0?n:n.sort(t)},xt=(e,t)=>{const n=new Map;let a=0;const s=u=>{for(const l of ie(u,t.compare))if(t.isShownExpanded(l.path)){if(l.lazy!==!0){l.children!==void 0&&s(l.children);continue}n.has(l.path)||(n.set(l.path,t.isDirect(l.path)?"direct":"bulk"),t.childrenOf(l.path)?.status!=="failed"&&(a+=1))}};return s(e),{folders:n,waiting:a}},wt=e=>{const t=new Set,n=a=>{for(const s of a)s.type==="directory"&&(s.lazy===!0&&t.add(s.path),s.children!==void 0&&n(s.children))};return n(e),t},Ce=(e,t)=>{for(const n of e){if(n.type!=="directory")continue;if(n.path===t)return n;const a=n.children===void 0?null:Ce(n.children,t);if(a!==null)return a}return null},Ee=new Set,gt=(e,t)=>e.has(t)?e:new Set(e).add(t),Et=(e,t)=>{if(!t.some(a=>e.has(a)))return e;const n=new Set(t);return new Set([...e].filter(a=>!n.has(a)))},bt=(e,t)=>[...e].every(n=>t.has(n))?e:new Set([...e].filter(n=>t.has(n))),vt=()=>{const[e,t]=r.useState(Ee),n=r.useCallback(l=>t(o=>gt(o,l)),[]),a=r.useCallback(l=>t(o=>Et(o,l)),[]),s=r.useCallback(l=>t(o=>bt(o,l)),[]),u=r.useCallback(()=>t(Ee),[]);return r.useMemo(()=>({direct:e,markDirect:n,unmarkDirect:a,pruneDirect:s,clearDirect:u}),[e,n,a,s,u])},Rt=e=>({budget:e,handled:new Set,loads:new Set,opened:0,folderLimited:!1,depthLimited:!1,announcedStart:!1,issuedAgainst:null}),St=(e,t)=>{const n=[];let a=ie(t.entries,t.compare);for(let s=1;a.length>0;s+=1){const u=[];for(const l of a){const{path:o}=l;if(t.isShownExpanded(o))e.handled.add(o);else{if(e.handled.has(o))continue;if(e.handled.add(o),l.lazy===!0&&t.childrenOf(o)===void 0){if(s>e.budget.maxDepth){e.depthLimited=!0;continue}if(e.loads.size>=e.budget.maxFolders){e.folderLimited=!0;continue}e.loads.add(o)}n.push(o),e.opened+=1}l.lazy!==!0&&l.children!==void 0&&u.push(...ie(l.children,t.compare))}a=u}return n},Le=(e,t)=>e.every(n=>n.type!=="directory"||t(n.path)&&(n.lazy===!0||n.children===void 0||Le(n.children,t))),yt=(e,t)=>{if(e.folderLimited)return{kind:"folder-limit",opened:e.opened};if(e.depthLimited)return{kind:"depth-limit",opened:e.opened};let n=0;for(const a of e.loads)t.childrenOf(a)?.status==="failed"&&(n+=1);return{kind:"done",opened:e.opened,failed:n,complete:Le(t.entries,t.isShownExpanded)}},ce=Object.freeze({state:"idle"}),kt=e=>{const t=r.useRef(null),n=r.useRef(e),[a,s]=r.useState(ce);r.useLayoutEffect(()=>{n.current=e});const u=r.useCallback(()=>{t.current===null&&(t.current=Rt(n.current.budget),s({state:"running",opened:0}))},[]),l=r.useCallback(()=>{t.current=null,s(ce)},[]),o=r.useCallback(c=>{const m=t.current;if(m===null)return;const f=St(m,c);if(f.length>0&&(m.issuedAgainst=c.expanded,n.current.expandMultiple([...f])),!m.announcedStart&&(m.loads.size>0||c.waiting>0)&&(m.announcedStart=!0,n.current.onStart()),f.length===0&&!c.expansionPending&&c.expanded!==m.issuedAgainst&&c.waiting===0){t.current=null;const h=yt(m,c);s(h.kind==="done"?ce:{state:"stopped",stop:h.kind,opened:h.opened}),n.current.onFinish(h);return}const{opened:d}=m;s(h=>h.state==="running"&&h.opened===d?h:{state:"running",opened:d})},[]);return r.useMemo(()=>({status:a,start:u,end:l,advance:o}),[a,u,l,o])},Tt="--aqmx-tree-line",Ct=Object.freeze(["(forced-colors: active)","(prefers-color-scheme: dark)"]),Lt="data-aqmx-tree-probe",jt=Object.freeze({rowHeight:T.CONTROL_BLOCK_PIXELS,lineColor:null}),Nt=/^rgb\((\d{1,3}), (\d{1,3}), (\d{1,3})\)$/u,qt=e=>{const t=Nt.exec(e);return t===null?e:`#${t.slice(1).map(n=>Number(n).toString(16).padStart(2,"0")).join("")}`},Pt=(e,t)=>{const[n,a]=r.useState(jt);return r.useLayoutEffect(()=>{const s=e.current;if(s===null)return;const u=()=>{const c=Math.round(s.getBoundingClientRect().height),m=getComputedStyle(s),f=m.getPropertyValue(Tt).trim()===""?null:qt(m.color);a(d=>{const h=Number.isFinite(c)&&c>0?c:d.rowHeight;return d.rowHeight===h&&d.lineColor===f?d:{rowHeight:h,lineColor:f}})};u();const l=Ct.map(c=>window.matchMedia(c));for(const c of l)c.addEventListener("change",u);const o=typeof ResizeObserver>"u"?null:new ResizeObserver(u);return o?.observe(s),()=>{for(const c of l)c.removeEventListener("change",u);o?.disconnect()}},[e,t]),n},Ot={renderVisual:Ue.tapScrollCircleSampleVisual,minSpeedMultiplier:.25,maxSpeedMultiplier:18},At="markdown-explorer-tree-scroll",Mt={testId:At,overscanCount:13,callbackThrottleMs:13,scrollBarOptions:{width:8,enableTrackClick:!0,enableThumbDrag:!0,enableArrowButtons:!0,enableArrowButtonTabStops:!1,enableScrollToTopBottomButtons:!0,tapScrollCircleOptions:Ot},behaviorOptions:{enablePointerDrag:!0}},Ft={hoverClassName:"",directorySelectedClassName:"",itemSelectedClassName:""},_t={color:"inherit"},It={paddingBlock:0},Dt=new Set,Ht=new Map,Zt={color:"var(--aqmx-tree-line)"},be=["pointerdown","wheel","touchstart","keydown","focusin"],$t=(e,t,n)=>{const a=r.useRef(null),s=r.useRef(null),u=r.useCallback(()=>{const l=t.current;a.current===null||s.current!==null||l===null||l.getClientRects().length===0||(s.current=requestAnimationFrame(()=>{s.current=null;const o=a.current;o!==null&&e.current?.scrollToPath(o,{align:"nearest"})===!1&&(a.current=null)}))},[e,t]);r.useEffect(()=>{const l=t.current;if(l===null)return;const o=()=>{a.current=null},c=typeof ResizeObserver>"u"?null:new ResizeObserver(u);c?.observe(l);for(const m of be)l.addEventListener(m,o,{passive:!0});return()=>{c?.disconnect();for(const m of be)l.removeEventListener(m,o);s.current!==null&&cancelAnimationFrame(s.current),s.current=null}},[t,u]),r.useEffect(()=>{const l=t.current;a.current=n===null||l===null||l.contains(l.ownerDocument.activeElement)?null:n,u()},[n,t,u])},Bt=e=>{const t=e instanceof Element?e.closest(`[${G}]`):null;return t===null||t.getAttribute("data-entry-type")!=="file"?null:t.getAttribute(G)},je=(e,t,n,a)=>n==="folder-limit"?e.expandAllFolderLimit(a,t.maxFolders,e.expandAll):e.expandAllDepthLimit(a,t.maxDepth),zt=(e,t,n)=>n.kind==="done"?e.expandAllDone(n.opened,n.failed,n.complete):je(e,t,n.kind,n.opened),Ne=()=>{const{labels:e}=R.useExplorer();return i.jsxs("div",{className:"aqmx-explorer-loading","aria-busy":"true","data-testid":"markdown-explorer-tree-loading",children:[i.jsx("p",{className:"aqmx-explorer-loading-text",children:e.treeLoading}),i.jsxs("div",{className:"aqmx-skeleton","aria-hidden":"true",children:[i.jsx("span",{}),i.jsx("span",{}),i.jsx("span",{}),i.jsx("span",{}),i.jsx("span",{})]})]})},Vt=()=>{const{labels:e}=R.useExplorer();return i.jsxs("div",{className:"aqmx-empty","data-testid":"markdown-explorer-tree-empty",children:[i.jsx(ct,{className:"aqmx-explorer-empty-icon","aria-hidden":"true"}),i.jsx("p",{className:"aqmx-empty-title",children:e.treeEmptyTitle}),i.jsx("p",{className:"aqmx-explorer-empty-body",children:e.treeEmptyBody})]})},Kt=({name:e,onRetry:t})=>{const{labels:n}=R.useExplorer(),a=r.useId();return i.jsxs("span",{className:"aqmx-explorer-folder-failed",children:[i.jsx("span",{className:"aqmx-explorer-folder-name",children:e}),i.jsx("span",{id:a,className:"aqmx-explorer-folder-error",children:n.folderLoadFailed}),i.jsxs("button",{type:"button",className:"aqmx-explorer-folder-retry","aria-describedby":a,"data-testid":"markdown-explorer-folder-retry",onClick:s=>{s.stopPropagation();const u=s.currentTarget,l=u.ownerDocument.activeElement===u?u.closest('[role="treeitem"]'):null;l instanceof HTMLElement&&R.focusWithoutScroll(l),t()},onKeyDown:s=>{s.key!=="Escape"&&s.stopPropagation()},children:[i.jsx(R.ForwardRef,{className:"aqmx-explorer-folder-retry-icon","aria-hidden":"true"}),i.jsx("span",{className:"aqmx-explorer-folder-retry-text",children:n.retry})]})]})},Xt=({entries:e,version:t,mode:n,sourceId:a,settings:s,openPaths:u,selection:l,onOpenDocument:o,expansion:c,onShown:m,marks:f,claimsHeld:d,expandAll:h})=>{const{trees:x,documents:w,labels:v,locale:C,theme:y}=R.useExplorer(),M=r.use(ue),[k]=r.useState(pt),_=r.useRef(null),{rowHeight:D,lineColor:I}=Pt(_,y),{isExpanded:b,toggle:L,expandMultiple:E,collapseMultiple:N,expanded:P,isPending:z}=c,{alwaysExpanded:V,sortMode:O,directoriesFirst:Y}=s,{direct:K,markDirect:H,unmarkDirect:F,pruneDirect:A}=f,{running:Z,advance:ee}=h,Q=r.useRef(null),W=r.useRef(null);$t(Q,W,l.shownPath);const X=r.useMemo(()=>T.createEntryComparator({sortMode:O,directoriesFirst:Y}),[O,Y]),le=r.useMemo(()=>ht(X),[X]),$=r.useCallback(g=>x.children(a,g),[x,a]),S=r.useMemo(()=>wt(e),[e]),j=r.useCallback(g=>!J(g)&&(b(g)||V&&!S.has(g)),[b,V,S]),B=r.useRef({shownExpanded:j,isExpanded:b,unloadedFolders:S});r.useLayoutEffect(()=>{B.current={shownExpanded:j,isExpanded:b,unloadedFolders:S}},[j,b,S]);const pe=r.useCallback(g=>{Q.current?.scrollToPath(g,{align:"nearest"}),requestAnimationFrame(()=>{const q=W.current;if(q===null)return;const U=[...q.querySelectorAll(`[role="treeitem"][${G}]`)].find(Xe=>Xe.getAttribute(G)===g);U!==void 0&&R.focusWithoutScroll(U)})},[]),Ie=r.useCallback(g=>{if(J(g)){pe(dt(g));return}B.current.isExpanded(g)?F([g]):B.current.unloadedFolders.has(g)&&H(g),L(g)},[pe,H,F,L]),oe=r.useCallback(g=>{const q=g.filter(U=>!J(U));q.length!==0&&(F(q),N(q))},[F,N]),De=r.useCallback(g=>{const q=g.filter(U=>!J(U));q.length!==0&&(q.length<g.length&&q.every(U=>B.current.shownExpanded(U))?oe(q):E(q))},[E,oe]),he=r.useCallback(g=>i.jsx(Kt,{name:g.name,onRetry:()=>{H(g.path),x.retryChildren(a,g.path),B.current.shownExpanded(g.path)||E([g.path])}}),[x,a,H,E]),xe=n==="multi"?u:Dt,{loopFolderName:we}=v,He=r.useMemo(()=>k(e,{openPaths:xe,childrenOf:$,renderFailedFolder:he,loopFolderName:we}),[k,e,xe,$,he,we,t]),Ze=R.useIntentPrefetch(w,Bt),ge=r.useCallback(g=>K.has(g),[K]),te=r.useMemo(()=>xt(e,{isShownExpanded:j,childrenOf:$,compare:X,isDirect:ge}),[e,j,$,X,ge,t]),ne=M&&d;r.useLayoutEffect(()=>{m(e)},[e,m]),r.useLayoutEffect(()=>()=>m(null),[m]),r.useEffect(()=>x.claimChildren(a,ne?te.folders:Ht),[x,a,ne,te]),r.useEffect(()=>A(S),[A,S]),r.useEffect(()=>{ne&&Z&&ee({entries:e,isShownExpanded:j,childrenOf:$,compare:X,expanded:P,waiting:te.waiting,expansionPending:z})},[ne,Z,ee,e,j,$,X,P,te,z]);const $e=r.useCallback(g=>{g.isDirectory||o(g.entry.absolutePath)},[o]),{onChange:se}=l,Be=r.useMemo(()=>se===null?void 0:(g,q)=>{J(g.absolutePath)||se({path:g.absolutePath,name:g.name,selected:q})},[se]),ze=r.useMemo(()=>new Set(l.items),[l.items]),Ve=r.useMemo(()=>({entryKindDirectory:v.treeEntryKindDirectory,entryKindFile:v.treeEntryKindFile,scrollUp:v.treeScrollUp,scrollDown:v.treeScrollDown,scrollToTop:v.treeScrollToTop,scrollToBottom:v.treeScrollToBottom}),[v]),Ke=I===null?{showTreeLines:!1}:{showTreeLines:s.lines,lineColor:I};return i.jsxs("div",{ref:W,className:"aqmx-explorer-tree","data-testid":"markdown-explorer-tree",...Ze,children:[i.jsx("span",{ref:_,className:"aqmx-explorer-tree-probe","aria-hidden":"true",[Lt]:""}),i.jsx(ye.DirectoryTree,{ref:Q,entries:He,expansion:{toggle:Ie,isExpanded:j,expandMultiple:De,collapseMultiple:oe,isPending:z&&!Z,doubleClickAction:s.doubleClickAction},selection:{mode:l.mode,selectedPath:l.shownPath,currentPath:l.shownPath,selectedItems:ze,onEntryClick:$e,onSelectionChange:Be},visual:{className:"aqmx-explorer-tree-view",ariaLabel:v.treeRegion,...Ke,showExpandIcons:s.expandIcons,expandIconStyle:Zt,showDirectoryIcons:s.directoryIcons,showFileIcons:s.fileIcons,expandIconSize:s.expandIconSize,itemHeight:D,removeRootIndent:s.removeRootIndent,highlightStyles:Ft,entryStyle:It,nameStyle:_t},virtualScroll:Mt,sort:le,locale:C,labels:Ve})]})},Ut=({pending:e,status:t})=>{const{labels:n}=R.useExplorer(),a=t.state!=="running",[s,u]=r.useState(0),l=r.useRef(!0);r.useLayoutEffect(()=>{const c=l.current;if(l.current=a,!a||e>0&&!c){u(0);return}if(e>0){u(e);return}if(s===0)return;const m=setTimeout(()=>u(0),0);return()=>clearTimeout(m)},[a,e,s]);const o=a&&e===0?s:e;return o===0&&a?null:i.jsxs("p",{className:"aqmx-explorer-tree-progress","data-testid":"markdown-explorer-tree-progress","data-aqmx-loading":String(o),"data-aqmx-expand-all":t.state,children:[o>0?i.jsx(R.ForwardRef,{className:"aqmx-explorer-tree-progress-icon","aria-hidden":"true"}):null,i.jsx("span",{children:t.state==="running"?n.expandAllProgress(t.opened,o):n.foldersLoading(o)})]})},Wt=({stop:e,opened:t,budget:n})=>{const{labels:a}=R.useExplorer();return i.jsx("p",{className:"aqmx-explorer-expand-all-stop","data-testid":"markdown-explorer-expand-all-stop","data-aqmx-stop":e,children:je(a,n,e,t)})},Gt=({entries:e,...t})=>{const{trees:n}=R.useExplorer(),a=r.useSyncExternalStore(n.subscribe,n.version,n.version),{sourceId:s}=t,[u]=r.useState(it),l=r.useMemo(()=>u(e,o=>n.children(s,o)),[u,e,n,s,a]);return l.length===0?i.jsx(Vt,{}):i.jsx(Xt,{entries:l,version:a,...t})},Yt=({result:e,onRetry:t,...n})=>{const{renderTreeFailure:a}=R.useExplorer(),s=r.use(e);if(s.status==="deferred")return i.jsx(Ne,{});if(s.status==="ok")return i.jsx(Gt,{entries:s.entries,...n});const u=a?.(s.failure);return i.jsx("div",{className:"aqmx-explorer-tree-message","data-testid":"markdown-explorer-tree-failure","data-aqmx-failure":s.failure.reason,children:u!==void 0?u:i.jsx(R.FailureView,{failure:s.failure,alert:!0,onRetry:t,testId:null})})},Qt=({onControls:e,...t})=>{const{trees:n,storageNamespace:a,labels:s,announcer:u,config:l}=R.useExplorer(),{sourceId:o}=t,c=ye.useDirectoryTreeState({storageKey:We.storageKeys(a).treeExpansion(o)});r.useSyncExternalStore(n.subscribe,n.version,n.version);const m=n.read(o),f=r.useCallback(()=>n.retry(o),[n,o]);r.useLayoutEffect(()=>n.open(o),[n,o]);const d=vt(),{expanded:h,expandMultiple:x,collapseAll:w}=c,[v,C]=r.useState(null),y=v!==h,M=r.useRef(h);r.useLayoutEffect(()=>{M.current=h},[h]);const k=l.expandAll,_=r.useCallback(()=>u.announce(s.expandAllStarted),[u,s]),D=r.useCallback(A=>u.announce(zt(s,k,A)),[u,s,k]),I=kt({budget:k,expandMultiple:x,onStart:_,onFinish:D}),{status:b,start:L,end:E,advance:N}=I,P=b.state==="running",z=r.useMemo(()=>({running:P,advance:N}),[P,N]),V=r.useRef(null),[O,Y]=r.useState(!1),K=r.useCallback(A=>{V.current=A,Y(A!==null)},[]);r.useEffect(()=>n.subscribeChildrenFailures(A=>{const Z=A.sourceId===o&&V.current!==null?Ce(V.current,A.path):null;Z!==null&&u.announce({list:s.foldersLoadFailedNamed,item:Z.name})}),[n,o,u,s]);const{clearDirect:H}=d,F=r.useCallback(()=>{E(),H(),C(M.current),w()},[E,H,w]);return r.useEffect(()=>{e({collapseAll:F,expandAll:O?L:null,expanding:P})},[e,F,L,O,P]),r.useEffect(()=>()=>e(null),[e]),r.useEffect(()=>{O||E()},[O,E]),i.jsxs(i.Fragment,{children:[b.state==="stopped"?i.jsx(Wt,{stop:b.stop,opened:b.opened,budget:k}):null,i.jsxs("div",{className:"aqmx-explorer-tree-area",children:[i.jsx(r.Suspense,{fallback:i.jsx(Ne,{}),children:i.jsx(Yt,{result:m,onRetry:f,expansion:c,onShown:K,marks:d,claimsHeld:y,expandAll:z,...t})}),i.jsx(Ut,{pending:n.pendingChildren(o),status:b})]})]})};function Jt({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M5.47 5.47a.75.75 0 0 1 1.06 0L12 10.94l5.47-5.47a.75.75 0 1 1 1.06 1.06L13.06 12l5.47 5.47a.75.75 0 1 1-1.06 1.06L12 13.06l-5.47 5.47a.75.75 0 0 1-1.06-1.06L10.94 12 5.47 6.53a.75.75 0 0 1 0-1.06Z",clipRule:"evenodd"}))}const qe=p.forwardRef(Jt),ve="markdown-explorer-selection-remove",en=({selection:e,onRemove:t,onClear:n,onOpenSelection:a,onLeave:s})=>{const{labels:u}=R.useExplorer(),l=r.useId(),o=r.useRef(null),c=[...e],m=(d,h)=>{if(h.ownerDocument.activeElement===h){const x=o.current===null?[]:[...o.current.querySelectorAll(`[data-testid="${ve}"]`)],w=x.indexOf(h),v=[x[w+1],x[w-1]].find(C=>C!==void 0);v===void 0?s():v.focus()}t(d)},f=()=>{const d=o.current;d!==null&&d.contains(d.ownerDocument.activeElement)&&s(),n()};return i.jsxs("section",{ref:o,className:"aqmx-explorer-tray","aria-labelledby":l,"data-testid":"markdown-explorer-selection-tray",children:[i.jsxs("div",{className:"aqmx-explorer-tray-header",children:[i.jsx("p",{id:l,className:"aqmx-explorer-tray-title",children:u.selectionTitle(c.length)}),i.jsx("button",{type:"button",className:"aqmx-explorer-tray-button","data-testid":"markdown-explorer-selection-clear",onClick:f,children:u.clearSelection})]}),i.jsx("ul",{className:"aqmx-explorer-tray-list",children:c.map(([d,h])=>i.jsxs("li",{className:"aqmx-explorer-tray-item",children:[i.jsx("span",{className:"aqmx-explorer-tray-name",title:d,children:h}),i.jsx("button",{type:"button",className:"aqmx-icon-button aqmx-explorer-tray-remove","aria-label":u.removeFromSelection(h),title:u.removeFromSelection(h),"data-testid":ve,"data-aqmx-path":d,onClick:x=>m(d,x.currentTarget),children:i.jsx(qe,{"aria-hidden":"true"})})]},d))}),a===void 0?null:i.jsx("button",{type:"button",className:"aqmx-explorer-tray-open","data-testid":"markdown-explorer-selection-open",onClick:()=>a(c.map(([d])=>d)),children:u.openSelectionInMulti(c.length)})]})},ae=new Map,tn=(e,t)=>{if(t.selected===e.has(t.path))return e;const n=new Map(e);return t.selected?n.set(t.path,t.name):n.delete(t.path),n},nn=(e,t)=>{if(!e.has(t))return e;const n=new Map(e);return n.delete(t),n},Pe=r.createContext(null),rn=e=>{const t=r.use(Pe);r.useLayoutEffect(()=>{if(t!==null)return t(e),()=>t(!1)},[t,e])};function an({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M15 3.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0V5.56l-3.97 3.97a.75.75 0 1 1-1.06-1.06l3.97-3.97h-2.69a.75.75 0 0 1-.75-.75Zm-12 0A.75.75 0 0 1 3.75 3h4.5a.75.75 0 0 1 0 1.5H5.56l3.97 3.97a.75.75 0 0 1-1.06 1.06L4.5 5.56v2.69a.75.75 0 0 1-1.5 0v-4.5Zm11.47 11.78a.75.75 0 1 1 1.06-1.06l3.97 3.97v-2.69a.75.75 0 0 1 1.5 0v4.5a.75.75 0 0 1-.75.75h-4.5a.75.75 0 0 1 0-1.5h2.69l-3.97-3.97Zm-4.94-1.06a.75.75 0 0 1 0 1.06L5.56 19.5h2.69a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75v-4.5a.75.75 0 0 1 1.5 0v2.69l3.97-3.97a.75.75 0 0 1 1.06 0Z",clipRule:"evenodd"}))}const ln=p.forwardRef(an);function on({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M6.97 2.47a.75.75 0 0 1 1.06 0l4.5 4.5a.75.75 0 0 1-1.06 1.06L8.25 4.81V16.5a.75.75 0 0 1-1.5 0V4.81L3.53 8.03a.75.75 0 0 1-1.06-1.06l4.5-4.5Zm9.53 4.28a.75.75 0 0 1 .75.75v11.69l3.22-3.22a.75.75 0 1 1 1.06 1.06l-4.5 4.5a.75.75 0 0 1-1.06 0l-4.5-4.5a.75.75 0 1 1 1.06-1.06l3.22 3.22V7.5a.75.75 0 0 1 .75-.75Z",clipRule:"evenodd"}))}const sn=p.forwardRef(on);function cn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z",clipRule:"evenodd"}))}const un=p.forwardRef(cn);function dn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M7.72 12.53a.75.75 0 0 1 0-1.06l7.5-7.5a.75.75 0 1 1 1.06 1.06L9.31 12l6.97 6.97a.75.75 0 1 1-1.06 1.06l-7.5-7.5Z",clipRule:"evenodd"}))}const fn=p.forwardRef(dn);function mn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M11.47 4.72a.75.75 0 0 1 1.06 0l3.75 3.75a.75.75 0 0 1-1.06 1.06L12 6.31 8.78 9.53a.75.75 0 0 1-1.06-1.06l3.75-3.75Zm-3.75 9.75a.75.75 0 0 1 1.06 0L12 17.69l3.22-3.22a.75.75 0 1 1 1.06 1.06l-3.75 3.75a.75.75 0 0 1-1.06 0l-3.75-3.75a.75.75 0 0 1 0-1.06Z",clipRule:"evenodd"}))}const pn=p.forwardRef(mn);function hn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M11.078 2.25c-.917 0-1.699.663-1.85 1.567L9.05 4.889c-.02.12-.115.26-.297.348a7.493 7.493 0 0 0-.986.57c-.166.115-.334.126-.45.083L6.3 5.508a1.875 1.875 0 0 0-2.282.819l-.922 1.597a1.875 1.875 0 0 0 .432 2.385l.84.692c.095.078.17.229.154.43a7.598 7.598 0 0 0 0 1.139c.015.2-.059.352-.153.43l-.841.692a1.875 1.875 0 0 0-.432 2.385l.922 1.597a1.875 1.875 0 0 0 2.282.818l1.019-.382c.115-.043.283-.031.45.082.312.214.641.405.985.57.182.088.277.228.297.35l.178 1.071c.151.904.933 1.567 1.85 1.567h1.844c.916 0 1.699-.663 1.85-1.567l.178-1.072c.02-.12.114-.26.297-.349.344-.165.673-.356.985-.57.167-.114.335-.125.45-.082l1.02.382a1.875 1.875 0 0 0 2.28-.819l.923-1.597a1.875 1.875 0 0 0-.432-2.385l-.84-.692c-.095-.078-.17-.229-.154-.43a7.614 7.614 0 0 0 0-1.139c-.016-.2.059-.352.153-.43l.84-.692c.708-.582.891-1.59.433-2.385l-.922-1.597a1.875 1.875 0 0 0-2.282-.818l-1.02.382c-.114.043-.282.031-.449-.083a7.49 7.49 0 0 0-.985-.57c-.183-.087-.277-.227-.297-.348l-.179-1.072a1.875 1.875 0 0 0-1.85-1.567h-1.843ZM12 15.75a3.75 3.75 0 1 0 0-7.5 3.75 3.75 0 0 0 0 7.5Z",clipRule:"evenodd"}))}const xn=p.forwardRef(hn);function wn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M12 1.5a.75.75 0 0 1 .75.75V4.5a.75.75 0 0 1-1.5 0V2.25A.75.75 0 0 1 12 1.5ZM5.636 4.136a.75.75 0 0 1 1.06 0l1.592 1.591a.75.75 0 0 1-1.061 1.06l-1.591-1.59a.75.75 0 0 1 0-1.061Zm12.728 0a.75.75 0 0 1 0 1.06l-1.591 1.592a.75.75 0 0 1-1.06-1.061l1.59-1.591a.75.75 0 0 1 1.061 0Zm-6.816 4.496a.75.75 0 0 1 .82.311l5.228 7.917a.75.75 0 0 1-.777 1.148l-2.097-.43 1.045 3.9a.75.75 0 0 1-1.45.388l-1.044-3.899-1.601 1.42a.75.75 0 0 1-1.247-.606l.569-9.47a.75.75 0 0 1 .554-.68ZM3 10.5a.75.75 0 0 1 .75-.75H6a.75.75 0 0 1 0 1.5H3.75A.75.75 0 0 1 3 10.5Zm14.25 0a.75.75 0 0 1 .75-.75h2.25a.75.75 0 0 1 0 1.5H18a.75.75 0 0 1-.75-.75Zm-8.962 3.712a.75.75 0 0 1 0 1.061l-1.591 1.591a.75.75 0 1 1-1.061-1.06l1.591-1.592a.75.75 0 0 1 1.06 0Z",clipRule:"evenodd"}))}const gn=p.forwardRef(wn);function En({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z",clipRule:"evenodd"}),p.createElement("path",{d:"M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z"}))}const bn=p.forwardRef(En);function vn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{d:"M19.5 21a3 3 0 0 0 3-3v-4.5a3 3 0 0 0-3-3h-15a3 3 0 0 0-3 3V18a3 3 0 0 0 3 3h15ZM1.5 10.146V6a3 3 0 0 1 3-3h5.379a2.25 2.25 0 0 1 1.59.659l2.122 2.121c.14.141.331.22.53.22H19.5a3 3 0 0 1 3 3v1.146A4.483 4.483 0 0 0 19.5 9h-15a4.483 4.483 0 0 0-3 1.146Z"}))}const Rn=p.forwardRef(vn);function Sn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{d:"M19.906 9c.382 0 .749.057 1.094.162V9a3 3 0 0 0-3-3h-3.879a.75.75 0 0 1-.53-.22L11.47 3.66A2.25 2.25 0 0 0 9.879 3H6a3 3 0 0 0-3 3v3.162A3.756 3.756 0 0 1 4.094 9h15.812ZM4.094 10.5a2.25 2.25 0 0 0-2.227 2.568l.857 6A2.25 2.25 0 0 0 4.951 21H19.05a2.25 2.25 0 0 0 2.227-1.932l.857-6a2.25 2.25 0 0 0-2.227-2.568H4.094Z"}))}const yn=p.forwardRef(Sn);function kn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M10.5 3.75a6.75 6.75 0 1 0 0 13.5 6.75 6.75 0 0 0 0-13.5ZM2.25 10.5a8.25 8.25 0 1 1 14.59 5.28l4.69 4.69a.75.75 0 1 1-1.06 1.06l-4.69-4.69A8.25 8.25 0 0 1 2.25 10.5Zm8.25-3.75a.75.75 0 0 1 .75.75v2.25h2.25a.75.75 0 0 1 0 1.5h-2.25v2.25a.75.75 0 0 1-1.5 0v-2.25H7.5a.75.75 0 0 1 0-1.5h2.25V7.5a.75.75 0 0 1 .75-.75Z",clipRule:"evenodd"}))}const Tn=p.forwardRef(kn);function Cn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{d:"M5.625 3.75a2.625 2.625 0 1 0 0 5.25h12.75a2.625 2.625 0 0 0 0-5.25H5.625ZM3.75 11.25a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75ZM3 15.75a.75.75 0 0 1 .75-.75h16.5a.75.75 0 0 1 0 1.5H3.75a.75.75 0 0 1-.75-.75ZM3.75 18.75a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75Z"}))}const Ln=p.forwardRef(Cn),de=e=>{e.preventDefault(),e.stopPropagation()},jn=Object.freeze({sortMode:sn,directoriesFirst:Rn,selectionMode:un,doubleClickAction:gn,expandIconSize:Tn,alwaysExpanded:ln,removeRootIndent:fn,lines:Ln,expandIcons:pn,directoryIcons:yn,fileIcons:bn}),Oe=(e,t)=>{const n=e[t.labelKey];if(typeof n!="string")throw new TypeError(`[markdown-explorer] the tree setting ${t.key} must name a string label; labels.${t.labelKey} is a ${typeof n}`);return n},Nn=({id:e,settings:t,descriptors:n,onAdvance:a,onClose:s,ref:u})=>{const{labels:l}=R.useExplorer(),o=r.useRef([]);r.useEffect(()=>{o.current[0]?.focus()},[]);const c=r.useCallback(f=>{const d=n.length;o.current[(f%d+d)%d]?.focus()},[n.length]),m=r.useCallback((f,d)=>{switch(f.key){case"ArrowDown":f.preventDefault(),c(d+1);break;case"ArrowUp":f.preventDefault(),c(d-1);break;case"Home":f.preventDefault(),c(0);break;case"End":f.preventDefault(),c(n.length-1);break;case"Escape":de(f),s();break;case"Tab":s();break}},[n.length,c,s]);return i.jsx("div",{ref:u,id:e,role:"menu","aria-label":l.treeSettings,className:"aqmx-explorer-menu","data-testid":"markdown-explorer-tree-settings-menu",children:n.map((f,d)=>{const h=jn[f.key],x=Oe(l,f),w=T.formatTreeSettingValue(l,t,f.key),v=t[f.key],C=typeof v=="boolean"?{role:"menuitemcheckbox","aria-checked":v,"aria-label":x}:{role:"menuitem","aria-label":`${x}: ${w}`};return i.jsxs("button",{ref:y=>{o.current[d]=y},type:"button",tabIndex:-1,...C,title:`${x}: ${w}`,className:"aqmx-explorer-menu-item","data-testid":"markdown-explorer-tree-settings-item","data-aqmx-setting":f.key,onClick:()=>a(f),onKeyDown:y=>m(y,d),children:[i.jsx(h,{className:"aqmx-explorer-menu-icon","aria-hidden":"true"}),i.jsx("span",{className:"aqmx-explorer-menu-name",children:x}),i.jsx("span",{className:"aqmx-explorer-menu-value",children:w})]},f.key)})})},qn=({settings:e,descriptors:t,onAdvance:n})=>{const{labels:a,announcer:s}=R.useExplorer(),[u,l]=r.useState(!1),o=r.useRef(null),c=r.useRef(null),m=r.useRef(null),f=r.useId(),d=r.useCallback(()=>{o.current?.focus(),l(!1)},[]);r.useEffect(()=>{if(!u)return;const w=v=>{v.target instanceof Node&&(o.current?.contains(v.target)===!0||c.current?.contains(v.target)===!0)||(l(!1),m.current!==null&&window.clearTimeout(m.current),m.current=window.setTimeout(()=>{m.current=null,(document.activeElement===null||document.activeElement===document.body)&&o.current?.focus()},0))};return document.addEventListener("pointerdown",w),()=>document.removeEventListener("pointerdown",w)},[u]),r.useEffect(()=>()=>{m.current!==null&&window.clearTimeout(m.current)},[]);const h=r.useCallback(w=>{w.key!=="Escape"||!u||(de(w),d())},[u,d]),x=r.useCallback(w=>{const v=n(w.key);s.announce(a.settingAnnouncement(Oe(a,w),T.formatTreeSettingValue(a,v,w.key)))},[s,a,n]);return{trigger:i.jsx("button",{ref:o,type:"button",className:"aqmx-icon-button","aria-haspopup":"menu","aria-expanded":u,"aria-controls":u?f:void 0,"aria-label":a.treeSettings,title:a.treeSettings,"data-testid":"markdown-explorer-tree-settings",onClick:()=>l(w=>!w),onKeyDown:h,children:i.jsx(xn,{"aria-hidden":"true"})}),menu:u?i.jsx(Nn,{ref:c,id:f,settings:e,descriptors:t,onAdvance:x,onClose:d}):null}},Pn=()=>{const{treeSettings:e}=R.useExplorer();return{settings:r.useSyncExternalStore(e.subscribe,e.getSnapshot,e.getServerSnapshot),advance:e.advance}},Re=new Set,On='[role="tree"] [role="treeitem"][tabindex="0"]',An="[data-directory-tree-tab-stop]",Mn=e=>{const{mode:t,sourceId:n,currentPath:a,openPaths:s,onOpenDocument:u,onSourceChange:l,viewSwitch:o}=e,{labels:c,sources:m,trees:f,documents:d,announcer:h}=R.useExplorer(),{settings:x,advance:w}=Pn(),v=r.useMemo(()=>T.visibleTreeSettingDescriptors(t==="tree"),[t]),C=t==="tree"&&x.selectionMode==="multiple";rn(C);const y=e.mode==="tree"?e.tray.onGatheredChange:null,M=e.mode==="tree"?e.onOpenSelection:void 0,k=e.mode==="tree"&&C?e.tray.gathered:ae,_=r.useCallback(S=>{const j=w(S);return j.selectionMode!=="multiple"&&y?.(ae),j},[w,y]),D=qn({settings:x,descriptors:v,onAdvance:_}),I=r.useCallback(S=>y?.(j=>tn(j,S)),[y]),b=r.useCallback(S=>y?.(j=>nn(j,S)),[y]),L=r.useCallback(()=>y?.(ae),[y]),E=r.useRef(null),N=r.useCallback(()=>{const S=E.current;if(S===null)return;[On,An,'[data-testid="markdown-explorer-tree-settings"]'].map(B=>S.querySelector(B)).find(B=>B!==null)?.focus()},[]),P=r.useMemo(()=>new Set(k.keys()),[k]),z=r.useMemo(()=>a===null?Re:new Set([a]),[a]),V=r.useMemo(()=>{if(t==="multi")return{mode:"multiple",items:s,shownPath:null,onChange:null};switch(x.selectionMode){case"single":return{mode:"single",items:z,shownPath:a,onChange:null};case"multiple":return{mode:"multiple",items:P,shownPath:a,onChange:I};case"none":return{mode:"none",items:Re,shownPath:null,onChange:null}}},[t,s,x.selectionMode,z,a,P,I]),[O,Y]=r.useState(null),[K,H]=r.useState(!1),[F,A]=r.useState(null),Z=r.useRef(!1),ee=r.useCallback(async()=>{if(!Z.current){Z.current=!0,H(!0),A(null);try{const S=await f.refresh(n);if(S.status==="superseded")return;d.invalidate(),S.status==="failed"?A({sourceId:n,failure:S.failure}):h.announce(c.treeRefreshed)}finally{Z.current=!1,H(!1)}}},[f,d,n,h,c]),Q=O===null?null:O.expandAll,W=O?.expanding===!0,X=m.find(S=>S.id===n),le=o.target==="multi"?lt:rt,$=o.target==="multi"?c.switchToMulti:c.switchToTree;return i.jsxs("nav",{ref:E,"aria-label":c.explorerRegion,className:"aqmx-explorer","data-testid":"markdown-explorer-explorer","data-aqmx-mode":t,children:[i.jsxs("div",{className:"aqmx-explorer-header",children:[m.length>1?i.jsx("select",{className:"aqmx-explorer-source","aria-label":c.sourceLabel,title:X?.label,value:n,onChange:S=>l(S.currentTarget.value),"data-testid":"markdown-explorer-source-select",children:m.map(S=>i.jsx("option",{value:S.id,children:S.label},S.id))}):null,i.jsxs("div",{className:"aqmx-explorer-actions",children:[i.jsx(R.ExplorerLink,{to:o.href,navigation:"switch-view",className:"aqmx-icon-button","aria-label":$,title:$,"data-testid":"markdown-explorer-view-switch","data-aqmx-target":o.target,children:i.jsx(le,{"aria-hidden":"true"})}),i.jsxs("button",{type:"button",className:"aqmx-icon-button aqmx-labelled-button",title:c.refreshTree,"aria-disabled":K,"aria-busy":K,"data-aqmx-busy":K?"true":void 0,"data-testid":"markdown-explorer-refresh",onClick:()=>{ee()},children:[i.jsx(R.ForwardRef,{"aria-hidden":"true"}),i.jsx("span",{children:c.refreshTreeLabel})]}),i.jsx("button",{type:"button",className:"aqmx-icon-button","aria-label":c.expandAll,title:c.expandAll,"aria-disabled":Q===null||W,"aria-busy":W,"data-aqmx-busy":W?"true":void 0,"data-testid":"markdown-explorer-expand-all",onClick:()=>Q?.(),children:i.jsx(tt,{"aria-hidden":"true"})}),i.jsx("button",{type:"button",className:"aqmx-icon-button","aria-label":c.collapseAll,title:c.collapseAll,"aria-disabled":O===null,"data-testid":"markdown-explorer-collapse-all",onClick:()=>O?.collapseAll(),children:i.jsx(Je,{"aria-hidden":"true"})}),D.trigger]})]}),i.jsxs("div",{className:"aqmx-explorer-body","data-aqmx-explorer-body":"",children:[F!==null&&F.sourceId===n?i.jsx("p",{role:"alert",className:"aqmx-explorer-refresh-failure","data-testid":"markdown-explorer-refresh-failure","data-aqmx-failure":F.failure.reason,children:c.treeRefreshFailed(R.failureTitleOf(c,F.failure.reason))}):null,i.jsx(r.Suspense,{fallback:null,children:i.jsx(ot,{})}),i.jsx(Qt,{mode:t,sourceId:n,settings:x,openPaths:s,selection:V,onOpenDocument:u,onControls:Y},n),C&&k.size>0?i.jsx(en,{selection:k,onRemove:b,onClear:L,onOpenSelection:M,onLeave:N}):null,D.menu]})]})},Ae="(pointer: coarse)",Fn=e=>{const t=window.matchMedia(Ae);return t.addEventListener("change",e),()=>t.removeEventListener("change",e)},_n=()=>window.matchMedia(Ae).matches,In=()=>!1,Dn=()=>r.useSyncExternalStore(Fn,_n,In);function Hn({title:e,titleId:t,...n},a){return p.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:a,"aria-labelledby":t},n),e?p.createElement("title",{id:t},e):null,p.createElement("path",{fillRule:"evenodd",d:"M3 6.75A.75.75 0 0 1 3.75 6h16.5a.75.75 0 0 1 0 1.5H3.75A.75.75 0 0 1 3 6.75ZM3 12a.75.75 0 0 1 .75-.75h16.5a.75.75 0 0 1 0 1.5H3.75A.75.75 0 0 1 3 12Zm0 5.25a.75.75 0 0 1 .75-.75h16.5a.75.75 0 0 1 0 1.5H3.75a.75.75 0 0 1-.75-.75Z",clipRule:"evenodd"}))}const Zn=p.forwardRef(Hn),$n=({explorer:e,toggleRef:t,covered:n,onNoticeSlotChange:a,dismissals:s})=>{const{labels:u}=R.useExplorer(),l=Ge.useLocation(),{location:o}=R.useExplorerLocation(),[c,m]=r.useState(!1),[f,d]=r.useState({navigated:l,source:o.source}),[h,x]=r.useState(!1);f.navigated!==l&&(d({navigated:l,source:o.source}),f.source===o.source&&!h&&m(!1));const[w,v]=r.useState(s);w!==s&&(v(s),m(!1));const C=r.useRef(null),y=r.useRef(null),M=r.useRef(null),k=r.useRef(!1),_=r.useId();r.useLayoutEffect(()=>{const E=C.current;E!==null&&(c&&!E.open?(E.showModal(),y.current?.focus()):!c&&E.open&&(E.close(),t.current?.focus()),a(c?M.current:null))},[c,t,a]),r.useLayoutEffect(()=>()=>a(null),[a]);const D=r.useCallback(E=>{E.key!=="Escape"||E.defaultPrevented||(de(E),m(!1))},[]),I=r.useCallback(E=>{k.current=E.target===E.currentTarget},[]),b=r.useCallback(E=>{const N=k.current;k.current=!1,N&&E.target===E.currentTarget&&m(!1)},[]),L=r.useCallback(()=>{m(!1)},[]);return i.jsxs(i.Fragment,{children:[i.jsx("div",{className:"aqmx-sheet-bar",inert:n,children:i.jsxs("button",{ref:t,type:"button",className:"aqmx-sheet-toggle","aria-haspopup":"dialog","aria-expanded":c,"aria-controls":_,"data-testid":"markdown-explorer-sheet-toggle",onClick:()=>m(!0),children:[i.jsx(Zn,{"aria-hidden":"true"}),i.jsx("span",{children:u.showExplorer})]})}),i.jsx("dialog",{ref:C,id:_,className:"aqmx-sheet","aria-label":u.explorerRegion,"data-testid":"markdown-explorer-sheet",onKeyDown:D,onPointerDown:I,onClick:b,onClose:L,children:i.jsxs("div",{className:"aqmx-sheet-panel",children:[i.jsxs("div",{className:"aqmx-sheet-header",children:[i.jsx("div",{ref:M,className:"aqmx-sheet-notice-slot"}),i.jsx("button",{ref:y,type:"button",className:"aqmx-sheet-close","aria-label":u.hideExplorer,title:u.hideExplorer,"data-testid":"markdown-explorer-sheet-close",onClick:()=>m(!1),children:i.jsx(qe,{"aria-hidden":"true"})})]}),i.jsx("div",{className:"aqmx-sheet-body",children:i.jsx(ue,{value:c,children:i.jsx(Pe,{value:x,children:e})})}),i.jsx(R.LiveRegion,{holds:c,testId:"markdown-explorer-sheet-announcer"})]})})]})},Me=r.createContext(null),fe="aqmx-explorer",Fe="aqmx-content",me='[role="tree"] [role="treeitem"]',Bn=`${me}[tabindex="0"]`,zn="[data-directory-tree-tab-stop]",Vn=(e,t)=>{for(const n of e.querySelectorAll(`[data-panel-id="${fe}"] ${me}`))if(n.getAttribute(G)===t)return n;return null},Se=(e,t)=>({inlineSize:e>0?e:null,rootFontPixels:t>0?t:T.ASSUMED_ROOT_FONT_PIXELS}),Kn=(e,t)=>{const[n,a]=r.useState(()=>Se(0,0));return r.useLayoutEffect(()=>{const s=e.current,u=t.current;if(s===null||u===null)throw new Error("[markdown-explorer] the split frame is not mounted");const l={frame:s.getBoundingClientRect().width,rem:u.getBoundingClientRect().width},o=()=>{const m=Se(l.frame,l.rem);a(f=>f.inlineSize===m.inlineSize&&f.rootFontPixels===m.rootFontPixels?f:m)};o();const c=new ResizeObserver(m=>{for(const f of m){const[d]=f.borderBoxSize;d!==void 0&&(f.target===s&&(l.frame=d.inlineSize),f.target===u&&(l.rem=d.inlineSize))}o()});return c.observe(s),c.observe(u),()=>c.disconnect()},[e,t]),n},_e=e=>`aqmx-split-handle-${e}`,Xn=(e,{frameRef:t,sheetToggleRef:n,handleId:a})=>{const s=r.useRef(!1),u=r.useRef(null),l=r.useRef(!1);r.useLayoutEffect(()=>{const c=t.current;if(c===null)throw new Error("[markdown-explorer] the split frame is not mounted");const m=d=>{const h=d.target instanceof Element?d.target:null;s.current=h!==null&&h.closest(`[data-panel-id="${Fe}"]`)===null,!l.current&&(u.current=h?.closest(`${me}[${G}]`)?.getAttribute(G)??null)},f=d=>{d.relatedTarget instanceof Node&&!c.contains(d.relatedTarget)&&(s.current=!1)};return c.addEventListener("focusin",m),c.addEventListener("focusout",f),()=>{c.removeEventListener("focusin",m),c.removeEventListener("focusout",f)}},[t]);const o=r.useRef(e);r.useLayoutEffect(()=>{if(o.current===e)return;o.current=e;const c=t.current;if(c===null||!s.current)return;const m=f=>{const{activeElement:d,body:h}=c.ownerDocument;if(d!==null&&d!==h)return;const x=f.find(w=>w!==null);if(x!=null){l.current=!0;try{x.focus()}finally{l.current=!1}}};if(e){m([n.current]);return}queueMicrotask(()=>{if(o.current!==e||!s.current)return;const f=u.current,d=`[data-panel-id="${fe}"]`;m([f===null?null:Vn(c,f),c.querySelector(`${d} ${Bn}`),c.querySelector(`${d} ${zn}`),c.querySelector(`[data-resize-handle-id="${a}"]`)])})},[e,t,n,a])},Un=({view:e,explorer:t,content:n,contentCoversPage:a=!1,sheetDismissals:s=0,onDraggingChange:u})=>{const l=r.useRef(null),[o,c]=r.useState(null),m=r.useRef(null),f=r.useRef(null),{inlineSize:d,rootFontPixels:h}=Kn(l,m),x=d!==null&&d<T.explorerSheetBelowPixels(h);return Xn(x,{frameRef:l,sheetToggleRef:f,handleId:_e(e)}),i.jsxs("div",{ref:l,className:"aqmx-split-frame","data-aqmx-explorer-mode":x?"sheet":"split",children:[i.jsx("span",{ref:m,className:"aqmx-rem-probe","aria-hidden":"true","data-aqmx-rem-probe":""}),x?i.jsx($n,{explorer:t,toggleRef:f,covered:a,onNoticeSlotChange:c,dismissals:s}):null,i.jsx(Me,{value:x?o:null,children:i.jsx(Wn,{view:e,sheet:x,explorer:t,content:n,contentCoversPage:a,onDraggingChange:u,explorerMinPixels:T.explorerMinPixels(h)})})]})},Wn=({view:e,sheet:t,explorer:n,content:a,contentCoversPage:s,onDraggingChange:u,explorerMinPixels:l})=>{const{viewSettings:o,labels:c}=R.useExplorer(),f=R.useViewSetting(b=>e==="tree"?b.treeExplorer:b.multiExplorer)??(e==="tree"?T.EXPLORER_DEFAULT_PERCENT:T.EXPLORER_MULTI_DEFAULT_PERCENT),d=r.useRef(null),h=r.useRef(null),x=r.useRef(!1),w=r.useRef(!1),[v,C]=r.useState(!1),y=r.useRef(u);r.useLayoutEffect(()=>{y.current=u},[u]);const M=r.useCallback(()=>{const b=d.current;if(b===null||b.length!==2)return;const[L=0,E=0]=b,N=L+E;if(N<=0||L<=0)return;const P=Math.min(T.EXPLORER_MAX_PERCENT,L/N*100);o.update(e==="tree"?{treeExplorer:P}:{multiExplorer:P})},[o,e]),k=r.useCallback(()=>{h.current!==null&&clearTimeout(h.current),h.current=setTimeout(()=>{h.current=null,M()},T.EXPLORER_WIDTH_PERSIST_DELAY_MS)},[M]);r.useEffect(()=>()=>{h.current!==null&&clearTimeout(h.current),w.current&&y.current?.(!1)},[]);const _=Dn(),D=r.useCallback((b,L)=>{d.current=b;const[E=0,N=0]=b;b.length===2&&N>0&&C(E<=0),L.source==="keyboard"?k():L.source==="pointer"&&(x.current=!0)},[k]),I=r.useCallback(b=>{if(w.current=b,u?.(b),b){x.current=!1;return}x.current&&(x.current=!1,k())},[u,k]);return i.jsxs(re.PanelGroup,{id:`aqmx-split-${e}`,direction:"horizontal",onLayout:D,className:"aqmx-split","data-aqmx-split":e,children:[t?null:i.jsx(re.Panel,{id:fe,defaultSize:{value:f,unit:"percentage"},minSize:{value:l,unit:"pixels"},maxSize:{value:T.EXPLORER_MAX_PERCENT,unit:"percentage"},collapsible:{from:"end"},pixelAdjustPriority:1,inert:s,className:"aqmx-split-explorer",children:i.jsx(ue,{value:!v,children:n})}),t?null:i.jsx(re.PanelResizeHandle,{id:_e(e),thickness:_?T.COARSE_TARGET_PIXELS:T.FINE_TARGET_PIXELS,indicator:{visible:!0,thickness:T.SPLIT_HANDLE_PIXELS.gripThickness,length:T.SPLIT_HANDLE_PIXELS.gripLength,barThickness:T.SPLIT_HANDLE_PIXELS.barThickness,barLength:T.SPLIT_HANDLE_PIXELS.barLength},title:c.resizeExplorer,"aria-label":c.resizeExplorer,onDragging:I,inert:s,className:"aqmx-split-handle"}),i.jsx(re.Panel,{id:Fe,defaultSize:{value:100-f,unit:"percentage"},contentOverflow:"hidden",className:"aqmx-split-content",...s?{style:{isolation:"auto"}}:{},children:a})]})};exports.EMPTY_SELECTION=ae;exports.ExplorerPane=Mn;exports.ExplorerSplit=Un;exports.SheetNoticeSlotContext=Me;
@@ -1,10 +1,10 @@
1
1
  import { jsx as T, jsxs as re } from "react/jsx-runtime";
2
2
  import { createContext as je, use as Me, useRef as q, useState as V, useLayoutEffect as F, useMemo as R, useSyncExternalStore as Ye, memo as We, useEffect as $, useCallback as D, useImperativeHandle as Ge } from "react";
3
- import { g as se, e as Ne, h as Ke, P as Je, j as Xe } from "./location-fVl2R1ee.js";
4
- import { c as Ze, u as W, e as Qe, f as en, I as nn, D as tn, b as on } from "./index-BfuAu2GV.js";
5
- import { S as rn, a as ln, b as sn } from "./ExplorerSplit-DB37U7Kh.js";
3
+ import { g as se, e as Ne, h as Ke, P as Je, j as Xe } from "./location-V5BKeWNs.js";
4
+ import { c as Ze, u as W, e as Qe, f as en, I as nn, D as tn, b as on } from "./index-BJTmp0lR.js";
5
+ import { S as rn, a as ln, b as sn } from "./ExplorerSplit-B7pmzR8t.js";
6
6
  import { SCROLL_ROOT_SELECTOR as Q, generateColumnIds as an, sortColumnIds as Ie, generateColumnId as Te, useDragDropColumns as cn, DEFAULT_DEBUG_CONFIG as ge, DragDropLayout as un } from "@aiquants/drag-drop-panels";
7
- import { u as dn, i as mn } from "./dataRoute-Bkfwfp1R.js";
7
+ import { v as dn, i as mn } from "./dataRoute-zUX-oR9j.js";
8
8
  import { useNavigate as fn, useLocation as pn } from "react-router";
9
9
  import { s as gn, r as hn, w as vn } from "./storage-DA4ItHzl.js";
10
10
  import { createPortal as wn } from "react-dom";