Merge branch 'develop' of ssh://github.com/element-hq/element-web into t3chguy/pnpm

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

# Conflicts:
#	packages/shared-components/package.json
#	packages/shared-components/yarn.lock
This commit is contained in:
Michael Telatynski 2026-02-06 12:48:30 +00:00
commit f5c4bade9c
No known key found for this signature in database
GPG Key ID: A2B008A5F49F5D0D
12 changed files with 500 additions and 4 deletions

View File

@ -0,0 +1,41 @@
name: Publish shared component storybook
on:
workflow_dispatch: {}
push:
branches:
- "develop"
paths:
- "packages/shared-components/**/*"
permissions: {}
jobs:
doc:
name: Publish storybook
runs-on: ubuntu-latest
environment: SharedComponents
steps:
- name: 🧮 Checkout code
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
- name: 🔧 Yarn cache
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6
with:
cache: "yarn"
node-version-file: package.json
- name: 🔨 Install dependencies
working-directory: packages/shared-components
run: "yarn install --pure-lockfile"
- name: 📖 Build Storybook
working-directory: packages/shared-components
run: yarn build:storybook
- name: 🚀 Deploy to Cloudflare Pages
uses: cloudflare/wrangler-action@9681c2997648301493e78cacbfb790a9f19c833f # v3
with:
apiToken: ${{ secrets.CF_PAGES_TOKEN }}
accountId: ${{ secrets.CF_PAGES_ACCOUNT_ID }}
workingDirectory: "packages/shared-components"
command: pages deploy storybook-static --project-name=shared-components-storybook

View File

@ -8,3 +8,5 @@
# Ignore coverage report
/coverage/
# Ignore generated docs
typedoc

View File

