From 96b97f91596b640a1e2163cb00030aa0be377771 Mon Sep 17 00:00:00 2001 From: Caleb Winters Date: Tue, 28 Jul 2026 15:40:40 -0700 Subject: [PATCH 1/3] docs(components): add Forms guidelines page to Storybook Adds the first page under the Guidelines section, which was already reserved in storySort.order but had no content. The page documents what the code actually enforces. Its main job is the composition rule: no form component accepts label, description, errorMessage or placeholder as a prop, because React Aria omits them in favour of slot composition. Those are React Spectrum props, and the confusion is easy to hit since AGENTS.md mentions the names as a convention to mirror rather than as a description of the current API. It also records three gaps rather than papering over them: required fields render no visible marker, FieldError has no icon or live region, and helper text fails contrast inside picker items. All three regressed from the deprecated form package or are suppressed in axe config. Content guidelines are left as an explicitly-owned scaffold. The repo has no written copy standards to point at, so wording rules are marked as needing a content designer instead of being invented here. Examples live in a companion story file tagged ['!dev', '!autodocs'] so they stay out of the sidebar, following the recipes/composition pattern. Writing them as real stories rather than fenced code blocks means they are type-checked and cannot drift from the component APIs. --- .../components/stories/guidelines/Forms.mdx | 142 +++++++++++++++ .../stories/guidelines/forms.stories.tsx | 170 ++++++++++++++++++ 2 files changed, 312 insertions(+) create mode 100644 packages/components/stories/guidelines/Forms.mdx create mode 100644 packages/components/stories/guidelines/forms.stories.tsx diff --git a/packages/components/stories/guidelines/Forms.mdx b/packages/components/stories/guidelines/Forms.mdx new file mode 100644 index 000000000..424ae8771 --- /dev/null +++ b/packages/components/stories/guidelines/Forms.mdx @@ -0,0 +1,142 @@ +import { Meta, Canvas } from '@storybook/addon-docs/blocks'; + +import { + Anatomy, + FieldSpacing, + GroupedControls, + States, + Validation, +} from './forms.stories'; + + + +# Forms + +How to compose, validate and lay out forms in LaunchPad. + +Form components are thin wrappers around [React Aria Components](https://react-aria.adobe.com/) (RAC). LaunchPad styles them and adds a small number of variant props; the behaviour, ARIA wiring and keyboard support come from RAC. When you need to know what a prop does, RAC's docs are the source of truth. + +Form components are spread across three areas of this sidebar: + +- **Components/Forms** — Form, TextField, NumberField, SearchField, Checkbox, CheckboxGroup, RadioGroup, Switch, Slider, FieldGroup +- **Components/Pickers** — [Select](/docs/components-pickers-select--docs), [ComboBox](/docs/components-pickers-combobox--docs) +- **Components/Date and Time** — [DateField](/docs/components-date-and-time-datefield--docs), [TimeField](/docs/components-date-and-time-timefield--docs) + +## Anatomy + +A field is assembled from composed children: a label, the control, optional helper text, and a validation message. + + + +## Composition: children, not props + +This is the rule that catches people most often. + +**No LaunchPad form component accepts `label`, `description`, `errorMessage` or `placeholder` as a prop.** Those belong to React Spectrum, a different Adobe library. RAC deliberately removes them in favour of slot-based composition. From `react-aria-components/dist/types/src/TextField.d.ts`: + +```ts +export interface TextFieldProps extends Omit, RACValidation, ... {} +``` + +The same `Omit` appears on `NumberField`, `SearchField`, `Select`, `ComboBox`, `RadioGroup`, `CheckboxGroup`, `DateField` and `TimeField`. So instead of passing text in, you compose it: + +```tsx +// Correct + + + + Helper text + + + +// Will not compile — these props do not exist + +``` + +Two details worth remembering: + +- **`placeholder` lives on `Input`**, not on the field wrapper. +- **Helper text is ``**. The `slot` is what associates it with the field for screen readers via `aria-describedby`. + +Grouped controls follow the same shape: the group owns the label, helper text and error, and each child carries only its own label. + + + +## Validation + +Every field exposes `isRequired`, `isInvalid`, `isDisabled`, `isReadOnly` and `validate`. Two exceptions: **`Switch` cannot be required or invalid** (RAC omits those props — a switch always has a value), and **`Slider` has no validation surface** at all. + +`FieldError` takes no message prop: + +- **Omit its children** and it renders the browser's native validation message, or whatever your `validate` function returns. +- **Pass children** only to override the message. + + + +### `validationBehavior` + +Defaults to `'native'`, which uses the browser's constraint validation. Set `validationBehavior="aria"` when a form library owns validation state — react-hook-form in particular, where you also pass `isInvalid` and the message yourself. See the `ReactHookForm` story on the [Form page](/docs/components-forms-form--docs). + +## Layout and spacing + +Wrap fields in [`Form`](/docs/components-forms-form--docs) and let it own the rhythm. In its default vertical orientation it applies `gap: var(--lp-spacing-300)`. + + + +Two things to know: + +- `Form` sets `align-items: start`, so fields size to their content rather than filling the form. Constrain width on a wrapper when you need fields to line up. +- **`FieldGroup` uses a different scale** (`--lp-spacing-500`), so nesting one inside a `Form` mixes two spacing rhythms. Be deliberate about it. + +### `FieldGroup` is not like the others + +[`FieldGroup`](/docs/components-forms-fieldgroup--docs) predates the RAC conventions above. It renders a raw `
` and takes `title`, `errorMessage` and `isDisabled` as **string and boolean props** rather than composed children. + +It also propagates `isInvalid` to every field inside it, so setting `errorMessage` on a `FieldGroup` marks all its children invalid at once. Reach for it only when you genuinely need a `
` grouping; otherwise compose a `Form` with individual fields. + +## States + + + +## Content guidelines + +> **This section is a scaffold and needs an owner.** LaunchPad has no written copy standards today, and the guidance below is deliberately left blank rather than invented here — wording rules are a content design decision, not an engineering one. If a canonical LaunchDarkly content standard exists, this section should link to it rather than restate it. + +Questions this section needs to answer: + +- **Label capitalization** — sentence case or title case? Any trailing punctuation? +- **Helper text vs. placeholder** — when does guidance belong in `Text slot="description"` versus inside the input? (Placeholders disappear on input and are not a substitute for a label or for persistent guidance.) +- **Error message phrasing** — does the message state what went wrong, how to fix it, or both? Does it end in a period? Is "Please" used? +- **Required vs. optional marking** — mark required fields, or mark optional ones? See the gap noted below, since neither is currently rendered. +- **Button copy** — is the submit action named for what it does ("Save changes") or generic ("Submit")? + +For raw material, the conventions currently observable in our stories are: submit buttons say "Submit"; validation messages are sentence case with a trailing period ("Name is required."); placeholders read "Enter a value". + +## Accessibility + +Accessibility is a hard requirement — components must pass axe against WCAG 2.0/2.1 A and AA. + +RAC handles most of it for you, provided you compose correctly: + +- `Label` is associated with the control automatically. **There is no need for `htmlFor`.** +- `Text slot="description"` and `FieldError` are wired to the control via `aria-describedby` by virtue of their slots. Plain text placed in a field without a `slot` is *not* announced. +- `isRequired` sets both `aria-required` and the native `required` attribute. +- Keyboard interaction, focus management and error announcement on submit come from RAC. + +### Known gaps + +Three things are missing today. They are listed here so you can work around them, not because they are intended. + +1. **Required fields have no visible marker.** `isRequired` is announced to screen readers but nothing renders visually — `Label` has no `isRequired` awareness. The deprecated `@launchpad-ui/form` package had a `RequiredAsterisk` and an "(optional)" suffix; neither has a modern equivalent. Until one exists, put any marker in the `Label` children yourself. +2. **`FieldError` has no icon and no live region.** It is styled text only. The deprecated package rendered an alert icon with `aria-live="polite"`, so error announcement outside of form submission is weaker than it used to be. +3. **Helper text fails colour contrast inside picker items.** The `Select` and `ComboBox` stories currently suppress the axe `color-contrast` rule for `[slot="description"]` rather than fixing the token. Treat item-level descriptions as a known issue. + +## Related + +- [Form](/docs/components-forms-form--docs) · [TextField](/docs/components-forms-textfield--docs) · [NumberField](/docs/components-forms-numberfield--docs) · [SearchField](/docs/components-forms-searchfield--docs) +- [Checkbox](/docs/components-forms-checkbox--docs) · [CheckboxGroup](/docs/components-forms-checkboxgroup--docs) · [RadioGroup](/docs/components-forms-radiogroup--docs) · [Switch](/docs/components-forms-switch--docs) · [Slider](/docs/components-forms-slider--docs) +- [Select](/docs/components-pickers-select--docs) · [ComboBox](/docs/components-pickers-combobox--docs) · [FieldGroup](/docs/components-forms-fieldgroup--docs) +- [Label](/docs/components-content-label--docs) · [Text](/docs/components-content-text--docs) +- [React Aria Forms guide](https://react-aria.adobe.com/forms.html) diff --git a/packages/components/stories/guidelines/forms.stories.tsx b/packages/components/stories/guidelines/forms.stories.tsx new file mode 100644 index 000000000..b9f3b6997 --- /dev/null +++ b/packages/components/stories/guidelines/forms.stories.tsx @@ -0,0 +1,170 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; +import type { ComponentPropsWithoutRef, Fragment } from 'react'; + +import { vars } from '@launchpad-ui/vars'; + +import { Button } from '../../src/Button'; +import { Checkbox } from '../../src/Checkbox'; +import { CheckboxGroup } from '../../src/CheckboxGroup'; +import { FieldError } from '../../src/FieldError'; +import { Form } from '../../src/Form'; +import { Input } from '../../src/Input'; +import { Label } from '../../src/Label'; +import { Radio } from '../../src/Radio'; +import { RadioGroup } from '../../src/RadioGroup'; +import { Text } from '../../src/Text'; +import { TextField } from '../../src/TextField'; + +/** + * Examples for the `Guidelines/Forms` documentation page. + * + * These stories exist only to be embedded via `` in `Forms.mdx`, + * so the meta is tagged `['!dev', '!autodocs']` to keep them out of the sidebar. + * Writing them as real stories rather than fenced code blocks means the samples on + * the docs page are type-checked and cannot drift from the component APIs. + */ +const Container = (props: ComponentPropsWithoutRef) => <>{props.children}; + +const meta: Meta = { + component: Container, + decorators: [ + (Story) => ( +
+ +
+ ), + ], + argTypes: { + children: { + control: false, + }, + }, + tags: ['!dev', '!autodocs'], +}; + +export default meta; + +type Story = StoryObj; + +/** + * Every part of a field is a composed child, not a prop. From top to bottom: the + * `Label`, the `Input`, helper text via `Text slot="description"`, and `FieldError` + * for validation messages. + */ +export const Anatomy: Story = { + args: { + children: ( + + + + We'll only use this to send release notes. + + + ), + }, +}; + +/** + * `Form` owns the spacing between fields — `--lp-spacing-300` in the default + * vertical orientation. Prefer it over a hand-rolled flex container so field + * rhythm stays consistent. + */ +export const FieldSpacing: Story = { + args: { + children: ( +
+ + + + + + + + + + + +
+ ), + }, +}; + +/** + * `FieldError` takes no message prop. Leave it empty and it renders the browser's + * native validation message; submit this form without filling it in to see that. + * Pass children only when you need to override the message — for example when + * wiring up react-hook-form, which also needs `validationBehavior="aria"`. + */ +export const Validation: Story = { + args: { + children: ( +
+ + + + + + +
+ ), + }, +}; + +/** + * The same composition applies to grouped controls. `CheckboxGroup` and + * `RadioGroup` own the `Label`, helper text and `FieldError`; the individual + * `Checkbox` and `Radio` children carry only their own labels. + */ +export const GroupedControls: Story = { + args: { + children: ( +
+ + + Select every environment this applies to. + Development + Staging + Production + + + + + Immediate + Gradual + + +
+ ), + }, +}; + +/** + * Fields expose `isDisabled`, `isReadOnly` and `isInvalid` as boolean props. + * Note that `isRequired` produces no visible marker today — it only sets + * `aria-required` and the native `required` attribute. + */ +export const States: Story = { + args: { + children: ( +
+ + + + + + + + Enter a valid email address. + + + + + + + + + +
+ ), + }, +}; From dc0983fbd657c9bedf31532368578fe1ab23ec87 Mon Sep 17 00:00:00 2001 From: Caleb Winters Date: Tue, 28 Jul 2026 15:49:47 -0700 Subject: [PATCH 2/3] docs(components): move Forms doc to the Components/Forms group root Retitles the page from Guidelines/Forms to Components/Forms so it sits at the root of the group it describes: clicking "Forms" in the sidebar opens the overview, and expanding it lists the individual components. A docs entry whose title matches a folder path coexists with that folder's children without conflict. Files move alongside the component stories they document, so Forms.mdx and Forms.stories.tsx now sit next to Form.stories.tsx rather than in a separate guidelines directory. Their header comment calls out that these are cross-cutting form examples and not the Form component's own stories, since the singular and plural filenames are otherwise easy to confuse. The intro now frames Select, ComboBox, DateField and TimeField as the field types living elsewhere in the sidebar, rather than listing the components this page already nests. --- .../stories/{guidelines => }/Forms.mdx | 15 +++----- .../forms.stories.tsx => Forms.stories.tsx} | 36 ++++++++++--------- 2 files changed, 25 insertions(+), 26 deletions(-) rename packages/components/stories/{guidelines => }/Forms.mdx (95%) rename packages/components/stories/{guidelines/forms.stories.tsx => Forms.stories.tsx} (79%) diff --git a/packages/components/stories/guidelines/Forms.mdx b/packages/components/stories/Forms.mdx similarity index 95% rename from packages/components/stories/guidelines/Forms.mdx rename to packages/components/stories/Forms.mdx index 424ae8771..2e09113fe 100644 --- a/packages/components/stories/guidelines/Forms.mdx +++ b/packages/components/stories/Forms.mdx @@ -1,14 +1,8 @@ import { Meta, Canvas } from '@storybook/addon-docs/blocks'; -import { - Anatomy, - FieldSpacing, - GroupedControls, - States, - Validation, -} from './forms.stories'; +import { Anatomy, FieldSpacing, GroupedControls, States, Validation } from './Forms.stories'; - + # Forms @@ -16,12 +10,13 @@ How to compose, validate and lay out forms in LaunchPad. Form components are thin wrappers around [React Aria Components](https://react-aria.adobe.com/) (RAC). LaunchPad styles them and adds a small number of variant props; the behaviour, ARIA wiring and keyboard support come from RAC. When you need to know what a prop does, RAC's docs are the source of truth. -Form components are spread across three areas of this sidebar: +The components nested under this page cover most form needs, but three field types live elsewhere in the sidebar: -- **Components/Forms** — Form, TextField, NumberField, SearchField, Checkbox, CheckboxGroup, RadioGroup, Switch, Slider, FieldGroup - **Components/Pickers** — [Select](/docs/components-pickers-select--docs), [ComboBox](/docs/components-pickers-combobox--docs) - **Components/Date and Time** — [DateField](/docs/components-date-and-time-datefield--docs), [TimeField](/docs/components-date-and-time-timefield--docs) +Everything on this page applies to those too. + ## Anatomy A field is assembled from composed children: a label, the control, optional helper text, and a validation message. diff --git a/packages/components/stories/guidelines/forms.stories.tsx b/packages/components/stories/Forms.stories.tsx similarity index 79% rename from packages/components/stories/guidelines/forms.stories.tsx rename to packages/components/stories/Forms.stories.tsx index b9f3b6997..0fb058622 100644 --- a/packages/components/stories/guidelines/forms.stories.tsx +++ b/packages/components/stories/Forms.stories.tsx @@ -3,25 +3,29 @@ import type { ComponentPropsWithoutRef, Fragment } from 'react'; import { vars } from '@launchpad-ui/vars'; -import { Button } from '../../src/Button'; -import { Checkbox } from '../../src/Checkbox'; -import { CheckboxGroup } from '../../src/CheckboxGroup'; -import { FieldError } from '../../src/FieldError'; -import { Form } from '../../src/Form'; -import { Input } from '../../src/Input'; -import { Label } from '../../src/Label'; -import { Radio } from '../../src/Radio'; -import { RadioGroup } from '../../src/RadioGroup'; -import { Text } from '../../src/Text'; -import { TextField } from '../../src/TextField'; +import { Button } from '../src/Button'; +import { Checkbox } from '../src/Checkbox'; +import { CheckboxGroup } from '../src/CheckboxGroup'; +import { FieldError } from '../src/FieldError'; +import { Form } from '../src/Form'; +import { Input } from '../src/Input'; +import { Label } from '../src/Label'; +import { Radio } from '../src/Radio'; +import { RadioGroup } from '../src/RadioGroup'; +import { Text } from '../src/Text'; +import { TextField } from '../src/TextField'; /** - * Examples for the `Guidelines/Forms` documentation page. + * Examples embedded in `Forms.mdx`, the overview page at the root of the + * `Components/Forms` group. * - * These stories exist only to be embedded via `` in `Forms.mdx`, - * so the meta is tagged `['!dev', '!autodocs']` to keep them out of the sidebar. - * Writing them as real stories rather than fenced code blocks means the samples on - * the docs page are type-checked and cannot drift from the component APIs. + * These are cross-cutting form examples, not the `Form` component's own stories — + * those live in `Form.stories.tsx`. The meta is tagged `['!dev', '!autodocs']` so + * these contribute no sidebar entries and no Docs tab; they are reachable only + * through ``. + * + * They are written as real stories rather than fenced code blocks in the MDX so + * the samples on the page are type-checked and cannot drift from the component APIs. */ const Container = (props: ComponentPropsWithoutRef) => <>{props.children}; From ab6ee687e664d868eec89d94eaef10e458d2a72b Mon Sep 17 00:00:00 2001 From: Caleb Winters Date: Tue, 28 Jul 2026 16:17:01 -0700 Subject: [PATCH 3/3] build(storybook): enable GFM syntax in MDX docs pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MDX implements CommonMark, not GitHub Flavored Markdown, so table syntax in docs pages compiled to literal text — visible pipes and dashes rather than a table. Strikethrough, task lists and bare-URL autolinks fail the same way. Adds remark-gfm and passes it through addon-docs' mdxPluginOptions so GFM markdown renders as authored. Storybook styles no prose tables of its own; only the props argstable is themed. Without styling a GFM table renders with browser defaults, meaning no borders or padding, so this also adds table styles for docs prose. Those rules are scoped to direct children of the docs content container, which keeps them off tables rendered inside a Canvas by the Table component's own stories. They use --lp-* tokens rather than this file's hardcoded-hex convention because .sbdocs only exists in the preview frame, where the token CSS is loaded and [data-theme] flips the values. The compound class selector keeps specificity level with the argstable rules so the file stays free of new descending-specificity lint warnings. --- .storybook/main.ts | 15 +- .storybook/manager.css | 36 +++ package.json | 1 + pnpm-lock.yaml | 592 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 643 insertions(+), 1 deletion(-) diff --git a/.storybook/main.ts b/.storybook/main.ts index 0fa7921c3..9679641e2 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -1,6 +1,8 @@ import type { StorybookConfig } from '@storybook/react-vite'; import type { UserConfig } from 'vite'; +import remarkGfm from 'remark-gfm'; + const config: StorybookConfig = { stories: [ '../docs/stories/**/*.mdx', @@ -9,7 +11,18 @@ const config: StorybookConfig = { ], addons: [ '@storybook/addon-a11y', - '@storybook/addon-docs', + { + name: '@storybook/addon-docs', + options: { + // MDX only implements CommonMark, so GFM syntax — tables, strikethrough, + // task lists, bare-URL autolinks — renders as literal text without this. + mdxPluginOptions: { + mdxCompileOptions: { + remarkPlugins: [remarkGfm], + }, + }, + }, + }, '@storybook/addon-designs', '@storybook/addon-themes', 'storybook-addon-pseudo-states', diff --git a/.storybook/manager.css b/.storybook/manager.css index 3135e7519..0ad3d31c2 100644 --- a/.storybook/manager.css +++ b/.storybook/manager.css @@ -118,6 +118,42 @@ font-weight: 400 !important; /* matching --lp-font-weight-regular */ } +/* Prose tables in MDX docs pages. GFM tables (enabled via remark-gfm in main.ts) + render as bare elements that Storybook does not style at all — only + .docblock-argstable is themed, elsewhere in this file. + + Deliberately scoped to DIRECT children of .sbdocs-content: MDX renders top-level + prose elements there, while a nests story content deeper. That keeps + these rules off tables rendered by the Table component's own stories. + + These use --lp-* tokens rather than this file's hardcoded-hex convention because + .sbdocs only exists in the preview frame, where the token CSS is loaded and + [data-theme] flips the values for dark mode. Text color is deliberately left to + the .sbdocs prose rules below, which set it with !important for both themes. + + The .sbdocs.sbdocs-content compound matches the docs container (which carries both + classes) and keeps specificity level with the argstable rules above, so this does + not read as a descending-specificity conflict. */ +.sbdocs.sbdocs-content > table { + border-collapse: collapse; + width: 100%; + margin: var(--lp-spacing-400) 0; + font: var(--lp-text-body-2-regular); +} + +.sbdocs.sbdocs-content > table th, +.sbdocs.sbdocs-content > table td { + border: 1px solid var(--lp-color-border-ui-primary); + padding: var(--lp-spacing-200) var(--lp-spacing-300); + text-align: start; + vertical-align: top; +} + +.sbdocs.sbdocs-content > table th { + background-color: var(--lp-color-bg-ui-secondary); + font: var(--lp-text-label-1-semibold); +} + /* Only target Storybook-specific prism code blocks */ .docs-dark .prism-code:not([class*='code_']), .dark-theme .docblock-argstable .prism-code { diff --git a/package.json b/package.json index 0b305ef70..11cb86caa 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "react": "19.2.6", "react-dom": "19.2.6", "react-router": "7.15.1", + "remark-gfm": "^4.0.1", "rollup-plugin-pure": "^0.4.0", "storybook": "^9.1.19", "storybook-addon-pseudo-states": "^9.1.17", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f93a9392f..b93932ea3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -128,6 +128,9 @@ importers: react-router: specifier: 7.15.1 version: 7.15.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 rollup-plugin-pure: specifier: ^0.4.0 version: 0.4.0(rollup@4.60.4) @@ -2209,6 +2212,9 @@ packages: '@types/css-modules@1.0.5': resolution: {integrity: sha512-oeKafs/df9lwOvtfiXVliZsocFVOexK9PZtLQWuPeuVCFR7jwiqlg60lu80JTe5NFNtH3tnV6Fs/ySR8BUPHAw==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -2221,9 +2227,15 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -2250,6 +2262,9 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/vscode@1.120.0': resolution: {integrity: sha512-feaT4Rst+FkTch5zz/ZbNCxoIvo55YU80Be2kiL7OJcod4+CUYf2lUBPdIJzozNnSEMq1VRTGrWEcCGFB3fBmA==} @@ -2490,6 +2505,9 @@ packages: axios@1.17.0: resolution: {integrity: sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==} + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2575,6 +2593,9 @@ packages: caniuse-lite@1.0.30001793: resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} @@ -2594,6 +2615,9 @@ packages: change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} @@ -2834,6 +2858,9 @@ packages: decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + dedent@1.7.2: resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: @@ -2884,6 +2911,9 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3043,6 +3073,10 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -3073,6 +3107,9 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -3813,6 +3850,9 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} @@ -3844,10 +3884,46 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} @@ -3870,6 +3946,90 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -4405,6 +4565,15 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -4920,6 +5089,9 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} @@ -4995,6 +5167,21 @@ packages: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -5042,6 +5229,12 @@ packages: util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@6.0.0: resolution: {integrity: sha512-oj4PVrT+pDh6GYf5wfUXkcZyekYS8kKPfLPXVl8qe324Ec6l4K2DUKNadRbZ3LQl0qGcDz+PyOo7ZAh00Y+JjQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5265,6 +5458,9 @@ packages: zod@3.25.58: resolution: {integrity: sha512-DVLmMQzSZwNYzQoMaM3MQWnxr2eq+AtM9Hx3w1/Yl0pH8sLTSjN4jGP7w6f7uand6Hw44tsnSu1hz1AOA6qI2Q==} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: '@adobe/css-tools@4.3.3': @@ -6695,6 +6891,10 @@ snapshots: '@types/css-modules@1.0.5': {} + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} '@types/doctrine@0.0.9': {} @@ -6703,8 +6903,14 @@ snapshots: '@types/estree@1.0.9': {} + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/mdx@2.0.13': {} + '@types/ms@2.1.0': {} + '@types/node@12.20.55': {} '@types/node@22.19.19': @@ -6731,6 +6937,8 @@ snapshots: '@types/trusted-types@2.0.7': {} + '@types/unist@3.0.3': {} + '@types/vscode@1.120.0': {} '@vanilla-extract/babel-plugin-debug-ids@1.2.2': @@ -7082,6 +7290,8 @@ snapshots: - debug - supports-color + bail@2.0.2: {} + balanced-match@1.0.2: {} balanced-match@4.0.4: {} @@ -7177,6 +7387,8 @@ snapshots: caniuse-lite@1.0.30001793: {} + ccount@2.0.1: {} + chai@5.3.3: dependencies: assertion-error: 2.0.1 @@ -7196,6 +7408,8 @@ snapshots: change-case@5.4.4: {} + character-entities@2.0.2: {} + chardet@2.1.1: {} check-error@2.1.3: {} @@ -7407,6 +7621,10 @@ snapshots: decimal.js@10.6.0: {} + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + dedent@1.7.2: {} deep-eql@5.0.2: {} @@ -7441,6 +7659,10 @@ snapshots: detect-libc@2.1.2: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + diff-sequences@29.6.3: {} dir-glob@3.0.1: @@ -7669,6 +7891,8 @@ snapshots: escape-string-regexp@1.0.5: {} + escape-string-regexp@5.0.0: {} + esprima@4.0.1: {} estree-walker@2.0.2: {} @@ -7690,6 +7914,8 @@ snapshots: expect-type@1.3.0: {} + extend@3.0.2: {} + extendable-error@0.1.7: {} fast-deep-equal@3.1.3: {} @@ -8446,6 +8672,8 @@ snapshots: strip-ansi: 7.2.0 wrap-ansi: 9.0.2 + longest-streak@3.1.0: {} + loupe@3.2.1: {} lru-cache@10.4.3: {} @@ -8478,8 +8706,112 @@ snapshots: dependencies: semver: 7.8.1 + markdown-table@3.0.4: {} + math-intrinsics@1.1.0: {} + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdn-data@2.0.28: {} mdn-data@2.27.1: {} @@ -8509,6 +8841,197 @@ snapshots: merge2@1.4.1: {} + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -9104,6 +9627,32 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -9681,6 +10230,8 @@ snapshots: tree-kill@1.2.2: {} + trough@2.2.0: {} + ts-dedent@2.2.0: {} ts-morph@27.0.2: @@ -9785,6 +10336,35 @@ snapshots: unicorn-magic@0.1.0: {} + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + universalify@0.1.2: {} universalify@0.2.0: {} @@ -9835,6 +10415,16 @@ snapshots: is-typed-array: 1.1.15 which-typed-array: 1.1.21 + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + vite-node@6.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.19)(esbuild@0.27.7)(jiti@2.6.1)(less@4.6.4)(sass@1.100.0)(stylus@0.62.0)(tsx@4.22.3)(yaml@2.9.0): dependencies: cac: 7.0.0 @@ -10070,3 +10660,5 @@ snapshots: zod: 3.25.58 zod@3.25.58: {} + + zwitch@2.0.4: {}