jamdesk 1.1.156 → 1.1.157

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jamdesk",
3
- "version": "1.1.156",
3
+ "version": "1.1.157",
4
4
  "description": "CLI for Jamdesk — build, preview, and deploy documentation sites from MDX. Dev server with hot reload, 50+ components, OpenAPI support, AI search, and Mintlify migration",
5
5
  "keywords": [
6
6
  "jamdesk",
@@ -19,6 +19,12 @@ export default async function NotFound() {
19
19
 
20
20
  if (isIsrMode()) {
21
21
  const headersList = await headers();
22
+ // Inactive projects render a placeholder shell — skip the R2 config fetch.
23
+ // The root layout already short-circuits for x-jd-layout=placeholder, so
24
+ // this page renders inside a minimal shell with no docs chrome anyway.
25
+ if (headersList.get('x-jd-layout') === 'placeholder') {
26
+ return <NotFoundContent config={fallbackConfig()} />;
27
+ }
22
28
  const projectSlug = getProjectFromRequest(headersList);
23
29
  if (projectSlug) {
24
30
  try {
@@ -0,0 +1,110 @@
1
+ // builder/build-service/lib/openapi/operation-description.ts
2
+ //
3
+ // Pure, dependency-free helpers for deriving a page meta description from an
4
+ // OpenAPI operation. Used by the build-service (llms.txt, <meta>, warning
5
+ // re-messaging) AND — vendored verbatim — by the dashboard Fix-with-AI
6
+ // pipeline, so both surfaces agree on the exact text and the length gate.
7
+ //
8
+ // IMPORT-FREE of `@/` aliases: vendor-openapi.mjs (exit 1 on `@/`) copies this
9
+ // file into dashboard/functions/src/editor/openapi/. Keep it self-contained.
10
+
11
+ /** Frontmatter descriptions shorter than this flag `page_short_description`.
12
+ * MUST equal MIN_DESCRIPTION_CHARS in validate-page-frontmatter.ts (asserted
13
+ * by a test). A sourced description is WRITTEN into frontmatter (Slice 3) only
14
+ * when its cleaned length is >= this, so the write never trades a "missing"
15
+ * warning for a "too short" one. */
16
+ export const MIN_FRONTMATTER_DESCRIPTION_CHARS = 110;
17
+
18
+ /** Search engines truncate meta descriptions around 155-160 chars. */
19
+ const MAX_META_DESCRIPTION_CHARS = 160;
20
+
21
+ /** The two operation fields we read. Loose types: specs are untrusted input. */
22
+ export interface OperationSummary {
23
+ summary?: unknown;
24
+ description?: unknown;
25
+ }
26
+
27
+ /** Minimum chars before a sentence/word boundary is worth cutting to (avoids
28
+ * truncating to a tiny fragment like "OK."). Matches the word-boundary floor. */
29
+ const MIN_TRUNCATION_CHARS = 40;
30
+
31
+ /** Reduce markdown to plain prose fit for a <meta>/llms description: drop
32
+ * fenced+inline code, images, links (keep the text), headings/list/blockquote
33
+ * markers and emphasis; collapse whitespace. If over the limit, prefer ending
34
+ * on a COMPLETE SENTENCE within the limit (no ellipsis — it's a whole thought);
35
+ * else cut on a word boundary with an ellipsis. "" for empty input.
36
+ * All scanning is O(n) char-by-char — deliberately no truncation regex, to
37
+ * avoid the catastrophic-backtracking class this repo has been bitten by. */
38
+ export function cleanMetaDescription(text: string): string {
39
+ let s = text;
40
+ s = s.replace(/```[\s\S]*?```/g, " "); // fenced code blocks
41
+ s = s.replace(/`([^`]+)`/g, "$1"); // inline code
42
+ s = s.replace(/!\[[^\]]*\]\([^)]*\)/g, " "); // images
43
+ s = s.replace(/\[([^\]]+)\]\([^)]*\)/g, "$1"); // links -> link text
44
+ s = s.replace(/^[ \t]*[#>*\-+]+[ \t]*/gm, ""); // heading/quote/list markers
45
+ s = s.replace(/[*_~]+/g, ""); // emphasis runs
46
+ s = s.replace(/\s+/g, " ").trim(); // collapse all whitespace
47
+ if (s.length <= MAX_META_DESCRIPTION_CHARS) return s;
48
+ const cut = s.slice(0, MAX_META_DESCRIPTION_CHARS);
49
+ // Last sentence terminator (.?!) that is followed by a space or end-of-cut.
50
+ let sentenceEnd = -1;
51
+ for (let i = 0; i < cut.length; i++) {
52
+ const c = cut[i];
53
+ if ((c === "." || c === "!" || c === "?") &&
54
+ (i + 1 >= cut.length || cut[i + 1] === " ")) {
55
+ sentenceEnd = i;
56
+ }
57
+ }
58
+ if (sentenceEnd >= MIN_TRUNCATION_CHARS) {
59
+ return cut.slice(0, sentenceEnd + 1).trimEnd(); // complete sentence, no ellipsis
60
+ }
61
+ const lastSpace = cut.lastIndexOf(" ");
62
+ return (lastSpace > MIN_TRUNCATION_CHARS ? cut.slice(0, lastSpace) : cut)
63
+ .trimEnd() + "…";
64
+ }
65
+
66
+ /** Operation description (preferred) or summary (fallback), cleaned. null when
67
+ * neither yields non-empty text. No length gate — callers apply their own. */
68
+ export function deriveOperationDescription(
69
+ op: OperationSummary,
70
+ ): string | null {
71
+ const desc =
72
+ typeof op.description === "string" ? cleanMetaDescription(op.description) : "";
73
+ if (desc) return desc;
74
+ const summary =
75
+ typeof op.summary === "string" ? cleanMetaDescription(op.summary) : "";
76
+ return summary || null;
77
+ }
78
+
79
+ /** Look up an operation by method+path in a parsed (not necessarily
80
+ * dereferenced) OpenAPI document. Tolerant of unknown shapes. Method is
81
+ * case-insensitive. null if not present. */
82
+ export function findOperation(
83
+ spec: unknown,
84
+ method: string,
85
+ path: string,
86
+ ): OperationSummary | null {
87
+ if (!spec || typeof spec !== "object") return null;
88
+ const paths = (spec as {paths?: unknown}).paths;
89
+ if (!paths || typeof paths !== "object") return null;
90
+ const pathItem = (paths as Record<string, unknown>)[path];
91
+ if (!pathItem || typeof pathItem !== "object") return null;
92
+ const op = (pathItem as Record<string, unknown>)[method.toLowerCase()];
93
+ if (!op || typeof op !== "object") return null;
94
+ return op as OperationSummary;
95
+ }
96
+
97
+ /** Normalize `config.api.openapi` (string | string[] | undefined) to the list
98
+ * of repo-relative spec paths a build/fix pipeline can read. Drops remote
99
+ * `http(s)://` URLs — those are fetched by the renderer, never present as
100
+ * local blobs. Lives here (shared, vendored) so the build-service and the
101
+ * dashboard apply an identical remote-skip rule. */
102
+ export function collectLocalSpecPaths(apiOpenapi: unknown): string[] {
103
+ const raw =
104
+ typeof apiOpenapi === "string"
105
+ ? [apiOpenapi]
106
+ : Array.isArray(apiOpenapi)
107
+ ? apiOpenapi.filter((s): s is string => typeof s === "string")
108
+ : [];
109
+ return raw.filter((p) => !/^https?:\/\//i.test(p));
110
+ }
@@ -84,6 +84,7 @@ import {
84
84
  type AuthMethod,
85
85
  } from '@/lib/openapi';
86
86
  import { classifyOpenApiLoadError } from '@/lib/openapi/classify-load-error';
87
+ import { findOperation, deriveOperationDescription, collectLocalSpecPaths } from '@/lib/openapi/operation-description';
87
88
  import { extractLanguageFromPath, isValidLanguageCode } from '@/lib/language-utils';
88
89
  import { findFirstNavPage } from '@/lib/find-first-nav-page';
89
90
  import { candidateSpecPaths } from '@/lib/openapi/lang-spec-path';
@@ -210,6 +211,47 @@ function resolveSlug(normalizedSlug: string[], config: DocsConfig): string[] {
210
211
  return normalizedSlug;
211
212
  }
212
213
 
214
+ /**
215
+ * Resolve a page `<meta>`/og description from its OpenAPI operation when the
216
+ * page has no frontmatter `description`. Pure: the spec loader is injected so
217
+ * this is unit-testable independent of the render path (and so `buildDocMetadata`
218
+ * can hand it the SAME cached loader the renderer uses — no extra spec fetch).
219
+ *
220
+ * `loadSpec` MUST be a cached loader (see `buildDocMetadata` wiring): docs
221
+ * routes are `force-dynamic`, so this runs on every page view; an uncached
222
+ * fetch+parse here would add an R2 round-trip per render. Remote (`http(s)://`)
223
+ * spec entries are dropped — they are fetched by the renderer, never resolvable
224
+ * as a meta-time read. Returns null on any unresolvable/unparseable input so the
225
+ * caller degrades to `generateAutoDescription`.
226
+ */
227
+ export async function resolveOpenApiMetaDescription(
228
+ openapiRef: string,
229
+ specPaths: string[],
230
+ loadSpec: (specPath: string) => Promise<unknown | null>,
231
+ ): Promise<string | null> {
232
+ const local = specPaths.filter((p) => !/^https?:\/\//i.test(p));
233
+ if (local.length === 0) return null;
234
+ let parsed;
235
+ try {
236
+ parsed = parseOpenApiFrontmatter(openapiRef, local);
237
+ } catch {
238
+ return null;
239
+ }
240
+ // Full-format ref carries its own spec path; short-format must try each
241
+ // configured spec until the operation resolves.
242
+ const candidates = parsed.isShortFormat ? local : [parsed.specPath];
243
+ for (const sp of candidates) {
244
+ if (!sp) continue;
245
+ const spec = await loadSpec(sp);
246
+ if (!spec) continue;
247
+ const op = findOperation(spec, parsed.method, parsed.path);
248
+ if (!op) continue;
249
+ const d = deriveOperationDescription(op);
250
+ if (d) return d;
251
+ }
252
+ return null;
253
+ }
254
+
213
255
  export async function buildDocMetadata(input: RenderInput): Promise<Metadata> {
214
256
  const { slug: slugInput, projectSlug, hostAtDocs, requestHeaders } = input;
215
257
 
@@ -252,7 +294,44 @@ export async function buildDocMetadata(input: RenderInput): Promise<Metadata> {
252
294
  const data = parsed.data as FrontmatterData;
253
295
 
254
296
  if (!data.description) {
255
- data.description = generateAutoDescription(parsed.content);
297
+ if (typeof data.openapi === 'string' && data.openapi && config.api?.openapi) {
298
+ // Source the description from the OpenAPI operation before falling back to
299
+ // first-paragraph extraction (which is empty for prose-less API pages).
300
+ // The spec loader REUSES the render path's cached loaders — the ISR module
301
+ // cache (`r2:${slug}:${specPath}`, 10-min TTL) that `renderDocPage`
302
+ // populates when it renders the page's <ApiEndpoint>, or the static
303
+ // `getCachedSpec`. So the spec is the same warm parse the render already
304
+ // did: the marginal cost of this lookup is a cache hit, never an uncached
305
+ // fetch+parse. That matters because docs routes are force-dynamic, so this
306
+ // metadata runs on EVERY page view (every human + crawler). Mirrors the
307
+ // `useIsr`/`projectDir` derivation in `renderDocPage`'s OpenAPI branch.
308
+ const specPaths = collectLocalSpecPaths(config.api.openapi);
309
+ const useIsr = isIsrMode() && !!projectSlug;
310
+ const projectDir = useIsr ? null : getContentDir();
311
+ const loadSpecForMeta = async (sp: string): Promise<unknown | null> => {
312
+ try {
313
+ if (useIsr && projectSlug) {
314
+ const { resolveOpenApiSpec } = await import('@/lib/openapi-isr');
315
+ return await resolveOpenApiSpec(projectSlug, sp);
316
+ }
317
+ if (projectDir) {
318
+ const { api } = await getCachedSpec(sp, projectDir);
319
+ return api;
320
+ }
321
+ return null;
322
+ } catch {
323
+ // Any load/parse error degrades to generateAutoDescription below.
324
+ return null;
325
+ }
326
+ };
327
+ const sourced = await resolveOpenApiMetaDescription(
328
+ data.openapi, specPaths, loadSpecForMeta,
329
+ );
330
+ if (sourced) data.description = sourced;
331
+ }
332
+ if (!data.description) {
333
+ data.description = generateAutoDescription(parsed.content);
334
+ }
256
335
  }
257
336
 
258
337
  const baseUrl = resolveBaseUrl(requestHeaders, projectSlug, hostAtDocs);
@@ -436,14 +436,20 @@ export interface RawPageInfo {
436
436
  * @param pages - Array of raw page info
437
437
  * @returns Array of page metadata
438
438
  */
439
- export function extractPageMetadata(pages: RawPageInfo[]): PageMetadata[] {
439
+ export function extractPageMetadata(
440
+ pages: RawPageInfo[],
441
+ sourced?: Map<string, {description: string}>,
442
+ ): PageMetadata[] {
440
443
  return pages.map(page => {
441
444
  const pathWithoutExt = page.path.replace(/\.mdx?$/, '');
442
445
 
443
446
  return {
444
447
  path: pathWithoutExt,
445
448
  title: page.frontmatter.title || pathWithoutExt,
446
- description: page.frontmatter.description,
449
+ // Frontmatter wins; else fall back to a description sourced from the
450
+ // page's OpenAPI operation (keyed by the extension-ful page.path).
451
+ description:
452
+ page.frontmatter.description ?? sourced?.get(page.path)?.description,
447
453
  noindex: page.frontmatter.noindex || page.frontmatter.seo?.noindex,
448
454
  hidden: page.frontmatter.hidden,
449
455
  lastModified: page.frontmatter.lastModified,
@@ -1,14 +1,20 @@
1
1
  import type { BuildWarning } from '../shared/status-reporter.js'; // vendored copy — NOT '../../shared'
2
+ import { MIN_FRONTMATTER_DESCRIPTION_CHARS } from './openapi/operation-description.js';
2
3
 
3
4
  const MIN_DESCRIPTION_CHARS = 110; // matches the Ahrefs "too short" floor used elsewhere
5
+ // Task 1 invariant: MIN_DESCRIPTION_CHARS must equal MIN_FRONTMATTER_DESCRIPTION_CHARS.
6
+ // Asserted by test. Do NOT change either value without updating both.
4
7
 
5
8
  interface PageInfo {
6
9
  path: string;
7
- frontmatter: { title?: unknown; description?: unknown; hidden?: unknown };
10
+ frontmatter: { title?: unknown; description?: unknown; hidden?: unknown; openapi?: unknown };
8
11
  content: string;
9
12
  }
10
13
 
11
- export function validatePageFrontmatter(pages: PageInfo[]): BuildWarning[] {
14
+ export function validatePageFrontmatter(
15
+ pages: PageInfo[],
16
+ sourced?: Map<string, { description: string; length: number }>,
17
+ ): BuildWarning[] {
12
18
  const warnings: BuildWarning[] = [];
13
19
  for (const page of pages) {
14
20
  const fm = page.frontmatter ?? {};
@@ -21,7 +27,37 @@ export function validatePageFrontmatter(pages: PageInfo[]): BuildWarning[] {
21
27
  warnings.push({ type: 'page_missing_title', file: page.path, message: 'Page has no frontmatter title; navigation and llms.txt fall back to the file path.' });
22
28
  }
23
29
  if (!description) {
24
- warnings.push({ type: 'page_missing_description', file: page.path, message: 'Page has no frontmatter description; add one for SEO and llms.txt.' });
30
+ const src = sourced?.get(page.path);
31
+ if (src) {
32
+ if (src.length >= MIN_FRONTMATTER_DESCRIPTION_CHARS) {
33
+ // Cat 1: OpenAPI-sourced description is long enough for Fix-with-AI to write
34
+ // into frontmatter — keep the warning but re-message it toward that action.
35
+ warnings.push({
36
+ type: 'page_missing_description',
37
+ file: page.path,
38
+ message: "No frontmatter description — your page's description is auto-sourced " +
39
+ "from your OpenAPI spec. Use Fix with AI to write it into the page for portability.",
40
+ });
41
+ } else {
42
+ // Cat 2: sourced text IS live in <meta>/llms, but too short to commit via
43
+ // Fix-with-AI. Do NOT suppress — the author still needs a longer description.
44
+ // A sourced-short description must warn no less than an authored-short one
45
+ // (else `summary: "TODO"` silently becomes the live meta + OG card with zero
46
+ // signal to fix it).
47
+ warnings.push({
48
+ type: 'page_missing_description',
49
+ file: page.path,
50
+ message:
51
+ `Description auto-sourced from your OpenAPI spec is only ` +
52
+ `${src.length} chars — add a longer frontmatter description ` +
53
+ `(aim for ${MIN_FRONTMATTER_DESCRIPTION_CHARS}–160; too short ` +
54
+ `for Fix with AI to write into the page).`,
55
+ });
56
+ }
57
+ } else {
58
+ // Cat 3: genuinely missing, nothing to source from the spec.
59
+ warnings.push({ type: 'page_missing_description', file: page.path, message: 'Page has no frontmatter description; add one for SEO and llms.txt.' });
60
+ }
25
61
  } else if (description.length < MIN_DESCRIPTION_CHARS) {
26
62
  warnings.push({ type: 'page_short_description', file: page.path, message: `Description is ${description.length} chars; aim for ${MIN_DESCRIPTION_CHARS}–160.` });
27
63
  }
@@ -710,6 +710,17 @@ body[data-theme="jam"] .sidebar-scroll .sidebar-nav-groups > div:first-child {
710
710
  margin-top: 0 !important;
711
711
  }
712
712
 
713
+ /* When the nav groups are the first thing in the sidebar (no left tabs / external
714
+ anchors), align the first group heading with the breadcrumb + "On this page" TOC
715
+ heading, both of which sit 40px down via the content/TOC `py-10` wrapper. The
716
+ base 16px above is the tabs→groups gap for the sidebar-tabs case, so only bump
717
+ the first-child, desktop-only path here. */
718
+ @media (min-width: 1024px) {
719
+ body[data-theme="jam"] .sidebar-scroll nav > .sidebar-nav-groups:first-child {
720
+ padding-top: 2.5rem !important;
721
+ }
722
+ }
723
+
713
724
  /* Sidebar scroll container positioning for header-logo layout */
714
725
  /* The sidebar-scroll div needs constrained height to scroll independently */
715
726
  /* When tabs exist at top, sidebar needs more top offset (header 57px + tabs 57px = 114px) */
@@ -294,3 +294,13 @@ body[data-theme="nebula"] .sidebar-scroll .sidebar-nav-groups > div.ml-6 {
294
294
  padding-top: 16px;
295
295
  }
296
296
 
297
+ /* When the nav groups are the first thing in the sidebar (no left tabs / external
298
+ anchors), align the first group heading with the breadcrumb + "On this page" TOC
299
+ heading, both 40px down via the content/TOC `py-10` wrapper. The 16px above is the
300
+ inter-group gap, so only the first group on desktop gets the larger offset. */
301
+ @media (min-width: 1024px) {
302
+ body[data-theme="nebula"] .sidebar-scroll nav > .sidebar-nav-groups:first-child > div.ml-6:first-child {
303
+ padding-top: 2.5rem;
304
+ }
305
+ }
306
+
@@ -163,9 +163,9 @@
163
163
  }
164
164
  },
165
165
  "node_modules/@babel/standalone": {
166
- "version": "8.0.2",
167
- "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-8.0.2.tgz",
168
- "integrity": "sha512-fxVjA+dyCXC6tZm8sp21egVF0WVpPRnJOhmfG4WavISe2otyfOLleh+owitHWMhILTdjd7W0mfpadS16cj8LBw==",
166
+ "version": "8.0.3",
167
+ "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-8.0.3.tgz",
168
+ "integrity": "sha512-lYtDQG08udh0+pGOQxj1R8W+fIbp7T0F8XFEFSvfWNQ+ywmi/bOxTcSDSB84y0et+B+QQl8yMWl/rnSB7OzLMg==",
169
169
  "license": "MIT",
170
170
  "engines": {
171
171
  "node": "^22.18.0 || >=24.11.0"
@@ -194,57 +194,57 @@
194
194
  }
195
195
  },
196
196
  "node_modules/@fortawesome/fontawesome-common-types": {
197
- "version": "7.2.0",
198
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-7.2.0.tgz",
199
- "integrity": "sha512-IpR0bER9FY25p+e7BmFH25MZKEwFHTfRAfhOyJubgiDnoJNsSvJ7nigLraHtp4VOG/cy8D7uiV0dLkHOne5Fhw==",
197
+ "version": "7.3.0",
198
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-7.3.0.tgz",
199
+ "integrity": "sha512-X/vND0Y1l9fVJ9O79UgtZnXSpz4aNF3bXlDxiJAEAm6kgeSftp9wjjBPgqzazJV8YlmxfRoeXNfSCJ48sf/Hhw==",
200
200
  "license": "MIT",
201
201
  "engines": {
202
202
  "node": ">=6"
203
203
  }
204
204
  },
205
205
  "node_modules/@fortawesome/fontawesome-svg-core": {
206
- "version": "7.2.0",
207
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-7.2.0.tgz",
208
- "integrity": "sha512-6639htZMjEkwskf3J+e6/iar+4cTNM9qhoWuRfj9F3eJD6r7iCzV1SWnQr2Mdv0QT0suuqU8BoJCZUyCtP9R4Q==",
206
+ "version": "7.3.0",
207
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-7.3.0.tgz",
208
+ "integrity": "sha512-MFbTNLDWkLJwbozDvHOZ7hwyDjQcBMBattlcOQ6ZmV5YD9bBrqdl1rNtmVjQ/lzqveXXX3sMz2Ew6fAgXoxmkw==",
209
209
  "license": "MIT",
210
210
  "dependencies": {
211
- "@fortawesome/fontawesome-common-types": "7.2.0"
211
+ "@fortawesome/fontawesome-common-types": "7.3.0"
212
212
  },
213
213
  "engines": {
214
214
  "node": ">=6"
215
215
  }
216
216
  },
217
217
  "node_modules/@fortawesome/free-brands-svg-icons": {
218
- "version": "7.2.0",
219
- "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-7.2.0.tgz",
220
- "integrity": "sha512-VNG8xqOip1JuJcC3zsVsKRQ60oXG9+oYNDCosjoU/H9pgYmLTEwWw8pE0jhPz/JWdHeUuK6+NQ3qsM4gIbdbYQ==",
218
+ "version": "7.3.0",
219
+ "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-7.3.0.tgz",
220
+ "integrity": "sha512-W6C9ZbPWpwcUycq6U90lVbvWTrEnr01Td2x5jlO8fOtvww4kqDBMSmZqXQCc6FIIJD4kTH6G1MBRExAaSXz3yg==",
221
221
  "license": "(CC-BY-4.0 AND MIT)",
222
222
  "dependencies": {
223
- "@fortawesome/fontawesome-common-types": "7.2.0"
223
+ "@fortawesome/fontawesome-common-types": "7.3.0"
224
224
  },
225
225
  "engines": {
226
226
  "node": ">=6"
227
227
  }
228
228
  },
229
229
  "node_modules/@fortawesome/free-regular-svg-icons": {
230
- "version": "7.2.0",
231
- "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-7.2.0.tgz",
232
- "integrity": "sha512-iycmlN51EULlQ4D/UU9WZnHiN0CvjJ2TuuCrAh+1MVdzD+4ViKYH2deNAll4XAAYlZa8WAefHR5taSK8hYmSMw==",
230
+ "version": "7.3.0",
231
+ "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-7.3.0.tgz",
232
+ "integrity": "sha512-4675NiHzJJs0dLStFpp5G1JNfMYxqFSxZ2iCaiMfHptjlc8McLG9oqcd5pFEiPiqfiV2YG25cJ9EYWIEhUvp+A==",
233
233
  "license": "(CC-BY-4.0 AND MIT)",
234
234
  "dependencies": {
235
- "@fortawesome/fontawesome-common-types": "7.2.0"
235
+ "@fortawesome/fontawesome-common-types": "7.3.0"
236
236
  },
237
237
  "engines": {
238
238
  "node": ">=6"
239
239
  }
240
240
  },
241
241
  "node_modules/@fortawesome/free-solid-svg-icons": {
242
- "version": "7.2.0",
243
- "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-7.2.0.tgz",
244
- "integrity": "sha512-YTVITFGN0/24PxzXrwqCgnyd7njDuzp5ZvaCx5nq/jg55kUYd94Nj8UTchBdBofi/L0nwRfjGOg0E41d2u9T1w==",
242
+ "version": "7.3.0",
243
+ "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-7.3.0.tgz",
244
+ "integrity": "sha512-YxI/CuwWeI3nPIoYU//vkDS+3ige/67DPZ6XwMATpYEFESzO9L8zfJOKllGRgIlpT/uebrZCcvAzp3peD7GmTw==",
245
245
  "license": "(CC-BY-4.0 AND MIT)",
246
246
  "dependencies": {
247
- "@fortawesome/fontawesome-common-types": "7.2.0"
247
+ "@fortawesome/fontawesome-common-types": "7.3.0"
248
248
  },
249
249
  "engines": {
250
250
  "node": ">=6"
@@ -373,9 +373,6 @@
373
373
  "cpu": [
374
374
  "arm"
375
375
  ],
376
- "libc": [
377
- "glibc"
378
- ],
379
376
  "license": "LGPL-3.0-or-later",
380
377
  "optional": true,
381
378
  "os": [
@@ -392,9 +389,6 @@
392
389
  "cpu": [
393
390
  "arm64"
394
391
  ],
395
- "libc": [
396
- "glibc"
397
- ],
398
392
  "license": "LGPL-3.0-or-later",
399
393
  "optional": true,
400
394
  "os": [
@@ -411,9 +405,6 @@
411
405
  "cpu": [
412
406
  "ppc64"
413
407
  ],
414
- "libc": [
415
- "glibc"
416
- ],
417
408
  "license": "LGPL-3.0-or-later",
418
409
  "optional": true,
419
410
  "os": [
@@ -430,9 +421,6 @@
430
421
  "cpu": [
431
422
  "riscv64"
432
423
  ],
433
- "libc": [
434
- "glibc"
435
- ],
436
424
  "license": "LGPL-3.0-or-later",
437
425
  "optional": true,
438
426
  "os": [
@@ -449,9 +437,6 @@
449
437
  "cpu": [
450
438
  "s390x"
451
439
  ],
452
- "libc": [
453
- "glibc"
454
- ],
455
440
  "license": "LGPL-3.0-or-later",
456
441
  "optional": true,
457
442
  "os": [
@@ -468,9 +453,6 @@
468
453
  "cpu": [
469
454
  "x64"
470
455
  ],
471
- "libc": [
472
- "glibc"
473
- ],
474
456
  "license": "LGPL-3.0-or-later",
475
457
  "optional": true,
476
458
  "os": [
@@ -487,9 +469,6 @@
487
469
  "cpu": [
488
470
  "arm64"
489
471
  ],
490
- "libc": [
491
- "musl"
492
- ],
493
472
  "license": "LGPL-3.0-or-later",
494
473
  "optional": true,
495
474
  "os": [
@@ -506,9 +485,6 @@
506
485
  "cpu": [
507
486
  "x64"
508
487
  ],
509
- "libc": [
510
- "musl"
511
- ],
512
488
  "license": "LGPL-3.0-or-later",
513
489
  "optional": true,
514
490
  "os": [
@@ -525,9 +501,6 @@
525
501
  "cpu": [
526
502
  "arm"
527
503
  ],
528
- "libc": [
529
- "glibc"
530
- ],
531
504
  "license": "Apache-2.0",
532
505
  "optional": true,
533
506
  "os": [
@@ -550,9 +523,6 @@
550
523
  "cpu": [
551
524
  "arm64"
552
525
  ],
553
- "libc": [
554
- "glibc"
555
- ],
556
526
  "license": "Apache-2.0",
557
527
  "optional": true,
558
528
  "os": [
@@ -575,9 +545,6 @@
575
545
  "cpu": [
576
546
  "ppc64"
577
547
  ],
578
- "libc": [
579
- "glibc"
580
- ],
581
548
  "license": "Apache-2.0",
582
549
  "optional": true,
583
550
  "os": [
@@ -600,9 +567,6 @@
600
567
  "cpu": [
601
568
  "riscv64"
602
569
  ],
603
- "libc": [
604
- "glibc"
605
- ],
606
570
  "license": "Apache-2.0",
607
571
  "optional": true,
608
572
  "os": [
@@ -625,9 +589,6 @@
625
589
  "cpu": [
626
590
  "s390x"
627
591
  ],
628
- "libc": [
629
- "glibc"
630
- ],
631
592
  "license": "Apache-2.0",
632
593
  "optional": true,
633
594
  "os": [
@@ -650,9 +611,6 @@
650
611
  "cpu": [
651
612
  "x64"
652
613
  ],
653
- "libc": [
654
- "glibc"
655
- ],
656
614
  "license": "Apache-2.0",
657
615
  "optional": true,
658
616
  "os": [
@@ -675,9 +633,6 @@
675
633
  "cpu": [
676
634
  "arm64"
677
635
  ],
678
- "libc": [
679
- "musl"
680
- ],
681
636
  "license": "Apache-2.0",
682
637
  "optional": true,
683
638
  "os": [
@@ -700,9 +655,6 @@
700
655
  "cpu": [
701
656
  "x64"
702
657
  ],
703
- "libc": [
704
- "musl"
705
- ],
706
658
  "license": "Apache-2.0",
707
659
  "optional": true,
708
660
  "os": [
@@ -977,9 +929,6 @@
977
929
  "cpu": [
978
930
  "arm64"
979
931
  ],
980
- "libc": [
981
- "glibc"
982
- ],
983
932
  "license": "MIT",
984
933
  "optional": true,
985
934
  "os": [
@@ -996,9 +945,6 @@
996
945
  "cpu": [
997
946
  "arm64"
998
947
  ],
999
- "libc": [
1000
- "musl"
1001
- ],
1002
948
  "license": "MIT",
1003
949
  "optional": true,
1004
950
  "os": [
@@ -1015,9 +961,6 @@
1015
961
  "cpu": [
1016
962
  "x64"
1017
963
  ],
1018
- "libc": [
1019
- "glibc"
1020
- ],
1021
964
  "license": "MIT",
1022
965
  "optional": true,
1023
966
  "os": [
@@ -1034,9 +977,6 @@
1034
977
  "cpu": [
1035
978
  "x64"
1036
979
  ],
1037
- "libc": [
1038
- "musl"
1039
- ],
1040
980
  "license": "MIT",
1041
981
  "optional": true,
1042
982
  "os": [
@@ -1252,9 +1192,9 @@
1252
1192
  }
1253
1193
  },
1254
1194
  "node_modules/@tailwindcss/node": {
1255
- "version": "4.3.1",
1256
- "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.1.tgz",
1257
- "integrity": "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==",
1195
+ "version": "4.3.2",
1196
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz",
1197
+ "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==",
1258
1198
  "license": "MIT",
1259
1199
  "dependencies": {
1260
1200
  "@jridgewell/remapping": "^2.3.5",
@@ -1263,36 +1203,36 @@
1263
1203
  "lightningcss": "1.32.0",
1264
1204
  "magic-string": "^0.30.21",
1265
1205
  "source-map-js": "^1.2.1",
1266
- "tailwindcss": "4.3.1"
1206
+ "tailwindcss": "4.3.2"
1267
1207
  }
1268
1208
  },
1269
1209
  "node_modules/@tailwindcss/oxide": {
1270
- "version": "4.3.1",
1271
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.1.tgz",
1272
- "integrity": "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==",
1210
+ "version": "4.3.2",
1211
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz",
1212
+ "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==",
1273
1213
  "license": "MIT",
1274
1214
  "engines": {
1275
1215
  "node": ">= 20"
1276
1216
  },
1277
1217
  "optionalDependencies": {
1278
- "@tailwindcss/oxide-android-arm64": "4.3.1",
1279
- "@tailwindcss/oxide-darwin-arm64": "4.3.1",
1280
- "@tailwindcss/oxide-darwin-x64": "4.3.1",
1281
- "@tailwindcss/oxide-freebsd-x64": "4.3.1",
1282
- "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1",
1283
- "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1",
1284
- "@tailwindcss/oxide-linux-arm64-musl": "4.3.1",
1285
- "@tailwindcss/oxide-linux-x64-gnu": "4.3.1",
1286
- "@tailwindcss/oxide-linux-x64-musl": "4.3.1",
1287
- "@tailwindcss/oxide-wasm32-wasi": "4.3.1",
1288
- "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1",
1289
- "@tailwindcss/oxide-win32-x64-msvc": "4.3.1"
1218
+ "@tailwindcss/oxide-android-arm64": "4.3.2",
1219
+ "@tailwindcss/oxide-darwin-arm64": "4.3.2",
1220
+ "@tailwindcss/oxide-darwin-x64": "4.3.2",
1221
+ "@tailwindcss/oxide-freebsd-x64": "4.3.2",
1222
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2",
1223
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2",
1224
+ "@tailwindcss/oxide-linux-arm64-musl": "4.3.2",
1225
+ "@tailwindcss/oxide-linux-x64-gnu": "4.3.2",
1226
+ "@tailwindcss/oxide-linux-x64-musl": "4.3.2",
1227
+ "@tailwindcss/oxide-wasm32-wasi": "4.3.2",
1228
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2",
1229
+ "@tailwindcss/oxide-win32-x64-msvc": "4.3.2"
1290
1230
  }
1291
1231
  },
1292
1232
  "node_modules/@tailwindcss/oxide-android-arm64": {
1293
- "version": "4.3.1",
1294
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.1.tgz",
1295
- "integrity": "sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==",
1233
+ "version": "4.3.2",
1234
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz",
1235
+ "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==",
1296
1236
  "cpu": [
1297
1237
  "arm64"
1298
1238
  ],
@@ -1306,9 +1246,9 @@
1306
1246
  }
1307
1247
  },
1308
1248
  "node_modules/@tailwindcss/oxide-darwin-arm64": {
1309
- "version": "4.3.1",
1310
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.1.tgz",
1311
- "integrity": "sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==",
1249
+ "version": "4.3.2",
1250
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz",
1251
+ "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==",
1312
1252
  "cpu": [
1313
1253
  "arm64"
1314
1254
  ],
@@ -1322,9 +1262,9 @@
1322
1262
  }
1323
1263
  },
1324
1264
  "node_modules/@tailwindcss/oxide-darwin-x64": {
1325
- "version": "4.3.1",
1326
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.1.tgz",
1327
- "integrity": "sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==",
1265
+ "version": "4.3.2",
1266
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz",
1267
+ "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==",
1328
1268
  "cpu": [
1329
1269
  "x64"
1330
1270
  ],
@@ -1338,9 +1278,9 @@
1338
1278
  }
1339
1279
  },
1340
1280
  "node_modules/@tailwindcss/oxide-freebsd-x64": {
1341
- "version": "4.3.1",
1342
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.1.tgz",
1343
- "integrity": "sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==",
1281
+ "version": "4.3.2",
1282
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz",
1283
+ "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==",
1344
1284
  "cpu": [
1345
1285
  "x64"
1346
1286
  ],
@@ -1354,9 +1294,9 @@
1354
1294
  }
1355
1295
  },
1356
1296
  "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
1357
- "version": "4.3.1",
1358
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.1.tgz",
1359
- "integrity": "sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==",
1297
+ "version": "4.3.2",
1298
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz",
1299
+ "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==",
1360
1300
  "cpu": [
1361
1301
  "arm"
1362
1302
  ],
@@ -1370,15 +1310,12 @@
1370
1310
  }
1371
1311
  },
1372
1312
  "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
1373
- "version": "4.3.1",
1374
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.1.tgz",
1375
- "integrity": "sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==",
1313
+ "version": "4.3.2",
1314
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz",
1315
+ "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==",
1376
1316
  "cpu": [
1377
1317
  "arm64"
1378
1318
  ],
1379
- "libc": [
1380
- "glibc"
1381
- ],
1382
1319
  "license": "MIT",
1383
1320
  "optional": true,
1384
1321
  "os": [
@@ -1389,15 +1326,12 @@
1389
1326
  }
1390
1327
  },
1391
1328
  "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
1392
- "version": "4.3.1",
1393
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.1.tgz",
1394
- "integrity": "sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==",
1329
+ "version": "4.3.2",
1330
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz",
1331
+ "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==",
1395
1332
  "cpu": [
1396
1333
  "arm64"
1397
1334
  ],
1398
- "libc": [
1399
- "musl"
1400
- ],
1401
1335
  "license": "MIT",
1402
1336
  "optional": true,
1403
1337
  "os": [
@@ -1408,15 +1342,12 @@
1408
1342
  }
1409
1343
  },
1410
1344
  "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
1411
- "version": "4.3.1",
1412
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.1.tgz",
1413
- "integrity": "sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==",
1345
+ "version": "4.3.2",
1346
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz",
1347
+ "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==",
1414
1348
  "cpu": [
1415
1349
  "x64"
1416
1350
  ],
1417
- "libc": [
1418
- "glibc"
1419
- ],
1420
1351
  "license": "MIT",
1421
1352
  "optional": true,
1422
1353
  "os": [
@@ -1427,15 +1358,12 @@
1427
1358
  }
1428
1359
  },
1429
1360
  "node_modules/@tailwindcss/oxide-linux-x64-musl": {
1430
- "version": "4.3.1",
1431
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.1.tgz",
1432
- "integrity": "sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==",
1361
+ "version": "4.3.2",
1362
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz",
1363
+ "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==",
1433
1364
  "cpu": [
1434
1365
  "x64"
1435
1366
  ],
1436
- "libc": [
1437
- "musl"
1438
- ],
1439
1367
  "license": "MIT",
1440
1368
  "optional": true,
1441
1369
  "os": [
@@ -1446,9 +1374,9 @@
1446
1374
  }
1447
1375
  },
1448
1376
  "node_modules/@tailwindcss/oxide-wasm32-wasi": {
1449
- "version": "4.3.1",
1450
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.1.tgz",
1451
- "integrity": "sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==",
1377
+ "version": "4.3.2",
1378
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz",
1379
+ "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==",
1452
1380
  "bundleDependencies": [
1453
1381
  "@napi-rs/wasm-runtime",
1454
1382
  "@emnapi/core",
@@ -1463,9 +1391,9 @@
1463
1391
  "license": "MIT",
1464
1392
  "optional": true,
1465
1393
  "dependencies": {
1466
- "@emnapi/core": "^1.10.0",
1467
- "@emnapi/runtime": "^1.10.0",
1468
- "@emnapi/wasi-threads": "^1.2.1",
1394
+ "@emnapi/core": "^1.11.1",
1395
+ "@emnapi/runtime": "^1.11.1",
1396
+ "@emnapi/wasi-threads": "^1.2.2",
1469
1397
  "@napi-rs/wasm-runtime": "^1.1.4",
1470
1398
  "@tybys/wasm-util": "^0.10.2",
1471
1399
  "tslib": "^2.8.1"
@@ -1475,17 +1403,17 @@
1475
1403
  }
1476
1404
  },
1477
1405
  "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": {
1478
- "version": "1.10.0",
1406
+ "version": "1.11.1",
1479
1407
  "inBundle": true,
1480
1408
  "license": "MIT",
1481
1409
  "optional": true,
1482
1410
  "dependencies": {
1483
- "@emnapi/wasi-threads": "1.2.1",
1411
+ "@emnapi/wasi-threads": "1.2.2",
1484
1412
  "tslib": "^2.4.0"
1485
1413
  }
1486
1414
  },
1487
1415
  "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": {
1488
- "version": "1.10.0",
1416
+ "version": "1.11.1",
1489
1417
  "inBundle": true,
1490
1418
  "license": "MIT",
1491
1419
  "optional": true,
@@ -1494,7 +1422,7 @@
1494
1422
  }
1495
1423
  },
1496
1424
  "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": {
1497
- "version": "1.2.1",
1425
+ "version": "1.2.2",
1498
1426
  "inBundle": true,
1499
1427
  "license": "MIT",
1500
1428
  "optional": true,
@@ -1535,9 +1463,9 @@
1535
1463
  "optional": true
1536
1464
  },
1537
1465
  "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
1538
- "version": "4.3.1",
1539
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.1.tgz",
1540
- "integrity": "sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==",
1466
+ "version": "4.3.2",
1467
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz",
1468
+ "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==",
1541
1469
  "cpu": [
1542
1470
  "arm64"
1543
1471
  ],
@@ -1551,9 +1479,9 @@
1551
1479
  }
1552
1480
  },
1553
1481
  "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
1554
- "version": "4.3.1",
1555
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.1.tgz",
1556
- "integrity": "sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==",
1482
+ "version": "4.3.2",
1483
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz",
1484
+ "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==",
1557
1485
  "cpu": [
1558
1486
  "x64"
1559
1487
  ],
@@ -1567,16 +1495,16 @@
1567
1495
  }
1568
1496
  },
1569
1497
  "node_modules/@tailwindcss/postcss": {
1570
- "version": "4.3.1",
1571
- "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.1.tgz",
1572
- "integrity": "sha512-dNJuNbdEJT/SWRuXTYP1WSamelsz3ztkUsdtWQPjrexysrTpaEPM40P/71knXiXLYEojqPOEGitVLLpPMS5T6A==",
1498
+ "version": "4.3.2",
1499
+ "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.2.tgz",
1500
+ "integrity": "sha512-rjVWYCa7Ngbi5AarT6k8TkxUG3Wl1QKzHdIZVsjZSzf36Jmo2IKZt/NHRAwly8oDkbBOH0YTu+CHuf9jPxMc+g==",
1573
1501
  "license": "MIT",
1574
1502
  "dependencies": {
1575
1503
  "@alloc/quick-lru": "^5.2.0",
1576
- "@tailwindcss/node": "4.3.1",
1577
- "@tailwindcss/oxide": "4.3.1",
1578
- "postcss": "8.5.15",
1579
- "tailwindcss": "4.3.1"
1504
+ "@tailwindcss/node": "4.3.2",
1505
+ "@tailwindcss/oxide": "4.3.2",
1506
+ "postcss": "^8.5.15",
1507
+ "tailwindcss": "4.3.2"
1580
1508
  }
1581
1509
  },
1582
1510
  "node_modules/@tailwindcss/typography": {
@@ -2145,9 +2073,9 @@
2145
2073
  }
2146
2074
  },
2147
2075
  "node_modules/baseline-browser-mapping": {
2148
- "version": "2.10.38",
2149
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz",
2150
- "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==",
2076
+ "version": "2.10.40",
2077
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz",
2078
+ "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==",
2151
2079
  "license": "Apache-2.0",
2152
2080
  "bin": {
2153
2081
  "baseline-browser-mapping": "dist/cli.cjs"
@@ -2157,9 +2085,9 @@
2157
2085
  }
2158
2086
  },
2159
2087
  "node_modules/brace-expansion": {
2160
- "version": "5.0.6",
2161
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
2162
- "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
2088
+ "version": "5.0.7",
2089
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz",
2090
+ "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==",
2163
2091
  "license": "MIT",
2164
2092
  "dependencies": {
2165
2093
  "balanced-match": "^4.0.2"
@@ -2208,9 +2136,9 @@
2208
2136
  "license": "MIT"
2209
2137
  },
2210
2138
  "node_modules/caniuse-lite": {
2211
- "version": "1.0.30001799",
2212
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz",
2213
- "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==",
2139
+ "version": "1.0.30001800",
2140
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001800.tgz",
2141
+ "integrity": "sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==",
2214
2142
  "funding": [
2215
2143
  {
2216
2144
  "type": "opencollective",
@@ -2939,9 +2867,9 @@
2939
2867
  "license": "MIT"
2940
2868
  },
2941
2869
  "node_modules/electron-to-chromium": {
2942
- "version": "1.5.378",
2943
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.378.tgz",
2944
- "integrity": "sha512-VinvOAuuPmdD1guEgGv5f2Qp7/vlfqOrUOMYNnOD4wj3pit8kRsQHzfIf6teyUGWo15Tg5+bOJaRunvyltpVWQ==",
2870
+ "version": "1.5.383",
2871
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.383.tgz",
2872
+ "integrity": "sha512-I2484/KkAvl8lm9VyjH2JnbOIV0d/UCqT7gbzs6l+o6Vmn9wgB66uVcKX+Vk6HrXtY6fbWTOEXuv8waDTuFNCw==",
2945
2873
  "license": "ISC"
2946
2874
  },
2947
2875
  "node_modules/enhanced-resolve": {
@@ -2970,9 +2898,9 @@
2970
2898
  }
2971
2899
  },
2972
2900
  "node_modules/es-toolkit": {
2973
- "version": "1.48.1",
2974
- "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.48.1.tgz",
2975
- "integrity": "sha512-wfnXlwd5I75eXRtdD2vuEs50xHHESECDsGD7yiQnfFVNoa5522NwXEbmgo98LfiukSQHs+mBM7/YG3qKJB9/mQ==",
2901
+ "version": "1.49.0",
2902
+ "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.49.0.tgz",
2903
+ "integrity": "sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==",
2976
2904
  "license": "MIT",
2977
2905
  "workspaces": [
2978
2906
  "docs",
@@ -3161,9 +3089,9 @@
3161
3089
  "license": "MIT"
3162
3090
  },
3163
3091
  "node_modules/fast-uri": {
3164
- "version": "3.1.2",
3165
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz",
3166
- "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==",
3092
+ "version": "3.1.3",
3093
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz",
3094
+ "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==",
3167
3095
  "funding": [
3168
3096
  {
3169
3097
  "type": "github",
@@ -3224,9 +3152,9 @@
3224
3152
  }
3225
3153
  },
3226
3154
  "node_modules/fs-extra": {
3227
- "version": "11.3.5",
3228
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz",
3229
- "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==",
3155
+ "version": "11.3.6",
3156
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.6.tgz",
3157
+ "integrity": "sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==",
3230
3158
  "license": "MIT",
3231
3159
  "dependencies": {
3232
3160
  "graceful-fs": "^4.2.0",
@@ -3304,9 +3232,9 @@
3304
3232
  }
3305
3233
  },
3306
3234
  "node_modules/gray-matter/node_modules/js-yaml": {
3307
- "version": "3.14.2",
3308
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
3309
- "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
3235
+ "version": "3.15.0",
3236
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz",
3237
+ "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==",
3310
3238
  "license": "MIT",
3311
3239
  "dependencies": {
3312
3240
  "argparse": "^1.0.7",
@@ -3714,9 +3642,9 @@
3714
3642
  "license": "MIT"
3715
3643
  },
3716
3644
  "node_modules/js-yaml": {
3717
- "version": "4.2.0",
3718
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz",
3719
- "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==",
3645
+ "version": "4.3.0",
3646
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz",
3647
+ "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==",
3720
3648
  "funding": [
3721
3649
  {
3722
3650
  "type": "github",
@@ -3937,9 +3865,6 @@
3937
3865
  "cpu": [
3938
3866
  "arm64"
3939
3867
  ],
3940
- "libc": [
3941
- "glibc"
3942
- ],
3943
3868
  "license": "MPL-2.0",
3944
3869
  "optional": true,
3945
3870
  "os": [
@@ -3960,9 +3885,6 @@
3960
3885
  "cpu": [
3961
3886
  "arm64"
3962
3887
  ],
3963
- "libc": [
3964
- "musl"
3965
- ],
3966
3888
  "license": "MPL-2.0",
3967
3889
  "optional": true,
3968
3890
  "os": [
@@ -3983,9 +3905,6 @@
3983
3905
  "cpu": [
3984
3906
  "x64"
3985
3907
  ],
3986
- "libc": [
3987
- "glibc"
3988
- ],
3989
3908
  "license": "MPL-2.0",
3990
3909
  "optional": true,
3991
3910
  "os": [
@@ -4006,9 +3925,6 @@
4006
3925
  "cpu": [
4007
3926
  "x64"
4008
3927
  ],
4009
- "libc": [
4010
- "musl"
4011
- ],
4012
3928
  "license": "MPL-2.0",
4013
3929
  "optional": true,
4014
3930
  "os": [
@@ -5464,9 +5380,9 @@
5464
5380
  "license": "MIT"
5465
5381
  },
5466
5382
  "node_modules/package-manager-detector": {
5467
- "version": "1.6.0",
5468
- "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz",
5469
- "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==",
5383
+ "version": "1.7.0",
5384
+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.7.0.tgz",
5385
+ "integrity": "sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ==",
5470
5386
  "license": "MIT"
5471
5387
  },
5472
5388
  "node_modules/parse-entities": {
@@ -5569,9 +5485,9 @@
5569
5485
  }
5570
5486
  },
5571
5487
  "node_modules/postcss": {
5572
- "version": "8.5.15",
5573
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
5574
- "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
5488
+ "version": "8.5.16",
5489
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz",
5490
+ "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==",
5575
5491
  "funding": [
5576
5492
  {
5577
5493
  "type": "opencollective",
@@ -6269,9 +6185,9 @@
6269
6185
  "license": "MIT"
6270
6186
  },
6271
6187
  "node_modules/tailwindcss": {
6272
- "version": "4.3.1",
6273
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.1.tgz",
6274
- "integrity": "sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==",
6188
+ "version": "4.3.2",
6189
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz",
6190
+ "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==",
6275
6191
  "license": "MIT"
6276
6192
  },
6277
6193
  "node_modules/tapable": {