@ -255,6 +255,53 @@ export default {
The Figma design will appear in the "Design" tab in Storybook.
#### Non-UI Utility Stories
For utility functions, helpers, and other non-UI exports, create documentation stories using TSX format with TypeDoc-generated markdown.
`src/utils/humanize.stories.tsx`
```tsx
import React from "react";
import { Markdown } from "@storybook/addon-docs/blocks";
import type { Meta } from "@storybook/react-vite";
import humanizeTimeDoc from "../../typedoc/functions/humanizeTime.md?raw";
const meta = {
title: "utils/humanize",
parameters: {
docs: {
page: () => (
<>
<h1>humanize</h1>
<Markdown>{humanizeTimeDoc}</Markdown>
</>
),
},
},
tags: ["autodocs", "skip-test"],
} satisfies Meta;
export default meta;
// Docs-only story - renders nothing but triggers autodocs
export const Docs = {
render: () => null,
};
```
> [!NOTE]
> Be sure to include the `skip-test` tag in your utility stories to prevent them from running as visual tests.
**Workflow:**
1. Write TsDoc in your utility function
2. Export the function from `src/index.ts`
3. Run `yarn build:doc` to generate TypeDoc markdown
4. Create a `.stories.tsx` file importing the generated markdown
5. The documentation appears automatically in Storybook
### Tests
Two types of tests are available: unit tests and visual regression tests.
@ -288,7 +335,7 @@ Screenshots are located in `packages/shared-components/__vis__/`.
### Translations
First see our [translation guide](../../docs/translation.md) and [translation dev guide](../../docs/translation-dev.md).
First see our [translation guide](../../docs/translating.md) and [translation dev guide](../../docs/translating-dev.md).
To generate translation strings for this package, run:
```bash

View File

@ -1,6 +1,6 @@
{
"name": "@element-hq/web-shared-components",
"version": "0.0.1",
"version": "0.0.2",
"description": "Shared components for Element",
"author": "New Vector Ltd.",
"repository": {
@ -39,11 +39,12 @@
"i18n:sort": "matrix-sort-i18n src/i18n/strings/en_EN.json",
"i18n:lint": "matrix-i18n-lint && prettier --log-level=silent --write src/i18n/strings/ --ignore-path /dev/null",
"test:unit": "vitest --project=unit",
"test:storybook": "vitest --project=storybook",
"test:storybook": "yarn build:doc && vitest --project=storybook",
"test:storybook:update": "playwright-screenshots --entrypoint /work/scripts/storybook-screenshot-update.sh --with-node-modules",
"prepare": "vite build",
"storybook": "storybook dev -p 6007",
"build-storybook": "storybook build",
"build:storybook": "pnpm build:doc && storybook build && node scripts/storybook-build-i18n.ts",
"build:doc": "typedoc",
"lint": "pnpm lint:types && pnpm lint:js",
"lint:js": "eslint --max-warnings 0 src && prettier --check .",
"lint:types": "tsc --noEmit && tsc --noEmit -p tsconfig.node.json"
@ -103,6 +104,9 @@
"prettier": "^3.6.2",
"storybook": "^10.0.7",
"storybook-addon-vis": "^3.1.2",
"typedoc": "^0.28.16",
"typedoc-plugin-markdown": "^4.9.0",
"typedoc-plugin-missing-exports": "^4.1.2",
"typescript": "^5.9.3",
"vite": "^7.3.1",
"vite-plugin-dts": "^4.5.4",

View File

@ -0,0 +1,85 @@
/*
* Copyright 2026 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
/**
* Script to generate i18n files for Storybook build.
*/
import * as fs from "node:fs";
import { createHash } from "node:crypto";
// Base path for i18n strings
const I18N_BASE_PATH = "./src/i18n/strings/";
// Destination path for generated i18n files
const I18N_DEST = "storybook-static/i18n/";
// List of languages to include
const INCLUDE_LANGS = [...new Set([...fs.readdirSync(I18N_BASE_PATH)])]
.filter((fn) => fn.endsWith(".json"))
.map((f) => f.slice(0, -5));
// Check if dist exists
if (!fs.existsSync("dist")) {
fs.mkdirSync("dist");
}
// Check if i18n exists
if (!fs.existsSync(I18N_DEST)) {
fs.mkdirSync(I18N_DEST);
}
// Type mapping language codes to filenames
type LangFileMap = Record<string, string>;
/**
* Prepare language files by creating hashed filenames and writing them to the destination.
* @returns Mapping of language codes to filenames
*/
function prepareLangFiles(): LangFileMap {
return INCLUDE_LANGS.reduce<Record<string, string>>((fileMap, lang) => {
const [filename, json] = createHashFromFile(lang);
fs.writeFileSync(`${I18N_DEST}${filename}`, json);
fileMap[lang] = filename;
return fileMap;
}, {});
}
/**
* Create a hash from the contents of the language file.
* @param lang - Language code
* @returns Tuple of filename and JSON content
*/
function createHashFromFile(lang: string): [filename: string, json: string] {
const translationsPath = `${I18N_BASE_PATH}${lang}.json`;
const json = JSON.stringify(fs.readFileSync(translationsPath).toString(), null, 4);
const jsonBuffer = Buffer.from(json);
const digest = createHash("sha256").update(jsonBuffer).digest("hex").slice(0, 7);
const filename = `${lang}.${digest}.json`;
return [filename, json];
}
/**
* Generate the languages.json file mapping language codes to filenames.
* @param langFileMap
*/
function genLangList(langFileMap: LangFileMap): void {
const languages: Record<string, string> = {};
INCLUDE_LANGS.forEach(function (lang) {
const normalizedLanguage = lang.toLowerCase().replace("_", "-");
const languageParts = normalizedLanguage.split("-");
if (languageParts.length == 2 && languageParts[0] == languageParts[1]) {
languages[languageParts[0]] = langFileMap[lang];
} else {
languages[normalizedLanguage] = langFileMap[lang];
}
});
fs.writeFileSync(`${I18N_DEST}/languages.json`, JSON.stringify(languages, null, 4));
}
const langFileMap = prepareLangFiles();
genLangList(langFileMap);

View File

@ -6,3 +6,9 @@ Please see LICENSE files in the repository root for full details.
*/
declare module "*.css";
// For importing markdown files into storybook stories
declare module "*.md?raw" {
const content: string;
export default content;
}

View File

@ -0,0 +1,43 @@
/*
* Copyright 2026 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
import React from "react";
import { Markdown } from "@storybook/addon-docs/blocks";
import type { Meta } from "@storybook/react-vite";
import formatBytesDoc from "../../typedoc/functions/formatBytes.md?raw";
import formatSecondsDoc from "../../typedoc/functions/formatSeconds.md?raw";
const meta = {
title: "utils/FormattingUtils",
parameters: {
docs: {
page: () => (
<>
<h1>Formatting Utilities</h1>
<p>A collection of utility functions for formatting data into human-readable strings.</p>
<hr />
<h2>formatBytes</h2>
<Markdown>{formatBytesDoc}</Markdown>
<hr />
<h2>formatSeconds</h2>
<Markdown>{formatSecondsDoc}</Markdown>
</>
),
},
},
tags: ["autodocs", "skip-test"],
} satisfies Meta;
export default meta;
// Docs-only story - renders nothing but triggers autodocs
export const Docs = {
render: () => null,
};

View File

@ -0,0 +1,34 @@
/*
* Copyright 2026 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
import React from "react";
import { Markdown } from "@storybook/addon-docs/blocks";
import type { Meta } from "@storybook/react-vite";
import humanizeTimeDoc from "../../typedoc/functions/humanizeTime.md?raw";
const meta = {
title: "utils/humanize",
parameters: {
docs: {
page: () => (
<>
<h1>humanize</h1>
<Markdown>{humanizeTimeDoc}</Markdown>
</>
),
},
},
tags: ["autodocs", "skip-test"],
} satisfies Meta;
export default meta;
// Docs-only story - renders nothing but triggers autodocs
export const Docs = {
render: () => null,
};

View File

@ -0,0 +1,61 @@
/*
* Copyright 2026 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
import React from "react";
import { Markdown } from "@storybook/addon-docs/blocks";
import type { Meta } from "@storybook/react-vite";
import clampDoc from "../../typedoc/functions/clamp.md?raw";
import defaultNumberDoc from "../../typedoc/functions/defaultNumber.md?raw";
import percentageOfDoc from "../../typedoc/functions/percentageOf.md?raw";
import percentageWithinDoc from "../../typedoc/functions/percentageWithin.md?raw";
import sumDoc from "../../typedoc/functions/sum.md?raw";
const meta = {
title: "utils/numbers",
parameters: {
docs: {
page: () => (
<>
<h1>Number Utilities</h1>
<p>
A collection of utility functions for working with numbers, including validation, clamping, and
percentage calculations.
</p>
<hr />
<h2>defaultNumber</h2>
<Markdown>{defaultNumberDoc}</Markdown>
<hr />
<h2>clamp</h2>
<Markdown>{clampDoc}</Markdown>
<hr />
<h2>sum</h2>
<Markdown>{sumDoc}</Markdown>
<hr />
<h2>percentageWithin</h2>
<Markdown>{percentageWithinDoc}</Markdown>
<hr />
<h2>percentageOf</h2>
<Markdown>{percentageOfDoc}</Markdown>
</>
),
},
},
tags: ["autodocs", "skip-test"],
} satisfies Meta;
export default meta;
// Docs-only story - renders nothing but triggers autodocs
export const Docs = {
render: () => null,
};

View File

@ -0,0 +1,27 @@
{
"$schema": "https://typedoc.org/schema.json",
"entryPoints": ["src/index.ts"],
"plugin": ["typedoc-plugin-markdown", "typedoc-plugin-missing-exports"],
"out": "typedoc",
"hidePageHeader": true,
"hidePageTitle": true,
"hideBreadcrumbs": true,
"useCodeBlocks": true,
"parametersFormat": "table",
"propertiesFormat": "table",
"enumMembersFormat": "table",
"typeDeclarationFormat": "table",
"indexFormat": "table",
"publicPath": "https://github.com/element-hq/element-web/blob/develop/packages/shared-components/",
"sourceLinkTemplate": "https://github.com/element-hq/element-web/blob/develop/{path}#L{line}",
"name": "@element-hq/web-shared-components",
"categorizeByGroup": true,
"externalSymbolLinkMappings": {
"@types/react": {
"*": "https://react.dev/"
},
"react-virtuoso": {
"*": "https://virtuoso.dev/"
}
}
}

View File

@ -94,6 +94,9 @@ export default defineConfig({
storybookTest({
configDir: path.join(dirname, ".storybook"),
storybookScript: "storybook --ci",
tags: {
exclude: ["skip-test"],
},
}),
storybookVis({
// 3px of difference allowed before marking as failed

143
pnpm-lock.yaml generated
View File

@ -837,6 +837,15 @@ importers:
storybook-addon-vis:
specifier: ^3.1.2
version: 3.1.2(@storybook/addon-vitest@10.2.5(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@22.19.8)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(yaml@2.8.2))(vitest@4.0.18))(@vitest/runner@4.0.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18))(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@22.19.8)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(yaml@2.8.2))(vitest@4.0.18))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18)
typedoc:
specifier: ^0.28.16
version: 0.28.16(typescript@5.9.3)
typedoc-plugin-markdown:
specifier: ^4.9.0
version: 4.9.0(typedoc@0.28.16(typescript@5.9.3))
typedoc-plugin-missing-exports:
specifier: ^4.1.2
version: 4.1.2(typedoc@0.28.16(typescript@5.9.3))
typescript:
specifier: ^5.9.3
version: 5.9.3
@ -2209,6 +2218,9 @@ packages:
'@formatjs/intl-segmenter@12.1.1':
resolution: {integrity: sha512-/ufC6NrGKDHrjWXLhkSu852K/ZHgMXm4H37xOqiB5qWrjOSu0gXyiyUSJkc5HExmNW/28qDTvh4gUb79ZQ3fbA==}
'@gerrit0/mini-shiki@3.22.0':
resolution: {integrity: sha512-jMpciqEVUBKE1QwU64S4saNMzpsSza6diNCk4MWAeCxO2+LFi2FIFmL2S0VDLzEJCxuvCbU783xi8Hp/gkM5CQ==}
'@grpc/grpc-js@1.14.3':
resolution: {integrity: sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==}
engines: {node: '>=12.10.0'}
@ -3556,6 +3568,21 @@ packages:
peerDependencies:
webpack: '>=4.40.0'
'@shikijs/engine-oniguruma@3.22.0':
resolution: {integrity: sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==}
'@shikijs/langs@3.22.0':
resolution: {integrity: sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==}
'@shikijs/themes@3.22.0':
resolution: {integrity: sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==}
'@shikijs/types@3.22.0':
resolution: {integrity: sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==}
'@shikijs/vscode-textmate@10.0.2':
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
'@sinclair/typebox@0.34.48':
resolution: {integrity: sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==}
@ -3893,6 +3920,9 @@ packages:
'@types/glob-to-regexp@0.4.4':
resolution: {integrity: sha512-nDKoaKJYbnn1MZxUY0cA1bPmmgZbg0cTq7Rh13d0KWYNOiKbqoR+2d89SnRPszGh7ROzSwZ/GOjZ4jPbmmZ6Eg==}
'@types/hast@3.0.4':
resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
'@types/hoist-non-react-statics@3.3.7':
resolution: {integrity: sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==}
peerDependencies:
@ -4055,6 +4085,9 @@ packages:
'@types/ua-parser-js@0.7.39':
resolution: {integrity: sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==}
'@types/unist@3.0.3':
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
'@types/ws@8.18.1':
resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==}
@ -7241,6 +7274,9 @@ packages:
linkify-it@4.0.1:
resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==}
linkify-it@5.0.0:
resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
linkify-react@4.3.2:
resolution: {integrity: sha512-mi744h1hf+WDsr+paJgSBBgYNLMWNSHyM9V9LVUo03RidNGdw1VpI7Twnt+K3pEh3nIzB4xiiAgZxpd61ItKpQ==}
peerDependencies:
@ -7343,6 +7379,9 @@ packages:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
lunr@2.3.9:
resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==}
lz-string@1.5.0:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
@ -7376,6 +7415,10 @@ packages:
resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==}
hasBin: true
markdown-it@14.1.0:
resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==}
hasBin: true
math-intrinsics@1.1.0:
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
engines: {node: '>= 0.4'}
@ -7420,6 +7463,9 @@ packages:
mdurl@1.0.1:
resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==}
mdurl@2.0.0:
resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==}
media-typer@0.3.0:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
engines: {node: '>= 0.6'}
@ -8455,6 +8501,10 @@ packages:
pump@3.0.3:
resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
punycode.js@2.3.1:
resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
engines: {node: '>=6'}
punycode@1.4.1:
resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
@ -9601,6 +9651,24 @@ packages:
resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
engines: {node: '>= 0.4'}
typedoc-plugin-markdown@4.9.0:
resolution: {integrity: sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==}
engines: {node: '>= 18'}
peerDependencies:
typedoc: 0.28.x
typedoc-plugin-missing-exports@4.1.2:
resolution: {integrity: sha512-WNoeWX9+8X3E3riuYPduilUTFefl1K+Z+5bmYqNeH5qcWjtnTRMbRzGdEQ4XXn1WEO4WCIlU0vf46Ca2y/mspg==}
peerDependencies:
typedoc: ^0.28.1
typedoc@0.28.16:
resolution: {integrity: sha512-x4xW77QC3i5DUFMBp0qjukOTnr/sSg+oEs86nB3LjDslvAmwe/PUGDWbe3GrIqt59oTqoXK5GRK9tAa0sYMiog==}
engines: {node: '>= 18', pnpm: '>= 10'}
hasBin: true
peerDependencies:
typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x
typescript@5.8.2:
resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==}
engines: {node: '>=14.17'}
@ -9618,6 +9686,9 @@ packages:
uc.micro@1.0.6:
resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==}
uc.micro@2.1.0:
resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
ufo@1.6.3:
resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==}
@ -11673,6 +11744,14 @@ snapshots:
'@formatjs/intl-localematcher': 0.8.1
tslib: 2.8.1
'@gerrit0/mini-shiki@3.22.0':
dependencies:
'@shikijs/engine-oniguruma': 3.22.0
'@shikijs/langs': 3.22.0
'@shikijs/themes': 3.22.0
'@shikijs/types': 3.22.0
'@shikijs/vscode-textmate': 10.0.2
'@grpc/grpc-js@1.14.3':
dependencies:
'@grpc/proto-loader': 0.8.0
@ -13094,6 +13173,26 @@ snapshots:
- encoding
- supports-color
'@shikijs/engine-oniguruma@3.22.0':
dependencies:
'@shikijs/types': 3.22.0
'@shikijs/vscode-textmate': 10.0.2
'@shikijs/langs@3.22.0':
dependencies:
'@shikijs/types': 3.22.0
'@shikijs/themes@3.22.0':
dependencies:
'@shikijs/types': 3.22.0
'@shikijs/types@3.22.0':
dependencies:
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
'@shikijs/vscode-textmate@10.0.2': {}
'@sinclair/typebox@0.34.48': {}
'@sindresorhus/merge-streams@4.0.0': {}
@ -13500,6 +13599,10 @@ snapshots:
'@types/glob-to-regexp@0.4.4': {}
'@types/hast@3.0.4':
dependencies:
'@types/unist': 3.0.3
'@types/hoist-non-react-statics@3.3.7(@types/react@19.2.10)':
dependencies:
'@types/react': 19.2.10
@ -13667,6 +13770,8 @@ snapshots:
'@types/ua-parser-js@0.7.39': {}
'@types/unist@3.0.3': {}
'@types/ws@8.18.1':
dependencies:
'@types/node': 22.19.8
@ -17478,6 +17583,10 @@ snapshots:
dependencies:
uc.micro: 1.0.6
linkify-it@5.0.0:
dependencies:
uc.micro: 2.1.0
linkify-react@4.3.2(linkifyjs@4.3.2)(react@19.2.4):
dependencies:
linkifyjs: 4.3.2
@ -17580,6 +17689,8 @@ snapshots:
dependencies:
yallist: 4.0.0
lunr@2.3.9: {}
lz-string@1.5.0: {}
magic-string@0.30.21:
@ -17647,6 +17758,15 @@ snapshots:
mdurl: 1.0.1
uc.micro: 1.0.6
markdown-it@14.1.0:
dependencies:
argparse: 2.0.1
entities: 4.5.0
linkify-it: 5.0.0
mdurl: 2.0.0
punycode.js: 2.3.1
uc.micro: 2.1.0
math-intrinsics@1.1.0: {}
mathml-tag-names@4.0.0: {}
@ -17703,6 +17823,8 @@ snapshots:
mdurl@1.0.1: {}
mdurl@2.0.0: {}
media-typer@0.3.0: {}
media-typer@1.1.0: {}
@ -18815,6 +18937,8 @@ snapshots:
end-of-stream: 1.4.5
once: 1.4.0
punycode.js@2.3.1: {}
punycode@1.4.1: {}
punycode@2.3.1: {}
@ -20240,6 +20364,23 @@ snapshots:
possible-typed-array-names: 1.1.0
reflect.getprototypeof: 1.0.10
typedoc-plugin-markdown@4.9.0(typedoc@0.28.16(typescript@5.9.3)):
dependencies:
typedoc: 0.28.16(typescript@5.9.3)
typedoc-plugin-missing-exports@4.1.2(typedoc@0.28.16(typescript@5.9.3)):
dependencies:
typedoc: 0.28.16(typescript@5.9.3)
typedoc@0.28.16(typescript@5.9.3):
dependencies:
'@gerrit0/mini-shiki': 3.22.0
lunr: 2.3.9
markdown-it: 14.1.0
minimatch: 9.0.5
typescript: 5.9.3
yaml: 2.8.2
typescript@5.8.2: {}
typescript@5.9.3: {}
@ -20248,6 +20389,8 @@ snapshots:
uc.micro@1.0.6: {}
uc.micro@2.1.0: {}
ufo@1.6.3: {}
unbox-primitive@1.1.0: