From 8714a7eb3061b71b24d9955134ff2a33c21e4fdb Mon Sep 17 00:00:00 2001 From: Kirill Zaytsev Date: Sun, 22 Feb 2026 23:01:41 +0400 Subject: [PATCH 01/54] chore: Drafts directory ignore rule was added --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 7e65074..18e828f 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ node_modules/ .yarnrc.yml *storybook.log .env +drafts/ From a22e35b85ec7395538b02b18c4da074378a0116f Mon Sep 17 00:00:00 2001 From: Kirill Zaytsev Date: Mon, 23 Feb 2026 00:11:13 +0400 Subject: [PATCH 02/54] docs: Added drafts mixed-format documentation workflow rules --- AGENTS.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index 33ec614..3cffad9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,6 +15,14 @@ files include code covered by eslint rules (for example `*.js`, `*.ts`, and similar source files). Do not run `make eslint` for markdown-only changes (for example `*.md`). +- When working on files under `drafts/`, keep documentation mixed-format: + narrative context in `*.md` plus machine-readable `*.yaml` sidecars for + structured entities (for example tokens, decisions, boundaries, variation + axes, invariants, confidence, and source references). +- For `drafts/` work, create and update these YAML sidecars proactively + without requiring explicit user confirmation. +- For `drafts/` work, automatically maintain links from the main draft + markdown file to related YAML sidecars. - Getter/helper functions must be side-effect free. Side effects are allowed only by prior agreement and only when there are strong, explicit reasons. From 7fd37b3c127e16fe334ee3b3b296ad3f5d836e41 Mon Sep 17 00:00:00 2001 From: Kirill Zaytsev Date: Mon, 23 Feb 2026 20:19:09 +0400 Subject: [PATCH 03/54] feat(m3-vue): Added Experimental Surface stories and orchestration tests --- m3-vue/src/experimental/M3Surface.vue | 471 +++++++++++ m3-vue/storybook/components/M3Surface.mdx | 13 + .../storybook/components/M3Surface.stories.ts | 98 +++ .../examples/surface/SurfaceCardPageMorph.vue | 514 ++++++++++++ .../surface/SurfaceNestedDialogsChain.vue | 449 +++++++++++ .../surface/SurfaceSideSheetAlwaysModal.vue | 479 +++++++++++ .../SurfaceSideSheetDismissToRemove.vue | 601 ++++++++++++++ .../surface/SurfaceSideSheetModalToWindow.vue | 751 ++++++++++++++++++ .../surface/SurfaceSideSheetMorph.vue | 592 ++++++++++++++ m3-vue/tests/M3Surface.e2e.ts | 200 +++++ m3-vue/tests/M3Surface.test.ts | 111 +++ m3-vue/tests/M3SurfaceStories.e2e.ts | 427 ++++++++++ .../fixtures/SurfaceExperimentHarness.vue | 542 +++++++++++++ 13 files changed, 5248 insertions(+) create mode 100644 m3-vue/src/experimental/M3Surface.vue create mode 100644 m3-vue/storybook/components/M3Surface.mdx create mode 100644 m3-vue/storybook/components/M3Surface.stories.ts create mode 100644 m3-vue/storybook/examples/surface/SurfaceCardPageMorph.vue create mode 100644 m3-vue/storybook/examples/surface/SurfaceNestedDialogsChain.vue create mode 100644 m3-vue/storybook/examples/surface/SurfaceSideSheetAlwaysModal.vue create mode 100644 m3-vue/storybook/examples/surface/SurfaceSideSheetDismissToRemove.vue create mode 100644 m3-vue/storybook/examples/surface/SurfaceSideSheetModalToWindow.vue create mode 100644 m3-vue/storybook/examples/surface/SurfaceSideSheetMorph.vue create mode 100644 m3-vue/tests/M3Surface.e2e.ts create mode 100644 m3-vue/tests/M3Surface.test.ts create mode 100644 m3-vue/tests/M3SurfaceStories.e2e.ts create mode 100644 m3-vue/tests/fixtures/SurfaceExperimentHarness.vue diff --git a/m3-vue/src/experimental/M3Surface.vue b/m3-vue/src/experimental/M3Surface.vue new file mode 100644 index 0000000..37acd88 --- /dev/null +++ b/m3-vue/src/experimental/M3Surface.vue @@ -0,0 +1,471 @@ + + + + + diff --git a/m3-vue/storybook/components/M3Surface.mdx b/m3-vue/storybook/components/M3Surface.mdx new file mode 100644 index 0000000..5650ce0 --- /dev/null +++ b/m3-vue/storybook/components/M3Surface.mdx @@ -0,0 +1,13 @@ +import { Meta } from '@storybook/addon-docs/blocks' +import * as M3SurfaceStories from './M3Surface.stories' + + + +# Surfaces + +- [Side Sheet Docked To Modal](?path=/story/components-m3surface--side-sheet-docked-to-modal) +- [Card Replacing Page](?path=/story/components-m3surface--card-replacing-page) +- [Side Sheet Modal Dismiss Removes Surface](?path=/story/components-m3surface--side-sheet-modal-dismiss-removes-surface) +- [Side Sheet Always Modal Toggle](?path=/story/components-m3surface--side-sheet-always-modal-toggle) +- [Side Sheet Modal To Window](?path=/story/components-m3surface--side-sheet-modal-to-window) +- [Nested Dialogs Chain](?path=/story/components-m3surface--nested-dialogs-chain) diff --git a/m3-vue/storybook/components/M3Surface.stories.ts b/m3-vue/storybook/components/M3Surface.stories.ts new file mode 100644 index 0000000..dd0af65 --- /dev/null +++ b/m3-vue/storybook/components/M3Surface.stories.ts @@ -0,0 +1,98 @@ +import type { + Meta, + StoryObj, +} from '@storybook/vue3' + +import M3Surface from '@/experimental/M3Surface.vue' + +import SurfaceCardPageMorph from '../examples/surface/SurfaceCardPageMorph.vue' +import SurfaceNestedDialogsChain from '../examples/surface/SurfaceNestedDialogsChain.vue' +import SurfaceSideSheetAlwaysModal from '../examples/surface/SurfaceSideSheetAlwaysModal.vue' +import SurfaceSideSheetDismissToRemove from '../examples/surface/SurfaceSideSheetDismissToRemove.vue' +import SurfaceSideSheetModalToWindow from '../examples/surface/SurfaceSideSheetModalToWindow.vue' +import SurfaceSideSheetMorph from '../examples/surface/SurfaceSideSheetMorph.vue' + +const meta = { + title: 'Components/M3Surface', + component: M3Surface, + + parameters: { + layout: 'fullscreen', + }, +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const SideSheetDockedToModal: Story = { + render: () => ({ + components: { + SurfaceSideSheetMorph, + }, + + template: ` + + `, + }), +} + +export const CardReplacingPage: Story = { + render: () => ({ + components: { + SurfaceCardPageMorph, + }, + + template: ` + + `, + }), +} + +export const SideSheetModalDismissRemovesSurface: Story = { + render: () => ({ + components: { + SurfaceSideSheetDismissToRemove, + }, + + template: ` + + `, + }), +} + +export const SideSheetAlwaysModalToggle: Story = { + render: () => ({ + components: { + SurfaceSideSheetAlwaysModal, + }, + + template: ` + + `, + }), +} + +export const SideSheetModalToWindow: Story = { + render: () => ({ + components: { + SurfaceSideSheetModalToWindow, + }, + + template: ` + + `, + }), +} + +export const NestedDialogsChain: Story = { + render: () => ({ + components: { + SurfaceNestedDialogsChain, + }, + + template: ` + + `, + }), +} diff --git a/m3-vue/storybook/examples/surface/SurfaceCardPageMorph.vue b/m3-vue/storybook/examples/surface/SurfaceCardPageMorph.vue new file mode 100644 index 0000000..eaddf14 --- /dev/null +++ b/m3-vue/storybook/examples/surface/SurfaceCardPageMorph.vue @@ -0,0 +1,514 @@ + + + + + diff --git a/m3-vue/storybook/examples/surface/SurfaceNestedDialogsChain.vue b/m3-vue/storybook/examples/surface/SurfaceNestedDialogsChain.vue new file mode 100644 index 0000000..c4e2838 --- /dev/null +++ b/m3-vue/storybook/examples/surface/SurfaceNestedDialogsChain.vue @@ -0,0 +1,449 @@ + + + + + diff --git a/m3-vue/storybook/examples/surface/SurfaceSideSheetAlwaysModal.vue b/m3-vue/storybook/examples/surface/SurfaceSideSheetAlwaysModal.vue new file mode 100644 index 0000000..560df11 --- /dev/null +++ b/m3-vue/storybook/examples/surface/SurfaceSideSheetAlwaysModal.vue @@ -0,0 +1,479 @@ + + + + + diff --git a/m3-vue/storybook/examples/surface/SurfaceSideSheetDismissToRemove.vue b/m3-vue/storybook/examples/surface/SurfaceSideSheetDismissToRemove.vue new file mode 100644 index 0000000..12b7199 --- /dev/null +++ b/m3-vue/storybook/examples/surface/SurfaceSideSheetDismissToRemove.vue @@ -0,0 +1,601 @@ + + + + + diff --git a/m3-vue/storybook/examples/surface/SurfaceSideSheetModalToWindow.vue b/m3-vue/storybook/examples/surface/SurfaceSideSheetModalToWindow.vue new file mode 100644 index 0000000..ccf6649 --- /dev/null +++ b/m3-vue/storybook/examples/surface/SurfaceSideSheetModalToWindow.vue @@ -0,0 +1,751 @@ + + + + + diff --git a/m3-vue/storybook/examples/surface/SurfaceSideSheetMorph.vue b/m3-vue/storybook/examples/surface/SurfaceSideSheetMorph.vue new file mode 100644 index 0000000..72e3f59 --- /dev/null +++ b/m3-vue/storybook/examples/surface/SurfaceSideSheetMorph.vue @@ -0,0 +1,592 @@ + + + + + diff --git a/m3-vue/tests/M3Surface.e2e.ts b/m3-vue/tests/M3Surface.e2e.ts new file mode 100644 index 0000000..3745a74 --- /dev/null +++ b/m3-vue/tests/M3Surface.e2e.ts @@ -0,0 +1,200 @@ +import type { App } from 'vue' + +import { + createApp, + nextTick, +} from 'vue' + +import { page } from 'vitest/browser' + +import SurfaceExperimentHarness from './fixtures/SurfaceExperimentHarness.vue' + +const RUN_ID = 'EXP-2026-02-23-surface-e2e-002h-001' +const SCREENSHOT_DIR = `../../drafts/experiment/runs/${RUN_ID}/screenshots/e2e` + +type HarnessMount = { + app: App; + mountPoint: HTMLDivElement; +} + +const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)) + +const waitFor = async (assertion: () => void, timeoutMs = 1600) => { + const startedAt = Date.now() + let lastError: unknown + + while (Date.now() - startedAt < timeoutMs) { + try { + assertion() + return + } catch (error) { + lastError = error + await delay(12) + } + } + + throw lastError ?? new Error('waitFor timeout') +} + +const mountHarness = (): HarnessMount => { + const mountPoint = document.createElement('div') + mountPoint.setAttribute('data-testid', 'surface-harness-mount') + document.body.append(mountPoint) + + const app = createApp(SurfaceExperimentHarness) + app.mount(mountPoint) + + return { + app, + mountPoint, + } +} + +const collectRectSeries = async (element: HTMLElement, durationMs = 380, stepMs = 32) => { + const points: Array<{ width: number, height: number }> = [] + const startedAt = performance.now() + + while (performance.now() - startedAt < durationMs) { + const rect = element.getBoundingClientRect() + points.push({ + width: rect.width, + height: rect.height, + }) + await delay(stepMs) + } + + return points +} + +const deltas = (values: number[]) => values.slice(1).map((value, index) => value - values[index]) + +const click = (selector: string) => { + const element = document.querySelector(selector) as HTMLButtonElement | null + if (!element) { + throw new Error(`Element not found: ${selector}`) + } + + element.dispatchEvent(new MouseEvent('click', { bubbles: true })) +} + +const capture = async (name: string) => { + await page.screenshot({ + path: `${SCREENSHOT_DIR}/${name}.png`, + }) +} + +describe('m3-vue/surface e2e', () => { + let mounted: HarnessMount | null = null + + beforeEach(async () => { + await page.viewport(1440, 1024) + mounted = mountHarness() + }) + + afterEach(() => { + mounted?.app.unmount() + mounted?.mountPoint.remove() + mounted = null + document.body.innerHTML = '' + }) + + test('orchestrates multiple roles and morphs docked side-sheet to modal without layout jerk', async () => { + await waitFor(() => { + const root = document.querySelector('[data-testid="surface-exp-root"]') + expect(root).not.toBeNull() + }) + + const staticRoles = [ + 'surface-container-lowest', + 'surface-container-low', + 'surface-container-high', + 'surface-dim', + ] + + staticRoles.forEach((role) => { + const block = document.querySelector(`[data-testid="static-role-${role}"]`) as HTMLElement | null + expect(block).not.toBeNull() + expect(block?.classList.contains(`m3-surface_role-${role}`)).toBe(true) + }) + + const content = document.querySelector('[data-testid="sheet-layout-content"]') as HTMLElement + const beforeRect = content.getBoundingClientRect() + + await capture('scenario-a-side-sheet-before') + + click('[data-testid="sheet-to-modal"]') + await nextTick() + + const widthSeries = (await collectRectSeries(content, 560, 32)).map(point => point.width) + const widthDeltas = deltas(widthSeries) + + await waitFor(() => { + const modalSheet = document.querySelector('[data-testid="orchestrated-side-sheet"][role="dialog"]') + const scrim = document.querySelector('.m3-surface__scrim') + expect(modalSheet).not.toBeNull() + expect(scrim).not.toBeNull() + }) + + await delay(180) + await capture('scenario-a-side-sheet-mid') + + expect(widthDeltas.some(delta => delta > 0)).toBe(true) + expect(Math.min(...widthDeltas)).toBeGreaterThan(-6) + expect(Math.max(...widthDeltas)).toBeLessThan(120) + + await delay(220) + const afterRect = content.getBoundingClientRect() + expect(afterRect.width).toBeGreaterThan(beforeRect.width + 220) + + await capture('scenario-a-side-sheet-after') + }) + + test('expands card-like surface into page-like container with reserved layout zones', async () => { + await waitFor(() => { + const card = document.querySelector('[data-testid="orchestrated-card-surface"]') as HTMLElement | null + expect(card).not.toBeNull() + }) + + const canvas = document.querySelector('[data-testid="card-canvas"]') as HTMLElement + const overlayWrap = document.querySelector('[data-testid="card-overlay-wrap"]') as HTMLElement + const beforeRect = overlayWrap.getBoundingClientRect() + + expect(beforeRect.width).toBeGreaterThan(280) + expect(beforeRect.height).toBeGreaterThan(180) + + await capture('scenario-b-card-before') + + click('[data-testid="card-to-page"]') + await nextTick() + + await delay(120) + await capture('scenario-b-card-mid') + + const rectSeries = await collectRectSeries(overlayWrap, 380, 32) + const widths = rectSeries.map(point => point.width) + const heights = rectSeries.map(point => point.height) + + const widthDeltas = deltas(widths) + const heightDeltas = deltas(heights) + + expect(widthDeltas.some(delta => delta > 0)).toBe(true) + expect(heightDeltas.some(delta => delta > 0)).toBe(true) + expect(Math.min(...widthDeltas)).toBeGreaterThan(-6) + expect(Math.min(...heightDeltas)).toBeGreaterThan(-6) + expect(Math.max(...widthDeltas)).toBeLessThan(140) + expect(Math.max(...heightDeltas)).toBeLessThan(140) + + await delay(240) + const afterRect = overlayWrap.getBoundingClientRect() + const canvasRect = canvas.getBoundingClientRect() + + expect(afterRect.width).toBeGreaterThan(canvasRect.width - 44) + expect(afterRect.height).toBeGreaterThan(canvasRect.height - 44) + + const morphedSurface = document.querySelector('[data-testid="orchestrated-card-surface"]') as HTMLElement + expect(morphedSurface.classList.contains('m3-surface_role-surface')).toBe(true) + expect(morphedSurface.style.borderTopLeftRadius).toBe('0px') + + await capture('scenario-b-card-after') + }) +}) diff --git a/m3-vue/tests/M3Surface.test.ts b/m3-vue/tests/M3Surface.test.ts new file mode 100644 index 0000000..f02992e --- /dev/null +++ b/m3-vue/tests/M3Surface.test.ts @@ -0,0 +1,111 @@ +import { + fireEvent, + render, + screen, +} from '@testing-library/vue' + +import M3Surface from '@/experimental/M3Surface.vue' + +describe('m3-vue/experimental/surface', () => { + test('applies deterministic default contract', () => { + render(M3Surface, { + slots: { + default: 'Surface body', + }, + }) + + const surface = screen.getByRole('region') + + expect(surface.classList.contains('m3-surface')).toBe(true) + expect(surface.style.width).toBe('100%') + expect(surface.style.height).toBe('100%') + expect(surface.style.margin).toBe('') + expect(surface.style.padding).toBe('') + expect(surface.style.borderTopLeftRadius).toBe('0px') + expect(surface.style.borderTopRightRadius).toBe('0px') + expect(surface.style.borderBottomRightRadius).toBe('0px') + expect(surface.style.borderBottomLeftRadius).toBe('0px') + expect(surface.style.boxSizing).toBe('') + }) + + test('supports global and per-corner rounding overrides', () => { + render(M3Surface, { + props: { + rounding: 16, + roundingTopLeft: 4, + roundingBottomRight: '24px', + }, + }) + + const surface = screen.getByRole('region') + + expect(surface.style.borderTopLeftRadius).toBe('4px') + expect(surface.style.borderTopRightRadius).toBe('16px') + expect(surface.style.borderBottomRightRadius).toBe('24px') + expect(surface.style.borderBottomLeftRadius).toBe('16px') + }) + + test('emits close request and dismiss on scrim click in modal mode', async () => { + const view = render(M3Surface, { + props: { + mode: 'modal', + shown: true, + }, + slots: { + default: 'Modal body', + }, + }) + + const scrim = document.body.querySelector('.m3-surface__scrim') as HTMLElement + + await fireEvent.click(scrim) + + expect(view.emitted()['update:shown']?.[0]).toEqual([false]) + expect(view.emitted().dismiss?.[0]).toEqual([]) + }) + + test('anchors modal surface to center with fixed positioning', () => { + render(M3Surface, { + props: { + mode: 'modal', + shown: true, + anchor: 'center', + width: 320, + height: 240, + fillWidth: false, + fillHeight: false, + }, + }) + + const surface = screen.getByRole('dialog') + + expect(surface.style.position).toBe('fixed') + expect(surface.style.top).toBe('50%') + expect(surface.style.left).toBe('50%') + expect(surface.style.transform).toContain('translate(-50%, -50%)') + expect(surface.style.width).toBe('320px') + expect(surface.style.height).toBe('240px') + }) + + test('maps auto surface role from elevation and allows explicit role override', async () => { + const view = render(M3Surface, { + props: { + elevation: 3, + }, + }) + + let surface = screen.getByRole('region') + + expect(surface.classList.contains('m3-surface_role-surface-container-high')).toBe(true) + + await view.rerender({ + elevation: 3, + surfaceRole: 'surface-bright', + }) + + surface = screen.getByRole('region') + + expect(surface.classList.contains('m3-surface_role-surface-bright')).toBe(true) + expect(surface.classList.contains('m3-surface_role-surface-container-high')).toBe(false) + }) +}) diff --git a/m3-vue/tests/M3SurfaceStories.e2e.ts b/m3-vue/tests/M3SurfaceStories.e2e.ts new file mode 100644 index 0000000..c823bba --- /dev/null +++ b/m3-vue/tests/M3SurfaceStories.e2e.ts @@ -0,0 +1,427 @@ +import type { + App, + Component, +} from 'vue' + +import { + createApp, + h, + nextTick, +} from 'vue' + +import { page } from 'vitest/browser' + +import SurfaceCardPageMorph from '../storybook/examples/surface/SurfaceCardPageMorph.vue' +import SurfaceNestedDialogsChain from '../storybook/examples/surface/SurfaceNestedDialogsChain.vue' +import SurfaceSideSheetAlwaysModal from '../storybook/examples/surface/SurfaceSideSheetAlwaysModal.vue' +import SurfaceSideSheetModalToWindow from '../storybook/examples/surface/SurfaceSideSheetModalToWindow.vue' +import SurfaceSideSheetMorph from '../storybook/examples/surface/SurfaceSideSheetMorph.vue' + +type MountedStory = { + app: App; + mountPoint: HTMLDivElement; +} + +const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)) + +const waitFor = async (assertion: () => void, timeoutMs = 1800) => { + const startedAt = Date.now() + let lastError: unknown + + while (Date.now() - startedAt < timeoutMs) { + try { + assertion() + return + } catch (error) { + lastError = error + await delay(14) + } + } + + throw lastError ?? new Error('waitFor timeout') +} + +const mountStory = (component: Component): MountedStory => { + const mountPoint = document.createElement('div') + mountPoint.setAttribute('data-testid', 'surface-story-mount') + document.body.append(mountPoint) + + const app = createApp({ + render: () => h(component), + }) + + app.mount(mountPoint) + + return { + app, + mountPoint, + } +} + +const query = (selector: string) => { + const element = document.querySelector(selector) as T | null + if (!element) { + throw new Error(`Element not found: ${selector}`) + } + + return element +} + +const click = (selector: string) => { + query(selector).dispatchEvent(new MouseEvent('click', { + bubbles: true, + cancelable: true, + })) +} + +const collectSeries = async (reader: () => number, durationMs = 360, stepMs = 24) => { + const values: number[] = [] + const startedAt = performance.now() + + while (performance.now() - startedAt < durationMs) { + values.push(reader()) + await delay(stepMs) + } + + return values +} + +const deltas = (values: number[]) => values.slice(1).map((value, index) => value - values[index]) + +const toNumber = (raw: string) => { + const value = Number.parseFloat(raw) + + if (Number.isNaN(value)) { + throw new Error(`Expected numeric CSS value, got "${raw}"`) + } + + return value +} + +const matrixTranslateY = (element: HTMLElement) => { + const transform = getComputedStyle(element).transform + + if (!transform || transform === 'none') { + return 0 + } + + const matrix3d = transform.match(/^matrix3d\((.+)\)$/) + if (matrix3d) { + const values = matrix3d[1].split(',').map(part => Number.parseFloat(part.trim())) + + return values[13] ?? 0 + } + + const matrix2d = transform.match(/^matrix\((.+)\)$/) + if (matrix2d) { + const values = matrix2d[1].split(',').map(part => Number.parseFloat(part.trim())) + + return values[5] ?? 0 + } + + return 0 +} + +const expectCentered = (element: HTMLElement, tolerancePx = 8) => { + const rect = element.getBoundingClientRect() + const centerX = rect.left + (rect.width / 2) + const centerY = rect.top + (rect.height / 2) + + expect(Math.abs(centerX - (window.innerWidth / 2))).toBeLessThanOrEqual(tolerancePx) + expect(Math.abs(centerY - (window.innerHeight / 2))).toBeLessThanOrEqual(tolerancePx) +} + +describe('m3-vue/surface stories e2e', () => { + let mounted: MountedStory | null = null + + beforeEach(async () => { + await page.viewport(1440, 1024) + }) + + afterEach(() => { + mounted?.app.unmount() + mounted?.mountPoint.remove() + mounted = null + document.body.innerHTML = '' + }) + + test('keeps side-sheet docked->modal->docked roundtrip smooth and stateful', async () => { + mounted = mountStory(SurfaceSideSheetMorph) + + await waitFor(() => { + expect(document.querySelector('[data-testid="surface-morph-docked-sheet"]')).not.toBeNull() + }) + + const root = query('[data-testid="surface-morph-root"]') + const content = query('[data-testid="surface-morph-content-grid"]') + const beforeWidth = content.getBoundingClientRect().width + + click('[data-testid="surface-morph-toggle"]') + await nextTick() + + const expandSeries = await collectSeries(() => query('[data-testid="surface-morph-content-grid"]').getBoundingClientRect().width, 440, 28) + const expandDeltas = deltas(expandSeries) + + await waitFor(() => { + expect(root.getAttribute('data-sheet-modal')).toBe('true') + expect(document.querySelector('[data-testid="surface-morph-modal-sheet"]')).not.toBeNull() + expect(document.querySelector('.m3-surface__scrim')).not.toBeNull() + }) + + const modalWidth = content.getBoundingClientRect().width + expect(modalWidth).toBeGreaterThan(beforeWidth + 220) + expect(expandDeltas.some(delta => delta > 0.2)).toBe(true) + expect(Math.min(...expandDeltas)).toBeGreaterThan(-8) + + click('[data-testid="surface-morph-toggle"]') + await nextTick() + + const collapseSeries = await collectSeries(() => query('[data-testid="surface-morph-content-grid"]').getBoundingClientRect().width, 1320, 32) + const collapseDeltas = deltas(collapseSeries) + + await waitFor(() => { + expect(root.getAttribute('data-sheet-modal')).toBe('false') + expect(document.querySelector('[data-testid="surface-morph-docked-sheet"]')).not.toBeNull() + expect(document.querySelector('[data-testid="surface-morph-modal-sheet"]')).toBeNull() + }, 2200) + + await delay(340) + + const afterWidth = content.getBoundingClientRect().width + expect(Math.abs(afterWidth - beforeWidth)).toBeLessThan(16) + expect(collapseDeltas.some(delta => delta < -0.2)).toBe(true) + expect(Math.max(...collapseDeltas)).toBeLessThan(34) + }) + + test('keeps card->page->card geometry and layer choreography stable', async () => { + mounted = mountStory(SurfaceCardPageMorph) + + await waitFor(() => { + expect(document.querySelector('[data-testid="surface-card-origin"]')).not.toBeNull() + }) + + const root = query('[data-testid="surface-card-page-root"]') + const canvas = query('[data-testid="surface-card-canvas"]') + const overlayWrap = query('[data-testid="surface-card-overlay-wrap"]') + const originBefore = query('[data-testid="surface-card-origin"]').getBoundingClientRect() + + expect(document.querySelector('[data-testid="surface-card-grid"]')).not.toBeNull() + + click('[data-testid="surface-card-toggle"]') + await nextTick() + + await delay(120) + expect(document.querySelector('[data-testid="surface-card-grid"]')).not.toBeNull() + + const widthSeries = await collectSeries(() => query('[data-testid="surface-card-overlay-wrap"]').getBoundingClientRect().width, 380, 28) + const heightSeries = await collectSeries(() => query('[data-testid="surface-card-overlay-wrap"]').getBoundingClientRect().height, 380, 28) + const widthDeltas = deltas(widthSeries) + const heightDeltas = deltas(heightSeries) + + expect(widthDeltas.some(delta => delta > 0.2) || heightDeltas.some(delta => delta > 0.2)).toBe(true) + expect(Math.min(...widthDeltas)).toBeGreaterThan(-8) + expect(Math.min(...heightDeltas)).toBeGreaterThan(-8) + + await waitFor(() => { + expect(root.getAttribute('data-card-expanded')).toBe('true') + expect(document.querySelector('[data-testid="surface-card-grid"]')).toBeNull() + }, 2200) + + const expandedRect = overlayWrap.getBoundingClientRect() + const canvasRect = canvas.getBoundingClientRect() + expect(expandedRect.width).toBeGreaterThan(canvasRect.width - 6) + expect(expandedRect.height).toBeGreaterThan(canvasRect.height - 6) + + click('[data-testid="surface-card-toggle"]') + await nextTick() + + await delay(80) + expect(document.querySelector('[data-testid="surface-card-grid"]')).not.toBeNull() + + const collapseWidthSeries = await collectSeries(() => query('[data-testid="surface-card-overlay-wrap"]').getBoundingClientRect().width, 420, 28) + const collapseHeightSeries = await collectSeries(() => query('[data-testid="surface-card-overlay-wrap"]').getBoundingClientRect().height, 420, 28) + const collapseWidthDeltas = deltas(collapseWidthSeries) + const collapseHeightDeltas = deltas(collapseHeightSeries) + + expect(collapseWidthDeltas.some(delta => delta < -0.2)).toBe(true) + expect(collapseWidthDeltas.some(delta => delta < -0.2) || collapseHeightDeltas.some(delta => delta < -0.2)).toBe(true) + expect(Math.max(...collapseWidthDeltas)).toBeLessThan(42) + expect(Math.max(...collapseHeightDeltas)).toBeLessThan(42) + + await waitFor(() => { + expect(root.getAttribute('data-card-expanded')).toBe('false') + expect(document.querySelector('[data-testid="surface-card-grid"]')).not.toBeNull() + }, 2200) + + const originAfter = query('[data-testid="surface-card-origin"]').getBoundingClientRect() + const collapsedRect = overlayWrap.getBoundingClientRect() + + expect(Math.abs(collapsedRect.width - originAfter.width)).toBeLessThan(12) + expect(Math.abs(collapsedRect.height - originAfter.height)).toBeLessThan(12) + expect(Math.abs(originAfter.width - originBefore.width)).toBeLessThan(8) + expect(Math.abs(originAfter.height - originBefore.height)).toBeLessThan(8) + }) + + test('reopens always-modal side-sheet with animated entry after close', async () => { + mounted = mountStory(SurfaceSideSheetAlwaysModal) + + await waitFor(() => { + expect(document.querySelector('[data-testid="surface-always-open"]')).not.toBeNull() + }) + + const openAndSampleEntry = async () => { + click('[data-testid="surface-always-open"]') + await nextTick() + + await waitFor(() => { + expect(document.querySelector('[data-testid="surface-always-panel"]')).not.toBeNull() + }) + + const rightSeries = await collectSeries( + () => toNumber(getComputedStyle(query('[data-testid="surface-always-panel"]')).right), + 380, + 24 + ) + + const rightDeltas = deltas(rightSeries) + const amplitude = Math.max(...rightSeries) - Math.min(...rightSeries) + + expect(amplitude).toBeGreaterThan(40) + expect(rightDeltas.some(delta => delta > 0.2)).toBe(true) + } + + await openAndSampleEntry() + + click('[data-testid="surface-always-close"]') + await nextTick() + + await waitFor(() => { + expect(document.querySelector('[data-testid="surface-always-panel"]')).toBeNull() + }, 2200) + + await openAndSampleEntry() + }) + + test('closes modal window with fade+slide and keeps animated re-open in side-sheet mode', async () => { + mounted = mountStory(SurfaceSideSheetModalToWindow) + + await waitFor(() => { + expect(document.querySelector('[data-testid="surface-window-open"]')).not.toBeNull() + }) + + const openAndSampleSheetEntry = async () => { + click('[data-testid="surface-window-open"]') + await nextTick() + + await waitFor(() => { + const panel = document.querySelector('[data-testid="surface-window-panel"]') as HTMLElement | null + expect(panel).not.toBeNull() + expect(panel?.getAttribute('data-panel-mode')).toBe('sheet') + }) + + const rightSeries = await collectSeries( + () => toNumber(getComputedStyle(query('[data-testid="surface-window-panel"]')).right), + 380, + 24 + ) + + const rightDeltas = deltas(rightSeries) + const amplitude = Math.max(...rightSeries) - Math.min(...rightSeries) + + expect(amplitude).toBeGreaterThan(40) + expect(rightDeltas.some(delta => delta > 0.2)).toBe(true) + } + + await openAndSampleSheetEntry() + + click('[data-testid="surface-window-toggle-mode"]') + await nextTick() + + await waitFor(() => { + expect(query('[data-testid="surface-window-panel"]').getAttribute('data-panel-mode')).toBe('window') + }, 1800) + + await waitFor(() => { + expect(query('[data-testid="surface-window-close"]').disabled).toBe(false) + }, 1200) + + click('[data-testid="surface-window-close"]') + await nextTick() + + await delay(260) + expect(document.querySelector('[data-testid="surface-window-panel"]')).not.toBeNull() + + await waitFor(() => { + expect(document.querySelector('[data-testid="surface-window-panel"]')).toBeNull() + expect(query('[data-testid="surface-window-root"]').getAttribute('data-panel-mounted')).toBe('false') + }, 2600) + + await openAndSampleSheetEntry() + }) + + test('keeps only one top scrim in nested chain and preserves center+slide dialog motion', async () => { + mounted = mountStory(SurfaceNestedDialogsChain) + + await waitFor(() => { + expect(document.querySelector('[data-testid="surface-dialog-chain-open-root"]')).not.toBeNull() + }) + + click('[data-testid="surface-dialog-chain-open-root"]') + await nextTick() + + await waitFor(() => { + expect(document.querySelector('[data-testid="surface-dialog-chain-level-1"]')).not.toBeNull() + expect(query('.surface-dialog-chain').getAttribute('data-top-level')).toBe('0') + }) + + while (true) { + const root = query('.surface-dialog-chain') + const topLevel = Number.parseInt(root.getAttribute('data-top-level') ?? '-1', 10) + + expect(topLevel).toBeGreaterThanOrEqual(0) + + const topDialogSelector = `[data-testid="surface-dialog-chain-level-${topLevel + 1}"]` + await waitFor(() => { + expectCentered(query(topDialogSelector), 10) + }, 900) + + expect(document.querySelectorAll('.m3-surface__scrim').length).toBe(1) + + const openNextSelector = `[data-testid="surface-dialog-chain-open-next-${topLevel + 1}"]` + const openNextButton = document.querySelector(openNextSelector) as HTMLButtonElement | null + + if (!openNextButton) { + break + } + + openNextButton.dispatchEvent(new MouseEvent('click', { + bubbles: true, + cancelable: true, + })) + await nextTick() + + const nextDialogSelector = `[data-testid="surface-dialog-chain-level-${topLevel + 2}"]` + await waitFor(() => { + expect(document.querySelector(nextDialogSelector)).not.toBeNull() + }) + + const translateYSeries = await collectSeries( + () => matrixTranslateY(query(nextDialogSelector)), + 340, + 24 + ) + const translateYDeltas = deltas(translateYSeries) + const amplitude = Math.max(...translateYSeries) - Math.min(...translateYSeries) + + expect(amplitude).toBeGreaterThan(6) + expect(translateYDeltas.some(delta => delta < -0.15)).toBe(true) + + await waitFor(() => { + expect(query('.surface-dialog-chain').getAttribute('data-top-level')).toBe(`${topLevel + 1}`) + }) + + expect(document.querySelectorAll('.m3-surface__scrim').length).toBe(1) + expectCentered(query(nextDialogSelector), 10) + } + }) +}) diff --git a/m3-vue/tests/fixtures/SurfaceExperimentHarness.vue b/m3-vue/tests/fixtures/SurfaceExperimentHarness.vue new file mode 100644 index 0000000..e96e919 --- /dev/null +++ b/m3-vue/tests/fixtures/SurfaceExperimentHarness.vue @@ -0,0 +1,542 @@ + + + + + From ad796dbfa6dc176c378481a19e1494bf161058b9 Mon Sep 17 00:00:00 2001 From: Kirill Zaytsev Date: Sat, 7 Mar 2026 14:14:07 +0400 Subject: [PATCH 04/54] feat(m3-foundation): Added Surface Stylesheet Module --- .../assets/stylesheets/components/index.scss | 1 + .../stylesheets/components/surface/index.scss | 76 +++++++++++++++++++ m3-foundation/assets/stylesheets/layout.scss | 11 +-- 3 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 m3-foundation/assets/stylesheets/components/surface/index.scss diff --git a/m3-foundation/assets/stylesheets/components/index.scss b/m3-foundation/assets/stylesheets/components/index.scss index d436339..0fb04f0 100644 --- a/m3-foundation/assets/stylesheets/components/index.scss +++ b/m3-foundation/assets/stylesheets/components/index.scss @@ -19,4 +19,5 @@ @use 'side-sheet'; @use 'slider'; @use 'switch'; +@use 'surface'; @use 'text-field'; diff --git a/m3-foundation/assets/stylesheets/components/surface/index.scss b/m3-foundation/assets/stylesheets/components/surface/index.scss new file mode 100644 index 0000000..03560c7 --- /dev/null +++ b/m3-foundation/assets/stylesheets/components/surface/index.scss @@ -0,0 +1,76 @@ +@use '../../basics/motion' as m3-motion; +@use '../../basics/palette' as palette; +@use '../../themes/dark' as dark; +@use '../../themes/light' as light; + +.m3-surface { + --m3-surface-role-surface-bg: var(--m3-sys-surface, #{light.$m3-sys-light-surface}); + --m3-surface-role-surface-dim-bg: var(--m3-sys-surface-container-highest, #{light.$m3-sys-light-surface-container-highest}); + --m3-surface-role-surface-bright-bg: var(--m3-sys-surface-container-low, #{light.$m3-sys-light-surface-container-low}); + --m3-surface-role-container-lowest-bg: var(--m3-sys-surface, #{palette.$m3-palette-neutral-100}); + --m3-surface-role-container-low-bg: var(--m3-sys-surface-container-low, #{light.$m3-sys-light-surface-container-low}); + --m3-surface-role-container-bg: var(--m3-sys-surface-container, #{light.$m3-sys-light-surface-container}); + --m3-surface-role-container-high-bg: var(--m3-sys-surface-container-high, #{light.$m3-sys-light-surface-container-high}); + --m3-surface-role-container-highest-bg: var(--m3-sys-surface-container-highest, #{light.$m3-sys-light-surface-container-highest}); + --m3-surface-elevation-1: var(--m3-elevation-1, #{light.$m3-elevation-light-1}); + --m3-surface-elevation-2: var(--m3-elevation-2, #{light.$m3-elevation-light-2}); + --m3-surface-elevation-3: var(--m3-elevation-3, #{light.$m3-elevation-light-3}); + --m3-surface-elevation-4: var(--m3-elevation-4, #{light.$m3-elevation-light-4}); + --m3-surface-elevation-5: var(--m3-elevation-5, #{light.$m3-elevation-light-5}); + --m3-surface-radius-transition-duration: #{m3-motion.duration('medium2')}; + + display: block; + isolation: isolate; + box-sizing: border-box; + transition: + border-top-left-radius var(--m3-surface-radius-transition-duration) #{m3-motion.easing('standard')}, + border-top-right-radius var(--m3-surface-radius-transition-duration) #{m3-motion.easing('standard')}, + border-bottom-right-radius var(--m3-surface-radius-transition-duration) #{m3-motion.easing('standard')}, + border-bottom-left-radius var(--m3-surface-radius-transition-duration) #{m3-motion.easing('standard')}; + + &_modal { + max-width: 100vw; + max-height: 100vh; + } + + &_role-surface { + background-color: var(--m3-surface-role-surface-bg); + } + + &_role-surface-dim { background-color: var(--m3-surface-role-surface-dim-bg); } + &_role-surface-bright { background-color: var(--m3-surface-role-surface-bright-bg); } + &_role-surface-container-lowest { background-color: var(--m3-surface-role-container-lowest-bg); } + &_role-surface-container-low { background-color: var(--m3-surface-role-container-low-bg); } + &_role-surface-container { background-color: var(--m3-surface-role-container-bg); } + &_role-surface-container-high { background-color: var(--m3-surface-role-container-high-bg); } + &_role-surface-container-highest { background-color: var(--m3-surface-role-container-highest-bg); } + + &_elevation-0 { box-shadow: none; } + &_elevation-1 { box-shadow: var(--m3-surface-elevation-1); } + &_elevation-2 { box-shadow: var(--m3-surface-elevation-2); } + &_elevation-3 { box-shadow: var(--m3-surface-elevation-3); } + &_elevation-4 { box-shadow: var(--m3-surface-elevation-4); } + &_elevation-5 { box-shadow: var(--m3-surface-elevation-5); } + + &__scrim { + position: fixed; + inset: 0; + background: color-mix(in srgb, var(--m3-sys-shadow, #{palette.$m3-palette-neutral-0}) 38%, transparent); + } +} + +html.m3-theme-dark .m3-surface { + --m3-surface-role-surface-bg: var(--m3-sys-surface, #{dark.$m3-sys-dark-surface}); + --m3-surface-role-surface-dim-bg: var(--m3-sys-surface-container-highest, #{dark.$m3-sys-dark-surface-container-highest}); + --m3-surface-role-surface-bright-bg: var(--m3-sys-surface-container-low, #{dark.$m3-sys-dark-surface-container-low}); + --m3-surface-role-container-lowest-bg: var(--m3-sys-surface, #{dark.$m3-sys-dark-surface}); + --m3-surface-role-container-low-bg: var(--m3-sys-surface-container-low, #{dark.$m3-sys-dark-surface-container-low}); + --m3-surface-role-container-bg: var(--m3-sys-surface-container, #{dark.$m3-sys-dark-surface-container}); + --m3-surface-role-container-high-bg: var(--m3-sys-surface-container-high, #{dark.$m3-sys-dark-surface-container-high}); + --m3-surface-role-container-highest-bg: var(--m3-sys-surface-container-highest, #{dark.$m3-sys-dark-surface-container-highest}); + --m3-surface-elevation-1: var(--m3-elevation-1, #{dark.$m3-elevation-dark-1}); + --m3-surface-elevation-2: var(--m3-elevation-2, #{dark.$m3-elevation-dark-2}); + --m3-surface-elevation-3: var(--m3-elevation-3, #{dark.$m3-elevation-dark-3}); + --m3-surface-elevation-4: var(--m3-elevation-4, #{dark.$m3-elevation-dark-4}); + --m3-surface-elevation-5: var(--m3-elevation-5, #{dark.$m3-elevation-dark-5}); +} diff --git a/m3-foundation/assets/stylesheets/layout.scss b/m3-foundation/assets/stylesheets/layout.scss index de2c60a..96ecf20 100644 --- a/m3-foundation/assets/stylesheets/layout.scss +++ b/m3-foundation/assets/stylesheets/layout.scss @@ -1,12 +1,3 @@ -.m3-surface { - display: flex; - flex-direction: column; - width: 100%; - height: 100%; - background: var(--m3-sys-surface); - color: var(--m3-sys-on-surface); -} - .m3-panel { padding: 32px; background: var(--m3-sys-surface-container-low); @@ -16,4 +7,4 @@ &_elevated-1 { background: var(--m3-sys-surface-container); } &_elevated-2 { background: var(--m3-sys-surface-container-high); } &_elevated-3 { background: var(--m3-sys-surface-container-highest); } -} \ No newline at end of file +} From bdc1b144026f4276c17f09d8ac98cb3b3d0a70c4 Mon Sep 17 00:00:00 2001 From: Kirill Zaytsev Date: Sat, 7 Mar 2026 14:16:35 +0400 Subject: [PATCH 05/54] feat(m3-foundation): Added Motion Values And Surface Types --- m3-foundation/lib/motion/index.ts | 10 ++++ m3-foundation/lib/motion/values.ts | 61 +++++++++++++++++++++ m3-foundation/types/components/surface.d.ts | 26 +++++++++ 3 files changed, 97 insertions(+) create mode 100644 m3-foundation/lib/motion/index.ts create mode 100644 m3-foundation/lib/motion/values.ts create mode 100644 m3-foundation/types/components/surface.d.ts diff --git a/m3-foundation/lib/motion/index.ts b/m3-foundation/lib/motion/index.ts new file mode 100644 index 0000000..8bb94d3 --- /dev/null +++ b/m3-foundation/lib/motion/index.ts @@ -0,0 +1,10 @@ +export type { + M3MotionDurationKey, + M3MotionEasingKey, +} from './values' + +export { + m3MotionDurations, + m3MotionEasings, + m3MotionTimingDefaults, +} from './values' diff --git a/m3-foundation/lib/motion/values.ts b/m3-foundation/lib/motion/values.ts new file mode 100644 index 0000000..ae8b788 --- /dev/null +++ b/m3-foundation/lib/motion/values.ts @@ -0,0 +1,61 @@ +export const m3MotionDurations = { + short1: 50, + short2: 100, + short3: 150, + short4: 200, + medium1: 250, + medium2: 300, + medium3: 350, + medium4: 400, + long1: 450, + long2: 500, + long3: 550, + long4: 600, + 'extra-long1': 700, + 'extra-long2': 800, + 'extra-long3': 900, + 'extra-long4': 1000, +} as const + +export type M3MotionDurationKey = keyof typeof m3MotionDurations + +export const m3MotionEasings = { + emphasized: 'cubic-bezier(0.2, 0.0, 0, 1.0)', + 'emphasized-accelerate': 'cubic-bezier(0.3, 0.0, 0.8, 0.15)', + 'emphasized-decelerate': 'cubic-bezier(0.05, 0.7, 0.1, 1.0)', + standard: 'cubic-bezier(0.2, 0.0, 0, 1.0)', + 'standard-accelerate': 'cubic-bezier(0.3, 0, 1, 1)', + 'standard-decelerate': 'cubic-bezier(0, 0, 0, 1)', +} as const + +export type M3MotionEasingKey = keyof typeof m3MotionEasings + +export const m3MotionTimingDefaults = { + emphasized: { + duration: 'long2', + easing: 'emphasized', + }, + 'emphasized-accelerate': { + duration: 'short4', + easing: 'emphasized-accelerate', + }, + 'emphasized-decelerate': { + duration: 'medium4', + easing: 'emphasized-decelerate', + }, + standard: { + duration: 'medium2', + easing: 'standard', + }, + 'standard-accelerate': { + duration: 'short4', + easing: 'standard-accelerate', + }, + 'standard-decelerate': { + duration: 'medium1', + easing: 'standard-decelerate', + }, +} as const satisfies Record diff --git a/m3-foundation/types/components/surface.d.ts b/m3-foundation/types/components/surface.d.ts new file mode 100644 index 0000000..b9ff647 --- /dev/null +++ b/m3-foundation/types/components/surface.d.ts @@ -0,0 +1,26 @@ +export type Length = string | number + +export type Mode = 'standard' | 'modal' + +export type Variant = + | 'auto' + | 'surface' + | 'surface-dim' + | 'surface-bright' + | 'surface-container-lowest' + | 'surface-container-low' + | 'surface-container' + | 'surface-container-high' + | 'surface-container-highest' + +export type Anchor = + | 'none' + | 'center' + | 'start' + | 'end' + | 'top' + | 'bottom' + | 'top-start' + | 'top-end' + | 'bottom-start' + | 'bottom-end' From fef67a30344eb9dfa9016cf3824df6e43ba115a5 Mon Sep 17 00:00:00 2001 From: Kirill Zaytsev Date: Sat, 7 Mar 2026 14:37:46 +0400 Subject: [PATCH 06/54] feat(m3-react): Added M3Surface Component And Surface Storybook Scenarios --- m3-react/src/components/surface/M3Surface.tsx | 276 ++++++++ m3-react/src/components/surface/index.ts | 8 + m3-react/src/index.ts | 11 + m3-react/storybook/components/M3Surface.mdx | 13 + .../components/M3Surface.stories.tsx | 52 ++ .../examples/surface/SurfaceCardPageMorph.tsx | 379 +++++++++++ .../surface/SurfaceNestedDialogsChain.tsx | 359 ++++++++++ .../surface/SurfaceSideSheetAlwaysModal.tsx | 347 ++++++++++ .../SurfaceSideSheetDismissToRemove.tsx | 452 +++++++++++++ .../surface/SurfaceSideSheetModalToWindow.tsx | 609 +++++++++++++++++ .../surface/SurfaceSideSheetMorph.tsx | 487 ++++++++++++++ .../storybook/examples/surface/styles.scss | 628 ++++++++++++++++++ m3-react/storybook/examples/surface/utils.ts | 51 ++ m3-react/tests/M3Surface.test.tsx | 112 ++++ 14 files changed, 3784 insertions(+) create mode 100644 m3-react/src/components/surface/M3Surface.tsx create mode 100644 m3-react/src/components/surface/index.ts create mode 100644 m3-react/storybook/components/M3Surface.mdx create mode 100644 m3-react/storybook/components/M3Surface.stories.tsx create mode 100644 m3-react/storybook/examples/surface/SurfaceCardPageMorph.tsx create mode 100644 m3-react/storybook/examples/surface/SurfaceNestedDialogsChain.tsx create mode 100644 m3-react/storybook/examples/surface/SurfaceSideSheetAlwaysModal.tsx create mode 100644 m3-react/storybook/examples/surface/SurfaceSideSheetDismissToRemove.tsx create mode 100644 m3-react/storybook/examples/surface/SurfaceSideSheetModalToWindow.tsx create mode 100644 m3-react/storybook/examples/surface/SurfaceSideSheetMorph.tsx create mode 100644 m3-react/storybook/examples/surface/styles.scss create mode 100644 m3-react/storybook/examples/surface/utils.ts create mode 100644 m3-react/tests/M3Surface.test.tsx diff --git a/m3-react/src/components/surface/M3Surface.tsx b/m3-react/src/components/surface/M3Surface.tsx new file mode 100644 index 0000000..397e3fb --- /dev/null +++ b/m3-react/src/components/surface/M3Surface.tsx @@ -0,0 +1,276 @@ +import type { + CSSProperties, + FC, + HTMLAttributes, +} from 'react' +import type { + Anchor as SurfaceAnchor, + Length as SurfaceLength, + Mode as SurfaceMode, + Variant as SurfaceVariant, +} from '@modulify/m3-foundation/types/components/surface' + +import { createPortal } from 'react-dom' +import { m3MotionEasings } from '@modulify/m3-foundation/lib/motion' + +import { + useId, +} from '@/hooks' + +import { toClassName } from '@/utils/styling' + +type Inset = { + top: string; + right: string; + bottom: string; + left: string; +} + +export type M3SurfaceMode = SurfaceMode +export type M3SurfaceVariant = SurfaceVariant +export type M3SurfaceAnchor = SurfaceAnchor + +export interface M3SurfaceProps extends HTMLAttributes { + id?: string; + tag?: keyof HTMLElementTagNameMap; + shown?: boolean; + mode?: M3SurfaceMode; + teleportTo?: string; + scrim?: boolean; + elevation?: number; + variant?: M3SurfaceVariant; + fillWidth?: boolean; + fillHeight?: boolean; + width?: SurfaceLength | null; + height?: SurfaceLength | null; + minWidth?: SurfaceLength | null; + maxWidth?: SurfaceLength | null; + minHeight?: SurfaceLength | null; + maxHeight?: SurfaceLength | null; + rounding?: SurfaceLength; + roundingTopLeft?: SurfaceLength | null; + roundingTopRight?: SurfaceLength | null; + roundingBottomRight?: SurfaceLength | null; + roundingBottomLeft?: SurfaceLength | null; + anchor?: M3SurfaceAnchor; + insetTop?: SurfaceLength; + insetRight?: SurfaceLength; + insetBottom?: SurfaceLength; + insetLeft?: SurfaceLength; + zIndex?: number; + transitionMs?: number; + transitionTiming?: string; + overflow?: CSSProperties['overflow']; + onToggle?: (shown: boolean) => void; + onDismiss?: () => void; +} + +type AnchorStyleFactory = (inset: Inset) => CSSProperties + +const MODAL_ANCHOR_STYLE: Record = { + none: ({ top, right, bottom, left }) => ({ top, right, bottom, left }), + center: () => ({ + top: '50%', + left: '50%', + right: 'auto', + bottom: 'auto', + transform: 'translate(-50%, -50%)', + }), + start: ({ top, bottom, left }) => ({ top, bottom, left, right: 'auto' }), + end: ({ top, right, bottom }) => ({ top, right, bottom, left: 'auto' }), + top: ({ top, left, right }) => ({ top, left, right, bottom: 'auto' }), + bottom: ({ bottom, left, right }) => ({ bottom, left, right, top: 'auto' }), + 'top-start': ({ top, left }) => ({ top, left, right: 'auto', bottom: 'auto' }), + 'top-end': ({ top, right }) => ({ top, right, left: 'auto', bottom: 'auto' }), + 'bottom-start': ({ bottom, left }) => ({ bottom, left, right: 'auto', top: 'auto' }), + 'bottom-end': ({ bottom, right }) => ({ bottom, right, left: 'auto', top: 'auto' }), +} + +const toLength = (value: SurfaceLength | null | undefined, fallback: string): string => { + if (value == null) { + return fallback + } + + return typeof value === 'number' + ? `${value}px` + : value +} + +const isDefined = (value: T | null | undefined): value is T => value !== null && value !== undefined + +const getResolvedVariant = (variant: SurfaceVariant, elevation: number): Exclude => { + if (variant !== 'auto') return variant + + switch (elevation) { + case 0: return 'surface' + case 1: return 'surface-container-low' + case 2: return 'surface-container' + case 3: return 'surface-container-high' + case 4: return 'surface-container-highest' + default: return 'surface-bright' + } +} + +const M3Surface: FC = ({ + id, + tag = 'section', + shown = true, + mode = 'standard', + teleportTo = 'body', + scrim = true, + elevation = 0, + variant = 'auto', + fillWidth = true, + fillHeight = true, + width = null, + height = null, + minWidth = null, + maxWidth = null, + minHeight = null, + maxHeight = null, + rounding = 0, + roundingTopLeft = null, + roundingTopRight = null, + roundingBottomRight = null, + roundingBottomLeft = null, + anchor = 'none', + insetTop = 0, + insetRight = 0, + insetBottom = 0, + insetLeft = 0, + zIndex = 400, + transitionMs = 220, + transitionTiming = m3MotionEasings.standard, + overflow = 'visible', + onToggle = (_: boolean) => {}, + onDismiss = () => {}, + className = '', + style, + children = [], + ...attrs +}) => { + const _id = useId(id, 'm3-surface') + const isModal = mode === 'modal' + const resolvedVariant = getResolvedVariant(variant, elevation) + const SurfaceTag = tag + + const resolvedSizeStyle: CSSProperties = { + width: isDefined(width) + ? toLength(width, 'auto') + : (fillWidth ? '100%' : 'auto'), + height: isDefined(height) + ? toLength(height, 'auto') + : (fillHeight ? '100%' : 'auto'), + minWidth: isDefined(minWidth) ? toLength(minWidth, '0px') : undefined, + maxWidth: isDefined(maxWidth) ? toLength(maxWidth, 'none') : undefined, + minHeight: isDefined(minHeight) ? toLength(minHeight, '0px') : undefined, + maxHeight: isDefined(maxHeight) ? toLength(maxHeight, 'none') : undefined, + } + + const baseRounding = toLength(rounding, '0px') + + const cornerStyle: CSSProperties = { + borderTopLeftRadius: isDefined(roundingTopLeft) ? toLength(roundingTopLeft, baseRounding) : baseRounding, + borderTopRightRadius: isDefined(roundingTopRight) ? toLength(roundingTopRight, baseRounding) : baseRounding, + borderBottomRightRadius: isDefined(roundingBottomRight) ? toLength(roundingBottomRight, baseRounding) : baseRounding, + borderBottomLeftRadius: isDefined(roundingBottomLeft) ? toLength(roundingBottomLeft, baseRounding) : baseRounding, + } + + const anchorStyle: CSSProperties = isModal + ? MODAL_ANCHOR_STYLE[anchor]({ + top: toLength(insetTop, '0px'), + right: toLength(insetRight, '0px'), + bottom: toLength(insetBottom, '0px'), + left: toLength(insetLeft, '0px'), + }) + : {} + + const duration = `${transitionMs}ms` + const transition = [ + `width ${duration} ${transitionTiming}`, + `height ${duration} ${transitionTiming}`, + `min-width ${duration} ${transitionTiming}`, + `max-width ${duration} ${transitionTiming}`, + `min-height ${duration} ${transitionTiming}`, + `max-height ${duration} ${transitionTiming}`, + `top ${duration} ${transitionTiming}`, + `right ${duration} ${transitionTiming}`, + `bottom ${duration} ${transitionTiming}`, + `left ${duration} ${transitionTiming}`, + `transform ${duration} ${transitionTiming}`, + `opacity ${duration} ${transitionTiming}`, + `background-color ${duration} ${transitionTiming}`, + `box-shadow ${duration} ${transitionTiming}`, + ].join(', ') + + const surfaceClassName = toClassName([className, { + 'm3-surface': true, + 'm3-surface_modal': isModal, + [`m3-surface_role-${resolvedVariant}`]: true, + [`m3-surface_anchor-${anchor}`]: true, + [`m3-surface_elevation-${elevation}`]: true, + }]) + + const radiusTransitionStyle = { + '--m3-surface-radius-transition-duration': duration, + } as CSSProperties + + const surfaceNode = ( + + {children} + + ) + + if (!isModal) { + return surfaceNode + } + + const portalTarget = typeof document === 'undefined' + ? null + : (teleportTo === 'body' ? document.body : (document.querySelector(teleportTo) || document.body)) + + if (!portalTarget) { + return null + } + + return createPortal( + <> + {scrim ? ( +
{ + onToggle(false) + onDismiss() + }} + /> + ) : null} + {surfaceNode} + , + portalTarget + ) +} + +export default M3Surface diff --git a/m3-react/src/components/surface/index.ts b/m3-react/src/components/surface/index.ts new file mode 100644 index 0000000..f76f3b4 --- /dev/null +++ b/m3-react/src/components/surface/index.ts @@ -0,0 +1,8 @@ +export type { + M3SurfaceAnchor, + M3SurfaceMode, + M3SurfaceProps, + M3SurfaceVariant, +} from './M3Surface' + +export { default as M3Surface } from './M3Surface' diff --git a/m3-react/src/index.ts b/m3-react/src/index.ts index 05606e1..0491e4f 100644 --- a/m3-react/src/index.ts +++ b/m3-react/src/index.ts @@ -81,6 +81,13 @@ export type { M3SideSheetProps, } from '@/components/side-sheet' +export type { + M3SurfaceAnchor, + M3SurfaceMode, + M3SurfaceProps, + M3SurfaceVariant, +} from '@/components/surface' + export type { M3TextFieldMethods, M3TextFieldProps, @@ -150,6 +157,10 @@ export { M3SideSheet, } from '@/components/side-sheet' +export { + M3Surface, +} from '@/components/surface' + export { M3Select, } from '@/components/select' diff --git a/m3-react/storybook/components/M3Surface.mdx b/m3-react/storybook/components/M3Surface.mdx new file mode 100644 index 0000000..5650ce0 --- /dev/null +++ b/m3-react/storybook/components/M3Surface.mdx @@ -0,0 +1,13 @@ +import { Meta } from '@storybook/addon-docs/blocks' +import * as M3SurfaceStories from './M3Surface.stories' + + + +# Surfaces + +- [Side Sheet Docked To Modal](?path=/story/components-m3surface--side-sheet-docked-to-modal) +- [Card Replacing Page](?path=/story/components-m3surface--card-replacing-page) +- [Side Sheet Modal Dismiss Removes Surface](?path=/story/components-m3surface--side-sheet-modal-dismiss-removes-surface) +- [Side Sheet Always Modal Toggle](?path=/story/components-m3surface--side-sheet-always-modal-toggle) +- [Side Sheet Modal To Window](?path=/story/components-m3surface--side-sheet-modal-to-window) +- [Nested Dialogs Chain](?path=/story/components-m3surface--nested-dialogs-chain) diff --git a/m3-react/storybook/components/M3Surface.stories.tsx b/m3-react/storybook/components/M3Surface.stories.tsx new file mode 100644 index 0000000..440ac1a --- /dev/null +++ b/m3-react/storybook/components/M3Surface.stories.tsx @@ -0,0 +1,52 @@ +import type { + Meta, + StoryObj, +} from '@storybook/react' + +import { M3Surface } from '@/components/surface' + +import SurfaceCardPageMorph from '../examples/surface/SurfaceCardPageMorph' +import SurfaceNestedDialogsChain from '../examples/surface/SurfaceNestedDialogsChain' +import SurfaceSideSheetAlwaysModal from '../examples/surface/SurfaceSideSheetAlwaysModal' +import SurfaceSideSheetDismissToRemove from '../examples/surface/SurfaceSideSheetDismissToRemove' +import SurfaceSideSheetModalToWindow from '../examples/surface/SurfaceSideSheetModalToWindow' +import SurfaceSideSheetMorph from '../examples/surface/SurfaceSideSheetMorph' + +import '../examples/surface/styles.scss' + +const meta = { + title: 'Components/M3Surface', + component: M3Surface, + + parameters: { + layout: 'fullscreen', + }, +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const SideSheetDockedToModal: Story = { + render: () => , +} + +export const CardReplacingPage: Story = { + render: () => , +} + +export const SideSheetModalDismissRemovesSurface: Story = { + render: () => , +} + +export const SideSheetAlwaysModalToggle: Story = { + render: () => , +} + +export const SideSheetModalToWindow: Story = { + render: () => , +} + +export const NestedDialogsChain: Story = { + render: () => , +} diff --git a/m3-react/storybook/examples/surface/SurfaceCardPageMorph.tsx b/m3-react/storybook/examples/surface/SurfaceCardPageMorph.tsx new file mode 100644 index 0000000..76ba141 --- /dev/null +++ b/m3-react/storybook/examples/surface/SurfaceCardPageMorph.tsx @@ -0,0 +1,379 @@ +import type { + CSSProperties, + FC, +} from 'react' + +import { M3Button } from '@/components/button' +import { M3Icon } from '@/components/icon' +import { M3IconButton } from '@/components/icon-button' +import { + M3Navigation, + M3NavigationTab, +} from '@/components/navigation' +import { M3Surface } from '@/components/surface' +import { + m3MotionDurations, + m3MotionEasings, +} from '@modulify/m3-foundation/lib/motion' + +import { + useEffect, + useRef, +} from 'react' + +import { toClassName } from '@/utils/styling' + +import { + raf, + useStateRef, + wait, +} from './utils' + +const TRANSITION_MS = m3MotionDurations.medium3 +const TRANSITION_EASING = m3MotionEasings.standard + +type NavTab = 'files' | 'timeline' | 'tasks' | 'analytics' + +type Motion = { + top: number; + left: number; + width: number; + height: number; +} + +const SurfaceCardPageMorph: FC = () => { + const [expanded, setExpanded, expandedRef] = useStateRef(false) + const [busy, setBusy, busyRef] = useStateRef(false) + const [navExpanded, setNavExpanded] = useStateRef(false) + const [backgroundCollapsed, setBackgroundCollapsed] = useStateRef(false) + const [activeNavTab, setActiveNavTab] = useStateRef('files') + const [originHeight, setOriginHeight] = useStateRef(220) + + const [motion, setMotion] = useStateRef({ + top: 16, + left: 16, + width: 320, + height: 220, + }) + + const canvas = useRef(null) + const originSlot = useRef(null) + + const overlayStyle: CSSProperties = { + top: `${motion.top}px`, + left: `${motion.left}px`, + width: `${motion.width}px`, + height: `${motion.height}px`, + } + + const measureOrigin = (): Motion | null => { + if (!canvas.current || !originSlot.current) { + return null + } + + const canvasRect = canvas.current.getBoundingClientRect() + const originRect = originSlot.current.getBoundingClientRect() + + return { + top: originRect.top - canvasRect.top, + left: originRect.left - canvasRect.left, + width: originRect.width, + height: originRect.height, + } + } + + const measureExpanded = (): Motion | null => { + if (!canvas.current) { + return null + } + + const canvasRect = canvas.current.getBoundingClientRect() + + return { + top: 0, + left: 0, + width: canvasRect.width, + height: canvasRect.height, + } + } + + const initMotion = async () => { + await raf() + + const origin = measureOrigin() + if (!origin) { + return + } + + setMotion(origin) + setOriginHeight(origin.height) + } + + const expandCard = async () => { + setBackgroundCollapsed(false) + + const origin = measureOrigin() + if (origin) { + setMotion(origin) + setOriginHeight(origin.height) + } + + setExpanded(true) + await raf() + + const full = measureExpanded() + if (!full) { + return + } + + setMotion(full) + await wait(TRANSITION_MS) + setBackgroundCollapsed(true) + } + + const collapseCard = async () => { + if (backgroundCollapsed) { + setBackgroundCollapsed(false) + await raf() + } + + const full = measureExpanded() + if (full) { + setMotion(full) + } + + const origin = measureOrigin() + if (origin) { + setOriginHeight(origin.height) + } + + setExpanded(false) + await raf() + + if (!origin) { + return + } + + setMotion(origin) + await wait(TRANSITION_MS) + } + + const toggleCardMode = async () => { + if (busyRef.current) { + return + } + + setBusy(true) + + if (expandedRef.current) { + await collapseCard() + setBusy(false) + return + } + + await expandCard() + setBusy(false) + } + + useEffect(() => { + void initMotion() + }, []) + + return ( +
+ +
+
+ Surface orchestration: card replacing page +

The same surface morphs between compact card and page-like container.

+
+ + void toggleCardMode()} + > + {expanded ? 'Return to card state' : 'Expand card to page state'} + +
+
+ + + + setNavExpanded(true)} + > + + + + + { + setActiveNavTab('files') + setNavExpanded(false) + }} + > + + + + { + setActiveNavTab('timeline') + setNavExpanded(false) + }} + > + + + + { + setActiveNavTab('tasks') + setNavExpanded(false) + }} + > + + + + { + setActiveNavTab('analytics') + setNavExpanded(false) + }} + > + + + + +
+
+ +

Card-to-page transition playground

+

Original slot remains reserved while the morphing surface overlays the page area.

+
+ +
+ {!backgroundCollapsed ? ( +
+
+ + + Static card A +

Background content remains in flow.

+
+ + + Static card B +

Independent surface in the same scene.

+
+
+ ) : null} + +
+
+ +

Morph target surface

+

+ In compact mode this surface behaves like a card. In expanded mode it replaces the + page work area while keeping top bar and rail reserved. +

+ + + Nested surface demonstrates composability in both states. + +
+
+
+
+
+
+
+ ) +} + +export default SurfaceCardPageMorph diff --git a/m3-react/storybook/examples/surface/SurfaceNestedDialogsChain.tsx b/m3-react/storybook/examples/surface/SurfaceNestedDialogsChain.tsx new file mode 100644 index 0000000..a3f27a1 --- /dev/null +++ b/m3-react/storybook/examples/surface/SurfaceNestedDialogsChain.tsx @@ -0,0 +1,359 @@ +import type { + CSSProperties, + FC, +} from 'react' + +import { M3Button } from '@/components/button' +import { M3Icon } from '@/components/icon' +import { M3IconButton } from '@/components/icon-button' +import { + M3Navigation, + M3NavigationTab, +} from '@/components/navigation' +import { M3Surface } from '@/components/surface' +import { + m3MotionDurations, + m3MotionEasings, +} from '@modulify/m3-foundation/lib/motion' +import { toClassName } from '@/utils/styling' + +import { + raf, + useStateRef, + wait, +} from './utils' + +const DIALOG_TRANSITION_MS = m3MotionDurations.medium2 +const DIALOG_TRANSITION_EASING = m3MotionEasings.standard +const DIALOG_ENTRY_OFFSET_PX = 24 +const DIALOG_Z_INDEX_BASE = 560 +const DIALOG_Z_INDEX_STEP = 40 + +type NavTab = 'inbox' | 'boards' | 'archive' | 'lab' + +type DialogSpec = { + id: string; + width: number; + rounding: number; + description: string; +} + +const dialogChain: DialogSpec[] = [{ + id: 'dialog-1', + width: 720, + rounding: 28, + description: 'First layer in the chain. It opens dialog 2.', +}, { + id: 'dialog-2', + width: 620, + rounding: 26, + description: 'Second layer keeps the same controls and opens the next dialog.', +}, { + id: 'dialog-3', + width: 520, + rounding: 24, + description: 'Third layer opens the final nested dialog.', +}, { + id: 'dialog-4', + width: 440, + rounding: 22, + description: 'Final layer in this scenario: close only, no next dialog action.', +}] + +const SurfaceNestedDialogsChain: FC = () => { + const [activeNavTab, setActiveNavTab] = useStateRef('inbox') + const [dialogMounted, setDialogMounted, dialogMountedRef] = useStateRef( + Array.from({ length: dialogChain.length }, () => false) + ) + const [dialogVisible, setDialogVisible] = useStateRef( + Array.from({ length: dialogChain.length }, () => false) + ) + + const chainOpened = dialogMounted.some(Boolean) + + const topDialogLevel = (() => { + for (let index = dialogChain.length - 1; index >= 0; index -= 1) { + if (dialogMounted[index]) { + return index + } + } + + return -1 + })() + + const hasNextDialog = (level: number) => level < dialogChain.length - 1 + const isTopDialog = (level: number) => topDialogLevel === level + + const dialogMode = (level: number): 'standard' | 'modal' => { + return isTopDialog(level) ? 'modal' : 'standard' + } + + const dialogZIndex = (level: number) => DIALOG_Z_INDEX_BASE + (level * DIALOG_Z_INDEX_STEP) + + const dialogElevation = (level: number) => Math.min(5, 2 + level) + + const dialogInlineStyle = (level: number): CSSProperties => { + const visible = dialogVisible[level] + + return { + position: 'fixed', + top: '50%', + left: '50%', + zIndex: dialogZIndex(level), + opacity: visible ? 1 : 0, + transform: visible + ? 'translate(-50%, -50%)' + : `translate(-50%, calc(-50% + ${DIALOG_ENTRY_OFFSET_PX}px))`, + transition: `opacity ${DIALOG_TRANSITION_MS}ms ${DIALOG_TRANSITION_EASING}, transform ${DIALOG_TRANSITION_MS}ms ${DIALOG_TRANSITION_EASING}`, + pointerEvents: visible ? 'auto' : 'none', + } + } + + const openDialog = async (level: number) => { + if (level < 0 || level >= dialogChain.length || dialogMountedRef.current[level]) { + return + } + + if (level > 0 && !dialogMountedRef.current[level - 1]) { + return + } + + setDialogMounted((previous) => { + const next = [...previous] + next[level] = true + return next + }) + + setDialogVisible((previous) => { + const next = [...previous] + next[level] = false + return next + }) + + await raf() + + setDialogVisible((previous) => { + const next = [...previous] + next[level] = true + return next + }) + } + + const closeFrom = async (level: number) => { + if (level < 0 || level >= dialogChain.length) { + return + } + + let hasMountedDialog = false + for (let index = level; index < dialogChain.length; index += 1) { + if (dialogMountedRef.current[index]) { + hasMountedDialog = true + break + } + } + + if (!hasMountedDialog) { + return + } + + setDialogVisible((previous) => { + const next = [...previous] + + for (let index = dialogChain.length - 1; index >= level; index -= 1) { + if (dialogMountedRef.current[index]) { + next[index] = false + } + } + + return next + }) + + await wait(DIALOG_TRANSITION_MS) + + setDialogMounted((previous) => { + const next = [...previous] + + for (let index = level; index < dialogChain.length; index += 1) { + next[index] = false + } + + return next + }) + + setDialogVisible((previous) => { + const next = [...previous] + + for (let index = level; index < dialogChain.length; index += 1) { + next[index] = false + } + + return next + }) + } + + return ( +
+ +
+
+ Surface orchestration: nested dialogs chain +

Rail layout opens a nested dialog chain with one active scrim on the topmost dialog.

+
+ + void openDialog(0)} + > + {chainOpened ? 'Dialog chain is open' : 'Open dialog chain'} + +
+
+ + + setActiveNavTab('inbox')} + > + + + + setActiveNavTab('boards')} + > + + + + setActiveNavTab('archive')} + > + + + + setActiveNavTab('lab')} + > + + + + +
+
+ +

Workspace

+

Page composition stays stable while dialogs are stacked progressively.

+
+ + +

Background content

+

Open dialog 1 from top action, then continue through the chain.

+
+
+
+ + {dialogChain.map((dialog, level) => { + if (!dialogMounted[level]) { + return null + } + + return ( + void closeFrom(level)} + > +
+

Dialog {level + 1} of {dialogChain.length}

+ + void closeFrom(level)} + > + + +
+ +

{dialog.description}

+ +
+ void closeFrom(level)} + > + Close + + + {hasNextDialog(level) ? ( + void openDialog(level + 1)} + > + Open dialog {level + 2} + + ) : null} +
+
+ ) + })} +
+ ) +} + +export default SurfaceNestedDialogsChain diff --git a/m3-react/storybook/examples/surface/SurfaceSideSheetAlwaysModal.tsx b/m3-react/storybook/examples/surface/SurfaceSideSheetAlwaysModal.tsx new file mode 100644 index 0000000..f997052 --- /dev/null +++ b/m3-react/storybook/examples/surface/SurfaceSideSheetAlwaysModal.tsx @@ -0,0 +1,347 @@ +import type { FC } from 'react' + +import { M3Button } from '@/components/button' +import { M3Icon } from '@/components/icon' +import { M3IconButton } from '@/components/icon-button' +import { + M3Navigation, + M3NavigationTab, +} from '@/components/navigation' +import { M3Surface } from '@/components/surface' +import { + m3MotionDurations, + m3MotionEasings, +} from '@modulify/m3-foundation/lib/motion' + +import { + useEffect, + useRef, +} from 'react' + +import { + clamp, + raf, + useStateRef, + wait, +} from './utils' + +const SIDE_SHEET_WIDTH_MIN = 280 +const SIDE_SHEET_WIDTH_MAX = 360 +const SIDE_SHEET_WIDTH_RATIO = 0.32 +const SIDE_SHEET_WIDTH_STEP = 4 + +const MODAL_INSET_TOP = 0 +const MODAL_INSET_BOTTOM = 0 +const MODAL_INSET_END = 0 +const PANEL_TRANSITION_MS = m3MotionDurations.medium2 +const PANEL_TRANSITION_EASING = m3MotionEasings.standard +const SCRIM_FADE_MS = m3MotionDurations.long2 + +type NavTab = 'inbox' | 'boards' | 'archive' | 'lab' + +const SurfaceSideSheetAlwaysModal: FC = () => { + const [navExpanded, setNavExpanded] = useStateRef(false) + const [activeNavTab, setActiveNavTab] = useStateRef('inbox') + const [sideSheetWidth, setSideSheetWidth, sideSheetWidthRef] = useStateRef(320) + const [modalInsetRight, setModalInsetRight] = useStateRef(-(sideSheetWidthRef.current + 12)) + const [modalRadiusLeft, setModalRadiusLeft] = useStateRef(0) + const [modalElevation, setModalElevation] = useStateRef(0) + const [modalMounted, setModalMounted, modalMountedRef] = useStateRef(false) + const [modalVisible, setModalVisible] = useStateRef(false) + const [transitioning, setTransitioning, transitioningRef] = useStateRef(false) + + const layoutRoot = useRef(null) + + const hiddenInsetRight = (width: number) => -(width + 12) + + const resolveSheetWidthFromLayout = () => { + const layoutWidth = Math.round(layoutRoot.current?.getBoundingClientRect().width ?? window.innerWidth) + const estimated = Math.round((layoutWidth * SIDE_SHEET_WIDTH_RATIO) / SIDE_SHEET_WIDTH_STEP) * SIDE_SHEET_WIDTH_STEP + + return clamp(estimated, SIDE_SHEET_WIDTH_MIN, SIDE_SHEET_WIDTH_MAX) + } + + const syncFixedWidth = () => { + const width = resolveSheetWidthFromLayout() + setSideSheetWidth(width) + + if (!modalMountedRef.current) { + setModalInsetRight(hiddenInsetRight(width)) + } + + return width + } + + const openModal = async () => { + if (transitioningRef.current || modalMountedRef.current) { + return + } + + setTransitioning(true) + const width = syncFixedWidth() + + setModalRadiusLeft(0) + setModalElevation(0) + setModalInsetRight(hiddenInsetRight(width)) + setModalMounted(true) + + await raf() + + setModalVisible(true) + await raf() + + setModalInsetRight(MODAL_INSET_END) + setModalRadiusLeft(28) + setModalElevation(1) + await wait(PANEL_TRANSITION_MS) + setTransitioning(false) + } + + const closeModal = async () => { + if (transitioningRef.current || !modalMountedRef.current) { + return + } + + setTransitioning(true) + setModalInsetRight(hiddenInsetRight(sideSheetWidthRef.current)) + setModalRadiusLeft(0) + setModalElevation(0) + await wait(PANEL_TRANSITION_MS) + + setModalVisible(false) + await wait(SCRIM_FADE_MS) + setModalMounted(false) + setTransitioning(false) + } + + useEffect(() => { + const onResize = () => { + syncFixedWidth() + } + + syncFixedWidth() + window.addEventListener('resize', onResize, { passive: true }) + + return () => { + window.removeEventListener('resize', onResize) + } + }, []) + + return ( +
+ +
+
+ Surface orchestration: always-modal side sheet +

The side sheet exists only in modal mode and can be shown repeatedly from the page header.

+
+ + void openModal()} + > + {modalMounted ? 'Modal side sheet is open' : 'Show modal side sheet'} + +
+
+ + + + setNavExpanded(true)} + > + + + + + { + setActiveNavTab('inbox') + setNavExpanded(false) + }} + > + + + + { + setActiveNavTab('boards') + setNavExpanded(false) + }} + > + + + + { + setActiveNavTab('archive') + setNavExpanded(false) + }} + > + + + + { + setActiveNavTab('lab') + setNavExpanded(false) + }} + > + + + + +
+
+ +

Workspace surfaces

+

Background layout stays in flow while the side sheet appears as a modal overlay.

+
+ +
+
+ + surface-container-lowest +

Read-heavy content block in the page flow.

+
+ + + surface-container-low +

Secondary block with mild emphasis.

+
+ + + surface-container-high +

Contextual utility content.

+
+ + + surface-dim +

Low-brightness complementary content.

+
+
+ + {modalMounted ? ( + void closeModal()} + > +
+

Modal side sheet

+ + void closeModal()} + > + + +
+ +

This side sheet is always modal and never returns to a docked state.

+

Close actions: scrim click or close button inside the panel.

+

+ Fixed width: {sideSheetWidth}px +

+
+ ) : null} +
+
+
+
+ ) +} + +export default SurfaceSideSheetAlwaysModal diff --git a/m3-react/storybook/examples/surface/SurfaceSideSheetDismissToRemove.tsx b/m3-react/storybook/examples/surface/SurfaceSideSheetDismissToRemove.tsx new file mode 100644 index 0000000..ed84dba --- /dev/null +++ b/m3-react/storybook/examples/surface/SurfaceSideSheetDismissToRemove.tsx @@ -0,0 +1,452 @@ +import type { FC } from 'react' + +import { M3Button } from '@/components/button' +import { M3Icon } from '@/components/icon' +import { M3IconButton } from '@/components/icon-button' +import { + M3Navigation, + M3NavigationTab, +} from '@/components/navigation' +import { M3Surface } from '@/components/surface' +import { + m3MotionDurations, + m3MotionEasings, +} from '@modulify/m3-foundation/lib/motion' + +import { + useEffect, + useRef, +} from 'react' + +import { + clamp, + raf, + useStateRef, + wait, +} from './utils' + +const SIDE_SHEET_WIDTH_MIN = 280 +const SIDE_SHEET_WIDTH_MAX = 360 +const SIDE_SHEET_WIDTH_RATIO = 0.32 +const SIDE_SHEET_WIDTH_STEP = 4 + +const MODAL_INSET_TOP = 0 +const MODAL_INSET_BOTTOM = 0 +const MODAL_INSET_END = 0 +const PANEL_TRANSITION_MS = m3MotionDurations.medium2 +const PANEL_TRANSITION_EASING = m3MotionEasings.standard +const SCRIM_FADE_MS = m3MotionDurations.long2 + +type NavTab = 'inbox' | 'boards' | 'archive' | 'lab' +type ModalRole = 'surface-container-low' | 'surface-container-high' + +const SurfaceSideSheetDismissToRemove: FC = () => { + const [navExpanded, setNavExpanded] = useStateRef(false) + const [activeNavTab, setActiveNavTab] = useStateRef('inbox') + const [sideSheetModal, setSideSheetModal, sideSheetModalRef] = useStateRef(false) + const [sheetRemoved, setSheetRemoved, sheetRemovedRef] = useStateRef(false) + const [sideSheetWidth, setSideSheetWidth, sideSheetWidthRef] = useStateRef(320) + const [sideSheetDockedWidth, setSideSheetDockedWidth] = useStateRef(sideSheetWidthRef.current) + const [modalShown, setModalShown] = useStateRef(false) + const [modalVisible, setModalVisible] = useStateRef(false) + const [modalWidth, setModalWidth] = useStateRef(sideSheetWidthRef.current) + const [modalInsetTop, setModalInsetTop] = useStateRef(MODAL_INSET_TOP) + const [modalInsetRight, setModalInsetRight] = useStateRef(-(sideSheetWidthRef.current + 12)) + const [modalInsetBottom, setModalInsetBottom] = useStateRef(MODAL_INSET_BOTTOM) + const [modalRadiusLeft, setModalRadiusLeft] = useStateRef(0) + const [modalElevation, setModalElevation] = useStateRef(0) + const [modalRole, setModalRole] = useStateRef('surface-container-low') + const [transitioning, setTransitioning, transitioningRef] = useStateRef(false) + + const dockedHost = useRef(null) + const layoutRoot = useRef(null) + + const hiddenInsetRight = (width: number) => -(width + 12) + + const resolveSheetWidthFromLayout = () => { + const layoutWidth = Math.round(layoutRoot.current?.getBoundingClientRect().width ?? window.innerWidth) + const estimated = Math.round((layoutWidth * SIDE_SHEET_WIDTH_RATIO) / SIDE_SHEET_WIDTH_STEP) * SIDE_SHEET_WIDTH_STEP + + return clamp(estimated, SIDE_SHEET_WIDTH_MIN, SIDE_SHEET_WIDTH_MAX) + } + + const syncFixedWidth = () => { + const nextWidth = resolveSheetWidthFromLayout() + + setSideSheetWidth(nextWidth) + setModalWidth(nextWidth) + + if (sheetRemovedRef.current) { + setSideSheetDockedWidth(0) + setModalInsetRight(hiddenInsetRight(nextWidth)) + return + } + + if (!sideSheetModalRef.current) { + setSideSheetDockedWidth(nextWidth) + setModalInsetRight(hiddenInsetRight(nextWidth)) + } + } + + const measureDockedGeometry = () => { + const host = dockedHost.current + if (!host) { + return null + } + + const rect = host.getBoundingClientRect() + + return { + width: Math.round(rect.width), + insetTop: Math.round(rect.top), + insetRight: Math.round(window.innerWidth - rect.right), + insetBottom: Math.round(window.innerHeight - rect.bottom), + } + } + + const setModalGeometryFromDocked = () => { + const docked = measureDockedGeometry() + + setModalWidth(docked?.width ?? sideSheetWidthRef.current) + setModalInsetTop(docked?.insetTop ?? MODAL_INSET_TOP) + setModalInsetRight(docked?.insetRight ?? MODAL_INSET_END) + setModalInsetBottom(docked?.insetBottom ?? MODAL_INSET_BOTTOM) + } + + const setModalGeometryTarget = () => { + setModalWidth(sideSheetWidthRef.current) + setModalInsetTop(MODAL_INSET_TOP) + setModalInsetRight(MODAL_INSET_END) + setModalInsetBottom(MODAL_INSET_BOTTOM) + } + + const switchDockedToModal = async () => { + if (sheetRemovedRef.current) { + return + } + + syncFixedWidth() + setModalGeometryFromDocked() + + setModalRadiusLeft(0) + setModalElevation(0) + setModalRole('surface-container-low') + setModalVisible(false) + setModalShown(true) + + await raf() + + setModalVisible(true) + await raf() + + setSideSheetModal(true) + setSideSheetDockedWidth(0) + setModalGeometryTarget() + setModalRadiusLeft(28) + setModalElevation(1) + setModalRole('surface-container-high') + await wait(PANEL_TRANSITION_MS) + } + + const dismissModalAndRemove = async () => { + if (!sideSheetModalRef.current) { + return + } + + setModalInsetTop(MODAL_INSET_TOP) + setModalInsetBottom(MODAL_INSET_BOTTOM) + setModalInsetRight(hiddenInsetRight(sideSheetWidthRef.current)) + setModalElevation(0) + setModalRole('surface-container-low') + setModalRadiusLeft(0) + await wait(PANEL_TRANSITION_MS) + + setModalVisible(false) + await wait(SCRIM_FADE_MS) + setModalShown(false) + setSideSheetModal(false) + setSideSheetDockedWidth(0) + setSheetRemoved(true) + } + + const handleTopbarAction = async () => { + if (transitioningRef.current || sheetRemovedRef.current) { + return + } + + setTransitioning(true) + + if (!sideSheetModalRef.current) { + await switchDockedToModal() + setTransitioning(false) + return + } + + await dismissModalAndRemove() + setTransitioning(false) + } + + const closeModalFromPanel = async () => { + if (!sideSheetModalRef.current || transitioningRef.current) { + return + } + + setTransitioning(true) + await dismissModalAndRemove() + setTransitioning(false) + } + + useEffect(() => { + const onResize = () => { + syncFixedWidth() + } + + syncFixedWidth() + window.addEventListener('resize', onResize, { passive: true }) + + return () => { + window.removeEventListener('resize', onResize) + } + }, []) + + return ( +
+ +
+
+ Surface orchestration: side sheet remove flow +

After modal close, the side sheet is removed from the page instead of returning to docked mode.

+
+ + void handleTopbarAction()} + > + { + sheetRemoved + ? 'Side sheet removed' + : (sideSheetModal ? 'Close modal and remove sheet' : 'Switch to modal sheet') + } + +
+
+ + + + setNavExpanded(true)} + > + + + + + { + setActiveNavTab('inbox') + setNavExpanded(false) + }} + > + + + + { + setActiveNavTab('boards') + setNavExpanded(false) + }} + > + + + + { + setActiveNavTab('archive') + setNavExpanded(false) + }} + > + + + + { + setActiveNavTab('lab') + setNavExpanded(false) + }} + > + + + + +
+
+ +

Workspace surfaces

+

Static blocks keep flow while side-sheet changes modality.

+
+ +
+
+ + surface-container-lowest +

Read-heavy content block in the page flow.

+
+ + + surface-container-low +

Secondary block with mild emphasis.

+
+ + + surface-container-high +

Contextual utility content.

+
+ + + surface-dim +

Low-brightness complementary content.

+
+
+ + {!sheetRemoved ? ( +
+ {!sideSheetModal && !sheetRemoved ? ( + +

Docked side sheet

+

Coplanar layout participant with fixed width per layout region.

+

Main content remains interactive.

+

+ Fixed width: {sideSheetWidth}px +

+
+ ) : null} +
+ ) : null} + + {modalShown ? ( + void closeModalFromPanel()} + > +
+

Modal side sheet

+ + {sideSheetModal ? ( + void closeModalFromPanel()} + > + + + ) : null} +
+ +

Layer rebind: docked layer to modal layer.

+

Anchored to end/right edge with full-height modal surface.

+

Closing this modal removes the side sheet from the scene.

+

+ Fixed width: {modalWidth}px +

+
+ ) : null} +
+
+
+
+ ) +} + +export default SurfaceSideSheetDismissToRemove diff --git a/m3-react/storybook/examples/surface/SurfaceSideSheetModalToWindow.tsx b/m3-react/storybook/examples/surface/SurfaceSideSheetModalToWindow.tsx new file mode 100644 index 0000000..7969c83 --- /dev/null +++ b/m3-react/storybook/examples/surface/SurfaceSideSheetModalToWindow.tsx @@ -0,0 +1,609 @@ +import type { + CSSProperties, + FC, + FormEvent, +} from 'react' +import type { M3SelectOption } from '@/components/select' + +import { M3Button } from '@/components/button' +import { M3Icon } from '@/components/icon' +import { M3IconButton } from '@/components/icon-button' +import { + M3Navigation, + M3NavigationTab, +} from '@/components/navigation' +import { M3Select } from '@/components/select' +import { M3Surface } from '@/components/surface' +import { M3TextField } from '@/components/text-field' +import { + m3MotionDurations, + m3MotionEasings, +} from '@modulify/m3-foundation/lib/motion' + +import { + useEffect, + useRef, +} from 'react' + +import { toClassName } from '@/utils/styling' + +import { + clamp, + raf, + useStateRef, + wait, +} from './utils' + +const SIDE_SHEET_WIDTH_MIN = 280 +const SIDE_SHEET_WIDTH_MAX = 360 +const SIDE_SHEET_WIDTH_RATIO = 0.32 +const SIDE_SHEET_WIDTH_STEP = 4 + +const WINDOW_WIDTH_MIN = 440 +const WINDOW_WIDTH_MAX = 920 +const WINDOW_WIDTH_RATIO = 0.72 +const WINDOW_WIDTH_STEP = 8 + +const MODAL_INSET_TOP = 0 +const MODAL_INSET_BOTTOM = 0 +const MODAL_INSET_END = 0 +const PANEL_TRANSITION_MS = m3MotionDurations.medium4 +const PANEL_TRANSITION_EASING = m3MotionEasings.standard +const SCRIM_FADE_MS = m3MotionDurations.long2 +const DIALOG_HIDE_MS = m3MotionDurations.long2 + +type NavTab = 'inbox' | 'boards' | 'archive' | 'lab' +type Priority = 'low' | 'normal' | 'high' + +type FormState = { + project: string; + ownerEmail: string; + startDate: string; + priority: Priority; + notes: string; +} + +const DEFAULT_FORM: FormState = { + project: 'Q3 Design Refresh', + ownerEmail: 'owner@example.com', + startDate: '2026-03-01', + priority: 'normal', + notes: 'Move supplemental workflows into a reusable surface with predictable transitions.', +} + +const priorityOptions: Array> = [{ + label: 'Low', + value: 'low', +}, { + label: 'Normal', + value: 'normal', +}, { + label: 'High', + value: 'high', +}] + +const SurfaceSideSheetModalToWindow: FC = () => { + const [navExpanded, setNavExpanded] = useStateRef(false) + const [activeNavTab, setActiveNavTab] = useStateRef('inbox') + const [sideSheetWidth, setSideSheetWidth, sideSheetWidthRef] = useStateRef(320) + const [windowWidth, setWindowWidth] = useStateRef(720) + + const [modalInsetRight, setModalInsetRight] = useStateRef(-(sideSheetWidthRef.current + 12)) + const [modalRadiusLeft, setModalRadiusLeft] = useStateRef(0) + const [modalElevationBase, setModalElevationBase] = useStateRef(0) + + const [modalMounted, setModalMounted, modalMountedRef] = useStateRef(false) + const [modalVisible, setModalVisible] = useStateRef(false) + const [panelAsWindow, setPanelAsWindow, panelAsWindowRef] = useStateRef(false) + const [windowClosing, setWindowClosing] = useStateRef(false) + const [transitioning, setTransitioning, transitioningRef] = useStateRef(false) + const [form, setForm] = useStateRef({ ...DEFAULT_FORM }) + + const layoutRoot = useRef(null) + + const panelAnchor = panelAsWindow ? 'center' : 'end' + const panelWidth = panelAsWindow ? windowWidth : sideSheetWidth + const panelInsetRight = panelAsWindow ? 0 : modalInsetRight + const panelRoundingTopLeft = panelAsWindow ? 28 : modalRadiusLeft + const panelRoundingBottomLeft = panelAsWindow ? 28 : modalRadiusLeft + const panelRoundingTopRight = panelAsWindow ? 28 : 0 + const panelRoundingBottomRight = panelAsWindow ? 28 : 0 + const panelSurfaceRole = panelAsWindow ? 'surface-container-highest' : 'surface-container-high' + const panelElevation = panelAsWindow ? Math.max(2, modalElevationBase) : modalElevationBase + const panelTransitionMs = panelAsWindow && windowClosing + ? DIALOG_HIDE_MS + : PANEL_TRANSITION_MS + const panelTransitionTiming = PANEL_TRANSITION_EASING + const panelInlineStyle: CSSProperties = panelAsWindow && windowClosing + ? { + opacity: 0, + transform: 'translate(-50%, calc(-50% - 24px))', + } + : {} + + const hiddenInsetRight = (width: number) => -(width + 12) + + const resolveSheetWidthFromLayout = () => { + const layoutWidth = Math.round(layoutRoot.current?.getBoundingClientRect().width ?? window.innerWidth) + const estimated = Math.round((layoutWidth * SIDE_SHEET_WIDTH_RATIO) / SIDE_SHEET_WIDTH_STEP) * SIDE_SHEET_WIDTH_STEP + + return clamp(estimated, SIDE_SHEET_WIDTH_MIN, SIDE_SHEET_WIDTH_MAX) + } + + const resolveWindowWidth = () => { + const estimated = Math.round((window.innerWidth * WINDOW_WIDTH_RATIO) / WINDOW_WIDTH_STEP) * WINDOW_WIDTH_STEP + + return clamp(estimated, WINDOW_WIDTH_MIN, WINDOW_WIDTH_MAX) + } + + const syncDimensions = () => { + const nextSheetWidth = resolveSheetWidthFromLayout() + setSideSheetWidth(nextSheetWidth) + setWindowWidth(resolveWindowWidth()) + + if (!modalMountedRef.current) { + setModalInsetRight(hiddenInsetRight(nextSheetWidth)) + } + } + + const openModal = async () => { + if (transitioningRef.current || modalMountedRef.current) { + return + } + + setTransitioning(true) + setPanelAsWindow(false) + setWindowClosing(false) + syncDimensions() + + setModalRadiusLeft(0) + setModalElevationBase(0) + setModalInsetRight(hiddenInsetRight(sideSheetWidthRef.current)) + setModalMounted(true) + + await raf() + + setModalVisible(true) + await raf() + + setModalInsetRight(MODAL_INSET_END) + setModalRadiusLeft(28) + setModalElevationBase(1) + await wait(PANEL_TRANSITION_MS) + setTransitioning(false) + } + + const toggleWindowMode = async () => { + if (transitioningRef.current || !modalMountedRef.current) { + return + } + + setTransitioning(true) + + if (!panelAsWindowRef.current) { + setPanelAsWindow(true) + await wait(PANEL_TRANSITION_MS) + setTransitioning(false) + return + } + + setPanelAsWindow(false) + await wait(PANEL_TRANSITION_MS) + setTransitioning(false) + } + + const closeWindowModal = async () => { + setWindowClosing(true) + await wait(DIALOG_HIDE_MS) + + setModalVisible(false) + await wait(SCRIM_FADE_MS) + setModalMounted(false) + + setModalInsetRight(hiddenInsetRight(sideSheetWidthRef.current)) + setModalRadiusLeft(0) + setModalElevationBase(0) + setWindowClosing(false) + setPanelAsWindow(false) + } + + const closeSideSheetModal = async () => { + setModalInsetRight(hiddenInsetRight(sideSheetWidthRef.current)) + setModalRadiusLeft(0) + setModalElevationBase(0) + await wait(PANEL_TRANSITION_MS) + + setModalVisible(false) + await wait(SCRIM_FADE_MS) + setModalMounted(false) + } + + const closeModal = async () => { + if (transitioningRef.current || !modalMountedRef.current) { + return + } + + setTransitioning(true) + + if (panelAsWindowRef.current) { + await closeWindowModal() + setTransitioning(false) + return + } + + await closeSideSheetModal() + setTransitioning(false) + } + + const resetForm = () => { + setForm({ ...DEFAULT_FORM }) + } + + useEffect(() => { + const onResize = () => { + syncDimensions() + } + + syncDimensions() + window.addEventListener('resize', onResize, { passive: true }) + + return () => { + window.removeEventListener('resize', onResize) + } + }, []) + + return ( +
+ +
+
+ Surface orchestration: modal side sheet to window +

Use the action inside the panel to morph a modal side sheet into a modal window.

+
+ + void openModal()} + > + {modalMounted ? 'Modal panel is open' : 'Show modal side sheet'} + +
+
+ + + + setNavExpanded(true)} + > + + + + + { + setActiveNavTab('inbox') + setNavExpanded(false) + }} + > + + + + { + setActiveNavTab('boards') + setNavExpanded(false) + }} + > + + + + { + setActiveNavTab('archive') + setNavExpanded(false) + }} + > + + + + { + setActiveNavTab('lab') + setNavExpanded(false) + }} + > + + + + +
+
+ +

Workspace surfaces

+

Background layout stays in flow while the modal panel morphs between side-sheet and window geometries.

+
+ +
+
+ + surface-container-lowest +

Read-heavy content block in the page flow.

+
+ + + surface-container-low +

Secondary block with mild emphasis.

+
+ + + surface-container-high +

Contextual utility content.

+
+ + + surface-dim +

Low-brightness complementary content.

+
+
+ + {modalMounted ? ( + void closeModal()} + > +
+
+

{panelAsWindow ? 'Window mode' : 'Modal side sheet'}

+ +
+ void toggleWindowMode()} + > + + + + void closeModal()} + > + + +
+
+ +

Form layout adapts when switching from side-sheet to window mode.

+ +
) => event.preventDefault()} + > +
+ { + setForm((previous) => ({ + ...previous, + project: value, + })) + }} + /> +
+ +
+ { + setForm((previous) => ({ + ...previous, + ownerEmail: value, + })) + }} + /> +
+ +
+ { + setForm((previous) => ({ + ...previous, + startDate: value, + })) + }} + /> +
+ +
+ + value={form.priority} + options={priorityOptions} + label="Priority" + outlined + onUpdate={(value) => { + setForm((previous) => ({ + ...previous, + priority: value, + })) + }} + /> +
+ +
+ { + setForm((previous) => ({ + ...previous, + notes: value, + })) + }} + /> +
+ +
+ + Reset + + + Save + +
+
+
+
+ ) : null} +
+
+
+
+ ) +} + +export default SurfaceSideSheetModalToWindow diff --git a/m3-react/storybook/examples/surface/SurfaceSideSheetMorph.tsx b/m3-react/storybook/examples/surface/SurfaceSideSheetMorph.tsx new file mode 100644 index 0000000..a8e72ea --- /dev/null +++ b/m3-react/storybook/examples/surface/SurfaceSideSheetMorph.tsx @@ -0,0 +1,487 @@ +import type { FC } from 'react' + +import { M3Button } from '@/components/button' +import { M3Icon } from '@/components/icon' +import { M3IconButton } from '@/components/icon-button' +import { + M3Navigation, + M3NavigationTab, +} from '@/components/navigation' +import { M3Surface } from '@/components/surface' +import { + m3MotionDurations, + m3MotionEasings, +} from '@modulify/m3-foundation/lib/motion' + +import { + useEffect, + useRef, +} from 'react' + +import { + clamp, + raf, + useStateRef, + wait, +} from './utils' + +const SIDE_SHEET_WIDTH_MIN = 280 +const SIDE_SHEET_WIDTH_MAX = 360 +const SIDE_SHEET_WIDTH_RATIO = 0.32 +const SIDE_SHEET_WIDTH_STEP = 4 + +const MODAL_INSET_TOP = 0 +const MODAL_INSET_BOTTOM = 0 +const MODAL_INSET_END = 0 +const PANEL_TRANSITION_MS = m3MotionDurations.medium2 +const PANEL_VERTICAL_EXPAND_MS = 120 +const PANEL_TRANSITION_EASING = m3MotionEasings.standard + +type NavTab = 'inbox' | 'boards' | 'archive' | 'lab' +type ModalRole = 'surface-container-low' | 'surface-container-high' + +const SurfaceSideSheetMorph: FC = () => { + const [navExpanded, setNavExpanded] = useStateRef(false) + const [activeNavTab, setActiveNavTab] = useStateRef('inbox') + const [sideSheetModal, setSideSheetModal, sideSheetModalRef] = useStateRef(false) + const [sideSheetWidth, setSideSheetWidth, sideSheetWidthRef] = useStateRef(320) + const [sideSheetDockedWidth, setSideSheetDockedWidth] = useStateRef(sideSheetWidthRef.current) + const [modalShown, setModalShown] = useStateRef(false) + const [modalVisible, setModalVisible] = useStateRef(false) + const [modalWidth, setModalWidth, modalWidthRef] = useStateRef(sideSheetWidthRef.current) + const [modalInsetTop, setModalInsetTop] = useStateRef(MODAL_INSET_TOP) + const [modalInsetRight, setModalInsetRight] = useStateRef(-(sideSheetWidthRef.current + 12)) + const [modalInsetBottom, setModalInsetBottom] = useStateRef(MODAL_INSET_BOTTOM) + const [modalRadiusLeft, setModalRadiusLeft] = useStateRef(0) + const [modalElevation, setModalElevation] = useStateRef(0) + const [modalRole, setModalRole] = useStateRef('surface-container-low') + const [modalTransitionMs, setModalTransitionMs] = useStateRef(PANEL_TRANSITION_MS) + const [transitioning, setTransitioning, transitioningRef] = useStateRef(false) + + const dockedHost = useRef(null) + const layoutRoot = useRef(null) + + const hiddenInsetRight = (width: number) => -(width + 12) + + const resolveSheetWidthFromLayout = () => { + const layoutWidth = Math.round(layoutRoot.current?.getBoundingClientRect().width ?? window.innerWidth) + const estimated = Math.round((layoutWidth * SIDE_SHEET_WIDTH_RATIO) / SIDE_SHEET_WIDTH_STEP) * SIDE_SHEET_WIDTH_STEP + + return clamp(estimated, SIDE_SHEET_WIDTH_MIN, SIDE_SHEET_WIDTH_MAX) + } + + const syncFixedWidth = () => { + const nextWidth = resolveSheetWidthFromLayout() + + setSideSheetWidth(nextWidth) + setModalWidth(nextWidth) + + if (!sideSheetModalRef.current) { + setSideSheetDockedWidth(nextWidth) + setModalInsetRight(hiddenInsetRight(nextWidth)) + } + + return nextWidth + } + + const measureDockedGeometry = () => { + const host = dockedHost.current + if (!host) { + return null + } + + const rect = host.getBoundingClientRect() + + return { + width: Math.round(rect.width), + insetTop: Math.round(rect.top), + insetRight: Math.round(window.innerWidth - rect.right), + insetBottom: Math.round(window.innerHeight - rect.bottom), + } + } + + const setModalGeometryFromDocked = (fallbackWidth: number) => { + const docked = measureDockedGeometry() + + setModalWidth(docked?.width ?? fallbackWidth) + setModalInsetTop(docked?.insetTop ?? MODAL_INSET_TOP) + setModalInsetRight(docked?.insetRight ?? MODAL_INSET_END) + setModalInsetBottom(docked?.insetBottom ?? MODAL_INSET_BOTTOM) + } + + const setModalGeometryTarget = (width: number) => { + setModalWidth(width) + setModalInsetTop(MODAL_INSET_TOP) + setModalInsetRight(MODAL_INSET_END) + setModalInsetBottom(MODAL_INSET_BOTTOM) + } + + const expandModalToViewportHeight = async (width: number) => { + setModalTransitionMs(PANEL_VERTICAL_EXPAND_MS) + await raf() + setModalGeometryTarget(width) + await wait(PANEL_VERTICAL_EXPAND_MS) + setModalTransitionMs(PANEL_TRANSITION_MS) + } + + const resolveDockedTargetGeometry = (width: number) => { + const layout = layoutRoot.current?.getBoundingClientRect() + + if (!layout) { + return { + width, + insetTop: MODAL_INSET_TOP, + insetRight: MODAL_INSET_END, + insetBottom: MODAL_INSET_BOTTOM, + } + } + + return { + width, + insetTop: Math.round(layout.top), + insetRight: Math.round(window.innerWidth - layout.right), + insetBottom: Math.round(window.innerHeight - layout.bottom), + } + } + + const switchDockedToModal = async () => { + const nextWidth = syncFixedWidth() + setModalGeometryFromDocked(nextWidth) + + setModalTransitionMs(PANEL_TRANSITION_MS) + setModalRadiusLeft(0) + setModalElevation(0) + setModalRole('surface-container-low') + setModalVisible(false) + setModalShown(true) + + await raf() + + setModalVisible(true) + await raf() + + setSideSheetModal(true) + setSideSheetDockedWidth(0) + setModalWidth(nextWidth) + setModalInsetRight(MODAL_INSET_END) + setModalRadiusLeft(28) + setModalElevation(1) + setModalRole('surface-container-high') + await wait(PANEL_TRANSITION_MS) + + await expandModalToViewportHeight(nextWidth) + } + + const switchModalToDocked = async () => { + const nextWidth = syncFixedWidth() + const dockedTarget = resolveDockedTargetGeometry(nextWidth) + + setModalTransitionMs(PANEL_TRANSITION_MS) + setModalElevation(0) + setModalRole('surface-container-low') + setModalRadiusLeft(0) + + setSideSheetDockedWidth(nextWidth) + setModalWidth(dockedTarget.width) + setModalInsetTop(dockedTarget.insetTop) + setModalInsetRight(dockedTarget.insetRight) + setModalInsetBottom(dockedTarget.insetBottom) + + await wait(PANEL_TRANSITION_MS) + + setSideSheetModal(false) + setModalVisible(false) + setModalShown(false) + + setModalInsetTop(MODAL_INSET_TOP) + setModalInsetRight(hiddenInsetRight(nextWidth)) + setModalInsetBottom(MODAL_INSET_BOTTOM) + } + + const toggleSideSheetMode = async () => { + if (transitioningRef.current) { + return + } + + setTransitioning(true) + + if (!sideSheetModalRef.current) { + await switchDockedToModal() + setTransitioning(false) + return + } + + await switchModalToDocked() + setTransitioning(false) + } + + const closeModalFromPanel = async () => { + if (!sideSheetModalRef.current || transitioningRef.current) { + return + } + + setTransitioning(true) + await switchModalToDocked() + setTransitioning(false) + } + + useEffect(() => { + const onResize = () => { + syncFixedWidth() + } + + syncFixedWidth() + window.addEventListener('resize', onResize, { passive: true }) + + return () => { + window.removeEventListener('resize', onResize) + } + }, []) + + return ( +
+ +
+
+ Surface orchestration: side sheet morph +

Docked sheet transitions into modal sheet with fixed width, right-edge anchoring, and full-height modal target.

+
+ + void toggleSideSheetMode()} + > + {sideSheetModal ? 'Switch to docked sheet' : 'Switch to modal sheet'} + +
+
+ + + + setNavExpanded(true)} + > + + + + + { + setActiveNavTab('inbox') + setNavExpanded(false) + }} + > + + + + { + setActiveNavTab('boards') + setNavExpanded(false) + }} + > + + + + { + setActiveNavTab('archive') + setNavExpanded(false) + }} + > + + + + { + setActiveNavTab('lab') + setNavExpanded(false) + }} + > + + + + +
+
+ +

Workspace surfaces

+

Static blocks keep flow while side-sheet changes modality.

+
+ +
+
+ + surface-container-lowest +

Read-heavy content block in the page flow.

+
+ + + surface-container-low +

Secondary block with mild emphasis.

+
+ + + surface-container-high +

Contextual utility content.

+
+ + + surface-dim +

Low-brightness complementary content.

+
+
+ +
+ {!sideSheetModal ? ( + +

Docked side sheet

+

Coplanar layout participant with fixed width per layout region.

+

Main content remains interactive.

+

+ Fixed width: {sideSheetWidth}px +

+
+ ) : null} +
+ + {modalShown ? ( + void closeModalFromPanel()} + > +
+

Modal side sheet

+ + {sideSheetModal ? ( + void closeModalFromPanel()} + > + + + ) : null} +
+ +

Layer rebind: docked layer to modal layer.

+

Anchored to end/right edge with full-height modal surface.

+

+ Fixed width: {modalWidth}px +

+
+ ) : null} +
+
+
+
+ ) +} + +export default SurfaceSideSheetMorph diff --git a/m3-react/storybook/examples/surface/styles.scss b/m3-react/storybook/examples/surface/styles.scss new file mode 100644 index 0000000..9712ca0 --- /dev/null +++ b/m3-react/storybook/examples/surface/styles.scss @@ -0,0 +1,628 @@ +@use '@modulify/m3-foundation/assets/stylesheets/basics/motion' as m3-motion; + +.surface-card-page { + --surface-scene-bg-0: var(--m3-sys-surface, var(--md-sys-color-surface, #fef7ff)); + --surface-scene-bg-1: var(--m3-sys-surface-container-low, var(--md-sys-color-surface-container-low, #f7f2fa)); + --surface-accent-a: rgba(103, 80, 164, 0.14); + --surface-accent-b: rgba(96, 125, 139, 0.16); + --surface-border: var(--m3-sys-outline-variant, rgba(73, 69, 79, 0.2)); + --surface-shadow: var(--m3-elevation-1, 0 2px 6px rgba(0, 0, 0, 0.14)); + --surface-canvas-bg: var(--m3-sys-surface-container-low, var(--m3-sys-surface, #fef7ff)); + --surface-origin-slot: color-mix(in srgb, var(--m3-sys-primary, #6750a4) 12%, transparent); + min-height: 100vh; + background: + radial-gradient(circle at 14% 4%, var(--surface-accent-a), transparent 38%), + radial-gradient(circle at 90% 8%, var(--surface-accent-b), transparent 38%), + linear-gradient(180deg, var(--surface-scene-bg-0) 0%, var(--surface-scene-bg-1) 100%); + color: var(--m3-sys-on-surface, var(--md-sys-color-on-surface, #1d1b20)); +} + +html.m3-theme-dark .surface-card-page { + --surface-accent-a: rgba(208, 188, 255, 0.18); + --surface-accent-b: rgba(128, 203, 196, 0.16); +} + +.surface-card-page__topbar-content { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.surface-card-page__topbar-content strong { + display: block; + font: 700 15px/1.3 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-card-page__topbar-content p { + margin: 4px 0 0; + font: 400 12px/1.35 'Trebuchet MS', 'Segoe UI', sans-serif; + opacity: 0.8; +} + +.surface-card-page__body { + display: flex; + height: calc(100vh - 72px); + padding-left: var(--m3-navigation-rail-width, 80px); +} + +@media (min-width: 1200px) { + .surface-card-page__body { + padding-left: var(--m3-navigation-drawer-width, 360px); + } +} + +.surface-card-page__nav.m3-navigation { + top: 72px; + height: calc(100vh - 72px); +} + +.surface-card-page__workspace { + flex: 1 1 auto; + min-width: 0; + min-height: 0; + padding: 20px; + display: flex; + flex-direction: column; + gap: 14px; +} + +.surface-card-page__topbar { + padding: 16px; +} + +.surface-card-page__header-card { + padding: 18px; +} + +.surface-card-page__header-card h3 { + margin: 0 0 8px; + font: 700 17px/1.3 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-card-page__header-card p { + margin: 0; + font: 400 12px/1.35 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-card-page__canvas { + flex: 1 1 auto; + position: relative; + min-height: 0; + border-radius: 20px; + overflow: hidden; + background: var(--surface-canvas-bg); + box-shadow: 0 14px 28px var(--surface-shadow); +} + +.surface-card-page__grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 12px; + padding: 14px; +} + +.surface-card-page__grid > .surface-card-page__grid-card { + padding: 16px; +} + +.surface-card-page__grid p { + margin: 6px 0 0; + font: 400 12px/1.35 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-card-page__origin-slot { + border-radius: 24px; + border: 1px dashed var(--surface-border); + background: var(--surface-origin-slot); +} + +.surface-card-page__overlay { + position: absolute; + inset: 0; + pointer-events: none; +} + +.surface-card-page__overlay-wrap { + position: absolute; + transition: + top #{m3-motion.duration('medium3')} #{m3-motion.easing('standard')}, + left #{m3-motion.duration('medium3')} #{m3-motion.easing('standard')}, + width #{m3-motion.duration('medium3')} #{m3-motion.easing('standard')}, + height #{m3-motion.duration('medium3')} #{m3-motion.easing('standard')}; +} + +.surface-card-page__morph-surface { + pointer-events: auto; +} + +.surface-card-page__morph-surface_compact { + padding: 20px; +} + +.surface-card-page__morph-surface_expanded { + padding: 28px; +} + +.surface-card-page__morph-nested { + padding: 14px; +} + +.surface-card-page__morph-surface h3 { + margin: 0 0 8px; + font: 700 18px/1.3 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-card-page__morph-surface p { + margin: 0 0 12px; + font: 400 13px/1.4 'Trebuchet MS', 'Segoe UI', sans-serif; + max-width: 70ch; +} + +.surface-dialog-chain { + --surface-scene-bg-0: var(--m3-sys-surface, var(--md-sys-color-surface, #fef7ff)); + --surface-scene-bg-1: var(--m3-sys-surface-container-low, var(--md-sys-color-surface-container-low, #f7f2fa)); + --surface-accent-a: color-mix(in srgb, var(--m3-sys-primary, var(--md-sys-color-primary, #6750a4)) 18%, transparent); + --surface-accent-b: color-mix(in srgb, var(--m3-sys-secondary, var(--md-sys-color-secondary, #625b71)) 16%, transparent); + --surface-layout-bg: var(--m3-sys-surface-container, var(--md-sys-color-surface-container, #f3edf7)); + min-height: 100vh; + background: + radial-gradient(circle at 8% 0%, var(--surface-accent-a), transparent 42%), + radial-gradient(circle at 92% 0%, var(--surface-accent-b), transparent 44%), + linear-gradient(180deg, var(--surface-scene-bg-0) 0%, var(--surface-scene-bg-1) 100%); + color: var(--m3-sys-on-surface, var(--md-sys-color-on-surface, #1d1b20)); +} + +.surface-dialog-chain__topbar-content { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.surface-dialog-chain__topbar-content strong { + display: block; + font: 700 15px/1.3 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-dialog-chain__topbar-content p { + margin: 4px 0 0; + font: 400 12px/1.35 'Trebuchet MS', 'Segoe UI', sans-serif; + opacity: 0.82; +} + +.surface-dialog-chain__body { + display: flex; + height: calc(100vh - 72px); + padding-left: var(--m3-navigation-rail-width, 80px); +} + +.surface-dialog-chain__nav.m3-navigation { + top: 72px; + height: calc(100vh - 72px); +} + +.surface-dialog-chain__workspace { + flex: 1 1 auto; + min-width: 0; + padding: 20px; + display: flex; + flex-direction: column; + gap: 14px; +} + +.surface-dialog-chain__topbar { + padding: 16px; +} + +.surface-dialog-chain__workspace-intro { + padding: 20px; +} + +.surface-dialog-chain__workspace h3, +.surface-dialog-chain__workspace h4 { + margin: 0 0 8px; + font: 700 17px/1.3 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-dialog-chain__workspace p { + margin: 0; + font: 400 12px/1.35 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-dialog-chain__canvas { + flex: 1 1 auto; + min-height: 220px; + padding: 18px; + background: var(--surface-layout-bg); +} + +.surface-dialog-chain__dialog { + overflow: visible; +} + +.surface-dialog-chain__dialog_level-1 { + padding: 24px; +} + +.surface-dialog-chain__dialog_level-2 { + padding: 22px; +} + +.surface-dialog-chain__dialog_level-3 { + padding: 20px; +} + +.surface-dialog-chain__dialog_level-4 { + padding: 18px; +} + +.surface-dialog-chain__dialog-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; +} + +.surface-dialog-chain__dialog-head h3 { + margin: 0; + font: 700 18px/1.3 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-dialog-chain__dialog p { + margin: 8px 0 0; + font: 400 13px/1.4 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-dialog-chain__dialog-actions { + margin-top: 14px; + display: flex; + align-items: center; + gap: 10px; +} + +.surface-side-sheet { + --surface-scene-bg-0: var(--m3-sys-surface, var(--md-sys-color-surface, #fef7ff)); + --surface-scene-bg-1: var(--m3-sys-surface-container-low, var(--md-sys-color-surface-container-low, #f7f2fa)); + --surface-accent-a: color-mix(in srgb, var(--m3-sys-primary, var(--md-sys-color-primary, #6750a4)) 18%, transparent); + --surface-accent-b: color-mix(in srgb, var(--m3-sys-secondary, var(--md-sys-color-secondary, #625b71)) 16%, transparent); + --surface-border: var(--m3-sys-outline-variant, var(--md-sys-color-outline-variant, rgba(73, 69, 79, 0.2))); + --surface-shadow-color: color-mix(in srgb, var(--m3-sys-shadow, #000000) 22%, transparent); + --surface-layout-bg: var(--m3-sys-surface-container, var(--md-sys-color-surface-container, #f3edf7)); + --surface-grid-bg: var(--m3-sys-surface-container-low, var(--md-sys-color-surface-container-low, #f7f2fa)); + --surface-panel-transition-ms: #{m3-motion.duration('medium2')}; + --surface-panel-transition-easing: #{m3-motion.easing('standard')}; + min-height: 100vh; + background: + radial-gradient(circle at 8% 0%, var(--surface-accent-a), transparent 42%), + radial-gradient(circle at 92% 0%, var(--surface-accent-b), transparent 44%), + linear-gradient(180deg, var(--surface-scene-bg-0) 0%, var(--surface-scene-bg-1) 100%); + color: var(--m3-sys-on-surface, var(--md-sys-color-on-surface, #1d1b20)); +} + +.surface-side-sheet__topbar-content { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.surface-side-sheet__topbar-content strong { + display: block; + font: 700 15px/1.3 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-side-sheet__topbar-content p { + margin: 4px 0 0; + font: 400 12px/1.35 'Trebuchet MS', 'Segoe UI', sans-serif; + opacity: 0.82; +} + +.surface-side-sheet__body { + display: flex; + height: calc(100vh - 72px); + padding-left: var(--m3-navigation-rail-width, 80px); +} + +@media (min-width: 1200px) { + .surface-side-sheet__body { + padding-left: var(--m3-navigation-drawer-width, 360px); + } +} + +.surface-side-sheet__nav.m3-navigation { + top: 72px; + height: calc(100vh - 72px); +} + +.surface-side-sheet__workspace { + flex: 1 1 auto; + min-width: 0; + padding: 20px; + display: flex; + flex-direction: column; + gap: 14px; +} + +.surface-side-sheet__topbar { + padding: 16px; +} + +.surface-side-sheet__header-card { + padding: 18px; +} + +.surface-side-sheet__header-card h3 { + margin: 0 0 8px; + font: 700 17px/1.3 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-side-sheet__header-card p { + margin: 0; + font: 400 12px/1.35 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-side-sheet__layout { + min-height: 440px; + display: flex; + overflow: hidden; + border-radius: 20px; + background: var(--surface-layout-bg); + box-shadow: 0 14px 28px var(--surface-shadow-color); +} + +.surface-side-sheet__content-grid { + flex: 1 1 auto; + min-width: 0; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-auto-rows: min-content; + gap: 12px; + padding: 14px; + align-content: flex-start; + align-items: start; + background: var(--surface-grid-bg); +} + +.surface-side-sheet__content-grid > .surface-side-sheet__grid-surface { + padding: 18px; +} + +.surface-side-sheet__content-grid p { + margin: 6px 0 0; + font: 400 12px/1.35 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-side-sheet__docked-host { + flex: 0 0 auto; + min-width: 0; + overflow: hidden; + border-left: 1px solid var(--surface-border); + transition: width var(--surface-panel-transition-ms) var(--surface-panel-transition-easing); +} + +.surface-side-sheet__sheet h3 { + margin: 0 0 8px; + font: 700 17px/1.3 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-side-sheet__sheet { + padding: 20px; +} + +.surface-side-sheet__sheet_modal { + padding: 24px; +} + +.surface-side-sheet__modal-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; +} + +.surface-side-sheet__modal-close { + flex: 0 0 auto; +} + +.surface-side-sheet__sheet p { + margin: 0 0 8px; + font: 400 13px/1.4 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-side-sheet__sheet .surface-side-sheet__meta { + margin-top: 14px; + font: 600 11px/1.2 'Trebuchet MS', 'Segoe UI', sans-serif; + letter-spacing: 0.04em; + opacity: 0.76; + text-transform: uppercase; +} + +.surface-side-sheet-window { + --surface-scene-bg-0: var(--m3-sys-surface, var(--md-sys-color-surface, #fef7ff)); + --surface-scene-bg-1: var(--m3-sys-surface-container-low, var(--md-sys-color-surface-container-low, #f7f2fa)); + --surface-accent-a: color-mix(in srgb, var(--m3-sys-primary, var(--md-sys-color-primary, #6750a4)) 18%, transparent); + --surface-accent-b: color-mix(in srgb, var(--m3-sys-secondary, var(--md-sys-color-secondary, #625b71)) 16%, transparent); + --surface-shadow-color: color-mix(in srgb, var(--m3-sys-shadow, #000000) 22%, transparent); + --surface-layout-bg: var(--m3-sys-surface-container, var(--md-sys-color-surface-container, #f3edf7)); + --surface-grid-bg: var(--m3-sys-surface-container-low, var(--md-sys-color-surface-container-low, #f7f2fa)); + min-height: 100vh; + background: + radial-gradient(circle at 8% 0%, var(--surface-accent-a), transparent 42%), + radial-gradient(circle at 92% 0%, var(--surface-accent-b), transparent 44%), + linear-gradient(180deg, var(--surface-scene-bg-0) 0%, var(--surface-scene-bg-1) 100%); + color: var(--m3-sys-on-surface, var(--md-sys-color-on-surface, #1d1b20)); +} + +.surface-side-sheet-window__topbar-content { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.surface-side-sheet-window__topbar-content strong { + display: block; + font: 700 15px/1.3 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-side-sheet-window__topbar-content p { + margin: 4px 0 0; + font: 400 12px/1.35 'Trebuchet MS', 'Segoe UI', sans-serif; + opacity: 0.82; +} + +.surface-side-sheet-window__body { + display: flex; + height: calc(100vh - 72px); + padding-left: var(--m3-navigation-rail-width, 80px); +} + +@media (min-width: 1200px) { + .surface-side-sheet-window__body { + padding-left: var(--m3-navigation-drawer-width, 360px); + } +} + +.surface-side-sheet-window__nav.m3-navigation { + top: 72px; + height: calc(100vh - 72px); +} + +.surface-side-sheet-window__workspace { + flex: 1 1 auto; + min-width: 0; + padding: 20px; + display: flex; + flex-direction: column; + gap: 14px; +} + +.surface-side-sheet-window__topbar { + padding: 16px; +} + +.surface-side-sheet-window__header-card { + padding: 18px; +} + +.surface-side-sheet-window__header-card h3 { + margin: 0 0 8px; + font: 700 17px/1.3 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-side-sheet-window__header-card p { + margin: 0; + font: 400 12px/1.35 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-side-sheet-window__layout { + min-height: 440px; + display: flex; + overflow: hidden; + border-radius: 20px; + background: var(--surface-layout-bg); + box-shadow: 0 14px 28px var(--surface-shadow-color); +} + +.surface-side-sheet-window__content-grid { + flex: 1 1 auto; + min-width: 0; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-auto-rows: min-content; + gap: 12px; + padding: 14px; + align-content: flex-start; + align-items: start; + background: var(--surface-grid-bg); +} + +.surface-side-sheet-window__content-grid > .surface-side-sheet-window__grid-surface { + padding: 18px; +} + +.surface-side-sheet-window__content-grid p { + margin: 6px 0 0; + font: 400 12px/1.35 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-side-sheet-window__modal-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; +} + +.surface-side-sheet-window__sheet_sheet { + padding: 24px; +} + +.surface-side-sheet-window__sheet_window { + padding: 20px; +} + +.surface-side-sheet-window__modal-header h3 { + margin: 0; + font: 700 17px/1.3 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-side-sheet-window__modal-actions { + display: flex; + align-items: center; + gap: 6px; +} + +.surface-side-sheet-window__modal-action { + flex: 0 0 auto; +} + +.surface-side-sheet-window__sheet p { + margin: 8px 0 0; + font: 400 13px/1.4 'Trebuchet MS', 'Segoe UI', sans-serif; +} + +.surface-side-sheet-window__panel-content { + min-height: 0; +} + +.surface-side-sheet-window__form { + margin-top: 14px; + display: grid; + grid-template-columns: 1fr; + gap: 12px; +} + +.surface-side-sheet-window__form_window { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 14px; +} + +.surface-side-sheet-window__field { + display: grid; + gap: 6px; +} + +.surface-side-sheet-window__field_wide { + grid-column: 1 / -1; +} + +.surface-side-sheet-window__field .m3-text-field, +.surface-side-sheet-window__field .m3-select { + width: 100%; +} + +.surface-side-sheet-window__field_wide .m3-text-field textarea { + min-height: 120px; +} + +.surface-side-sheet-window__form-actions { + display: flex; + gap: 10px; + justify-content: flex-start; +} + +.surface-side-sheet-window__form-actions_window { + grid-column: 1 / -1; + justify-content: flex-end; +} diff --git a/m3-react/storybook/examples/surface/utils.ts b/m3-react/storybook/examples/surface/utils.ts new file mode 100644 index 0000000..3cb24ad --- /dev/null +++ b/m3-react/storybook/examples/surface/utils.ts @@ -0,0 +1,51 @@ +import { + useRef, + useState, +} from 'react' + +import type { + MutableRefObject, + SetStateAction, +} from 'react' + +export function wait (ms: number): Promise { + return new Promise((resolve) => { + setTimeout(() => resolve(), ms) + }) +} + +export function raf (): Promise { + return new Promise((resolve) => { + requestAnimationFrame(() => resolve()) + }) +} + +export function clamp (value: number, min: number, max: number): number { + return Math.min(max, Math.max(min, value)) +} + +export function useLatest (value: T): MutableRefObject { + const ref = useRef(value) + ref.current = value + return ref +} + +export function useStateRef ( + initial: T +): [T, (next: SetStateAction) => void, MutableRefObject] { + const [state, setState] = useState(initial) + const ref = useRef(state) + + const set = (next: SetStateAction) => { + setState((prev) => { + const resolved = typeof next === 'function' + ? (next as (previous: T) => T)(prev) + : next + + ref.current = resolved + return resolved + }) + } + + return [state, set, ref] +} diff --git a/m3-react/tests/M3Surface.test.tsx b/m3-react/tests/M3Surface.test.tsx new file mode 100644 index 0000000..7307efc --- /dev/null +++ b/m3-react/tests/M3Surface.test.tsx @@ -0,0 +1,112 @@ +import { + fireEvent, + render, + screen, +} from '@testing-library/react' + +import { M3Surface } from '@/components/surface' + +describe('m3-react/surface', () => { + test('applies deterministic default contract', () => { + render( + + Surface body + + ) + + const surface = screen.getByRole('region') + + expect(surface.classList.contains('m3-surface')).toBe(true) + expect(surface.style.width).toBe('100%') + expect(surface.style.height).toBe('100%') + expect(surface.style.margin).toBe('') + expect(surface.style.padding).toBe('') + expect(surface.style.borderTopLeftRadius).toBe('0px') + expect(surface.style.borderTopRightRadius).toBe('0px') + expect(surface.style.borderBottomRightRadius).toBe('0px') + expect(surface.style.borderBottomLeftRadius).toBe('0px') + expect(surface.style.boxSizing).toBe('') + }) + + test('supports global and per-corner rounding overrides', () => { + render( + + ) + + const surface = screen.getByRole('region') + + expect(surface.style.borderTopLeftRadius).toBe('4px') + expect(surface.style.borderTopRightRadius).toBe('16px') + expect(surface.style.borderBottomRightRadius).toBe('24px') + expect(surface.style.borderBottomLeftRadius).toBe('16px') + }) + + test('emits close request and dismiss on scrim click in modal mode', () => { + const onToggle = vi.fn() + const onDismiss = vi.fn() + + render( + + Modal body + + ) + + const scrim = document.body.querySelector('.m3-surface__scrim') as HTMLElement + + fireEvent.click(scrim) + + expect(onToggle).toHaveBeenCalledWith(false) + expect(onDismiss).toHaveBeenCalledTimes(1) + }) + + test('anchors modal surface to center with fixed positioning', () => { + render( + + ) + + const surface = screen.getByRole('dialog') + + expect(surface.style.position).toBe('fixed') + expect(surface.style.top).toBe('50%') + expect(surface.style.left).toBe('50%') + expect(surface.style.transform).toContain('translate(-50%, -50%)') + expect(surface.style.width).toBe('320px') + expect(surface.style.height).toBe('240px') + }) + + test('maps auto role from elevation and allows explicit variant override', () => { + const { rerender } = render( + + ) + + let surface = screen.getByRole('region') + + expect(surface.classList.contains('m3-surface_role-surface-container-high')).toBe(true) + + rerender( + + ) + + surface = screen.getByRole('region') + + expect(surface.classList.contains('m3-surface_role-surface-bright')).toBe(true) + expect(surface.classList.contains('m3-surface_role-surface-container-high')).toBe(false) + }) +}) From 21da065e3a0c10d870a281c4b60940ce119f5429 Mon Sep 17 00:00:00 2001 From: Kirill Zaytsev Date: Sat, 7 Mar 2026 14:56:57 +0400 Subject: [PATCH 07/54] feat(m3-vue): Stabilized M3Surface And Updated Surface Stories --- .../surface}/M3Surface.vue | 163 ++++-------------- m3-vue/src/components/surface/index.ts | 1 + m3-vue/src/index.ts | 6 +- .../storybook/components/M3Surface.stories.ts | 2 +- .../examples/surface/SurfaceCardPageMorph.vue | 35 ++-- .../surface/SurfaceNestedDialogsChain.vue | 18 +- .../surface/SurfaceSideSheetAlwaysModal.vue | 26 +-- .../SurfaceSideSheetDismissToRemove.vue | 36 ++-- .../surface/SurfaceSideSheetModalToWindow.vue | 28 +-- .../surface/SurfaceSideSheetMorph.vue | 100 ++++++++--- m3-vue/tests/M3Surface.test.ts | 4 +- 11 files changed, 205 insertions(+), 214 deletions(-) rename m3-vue/src/{experimental => components/surface}/M3Surface.vue (54%) create mode 100644 m3-vue/src/components/surface/index.ts diff --git a/m3-vue/src/experimental/M3Surface.vue b/m3-vue/src/components/surface/M3Surface.vue similarity index 54% rename from m3-vue/src/experimental/M3Surface.vue rename to m3-vue/src/components/surface/M3Surface.vue index 37acd88..b04f651 100644 --- a/m3-vue/src/experimental/M3Surface.vue +++ b/m3-vue/src/components/surface/M3Surface.vue @@ -1,6 +1,6 @@ diff --git a/m3-vue/src/components/surface/index.ts b/m3-vue/src/components/surface/index.ts index 6f5e46b..5db01f7 100644 --- a/m3-vue/src/components/surface/index.ts +++ b/m3-vue/src/components/surface/index.ts @@ -1 +1,2 @@ +export { default as M3SurfacePanel } from './M3SurfacePanel.vue' export { default as M3Surface } from './M3Surface.vue' diff --git a/m3-vue/src/components/surface/orchestration/useSurfaceCardPageMorph.ts b/m3-vue/src/components/surface/orchestration/useSurfaceCardPageMorph.ts new file mode 100644 index 0000000..13a850b --- /dev/null +++ b/m3-vue/src/components/surface/orchestration/useSurfaceCardPageMorph.ts @@ -0,0 +1,201 @@ +/* eslint-disable max-lines-per-function */ +import { + computed, + onBeforeUnmount, + nextTick, + onMounted, + ref, +} from 'vue' + +import { + measureContainerRect, + measureRelativeRect, + raf, + toMotionStyle, + type SurfaceMotionRect, + wait, +} from '@modulify/m3-foundation/lib/surface/orchestration' + +export function useSurfaceCardPageMorph(transitionMs: number) { + const expanded = ref(false) + const busy = ref(false) + const backgroundCollapsed = ref(false) + const originHeight = ref(220) + const canvas = ref(null) + const originSlot = ref(null) + let observer: ResizeObserver | null = null + const syncFrame = ref(null) + const motion = ref({ + top: 16, + left: 16, + width: 320, + height: 220, + }) + + const overlayStyle = computed(() => toMotionStyle(motion.value)) + + function measureOrigin() { + return measureRelativeRect(canvas.value, originSlot.value) + } + + function measureExpanded() { + return measureContainerRect(canvas.value) + } + + function syncMotionToLayout() { + const origin = measureOrigin() + + if (origin) { + originHeight.value = origin.height + } + + if (expanded.value) { + const full = measureExpanded() + + if (full) { + motion.value = full + } + + return + } + + if (!origin || backgroundCollapsed.value) { + return + } + + motion.value = origin + } + + function scheduleSyncMotion() { + if (syncFrame.value !== null) { + cancelAnimationFrame(syncFrame.value) + } + + syncFrame.value = requestAnimationFrame(() => { + syncFrame.value = null + syncMotionToLayout() + }) + } + + async function initMotion() { + await nextTick() + await raf() + + const origin = measureOrigin() + if (!origin) { + return + } + + motion.value = origin + originHeight.value = origin.height + } + + async function expandCard() { + backgroundCollapsed.value = false + + const origin = measureOrigin() + if (origin) { + motion.value = origin + originHeight.value = origin.height + } + + expanded.value = true + await nextTick() + await raf() + + const full = measureExpanded() + if (!full) { + return + } + + motion.value = full + await wait(transitionMs) + backgroundCollapsed.value = true + } + + async function collapseCard() { + if (backgroundCollapsed.value) { + backgroundCollapsed.value = false + await nextTick() + await raf() + } + + const full = measureExpanded() + if (full) { + motion.value = full + } + + const origin = measureOrigin() + if (origin) { + originHeight.value = origin.height + } + + expanded.value = false + await nextTick() + await raf() + + if (!origin) { + return + } + + motion.value = origin + await wait(transitionMs) + } + + async function toggleCardMode() { + if (busy.value) { + return + } + + busy.value = true + + if (expanded.value) { + await collapseCard() + busy.value = false + return + } + + await expandCard() + busy.value = false + } + + onMounted(() => { + initMotion() + + if (typeof ResizeObserver === 'undefined') { + return + } + + observer = new ResizeObserver(() => { + scheduleSyncMotion() + }) + + if (canvas.value && observer) { + observer.observe(canvas.value) + } + + if (originSlot.value && observer) { + observer.observe(originSlot.value) + } + }) + + onBeforeUnmount(() => { + observer?.disconnect() + + if (syncFrame.value !== null) { + cancelAnimationFrame(syncFrame.value) + syncFrame.value = null + } + }) + + return { + expanded, + busy, + backgroundCollapsed, + originHeight, + overlayStyle, + canvas, + originSlot, + toggleCardMode, + } +} diff --git a/m3-vue/src/components/surface/orchestration/useSurfaceSideSheetMorph.ts b/m3-vue/src/components/surface/orchestration/useSurfaceSideSheetMorph.ts new file mode 100644 index 0000000..e4f72cb --- /dev/null +++ b/m3-vue/src/components/surface/orchestration/useSurfaceSideSheetMorph.ts @@ -0,0 +1,266 @@ +/* eslint-disable max-lines-per-function */ +import { + computed, + nextTick, + onBeforeUnmount, + onMounted, + ref, +} from 'vue' + +import { getSurfaceStateDescriptor } from '@modulify/m3-foundation/lib/surface/descriptor' +import { m3MotionDurations } from '@modulify/m3-foundation/lib/motion' + +import { + raf, + wait, +} from '@modulify/m3-foundation/lib/surface/orchestration' + +const SIDE_SHEET_WIDTH_MIN = 280 +const SIDE_SHEET_WIDTH_MAX = 360 +const SIDE_SHEET_WIDTH_RATIO = 32 + +const MODAL_INSET_TOP = 0 +const MODAL_INSET_BOTTOM = 0 +const MODAL_INSET_END = 0 +const PANEL_TRANSITION_MS = m3MotionDurations.medium2 +const DOCKED_SIDE_SHEET_DESCRIPTOR = getSurfaceStateDescriptor('docked_side_sheet') +const MODAL_SIDE_SHEET_DESCRIPTOR = getSurfaceStateDescriptor('modal_side_sheet') +const DOCKED_HOST_WIDTH = `clamp(${SIDE_SHEET_WIDTH_MIN}px, ${SIDE_SHEET_WIDTH_RATIO}%, ${SIDE_SHEET_WIDTH_MAX}px)` + +export function useSurfaceSideSheetMorph() { + type SurfaceGeometry = { + width: number; + insetTop: number; + insetRight: number; + insetBottom: number; + } + + const sideSheetModal = ref(false) + const sideSheetWidth = ref(SIDE_SHEET_WIDTH_MIN) + const dockedHostExpanded = ref(true) + const dockedPanelShown = ref(true) + const dockedPanelHidden = ref(false) + const modalShown = ref(false) + const modalScrimShown = ref(false) + const modalWidth = ref(sideSheetWidth.value) + const modalInsetTop = ref(MODAL_INSET_TOP) + const modalInsetRight = ref(MODAL_INSET_END) + const modalInsetBottom = ref(MODAL_INSET_BOTTOM) + const modalRadiusLeft = ref(DOCKED_SIDE_SHEET_DESCRIPTOR.rounding.topLeft) + const modalElevation = ref(DOCKED_SIDE_SHEET_DESCRIPTOR.elevation) + const modalRole = ref<'surface-container-low' | 'surface-container-high'>(DOCKED_SIDE_SHEET_DESCRIPTOR.variant) + const modalTransitionMs = ref(PANEL_TRANSITION_MS) + const transitioning = ref(false) + const lastDockedGeometry = ref(null) + const dockedHost = ref(null) + const layoutRoot = ref(null) + + function measureDockedGeometry() { + const host = dockedHost.value + if (!host) { + return null + } + + const rect = host.getBoundingClientRect() + const width = Math.round(rect.width) + + if (width > 0) { + sideSheetWidth.value = width + } + + return { + width: width > 0 ? width : sideSheetWidth.value, + insetTop: Math.round(rect.top), + insetRight: Math.round(window.innerWidth - rect.right), + insetBottom: Math.round(window.innerHeight - rect.bottom), + } + } + + function measureDockedPanelGeometry(): SurfaceGeometry | null { + const panel = dockedHost.value?.querySelector('[data-panel-mode="docked"]') as HTMLElement | null + if (!panel) { + return null + } + + const rect = panel.getBoundingClientRect() + const geometry = { + width: Math.round(rect.width), + insetTop: Math.round(rect.top), + insetRight: Math.round(window.innerWidth - rect.right), + insetBottom: Math.round(window.innerHeight - rect.bottom), + } + + sideSheetWidth.value = geometry.width + lastDockedGeometry.value = geometry + + return geometry + } + + async function syncDockedGeometry() { + await nextTick() + await raf() + + const docked = measureDockedPanelGeometry() ?? measureDockedGeometry() + if (!docked || sideSheetModal.value) { + return + } + + modalWidth.value = docked.width + modalInsetTop.value = docked.insetTop + modalInsetRight.value = docked.insetRight + modalInsetBottom.value = docked.insetBottom + } + + async function switchDockedToModal() { + const docked = measureDockedPanelGeometry() ?? measureDockedGeometry() + if (!docked) { + return + } + + modalTransitionMs.value = PANEL_TRANSITION_MS + modalWidth.value = docked.width + modalInsetTop.value = docked.insetTop + modalInsetRight.value = docked.insetRight + modalInsetBottom.value = docked.insetBottom + modalRadiusLeft.value = DOCKED_SIDE_SHEET_DESCRIPTOR.rounding.topLeft + modalElevation.value = DOCKED_SIDE_SHEET_DESCRIPTOR.elevation + modalRole.value = DOCKED_SIDE_SHEET_DESCRIPTOR.variant + dockedPanelShown.value = true + dockedPanelHidden.value = true + modalShown.value = true + + await nextTick() + await raf() + + modalScrimShown.value = MODAL_SIDE_SHEET_DESCRIPTOR.scrim + dockedHostExpanded.value = false + sideSheetModal.value = true + modalWidth.value = docked.width + modalInsetTop.value = MODAL_INSET_TOP + modalInsetRight.value = MODAL_INSET_END + modalInsetBottom.value = MODAL_INSET_BOTTOM + modalRadiusLeft.value = MODAL_SIDE_SHEET_DESCRIPTOR.rounding.topLeft + modalElevation.value = MODAL_SIDE_SHEET_DESCRIPTOR.elevation + modalRole.value = MODAL_SIDE_SHEET_DESCRIPTOR.variant + + await wait(PANEL_TRANSITION_MS) + + dockedPanelShown.value = false + } + + async function switchModalToDocked() { + dockedHostExpanded.value = true + dockedPanelShown.value = true + dockedPanelHidden.value = true + + await nextTick() + await raf() + + const dockedTarget = lastDockedGeometry.value ?? measureDockedPanelGeometry() ?? measureDockedGeometry() + if (!dockedTarget) { + return + } + + modalTransitionMs.value = PANEL_TRANSITION_MS + modalScrimShown.value = false + modalElevation.value = DOCKED_SIDE_SHEET_DESCRIPTOR.elevation + modalRole.value = DOCKED_SIDE_SHEET_DESCRIPTOR.variant + modalRadiusLeft.value = DOCKED_SIDE_SHEET_DESCRIPTOR.rounding.topLeft + modalWidth.value = dockedTarget.width + modalInsetTop.value = dockedTarget.insetTop + modalInsetRight.value = dockedTarget.insetRight + modalInsetBottom.value = dockedTarget.insetBottom + + await wait(PANEL_TRANSITION_MS) + + sideSheetModal.value = false + modalShown.value = false + dockedPanelHidden.value = false + } + + async function toggleSideSheetMode() { + if (transitioning.value) { + return + } + + transitioning.value = true + + if (!sideSheetModal.value) { + await switchDockedToModal() + transitioning.value = false + return + } + + await switchModalToDocked() + transitioning.value = false + } + + async function closeModalFromPanel() { + if (!sideSheetModal.value || transitioning.value) { + return + } + + transitioning.value = true + await switchModalToDocked() + transitioning.value = false + } + + async function onResize() { + if (dockedHostExpanded.value) { + await syncDockedGeometry() + } + } + + onMounted(async () => { + await syncDockedGeometry() + window.addEventListener('resize', onResize, { passive: true }) + }) + + onBeforeUnmount(() => { + window.removeEventListener('resize', onResize) + }) + + const dockedHostStyle = computed(() => ({ + width: dockedHostExpanded.value ? DOCKED_HOST_WIDTH : '0px', + })) + + const dockedPanelStyle = computed(() => ({ + visibility: dockedPanelHidden.value ? 'hidden' : 'visible', + })) + + const modalPanelProps = computed(() => ({ + shown: true as const, + scrimShown: modalScrimShown.value, + anchor: MODAL_SIDE_SHEET_DESCRIPTOR.anchor, + fillWidth: MODAL_SIDE_SHEET_DESCRIPTOR.fillWidth, + fillHeight: MODAL_SIDE_SHEET_DESCRIPTOR.fillHeight, + width: modalWidth.value, + insetTop: modalInsetTop.value, + insetRight: modalInsetRight.value, + insetBottom: modalInsetBottom.value, + roundingTopLeft: modalRadiusLeft.value, + roundingBottomLeft: modalRadiusLeft.value, + roundingTopRight: MODAL_SIDE_SHEET_DESCRIPTOR.rounding.topRight, + roundingBottomRight: MODAL_SIDE_SHEET_DESCRIPTOR.rounding.bottomRight, + transitionMs: modalTransitionMs.value, + zIndex: 520, + variant: modalRole.value, + elevation: modalElevation.value, + overflow: MODAL_SIDE_SHEET_DESCRIPTOR.overflow, + })) + + return { + sideSheetModal, + sideSheetWidth, + transitioning, + modalShown, + dockedPanelShown, + dockedHost, + layoutRoot, + dockedHostStyle, + dockedPanelStyle, + modalPanelProps, + toggleSideSheetMode, + closeModalFromPanel, + } +} diff --git a/m3-vue/src/components/surface/shared.ts b/m3-vue/src/components/surface/shared.ts new file mode 100644 index 0000000..60919fd --- /dev/null +++ b/m3-vue/src/components/surface/shared.ts @@ -0,0 +1,163 @@ +import type { + CSSProperties, + PropType, +} from 'vue' +import type { + Length as SurfaceLength, + Variant as SurfaceVariant, +} from '@modulify/m3-foundation/types/components/surface' + +import { + DEFAULT_SURFACE_TRANSITION_TIMING, + getSurfacePanelClassRecord, + getSurfacePanelStyle as getFoundationSurfacePanelStyle, +} from '@modulify/m3-foundation/lib/surface/style' + +export { + getModalAnchorStyle, + getResolvedVariant, + getSurfaceTransition, + getVariantClassName, + isDefined, + toLength, +} from '@modulify/m3-foundation/lib/surface/style' +import { + isId, + isUndefined, + Or, +} from '@modulify/m3-foundation/lib/predicates' + +export const surfacePanelProps = { + id: { + type: null as unknown as PropType, + validator: Or(isId, isUndefined), + default: undefined, + }, + + tag: { + type: String, + default: 'section', + }, + + elevation: { + type: Number, + default: 0, + validator: (value: number) => Number.isInteger(value) && value >= 0 && value <= 5, + }, + + variant: { + type: String as PropType, + default: 'auto', + }, + + fillWidth: { + type: Boolean, + default: true, + }, + + fillHeight: { + type: Boolean, + default: true, + }, + + width: { + type: null as unknown as PropType, + default: null, + }, + + height: { + type: null as unknown as PropType, + default: null, + }, + + minWidth: { + type: null as unknown as PropType, + default: null, + }, + + maxWidth: { + type: null as unknown as PropType, + default: null, + }, + + minHeight: { + type: null as unknown as PropType, + default: null, + }, + + maxHeight: { + type: null as unknown as PropType, + default: null, + }, + + rounding: { + type: null as unknown as PropType, + default: 0, + }, + + roundingTopLeft: { + type: null as unknown as PropType, + default: null, + }, + + roundingTopRight: { + type: null as unknown as PropType, + default: null, + }, + + roundingBottomRight: { + type: null as unknown as PropType, + default: null, + }, + + roundingBottomLeft: { + type: null as unknown as PropType, + default: null, + }, + + transitionMs: { + type: Number, + default: 220, + }, + + transitionTiming: { + type: String, + default: DEFAULT_SURFACE_TRANSITION_TIMING, + }, + + overflow: { + type: String, + default: 'visible', + }, +} as const + +export function getSurfacePanelClass(elevation: number, variant: SurfaceVariant) { + return getSurfacePanelClassRecord(elevation, variant) +} + +type SurfacePanelStyleInput = { + fillWidth: boolean, + fillHeight: boolean, + width: SurfaceLength | null, + height: SurfaceLength | null, + minWidth: SurfaceLength | null, + maxWidth: SurfaceLength | null, + minHeight: SurfaceLength | null, + maxHeight: SurfaceLength | null, + rounding: SurfaceLength, + roundingTopLeft: SurfaceLength | null, + roundingTopRight: SurfaceLength | null, + roundingBottomRight: SurfaceLength | null, + roundingBottomLeft: SurfaceLength | null, + transitionMs: number, + transitionTiming: string, + overflow: CSSProperties['overflow'], + style?: CSSProperties, +} + +export const getSurfacePanelStyle = ( + options: SurfacePanelStyleInput +): CSSProperties => getFoundationSurfacePanelStyle({ + ...options, + style: options.style as object | undefined, +}) as CSSProperties diff --git a/m3-vue/src/index.ts b/m3-vue/src/index.ts index 542a779..b8ad7e4 100644 --- a/m3-vue/src/index.ts +++ b/m3-vue/src/index.ts @@ -80,6 +80,7 @@ export { export { M3Surface, + M3SurfacePanel, } from '@/components/surface' export { diff --git a/m3-vue/storybook/components/M3SideSheet.mdx b/m3-vue/storybook/components/M3SideSheet.mdx new file mode 100644 index 0000000..1e33892 --- /dev/null +++ b/m3-vue/storybook/components/M3SideSheet.mdx @@ -0,0 +1,42 @@ +import { Meta } from '@storybook/addon-docs/blocks' +import * as M3SideSheetStories from './M3SideSheet.stories' + + + +# Side Sheets + +Side sheets extend `M3Surface` into a right-edge panel with dedicated header, scrollable content area, and optional footer actions. + +## Accessibility semantics + +- Use a clear title so the sheet can expose `aria-labelledby`. +- Keep close affordances discoverable through the close button and, in modal mode, the scrim. +- Reserve footer actions for final or high-signal decisions. + +## Stories + +- [Standard](?path=/story/components-m3sidesheet--standard) +- [Docked](?path=/story/components-m3sidesheet--docked) + +## Code example + +```html + + + + +

Choose filters and apply changes.

+ + +
+``` + +## Resources + +- [M3 Side sheets overview](https://m3.material.io/components/navigation-drawer/overview) +- [M3 Side sheets guidelines](https://m3.material.io/components/navigation-drawer/guidelines) +- [WAI-ARIA APG: Dialog (Modal) Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/) diff --git a/m3-vue/storybook/components/M3SideSheet.stories.ts b/m3-vue/storybook/components/M3SideSheet.stories.ts new file mode 100644 index 0000000..347f32f --- /dev/null +++ b/m3-vue/storybook/components/M3SideSheet.stories.ts @@ -0,0 +1,84 @@ +import type { Meta, StoryObj } from '@storybook/vue3' + +import { M3Button } from '@/components/button' +import { M3Icon } from '@/components/icon' +import { M3SideSheet } from '@/components/side-sheet' + +import { ref } from 'vue' + +const sideSheetStoryTemplate = ` + + Open side sheet + + + + + + + +

Choose filters and apply changes.

+ + +
+` + +const meta = { + title: 'Components/M3SideSheet', + + component: M3SideSheet, + + argTypes: { + shown: { + control: false, + }, + }, + + args: { + docked: false, + }, + + render: (args: unknown) => ({ + components: { + M3Button, + M3Icon, + M3SideSheet, + }, + + setup () { + const shown = ref(false) + + return { + args, + shown, + } + }, + + template: sideSheetStoryTemplate, + }), + + parameters: { + layout: 'centered', + }, +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const Standard: Story = {} + +export const Docked: Story = { + args: { + docked: true, + }, +} diff --git a/m3-vue/storybook/examples/surface/SurfaceCardPageMorph.vue b/m3-vue/storybook/examples/surface/SurfaceCardPageMorph.vue index 48b5e8b..8872c28 100644 --- a/m3-vue/storybook/examples/surface/SurfaceCardPageMorph.vue +++ b/m3-vue/storybook/examples/surface/SurfaceCardPageMorph.vue @@ -4,7 +4,7 @@ :data-card-expanded="expanded ? 'true' : 'false'" data-testid="surface-card-page-root" > -
- +
-

Card-to-page transition playground

Original slot remains reserved while the morphing surface overlays the page area.

-
+
+ > +
+ +

Morph target surface

+

+ In compact mode this surface behaves like a card. In expanded mode it replaces the + page work area while keeping top bar and rail reserved. +

+ + + Nested surface demonstrates composability in both states. + +
+
+
- Static card A

Background content remains in flow.

-
+ - Static card B

Independent surface in the same scene.

-
+
-
+
- - Nested surface demonstrates composability in both states. - - + +
@@ -188,173 +234,39 @@ import { M3Navigation, M3NavigationTab, } from '@/components/navigation' -import M3Surface from '@/components/surface/M3Surface.vue' - import { - computed, - nextTick, - onMounted, - ref, -} from 'vue' + M3SurfacePanel, +} from '@/components/surface' +import { useSurfaceCardPageMorph } from '@/components/surface/orchestration/useSurfaceCardPageMorph' + import { m3MotionDurations, m3MotionEasings, } from '@modulify/m3-foundation/lib/motion' +import { + computed, + ref, +} from 'vue' -const expanded = ref(false) -const busy = ref(false) const navExpanded = ref(false) -const backgroundCollapsed = ref(false) const activeNavTab = ref<'files' | 'timeline' | 'tasks' | 'analytics'>('files') const TRANSITION_MS = m3MotionDurations.medium3 const TRANSITION_EASING = m3MotionEasings.standard -const canvas = ref(null) -const originSlot = ref(null) -const originHeight = ref(220) - -const motion = ref({ - top: 16, - left: 16, - width: 320, - height: 220, -}) - -const overlayStyle = computed(() => ({ - top: `${motion.value.top}px`, - left: `${motion.value.left}px`, - width: `${motion.value.width}px`, - height: `${motion.value.height}px`, +const { + expanded, + busy, + backgroundCollapsed, + originHeight, + overlayStyle, + canvas, + originSlot, + toggleCardMode, +} = useSurfaceCardPageMorph(TRANSITION_MS) +const overlayActive = computed(() => busy.value || expanded.value) +const compactWrapStyle = computed(() => ({ + width: '100%', })) - -function wait(ms: number) { - return new Promise((resolve) => { - setTimeout(() => resolve(), ms) - }) -} - -function raf() { - return new Promise((resolve) => { - requestAnimationFrame(() => resolve()) - }) -} - -function measureOrigin() { - if (!canvas.value || !originSlot.value) { - return null - } - - const canvasRect = canvas.value.getBoundingClientRect() - const originRect = originSlot.value.getBoundingClientRect() - - return { - top: originRect.top - canvasRect.top, - left: originRect.left - canvasRect.left, - width: originRect.width, - height: originRect.height, - } -} - -function measureExpanded() { - if (!canvas.value) { - return null - } - - const canvasRect = canvas.value.getBoundingClientRect() - - return { - top: 0, - left: 0, - width: canvasRect.width, - height: canvasRect.height, - } -} - -async function initMotion() { - await nextTick() - await raf() - - const origin = measureOrigin() - if (!origin) { - return - } - - motion.value = origin - originHeight.value = origin.height -} - -async function expandCard() { - backgroundCollapsed.value = false - - const origin = measureOrigin() - if (origin) { - motion.value = origin - originHeight.value = origin.height - } - - expanded.value = true - await nextTick() - await raf() - - const full = measureExpanded() - if (!full) { - return - } - - motion.value = full - await wait(TRANSITION_MS) - backgroundCollapsed.value = true -} - -async function collapseCard() { - if (backgroundCollapsed.value) { - backgroundCollapsed.value = false - await nextTick() - await raf() - } - - const full = measureExpanded() - if (full) { - motion.value = full - } - - const origin = measureOrigin() - if (origin) { - originHeight.value = origin.height - } - - expanded.value = false - await nextTick() - await raf() - - if (!origin) { - return - } - - motion.value = origin - await wait(TRANSITION_MS) -} - -async function toggleCardMode() { - if (busy.value) { - return - } - - busy.value = true - - if (expanded.value) { - await collapseCard() - busy.value = false - return - } - - await expandCard() - busy.value = false -} - -onMounted(() => { - initMotion() -}) diff --git a/m3-vue/storybook/examples/surface/SurfaceWorkspaceDialog.vue b/m3-vue/storybook/examples/surface/SurfaceWorkspaceDialog.vue new file mode 100644 index 0000000..e9ea7e3 --- /dev/null +++ b/m3-vue/storybook/examples/surface/SurfaceWorkspaceDialog.vue @@ -0,0 +1,182 @@ + + + + + From 43f7278360c1714f4d7c83335c252b3e59c4151b Mon Sep 17 00:00:00 2001 From: Kirill Zaytsev Date: Sun, 8 Mar 2026 18:43:40 +0400 Subject: [PATCH 22/54] feat: Storybook surface guidance was refined --- .../storybook/components/M3RichTooltip.mdx | 22 ++++++ m3-react/storybook/components/M3Surface.mdx | 32 ++++++++ .../surface/SurfaceInspectorSheet.tsx | 73 +++++++++++------- m3-vue/storybook/components/M3RichTooltip.mdx | 22 ++++++ m3-vue/storybook/components/M3Surface.mdx | 32 ++++++++ .../surface/SurfaceInspectorSheet.vue | 77 +++++++++++-------- 6 files changed, 195 insertions(+), 63 deletions(-) diff --git a/m3-react/storybook/components/M3RichTooltip.mdx b/m3-react/storybook/components/M3RichTooltip.mdx index ea26489..ece4779 100644 --- a/m3-react/storybook/components/M3RichTooltip.mdx +++ b/m3-react/storybook/components/M3RichTooltip.mdx @@ -53,6 +53,28 @@ If the user must know the message to complete the task safely, do not hide it be Rich tooltips can contain more than plain text, but they should still feel like supplementary context, not a mini dialog. +## Content anatomy + +- short title or intent cue that helps users scan quickly +- one supporting sentence that explains the consequence, shortcut, or background +- optional trailing hint such as a keyboard shortcut or low-friction action + +The stories in this workspace keep the payload deliberately compact so the tooltip stays tethered to the trigger instead of competing with nearby layout. + +## Do / don't + +### Do + +- keep the message tightly tied to the hovered or focused trigger +- prefer consequence framing for risky actions and hint framing for shortcuts +- keep the tooltip short enough to read without shifting task focus + +### Don’t + +- move essential validation, permissions, or policy copy only into a tooltip +- stack multiple paragraphs or full form controls inside the surface +- use a rich tooltip when the user needs blocking confirmation or multi-step input + ## Resources - [M3 Tooltips overview](https://m3.material.io/components/tooltips/overview) diff --git a/m3-react/storybook/components/M3Surface.mdx b/m3-react/storybook/components/M3Surface.mdx index b60e584..f67d293 100644 --- a/m3-react/storybook/components/M3Surface.mdx +++ b/m3-react/storybook/components/M3Surface.mdx @@ -67,6 +67,38 @@ The orchestration examples work best when you model stable states such as `docke When morphing between surfaces, animate toward a measured target rectangle or target inset set. This prevents the “overlay shrinks somewhere else, then snaps” failure mode that surface transitions are especially sensitive to. +## Content anatomy + +### Dialog-like surface + +- headline or short title that explains the decision +- compact supporting copy that clarifies consequences +- primary and secondary actions grouped near the end of the reading flow + +### Side-sheet surface + +- header with title and optional affordance action +- scrollable supporting content or form body +- footer actions anchored at the bottom when the sheet remains open during editing + +The `Inspector Side Sheet` story shows this anatomy with the standard `m3-side-sheet__header`, `m3-side-sheet__content`, and `m3-side-sheet__footer` structure layered on top of `M3Surface`. + +## Do / don't + +### Do + +- keep supporting surfaces narrowly scoped to one nearby task +- preserve surrounding context for side sheets and supporting panels +- align action placement with the surface role, such as bottom-aligned footer actions for longer sheets +- use explicit stable states when one surface can morph into another + +### Don’t + +- replace a full workflow with a side sheet if the user needs a primary destination +- overload modal surfaces with dense navigation or unrelated secondary tools +- let transition targets drift away from the final resting geometry +- hide critical task instructions only inside a temporary supporting surface + ## Resources - [M3 Cards overview](https://m3.material.io/components/cards/overview) diff --git a/m3-react/storybook/examples/surface/SurfaceInspectorSheet.tsx b/m3-react/storybook/examples/surface/SurfaceInspectorSheet.tsx index 9b5fad8..e744082 100644 --- a/m3-react/storybook/examples/surface/SurfaceInspectorSheet.tsx +++ b/m3-react/storybook/examples/surface/SurfaceInspectorSheet.tsx @@ -5,6 +5,8 @@ import type { import type { M3SelectOption } from '@/components/select' import { M3Button } from '@/components/button' +import { M3Icon } from '@/components/icon' +import { M3IconButton } from '@/components/icon-button' import { M3Select } from '@/components/select' import { M3Surface, M3SurfacePanel } from '@/components/surface' import { M3TextField } from '@/components/text-field' @@ -96,37 +98,50 @@ const SurfaceInspectorSheet: FC = () => { overflow="auto" onToggle={setOpened} onDismiss={() => setOpened(false)} - style={{ padding: '20px' }} + className="m3-side-sheet surface-inspector-sheet__sheet" > -

Release inspector

-

Use the side sheet for supporting edits that should not replace the dashboard context.

- -
- - - - value={priority} - label="Priority" - options={priorityOptions} - outlined={true} - onUpdate={setPriority} - /> - - +
+
Release inspector
+ +
+ setOpened(false)}> + + +
+
+ +
+
+

Use the side sheet for supporting edits that should not replace the dashboard context.

+ +
+ + + + value={priority} + label="Priority" + options={priorityOptions} + outlined={true} + onUpdate={setPriority} + /> + + +
+
-
+
setOpened(false)}> Dismiss @@ -134,7 +149,7 @@ const SurfaceInspectorSheet: FC = () => { setOpened(false)}> Save changes -
+
) diff --git a/m3-vue/storybook/components/M3RichTooltip.mdx b/m3-vue/storybook/components/M3RichTooltip.mdx index ea26489..ece4779 100644 --- a/m3-vue/storybook/components/M3RichTooltip.mdx +++ b/m3-vue/storybook/components/M3RichTooltip.mdx @@ -53,6 +53,28 @@ If the user must know the message to complete the task safely, do not hide it be Rich tooltips can contain more than plain text, but they should still feel like supplementary context, not a mini dialog. +## Content anatomy + +- short title or intent cue that helps users scan quickly +- one supporting sentence that explains the consequence, shortcut, or background +- optional trailing hint such as a keyboard shortcut or low-friction action + +The stories in this workspace keep the payload deliberately compact so the tooltip stays tethered to the trigger instead of competing with nearby layout. + +## Do / don't + +### Do + +- keep the message tightly tied to the hovered or focused trigger +- prefer consequence framing for risky actions and hint framing for shortcuts +- keep the tooltip short enough to read without shifting task focus + +### Don’t + +- move essential validation, permissions, or policy copy only into a tooltip +- stack multiple paragraphs or full form controls inside the surface +- use a rich tooltip when the user needs blocking confirmation or multi-step input + ## Resources - [M3 Tooltips overview](https://m3.material.io/components/tooltips/overview) diff --git a/m3-vue/storybook/components/M3Surface.mdx b/m3-vue/storybook/components/M3Surface.mdx index b60e584..f67d293 100644 --- a/m3-vue/storybook/components/M3Surface.mdx +++ b/m3-vue/storybook/components/M3Surface.mdx @@ -67,6 +67,38 @@ The orchestration examples work best when you model stable states such as `docke When morphing between surfaces, animate toward a measured target rectangle or target inset set. This prevents the “overlay shrinks somewhere else, then snaps” failure mode that surface transitions are especially sensitive to. +## Content anatomy + +### Dialog-like surface + +- headline or short title that explains the decision +- compact supporting copy that clarifies consequences +- primary and secondary actions grouped near the end of the reading flow + +### Side-sheet surface + +- header with title and optional affordance action +- scrollable supporting content or form body +- footer actions anchored at the bottom when the sheet remains open during editing + +The `Inspector Side Sheet` story shows this anatomy with the standard `m3-side-sheet__header`, `m3-side-sheet__content`, and `m3-side-sheet__footer` structure layered on top of `M3Surface`. + +## Do / don't + +### Do + +- keep supporting surfaces narrowly scoped to one nearby task +- preserve surrounding context for side sheets and supporting panels +- align action placement with the surface role, such as bottom-aligned footer actions for longer sheets +- use explicit stable states when one surface can morph into another + +### Don’t + +- replace a full workflow with a side sheet if the user needs a primary destination +- overload modal surfaces with dense navigation or unrelated secondary tools +- let transition targets drift away from the final resting geometry +- hide critical task instructions only inside a temporary supporting surface + ## Resources - [M3 Cards overview](https://m3.material.io/components/cards/overview) diff --git a/m3-vue/storybook/examples/surface/SurfaceInspectorSheet.vue b/m3-vue/storybook/examples/surface/SurfaceInspectorSheet.vue index 0261110..2669f51 100644 --- a/m3-vue/storybook/examples/surface/SurfaceInspectorSheet.vue +++ b/m3-vue/storybook/examples/surface/SurfaceInspectorSheet.vue @@ -52,36 +52,49 @@ :elevation="2" variant="surface-container-high" overflow="auto" - class="surface-inspector-sheet__sheet" + class="m3-side-sheet surface-inspector-sheet__sheet" @update:shown="opened = $event" @dismiss="opened = false" > -

Release inspector

-

Use the side sheet for supporting edits that should not replace the dashboard context.

- -
- - - - - +
+
+ Release inspector +
+ +
+ + + +
+
+ +
+
+

Use the side sheet for supporting edits that should not replace the dashboard context.

+ + + + + + +
-
+
Dismiss @@ -89,13 +102,15 @@ Save changes -
+
+ + diff --git a/m3-vue/storybook/patterns/LocalTheming.stories.ts b/m3-vue/storybook/patterns/LocalTheming.stories.ts new file mode 100644 index 0000000..2b5b4c5 --- /dev/null +++ b/m3-vue/storybook/patterns/LocalTheming.stories.ts @@ -0,0 +1,75 @@ +import type { Meta, StoryObj } from '@storybook/vue3' + +import LocalThemeShowcase from '../examples/local-theme/LocalThemeShowcase.vue' + +const meta = { + title: 'Patterns/Local Theming', + + parameters: { + layout: 'fullscreen', + }, +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const DangerActionScope: Story = { + render: () => ({ + components: { + LocalThemeShowcase, + }, + + template: ` + + `, + }), +} + +export const WarmAlertScope: Story = { + render: () => ({ + components: { + LocalThemeShowcase, + }, + + template: ` + + `, + }), +} + +export const SuccessScope: Story = { + render: () => ({ + components: { + LocalThemeShowcase, + }, + + template: ` + + `, + }), +} + +export const BrandMutedScope: Story = { + render: () => ({ + components: { + LocalThemeShowcase, + }, + + template: ` + + `, + }), +} + +export const NestedLocalScopes: Story = { + render: () => ({ + components: { + LocalThemeShowcase, + }, + + template: ` + + `, + }), +} diff --git a/m3-vue/storybook/preview.ts b/m3-vue/storybook/preview.ts index 1a402d0..b749950 100644 --- a/m3-vue/storybook/preview.ts +++ b/m3-vue/storybook/preview.ts @@ -2,8 +2,7 @@ import type { Preview, VueRenderer } from '@storybook/vue3' import '@modulify/m3-foundation/assets/stylesheets/normalize.scss' import '@modulify/m3-foundation/assets/stylesheets/index.scss' - -import './stylesheets/utils.scss' +import '@modulify/m3-foundation/assets/stylesheets/storybook/utils.scss' import { withThemeByClassName } from '@storybook/addon-themes' import { addons } from 'storybook/preview-api' diff --git a/m3-vue/storybook/stylesheets/utils.scss b/m3-vue/storybook/stylesheets/utils.scss deleted file mode 100644 index 6b1f7f2..0000000 --- a/m3-vue/storybook/stylesheets/utils.scss +++ /dev/null @@ -1,62 +0,0 @@ -.d-block { display: block !important; } -.d-inline { display: inline !important; } -.d-inline-block { display: inline-block !important; } -.d-none { display: none !important; } -.d-flex { display: flex !important; } - -.flex-wrap { - flex-wrap: wrap !important; -} - -.flex-container { - @extend .d-flex; - @extend .flex-wrap; -} - -.flex-row { - @extend .d-flex; - align-items: center; -} - -.mt-auto, .my-auto, .m-auto { margin-top: auto !important; } -.mb-auto, .my-auto, .m-auto { margin-bottom: auto !important; } -.ml-auto, .mx-auto, .m-auto { margin-left: auto !important; } -.mr-auto, .mx-auto, .m-auto { margin-right: auto !important; } - -.mt-0, .my-0, .m-0 { margin-top: 0 !important; } -.mb-0, .my-0, .m-0 { margin-bottom: 0 !important; } -.ml-0, .mx-0, .m-0 { margin-left: 0 !important; } -.mr-0, .mx-0, .m-0 { margin-right: 0 !important; } - -.pt-0, .py-0, .p-0 { padding-top: 0 !important; } -.pb-0, .py-0, .p-0 { padding-bottom: 0 !important; } -.pl-0, .px-0, .p-0 { padding-left: 0 !important; } -.pr-0, .px-0, .p-0 { padding-right: 0 !important; } - -$base: 8px; -$multipliers: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; - -@each $value in $multipliers { - .mt-#{$value}, .my-#{$value}, .m-#{$value} { margin-top: 0.5 * $value * $base !important; } - .mb-#{$value}, .my-#{$value}, .m-#{$value} { margin-bottom: 0.5 * $value * $base !important; } - .ml-#{$value}, .mx-#{$value}, .m-#{$value} { margin-left: 0.5 * $value * $base !important; } - .mr-#{$value}, .mx-#{$value}, .m-#{$value} { margin-right: 0.5 * $value * $base !important; } - - .mt-n#{$value}, .my-n#{$value}, .m-n#{$value} { margin-top: -0.5 * $value * $base !important; } - .mb-n#{$value}, .my-n#{$value}, .m-n#{$value} { margin-bottom: -0.5 * $value * $base !important; } - .ml-n#{$value}, .mx-n#{$value}, .m-n#{$value} { margin-left: -0.5 * $value * $base !important; } - .mr-n#{$value}, .mx-n#{$value}, .m-n#{$value} { margin-right: -0.5 * $value * $base !important; } - - .pt-#{$value}, .py-#{$value}, .p-#{$value} { padding-top: 0.5 * $value * $base !important; } - .pb-#{$value}, .py-#{$value}, .p-#{$value} { padding-bottom: 0.5 * $value * $base !important; } - .pl-#{$value}, .px-#{$value}, .p-#{$value} { padding-left: 0.5 * $value * $base !important; } - .pr-#{$value}, .px-#{$value}, .p-#{$value} { padding-right: 0.5 * $value * $base !important; } -} - -.mw-100 { - max-width: 100% !important; -} - -.w-100 { - width: 100% !important; -} \ No newline at end of file From b3fda959e0fea8a30a23521acbdbe8e805117b02 Mon Sep 17 00:00:00 2001 From: Kirill Zaytsev Date: Mon, 9 Mar 2026 18:15:46 +0400 Subject: [PATCH 25/54] feat: Runtime analysis recipes were added --- AGENTS.md | 10 + docs/en/index.md | 1 + docs/en/runtime-analysis-recipes.md | 103 +++ docs/ru/index.md | 1 + docs/ru/runtime-analysis-recipes.md | 105 +++ recipes/research.mk | 218 ++++++ scripts/playwright-capture-diff.mjs | 210 ++++++ scripts/playwright-capture-matrix.mjs | 336 +++++++++ scripts/playwright-research.mjs | 999 ++++++++++++++++++++++++++ 9 files changed, 1983 insertions(+) create mode 100644 docs/en/runtime-analysis-recipes.md create mode 100644 docs/ru/runtime-analysis-recipes.md create mode 100644 scripts/playwright-capture-diff.mjs create mode 100644 scripts/playwright-capture-matrix.mjs create mode 100644 scripts/playwright-research.mjs diff --git a/AGENTS.md b/AGENTS.md index 267506d..cab7d21 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -108,6 +108,16 @@ make help its output to see whether an existing recipe already covers the task. - If a suitable recipe exists, prefer it over ad hoc commands to reduce extra work, keep workflows standardized, and avoid unnecessary escalations. +- The project includes a Playwright container and make recipes for screenshot + capture; use them when visual analysis of Storybook pages, component states, + or other UI behavior is helpful. +- The project also includes runtime-analysis research recipes for DOM, styles, + layout metrics, a11y snapshots, traces, network/performance logs, token + diffs, and screenshot matrices; use them to reduce uncertainty and to + understand what is going wrong before guessing at visual or runtime issues. + Read `docs/en/runtime-analysis-recipes.md` first when the task involves + visual regressions, layout ambiguity, token/theme uncertainty, unclear + animation behavior, or other runtime issues where these recipes may help. - Run eslint before handoff or commit preparation only when changed files include code covered by eslint rules (for example `*.js`, `*.ts`, and similar source files). Do not run eslint for markdown-only changes. diff --git a/docs/en/index.md b/docs/en/index.md index 3d3428c..012396c 100644 --- a/docs/en/index.md +++ b/docs/en/index.md @@ -3,6 +3,7 @@ ## Contents - [Contributing Guide](./contributing.md) - Development workflow, core commands, and CI quality gates. +- [Runtime Analysis Recipes](./runtime-analysis-recipes.md) - Playwright-based recipes for visual, layout, style, motion, and runtime investigation. - [TSConfig Layering](./tsconfig-layering.md) - How TypeScript configs are split between editor DX and CI checks. ## Translations diff --git a/docs/en/runtime-analysis-recipes.md b/docs/en/runtime-analysis-recipes.md new file mode 100644 index 0000000..7bed121 --- /dev/null +++ b/docs/en/runtime-analysis-recipes.md @@ -0,0 +1,103 @@ +# Runtime Analysis Recipes + +This document describes the Playwright-based research recipes available in +`m3-web` for reducing uncertainty when visual or runtime behavior is unclear. + +## When To Use + +Use these recipes when: +- a Storybook page looks wrong and screenshots are not enough; +- a layout shifts, overlaps, or animates unexpectedly; +- local theming or CSS tokens appear to be ignored; +- React and Vue parity is unclear; +- visual regressions need before/after or matrix comparison; +- runtime errors may be hidden in console, network, or accessibility state. + +## Core Principle + +Prefer these recipes before guessing. They are intended to turn “something is +off” into concrete evidence: screenshots, computed styles, layout metrics, +accessibility trees, traces, and diffs. + +## Most Useful Recipes + +- `make research-capture url='...'` - Single screenshot with metadata. +- `make research-capture-batch in=urls.txt out_dir=drafts/screenshots/...` - + Batch screenshot capture from a URL list. +- `make research-style-dump url='...' selector='...'` - Computed styles and CSS + custom properties for one element. +- `make research-layout-metrics url='...' selectors='.a||.b||.c'` - Bounding + boxes, scroll metrics, offsets, and layout details for multiple elements. +- `make research-token-diff url='...' selector='.left' compare_selector='.right'` + - CSS variable diff between two scopes. +- `make research-console-capture url='...'` - Console messages, page errors, + and failed requests. +- `make research-a11y-snapshot url='...' selector='...'` - Accessibility tree + for the page or a subtree. +- `make research-trace url='...' action_selector='...' interaction=click` - + Playwright trace for a page and optional interaction. +- `make research-motion-sample url='...' action_selector='...' interaction=click` + - Timed frame sequence for motion and transitions. +- `make research-capture-diff left=before.png right=after.png out=diff.png` - + Pixel diff for two images or directories. +- `make research-capture-matrix ...` - Capture one URL across multiple themes, + globals, args, and viewports. +- `make research-story-props story_id='...' themes='light,dark' args_sets='...'` + - Storybook-oriented matrix capture for story args and globals. + +## Typical Workflows + +## Investigate A Broken Layout + +1. Capture the current page: + `make research-capture url='...'` +2. Dump layout metrics: + `make research-layout-metrics url='...' selectors='.host||.panel||.scrim'` +3. Dump computed styles for the suspicious node: + `make research-style-dump url='...' selector='.panel'` + +## Investigate A Theme Or Token Problem + +1. Capture the page in both themes: + `make research-capture-matrix story_id='...' themes='light,dark'` +2. Compare token scopes: + `make research-token-diff url='...' selector='.default-scope' compare_selector='.local-scope'` +3. Inspect computed variables: + `make research-style-dump url='...' selector='.local-scope' var_prefixes='--m3-sys-,--m3-state-layers-'` + +## Investigate Animation Or Motion + +1. Capture a motion sequence: + `make research-motion-sample url='...' action_selector='...' interaction=click` +2. If behavior is still unclear, capture a trace: + `make research-trace url='...' action_selector='...' interaction=click` + +## Compare Two Runtime States + +1. Capture both states into separate directories. +2. Run: + `make research-capture-diff left=dir-a right=dir-b out_dir=drafts/research/diff` + +## Storybook Notes + +- Storybook pages can be opened directly with: + `http://m3-vue.modulify.test/?path=/story/...&globals=theme:dark` +- For systematic capture across states, prefer `research-story-props` and + `research-capture-matrix` over manually building many URLs. + +## Output Conventions + +- Screenshots are written under `drafts/screenshots/...` unless overridden. +- Runtime inspection outputs default to `drafts/research/...`. +- Most recipes emit machine-readable JSON so results can be inspected or + compared later. + +## Recommendation + +When a bug report is vague, start with: +1. `research-capture` +2. `research-style-dump` +3. `research-layout-metrics` + +That combination usually clarifies whether the problem is geometry, styling, +token inheritance, or runtime state. diff --git a/docs/ru/index.md b/docs/ru/index.md index 6a36c7c..e5f7526 100644 --- a/docs/ru/index.md +++ b/docs/ru/index.md @@ -3,4 +3,5 @@ ## Содержание - [Руководство по участию](./contributing.md) - Процесс разработки, ключевые команды и проверки в CI. +- [Рецепты runtime-анализа](./runtime-analysis-recipes.md) - Playwright-рецепты для исследования visual, layout, style, motion и runtime-проблем. - [Слои TSConfig](./tsconfig-layering.md) - Разделение TypeScript-конфигов для IDE и package-level typecheck. diff --git a/docs/ru/runtime-analysis-recipes.md b/docs/ru/runtime-analysis-recipes.md new file mode 100644 index 0000000..32cd720 --- /dev/null +++ b/docs/ru/runtime-analysis-recipes.md @@ -0,0 +1,105 @@ +# Рецепты runtime-анализа + +Этот документ описывает Playwright-рецепты исследования, доступные в +`m3-web`, чтобы снимать неопределённость, когда визуальное или runtime-поведение +непонятно. + +## Когда применять + +Используйте эти рецепты, когда: +- Storybook-страница выглядит неправильно, и одного скриншота недостаточно; +- layout сдвигается, наползает или анимируется неожиданно; +- локальная тема или CSS-токены как будто игнорируются; +- неясно, есть ли parity между React и Vue; +- нужно сравнить состояния до/после или матрицу сценариев; +- runtime-ошибки могут прятаться в console, network или accessibility-состоянии. + +## Базовый принцип + +Предпочитайте эти рецепты угадыванию. Их задача — превращать расплывчатое +«что-то не так» в конкретные артефакты: скриншоты, computed styles, layout +метрики, accessibility tree, traces и diffs. + +## Самые полезные рецепты + +- `make research-capture url='...'` - Один скриншот с метаданными. +- `make research-capture-batch in=urls.txt out_dir=drafts/screenshots/...` - + Пакетное снятие скриншотов по списку URL. +- `make research-style-dump url='...' selector='...'` - Computed styles и CSS + custom properties для одного элемента. +- `make research-layout-metrics url='...' selectors='.a||.b||.c'` - Bounding + boxes, scroll-метрики, offsets и layout-детали для нескольких элементов. +- `make research-token-diff url='...' selector='.left' compare_selector='.right'` + - Diff CSS-переменных между двумя scope. +- `make research-console-capture url='...'` - Console messages, page errors и + failed requests. +- `make research-a11y-snapshot url='...' selector='...'` - Accessibility tree + для страницы или subtree. +- `make research-trace url='...' action_selector='...' interaction=click` - + Playwright trace для страницы и опционального взаимодействия. +- `make research-motion-sample url='...' action_selector='...' interaction=click` + - Последовательность кадров для motion и transitions. +- `make research-capture-diff left=before.png right=after.png out=diff.png` - + Pixel diff для двух изображений или каталогов. +- `make research-capture-matrix ...` - Съёмка одного URL по нескольким themes, + globals, args и viewports. +- `make research-story-props story_id='...' themes='light,dark' args_sets='...'` + - Storybook-oriented matrix capture для story args и globals. + +## Типовые сценарии + +## Разобрать сломанный layout + +1. Снять текущую страницу: + `make research-capture url='...'` +2. Снять layout metrics: + `make research-layout-metrics url='...' selectors='.host||.panel||.scrim'` +3. Снять computed styles для подозрительного узла: + `make research-style-dump url='...' selector='.panel'` + +## Разобрать проблему темы или токенов + +1. Снять страницу в обеих темах: + `make research-capture-matrix story_id='...' themes='light,dark'` +2. Сравнить token scope: + `make research-token-diff url='...' selector='.default-scope' compare_selector='.local-scope'` +3. Посмотреть computed variables: + `make research-style-dump url='...' selector='.local-scope' var_prefixes='--m3-sys-,--m3-state-layers-'` + +## Разобрать анимацию или motion + +1. Снять последовательность кадров: + `make research-motion-sample url='...' action_selector='...' interaction=click` +2. Если поведение всё ещё неясно, снять trace: + `make research-trace url='...' action_selector='...' interaction=click` + +## Сравнить два runtime-состояния + +1. Снять оба состояния в разные каталоги. +2. Запустить: + `make research-capture-diff left=dir-a right=dir-b out_dir=drafts/research/diff` + +## Примечания по Storybook + +- Storybook-страницы можно открывать напрямую так: + `http://m3-vue.modulify.test/?path=/story/...&globals=theme:dark` +- Для систематической съёмки по состояниям лучше использовать + `research-story-props` и `research-capture-matrix`, а не собирать множество + URL вручную. + +## Формат артефактов + +- Скриншоты по умолчанию пишутся в `drafts/screenshots/...`. +- Runtime inspection outputs по умолчанию пишутся в `drafts/research/...`. +- Большинство рецептов сохраняет machine-readable JSON, чтобы результаты можно + было потом изучать и сравнивать. + +## Рекомендация + +Когда баг-репорт расплывчатый, начинайте с: +1. `research-capture` +2. `research-style-dump` +3. `research-layout-metrics` + +Эта комбинация обычно быстро показывает, проблема в геометрии, styling, +наследовании токенов или runtime-состоянии. diff --git a/recipes/research.mk b/recipes/research.mk index b05676b..de1439c 100644 --- a/recipes/research.mk +++ b/recipes/research.mk @@ -90,3 +90,221 @@ research-capture-batch: ## [Research][docker][playwright][capture] Captures scre $(if $(full_page),--full-page "$(full_page)",) \ $(if $(wait_selector),--wait-selector "$(wait_selector)",) $(TARGET_OK) + +.PHONY: research-dom-snapshot +research-dom-snapshot: ## [Research][docker][playwright][inspect] Saves outerHTML/text snapshot for a page selector + $(TARGET_HEADER) + @$(PLAYWRIGHT_NODE_CMD) scripts/playwright-research.mjs \ + --action dom-snapshot \ + --url "$(url)" \ + $(if $(selector),--selector "$(selector)",) \ + $(if $(out),--out "$(out)",) \ + $(if $(out_dir),--out-dir "$(out_dir)",) \ + $(if $(width),--width "$(width)",) \ + $(if $(height),--height "$(height)",) \ + $(if $(wait_ms),--wait-ms "$(wait_ms)",) \ + $(if $(wait_until),--wait-until "$(wait_until)",) \ + $(if $(wait_selector),--wait-selector "$(wait_selector)",) + $(TARGET_OK) + +.PHONY: research-style-dump +research-style-dump: ## [Research][docker][playwright][inspect] Saves computed styles and CSS variables for a selector + $(TARGET_HEADER) + @$(PLAYWRIGHT_NODE_CMD) scripts/playwright-research.mjs \ + --action style-dump \ + --url "$(url)" \ + $(if $(selector),--selector "$(selector)",) \ + $(if $(props),--props "$(props)",) \ + $(if $(var_prefixes),--var-prefixes "$(var_prefixes)",) \ + $(if $(out),--out "$(out)",) \ + $(if $(out_dir),--out-dir "$(out_dir)",) \ + $(if $(width),--width "$(width)",) \ + $(if $(height),--height "$(height)",) \ + $(if $(wait_ms),--wait-ms "$(wait_ms)",) \ + $(if $(wait_until),--wait-until "$(wait_until)",) \ + $(if $(wait_selector),--wait-selector "$(wait_selector)",) + $(TARGET_OK) + +.PHONY: research-layout-metrics +research-layout-metrics: ## [Research][docker][playwright][inspect] Saves bounding boxes and layout metrics for selectors + $(TARGET_HEADER) + @$(PLAYWRIGHT_NODE_CMD) scripts/playwright-research.mjs \ + --action layout-metrics \ + --url "$(url)" \ + $(if $(selector),--selector "$(selector)",) \ + $(if $(selectors),--selectors "$(selectors)",) \ + $(if $(out),--out "$(out)",) \ + $(if $(out_dir),--out-dir "$(out_dir)",) \ + $(if $(width),--width "$(width)",) \ + $(if $(height),--height "$(height)",) \ + $(if $(wait_ms),--wait-ms "$(wait_ms)",) \ + $(if $(wait_until),--wait-until "$(wait_until)",) \ + $(if $(wait_selector),--wait-selector "$(wait_selector)",) + $(TARGET_OK) + +.PHONY: research-a11y-snapshot +research-a11y-snapshot: ## [Research][docker][playwright][a11y] Saves Playwright accessibility snapshot for a page or selector + $(TARGET_HEADER) + @$(PLAYWRIGHT_NODE_CMD) scripts/playwright-research.mjs \ + --action a11y-snapshot \ + --url "$(url)" \ + $(if $(selector),--selector "$(selector)",) \ + $(if $(out),--out "$(out)",) \ + $(if $(out_dir),--out-dir "$(out_dir)",) \ + $(if $(width),--width "$(width)",) \ + $(if $(height),--height "$(height)",) \ + $(if $(wait_ms),--wait-ms "$(wait_ms)",) \ + $(if $(wait_until),--wait-until "$(wait_until)",) \ + $(if $(wait_selector),--wait-selector "$(wait_selector)",) + $(TARGET_OK) + +.PHONY: research-console-capture +research-console-capture: ## [Research][docker][playwright][inspect] Saves console messages, page errors, and failed requests + $(TARGET_HEADER) + @$(PLAYWRIGHT_NODE_CMD) scripts/playwright-research.mjs \ + --action console-capture \ + --url "$(url)" \ + $(if $(out),--out "$(out)",) \ + $(if $(out_dir),--out-dir "$(out_dir)",) \ + $(if $(width),--width "$(width)",) \ + $(if $(height),--height "$(height)",) \ + $(if $(wait_ms),--wait-ms "$(wait_ms)",) \ + $(if $(wait_until),--wait-until "$(wait_until)",) \ + $(if $(wait_selector),--wait-selector "$(wait_selector)",) + $(TARGET_OK) + +.PHONY: research-trace +research-trace: ## [Research][docker][playwright][trace] Saves Playwright trace for a page and optional interaction + $(TARGET_HEADER) + @$(PLAYWRIGHT_NODE_CMD) scripts/playwright-research.mjs \ + --action trace \ + --url "$(url)" \ + $(if $(action_selector),--action-selector "$(action_selector)",) \ + $(if $(interaction),--interaction "$(interaction)",) \ + $(if $(post_action_wait_ms),--post-action-wait-ms "$(post_action_wait_ms)",) \ + $(if $(out),--out "$(out)",) \ + $(if $(out_dir),--out-dir "$(out_dir)",) \ + $(if $(width),--width "$(width)",) \ + $(if $(height),--height "$(height)",) \ + $(if $(wait_ms),--wait-ms "$(wait_ms)",) \ + $(if $(wait_until),--wait-until "$(wait_until)",) \ + $(if $(wait_selector),--wait-selector "$(wait_selector)",) + $(TARGET_OK) + +.PHONY: research-network-log +research-network-log: ## [Research][docker][playwright][inspect] Saves request/response timeline for a page load + $(TARGET_HEADER) + @$(PLAYWRIGHT_NODE_CMD) scripts/playwright-research.mjs \ + --action network-log \ + --url "$(url)" \ + $(if $(out),--out "$(out)",) \ + $(if $(out_dir),--out-dir "$(out_dir)",) \ + $(if $(width),--width "$(width)",) \ + $(if $(height),--height "$(height)",) \ + $(if $(wait_ms),--wait-ms "$(wait_ms)",) \ + $(if $(wait_until),--wait-until "$(wait_until)",) \ + $(if $(wait_selector),--wait-selector "$(wait_selector)",) + $(TARGET_OK) + +.PHONY: research-perf-marks +research-perf-marks: ## [Research][docker][playwright][inspect] Saves Performance API entries for a page + $(TARGET_HEADER) + @$(PLAYWRIGHT_NODE_CMD) scripts/playwright-research.mjs \ + --action perf-marks \ + --url "$(url)" \ + $(if $(out),--out "$(out)",) \ + $(if $(out_dir),--out-dir "$(out_dir)",) \ + $(if $(width),--width "$(width)",) \ + $(if $(height),--height "$(height)",) \ + $(if $(wait_ms),--wait-ms "$(wait_ms)",) \ + $(if $(wait_until),--wait-until "$(wait_until)",) \ + $(if $(wait_selector),--wait-selector "$(wait_selector)",) + $(TARGET_OK) + +.PHONY: research-token-diff +research-token-diff: ## [Research][docker][playwright][inspect] Compares computed CSS custom properties between two selectors + $(TARGET_HEADER) + @$(PLAYWRIGHT_NODE_CMD) scripts/playwright-research.mjs \ + --action token-diff \ + --url "$(url)" \ + $(if $(selector),--selector "$(selector)",) \ + $(if $(compare_selector),--compare-selector "$(compare_selector)",) \ + $(if $(var_prefixes),--var-prefixes "$(var_prefixes)",) \ + $(if $(out),--out "$(out)",) \ + $(if $(out_dir),--out-dir "$(out_dir)",) \ + $(if $(width),--width "$(width)",) \ + $(if $(height),--height "$(height)",) \ + $(if $(wait_ms),--wait-ms "$(wait_ms)",) \ + $(if $(wait_until),--wait-until "$(wait_until)",) \ + $(if $(wait_selector),--wait-selector "$(wait_selector)",) + $(TARGET_OK) + +.PHONY: research-motion-sample +research-motion-sample: ## [Research][docker][playwright][capture] Captures a timed frame sequence for page motion and optional interaction + $(TARGET_HEADER) + @$(PLAYWRIGHT_NODE_CMD) scripts/playwright-research.mjs \ + --action motion-sample \ + --url "$(url)" \ + $(if $(action_selector),--action-selector "$(action_selector)",) \ + $(if $(interaction),--interaction "$(interaction)",) \ + $(if $(count),--count "$(count)",) \ + $(if $(interval_ms),--interval-ms "$(interval_ms)",) \ + $(if $(full_page),--full-page "$(full_page)",) \ + $(if $(out_dir),--out-dir "$(out_dir)",) \ + $(if $(width),--width "$(width)",) \ + $(if $(height),--height "$(height)",) \ + $(if $(wait_ms),--wait-ms "$(wait_ms)",) \ + $(if $(wait_until),--wait-until "$(wait_until)",) \ + $(if $(wait_selector),--wait-selector "$(wait_selector)",) + $(TARGET_OK) + +.PHONY: research-capture-diff +research-capture-diff: ## [Research][docker][inspect][capture] Creates image diffs for two screenshots or two screenshot directories + $(TARGET_HEADER) + @$(PLAYWRIGHT_NODE_CMD) scripts/playwright-capture-diff.mjs \ + --left "$(left)" \ + --right "$(right)" \ + $(if $(out),--out "$(out)",) \ + $(if $(summary),--summary "$(summary)",) \ + $(if $(out_dir),--out-dir "$(out_dir)",) \ + $(if $(threshold),--threshold "$(threshold)",) + $(TARGET_OK) + +.PHONY: research-capture-matrix +research-capture-matrix: ## [Research][docker][playwright][capture] Captures URL or Storybook matrices across themes, globals, args, and viewports + $(TARGET_HEADER) + @$(PLAYWRIGHT_NODE_CMD) scripts/playwright-capture-matrix.mjs \ + $(if $(url),--url "$(url)",) \ + $(if $(base_url),--base-url "$(base_url)",) \ + $(if $(story_id),--story-id "$(story_id)",) \ + $(if $(globals),--globals "$(globals)",) \ + $(if $(globals_sets),--globals-sets "$(globals_sets)",) \ + $(if $(args),--args "$(args)",) \ + $(if $(args_sets),--args-sets "$(args_sets)",) \ + $(if $(themes),--themes "$(themes)",) \ + $(if $(viewports),--viewports "$(viewports)",) \ + $(if $(out_dir),--out-dir "$(out_dir)",) \ + $(if $(wait_ms),--wait-ms "$(wait_ms)",) \ + $(if $(wait_until),--wait-until "$(wait_until)",) \ + $(if $(wait_selector),--wait-selector "$(wait_selector)",) \ + $(if $(full_page),--full-page "$(full_page)",) + $(TARGET_OK) + +.PHONY: research-story-props +research-story-props: ## [Research][docker][playwright][capture] Captures Storybook story matrices for args/globals/theme combinations + $(TARGET_HEADER) + @$(PLAYWRIGHT_NODE_CMD) scripts/playwright-capture-matrix.mjs \ + $(if $(base_url),--base-url "$(base_url)",) \ + --story-id "$(story_id)" \ + $(if $(globals),--globals "$(globals)",) \ + $(if $(globals_sets),--globals-sets "$(globals_sets)",) \ + $(if $(args),--args "$(args)",) \ + $(if $(args_sets),--args-sets "$(args_sets)",) \ + $(if $(themes),--themes "$(themes)",) \ + $(if $(viewports),--viewports "$(viewports)",) \ + $(if $(out_dir),--out-dir "$(out_dir)",) \ + $(if $(wait_ms),--wait-ms "$(wait_ms)",) \ + $(if $(wait_until),--wait-until "$(wait_until)",) \ + $(if $(wait_selector),--wait-selector "$(wait_selector)",) \ + $(if $(full_page),--full-page "$(full_page)",) + $(TARGET_OK) diff --git a/scripts/playwright-capture-diff.mjs b/scripts/playwright-capture-diff.mjs new file mode 100644 index 0000000..ee2fcfe --- /dev/null +++ b/scripts/playwright-capture-diff.mjs @@ -0,0 +1,210 @@ +#!/usr/bin/env node + +import path from 'node:path' +import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises' +import { PNG } from 'pngjs' +import pixelmatch from 'pixelmatch' + +function usage() { + console.log([ + 'usage:', + ' node scripts/playwright-capture-diff.mjs --left path.png --right path.png [--out diff.png] [--summary summary.json]', + ' node scripts/playwright-capture-diff.mjs --left dir-a --right dir-b [--out-dir diffs]', + '', + 'options:', + ' --left PATH', + ' --right PATH', + ' --out FILE diff PNG path for single-image mode', + ' --summary FILE JSON summary path for single-image mode', + ' --out-dir DIR output directory for directory mode', + ' --threshold N pixelmatch threshold (default: 0.1)', + ].join('\n')) +} + +function parseArgs(argv) { + const args = {} + + for (let index = 0; index < argv.length; index += 1) { + const token = argv[index] + + if (!token.startsWith('--')) { + continue + } + + const key = token.slice(2) + const next = argv[index + 1] + const value = !next || next.startsWith('--') ? 'true' : next + args[key] = value + + if (value !== 'true') { + index += 1 + } + } + + return args +} + +async function statKind(targetPath) { + try { + const { stat } = await import('node:fs/promises') + const metadata = await stat(targetPath) + + if (metadata.isDirectory()) { + return 'dir' + } + + if (metadata.isFile()) { + return 'file' + } + + return 'other' + } catch { + return null + } +} + +async function readPng(filePath) { + const content = await readFile(filePath) + + return PNG.sync.read(content) +} + +async function writePng(filePath, png) { + await mkdir(path.dirname(filePath), { recursive: true }) + await writeFile(filePath, PNG.sync.write(png)) +} + +async function diffPair(leftPath, rightPath, outPath, threshold) { + const left = await readPng(leftPath) + const right = await readPng(rightPath) + + if (left.width !== right.width || left.height !== right.height) { + return { + left_path: leftPath, + right_path: rightPath, + out_path: outPath ?? null, + size_mismatch: { + left: { width: left.width, height: left.height }, + right: { width: right.width, height: right.height }, + }, + different_pixels: null, + total_pixels: null, + mismatch_ratio: null, + } + } + + const diff = new PNG({ width: left.width, height: left.height }) + const differentPixels = pixelmatch(left.data, right.data, diff.data, left.width, left.height, { threshold }) + const totalPixels = left.width * left.height + + if (outPath) { + await writePng(outPath, diff) + } + + return { + left_path: leftPath, + right_path: rightPath, + out_path: outPath ?? null, + size_mismatch: null, + different_pixels: differentPixels, + total_pixels: totalPixels, + mismatch_ratio: totalPixels === 0 ? 0 : differentPixels / totalPixels, + } +} + +async function listPngFiles(dirPath) { + const files = await readdir(dirPath) + + return files.filter((fileName) => fileName.toLowerCase().endsWith('.png')).sort() +} + +async function main() { + const args = parseArgs(process.argv.slice(2)) + const helpRequested = args.help === 'true' + + if (helpRequested || !args.left || !args.right) { + usage() + process.exit(helpRequested ? 0 : 2) + } + + const leftPath = args.left + const rightPath = args.right + const leftKind = await statKind(leftPath) + const rightKind = await statKind(rightPath) + const threshold = Number(args.threshold ?? 0.1) + + if (!leftKind || !rightKind) { + throw new Error('expected existing --left and --right paths') + } + + if (leftKind !== rightKind) { + throw new Error('--left and --right must both be files or both be directories') + } + + if (leftKind === 'file') { + const outPath = args.out + const summaryPath = args.summary + ?? (outPath ? outPath.replace(/\.png$/i, '.json') : path.join('drafts', 'research', 'capture-diff', 'summary.json')) + const result = await diffPair(leftPath, rightPath, outPath, threshold) + + await mkdir(path.dirname(summaryPath), { recursive: true }) + await writeFile(summaryPath, `${JSON.stringify(result, null, 2)}\n`, 'utf8') + + if (outPath) { + console.log(outPath) + } + console.log(summaryPath) + return + } + + const outDir = args['out-dir'] ?? path.join('drafts', 'research', 'capture-diff') + const leftFiles = await listPngFiles(leftPath) + const rightFiles = await listPngFiles(rightPath) + const leftSet = new Set(leftFiles) + const rightSet = new Set(rightFiles) + const common = leftFiles.filter((fileName) => rightSet.has(fileName)) + const leftOnly = leftFiles.filter((fileName) => !rightSet.has(fileName)) + const rightOnly = rightFiles.filter((fileName) => !leftSet.has(fileName)) + const results = [] + + for (const fileName of common) { + const result = await diffPair( + path.join(leftPath, fileName), + path.join(rightPath, fileName), + path.join(outDir, fileName), + threshold, + ) + + results.push({ + file_name: fileName, + ...result, + }) + } + + const summary = { + compared_at: new Date().toISOString(), + left_dir: leftPath, + right_dir: rightPath, + compared_files: results.length, + left_only: leftOnly, + right_only: rightOnly, + results, + } + const summaryPath = path.join(outDir, 'summary.json') + + await mkdir(outDir, { recursive: true }) + await writeFile(summaryPath, `${JSON.stringify(summary, null, 2)}\n`, 'utf8') + + console.log(outDir) + console.log(summaryPath) +} + +main().catch((error) => { + if (error instanceof Error) { + console.error(error.message) + } else { + console.error(String(error)) + } + + process.exit(1) +}) diff --git a/scripts/playwright-capture-matrix.mjs b/scripts/playwright-capture-matrix.mjs new file mode 100644 index 0000000..4594b5c --- /dev/null +++ b/scripts/playwright-capture-matrix.mjs @@ -0,0 +1,336 @@ +#!/usr/bin/env node + +import crypto from 'node:crypto' +import path from 'node:path' +import { mkdir, writeFile } from 'node:fs/promises' +import { chromium } from 'playwright' + +function usage() { + console.log([ + 'usage:', + ' node scripts/playwright-capture-matrix.mjs --url https://... [--themes dark,light] [--viewports desktop:1440x1024,mobile:390x844]', + ' node scripts/playwright-capture-matrix.mjs --base-url http://m3-vue.modulify.test/ --story-id patterns-local-theming--danger-action-scope', + '', + 'options:', + ' --url URL', + ' --base-url URL default: http://m3-vue.modulify.test/', + ' --story-id ID', + ' --globals KEY:VALUE;KEY:VALUE', + ' --globals-sets SET1||SET2', + ' --args KEY:VALUE;KEY:VALUE', + ' --args-sets SET1||SET2', + ' --themes dark,light', + ' --viewports NAME:WIDTHxHEIGHT,NAME:WIDTHxHEIGHT', + ' --out-dir DIR', + ' --wait-ms MS', + ' --wait-until STATE', + ' --wait-selector CSS', + ' --full-page BOOL', + ].join('\n')) +} + +function parseArgs(argv) { + const args = {} + + for (let index = 0; index < argv.length; index += 1) { + const token = argv[index] + + if (!token.startsWith('--')) { + continue + } + + const key = token.slice(2) + const next = argv[index + 1] + const value = !next || next.startsWith('--') ? 'true' : next + args[key] = value + + if (value !== 'true') { + index += 1 + } + } + + return args +} + +function parseHttpUrl(value) { + let parsed + + try { + parsed = new URL(value) + } catch { + throw new Error(`Invalid URL: ${value}`) + } + + if (!['http:', 'https:'].includes(parsed.protocol)) { + throw new Error(`Unsupported URL protocol: ${value}`) + } + + return parsed +} + +function toBool(value, fallback = true) { + if (value == null) { + return fallback + } + + return !['0', 'false', 'no', 'off'].includes(String(value).toLowerCase()) +} + +function toNumber(value, fallback) { + const parsed = Number(value) + + return Number.isFinite(parsed) ? parsed : fallback +} + +function sanitizePart(value) { + return value + .replace(/[^a-zA-Z0-9._-]+/g, '-') + .replace(/-+/g, '-') + .replace(/^-|-$/g, '') +} + +function defaultFileName(url, variant) { + const parsed = new URL(url) + const base = sanitizePart(`${parsed.hostname}${parsed.pathname || '/index'}-${variant}`.toLowerCase()) || 'capture' + const hash = crypto.createHash('sha1').update(`${url}:${variant}`).digest('hex').slice(0, 8) + return `${base}-${hash}.png` +} + +function splitSetList(value) { + if (!value) { + return [''] + } + + return String(value) + .split('||') + .map((entry) => entry.trim()) + .filter(Boolean) +} + +function parseThemes(value) { + if (!value) { + return [''] + } + + return String(value) + .split(',') + .map((entry) => entry.trim()) + .filter(Boolean) +} + +function parseViewports(value) { + if (!value) { + return [{ + name: 'desktop', + width: 1440, + height: 1024, + }] + } + + return String(value) + .split(',') + .map((entry, index) => { + const trimmed = entry.trim() + const [namePart, sizePartRaw] = trimmed.includes(':') + ? trimmed.split(':') + : [`viewport-${index + 1}`, trimmed] + const sizePart = sizePartRaw.trim() + const match = sizePart.match(/^(\d+)x(\d+)$/i) + + if (!match) { + throw new Error(`Invalid viewport entry: ${trimmed}`) + } + + return { + name: sanitizePart(namePart.trim()) || `viewport-${index + 1}`, + width: Number(match[1]), + height: Number(match[2]), + } + }) +} + +function mergeQueryGroup(baseGroup, extraGroup) { + const parts = [] + + if (baseGroup) { + parts.push(...baseGroup.split(';').map((entry) => entry.trim()).filter(Boolean)) + } + + if (extraGroup) { + parts.push(...extraGroup.split(';').map((entry) => entry.trim()).filter(Boolean)) + } + + return parts.join(';') +} + +function buildStoryUrl(args, theme, globalsSet, argSet) { + const baseUrl = parseHttpUrl(args['base-url'] ?? 'http://m3-vue.modulify.test/') + const storyId = args['story-id'] + + if (!storyId) { + throw new Error('expected --story-id when --url is not provided') + } + + const url = new URL(baseUrl.toString()) + url.searchParams.set('path', `/story/${storyId}`) + + const globals = mergeQueryGroup(args.globals ?? '', mergeQueryGroup(theme ? `theme:${theme}` : '', globalsSet)) + const storyArgs = mergeQueryGroup(args.args ?? '', argSet) + + if (globals) { + url.searchParams.set('globals', globals) + } + + if (storyArgs) { + url.searchParams.set('args', storyArgs) + } + + return url.toString() +} + +function buildDirectUrl(args, theme, globalsSet) { + const baseUrl = new URL(parseHttpUrl(args.url).toString()) + const currentGlobals = baseUrl.searchParams.get('globals') ?? '' + const globals = mergeQueryGroup(currentGlobals, mergeQueryGroup(args.globals ?? '', mergeQueryGroup(theme ? `theme:${theme}` : '', globalsSet))) + + if (globals) { + baseUrl.searchParams.set('globals', globals) + } + + return baseUrl.toString() +} + +async function captureOne({ url, outPath, viewport, waitMs, waitUntil, waitSelector, fullPage }) { + const browser = await chromium.launch({ headless: true }) + const context = await browser.newContext({ + viewport: { + width: viewport.width, + height: viewport.height, + }, + }) + const page = await context.newPage() + + try { + await page.goto(url, { + waitUntil, + timeout: 45000, + }) + + if (waitSelector) { + await page.waitForSelector(waitSelector, { timeout: 45000 }) + } + + if (waitMs > 0) { + await page.waitForTimeout(waitMs) + } + + await mkdir(path.dirname(outPath), { recursive: true }) + await page.screenshot({ + path: outPath, + fullPage, + }) + + const metaPath = outPath.replace(/\.png$/i, '.meta.json') + await writeFile(metaPath, `${JSON.stringify({ + captured_at: new Date().toISOString(), + url_requested: url, + url_final: page.url(), + title: await page.title(), + viewport, + wait_ms: waitMs, + wait_until: waitUntil, + wait_selector: waitSelector || null, + full_page: fullPage, + image_path: outPath, + }, null, 2)}\n`, 'utf8') + + return { + image_path: outPath, + meta_path: metaPath, + final_url: page.url(), + title: await page.title(), + } + } finally { + await page.close().catch(() => {}) + await context.close().catch(() => {}) + await browser.close().catch(() => {}) + } +} + +async function main() { + const args = parseArgs(process.argv.slice(2)) + const helpRequested = args.help === 'true' + + if (helpRequested || (!args.url && !args['story-id'])) { + usage() + process.exit(helpRequested ? 0 : 2) + } + + const themes = parseThemes(args.themes) + const globalsSets = splitSetList(args['globals-sets']) + const argsSets = splitSetList(args['args-sets']) + const viewports = parseViewports(args.viewports) + const outDir = args['out-dir'] ?? path.join('drafts', 'screenshots', 'capture-matrix') + const waitMs = toNumber(args['wait-ms'] ?? '1200', 1200) + const waitUntil = args['wait-until'] ?? 'networkidle' + const waitSelector = args['wait-selector'] ?? '' + const fullPage = toBool(args['full-page'], false) + const results = [] + + for (const theme of themes) { + for (const globalsSet of globalsSets) { + for (const argSet of argsSets) { + for (const viewport of viewports) { + const url = args.url + ? buildDirectUrl(args, theme, globalsSet) + : buildStoryUrl(args, theme, globalsSet, argSet) + const variant = [ + theme || 'default-theme', + globalsSet ? sanitizePart(globalsSet) : 'base-globals', + argSet ? sanitizePart(argSet) : 'base-args', + viewport.name, + ].join('-') + const outPath = path.join(outDir, defaultFileName(url, variant)) + const capture = await captureOne({ + url, + outPath, + viewport, + waitMs, + waitUntil, + waitSelector, + fullPage, + }) + + results.push({ + theme: theme || null, + globals_set: globalsSet || null, + args_set: argSet || null, + viewport, + url, + ...capture, + }) + } + } + } + } + + const summaryPath = path.join(outDir, 'summary.json') + await mkdir(outDir, { recursive: true }) + await writeFile(summaryPath, `${JSON.stringify({ + captured_at: new Date().toISOString(), + results, + }, null, 2)}\n`, 'utf8') + + console.log(outDir) + console.log(summaryPath) +} + +main().catch((error) => { + if (error instanceof Error) { + console.error(error.message) + } else { + console.error(String(error)) + } + + process.exit(1) +}) diff --git a/scripts/playwright-research.mjs b/scripts/playwright-research.mjs new file mode 100644 index 0000000..421c074 --- /dev/null +++ b/scripts/playwright-research.mjs @@ -0,0 +1,999 @@ +#!/usr/bin/env node + +import crypto from 'node:crypto' +import path from 'node:path' +import { mkdir, writeFile } from 'node:fs/promises' +import { chromium } from 'playwright' + +function usage() { + console.log([ + 'usage:', + ' node scripts/playwright-research.mjs --action style-dump --url https://... [options]', + '', + 'actions:', + ' dom-snapshot', + ' style-dump', + ' layout-metrics', + ' a11y-snapshot', + ' console-capture', + ' trace', + ' network-log', + ' perf-marks', + ' token-diff', + ' motion-sample', + '', + 'common options:', + ' --url URL', + ' --out FILE', + ' --out-dir DIR', + ' --width PX default: 1440', + ' --height PX default: 1024', + ' --wait-ms MS default: 1200', + ' --wait-until STATE default: networkidle', + ' --wait-selector CSS', + ' --timeout MS default: 45000', + '', + 'selector options:', + ' --selector CSS', + ' --selectors CSS1||CSS2||CSS3', + ' --compare-selector CSS', + '', + 'action-specific options:', + ' --props display,color,gap', + ' --var-prefix --m3-sys- may be repeated', + ' --var-prefixes --m3-sys-,--m3-state-layers-', + ' --action-selector CSS', + ' --interaction click|hover|focus', + ' --count N motion-sample only; default: 6', + ' --interval-ms MS motion-sample only; default: 120', + ].join('\n')) +} + +function parseArgs(argv) { + const args = {} + const optionsWithValues = new Set([ + 'action', + 'url', + 'out', + 'out-dir', + 'width', + 'height', + 'wait-ms', + 'wait-until', + 'wait-selector', + 'timeout', + 'selector', + 'selectors', + 'compare-selector', + 'props', + 'var-prefix', + 'var-prefixes', + 'action-selector', + 'interaction', + 'count', + 'interval-ms', + 'post-action-wait-ms', + 'full-page', + ]) + + for (let index = 0; index < argv.length; index += 1) { + const token = argv[index] + + if (!token.startsWith('--')) { + continue + } + + const inlineSeparatorIndex = token.indexOf('=') + const hasInlineValue = inlineSeparatorIndex !== -1 + const key = hasInlineValue ? token.slice(2, inlineSeparatorIndex) : token.slice(2) + const next = argv[index + 1] + const expectsValue = optionsWithValues.has(key) + const value = hasInlineValue + ? token.slice(inlineSeparatorIndex + 1) + : (!expectsValue || next == null ? 'true' : next) + + if (Object.hasOwn(args, key)) { + const current = Array.isArray(args[key]) ? args[key] : [args[key]] + current.push(value) + args[key] = current + } else { + args[key] = value + } + + if (!hasInlineValue && value !== 'true') { + index += 1 + } + } + + return args +} + +function getArg(args, key, fallback = undefined) { + const value = args[key] + + if (Array.isArray(value)) { + return value[value.length - 1] ?? fallback + } + + return value ?? fallback +} + +function getArgs(args, key) { + const value = args[key] + + if (value == null) { + return [] + } + + return Array.isArray(value) ? value : [value] +} + +function toBool(value, fallback = true) { + if (value == null) { + return fallback + } + + return !['0', 'false', 'no', 'off'].includes(String(value).toLowerCase()) +} + +function toNumber(value, fallback) { + const parsed = Number(value) + + return Number.isFinite(parsed) ? parsed : fallback +} + +function sanitizePart(value) { + return value + .replace(/[^a-zA-Z0-9._-]+/g, '-') + .replace(/-+/g, '-') + .replace(/^-|-$/g, '') +} + +function parseHttpUrl(value) { + let parsed + + try { + parsed = new URL(value) + } catch { + throw new Error(`Invalid --url value: ${value}`) + } + + if (!['http:', 'https:'].includes(parsed.protocol)) { + throw new Error(`Unsupported URL protocol in --url: ${value}`) + } + + return parsed +} + +function defaultStem(action, parsedUrl, rawUrl) { + const base = sanitizePart(`${parsedUrl.hostname}${parsedUrl.pathname || '/index'}`.toLowerCase()) || 'page' + const hash = crypto.createHash('sha1').update(`${action}:${rawUrl}`).digest('hex').slice(0, 8) + return `${base}-${action}-${hash}` +} + +function defaultOutputPath({ action, parsedUrl, rawUrl, out, outDir, extension }) { + if (out) { + return out + } + + const baseDir = outDir ?? path.join('drafts', 'research', action) + + return path.join(baseDir, `${defaultStem(action, parsedUrl, rawUrl)}.${extension}`) +} + +function splitDelimitedValues(value, delimiter = '||') { + if (!value) { + return [] + } + + return String(value) + .split(delimiter) + .map((entry) => entry.trim()) + .filter(Boolean) +} + +function resolveSelectors(args) { + const directSelectors = getArgs(args, 'selector') + const groupedSelectors = splitDelimitedValues(getArg(args, 'selectors', '')) + + const selectors = [...directSelectors, ...groupedSelectors].filter(Boolean) + + return selectors.length > 0 ? selectors : ['body'] +} + +function resolveVarPrefixes(args) { + const directPrefixes = getArgs(args, 'var-prefix') + const groupedPrefixes = String(getArg(args, 'var-prefixes', '--m3-sys-')) + .split(',') + .map((entry) => entry.trim()) + .filter(Boolean) + + const prefixes = [...directPrefixes, ...groupedPrefixes] + + return prefixes.length > 0 ? prefixes : ['--m3-sys-'] +} + +function resolveCssProps(args) { + return String(getArg( + args, + 'props', + 'display,position,width,height,min-width,min-height,max-width,max-height,margin,padding,gap,font-size,line-height,color,background-color,border-radius,z-index', + )) + .split(',') + .map((entry) => entry.trim()) + .filter(Boolean) +} + +async function createPage(args) { + const width = toNumber(getArg(args, 'width', '1440'), 1440) + const height = toNumber(getArg(args, 'height', '1024'), 1024) + const browser = await chromium.launch({ headless: true }) + const context = await browser.newContext({ + viewport: { width, height }, + }) + const page = await context.newPage() + + return { + browser, + context, + page, + viewport: { width, height }, + } +} + +async function navigate(page, args) { + const url = getArg(args, 'url') + const timeout = toNumber(getArg(args, 'timeout', '45000'), 45000) + const waitUntil = getArg(args, 'wait-until', 'networkidle') + const waitSelector = getArg(args, 'wait-selector', '') + const waitMs = toNumber(getArg(args, 'wait-ms', '1200'), 1200) + + await page.goto(url, { waitUntil, timeout }) + + if (waitSelector) { + await page.waitForSelector(waitSelector, { timeout }) + } + + if (waitMs > 0) { + await page.waitForTimeout(waitMs) + } + + return { + finalUrl: page.url(), + title: await page.title(), + waitUntil, + waitSelector: waitSelector || null, + waitMs, + timeout, + } +} + +async function writeJson(outPath, payload) { + await mkdir(path.dirname(outPath), { recursive: true }) + await writeFile(outPath, `${JSON.stringify(payload, null, 2)}\n`, 'utf8') +} + +async function collectElementSnapshot(page, selector, fn, errorLabel = 'selector') { + return page.evaluate(({ selector: targetSelector, label, evaluateFnSource }) => { + const element = document.querySelector(targetSelector) + + if (!element) { + throw new Error(`${label} not found: ${targetSelector}`) + } + + const evaluateFn = new Function('element', `return (${evaluateFnSource})(element)`) + + return evaluateFn(element) + }, { selector, label: errorLabel, evaluateFnSource: fn.toString() }) +} + +async function runDomSnapshot(page, args, meta) { + const selector = getArg(args, 'selector', 'body') + const outPath = defaultOutputPath({ + action: 'dom-snapshot', + parsedUrl: meta.parsedUrl, + rawUrl: meta.url, + out: getArg(args, 'out'), + outDir: getArg(args, 'out-dir'), + extension: 'json', + }) + + const snapshot = await collectElementSnapshot(page, selector, (element) => { + const htmlElement = element + + return { + tag_name: htmlElement.tagName.toLowerCase(), + id: htmlElement.id || null, + class_name: htmlElement.className || '', + text_content: htmlElement.textContent ?? '', + outer_html: htmlElement.outerHTML, + } + }) + + await writeJson(outPath, { + action: 'dom-snapshot', + captured_at: new Date().toISOString(), + url_requested: meta.url, + url_final: meta.navigation.finalUrl, + title: meta.navigation.title, + selector, + snapshot, + }) + + console.log(outPath) +} + +async function runStyleDump(page, args, meta) { + const selector = getArg(args, 'selector', 'body') + const cssProps = resolveCssProps(args) + const varPrefixes = resolveVarPrefixes(args) + const outPath = defaultOutputPath({ + action: 'style-dump', + parsedUrl: meta.parsedUrl, + rawUrl: meta.url, + out: getArg(args, 'out'), + outDir: getArg(args, 'out-dir'), + extension: 'json', + }) + + const styles = await page.evaluate(({ targetSelector, cssProps: props, prefixes }) => { + const element = document.querySelector(targetSelector) + + if (!element) { + throw new Error(`selector not found: ${targetSelector}`) + } + + const style = getComputedStyle(element) + const cssProps = Object.fromEntries(props.map((prop) => [prop, style.getPropertyValue(prop).trim()])) + const variables = {} + + for (const property of style) { + if (prefixes.some((prefix) => property.startsWith(prefix))) { + variables[property] = style.getPropertyValue(property).trim() + } + } + + return { + tag_name: element.tagName.toLowerCase(), + class_name: element.className || '', + css_props: cssProps, + variables, + } + }, { targetSelector: selector, cssProps, prefixes: varPrefixes }) + + await writeJson(outPath, { + action: 'style-dump', + captured_at: new Date().toISOString(), + url_requested: meta.url, + url_final: meta.navigation.finalUrl, + title: meta.navigation.title, + selector, + css_props: cssProps, + var_prefixes: varPrefixes, + styles, + }) + + console.log(outPath) +} + +async function runLayoutMetrics(page, args, meta) { + const selectors = resolveSelectors(args) + const outPath = defaultOutputPath({ + action: 'layout-metrics', + parsedUrl: meta.parsedUrl, + rawUrl: meta.url, + out: getArg(args, 'out'), + outDir: getArg(args, 'out-dir'), + extension: 'json', + }) + + const metrics = await page.evaluate((requestedSelectors) => { + const describeElement = (element) => { + const rect = element.getBoundingClientRect() + const style = getComputedStyle(element) + const offsetParent = element.offsetParent + + return { + tag_name: element.tagName.toLowerCase(), + class_name: element.className || '', + rect: { + x: rect.x, + y: rect.y, + top: rect.top, + left: rect.left, + right: rect.right, + bottom: rect.bottom, + width: rect.width, + height: rect.height, + }, + client: { + width: element.clientWidth, + height: element.clientHeight, + }, + offset: { + width: element.offsetWidth, + height: element.offsetHeight, + top: element.offsetTop, + left: element.offsetLeft, + }, + scroll: { + width: element.scrollWidth, + height: element.scrollHeight, + top: element.scrollTop, + left: element.scrollLeft, + }, + computed: { + display: style.display, + position: style.position, + box_sizing: style.boxSizing, + margin: style.margin, + padding: style.padding, + gap: style.gap, + z_index: style.zIndex, + }, + offset_parent: offsetParent + ? { + tag_name: offsetParent.tagName.toLowerCase(), + class_name: offsetParent.className || '', + } + : null, + } + } + + return { + viewport: { + inner_width: window.innerWidth, + inner_height: window.innerHeight, + scroll_x: window.scrollX, + scroll_y: window.scrollY, + }, + selectors: requestedSelectors.map((selector) => { + const element = document.querySelector(selector) + + return { + selector, + found: Boolean(element), + metrics: element ? describeElement(element) : null, + } + }), + } + }, selectors) + + await writeJson(outPath, { + action: 'layout-metrics', + captured_at: new Date().toISOString(), + url_requested: meta.url, + url_final: meta.navigation.finalUrl, + title: meta.navigation.title, + selectors, + metrics, + }) + + console.log(outPath) +} + +async function runA11ySnapshot(page, args, meta) { + const selector = getArg(args, 'selector') + const timeout = toNumber(getArg(args, 'timeout', '45000'), 45000) + const outPath = defaultOutputPath({ + action: 'a11y-snapshot', + parsedUrl: meta.parsedUrl, + rawUrl: meta.url, + out: getArg(args, 'out'), + outDir: getArg(args, 'out-dir'), + extension: 'json', + }) + + const targetSelector = selector ?? 'body' + const locator = page.locator(targetSelector) + const elementCount = await locator.count() + + if (elementCount === 0) { + throw new Error(`selector not found: ${targetSelector}`) + } + + const snapshotYaml = await locator.first().ariaSnapshot({ timeout }) + const snapshot = snapshotYaml + .split('\n') + .map((line) => line.replace(/\r$/, '')) + .filter((line) => line.length > 0) + + await writeJson(outPath, { + action: 'a11y-snapshot', + captured_at: new Date().toISOString(), + url_requested: meta.url, + url_final: meta.navigation.finalUrl, + title: meta.navigation.title, + selector: targetSelector, + matched_count: elementCount, + snapshot_yaml: snapshotYaml, + snapshot, + }) + + console.log(outPath) +} + +async function runConsoleCapture(page, args, meta) { + const outPath = defaultOutputPath({ + action: 'console-capture', + parsedUrl: meta.parsedUrl, + rawUrl: meta.url, + out: getArg(args, 'out'), + outDir: getArg(args, 'out-dir'), + extension: 'json', + }) + + const consoleEntries = [] + const pageErrors = [] + const requestFailures = [] + + page.on('console', (message) => { + consoleEntries.push({ + type: message.type(), + text: message.text(), + location: message.location(), + }) + }) + + page.on('pageerror', (error) => { + pageErrors.push({ + message: error.message, + stack: error.stack ?? null, + }) + }) + + page.on('requestfailed', (request) => { + requestFailures.push({ + url: request.url(), + method: request.method(), + resource_type: request.resourceType(), + failure_text: request.failure()?.errorText ?? null, + }) + }) + + const navigation = await navigate(page, args) + + await writeJson(outPath, { + action: 'console-capture', + captured_at: new Date().toISOString(), + url_requested: meta.url, + url_final: navigation.finalUrl, + title: navigation.title, + console: consoleEntries, + page_errors: pageErrors, + request_failures: requestFailures, + }) + + console.log(outPath) +} + +async function runTrace(page, context, args, meta) { + const outPath = defaultOutputPath({ + action: 'trace', + parsedUrl: meta.parsedUrl, + rawUrl: meta.url, + out: getArg(args, 'out'), + outDir: getArg(args, 'out-dir'), + extension: 'zip', + }) + const actionSelector = getArg(args, 'action-selector', '') + const interaction = getArg(args, 'interaction', 'click') + + await mkdir(path.dirname(outPath), { recursive: true }) + await context.tracing.start({ + screenshots: true, + snapshots: true, + sources: true, + }) + + const navigation = await navigate(page, args) + + if (actionSelector) { + const locator = page.locator(actionSelector) + + if (interaction === 'hover') { + await locator.hover() + } else if (interaction === 'focus') { + await locator.focus() + } else { + await locator.click() + } + + await page.waitForTimeout(toNumber(getArg(args, 'post-action-wait-ms', '400'), 400)) + } + + await context.tracing.stop({ path: outPath }) + + const metaPath = outPath.replace(/\.zip$/i, '.meta.json') + + await writeJson(metaPath, { + action: 'trace', + captured_at: new Date().toISOString(), + url_requested: meta.url, + url_final: navigation.finalUrl, + title: navigation.title, + interaction: actionSelector + ? { + selector: actionSelector, + type: interaction, + } + : null, + trace_path: outPath, + }) + + console.log(outPath) + console.log(metaPath) +} + +async function runNetworkLog(page, args, meta) { + const outPath = defaultOutputPath({ + action: 'network-log', + parsedUrl: meta.parsedUrl, + rawUrl: meta.url, + out: getArg(args, 'out'), + outDir: getArg(args, 'out-dir'), + extension: 'json', + }) + + const entries = [] + const requestIndex = new Map() + let nextId = 1 + + page.on('request', (request) => { + const entry = { + id: nextId, + url: request.url(), + method: request.method(), + resource_type: request.resourceType(), + started_at: new Date().toISOString(), + status: null, + ok: null, + failed: false, + failure_text: null, + } + + nextId += 1 + entries.push(entry) + requestIndex.set(request, entry) + }) + + page.on('response', (response) => { + const entry = requestIndex.get(response.request()) + + if (!entry) { + return + } + + entry.status = response.status() + entry.ok = response.ok() + entry.ended_at = new Date().toISOString() + }) + + page.on('requestfailed', (request) => { + const entry = requestIndex.get(request) + + if (!entry) { + return + } + + entry.failed = true + entry.failure_text = request.failure()?.errorText ?? null + entry.ended_at = new Date().toISOString() + }) + + const navigation = await navigate(page, args) + + await writeJson(outPath, { + action: 'network-log', + captured_at: new Date().toISOString(), + url_requested: meta.url, + url_final: navigation.finalUrl, + title: navigation.title, + entries, + }) + + console.log(outPath) +} + +async function runPerfMarks(page, args, meta) { + const outPath = defaultOutputPath({ + action: 'perf-marks', + parsedUrl: meta.parsedUrl, + rawUrl: meta.url, + out: getArg(args, 'out'), + outDir: getArg(args, 'out-dir'), + extension: 'json', + }) + + const navigation = await navigate(page, args) + const perf = await page.evaluate(() => { + const serializeEntry = (entry) => ({ + name: entry.name, + entry_type: entry.entryType, + start_time: entry.startTime, + duration: entry.duration, + initiator_type: 'initiatorType' in entry ? entry.initiatorType : undefined, + transfer_size: 'transferSize' in entry ? entry.transferSize : undefined, + encoded_body_size: 'encodedBodySize' in entry ? entry.encodedBodySize : undefined, + decoded_body_size: 'decodedBodySize' in entry ? entry.decodedBodySize : undefined, + render_blocking_status: 'renderBlockingStatus' in entry ? entry.renderBlockingStatus : undefined, + response_end: 'responseEnd' in entry ? entry.responseEnd : undefined, + dom_complete: 'domComplete' in entry ? entry.domComplete : undefined, + dom_content_loaded: 'domContentLoadedEventEnd' in entry ? entry.domContentLoadedEventEnd : undefined, + load_event_end: 'loadEventEnd' in entry ? entry.loadEventEnd : undefined, + }) + + return { + time_origin: performance.timeOrigin, + now: performance.now(), + navigation: performance.getEntriesByType('navigation').map(serializeEntry), + paints: performance.getEntriesByType('paint').map(serializeEntry), + marks: performance.getEntriesByType('mark').map(serializeEntry), + measures: performance.getEntriesByType('measure').map(serializeEntry), + resources: performance.getEntriesByType('resource').slice(0, 200).map(serializeEntry), + memory: 'memory' in performance + ? { + js_heap_size_limit: performance.memory.jsHeapSizeLimit, + total_js_heap_size: performance.memory.totalJSHeapSize, + used_js_heap_size: performance.memory.usedJSHeapSize, + } + : null, + } + }) + + await writeJson(outPath, { + action: 'perf-marks', + captured_at: new Date().toISOString(), + url_requested: meta.url, + url_final: navigation.finalUrl, + title: navigation.title, + perf, + }) + + console.log(outPath) +} + +async function runTokenDiff(page, args, meta) { + const selector = getArg(args, 'selector') + const compareSelector = getArg(args, 'compare-selector') + + if (!selector || !compareSelector) { + throw new Error('token-diff requires --selector and --compare-selector') + } + + const outPath = defaultOutputPath({ + action: 'token-diff', + parsedUrl: meta.parsedUrl, + rawUrl: meta.url, + out: getArg(args, 'out'), + outDir: getArg(args, 'out-dir'), + extension: 'json', + }) + const prefixes = resolveVarPrefixes(args) + + const diff = await page.evaluate(({ leftSelector, rightSelector, varPrefixes }) => { + const collectVariables = (element) => { + const style = getComputedStyle(element) + const variables = {} + + for (const property of style) { + if (varPrefixes.some((prefix) => property.startsWith(prefix))) { + variables[property] = style.getPropertyValue(property).trim() + } + } + + return variables + } + + const left = document.querySelector(leftSelector) + const right = document.querySelector(rightSelector) + + if (!left) { + throw new Error(`selector not found: ${leftSelector}`) + } + + if (!right) { + throw new Error(`compare selector not found: ${rightSelector}`) + } + + const leftVariables = collectVariables(left) + const rightVariables = collectVariables(right) + const names = [...new Set([...Object.keys(leftVariables), ...Object.keys(rightVariables)])].sort() + const changed = {} + + for (const name of names) { + if ((leftVariables[name] ?? null) !== (rightVariables[name] ?? null)) { + changed[name] = { + left: leftVariables[name] ?? null, + right: rightVariables[name] ?? null, + } + } + } + + return { + left_selector: leftSelector, + right_selector: rightSelector, + prefixes: varPrefixes, + changed, + left_variables: leftVariables, + right_variables: rightVariables, + } + }, { leftSelector: selector, rightSelector: compareSelector, varPrefixes: prefixes }) + + await writeJson(outPath, { + action: 'token-diff', + captured_at: new Date().toISOString(), + url_requested: meta.url, + url_final: meta.navigation.finalUrl, + title: meta.navigation.title, + diff, + }) + + console.log(outPath) +} + +async function runMotionSample(page, args, meta) { + const interactionSelector = getArg(args, 'action-selector', '') + const interaction = getArg(args, 'interaction', interactionSelector ? 'click' : '') + const count = toNumber(getArg(args, 'count', '6'), 6) + const intervalMs = toNumber(getArg(args, 'interval-ms', '120'), 120) + const fullPage = toBool(getArg(args, 'full-page', 'false'), false) + const outDir = getArg(args, 'out-dir') + ?? path.join('drafts', 'research', 'motion-sample', defaultStem('motion-sample', meta.parsedUrl, meta.url)) + + await mkdir(outDir, { recursive: true }) + + const navigation = await navigate(page, args) + + if (interactionSelector) { + const locator = page.locator(interactionSelector) + + if (interaction === 'hover') { + await locator.hover() + } else if (interaction === 'focus') { + await locator.focus() + } else { + await locator.click() + } + } + + const frames = [] + + for (let index = 0; index < count; index += 1) { + const filePath = path.join(outDir, `frame-${String(index + 1).padStart(2, '0')}.png`) + await page.screenshot({ + path: filePath, + fullPage, + }) + + frames.push({ + index: index + 1, + elapsed_ms: index * intervalMs, + image_path: filePath, + }) + + if (index < count - 1 && intervalMs > 0) { + await page.waitForTimeout(intervalMs) + } + } + + const metaPath = path.join(outDir, 'meta.json') + + await writeJson(metaPath, { + action: 'motion-sample', + captured_at: new Date().toISOString(), + url_requested: meta.url, + url_final: navigation.finalUrl, + title: navigation.title, + interaction: interactionSelector + ? { + selector: interactionSelector, + type: interaction || null, + } + : null, + count, + interval_ms: intervalMs, + frames, + }) + + console.log(outDir) + console.log(metaPath) +} + +async function main() { + const args = parseArgs(process.argv.slice(2)) + const helpRequested = toBool(getArg(args, 'help', 'false'), false) + + if (helpRequested || !getArg(args, 'action')) { + usage() + process.exit(helpRequested ? 0 : 2) + } + + const action = getArg(args, 'action') + const requestedUrl = getArg(args, 'url') + + if (!requestedUrl) { + throw new Error('expected --url') + } + + const parsedUrl = parseHttpUrl(requestedUrl) + const url = parsedUrl.toString() + const runtime = await createPage(args) + const meta = { + action, + url, + parsedUrl, + viewport: runtime.viewport, + navigation: null, + } + + try { + if (action === 'console-capture') { + await runConsoleCapture(runtime.page, args, meta) + return + } + + if (action === 'network-log') { + await runNetworkLog(runtime.page, args, meta) + return + } + + if (action === 'trace') { + await runTrace(runtime.page, runtime.context, args, meta) + return + } + + if (action === 'perf-marks') { + await runPerfMarks(runtime.page, args, meta) + return + } + + if (action === 'motion-sample') { + await runMotionSample(runtime.page, args, meta) + return + } + + meta.navigation = await navigate(runtime.page, args) + + if (action === 'dom-snapshot') { + await runDomSnapshot(runtime.page, args, meta) + return + } + + if (action === 'style-dump') { + await runStyleDump(runtime.page, args, meta) + return + } + + if (action === 'layout-metrics') { + await runLayoutMetrics(runtime.page, args, meta) + return + } + + if (action === 'a11y-snapshot') { + await runA11ySnapshot(runtime.page, args, meta) + return + } + + if (action === 'token-diff') { + await runTokenDiff(runtime.page, args, meta) + return + } + + throw new Error(`Unsupported --action value: ${action}`) + } finally { + await runtime.page.close().catch(() => {}) + await runtime.context.close().catch(() => {}) + await runtime.browser.close().catch(() => {}) + } +} + +main().catch((error) => { + if (error instanceof Error) { + console.error(error.message) + } else { + console.error(String(error)) + } + + process.exit(1) +}) From c45faf5ac277aea163f27d383907516141e9a3dd Mon Sep 17 00:00:00 2001 From: Kirill Zaytsev Date: Mon, 9 Mar 2026 20:40:48 +0400 Subject: [PATCH 26/54] feat: M3 Radio component was added Closes #20 --- .../assets/stylesheets/components/index.scss | 1 + .../stylesheets/components/radio/index.scss | 142 ++++++++++++++++++ m3-react/src/components/radio/M3Radio.tsx | 114 ++++++++++++++ m3-react/src/components/radio/index.ts | 6 + m3-react/src/index.ts | 9 ++ m3-react/storybook/components/M3Radio.mdx | 70 +++++++++ .../storybook/components/M3Radio.stories.tsx | 99 ++++++++++++ .../storybook/examples/radio/RadioGroup.tsx | 78 ++++++++++ m3-react/tests/M3Radio.test.tsx | 44 ++++++ m3-vue/src/components/radio/M3Radio.vue | 117 +++++++++++++++ m3-vue/src/components/radio/index.ts | 1 + m3-vue/src/index.ts | 4 + m3-vue/storybook/components/M3Radio.mdx | 67 +++++++++ .../storybook/components/M3Radio.stories.ts | 103 +++++++++++++ .../storybook/examples/radio/RadioGroup.vue | 75 +++++++++ m3-vue/tests/M3Radio.test.ts | 42 ++++++ 16 files changed, 972 insertions(+) create mode 100644 m3-foundation/assets/stylesheets/components/radio/index.scss create mode 100644 m3-react/src/components/radio/M3Radio.tsx create mode 100644 m3-react/src/components/radio/index.ts create mode 100644 m3-react/storybook/components/M3Radio.mdx create mode 100644 m3-react/storybook/components/M3Radio.stories.tsx create mode 100644 m3-react/storybook/examples/radio/RadioGroup.tsx create mode 100644 m3-react/tests/M3Radio.test.tsx create mode 100644 m3-vue/src/components/radio/M3Radio.vue create mode 100644 m3-vue/src/components/radio/index.ts create mode 100644 m3-vue/storybook/components/M3Radio.mdx create mode 100644 m3-vue/storybook/components/M3Radio.stories.ts create mode 100644 m3-vue/storybook/examples/radio/RadioGroup.vue create mode 100644 m3-vue/tests/M3Radio.test.ts diff --git a/m3-foundation/assets/stylesheets/components/index.scss b/m3-foundation/assets/stylesheets/components/index.scss index 0fb04f0..7e6c9db 100644 --- a/m3-foundation/assets/stylesheets/components/index.scss +++ b/m3-foundation/assets/stylesheets/components/index.scss @@ -10,6 +10,7 @@ @use 'navigation'; @use 'plane-tooltip'; @use 'popper'; +@use 'radio'; @use 'rich-tooltip'; @use 'ripple'; @use 'scrim'; diff --git a/m3-foundation/assets/stylesheets/components/radio/index.scss b/m3-foundation/assets/stylesheets/components/radio/index.scss new file mode 100644 index 0000000..7530151 --- /dev/null +++ b/m3-foundation/assets/stylesheets/components/radio/index.scss @@ -0,0 +1,142 @@ +@use "../../basics/motion" as m3-motion; +@use "../../basics/shape" as m3-shape; + +.m3-radio { + --state-color: var(--m3-sys-primary); + --outline-color: var(--m3-sys-on-surface-variant); + --dot-scale: 0; + + --m3-ripple-color: var(--m3-sys-primary); + --m3-ripple-effect-duration: 0.75s; + --m3-ripple-opacity: 0.2; + + display: inline-block; + flex-grow: 0; + flex-shrink: 0; + width: 40px; + height: 40px; + padding: 8px; + border-radius: 50%; + overflow: hidden; + cursor: pointer; + outline: none; + position: relative; + + @include m3-shape.reset-box-sizing; + + &_checked { + --outline-color: var(--state-color); + --dot-scale: 1; + } + + &_invalid { + --state-color: var(--m3-sys-error); + --outline-color: var(--m3-sys-error); + --m3-ripple-color: var(--m3-sys-error); + } + + &__input { + width: 100%; + height: 100%; + appearance: none; + cursor: inherit; + outline: none; + position: absolute; + left: 0; + top: 0; + margin: 0; + z-index: 1; + } + + &__icon { + display: inline-block; + width: 24px; + height: 24px; + position: relative; + z-index: 0; + + &::before, + &::after { + content: ' '; + display: inline-block; + position: absolute; + border-radius: 50%; + transition: + m3-motion.timing-standard(background-color), + m3-motion.timing-standard(border-color), + m3-motion.timing-standard(transform) + ; + } + + &::before { + width: 20px; + height: 20px; + border: 2px solid var(--outline-color); + left: 2px; + top: 2px; + box-sizing: border-box; + } + + &::after { + width: 10px; + height: 10px; + left: 7px; + top: 7px; + background-color: var(--state-color); + transform: scale(var(--dot-scale)); + } + } + + &__state { + display: inline-block; + width: 100%; + height: 100%; + border-radius: inherit; + opacity: 0; + overflow: hidden; + animation: m3-motion.timing-standard(m3-animation-zoom-out); + animation-fill-mode: forwards; + z-index: 0; + position: absolute; + left: 0; + top: 0; + + &::before { + content: ' '; + width: 100%; + height: 100%; + background: var(--state-color); + border-radius: inherit; + opacity: 0; + position: absolute; + left: 0; + top: 0; + transition: m3-motion.timing-standard(opacity); + } + } + + &__input:hover ~ &__state, + &__input:focus ~ &__state { + animation: m3-motion.timing-standard(m3-animation-zoom-in); + animation-fill-mode: forwards; + } + + &__input:hover ~ &__state::before { opacity: 0.08; } + &__input:focus ~ &__state::before { opacity: 0.12; } + + &_disabled { + cursor: default; + } + + &_disabled &__icon::before { + border-color: color-mix(in srgb, var(--outline-color) 38%, transparent); + } + + &_checked#{&}_disabled &__icon::after { + background-color: color-mix(in srgb, var(--state-color) 38%, transparent); + } + + &_disabled &__state::before { + background: transparent; + } +} diff --git a/m3-react/src/components/radio/M3Radio.tsx b/m3-react/src/components/radio/M3Radio.tsx new file mode 100644 index 0000000..94495da --- /dev/null +++ b/m3-react/src/components/radio/M3Radio.tsx @@ -0,0 +1,114 @@ +import type { + ForwardRefRenderFunction, + HTMLAttributes, +} from 'react' + +import type { + Clickable, + Focusable, +} from '@modulify/m3-foundation' + +import type { M3RippleMethods } from '@/components/ripple' + +import { M3Ripple } from '@/components/ripple' + +import { + forwardRef, + useCallback, + useImperativeHandle, + useMemo, + useRef, +} from 'react' + +import { + useElementEffect, + useId, + useTarget, +} from '@/hooks' + +import { toClassName } from '@/utils/styling' + +export interface M3RadioProps extends HTMLAttributes { + id?: string; + name?: string; + model?: unknown; + value?: unknown; + invalid?: boolean; + disabled?: boolean; + equalsFn?: (a: unknown, b: unknown) => boolean; + onChange?: (value: unknown) => void; +} + +export interface M3RadioMethods extends Clickable, Focusable {} + +const M3Radio: ForwardRefRenderFunction< + M3RadioMethods, + M3RadioProps +> = ({ + id, + name, + model, + value = true, + invalid = false, + disabled = false, + equalsFn = (a: unknown, b: unknown): boolean => a === b, + className = '', + onChange = (_: unknown) => {}, + ...args +}, ref) => { + const root = useRef(null) + const input = useRef(null) + const ripple = useRef(null) + const [rippleTarget, setRippleTarget] = useTarget() + + useImperativeHandle(ref, () => ({ + click: () => input.current?.click(), + focus: () => input.current?.focus(), + blur: () => input.current?.blur(), + })) + + useElementEffect(root, setRippleTarget) + + const checked = useMemo(() => equalsFn(model, value), [equalsFn, model, value]) + const inputId = useId(id, 'm3-radio') + + const handleChange = useCallback((nextChecked: boolean) => { + if (nextChecked) { + onChange(value) + } + }, [onChange, value]) + + return ( + + + + handleChange(event.currentTarget.checked)} + /> + + + + + ) +} + +export default forwardRef(M3Radio) diff --git a/m3-react/src/components/radio/index.ts b/m3-react/src/components/radio/index.ts new file mode 100644 index 0000000..130f2c3 --- /dev/null +++ b/m3-react/src/components/radio/index.ts @@ -0,0 +1,6 @@ +export type { + M3RadioMethods, + M3RadioProps, +} from './M3Radio' + +export { default as M3Radio } from './M3Radio' diff --git a/m3-react/src/index.ts b/m3-react/src/index.ts index 2f47713..a48cb10 100644 --- a/m3-react/src/index.ts +++ b/m3-react/src/index.ts @@ -46,6 +46,11 @@ export type { M3PopperCloserOptions, } from '@/components/popper' +export type { + M3RadioMethods, + M3RadioProps, +} from '@/components/radio' + export type { M3RichTooltipMethods, M3RichTooltipProps, @@ -143,6 +148,10 @@ export { useM3PopperCloserEffect, } from '@/components/popper' +export { + M3Radio, +} from '@/components/radio' + export { M3RichTooltip, } from '@/components/rich-tooltip' diff --git a/m3-react/storybook/components/M3Radio.mdx b/m3-react/storybook/components/M3Radio.mdx new file mode 100644 index 0000000..7fa8d36 --- /dev/null +++ b/m3-react/storybook/components/M3Radio.mdx @@ -0,0 +1,70 @@ +import { Meta, Unstyled } from '@storybook/addon-docs/blocks' + +import RadioGroup from '../examples/radio/RadioGroup' +import * as M3RadioStories from './M3Radio.stories' + + + +# Radio buttons + +Radio buttons let users choose exactly one option from a related set. Unlike checkboxes, they are not meant for independent multi-selection or parent-child aggregate states. + +## API + +### When to use + +Use `M3Radio` when the user must choose one option from a small, visible list. If multiple options can be selected together, prefer `M3Checkbox`. + +### Selection model + +This implementation treats each radio as a single-value option. A radio is checked when `model` equals `value`, and selecting it emits that `value`. + +### Grouping + +For native keyboard and form semantics, related radios should share the same `name`. Wrap related options in a `fieldset` with a visible `legend` whenever possible. + +## Accessibility semantics + +- Every radio needs a visible text label. +- Related radios should be grouped under a shared label. +- Use `name` consistently across one group so browser navigation behaves predictably. +- Mark the group or options invalid only when the selection is required and unresolved. + +### Preference group + + + + + +## Story guide + +- [Standard](?path=/story/components-m3radio--standard) +- [Preference Group](?path=/story/components-m3radio--preference-group) +- [Invalid Group](?path=/story/components-m3radio--invalid-group) + +## Usage guidance + +### Keep option sets short and explicit + +Radio groups work best when all options are visible at once and labels are mutually exclusive. + +### Do not use radios for toggles + +If the choice is simply on/off, prefer a switch or checkbox. Radios communicate one-of-many selection. + +## Resources + +- [M3 Radio button overview](https://m3.material.io/components/radio-button/overview) +- [WAI-ARIA APG: Radio Group Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/radio/) diff --git a/m3-react/storybook/components/M3Radio.stories.tsx b/m3-react/storybook/components/M3Radio.stories.tsx new file mode 100644 index 0000000..edce17a --- /dev/null +++ b/m3-react/storybook/components/M3Radio.stories.tsx @@ -0,0 +1,99 @@ +import type { Meta, StoryObj } from '@storybook/react' + +import { M3Radio } from '@/components/radio' +import RadioGroup from '../examples/radio/RadioGroup' + +import { useState } from 'react' +import { useId } from '@/hooks' + +const meta = { + title: 'Components/M3Radio', + + component: M3Radio, + + argTypes: { + invalid: { + control: 'boolean', + }, + + disabled: { + control: 'boolean', + }, + }, + + args: { + invalid: false, + disabled: false, + }, + + render: (args) => { + const name = useId(null, 'm3-radio-group') + const id = useId(null, 'm3-radio') + const [model, setModel] = useState('choice') + + return ( + + ) + }, + + parameters: { + layout: 'centered', + }, +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const Standard: Story = {} + +export const PreferenceGroup: Story = { + render: () => ( + + ), +} + +export const InvalidGroup: Story = { + render: () => ( + + ), +} diff --git a/m3-react/storybook/examples/radio/RadioGroup.tsx b/m3-react/storybook/examples/radio/RadioGroup.tsx new file mode 100644 index 0000000..eb2bfed --- /dev/null +++ b/m3-react/storybook/examples/radio/RadioGroup.tsx @@ -0,0 +1,78 @@ +import { M3Radio } from '@/components/radio' + +import { useId } from '@/hooks' +import { useState } from 'react' + +export interface RadioOption { + label: string; + value: string; + disabled?: boolean; +} + +export interface RadioGroupProps { + legend?: string; + options: RadioOption[]; + invalid?: boolean; +} + +const RadioGroup = ({ + legend = 'Selection', + options, + invalid = false, +}: RadioGroupProps) => { + const name = useId(null, 'm3-radio-group') + const [model, setModel] = useState(options[0]?.value) + + return ( +
+ + {legend} + + + {options.map(option => { + const id = `${name}-${option.value}` + + return ( + + ) + })} +
+ ) +} + +export default RadioGroup diff --git a/m3-react/tests/M3Radio.test.tsx b/m3-react/tests/M3Radio.test.tsx new file mode 100644 index 0000000..59c6d63 --- /dev/null +++ b/m3-react/tests/M3Radio.test.tsx @@ -0,0 +1,44 @@ +import { + fireEvent, + render, + screen, +} from '@testing-library/react' + +import { M3Radio } from '@/components/radio' + +describe('m3-react/radio', () => { + test('reflects checked state and emits selected value', () => { + const onChange = vi.fn() + + render( + + ) + + const input = screen.getByRole('radio') as HTMLInputElement + + expect(input.getAttribute('aria-invalid')).toBe('true') + expect(input.checked).toBe(false) + + fireEvent.click(input) + + expect(onChange).toHaveBeenCalledWith('email') + }) + + test('supports custom equality', () => { + render( + (a as { id: number }).id === (b as { id: number }).id} + /> + ) + + expect((screen.getByRole('radio') as HTMLInputElement).checked).toBe(true) + }) +}) diff --git a/m3-vue/src/components/radio/M3Radio.vue b/m3-vue/src/components/radio/M3Radio.vue new file mode 100644 index 0000000..948a918 --- /dev/null +++ b/m3-vue/src/components/radio/M3Radio.vue @@ -0,0 +1,117 @@ + + + diff --git a/m3-vue/src/components/radio/index.ts b/m3-vue/src/components/radio/index.ts new file mode 100644 index 0000000..2c7fa93 --- /dev/null +++ b/m3-vue/src/components/radio/index.ts @@ -0,0 +1 @@ +export { default as M3Radio } from './M3Radio.vue' diff --git a/m3-vue/src/index.ts b/m3-vue/src/index.ts index b8ad7e4..5f0ef64 100644 --- a/m3-vue/src/index.ts +++ b/m3-vue/src/index.ts @@ -58,6 +58,10 @@ export { vM3PopperCloser, } from '@/components/popper' +export { + M3Radio, +} from '@/components/radio' + export { M3RichTooltip, } from '@/components/rich-tooltip' diff --git a/m3-vue/storybook/components/M3Radio.mdx b/m3-vue/storybook/components/M3Radio.mdx new file mode 100644 index 0000000..475fdb2 --- /dev/null +++ b/m3-vue/storybook/components/M3Radio.mdx @@ -0,0 +1,67 @@ +import { Meta } from '@storybook/addon-docs/blocks' +import Inline from './Inline' +import RadioGroup from '../examples/radio/RadioGroup.vue' +import * as M3RadioStories from './M3Radio.stories' + + + +# Radio buttons + +Radio buttons let users choose exactly one option from a related set. Unlike checkboxes, they are not meant for independent multi-selection or parent-child aggregate states. + +## API + +### When to use + +Use `M3Radio` when the user must choose one option from a small, visible list. If multiple options can be selected together, prefer `M3Checkbox`. + +### Selection model + +This implementation treats each radio as a single-value option. A radio is checked when `model` equals `value`, and selecting it emits that `value`. + +### Grouping + +For native keyboard and form semantics, related radios should share the same `name`. Wrap related options in a `fieldset` with a visible `legend` whenever possible. + +## Accessibility semantics + +- Every radio needs a visible text label. +- Related radios should be grouped under a shared label. +- Use `name` consistently across one group so browser navigation behaves predictably. +- Mark the group or options invalid only when the selection is required and unresolved. + +### Preference group + +
+ +
+ +## Story guide + +- [Standard](?path=/story/components-m3radio--standard) +- [Preference Group](?path=/story/components-m3radio--preference-group) +- [Invalid Group](?path=/story/components-m3radio--invalid-group) + +## Usage guidance + +### Keep option sets short and explicit + +Radio groups work best when all options are visible at once and labels are mutually exclusive. + +### Do not use radios for toggles + +If the choice is simply on/off, prefer a switch or checkbox. Radios communicate one-of-many selection. + +## Resources + +- [M3 Radio button overview](https://m3.material.io/components/radio-button/overview) +- [WAI-ARIA APG: Radio Group Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/radio/) diff --git a/m3-vue/storybook/components/M3Radio.stories.ts b/m3-vue/storybook/components/M3Radio.stories.ts new file mode 100644 index 0000000..72c8da7 --- /dev/null +++ b/m3-vue/storybook/components/M3Radio.stories.ts @@ -0,0 +1,103 @@ +import type { Meta, StoryObj } from '@storybook/vue3' + +import { M3Radio } from '@/components/radio' +import RadioGroup from '../examples/radio/RadioGroup.vue' +import { ref } from 'vue' + +import useId from '@/composables/id' + +const meta = { + title: 'Components/M3Radio', + + component: M3Radio, + + args: { + invalid: false, + disabled: false, + }, + + render: (args: unknown) => ({ + components: { + M3Radio, + }, + + setup: () => ({ + id: useId('m3-radio'), + name: useId('m3-radio-group'), + args, + model: ref('choice'), + }), + + template: ` + + `, + }), + + parameters: { + layout: 'centered', + }, +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const Standard: Story = {} + +export const PreferenceGroup: Story = { + render: () => ({ + components: { + RadioGroup, + }, + + template: ` + + `, + }), +} + +export const InvalidGroup: Story = { + render: () => ({ + components: { + RadioGroup, + }, + + template: ` + + `, + }), +} diff --git a/m3-vue/storybook/examples/radio/RadioGroup.vue b/m3-vue/storybook/examples/radio/RadioGroup.vue new file mode 100644 index 0000000..a6e403d --- /dev/null +++ b/m3-vue/storybook/examples/radio/RadioGroup.vue @@ -0,0 +1,75 @@ + + + diff --git a/m3-vue/tests/M3Radio.test.ts b/m3-vue/tests/M3Radio.test.ts new file mode 100644 index 0000000..2c88e64 --- /dev/null +++ b/m3-vue/tests/M3Radio.test.ts @@ -0,0 +1,42 @@ +import { + fireEvent, + render, + screen, +} from '@testing-library/vue' + +import { M3Radio } from '@/components/radio' + +describe('m3-vue/radio', () => { + test('reflects checked state and emits selected value', async () => { + const view = render(M3Radio, { + props: { + name: 'channel', + model: 'push', + value: 'email', + invalid: true, + } as Record, + }) + + const input = screen.getByRole('radio') as HTMLInputElement + + expect(input.getAttribute('aria-invalid')).toBe('true') + expect(input.checked).toBe(false) + + await fireEvent.click(input) + + expect(view.emitted().change?.[0]).toEqual(['email']) + expect(view.emitted()['update:model']?.[0]).toEqual(['email']) + }) + + test('supports custom equality', () => { + render(M3Radio, { + props: { + model: { id: 2 }, + value: { id: 2 }, + equalsFn: (a: { id: number }, b: { id: number }) => a.id === b.id, + } as Record, + }) + + expect((screen.getByRole('radio') as HTMLInputElement).checked).toBe(true) + }) +}) From a272befe17f12a3d69ad4929e99cc34abebfde31 Mon Sep 17 00:00:00 2001 From: Kirill Zaytsev Date: Mon, 9 Mar 2026 23:50:43 +0400 Subject: [PATCH 27/54] feat: M3 Chip component was added Closes #15 --- .../stylesheets/components/chip/index.scss | 215 ++++++++++++++++++ .../assets/stylesheets/components/index.scss | 1 + m3-foundation/types/components/chip.d.ts | 1 + m3-react/src/components/chip/M3Chip.tsx | 181 +++++++++++++++ m3-react/src/components/chip/index.ts | 5 + m3-react/src/index.ts | 9 + m3-react/storybook/components/M3Chip.mdx | 75 ++++++ .../storybook/components/M3Chip.stories.tsx | 90 ++++++++ .../storybook/examples/chip/ChipShowcase.tsx | 89 ++++++++ m3-react/tests/M3Chip.test.tsx | 60 +++++ m3-vue/src/components/chip/M3Chip.vue | 210 +++++++++++++++++ m3-vue/src/components/chip/index.ts | 1 + m3-vue/src/components/chip/properties.ts | 13 ++ m3-vue/src/components/chip/values.ts | 3 + m3-vue/src/index.ts | 4 + m3-vue/storybook/components/M3Chip.mdx | 75 ++++++ m3-vue/storybook/components/M3Chip.stories.ts | 98 ++++++++ .../storybook/examples/chip/ChipShowcase.vue | 87 +++++++ m3-vue/tests/M3Chip.test.ts | 63 +++++ 19 files changed, 1280 insertions(+) create mode 100644 m3-foundation/assets/stylesheets/components/chip/index.scss create mode 100644 m3-foundation/types/components/chip.d.ts create mode 100644 m3-react/src/components/chip/M3Chip.tsx create mode 100644 m3-react/src/components/chip/index.ts create mode 100644 m3-react/storybook/components/M3Chip.mdx create mode 100644 m3-react/storybook/components/M3Chip.stories.tsx create mode 100644 m3-react/storybook/examples/chip/ChipShowcase.tsx create mode 100644 m3-react/tests/M3Chip.test.tsx create mode 100644 m3-vue/src/components/chip/M3Chip.vue create mode 100644 m3-vue/src/components/chip/index.ts create mode 100644 m3-vue/src/components/chip/properties.ts create mode 100644 m3-vue/src/components/chip/values.ts create mode 100644 m3-vue/storybook/components/M3Chip.mdx create mode 100644 m3-vue/storybook/components/M3Chip.stories.ts create mode 100644 m3-vue/storybook/examples/chip/ChipShowcase.vue create mode 100644 m3-vue/tests/M3Chip.test.ts diff --git a/m3-foundation/assets/stylesheets/components/chip/index.scss b/m3-foundation/assets/stylesheets/components/chip/index.scss new file mode 100644 index 0000000..27bef0a --- /dev/null +++ b/m3-foundation/assets/stylesheets/components/chip/index.scss @@ -0,0 +1,215 @@ +@use '../../basics/motion' as m3-motion; +@use '../../basics/typography' as m3-typography; + +.m3-chip { + --m3-icon-size: 18px; + --m3-ripple-color: var(--m3-sys-on-surface-variant); + --m3-ripple-opacity: 0.16; + --chip-container-color: transparent; + --chip-outline-color: var(--m3-sys-outline); + --chip-label-color: var(--m3-sys-on-surface); + --chip-state-color: var(--m3-sys-on-surface); + --chip-shadow: none; + + display: inline-flex; + align-items: stretch; + min-height: 32px; + max-width: 100%; + border-radius: 8px; + background: var(--chip-container-color); + box-shadow: var(--chip-shadow); + position: relative; + overflow: hidden; + vertical-align: middle; + transition: + m3-motion.timing-standard(background-color), + m3-motion.timing-standard(box-shadow) + ; + + &, + *, + *::before, + *::after { + box-sizing: border-box; + } + + &::before { + content: ' '; + border: 1px solid var(--chip-outline-color); + border-radius: inherit; + position: absolute; + inset: 0; + transition: m3-motion.timing-standard(border-color); + pointer-events: none; + } + + &_assist { + --m3-ripple-color: var(--m3-sys-primary); + --chip-state-color: var(--m3-sys-primary); + } + + &_filter { + --m3-ripple-color: var(--m3-sys-on-surface); + --chip-state-color: var(--m3-sys-on-surface); + } + + &_filter#{&}_selected { + --m3-ripple-color: var(--m3-sys-on-secondary-container); + --chip-container-color: var(--m3-sys-secondary-container); + --chip-outline-color: transparent; + --chip-label-color: var(--m3-sys-on-secondary-container); + --chip-state-color: var(--m3-sys-on-secondary-container); + } + + &_input { + --chip-container-color: var(--m3-sys-surface-container-low); + --chip-label-color: var(--m3-sys-on-surface); + --chip-state-color: var(--m3-sys-on-surface); + } + + &_suggestion { + --chip-container-color: var(--m3-sys-surface-container-lowest); + --chip-label-color: var(--m3-sys-on-surface); + --chip-state-color: var(--m3-sys-on-surface); + --chip-shadow: var(--m3-elevation-1); + } + + &_dismissible &__action { + padding-right: 10px; + } + + &__action, + &__dismiss { + @include m3-typography.label-large; + + appearance: none; + display: inline-flex; + align-items: center; + background: transparent; + border: none; + color: inherit; + cursor: pointer; + margin: 0; + outline: none; + position: relative; + z-index: 0; + overflow: hidden; + } + + &__action { + min-height: 32px; + min-width: 0; + padding: 0 16px; + color: var(--chip-label-color); + flex: 1 1 auto; + border-radius: inherit; + } + + &_has-leading-icon &__action, + &_has-checkmark &__action { + padding-left: 12px; + } + + &_has-trailing-icon &__action { + padding-right: 12px; + } + + &__dismiss { + width: 32px; + min-height: 32px; + justify-content: center; + color: var(--chip-label-color); + flex: 0 0 32px; + border-radius: 0 8px 8px 0; + } + + &_dismissible &__action { + border-radius: 8px 0 0 8px; + } + + &_dismissible &__dismiss::before { + content: ' '; + width: 1px; + position: absolute; + left: 0; + top: 8px; + bottom: 8px; + background: color-mix(in srgb, var(--chip-outline-color) 60%, transparent); + } + + &__state { + width: 100%; + height: 100%; + background: var(--chip-state-color); + border-radius: inherit; + overflow: hidden; + opacity: 0; + position: absolute; + inset: 0; + transition: + m3-motion.timing-standard(background-color), + m3-motion.timing-standard(opacity) + ; + pointer-events: none; + } + + &__content { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + min-width: 0; + position: relative; + z-index: 1; + } + + &__icon, + &__label { + display: inline-flex; + align-items: center; + } + + &__icon { + flex: 0 0 auto; + } + + &__label { + min-width: 0; + padding-top: 1px; + white-space: nowrap; + } + + &__action:hover &__state, + &__dismiss:hover &__state { + opacity: 0.08; + } + + &__action:focus-visible &__state, + &__dismiss:focus-visible &__state, + &__action:active &__state, + &__dismiss:active &__state { + opacity: 0.12; + } + + &_disabled { + --m3-ripple-opacity: 0; + --chip-container-color: color-mix(in srgb, var(--chip-container-color) 100%, transparent); + --chip-outline-color: color-mix(in srgb, var(--m3-sys-on-surface) 12%, transparent); + --chip-label-color: color-mix(in srgb, var(--m3-sys-on-surface) 38%, transparent); + --chip-state-color: transparent; + --chip-shadow: none; + } + + &_disabled &__action, + &_disabled &__dismiss { + cursor: default; + } + + &_disabled &__dismiss::before { + background: color-mix(in srgb, var(--m3-sys-on-surface) 12%, transparent); + } + + &_disabled &__state { + opacity: 0; + } +} diff --git a/m3-foundation/assets/stylesheets/components/index.scss b/m3-foundation/assets/stylesheets/components/index.scss index 7e6c9db..c0fd8c2 100644 --- a/m3-foundation/assets/stylesheets/components/index.scss +++ b/m3-foundation/assets/stylesheets/components/index.scss @@ -1,6 +1,7 @@ @use 'badge'; @use 'button'; @use 'card'; +@use 'chip'; @use 'checkbox'; @use 'dialog'; @use 'fab-button'; diff --git a/m3-foundation/types/components/chip.d.ts b/m3-foundation/types/components/chip.d.ts new file mode 100644 index 0000000..a4499d8 --- /dev/null +++ b/m3-foundation/types/components/chip.d.ts @@ -0,0 +1 @@ +export type Variant = 'assist' | 'filter' | 'input' | 'suggestion' diff --git a/m3-react/src/components/chip/M3Chip.tsx b/m3-react/src/components/chip/M3Chip.tsx new file mode 100644 index 0000000..49e2b7e --- /dev/null +++ b/m3-react/src/components/chip/M3Chip.tsx @@ -0,0 +1,181 @@ +import type { + ButtonHTMLAttributes, + ForwardRefRenderFunction, + MouseEventHandler, + ReactNode, +} from 'react' + +import type { Variant } from '@modulify/m3-foundation/types/components/chip' +import type { + Clickable, + Focusable, +} from '@modulify/m3-foundation' + +import type { M3RippleMethods } from '@/components/ripple' + +import { + forwardRef, + useCallback, + useImperativeHandle, + useMemo, + useRef, +} from 'react' + +import { M3Icon } from '@/components/icon' +import { M3Ripple } from '@/components/ripple' + +import { + useElementEffect, + useTarget, +} from '@/hooks' + +import { normalize } from '@/utils/content' +import { toClassName } from '@/utils/styling' + +export interface M3ChipProps extends Omit, 'onToggle'> { + variant?: Variant; + selected?: boolean; + showCheckmark?: boolean; + dismissible?: boolean; + dismissLabel?: string; + onToggle?: (selected: boolean) => void; + onDismiss?: () => void; +} + +export interface M3ChipMethods extends Clickable, Focusable {} + +const M3Chip: ForwardRefRenderFunction = ({ + type = 'button', + variant = 'assist', + selected = false, + showCheckmark = true, + dismissible = false, + dismissLabel = 'Remove', + disabled = false, + className = '', + style, + children = [], + onClick = () => {}, + onKeyUp = () => {}, + onToggle = () => {}, + onDismiss, + ...actionAttrs +}, ref) => { + const action = useRef(null) + const dismiss = useRef(null) + const actionRipple = useRef(null) + const dismissRipple = useRef(null) + + const [actionRippleTarget, setActionRippleTarget] = useTarget() + const [dismissRippleTarget, setDismissRippleTarget] = useTarget() + + useElementEffect(action, setActionRippleTarget) + useElementEffect(dismiss, setDismissRippleTarget) + + useImperativeHandle(ref, () => ({ + click: () => action.current?.click(), + focus: () => action.current?.focus(), + blur: () => action.current?.blur(), + })) + + const content = useMemo(() => normalize(children), [children]) + + const hasText = useMemo(() => content.some(([, isIcon]) => !isIcon), [content]) + const [, hasLeadingIcon] = content[0] ?? [null, false] + const [, hasTrailingIcon] = content[content.length - 1] ?? [null, false] + + const hasCheckmark = variant === 'filter' && selected && showCheckmark && !hasLeadingIcon + const hasDismiss = dismissible || typeof onDismiss === 'function' + + const renderItem = useCallback((child: ReactNode, isIcon: boolean, key: string) => ( + + {child} + + ), []) + + return ( + + + + {hasDismiss ? ( + + ) : null} + + ) +} + +export default forwardRef(M3Chip) diff --git a/m3-react/src/components/chip/index.ts b/m3-react/src/components/chip/index.ts new file mode 100644 index 0000000..06c82da --- /dev/null +++ b/m3-react/src/components/chip/index.ts @@ -0,0 +1,5 @@ +export { default as M3Chip } from './M3Chip' +export type { + M3ChipMethods, + M3ChipProps, +} from './M3Chip' diff --git a/m3-react/src/index.ts b/m3-react/src/index.ts index a48cb10..4956b2d 100644 --- a/m3-react/src/index.ts +++ b/m3-react/src/index.ts @@ -15,6 +15,11 @@ export type { M3CheckboxProps, } from '@/components/checkbox' +export type { + M3ChipMethods, + M3ChipProps, +} from '@/components/chip' + export type { M3IconProps, } from '@/components/icon' @@ -113,6 +118,10 @@ export { M3Checkbox, } from '@/components/checkbox' +export { + M3Chip, +} from '@/components/chip' + export { M3FabButton, } from '@/components/fab-button' diff --git a/m3-react/storybook/components/M3Chip.mdx b/m3-react/storybook/components/M3Chip.mdx new file mode 100644 index 0000000..b8d45e8 --- /dev/null +++ b/m3-react/storybook/components/M3Chip.mdx @@ -0,0 +1,75 @@ +import { Meta, Unstyled } from '@storybook/addon-docs/blocks' + +import ChipShowcase from '../examples/chip/ChipShowcase' +import * as M3ChipStories from './M3Chip.stories' + + + +# Chips + +Chips help people enter information, make selections, filter content, or trigger actions. Material 3 distinguishes four chip types: assist, filter, input, and suggestion. + +## API + +### When to use + +Use `M3Chip` for compact, contextual actions or selections that should stay visible inside the surrounding content. If the action needs stronger emphasis or more copy, prefer buttons. + +### Variants + +- `assist` for quick contextual actions such as "Remind later" +- `filter` for toggleable filters that stay visible as active constraints +- `input` for entered entities or tokens that can usually be removed +- `suggestion` for lightweight recommendations that help users continue a flow + +### Selection and dismissal + +This implementation keeps `filter` chips controlled through `selected` and `onToggle`. Input chips can expose a separate dismiss affordance through `dismissible` and `onDismiss`. + +## Accessibility semantics + +- There is no special ARIA chip role here; the primary surface uses native button semantics. +- Filter chips expose toggle state through `aria-pressed`. +- If a chip exposes a remove affordance, the trailing dismiss button should keep an explicit accessible label. +- Chip labels should stay short and scannable because they are often read in dense horizontal clusters. + +### Variant panel + + + + + +### Filter set + + + + + +### Input tokens + + + + + +## Story guide + +- [Standard](?path=/story/components-m3chip--standard) +- [Variant Matrix](?path=/story/components-m3chip--variant-matrix) +- [Filter Set](?path=/story/components-m3chip--filter-set) +- [Input Tokens](?path=/story/components-m3chip--input-tokens) + +## Usage guidance + +### Keep chip copy brief + +Chips work best with short labels that can be scanned in rows. If the label turns into a sentence, the interaction usually wants a button or list row instead. + +### Match semantics to intent + +Use assist and suggestion chips as action affordances. Use filter chips only when the selected state matters. Use input chips when the item itself becomes part of the current form or scope. + +## Resources + +- [M3 Chips overview](https://m3.material.io/components/chips/overview) +- [M3 Chips guidelines](https://m3.material.io/components/chips/guidelines) +- [WAI-ARIA APG: Button Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/button/) diff --git a/m3-react/storybook/components/M3Chip.stories.tsx b/m3-react/storybook/components/M3Chip.stories.tsx new file mode 100644 index 0000000..aed4ae0 --- /dev/null +++ b/m3-react/storybook/components/M3Chip.stories.tsx @@ -0,0 +1,90 @@ +import type { Meta, StoryObj } from '@storybook/react' + +import { M3Chip } from '@/components/chip' +import { M3Icon } from '@/components/icon' +import ChipShowcase from '../examples/chip/ChipShowcase' + +import { + useEffect, + useState, +} from 'react' + +const meta = { + title: 'Components/M3Chip', + + component: M3Chip, + + argTypes: { + variant: { + control: 'select', + options: ['assist', 'filter', 'input', 'suggestion'], + }, + + selected: { + control: 'boolean', + }, + + disabled: { + control: 'boolean', + }, + + dismissible: { + control: 'boolean', + }, + + showCheckmark: { + control: 'boolean', + }, + }, + + args: { + variant: 'assist', + selected: false, + disabled: false, + dismissible: false, + showCheckmark: true, + }, + + render: (args) => { + const [selected, setSelected] = useState(args.selected) + + useEffect(() => { + setSelected(args.selected) + }, [args.selected]) + + return ( + + {args.variant === 'assist' || args.variant === 'suggestion' + ? + : null} + {args.variant === 'input' ? 'Project Alpha' : 'Remind later'} + + ) + }, + + parameters: { + layout: 'centered', + }, +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const Standard: Story = {} + +export const VariantMatrix: Story = { + render: () => , +} + +export const FilterSet: Story = { + render: () => , +} + +export const InputTokens: Story = { + render: () => , +} diff --git a/m3-react/storybook/examples/chip/ChipShowcase.tsx b/m3-react/storybook/examples/chip/ChipShowcase.tsx new file mode 100644 index 0000000..6e2f292 --- /dev/null +++ b/m3-react/storybook/examples/chip/ChipShowcase.tsx @@ -0,0 +1,89 @@ +import type { FC } from 'react' + +import { M3Chip } from '@/components/chip' +import { M3Icon } from '@/components/icon' + +import { useState } from 'react' + +export interface ChipShowcaseProps { + mode?: 'matrix' | 'filters' | 'inputs'; +} + +const wrapStyle = { + display: 'flex', + flexWrap: 'wrap' as const, + gap: '12px', +} + +const ChipShowcase: FC = ({ + mode = 'matrix', +}) => { + const [filters, setFilters] = useState(['Assigned to me', 'Urgent']) + const [tokens, setTokens] = useState(['Onboarding', 'Billing', 'Design review']) + + if (mode === 'filters') { + const options = ['Assigned to me', 'Urgent', 'Needs review'] + + return ( +
+ {options.map(option => ( + { + setFilters(current => { + return selected + ? [...current, option] + : current.filter(value => value !== option) + }) + }} + > + {option} + + ))} +
+ ) + } + + if (mode === 'inputs') { + return ( +
+ {tokens.map(token => ( + setTokens(current => current.filter(value => value !== token))} + > + {token} + + ))} +
+ ) + } + + return ( +
+ + + Remind later + + + + Updates + + + + Project Alpha + + + + + Draft summary + +
+ ) +} + +export default ChipShowcase diff --git a/m3-react/tests/M3Chip.test.tsx b/m3-react/tests/M3Chip.test.tsx new file mode 100644 index 0000000..1e506f8 --- /dev/null +++ b/m3-react/tests/M3Chip.test.tsx @@ -0,0 +1,60 @@ +import { + fireEvent, + render, + screen, +} from '@testing-library/react' + +import { M3Chip } from '@/components/chip' + +describe('m3-react/chip', () => { + test('toggles selected state for filter chips via aria-pressed', () => { + const onToggle = vi.fn() + + render( + + Updates + + ) + + const button = screen.getByRole('button', { name: 'Updates' }) + + expect(button.getAttribute('aria-pressed')).toBe('false') + + fireEvent.click(button) + + expect(onToggle).toHaveBeenCalledWith(true) + }) + + test('renders dismiss affordance independently from the main action', () => { + const onClick = vi.fn() + const onDismiss = vi.fn() + + render( + + Project Alpha + + ) + + const dismiss = screen.getByRole('button', { name: 'Remove' }) + + fireEvent.click(dismiss) + + expect(onDismiss).toHaveBeenCalledTimes(1) + expect(onClick).not.toHaveBeenCalled() + }) + + test('shows selection icon for selected filter chips without a leading icon', () => { + const { container } = render( + + Assigned to me + + ) + + expect(container.querySelector('.m3-chip__icon_selection')).not.toBeNull() + }) +}) diff --git a/m3-vue/src/components/chip/M3Chip.vue b/m3-vue/src/components/chip/M3Chip.vue new file mode 100644 index 0000000..d48545b --- /dev/null +++ b/m3-vue/src/components/chip/M3Chip.vue @@ -0,0 +1,210 @@ + + + diff --git a/m3-vue/src/components/chip/index.ts b/m3-vue/src/components/chip/index.ts new file mode 100644 index 0000000..03bc42e --- /dev/null +++ b/m3-vue/src/components/chip/index.ts @@ -0,0 +1 @@ +export { default as M3Chip } from './M3Chip.vue' diff --git a/m3-vue/src/components/chip/properties.ts b/m3-vue/src/components/chip/properties.ts new file mode 100644 index 0000000..b481ace --- /dev/null +++ b/m3-vue/src/components/chip/properties.ts @@ -0,0 +1,13 @@ +import type { + Prop, + PropType, +} from 'vue' +import type { Variant } from '@modulify/m3-foundation/types/components/chip' + +import { variants } from './values' + +export const variant: Prop = { + type: String as PropType, + validator: (value: string) => variants.includes(value as Variant), + default: 'assist', +} diff --git a/m3-vue/src/components/chip/values.ts b/m3-vue/src/components/chip/values.ts new file mode 100644 index 0000000..0837eb8 --- /dev/null +++ b/m3-vue/src/components/chip/values.ts @@ -0,0 +1,3 @@ +import type { Variant } from '@modulify/m3-foundation/types/components/chip' + +export const variants: Variant[] = ['assist', 'filter', 'input', 'suggestion'] diff --git a/m3-vue/src/index.ts b/m3-vue/src/index.ts index 5f0ef64..33d67eb 100644 --- a/m3-vue/src/index.ts +++ b/m3-vue/src/index.ts @@ -17,6 +17,10 @@ export { M3Checkbox, } from '@/components/checkbox' +export { + M3Chip, +} from '@/components/chip' + export { M3FabButton, } from '@/components/fab-button' diff --git a/m3-vue/storybook/components/M3Chip.mdx b/m3-vue/storybook/components/M3Chip.mdx new file mode 100644 index 0000000..8ffd6a1 --- /dev/null +++ b/m3-vue/storybook/components/M3Chip.mdx @@ -0,0 +1,75 @@ +import { Meta } from '@storybook/addon-docs/blocks' +import Inline from './Inline' +import ChipShowcase from '../examples/chip/ChipShowcase.vue' +import * as M3ChipStories from './M3Chip.stories' + + + +# Chips + +Chips help people enter information, make selections, filter content, or trigger actions. Material 3 distinguishes four chip types: assist, filter, input, and suggestion. + +## API + +### When to use + +Use `M3Chip` for compact, contextual actions or selections that should stay visible inside the surrounding content. If the action needs stronger emphasis or more copy, prefer buttons. + +### Variants + +- `assist` for quick contextual actions such as "Remind later" +- `filter` for toggleable filters that stay visible as active constraints +- `input` for entered entities or tokens that can usually be removed +- `suggestion` for lightweight recommendations that help users continue a flow + +### Selection and dismissal + +This implementation keeps `filter` chips controlled through `selected` and `update:selected`. Input chips can expose a separate dismiss affordance through `dismissible` and `dismiss`. + +## Accessibility semantics + +- There is no special ARIA chip role here; the primary surface uses native button semantics. +- Filter chips expose toggle state through `aria-pressed`. +- If a chip exposes a remove affordance, the trailing dismiss button should keep an explicit accessible label. +- Chip labels should stay short and scannable because they are often read in dense horizontal clusters. + +### Variant panel + +
+ +
+ +### Filter set + +
+ +
+ +### Input tokens + +
+ +
+ +## Story guide + +- [Standard](?path=/story/components-m3chip--standard) +- [Variant Matrix](?path=/story/components-m3chip--variant-matrix) +- [Filter Set](?path=/story/components-m3chip--filter-set) +- [Input Tokens](?path=/story/components-m3chip--input-tokens) + +## Usage guidance + +### Keep chip copy brief + +Chips work best with short labels that can be scanned in rows. If the label turns into a sentence, the interaction usually wants a button or list row instead. + +### Match semantics to intent + +Use assist and suggestion chips as action affordances. Use filter chips only when the selected state matters. Use input chips when the item itself becomes part of the current form or scope. + +## Resources + +- [M3 Chips overview](https://m3.material.io/components/chips/overview) +- [M3 Chips guidelines](https://m3.material.io/components/chips/guidelines) +- [WAI-ARIA APG: Button Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/button/) diff --git a/m3-vue/storybook/components/M3Chip.stories.ts b/m3-vue/storybook/components/M3Chip.stories.ts new file mode 100644 index 0000000..b80d1be --- /dev/null +++ b/m3-vue/storybook/components/M3Chip.stories.ts @@ -0,0 +1,98 @@ +import type { Meta, StoryObj } from '@storybook/vue3' + +import { M3Chip } from '@/components/chip' +import { M3Icon } from '@/components/icon' +import ChipShowcase from '../examples/chip/ChipShowcase.vue' + +import { ref, watch } from 'vue' + +const standardTemplate = ` + + + + {{ args.variant === 'input' ? 'Project Alpha' : 'Remind later' }} + +` + +const renderStandard = (args: Record) => ({ + components: { + M3Chip, + M3Icon, + }, + + setup: () => { + const selected = ref(Boolean(args.selected)) + + watch(() => args.selected, value => selected.value = Boolean(value), { immediate: true }) + + return { + args, + selected, + } + }, + + template: standardTemplate, +}) + +const meta = { + title: 'Components/M3Chip', + + component: M3Chip, + + args: { + variant: 'assist', + selected: false, + disabled: false, + dismissible: false, + showCheckmark: true, + }, + + render: renderStandard, + + parameters: { + layout: 'centered', + }, +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const Standard: Story = {} + +export const VariantMatrix: Story = { + render: () => ({ + components: { + ChipShowcase, + }, + + template: '', + }), +} + +export const FilterSet: Story = { + render: () => ({ + components: { + ChipShowcase, + }, + + template: '', + }), +} + +export const InputTokens: Story = { + render: () => ({ + components: { + ChipShowcase, + }, + + template: '', + }), +} diff --git a/m3-vue/storybook/examples/chip/ChipShowcase.vue b/m3-vue/storybook/examples/chip/ChipShowcase.vue new file mode 100644 index 0000000..a66378c --- /dev/null +++ b/m3-vue/storybook/examples/chip/ChipShowcase.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/m3-vue/tests/M3Chip.test.ts b/m3-vue/tests/M3Chip.test.ts new file mode 100644 index 0000000..533a23f --- /dev/null +++ b/m3-vue/tests/M3Chip.test.ts @@ -0,0 +1,63 @@ +import { + fireEvent, + render, + screen, +} from '@testing-library/vue' + +import { M3Chip } from '@/components/chip' + +describe('m3-vue/chip', () => { + test('toggles selected state for filter chips via aria-pressed', async () => { + const view = render(M3Chip, { + props: { + variant: 'filter', + selected: false, + }, + slots: { + default: 'Updates', + }, + }) + + const button = screen.getByRole('button', { name: 'Updates' }) + + expect(button.getAttribute('aria-pressed')).toBe('false') + + await fireEvent.click(button) + + expect(view.emitted().toggle?.[0]).toEqual([true]) + expect(view.emitted()['update:selected']?.[0]).toEqual([true]) + }) + + test('renders dismiss affordance independently from the main action', async () => { + const view = render(M3Chip, { + props: { + variant: 'input', + dismissible: true, + }, + slots: { + default: 'Project Alpha', + }, + }) + + const dismiss = screen.getByRole('button', { name: 'Remove' }) + + await fireEvent.click(dismiss) + + expect(view.emitted().dismiss?.length).toBe(1) + expect(view.emitted().click).toBeUndefined() + }) + + test('shows selection icon for selected filter chips without a leading icon', () => { + const { container } = render(M3Chip, { + props: { + variant: 'filter', + selected: true, + }, + slots: { + default: 'Assigned to me', + }, + }) + + expect(container.querySelector('.m3-chip__icon_selection')).not.toBeNull() + }) +}) From ca9d63ac74d1eb983223e2d42576484c9f54fd18 Mon Sep 17 00:00:00 2001 From: Kirill Zaytsev Date: Mon, 9 Mar 2026 23:50:57 +0400 Subject: [PATCH 28/54] chore: Eslint max-lines limit was raised --- m3-foundation/eslint.config.js | 2 +- m3-react/eslint.config.js | 2 +- m3-vue/eslint.config.js | 2 +- m3-vue/src/components/button/M3Button.ts | 1 - m3-vue/src/components/fab-button/M3FabButton.ts | 1 - m3-vue/storybook/components/M3Button.stories.ts | 1 - m3-vue/storybook/components/M3Card.stories.ts | 2 -- m3-vue/storybook/components/M3FabButton.stories.ts | 1 - m3-vue/storybook/components/M3IconButton.stories.ts | 1 - m3-vue/storybook/components/M3Navigation.stories.ts | 1 - m3-vue/storybook/components/M3ScrollRail.stories.ts | 1 - m3-vue/storybook/components/M3Select.stories.ts | 2 -- 12 files changed, 3 insertions(+), 14 deletions(-) diff --git a/m3-foundation/eslint.config.js b/m3-foundation/eslint.config.js index 8f49a1c..9b63781 100644 --- a/m3-foundation/eslint.config.js +++ b/m3-foundation/eslint.config.js @@ -47,7 +47,7 @@ export default [ SwitchCase: 1, }], 'linebreak-style': [2, 'unix'], - 'max-lines-per-function': ['error', 30], + 'max-lines-per-function': ['error', 50], 'max-nested-callbacks': ['error', 3], 'no-console': 'off', 'no-constant-condition': 'off', diff --git a/m3-react/eslint.config.js b/m3-react/eslint.config.js index e2bac2b..a6ff438 100644 --- a/m3-react/eslint.config.js +++ b/m3-react/eslint.config.js @@ -53,7 +53,7 @@ export default [ SwitchCase: 1, }], 'linebreak-style': [2, 'unix'], - 'max-lines-per-function': ['error', 30], + 'max-lines-per-function': ['error', 50], 'max-nested-callbacks': ['error', 3], 'no-console': 'off', 'no-constant-condition': 'off', diff --git a/m3-vue/eslint.config.js b/m3-vue/eslint.config.js index d1083e4..e119d9b 100644 --- a/m3-vue/eslint.config.js +++ b/m3-vue/eslint.config.js @@ -50,7 +50,7 @@ export default [ SwitchCase: 1, }], 'linebreak-style': [2, 'unix'], - 'max-lines-per-function': ['error', 30], + 'max-lines-per-function': ['error', 50], 'max-nested-callbacks': ['error', 3], 'no-console': 'off', 'no-constant-condition': 'off', diff --git a/m3-vue/src/components/button/M3Button.ts b/m3-vue/src/components/button/M3Button.ts index f6a1c9f..1f63282 100644 --- a/m3-vue/src/components/button/M3Button.ts +++ b/m3-vue/src/components/button/M3Button.ts @@ -48,7 +48,6 @@ export default defineComponent({ }, }, - // eslint-disable-next-line max-lines-per-function setup (props, { attrs, expose, slots }) { const root = ref(null) const rootElement = computed(() => root.value?.el() ?? null) diff --git a/m3-vue/src/components/fab-button/M3FabButton.ts b/m3-vue/src/components/fab-button/M3FabButton.ts index 0d24775..774c0e5 100644 --- a/m3-vue/src/components/fab-button/M3FabButton.ts +++ b/m3-vue/src/components/fab-button/M3FabButton.ts @@ -54,7 +54,6 @@ export default defineComponent({ }, }, - // eslint-disable-next-line max-lines-per-function setup (props, { attrs, expose, slots }) { const root = ref(null) const rootElement = computed(() => root.value?.el() ?? null) diff --git a/m3-vue/storybook/components/M3Button.stories.ts b/m3-vue/storybook/components/M3Button.stories.ts index 369f569..eaf4524 100644 --- a/m3-vue/storybook/components/M3Button.stories.ts +++ b/m3-vue/storybook/components/M3Button.stories.ts @@ -70,7 +70,6 @@ export const WithLeadingIcon: Story = { } export const AppearanceMatrix: Story = { - // eslint-disable-next-line max-lines-per-function render: () => ({ components: { M3Button, diff --git a/m3-vue/storybook/components/M3Card.stories.ts b/m3-vue/storybook/components/M3Card.stories.ts index 7084269..b1b44a6 100644 --- a/m3-vue/storybook/components/M3Card.stories.ts +++ b/m3-vue/storybook/components/M3Card.stories.ts @@ -92,7 +92,6 @@ export const LandscapeWithoutMedia: Story = { } export const Portrait: Story = { - // eslint-disable-next-line max-lines-per-function render: (args: unknown) => ({ components: { M3Button, @@ -134,7 +133,6 @@ export const Portrait: Story = { } export const AppearanceMatrix: Story = { - // eslint-disable-next-line max-lines-per-function render: () => ({ components: { M3Card, diff --git a/m3-vue/storybook/components/M3FabButton.stories.ts b/m3-vue/storybook/components/M3FabButton.stories.ts index 6e22250..d8dc9c5 100644 --- a/m3-vue/storybook/components/M3FabButton.stories.ts +++ b/m3-vue/storybook/components/M3FabButton.stories.ts @@ -83,7 +83,6 @@ export const Extended: Story = { } export const VariantMatrix: Story = { - // eslint-disable-next-line max-lines-per-function render: () => ({ components: { M3FabButton, diff --git a/m3-vue/storybook/components/M3IconButton.stories.ts b/m3-vue/storybook/components/M3IconButton.stories.ts index 330e77d..05c0890 100644 --- a/m3-vue/storybook/components/M3IconButton.stories.ts +++ b/m3-vue/storybook/components/M3IconButton.stories.ts @@ -92,7 +92,6 @@ export const Toggleable: Story = { } export const AppearanceMatrix: Story = { - // eslint-disable-next-line max-lines-per-function render: () => ({ components: { M3Icon, diff --git a/m3-vue/storybook/components/M3Navigation.stories.ts b/m3-vue/storybook/components/M3Navigation.stories.ts index 28b5779..b884bce 100644 --- a/m3-vue/storybook/components/M3Navigation.stories.ts +++ b/m3-vue/storybook/components/M3Navigation.stories.ts @@ -137,7 +137,6 @@ export const NavigationRail: Story = { } export const ModalNavigationDrawer: Story = { - // eslint-disable-next-line max-lines-per-function render: (args: unknown) => ({ name: 'M3ModalNavigationDrawerStory', diff --git a/m3-vue/storybook/components/M3ScrollRail.stories.ts b/m3-vue/storybook/components/M3ScrollRail.stories.ts index fccaa15..b729526 100644 --- a/m3-vue/storybook/components/M3ScrollRail.stories.ts +++ b/m3-vue/storybook/components/M3ScrollRail.stories.ts @@ -22,7 +22,6 @@ const meta = { disabled: false, }, - // eslint-disable-next-line max-lines-per-function render: (args: unknown) => ({ name: 'M3ScrollRailStory', diff --git a/m3-vue/storybook/components/M3Select.stories.ts b/m3-vue/storybook/components/M3Select.stories.ts index 0593983..2729635 100644 --- a/m3-vue/storybook/components/M3Select.stories.ts +++ b/m3-vue/storybook/components/M3Select.stories.ts @@ -29,7 +29,6 @@ const meta = { }, }, - // eslint-disable-next-line max-lines-per-function render: (args: unknown) => ({ name: 'M3SelectStory', @@ -83,7 +82,6 @@ export const WithIcons: Story = { label: 'Country', }, - // eslint-disable-next-line max-lines-per-function render: (args: unknown) => ({ name: 'M3SelectStory', From 788e17cf17a6d97bdf8cf1945441addf0025db69 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Mon, 4 May 2026 12:00:13 +0400 Subject: [PATCH 29/54] chore: Complexity lint warnings were disabled --- m3-foundation/eslint.config.js | 1 + m3-react/eslint.config.js | 1 + m3-vue/eslint.config.js | 1 + 3 files changed, 3 insertions(+) diff --git a/m3-foundation/eslint.config.js b/m3-foundation/eslint.config.js index 9b63781..b2aba99 100644 --- a/m3-foundation/eslint.config.js +++ b/m3-foundation/eslint.config.js @@ -42,6 +42,7 @@ export default [ imports: 'always-multiline', objects: 'always-multiline', }], + 'complexity': 'off', 'indent': ['error', 2, { ignoreComments: true, SwitchCase: 1, diff --git a/m3-react/eslint.config.js b/m3-react/eslint.config.js index a6ff438..abb777f 100644 --- a/m3-react/eslint.config.js +++ b/m3-react/eslint.config.js @@ -48,6 +48,7 @@ export default [ imports: 'always-multiline', objects: 'always-multiline', }], + 'complexity': 'off', 'indent': ['error', 2, { ignoreComments: true, SwitchCase: 1, diff --git a/m3-vue/eslint.config.js b/m3-vue/eslint.config.js index e119d9b..458431d 100644 --- a/m3-vue/eslint.config.js +++ b/m3-vue/eslint.config.js @@ -45,6 +45,7 @@ export default [ imports: 'always-multiline', objects: 'always-multiline', }], + 'complexity': 'off', 'indent': ['error', 2, { ignoreComments: true, SwitchCase: 1, From e467389fcfab4c14c89e0a41fbeec4fc312814b2 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Mon, 4 May 2026 20:16:24 +0400 Subject: [PATCH 30/54] refactor(m3-react): Slot parsing was hardened --- m3-react/src/components/card/M3Card.tsx | 15 +- m3-react/src/components/dialog/M3Dialog.tsx | 17 +- m3-react/src/components/menu/M3MenuItem.tsx | 9 +- .../components/navigation/M3Navigation.tsx | 71 +++--- .../navigation/M3NavigationSection.tsx | 11 +- .../components/navigation/M3NavigationTab.tsx | 15 +- .../components/rich-tooltip/M3RichTooltip.tsx | 9 +- m3-react/src/components/select/M3Select.tsx | 11 +- .../src/components/side-sheet/M3SideSheet.tsx | 13 +- .../src/components/text-field/M3TextField.tsx | 11 +- m3-react/src/utils/content.ts | 207 ++++++++++++++++-- m3-react/tests/M3Dialog.test.tsx | 22 ++ m3-react/tests/M3Navigation.test.tsx | 32 +++ m3-react/tests/content.test.tsx | 152 +++++++++++++ 14 files changed, 485 insertions(+), 110 deletions(-) create mode 100644 m3-react/tests/content.test.tsx diff --git a/m3-react/src/components/card/M3Card.tsx b/m3-react/src/components/card/M3Card.tsx index 771217c..bd4dafe 100644 --- a/m3-react/src/components/card/M3Card.tsx +++ b/m3-react/src/components/card/M3Card.tsx @@ -21,6 +21,7 @@ import { import { compose } from '@/utils/events' import { augment, + defineSlot, distinct, } from '@/utils/content' import { toClassName } from '@/utils/styling' @@ -33,9 +34,9 @@ export interface M3CardProps extends HTMLAttributes { landscape?: boolean; } -const Content: FC<{ children: ReactNode }> = props => <>{props.children} +const Content: FC<{ children: ReactNode }> = defineSlot('M3Card.Content', props => <>{props.children}) -const Media: FC> = ({ +const Media: FC> = defineSlot('M3Card.Media', ({ className = '', children = [], ...attrs @@ -43,9 +44,9 @@ const Media: FC> = ({
{children}
-) +)) -const Heading: FC> = ({ +const Heading: FC> = defineSlot('M3Card.Heading', ({ className = '', children = [], ...attrs @@ -53,9 +54,9 @@ const Heading: FC> = ({
{children}
-) +)) -const Subheading: FC> = ({ +const Subheading: FC> = defineSlot('M3Card.Subheading', ({ className = '', children = [], ...attrs @@ -63,7 +64,7 @@ const Subheading: FC> = ({
{children}
-) +)) const M3Card: FC = ({ id, diff --git a/m3-react/src/components/dialog/M3Dialog.tsx b/m3-react/src/components/dialog/M3Dialog.tsx index fbe9cbe..4dcbdf7 100644 --- a/m3-react/src/components/dialog/M3Dialog.tsx +++ b/m3-react/src/components/dialog/M3Dialog.tsx @@ -11,7 +11,10 @@ import { m3MotionEasings, } from '@modulify/m3-foundation/lib/motion' import { M3Surface } from '@/components/surface' -import { distinct } from '@/utils/content' +import { + defineSlot, + distinct, +} from '@/utils/content' import { toClassName } from '@/utils/styling' export interface M3DialogProps extends HTMLAttributes { @@ -30,7 +33,7 @@ const DIALOG_Z_INDEX = 1000 const DIALOG_TRANSITION_MS = m3MotionDurations.medium2 const DIALOG_TRANSITION_TIMING = m3MotionEasings.standard -const Icon: FC> = ({ +const Icon: FC> = defineSlot('M3Dialog.Icon', ({ className = '', children = [], ...attrs @@ -38,9 +41,9 @@ const Icon: FC> = ({
{children}
-) +)) -const Header: FC> = ({ +const Header: FC> = defineSlot('M3Dialog.Header', ({ className = '', children = [], ...attrs @@ -48,9 +51,9 @@ const Header: FC> = ({
{children}
-) +)) -const Footer: FC> = ({ +const Footer: FC> = defineSlot('M3Dialog.Footer', ({ className = '', children = [], ...attrs @@ -58,7 +61,7 @@ const Footer: FC> = ({
{children}
-) +)) const M3Dialog: FC = ({ opened = false, diff --git a/m3-react/src/components/menu/M3MenuItem.tsx b/m3-react/src/components/menu/M3MenuItem.tsx index 672adc1..94c5ad1 100644 --- a/m3-react/src/components/menu/M3MenuItem.tsx +++ b/m3-react/src/components/menu/M3MenuItem.tsx @@ -18,7 +18,10 @@ import { } from 'react' import { compose } from '@/utils/events' -import { distinct } from '@/utils/content' +import { + defineSlot, + distinct, +} from '@/utils/content' import { toClassName } from '@/utils/styling' export interface M3MenuItemProps extends HTMLAttributes { @@ -27,8 +30,8 @@ export interface M3MenuItemProps extends HTMLAttributes { disabled?: boolean; } -const Leading: FC<{ children: ReactNode }> = props => <>{props.children} -const Trailing: FC<{ children: ReactNode }> = props => <>{props.children} +const Leading: FC<{ children: ReactNode }> = defineSlot('M3MenuItem.Leading', props => <>{props.children}) +const Trailing: FC<{ children: ReactNode }> = defineSlot('M3MenuItem.Trailing', props => <>{props.children}) const M3MenuItem: FC = ({ href, diff --git a/m3-react/src/components/navigation/M3Navigation.tsx b/m3-react/src/components/navigation/M3Navigation.tsx index c301549..9c6f961 100644 --- a/m3-react/src/components/navigation/M3Navigation.tsx +++ b/m3-react/src/components/navigation/M3Navigation.tsx @@ -15,8 +15,6 @@ import M3NavigationAppearance from '@/components/navigation/M3NavigationAppearan import M3NavigationSection from './M3NavigationSection' import { - Children, - isValidElement, useEffect, useMemo, } from 'react' @@ -30,6 +28,10 @@ import { } from '@/hooks' import { compose } from '@/utils/events' +import { + defineSlot, + distinct, +} from '@/utils/content' import { toClassName } from '@/utils/styling' export interface M3NavigationProps extends HTMLAttributes { @@ -39,7 +41,7 @@ export interface M3NavigationProps extends HTMLAttributes { onToggle?: (expanded: boolean) => void; } -const Top: FC> = ({ +const Top: FC> = defineSlot('M3Navigation.Top', ({ className = '', children = [], ...attrs @@ -47,9 +49,9 @@ const Top: FC> = ({
{children}
-) +)) -const Header: FC> = ({ +const Header: FC> = defineSlot('M3Navigation.Header', ({ className = '', children = [], ...attrs @@ -57,9 +59,9 @@ const Header: FC> = ({
{children}
-) +)) -const Subheader: FC> = ({ +const Subheader: FC> = defineSlot('M3Navigation.Subheader', ({ className = '', children = [], ...attrs @@ -67,37 +69,7 @@ const Subheader: FC> = ({ {children} -) - -const distinct = (children: ReactNode) => { - let top: ReactNode = null - let header: ReactNode = null - let subheader: ReactNode = null - - const content: ReactNode[] = [] - const sections: ReactNode[] = [] - - Children.forEach(children, child => { - if (isValidElement(child)) { - switch (child.type) { - case Top: - top = child; break - case Header: - header = child; break - case Subheader: - subheader = child; break - case M3NavigationSection: - sections.push(child); break - default: - content.push(child) - } - } else { - content.push(child) - } - }) - - return { top, header, subheader, content, sections } -} +)) const M3Navigation: FC = ({ appearance = 'auto', @@ -116,7 +88,16 @@ const M3Navigation: FC = ({ transitioning: expanded, }, ['appearance', 'transitioning']) - const slots = useMemo(() => distinct(children), [children]) + const parsed = useMemo(() => distinct(children, { + slots: { + top: Top, + header: Header, + subheader: Subheader, + }, + collections: { + sections: M3NavigationSection, + }, + }), [children]) const handlers = useRecord({ onToggle, @@ -174,14 +155,14 @@ const M3Navigation: FC = ({ }, onTransitionEnd)} {...attrs} > - {slots.top} - {slots.header} + {parsed.slots.top} + {parsed.slots.header} - {slots.subheader} - {slots.content} + {parsed.slots.subheader} + {parsed.content} - {slots.sections} + {parsed.collections.sections} , @@ -193,4 +174,4 @@ export default Object.assign(M3Navigation, { Header, Subheader, Top, -}) \ No newline at end of file +}) diff --git a/m3-react/src/components/navigation/M3NavigationSection.tsx b/m3-react/src/components/navigation/M3NavigationSection.tsx index 4d07776..f66bc91 100644 --- a/m3-react/src/components/navigation/M3NavigationSection.tsx +++ b/m3-react/src/components/navigation/M3NavigationSection.tsx @@ -3,10 +3,13 @@ import type { HTMLAttributes, } from 'react' -import { distinct } from '@/utils/content' +import { + defineSlot, + distinct, +} from '@/utils/content' import { toClassName } from '@/utils/styling' -const Header: FC> = ({ +const Header: FC> = defineSlot('M3NavigationSection.Header', ({ className = '', children = [], ...attrs @@ -14,7 +17,7 @@ const Header: FC> = ({
{children}
-) +)) const M3NavigationSection: FC> = ({ role = 'group', @@ -40,4 +43,4 @@ const M3NavigationSection: FC> = ({ export default Object.assign(M3NavigationSection, { Header, -}) \ No newline at end of file +}) diff --git a/m3-react/src/components/navigation/M3NavigationTab.tsx b/m3-react/src/components/navigation/M3NavigationTab.tsx index 518bfe4..af773b8 100644 --- a/m3-react/src/components/navigation/M3NavigationTab.tsx +++ b/m3-react/src/components/navigation/M3NavigationTab.tsx @@ -31,7 +31,10 @@ import { } from '@/hooks' import { compose } from '@/utils/events' -import { distinct } from '@/utils/content' +import { + defineSlot, + distinct, +} from '@/utils/content' import { toClassName } from '@/utils/styling' import { useM3NavigationAppearance } from './M3NavigationAppearance' @@ -47,7 +50,7 @@ export interface M3NavigationTabProps extends HTMLAttributes { export interface M3NavigationTabMethods extends Clickable, Focusable {} -const Icon: FC> = ({ +const Icon: FC> = defineSlot('M3NavigationTab.Icon', ({ className = '', children = [], ...attrs @@ -55,10 +58,10 @@ const Icon: FC> = ({ {children} -) +)) -const Label: FC<{ children: ReactNode }> = props => <>{props.children} -const Badge: FC<{ children: ReactNode }> = props => <>{props.children} +const Label: FC<{ children: ReactNode }> = defineSlot('M3NavigationTab.Label', props => <>{props.children}) +const Badge: FC<{ children: ReactNode }> = defineSlot('M3NavigationTab.Badge', props => <>{props.children}) const M3NavigationTab: ForwardRefRenderFunction< M3NavigationTabMethods, @@ -194,4 +197,4 @@ export default Object.assign(forwardRef(M3NavigationTab), { Badge, Icon, Label, -}) \ No newline at end of file +}) diff --git a/m3-react/src/components/rich-tooltip/M3RichTooltip.tsx b/m3-react/src/components/rich-tooltip/M3RichTooltip.tsx index 42767e0..6284532 100644 --- a/m3-react/src/components/rich-tooltip/M3RichTooltip.tsx +++ b/m3-react/src/components/rich-tooltip/M3RichTooltip.tsx @@ -19,14 +19,17 @@ import { useRef, } from 'react' -import { distinct } from '@/utils/content' +import { + defineSlot, + distinct, +} from '@/utils/content' import { toClassName } from '@/utils/styling' export interface M3RichTooltipProps extends M3PopperProps {} export interface M3RichTooltipMethods extends M3PopperMethods {} -const Heading: FC<{ children: ReactNode }> = props => <>{props.children} -const Footer: FC<{ children: ReactNode }> = props => <>{props.children} +const Heading: FC<{ children: ReactNode }> = defineSlot('M3RichTooltip.Heading', props => <>{props.children}) +const Footer: FC<{ children: ReactNode }> = defineSlot('M3RichTooltip.Footer', props => <>{props.children}) const M3RichTooltip: ForwardRefRenderFunction< M3RichTooltipMethods, diff --git a/m3-react/src/components/select/M3Select.tsx b/m3-react/src/components/select/M3Select.tsx index fa56363..9274be4 100644 --- a/m3-react/src/components/select/M3Select.tsx +++ b/m3-react/src/components/select/M3Select.tsx @@ -27,7 +27,10 @@ import { useId, } from '@/hooks' -import { distinct } from '@/utils/content' +import { + defineSlot, + distinct, +} from '@/utils/content' import { toClassName } from '@/utils/styling' export type M3SelectOption = { @@ -68,9 +71,9 @@ const CaretIcon: FC> = (attrs) => ( ) -const Leading: FC<{ children: ReactNode }> = props => <>{props.children} -const OptionLeading: FC<{ children: ReactNode }> = props => <>{props.children} -const OptionContent: FC<{ children: ReactNode }> = props => <>{props.children} +const Leading: FC<{ children: ReactNode }> = defineSlot('M3Select.Leading', props => <>{props.children}) +const OptionLeading: FC<{ children: ReactNode }> = defineSlot('M3Select.OptionLeading', props => <>{props.children}) +const OptionContent: FC<{ children: ReactNode }> = defineSlot('M3Select.OptionContent', props => <>{props.children}) const asRenderProp = (value: unknown): null | ((context: Context) => ReactNode) => { return typeof value === 'function' ? value as (context: Context) => ReactNode : null diff --git a/m3-react/src/components/side-sheet/M3SideSheet.tsx b/m3-react/src/components/side-sheet/M3SideSheet.tsx index 13108f7..5d12b8d 100644 --- a/m3-react/src/components/side-sheet/M3SideSheet.tsx +++ b/m3-react/src/components/side-sheet/M3SideSheet.tsx @@ -16,7 +16,10 @@ import { import { useMemo } from 'react' import { useTransition } from 'react-transition-state' -import { distinct } from '@/utils/content' +import { + defineSlot, + distinct, +} from '@/utils/content' import { toClassName } from '@/utils/styling' export interface M3SideSheetProps extends Omit< @@ -38,10 +41,10 @@ export interface M3SideSheetProps extends Omit< onDismiss?: () => void; } -const Affordance: FC<{ children: ReactNode }> = props => <>{props.children} -const Title: FC<{ children: ReactNode }> = props => <>{props.children} -const CloseIcon: FC<{ children: ReactNode }> = props => <>{props.children} -const Footer: FC<{ children: ReactNode }> = props => <>{props.children} +const Affordance: FC<{ children: ReactNode }> = defineSlot('M3SideSheet.Affordance', props => <>{props.children}) +const Title: FC<{ children: ReactNode }> = defineSlot('M3SideSheet.Title', props => <>{props.children}) +const CloseIcon: FC<{ children: ReactNode }> = defineSlot('M3SideSheet.CloseIcon', props => <>{props.children}) +const Footer: FC<{ children: ReactNode }> = defineSlot('M3SideSheet.Footer', props => <>{props.children}) const DOCKED_WIDTH = 256 const MODAL_MIN_WIDTH = 320 diff --git a/m3-react/src/components/text-field/M3TextField.tsx b/m3-react/src/components/text-field/M3TextField.tsx index e118ef2..14a7397 100644 --- a/m3-react/src/components/text-field/M3TextField.tsx +++ b/m3-react/src/components/text-field/M3TextField.tsx @@ -22,7 +22,10 @@ import { } from '@/hooks' import { compose } from '@/utils/events' -import { distinct } from '@/utils/content' +import { + defineSlot, + distinct, +} from '@/utils/content' import { toClassName } from '@/utils/styling' type TextFieldType = @@ -56,9 +59,9 @@ export interface M3TextFieldProps extends RootAttrs { export interface M3TextFieldMethods extends Focusable {} -const Label: FC<{ children: ReactNode }> = props => <>{props.children} -const LeadingIcon: FC<{ children: ReactNode }> = props => <>{props.children} -const TrailingIcon: FC<{ children: ReactNode }> = props => <>{props.children} +const Label: FC<{ children: ReactNode }> = defineSlot('M3TextField.Label', props => <>{props.children}) +const LeadingIcon: FC<{ children: ReactNode }> = defineSlot('M3TextField.LeadingIcon', props => <>{props.children}) +const TrailingIcon: FC<{ children: ReactNode }> = defineSlot('M3TextField.TrailingIcon', props => <>{props.children}) const M3TextField: ForwardRefRenderFunction< M3TextFieldMethods, diff --git a/m3-react/src/utils/content.ts b/m3-react/src/utils/content.ts index 06d52fc..e00f262 100644 --- a/m3-react/src/utils/content.ts +++ b/m3-react/src/utils/content.ts @@ -7,10 +7,45 @@ import type { import { Children, cloneElement, + Fragment, isValidElement, } from 'react' const inlines = ['b', 'i', 'span', 'strong'] +const CONFIG_KEYS = [ + 'collections', + 'flattenFragments', + 'onDuplicateSlot', + 'slots', +] +const SLOT_ID = Symbol.for('@modulify/m3-react.slot') + +type SlotComponent = string | JSXElementConstructor +type DuplicateSlotPolicy = 'error' | 'ignore' | 'warn' +type SlottedComponent = JSXElementConstructor & { + [SLOT_ID]?: string; +} + +export type DistinctConfig< + SlotName extends string = never, + CollectionName extends string = never, +> = { + slots?: Record; + collections?: Record; + flattenFragments?: boolean; + onDuplicateSlot?: DuplicateSlotPolicy; +} + +export type DistinctResult< + SlotName extends string = never, + CollectionName extends string = never, +> = { + slots: Record; + collections: Record; + content: ReactNode[]; + hasSlot: (name: SlotName) => boolean; + hasCollection: (name: CollectionName) => boolean; +} export const isNil = (value: unknown): boolean => value === null || value === undefined export const isTextual = (node: ReactNode): boolean => { @@ -22,6 +57,7 @@ export const isEmptyArray = (v: ReactNode) => Children.toArray(v).length === 0 export const isEmptyString = (v: ReactNode) => typeof v === 'string' && (v === '' || !/\S/.test(v)) export const isEmptyNode = (node: ReactNode) => { return isNil(node) + || typeof node === 'boolean' || isEmptyString(node) || isEmptyArray(node) } @@ -43,33 +79,160 @@ export const augment = < Type extends string | JSXElementConstructor = string | JSXElementConstructor, >(el: ReactElement, props: Props) => cloneElement(el, { ...props }) -export const distinct = < - Name extends string, - Type extends string | JSXElementConstructor = string | JSXElementConstructor ->(children: ReactNode, map: Record): [ - Record, - ReactNode[], - (name: Name) => boolean -] => { - const names = Object.keys(map) as Name[] - const named = names.reduce((named, name) => { - return { ...named, [name]: null } - }, {} as Record) +export const defineSlot = >( + id: string, + component: Component +): Component => { + Object.defineProperty(component, SLOT_ID, { + configurable: true, + value: id, + }) + + return component +} + +const getSlotId = (component: unknown): string | null => { + if (typeof component !== 'function') { + return null + } + + return (component as SlottedComponent)[SLOT_ID] ?? null +} + +const isSameSlotComponent = (actual: unknown, expected: SlotComponent): boolean => { + if (actual === expected) { + return true + } + + const actualSlotId = getSlotId(actual) + const expectedSlotId = getSlotId(expected) + + return actualSlotId !== null && actualSlotId === expectedSlotId +} + +const createRecord = (names: Name[], value: () => Value): Record => { + return names.reduce((record, name) => ({ + ...record, + [name]: value(), + }), {} as Record) +} + +const isConfig = (value: Record): boolean => { + return CONFIG_KEYS.some(key => key in value) +} + +const shouldWarn = (): boolean => { + const meta = import.meta as ImportMeta & { env?: { DEV?: boolean; MODE?: string } } + + return meta.env?.DEV !== false && meta.env?.MODE !== 'production' +} + +const handleDuplicateSlot = (name: string, policy: DuplicateSlotPolicy) => { + if (policy === 'error') { + throw new Error(`Duplicate slot "${name}" was provided.`) + } + if (policy === 'warn' && shouldWarn()) { + console.warn(`Duplicate slot "${name}" was provided. The last slot will be used.`) + } +} + +const flattenChildren = (children: ReactNode, flattenFragments: boolean): ReactNode[] => { + const flattened: ReactNode[] = [] + + Children.forEach(children, child => { + if (isEmptyNode(child)) { + return + } + + if (flattenFragments && isValidElement(child) && child.type === Fragment) { + flattened.push(...flattenChildren((child.props as { children?: ReactNode }).children, flattenFragments)) + return + } + + flattened.push(child) + }) + + return flattened +} + +const parseDistinct = < + SlotName extends string = never, + CollectionName extends string = never, +>(children: ReactNode, config: DistinctConfig): DistinctResult => { + const slots = config.slots ?? {} as Record + const collections = config.collections ?? {} as Record + const slotNames = Object.keys(slots) as SlotName[] + const collectionNames = Object.keys(collections) as CollectionName[] + const namedSlots = createRecord(slotNames, () => null as ReactElement | null) + const namedCollections = createRecord(collectionNames, () => [] as ReactElement[]) const content: ReactNode[] = [] + const flattenFragments = config.flattenFragments ?? true + const onDuplicateSlot = config.onDuplicateSlot ?? 'warn' - Children.forEach(children, (child) => { + flattenChildren(children, flattenFragments).forEach(child => { if (isValidElement(child)) { - const name = names.find(n => child.type === map[n]) - if (name) { - named[name] = child - } else { - content.push(child) + const slotName = slotNames.find(name => isSameSlotComponent(child.type, slots[name])) + + if (slotName) { + if (namedSlots[slotName]) { + handleDuplicateSlot(slotName, onDuplicateSlot) + } + + namedSlots[slotName] = child + return + } + + const collectionName = collectionNames.find(name => isSameSlotComponent(child.type, collections[name])) + + if (collectionName) { + namedCollections[collectionName].push(child) + return } - } else { - content.push(child) } + + content.push(child) + }) + + return { + slots: namedSlots, + collections: namedCollections, + content, + hasSlot: name => !!namedSlots[name], + hasCollection: name => namedCollections[name].length > 0, + } +} + +export function distinct< + Name extends string, + Type extends SlotComponent = SlotComponent +>(children: ReactNode, map: Record): [ + Record, + ReactNode[], + (name: Name) => boolean +] +export function distinct< + SlotName extends string = never, + CollectionName extends string = never, +>(children: ReactNode, config: DistinctConfig): DistinctResult +export function distinct< + SlotName extends string = never, + CollectionName extends string = never, +>( + children: ReactNode, + configOrMap: DistinctConfig | Record +) { + if (isConfig(configOrMap)) { + return parseDistinct(children, configOrMap as DistinctConfig) + } + + const result = parseDistinct(children, { + slots: configOrMap as Record, }) - return [named, content, (name: Name) => !!named[name]] -} \ No newline at end of file + return [ + result.slots, + result.content, + result.hasSlot, + ] +} diff --git a/m3-react/tests/M3Dialog.test.tsx b/m3-react/tests/M3Dialog.test.tsx index d29a86a..accc330 100644 --- a/m3-react/tests/M3Dialog.test.tsx +++ b/m3-react/tests/M3Dialog.test.tsx @@ -115,6 +115,28 @@ describe('m3-react/dialog', () => { expect(screen.getByTestId('content-node')).not.toBeNull() }) + test('does not render content wrapper for empty conditional children', async () => { + render( + + {false} + {null} + {undefined} + {''} + <> + +

Only header

+
+ +
+ ) + + await waitFor(() => { + expect(screen.getByText('Only header')).not.toBeNull() + }) + + expect(document.body.querySelector('.m3-dialog__content')).toBeNull() + }) + test('forwards dialog attributes and keeps default modal role', async () => { render( { expect(onToggle).toHaveBeenCalledWith(false) }) + test('renders slots and repeated sections from fragments', () => { + render( + + <> + Top from fragment + <> + Header from nested fragment + + + + + + <> + + First section + + + + + Second section + + + + + ) + + expect(screen.getByText('Top from fragment')).not.toBeNull() + expect(screen.getByText('Header from nested fragment')).not.toBeNull() + expect(screen.getByText('First section')).not.toBeNull() + expect(screen.getByText('Second section')).not.toBeNull() + }) + test('requests collapsing in auto mode after resize to large breakpoint', () => { const onToggle = vi.fn() const initialWidth = window.innerWidth diff --git a/m3-react/tests/content.test.tsx b/m3-react/tests/content.test.tsx new file mode 100644 index 0000000..965a64f --- /dev/null +++ b/m3-react/tests/content.test.tsx @@ -0,0 +1,152 @@ +import type { + FC, + ReactNode, +} from 'react' + +import { + defineSlot, + distinct, +} from '@/utils/content' + +const Header: FC<{ children?: ReactNode }> = defineSlot('TestSlots.Header', props => <>{props.children}) +const Footer: FC<{ children?: ReactNode }> = defineSlot('TestSlots.Footer', props => <>{props.children}) +const Section: FC<{ children?: ReactNode }> = defineSlot('TestSlots.Section', props => <>{props.children}) +const Wrapper: FC<{ children?: ReactNode }> = props => <>{props.children} + +describe('m3-react/content', () => { + afterEach(() => { + vi.restoreAllMocks() + }) + + test('parses slots, collections and content through fragments', () => { + const parsed = distinct( + <> + {false} + {null} + {undefined} + {''} +
Header
+ <> +
First section
+ <> +
Footer
+ + + Body +
Second section
+ , + { + slots: { + header: Header, + footer: Footer, + }, + collections: { + sections: Section, + }, + } + ) + + expect(parsed.slots.header?.type).toBe(Header) + expect(parsed.slots.footer?.type).toBe(Footer) + expect(parsed.collections.sections).toHaveLength(2) + expect(parsed.collections.sections[0].props.children).toBe('First section') + expect(parsed.collections.sections[1].props.children).toBe('Second section') + expect(parsed.content).toEqual(['Body']) + expect(parsed.hasSlot('header')).toBe(true) + expect(parsed.hasCollection('sections')).toBe(true) + }) + + test('does not inspect DOM or custom component descendants', () => { + const parsed = distinct( + <> +
+
DOM nested header
+
+ +
Wrapped footer
+
+ , + { + slots: { + header: Header, + footer: Footer, + }, + } + ) + + expect(parsed.slots.header).toBeNull() + expect(parsed.slots.footer).toBeNull() + expect(parsed.content).toHaveLength(2) + }) + + test('keeps last duplicate slot and warns in development', () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + + const parsed = distinct( + <> +
First header
+
Second header
+ , + { + slots: { + header: Header, + }, + } + ) + + expect(parsed.slots.header?.props.children).toBe('Second header') + expect(warn).toHaveBeenCalledWith('Duplicate slot "header" was provided. The last slot will be used.') + }) + + test('keeps legacy tuple API with fragment flattening', () => { + const [slots, content, hasSlot] = distinct( + <> +
Header
+ <> + Body + + , + { + header: Header, + } + ) + + expect(slots.header?.props.children).toBe('Header') + expect(content).toEqual(['Body']) + expect(hasSlot('header')).toBe(true) + }) + + test('matches slots by stable marker when component identity changes', () => { + const PreviousHeader = defineSlot('HmrSlots.Header', ((props: { children?: ReactNode }) => ( + <>{props.children} + ))) + const NextHeader = defineSlot('HmrSlots.Header', ((props: { children?: ReactNode }) => ( + <>{props.children} + ))) + const PreviousSection = defineSlot('HmrSlots.Section', ((props: { children?: ReactNode }) => ( + <>{props.children} + ))) + const NextSection = defineSlot('HmrSlots.Section', ((props: { children?: ReactNode }) => ( + <>{props.children} + ))) + + const parsed = distinct( + <> + Header from previous module instance + Section from previous module instance + , + { + slots: { + header: NextHeader, + }, + collections: { + sections: NextSection, + }, + } + ) + + expect(parsed.slots.header?.props.children).toBe('Header from previous module instance') + expect(parsed.collections.sections[0].props.children).toBe('Section from previous module instance') + expect(parsed.content).toHaveLength(0) + }) +}) From 9a47d092df6cd159a409134f70af9c5c044cf77d Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Sun, 28 Jun 2026 13:35:23 +0400 Subject: [PATCH 31/54] style(m3-react): Navigation imports were cleaned up --- m3-react/src/components/navigation/M3Navigation.tsx | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/m3-react/src/components/navigation/M3Navigation.tsx b/m3-react/src/components/navigation/M3Navigation.tsx index 9c6f961..813a3ea 100644 --- a/m3-react/src/components/navigation/M3Navigation.tsx +++ b/m3-react/src/components/navigation/M3Navigation.tsx @@ -1,7 +1,6 @@ import type { FC, HTMLAttributes, - ReactNode, } from 'react' import type { @@ -21,18 +20,17 @@ import { import { createPortal } from 'react-dom' -import { - useBreakpoint, - useRecord, - useWatch, -} from '@/hooks' - import { compose } from '@/utils/events' import { defineSlot, distinct, } from '@/utils/content' import { toClassName } from '@/utils/styling' +import { + useBreakpoint, + useRecord, + useWatch, +} from '@/hooks' export interface M3NavigationProps extends HTMLAttributes { appearance?: Appearance; From d633125bb4c69cb1efca3576d86fc500b63a3ea4 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Sun, 28 Jun 2026 13:47:32 +0400 Subject: [PATCH 32/54] chore: Skills were moved into agent config --- {skills => .agents/skills}/commit-workflow/SKILL.md | 0 {skills => .agents/skills}/coverage-recovery/SKILL.md | 0 {skills => .agents/skills}/docs-parity/SKILL.md | 0 {skills => .agents/skills}/exploration-workflow/SKILL.md | 0 .../skills}/yarn-lock-conflict-resolution/SKILL.md | 0 AGENTS.md | 2 +- 6 files changed, 1 insertion(+), 1 deletion(-) rename {skills => .agents/skills}/commit-workflow/SKILL.md (100%) rename {skills => .agents/skills}/coverage-recovery/SKILL.md (100%) rename {skills => .agents/skills}/docs-parity/SKILL.md (100%) rename {skills => .agents/skills}/exploration-workflow/SKILL.md (100%) rename {skills => .agents/skills}/yarn-lock-conflict-resolution/SKILL.md (100%) diff --git a/skills/commit-workflow/SKILL.md b/.agents/skills/commit-workflow/SKILL.md similarity index 100% rename from skills/commit-workflow/SKILL.md rename to .agents/skills/commit-workflow/SKILL.md diff --git a/skills/coverage-recovery/SKILL.md b/.agents/skills/coverage-recovery/SKILL.md similarity index 100% rename from skills/coverage-recovery/SKILL.md rename to .agents/skills/coverage-recovery/SKILL.md diff --git a/skills/docs-parity/SKILL.md b/.agents/skills/docs-parity/SKILL.md similarity index 100% rename from skills/docs-parity/SKILL.md rename to .agents/skills/docs-parity/SKILL.md diff --git a/skills/exploration-workflow/SKILL.md b/.agents/skills/exploration-workflow/SKILL.md similarity index 100% rename from skills/exploration-workflow/SKILL.md rename to .agents/skills/exploration-workflow/SKILL.md diff --git a/skills/yarn-lock-conflict-resolution/SKILL.md b/.agents/skills/yarn-lock-conflict-resolution/SKILL.md similarity index 100% rename from skills/yarn-lock-conflict-resolution/SKILL.md rename to .agents/skills/yarn-lock-conflict-resolution/SKILL.md diff --git a/AGENTS.md b/AGENTS.md index cab7d21..5074796 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -125,7 +125,7 @@ make help resolved automatically before manual follow-up. ## Skills -The skills listed below are stored locally in this repository under `skills/`. +The skills listed below are stored locally in this repository under `.agents/skills/`. If the context was compacted and you see `Context compacted`, reread any skill whose description below starts with `[reread]` after the colon before From 31b7e63fa40cbdb828145d4f31ca6c802336ceb2 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Sun, 28 Jun 2026 15:49:07 +0400 Subject: [PATCH 33/54] build: Test dependency tooling was updated --- Makefile | 13 +++++++------ docker/playwright/Dockerfile | 2 +- m3-react/package.json | 8 ++++---- m3-react/tests/M3Dialog.test.tsx | 5 ++++- m3-vue/package.json | 10 +++++----- .../surface/SurfaceSideSheetModalToWindow.vue | 4 ++-- package.json | 12 ++++++------ recipes/common.mk | 2 +- recipes/exploration.mk | 4 ++-- recipes/research/capture.sh | 2 +- recipes/tests.mk | 8 ++++---- runtime-parity.test.sh | 14 +++++++++++++- 12 files changed, 50 insertions(+), 34 deletions(-) diff --git a/Makefile b/Makefile index 1276beb..329754a 100644 --- a/Makefile +++ b/Makefile @@ -2,29 +2,30 @@ TARGET_HEADER=@echo -e '===== \e[34m' $@ '\e[0m' TARGET_OK=@echo -e '\e[32mOK\e[0m' -YARN=@docker-compose run --rm node yarn -PLAYWRIGHT_NODE_CMD=docker-compose run --rm playwright node +DOCKER_COMPOSE ?= docker compose +YARN=@$(DOCKER_COMPOSE) run --rm node yarn +PLAYWRIGHT_NODE_CMD=$(DOCKER_COMPOSE) run --rm playwright node M3_UA?=m3-web-research/1.0 .PHONY: up up: ## [Dev][docker] Starts storybook $(TARGET_HEADER) - docker-compose up -d + $(DOCKER_COMPOSE) up -d .PHONY: restart restart: ## [Dev][docker] Restarts all docker services or a particular service, if argument "service" is specified (example: make restart service="storybook") $(TARGET_HEADER) ifdef service - yes | docker-compose rm -s -v $(service) && docker-compose up -d $(service) + yes | $(DOCKER_COMPOSE) rm -s -v $(service) && $(DOCKER_COMPOSE) up -d $(service) else - docker-compose stop && docker-compose up -d + $(DOCKER_COMPOSE) stop && $(DOCKER_COMPOSE) up -d endif .PHONY: stop stop: ## [Dev][docker] Stops all docker services $(TARGET_HEADER) - docker-compose stop + $(DOCKER_COMPOSE) stop include recipes/common.mk diff --git a/docker/playwright/Dockerfile b/docker/playwright/Dockerfile index 70bc873..76c02f2 100644 --- a/docker/playwright/Dockerfile +++ b/docker/playwright/Dockerfile @@ -8,7 +8,7 @@ ENV PLAYWRIGHT_BROWSERS_PATH=/ms-playwright ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0 RUN corepack enable \ - && npx -y playwright@1.58.2 install --with-deps chromium \ + && npx -y playwright@1.61.1 install --with-deps chromium \ && chown -R node:node /ms-playwright USER node diff --git a/m3-react/package.json b/m3-react/package.json index 337a555..5146692 100644 --- a/m3-react/package.json +++ b/m3-react/package.json @@ -66,8 +66,8 @@ "@typescript-eslint/eslint-plugin": "^8.56.0", "@typescript-eslint/parser": "^8.56.0", "@vitejs/plugin-react": "^5.1.4", - "@vitest/browser": "^4.0.18", - "@vitest/browser-playwright": "^4.0.18", + "@vitest/browser": "^4.1.9", + "@vitest/browser-playwright": "^4.1.9", "eslint": "^9.39.3", "eslint-plugin-import": "^2.32.0", "eslint-plugin-react": "^7.37.5", @@ -77,7 +77,7 @@ "globals": "^17.3.0", "highlight.js": "^11.11.1", "jsdom": "^28.1.0", - "playwright": "^1.55.0", + "playwright": "^1.61.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-transition-group": "^4.4.5", @@ -91,7 +91,7 @@ "uuid": "^13.0.0", "vite": "^7.3.1", "vite-plugin-svgr": "^4.5.0", - "vitest": "^4.0.18" + "vitest": "^4.1.9" }, "contributors": [ "Zaitsev Kirill " diff --git a/m3-react/tests/M3Dialog.test.tsx b/m3-react/tests/M3Dialog.test.tsx index accc330..0deb706 100644 --- a/m3-react/tests/M3Dialog.test.tsx +++ b/m3-react/tests/M3Dialog.test.tsx @@ -179,8 +179,11 @@ describe('m3-react/dialog', () => { expect(screen.getByText('Dialog body')).not.toBeNull() + await act(async () => {}) + await act(async () => { - vi.advanceTimersByTime(300) + vi.runAllTimers() + await Promise.resolve() }) expect(screen.queryByText('Dialog body')).toBeNull() diff --git a/m3-vue/package.json b/m3-vue/package.json index d5d62da..54356b3 100644 --- a/m3-vue/package.json +++ b/m3-vue/package.json @@ -60,9 +60,9 @@ "@typescript-eslint/eslint-plugin": "^8.56.0", "@typescript-eslint/parser": "^8.56.0", "@vitejs/plugin-vue": "^6.0.4", - "@vitest/browser": "^4.0.18", - "@vitest/browser-playwright": "^4.0.18", - "@vue/compiler-sfc": "^3.5.28", + "@vitest/browser": "^4.1.9", + "@vitest/browser-playwright": "^4.1.9", + "@vue/compiler-sfc": "^3.5.39", "@vue/language-server": "^3.2.5", "eslint": "^9.39.3", "eslint-plugin-import": "^2.32.0", @@ -72,7 +72,7 @@ "globals": "^17.3.0", "highlight.js": "^11.11.1", "jsdom": "^28.1.0", - "playwright": "^1.55.0", + "playwright": "^1.61.1", "react": "^18.3.1", "react-dom": "^18.3.1", "sass": "^1.97.3", @@ -84,7 +84,7 @@ "uuid": "^13.0.0", "vite": "^7.3.1", "vite-svg-loader": "^5.1.0", - "vitest": "^4.0.18", + "vitest": "^4.1.9", "vue": "^3.5.28", "vue-eslint-parser": "^10.4.0", "vue-router": "^5.0.3", diff --git a/m3-vue/storybook/examples/surface/SurfaceSideSheetModalToWindow.vue b/m3-vue/storybook/examples/surface/SurfaceSideSheetModalToWindow.vue index 53f1fb7..508b5eb 100644 --- a/m3-vue/storybook/examples/surface/SurfaceSideSheetModalToWindow.vue +++ b/m3-vue/storybook/examples/surface/SurfaceSideSheetModalToWindow.vue @@ -354,8 +354,8 @@ const sideSheetWidth = ref(320) const windowWidth = ref(720) const modalInsetRight = ref(-(sideSheetWidth.value + 12)) -const modalRadiusLeft = ref(HIDDEN_SURFACE_DESCRIPTOR.rounding.topLeft) -const modalElevationBase = ref(HIDDEN_SURFACE_DESCRIPTOR.elevation) +const modalRadiusLeft = ref(HIDDEN_SURFACE_DESCRIPTOR.rounding.topLeft) +const modalElevationBase = ref(HIDDEN_SURFACE_DESCRIPTOR.elevation) const modalMounted = ref(false) const modalVisible = ref(false) diff --git a/package.json b/package.json index 85b0042..08cd22b 100644 --- a/package.json +++ b/package.json @@ -30,16 +30,16 @@ "devDependencies": { "@commitlint/cli": "^20.4.2", "@commitlint/config-conventional": "^20.4.2", - "@vitest/browser": "^4.0.18", - "@vitest/browser-playwright": "^4.0.18", - "@vitest/coverage-istanbul": "^4.0.18", - "@vitest/ui": "4.0.18", + "@vitest/browser": "^4.1.9", + "@vitest/browser-playwright": "^4.1.9", + "@vitest/coverage-istanbul": "^4.1.9", + "@vitest/ui": "^4.1.9", "canvas": "^3.2.1", "jsdom": "^28.1.0", "nyc": "^17.1.0", - "playwright": "^1.55.0", + "playwright": "^1.61.1", "typescript": "~5.9.3", - "vitest": "^4.0.18" + "vitest": "^4.1.9" }, "contributors": [ "Tatyana Komolyh " diff --git a/recipes/common.mk b/recipes/common.mk index 8b4bca6..5751158 100644 --- a/recipes/common.mk +++ b/recipes/common.mk @@ -14,6 +14,6 @@ node_modules: package.json yarn.lock ## [Setup][docker][heavy] Installs dependen .PHONY: husky husky: node_modules ## [Setup][docker][git] Adds husky git hooks with commit content checks - @docker-compose run --rm node npx husky init + @$(DOCKER_COMPOSE) run --rm node npx husky init endif diff --git a/recipes/exploration.mk b/recipes/exploration.mk index fd9a9b0..d096db7 100644 --- a/recipes/exploration.mk +++ b/recipes/exploration.mk @@ -23,10 +23,10 @@ exploration-preflight-local: ## [Exploration][safe] Validates required local CLI $(TARGET_OK) .PHONY: exploration-preflight-docker -exploration-preflight-docker: ## [Exploration][escalated][docker] Validates docker-compose and Playwright runtime prerequisites +exploration-preflight-docker: ## [Exploration][escalated][docker] Validates Docker Compose and Playwright runtime prerequisites $(TARGET_HEADER) @set -e; \ - docker-compose ps >/dev/null; \ + $(DOCKER_COMPOSE) ps >/dev/null; \ $(PLAYWRIGHT_NODE_CMD) -e "console.log('playwright node', process.version)"; \ echo "preflight-docker:ok" $(TARGET_OK) diff --git a/recipes/research/capture.sh b/recipes/research/capture.sh index c3e2927..5afdd34 100755 --- a/recipes/research/capture.sh +++ b/recipes/research/capture.sh @@ -23,7 +23,7 @@ usage() { " --wait-selector CSS optional selector to wait for before capture" } -node_cmd_string="${PLAYWRIGHT_NODE_CMD:-docker-compose run --rm playwright node}" +node_cmd_string="${PLAYWRIGHT_NODE_CMD:-docker compose run --rm playwright node}" read -r -a node_cmd <<< "$node_cmd_string" urls=() diff --git a/recipes/tests.mk b/recipes/tests.mk index f8db30a..3affad1 100644 --- a/recipes/tests.mk +++ b/recipes/tests.mk @@ -1,6 +1,6 @@ include recipes/common.mk -YARN_PLAYWRIGHT=@docker-compose run --rm playwright yarn +YARN_PLAYWRIGHT=@$(DOCKER_COMPOSE) run --rm playwright yarn COVERAGE_PARTS_DIR=coverage/.parts COVERAGE_UNIT_DIR=coverage/unit COVERAGE_E2E_REACT_DIR=coverage/e2e-react @@ -77,7 +77,7 @@ endif .PHONY: test-e2e-stop test-e2e-stop: ## [Tests][local][cleanup] Stops stuck Playwright E2E host processes and run containers $(TARGET_HEADER) - @pkill -TERM -f "docker-compose run --rm playwright yarn test:[e]2e" || true - @pkill -TERM -f "docker-compose run --rm playwright yarn workspace @modulify/m3-react test:[e]2e" || true - @pkill -TERM -f "docker-compose run --rm playwright yarn workspace @modulify/m3-vue test:[e]2e" || true + @pkill -TERM -f "$(DOCKER_COMPOSE) run --rm playwright yarn test:[e]2e" || true + @pkill -TERM -f "$(DOCKER_COMPOSE) run --rm playwright yarn workspace @modulify/m3-react test:[e]2e" || true + @pkill -TERM -f "$(DOCKER_COMPOSE) run --rm playwright yarn workspace @modulify/m3-vue test:[e]2e" || true @docker ps -q --filter "name=m3-web-playwright-run" | xargs -r docker rm -f diff --git a/runtime-parity.test.sh b/runtime-parity.test.sh index 98690cc..d062566 100755 --- a/runtime-parity.test.sh +++ b/runtime-parity.test.sh @@ -20,7 +20,19 @@ version_for() { service="$1" binary="$2" - compose run --rm "$service" "$binary" --version | awk 'END { print }' | tr -d '\r' + if ! output="$(compose run --rm "$service" "$binary" --version 2>&1)"; then + echo "$output" >&2 + exit 1 + fi + + version="$(printf '%s\n' "$output" | awk 'END { print }' | tr -d '\r')" + + if [ -z "$version" ]; then + echo "Error: empty $binary version for $service." >&2 + exit 1 + fi + + printf '%s\n' "$version" } expected_node="$(version_for node node)" From 22e70f46996952e27c6f9a0728eb4fd9a0a02e8f Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Sun, 28 Jun 2026 15:58:49 +0400 Subject: [PATCH 34/54] chore: Updated yarn.lock --- yarn.lock | 5632 ++++++++++++++++++++++++++--------------------------- 1 file changed, 2735 insertions(+), 2897 deletions(-) diff --git a/yarn.lock b/yarn.lock index 93dc7c5..ff5e117 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,13 +5,6 @@ __metadata: version: 8 cacheKey: 10c0 -"@aashutoshrathi/word-wrap@npm:^1.2.3": - version: 1.2.6 - resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: 10c0/53c2b231a61a46792b39a0d43bc4f4f776bb4542aa57ee04930676802e5501282c2fc8aac14e4cd1f1120ff8b52616b6ff5ab539ad30aa2277d726444b71619f - languageName: node - linkType: hard - "@acemir/cssom@npm:^0.9.31": version: 0.9.31 resolution: "@acemir/cssom@npm:0.9.31" @@ -36,16 +29,16 @@ __metadata: languageName: node linkType: hard -"@asamuzakjp/css-color@npm:^4.1.2": - version: 4.1.2 - resolution: "@asamuzakjp/css-color@npm:4.1.2" +"@asamuzakjp/css-color@npm:^5.0.1": + version: 5.1.11 + resolution: "@asamuzakjp/css-color@npm:5.1.11" dependencies: - "@csstools/css-calc": "npm:^3.0.0" - "@csstools/css-color-parser": "npm:^4.0.1" + "@asamuzakjp/generational-cache": "npm:^1.0.1" + "@csstools/css-calc": "npm:^3.2.0" + "@csstools/css-color-parser": "npm:^4.1.0" "@csstools/css-parser-algorithms": "npm:^4.0.0" "@csstools/css-tokenizer": "npm:^4.0.0" - lru-cache: "npm:^11.2.5" - checksum: 10c0/e432fdef978b37654a2ca31169a149b9173e708f70c82612acb123a36dbc7dd99913c48cbf2edd6fe3652cc627d4bc94bf87571463da0b788f15b973d4ce5b0f + checksum: 10c0/32720bdff8daea6a8847aba6cdfae55baa3b4a2690b51d21db7f0382bbd183f3d9f2d5126df50afd889062635684b2819e47113629ee2e80c99389e75f48d060 languageName: node linkType: hard @@ -62,6 +55,13 @@ __metadata: languageName: node linkType: hard +"@asamuzakjp/generational-cache@npm:^1.0.1": + version: 1.0.1 + resolution: "@asamuzakjp/generational-cache@npm:1.0.1" + checksum: 10c0/1de62de43764e13fca3b9a31b7ea9b1bf0780fe053d266e40378a19ff8c66b543e011e6a0df02d410cd59bf981126706f176cdbb938985165202c4a079fe1057 + languageName: node + linkType: hard + "@asamuzakjp/nwsapi@npm:^2.3.9": version: 2.3.9 resolution: "@asamuzakjp/nwsapi@npm:2.3.9" @@ -214,7 +214,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.28.6, @babel/generator@npm:^7.29.0": +"@babel/generator@npm:^7.29.0": version: 7.29.1 resolution: "@babel/generator@npm:7.29.1" dependencies: @@ -227,6 +227,20 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^8.0.0-rc.4": + version: 8.0.0 + resolution: "@babel/generator@npm:8.0.0" + dependencies: + "@babel/parser": "npm:^8.0.0" + "@babel/types": "npm:^8.0.0" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" + "@types/jsesc": "npm:^2.5.0" + jsesc: "npm:^3.0.2" + checksum: 10c0/2b2d171beaedcacca62164f0f39bc8962df5f9700a54c5515174276ea20b3a53933e9804e0b35c2be1059108a764447d99d0c5beb63ecbbf8c66035ca6c003c4 + languageName: node + linkType: hard + "@babel/helper-compilation-targets@npm:^7.23.6": version: 7.23.6 resolution: "@babel/helper-compilation-targets@npm:7.23.6" @@ -433,6 +447,20 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-string-parser@npm:7.29.7" + checksum: 10c0/194bc0f1716e396d5ffde56ad6119745fb9557662c98611590e5e454906783a4ccb21ce93056b8eb69a4909044834e45d96e50ac695bbe9e3221648fe033c06c + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^8.0.0": + version: 8.0.0 + resolution: "@babel/helper-string-parser@npm:8.0.0" + checksum: 10c0/b2272a9eaa63a1bc9ce2673d580e69620fd79786f3e3cf1891f406801f8211810f194f2739fef920f01a97ae06ae465b2dfd238ab8037a3182d0869939ca9a5d + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-validator-identifier@npm:7.22.20" @@ -461,6 +489,20 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-validator-identifier@npm:7.29.7" + checksum: 10c0/4795354e7ae0dcafa72de1cd04ec51252dc1498517170beaf019e03effc5b7bf13c6b21a3949a77e07b8125be7f106ed1131350d8ebd4566ae874094a726d62b + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^8.0.0": + version: 8.0.2 + resolution: "@babel/helper-validator-identifier@npm:8.0.2" + checksum: 10c0/629eda2a0a99442a1628bbef5f9fd8e26c1aa21ddbf02760d1c482b737932b1bb21fb1f89aacf9c3cf0642b481b810e39f94b8ae9aa44fc4f5516ebec6798b7b + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.23.5": version: 7.23.5 resolution: "@babel/helper-validator-option@npm:7.23.5" @@ -568,7 +610,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.28.4, @babel/parser@npm:^7.28.5, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": +"@babel/parser@npm:^7.28.5, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": version: 7.29.0 resolution: "@babel/parser@npm:7.29.0" dependencies: @@ -579,6 +621,28 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.29.2, @babel/parser@npm:^7.29.3, @babel/parser@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/parser@npm:7.29.7" + dependencies: + "@babel/types": "npm:^7.29.7" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/65133038f80b54a714d6027cb77cee3f9a6b5c4c6842ce674301e13947cbcbfa8055e63acaf1b84c085d34226a14425b2c2b97b829e0e226d2e8f1299942a51d + languageName: node + linkType: hard + +"@babel/parser@npm:^8.0.0": + version: 8.0.0 + resolution: "@babel/parser@npm:8.0.0" + dependencies: + "@babel/types": "npm:^8.0.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/f10665bf3289f4bdc43bc58c482d6baa9fc4e306460d1bc57b059486dc9f23ed4463e746f62d721396466e2a2e0b32d856648b8c30dedbf6b69787b430f21e75 + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx-self@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-react-jsx-self@npm:7.27.1" @@ -743,6 +807,33 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/types@npm:7.29.7" + dependencies: + "@babel/helper-string-parser": "npm:^7.29.7" + "@babel/helper-validator-identifier": "npm:^7.29.7" + checksum: 10c0/b6623994c69717fa27294f5fa46d59140338e2d86c6c1c13085c84ef7d53086ee357fbf4fe9abe3dd3da75734dc77c4c0df2f90fb29e667558bb3b3fb705e88f + languageName: node + linkType: hard + +"@babel/types@npm:^8.0.0": + version: 8.0.0 + resolution: "@babel/types@npm:8.0.0" + dependencies: + "@babel/helper-string-parser": "npm:^8.0.0" + "@babel/helper-validator-identifier": "npm:^8.0.0" + checksum: 10c0/f4130b88818cf9fd0fb653dd35459f58794018416bc0cee0eccefd364c2d146ae90611ae3ae19d91c2f0bbd1e0e440840832baf9a3d5eb5fed077a52f0bcc001 + languageName: node + linkType: hard + +"@blazediff/core@npm:1.9.1": + version: 1.9.1 + resolution: "@blazediff/core@npm:1.9.1" + checksum: 10c0/fd45cdd0544002341d74831a179ef693a81414abd348c1ff0c01086c0ea03f5e5ee284c4e16c2e6fb3670c265f90a3d85752b9360320efa9a835928e604dae77 + languageName: node + linkType: hard + "@bramus/specificity@npm:^2.4.2": version: 2.4.2 resolution: "@bramus/specificity@npm:2.4.2" @@ -968,33 +1059,33 @@ __metadata: languageName: node linkType: hard -"@csstools/color-helpers@npm:^6.0.1": - version: 6.0.1 - resolution: "@csstools/color-helpers@npm:6.0.1" - checksum: 10c0/866844267d5aa5a02fe9d54f6db6fc18f6306595edb03664cc8ef15c99d3e6f3b42eb1a413c98bafa5b2dc0d8e0193da9b3bcc9d6a04f5de74cbd44935e74b3c +"@csstools/color-helpers@npm:^6.1.0": + version: 6.1.0 + resolution: "@csstools/color-helpers@npm:6.1.0" + checksum: 10c0/ebb71eebcd6dde16a89d687c30d4c7f315f9079ec803497ebac0528d0a9ef09847eaf167b4565c4919f156e32e7ca2167199ac2d2020f184f7888551a3b4712b languageName: node linkType: hard -"@csstools/css-calc@npm:^3.0.0": - version: 3.1.1 - resolution: "@csstools/css-calc@npm:3.1.1" +"@csstools/css-calc@npm:^3.2.0, @csstools/css-calc@npm:^3.2.1": + version: 3.2.1 + resolution: "@csstools/css-calc@npm:3.2.1" peerDependencies: "@csstools/css-parser-algorithms": ^4.0.0 "@csstools/css-tokenizer": ^4.0.0 - checksum: 10c0/6efcc016d988edf66e54c7bad03e352d61752cbd1b56c7557fd013868aab23505052ded8f912cd4034e216943ea1e04c957d81012489e3eddc14a57b386510ef + checksum: 10c0/0191c8d1cd4dffa0d3b6bfd1e78a721934b1d7a6c972966e4fdaa72208c6789e8ff443ee81764a32f1e6107825695b5524ef2b4dc1681b5b29230f2a1277e5df languageName: node linkType: hard -"@csstools/css-color-parser@npm:^4.0.1": - version: 4.0.1 - resolution: "@csstools/css-color-parser@npm:4.0.1" +"@csstools/css-color-parser@npm:^4.1.0": + version: 4.1.9 + resolution: "@csstools/css-color-parser@npm:4.1.9" dependencies: - "@csstools/color-helpers": "npm:^6.0.1" - "@csstools/css-calc": "npm:^3.0.0" + "@csstools/color-helpers": "npm:^6.1.0" + "@csstools/css-calc": "npm:^3.2.1" peerDependencies: "@csstools/css-parser-algorithms": ^4.0.0 "@csstools/css-tokenizer": ^4.0.0 - checksum: 10c0/c46be5b9f5c0ef3cd25b47a71bd2a4d1c4856b123ecba4abe8eaa0688d3fc47f58fa67ea281d6b9efca4b9fdfa88fb045c51d0f9b8c612a56bd546d38260b138 + checksum: 10c0/d9330a1d5b207230e97a522c9b73c1b625dbfbca7a91ac8888e05917efb01c6aa4075153e5af6ce028c3848660d3f24cf7b0f0760a080361089e1a3841e586c7 languageName: node linkType: hard @@ -1007,10 +1098,15 @@ __metadata: languageName: node linkType: hard -"@csstools/css-syntax-patches-for-csstree@npm:^1.0.26": - version: 1.0.27 - resolution: "@csstools/css-syntax-patches-for-csstree@npm:1.0.27" - checksum: 10c0/ef3f2a639109758c0f3c04520465800ca4c830174bd6f7979795083877c82ace51ab8353857b06a818cb6c0de6d4dc88f84a86fc3b021be47f11a0f1c4b74e7e +"@csstools/css-syntax-patches-for-csstree@npm:^1.0.28": + version: 1.1.5 + resolution: "@csstools/css-syntax-patches-for-csstree@npm:1.1.5" + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true + checksum: 10c0/a31f0cfb74e2b5ce8a283c47969a202fc3b23c3ee05c6b6beab7f5c14d89c50b82533e446df74f7df0bf88bf23810ed59431353db26e00d5b013995c1ebf07a2 languageName: node linkType: hard @@ -1079,184 +1175,259 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/aix-ppc64@npm:0.27.3" +"@emnapi/core@npm:1.11.0": + version: 1.11.0 + resolution: "@emnapi/core@npm:1.11.0" + dependencies: + "@emnapi/wasi-threads": "npm:1.2.2" + tslib: "npm:^2.4.0" + checksum: 10c0/268498d6ea42ff1e51d543725c7c9c3ce01d39be19a5790d1587ebe98dcfb9329666f0ce9864bb23e067caa064199a45ec2c63c4050b5e42166c1d7d40750135 + languageName: node + linkType: hard + +"@emnapi/core@npm:1.11.1": + version: 1.11.1 + resolution: "@emnapi/core@npm:1.11.1" + dependencies: + "@emnapi/wasi-threads": "npm:1.2.2" + tslib: "npm:^2.4.0" + checksum: 10c0/2c6defdac2d1d26090384655d7d6c9614fa553853b1760597686749e9375dc2aa0dae80a2615b81c254600f5d531d07d8466cde0d331a8caae64b93f3ca5937e + languageName: node + linkType: hard + +"@emnapi/core@npm:1.9.2": + version: 1.9.2 + resolution: "@emnapi/core@npm:1.9.2" + dependencies: + "@emnapi/wasi-threads": "npm:1.2.1" + tslib: "npm:^2.4.0" + checksum: 10c0/5500393f953951bad0768fafaa9191f2d938956b20c6d6a79e5ab696a613a25ce6ad23422bc18e86e6ce8deb147619d8d0d7d413a69f84adc01a6633cc353cd9 + languageName: node + linkType: hard + +"@emnapi/runtime@npm:1.11.0": + version: 1.11.0 + resolution: "@emnapi/runtime@npm:1.11.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/6c09d93934e4cf036d2a57672c1c932aee7b00063fc5851c0c6d2e65775adb5ec484e1e12b4ed3614d62e785e2472160d3b368fbdb50e49b566e631f7046e7db + languageName: node + linkType: hard + +"@emnapi/runtime@npm:1.11.1": + version: 1.11.1 + resolution: "@emnapi/runtime@npm:1.11.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/04332fb62076afc440aa23316c04bec42f584ca8b074e5507d08e2b33a47cbe0493b1aadb8f3c1057b64ae1e17f5bde1a7bc37f7facc9d0bc25c18197cbd366f + languageName: node + linkType: hard + +"@emnapi/runtime@npm:1.9.2": + version: 1.9.2 + resolution: "@emnapi/runtime@npm:1.9.2" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/61c3a59e0c36784558b8d58eb02bd04815aa5fb0dbfbaf84d1b3050a78aa0cc63ea129ae806bd1e48062bfeb7fc36eb0e5431740d62f64ea51bdf426404b8caa + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.2.1": + version: 1.2.1 + resolution: "@emnapi/wasi-threads@npm:1.2.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/32fcfa81ab396533b2ec1f4082b1ff779a05d9c836bbbd3f4398405b0e6814c0d9503b7993130e37bc6941dbc1ded49f55e9700ae9ca4e803bab2b5bc5deb331 + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.2.2": + version: 1.2.2 + resolution: "@emnapi/wasi-threads@npm:1.2.2" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/f0dc8269d6b20ae5a7c7b36e7a6a333452009d461038ef4febb29da2f3f78c1e2b1576d7e8970a5c5789ed3caedc1f80f5b0c2a5373bdaf8d03b20432bb55747 + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/aix-ppc64@npm:0.28.1" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/android-arm64@npm:0.27.3" +"@esbuild/android-arm64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/android-arm64@npm:0.28.1" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/android-arm@npm:0.27.3" +"@esbuild/android-arm@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/android-arm@npm:0.28.1" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/android-x64@npm:0.27.3" +"@esbuild/android-x64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/android-x64@npm:0.28.1" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/darwin-arm64@npm:0.27.3" +"@esbuild/darwin-arm64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/darwin-arm64@npm:0.28.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/darwin-x64@npm:0.27.3" +"@esbuild/darwin-x64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/darwin-x64@npm:0.28.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/freebsd-arm64@npm:0.27.3" +"@esbuild/freebsd-arm64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/freebsd-arm64@npm:0.28.1" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/freebsd-x64@npm:0.27.3" +"@esbuild/freebsd-x64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/freebsd-x64@npm:0.28.1" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-arm64@npm:0.27.3" +"@esbuild/linux-arm64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-arm64@npm:0.28.1" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-arm@npm:0.27.3" +"@esbuild/linux-arm@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-arm@npm:0.28.1" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-ia32@npm:0.27.3" +"@esbuild/linux-ia32@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-ia32@npm:0.28.1" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-loong64@npm:0.27.3" +"@esbuild/linux-loong64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-loong64@npm:0.28.1" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-mips64el@npm:0.27.3" +"@esbuild/linux-mips64el@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-mips64el@npm:0.28.1" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-ppc64@npm:0.27.3" +"@esbuild/linux-ppc64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-ppc64@npm:0.28.1" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-riscv64@npm:0.27.3" +"@esbuild/linux-riscv64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-riscv64@npm:0.28.1" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-s390x@npm:0.27.3" +"@esbuild/linux-s390x@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-s390x@npm:0.28.1" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-x64@npm:0.27.3" +"@esbuild/linux-x64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-x64@npm:0.28.1" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/netbsd-arm64@npm:0.27.3" +"@esbuild/netbsd-arm64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/netbsd-arm64@npm:0.28.1" conditions: os=netbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/netbsd-x64@npm:0.27.3" +"@esbuild/netbsd-x64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/netbsd-x64@npm:0.28.1" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/openbsd-arm64@npm:0.27.3" +"@esbuild/openbsd-arm64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/openbsd-arm64@npm:0.28.1" conditions: os=openbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/openbsd-x64@npm:0.27.3" +"@esbuild/openbsd-x64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/openbsd-x64@npm:0.28.1" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openharmony-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/openharmony-arm64@npm:0.27.3" +"@esbuild/openharmony-arm64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/openharmony-arm64@npm:0.28.1" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/sunos-x64@npm:0.27.3" +"@esbuild/sunos-x64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/sunos-x64@npm:0.28.1" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/win32-arm64@npm:0.27.3" +"@esbuild/win32-arm64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/win32-arm64@npm:0.28.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/win32-ia32@npm:0.27.3" +"@esbuild/win32-ia32@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/win32-ia32@npm:0.28.1" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/win32-x64@npm:0.27.3" +"@esbuild/win32-x64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/win32-x64@npm:0.28.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -1290,14 +1461,14 @@ __metadata: languageName: node linkType: hard -"@eslint/config-array@npm:^0.21.1": - version: 0.21.1 - resolution: "@eslint/config-array@npm:0.21.1" +"@eslint/config-array@npm:^0.21.2": + version: 0.21.2 + resolution: "@eslint/config-array@npm:0.21.2" dependencies: "@eslint/object-schema": "npm:^2.1.7" debug: "npm:^4.3.1" - minimatch: "npm:^3.1.2" - checksum: 10c0/2f657d4edd6ddcb920579b72e7a5b127865d4c3fb4dda24f11d5c4f445a93ca481aebdbd6bf3291c536f5d034458dbcbb298ee3b698bc6c9dd02900fe87eec3c + minimatch: "npm:^3.1.5" + checksum: 10c0/89dfe815d18456177c0a1f238daf4593107fd20298b3598e0103054360d3b8d09d967defd8318f031185d68df1f95cfa68becf1390a9c5c6887665f1475142e3 languageName: node linkType: hard @@ -1319,24 +1490,31 @@ __metadata: languageName: node linkType: hard -"@eslint/eslintrc@npm:^3.3.1": - version: 3.3.3 - resolution: "@eslint/eslintrc@npm:3.3.3" +"@eslint/eslintrc@npm:^3.3.5": + version: 3.3.5 + resolution: "@eslint/eslintrc@npm:3.3.5" dependencies: - ajv: "npm:^6.12.4" + ajv: "npm:^6.14.0" debug: "npm:^4.3.2" espree: "npm:^10.0.1" globals: "npm:^14.0.0" ignore: "npm:^5.2.0" import-fresh: "npm:^3.2.1" js-yaml: "npm:^4.1.1" - minimatch: "npm:^3.1.2" + minimatch: "npm:^3.1.5" strip-json-comments: "npm:^3.1.1" - checksum: 10c0/532c7acc7ddd042724c28b1f020bd7bf148fcd4653bb44c8314168b5f772508c842ce4ee070299cac51c5c5757d2124bdcfcef5551c8c58ff9986e3e17f2260d + checksum: 10c0/9fb9f1ca65e46d6173966e3aaa5bd353e3a65d7f1f582bebf77f578fab7d7960a399fac1ecfb1e7d52bd61f5cefd6531087ca52a3a3c388f2e1b4f1ebd3da8b7 + languageName: node + linkType: hard + +"@eslint/js@npm:9.39.4": + version: 9.39.4 + resolution: "@eslint/js@npm:9.39.4" + checksum: 10c0/5aa7dea2cbc5decf7f5e3b0c6f86a084ccee0f792d288ca8e839f8bc1b64e03e227068968e49b26096e6f71fd857ab6e42691d1b993826b9a3883f1bdd7a0e46 languageName: node linkType: hard -"@eslint/js@npm:9.39.3, @eslint/js@npm:^9.39.3": +"@eslint/js@npm:^9.39.3": version: 9.39.3 resolution: "@eslint/js@npm:9.39.3" checksum: 10c0/df1c70d6681c8daf4a3c86dfac159fcd98a73c4620c4fbe2be6caab1f30a34c7de0ad88ab0e81162376d2cde1a2eed1c32eff5f917ca369870930a51f8e818f1 @@ -1450,6 +1628,15 @@ __metadata: languageName: node linkType: hard +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + "@istanbuljs/load-nyc-config@npm:^1.0.0": version: 1.1.0 resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" @@ -1538,7 +1725,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": version: 1.4.15 resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" checksum: 10c0/0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5 @@ -1657,8 +1844,8 @@ __metadata: "@typescript-eslint/eslint-plugin": "npm:^8.56.0" "@typescript-eslint/parser": "npm:^8.56.0" "@vitejs/plugin-react": "npm:^5.1.4" - "@vitest/browser": "npm:^4.0.18" - "@vitest/browser-playwright": "npm:^4.0.18" + "@vitest/browser": "npm:^4.1.9" + "@vitest/browser-playwright": "npm:^4.1.9" eslint: "npm:^9.39.3" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-react: "npm:^7.37.5" @@ -1669,7 +1856,7 @@ __metadata: highlight.js: "npm:^11.11.1" jsdom: "npm:^28.1.0" lodash.isequal: "npm:^4.5.0" - playwright: "npm:^1.55.0" + playwright: "npm:^1.61.1" react: "npm:^18.2.0" react-dom: "npm:^18.2.0" react-transition-group: "npm:^4.4.5" @@ -1683,7 +1870,7 @@ __metadata: uuid: "npm:^13.0.0" vite: "npm:^7.3.1" vite-plugin-svgr: "npm:^4.5.0" - vitest: "npm:^4.0.18" + vitest: "npm:^4.1.9" peerDependencies: react: ^18.2.0 react-dom: ^18.2.0 @@ -1717,9 +1904,9 @@ __metadata: "@typescript-eslint/eslint-plugin": "npm:^8.56.0" "@typescript-eslint/parser": "npm:^8.56.0" "@vitejs/plugin-vue": "npm:^6.0.4" - "@vitest/browser": "npm:^4.0.18" - "@vitest/browser-playwright": "npm:^4.0.18" - "@vue/compiler-sfc": "npm:^3.5.28" + "@vitest/browser": "npm:^4.1.9" + "@vitest/browser-playwright": "npm:^4.1.9" + "@vue/compiler-sfc": "npm:^3.5.39" "@vue/language-server": "npm:^3.2.5" eslint: "npm:^9.39.3" eslint-plugin-import: "npm:^2.32.0" @@ -1730,7 +1917,7 @@ __metadata: highlight.js: "npm:^11.11.1" jsdom: "npm:^28.1.0" lodash.isequal: "npm:^4.5.0" - playwright: "npm:^1.55.0" + playwright: "npm:^1.61.1" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" sass: "npm:^1.97.3" @@ -1742,7 +1929,7 @@ __metadata: uuid: "npm:^13.0.0" vite: "npm:^7.3.1" vite-svg-loader: "npm:^5.1.0" - vitest: "npm:^4.0.18" + vitest: "npm:^4.1.9" vue: "npm:^3.5.28" vue-eslint-parser: "npm:^10.4.0" vue-router: "npm:^5.0.3" @@ -1758,16 +1945,16 @@ __metadata: dependencies: "@commitlint/cli": "npm:^20.4.2" "@commitlint/config-conventional": "npm:^20.4.2" - "@vitest/browser": "npm:^4.0.18" - "@vitest/browser-playwright": "npm:^4.0.18" - "@vitest/coverage-istanbul": "npm:^4.0.18" - "@vitest/ui": "npm:4.0.18" + "@vitest/browser": "npm:^4.1.9" + "@vitest/browser-playwright": "npm:^4.1.9" + "@vitest/coverage-istanbul": "npm:^4.1.9" + "@vitest/ui": "npm:^4.1.9" canvas: "npm:^3.2.1" jsdom: "npm:^28.1.0" nyc: "npm:^17.1.0" - playwright: "npm:^1.55.0" + playwright: "npm:^1.61.1" typescript: "npm:~5.9.3" - vitest: "npm:^4.0.18" + vitest: "npm:^4.1.9" languageName: unknown linkType: soft @@ -1778,32 +1965,22 @@ __metadata: languageName: node linkType: hard -"@neoconfetti/react@npm:^1.0.0": - version: 1.0.0 - resolution: "@neoconfetti/react@npm:1.0.0" - checksum: 10c0/dfa487965b69f88b39562ccd910114cd68b00a90c7eb79cfb1a483c7ac717b720f9f095e5aea13cef8a9b9bea05533d380ddff5e44d3bc3f7dc4d5c66716765c - languageName: node - linkType: hard - -"@npmcli/agent@npm:^2.0.0": - version: 2.2.1 - resolution: "@npmcli/agent@npm:2.2.1" +"@napi-rs/wasm-runtime@npm:^1.1.4, @napi-rs/wasm-runtime@npm:^1.1.5, @napi-rs/wasm-runtime@npm:^1.1.6": + version: 1.1.6 + resolution: "@napi-rs/wasm-runtime@npm:1.1.6" dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.1" - checksum: 10c0/38ee5cbe8f3cde13be916e717bfc54fd1a7605c07af056369ff894e244c221e0b56b08ca5213457477f9bc15bca9e729d51a4788829b5c3cf296b3c996147f76 + "@tybys/wasm-util": "npm:^0.10.3" + peerDependencies: + "@emnapi/core": ^1.7.1 + "@emnapi/runtime": ^1.7.1 + checksum: 10c0/344518bf3ef65051dda4c00969f293aa4a21ab7dc7822b3f48519b17cd5eaa3f0bc34898d115d50ba59b1817a0cb905d46f7a7223c8249239cd14c28db388e10 languageName: node linkType: hard -"@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/162b4a0b8705cd6f5c2470b851d1dc6cd228c86d2170e1769d738c1fbb69a87160901411c3c035331e9e99db72f1f1099a8b734bf1637cc32b9a5be1660e4e1e +"@neoconfetti/react@npm:^1.0.0": + version: 1.0.0 + resolution: "@neoconfetti/react@npm:1.0.0" + checksum: 10c0/dfa487965b69f88b39562ccd910114cd68b00a90c7eb79cfb1a483c7ac717b720f9f095e5aea13cef8a9b9bea05533d380ddff5e44d3bc3f7dc4d5c66716765c languageName: node linkType: hard @@ -1814,178 +1991,589 @@ __metadata: languageName: node linkType: hard -"@parcel/watcher-android-arm64@npm:2.5.6": - version: 2.5.6 - resolution: "@parcel/watcher-android-arm64@npm:2.5.6" +"@oxc-parser/binding-android-arm-eabi@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-android-arm-eabi@npm:0.127.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@oxc-parser/binding-android-arm64@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-android-arm64@npm:0.127.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-darwin-arm64@npm:2.5.6": - version: 2.5.6 - resolution: "@parcel/watcher-darwin-arm64@npm:2.5.6" +"@oxc-parser/binding-darwin-arm64@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-darwin-arm64@npm:0.127.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-darwin-x64@npm:2.5.6": - version: 2.5.6 - resolution: "@parcel/watcher-darwin-x64@npm:2.5.6" +"@oxc-parser/binding-darwin-x64@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-darwin-x64@npm:0.127.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@parcel/watcher-freebsd-x64@npm:2.5.6": - version: 2.5.6 - resolution: "@parcel/watcher-freebsd-x64@npm:2.5.6" +"@oxc-parser/binding-freebsd-x64@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-freebsd-x64@npm:0.127.0" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@parcel/watcher-linux-arm-glibc@npm:2.5.6": - version: 2.5.6 - resolution: "@parcel/watcher-linux-arm-glibc@npm:2.5.6" - conditions: os=linux & cpu=arm & libc=glibc +"@oxc-parser/binding-linux-arm-gnueabihf@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-arm-gnueabihf@npm:0.127.0" + conditions: os=linux & cpu=arm languageName: node linkType: hard -"@parcel/watcher-linux-arm-musl@npm:2.5.6": - version: 2.5.6 - resolution: "@parcel/watcher-linux-arm-musl@npm:2.5.6" - conditions: os=linux & cpu=arm & libc=musl +"@oxc-parser/binding-linux-arm-musleabihf@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-arm-musleabihf@npm:0.127.0" + conditions: os=linux & cpu=arm languageName: node linkType: hard -"@parcel/watcher-linux-arm64-glibc@npm:2.5.6": - version: 2.5.6 - resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.5.6" +"@oxc-parser/binding-linux-arm64-gnu@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-arm64-gnu@npm:0.127.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-arm64-musl@npm:2.5.6": - version: 2.5.6 - resolution: "@parcel/watcher-linux-arm64-musl@npm:2.5.6" +"@oxc-parser/binding-linux-arm64-musl@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-arm64-musl@npm:0.127.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@parcel/watcher-linux-x64-glibc@npm:2.5.6": - version: 2.5.6 - resolution: "@parcel/watcher-linux-x64-glibc@npm:2.5.6" - conditions: os=linux & cpu=x64 & libc=glibc +"@oxc-parser/binding-linux-ppc64-gnu@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-ppc64-gnu@npm:0.127.0" + conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-x64-musl@npm:2.5.6": - version: 2.5.6 - resolution: "@parcel/watcher-linux-x64-musl@npm:2.5.6" - conditions: os=linux & cpu=x64 & libc=musl +"@oxc-parser/binding-linux-riscv64-gnu@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-riscv64-gnu@npm:0.127.0" + conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@parcel/watcher-win32-arm64@npm:2.5.6": - version: 2.5.6 - resolution: "@parcel/watcher-win32-arm64@npm:2.5.6" - conditions: os=win32 & cpu=arm64 +"@oxc-parser/binding-linux-riscv64-musl@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-riscv64-musl@npm:0.127.0" + conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@parcel/watcher-win32-ia32@npm:2.5.6": - version: 2.5.6 - resolution: "@parcel/watcher-win32-ia32@npm:2.5.6" - conditions: os=win32 & cpu=ia32 +"@oxc-parser/binding-linux-s390x-gnu@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-s390x-gnu@npm:0.127.0" + conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@parcel/watcher-win32-x64@npm:2.5.6": - version: 2.5.6 - resolution: "@parcel/watcher-win32-x64@npm:2.5.6" - conditions: os=win32 & cpu=x64 +"@oxc-parser/binding-linux-x64-gnu@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-x64-gnu@npm:0.127.0" + conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@parcel/watcher@npm:^2.4.1": - version: 2.5.6 - resolution: "@parcel/watcher@npm:2.5.6" - dependencies: - "@parcel/watcher-android-arm64": "npm:2.5.6" - "@parcel/watcher-darwin-arm64": "npm:2.5.6" - "@parcel/watcher-darwin-x64": "npm:2.5.6" - "@parcel/watcher-freebsd-x64": "npm:2.5.6" - "@parcel/watcher-linux-arm-glibc": "npm:2.5.6" - "@parcel/watcher-linux-arm-musl": "npm:2.5.6" - "@parcel/watcher-linux-arm64-glibc": "npm:2.5.6" - "@parcel/watcher-linux-arm64-musl": "npm:2.5.6" - "@parcel/watcher-linux-x64-glibc": "npm:2.5.6" - "@parcel/watcher-linux-x64-musl": "npm:2.5.6" - "@parcel/watcher-win32-arm64": "npm:2.5.6" - "@parcel/watcher-win32-ia32": "npm:2.5.6" - "@parcel/watcher-win32-x64": "npm:2.5.6" - detect-libc: "npm:^2.0.3" - is-glob: "npm:^4.0.3" - node-addon-api: "npm:^7.0.0" - node-gyp: "npm:latest" - picomatch: "npm:^4.0.3" - dependenciesMeta: - "@parcel/watcher-android-arm64": - optional: true - "@parcel/watcher-darwin-arm64": - optional: true - "@parcel/watcher-darwin-x64": - optional: true - "@parcel/watcher-freebsd-x64": - optional: true - "@parcel/watcher-linux-arm-glibc": - optional: true - "@parcel/watcher-linux-arm-musl": - optional: true - "@parcel/watcher-linux-arm64-glibc": - optional: true - "@parcel/watcher-linux-arm64-musl": - optional: true - "@parcel/watcher-linux-x64-glibc": - optional: true - "@parcel/watcher-linux-x64-musl": - optional: true - "@parcel/watcher-win32-arm64": - optional: true - "@parcel/watcher-win32-ia32": - optional: true - "@parcel/watcher-win32-x64": - optional: true - checksum: 10c0/1e1d91f92e94e4640089a7cead243b2b81ca9aa8e1c862a97a25f589e84fbf1ad93abeb503f325c43a8c0e024ae0e74b48ec42c1cd84e8e423a3a87d25ded4f2 +"@oxc-parser/binding-linux-x64-musl@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-x64-musl@npm:0.127.0" + conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd +"@oxc-parser/binding-openharmony-arm64@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-openharmony-arm64@npm:0.127.0" + conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@polka/url@npm:^1.0.0-next.24": - version: 1.0.0-next.28 - resolution: "@polka/url@npm:1.0.0-next.28" - checksum: 10c0/acc5ea62597e4da2fb42dbee02749d07f102ae7d6d2c966bf7e423c79cd65d1621da305af567e6e7c232f3b565e242d1ec932cbb3dcc0db1508d02e9a2cafa2e +"@oxc-parser/binding-wasm32-wasi@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-wasm32-wasi@npm:0.127.0" + dependencies: + "@emnapi/core": "npm:1.9.2" + "@emnapi/runtime": "npm:1.9.2" + "@napi-rs/wasm-runtime": "npm:^1.1.4" + conditions: cpu=wasm32 languageName: node linkType: hard -"@rolldown/pluginutils@npm:1.0.0-rc.2": - version: 1.0.0-rc.2 - resolution: "@rolldown/pluginutils@npm:1.0.0-rc.2" - checksum: 10c0/35d3dec35e00ab090d5ff8287e27af98a15da897dc8b034fe0e00d03e0931b9e993603c054be9e8925e2bde040c44c18b48cb8aeea6a261fd1c8f46837038927 +"@oxc-parser/binding-win32-arm64-msvc@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-win32-arm64-msvc@npm:0.127.0" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rolldown/pluginutils@npm:1.0.0-rc.3": - version: 1.0.0-rc.3 +"@oxc-parser/binding-win32-ia32-msvc@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-win32-ia32-msvc@npm:0.127.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@oxc-parser/binding-win32-x64-msvc@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-win32-x64-msvc@npm:0.127.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@oxc-project/types@npm:=0.137.0": + version: 0.137.0 + resolution: "@oxc-project/types@npm:0.137.0" + checksum: 10c0/5a6a50174e5ac79aebf38a120fe57be7a84c8bb0c77117f30de15183aa5ab0161e78364d2d3725397090e362e5c5f6eda754b53057b0b63983e3ee604f888aca + languageName: node + linkType: hard + +"@oxc-project/types@npm:^0.127.0": + version: 0.127.0 + resolution: "@oxc-project/types@npm:0.127.0" + checksum: 10c0/52c0947ac64a9ca119fe971f947e784a35ecd14a072fa3f542a58a5f6c42010b53f2bf92731e39b9899b83c990a9517bbd29d1e5a5b7b489e52616685c6a9278 + languageName: node + linkType: hard + +"@oxc-resolver/binding-android-arm-eabi@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-android-arm-eabi@npm:11.21.3" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@oxc-resolver/binding-android-arm64@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-android-arm64@npm:11.21.3" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-darwin-arm64@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-darwin-arm64@npm:11.21.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-darwin-x64@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-darwin-x64@npm:11.21.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-freebsd-x64@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-freebsd-x64@npm:11.21.3" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.21.3" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm-musleabihf@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-linux-arm-musleabihf@npm:11.21.3" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm64-gnu@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-linux-arm64-gnu@npm:11.21.3" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm64-musl@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-linux-arm64-musl@npm:11.21.3" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-ppc64-gnu@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-linux-ppc64-gnu@npm:11.21.3" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-riscv64-gnu@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-linux-riscv64-gnu@npm:11.21.3" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-riscv64-musl@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-linux-riscv64-musl@npm:11.21.3" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-s390x-gnu@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-linux-s390x-gnu@npm:11.21.3" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-x64-gnu@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-linux-x64-gnu@npm:11.21.3" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-x64-musl@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-linux-x64-musl@npm:11.21.3" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-openharmony-arm64@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-openharmony-arm64@npm:11.21.3" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-wasm32-wasi@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-wasm32-wasi@npm:11.21.3" + dependencies: + "@emnapi/core": "npm:1.11.0" + "@emnapi/runtime": "npm:1.11.0" + "@napi-rs/wasm-runtime": "npm:^1.1.5" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@oxc-resolver/binding-win32-arm64-msvc@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-win32-arm64-msvc@npm:11.21.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-win32-x64-msvc@npm:11.21.3": + version: 11.21.3 + resolution: "@oxc-resolver/binding-win32-x64-msvc@npm:11.21.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-android-arm64@npm:2.5.6": + version: 2.5.6 + resolution: "@parcel/watcher-android-arm64@npm:2.5.6" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-arm64@npm:2.5.6": + version: 2.5.6 + resolution: "@parcel/watcher-darwin-arm64@npm:2.5.6" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-x64@npm:2.5.6": + version: 2.5.6 + resolution: "@parcel/watcher-darwin-x64@npm:2.5.6" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-freebsd-x64@npm:2.5.6": + version: 2.5.6 + resolution: "@parcel/watcher-freebsd-x64@npm:2.5.6" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm-glibc@npm:2.5.6": + version: 2.5.6 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.5.6" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm-musl@npm:2.5.6": + version: 2.5.6 + resolution: "@parcel/watcher-linux-arm-musl@npm:2.5.6" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-glibc@npm:2.5.6": + version: 2.5.6 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.5.6" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-musl@npm:2.5.6": + version: 2.5.6 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.5.6" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-glibc@npm:2.5.6": + version: 2.5.6 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.5.6" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-musl@npm:2.5.6": + version: 2.5.6 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.5.6" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-win32-arm64@npm:2.5.6": + version: 2.5.6 + resolution: "@parcel/watcher-win32-arm64@npm:2.5.6" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-win32-ia32@npm:2.5.6": + version: 2.5.6 + resolution: "@parcel/watcher-win32-ia32@npm:2.5.6" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@parcel/watcher-win32-x64@npm:2.5.6": + version: 2.5.6 + resolution: "@parcel/watcher-win32-x64@npm:2.5.6" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher@npm:^2.4.1": + version: 2.5.6 + resolution: "@parcel/watcher@npm:2.5.6" + dependencies: + "@parcel/watcher-android-arm64": "npm:2.5.6" + "@parcel/watcher-darwin-arm64": "npm:2.5.6" + "@parcel/watcher-darwin-x64": "npm:2.5.6" + "@parcel/watcher-freebsd-x64": "npm:2.5.6" + "@parcel/watcher-linux-arm-glibc": "npm:2.5.6" + "@parcel/watcher-linux-arm-musl": "npm:2.5.6" + "@parcel/watcher-linux-arm64-glibc": "npm:2.5.6" + "@parcel/watcher-linux-arm64-musl": "npm:2.5.6" + "@parcel/watcher-linux-x64-glibc": "npm:2.5.6" + "@parcel/watcher-linux-x64-musl": "npm:2.5.6" + "@parcel/watcher-win32-arm64": "npm:2.5.6" + "@parcel/watcher-win32-ia32": "npm:2.5.6" + "@parcel/watcher-win32-x64": "npm:2.5.6" + detect-libc: "npm:^2.0.3" + is-glob: "npm:^4.0.3" + node-addon-api: "npm:^7.0.0" + node-gyp: "npm:latest" + picomatch: "npm:^4.0.3" + dependenciesMeta: + "@parcel/watcher-android-arm64": + optional: true + "@parcel/watcher-darwin-arm64": + optional: true + "@parcel/watcher-darwin-x64": + optional: true + "@parcel/watcher-freebsd-x64": + optional: true + "@parcel/watcher-linux-arm-glibc": + optional: true + "@parcel/watcher-linux-arm-musl": + optional: true + "@parcel/watcher-linux-arm64-glibc": + optional: true + "@parcel/watcher-linux-arm64-musl": + optional: true + "@parcel/watcher-linux-x64-glibc": + optional: true + "@parcel/watcher-linux-x64-musl": + optional: true + "@parcel/watcher-win32-arm64": + optional: true + "@parcel/watcher-win32-ia32": + optional: true + "@parcel/watcher-win32-x64": + optional: true + checksum: 10c0/1e1d91f92e94e4640089a7cead243b2b81ca9aa8e1c862a97a25f589e84fbf1ad93abeb503f325c43a8c0e024ae0e74b48ec42c1cd84e8e423a3a87d25ded4f2 + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"@polka/url@npm:^1.0.0-next.24": + version: 1.0.0-next.28 + resolution: "@polka/url@npm:1.0.0-next.28" + checksum: 10c0/acc5ea62597e4da2fb42dbee02749d07f102ae7d6d2c966bf7e423c79cd65d1621da305af567e6e7c232f3b565e242d1ec932cbb3dcc0db1508d02e9a2cafa2e + languageName: node + linkType: hard + +"@rolldown/binding-android-arm64@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-android-arm64@npm:1.1.3" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-darwin-arm64@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-darwin-arm64@npm:1.1.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-darwin-x64@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-darwin-x64@npm:1.1.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-freebsd-x64@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-freebsd-x64@npm:1.1.3" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm-gnueabihf@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.1.3" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm64-gnu@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.1.3" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm64-musl@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-linux-arm64-musl@npm:1.1.3" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rolldown/binding-linux-ppc64-gnu@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.1.3" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-s390x-gnu@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.1.3" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-x64-gnu@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-linux-x64-gnu@npm:1.1.3" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-x64-musl@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-linux-x64-musl@npm:1.1.3" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rolldown/binding-openharmony-arm64@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-openharmony-arm64@npm:1.1.3" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-wasm32-wasi@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-wasm32-wasi@npm:1.1.3" + dependencies: + "@emnapi/core": "npm:1.11.1" + "@emnapi/runtime": "npm:1.11.1" + "@napi-rs/wasm-runtime": "npm:^1.1.6" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@rolldown/binding-win32-arm64-msvc@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.1.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-win32-x64-msvc@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-win32-x64-msvc@npm:1.1.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/pluginutils@npm:1.0.0-rc.2": + version: 1.0.0-rc.2 + resolution: "@rolldown/pluginutils@npm:1.0.0-rc.2" + checksum: 10c0/35d3dec35e00ab090d5ff8287e27af98a15da897dc8b034fe0e00d03e0931b9e993603c054be9e8925e2bde040c44c18b48cb8aeea6a261fd1c8f46837038927 + languageName: node + linkType: hard + +"@rolldown/pluginutils@npm:1.0.0-rc.3": + version: 1.0.0-rc.3 resolution: "@rolldown/pluginutils@npm:1.0.0-rc.3" checksum: 10c0/3928b6282a30f307d1b075d2f217180ae173ea9e00638ce46ab65f089bd5f7a0b2c488ae1ce530f509387793c656a2910337c4cd68fa9d37d7e439365989e699 languageName: node linkType: hard +"@rolldown/pluginutils@npm:^1.0.0": + version: 1.0.1 + resolution: "@rolldown/pluginutils@npm:1.0.1" + checksum: 10c0/99d9b06d90196823e4d8c841f258db7a16e5dbba5824a2962b05d907b79f1ba929d56f22dd744fd530936e568c865ee56a719dc31e57e13bc0a8eb4764a8d8dd + languageName: node + linkType: hard + "@rollup/pluginutils@npm:^5.0.2": version: 5.1.0 resolution: "@rollup/pluginutils@npm:5.1.0" @@ -2018,177 +2606,177 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.58.0" +"@rollup/rollup-android-arm-eabi@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.62.2" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-android-arm64@npm:4.58.0" +"@rollup/rollup-android-arm64@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-android-arm64@npm:4.62.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.58.0" +"@rollup/rollup-darwin-arm64@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-darwin-arm64@npm:4.62.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.58.0" +"@rollup/rollup-darwin-x64@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-darwin-x64@npm:4.62.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.58.0" +"@rollup/rollup-freebsd-arm64@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.62.2" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-freebsd-x64@npm:4.58.0" +"@rollup/rollup-freebsd-x64@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-freebsd-x64@npm:4.62.2" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.58.0" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.62.2" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.58.0" +"@rollup/rollup-linux-arm-musleabihf@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.62.2" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.58.0" +"@rollup/rollup-linux-arm64-gnu@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.62.2" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.58.0" +"@rollup/rollup-linux-arm64-musl@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.62.2" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-loong64-gnu@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.58.0" +"@rollup/rollup-linux-loong64-gnu@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.62.2" conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-loong64-musl@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-linux-loong64-musl@npm:4.58.0" +"@rollup/rollup-linux-loong64-musl@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-linux-loong64-musl@npm:4.62.2" conditions: os=linux & cpu=loong64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-ppc64-gnu@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.58.0" +"@rollup/rollup-linux-ppc64-gnu@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.62.2" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-ppc64-musl@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-linux-ppc64-musl@npm:4.58.0" +"@rollup/rollup-linux-ppc64-musl@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-linux-ppc64-musl@npm:4.62.2" conditions: os=linux & cpu=ppc64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.58.0" +"@rollup/rollup-linux-riscv64-gnu@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.62.2" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-musl@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.58.0" +"@rollup/rollup-linux-riscv64-musl@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.62.2" conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.58.0" +"@rollup/rollup-linux-s390x-gnu@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.62.2" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.58.0" +"@rollup/rollup-linux-x64-gnu@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.62.2" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.58.0" +"@rollup/rollup-linux-x64-musl@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.62.2" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-openbsd-x64@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-openbsd-x64@npm:4.58.0" +"@rollup/rollup-openbsd-x64@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-openbsd-x64@npm:4.62.2" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-openharmony-arm64@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-openharmony-arm64@npm:4.58.0" +"@rollup/rollup-openharmony-arm64@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.62.2" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.58.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.62.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.58.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.62.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-gnu@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-win32-x64-gnu@npm:4.58.0" +"@rollup/rollup-win32-x64-gnu@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-win32-x64-gnu@npm:4.62.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.58.0": - version: 4.58.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.58.0" +"@rollup/rollup-win32-x64-msvc@npm:4.62.2": + version: 4.62.2 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.62.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2200,7 +2788,14 @@ __metadata: languageName: node linkType: hard -"@standard-schema/spec@npm:^1.0.0": +"@simple-libs/stream-utils@npm:^1.2.0": + version: 1.2.0 + resolution: "@simple-libs/stream-utils@npm:1.2.0" + checksum: 10c0/2788ac7b167d1b6c81b8c6fae2f5d9688b1f02ab31e9e15b33c9dc2ae920cf7de87869de10679be8957f9adb645c91c8919e271f3e34b6b4ec56daf725522dc7 + languageName: node + linkType: hard + +"@standard-schema/spec@npm:^1.1.0": version: 1.1.0 resolution: "@standard-schema/spec@npm:1.1.0" checksum: 10c0/d90f55acde4b2deb983529c87e8025fa693de1a5e8b49ecc6eb84d1fd96328add0e03d7d551442156c7432fd78165b2c26ff561b970a9a881f046abb78d6a526 @@ -2316,6 +2911,15 @@ __metadata: languageName: node linkType: hard +"@storybook/icons@npm:^2.0.2": + version: 2.1.0 + resolution: "@storybook/icons@npm:2.1.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/73614dbb3e9c4756a6838525a6c78f85b24a5a09782512a39f24fe5a435992d6af92591ce18ac7a9a08c14aec10c08b158f68126aa29125058e01169c827bed6 + languageName: node + linkType: hard + "@storybook/react-dom-shim@npm:10.2.10": version: 10.2.10 resolution: "@storybook/react-dom-shim@npm:10.2.10" @@ -2558,7 +3162,7 @@ __metadata: languageName: node linkType: hard -"@testing-library/jest-dom@npm:^6.6.3, @testing-library/jest-dom@npm:^6.9.1": +"@testing-library/jest-dom@npm:^6.9.1": version: 6.9.1 resolution: "@testing-library/jest-dom@npm:6.9.1" dependencies: @@ -2618,13 +3222,6 @@ __metadata: languageName: node linkType: hard -"@trysound/sax@npm:0.2.0": - version: 0.2.0 - resolution: "@trysound/sax@npm:0.2.0" - checksum: 10c0/44907308549ce775a41c38a815f747009ac45929a45d642b836aa6b0a536e4978d30b8d7d680bbd116e9dd73b7dbe2ef0d1369dcfc2d09e83ba381e485ecbe12 - languageName: node - linkType: hard - "@tsconfig/node10@npm:^1.0.7": version: 1.0.9 resolution: "@tsconfig/node10@npm:1.0.9" @@ -2653,6 +3250,15 @@ __metadata: languageName: node linkType: hard +"@tybys/wasm-util@npm:^0.10.3": + version: 0.10.3 + resolution: "@tybys/wasm-util@npm:0.10.3" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/fd2bd2a79c6cd8c79ed1cf7a0fa375c64589264c88a27acaf9756d556b453ea222b62a4f68dd2fbb8b3a78b6bab3b1f4fb2431b6afc6aeda8344b53a521a1cd3 + languageName: node + linkType: hard + "@types/aria-query@npm:^5.0.1": version: 5.0.4 resolution: "@types/aria-query@npm:5.0.4" @@ -2741,10 +3347,10 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.8, @types/estree@npm:^1.0.8": - version: 1.0.8 - resolution: "@types/estree@npm:1.0.8" - checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 +"@types/estree@npm:1.0.9": + version: 1.0.9 + resolution: "@types/estree@npm:1.0.9" + checksum: 10c0/3ad3286ca2988cd550dafb8f2ad599c8474868e954fa601a36655bdfefd8039f7c714b8c1c7f2ae219ffbd58bd4660e66fa7479a0120fc02d4777057d4865387 languageName: node linkType: hard @@ -2762,6 +3368,20 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:^1.0.8": + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 + languageName: node + linkType: hard + +"@types/jsesc@npm:^2.5.0": + version: 2.5.1 + resolution: "@types/jsesc@npm:2.5.1" + checksum: 10c0/12ba7bf5968aeeb36408269f4b5a39718efc6411fa197cf0f5e967ba36ad7b7d555b78787fc480db43ce63ebe6ab0ffe5fd9f64b1ea3b0d073877f0747491b30 + languageName: node + linkType: hard + "@types/json-schema@npm:^7.0.15": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" @@ -2864,7 +3484,27 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.56.0, @typescript-eslint/eslint-plugin@npm:^8.56.0": +"@typescript-eslint/eslint-plugin@npm:8.62.0": + version: 8.62.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.62.0" + dependencies: + "@eslint-community/regexpp": "npm:^4.12.2" + "@typescript-eslint/scope-manager": "npm:8.62.0" + "@typescript-eslint/type-utils": "npm:8.62.0" + "@typescript-eslint/utils": "npm:8.62.0" + "@typescript-eslint/visitor-keys": "npm:8.62.0" + ignore: "npm:^7.0.5" + natural-compare: "npm:^1.4.0" + ts-api-utils: "npm:^2.5.0" + peerDependencies: + "@typescript-eslint/parser": ^8.62.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/2f257bb53a3b9b8b6f56f6b85c68ce193c7ba4cddf7d2d1995b0aec0591230859f808b3a1a85f0b7ed581f938a88efeacccc730aec307e80e1c14fc669222f9a + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^8.56.0": version: 8.56.0 resolution: "@typescript-eslint/eslint-plugin@npm:8.56.0" dependencies: @@ -2884,7 +3524,23 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.56.0, @typescript-eslint/parser@npm:^8.56.0": +"@typescript-eslint/parser@npm:8.62.0": + version: 8.62.0 + resolution: "@typescript-eslint/parser@npm:8.62.0" + dependencies: + "@typescript-eslint/scope-manager": "npm:8.62.0" + "@typescript-eslint/types": "npm:8.62.0" + "@typescript-eslint/typescript-estree": "npm:8.62.0" + "@typescript-eslint/visitor-keys": "npm:8.62.0" + debug: "npm:^4.4.3" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/eab526557fb679c862a0462e841581e3ca24a88b8f19764630e7d10e01ba01143906100a051c8bede36e3c6eb6bef21c14ac7dccf9d41e04c84448c058450a94 + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^8.56.0": version: 8.56.0 resolution: "@typescript-eslint/parser@npm:8.56.0" dependencies: @@ -2913,6 +3569,19 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/project-service@npm:8.62.0": + version: 8.62.0 + resolution: "@typescript-eslint/project-service@npm:8.62.0" + dependencies: + "@typescript-eslint/tsconfig-utils": "npm:^8.62.0" + "@typescript-eslint/types": "npm:^8.62.0" + debug: "npm:^4.4.3" + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/4369e9ec0c8b2ce6e6cf90142ad781ef99b57350beb4ae48751871e8894e95a8f929de2f56d73849ec0166d2cdb345e3e7a42d30ea8463d3f1b65607648ac582 + languageName: node + linkType: hard + "@typescript-eslint/scope-manager@npm:8.56.0": version: 8.56.0 resolution: "@typescript-eslint/scope-manager@npm:8.56.0" @@ -2923,6 +3592,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:8.62.0": + version: 8.62.0 + resolution: "@typescript-eslint/scope-manager@npm:8.62.0" + dependencies: + "@typescript-eslint/types": "npm:8.62.0" + "@typescript-eslint/visitor-keys": "npm:8.62.0" + checksum: 10c0/1e7192b6bf18955ee76861321a92e08815f1bc3feab23861b6330dde8343dfb346a47c7c8bf3d94b0897a98184adcf283568b5857a0e5d509ce0c21c6cf4cc44 + languageName: node + linkType: hard + "@typescript-eslint/tsconfig-utils@npm:8.56.0, @typescript-eslint/tsconfig-utils@npm:^8.56.0": version: 8.56.0 resolution: "@typescript-eslint/tsconfig-utils@npm:8.56.0" @@ -2932,6 +3611,15 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/tsconfig-utils@npm:8.62.0, @typescript-eslint/tsconfig-utils@npm:^8.62.0": + version: 8.62.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.62.0" + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/9423908009e95b8bba8ac2ad1e4bf4bc9dd7052fa44be613659f81aad363787bf7fa1ea017eb9dcb059fed41866bc2d8e50f1cf41c7dfad25a4431c333fbf2fa + languageName: node + linkType: hard + "@typescript-eslint/type-utils@npm:8.56.0": version: 8.56.0 resolution: "@typescript-eslint/type-utils@npm:8.56.0" @@ -2948,6 +3636,22 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/type-utils@npm:8.62.0": + version: 8.62.0 + resolution: "@typescript-eslint/type-utils@npm:8.62.0" + dependencies: + "@typescript-eslint/types": "npm:8.62.0" + "@typescript-eslint/typescript-estree": "npm:8.62.0" + "@typescript-eslint/utils": "npm:8.62.0" + debug: "npm:^4.4.3" + ts-api-utils: "npm:^2.5.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/caf6a0072ff48e9351564dbc856c095fd5233bf2176daf9e8361a534be9ded6835c984ff8867365ca3cba158189074b14cc199b19c1a2e20d09682170c3784db + languageName: node + linkType: hard + "@typescript-eslint/types@npm:8.56.0, @typescript-eslint/types@npm:^8.56.0": version: 8.56.0 resolution: "@typescript-eslint/types@npm:8.56.0" @@ -2955,6 +3659,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:8.62.0, @typescript-eslint/types@npm:^8.62.0": + version: 8.62.0 + resolution: "@typescript-eslint/types@npm:8.62.0" + checksum: 10c0/28d7a6851cb79301ef1ee004fb8d75811e52eb2a7258d7f8ad2f234886ab2faaf1888cbf5a71cb53afd4d1024c51f71ea359f3103ea70d6f7ccd626ffbfd49c1 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:8.56.0": version: 8.56.0 resolution: "@typescript-eslint/typescript-estree@npm:8.56.0" @@ -2974,6 +3685,25 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:8.62.0": + version: 8.62.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.62.0" + dependencies: + "@typescript-eslint/project-service": "npm:8.62.0" + "@typescript-eslint/tsconfig-utils": "npm:8.62.0" + "@typescript-eslint/types": "npm:8.62.0" + "@typescript-eslint/visitor-keys": "npm:8.62.0" + debug: "npm:^4.4.3" + minimatch: "npm:^10.2.2" + semver: "npm:^7.7.3" + tinyglobby: "npm:^0.2.15" + ts-api-utils: "npm:^2.5.0" + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/c1b76203f37870e66487379c75b1d1a9af0a9c88e8e58a3d2fc106427ce42dce9bd7358a3d2cb7d344004cbb693dba899abf19391d853bbb9f345aa8683635c4 + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:8.56.0, @typescript-eslint/utils@npm:^8.48.0": version: 8.56.0 resolution: "@typescript-eslint/utils@npm:8.56.0" @@ -2989,6 +3719,21 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/utils@npm:8.62.0": + version: 8.62.0 + resolution: "@typescript-eslint/utils@npm:8.62.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.9.1" + "@typescript-eslint/scope-manager": "npm:8.62.0" + "@typescript-eslint/types": "npm:8.62.0" + "@typescript-eslint/typescript-estree": "npm:8.62.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/5c5d1dd2c37d43ec913e4d144d071058701bf3548733671a05025fae306f7afdc4fdc3d9867d0eae32537eb68ecba046ab8aa6111a5d97497ec78fee98a25809 + languageName: node + linkType: hard + "@typescript-eslint/visitor-keys@npm:8.56.0": version: 8.56.0 resolution: "@typescript-eslint/visitor-keys@npm:8.56.0" @@ -2999,6 +3744,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:8.62.0": + version: 8.62.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.62.0" + dependencies: + "@typescript-eslint/types": "npm:8.62.0" + eslint-visitor-keys: "npm:^5.0.0" + checksum: 10c0/29102828fab6b060e607effee0d7666bc82aef269241c7c5c44ffb3386b3cb69ea585bf7c5d88d428c489f46d5888cbe90677e15cbad8cb27acfa1fc1661bd5b + languageName: node + linkType: hard + "@vitejs/plugin-react@npm:^5.1.4": version: 5.1.4 resolution: "@vitejs/plugin-react@npm:5.1.4" @@ -3027,58 +3782,58 @@ __metadata: languageName: node linkType: hard -"@vitest/browser-playwright@npm:^4.0.18": - version: 4.0.18 - resolution: "@vitest/browser-playwright@npm:4.0.18" +"@vitest/browser-playwright@npm:^4.1.9": + version: 4.1.9 + resolution: "@vitest/browser-playwright@npm:4.1.9" dependencies: - "@vitest/browser": "npm:4.0.18" - "@vitest/mocker": "npm:4.0.18" - tinyrainbow: "npm:^3.0.3" + "@vitest/browser": "npm:4.1.9" + "@vitest/mocker": "npm:4.1.9" + tinyrainbow: "npm:^3.1.0" peerDependencies: playwright: "*" - vitest: 4.0.18 + vitest: 4.1.9 peerDependenciesMeta: playwright: optional: false - checksum: 10c0/505fafe6f957d020b74914ed328de57cba0be65ff82810da85297523776a0d7389669660e58734a416fc09ce262632b4d2cf257a9e8ab1115b695d133bba7bb5 + checksum: 10c0/4c042c980bb0aa950646d4d1f0f131f44156141d86f54eb96f5f69863ed05720cac7ef1a0901ab71e18929a62c41e5d64a428b2612ea708905bf423ff961dcf4 languageName: node linkType: hard -"@vitest/browser@npm:4.0.18, @vitest/browser@npm:^4.0.18": - version: 4.0.18 - resolution: "@vitest/browser@npm:4.0.18" +"@vitest/browser@npm:4.1.9, @vitest/browser@npm:^4.1.9": + version: 4.1.9 + resolution: "@vitest/browser@npm:4.1.9" dependencies: - "@vitest/mocker": "npm:4.0.18" - "@vitest/utils": "npm:4.0.18" + "@blazediff/core": "npm:1.9.1" + "@vitest/mocker": "npm:4.1.9" + "@vitest/utils": "npm:4.1.9" magic-string: "npm:^0.30.21" - pixelmatch: "npm:7.1.0" pngjs: "npm:^7.0.0" sirv: "npm:^3.0.2" - tinyrainbow: "npm:^3.0.3" - ws: "npm:^8.18.3" + tinyrainbow: "npm:^3.1.0" + ws: "npm:^8.19.0" peerDependencies: - vitest: 4.0.18 - checksum: 10c0/6b7bda92fa2e8c68de3e51c97322161484c3f1dd7a7417cdeabb4f1d98eab7dba96c156ac4282ea537c58d55cc0e5959abb4b9d90d3823b3cc3071c3f7460633 + vitest: 4.1.9 + checksum: 10c0/9ff634e56b0bd5a3727f2eec7666f97a089b92fb596d5b9e4fbe2a2e4fd988aa7a7bd2a7b98d7cf14790717db69db8f72bae6dc007f2fac613b9bb93d8e8edfb languageName: node linkType: hard -"@vitest/coverage-istanbul@npm:^4.0.18": - version: 4.0.18 - resolution: "@vitest/coverage-istanbul@npm:4.0.18" +"@vitest/coverage-istanbul@npm:^4.1.9": + version: 4.1.9 + resolution: "@vitest/coverage-istanbul@npm:4.1.9" dependencies: + "@babel/core": "npm:^7.29.0" "@istanbuljs/schema": "npm:^0.1.3" "@jridgewell/gen-mapping": "npm:^0.3.13" "@jridgewell/trace-mapping": "npm:0.3.31" istanbul-lib-coverage: "npm:^3.2.2" - istanbul-lib-instrument: "npm:^6.0.3" istanbul-lib-report: "npm:^3.0.1" istanbul-reports: "npm:^3.2.0" - magicast: "npm:^0.5.1" + magicast: "npm:^0.5.2" obug: "npm:^2.1.1" - tinyrainbow: "npm:^3.0.3" + tinyrainbow: "npm:^3.1.0" peerDependencies: - vitest: 4.0.18 - checksum: 10c0/e0302c1d86a47028b7f465b70b07762df28463957a2b08491fc625dc077661f1bf680a94acef596cd193fe6d53fd51380ec2f022f63f70d3cb7644c26eac066e + vitest: 4.1.9 + checksum: 10c0/f66aa033a17cc31e8fef9cf860f8b822ee444d66570c2b9303d6e272125a377dc322a1f17eeafb066327f12e2d7fd137590227ad5d2aca92c6f032643b2eb654 languageName: node linkType: hard @@ -3095,36 +3850,36 @@ __metadata: languageName: node linkType: hard -"@vitest/expect@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/expect@npm:4.0.18" +"@vitest/expect@npm:4.1.9": + version: 4.1.9 + resolution: "@vitest/expect@npm:4.1.9" dependencies: - "@standard-schema/spec": "npm:^1.0.0" + "@standard-schema/spec": "npm:^1.1.0" "@types/chai": "npm:^5.2.2" - "@vitest/spy": "npm:4.0.18" - "@vitest/utils": "npm:4.0.18" - chai: "npm:^6.2.1" - tinyrainbow: "npm:^3.0.3" - checksum: 10c0/123b0aa111682e82ec5289186df18037b1a1768700e468ee0f9879709aaa320cf790463c15c0d8ee10df92b402f4394baf5d27797e604d78e674766d87bcaadc + "@vitest/spy": "npm:4.1.9" + "@vitest/utils": "npm:4.1.9" + chai: "npm:^6.2.2" + tinyrainbow: "npm:^3.1.0" + checksum: 10c0/243bacaed2cba5e0ea4ec7465662fcec465a358a0e06381e337fac49426aa67a73b104fbb9d65d8bccadfba8f70e27f57ffb897aacfa140f579a556367357875 languageName: node linkType: hard -"@vitest/mocker@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/mocker@npm:4.0.18" +"@vitest/mocker@npm:4.1.9": + version: 4.1.9 + resolution: "@vitest/mocker@npm:4.1.9" dependencies: - "@vitest/spy": "npm:4.0.18" + "@vitest/spy": "npm:4.1.9" estree-walker: "npm:^3.0.3" magic-string: "npm:^0.30.21" peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - checksum: 10c0/fb0a257e7e167759d4ad228d53fa7bad2267586459c4a62188f2043dd7163b4b02e1e496dc3c227837f776e7d73d6c4343613e89e7da379d9d30de8260f1ee4b + checksum: 10c0/707353b7435bbfd441cc754e4ee7bc5921b70d07b051c6e414b6bbe4ca369154702b0ddeb603389469fe87ca1983e002eb2d55044582661f54a1945dd27e5c82 languageName: node linkType: hard @@ -3137,33 +3892,34 @@ __metadata: languageName: node linkType: hard -"@vitest/pretty-format@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/pretty-format@npm:4.0.18" +"@vitest/pretty-format@npm:4.1.9": + version: 4.1.9 + resolution: "@vitest/pretty-format@npm:4.1.9" dependencies: - tinyrainbow: "npm:^3.0.3" - checksum: 10c0/0086b8c88eeca896d8e4b98fcdef452c8041a1b63eb9e85d3e0bcc96c8aa76d8e9e0b6990ebb0bb0a697c4ebab347e7735888b24f507dbff2742ddce7723fd94 + tinyrainbow: "npm:^3.1.0" + checksum: 10c0/5b96295f25ab885616230ad1355fc82f490bebb39cc707688d7c8969c08270d7e076ed8a10af4e762ed57145193c6061a1f549f136f0ded344f8db0c2b3fb3de languageName: node linkType: hard -"@vitest/runner@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/runner@npm:4.0.18" +"@vitest/runner@npm:4.1.9": + version: 4.1.9 + resolution: "@vitest/runner@npm:4.1.9" dependencies: - "@vitest/utils": "npm:4.0.18" + "@vitest/utils": "npm:4.1.9" pathe: "npm:^2.0.3" - checksum: 10c0/fdb4afa411475133c05ba266c8092eaf1e56cbd5fb601f92ec6ccb9bab7ca52e06733ee8626599355cba4ee71cb3a8f28c84d3b69dc972e41047edc50229bc01 + checksum: 10c0/d206b4891a64b1f55c346f832b0a7b489108094d8ae34438d3b53e78be7b45b139fa95ffa027c98c357bd532268ee573168de1943235b7eed32a9236ed5978bb languageName: node linkType: hard -"@vitest/snapshot@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/snapshot@npm:4.0.18" +"@vitest/snapshot@npm:4.1.9": + version: 4.1.9 + resolution: "@vitest/snapshot@npm:4.1.9" dependencies: - "@vitest/pretty-format": "npm:4.0.18" + "@vitest/pretty-format": "npm:4.1.9" + "@vitest/utils": "npm:4.1.9" magic-string: "npm:^0.30.21" pathe: "npm:^2.0.3" - checksum: 10c0/d3bfefa558db9a69a66886ace6575eb96903a5ba59f4d9a5d0fecb4acc2bb8dbb443ef409f5ac1475f2e1add30bd1d71280f98912da35e89c75829df9e84ea43 + checksum: 10c0/c3099df12ad1f9c1e180441856c9eb82f1990f87ff16aafedd6fa19978eaff20bc59220b692a99fcc822daef86eab256ba3dadb49544b7bd625b57c49cd9d995 languageName: node linkType: hard @@ -3176,27 +3932,27 @@ __metadata: languageName: node linkType: hard -"@vitest/spy@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/spy@npm:4.0.18" - checksum: 10c0/6de537890b3994fcadb8e8d8ac05942320ae184f071ec395d978a5fba7fa928cbb0c5de85af86a1c165706c466e840de8779eaff8c93450c511c7abaeb9b8a4e +"@vitest/spy@npm:4.1.9": + version: 4.1.9 + resolution: "@vitest/spy@npm:4.1.9" + checksum: 10c0/e51f328f55b76e8ba66e5e18f183484a8dc0a092685b101112d3e9fb8e989ddca162c98ddf00254476502c25bc05c4ec1e277fd6ad8bfc702464c08f6b5dd115 languageName: node linkType: hard -"@vitest/ui@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/ui@npm:4.0.18" +"@vitest/ui@npm:^4.1.9": + version: 4.1.9 + resolution: "@vitest/ui@npm:4.1.9" dependencies: - "@vitest/utils": "npm:4.0.18" + "@vitest/utils": "npm:4.1.9" fflate: "npm:^0.8.2" - flatted: "npm:^3.3.3" + flatted: "npm:^3.4.2" pathe: "npm:^2.0.3" sirv: "npm:^3.0.2" tinyglobby: "npm:^0.2.15" - tinyrainbow: "npm:^3.0.3" + tinyrainbow: "npm:^3.1.0" peerDependencies: - vitest: 4.0.18 - checksum: 10c0/25ed45b52948101ba5c641aeb84126ce695d067984b8430f797498f7e3aeee53c5392e9e14290744a68b5114cfe933e84675b85340204cdbd118079217985157 + vitest: 4.1.9 + checksum: 10c0/9c480d79a61ebe40552ab4f1fa2a15dad0147d9c5e40186cb210f2199a0bfd886cd34e9ac11b1ef4ff0bf3436be46f5652c3f36200cdb278dfd2b3634996e50a languageName: node linkType: hard @@ -3211,13 +3967,14 @@ __metadata: languageName: node linkType: hard -"@vitest/utils@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/utils@npm:4.0.18" +"@vitest/utils@npm:4.1.9": + version: 4.1.9 + resolution: "@vitest/utils@npm:4.1.9" dependencies: - "@vitest/pretty-format": "npm:4.0.18" - tinyrainbow: "npm:^3.0.3" - checksum: 10c0/4a3c43c1421eb90f38576926496f6c80056167ba111e63f77cf118983902673737a1a38880b890d7c06ec0a12475024587344ee502b3c43093781533022f2aeb + "@vitest/pretty-format": "npm:4.1.9" + convert-source-map: "npm:^2.0.0" + tinyrainbow: "npm:^3.1.0" + checksum: 10c0/d55506c077fd72c091eb66f02926f0abf72801c87a085f565698289562f47befa114ae2c680ab8736dfe46abab0cfd6b8031f2ac519bafeb37578aa6e5ad03c5 languageName: node linkType: hard @@ -3239,7 +3996,7 @@ __metadata: languageName: node linkType: hard -"@volar/language-core@npm:2.4.5, @volar/language-core@npm:~2.4.1": +"@volar/language-core@npm:2.4.5": version: 2.4.5 resolution: "@volar/language-core@npm:2.4.5" dependencies: @@ -3321,25 +4078,14 @@ __metadata: languageName: node linkType: hard -"@volar/typescript@npm:2.4.28": - version: 2.4.28 - resolution: "@volar/typescript@npm:2.4.28" - dependencies: - "@volar/language-core": "npm:2.4.28" - path-browserify: "npm:^1.0.1" - vscode-uri: "npm:^3.0.8" - checksum: 10c0/075c890b9ec1cb17f17e38aaed035f8ee7d507439e87270d8e3c394356fc9387fd0bda9ec1069b36ea4c378d9375a08f5bc64c063a83427010ddd86d472124fc - languageName: node - linkType: hard - -"@volar/typescript@npm:~2.4.1": - version: 2.4.5 - resolution: "@volar/typescript@npm:2.4.5" +"@volar/typescript@npm:2.4.28": + version: 2.4.28 + resolution: "@volar/typescript@npm:2.4.28" dependencies: - "@volar/language-core": "npm:2.4.5" + "@volar/language-core": "npm:2.4.28" path-browserify: "npm:^1.0.1" vscode-uri: "npm:^3.0.8" - checksum: 10c0/c29acf9ed78c83f1f8bc579d7fff7f5d52d4021cb4f6a72f14832ba8b957c29511711c78a796ca57bd1ee4ef475659a58b0de4948d29c4d1217cc08f0bf181ff + checksum: 10c0/075c890b9ec1cb17f17e38aaed035f8ee7d507439e87270d8e3c394356fc9387fd0bda9ec1069b36ea4c378d9375a08f5bc64c063a83427010ddd86d472124fc languageName: node linkType: hard @@ -3420,7 +4166,20 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-dom@npm:3.5.10, @vue/compiler-dom@npm:^3.2.0, @vue/compiler-dom@npm:^3.4.0": +"@vue/compiler-core@npm:3.5.39": + version: 3.5.39 + resolution: "@vue/compiler-core@npm:3.5.39" + dependencies: + "@babel/parser": "npm:^7.29.7" + "@vue/shared": "npm:3.5.39" + entities: "npm:^7.0.1" + estree-walker: "npm:^2.0.2" + source-map-js: "npm:^1.2.1" + checksum: 10c0/97592f35505713b2024e92cf58806db0abe5519a1462c06269f71cb8ddcefa9ce680d192ddfa3ef456c741c91fb3955f2e414a27dd40ad1e145b8f051b389988 + languageName: node + linkType: hard + +"@vue/compiler-dom@npm:3.5.10, @vue/compiler-dom@npm:^3.2.0": version: 3.5.10 resolution: "@vue/compiler-dom@npm:3.5.10" dependencies: @@ -3440,6 +4199,16 @@ __metadata: languageName: node linkType: hard +"@vue/compiler-dom@npm:3.5.39": + version: 3.5.39 + resolution: "@vue/compiler-dom@npm:3.5.39" + dependencies: + "@vue/compiler-core": "npm:3.5.39" + "@vue/shared": "npm:3.5.39" + checksum: 10c0/0e3fb865209b918bb59d19d1b9d8349c6474dcae977fb74a264481d9af45f65632752c7ae42a7dd552e9b6de0612678bef4db713a5f8afacaab12e17b1c5bbb6 + languageName: node + linkType: hard + "@vue/compiler-dom@npm:^3.5.0": version: 3.5.13 resolution: "@vue/compiler-dom@npm:3.5.13" @@ -3450,20 +4219,20 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-sfc@npm:3.5.28, @vue/compiler-sfc@npm:^3.5.22, @vue/compiler-sfc@npm:^3.5.28": - version: 3.5.28 - resolution: "@vue/compiler-sfc@npm:3.5.28" +"@vue/compiler-sfc@npm:3.5.39, @vue/compiler-sfc@npm:^3.5.39": + version: 3.5.39 + resolution: "@vue/compiler-sfc@npm:3.5.39" dependencies: - "@babel/parser": "npm:^7.29.0" - "@vue/compiler-core": "npm:3.5.28" - "@vue/compiler-dom": "npm:3.5.28" - "@vue/compiler-ssr": "npm:3.5.28" - "@vue/shared": "npm:3.5.28" + "@babel/parser": "npm:^7.29.7" + "@vue/compiler-core": "npm:3.5.39" + "@vue/compiler-dom": "npm:3.5.39" + "@vue/compiler-ssr": "npm:3.5.39" + "@vue/shared": "npm:3.5.39" estree-walker: "npm:^2.0.2" magic-string: "npm:^0.30.21" - postcss: "npm:^8.5.6" + postcss: "npm:^8.5.15" source-map-js: "npm:^1.2.1" - checksum: 10c0/9277cbb63d689fdfa24a85c6b485515e4aa144190da4ab8adbd668c9367b17ffdf57ef88a06b1ca1035a0811168ed1093c0382d52eaf3d5e6abc64d508a5f067 + checksum: 10c0/1361005ef5b66622c2762211c6a9c96c53a106894b8ac9f7ff4dc9fa99453010ab48cafce45f5f799a599ac0b56abffb4232391abd87397c1a2c16514321fe8f languageName: node linkType: hard @@ -3484,6 +4253,23 @@ __metadata: languageName: node linkType: hard +"@vue/compiler-sfc@npm:^3.5.22": + version: 3.5.28 + resolution: "@vue/compiler-sfc@npm:3.5.28" + dependencies: + "@babel/parser": "npm:^7.29.0" + "@vue/compiler-core": "npm:3.5.28" + "@vue/compiler-dom": "npm:3.5.28" + "@vue/compiler-ssr": "npm:3.5.28" + "@vue/shared": "npm:3.5.28" + estree-walker: "npm:^2.0.2" + magic-string: "npm:^0.30.21" + postcss: "npm:^8.5.6" + source-map-js: "npm:^1.2.1" + checksum: 10c0/9277cbb63d689fdfa24a85c6b485515e4aa144190da4ab8adbd668c9367b17ffdf57ef88a06b1ca1035a0811168ed1093c0382d52eaf3d5e6abc64d508a5f067 + languageName: node + linkType: hard + "@vue/compiler-ssr@npm:3.5.10": version: 3.5.10 resolution: "@vue/compiler-ssr@npm:3.5.10" @@ -3504,6 +4290,16 @@ __metadata: languageName: node linkType: hard +"@vue/compiler-ssr@npm:3.5.39": + version: 3.5.39 + resolution: "@vue/compiler-ssr@npm:3.5.39" + dependencies: + "@vue/compiler-dom": "npm:3.5.39" + "@vue/shared": "npm:3.5.39" + checksum: 10c0/df61df18154d9208795c762044e819b9711726b11fff36b9580fa136f51eae8b80e88c9b34924a23fc3b127f11ccd231124a5f2e7b41696ad9778bfffb167d5a + languageName: node + linkType: hard + "@vue/compiler-vue2@npm:^2.7.16": version: 2.7.16 resolution: "@vue/compiler-vue2@npm:2.7.16" @@ -3514,57 +4310,31 @@ __metadata: languageName: node linkType: hard -"@vue/devtools-api@npm:^8.0.6": - version: 8.0.6 - resolution: "@vue/devtools-api@npm:8.0.6" +"@vue/devtools-api@npm:^8.1.2": + version: 8.1.5 + resolution: "@vue/devtools-api@npm:8.1.5" dependencies: - "@vue/devtools-kit": "npm:^8.0.6" - checksum: 10c0/cb6d2075e769652f8963f7485d1824ff859b28aa3e6d9f81f1bdc04f63c26dee869bb41c0ad830643409b905e72014842a0d48ee98cfd29c8105af7b3ff0d22f + "@vue/devtools-kit": "npm:^8.1.5" + checksum: 10c0/ee15daf3de2d52f856b86c6773ecdd86e27e5b4cdc5d92474504a431db2c9dc993165128016f1689b68ac16d13e311a17261f57c48fe46724bfced7005af11e1 languageName: node linkType: hard -"@vue/devtools-kit@npm:^8.0.6": - version: 8.0.6 - resolution: "@vue/devtools-kit@npm:8.0.6" +"@vue/devtools-kit@npm:^8.1.5": + version: 8.1.5 + resolution: "@vue/devtools-kit@npm:8.1.5" dependencies: - "@vue/devtools-shared": "npm:^8.0.6" + "@vue/devtools-shared": "npm:^8.1.5" birpc: "npm:^2.6.1" hookable: "npm:^5.5.3" - mitt: "npm:^3.0.1" perfect-debounce: "npm:^2.0.0" - speakingurl: "npm:^14.0.1" - superjson: "npm:^2.2.2" - checksum: 10c0/369aad2d0cf7dac8ad4e0521a4e843e68f80482dcd73ab9d02076cd3c5d719f5914313523c11887915bbabaaf801ace44f2f961c3e57a6756eaa44970c5ec49b - languageName: node - linkType: hard - -"@vue/devtools-shared@npm:^8.0.6": - version: 8.0.6 - resolution: "@vue/devtools-shared@npm:8.0.6" - dependencies: - rfdc: "npm:^1.4.1" - checksum: 10c0/e253bd15b00418dc1c6f7c90d990a517c461ecf4ad8484155dca53b6cc96f83e93158e2e8b2b2b68e869472cc64230ed388e2ceca6509430a2b78f0cbffe5fd8 + checksum: 10c0/8c521b8f5ae6a11b9a455de23e1b70a561cb74996af1d594dc496b2657791db632f95e1b9a967ae8d984879e5088b017f94d0e6664e7e3a350765f30dff7d91f languageName: node linkType: hard -"@vue/language-core@npm:2.1.6": - version: 2.1.6 - resolution: "@vue/language-core@npm:2.1.6" - dependencies: - "@volar/language-core": "npm:~2.4.1" - "@vue/compiler-dom": "npm:^3.4.0" - "@vue/compiler-vue2": "npm:^2.7.16" - "@vue/shared": "npm:^3.4.0" - computeds: "npm:^0.0.1" - minimatch: "npm:^9.0.3" - muggle-string: "npm:^0.4.1" - path-browserify: "npm:^1.0.1" - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/bad09d54929f09d0d809f13ac1a3ccf0ab0d848c11c420e83a951f7fecfe15537caf95fc55756770a4d79f1fa6b4488bf2846afaba6854746fbb349cbb294bed +"@vue/devtools-shared@npm:^8.1.5": + version: 8.1.5 + resolution: "@vue/devtools-shared@npm:8.1.5" + checksum: 10c0/2e05aa71e68e038a5e143f8cbf77a597e2ec4c3d623f312c1633cb3e89cc4e0bf837954ebec252369ac9be11c0ca6316b8688127511d244e98f5287ff17f8a93 languageName: node linkType: hard @@ -3642,50 +4412,50 @@ __metadata: languageName: node linkType: hard -"@vue/reactivity@npm:3.5.28": - version: 3.5.28 - resolution: "@vue/reactivity@npm:3.5.28" +"@vue/reactivity@npm:3.5.39": + version: 3.5.39 + resolution: "@vue/reactivity@npm:3.5.39" dependencies: - "@vue/shared": "npm:3.5.28" - checksum: 10c0/dc6d29c99598add8a63361fce397a73ee3f5b8c01c518546db45c679d0ba4cfd53237c045ec18332d8d2c86a0fdd874aeb0f64f31176ca416f8c04579bc88f7a + "@vue/shared": "npm:3.5.39" + checksum: 10c0/41f8a64c87986e107e7f45ad456f2b7b655c24710b16ff02e2d0069d5d42e921f5eac44cf2256ef8125e1cc3045f7f7846a71d7c36aeff97cae6b88b8bb88490 languageName: node linkType: hard -"@vue/runtime-core@npm:3.5.28": - version: 3.5.28 - resolution: "@vue/runtime-core@npm:3.5.28" +"@vue/runtime-core@npm:3.5.39": + version: 3.5.39 + resolution: "@vue/runtime-core@npm:3.5.39" dependencies: - "@vue/reactivity": "npm:3.5.28" - "@vue/shared": "npm:3.5.28" - checksum: 10c0/da59abce8805b496586b118d886f792812422d0d70c26794e8e0de239b7e614411f440b24160bd66a3d67171ed86752d7ca6573eb75938b7b8b9047f6326f828 + "@vue/reactivity": "npm:3.5.39" + "@vue/shared": "npm:3.5.39" + checksum: 10c0/c58d7ae93c53ca522b6196d3bed18105e425787f2ab894de9e4b5deaefae220f34bd827b2f322837b02f895d99530673f3332f4a09352668f2560db1df44d51b languageName: node linkType: hard -"@vue/runtime-dom@npm:3.5.28": - version: 3.5.28 - resolution: "@vue/runtime-dom@npm:3.5.28" +"@vue/runtime-dom@npm:3.5.39": + version: 3.5.39 + resolution: "@vue/runtime-dom@npm:3.5.39" dependencies: - "@vue/reactivity": "npm:3.5.28" - "@vue/runtime-core": "npm:3.5.28" - "@vue/shared": "npm:3.5.28" + "@vue/reactivity": "npm:3.5.39" + "@vue/runtime-core": "npm:3.5.39" + "@vue/shared": "npm:3.5.39" csstype: "npm:^3.2.3" - checksum: 10c0/d8978061c78b416c92cf795b235b1db062b86aaf2c877931bc81dd18ae4a2ecf02810eec86d51ed2081fe41d0ce074f9890a44b50af605f5f30ea05aa5ba9f46 + checksum: 10c0/e06a75a5f927018051b2aea90aebdfd81863196f7987ababb9a7b4b8847dcdd79931caf08381b8d0000d94cebfd9fe324f1343bc02123112ca78d289b1a6f0fc languageName: node linkType: hard -"@vue/server-renderer@npm:3.5.28": - version: 3.5.28 - resolution: "@vue/server-renderer@npm:3.5.28" +"@vue/server-renderer@npm:3.5.39": + version: 3.5.39 + resolution: "@vue/server-renderer@npm:3.5.39" dependencies: - "@vue/compiler-ssr": "npm:3.5.28" - "@vue/shared": "npm:3.5.28" + "@vue/compiler-ssr": "npm:3.5.39" + "@vue/shared": "npm:3.5.39" peerDependencies: - vue: 3.5.28 - checksum: 10c0/6a402f3a4c2fdf051bc33a165d363fa84013057e94f1fc4487aab8114a381c8b35c38368f017243c7135cf3ad2da379cb5113e0f4bf14bca63f1fb384b94b403 + vue: 3.5.39 + checksum: 10c0/43fd5b933adb26cf7dc545c7fc7bdb857bd5cd6dc60c7ef0ae6d650f1bd599b17305fc9f23f1c57a271d8860464345ce4349b41b8431b468f75d913a76da37bb languageName: node linkType: hard -"@vue/shared@npm:3.5.10, @vue/shared@npm:^3.4.0": +"@vue/shared@npm:3.5.10": version: 3.5.10 resolution: "@vue/shared@npm:3.5.10" checksum: 10c0/cb3d06b6ba2026b6baa57a1f60110546cb1530e81d970fc770901c6a61adfe8a705d43cafb317f3b9b7c8f8f152b640a1a7a56e964bee7777c646c69b15e1e3f @@ -3706,6 +4476,13 @@ __metadata: languageName: node linkType: hard +"@vue/shared@npm:3.5.39": + version: 3.5.39 + resolution: "@vue/shared@npm:3.5.39" + checksum: 10c0/2b8b008ab8c22c84a37d231f47133721ae3469e6054d1aa77eea972440657b344ace1e508ea0e025aa132cb5236dee8a5db8284d0c811fd413b25d43c78dad2f + languageName: node + linkType: hard + "@vue/test-utils@npm:^2.4.1": version: 2.4.6 resolution: "@vue/test-utils@npm:2.4.6" @@ -3729,6 +4506,13 @@ __metadata: languageName: node linkType: hard +"@webcontainer/env@npm:^1.1.1": + version: 1.1.1 + resolution: "@webcontainer/env@npm:1.1.1" + checksum: 10c0/bc64114ffa7ee92f4985cc2bdd5e27f6f31d892b9aa5cde68eaf93df02d13ee6edf13faeebdd701464183b6f8f9c47c14975958cdd6fc20e7356ad32f6ee39e7 + languageName: node + linkType: hard + "JSONStream@npm:^1.0.4": version: 1.3.5 resolution: "JSONStream@npm:1.3.5" @@ -3748,6 +4532,13 @@ __metadata: languageName: node linkType: hard +"abbrev@npm:^5.0.0": + version: 5.0.0 + resolution: "abbrev@npm:5.0.0" + checksum: 10c0/8e88f5c798ea4562d28c5a3e9ad69e3879890bc5d695d8f2dffb8609be4c890aacc8f80ef4553fdd2c6a62d70c2ce8bc57b38074e383beb7487bdafa9ed42ea5 + languageName: node + linkType: hard + "acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -3758,9 +4549,11 @@ __metadata: linkType: hard "acorn-walk@npm:^8.1.1": - version: 8.3.2 - resolution: "acorn-walk@npm:8.3.2" - checksum: 10c0/7e2a8dad5480df7f872569b9dccff2f3da7e65f5353686b1d6032ab9f4ddf6e3a2cb83a9b52cf50b1497fd522154dda92f0abf7153290cc79cd14721ff121e52 + version: 8.3.5 + resolution: "acorn-walk@npm:8.3.5" + dependencies: + acorn: "npm:^8.11.0" + checksum: 10c0/e31bf5b5423ed1349437029d66d708b9fbd1b77a644b031501e2c753b028d13b56348210ed901d5b1d0d86eb3381c0a0fc0d0998511a9d546d1194936266a332 languageName: node linkType: hard @@ -3773,30 +4566,12 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.12.0": - version: 8.13.0 - resolution: "acorn@npm:8.13.0" - bin: - acorn: bin/acorn - checksum: 10c0/f35dd53d68177c90699f4c37d0bb205b8abe036d955d0eb011ddb7f14a81e6fd0f18893731c457c1b5bd96754683f4c3d80d9a5585ddecaa53cdf84e0b3d68f7 - languageName: node - linkType: hard - -"acorn@npm:^8.15.0, acorn@npm:^8.16.0": - version: 8.16.0 - resolution: "acorn@npm:8.16.0" +"acorn@npm:^8.11.0, acorn@npm:^8.15.0, acorn@npm:^8.16.0, acorn@npm:^8.4.1": + version: 8.17.0 + resolution: "acorn@npm:8.17.0" bin: acorn: bin/acorn - checksum: 10c0/c9c52697227661b68d0debaf972222d4f622aa06b185824164e153438afa7b08273432ca43ea792cadb24dada1d46f6f6bb1ef8de9956979288cc1b96bf9914e - languageName: node - linkType: hard - -"acorn@npm:^8.4.1": - version: 8.11.3 - resolution: "acorn@npm:8.11.3" - bin: - acorn: bin/acorn - checksum: 10c0/3ff155f8812e4a746fee8ecff1f227d527c4c45655bb1fad6347c3cb58e46190598217551b1500f18542d2bbe5c87120cb6927f5a074a59166fbdd9468f0a299 + checksum: 10c0/5dcefea5f8f023b6cc24cbe71fb5a8112b601d36c4fa07d14e4e6ffc2ee47383332c46b36c766d9437725aa6660156eae50efa0c838719823b50d7c327c4ed42 languageName: node linkType: hard @@ -3807,16 +4582,7 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": - version: 7.1.0 - resolution: "agent-base@npm:7.1.0" - dependencies: - debug: "npm:^4.3.4" - checksum: 10c0/fc974ab57ffdd8421a2bc339644d312a9cca320c20c3393c9d8b1fd91731b9bbabdb985df5fc860f5b79d81c3e350daa3fcb31c5c07c0bb385aafc817df004ce - languageName: node - linkType: hard - -"agent-base@npm:^7.1.2": +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": version: 7.1.4 resolution: "agent-base@npm:7.1.4" checksum: 10c0/c2c9ab7599692d594b6a161559ada307b7a624fa4c7b03e3afdb5a5e31cd0e53269115b620fcab024c5ac6a6f37fa5eb2e004f076ad30f5f7e6b8b671f7b35fe @@ -3833,27 +4599,27 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.4": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" +"ajv@npm:^6.14.0": + version: 6.15.0 + resolution: "ajv@npm:6.15.0" dependencies: fast-deep-equal: "npm:^3.1.1" fast-json-stable-stringify: "npm:^2.0.0" json-schema-traverse: "npm:^0.4.1" uri-js: "npm:^4.2.2" - checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + checksum: 10c0/67966499dd272ecde1c2e467084411132891523d057487587879d39ac04207f4351b7b2324c83198013967fbfa632c1612adc960114a30770fbe07a0773b32c2 languageName: node linkType: hard "ajv@npm:^8.11.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" + version: 8.20.0 + resolution: "ajv@npm:8.20.0" dependencies: - fast-deep-equal: "npm:^3.1.1" + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" json-schema-traverse: "npm:^1.0.0" require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.2.2" - checksum: 10c0/ac4f72adf727ee425e049bc9d8b31d4a57e1c90da8d28bcd23d60781b12fcd6fc3d68db5df16994c57b78b94eed7988f5a6b482fd376dc5b084125e20a0a622e + checksum: 10c0/5df9a1c8f83863cde1bd3a9ddb426f599718f88e3dc9153616c79fb28e0be455335830d7f21d745576519f057b371352daa31047b6a33d7036fe08777d60cf2a languageName: node linkType: hard @@ -3865,9 +4631,9 @@ __metadata: linkType: hard "alien-signals@npm:^3.0.0": - version: 3.1.2 - resolution: "alien-signals@npm:3.1.2" - checksum: 10c0/9d1641c1ba55de957411258c741b0245c69ea540107436d63a38a6cf0da873ff2a74017d7b05fa669b1787be012c2db8c2c79ff7b8c47289a92a6a8850ab303d + version: 3.2.1 + resolution: "alien-signals@npm:3.2.1" + checksum: 10c0/4c4064faa208126177224d1ed6a2310687d452dec0771994e276d9af4c72e853fcb969ae4a7fcd034b1d1b9accb9500f4941178326eeea1cb8f64ec612853ef8 languageName: node linkType: hard @@ -3878,10 +4644,10 @@ __metadata: languageName: node linkType: hard -"ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 +"ansi-regex@npm:^6.2.2": + version: 6.2.2 + resolution: "ansi-regex@npm:6.2.2" + checksum: 10c0/05d4acb1d2f59ab2cf4b794339c7b168890d44dda4bf0ce01152a8da0213aca207802f930442ce8cd22d7a92f44907664aac6508904e75e038fa944d2601b30f languageName: node linkType: hard @@ -3911,9 +4677,9 @@ __metadata: linkType: hard "ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + version: 6.2.3 + resolution: "ansi-styles@npm:6.2.3" + checksum: 10c0/23b8a4ce14e18fb854693b95351e286b771d23d8844057ed2e7d083cd3e708376c3323707ec6a24365f7d7eda3ca00327fe04092e29e551499ec4c8b7bfac868 languageName: node linkType: hard @@ -3965,7 +4731,7 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:5.3.0, aria-query@npm:^5.0.0": +"aria-query@npm:5.3.0": version: 5.3.0 resolution: "aria-query@npm:5.3.0" dependencies: @@ -3974,17 +4740,14 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.0, array-buffer-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "array-buffer-byte-length@npm:1.0.1" - dependencies: - call-bind: "npm:^1.0.5" - is-array-buffer: "npm:^3.0.4" - checksum: 10c0/f5cdf54527cd18a3d2852ddf73df79efec03829e7373a8322ef5df2b4ef546fb365c19c71d6b42d641cb6bfe0f1a2f19bc0ece5b533295f86d7c3d522f228917 +"aria-query@npm:^5.0.0": + version: 5.3.2 + resolution: "aria-query@npm:5.3.2" + checksum: 10c0/003c7e3e2cff5540bf7a7893775fc614de82b0c5dde8ae823d47b7a28a9d4da1f7ed85f340bdb93d5649caa927755f0e31ecc7ab63edfdfc00c8ef07e505e03e languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.2": +"array-buffer-byte-length@npm:^1.0.0, array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": version: 1.0.2 resolution: "array-buffer-byte-length@npm:1.0.2" dependencies: @@ -4001,34 +4764,7 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.6": - version: 3.1.7 - resolution: "array-includes@npm:3.1.7" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - get-intrinsic: "npm:^1.2.1" - is-string: "npm:^1.0.7" - checksum: 10c0/692907bd7f19d06dc58ccb761f34b58f5dc0b437d2b47a8fe42a1501849a5cf5c27aed3d521a9702667827c2c85a7e75df00a402c438094d87fc43f39ebf9b2b - languageName: node - linkType: hard - -"array-includes@npm:^3.1.8": - version: 3.1.8 - resolution: "array-includes@npm:3.1.8" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-object-atoms: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.4" - is-string: "npm:^1.0.7" - checksum: 10c0/5b1004d203e85873b96ddc493f090c9672fd6c80d7a60b798da8a14bff8a670ff95db5aafc9abc14a211943f05220dacf8ea17638ae0af1a6a47b8c0b48ce370 - languageName: node - linkType: hard - -"array-includes@npm:^3.1.9": +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8, array-includes@npm:^3.1.9": version: 3.1.9 resolution: "array-includes@npm:3.1.9" dependencies: @@ -4073,19 +4809,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.3.1": - version: 1.3.2 - resolution: "array.prototype.flat@npm:1.3.2" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - checksum: 10c0/a578ed836a786efbb6c2db0899ae80781b476200617f65a44846cb1ed8bd8b24c8821b83703375d8af639c689497b7b07277060024b9919db94ac3e10dc8a49b - languageName: node - linkType: hard - -"array.prototype.flat@npm:^1.3.3": +"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.3": version: 1.3.3 resolution: "array.prototype.flat@npm:1.3.3" dependencies: @@ -4122,22 +4846,6 @@ __metadata: languageName: node linkType: hard -"arraybuffer.prototype.slice@npm:^1.0.3": - version: 1.0.3 - resolution: "arraybuffer.prototype.slice@npm:1.0.3" - dependencies: - array-buffer-byte-length: "npm:^1.0.1" - call-bind: "npm:^1.0.5" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.22.3" - es-errors: "npm:^1.2.1" - get-intrinsic: "npm:^1.2.3" - is-array-buffer: "npm:^3.0.4" - is-shared-array-buffer: "npm:^1.0.2" - checksum: 10c0/d32754045bcb2294ade881d45140a5e52bda2321b9e98fa514797b7f0d252c4c5ab0d1edb34112652c62fa6a9398def568da63a4d7544672229afea283358c36 - languageName: node - linkType: hard - "arraybuffer.prototype.slice@npm:^1.0.4": version: 1.0.4 resolution: "arraybuffer.prototype.slice@npm:1.0.4" @@ -4168,9 +4876,9 @@ __metadata: linkType: hard "assert-never@npm:^1.2.1": - version: 1.3.0 - resolution: "assert-never@npm:1.3.0" - checksum: 10c0/5dbd4fb93bca5c5639c04b5216feebe00e44005b2967e35490cb3154b0ffa48637f796fdb48141b40ffd5b32bd669eb675ba876e112f269fc4bf5a70e70374a8 + version: 1.4.0 + resolution: "assert-never@npm:1.4.0" + checksum: 10c0/494db08b89fb43d6231c9b4c48da22824f1912d88992bf0268e43b3dad0f64bd56d380addbb997d2dea7d859421d5e2904e8bd01243794f2bb5bfbc8d32d1fc6 languageName: node linkType: hard @@ -4181,7 +4889,7 @@ __metadata: languageName: node linkType: hard -"ast-kit@npm:^2.1.2, ast-kit@npm:^2.1.3": +"ast-kit@npm:^2.1.2, ast-kit@npm:^2.2.0": version: 2.2.0 resolution: "ast-kit@npm:2.2.0" dependencies: @@ -4200,13 +4908,14 @@ __metadata: languageName: node linkType: hard -"ast-walker-scope@npm:^0.8.3": - version: 0.8.3 - resolution: "ast-walker-scope@npm:0.8.3" +"ast-walker-scope@npm:^0.9.0": + version: 0.9.0 + resolution: "ast-walker-scope@npm:0.9.0" dependencies: - "@babel/parser": "npm:^7.28.4" - ast-kit: "npm:^2.1.3" - checksum: 10c0/9c98bf1311e798ca95e33ea6315856c31b2870860175b7dd78f87bfacb3600b224350bcc23df511d3f9cae765ad254deea996302f4056b0ffc08909d7382bb24 + "@babel/parser": "npm:^7.29.2" + "@babel/types": "npm:^7.29.0" + ast-kit: "npm:^2.2.0" + checksum: 10c0/8dfd5ee6e3700f7bf4a48ff8b34fd3e7ef93ffd7f21f601d06d201ff5c7120967fcdd5fc2258cbd2981902664ec29b2f19b4d6dd1980b2a21ce36b793424942f languageName: node linkType: hard @@ -4234,9 +4943,9 @@ __metadata: linkType: hard "axe-core@npm:^4.2.0": - version: 4.8.4 - resolution: "axe-core@npm:4.8.4" - checksum: 10c0/1100ac42c4b8cde1fb7c428d2b76e5a14e20d9d41fe635c55048e4ba27f1eded729b838379a036b5ef9cf25ba7f7bedeef01ebd3b4accd2afee397b10b0265c4 + version: 4.12.1 + resolution: "axe-core@npm:4.12.1" + checksum: 10c0/03438bd98cef38ad57554feea0d8de21705001db2655c27e0c33ff55e16dd7d6f49c28fb420dc93f7532e68ff363c0953056a5836e6f47068f193eb1765c7db7 languageName: node linkType: hard @@ -4257,9 +4966,9 @@ __metadata: linkType: hard "balanced-match@npm:^4.0.2": - version: 4.0.3 - resolution: "balanced-match@npm:4.0.3" - checksum: 10c0/4d96945d0815849934145b2cdc0ccb80fb869d909060820fde5f95da0a32040f2142560ef931584fbb6a1607d39d399707e7d2364030a720ac1dc6f78ddaf9dc + version: 4.0.4 + resolution: "balanced-match@npm:4.0.4" + checksum: 10c0/07e86102a3eb2ee2a6a1a89164f29d0dbaebd28f2ca3f5ca786f36b8b23d9e417eb3be45a4acf754f837be5ac0a2317de90d3fcb7f4f4dc95720a1f36b26a17b languageName: node linkType: hard @@ -4270,6 +4979,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.10.38": + version: 2.10.40 + resolution: "baseline-browser-mapping@npm:2.10.40" + bin: + baseline-browser-mapping: dist/cli.cjs + checksum: 10c0/5d3547aa9333b71f6239db89ef9d4aaf32ec0ee6cfa307025842722b5d225026995185ae4fc1e12e84a22199c905411bf3cce8076ae0a445b342982eb025171e + languageName: node + linkType: hard + "bidi-js@npm:^1.0.3": version: 1.0.3 resolution: "bidi-js@npm:1.0.3" @@ -4305,58 +5023,45 @@ __metadata: linkType: hard "brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" + version: 1.1.15 + resolution: "brace-expansion@npm:1.1.15" dependencies: balanced-match: "npm:^1.0.0" concat-map: "npm:0.0.1" - checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + checksum: 10c0/648e273f57cfa9ed67d8a77bdb15b408205465d33da9331808ee3c188d8b55674c9cdbf1f320b65bc562e485e1263360ae62ad355e128e0435891f6430e795d7 languageName: node linkType: hard -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" +"brace-expansion@npm:^2.0.2": + version: 2.1.1 + resolution: "brace-expansion@npm:2.1.1" dependencies: balanced-match: "npm:^1.0.0" - checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + checksum: 10c0/63b5ddce608b70b50a76817c0526faf8ea67a9180073d88bb402f6bbc22a22da6b1dfac4f65efc53e5faa80222fb7d44bbf2fc638c3f55365975573f671d0ccb languageName: node linkType: hard -"brace-expansion@npm:^5.0.2": - version: 5.0.2 - resolution: "brace-expansion@npm:5.0.2" +"brace-expansion@npm:^5.0.5": + version: 5.0.6 + resolution: "brace-expansion@npm:5.0.6" dependencies: balanced-match: "npm:^4.0.2" - checksum: 10c0/60c765e5df6fc0ceca3d5703202ae6779db61f28ea3bf93a04dbf0d50c22ef8e4644e09d0459c827077cd2d09ba8f199a04d92c36419fcf874601a5565013174 - languageName: node - linkType: hard - -"browserslist@npm:^4.22.2": - version: 4.23.0 - resolution: "browserslist@npm:4.23.0" - dependencies: - caniuse-lite: "npm:^1.0.30001587" - electron-to-chromium: "npm:^1.4.668" - node-releases: "npm:^2.0.14" - update-browserslist-db: "npm:^1.0.13" - bin: - browserslist: cli.js - checksum: 10c0/8e9cc154529062128d02a7af4d8adeead83ca1df8cd9ee65a88e2161039f3d68a4d40fea7353cab6bae4c16182dec2fdd9a1cf7dc2a2935498cee1af0e998943 + checksum: 10c0/8c919869b90f61d533b341d3340be5ee4413232ea89b8246cbc2f38eb014f1d8182785c98a006eaf6111d02dc9eeffefdc240d5ac158625b2ed084dccd4bbf9b languageName: node linkType: hard -"browserslist@npm:^4.24.0": - version: 4.24.0 - resolution: "browserslist@npm:4.24.0" +"browserslist@npm:^4.22.2, browserslist@npm:^4.24.0": + version: 4.28.4 + resolution: "browserslist@npm:4.28.4" dependencies: - caniuse-lite: "npm:^1.0.30001663" - electron-to-chromium: "npm:^1.5.28" - node-releases: "npm:^2.0.18" - update-browserslist-db: "npm:^1.1.0" + baseline-browser-mapping: "npm:^2.10.38" + caniuse-lite: "npm:^1.0.30001799" + electron-to-chromium: "npm:^1.5.376" + node-releases: "npm:^2.0.48" + update-browserslist-db: "npm:^1.2.3" bin: browserslist: cli.js - checksum: 10c0/95e76ad522753c4c470427f6e3c8a4bb5478ff448841e22b3d3e53f89ecaf17b6984666d6c7e715c370f1e7fa0cf684f42e34e554236a8b2fab38ea76b9e4c52 + checksum: 10c0/d86f7319c0e3243ca5122335a98b9de8e007fb10fb5643e5f3ed69428fe81ee8646cf1a7663bcfb65bdfddbe505d39406da7ce30052e65c99df9d02336635a7c languageName: node linkType: hard @@ -4386,26 +5091,6 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^18.0.0": - version: 18.0.2 - resolution: "cacache@npm:18.0.2" - dependencies: - "@npmcli/fs": "npm:^3.1.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^4.0.0" - ssri: "npm:^10.0.0" - tar: "npm:^6.1.11" - unique-filename: "npm:^3.0.0" - checksum: 10c0/7992665305cc251a984f4fdbab1449d50e88c635bc43bf2785530c61d239c61b349e5734461baa461caaee65f040ab14e2d58e694f479c0810cffd181ba5eabc - languageName: node - linkType: hard - "caching-transform@npm:^4.0.0": version: 4.0.0 resolution: "caching-transform@npm:4.0.0" @@ -4418,7 +5103,7 @@ __metadata: languageName: node linkType: hard -"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": +"call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": version: 1.0.2 resolution: "call-bind-apply-helpers@npm:1.0.2" dependencies: @@ -4428,28 +5113,15 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - set-function-length: "npm:^1.2.1" - checksum: 10c0/a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d - languageName: node - linkType: hard - -"call-bind@npm:^1.0.8": - version: 1.0.8 - resolution: "call-bind@npm:1.0.8" +"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8, call-bind@npm:^1.0.9": + version: 1.0.9 + resolution: "call-bind@npm:1.0.9" dependencies: - call-bind-apply-helpers: "npm:^1.0.0" - es-define-property: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.4" + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" + get-intrinsic: "npm:^1.3.0" set-function-length: "npm:^1.2.2" - checksum: 10c0/a13819be0681d915144467741b69875ae5f4eba8961eb0bf322aab63ec87f8250eb6d6b0dcbb2e1349876412a56129ca338592b3829ef4343527f5f18a0752d4 + checksum: 10c0/a6621f6da1444481919ce3b4983dff725691e0754d3507ae483ce56e54985f2da7d6f1df512c56dbf28660745cf1ca52553f1fc9aef5557f3ce353ef14fab714 languageName: node linkType: hard @@ -4495,28 +5167,21 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001587": - version: 1.0.30001599 - resolution: "caniuse-lite@npm:1.0.30001599" - checksum: 10c0/8b3b9610b5be88533a3c8d0770d6896f7b1a9fee3dbeb7339e4ee119a514c81e5e07a628a5a289a6541ca291ac78a9402f5a99cf6012139e91f379083488a8eb - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001663": - version: 1.0.30001669 - resolution: "caniuse-lite@npm:1.0.30001669" - checksum: 10c0/f125f23440d3dbb6c25ffb8d55f4ce48af36a84d0932b152b3b74f143a4170cbe92e02b0a9676209c86609bf7bf34119ff10cc2bc7c1b7ea40e936cc16598408 +"caniuse-lite@npm:^1.0.30001799": + version: 1.0.30001799 + resolution: "caniuse-lite@npm:1.0.30001799" + checksum: 10c0/f24f9834edc7b60188f368ce44714695c3901bc4acb7f2a977dd9b7b697e39ddc0f9947fad6224a955b789f36a73432cb888d620aa7280d728f582d3bd8927a7 languageName: node linkType: hard "canvas@npm:^3.2.1": - version: 3.2.1 - resolution: "canvas@npm:3.2.1" + version: 3.2.3 + resolution: "canvas@npm:3.2.3" dependencies: node-addon-api: "npm:^7.0.0" node-gyp: "npm:latest" prebuild-install: "npm:^7.1.3" - checksum: 10c0/c0fd572a8b28e075b40a42b523bdf05e985feaeb18b56085432bfb91a3b905af48f89ec73ed4e795de892cb13f7332ceb0c78cf84c64281c41c29995665b89c8 + checksum: 10c0/c0b8b4a093964270c014ac93b5af2c2c452974737c2c1dc988821fe9cc8fd9d6a85f7380c477cb881e057f144a7aa50e743b836a47a69c94e18a4a21277b25d5 languageName: node linkType: hard @@ -4533,7 +5198,7 @@ __metadata: languageName: node linkType: hard -"chai@npm:^6.2.1": +"chai@npm:^6.2.2": version: 6.2.2 resolution: "chai@npm:6.2.2" checksum: 10c0/e6c69e5f0c11dffe6ea13d0290936ebb68fcc1ad688b8e952e131df6a6d5797d5e860bc55cef1aca2e950c3e1f96daf79e9d5a70fb7dbaab4e46355e2635ed53 @@ -4571,18 +5236,9 @@ __metadata: linkType: hard "check-error@npm:^2.1.1": - version: 2.1.1 - resolution: "check-error@npm:2.1.1" - checksum: 10c0/979f13eccab306cf1785fa10941a590b4e7ea9916ea2a4f8c87f0316fc3eab07eabefb6e587424ef0f88cbcd3805791f172ea739863ca3d7ce2afc54641c7f0e - languageName: node - linkType: hard - -"chokidar@npm:^4.0.0": - version: 4.0.3 - resolution: "chokidar@npm:4.0.3" - dependencies: - readdirp: "npm:^4.0.1" - checksum: 10c0/a58b9df05bb452f7d105d9e7229ac82fa873741c0c40ddcc7bb82f8a909fbe3f7814c9ebe9bc9a2bef9b737c0ec6e2d699d179048ef06ad3ec46315df0ebe6ad + version: 2.1.3 + resolution: "check-error@npm:2.1.3" + checksum: 10c0/878e99038fb6476316b74668cd6a498c7e66df3efe48158fa40db80a06ba4258742ac3ee2229c4a2a98c5e73f5dff84eb3e50ceb6b65bbd8f831eafc8338607d languageName: node linkType: hard @@ -4602,10 +5258,10 @@ __metadata: languageName: node linkType: hard -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: 10c0/594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 languageName: node linkType: hard @@ -4731,13 +5387,6 @@ __metadata: languageName: node linkType: hard -"computeds@npm:^0.0.1": - version: 0.0.1 - resolution: "computeds@npm:0.0.1" - checksum: 10c0/8a8736f1f43e4a99286519785d71a10ece8f444a2fa1fc2fe1f03dedf63f3477b45094002c85a2826f7631759c9f5a00b4ace47456997f253073fc525e8983de - languageName: node - linkType: hard - "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -4764,7 +5413,7 @@ __metadata: languageName: node linkType: hard -"confbox@npm:^0.2.2": +"confbox@npm:^0.2.4": version: 0.2.4 resolution: "confbox@npm:0.2.4" checksum: 10c0/4c36af33d9df7034300c452f7b289179264493bd0671fa81b995a0d70dc897b1d37f1af10d3ffb187f178d17ba1ed2ba167ed0f599ba3a139c271205dd553f73 @@ -4802,11 +5451,11 @@ __metadata: linkType: hard "conventional-changelog-angular@npm:^8.1.0": - version: 8.1.0 - resolution: "conventional-changelog-angular@npm:8.1.0" + version: 8.3.1 + resolution: "conventional-changelog-angular@npm:8.3.1" dependencies: compare-func: "npm:^2.0.0" - checksum: 10c0/b82aab869117fd9bd6ccfa960521e7638d3c2a3599c95fd5ba30d3b3fe972b5f819af4d57229f2973a7129ea18546cdf5822004565cab1ee35355cc90ac4588f + checksum: 10c0/a3776ff7066004040d7d25d2b72fe8f9fee4f1fc5dc6c929ab281899b8c7a6dd6408130064344515b37a4f91d2a9fb90b69cce0bab55415c72a8ba3ee801c2b6 languageName: node linkType: hard @@ -4847,11 +5496,11 @@ __metadata: linkType: hard "conventional-changelog-conventionalcommits@npm:^9.1.0": - version: 9.1.0 - resolution: "conventional-changelog-conventionalcommits@npm:9.1.0" + version: 9.3.1 + resolution: "conventional-changelog-conventionalcommits@npm:9.3.1" dependencies: compare-func: "npm:^2.0.0" - checksum: 10c0/b1dfbb8ce5983bb80837c35f089fb0f9603a1b067f34be680f88fde20871792e461e29d119d468bc293f38a1ca916c1c40a841f8c049a0a1efaa40582f4fecc9 + checksum: 10c0/e3d0dfe5680899da3660a7fbc859de1a92dd9358dc497624c3582596173713a80dcc8236d844116a3ba8403350e244c007c0c7fa5796631aea19e464cc6c2f44 languageName: node linkType: hard @@ -4995,13 +5644,14 @@ __metadata: linkType: hard "conventional-commits-parser@npm:^6.2.1": - version: 6.2.1 - resolution: "conventional-commits-parser@npm:6.2.1" + version: 6.4.0 + resolution: "conventional-commits-parser@npm:6.4.0" dependencies: + "@simple-libs/stream-utils": "npm:^1.2.0" meow: "npm:^13.0.0" bin: conventional-commits-parser: dist/cli/index.js - checksum: 10c0/217b3fff627802f7fd7cb09bdfe897aa76986865543dfaa99b7957e4717d039e1e12c4a9b72706f098a5716bbbbdae540ef0b2429f7219d5fc5be0f190f1bc1e + checksum: 10c0/3595b85b420a3f431dbad65f7c367e803ee8bca500ec24482e8669d4ed5ff6febbb5e9a17c52f07ebe882abdee3418e759245bcb06e4d1e2cce09d638f31d5ce languageName: node linkType: hard @@ -5037,15 +5687,6 @@ __metadata: languageName: node linkType: hard -"copy-anything@npm:^4": - version: 4.0.5 - resolution: "copy-anything@npm:4.0.5" - dependencies: - is-what: "npm:^5.2.0" - checksum: 10c0/d0a4a4102334399dae8504a2c2e13f45ad05746a9fd5cc0df349a554e3749a05e8a6d62b3724a8049cd59fc0bbbf4f54c4edc94a428edc76211dffe3ac0af586 - languageName: node - linkType: hard - "core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" @@ -5054,15 +5695,15 @@ __metadata: linkType: hard "cosmiconfig-typescript-loader@npm:^6.1.0": - version: 6.2.0 - resolution: "cosmiconfig-typescript-loader@npm:6.2.0" + version: 6.3.0 + resolution: "cosmiconfig-typescript-loader@npm:6.3.0" dependencies: - jiti: "npm:^2.6.1" + jiti: "npm:2.6.1" peerDependencies: "@types/node": "*" cosmiconfig: ">=9" typescript: ">=5" - checksum: 10c0/0fd8fd9b9b6a04eec75617b965ce0a1f63310fe29a361c1f95cb971e05dbbb935291899c2b15abfd69e09db58dbe97077f24a7c61414bbc6c3e78349b4314ad7 + checksum: 10c0/dd53519bf59b31c32a831f1140eaa44f4f0bf49229b7e3ba27bb6f26097c3ecff955a490e70b31349049463066b5047bd129ab82ed078be9b1f1f22ccb776c6a languageName: node linkType: hard @@ -5084,8 +5725,8 @@ __metadata: linkType: hard "cosmiconfig@npm:^9.0.0": - version: 9.0.0 - resolution: "cosmiconfig@npm:9.0.0" + version: 9.0.2 + resolution: "cosmiconfig@npm:9.0.2" dependencies: env-paths: "npm:^2.2.1" import-fresh: "npm:^3.3.0" @@ -5096,7 +5737,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/1c1703be4f02a250b1d6ca3267e408ce16abfe8364193891afc94c2d5c060b69611fdc8d97af74b7e6d5d1aac0ab2fb94d6b079573146bc2d756c2484ce5f0ee + checksum: 10c0/132d32863c0b3d9ace7010a10011e09089532b36e3b11e02004d671dcbd8b8f2f16293b82d510d9c15890f30358baf8722127c7b1c011449c90b6a178f9c6594 languageName: node linkType: hard @@ -5107,18 +5748,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -5130,15 +5760,15 @@ __metadata: linkType: hard "css-select@npm:^5.1.0": - version: 5.1.0 - resolution: "css-select@npm:5.1.0" + version: 5.2.2 + resolution: "css-select@npm:5.2.2" dependencies: boolbase: "npm:^1.0.0" css-what: "npm:^6.1.0" domhandler: "npm:^5.0.2" domutils: "npm:^3.0.1" nth-check: "npm:^2.0.1" - checksum: 10c0/551c60dba5b54054741032c1793b5734f6ba45e23ae9e82761a3c0ed1acbb8cfedfa443aaba3a3c1a54cac12b456d2012a09d2cd5f0e82e430454c1b9d84d500 + checksum: 10c0/d79fffa97106007f2802589f3ed17b8c903f1c961c0fc28aa8a051eee0cbad394d8446223862efd4c1b40445a6034f626bb639cf2035b0bfc468544177593c99 languageName: node linkType: hard @@ -5153,12 +5783,12 @@ __metadata: linkType: hard "css-tree@npm:^3.0.0, css-tree@npm:^3.1.0": - version: 3.1.0 - resolution: "css-tree@npm:3.1.0" + version: 3.2.1 + resolution: "css-tree@npm:3.2.1" dependencies: - mdn-data: "npm:2.12.2" - source-map-js: "npm:^1.0.1" - checksum: 10c0/b5715852c2f397c715ca00d56ec53fc83ea596295ae112eb1ba6a1bda3b31086380e596b1d8c4b980fe6da09e7d0fc99c64d5bb7313030dd0fba9c1415f30979 + mdn-data: "npm:2.27.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/1f65e9ccaa56112a4706d6f003dd43d777f0dbcf848e66fd320f823192533581f8dd58daa906cb80622658332d50284d6be13b87a6ab4556cbbfe9ef535bbf7e languageName: node linkType: hard @@ -5173,9 +5803,9 @@ __metadata: linkType: hard "css-what@npm:^6.1.0": - version: 6.1.0 - resolution: "css-what@npm:6.1.0" - checksum: 10c0/a09f5a6b14ba8dcf57ae9a59474722e80f20406c53a61e9aedb0eedc693b135113ffe2983f4efc4b5065ae639442e9ae88df24941ef159c218b231011d733746 + version: 6.2.2 + resolution: "css-what@npm:6.2.2" + checksum: 10c0/91e24c26fb977b4ccef30d7007d2668c1c10ac0154cc3f42f7304410e9594fb772aea4f30c832d2993b132ca8d99338050866476210316345ec2e7d47b248a56 languageName: node linkType: hard @@ -5205,25 +5835,18 @@ __metadata: linkType: hard "cssstyle@npm:^6.0.1": - version: 6.0.1 - resolution: "cssstyle@npm:6.0.1" + version: 6.2.0 + resolution: "cssstyle@npm:6.2.0" dependencies: - "@asamuzakjp/css-color": "npm:^4.1.2" - "@csstools/css-syntax-patches-for-csstree": "npm:^1.0.26" + "@asamuzakjp/css-color": "npm:^5.0.1" + "@csstools/css-syntax-patches-for-csstree": "npm:^1.0.28" css-tree: "npm:^3.1.0" - lru-cache: "npm:^11.2.5" - checksum: 10c0/92a8581bad4ce9f77d22761f1aabe72829f4457ac709f4fe1a5b45b431ba165368cd7f849b00454ee31cf0a4c838be583107883f14b6d546802cf3c76a88ca41 - languageName: node - linkType: hard - -"csstype@npm:^3.0.2": - version: 3.1.3 - resolution: "csstype@npm:3.1.3" - checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 + lru-cache: "npm:^11.2.6" + checksum: 10c0/d5e61973a8c1b4fb9727edddfb9f2677c9a91b1db63787fc0c8bed639a227a97fcf930e5aabc3c64c8280d63169c632015a39da4a84083d1731c949437d0a2a2 languageName: node linkType: hard -"csstype@npm:^3.2.2, csstype@npm:^3.2.3": +"csstype@npm:^3.0.2, csstype@npm:^3.2.2, csstype@npm:^3.2.3": version: 3.2.3 resolution: "csstype@npm:3.2.3" checksum: 10c0/cd29c51e70fa822f1cecd8641a1445bed7063697469d35633b516e60fe8c1bde04b08f6c5b6022136bb669b64c63d4173af54864510fbb4ee23281801841a3ce @@ -5254,17 +5877,6 @@ __metadata: languageName: node linkType: hard -"data-view-buffer@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-buffer@npm:1.0.1" - dependencies: - call-bind: "npm:^1.0.6" - es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.1" - checksum: 10c0/8984119e59dbed906a11fcfb417d7d861936f16697a0e7216fe2c6c810f6b5e8f4a5281e73f2c28e8e9259027190ac4a33e2a65fdd7fa86ac06b76e838918583 - languageName: node - linkType: hard - "data-view-buffer@npm:^1.0.2": version: 1.0.2 resolution: "data-view-buffer@npm:1.0.2" @@ -5276,17 +5888,6 @@ __metadata: languageName: node linkType: hard -"data-view-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-byte-length@npm:1.0.1" - dependencies: - call-bind: "npm:^1.0.7" - es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.1" - checksum: 10c0/b7d9e48a0cf5aefed9ab7d123559917b2d7e0d65531f43b2fd95b9d3a6b46042dd3fca597c42bba384e66b70d7ad66ff23932f8367b241f53d93af42cfe04ec2 - languageName: node - linkType: hard - "data-view-byte-length@npm:^1.0.2": version: 1.0.2 resolution: "data-view-byte-length@npm:1.0.2" @@ -5294,18 +5895,7 @@ __metadata: call-bound: "npm:^1.0.3" es-errors: "npm:^1.3.0" is-data-view: "npm:^1.0.2" - checksum: 10c0/f8a4534b5c69384d95ac18137d381f18a5cfae1f0fc1df0ef6feef51ef0d568606d970b69e02ea186c6c0f0eac77fe4e6ad96fec2569cc86c3afcc7475068c55 - languageName: node - linkType: hard - -"data-view-byte-offset@npm:^1.0.0": - version: 1.0.0 - resolution: "data-view-byte-offset@npm:1.0.0" - dependencies: - call-bind: "npm:^1.0.6" - es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.1" - checksum: 10c0/21b0d2e53fd6e20cc4257c873bf6d36d77bd6185624b84076c0a1ddaa757b49aaf076254006341d35568e89f52eecd1ccb1a502cfb620f2beca04f48a6a62a8f + checksum: 10c0/f8a4534b5c69384d95ac18137d381f18a5cfae1f0fc1df0ef6feef51ef0d568606d970b69e02ea186c6c0f0eac77fe4e6ad96fec2569cc86c3afcc7475068c55 languageName: node linkType: hard @@ -5334,15 +5924,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0, debug@npm:^4.4.3": + version: 4.4.3 + resolution: "debug@npm:4.4.3" dependencies: - ms: "npm:2.1.2" + ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 languageName: node linkType: hard @@ -5355,18 +5945,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.1.1, debug@npm:^4.4.0, debug@npm:^4.4.3": - version: 4.4.3 - resolution: "debug@npm:4.4.3" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 - languageName: node - linkType: hard - "decamelize-keys@npm:^1.1.0": version: 1.1.1 resolution: "decamelize-keys@npm:1.1.1" @@ -5491,7 +6069,7 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -5531,9 +6109,9 @@ __metadata: linkType: hard "diff@npm:^4.0.1": - version: 4.0.2 - resolution: "diff@npm:4.0.2" - checksum: 10c0/81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1 + version: 4.0.4 + resolution: "diff@npm:4.0.4" + checksum: 10c0/855fb70b093d1d9643ddc12ea76dca90dc9d9cdd7f82c08ee8b9325c0dc5748faf3c82e2047ced5dcaa8b26e58f7903900be2628d0380a222c02d79d8de385df languageName: node linkType: hard @@ -5614,13 +6192,13 @@ __metadata: linkType: hard "domutils@npm:^3.0.1": - version: 3.1.0 - resolution: "domutils@npm:3.1.0" + version: 3.2.2 + resolution: "domutils@npm:3.2.2" dependencies: dom-serializer: "npm:^2.0.0" domelementtype: "npm:^2.3.0" domhandler: "npm:^5.0.3" - checksum: 10c0/342d64cf4d07b8a0573fb51e0a6312a88fb520c7fefd751870bf72fa5fc0f2e0cb9a3958a573610b1d608c6e2a69b8e9b4b40f0bfb8f87a71bce4f180cca1887 + checksum: 10c0/47938f473b987ea71cd59e59626eb8666d3aa8feba5266e45527f3b636c7883cca7e582d901531961f742c519d7514636b7973353b648762b2e3bedbf235fada languageName: node linkType: hard @@ -5672,30 +6250,23 @@ __metadata: linkType: hard "editorconfig@npm:^1.0.4": - version: 1.0.4 - resolution: "editorconfig@npm:1.0.4" + version: 1.0.7 + resolution: "editorconfig@npm:1.0.7" dependencies: "@one-ini/wasm": "npm:0.1.1" commander: "npm:^10.0.0" - minimatch: "npm:9.0.1" + minimatch: "npm:^9.0.1" semver: "npm:^7.5.3" bin: editorconfig: bin/editorconfig - checksum: 10c0/ed6985959d7b34a56e1c09bef118758c81c969489b768d152c93689fce8403b0452462e934f665febaba3478eebc0fd41c0a36100783eaadf6d926c4abc87a3d - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.4.668": - version: 1.4.711 - resolution: "electron-to-chromium@npm:1.4.711" - checksum: 10c0/1bb10bc9c92721dca5ff71cc333ba1df076de09e16114405252c1168fb03e7f16493127df7e360fb93eb588b47840d7b74546ba8c56dadd0e8a43522562f6aeb + checksum: 10c0/5b0f524ae0a406c56e2d3c690656c016e326ae5f01813dfa476ef1cea50a24e6473f1ba6f655e81ea5fde73e9db6782d83e696ec9946c8db083f5e4b6147795a languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.28": - version: 1.5.41 - resolution: "electron-to-chromium@npm:1.5.41" - checksum: 10c0/97b82383963029e6ed0bd7a71eb527f640c8cf658c9e43c776b0257b3c65e366590ac54135683a21e4474a156b8be78717d6e94d3c1def84b69f92bf48f2390f +"electron-to-chromium@npm:^1.5.376": + version: 1.5.380 + resolution: "electron-to-chromium@npm:1.5.380" + checksum: 10c0/9132e2d69a1829708894507bacf59f02d881b95113eb9139fcb27c92d026f4504dd1b2a74f024224641d1fb6112b0fcb914ce27acfef9aeb150cdb4c8ae35895 languageName: node linkType: hard @@ -5724,18 +6295,9 @@ __metadata: linkType: hard "empathic@npm:^2.0.0": - version: 2.0.0 - resolution: "empathic@npm:2.0.0" - checksum: 10c0/7d3b14b04a93b35c47bcc950467ec914fd241cd9acc0269b0ea160f13026ec110f520c90fae64720fde72cc1757b57f3f292fb606617b7fccac1f4d008a76506 - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: "npm:^0.6.2" - checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + version: 2.0.1 + resolution: "empathic@npm:2.0.1" + checksum: 10c0/577f2868bfcad4ffbf911b57c75016125eb8cc8a7d32cf2d3e9fbcb31bfe6e9e6b66d9457ac34ccb2cd38bff353b3af34287899e0360b8c561ff6d4a048aca62 languageName: node linkType: hard @@ -5755,13 +6317,6 @@ __metadata: languageName: node linkType: hard -"entities@npm:^6.0.0": - version: 6.0.1 - resolution: "entities@npm:6.0.1" - checksum: 10c0/ed836ddac5acb34341094eb495185d527bd70e8632b6c0d59548cbfa23defdbae70b96f9a405c82904efa421230b5b3fd2283752447d737beffd3f3e6ee74414 - languageName: node - linkType: hard - "entities@npm:^7.0.1": version: 7.0.1 resolution: "entities@npm:7.0.1" @@ -5769,6 +6324,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^8.0.0": + version: 8.0.0 + resolution: "entities@npm:8.0.0" + checksum: 10c0/938e631664c19451823344a351aeeafd74fae2d5fa51e4d5b6ff635afaefd4bacf0f609989888c04c42733f46ffdac15211608267ebb02488005891a4793e94d + languageName: node + linkType: hard + "env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -5776,133 +6338,30 @@ __metadata: languageName: node linkType: hard -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 - languageName: node - linkType: hard - "error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" + version: 1.3.4 + resolution: "error-ex@npm:1.3.4" dependencies: is-arrayish: "npm:^0.2.1" - checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + checksum: 10c0/b9e34ff4778b8f3b31a8377e1c654456f4c41aeaa3d10a1138c3b7635d8b7b2e03eb2475d46d8ae055c1f180a1063e100bffabf64ea7e7388b37735df5328664 languageName: node linkType: hard -"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.3": - version: 1.23.3 - resolution: "es-abstract@npm:1.23.3" +"es-abstract-get@npm:^1.0.0": + version: 1.0.0 + resolution: "es-abstract-get@npm:1.0.0" dependencies: - array-buffer-byte-length: "npm:^1.0.1" - arraybuffer.prototype.slice: "npm:^1.0.3" - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" - data-view-buffer: "npm:^1.0.1" - data-view-byte-length: "npm:^1.0.1" - data-view-byte-offset: "npm:^1.0.0" - es-define-property: "npm:^1.0.0" es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - es-set-tostringtag: "npm:^2.0.3" - es-to-primitive: "npm:^1.2.1" - function.prototype.name: "npm:^1.1.6" - get-intrinsic: "npm:^1.2.4" - get-symbol-description: "npm:^1.0.2" - globalthis: "npm:^1.0.3" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.2" - has-proto: "npm:^1.0.3" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.2" - internal-slot: "npm:^1.0.7" - is-array-buffer: "npm:^3.0.4" + es-object-atoms: "npm:^1.1.2" is-callable: "npm:^1.2.7" - is-data-view: "npm:^1.0.1" - is-negative-zero: "npm:^2.0.3" - is-regex: "npm:^1.1.4" - is-shared-array-buffer: "npm:^1.0.3" - is-string: "npm:^1.0.7" - is-typed-array: "npm:^1.1.13" - is-weakref: "npm:^1.0.2" - object-inspect: "npm:^1.13.1" - object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.5" - regexp.prototype.flags: "npm:^1.5.2" - safe-array-concat: "npm:^1.1.2" - safe-regex-test: "npm:^1.0.3" - string.prototype.trim: "npm:^1.2.9" - string.prototype.trimend: "npm:^1.0.8" - string.prototype.trimstart: "npm:^1.0.8" - typed-array-buffer: "npm:^1.0.2" - typed-array-byte-length: "npm:^1.0.1" - typed-array-byte-offset: "npm:^1.0.2" - typed-array-length: "npm:^1.0.6" - unbox-primitive: "npm:^1.0.2" - which-typed-array: "npm:^1.1.15" - checksum: 10c0/d27e9afafb225c6924bee9971a7f25f20c314f2d6cb93a63cada4ac11dcf42040896a6c22e5fb8f2a10767055ed4ddf400be3b1eb12297d281726de470b75666 + object-inspect: "npm:^1.13.4" + checksum: 10c0/f9b4838ae719752207383a6d95a74590f891122bf26b92f5e72eeedbe53771029e4561f1cf75ea19330b71bcf3d4f536fb0c8f7e2b601fe24d284f46e488c7e3 languageName: node linkType: hard -"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2": - version: 1.23.2 - resolution: "es-abstract@npm:1.23.2" - dependencies: - array-buffer-byte-length: "npm:^1.0.1" - arraybuffer.prototype.slice: "npm:^1.0.3" - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" - data-view-buffer: "npm:^1.0.1" - data-view-byte-length: "npm:^1.0.1" - data-view-byte-offset: "npm:^1.0.0" - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - es-set-tostringtag: "npm:^2.0.3" - es-to-primitive: "npm:^1.2.1" - function.prototype.name: "npm:^1.1.6" - get-intrinsic: "npm:^1.2.4" - get-symbol-description: "npm:^1.0.2" - globalthis: "npm:^1.0.3" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.2" - has-proto: "npm:^1.0.3" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.2" - internal-slot: "npm:^1.0.7" - is-array-buffer: "npm:^3.0.4" - is-callable: "npm:^1.2.7" - is-data-view: "npm:^1.0.1" - is-negative-zero: "npm:^2.0.3" - is-regex: "npm:^1.1.4" - is-shared-array-buffer: "npm:^1.0.3" - is-string: "npm:^1.0.7" - is-typed-array: "npm:^1.1.13" - is-weakref: "npm:^1.0.2" - object-inspect: "npm:^1.13.1" - object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.5" - regexp.prototype.flags: "npm:^1.5.2" - safe-array-concat: "npm:^1.1.2" - safe-regex-test: "npm:^1.0.3" - string.prototype.trim: "npm:^1.2.9" - string.prototype.trimend: "npm:^1.0.8" - string.prototype.trimstart: "npm:^1.0.7" - typed-array-buffer: "npm:^1.0.2" - typed-array-byte-length: "npm:^1.0.1" - typed-array-byte-offset: "npm:^1.0.2" - typed-array-length: "npm:^1.0.5" - unbox-primitive: "npm:^1.0.2" - which-typed-array: "npm:^1.1.15" - checksum: 10c0/1262ebb7cdb79f255fc7d1f4505c0de2d88d117a0b21d0c984c28a0126efa717ef011f07d502353987cbade39f12c0a5ae59aef0b1231a51ce1b991e4e87c8bb - languageName: node - linkType: hard - -"es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9, es-abstract@npm:^1.24.0, es-abstract@npm:^1.24.1": - version: 1.24.1 - resolution: "es-abstract@npm:1.24.1" +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9, es-abstract@npm:^1.24.0, es-abstract@npm:^1.24.2": + version: 1.24.2 + resolution: "es-abstract@npm:1.24.2" dependencies: array-buffer-byte-length: "npm:^1.0.2" arraybuffer.prototype.slice: "npm:^1.0.4" @@ -5958,27 +6417,18 @@ __metadata: typed-array-length: "npm:^1.0.7" unbox-primitive: "npm:^1.1.0" which-typed-array: "npm:^1.1.19" - checksum: 10c0/fca062ef8b5daacf743732167d319a212d45cb655b0bb540821d38d715416ae15b04b84fc86da9e2c89135aa7b337337b6c867f84dcde698d75d55688d5d765c - languageName: node - linkType: hard - -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" - dependencies: - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 + checksum: 10c0/67a5bf21ef5c7d775e6f6131a836323900b4d87194cf544394ac68fe31c57fa53828b978af4a4f551ef307f83a2f910a16b6b982760ad3ddc3dc471f98d5fd1b languageName: node linkType: hard -"es-define-property@npm:^1.0.1": +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": version: 1.0.1 resolution: "es-define-property@npm:1.0.1" checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c languageName: node linkType: hard -"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": +"es-errors@npm:^1.3.0": version: 1.3.0 resolution: "es-errors@npm:1.3.0" checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 @@ -6003,13 +6453,13 @@ __metadata: linkType: hard "es-iterator-helpers@npm:^1.2.1": - version: 1.2.2 - resolution: "es-iterator-helpers@npm:1.2.2" + version: 1.3.3 + resolution: "es-iterator-helpers@npm:1.3.3" dependencies: - call-bind: "npm:^1.0.8" + call-bind: "npm:^1.0.9" call-bound: "npm:^1.0.4" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.24.1" + es-abstract: "npm:^1.24.2" es-errors: "npm:^1.3.0" es-set-tostringtag: "npm:^2.1.0" function-bind: "npm:^1.1.2" @@ -6021,44 +6471,24 @@ __metadata: has-symbols: "npm:^1.1.0" internal-slot: "npm:^1.1.0" iterator.prototype: "npm:^1.1.5" - safe-array-concat: "npm:^1.1.3" - checksum: 10c0/1ced8abf845a45e660dd77b5f3a64358421df70e4a0bd1897d5ddfefffed8409a6a2ca21241b9367e639df9eca74abc1c678b3020bffe6bee1f1826393658ddb - languageName: node - linkType: hard - -"es-module-lexer@npm:^1.7.0": - version: 1.7.0 - resolution: "es-module-lexer@npm:1.7.0" - checksum: 10c0/4c935affcbfeba7fb4533e1da10fa8568043df1e3574b869385980de9e2d475ddc36769891936dbb07036edb3c3786a8b78ccf44964cd130dedc1f2c984b6c7b + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/14d45ce96c1eeec1dfb76607f4277163c847cc799a417c69346bfd2a9cce04b1d1426e34cb867dbc3266d2ca516084259ff1836cd2da6bc70b3e25e02f3532a9 languageName: node linkType: hard -"es-object-atoms@npm:^1.0.0": - version: 1.0.0 - resolution: "es-object-atoms@npm:1.0.0" - dependencies: - es-errors: "npm:^1.3.0" - checksum: 10c0/1fed3d102eb27ab8d983337bb7c8b159dd2a1e63ff833ec54eea1311c96d5b08223b433060ba240541ca8adba9eee6b0a60cdbf2f80634b784febc9cc8b687b4 +"es-module-lexer@npm:^2.0.0": + version: 2.1.0 + resolution: "es-module-lexer@npm:2.1.0" + checksum: 10c0/93bcf2454fa72d67fe3ccd0abef8ce7933f5840a319513418a643dd8e9c6aa8f49709cecfae02ded722805dd327232d30723a807cc52e6809d6ac697c62c29fb languageName: node linkType: hard -"es-object-atoms@npm:^1.1.1": - version: 1.1.1 - resolution: "es-object-atoms@npm:1.1.1" +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1, es-object-atoms@npm:^1.1.2": + version: 1.1.2 + resolution: "es-object-atoms@npm:1.1.2" dependencies: es-errors: "npm:^1.3.0" - checksum: 10c0/65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c - languageName: node - linkType: hard - -"es-set-tostringtag@npm:^2.0.3": - version: 2.0.3 - resolution: "es-set-tostringtag@npm:2.0.3" - dependencies: - get-intrinsic: "npm:^1.2.4" - has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.1" - checksum: 10c0/f22aff1585eb33569c326323f0b0d175844a1f11618b86e193b386f8be0ea9474cfbe46df39c45d959f7aa8f6c06985dc51dd6bce5401645ec5a74c4ceaa836a + checksum: 10c0/1772861f094f739d6f41b579cfb9a18579daffeb434552a370a5fbef50a32d22227e27b63fdbb757b7ddd429d1b42fe52ccae7966d9302a2ec221b6f1b41bbc4 languageName: node linkType: hard @@ -6074,16 +6504,7 @@ __metadata: languageName: node linkType: hard -"es-shim-unscopables@npm:^1.0.0, es-shim-unscopables@npm:^1.0.2": - version: 1.0.2 - resolution: "es-shim-unscopables@npm:1.0.2" - dependencies: - hasown: "npm:^2.0.0" - checksum: 10c0/f495af7b4b7601a4c0cfb893581c352636e5c08654d129590386a33a0432cf13a7bdc7b6493801cadd990d838e2839b9013d1de3b880440cb537825e834fe783 - languageName: node - linkType: hard - -"es-shim-unscopables@npm:^1.1.0": +"es-shim-unscopables@npm:^1.0.2, es-shim-unscopables@npm:^1.1.0": version: 1.1.0 resolution: "es-shim-unscopables@npm:1.1.0" dependencies: @@ -6092,25 +6513,17 @@ __metadata: languageName: node linkType: hard -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" - dependencies: - is-callable: "npm:^1.1.4" - is-date-object: "npm:^1.0.1" - is-symbol: "npm:^1.0.2" - checksum: 10c0/0886572b8dc075cb10e50c0af62a03d03a68e1e69c388bd4f10c0649ee41b1fbb24840a1b7e590b393011b5cdbe0144b776da316762653685432df37d6de60f1 - languageName: node - linkType: hard - "es-to-primitive@npm:^1.3.0": - version: 1.3.0 - resolution: "es-to-primitive@npm:1.3.0" + version: 1.3.4 + resolution: "es-to-primitive@npm:1.3.4" dependencies: + es-abstract-get: "npm:^1.0.0" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" is-callable: "npm:^1.2.7" - is-date-object: "npm:^1.0.5" - is-symbol: "npm:^1.0.4" - checksum: 10c0/c7e87467abb0b438639baa8139f701a06537d2b9bc758f23e8622c3b42fd0fdb5bde0f535686119e446dd9d5e4c0f238af4e14960f4771877cf818d023f6730b + is-date-object: "npm:^1.1.0" + is-symbol: "npm:^1.1.1" + checksum: 10c0/b10029f8b0b13841bade224ff39005a13d76d9cb803cd1efb18cc96a24414e83e2e7ed15d7ad9d0d0bda66884afd211b7b579b8fa31940e05b060934aa7077d8 languageName: node linkType: hard @@ -6121,36 +6534,36 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0, esbuild@npm:^0.27.0": - version: 0.27.3 - resolution: "esbuild@npm:0.27.3" - dependencies: - "@esbuild/aix-ppc64": "npm:0.27.3" - "@esbuild/android-arm": "npm:0.27.3" - "@esbuild/android-arm64": "npm:0.27.3" - "@esbuild/android-x64": "npm:0.27.3" - "@esbuild/darwin-arm64": "npm:0.27.3" - "@esbuild/darwin-x64": "npm:0.27.3" - "@esbuild/freebsd-arm64": "npm:0.27.3" - "@esbuild/freebsd-x64": "npm:0.27.3" - "@esbuild/linux-arm": "npm:0.27.3" - "@esbuild/linux-arm64": "npm:0.27.3" - "@esbuild/linux-ia32": "npm:0.27.3" - "@esbuild/linux-loong64": "npm:0.27.3" - "@esbuild/linux-mips64el": "npm:0.27.3" - "@esbuild/linux-ppc64": "npm:0.27.3" - "@esbuild/linux-riscv64": "npm:0.27.3" - "@esbuild/linux-s390x": "npm:0.27.3" - "@esbuild/linux-x64": "npm:0.27.3" - "@esbuild/netbsd-arm64": "npm:0.27.3" - "@esbuild/netbsd-x64": "npm:0.27.3" - "@esbuild/openbsd-arm64": "npm:0.27.3" - "@esbuild/openbsd-x64": "npm:0.27.3" - "@esbuild/openharmony-arm64": "npm:0.27.3" - "@esbuild/sunos-x64": "npm:0.27.3" - "@esbuild/win32-arm64": "npm:0.27.3" - "@esbuild/win32-ia32": "npm:0.27.3" - "@esbuild/win32-x64": "npm:0.27.3" +"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0 || ^0.28.0, esbuild@npm:^0.27.0 || ^0.28.0": + version: 0.28.1 + resolution: "esbuild@npm:0.28.1" + dependencies: + "@esbuild/aix-ppc64": "npm:0.28.1" + "@esbuild/android-arm": "npm:0.28.1" + "@esbuild/android-arm64": "npm:0.28.1" + "@esbuild/android-x64": "npm:0.28.1" + "@esbuild/darwin-arm64": "npm:0.28.1" + "@esbuild/darwin-x64": "npm:0.28.1" + "@esbuild/freebsd-arm64": "npm:0.28.1" + "@esbuild/freebsd-x64": "npm:0.28.1" + "@esbuild/linux-arm": "npm:0.28.1" + "@esbuild/linux-arm64": "npm:0.28.1" + "@esbuild/linux-ia32": "npm:0.28.1" + "@esbuild/linux-loong64": "npm:0.28.1" + "@esbuild/linux-mips64el": "npm:0.28.1" + "@esbuild/linux-ppc64": "npm:0.28.1" + "@esbuild/linux-riscv64": "npm:0.28.1" + "@esbuild/linux-s390x": "npm:0.28.1" + "@esbuild/linux-x64": "npm:0.28.1" + "@esbuild/netbsd-arm64": "npm:0.28.1" + "@esbuild/netbsd-x64": "npm:0.28.1" + "@esbuild/openbsd-arm64": "npm:0.28.1" + "@esbuild/openbsd-x64": "npm:0.28.1" + "@esbuild/openharmony-arm64": "npm:0.28.1" + "@esbuild/sunos-x64": "npm:0.28.1" + "@esbuild/win32-arm64": "npm:0.28.1" + "@esbuild/win32-ia32": "npm:0.28.1" + "@esbuild/win32-x64": "npm:0.28.1" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -6206,18 +6619,11 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10c0/fdc3f87a3f08b3ef98362f37377136c389a0d180fda4b8d073b26ba930cf245521db0a368f119cc7624bc619248fff1439f5811f062d853576f8ffa3df8ee5f1 - languageName: node - linkType: hard - -"escalade@npm:^3.1.1": - version: 3.1.2 - resolution: "escalade@npm:3.1.2" - checksum: 10c0/6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287 + checksum: 10c0/29cd456a79ce35ac2c7e05fe871330416b2c395c045d849653f843e51378d6e0d6e774d6dcd01b35f4e83238a29bf8decd04fcd34b3780c589a250b21e5f92bb languageName: node linkType: hard -"escalade@npm:^3.2.0": +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 @@ -6239,25 +6645,25 @@ __metadata: linkType: hard "eslint-import-resolver-node@npm:^0.3.9": - version: 0.3.9 - resolution: "eslint-import-resolver-node@npm:0.3.9" + version: 0.3.10 + resolution: "eslint-import-resolver-node@npm:0.3.10" dependencies: debug: "npm:^3.2.7" - is-core-module: "npm:^2.13.0" - resolve: "npm:^1.22.4" - checksum: 10c0/0ea8a24a72328a51fd95aa8f660dcca74c1429806737cf10261ab90cfcaaf62fd1eff664b76a44270868e0a932711a81b250053942595bcd00a93b1c1575dd61 + is-core-module: "npm:^2.16.1" + resolve: "npm:^2.0.0-next.6" + checksum: 10c0/2e05bdb148fe10a25b9a6fec3c4986a2e09e98bb99208491df82a9df7725f7bb312482d585404c440d42e58ab60debe7a48d9c992191851385b18d33a146e3c3 languageName: node linkType: hard "eslint-module-utils@npm:^2.12.1": - version: 2.12.1 - resolution: "eslint-module-utils@npm:2.12.1" + version: 2.13.0 + resolution: "eslint-module-utils@npm:2.13.0" dependencies: debug: "npm:^3.2.7" peerDependenciesMeta: eslint: optional: true - checksum: 10c0/6f4efbe7a91ae49bf67b4ab3644cb60bc5bd7db4cb5521de1b65be0847ffd3fb6bce0dd68f0995e1b312d137f768e2a1f842ee26fe73621afa05f850628fdc40 + checksum: 10c0/9d3c9df4b515f57dec1e4176bfee7c25ab560d28128ab7169894629d21f962f17b811d830c11b81f6687834327a899494ddab62f32cac409d365a37e99808552 languageName: node linkType: hard @@ -6319,14 +6725,14 @@ __metadata: linkType: hard "eslint-plugin-storybook@npm:^10.2.10": - version: 10.2.10 - resolution: "eslint-plugin-storybook@npm:10.2.10" + version: 10.4.6 + resolution: "eslint-plugin-storybook@npm:10.4.6" dependencies: "@typescript-eslint/utils": "npm:^8.48.0" peerDependencies: eslint: ">=8" - storybook: ^10.2.10 - checksum: 10c0/996e552e15324d08f0cf22ffd906dd1db7bba501c4f93b07ab6fd6d820e2303d5f3c6914c335c0a3179a7a17f1df82e5079b4a1e27394d7ad3f1673171de0194 + storybook: ^10.4.6 + checksum: 10c0/574baee7544f179ef986157b916a7e02790128f5377d4bb4da3f097d42f491479c9036350f263036c56f1cf7d98bf555868604091bcc545600b842a75e7a3b91 languageName: node linkType: hard @@ -6344,8 +6750,8 @@ __metadata: linkType: hard "eslint-plugin-vue@npm:^10.8.0": - version: 10.8.0 - resolution: "eslint-plugin-vue@npm:10.8.0" + version: 10.9.2 + resolution: "eslint-plugin-vue@npm:10.9.2" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" natural-compare: "npm:^1.4.0" @@ -6357,25 +6763,25 @@ __metadata: "@stylistic/eslint-plugin": ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 "@typescript-eslint/parser": ^7.0.0 || ^8.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - vue-eslint-parser: ^10.0.0 + vue-eslint-parser: ^10.3.0 peerDependenciesMeta: "@stylistic/eslint-plugin": optional: true "@typescript-eslint/parser": optional: true - checksum: 10c0/e2917ac90f8ea80d153ee1776a6d75fd46396ed3d988623e8578e6c78e5cf5eef04625dc62ac7bf26e78bf822f0a26c6718b64b5c6f32ec781301222c939f2c6 + checksum: 10c0/de40e38a16d9f15df039fbceff494db558dbc19b1a45291830327daf28134851b339912bb0e93e5c7d47ef7eae37bcc4a27a6a0e8c7ecf5f504b18eefe35f558 languageName: node linkType: hard "eslint-scope@npm:^8.2.0 || ^9.0.0": - version: 9.1.1 - resolution: "eslint-scope@npm:9.1.1" + version: 9.1.2 + resolution: "eslint-scope@npm:9.1.2" dependencies: "@types/esrecurse": "npm:^4.3.1" "@types/estree": "npm:^1.0.8" esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10c0/58327b26cd6a78693951668ce68c466a535259173d187cbd5c9d3cbe657cfd5dfaf1c01ec3176b8f6f1cf240b48d01d01e0f76ad9300682d9dd51d5d1514d4c1 + checksum: 10c0/9fb8bca5a73e5741efb6cec84467027b6cb6f4203ff9b43a938e272c5cd30800bde46a5c20dfd1609f840225f0b62b7673be391b20acadf8658ca9fa4729b3dd languageName: node linkType: hard @@ -6396,13 +6802,6 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^4.1.0": - version: 4.1.0 - resolution: "eslint-visitor-keys@npm:4.1.0" - checksum: 10c0/5483ef114c93a136aa234140d7aa3bd259488dae866d35cb0d0b52e6a158f614760a57256ac8d549acc590a87042cb40f6951815caa821e55dc4fd6ef4c722eb - languageName: node - linkType: hard - "eslint-visitor-keys@npm:^4.2.0 || ^5.0.0, eslint-visitor-keys@npm:^5.0.0, eslint-visitor-keys@npm:^5.0.1": version: 5.0.1 resolution: "eslint-visitor-keys@npm:5.0.1" @@ -6418,22 +6817,22 @@ __metadata: linkType: hard "eslint@npm:^9.39.3": - version: 9.39.3 - resolution: "eslint@npm:9.39.3" + version: 9.39.4 + resolution: "eslint@npm:9.39.4" dependencies: "@eslint-community/eslint-utils": "npm:^4.8.0" "@eslint-community/regexpp": "npm:^4.12.1" - "@eslint/config-array": "npm:^0.21.1" + "@eslint/config-array": "npm:^0.21.2" "@eslint/config-helpers": "npm:^0.4.2" "@eslint/core": "npm:^0.17.0" - "@eslint/eslintrc": "npm:^3.3.1" - "@eslint/js": "npm:9.39.3" + "@eslint/eslintrc": "npm:^3.3.5" + "@eslint/js": "npm:9.39.4" "@eslint/plugin-kit": "npm:^0.4.1" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" "@humanwhocodes/retry": "npm:^0.4.2" "@types/estree": "npm:^1.0.6" - ajv: "npm:^6.12.4" + ajv: "npm:^6.14.0" chalk: "npm:^4.0.0" cross-spawn: "npm:^7.0.6" debug: "npm:^4.3.2" @@ -6452,7 +6851,7 @@ __metadata: is-glob: "npm:^4.0.0" json-stable-stringify-without-jsonify: "npm:^1.0.1" lodash.merge: "npm:^4.6.2" - minimatch: "npm:^3.1.2" + minimatch: "npm:^3.1.5" natural-compare: "npm:^1.4.0" optionator: "npm:^0.9.3" peerDependencies: @@ -6462,7 +6861,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10c0/5e5dbf84d4f604f5d2d7a58c5c3fcdde30a01b8973ff3caeca8b2bacc16066717cedb4385ce52db1a2746d0b621770d4d4227cc7f44982b0b03818be2c31538d + checksum: 10c0/1955067c2d991f0c84f4c4abfafe31bb47fa3b717a7fd3e43fe1e511c6f859d7700cbca969f85661dc4c130f7aeced5e5444884314198a54428f5e5141db9337 languageName: node linkType: hard @@ -6473,36 +6872,25 @@ __metadata: languageName: node linkType: hard -"espree@npm:^10.0.1": - version: 10.2.0 - resolution: "espree@npm:10.2.0" +"espree@npm:^10.0.1, espree@npm:^10.4.0": + version: 10.4.0 + resolution: "espree@npm:10.4.0" dependencies: - acorn: "npm:^8.12.0" + acorn: "npm:^8.15.0" acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^4.1.0" - checksum: 10c0/2b6bfb683e7e5ab2e9513949879140898d80a2d9867ea1db6ff5b0256df81722633b60a7523a7c614f05a39aeea159dd09ad2a0e90c0e218732fc016f9086215 + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10c0/c63fe06131c26c8157b4083313cb02a9a54720a08e21543300e55288c40e06c3fc284bdecf108d3a1372c5934a0a88644c98714f38b6ae8ed272b40d9ea08d6b languageName: node linkType: hard "espree@npm:^10.3.0 || ^11.0.0": - version: 11.1.1 - resolution: "espree@npm:11.1.1" + version: 11.2.0 + resolution: "espree@npm:11.2.0" dependencies: acorn: "npm:^8.16.0" acorn-jsx: "npm:^5.3.2" eslint-visitor-keys: "npm:^5.0.1" - checksum: 10c0/2feae74efdfb037b9e9fcb30506799845cf20900de5e441ed03e5c51aaa249f85ea5818ff177682acc0c9bfb4ac97e1965c238ee44ac7c305aab8747177bab69 - languageName: node - linkType: hard - -"espree@npm:^10.4.0": - version: 10.4.0 - resolution: "espree@npm:10.4.0" - dependencies: - acorn: "npm:^8.15.0" - acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^4.2.1" - checksum: 10c0/c63fe06131c26c8157b4083313cb02a9a54720a08e21543300e55288c40e06c3fc284bdecf108d3a1372c5934a0a88644c98714f38b6ae8ed272b40d9ea08d6b + checksum: 10c0/cf87e18ffd9dc113eb8d16588e7757701bc10c9934a71cce8b89c2611d51672681a918307bd6b19ac3ccd0e7ba1cbccc2f815b36b52fa7e73097b251014c3d81 languageName: node linkType: hard @@ -6516,16 +6904,7 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.5.0": - version: 1.6.0 - resolution: "esquery@npm:1.6.0" - dependencies: - estraverse: "npm:^5.1.0" - checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 - languageName: node - linkType: hard - -"esquery@npm:^1.6.0": +"esquery@npm:^1.5.0, esquery@npm:^1.6.0": version: 1.7.0 resolution: "esquery@npm:1.7.0" dependencies: @@ -6580,24 +6959,24 @@ __metadata: languageName: node linkType: hard -"expect-type@npm:^1.2.2": - version: 1.3.0 - resolution: "expect-type@npm:1.3.0" - checksum: 10c0/8412b3fe4f392c420ab41dae220b09700e4e47c639a29ba7ba2e83cc6cffd2b4926f7ac9e47d7e277e8f4f02acda76fd6931cb81fd2b382fa9477ef9ada953fd +"expect-type@npm:^1.3.0": + version: 1.4.0 + resolution: "expect-type@npm:1.4.0" + checksum: 10c0/d40d76b8570695d36587beb3cc28494da2ca3ec8f04e67f5622ed2d372d850e401a9adef19c6835e1a8173903f157c79540b34c7b3fbd7cd8ce726cc903c57b7 languageName: node linkType: hard "exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + version: 3.1.3 + resolution: "exponential-backoff@npm:3.1.3" + checksum: 10c0/77e3ae682b7b1f4972f563c6dbcd2b0d54ac679e62d5d32f3e5085feba20483cf28bd505543f520e287a56d4d55a28d7874299941faf637e779a1aa5994d1267 languageName: node linkType: hard -"exsolve@npm:^1.0.7": - version: 1.0.8 - resolution: "exsolve@npm:1.0.8" - checksum: 10c0/65e44ae05bd4a4a5d87cfdbbd6b8f24389282cf9f85fa5feb17ca87ad3f354877e6af4cd99e02fc29044174891f82d1d68c77f69234410eb8f163530e6278c67 +"exsolve@npm:^1.0.8": + version: 1.1.0 + resolution: "exsolve@npm:1.1.0" + checksum: 10c0/38ecec58d6e4ddfe31b5e6773a0193057fcb8462e1c0959aee3c9441729b4db901f3b23af68963cb871fb3f83b46c49ed2f69e0ef6d5254951f483c68cc934e9 languageName: node linkType: hard @@ -6622,6 +7001,13 @@ __metadata: languageName: node linkType: hard +"fast-uri@npm:^3.0.1": + version: 3.1.2 + resolution: "fast-uri@npm:3.1.2" + checksum: 10c0/5b35641895959f3f7ab7a7b1b5542bded159346f25ec9f256817b206d50b64eda5828e90d605a2e2fc645c90519a7259c2bab2c942ee728c88b88e5be21b090d + languageName: node + linkType: hard + "fdir@npm:^6.5.0": version: 6.5.0 resolution: "fdir@npm:6.5.0" @@ -6635,9 +7021,9 @@ __metadata: linkType: hard "fflate@npm:^0.8.2": - version: 0.8.2 - resolution: "fflate@npm:0.8.2" - checksum: 10c0/03448d630c0a583abea594835a9fdb2aaf7d67787055a761515bf4ed862913cfd693b4c4ffd5c3f3b355a70cf1e19033e9ae5aedcca103188aaff91b8bd6e293 + version: 0.8.3 + resolution: "fflate@npm:0.8.3" + checksum: 10c0/eab181ca37f5348ae76d4b6f840e0026e30220e33153289ac942222d8b9638237d486507dbcc09878d724095bd354993a2ee48bbee99c8f2c6440d4448719aa7 languageName: node linkType: hard @@ -6660,9 +7046,9 @@ __metadata: linkType: hard "filesize@npm:^10.0.12": - version: 10.1.0 - resolution: "filesize@npm:10.1.0" - checksum: 10c0/4439d2d81ecd98503367cc6d2083ea94de0859a35953325d94f95c4a18302a333a77b80b5421bc9dc663cf9fb2fc1193f15963da4fd0dab3d49168902588a790 + version: 10.1.6 + resolution: "filesize@npm:10.1.6" + checksum: 10c0/9a196d64da4e947b8c0d294be09a3dfa7a634434a1fc5fb3465f1c9acc1237ea0363f245ba6e24477ea612754d942bc964d86e0e500905a72e9e0e17ae1bbdbc languageName: node linkType: hard @@ -6732,30 +7118,14 @@ __metadata: languageName: node linkType: hard -"flatted@npm:^3.2.9": - version: 3.3.1 - resolution: "flatted@npm:3.3.1" - checksum: 10c0/324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf - languageName: node - linkType: hard - -"flatted@npm:^3.3.3": - version: 3.3.3 - resolution: "flatted@npm:3.3.3" - checksum: 10c0/e957a1c6b0254aa15b8cce8533e24165abd98fadc98575db082b786b5da1b7d72062b81bfdcd1da2f4d46b6ed93bec2434e62333e9b4261d79ef2e75a10dd538 - languageName: node - linkType: hard - -"for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" - dependencies: - is-callable: "npm:^1.1.3" - checksum: 10c0/22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa +"flatted@npm:^3.2.9, flatted@npm:^3.4.2": + version: 3.4.2 + resolution: "flatted@npm:3.4.2" + checksum: 10c0/a65b67aae7172d6cdf63691be7de6c5cd5adbdfdfe2e9da1a09b617c9512ed794037741ee53d93114276bff3f93cd3b0d97d54f9b316e1e4885dde6e9ffdf7ed languageName: node linkType: hard -"for-each@npm:^0.3.5": +"for-each@npm:^0.3.3, for-each@npm:^0.3.5": version: 0.3.5 resolution: "for-each@npm:0.3.5" dependencies: @@ -6774,17 +7144,7 @@ __metadata: languageName: node linkType: hard -"foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" - dependencies: - cross-spawn: "npm:^7.0.0" - signal-exit: "npm:^4.0.1" - checksum: 10c0/9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 - languageName: node - linkType: hard - -"foreground-child@npm:^3.3.0": +"foreground-child@npm:^3.1.0, foreground-child@npm:^3.3.0": version: 3.3.1 resolution: "foreground-child@npm:3.3.1" dependencies: @@ -6808,24 +7168,6 @@ __metadata: languageName: node linkType: hard -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 - languageName: node - linkType: hard - "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" @@ -6878,29 +7220,20 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.6": - version: 1.1.6 - resolution: "function.prototype.name@npm:1.1.6" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - functions-have-names: "npm:^1.2.3" - checksum: 10c0/9eae11294905b62cb16874adb4fc687927cda3162285e0ad9612e6a1d04934005d46907362ea9cdb7428edce05a2f2c3dabc3b2d21e9fd343e9bb278230ad94b - languageName: node - linkType: hard - -"function.prototype.name@npm:^1.1.8": - version: 1.1.8 - resolution: "function.prototype.name@npm:1.1.8" +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.2.0 + resolution: "function.prototype.name@npm:1.2.0" dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - define-properties: "npm:^1.2.1" + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" functions-have-names: "npm:^1.2.3" - hasown: "npm:^2.0.2" + has-property-descriptors: "npm:^1.0.2" + hasown: "npm:^2.0.4" is-callable: "npm:^1.2.7" - checksum: 10c0/e920a2ab52663005f3cbe7ee3373e3c71c1fb5558b0b0548648cdf3e51961085032458e26c71ff1a8c8c20e7ee7caeb03d43a5d1fa8610c459333323a2e71253 + is-document.all: "npm:^1.0.0" + checksum: 10c0/b20e6370ef4f7d56d0bedf5719f6684a517a8dd3334209b4d9f51e8834859302a584187156bf024cda9f50ba2479e4d6764ac34af9532ea47d2f4d9fa6bcf90d languageName: node linkType: hard @@ -6932,27 +7265,7 @@ __metadata: languageName: node linkType: hard -"get-func-name@npm:^2.0.1": - version: 2.0.2 - resolution: "get-func-name@npm:2.0.2" - checksum: 10c0/89830fd07623fa73429a711b9daecdb304386d237c71268007f788f113505ef1d4cc2d0b9680e072c5082490aec9df5d7758bf5ac6f1c37062855e8e3dc0b9df - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" - dependencies: - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.0" - checksum: 10c0/0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": version: 1.3.1 resolution: "get-intrinsic@npm:1.3.1" dependencies: @@ -7004,17 +7317,6 @@ __metadata: languageName: node linkType: hard -"get-symbol-description@npm:^1.0.2": - version: 1.0.2 - resolution: "get-symbol-description@npm:1.0.2" - dependencies: - call-bind: "npm:^1.0.5" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/867be6d63f5e0eb026cb3b0ef695ec9ecf9310febb041072d2e142f260bd91ced9eeb426b3af98791d1064e324e653424afa6fd1af17dee373bea48ae03162bc - languageName: node - linkType: hard - "get-symbol-description@npm:^1.1.0": version: 1.1.0 resolution: "get-symbol-description@npm:1.1.0" @@ -7094,31 +7396,16 @@ __metadata: "glob-parent@npm:^6.0.2": version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: "npm:^4.0.3" - checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 - languageName: node - linkType: hard - -"glob@npm:^10.2.2, glob@npm:^10.3.10": - version: 10.3.10 - resolution: "glob@npm:10.3.10" - dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^2.3.5" - minimatch: "npm:^9.0.1" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry: "npm:^1.10.1" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/13d8a1feb7eac7945f8c8480e11cd4a44b24d26503d99a8d8ac8d5aefbf3e9802a2b6087318a829fad04cb4e829f25c5f4f1110c68966c498720dd261c7e344d + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 languageName: node linkType: hard -"glob@npm:^10.3.3": - version: 10.4.5 - resolution: "glob@npm:10.4.5" +"glob@npm:^10.4.2": + version: 10.5.0 + resolution: "glob@npm:10.5.0" dependencies: foreground-child: "npm:^3.1.0" jackspeak: "npm:^3.1.2" @@ -7128,7 +7415,7 @@ __metadata: path-scurry: "npm:^1.11.1" bin: glob: dist/esm/bin.mjs - checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e + checksum: 10c0/100705eddbde6323e7b35e1d1ac28bcb58322095bd8e63a7d0bef1a2cdafe0d0f7922a981b2b48369a4f8c1b077be5c171804534c3509dfe950dde15fbe6d828 languageName: node linkType: hard @@ -7181,18 +7468,9 @@ __metadata: linkType: hard "globals@npm:^17.3.0": - version: 17.3.0 - resolution: "globals@npm:17.3.0" - checksum: 10c0/7f21443ecaa60c6e9ff56d9fb6f10a9b5f9514e7f22e5392f715472bb220ce31c865ebf414a32695150e733fb3e1013e6322dbce70fddd1e066f372b8d55a4b8 - languageName: node - linkType: hard - -"globalthis@npm:^1.0.3": - version: 1.0.3 - resolution: "globalthis@npm:1.0.3" - dependencies: - define-properties: "npm:^1.1.3" - checksum: 10c0/0db6e9af102a5254630351557ac15e6909bc7459d3e3f6b001e59fe784c96d31108818f032d9095739355a88467459e6488ff16584ee6250cd8c27dec05af4b0 + version: 17.7.0 + resolution: "globals@npm:17.7.0" + checksum: 10c0/e83f791acf537b85fa1632ac48a45432a1999a61acd9f955b5c2145f66d6b5000a7945029874b6184fa2dfac8d33af03885a5a7ffa457866f1bcf0b40d0c1291 languageName: node linkType: hard @@ -7206,16 +7484,7 @@ __metadata: languageName: node linkType: hard -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: "npm:^1.1.3" - checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 - languageName: node - linkType: hard - -"gopd@npm:^1.2.0": +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": version: 1.2.0 resolution: "gopd@npm:1.2.0" checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead @@ -7230,8 +7499,8 @@ __metadata: linkType: hard "handlebars@npm:^4.7.7": - version: 4.7.8 - resolution: "handlebars@npm:4.7.8" + version: 4.7.9 + resolution: "handlebars@npm:4.7.9" dependencies: minimist: "npm:^1.2.5" neo-async: "npm:^2.6.2" @@ -7243,7 +7512,7 @@ __metadata: optional: true bin: handlebars: bin/handlebars - checksum: 10c0/7aff423ea38a14bb379316f3857fe0df3c5d66119270944247f155ba1f08e07a92b340c58edaa00cfe985c21508870ee5183e0634dcb53dd405f35c93ef7f10d + checksum: 10c0/22f8105a7e68e81aff2662bb434edf05f757d21d850731d71cec886d69c10cd33d3c43e34b2892968ec62de8241611851d3d0674c8ef324ea3e01dc66262faa9 languageName: node linkType: hard @@ -7254,10 +7523,10 @@ __metadata: languageName: node linkType: hard -"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 10c0/724eb1485bfa3cdff6f18d95130aa190561f00b3fcf9f19dc640baf8176b5917c143b81ec2123f8cddb6c05164a198c94b13e1377c497705ccc8e1a80306e83b +"has-bigints@npm:^1.0.2": + version: 1.1.0 + resolution: "has-bigints@npm:1.1.0" + checksum: 10c0/2de0cdc4a1ccf7a1e75ffede1876994525ac03cc6f5ae7392d3415dd475cd9eee5bceec63669ab61aa997ff6cceebb50ef75561c7002bed8988de2b9d1b40788 languageName: node linkType: hard @@ -7284,13 +7553,6 @@ __metadata: languageName: node linkType: hard -"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 - languageName: node - linkType: hard - "has-proto@npm:^1.2.0": version: 1.2.0 resolution: "has-proto@npm:1.2.0" @@ -7300,21 +7562,14 @@ __metadata: languageName: node linkType: hard -"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 - languageName: node - linkType: hard - -"has-symbols@npm:^1.1.0": +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": version: 1.1.0 resolution: "has-symbols@npm:1.1.0" checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": +"has-tostringtag@npm:^1.0.2": version: 1.0.2 resolution: "has-tostringtag@npm:1.0.2" dependencies: @@ -7340,12 +7595,12 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" +"hasown@npm:^2.0.2, hasown@npm:^2.0.3, hasown@npm:^2.0.4": + version: 2.0.4 + resolution: "hasown@npm:2.0.4" dependencies: function-bind: "npm:^1.1.2" - checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + checksum: 10c0/2d8de939e270b70618f8cebb69746620db10617dbb495bc66ddad326955ea24d3ca4af133aff3eb7c1853e0218f867bc2b050ec26fe02e3aea58f880ffc5e506 languageName: node linkType: hard @@ -7404,14 +7659,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.2": +"http-proxy-agent@npm:^7.0.2": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" dependencies: @@ -7421,16 +7669,6 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1": - version: 7.0.4 - resolution: "https-proxy-agent@npm:7.0.4" - dependencies: - agent-base: "npm:^7.0.2" - debug: "npm:4" - checksum: 10c0/bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b - languageName: node - linkType: hard - "https-proxy-agent@npm:^7.0.6": version: 7.0.6 resolution: "https-proxy-agent@npm:7.0.6" @@ -7450,15 +7688,6 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 - languageName: node - linkType: hard - "ieee754@npm:^1.1.13": version: 1.2.1 resolution: "ieee754@npm:1.2.1" @@ -7467,9 +7696,9 @@ __metadata: linkType: hard "ignore@npm:^5.2.0": - version: 5.3.1 - resolution: "ignore@npm:5.3.1" - checksum: 10c0/703f7f45ffb2a27fb2c5a8db0c32e7dee66b33a225d28e8db4e1be6474795f606686a6e3bcc50e1aa12f2042db4c9d4a7d60af3250511de74620fbed052ea4cd + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 languageName: node linkType: hard @@ -7480,27 +7709,27 @@ __metadata: languageName: node linkType: hard -"immutable@npm:^5.0.2": - version: 5.1.4 - resolution: "immutable@npm:5.1.4" - checksum: 10c0/f1c98382e4cde14a0b218be3b9b2f8441888da8df3b8c064aa756071da55fbed6ad696e5959982508456332419be9fdeaf29b2e58d0eadc45483cc16963c0446 +"immutable@npm:^5.1.5": + version: 5.1.8 + resolution: "immutable@npm:5.1.8" + checksum: 10c0/b34b237d324a94ed0f7749ae293c4b10aaa1755e0cb04c73360e18f4f35d5684551fe92c2b195c97562e57aab970ff47d04e25c5bc8c393ecde7da0f54356b48 languageName: node linkType: hard "import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" dependencies: parent-module: "npm:^1.0.0" resolve-from: "npm:^4.0.0" - checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + checksum: 10c0/bf8cc494872fef783249709385ae883b447e3eb09db0ebd15dcead7d9afe7224dad7bd7591c6b73b0b19b3c0f9640eb8ee884f01cfaf2887ab995b0b36a0cbec languageName: node linkType: hard "import-meta-resolve@npm:^4.0.0": - version: 4.0.0 - resolution: "import-meta-resolve@npm:4.0.0" - checksum: 10c0/709375e01f8c3a87b7870991ca29c630d71bb7e22b7bb0f622613173d87b41b4043b4a983800e6d38ab3867496a46f82d30df0cbc2e55792c91c23193eea67a1 + version: 4.2.0 + resolution: "import-meta-resolve@npm:4.2.0" + checksum: 10c0/3ee8aeecb61d19b49d2703987f977e9d1c7d4ba47db615a570eaa02fe414f40dfa63f7b953e842cbe8470d26df6371332bfcf21b2fd92b0112f9fea80dde2c4c languageName: node linkType: hard @@ -7549,17 +7778,6 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.7": - version: 1.0.7 - resolution: "internal-slot@npm:1.0.7" - dependencies: - es-errors: "npm:^1.3.0" - hasown: "npm:^2.0.0" - side-channel: "npm:^1.0.4" - checksum: 10c0/f8b294a4e6ea3855fc59551bbf35f2b832cf01fd5e6e2a97f5c201a071cc09b49048f856e484b67a6c721da5e55736c5b6ddafaf19e2dbeb4a3ff1821680de6c - languageName: node - linkType: hard - "internal-slot@npm:^1.1.0": version: 1.1.0 resolution: "internal-slot@npm:1.1.0" @@ -7571,37 +7789,17 @@ __metadata: languageName: node linkType: hard -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc - languageName: node - linkType: hard - "is-arguments@npm:^1.1.1": - version: 1.1.1 - resolution: "is-arguments@npm:1.1.1" - dependencies: - call-bind: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/5ff1f341ee4475350adfc14b2328b38962564b7c2076be2f5bac7bd9b61779efba99b9f844a7b82ba7654adccf8e8eb19d1bb0cc6d1c1a085e498f6793d4328f - languageName: node - linkType: hard - -"is-array-buffer@npm:^3.0.2, is-array-buffer@npm:^3.0.4": - version: 3.0.4 - resolution: "is-array-buffer@npm:3.0.4" + version: 1.2.0 + resolution: "is-arguments@npm:1.2.0" dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.1" - checksum: 10c0/42a49d006cc6130bc5424eae113e948c146f31f9d24460fc0958f855d9d810e6fd2e4519bf19aab75179af9c298ea6092459d8cafdec523cd19e529b26eab860 + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/6377344b31e9fcb707c6751ee89b11f132f32338e6a782ec2eac9393b0cbd32235dad93052998cda778ee058754860738341d8114910d50ada5615912bb929fc languageName: node linkType: hard -"is-array-buffer@npm:^3.0.5": +"is-array-buffer@npm:^3.0.2, is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": version: 3.0.5 resolution: "is-array-buffer@npm:3.0.5" dependencies: @@ -7620,20 +7818,15 @@ __metadata: linkType: hard "is-async-function@npm:^2.0.0": - version: 2.0.0 - resolution: "is-async-function@npm:2.0.0" - dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/787bc931576aad525d751fc5ce211960fe91e49ac84a5c22d6ae0bc9541945fbc3f686dc590c3175722ce4f6d7b798a93f6f8ff4847fdb2199aea6f4baf5d668 - languageName: node - linkType: hard - -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" dependencies: - has-bigints: "npm:^1.0.1" - checksum: 10c0/eb9c88e418a0d195ca545aff2b715c9903d9b0a5033bc5922fec600eb0c3d7b1ee7f882dbf2e0d5a6e694e42391be3683e4368737bd3c4a77f8ac293e7773696 + async-function: "npm:^1.0.0" + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/d70c236a5e82de6fc4d44368ffd0c2fee2b088b893511ce21e679da275a5ecc6015ff59a7d7e1bdd7ca39f71a8dbdd253cf8cce5c6b3c91cdd5b42b5ce677298 languageName: node linkType: hard @@ -7646,16 +7839,6 @@ __metadata: languageName: node linkType: hard -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" - dependencies: - call-bind: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/6090587f8a8a8534c0f816da868bc94f32810f08807aa72fa7e79f7e11c466d281486ffe7a788178809c2aa71fe3e700b167fe80dd96dad68026bfff8ebf39f7 - languageName: node - linkType: hard - "is-boolean-object@npm:^1.2.1": version: 1.2.2 resolution: "is-boolean-object@npm:1.2.2" @@ -7666,41 +7849,23 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": +"is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0": - version: 2.13.1 - resolution: "is-core-module@npm:2.13.1" - dependencies: - hasown: "npm:^2.0.0" - checksum: 10c0/2cba9903aaa52718f11c4896dabc189bab980870aae86a62dc0d5cedb546896770ee946fb14c84b7adf0735f5eaea4277243f1b95f5cefa90054f92fbcac2518 - languageName: node - linkType: hard - -"is-core-module@npm:^2.16.1": - version: 2.16.1 - resolution: "is-core-module@npm:2.16.1" - dependencies: - hasown: "npm:^2.0.2" - checksum: 10c0/898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd - languageName: node - linkType: hard - -"is-data-view@npm:^1.0.1": - version: 1.0.1 - resolution: "is-data-view@npm:1.0.1" +"is-core-module@npm:^2.16.1, is-core-module@npm:^2.16.2, is-core-module@npm:^2.5.0": + version: 2.16.2 + resolution: "is-core-module@npm:2.16.2" dependencies: - is-typed-array: "npm:^1.1.13" - checksum: 10c0/a3e6ec84efe303da859107aed9b970e018e2bee7ffcb48e2f8096921a493608134240e672a2072577e5f23a729846241d9634806e8a0e51d9129c56d5f65442d + hasown: "npm:^2.0.3" + checksum: 10c0/14b4258390283709c15476d023ec173e27458d5d014ccdb8ed39d576e551c3fa45498b7c9fe178f1529c4cb2648ddd58852a6a62107a019f6e349529f277518a languageName: node linkType: hard -"is-data-view@npm:^1.0.2": +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": version: 1.0.2 resolution: "is-data-view@npm:1.0.2" dependencies: @@ -7711,16 +7876,7 @@ __metadata: languageName: node linkType: hard -"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" - dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/eed21e5dcc619c48ccef804dfc83a739dbb2abee6ca202838ee1bd5f760fe8d8a93444f0d49012ad19bb7c006186e2884a1b92f6e1c056da7fd23d0a9ad5992e - languageName: node - linkType: hard - -"is-date-object@npm:^1.1.0": +"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": version: 1.1.0 resolution: "is-date-object@npm:1.1.0" dependencies: @@ -7739,6 +7895,15 @@ __metadata: languageName: node linkType: hard +"is-document.all@npm:^1.0.0": + version: 1.0.0 + resolution: "is-document.all@npm:1.0.0" + dependencies: + call-bound: "npm:^1.0.4" + checksum: 10c0/955c20ed5bf01d49da8243b4c714947a6ff64b6d9ba0e12bdbfa654a3e7c47f72cc01c6cd2905e85512d02bc3a1290edd73857bca8842566ff9dcfb7c3f92dae + languageName: node + linkType: hard + "is-expression@npm:^4.0.0": version: 4.0.0 resolution: "is-expression@npm:4.0.0" @@ -7773,11 +7938,15 @@ __metadata: linkType: hard "is-generator-function@npm:^1.0.10": - version: 1.0.10 - resolution: "is-generator-function@npm:1.0.10" + version: 1.1.2 + resolution: "is-generator-function@npm:1.1.2" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/df03514df01a6098945b5a0cfa1abff715807c8e72f57c49a0686ad54b3b74d394e2d8714e6f709a71eb00c9630d48e73ca1796c1ccc84ac95092c1fecc0d98b + call-bound: "npm:^1.0.4" + generator-function: "npm:^2.0.0" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/83da102e89c3e3b71d67b51d47c9f9bc862bceb58f87201727e27f7fa19d1d90b0ab223644ecaee6fc6e3d2d622bb25c966fbdaf87c59158b01ce7c0fe2fa372 languageName: node linkType: hard @@ -7801,13 +7970,6 @@ __metadata: languageName: node linkType: hard -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d - languageName: node - linkType: hard - "is-map@npm:^2.0.2, is-map@npm:^2.0.3": version: 2.0.3 resolution: "is-map@npm:2.0.3" @@ -7822,15 +7984,6 @@ __metadata: languageName: node linkType: hard -"is-number-object@npm:^1.0.4": - version: 1.0.7 - resolution: "is-number-object@npm:1.0.7" - dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/aad266da1e530f1804a2b7bd2e874b4869f71c98590b3964f9d06cc9869b18f8d1f4778f838ecd2a11011bce20aeecb53cb269ba916209b79c24580416b74b1b - languageName: node - linkType: hard - "is-number-object@npm:^1.1.1": version: 1.1.1 resolution: "is-number-object@npm:1.1.1" @@ -7876,17 +8029,7 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.0.3, is-regex@npm:^1.1.4": - version: 1.1.4 - resolution: "is-regex@npm:1.1.4" - dependencies: - call-bind: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/bb72aae604a69eafd4a82a93002058c416ace8cde95873589a97fc5dac96a6c6c78a9977d487b7b95426a8f5073969124dd228f043f9f604f041f32fcc465fc1 - languageName: node - linkType: hard - -"is-regex@npm:^1.2.1": +"is-regex@npm:^1.0.3, is-regex@npm:^1.1.4, is-regex@npm:^1.2.1": version: 1.2.1 resolution: "is-regex@npm:1.2.1" dependencies: @@ -7905,16 +8048,7 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": - version: 1.0.3 - resolution: "is-shared-array-buffer@npm:1.0.3" - dependencies: - call-bind: "npm:^1.0.7" - checksum: 10c0/adc11ab0acbc934a7b9e5e9d6c588d4ec6682f6fea8cda5180721704fa32927582ede5b123349e32517fdadd07958973d24716c80e7ab198970c47acc09e59c7 - languageName: node - linkType: hard - -"is-shared-array-buffer@npm:^1.0.4": +"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.4": version: 1.0.4 resolution: "is-shared-array-buffer@npm:1.0.4" dependencies: @@ -7930,16 +8064,7 @@ __metadata: languageName: node linkType: hard -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" - dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/905f805cbc6eedfa678aaa103ab7f626aac9ebbdc8737abb5243acaa61d9820f8edc5819106b8fcd1839e33db21de9f0116ae20de380c8382d16dc2a601921f6 - languageName: node - linkType: hard - -"is-string@npm:^1.1.1": +"is-string@npm:^1.0.7, is-string@npm:^1.1.1": version: 1.1.1 resolution: "is-string@npm:1.1.1" dependencies: @@ -7949,16 +8074,7 @@ __metadata: languageName: node linkType: hard -"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" - dependencies: - has-symbols: "npm:^1.0.2" - checksum: 10c0/9381dd015f7c8906154dbcbf93fad769de16b4b961edc94f88d26eb8c555935caa23af88bda0c93a18e65560f6d7cca0fd5a3f8a8e1df6f1abbb9bead4502ef7 - languageName: node - linkType: hard - -"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": +"is-symbol@npm:^1.1.1": version: 1.1.1 resolution: "is-symbol@npm:1.1.1" dependencies: @@ -7978,16 +8094,7 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.13": - version: 1.1.13 - resolution: "is-typed-array@npm:1.1.13" - dependencies: - which-typed-array: "npm:^1.1.14" - checksum: 10c0/fa5cb97d4a80e52c2cc8ed3778e39f175a1a2ae4ddf3adae3187d69586a1fd57cfa0b095db31f66aa90331e9e3da79184cea9c6abdcd1abc722dc3c3edd51cca - languageName: node - linkType: hard - -"is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": version: 1.1.15 resolution: "is-typed-array@npm:1.1.15" dependencies: @@ -8010,16 +8117,7 @@ __metadata: languageName: node linkType: hard -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" - dependencies: - call-bind: "npm:^1.0.2" - checksum: 10c0/1545c5d172cb690c392f2136c23eec07d8d78a7f57d0e41f10078aa4f5daf5d7f57b6513a67514ab4f073275ad00c9822fc8935e00229d0a2089e1c02685d4b1 - languageName: node - linkType: hard - -"is-weakref@npm:^1.1.1": +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.1": version: 1.1.1 resolution: "is-weakref@npm:1.1.1" dependencies: @@ -8029,19 +8127,12 @@ __metadata: linkType: hard "is-weakset@npm:^2.0.3": - version: 2.0.3 - resolution: "is-weakset@npm:2.0.3" + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" dependencies: - call-bind: "npm:^1.0.7" - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/8ad6141b6a400e7ce7c7442a13928c676d07b1f315ab77d9912920bf5f4170622f43126f111615788f26c3b1871158a6797c862233124507db0bcc33a9537d1a - languageName: node - linkType: hard - -"is-what@npm:^5.2.0": - version: 5.5.0 - resolution: "is-what@npm:5.5.0" - checksum: 10c0/065c8a4ac651988a495cc0211c2754c198788383c9fe1bbfdf6d237c423114a0c5f2fc3e26ad7ea43a63cd4169f4503f584305acbac91706d5308cc14dedd1bd + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/6491eba08acb8dc9532da23cb226b7d0192ede0b88f16199e592e4769db0a077119c1f5d2283d1e0d16d739115f70046e887e477eb0e66cd90e1bb29f28ba647 languageName: node linkType: hard @@ -8082,10 +8173,10 @@ __metadata: languageName: node linkType: hard -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 +"isexe@npm:^4.0.0": + version: 4.0.0 + resolution: "isexe@npm:4.0.0" + checksum: 10c0/5884815115bceac452877659a9c7726382531592f43dc29e5d48b7c4100661aed54018cb90bd36cb2eaeba521092570769167acbb95c18d39afdccbcca06c5ce languageName: node linkType: hard @@ -8105,7 +8196,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-instrument@npm:^6.0.2, istanbul-lib-instrument@npm:^6.0.3": +"istanbul-lib-instrument@npm:^6.0.2": version: 6.0.3 resolution: "istanbul-lib-instrument@npm:6.0.3" dependencies: @@ -8178,19 +8269,6 @@ __metadata: languageName: node linkType: hard -"jackspeak@npm:^2.3.5": - version: 2.3.6 - resolution: "jackspeak@npm:2.3.6" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 10c0/f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 - languageName: node - linkType: hard - "jackspeak@npm:^3.1.2": version: 3.4.3 resolution: "jackspeak@npm:3.4.3" @@ -8204,7 +8282,7 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^2.6.1": +"jiti@npm:2.6.1": version: 2.6.1 resolution: "jiti@npm:2.6.1" bin: @@ -8214,26 +8292,26 @@ __metadata: linkType: hard "js-beautify@npm:^1.14.9": - version: 1.15.1 - resolution: "js-beautify@npm:1.15.1" + version: 1.15.4 + resolution: "js-beautify@npm:1.15.4" dependencies: config-chain: "npm:^1.1.13" editorconfig: "npm:^1.0.4" - glob: "npm:^10.3.3" + glob: "npm:^10.4.2" js-cookie: "npm:^3.0.5" - nopt: "npm:^7.2.0" + nopt: "npm:^7.2.1" bin: css-beautify: js/bin/css-beautify.js html-beautify: js/bin/html-beautify.js js-beautify: js/bin/js-beautify.js - checksum: 10c0/4140dd95537143eb429b6c8e47e21310f16c032d97a03163c6c7c0502bc663242a5db08d3ad941b87f24a142ce4f9190c556d2340bcd056545326377dfae5362 + checksum: 10c0/300386f648579feacda98640742e8db50d4504bc896673af8bc784a5864585abf89ad8d1f257f2cfd4e3da951e0e4d1f027aa3c21537edb920bd498a0e27bd86 languageName: node linkType: hard "js-cookie@npm:^3.0.5": - version: 3.0.5 - resolution: "js-cookie@npm:3.0.5" - checksum: 10c0/04a0e560407b4489daac3a63e231d35f4e86f78bff9d792011391b49c59f721b513411cd75714c418049c8dc9750b20fcddad1ca5a2ca616c3aca4874cce5b3a + version: 3.0.8 + resolution: "js-cookie@npm:3.0.8" + checksum: 10c0/421912a4a55535bda32b3059835864e1182c3af5b4516df00a060edc1fa5a53d38bb8d5a91d5d305e396206f4fd11e829f17850aa5aa8164118c04d8ebf1ff5d languageName: node linkType: hard @@ -8252,43 +8330,25 @@ __metadata: linkType: hard "js-yaml@npm:^3.13.1": - version: 3.14.2 - resolution: "js-yaml@npm:3.14.2" + version: 3.15.0 + resolution: "js-yaml@npm:3.15.0" dependencies: argparse: "npm:^1.0.7" esprima: "npm:^4.0.0" bin: js-yaml: bin/js-yaml.js - checksum: 10c0/3261f25912f5dd76605e5993d0a126c2b6c346311885d3c483706cd722efe34f697ea0331f654ce27c00a42b426e524518ec89d65ed02ea47df8ad26dcc8ce69 - languageName: node - linkType: hard - -"js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: "npm:^2.0.1" - bin: - js-yaml: bin/js-yaml.js - checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + checksum: 10c0/ca966bd354ac5b1b7a4694ebdba46526796aa3a6a99529fa540af2abf85918bd155a50ccc0166b413130a00622999973754458ec01e7095bc902177bfdbd5b64 languageName: node linkType: hard -"js-yaml@npm:^4.1.1": - version: 4.1.1 - resolution: "js-yaml@npm:4.1.1" +"js-yaml@npm:^4.1.0, js-yaml@npm:^4.1.1": + version: 4.3.0 + resolution: "js-yaml@npm:4.3.0" dependencies: argparse: "npm:^2.0.1" bin: js-yaml: bin/js-yaml.js - checksum: 10c0/561c7d7088c40a9bb53cc75becbfb1df6ae49b34b5e6e5a81744b14ae8667ec564ad2527709d1a6e7d5e5fa6d483aa0f373a50ad98d42fde368ec4a190d4fae7 - languageName: node - linkType: hard - -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 + checksum: 10c0/058b30473d6915ca5b4feb11e2f7d4d97242f98d00a798ed48dd90b46b7c640398afe9128c5db22c5300f8c6528fe2a174b9a93f351a70ebc28c6203938d8bff languageName: node linkType: hard @@ -8336,11 +8396,11 @@ __metadata: linkType: hard "jsesc@npm:^3.0.2": - version: 3.0.2 - resolution: "jsesc@npm:3.0.2" + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" bin: jsesc: bin/jsesc - checksum: 10c0/ef22148f9e793180b14d8a145ee6f9f60f301abf443288117b4b6c53d0ecd58354898dc506ccbb553a5f7827965cd38bc5fb726575aae93c5e8915e2de8290e1 + checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 languageName: node linkType: hard @@ -8428,15 +8488,15 @@ __metadata: linkType: hard "jsonfile@npm:^6.1.0": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" + version: 6.2.1 + resolution: "jsonfile@npm:6.2.1" dependencies: graceful-fs: "npm:^4.1.6" universalify: "npm:^2.0.0" dependenciesMeta: graceful-fs: optional: true - checksum: 10c0/4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 + checksum: 10c0/e1abf000ecee9942d4d028a8e02dc752617face227d72afd1cfb2187e2433079e625bf82b807a313689db71b6472c6b2b389a2340d2798737b1199a39631c28a languageName: node linkType: hard @@ -8495,6 +8555,126 @@ __metadata: languageName: node linkType: hard +"lightningcss-android-arm64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-android-arm64@npm:1.32.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-arm64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-darwin-arm64@npm:1.32.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-x64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-darwin-x64@npm:1.32.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-freebsd-x64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-freebsd-x64@npm:1.32.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-linux-arm-gnueabihf@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.32.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"lightningcss-linux-arm64-gnu@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm64-gnu@npm:1.32.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-arm64-musl@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm64-musl@npm:1.32.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-linux-x64-gnu@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-x64-gnu@npm:1.32.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-x64-musl@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-x64-musl@npm:1.32.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-win32-arm64-msvc@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-win32-arm64-msvc@npm:1.32.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-win32-x64-msvc@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-win32-x64-msvc@npm:1.32.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"lightningcss@npm:^1.32.0": + version: 1.32.0 + resolution: "lightningcss@npm:1.32.0" + dependencies: + detect-libc: "npm:^2.0.3" + lightningcss-android-arm64: "npm:1.32.0" + lightningcss-darwin-arm64: "npm:1.32.0" + lightningcss-darwin-x64: "npm:1.32.0" + lightningcss-freebsd-x64: "npm:1.32.0" + lightningcss-linux-arm-gnueabihf: "npm:1.32.0" + lightningcss-linux-arm64-gnu: "npm:1.32.0" + lightningcss-linux-arm64-musl: "npm:1.32.0" + lightningcss-linux-x64-gnu: "npm:1.32.0" + lightningcss-linux-x64-musl: "npm:1.32.0" + lightningcss-win32-arm64-msvc: "npm:1.32.0" + lightningcss-win32-x64-msvc: "npm:1.32.0" + dependenciesMeta: + lightningcss-android-arm64: + optional: true + lightningcss-darwin-arm64: + optional: true + lightningcss-darwin-x64: + optional: true + lightningcss-freebsd-x64: + optional: true + lightningcss-linux-arm-gnueabihf: + optional: true + lightningcss-linux-arm64-gnu: + optional: true + lightningcss-linux-arm64-musl: + optional: true + lightningcss-linux-x64-gnu: + optional: true + lightningcss-linux-x64-musl: + optional: true + lightningcss-win32-arm64-msvc: + optional: true + lightningcss-win32-x64-msvc: + optional: true + checksum: 10c0/70945bd55097af46fc9fab7f5ed09cd5869d85940a2acab7ee06d0117004a1d68155708a2d462531cea2fc3c67aefc9333a7068c80b0b78dd404c16838809e03 + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -8515,13 +8695,13 @@ __metadata: linkType: hard "local-pkg@npm:^1.1.2": - version: 1.1.2 - resolution: "local-pkg@npm:1.1.2" + version: 1.2.1 + resolution: "local-pkg@npm:1.2.1" dependencies: mlly: "npm:^1.7.4" pkg-types: "npm:^2.3.0" quansync: "npm:^0.2.11" - checksum: 10c0/1bcfcc5528dea95cba3caa478126a348d3985aad9f69ecf7802c13efef90897e1c5ff7851974332c5e6d4a4698efe610fef758a068c8bc3feb5322aeb35d5993 + checksum: 10c0/d21ccfc2595b2eddf7369f19797533573feb06820d8b5766467902a7a54e36b3a1f2b8cc2aa4481a2ad432c8e798576eabfac2f1ec0646a8e11a68694c2ef9d4 languageName: node linkType: hard @@ -8634,9 +8814,9 @@ __metadata: linkType: hard "lodash@npm:^4.17.15": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + version: 4.18.1 + resolution: "lodash@npm:4.18.1" + checksum: 10c0/757228fc68805c59789e82185135cf85f05d0b2d3d54631d680ca79ec21944ec8314d4533639a14b8bcfbd97a517e78960933041a5af17ecb693ec6eecb99a27 languageName: node linkType: hard @@ -8651,16 +8831,7 @@ __metadata: languageName: node linkType: hard -"loupe@npm:^3.1.0": - version: 3.1.1 - resolution: "loupe@npm:3.1.1" - dependencies: - get-func-name: "npm:^2.0.1" - checksum: 10c0/99f88badc47e894016df0c403de846fedfea61154aadabbf776c8428dd59e8d8378007135d385d737de32ae47980af07d22ba7bec5ef7beebd721de9baa0a0af - languageName: node - linkType: hard - -"loupe@npm:^3.1.4": +"loupe@npm:^3.1.0, loupe@npm:^3.1.4": version: 3.2.1 resolution: "loupe@npm:3.2.1" checksum: 10c0/910c872cba291309664c2d094368d31a68907b6f5913e989d301b5c25f30e97d76d77f23ab3bf3b46d0f601ff0b6af8810c10c31b91d2c6b2f132809ca2cc705 @@ -8676,13 +8847,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.2.0 - resolution: "lru-cache@npm:10.2.0" - checksum: 10c0/c9847612aa2daaef102d30542a8d6d9b2c2bb36581c1bf0dc3ebf5e5f3352c772a749e604afae2e46873b930a9e9523743faac4e5b937c576ab29196774712ee - languageName: node - linkType: hard - "lru-cache@npm:^10.2.0": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" @@ -8690,10 +8854,10 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^11.0.0, lru-cache@npm:^11.2.5, lru-cache@npm:^11.2.6": - version: 11.2.6 - resolution: "lru-cache@npm:11.2.6" - checksum: 10c0/73bbffb298760e71b2bfe8ebc16a311c6a60ceddbba919cfedfd8635c2d125fbfb5a39b71818200e67973b11f8d59c5a9e31d6f90722e340e90393663a66e5cd +"lru-cache@npm:^11.0.0, lru-cache@npm:^11.2.6": + version: 11.5.1 + resolution: "lru-cache@npm:11.5.1" + checksum: 10c0/7b341cea79a8efe9c6a6f20c8757a77eca5b25d7ff983ccf4e11e547b81f6787824baa1c84705251dff84ab4ffac85717ac354b9d02e465f86a9f8b166409979 languageName: node linkType: hard @@ -8740,25 +8904,7 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.0": - version: 0.30.8 - resolution: "magic-string@npm:0.30.8" - dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.4.15" - checksum: 10c0/51a1f06f678c082aceddfb5943de9b6bdb88f2ea1385a1c2adf116deb73dfcfa50df6c222901d691b529455222d4d68d0b28be5689ac6f69b3baa3462861f922 - languageName: node - linkType: hard - -"magic-string@npm:^0.30.11": - version: 0.30.11 - resolution: "magic-string@npm:0.30.11" - dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.0" - checksum: 10c0/b9eb370773d0bd90ca11a848753409d8e5309b1ad56d2a1aa49d6649da710a6d2fe7237ad1a643c5a5d3800de2b9946ed9690acdfc00e6cc1aeafff3ab1752c4 - languageName: node - linkType: hard - -"magic-string@npm:^0.30.19, magic-string@npm:^0.30.21": +"magic-string@npm:^0.30.0, magic-string@npm:^0.30.11, magic-string@npm:^0.30.19, magic-string@npm:^0.30.21": version: 0.30.21 resolution: "magic-string@npm:0.30.21" dependencies: @@ -8767,14 +8913,14 @@ __metadata: languageName: node linkType: hard -"magicast@npm:^0.5.1": - version: 0.5.2 - resolution: "magicast@npm:0.5.2" +"magicast@npm:^0.5.2": + version: 0.5.3 + resolution: "magicast@npm:0.5.3" dependencies: - "@babel/parser": "npm:^7.29.0" + "@babel/parser": "npm:^7.29.3" "@babel/types": "npm:^7.29.0" source-map-js: "npm:^1.2.1" - checksum: 10c0/924af677643c5a0a7d6cdb3247c0eb96fa7611b2ba6a5e720d35d81c503d3d9f5948eb5227f80f90f82ea3e7d38cffd10bb988f3fc09020db428e14f26e960d7 + checksum: 10c0/e288c027ae5f2a794a59148cb114f4b60f1d5c03090de6c60b4d187f12d1de9158779cd7c39cea391609f4f10cd7ea737929f25f7ce44f7a96ba96ec1a477e39 languageName: node linkType: hard @@ -8803,25 +8949,6 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^13.0.0": - version: 13.0.0 - resolution: "make-fetch-happen@npm:13.0.0" - dependencies: - "@npmcli/agent": "npm:^2.0.0" - cacache: "npm:^18.0.0" - http-cache-semantics: "npm:^4.1.1" - is-lambda: "npm:^1.0.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^3.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" - promise-retry: "npm:^2.0.1" - ssri: "npm:^10.0.0" - checksum: 10c0/43b9f6dcbc6fe8b8604cb6396957c3698857a15ba4dbc38284f7f0e61f248300585ef1eb8cc62df54e9c724af977e45b5cdfd88320ef7f53e45070ed3488da55 - languageName: node - linkType: hard - "map-obj@npm:^1.0.0": version: 1.0.1 resolution: "map-obj@npm:1.0.1" @@ -8857,10 +8984,10 @@ __metadata: languageName: node linkType: hard -"mdn-data@npm:2.12.2": - version: 2.12.2 - resolution: "mdn-data@npm:2.12.2" - checksum: 10c0/b22443b71d70f72ccc3c6ba1608035431a8fc18c3c8fc53523f06d20e05c2ac10f9b53092759a2ca85cf02f0d37036f310b581ce03e7b99ac74d388ef8152ade +"mdn-data@npm:2.27.1": + version: 2.27.1 + resolution: "mdn-data@npm:2.27.1" + checksum: 10c0/eb8abf5d22e4d1e090346f5e81b67d23cef14c83940e445da5c44541ad874dc8fb9f6ca236e8258c3a489d9fb5884188a4d7d58773adb9089ac2c0b966796393 languageName: node linkType: hard @@ -8904,64 +9031,37 @@ __metadata: languageName: node linkType: hard -"min-indent@npm:^1.0.0, min-indent@npm:^1.0.1": +"min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" checksum: 10c0/7e207bd5c20401b292de291f02913230cb1163abca162044f7db1d951fa245b174dc00869d40dd9a9f32a885ad6a5f3e767ee104cf278f399cb4e92d3f582d5c languageName: node linkType: hard -"minimatch@npm:9.0.1": - version: 9.0.1 - resolution: "minimatch@npm:9.0.1" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/aa043eb8822210b39888a5d0d28df0017b365af5add9bd522f180d2a6962de1cbbf1bdeacdb1b17f410dc3336bc8d76fb1d3e814cdc65d00c2f68e01f0010096 - languageName: node - linkType: hard - "minimatch@npm:^10.2.2": - version: 10.2.2 - resolution: "minimatch@npm:10.2.2" - dependencies: - brace-expansion: "npm:^5.0.2" - checksum: 10c0/098831f2f542cb802e1f249c809008a016e1fef6b3a9eda9cf9ecb2b3d7979083951bd47c0c82fcf34330bd3b36638a493d4fa8e24cce58caf5b481de0f4e238 - languageName: node - linkType: hard - -"minimatch@npm:^3.0.4, minimatch@npm:^3.1.2": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" + version: 10.2.5 + resolution: "minimatch@npm:10.2.5" dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + brace-expansion: "npm:^5.0.5" + checksum: 10c0/6bb058bd6324104b9ec2f763476a35386d05079c1f5fe4fbf1f324a25237cd4534d6813ecd71f48208f4e635c1221899bef94c3c89f7df55698fe373aaae20fd languageName: node linkType: hard -"minimatch@npm:^3.1.1": - version: 3.1.3 - resolution: "minimatch@npm:3.1.3" +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2, minimatch@npm:^3.1.5": + version: 3.1.5 + resolution: "minimatch@npm:3.1.5" dependencies: brace-expansion: "npm:^1.1.7" - checksum: 10c0/c1ffce4be47e88df013f66f55176c25a93fdd8ad15735309cf1782f0433a02f363cee298f8763ceaaaf85e70ff7f30dc84a1a8d00a6fb6ca72032e5b51f9b89c - languageName: node - linkType: hard - -"minimatch@npm:^9.0.1": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac + checksum: 10c0/2ecbdc0d33f07bddb0315a8b5afbcb761307a8778b48f0b312418ccbced99f104a2d17d8aca7573433c70e8ccd1c56823a441897a45e384ea76ef401a26ace70 languageName: node linkType: hard -"minimatch@npm:^9.0.3, minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" +"minimatch@npm:^9.0.1, minimatch@npm:^9.0.3, minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": + version: 9.0.9 + resolution: "minimatch@npm:9.0.9" dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed + brace-expansion: "npm:^2.0.2" + checksum: 10c0/0b6a58530dbb00361745aa6c8cffaba4c90f551afe7c734830bd95fd88ebf469dd7355a027824ea1d09e37181cfeb0a797fb17df60c15ac174303ac110eb7e86 languageName: node linkType: hard @@ -8983,108 +9083,19 @@ __metadata: languageName: node linkType: hard -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e - languageName: node - linkType: hard - -"minipass-fetch@npm:^3.0.0": - version: 3.0.4 - resolution: "minipass-fetch@npm:3.0.4" - dependencies: - encoding: "npm:^0.1.13" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^1.0.3" - minizlib: "npm:^2.1.2" - dependenciesMeta: - encoding: - optional: true - checksum: 10c0/1b63c1f3313e88eeac4689f1b71c9f086598db9a189400e3ee960c32ed89e06737fa23976c9305c2d57464fb3fcdc12749d3378805c9d6176f5569b0d0ee8a75 - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c - languageName: node - linkType: hard - -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 10c0/a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": - version: 7.0.4 - resolution: "minipass@npm:7.0.4" - checksum: 10c0/6c7370a6dfd257bf18222da581ba89a5eaedca10e158781232a8b5542a90547540b4b9b7e7f490e4cda43acfbd12e086f0453728ecf8c19e0ef6921bc5958ac5 - languageName: node - linkType: hard - -"minipass@npm:^7.1.2": - version: 7.1.2 - resolution: "minipass@npm:7.1.2" - checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 - languageName: node - linkType: hard - -"minipass@npm:^7.1.3": +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.4, minipass@npm:^7.1.2, minipass@npm:^7.1.3": version: 7.1.3 resolution: "minipass@npm:7.1.3" checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb languageName: node linkType: hard -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" +"minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" dependencies: - minipass: "npm:^3.0.0" - yallist: "npm:^4.0.0" - checksum: 10c0/64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 - languageName: node - linkType: hard - -"mitt@npm:^3.0.1": - version: 3.0.1 - resolution: "mitt@npm:3.0.1" - checksum: 10c0/3ab4fdecf3be8c5255536faa07064d05caa3dd332bd318ff02e04621f7b3069ca1de9106cfe8e7ced675abfc2bec2ce4c4ef321c4a1bb1fb29df8ae090741913 + minipass: "npm:^7.1.2" + checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec languageName: node linkType: hard @@ -9095,24 +9106,15 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^1.0.3": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: 10c0/46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf - languageName: node - linkType: hard - -"mlly@npm:^1.7.4, mlly@npm:^1.8.0": - version: 1.8.0 - resolution: "mlly@npm:1.8.0" +"mlly@npm:^1.7.4, mlly@npm:^1.8.2": + version: 1.8.2 + resolution: "mlly@npm:1.8.2" dependencies: - acorn: "npm:^8.15.0" + acorn: "npm:^8.16.0" pathe: "npm:^2.0.3" pkg-types: "npm:^1.3.1" - ufo: "npm:^1.6.1" - checksum: 10c0/f174b844ae066c71e9b128046677868e2e28694f0bbeeffbe760b2a9d8ff24de0748d0fde6fabe706700c1d2e11d3c0d7a53071b5ea99671592fac03364604ab + ufo: "npm:^1.6.3" + checksum: 10c0/aa826683a6daddf2aef65f9c8142e362731cf8e415a5591faf92fd51040a76697e45ab6dbb7a3b38be74e0f8c464825a7eabe827750455c7472421953f5da733 languageName: node linkType: hard @@ -9124,16 +9126,9 @@ __metadata: linkType: hard "mrmime@npm:^2.0.0": - version: 2.0.0 - resolution: "mrmime@npm:2.0.0" - checksum: 10c0/312b35ed288986aec90955410b21ed7427fd1e4ee318cb5fc18765c8d029eeded9444faa46589e5b1ed6b35fb2054a802ac8dcb917ddf6b3e189cb3bf11a965c - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc + version: 2.0.1 + resolution: "mrmime@npm:2.0.1" + checksum: 10c0/af05afd95af202fdd620422f976ad67dc18e6ee29beb03dd1ce950ea6ef664de378e44197246df4c7cdd73d47f2e7143a6e26e473084b9e4aa2095c0ad1e1761 languageName: node linkType: hard @@ -9151,21 +9146,12 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.11": - version: 3.3.11 - resolution: "nanoid@npm:3.3.11" - bin: - nanoid: bin/nanoid.cjs - checksum: 10c0/40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b - languageName: node - linkType: hard - -"nanoid@npm:^3.3.7": - version: 3.3.7 - resolution: "nanoid@npm:3.3.7" +"nanoid@npm:^3.3.12": + version: 3.3.15 + resolution: "nanoid@npm:3.3.15" bin: nanoid: bin/nanoid.cjs - checksum: 10c0/e3fb661aa083454f40500473bb69eedb85dc160e763150b9a2c567c7e9ff560ce028a9f833123b618a6ea742e311138b591910e795614a629029e86e180660f3 + checksum: 10c0/e0b12e3a1d361f74150fa4b25631d0ae29f7162dab01a12f0f1be1f53b7a2a219f9b729504e474d4821207d0fe349bd3c97569ab5cf7ec2fff6aa94711956c93 languageName: node linkType: hard @@ -9183,13 +9169,6 @@ __metadata: languageName: node linkType: hard -"negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 - languageName: node - linkType: hard - "neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" @@ -9208,11 +9187,11 @@ __metadata: linkType: hard "node-abi@npm:^3.3.0": - version: 3.87.0 - resolution: "node-abi@npm:3.87.0" + version: 3.92.0 + resolution: "node-abi@npm:3.92.0" dependencies: semver: "npm:^7.3.5" - checksum: 10c0/41cfc361edd1b0711d412ca9e1a475180c5b897868bd5583df7ff73e30e6044cc7de307df36c2257203320f17fadf7e82dfdf5a9f6fd510a8578e3fe3ed67ebb + checksum: 10c0/d5fe063701542e1beef9017251b64dd648db200ae8d76745ddd07d475504734066ee69966609322ed4842a3b2f20cd3fbb0e1d2e675e3c25ff925d1e20fd06be languageName: node linkType: hard @@ -9225,23 +9204,35 @@ __metadata: languageName: node linkType: hard +"node-exports-info@npm:^1.6.0": + version: 1.6.2 + resolution: "node-exports-info@npm:1.6.2" + dependencies: + array.prototype.flatmap: "npm:^1.3.3" + es-errors: "npm:^1.3.0" + object.entries: "npm:^1.1.9" + semver: "npm:^6.3.1" + checksum: 10c0/5278fab18e8c97f45275c51819c3078ca9488361e875bc01b680776a339d2fee1ca9c6fcfb972df14945a1b184cc9924a1d9ba87e90f6cb3422c7f5b6900f4bc + languageName: node + linkType: hard + "node-gyp@npm:latest": - version: 10.0.1 - resolution: "node-gyp@npm:10.0.1" + version: 13.0.0 + resolution: "node-gyp@npm:13.0.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" - glob: "npm:^10.3.10" graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^13.0.0" - nopt: "npm:^7.0.0" - proc-log: "npm:^3.0.0" + nopt: "npm:^10.0.0" + proc-log: "npm:^7.0.0" semver: "npm:^7.3.5" - tar: "npm:^6.1.2" - which: "npm:^4.0.0" + tar: "npm:^7.5.4" + tinyglobby: "npm:^0.2.12" + undici: "npm:^6.25.0" + which: "npm:^7.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10c0/abddfff7d873312e4ed4a5fb75ce893a5c4fb69e7fcb1dfa71c28a6b92a7f1ef6b62790dffb39181b5a82728ba8f2f32d229cf8cbe66769fe02cea7db4a555aa + checksum: 10c0/e7525c427db2d16aa368b8947187de83083d2a8dda23e3e096a71c22ae637ac5bb8ed7cf6c871f1b9118cd2729dbfee4ff3a4245e2b79226900227b15831b492 languageName: node linkType: hard @@ -9254,32 +9245,25 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.14": - version: 2.0.14 - resolution: "node-releases@npm:2.0.14" - checksum: 10c0/199fc93773ae70ec9969bc6d5ac5b2bbd6eb986ed1907d751f411fef3ede0e4bfdb45ceb43711f8078bea237b6036db8b1bf208f6ff2b70c7d615afd157f3ab9 - languageName: node - linkType: hard - -"node-releases@npm:^2.0.18": - version: 2.0.18 - resolution: "node-releases@npm:2.0.18" - checksum: 10c0/786ac9db9d7226339e1dc84bbb42007cb054a346bd9257e6aa154d294f01bc6a6cddb1348fa099f079be6580acbb470e3c048effd5f719325abd0179e566fd27 +"node-releases@npm:^2.0.48": + version: 2.0.50 + resolution: "node-releases@npm:2.0.50" + checksum: 10c0/ac75ed433864114cfd9862034960bb4f49838343dc9fc31dc7d5be8189ce5f39510ad0bb3a697efe3193d50ab6921e7a3a6ce3aae2a6f8abe62719ffd40a4cac languageName: node linkType: hard -"nopt@npm:^7.0.0": - version: 7.2.0 - resolution: "nopt@npm:7.2.0" +"nopt@npm:^10.0.0": + version: 10.0.1 + resolution: "nopt@npm:10.0.1" dependencies: - abbrev: "npm:^2.0.0" + abbrev: "npm:^5.0.0" bin: nopt: bin/nopt.js - checksum: 10c0/9bd7198df6f16eb29ff16892c77bcf7f0cc41f9fb5c26280ac0def2cf8cf319f3b821b3af83eba0e74c85807cc430a16efe0db58fe6ae1f41e69519f585b6aff + checksum: 10c0/980d89257f9587f3e1f77877ddbf905d6aa3b738ec33e49a4fa1a059a0dd82eb28063982b150654a7ae9de386f2ead60e56172db7d37cf56de545f7392a2a26a languageName: node linkType: hard -"nopt@npm:^7.2.0": +"nopt@npm:^7.2.1": version: 7.2.1 resolution: "nopt@npm:7.2.1" dependencies: @@ -9367,13 +9351,6 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.1": - version: 1.13.1 - resolution: "object-inspect@npm:1.13.1" - checksum: 10c0/fad603f408e345c82e946abdf4bfd774260a5ed3e5997a0b057c44153ac32c7271ff19e3a5ae39c858da683ba045ccac2f65245c12763ce4e8594f818f4a648d - languageName: node - linkType: hard - "object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": version: 1.13.4 resolution: "object-inspect@npm:1.13.4" @@ -9398,19 +9375,7 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.4, object.assign@npm:^4.1.5": - version: 4.1.5 - resolution: "object.assign@npm:4.1.5" - dependencies: - call-bind: "npm:^1.0.5" - define-properties: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" - object-keys: "npm:^1.1.1" - checksum: 10c0/60108e1fa2706f22554a4648299b0955236c62b3685c52abf4988d14fffb0e7731e00aa8c6448397e3eb63d087dcc124a9f21e1980f36d0b2667f3c18bacd469 - languageName: node - linkType: hard - -"object.assign@npm:^4.1.7": +"object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": version: 4.1.7 resolution: "object.assign@npm:4.1.7" dependencies: @@ -9459,18 +9424,7 @@ __metadata: languageName: node linkType: hard -"object.values@npm:^1.1.6": - version: 1.2.0 - resolution: "object.values@npm:1.2.0" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/15809dc40fd6c5529501324fec5ff08570b7d70fb5ebbe8e2b3901afec35cf2b3dc484d1210c6c642cd3e7e0a5e18dd1d6850115337fef46bdae14ab0cb18ac3 - languageName: node - linkType: hard - -"object.values@npm:^1.2.1": +"object.values@npm:^1.1.6, object.values@npm:^1.2.1": version: 1.2.1 resolution: "object.values@npm:1.2.1" dependencies: @@ -9483,9 +9437,9 @@ __metadata: linkType: hard "obug@npm:^2.1.1": - version: 2.1.1 - resolution: "obug@npm:2.1.1" - checksum: 10c0/59dccd7de72a047e08f8649e94c1015ec72f94eefb6ddb57fb4812c4b425a813bc7e7cd30c9aca20db3c59abc3c85cc7a62bb656a968741d770f4e8e02bc2e78 + version: 2.1.3 + resolution: "obug@npm:2.1.3" + checksum: 10c0/cb8187fed0a5fc8445507c950e89f3c1bd43895658c398b5803f6b7804dfa0c562975ecce1e67f3d9247d521452a5bfade9e0e951cc0326b7444272f7c24d25f languageName: node linkType: hard @@ -9511,16 +9465,16 @@ __metadata: linkType: hard "optionator@npm:^0.9.3": - version: 0.9.3 - resolution: "optionator@npm:0.9.3" + version: 0.9.4 + resolution: "optionator@npm:0.9.4" dependencies: - "@aashutoshrathi/word-wrap": "npm:^1.2.3" deep-is: "npm:^0.1.3" fast-levenshtein: "npm:^2.0.6" levn: "npm:^0.4.1" prelude-ls: "npm:^1.2.1" type-check: "npm:^0.4.0" - checksum: 10c0/66fba794d425b5be51353035cf3167ce6cfa049059cbb93229b819167687e0f48d2bc4603fcb21b091c99acb516aae1083624675b15c4765b2e4693a085e959c + word-wrap: "npm:^1.2.5" + checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 languageName: node linkType: hard @@ -9535,6 +9489,142 @@ __metadata: languageName: node linkType: hard +"oxc-parser@npm:^0.127.0": + version: 0.127.0 + resolution: "oxc-parser@npm:0.127.0" + dependencies: + "@oxc-parser/binding-android-arm-eabi": "npm:0.127.0" + "@oxc-parser/binding-android-arm64": "npm:0.127.0" + "@oxc-parser/binding-darwin-arm64": "npm:0.127.0" + "@oxc-parser/binding-darwin-x64": "npm:0.127.0" + "@oxc-parser/binding-freebsd-x64": "npm:0.127.0" + "@oxc-parser/binding-linux-arm-gnueabihf": "npm:0.127.0" + "@oxc-parser/binding-linux-arm-musleabihf": "npm:0.127.0" + "@oxc-parser/binding-linux-arm64-gnu": "npm:0.127.0" + "@oxc-parser/binding-linux-arm64-musl": "npm:0.127.0" + "@oxc-parser/binding-linux-ppc64-gnu": "npm:0.127.0" + "@oxc-parser/binding-linux-riscv64-gnu": "npm:0.127.0" + "@oxc-parser/binding-linux-riscv64-musl": "npm:0.127.0" + "@oxc-parser/binding-linux-s390x-gnu": "npm:0.127.0" + "@oxc-parser/binding-linux-x64-gnu": "npm:0.127.0" + "@oxc-parser/binding-linux-x64-musl": "npm:0.127.0" + "@oxc-parser/binding-openharmony-arm64": "npm:0.127.0" + "@oxc-parser/binding-wasm32-wasi": "npm:0.127.0" + "@oxc-parser/binding-win32-arm64-msvc": "npm:0.127.0" + "@oxc-parser/binding-win32-ia32-msvc": "npm:0.127.0" + "@oxc-parser/binding-win32-x64-msvc": "npm:0.127.0" + "@oxc-project/types": "npm:^0.127.0" + dependenciesMeta: + "@oxc-parser/binding-android-arm-eabi": + optional: true + "@oxc-parser/binding-android-arm64": + optional: true + "@oxc-parser/binding-darwin-arm64": + optional: true + "@oxc-parser/binding-darwin-x64": + optional: true + "@oxc-parser/binding-freebsd-x64": + optional: true + "@oxc-parser/binding-linux-arm-gnueabihf": + optional: true + "@oxc-parser/binding-linux-arm-musleabihf": + optional: true + "@oxc-parser/binding-linux-arm64-gnu": + optional: true + "@oxc-parser/binding-linux-arm64-musl": + optional: true + "@oxc-parser/binding-linux-ppc64-gnu": + optional: true + "@oxc-parser/binding-linux-riscv64-gnu": + optional: true + "@oxc-parser/binding-linux-riscv64-musl": + optional: true + "@oxc-parser/binding-linux-s390x-gnu": + optional: true + "@oxc-parser/binding-linux-x64-gnu": + optional: true + "@oxc-parser/binding-linux-x64-musl": + optional: true + "@oxc-parser/binding-openharmony-arm64": + optional: true + "@oxc-parser/binding-wasm32-wasi": + optional: true + "@oxc-parser/binding-win32-arm64-msvc": + optional: true + "@oxc-parser/binding-win32-ia32-msvc": + optional: true + "@oxc-parser/binding-win32-x64-msvc": + optional: true + checksum: 10c0/9d109fb3a79c0862a36434cc01c8c0e8f6cf5f1efe9369e02d2183fd518479b10262cf092da2e7f8328befae446afa05ccf742ce12f8346d81429c8f2cdf1651 + languageName: node + linkType: hard + +"oxc-resolver@npm:^11.19.1": + version: 11.21.3 + resolution: "oxc-resolver@npm:11.21.3" + dependencies: + "@oxc-resolver/binding-android-arm-eabi": "npm:11.21.3" + "@oxc-resolver/binding-android-arm64": "npm:11.21.3" + "@oxc-resolver/binding-darwin-arm64": "npm:11.21.3" + "@oxc-resolver/binding-darwin-x64": "npm:11.21.3" + "@oxc-resolver/binding-freebsd-x64": "npm:11.21.3" + "@oxc-resolver/binding-linux-arm-gnueabihf": "npm:11.21.3" + "@oxc-resolver/binding-linux-arm-musleabihf": "npm:11.21.3" + "@oxc-resolver/binding-linux-arm64-gnu": "npm:11.21.3" + "@oxc-resolver/binding-linux-arm64-musl": "npm:11.21.3" + "@oxc-resolver/binding-linux-ppc64-gnu": "npm:11.21.3" + "@oxc-resolver/binding-linux-riscv64-gnu": "npm:11.21.3" + "@oxc-resolver/binding-linux-riscv64-musl": "npm:11.21.3" + "@oxc-resolver/binding-linux-s390x-gnu": "npm:11.21.3" + "@oxc-resolver/binding-linux-x64-gnu": "npm:11.21.3" + "@oxc-resolver/binding-linux-x64-musl": "npm:11.21.3" + "@oxc-resolver/binding-openharmony-arm64": "npm:11.21.3" + "@oxc-resolver/binding-wasm32-wasi": "npm:11.21.3" + "@oxc-resolver/binding-win32-arm64-msvc": "npm:11.21.3" + "@oxc-resolver/binding-win32-x64-msvc": "npm:11.21.3" + dependenciesMeta: + "@oxc-resolver/binding-android-arm-eabi": + optional: true + "@oxc-resolver/binding-android-arm64": + optional: true + "@oxc-resolver/binding-darwin-arm64": + optional: true + "@oxc-resolver/binding-darwin-x64": + optional: true + "@oxc-resolver/binding-freebsd-x64": + optional: true + "@oxc-resolver/binding-linux-arm-gnueabihf": + optional: true + "@oxc-resolver/binding-linux-arm-musleabihf": + optional: true + "@oxc-resolver/binding-linux-arm64-gnu": + optional: true + "@oxc-resolver/binding-linux-arm64-musl": + optional: true + "@oxc-resolver/binding-linux-ppc64-gnu": + optional: true + "@oxc-resolver/binding-linux-riscv64-gnu": + optional: true + "@oxc-resolver/binding-linux-riscv64-musl": + optional: true + "@oxc-resolver/binding-linux-s390x-gnu": + optional: true + "@oxc-resolver/binding-linux-x64-gnu": + optional: true + "@oxc-resolver/binding-linux-x64-musl": + optional: true + "@oxc-resolver/binding-openharmony-arm64": + optional: true + "@oxc-resolver/binding-wasm32-wasi": + optional: true + "@oxc-resolver/binding-win32-arm64-msvc": + optional: true + "@oxc-resolver/binding-win32-x64-msvc": + optional: true + checksum: 10c0/d25c35bacc6f8f7fa54c99e19666972bf32574f8b68d705a3bfff1c6ef3e8d0262695ecba57d9b156765c30098ee4b8ae4ad37ba48668952b85e6a319444100b + languageName: node + linkType: hard + "p-limit@npm:^1.1.0": version: 1.3.0 resolution: "p-limit@npm:1.3.0" @@ -9607,15 +9697,6 @@ __metadata: languageName: node linkType: hard -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: "npm:^3.0.0" - checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 - languageName: node - linkType: hard - "p-try@npm:^1.0.0": version: 1.0.0 resolution: "p-try@npm:1.0.0" @@ -9681,11 +9762,11 @@ __metadata: linkType: hard "parse5@npm:^8.0.0": - version: 8.0.0 - resolution: "parse5@npm:8.0.0" + version: 8.0.1 + resolution: "parse5@npm:8.0.1" dependencies: - entities: "npm:^6.0.0" - checksum: 10c0/8279892dcd77b2f2229707f60eb039e303adf0288812b2a8fd5acf506a4d432da833c6c5d07a6554bef722c2367a81ef4a1f7e9336564379a7dba3e798bf16b3 + entities: "npm:^8.0.0" + checksum: 10c0/c3c1c5aab55f6e4be5245599790e56e64be7764a4a0edd7f98db4fe3bb380f63add752fa047dff0496446c25f4104f0c7c1967723de640bde92306a7bb67ed2f languageName: node linkType: hard @@ -9731,16 +9812,6 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^1.10.1": - version: 1.10.1 - resolution: "path-scurry@npm:1.10.1" - dependencies: - lru-cache: "npm:^9.1.1 || ^10.0.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10c0/e5dc78a7348d25eec61ab166317e9e9c7b46818aa2c2b9006c507a6ff48c672d011292d9662527213e558f5652ce0afcc788663a061d8b59ab495681840c0c1e - languageName: node - linkType: hard - "path-scurry@npm:^1.11.1": version: 1.11.1 resolution: "path-scurry@npm:1.11.1" @@ -9785,9 +9856,9 @@ __metadata: linkType: hard "pathval@npm:^2.0.0": - version: 2.0.0 - resolution: "pathval@npm:2.0.0" - checksum: 10c0/602e4ee347fba8a599115af2ccd8179836a63c925c23e04bd056d0674a64b39e3a081b643cc7bc0b84390517df2d800a46fcc5598d42c155fe4977095c2f77c5 + version: 2.0.1 + resolution: "pathval@npm:2.0.1" + checksum: 10c0/460f4709479fbf2c45903a65655fc8f0a5f6d808f989173aeef5fdea4ff4f303dc13f7870303999add60ec49d4c14733895c0a869392e9866f1091fa64fd7581 languageName: node linkType: hard @@ -9798,38 +9869,24 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:1.1.1, picocolors@npm:^1.1.1": +"picocolors@npm:1.1.1, picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 languageName: node linkType: hard -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: 10c0/20a5b249e331c14479d94ec6817a182fd7a5680debae82705747b2db7ec50009a5f6648d0621c561b0572703f84dbef0858abcbd5856d3c5511426afcb1961f7 - languageName: node - linkType: hard - -"picocolors@npm:^1.1.0": - version: 1.1.0 - resolution: "picocolors@npm:1.1.0" - checksum: 10c0/86946f6032148801ef09c051c6fb13b5cf942eaf147e30ea79edb91dd32d700934edebe782a1078ff859fb2b816792e97ef4dab03d7f0b804f6b01a0df35e023 - languageName: node - linkType: hard - "picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + version: 2.3.2 + resolution: "picomatch@npm:2.3.2" + checksum: 10c0/a554d1709e59be97d1acb9eaedbbc700a5c03dbd4579807baed95100b00420bc729335440ef15004ae2378984e2487a7c1cebd743cfdb72b6fa9ab69223c0d61 languageName: node linkType: hard -"picomatch@npm:^4.0.2, picomatch@npm:^4.0.3": - version: 4.0.3 - resolution: "picomatch@npm:4.0.3" - checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 +"picomatch@npm:^4.0.2, picomatch@npm:^4.0.3, picomatch@npm:^4.0.4": + version: 4.0.4 + resolution: "picomatch@npm:4.0.4" + checksum: 10c0/e2c6023372cc7b5764719a5ffb9da0f8e781212fa7ca4bd0562db929df8e117460f00dff3cb7509dacfc06b86de924b247f504d0ce1806a37fac4633081466b0 languageName: node linkType: hard @@ -9847,17 +9904,6 @@ __metadata: languageName: node linkType: hard -"pixelmatch@npm:7.1.0": - version: 7.1.0 - resolution: "pixelmatch@npm:7.1.0" - dependencies: - pngjs: "npm:^7.0.0" - bin: - pixelmatch: bin/pixelmatch - checksum: 10c0/ff069f92edaa841ac9b58b0ab74e1afa1f3b5e770eea0218c96bac1da4e752f5f6b79a0f9c4ba6b02afb955d39b8c78bcc3cc884f8122b67a1f2efbbccbe1a73 - languageName: node - linkType: hard - "pkg-dir@npm:^4.1.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" @@ -9879,37 +9925,37 @@ __metadata: linkType: hard "pkg-types@npm:^2.3.0": - version: 2.3.0 - resolution: "pkg-types@npm:2.3.0" + version: 2.3.1 + resolution: "pkg-types@npm:2.3.1" dependencies: - confbox: "npm:^0.2.2" - exsolve: "npm:^1.0.7" + confbox: "npm:^0.2.4" + exsolve: "npm:^1.0.8" pathe: "npm:^2.0.3" - checksum: 10c0/d2bbddc5b81bd4741e1529c08ef4c5f1542bbdcf63498b73b8e1d84cff71806d1b8b1577800549bb569cb7aa20056257677b979bff48c97967cba7e64f72ae12 + checksum: 10c0/dd9b20682426abaddcac9dc786aa22542e12df15a03dea2afa7bf54da0933358c6c7f545c0c3c1c7b24a2904ab4a451bf4e34a50c6837e458359eea30c257ed4 languageName: node linkType: hard -"playwright-core@npm:1.58.2": - version: 1.58.2 - resolution: "playwright-core@npm:1.58.2" +"playwright-core@npm:1.61.1": + version: 1.61.1 + resolution: "playwright-core@npm:1.61.1" bin: playwright-core: cli.js - checksum: 10c0/5aa15b2b764e6ffe738293a09081a6f7023847a0dbf4cd05fe10eed2e25450d321baf7482f938f2d2eb330291e197fa23e57b29a5b552b89927ceb791266225b + checksum: 10c0/c28896ba82a602182e240ed4f9c467fb0dd9cb57d510f8aba9f25183fe1cde3a0105725a29baffa4157fe885bbb11e228032a2aad0424111584fde45303f07bd languageName: node linkType: hard -"playwright@npm:^1.55.0": - version: 1.58.2 - resolution: "playwright@npm:1.58.2" +"playwright@npm:^1.61.1": + version: 1.61.1 + resolution: "playwright@npm:1.61.1" dependencies: fsevents: "npm:2.3.2" - playwright-core: "npm:1.58.2" + playwright-core: "npm:1.61.1" dependenciesMeta: fsevents: optional: true bin: playwright: cli.js - checksum: 10c0/d060d9b7cc124bd8b5dffebaab5e84f6b34654a553758fe7b19cc598dfbee93f6ecfbdc1832b40a6380ae04eade86ef3285ba03aa0b136799e83402246dc0727 + checksum: 10c0/cea1bc4d2a64ec3ef683891606774029da7b8a8036ed98332565cec2f8e89549ca1fab9a89fbfba4e08e27e0d7e7d148031e965af66d5ff97bb3c34058cfcad0 languageName: node linkType: hard @@ -9920,42 +9966,31 @@ __metadata: languageName: node linkType: hard -"possible-typed-array-names@npm:^1.0.0": - version: 1.0.0 - resolution: "possible-typed-array-names@npm:1.0.0" - checksum: 10c0/d9aa22d31f4f7680e20269db76791b41c3a32c01a373e25f8a4813b4d45f7456bfc2b6d68f752dc4aab0e0bb0721cb3d76fb678c9101cb7a16316664bc2c73fd +"possible-typed-array-names@npm:^1.0.0, possible-typed-array-names@npm:^1.1.0": + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: 10c0/c810983414142071da1d644662ce4caebce890203eb2bc7bf119f37f3fe5796226e117e6cca146b521921fa6531072674174a3325066ac66fce089a53e1e5196 languageName: node linkType: hard "postcss-selector-parser@npm:^7.1.0": - version: 7.1.1 - resolution: "postcss-selector-parser@npm:7.1.1" - dependencies: - cssesc: "npm:^3.0.0" - util-deprecate: "npm:^1.0.2" - checksum: 10c0/02d3b1589ddcddceed4b583b098b95a7266dacd5135f041e5d913ebb48e874fd333a36e564cc9a2ec426a464cb18db11cb192ac76247aced5eba8c951bf59507 - languageName: node - linkType: hard - -"postcss@npm:^8.4.47": - version: 8.4.47 - resolution: "postcss@npm:8.4.47" + version: 7.1.4 + resolution: "postcss-selector-parser@npm:7.1.4" dependencies: - nanoid: "npm:^3.3.7" - picocolors: "npm:^1.1.0" - source-map-js: "npm:^1.2.1" - checksum: 10c0/929f68b5081b7202709456532cee2a145c1843d391508c5a09de2517e8c4791638f71dd63b1898dba6712f8839d7a6da046c72a5e44c162e908f5911f57b5f44 + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 10c0/3d533d25bab83592e7134be0435e6cb1e2865f5e7d9fde65f1e7e1c75ccc5905168c9f55b05d2a3e10d01914a178433d3a54eab003f5ef6aa9a9d6816926caa2 languageName: node linkType: hard -"postcss@npm:^8.5.6": - version: 8.5.6 - resolution: "postcss@npm:8.5.6" +"postcss@npm:^8.4.47, postcss@npm:^8.5.15, postcss@npm:^8.5.6": + version: 8.5.15 + resolution: "postcss@npm:8.5.15" dependencies: - nanoid: "npm:^3.3.11" + nanoid: "npm:^3.3.12" picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10c0/5127cc7c91ed7a133a1b7318012d8bfa112da9ef092dddf369ae699a1f10ebbd89b1b9f25f3228795b84585c72aabd5ced5fc11f2ba467eedf7b081a66fad024 + checksum: 10c0/7f2e63ae22fbe43aace1bf652bd99da4e90737c64194d49e51ddc9cd0f9e51ff2861a7d734379b494deffa03a880a5c65eec70bc29ee9ebaa7136dde3eee8f31 languageName: node linkType: hard @@ -9999,10 +10034,10 @@ __metadata: languageName: node linkType: hard -"proc-log@npm:^3.0.0": - version: 3.0.0 - resolution: "proc-log@npm:3.0.0" - checksum: 10c0/f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc +"proc-log@npm:^7.0.0": + version: 7.0.0 + resolution: "proc-log@npm:7.0.0" + checksum: 10c0/b89c2d862604f35fec795477b0c7e376feab3ba0d4f4d291c4e959567442697cf451ac557d0623c1cc38af45a78128b983410f397a10c5d3a67f76c33de4754b languageName: node linkType: hard @@ -10022,16 +10057,6 @@ __metadata: languageName: node linkType: hard -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: "npm:^2.0.2" - retry: "npm:^0.12.0" - checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 - languageName: node - linkType: hard - "promise@npm:^7.0.1": version: 7.3.1 resolution: "promise@npm:7.3.1" @@ -10070,9 +10095,9 @@ __metadata: languageName: node linkType: hard -"pug-code-gen@npm:^3.0.3": - version: 3.0.3 - resolution: "pug-code-gen@npm:3.0.3" +"pug-code-gen@npm:^3.0.4": + version: 3.0.4 + resolution: "pug-code-gen@npm:3.0.4" dependencies: constantinople: "npm:^4.0.1" doctypes: "npm:^1.1.0" @@ -10082,7 +10107,7 @@ __metadata: pug-runtime: "npm:^3.0.1" void-elements: "npm:^3.1.0" with: "npm:^7.0.0" - checksum: 10c0/517a93930dbc80bc7fa5f60ff324229a07cc5ab70ed9d344ce105e2fe24de68db5121c8457a9ba99cdc8d48dd18779dd34956ebfcab009b3c1c6843a3cade109 + checksum: 10c0/701c12bf8c0fed6f67110903357ff8dc3958138e8fc9d315e69fd560deb0b092784072d4c0d70140679e5c413c0f077bc807f5aca25106f9c956f626c476274b languageName: node linkType: hard @@ -10171,10 +10196,10 @@ __metadata: linkType: hard "pug@npm:^3.0.2": - version: 3.0.3 - resolution: "pug@npm:3.0.3" + version: 3.0.4 + resolution: "pug@npm:3.0.4" dependencies: - pug-code-gen: "npm:^3.0.3" + pug-code-gen: "npm:^3.0.4" pug-filters: "npm:^4.0.0" pug-lexer: "npm:^5.0.1" pug-linker: "npm:^4.0.0" @@ -10182,17 +10207,17 @@ __metadata: pug-parser: "npm:^6.0.0" pug-runtime: "npm:^3.0.1" pug-strip-comments: "npm:^2.0.0" - checksum: 10c0/bda53d3a6deea1d348cd5ab17427c77f3d74165510ad16f4fd182cc63618ad09388ecda317d17122ee890c8a68f9a54b96221fce7f44a332e463fdbb10a9d1e2 + checksum: 10c0/898258a95960a1819db70ea044002db9790e5cc93d169ac9798da522c884599c0c1b67da1bda34f82d11fe2df26df1588b406fdc7e0c9f08e0fc174303bb81ee languageName: node linkType: hard "pump@npm:^3.0.0": - version: 3.0.3 - resolution: "pump@npm:3.0.3" + version: 3.0.4 + resolution: "pump@npm:3.0.4" dependencies: end-of-stream: "npm:^1.1.0" once: "npm:^1.3.1" - checksum: 10c0/ada5cdf1d813065bbc99aa2c393b8f6beee73b5de2890a8754c9f488d7323ffd2ca5f5a0943b48934e3fcbd97637d0337369c3c631aeb9614915db629f1c75c9 + checksum: 10c0/2780e66b5471c19e3e3e1063b84f3f6a3a08367f24c5ed552f98cd5901e6ada27c7ad6495d4244f553fd03b01884a4561933064f053f47c8994d84fd352768ea languageName: node linkType: hard @@ -10239,17 +10264,17 @@ __metadata: linkType: hard "react-docgen-typescript@npm:^2.2.2": - version: 2.2.2 - resolution: "react-docgen-typescript@npm:2.2.2" + version: 2.4.0 + resolution: "react-docgen-typescript@npm:2.4.0" peerDependencies: typescript: ">= 4.3.x" - checksum: 10c0/d31a061a21b5d4b67d4af7bc742541fd9e16254bd32861cd29c52565bc2175f40421a3550d52b6a6b0d0478e7cc408558eb0060a0bdd2957b02cfceeb0ee1e88 + checksum: 10c0/18e3e1c80d28abcdd72e62261d2f70b0904d9b088f9c2ebe485ffee5e46f5735208bc174a20ed2772112b3ca6432b5f3d5f0ac345872fe76e541f84543e49e50 languageName: node linkType: hard "react-docgen@npm:^8.0.0, react-docgen@npm:^8.0.2": - version: 8.0.2 - resolution: "react-docgen@npm:8.0.2" + version: 8.0.3 + resolution: "react-docgen@npm:8.0.3" dependencies: "@babel/core": "npm:^7.28.0" "@babel/traverse": "npm:^7.28.0" @@ -10261,34 +10286,22 @@ __metadata: doctrine: "npm:^3.0.0" resolve: "npm:^1.22.1" strip-indent: "npm:^4.0.0" - checksum: 10c0/25e2dd48957c52749cf44bdcf172f3b47d42d8bb8c51000bceb136ff018cbe0a78610d04f12d8bbb882df0d86884e8d05b1d7a1cc39586de356ef5bb9fceab71 + checksum: 10c0/0231fb9177bc7c633f3d1f228eebb0ee90a2f0feac50b1869ef70b0a3683b400d7875547a2d5168f2619b63d4cc29d7c45ae33d3f621fc67a7fa6790ac2049f6 languageName: node linkType: hard "react-dom@npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0": - version: 19.2.4 - resolution: "react-dom@npm:19.2.4" + version: 19.2.7 + resolution: "react-dom@npm:19.2.7" dependencies: scheduler: "npm:^0.27.0" peerDependencies: - react: ^19.2.4 - checksum: 10c0/f0c63f1794dedb154136d4d0f59af00b41907f4859571c155940296808f4b94bf9c0c20633db75b5b2112ec13d8d7dd4f9bf57362ed48782f317b11d05a44f35 - languageName: node - linkType: hard - -"react-dom@npm:^18.2.0": - version: 18.2.0 - resolution: "react-dom@npm:18.2.0" - dependencies: - loose-envify: "npm:^1.1.0" - scheduler: "npm:^0.23.0" - peerDependencies: - react: ^18.2.0 - checksum: 10c0/66dfc5f93e13d0674e78ef41f92ed21dfb80f9c4ac4ac25a4b51046d41d4d2186abc915b897f69d3d0ebbffe6184e7c5876f2af26bfa956f179225d921be713a + react: ^19.2.7 + checksum: 10c0/970ff600f6e80d47d39e2f226f12f226173b3cba3382efc97c5f0cd663de9af38c7a4c11c213fb936094faeac83060d660247accaa96b752180d5b951b9cfecb languageName: node linkType: hard -"react-dom@npm:^18.3.1": +"react-dom@npm:^18.2.0, react-dom@npm:^18.3.1": version: 18.3.1 resolution: "react-dom@npm:18.3.1" dependencies: @@ -10337,32 +10350,23 @@ __metadata: linkType: hard "react-transition-state@npm:^2.3.3": - version: 2.3.3 - resolution: "react-transition-state@npm:2.3.3" + version: 2.4.0 + resolution: "react-transition-state@npm:2.4.0" peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 10c0/701e0adf639c0f05ee043431472211f8a7805488448a4908c9d97c431be26847acfe8ba6b0772931c305496598ea16329bdace407260fdba95be2844374c91e3 + checksum: 10c0/f0858a6d572d0dd20cbf02de9bd7983fc09d826ec01ea4295ea49e0910e1045763da3caa28cbe29fe88118b712900b964b618f06ac22377c5bd99d7ede074050 languageName: node linkType: hard "react@npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0": - version: 19.2.4 - resolution: "react@npm:19.2.4" - checksum: 10c0/cd2c9ff67a720799cc3b38a516009986f7fc4cb8d3e15716c6211cf098d1357ee3e348ab05ad0600042bbb0fd888530ba92e329198c92eafa0994f5213396596 - languageName: node - linkType: hard - -"react@npm:^18.2.0": - version: 18.2.0 - resolution: "react@npm:18.2.0" - dependencies: - loose-envify: "npm:^1.1.0" - checksum: 10c0/b562d9b569b0cb315e44b48099f7712283d93df36b19a39a67c254c6686479d3980b7f013dc931f4a5a3ae7645eae6386b4aa5eea933baa54ecd0f9acb0902b8 + version: 19.2.7 + resolution: "react@npm:19.2.7" + checksum: 10c0/0bd0e2f1bbd4ba97561c6597bf8a5fec05e6476fe61e165c1065598d16668efc6715205599c94d3ddd49d36cb0f21cbf1b9bcc18ee840b805ce222c3e8d558ac languageName: node linkType: hard -"react@npm:^18.3.1": +"react@npm:^18.2.0, react@npm:^18.3.1": version: 18.3.1 resolution: "react@npm:18.3.1" dependencies: @@ -10441,13 +10445,6 @@ __metadata: languageName: node linkType: hard -"readdirp@npm:^4.0.1": - version: 4.1.2 - resolution: "readdirp@npm:4.1.2" - checksum: 10c0/60a14f7619dec48c9c850255cd523e2717001b0e179dc7037cfa0895da7b9e9ab07532d324bfb118d73a710887d1e35f79c495fa91582784493e085d18c72c62 - languageName: node - linkType: hard - "readdirp@npm:^5.0.0": version: 5.0.0 resolution: "readdirp@npm:5.0.0" @@ -10455,29 +10452,16 @@ __metadata: languageName: node linkType: hard -"recast@npm:^0.23.1": - version: 0.23.9 - resolution: "recast@npm:0.23.9" - dependencies: - ast-types: "npm:^0.16.1" - esprima: "npm:~4.0.0" - source-map: "npm:~0.6.1" - tiny-invariant: "npm:^1.3.3" - tslib: "npm:^2.0.1" - checksum: 10c0/65d6e780351f0180ea4fe5c9593ac18805bf2b79977f5bedbbbf26f6d9b619ed0f6992c1bf9e06dd40fca1aea727ad6d62463cfb5d3a33342ee5a6e486305fe5 - languageName: node - linkType: hard - -"recast@npm:^0.23.5": - version: 0.23.6 - resolution: "recast@npm:0.23.6" +"recast@npm:^0.23.1, recast@npm:^0.23.5": + version: 0.23.12 + resolution: "recast@npm:0.23.12" dependencies: ast-types: "npm:^0.16.1" esprima: "npm:~4.0.0" source-map: "npm:~0.6.1" tiny-invariant: "npm:^1.3.3" tslib: "npm:^2.0.1" - checksum: 10c0/589c1a96aea7656a844f56278ffe99e3360717991955e9409221f2c1582a922f8179c803c8d35ca61743facfa0ad895acfe73dcc76076e0717db04c508166d44 + checksum: 10c0/6abedaca3ce696b1f3d4e0a9c458319d5e24a8dc2666e91ae9729882f523c144558f4d415b40d398eed6a3956500656299df44ca8c4dba8e35a75bb454a067fc languageName: node linkType: hard @@ -10491,7 +10475,7 @@ __metadata: languageName: node linkType: hard -"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": +"reflect.getprototypeof@npm:^1.0.10, reflect.getprototypeof@npm:^1.0.9": version: 1.0.10 resolution: "reflect.getprototypeof@npm:1.0.10" dependencies: @@ -10514,31 +10498,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.1": - version: 1.5.3 - resolution: "regexp.prototype.flags@npm:1.5.3" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-errors: "npm:^1.3.0" - set-function-name: "npm:^2.0.2" - checksum: 10c0/e1a7c7dc42cc91abf73e47a269c4b3a8f225321b7f617baa25821f6a123a91d23a73b5152f21872c566e699207e1135d075d2251cd3e84cc96d82a910adf6020 - languageName: node - linkType: hard - -"regexp.prototype.flags@npm:^1.5.2": - version: 1.5.2 - resolution: "regexp.prototype.flags@npm:1.5.2" - dependencies: - call-bind: "npm:^1.0.6" - define-properties: "npm:^1.2.1" - es-errors: "npm:^1.3.0" - set-function-name: "npm:^2.0.1" - checksum: 10c0/0f3fc4f580d9c349f8b560b012725eb9c002f36daa0041b3fbf6f4238cb05932191a4d7d5db3b5e2caa336d5150ad0402ed2be81f711f9308fe7e1a9bf9bd552 - languageName: node - linkType: hard - -"regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": +"regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: @@ -10603,69 +10563,63 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.10.0, resolve@npm:^1.15.1, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8": - version: 1.22.8 - resolution: "resolve@npm:1.22.8" +"resolve@npm:^1.10.0, resolve@npm:^1.15.1, resolve@npm:^1.22.1, resolve@npm:^1.22.8": + version: 1.22.12 + resolution: "resolve@npm:1.22.12" dependencies: - is-core-module: "npm:^2.13.0" + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.16.1" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a + checksum: 10c0/b16dc9b537c02e8c3388f7d3dcff9741d3071625f9a97ac1c885f2b0ca51e78df22328fb6d6ef214dd9101fb7cfc19aa2836fe3410402a94f3f7b8639c7149bf languageName: node linkType: hard -"resolve@npm:^2.0.0-next.5": - version: 2.0.0-next.5 - resolution: "resolve@npm:2.0.0-next.5" +"resolve@npm:^2.0.0-next.5, resolve@npm:^2.0.0-next.6": + version: 2.0.0-next.7 + resolution: "resolve@npm:2.0.0-next.7" dependencies: - is-core-module: "npm:^2.13.0" + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.16.2" + node-exports-info: "npm:^1.6.0" + object-keys: "npm:^1.1.1" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/a6c33555e3482ea2ec4c6e3d3bf0d78128abf69dca99ae468e64f1e30acaa318fd267fb66c8836b04d558d3e2d6ed875fe388067e7d8e0de647d3c21af21c43a + checksum: 10c0/8c6fa17ccdb826a3a52387ed8c42bf705dbc19d5494da52a86661b124b5b88fad5d8edbbb4434a1b563ecf7768368b7da9fb9489e20f36e02f7551a4ea87d707 languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.15.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": - version: 1.22.8 - resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.15.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": + version: 1.22.12 + resolution: "resolve@patch:resolve@npm%3A1.22.12#optional!builtin::version=1.22.12&hash=c3c19d" dependencies: - is-core-module: "npm:^2.13.0" + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.16.1" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729 + checksum: 10c0/fc6519984ae1f894d877c0060ba8b1f5ba3bc0e85a02f74e141929c118c23d74d9735619a9cc2965397387e514884245c65d72a40731dcb6cfc84c7bcdc8321e languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin": - version: 2.0.0-next.5 - resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d" +"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin, resolve@patch:resolve@npm%3A^2.0.0-next.6#optional!builtin": + version: 2.0.0-next.7 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.7#optional!builtin::version=2.0.0-next.7&hash=c3c19d" dependencies: - is-core-module: "npm:^2.13.0" + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.16.2" + node-exports-info: "npm:^1.6.0" + object-keys: "npm:^1.1.1" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/78ad6edb8309a2bfb720c2c1898f7907a37f858866ce11a5974643af1203a6a6e05b2fa9c53d8064a673a447b83d42569260c306d43628bff5bb101969708355 - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe - languageName: node - linkType: hard - -"rfdc@npm:^1.4.1": - version: 1.4.1 - resolution: "rfdc@npm:1.4.1" - checksum: 10c0/4614e4292356cafade0b6031527eea9bc90f2372a22c012313be1dcc69a3b90c7338158b414539be863fa95bfcb2ddcd0587be696841af4e6679d85e62c060c7 + checksum: 10c0/6bb6f1d8a1789f7a5b4e35d950e76bc0ba632ff7d51fe86b6f34fb5f41e1ce0f7b884ec166828cfc0728ddffeaee49527711d752d12398297f90c51acd22195e languageName: node linkType: hard @@ -10680,36 +10634,94 @@ __metadata: languageName: node linkType: hard +"rolldown@npm:~1.1.2": + version: 1.1.3 + resolution: "rolldown@npm:1.1.3" + dependencies: + "@oxc-project/types": "npm:=0.137.0" + "@rolldown/binding-android-arm64": "npm:1.1.3" + "@rolldown/binding-darwin-arm64": "npm:1.1.3" + "@rolldown/binding-darwin-x64": "npm:1.1.3" + "@rolldown/binding-freebsd-x64": "npm:1.1.3" + "@rolldown/binding-linux-arm-gnueabihf": "npm:1.1.3" + "@rolldown/binding-linux-arm64-gnu": "npm:1.1.3" + "@rolldown/binding-linux-arm64-musl": "npm:1.1.3" + "@rolldown/binding-linux-ppc64-gnu": "npm:1.1.3" + "@rolldown/binding-linux-s390x-gnu": "npm:1.1.3" + "@rolldown/binding-linux-x64-gnu": "npm:1.1.3" + "@rolldown/binding-linux-x64-musl": "npm:1.1.3" + "@rolldown/binding-openharmony-arm64": "npm:1.1.3" + "@rolldown/binding-wasm32-wasi": "npm:1.1.3" + "@rolldown/binding-win32-arm64-msvc": "npm:1.1.3" + "@rolldown/binding-win32-x64-msvc": "npm:1.1.3" + "@rolldown/pluginutils": "npm:^1.0.0" + dependenciesMeta: + "@rolldown/binding-android-arm64": + optional: true + "@rolldown/binding-darwin-arm64": + optional: true + "@rolldown/binding-darwin-x64": + optional: true + "@rolldown/binding-freebsd-x64": + optional: true + "@rolldown/binding-linux-arm-gnueabihf": + optional: true + "@rolldown/binding-linux-arm64-gnu": + optional: true + "@rolldown/binding-linux-arm64-musl": + optional: true + "@rolldown/binding-linux-ppc64-gnu": + optional: true + "@rolldown/binding-linux-s390x-gnu": + optional: true + "@rolldown/binding-linux-x64-gnu": + optional: true + "@rolldown/binding-linux-x64-musl": + optional: true + "@rolldown/binding-openharmony-arm64": + optional: true + "@rolldown/binding-wasm32-wasi": + optional: true + "@rolldown/binding-win32-arm64-msvc": + optional: true + "@rolldown/binding-win32-x64-msvc": + optional: true + bin: + rolldown: ./bin/cli.mjs + checksum: 10c0/6dae11bee45c56d000d5d2608ac78b2c7125b7f10337e0b0bbdee7290c352104f1f76072f8c0e6ccad331f51f1a131fc37faa179d9c4a10cc16abc87f85f6e86 + languageName: node + linkType: hard + "rollup@npm:^4.43.0": - version: 4.58.0 - resolution: "rollup@npm:4.58.0" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.58.0" - "@rollup/rollup-android-arm64": "npm:4.58.0" - "@rollup/rollup-darwin-arm64": "npm:4.58.0" - "@rollup/rollup-darwin-x64": "npm:4.58.0" - "@rollup/rollup-freebsd-arm64": "npm:4.58.0" - "@rollup/rollup-freebsd-x64": "npm:4.58.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.58.0" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.58.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.58.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.58.0" - "@rollup/rollup-linux-loong64-gnu": "npm:4.58.0" - "@rollup/rollup-linux-loong64-musl": "npm:4.58.0" - "@rollup/rollup-linux-ppc64-gnu": "npm:4.58.0" - "@rollup/rollup-linux-ppc64-musl": "npm:4.58.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.58.0" - "@rollup/rollup-linux-riscv64-musl": "npm:4.58.0" - "@rollup/rollup-linux-s390x-gnu": "npm:4.58.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.58.0" - "@rollup/rollup-linux-x64-musl": "npm:4.58.0" - "@rollup/rollup-openbsd-x64": "npm:4.58.0" - "@rollup/rollup-openharmony-arm64": "npm:4.58.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.58.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.58.0" - "@rollup/rollup-win32-x64-gnu": "npm:4.58.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.58.0" - "@types/estree": "npm:1.0.8" + version: 4.62.2 + resolution: "rollup@npm:4.62.2" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.62.2" + "@rollup/rollup-android-arm64": "npm:4.62.2" + "@rollup/rollup-darwin-arm64": "npm:4.62.2" + "@rollup/rollup-darwin-x64": "npm:4.62.2" + "@rollup/rollup-freebsd-arm64": "npm:4.62.2" + "@rollup/rollup-freebsd-x64": "npm:4.62.2" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.62.2" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.62.2" + "@rollup/rollup-linux-arm64-gnu": "npm:4.62.2" + "@rollup/rollup-linux-arm64-musl": "npm:4.62.2" + "@rollup/rollup-linux-loong64-gnu": "npm:4.62.2" + "@rollup/rollup-linux-loong64-musl": "npm:4.62.2" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.62.2" + "@rollup/rollup-linux-ppc64-musl": "npm:4.62.2" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.62.2" + "@rollup/rollup-linux-riscv64-musl": "npm:4.62.2" + "@rollup/rollup-linux-s390x-gnu": "npm:4.62.2" + "@rollup/rollup-linux-x64-gnu": "npm:4.62.2" + "@rollup/rollup-linux-x64-musl": "npm:4.62.2" + "@rollup/rollup-openbsd-x64": "npm:4.62.2" + "@rollup/rollup-openharmony-arm64": "npm:4.62.2" + "@rollup/rollup-win32-arm64-msvc": "npm:4.62.2" + "@rollup/rollup-win32-ia32-msvc": "npm:4.62.2" + "@rollup/rollup-win32-x64-gnu": "npm:4.62.2" + "@rollup/rollup-win32-x64-msvc": "npm:4.62.2" + "@types/estree": "npm:1.0.9" fsevents: "npm:~2.3.2" dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -10766,7 +10778,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/b508a98b8d2b579243bdc02bbc0b8a450a94211384a7a645467b744fe39c0f221751081176ee697a70875b6338ad9ce940904addfbad8776d998ec7d4823ae6d + checksum: 10c0/83ff5f4a1fea3fa05db2ef56beceee8c33d4a72b818e19c562f1e85c41076fe5b12aadc44048bb73e60b83336df82154b017fa6bf0186f3141643e6f215fbdcb languageName: node linkType: hard @@ -10777,28 +10789,16 @@ __metadata: languageName: node linkType: hard -"safe-array-concat@npm:^1.1.2": - version: 1.1.2 - resolution: "safe-array-concat@npm:1.1.2" - dependencies: - call-bind: "npm:^1.0.7" - get-intrinsic: "npm:^1.2.4" - has-symbols: "npm:^1.0.3" - isarray: "npm:^2.0.5" - checksum: 10c0/12f9fdb01c8585e199a347eacc3bae7b5164ae805cdc8c6707199dbad5b9e30001a50a43c4ee24dc9ea32dbb7279397850e9208a7e217f4d8b1cf5d90129dec9 - languageName: node - linkType: hard - "safe-array-concat@npm:^1.1.3": - version: 1.1.3 - resolution: "safe-array-concat@npm:1.1.3" + version: 1.1.4 + resolution: "safe-array-concat@npm:1.1.4" dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.6" + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" + get-intrinsic: "npm:^1.3.0" has-symbols: "npm:^1.1.0" isarray: "npm:^2.0.5" - checksum: 10c0/43c86ffdddc461fb17ff8a17c5324f392f4868f3c7dd2c6a5d9f5971713bc5fd755667212c80eab9567595f9a7509cc2f83e590ddaebd1bd19b780f9c79f9a8d + checksum: 10c0/95fb4904ab1d9360a666fe5ba6d88f1c4a3a39682739e4512cff809fc6b5722a94bd95189211015bfb45859a7ffbc3340ea303ae22721c91c59e8946d310975a languageName: node linkType: hard @@ -10826,17 +10826,6 @@ __metadata: languageName: node linkType: hard -"safe-regex-test@npm:^1.0.3": - version: 1.0.3 - resolution: "safe-regex-test@npm:1.0.3" - dependencies: - call-bind: "npm:^1.0.6" - es-errors: "npm:^1.3.0" - is-regex: "npm:^1.1.4" - checksum: 10c0/900bf7c98dc58f08d8523b7012b468e4eb757afa624f198902c0643d7008ba777b0bdc35810ba0b758671ce887617295fb742b3f3968991b178ceca54cb07603 - languageName: node - linkType: hard - "safe-regex-test@npm:^1.1.0": version: 1.1.0 resolution: "safe-regex-test@npm:1.1.0" @@ -10848,27 +10837,27 @@ __metadata: languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 - languageName: node - linkType: hard - "sass@npm:^1.97.3": - version: 1.97.3 - resolution: "sass@npm:1.97.3" + version: 1.101.0 + resolution: "sass@npm:1.101.0" dependencies: "@parcel/watcher": "npm:^2.4.1" - chokidar: "npm:^4.0.0" - immutable: "npm:^5.0.2" + chokidar: "npm:^5.0.0" + immutable: "npm:^5.1.5" source-map-js: "npm:>=0.6.2 <2.0.0" dependenciesMeta: "@parcel/watcher": optional: true bin: sass: sass.js - checksum: 10c0/67f6b5d220f20c1c23a8b16dda5fd1c5d119ad5caf8195b185d553b5b239fb188a3787f04fc00171c62515f2c4e5e0eb5ad4992a80f8543428556883c1240ba3 + checksum: 10c0/1fbbcef2f767dec4d97773a2a084f4e1ef2e4abecf574e08743e52237069f1129a6b43b07b5c23aa3bcbf395509e40db758d9748a07940da227aa1626329a74d + languageName: node + linkType: hard + +"sax@npm:^1.5.0": + version: 1.6.0 + resolution: "sax@npm:1.6.0" + checksum: 10c0/e5593f4a91eb25761a688c4d96902e4e95a0dd6017bc65146b6f21236e3d715cf893333b76bc758923c9574c2fb5a7a76c3a81e96ea15432f2624f906c027c1e languageName: node linkType: hard @@ -10881,15 +10870,6 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.23.0": - version: 0.23.0 - resolution: "scheduler@npm:0.23.0" - dependencies: - loose-envify: "npm:^1.1.0" - checksum: 10c0/b777f7ca0115e6d93e126ac490dbd82642d14983b3079f58f35519d992fa46260be7d6e6cede433a92db70306310c6f5f06e144f0e40c484199e09c1f7be53dd - languageName: node - linkType: hard - "scheduler@npm:^0.23.2": version: 0.23.2 resolution: "scheduler@npm:0.23.2" @@ -10931,32 +10911,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.4, semver@npm:^7.6.0": - version: 7.6.0 - resolution: "semver@npm:7.6.0" - dependencies: - lru-cache: "npm:^6.0.0" - bin: - semver: bin/semver.js - checksum: 10c0/fbfe717094ace0aa8d6332d7ef5ce727259815bd8d8815700853f4faf23aacbd7192522f0dc5af6df52ef4fa85a355ebd2f5d39f554bd028200d6cf481ab9b53 - languageName: node - linkType: hard - -"semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.6.2, semver@npm:^7.6.3": - version: 7.6.3 - resolution: "semver@npm:7.6.3" - bin: - semver: bin/semver.js - checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf - languageName: node - linkType: hard - -"semver@npm:^7.7.3": - version: 7.7.4 - resolution: "semver@npm:7.7.4" +"semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2, semver@npm:^7.6.3, semver@npm:^7.7.3": + version: 7.8.5 + resolution: "semver@npm:7.8.5" bin: semver: bin/semver.js - checksum: 10c0/5215ad0234e2845d4ea5bb9d836d42b03499546ddafb12075566899fc617f68794bb6f146076b6881d755de17d6c6cc73372555879ec7dce2c2feee947866ad2 + checksum: 10c0/b1f3127a5be8125a94f37188b361c212466c292c6910adce3ec106cff5dc211ccaedc4739c11bb70fda59d6fc1f040a9bca289f4e093451521a2372e5231fe0c languageName: node linkType: hard @@ -10967,7 +10927,7 @@ __metadata: languageName: node linkType: hard -"set-function-length@npm:^1.2.1, set-function-length@npm:^1.2.2": +"set-function-length@npm:^1.2.2": version: 1.2.2 resolution: "set-function-length@npm:1.2.2" dependencies: @@ -10981,7 +10941,7 @@ __metadata: languageName: node linkType: hard -"set-function-name@npm:^2.0.1, set-function-name@npm:^2.0.2": +"set-function-name@npm:^2.0.2": version: 2.0.2 resolution: "set-function-name@npm:2.0.2" dependencies: @@ -11020,13 +10980,13 @@ __metadata: languageName: node linkType: hard -"side-channel-list@npm:^1.0.0": - version: 1.0.0 - resolution: "side-channel-list@npm:1.0.0" +"side-channel-list@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-list@npm:1.0.1" dependencies: es-errors: "npm:^1.3.0" - object-inspect: "npm:^1.13.3" - checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d + object-inspect: "npm:^1.13.4" + checksum: 10c0/d346c787fd2f9f1c2fdea14f00e8250118db0e7596d85a6cb9faa75f105d31a73a8f7a341c93d7df2a2429098c3d37a77bd3be9e88c37094b8c01807bc77c7a2 languageName: node linkType: hard @@ -11055,28 +11015,16 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" - dependencies: - call-bind: "npm:^1.0.7" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - object-inspect: "npm:^1.13.1" - checksum: 10c0/d2afd163dc733cc0a39aa6f7e39bf0c436293510dbccbff446733daeaf295857dbccf94297092ec8c53e2503acac30f0b78830876f0485991d62a90e9cad305f - languageName: node - linkType: hard - -"side-channel@npm:^1.1.0": - version: 1.1.0 - resolution: "side-channel@npm:1.1.0" +"side-channel@npm:^1.0.4, side-channel@npm:^1.1.0": + version: 1.1.1 + resolution: "side-channel@npm:1.1.1" dependencies: es-errors: "npm:^1.3.0" - object-inspect: "npm:^1.13.3" - side-channel-list: "npm:^1.0.0" + object-inspect: "npm:^1.13.4" + side-channel-list: "npm:^1.0.1" side-channel-map: "npm:^1.0.1" side-channel-weakmap: "npm:^1.0.2" - checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6 + checksum: 10c0/dc0ab81d67f61bda9247d053ce93f41c3fd8ad2bdcb9cf9d8d2f8540d488f26d87a5e99ebfc07eea49ec025867b2452b705442d974b1478f0395e69f6bfb3270 languageName: node linkType: hard @@ -11130,13 +11078,6 @@ __metadata: languageName: node linkType: hard -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 - languageName: node - linkType: hard - "snake-case@npm:^3.0.4": version: 3.0.4 resolution: "snake-case@npm:3.0.4" @@ -11147,35 +11088,7 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:^8.0.1": - version: 8.0.2 - resolution: "socks-proxy-agent@npm:8.0.2" - dependencies: - agent-base: "npm:^7.0.2" - debug: "npm:^4.3.4" - socks: "npm:^2.7.1" - checksum: 10c0/a842402fc9b8848a31367f2811ca3cd14c4106588b39a0901cd7a69029998adfc6456b0203617c18ed090542ad0c24ee4e9d4c75a0c4b75071e214227c177eb7 - languageName: node - linkType: hard - -"socks@npm:^2.7.1": - version: 2.8.1 - resolution: "socks@npm:2.8.1" - dependencies: - ip-address: "npm:^9.0.5" - smart-buffer: "npm:^4.2.0" - checksum: 10c0/ac77b515c260473cc7c4452f09b20939e22510ce3ae48385c516d1d5784374d5cc75be3cb18ff66cc985a7f4f2ef8fef84e984c5ec70aad58355ed59241f40a8 - languageName: node - linkType: hard - -"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.2.0": - version: 1.2.0 - resolution: "source-map-js@npm:1.2.0" - checksum: 10c0/7e5f896ac10a3a50fe2898e5009c58ff0dc102dcb056ed27a354623a0ece8954d4b2649e1a1b2b52ef2e161d26f8859c7710350930751640e71e374fe2d321a4 - languageName: node - linkType: hard - -"source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.1": +"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": version: 1.2.1 resolution: "source-map-js@npm:1.2.1" checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf @@ -11231,16 +11144,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.17 - resolution: "spdx-license-ids@npm:3.0.17" - checksum: 10c0/ddf9477b5afc70f1a7d3bf91f0b8e8a1c1b0fa65d2d9a8b5c991b1a2ba91b693d8b9749700119d5ce7f3fbf307ac421087ff43d321db472605e98a5804f80eac - languageName: node - linkType: hard - -"speakingurl@npm:^14.0.1": - version: 14.0.1 - resolution: "speakingurl@npm:14.0.1" - checksum: 10c0/1de1d1b938a7c4d9e79593ff7a26d312ec04a7c3234ca40b7f9b8106daf74ea9d2110a077f5db97ecf3762b83069e3ccbf9694431b51d4fcfd863f0b3333c342 + version: 3.0.23 + resolution: "spdx-license-ids@npm:3.0.23" + checksum: 10c0/8495620f6f2a237749cce922ea2d593a66f7885c301b1a0f5542183e7041182f27f616a8f13345cefdea0c9b3e0899328e0aa8cec100cf4f3fac4bb3bd975515 languageName: node linkType: hard @@ -11269,13 +11175,6 @@ __metadata: languageName: node linkType: hard -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec - languageName: node - linkType: hard - "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -11283,15 +11182,6 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^10.0.0": - version: 10.0.5 - resolution: "ssri@npm:10.0.5" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/b091f2ae92474183c7ac5ed3f9811457e1df23df7a7e70c9476eaa9a0c4a0c8fc190fb45acefbf023ca9ee864dd6754237a697dc52a0fb182afe65d8e77443d8 - languageName: node - linkType: hard - "stackback@npm:0.0.2": version: 0.0.2 resolution: "stackback@npm:0.0.2" @@ -11323,23 +11213,14 @@ __metadata: languageName: node linkType: hard -"std-env@npm:^3.10.0": - version: 3.10.0 - resolution: "std-env@npm:3.10.0" - checksum: 10c0/1814927a45004d36dde6707eaf17552a546769bc79a6421be2c16ce77d238158dfe5de30910b78ec30d95135cc1c59ea73ee22d2ca170f8b9753f84da34c427f - languageName: node - linkType: hard - -"stop-iteration-iterator@npm:^1.0.0": - version: 1.0.0 - resolution: "stop-iteration-iterator@npm:1.0.0" - dependencies: - internal-slot: "npm:^1.0.4" - checksum: 10c0/c4158d6188aac510d9e92925b58709207bd94699e9c31186a040c80932a687f84a51356b5895e6dc72710aad83addb9411c22171832c9ae0e6e11b7d61b0dfb9 +"std-env@npm:^4.0.0-rc.1": + version: 4.1.0 + resolution: "std-env@npm:4.1.0" + checksum: 10c0/2e14b6b490db34cb969a48d9cf7c35bca4a47653914aac2814221baae7b867a5b15940d133625c391621971f98cd2266a5dc7036669960e883f1081db2a56558 languageName: node linkType: hard -"stop-iteration-iterator@npm:^1.1.0": +"stop-iteration-iterator@npm:^1.0.0, stop-iteration-iterator@npm:^1.1.0": version: 1.1.0 resolution: "stop-iteration-iterator@npm:1.1.0" dependencies: @@ -11350,29 +11231,38 @@ __metadata: linkType: hard "storybook@npm:^10.2.10": - version: 10.2.10 - resolution: "storybook@npm:10.2.10" + version: 10.4.6 + resolution: "storybook@npm:10.4.6" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/icons": "npm:^2.0.1" - "@testing-library/jest-dom": "npm:^6.6.3" + "@storybook/icons": "npm:^2.0.2" + "@testing-library/jest-dom": "npm:^6.9.1" "@testing-library/user-event": "npm:^14.6.1" "@vitest/expect": "npm:3.2.4" "@vitest/spy": "npm:3.2.4" - esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0" + "@webcontainer/env": "npm:^1.1.1" + esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0 || ^0.28.0" open: "npm:^10.2.0" + oxc-parser: "npm:^0.127.0" + oxc-resolver: "npm:^11.19.1" recast: "npm:^0.23.5" semver: "npm:^7.7.3" use-sync-external-store: "npm:^1.5.0" ws: "npm:^8.18.0" peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 prettier: ^2 || ^3 + vite-plus: ^0.1.15 peerDependenciesMeta: + "@types/react": + optional: true prettier: optional: true + vite-plus: + optional: true bin: storybook: ./dist/bin/dispatcher.js - checksum: 10c0/ef7e8d937ef65247b5e752f8fbf0e75c1d3e5d7d6af1b012cf6103d4e2563bf116deffe632e4904e6057d41a6f7c92448ce2adb945a1e6a52b334c0470c999b2 + checksum: 10c0/d7083bee31a1e43aa88e198f5d833d249c14ac9ea01bb767f4dce8cb3264ea8bb970ca5428728f67fefba0daf1223b90a0edf790e8b028c4989e15f2df979159 languageName: node linkType: hard @@ -11430,63 +11320,30 @@ __metadata: linkType: hard "string.prototype.trim@npm:^1.2.10": - version: 1.2.10 - resolution: "string.prototype.trim@npm:1.2.10" + version: 1.2.11 + resolution: "string.prototype.trim@npm:1.2.11" dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.2" + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" define-data-property: "npm:^1.1.4" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.5" - es-object-atoms: "npm:^1.0.0" + es-abstract: "npm:^1.24.2" + es-object-atoms: "npm:^1.1.2" has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/8a8854241c4b54a948e992eb7dd6b8b3a97185112deb0037a134f5ba57541d8248dd610c966311887b6c2fd1181a3877bffb14d873ce937a344535dabcc648f8 - languageName: node - linkType: hard - -"string.prototype.trim@npm:^1.2.9": - version: 1.2.9 - resolution: "string.prototype.trim@npm:1.2.9" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.0" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/dcef1a0fb61d255778155006b372dff8cc6c4394bc39869117e4241f41a2c52899c0d263ffc7738a1f9e61488c490b05c0427faa15151efad721e1a9fb2663c2 - languageName: node - linkType: hard - -"string.prototype.trimend@npm:^1.0.8": - version: 1.0.8 - resolution: "string.prototype.trimend@npm:1.0.8" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/0a0b54c17c070551b38e756ae271865ac6cc5f60dabf2e7e343cceae7d9b02e1a1120a824e090e79da1b041a74464e8477e2da43e2775c85392be30a6f60963c + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/b153cf8ed06db82ff40e27829e88e5c13f45eff9799f1d5707626e25989b488b059d6f5d57011e07f77745e28451e16735f295bc59c8ae146a4fd73a442366b0 languageName: node linkType: hard "string.prototype.trimend@npm:^1.0.9": - version: 1.0.9 - resolution: "string.prototype.trimend@npm:1.0.9" + version: 1.0.10 + resolution: "string.prototype.trimend@npm:1.0.10" dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.2" + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/59e1a70bf9414cb4c536a6e31bef5553c8ceb0cf44d8b4d0ed65c9653358d1c64dd0ec203b100df83d0413bbcde38b8c5d49e14bc4b86737d74adc593a0d35b6 - languageName: node - linkType: hard - -"string.prototype.trimstart@npm:^1.0.7": - version: 1.0.7 - resolution: "string.prototype.trimstart@npm:1.0.7" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - checksum: 10c0/0bcf391b41ea16d4fda9c9953d0a7075171fe090d33b4cf64849af94944c50862995672ac03e0c5dba2940a213ad7f53515a668dac859ce22a0276289ae5cf4f + es-object-atoms: "npm:^1.1.2" + checksum: 10c0/cc09233181769047a5330becfd5740fec5f0c8137886e7b553626788b00f75df9f34db1159bc52dbb7fc389b8ebb6e1dab44c8c9e31eb600039729a542013286 languageName: node linkType: hard @@ -11536,11 +11393,11 @@ __metadata: linkType: hard "strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" + version: 7.2.0 + resolution: "strip-ansi@npm:7.2.0" dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + ansi-regex: "npm:^6.2.2" + checksum: 10c0/544d13b7582f8254811ea97db202f519e189e59d35740c46095897e254e4f1aa9fe1524a83ad6bc5ad67d4dd6c0281d2e0219ed62b880a6238a16a17d375f221 languageName: node linkType: hard @@ -11568,11 +11425,9 @@ __metadata: linkType: hard "strip-indent@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-indent@npm:4.0.0" - dependencies: - min-indent: "npm:^1.0.1" - checksum: 10c0/6b1fb4e22056867f5c9e7a6f3f45922d9a2436cac758607d58aeaac0d3b16ec40b1c43317de7900f1b8dd7a4107352fa47fb960f2c23566538c51e8585c8870e + version: 4.1.1 + resolution: "strip-indent@npm:4.1.1" + checksum: 10c0/5b23dd5934be0ef6b6fe1b802887f83e56ad9dcd9f6c3896a637da2c6c3a6da3fdf3e51354a98e6cccb6f1c41863e7b9b9deaa348639dfd35f71f3549edb4dff languageName: node linkType: hard @@ -11590,15 +11445,6 @@ __metadata: languageName: node linkType: hard -"superjson@npm:^2.2.2": - version: 2.2.6 - resolution: "superjson@npm:2.2.6" - dependencies: - copy-anything: "npm:^4" - checksum: 10c0/b63587656cc27effd12c9e13a66da673a7a1b3e1af41f17820fd37f07a4f29503e1f58eae6bd229039331b475e1be6990336fa887654e6adc80684ae4eed7965 - languageName: node - linkType: hard - "supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -11631,20 +11477,20 @@ __metadata: languageName: node linkType: hard -"svgo@npm:^3.0.2": - version: 3.3.2 - resolution: "svgo@npm:3.3.2" +"svgo@npm:^3.3.3": + version: 3.3.3 + resolution: "svgo@npm:3.3.3" dependencies: - "@trysound/sax": "npm:0.2.0" commander: "npm:^7.2.0" css-select: "npm:^5.1.0" css-tree: "npm:^2.3.1" css-what: "npm:^6.1.0" csso: "npm:^5.0.5" picocolors: "npm:^1.0.0" + sax: "npm:^1.5.0" bin: svgo: ./bin/svgo - checksum: 10c0/a6badbd3d1d6dbb177f872787699ab34320b990d12e20798ecae915f0008796a0f3c69164f1485c9def399e0ce0a5683eb4a8045e51a5e1c364bb13a0d9f79e1 + checksum: 10c0/06568c6b0430f96748c557f0b17dc7de79b19fa16d13d7523527ede0ec727fc6d8e6a10e13ff106dc4372d2e6063a1dca7c455c495efb1b83857480425f9b965 languageName: node linkType: hard @@ -11656,14 +11502,14 @@ __metadata: linkType: hard "tar-fs@npm:^2.0.0": - version: 2.1.4 - resolution: "tar-fs@npm:2.1.4" + version: 2.1.5 + resolution: "tar-fs@npm:2.1.5" dependencies: chownr: "npm:^1.1.1" mkdirp-classic: "npm:^0.5.2" pump: "npm:^3.0.0" tar-stream: "npm:^2.1.4" - checksum: 10c0/decb25acdc6839182c06ec83cba6136205bda1db984e120c8ffd0d80182bc5baa1d916f9b6c5c663ea3f9975b4dd49e3c6bb7b1707cbcdaba4e76042f43ec84c + checksum: 10c0/b987429214c3ab3be1f439b4e097dc310acf449c35f355956d801f59ef4cfde3b9827797ab2d2f087ed024e459eedc9b3cd860c9190b86e356ba348ade928684 languageName: node linkType: hard @@ -11680,17 +11526,16 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.2.0 - resolution: "tar@npm:6.2.0" +"tar@npm:^7.5.4": + version: 7.5.19 + resolution: "tar@npm:7.5.19" dependencies: - chownr: "npm:^2.0.0" - fs-minipass: "npm:^2.0.0" - minipass: "npm:^5.0.0" - minizlib: "npm:^2.1.1" - mkdirp: "npm:^1.0.3" - yallist: "npm:^4.0.0" - checksum: 10c0/02ca064a1a6b4521fef88c07d389ac0936730091f8c02d30ea60d472e0378768e870769ab9e986d87807bfee5654359cf29ff4372746cc65e30cbddc352660d8 + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.1.0" + yallist: "npm:^5.0.0" + checksum: 10c0/7022e8cb04a8ceccc0689f2c731743fa2aab2e3c3f559f7dbc37b65ef7d5913049b427284eded2ec0765c5db5ff72dd7939fe2ae15785ff422cef2116c95d798 languageName: node linkType: hard @@ -11753,19 +11598,19 @@ __metadata: linkType: hard "tinyexec@npm:^1.0.0, tinyexec@npm:^1.0.2": - version: 1.0.2 - resolution: "tinyexec@npm:1.0.2" - checksum: 10c0/1261a8e34c9b539a9aae3b7f0bb5372045ff28ee1eba035a2a059e532198fe1a182ec61ac60fa0b4a4129f0c4c4b1d2d57355b5cb9aa2d17ac9454ecace502ee + version: 1.2.4 + resolution: "tinyexec@npm:1.2.4" + checksum: 10c0/153b8db6b080194b558ff145b9cffc36b80a6e07babd644dcfbe49c807eee668c876049d28bdee90b96304476f883352f2dad91b3f86bc23832532f4363e66ff languageName: node linkType: hard -"tinyglobby@npm:^0.2.15": - version: 0.2.15 - resolution: "tinyglobby@npm:0.2.15" +"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.16, tinyglobby@npm:^0.2.17": + version: 0.2.17 + resolution: "tinyglobby@npm:0.2.17" dependencies: fdir: "npm:^6.5.0" - picomatch: "npm:^4.0.3" - checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 + picomatch: "npm:^4.0.4" + checksum: 10c0/7f7bb0f197c88bc4b20c231e0deca4240ca3bf313a88f5a7fee93a872b84966a4d50220947c0455ad07a60b3b360961c5b7fd979222aeb716a9f99b412002e4c languageName: node linkType: hard @@ -11776,10 +11621,10 @@ __metadata: languageName: node linkType: hard -"tinyrainbow@npm:^3.0.3": - version: 3.0.3 - resolution: "tinyrainbow@npm:3.0.3" - checksum: 10c0/1e799d35cd23cabe02e22550985a3051dc88814a979be02dc632a159c393a998628eacfc558e4c746b3006606d54b00bcdea0c39301133956d10a27aa27e988c +"tinyrainbow@npm:^3.1.0": + version: 3.1.0 + resolution: "tinyrainbow@npm:3.1.0" + checksum: 10c0/f11cf387a26c5c9255bec141a90ac511b26172981b10c3e50053bc6700ea7d2336edcc4a3a21dbb8412fe7c013477d2ba4d7e4877800f3f8107be5105aad6511 languageName: node linkType: hard @@ -11790,21 +11635,21 @@ __metadata: languageName: node linkType: hard -"tldts-core@npm:^7.0.23": - version: 7.0.23 - resolution: "tldts-core@npm:7.0.23" - checksum: 10c0/b3d936a75b5f65614c356a58ef37563681c6224187dcce9f57aac76d92aae83b1a6fe6ab910f77472b35456bc145a8441cb3e572b4850be43cb4f3465e0610ec +"tldts-core@npm:^7.4.4": + version: 7.4.4 + resolution: "tldts-core@npm:7.4.4" + checksum: 10c0/0e7d44b503a573237d7683ccc4798105b8e455aa2e8fcf4bfde626ab9a55d85116604d9e3ac2341858fe342b100a4740ba109d54a0d3afe6cc69f301fe7dc960 languageName: node linkType: hard "tldts@npm:^7.0.5": - version: 7.0.23 - resolution: "tldts@npm:7.0.23" + version: 7.4.4 + resolution: "tldts@npm:7.4.4" dependencies: - tldts-core: "npm:^7.0.23" + tldts-core: "npm:^7.4.4" bin: tldts: bin/cli.js - checksum: 10c0/492874770afaade724a10f8a97cce511d74bed07735c7f1100b7957254d7a5bbbc18becaf5cd049f9d7b0feeb945a64af64d5a300dfb851a4ac57cf3a5998afc + checksum: 10c0/e0a85d7ec71af40b7d01d1e8bd054669d8a22a2950567ce81381c5b7d7232c80b55f018b5e9fdea81217071c4fdc0d881e26237bb9b37aa6a52993732d3f754f languageName: node linkType: hard @@ -11830,11 +11675,11 @@ __metadata: linkType: hard "tough-cookie@npm:^6.0.0": - version: 6.0.0 - resolution: "tough-cookie@npm:6.0.0" + version: 6.0.1 + resolution: "tough-cookie@npm:6.0.1" dependencies: tldts: "npm:^7.0.5" - checksum: 10c0/7b17a461e9c2ac0d0bea13ab57b93b4346d0b8c00db174c963af1e46e4ea8d04148d2a55f2358fc857db0c0c65208a98e319d0c60693e32e0c559a9d9cf20cb5 + checksum: 10c0/ec70bd6b1215efe4ed31a158f0be3e4c9088fcbd8620edc23a5860d4f3d85c757b77e274baaa700f7b25e409f4181552ed189603c2b2e1a9f88104da3a61a37d languageName: node linkType: hard @@ -11854,19 +11699,19 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^2.4.0": - version: 2.4.0 - resolution: "ts-api-utils@npm:2.4.0" +"ts-api-utils@npm:^2.4.0, ts-api-utils@npm:^2.5.0": + version: 2.5.0 + resolution: "ts-api-utils@npm:2.5.0" peerDependencies: typescript: ">=4.8.4" - checksum: 10c0/ed185861aef4e7124366a3f6561113557a57504267d4d452a51e0ba516a9b6e713b56b4aeaab9fa13de9db9ab755c65c8c13a777dba9133c214632cb7b65c083 + checksum: 10c0/767849383c114e7f1971fa976b20e73ac28fd0c70d8d65c0004790bf4d8f89888c7e4cf6d5949f9c1beae9bc3c64835bef77bbe27fddf45a3c7b60cebcf85c8c languageName: node linkType: hard "ts-dedent@npm:^2.0.0": - version: 2.2.0 - resolution: "ts-dedent@npm:2.2.0" - checksum: 10c0/175adea838468cc2ff7d5e97f970dcb798bbcb623f29c6088cb21aa2880d207c5784be81ab1741f56b9ac37840cbaba0c0d79f7f8b67ffe61c02634cafa5c303 + version: 2.3.0 + resolution: "ts-dedent@npm:2.3.0" + checksum: 10c0/bfc3331e0740191c0134fb526e7f01e16657e50955c9395de14703c6ef17119c91651fa044cf558dc9c1dbb0fe1b2a74e303aeebcbd5e3b31acd14f72f545a54 languageName: node linkType: hard @@ -11938,14 +11783,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.1, tslib@npm:^2.0.3": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: 10c0/e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb - languageName: node - linkType: hard - -"tslib@npm:^2.8.1": +"tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.4.0, tslib@npm:^2.8.1": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -11998,17 +11836,6 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-buffer@npm:1.0.2" - dependencies: - call-bind: "npm:^1.0.7" - es-errors: "npm:^1.3.0" - is-typed-array: "npm:^1.1.13" - checksum: 10c0/9e043eb38e1b4df4ddf9dde1aa64919ae8bb909571c1cc4490ba777d55d23a0c74c7d73afcdd29ec98616d91bb3ae0f705fad4421ea147e1daf9528200b562da - languageName: node - linkType: hard - "typed-array-buffer@npm:^1.0.3": version: 1.0.3 resolution: "typed-array-buffer@npm:1.0.3" @@ -12020,19 +11847,6 @@ __metadata: languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "typed-array-byte-length@npm:1.0.1" - dependencies: - call-bind: "npm:^1.0.7" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-proto: "npm:^1.0.3" - is-typed-array: "npm:^1.1.13" - checksum: 10c0/fcebeffb2436c9f355e91bd19e2368273b88c11d1acc0948a2a306792f1ab672bce4cfe524ab9f51a0505c9d7cd1c98eff4235c4f6bfef6a198f6cfc4ff3d4f3 - languageName: node - linkType: hard - "typed-array-byte-length@npm:^1.0.3": version: 1.0.3 resolution: "typed-array-byte-length@npm:1.0.3" @@ -12046,20 +11860,6 @@ __metadata: languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-byte-offset@npm:1.0.2" - dependencies: - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-proto: "npm:^1.0.3" - is-typed-array: "npm:^1.1.13" - checksum: 10c0/d2628bc739732072e39269389a758025f75339de2ed40c4f91357023c5512d237f255b633e3106c461ced41907c1bf9a533c7e8578066b0163690ca8bc61b22f - languageName: node - linkType: hard - "typed-array-byte-offset@npm:^1.0.4": version: 1.0.4 resolution: "typed-array-byte-offset@npm:1.0.4" @@ -12075,45 +11875,17 @@ __metadata: languageName: node linkType: hard -"typed-array-length@npm:^1.0.5": - version: 1.0.5 - resolution: "typed-array-length@npm:1.0.5" - dependencies: - call-bind: "npm:^1.0.7" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-proto: "npm:^1.0.3" - is-typed-array: "npm:^1.1.13" - possible-typed-array-names: "npm:^1.0.0" - checksum: 10c0/5cc0f79196e70a92f8f40846cfa62b3de6be51e83f73655e137116cf65e3c29a288502b18cc8faf33c943c2470a4569009e1d6da338441649a2db2f135761ad5 - languageName: node - linkType: hard - -"typed-array-length@npm:^1.0.6": - version: 1.0.6 - resolution: "typed-array-length@npm:1.0.6" - dependencies: - call-bind: "npm:^1.0.7" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-proto: "npm:^1.0.3" - is-typed-array: "npm:^1.1.13" - possible-typed-array-names: "npm:^1.0.0" - checksum: 10c0/74253d7dc488eb28b6b2711cf31f5a9dcefc9c41b0681fd1c178ed0a1681b4468581a3626d39cd4df7aee3d3927ab62be06aa9ca74e5baf81827f61641445b77 - languageName: node - linkType: hard - "typed-array-length@npm:^1.0.7": - version: 1.0.7 - resolution: "typed-array-length@npm:1.0.7" + version: 1.0.8 + resolution: "typed-array-length@npm:1.0.8" dependencies: - call-bind: "npm:^1.0.7" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - is-typed-array: "npm:^1.1.13" - possible-typed-array-names: "npm:^1.0.0" - reflect.getprototypeof: "npm:^1.0.6" - checksum: 10c0/e38f2ae3779584c138a2d8adfa8ecf749f494af3cd3cdafe4e688ce51418c7d2c5c88df1bd6be2bbea099c3f7cea58c02ca02ed438119e91f162a9de23f61295 + call-bind: "npm:^1.0.9" + for-each: "npm:^0.3.5" + gopd: "npm:^1.2.0" + is-typed-array: "npm:^1.1.15" + possible-typed-array-names: "npm:^1.1.0" + reflect.getprototypeof: "npm:^1.0.10" + checksum: 10c0/5319f740fc426a3217182c2f7c87656acb0903e046de5a938e30167337d26abf1bb3ad4b32833a72521a4cc58223aec80627b38b357d0a3d5fd64881427e77ab languageName: node linkType: hard @@ -12143,17 +11915,17 @@ __metadata: linkType: hard "typescript-eslint@npm:^8.56.0": - version: 8.56.0 - resolution: "typescript-eslint@npm:8.56.0" + version: 8.62.0 + resolution: "typescript-eslint@npm:8.62.0" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.56.0" - "@typescript-eslint/parser": "npm:8.56.0" - "@typescript-eslint/typescript-estree": "npm:8.56.0" - "@typescript-eslint/utils": "npm:8.56.0" + "@typescript-eslint/eslint-plugin": "npm:8.62.0" + "@typescript-eslint/parser": "npm:8.62.0" + "@typescript-eslint/typescript-estree": "npm:8.62.0" + "@typescript-eslint/utils": "npm:8.62.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/13c47bb4a82d6714d482e96991faf2895c45a8e74235191a2ebbd36272487595c0824d128958942a1d1d18eddf8ca40c5850e2e314958a0a2e3c40be92f2d5a0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/263056d927b79c17b0c84849953642af202106e55914c5a606a4c76445b6428b2412e2d08cc20318b8aed9d1988e2a0cea60387e18ef0862beae13e8bc1df690 languageName: node linkType: hard @@ -12177,31 +11949,19 @@ __metadata: languageName: node linkType: hard -"ufo@npm:^1.6.1": - version: 1.6.3 - resolution: "ufo@npm:1.6.3" - checksum: 10c0/bf0e4ebff99e54da1b9c7182ac2f40475988b41faa881d579bc97bc2a0509672107b0a0e94c4b8d31a0ab8c4bf07f4aa0b469ac6da8536d56bda5b085ea2e953 +"ufo@npm:^1.6.3": + version: 1.6.4 + resolution: "ufo@npm:1.6.4" + checksum: 10c0/3a2b29e7e3d772fbf6893d7d23bf442981457adb2fe122828abdbda89bedcb81aafd0dcc080e41b45f9a877db00cb42cbfee9639753a19d9b9bd39b5627039cf languageName: node linkType: hard "uglify-js@npm:^3.1.4": - version: 3.17.4 - resolution: "uglify-js@npm:3.17.4" + version: 3.19.3 + resolution: "uglify-js@npm:3.19.3" bin: uglifyjs: bin/uglifyjs - checksum: 10c0/8b7fcdca69deb284fed7d2025b73eb747ce37f9aca6af53422844f46427152d5440601b6e2a033e77856a2f0591e4167153d5a21b68674ad11f662034ec13ced - languageName: node - linkType: hard - -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" - dependencies: - call-bind: "npm:^1.0.2" - has-bigints: "npm:^1.0.2" - has-symbols: "npm:^1.0.3" - which-boxed-primitive: "npm:^1.0.2" - checksum: 10c0/81ca2e81134167cc8f75fa79fbcc8a94379d6c61de67090986a2273850989dd3bae8440c163121b77434b68263e34787a675cbdcb34bb2f764c6b9c843a11b66 + checksum: 10c0/83b0a90eca35f778e07cad9622b80c448b6aad457c9ff8e568afed978212b42930a95f9e1be943a1ffa4258a3340fbb899f41461131c05bb1d0a9c303aed8479 languageName: node linkType: hard @@ -12224,28 +11984,17 @@ __metadata: languageName: node linkType: hard -"undici@npm:^7.21.0": - version: 7.22.0 - resolution: "undici@npm:7.22.0" - checksum: 10c0/09777c06f3f18f761f03e3a4c9c04fd9fcca8ad02ccea43602ee4adf73fcba082806f1afb637f6ea714ef6279c5323c25b16d435814c63db720f63bfc20d316b - languageName: node - linkType: hard - -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" - dependencies: - unique-slug: "npm:^4.0.0" - checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f +"undici@npm:^6.25.0": + version: 6.27.0 + resolution: "undici@npm:6.27.0" + checksum: 10c0/f88c3dae3957dbf9d93cb481440aced317bd3c4941b5914fea5efba516d51138988cdb5c76006f0bb1337e41d56c3443351055d492e73af2428521c37ba2a76f languageName: node linkType: hard -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 +"undici@npm:^7.21.0": + version: 7.28.0 + resolution: "undici@npm:7.28.0" + checksum: 10c0/fe781983a26098795e99bb1f64906cbb7d0bcaa029a26baade007b53ea67f2631d189b8f9671a31f4c8d0cb3773b7559608628ba54452fef51fec90e7c78bb0d languageName: node linkType: hard @@ -12279,41 +12028,56 @@ __metadata: linkType: hard "unplugin@npm:^3.0.0": - version: 3.0.0 - resolution: "unplugin@npm:3.0.0" + version: 3.2.0 + resolution: "unplugin@npm:3.2.0" dependencies: "@jridgewell/remapping": "npm:^2.3.5" - picomatch: "npm:^4.0.3" + picomatch: "npm:^4.0.4" webpack-virtual-modules: "npm:^0.6.2" - checksum: 10c0/9b3a9eb7c1cfaab677160b9659b008b4562e08360b6c715f31bdd7692738a75de91f217931032ec247979f71e83d4c9b908245cf47d984b26fb318b60b1d2d36 - languageName: node - linkType: hard - -"update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" - dependencies: - escalade: "npm:^3.1.1" - picocolors: "npm:^1.0.0" peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 10c0/e52b8b521c78ce1e0c775f356cd16a9c22c70d25f3e01180839c407a5dc787fb05a13f67560cbaf316770d26fa99f78f1acd711b1b54a4f35d4820d4ea7136e6 + "@farmfe/core": "*" + "@rspack/core": "*" + bun-types-no-globals: "*" + esbuild: "*" + rolldown: "*" + rollup: "*" + unloader: "*" + vite: "*" + webpack: "*" + peerDependenciesMeta: + "@farmfe/core": + optional: true + "@rspack/core": + optional: true + bun-types-no-globals: + optional: true + esbuild: + optional: true + rolldown: + optional: true + rollup: + optional: true + unloader: + optional: true + vite: + optional: true + webpack: + optional: true + checksum: 10c0/7a9dcf272e3ff08a20906df43700ac2f8b85e8008e36c713c2375cd08d0b4e75ad3d96eb1dfa3ee49fa558b5c8c7c74531154e21900344446016b1d84fceec1a languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.0": - version: 1.1.1 - resolution: "update-browserslist-db@npm:1.1.1" +"update-browserslist-db@npm:^1.2.3": + version: 1.2.3 + resolution: "update-browserslist-db@npm:1.2.3" dependencies: escalade: "npm:^3.2.0" - picocolors: "npm:^1.1.0" + picocolors: "npm:^1.1.1" peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10c0/536a2979adda2b4be81b07e311bd2f3ad5e978690987956bc5f514130ad50cac87cd22c710b686d79731e00fbee8ef43efe5fcd72baa241045209195d43dcc80 + checksum: 10c0/13a00355ea822388f68af57410ce3255941d5fb9b7c49342c4709a07c9f230bbef7f7499ae0ca7e0de532e79a82cc0c4edbd125f1a323a1845bf914efddf8bec languageName: node linkType: hard @@ -12343,11 +12107,11 @@ __metadata: linkType: hard "uuid@npm:^13.0.0": - version: 13.0.0 - resolution: "uuid@npm:13.0.0" + version: 13.0.2 + resolution: "uuid@npm:13.0.2" bin: uuid: dist-node/bin/uuid - checksum: 10c0/950e4c18d57fef6c69675344f5700a08af21e26b9eff2bf2180427564297368c538ea11ac9fb2e6528b17fc3966a9fd2c5049361b0b63c7d654f3c550c9b3d67 + checksum: 10c0/32c7ee84fa7c7966cc09b3a1514a752a8e2f609f15c00033fbaedc0255d577d1877b839f11ee537f37e587bbc620bbb98c3b3a1482931b8ed47d79497cd7a7cd languageName: node linkType: hard @@ -12391,21 +12155,79 @@ __metadata: linkType: hard "vite-svg-loader@npm:^5.1.0": - version: 5.1.0 - resolution: "vite-svg-loader@npm:5.1.0" + version: 5.1.1 + resolution: "vite-svg-loader@npm:5.1.1" dependencies: - svgo: "npm:^3.0.2" + debug: "npm:^4.3.4" + svgo: "npm:^3.3.3" peerDependencies: vue: ">=3.2.13" - checksum: 10c0/39f218db6384aec56ec6fb9517723eaee49701225688e1d5f5132f0730605a9e59201464911b19cbfdc647caebacf4c8737dffe2472cd815ebb6645c2292993c + checksum: 10c0/06bb67e3da9211142232d48616ca65ce7eeaac4c1a1709e5b1322f9a47ec7ce600e26b3c573948c607d8db93afc2dc7a1584a307513da8b0b6255c22d41a3a32 languageName: node linkType: hard -"vite@npm:^6.0.0 || ^7.0.0, vite@npm:^7.3.1": - version: 7.3.1 - resolution: "vite@npm:7.3.1" +"vite@npm:^6.0.0 || ^7.0.0 || ^8.0.0": + version: 8.1.0 + resolution: "vite@npm:8.1.0" + dependencies: + fsevents: "npm:~2.3.3" + lightningcss: "npm:^1.32.0" + picomatch: "npm:^4.0.4" + postcss: "npm:^8.5.15" + rolldown: "npm:~1.1.2" + tinyglobby: "npm:^0.2.17" + peerDependencies: + "@types/node": ^20.19.0 || >=22.12.0 + "@vitejs/devtools": ^0.3.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: ">=1.21.0" + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: ">=0.54.8" + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + "@vitejs/devtools": + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/d7e2da70169a7d93c68f5d0e246bdf2fb35d8835170663a28f01191d73e16b80322b5f229973ce754de80136be843481b0afa616bb8530b51e7454e4887c4b45 + languageName: node + linkType: hard + +"vite@npm:^7.3.1": + version: 7.3.6 + resolution: "vite@npm:7.3.6" dependencies: - esbuild: "npm:^0.27.0" + esbuild: "npm:^0.27.0 || ^0.28.0" fdir: "npm:^6.5.0" fsevents: "npm:~2.3.3" picomatch: "npm:^4.0.3" @@ -12452,44 +12274,47 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/5c7548f5f43a23533e53324304db4ad85f1896b1bfd3ee32ae9b866bac2933782c77b350eb2b52a02c625c8ad1ddd4c000df077419410650c982cd97fde8d014 + checksum: 10c0/c6d359f84ad362f5c97ff7988b77c90add04162c60cdf6059375a7d9e3217848c53a8cb6b6c48517bef84b6bba4c9bc85319a889b5236acb7d5a2bc8cb7b9a8d languageName: node linkType: hard -"vitest@npm:^4.0.18": - version: 4.0.18 - resolution: "vitest@npm:4.0.18" +"vitest@npm:^4.1.9": + version: 4.1.9 + resolution: "vitest@npm:4.1.9" dependencies: - "@vitest/expect": "npm:4.0.18" - "@vitest/mocker": "npm:4.0.18" - "@vitest/pretty-format": "npm:4.0.18" - "@vitest/runner": "npm:4.0.18" - "@vitest/snapshot": "npm:4.0.18" - "@vitest/spy": "npm:4.0.18" - "@vitest/utils": "npm:4.0.18" - es-module-lexer: "npm:^1.7.0" - expect-type: "npm:^1.2.2" + "@vitest/expect": "npm:4.1.9" + "@vitest/mocker": "npm:4.1.9" + "@vitest/pretty-format": "npm:4.1.9" + "@vitest/runner": "npm:4.1.9" + "@vitest/snapshot": "npm:4.1.9" + "@vitest/spy": "npm:4.1.9" + "@vitest/utils": "npm:4.1.9" + es-module-lexer: "npm:^2.0.0" + expect-type: "npm:^1.3.0" magic-string: "npm:^0.30.21" obug: "npm:^2.1.1" pathe: "npm:^2.0.3" picomatch: "npm:^4.0.3" - std-env: "npm:^3.10.0" + std-env: "npm:^4.0.0-rc.1" tinybench: "npm:^2.9.0" tinyexec: "npm:^1.0.2" tinyglobby: "npm:^0.2.15" - tinyrainbow: "npm:^3.0.3" - vite: "npm:^6.0.0 || ^7.0.0" + tinyrainbow: "npm:^3.1.0" + vite: "npm:^6.0.0 || ^7.0.0 || ^8.0.0" why-is-node-running: "npm:^2.3.0" peerDependencies: "@edge-runtime/vm": "*" "@opentelemetry/api": ^1.9.0 "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0 - "@vitest/browser-playwright": 4.0.18 - "@vitest/browser-preview": 4.0.18 - "@vitest/browser-webdriverio": 4.0.18 - "@vitest/ui": 4.0.18 + "@vitest/browser-playwright": 4.1.9 + "@vitest/browser-preview": 4.1.9 + "@vitest/browser-webdriverio": 4.1.9 + "@vitest/coverage-istanbul": 4.1.9 + "@vitest/coverage-v8": 4.1.9 + "@vitest/ui": 4.1.9 happy-dom: "*" jsdom: "*" + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: "@edge-runtime/vm": optional: true @@ -12503,15 +12328,21 @@ __metadata: optional: true "@vitest/browser-webdriverio": optional: true + "@vitest/coverage-istanbul": + optional: true + "@vitest/coverage-v8": + optional: true "@vitest/ui": optional: true happy-dom: optional: true jsdom: optional: true + vite: + optional: false bin: - vitest: vitest.mjs - checksum: 10c0/b913cd32032c95f29ff08c931f4b4c6fd6d2da498908d6770952c561a1b8d75c62499a1f04cadf82fb89cc0f9a33f29fb5dfdb899f6dbb27686a9d91571be5fa + vitest: ./vitest.mjs + checksum: 10c0/1ac80ef4991be82822a52aea48415f1bc64ddf8fd88ee24c172ec368f1d480fefacbde622c3c951982f7961a1d07313e18deaafc774d29e42ad6f6ffa63334a7 languageName: node linkType: hard @@ -12635,39 +12466,39 @@ __metadata: linkType: hard "vscode-css-languageservice@npm:^6.3.0": - version: 6.3.1 - resolution: "vscode-css-languageservice@npm:6.3.1" + version: 6.3.10 + resolution: "vscode-css-languageservice@npm:6.3.10" dependencies: "@vscode/l10n": "npm:^0.0.18" vscode-languageserver-textdocument: "npm:^1.0.12" vscode-languageserver-types: "npm:3.17.5" - vscode-uri: "npm:^3.0.8" - checksum: 10c0/50ebc416ef6a73a36acb20978fbf72f30457c55fd1c830fbca62b4f95f66bbe387e1a9bc6e7eaea1f4b5619658dba5e44a412e1f81226f865903428b3e403a91 + vscode-uri: "npm:^3.1.0" + checksum: 10c0/3f6228d85579c0306343c734716c17128757f3a6e44625deac06622fe248f05fe15da1901581aa50cb8d9539137a49d19f05dca6d13feb2e6bc9f3d9784236bd languageName: node linkType: hard "vscode-html-languageservice@npm:^5.2.0, vscode-html-languageservice@npm:^5.3.0": - version: 5.3.1 - resolution: "vscode-html-languageservice@npm:5.3.1" + version: 5.6.2 + resolution: "vscode-html-languageservice@npm:5.6.2" dependencies: "@vscode/l10n": "npm:^0.0.18" vscode-languageserver-textdocument: "npm:^1.0.12" vscode-languageserver-types: "npm:^3.17.5" - vscode-uri: "npm:^3.0.8" - checksum: 10c0/3830710c1f069f7a1550b5b84cd55c7735c3ab4073ebbd6709c569d507ebaade79ce118dee2d4187eb69b50a48c8df93d754622ccfc900c5277c65f1f8d26723 + vscode-uri: "npm:^3.1.0" + checksum: 10c0/5ef5f3cb959435a3f29d9b5844fb223140b8b5b616c3f54d0c627427853e8c8806d5d93f3a4e3354a3c9d2e9acdf6cb8043479837d20d9dd30ad6d07bf22286d languageName: node linkType: hard "vscode-json-languageservice@npm:^5.4.0": - version: 5.4.1 - resolution: "vscode-json-languageservice@npm:5.4.1" + version: 5.7.2 + resolution: "vscode-json-languageservice@npm:5.7.2" dependencies: "@vscode/l10n": "npm:^0.0.18" jsonc-parser: "npm:^3.3.1" vscode-languageserver-textdocument: "npm:^1.0.12" vscode-languageserver-types: "npm:^3.17.5" - vscode-uri: "npm:^3.0.8" - checksum: 10c0/01bbb0b707a56ef91ddc125ee363fdee2b81ca57b81a7a13e9f99fb07b6d327a82fd19ffbbc359a840f40a5fc632ccc2187758f707257d9488784bbb1c064391 + vscode-uri: "npm:^3.1.0" + checksum: 10c0/77923ef91e497f47dbc80a526ba86879217dd99b6fda941eb7d791e9567c8b0364793160a40499b781c6649d94b56ceef271701cf045703bee0805044e439ed9 languageName: node linkType: hard @@ -12678,7 +12509,14 @@ __metadata: languageName: node linkType: hard -"vscode-languageserver-protocol@npm:3.17.5, vscode-languageserver-protocol@npm:^3.17.5": +"vscode-jsonrpc@npm:9.0.0": + version: 9.0.0 + resolution: "vscode-jsonrpc@npm:9.0.0" + checksum: 10c0/1c53de2a017a43e4df803c2d4368784f181c9a9bdcd198eaecb02859ee47e13877abbbe73aaeec645f53c1dff0bfa37a3797133063cba1857350cd9b87113e47 + languageName: node + linkType: hard + +"vscode-languageserver-protocol@npm:3.17.5": version: 3.17.5 resolution: "vscode-languageserver-protocol@npm:3.17.5" dependencies: @@ -12688,20 +12526,37 @@ __metadata: languageName: node linkType: hard +"vscode-languageserver-protocol@npm:^3.17.5": + version: 3.18.1 + resolution: "vscode-languageserver-protocol@npm:3.18.1" + dependencies: + vscode-jsonrpc: "npm:9.0.0" + vscode-languageserver-types: "npm:3.18.0" + checksum: 10c0/49da7c5dca3676b02fbcd9fc94d0e3b50678c2f64a8af17921cdd0b2d49c091912734fbfa9bbdbc8171538d629c6f131711cd4356aeaffa3767dd0ddb7d02b18 + languageName: node + linkType: hard + "vscode-languageserver-textdocument@npm:^1.0.1, vscode-languageserver-textdocument@npm:^1.0.11, vscode-languageserver-textdocument@npm:^1.0.12": - version: 1.0.12 - resolution: "vscode-languageserver-textdocument@npm:1.0.12" - checksum: 10c0/534349894b059602c4d97615a1147b6c4c031141c2093e59657f54e38570f5989c21b376836f13b9375419869242e9efb4066643208b21ab1e1dee111a0f00fb + version: 1.0.13 + resolution: "vscode-languageserver-textdocument@npm:1.0.13" + checksum: 10c0/1de174f1de3bfa9e1660a4b3c1b1c711497196d761e33f4d00785fdbfc556ae5a1f440db04771cbc0f6bd66c2a6f303062bc17d8dc46e76820e39fa2d5626564 languageName: node linkType: hard -"vscode-languageserver-types@npm:3.17.5, vscode-languageserver-types@npm:^3.15.1, vscode-languageserver-types@npm:^3.17.5": +"vscode-languageserver-types@npm:3.17.5": version: 3.17.5 resolution: "vscode-languageserver-types@npm:3.17.5" checksum: 10c0/1e1260de79a2cc8de3e46f2e0182cdc94a7eddab487db5a3bd4ee716f67728e685852707d72c059721ce500447be9a46764a04f0611e94e4321ffa088eef36f8 languageName: node linkType: hard +"vscode-languageserver-types@npm:3.18.0, vscode-languageserver-types@npm:^3.15.1, vscode-languageserver-types@npm:^3.17.5": + version: 3.18.0 + resolution: "vscode-languageserver-types@npm:3.18.0" + checksum: 10c0/d8c51cd286cc55b4c1f333e87fa3cefc66d2aae8c65f6209e7ecf88032d3326308b333d62b05243c194be8a3304760445b87630b298116c6c612607f011b4de0 + languageName: node + linkType: hard + "vscode-languageserver@npm:^9.0.1": version: 9.0.1 resolution: "vscode-languageserver@npm:9.0.1" @@ -12727,10 +12582,10 @@ __metadata: languageName: node linkType: hard -"vscode-uri@npm:^3.0.8": - version: 3.0.8 - resolution: "vscode-uri@npm:3.0.8" - checksum: 10c0/f7f217f526bf109589969fe6e66b71e70b937de1385a1d7bb577ca3ee7c5e820d3856a86e9ff2fa9b7a0bc56a3dd8c3a9a557d3fedd7df414bc618d5e6b567f9 +"vscode-uri@npm:^3.0.8, vscode-uri@npm:^3.1.0": + version: 3.1.0 + resolution: "vscode-uri@npm:3.1.0" + checksum: 10c0/5f6c9c10fd9b1664d71fab4e9fbbae6be93c7f75bb3a1d9d74399a88ab8649e99691223fd7cef4644376cac6e94fa2c086d802521b9a8e31c5af3e60f0f35624 languageName: node linkType: hard @@ -12751,26 +12606,33 @@ __metadata: linkType: hard "vue-component-meta@npm:^2.0.0": - version: 2.1.6 - resolution: "vue-component-meta@npm:2.1.6" + version: 2.2.12 + resolution: "vue-component-meta@npm:2.2.12" dependencies: - "@volar/typescript": "npm:~2.4.1" - "@vue/language-core": "npm:2.1.6" + "@volar/typescript": "npm:2.4.15" + "@vue/language-core": "npm:2.2.12" path-browserify: "npm:^1.0.1" - vue-component-type-helpers: "npm:2.1.6" + vue-component-type-helpers: "npm:2.2.12" peerDependencies: typescript: "*" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/2743ab2a9e3d249d76c90d2e19ee27b17986a4964926680c83bc1ddba3b10d57f56d00b1551b230b27a3ec462e5ca5b624ad080befca8296c3f854b9a699e845 + checksum: 10c0/2171fa5618b7799ac440ffcbce0a103181a1562d529ed6090304e290808d0c544cce08d7d8c82b68d32b5e9de5dce28e1e47bd931c0eb849261f23dfc5754150 + languageName: node + linkType: hard + +"vue-component-type-helpers@npm:2.2.12, vue-component-type-helpers@npm:^2.0.0": + version: 2.2.12 + resolution: "vue-component-type-helpers@npm:2.2.12" + checksum: 10c0/ce15a2cdec4a57262a292ac1565aa18da9be73f3dfbcf28758a8a541199944bfff1aefb75802d6de5d955a5529c9667f1b651c659d14815c075e8965ac05175d languageName: node linkType: hard -"vue-component-type-helpers@npm:2.1.6, vue-component-type-helpers@npm:^2.0.0, vue-component-type-helpers@npm:latest": - version: 2.1.6 - resolution: "vue-component-type-helpers@npm:2.1.6" - checksum: 10c0/88f2b4d5bacf27fec16abac80ade2e599bc6f8805b1ba9164b3c9451495871fdf1d1da7260274de610fa27e5454ff0519f41c45ee6b37348fb1fa4b5e125c851 +"vue-component-type-helpers@npm:latest": + version: 3.3.5 + resolution: "vue-component-type-helpers@npm:3.3.5" + checksum: 10c0/4093b9e8845f4f89bb524aef60364913f2ed30f4bdcdf93ce438d61b50d969e3ef33e7b5b8173c74ed568a73af96977d6ef3fabdc385a647d20baba5385838b3 languageName: node linkType: hard @@ -12797,8 +12659,8 @@ __metadata: linkType: hard "vue-eslint-parser@npm:^10.4.0": - version: 10.4.0 - resolution: "vue-eslint-parser@npm:10.4.0" + version: 10.4.1 + resolution: "vue-eslint-parser@npm:10.4.1" dependencies: debug: "npm:^4.4.0" eslint-scope: "npm:^8.2.0 || ^9.0.0" @@ -12808,7 +12670,7 @@ __metadata: semver: "npm:^7.6.3" peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - checksum: 10c0/ded1c52dfa6e08c384da43b8369814bd105e2dc3bbb04e95faa8365af0fcba70293ff8b3749824ae3cc98988aeaaa261d5a205febff23e15667176392dcfee4a + checksum: 10c0/f6181b4d4ac17a5c06484aed40022997f65622a037ccc21797c88e55ab93f4ad21c95c93c466777f7a139ffb8bf750c889ef48e1ea16882e6617f6405c1d2013 languageName: node linkType: hard @@ -12822,31 +12684,32 @@ __metadata: linkType: hard "vue-router@npm:^5.0.3": - version: 5.0.3 - resolution: "vue-router@npm:5.0.3" + version: 5.1.0 + resolution: "vue-router@npm:5.1.0" dependencies: - "@babel/generator": "npm:^7.28.6" + "@babel/generator": "npm:^8.0.0-rc.4" "@vue-macros/common": "npm:^3.1.1" - "@vue/devtools-api": "npm:^8.0.6" - ast-walker-scope: "npm:^0.8.3" + "@vue/devtools-api": "npm:^8.1.2" + ast-walker-scope: "npm:^0.9.0" chokidar: "npm:^5.0.0" json5: "npm:^2.2.3" local-pkg: "npm:^1.1.2" magic-string: "npm:^0.30.21" - mlly: "npm:^1.8.0" + mlly: "npm:^1.8.2" muggle-string: "npm:^0.4.1" pathe: "npm:^2.0.3" picomatch: "npm:^4.0.3" scule: "npm:^1.3.0" - tinyglobby: "npm:^0.2.15" + tinyglobby: "npm:^0.2.16" unplugin: "npm:^3.0.0" unplugin-utils: "npm:^0.3.1" - yaml: "npm:^2.8.2" + yaml: "npm:^2.9.0" peerDependencies: "@pinia/colada": ">=0.21.2" - "@vue/compiler-sfc": ^3.5.17 + "@vue/compiler-sfc": ^3.5.34 pinia: ^3.0.4 - vue: ^3.5.0 + vite: ^7.0.0 || ^8.0.0 + vue: ^3.5.34 peerDependenciesMeta: "@pinia/colada": optional: true @@ -12854,7 +12717,9 @@ __metadata: optional: true pinia: optional: true - checksum: 10c0/ccb465bf62f2d9783586912ff8721efd690c4e4ba657caeab1882ea1db6238ac0b0a5122d6a30c55391a7e091a57b0bb4f89c0be6ee63d409060263c7fde84cd + vite: + optional: true + checksum: 10c0/9f0066c924faa1bce197d7e329d66c5638a1913302266e99450d90cce8a3843bf7dfa5d48ea08e0ed2af2355f7f06db07d816399b8c9d5282fafacdc88c4d6ec languageName: node linkType: hard @@ -12873,20 +12738,20 @@ __metadata: linkType: hard "vue@npm:^3.5.28": - version: 3.5.28 - resolution: "vue@npm:3.5.28" - dependencies: - "@vue/compiler-dom": "npm:3.5.28" - "@vue/compiler-sfc": "npm:3.5.28" - "@vue/runtime-dom": "npm:3.5.28" - "@vue/server-renderer": "npm:3.5.28" - "@vue/shared": "npm:3.5.28" + version: 3.5.39 + resolution: "vue@npm:3.5.39" + dependencies: + "@vue/compiler-dom": "npm:3.5.39" + "@vue/compiler-sfc": "npm:3.5.39" + "@vue/runtime-dom": "npm:3.5.39" + "@vue/server-renderer": "npm:3.5.39" + "@vue/shared": "npm:3.5.39" peerDependencies: typescript: "*" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/a5d823557d9d688f7136d62961ea1c4b820d1e73417ea3b42ca74891abb36ac3eccdaecd1396dcf18802c1a837da6cb2bd5e4c2351d8d18cfd02c755eac6358e + checksum: 10c0/4da745f7cff0dc3e5036aab592582445f52041adf4b63f3ca5d9d8aeb347355ac8b704b5bbd8081ff8e9ddafcfac2243e606d54eefccb92ef674b03e71e48505 languageName: node linkType: hard @@ -12931,20 +12796,7 @@ __metadata: languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" - dependencies: - is-bigint: "npm:^1.0.1" - is-boolean-object: "npm:^1.1.0" - is-number-object: "npm:^1.0.4" - is-string: "npm:^1.0.5" - is-symbol: "npm:^1.0.3" - checksum: 10c0/0a62a03c00c91dd4fb1035b2f0733c341d805753b027eebd3a304b9cb70e8ce33e25317add2fe9b5fea6f53a175c0633ae701ff812e604410ddd049777cd435e - languageName: node - linkType: hard - -"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": +"which-boxed-primitive@npm:^1.0.2, which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": version: 1.1.1 resolution: "which-boxed-primitive@npm:1.1.1" dependencies: @@ -12997,31 +12849,18 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15": - version: 1.1.15 - resolution: "which-typed-array@npm:1.1.15" - dependencies: - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/4465d5348c044032032251be54d8988270e69c6b7154f8fcb2a47ff706fe36f7624b3a24246b8d9089435a8f4ec48c1c1025c5d6b499456b9e5eff4f48212983 - languageName: node - linkType: hard - -"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19": - version: 1.1.20 - resolution: "which-typed-array@npm:1.1.20" +"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19": + version: 1.1.22 + resolution: "which-typed-array@npm:1.1.22" dependencies: available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.8" + call-bind: "npm:^1.0.9" call-bound: "npm:^1.0.4" for-each: "npm:^0.3.5" get-proto: "npm:^1.0.1" gopd: "npm:^1.2.0" has-tostringtag: "npm:^1.0.2" - checksum: 10c0/16fcdada95c8afb821cd1117f0ab50b4d8551677ac08187f21d4e444530913c9ffd2dac634f0c1183345f96344b69280f40f9a8bc52164ef409e555567c2604b + checksum: 10c0/e59db184a4e78b461fac3b05fafc1e7badbbedafbf04a967ee1de73717f1f9723a79699e7b5de71d449541cb5da8353efc01a4f8a72a152479850e54fa196c40 languageName: node linkType: hard @@ -13036,14 +12875,14 @@ __metadata: languageName: node linkType: hard -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" +"which@npm:^7.0.0": + version: 7.0.0 + resolution: "which@npm:7.0.0" dependencies: - isexe: "npm:^3.1.1" + isexe: "npm:^4.0.0" bin: node-which: bin/which.js - checksum: 10c0/449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + checksum: 10c0/ca0b54f198f78bbc4b7c02e34bda8d335cb352e0adb4cbca1c37b1a957af3a879a82c4c27ca6525bc942f548d8b64f816ef6528360af9f3de55ffb9b979b620d languageName: node linkType: hard @@ -13071,6 +12910,13 @@ __metadata: languageName: node linkType: hard +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 + languageName: node + linkType: hard + "wordwrap@npm:^1.0.0": version: 1.0.0 resolution: "wordwrap@npm:1.0.0" @@ -13130,9 +12976,9 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.18.0": - version: 8.18.0 - resolution: "ws@npm:8.18.0" +"ws@npm:^8.18.0, ws@npm:^8.19.0": + version: 8.21.0 + resolution: "ws@npm:8.21.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -13141,22 +12987,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 - languageName: node - linkType: hard - -"ws@npm:^8.18.3": - version: 8.19.0 - resolution: "ws@npm:8.19.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/4741d9b9bc3f9c791880882414f96e36b8b254e34d4b503279d6400d9a4b87a033834856dbdd94ee4b637944df17ea8afc4bce0ff4a1560d2166be8855da5b04 + checksum: 10c0/ef4a243476283fc49bc7550966c4af4aa0eef56273837211e700de3b664e08604a760cdddcb5ba43c049140e74ccfec5b0ee0bb439e08c2adf9138902fdde5f9 languageName: node linkType: hard @@ -13225,12 +13056,19 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.8.2": - version: 2.8.2 - resolution: "yaml@npm:2.8.2" +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + +"yaml@npm:^2.9.0": + version: 2.9.0 + resolution: "yaml@npm:2.9.0" bin: yaml: bin.mjs - checksum: 10c0/703e4dc1e34b324aa66876d63618dcacb9ed49f7e7fe9b70f1e703645be8d640f68ab84f12b86df8ac960bac37acf5513e115de7c970940617ce0343c8c9cd96 + checksum: 10c0/f340718df45e97a9551b9bf9dac61c80050bc464513b710debfb5067c380c8472e3b67809cffacb4ab5ffb5e66ef9310816c88b05f371cec60abfedd8c88e0a2 languageName: node linkType: hard @@ -13278,8 +13116,8 @@ __metadata: linkType: hard "yargs@npm:^16.0.0, yargs@npm:^16.2.0": - version: 16.2.0 - resolution: "yargs@npm:16.2.0" + version: 16.2.2 + resolution: "yargs@npm:16.2.2" dependencies: cliui: "npm:^7.0.2" escalade: "npm:^3.1.1" @@ -13288,13 +13126,13 @@ __metadata: string-width: "npm:^4.2.0" y18n: "npm:^5.0.5" yargs-parser: "npm:^20.2.2" - checksum: 10c0/b1dbfefa679848442454b60053a6c95d62f2d2e21dd28def92b647587f415969173c6e99a0f3bab4f1b67ee8283bf735ebe3544013f09491186ba9e8a9a2b651 + checksum: 10c0/1ca2152581ee7c9c9fb4174767ff7294b1c272d2d0a1f6eb13c39ce177fded85eb9c96711e00cd7913c0a9b88b6e763713ee11cae81b9b62fd97bdd0b03d5549 languageName: node linkType: hard "yargs@npm:^17.0.0": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" + version: 17.7.3 + resolution: "yargs@npm:17.7.3" dependencies: cliui: "npm:^8.0.1" escalade: "npm:^3.1.1" @@ -13303,7 +13141,7 @@ __metadata: string-width: "npm:^4.2.3" y18n: "npm:^5.0.5" yargs-parser: "npm:^21.1.1" - checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + checksum: 10c0/7a28572f7e785a57886e34fdbddb9b28756dec552e1453d5f6e7cdd00ad8721a4e8c4321d33683f5e61cacb36ad43258adbb48396b71ec4ed14abee0fc0d0c1f languageName: node linkType: hard From 8c34db27ff1e6021f7a065ec74f3e4bb40a6aec7 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Sun, 28 Jun 2026 16:57:44 +0400 Subject: [PATCH 35/54] build: Additional dependencies were updated --- m3-foundation/package.json | 8 ++++---- m3-react/package.json | 12 ++++++------ m3-vue/package.json | 12 ++++++------ package.json | 8 ++++---- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/m3-foundation/package.json b/m3-foundation/package.json index 13e67b3..b90e362 100644 --- a/m3-foundation/package.json +++ b/m3-foundation/package.json @@ -22,12 +22,12 @@ "lodash.isequal": "^4.5.0" }, "devDependencies": { - "@eslint/js": "^9.39.3", + "@eslint/js": "^9.39.4", "@types/lodash.isequal": "^4.5.8", "@types/node": "^25.3.0", "@typescript-eslint/eslint-plugin": "^8.56.0", "@typescript-eslint/parser": "^8.56.0", - "eslint": "^9.39.3", + "eslint": "^9.39.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-unused-imports": "^4.4.1", "globals": "^17.3.0", @@ -38,8 +38,8 @@ "tslib": "^2.8.1", "typescript": "~5.9.3", "typescript-eslint": "^8.56.0", - "uuid": "^13.0.0", - "vite": "^7.3.1" + "uuid": "^14.0.1", + "vite": "^7.3.6" }, "contributors": [ "Zaitsev Kirill " diff --git a/m3-react/package.json b/m3-react/package.json index 5146692..9ab25fd 100644 --- a/m3-react/package.json +++ b/m3-react/package.json @@ -46,7 +46,7 @@ }, "devDependencies": { "@chromatic-com/storybook": "^5.0.1", - "@eslint/js": "^9.39.3", + "@eslint/js": "^9.39.4", "@storybook/addon-a11y": "^10.2.10", "@storybook/addon-docs": "^10.2.10", "@storybook/addon-links": "^10.2.10", @@ -65,10 +65,10 @@ "@types/react-transition-group": "^4.4.12", "@typescript-eslint/eslint-plugin": "^8.56.0", "@typescript-eslint/parser": "^8.56.0", - "@vitejs/plugin-react": "^5.1.4", + "@vitejs/plugin-react": "~5.1.4", "@vitest/browser": "^4.1.9", "@vitest/browser-playwright": "^4.1.9", - "eslint": "^9.39.3", + "eslint": "^9.39.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-react": "^7.37.5", "eslint-plugin-storybook": "^10.2.10", @@ -76,7 +76,7 @@ "flag-icons": "^7.5.0", "globals": "^17.3.0", "highlight.js": "^11.11.1", - "jsdom": "^28.1.0", + "jsdom": "^29.1.1", "playwright": "^1.61.1", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -88,8 +88,8 @@ "tslib": "^2.8.1", "typescript": "~5.9.3", "typescript-eslint": "^8.56.0", - "uuid": "^13.0.0", - "vite": "^7.3.1", + "uuid": "^14.0.1", + "vite": "^7.3.6", "vite-plugin-svgr": "^4.5.0", "vitest": "^4.1.9" }, diff --git a/m3-vue/package.json b/m3-vue/package.json index 54356b3..a0cbe3c 100644 --- a/m3-vue/package.json +++ b/m3-vue/package.json @@ -43,7 +43,7 @@ }, "devDependencies": { "@chromatic-com/storybook": "^5.0.1", - "@eslint/js": "^9.39.3", + "@eslint/js": "^9.39.4", "@storybook/addon-a11y": "^10.2.10", "@storybook/addon-docs": "^10.2.10", "@storybook/addon-links": "^10.2.10", @@ -64,14 +64,14 @@ "@vitest/browser-playwright": "^4.1.9", "@vue/compiler-sfc": "^3.5.39", "@vue/language-server": "^3.2.5", - "eslint": "^9.39.3", + "eslint": "^9.39.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-unused-imports": "^4.4.1", "eslint-plugin-vue": "^10.8.0", "flag-icons": "^7.5.0", "globals": "^17.3.0", "highlight.js": "^11.11.1", - "jsdom": "^28.1.0", + "jsdom": "^29.1.1", "playwright": "^1.61.1", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -81,14 +81,14 @@ "tslib": "^2.8.1", "typescript": "~5.9.3", "typescript-eslint": "^8.56.0", - "uuid": "^13.0.0", - "vite": "^7.3.1", + "uuid": "^14.0.1", + "vite": "^7.3.6", "vite-svg-loader": "^5.1.0", "vitest": "^4.1.9", "vue": "^3.5.28", "vue-eslint-parser": "^10.4.0", "vue-router": "^5.0.3", - "vue-tsc": "^2.2.0" + "vue-tsc": "^3.3.5" }, "contributors": [ "Zaitsev Kirill " diff --git a/package.json b/package.json index 08cd22b..b7c4aee 100644 --- a/package.json +++ b/package.json @@ -28,15 +28,15 @@ "tsc:vue": "yarn workspace @modulify/m3-vue tsc" }, "devDependencies": { - "@commitlint/cli": "^20.4.2", - "@commitlint/config-conventional": "^20.4.2", + "@commitlint/cli": "^21.1.0", + "@commitlint/config-conventional": "^21.1.0", "@vitest/browser": "^4.1.9", "@vitest/browser-playwright": "^4.1.9", "@vitest/coverage-istanbul": "^4.1.9", "@vitest/ui": "^4.1.9", "canvas": "^3.2.1", - "jsdom": "^28.1.0", - "nyc": "^17.1.0", + "jsdom": "^29.1.1", + "nyc": "^18.0.0", "playwright": "^1.61.1", "typescript": "~5.9.3", "vitest": "^4.1.9" From af759ddbe0caaa9f11007646117bcd068525bfa5 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Sun, 28 Jun 2026 17:01:12 +0400 Subject: [PATCH 36/54] chore: Updated yarn.lock --- yarn.lock | 835 +++++++++++++++++++++++++----------------------------- 1 file changed, 382 insertions(+), 453 deletions(-) diff --git a/yarn.lock b/yarn.lock index ff5e117..301cb77 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,13 +5,6 @@ __metadata: version: 8 cacheKey: 10c0 -"@acemir/cssom@npm:^0.9.31": - version: 0.9.31 - resolution: "@acemir/cssom@npm:0.9.31" - checksum: 10c0/cbfff98812642104ec3b37de1ad3a53f216ddc437e7b9276a23f46f2453844ea3c3f46c200bc4656a2f747fb26567560b3cc5183d549d119a758926551b5f566 - languageName: node - linkType: hard - "@adobe/css-tools@npm:^4.4.0": version: 4.4.0 resolution: "@adobe/css-tools@npm:4.4.0" @@ -29,7 +22,7 @@ __metadata: languageName: node linkType: hard -"@asamuzakjp/css-color@npm:^5.0.1": +"@asamuzakjp/css-color@npm:^5.1.11": version: 5.1.11 resolution: "@asamuzakjp/css-color@npm:5.1.11" dependencies: @@ -42,16 +35,16 @@ __metadata: languageName: node linkType: hard -"@asamuzakjp/dom-selector@npm:^6.8.1": - version: 6.8.1 - resolution: "@asamuzakjp/dom-selector@npm:6.8.1" +"@asamuzakjp/dom-selector@npm:^7.1.1": + version: 7.1.1 + resolution: "@asamuzakjp/dom-selector@npm:7.1.1" dependencies: + "@asamuzakjp/generational-cache": "npm:^1.0.1" "@asamuzakjp/nwsapi": "npm:^2.3.9" bidi-js: "npm:^1.0.3" - css-tree: "npm:^3.1.0" + css-tree: "npm:^3.2.1" is-potential-custom-element-name: "npm:^1.0.1" - lru-cache: "npm:^11.2.6" - checksum: 10c0/635de2c3b11971c07e2d491fd2833d2499bafbab05b616f5d38041031718879c404456644f60c45e9ba4ca2423e5bb48bf3c46179b0c58a0ea68eaae8c61e85f + checksum: 10c0/8cec1c618781c94de5836a215bbe5aafb4d8b835b18c51faf8547f4574afa39f92def3951e40123860062467613dd825f1e1600ff32e8045cc099a91796dcfb8 languageName: node linkType: hard @@ -384,10 +377,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.27.1": - version: 7.28.6 - resolution: "@babel/helper-plugin-utils@npm:7.28.6" - checksum: 10c0/3f5f8acc152fdbb69a84b8624145ff4f9b9f6e776cb989f9f968f8606eb7185c5c3cfcf3ba08534e37e1e0e1c118ac67080610333f56baa4f7376c99b5f1143d +"@babel/helper-plugin-utils@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-plugin-utils@npm:7.29.7" + checksum: 10c0/380477a06133274a2759f9355929cb60a95e8b8fee624a1ae1fa349e1d1645b89daca456f72833f6d1062bffa12ee4271c5bf0cc5a61c0166cdc24c7591e2408 languageName: node linkType: hard @@ -644,24 +637,24 @@ __metadata: linkType: hard "@babel/plugin-transform-react-jsx-self@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.27.1" + version: 7.29.7 + resolution: "@babel/plugin-transform-react-jsx-self@npm:7.29.7" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.29.7" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/00a4f917b70a608f9aca2fb39aabe04a60aa33165a7e0105fd44b3a8531630eb85bf5572e9f242f51e6ad2fa38c2e7e780902176c863556c58b5ba6f6e164031 + checksum: 10c0/288995f0fd0d61ab740a315fb56c8255eb87dd4a4ac2ac7d0fdd4ce173c3878200141e80da2db0e598c7b2a71e74e604afdbb4c8e14ae6e0527ce0b6294c03da languageName: node linkType: hard "@babel/plugin-transform-react-jsx-source@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.27.1" + version: 7.29.7 + resolution: "@babel/plugin-transform-react-jsx-source@npm:7.29.7" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.29.7" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/5e67b56c39c4d03e59e03ba80692b24c5a921472079b63af711b1d250fc37c1733a17069b63537f750f3e937ec44a42b1ee6a46cd23b1a0df5163b17f741f7f2 + checksum: 10c0/a121899631e6d99b9e1b276acf736dbb77948a31f8eeeae67b89c8a4ab0f05e51ba64544baa06c286a2b9944f227244e15aac464e2313d286d0511fe51e27975 languageName: node linkType: hard @@ -860,193 +853,207 @@ __metadata: languageName: node linkType: hard -"@commitlint/cli@npm:^20.4.2": - version: 20.4.2 - resolution: "@commitlint/cli@npm:20.4.2" +"@commitlint/cli@npm:^21.1.0": + version: 21.1.0 + resolution: "@commitlint/cli@npm:21.1.0" dependencies: - "@commitlint/format": "npm:^20.4.0" - "@commitlint/lint": "npm:^20.4.2" - "@commitlint/load": "npm:^20.4.0" - "@commitlint/read": "npm:^20.4.0" - "@commitlint/types": "npm:^20.4.0" + "@commitlint/config-conventional": "npm:^21.1.0" + "@commitlint/format": "npm:^21.1.0" + "@commitlint/lint": "npm:^21.1.0" + "@commitlint/load": "npm:^21.1.0" + "@commitlint/read": "npm:^21.1.0" + "@commitlint/types": "npm:^21.1.0" tinyexec: "npm:^1.0.0" - yargs: "npm:^17.0.0" + yargs: "npm:^18.0.0" bin: - commitlint: ./cli.js - checksum: 10c0/ef091ed137492cc7a86ba98e4881eb251b2fd205056932dcde7f9a8e3e4aaf4ff1378cbeeee0b666b50d9533c2c20e58555ee179ba92d4225ef856515ad78eef + commitlint: cli.js + checksum: 10c0/43df51dbeaeff7307a2993b337c13d05616f5bce240dfba396e11e3dfc805d509b7c7fbe9340b1bcf902fbb9a812d020c19c808d806e094a813456a618e469b3 languageName: node linkType: hard -"@commitlint/config-conventional@npm:^20.4.2": - version: 20.4.2 - resolution: "@commitlint/config-conventional@npm:20.4.2" +"@commitlint/config-conventional@npm:^21.1.0": + version: 21.1.0 + resolution: "@commitlint/config-conventional@npm:21.1.0" dependencies: - "@commitlint/types": "npm:^20.4.0" - conventional-changelog-conventionalcommits: "npm:^9.1.0" - checksum: 10c0/d737b6682a4237914372b86802772c1ff1d3414f1a167510859fc611986d1c401c8976c41f16b9e06439bd133fcf67ab7b63a72608a0c18e5e79614c995339b4 + "@commitlint/types": "npm:^21.1.0" + conventional-changelog-conventionalcommits: "npm:^9.2.0" + checksum: 10c0/15cdf9c611976a29bef58fa1629d04979bde26ac09a65766c9e8350c48792fdc696970a6275e7c11658fa4cd4394e3d5012c78f0c5215b2fe91f9b678c8020d0 languageName: node linkType: hard -"@commitlint/config-validator@npm:^20.4.0": - version: 20.4.0 - resolution: "@commitlint/config-validator@npm:20.4.0" +"@commitlint/config-validator@npm:^21.1.0": + version: 21.1.0 + resolution: "@commitlint/config-validator@npm:21.1.0" dependencies: - "@commitlint/types": "npm:^20.4.0" + "@commitlint/types": "npm:^21.1.0" ajv: "npm:^8.11.0" - checksum: 10c0/0ec4622badd7abb0a7c3e9c49d8acc284263a773492f060d42364e1e57c475fa189c1f2b386b1320014d4b0d861984770cabb029adc92ce49a39e0473f63cd29 + checksum: 10c0/e99552fae50d2a1868faa651035c41a9cf3a35845c2f3af9f16671a6bb40b7b0211aab073e5205bf1b0c9184d669d3a30a8f3c6da691745b5a7c077e9877bc9f languageName: node linkType: hard -"@commitlint/ensure@npm:^20.4.1": - version: 20.4.1 - resolution: "@commitlint/ensure@npm:20.4.1" +"@commitlint/ensure@npm:^21.1.0": + version: 21.1.0 + resolution: "@commitlint/ensure@npm:21.1.0" dependencies: - "@commitlint/types": "npm:^20.4.0" - lodash.camelcase: "npm:^4.3.0" - lodash.kebabcase: "npm:^4.1.1" - lodash.snakecase: "npm:^4.1.1" - lodash.startcase: "npm:^4.4.0" - lodash.upperfirst: "npm:^4.3.1" - checksum: 10c0/095dccd38043b566d4191a3115c6963093ce2e8cae3128e2cc9e3557810fdd1b3a9de5a32e158273d7666ae18a4abed0c30c5711ffca97588acf76da43f82608 + "@commitlint/types": "npm:^21.1.0" + es-toolkit: "npm:^1.46.0" + checksum: 10c0/792f885155dd27cfa41b47a8051a263396ea17c9b91b87894374330d6354ba21a14648e84ad8c56ee99f8e03684d8b50f11e1e89f6e3084bc887a7b4a69f6ae1 languageName: node linkType: hard -"@commitlint/execute-rule@npm:^20.0.0": - version: 20.0.0 - resolution: "@commitlint/execute-rule@npm:20.0.0" - checksum: 10c0/a1035ae9d6842489e617f18b244e6e53ac44b051b54501b9544019d33da924c877d7b893bfa2a66ad325a9c2ff65b11137d5383743e31d3e0b606decc1619584 +"@commitlint/execute-rule@npm:^21.0.1": + version: 21.0.1 + resolution: "@commitlint/execute-rule@npm:21.0.1" + checksum: 10c0/84fd03f20e808b9f4b68193410d9be90c54b3599f81e82ac23847e90ccba4b52768cfd1ee637931a6ca90575eaefa6ed5fc43a5398d52a4e2d6bef6dd354227e languageName: node linkType: hard -"@commitlint/format@npm:^20.4.0": - version: 20.4.0 - resolution: "@commitlint/format@npm:20.4.0" +"@commitlint/format@npm:^21.1.0": + version: 21.1.0 + resolution: "@commitlint/format@npm:21.1.0" dependencies: - "@commitlint/types": "npm:^20.4.0" + "@commitlint/types": "npm:^21.1.0" picocolors: "npm:^1.1.1" - checksum: 10c0/c58986e55601496953bd41249da34734957022b7a7a56759927fcc1a9d48be20427c8e554cf880b6e09fbc9d087f06fe0047c5dc694d82fc8e71eea379807ab7 + checksum: 10c0/8328013f73be853bff7198459da051402b7c63a28ef8bc62bb979264f1e89cbba980aaf168d14703b6769ec7f64b41d15fdc12fd661b44d387865007a351a017 languageName: node linkType: hard -"@commitlint/is-ignored@npm:^20.4.1": - version: 20.4.1 - resolution: "@commitlint/is-ignored@npm:20.4.1" +"@commitlint/is-ignored@npm:^21.1.0": + version: 21.1.0 + resolution: "@commitlint/is-ignored@npm:21.1.0" dependencies: - "@commitlint/types": "npm:^20.4.0" + "@commitlint/types": "npm:^21.1.0" semver: "npm:^7.6.0" - checksum: 10c0/03fbbaffcc37c6775551630534fac2643321a07696e62ba139222efd044ada3905eafbea8c04cebaa21d45c030caa87f7a0676e2141c1bf7ef353449a8e54bd7 + checksum: 10c0/6b2d6780021a1087165790fbee108524ddb778c3b9c73a0b619580d7f8673dc9674cde1f196f8fd08bb4d236e20a2dec0bd84df91f4615ea24c7b6001af6d506 languageName: node linkType: hard -"@commitlint/lint@npm:^20.4.2": - version: 20.4.2 - resolution: "@commitlint/lint@npm:20.4.2" +"@commitlint/lint@npm:^21.1.0": + version: 21.1.0 + resolution: "@commitlint/lint@npm:21.1.0" dependencies: - "@commitlint/is-ignored": "npm:^20.4.1" - "@commitlint/parse": "npm:^20.4.1" - "@commitlint/rules": "npm:^20.4.2" - "@commitlint/types": "npm:^20.4.0" - checksum: 10c0/a244916a443be0a58f362383532f6dd9e12fcd3e4e32de20d62ccb82f5f4a210d6ece8e2a4057055168a349276675f36f459c6ebc74e7d08fdc5c2a123c1993e + "@commitlint/is-ignored": "npm:^21.1.0" + "@commitlint/parse": "npm:^21.1.0" + "@commitlint/rules": "npm:^21.1.0" + "@commitlint/types": "npm:^21.1.0" + checksum: 10c0/aaee4faa51d33d369e0a50fb4cf76af972217a926861d1f6998568f06daf6db1936e10062865c9effbfadcd4b6154b6aa2aeac64e8e7aec0f67cabaa3cd3cdb9 languageName: node linkType: hard -"@commitlint/load@npm:^20.4.0": - version: 20.4.0 - resolution: "@commitlint/load@npm:20.4.0" +"@commitlint/load@npm:^21.1.0": + version: 21.1.0 + resolution: "@commitlint/load@npm:21.1.0" dependencies: - "@commitlint/config-validator": "npm:^20.4.0" - "@commitlint/execute-rule": "npm:^20.0.0" - "@commitlint/resolve-extends": "npm:^20.4.0" - "@commitlint/types": "npm:^20.4.0" - cosmiconfig: "npm:^9.0.0" + "@commitlint/config-validator": "npm:^21.1.0" + "@commitlint/execute-rule": "npm:^21.0.1" + "@commitlint/resolve-extends": "npm:^21.1.0" + "@commitlint/types": "npm:^21.1.0" + cosmiconfig: "npm:^9.0.1" cosmiconfig-typescript-loader: "npm:^6.1.0" + es-toolkit: "npm:^1.46.0" is-plain-obj: "npm:^4.1.0" - lodash.mergewith: "npm:^4.6.2" picocolors: "npm:^1.1.1" - checksum: 10c0/65256534d23a8afcfd10339b9b8c197671d7e55f59fad740153c628dca903cf371a764d6b00cc0e2b69ff8b908e0f5395bc3e0fccfa59c1f15d9a14be8bbeba0 + checksum: 10c0/e8573e333f620a40453a7780924f3e3e5cce3c22ad0b2f33f59fd7abbf54554f42fcda03b58b8de820d58f84a3560baf1ef68fdc70311ccd7243ef4d4b6caf2c languageName: node linkType: hard -"@commitlint/message@npm:^20.4.0": - version: 20.4.0 - resolution: "@commitlint/message@npm:20.4.0" - checksum: 10c0/ded99c7863665d36bec2f2f5e13891d1c855fc6d38c9732b8ab9801a0d8917d0a036760c23d6dbbb5a5e1447712cad7d304570fa679775aa7a00dfcc38fcdf28 +"@commitlint/message@npm:^21.0.2": + version: 21.0.2 + resolution: "@commitlint/message@npm:21.0.2" + checksum: 10c0/0086ad35b862165f8217ed6a4ca2480062b45bf7e9bcc427c172d8419cc5713505ffdb8c14414fc9de84d9c16378c8aa1a8465fcfa83f330f323173f0f2bd526 languageName: node linkType: hard -"@commitlint/parse@npm:^20.4.1": - version: 20.4.1 - resolution: "@commitlint/parse@npm:20.4.1" +"@commitlint/parse@npm:^21.1.0": + version: 21.1.0 + resolution: "@commitlint/parse@npm:21.1.0" dependencies: - "@commitlint/types": "npm:^20.4.0" - conventional-changelog-angular: "npm:^8.1.0" - conventional-commits-parser: "npm:^6.2.1" - checksum: 10c0/d1eb8a6e0e1b20ae9f490d60531d6abcc34785735e6e6dcc505a6a1aa2d4f16785e96795e5cf520b4b6923239969dc23739bb4f253040d28598e4e5a0abba95f + "@commitlint/types": "npm:^21.1.0" + conventional-changelog-angular: "npm:^8.2.0" + conventional-commits-parser: "npm:^6.3.0" + checksum: 10c0/fd23284e633c76d521cee55dde7cbf62fb25bbbbe909485cda5eb0822d2ba3815cd97a1f7cf7c5079c6888aad7f16343548bf8c94649cf406d72f43865eccf35 languageName: node linkType: hard -"@commitlint/read@npm:^20.4.0": - version: 20.4.0 - resolution: "@commitlint/read@npm:20.4.0" +"@commitlint/read@npm:^21.1.0": + version: 21.1.0 + resolution: "@commitlint/read@npm:21.1.0" dependencies: - "@commitlint/top-level": "npm:^20.4.0" - "@commitlint/types": "npm:^20.4.0" - git-raw-commits: "npm:^4.0.0" - minimist: "npm:^1.2.8" + "@commitlint/top-level": "npm:^21.0.2" + "@commitlint/types": "npm:^21.1.0" + git-raw-commits: "npm:^5.0.0" tinyexec: "npm:^1.0.0" - checksum: 10c0/e0a5b8bf7541198e2ec630e61d67eade20db5d933044703029df5abb21829aa36f4b59919aa7b533fa4ff39d4c344c7a7145d5f6173f3ecd8a980ef9fd072ff5 + checksum: 10c0/fd80806797d99990c31ce3a3ed3d62b9871d4d6e91831180a55e24ef5f4e923aaf04f220fe7b1ed13c300a40a1fa5e519a279f624efed7e21476ac4919d16eee languageName: node linkType: hard -"@commitlint/resolve-extends@npm:^20.4.0": - version: 20.4.0 - resolution: "@commitlint/resolve-extends@npm:20.4.0" +"@commitlint/resolve-extends@npm:^21.1.0": + version: 21.1.0 + resolution: "@commitlint/resolve-extends@npm:21.1.0" dependencies: - "@commitlint/config-validator": "npm:^20.4.0" - "@commitlint/types": "npm:^20.4.0" - global-directory: "npm:^4.0.1" - import-meta-resolve: "npm:^4.0.0" - lodash.mergewith: "npm:^4.6.2" + "@commitlint/config-validator": "npm:^21.1.0" + "@commitlint/types": "npm:^21.1.0" + es-toolkit: "npm:^1.46.0" + global-directory: "npm:^5.0.0" resolve-from: "npm:^5.0.0" - checksum: 10c0/c2ab46a32d89014fdba0fdaf6bfbfdb6b411311fa76e52948df4d2eaf048f4e8c1281b8f59742ec74adc8558ec1f7bfc22f1af8e7203536963998daf3eb271e3 + checksum: 10c0/a27ff0dba0bc869b42ecf232302aa0dfd239fee46d7d896570f2ab90b9f852a6da7162726d18b5ddcbd86682d15cdd52b493fbcde0e9641dbb0385a5db999b0c languageName: node linkType: hard -"@commitlint/rules@npm:^20.4.2": - version: 20.4.2 - resolution: "@commitlint/rules@npm:20.4.2" +"@commitlint/rules@npm:^21.1.0": + version: 21.1.0 + resolution: "@commitlint/rules@npm:21.1.0" dependencies: - "@commitlint/ensure": "npm:^20.4.1" - "@commitlint/message": "npm:^20.4.0" - "@commitlint/to-lines": "npm:^20.0.0" - "@commitlint/types": "npm:^20.4.0" - checksum: 10c0/7fa322257bb719504db233a11afe49e1e97847cf5a1004b9af489e7bb81381898f8fbdcaa3e826471d4933e156f99ba1de824ef2941db2f844416f588a2f6002 + "@commitlint/ensure": "npm:^21.1.0" + "@commitlint/message": "npm:^21.0.2" + "@commitlint/to-lines": "npm:^21.0.1" + "@commitlint/types": "npm:^21.1.0" + checksum: 10c0/f01cebde83b38a66eea7712928aaf88ac1e01b4a3e73e2280ed987fcba7c55cb9fcfda067b15a3c2a9bd8b226fafd1a579c605d7cca999e1bb76c7075d1242e8 languageName: node linkType: hard -"@commitlint/to-lines@npm:^20.0.0": - version: 20.0.0 - resolution: "@commitlint/to-lines@npm:20.0.0" - checksum: 10c0/49bc05eb0649adc6f4740a4f3976cc43402080bd9d90567c654180f90c0b6deb9a922b0efbde38567ac1def8f63cc506589124cc7f862e3914d30e13f29997c0 +"@commitlint/to-lines@npm:^21.0.1": + version: 21.0.1 + resolution: "@commitlint/to-lines@npm:21.0.1" + checksum: 10c0/bdf0640e260e11aeb6c6450095477ff123d2792c19307aba11ffaf35170ec8f05244d106edfecfb979fe5c1559b821db77a9d844261ef443895cee1d847e15ca languageName: node linkType: hard -"@commitlint/top-level@npm:^20.4.0": - version: 20.4.0 - resolution: "@commitlint/top-level@npm:20.4.0" +"@commitlint/top-level@npm:^21.0.2": + version: 21.0.2 + resolution: "@commitlint/top-level@npm:21.0.2" dependencies: escalade: "npm:^3.2.0" - checksum: 10c0/eaf181e7bc4bd8b604d0a22f28d8ad87bbdccbecd2d3d61c141cec09052534870bb8a5fecd4e2ad2c718b2ebddded80f0d7e60144e11daecc05153e1ec78ad75 + checksum: 10c0/8d236b37e14371370c00f90122dd386cfb3b1eb61304ec4b7814344ef9289b20a6d81e6dba24db16899c51ea809d3a8632b49fe3f759a61d988808360eb644ff languageName: node linkType: hard -"@commitlint/types@npm:^20.4.0": - version: 20.4.0 - resolution: "@commitlint/types@npm:20.4.0" +"@commitlint/types@npm:^21.1.0": + version: 21.1.0 + resolution: "@commitlint/types@npm:21.1.0" dependencies: - conventional-commits-parser: "npm:^6.2.1" + conventional-commits-parser: "npm:^6.3.0" picocolors: "npm:^1.1.1" - checksum: 10c0/d469c74317d279c0e5adeeb2b0ef7cc9a5fd80cea77ab4e92fc60cf2e23a8b56ee1345c82e7f3725c329d5c87b80dcf39608dff6b356e8aa51f62f657529348c + checksum: 10c0/472c5394d069589fe1e21a9108849682a1067ae37bf82801fa4a2183f4809db5de0b5204a8f2672bd3658751eefecff5321fd62c41f25a12d1dab8f1ad1cc19c + languageName: node + linkType: hard + +"@conventional-changelog/git-client@npm:^2.6.0": + version: 2.7.0 + resolution: "@conventional-changelog/git-client@npm:2.7.0" + dependencies: + "@simple-libs/child-process-utils": "npm:^1.0.0" + "@simple-libs/stream-utils": "npm:^1.2.0" + semver: "npm:^7.5.2" + peerDependencies: + conventional-commits-filter: ^5.0.0 + conventional-commits-parser: ^6.4.0 + peerDependenciesMeta: + conventional-commits-filter: + optional: true + conventional-commits-parser: + optional: true + checksum: 10c0/798097baa08a13311989e803451b9a8e602f404fcde1ec9fef609512625674c2d2a2f4368fbe00754a36f255e5b93dd852e7d3f2a9814215f9887ffa55c93993 languageName: node linkType: hard @@ -1098,7 +1105,7 @@ __metadata: languageName: node linkType: hard -"@csstools/css-syntax-patches-for-csstree@npm:^1.0.28": +"@csstools/css-syntax-patches-for-csstree@npm:^1.1.3": version: 1.1.5 resolution: "@csstools/css-syntax-patches-for-csstree@npm:1.1.5" peerDependencies: @@ -1507,20 +1514,13 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.39.4": +"@eslint/js@npm:9.39.4, @eslint/js@npm:^9.39.4": version: 9.39.4 resolution: "@eslint/js@npm:9.39.4" checksum: 10c0/5aa7dea2cbc5decf7f5e3b0c6f86a084ccee0f792d288ca8e839f8bc1b64e03e227068968e49b26096e6f71fd857ab6e42691d1b993826b9a3883f1bdd7a0e46 languageName: node linkType: hard -"@eslint/js@npm:^9.39.3": - version: 9.39.3 - resolution: "@eslint/js@npm:9.39.3" - checksum: 10c0/df1c70d6681c8daf4a3c86dfac159fcd98a73c4620c4fbe2be6caab1f30a34c7de0ad88ab0e81162376d2cde1a2eed1c32eff5f917ca369870930a51f8e818f1 - languageName: node - linkType: hard - "@eslint/object-schema@npm:^2.1.7": version: 2.1.7 resolution: "@eslint/object-schema@npm:2.1.7" @@ -1550,6 +1550,18 @@ __metadata: languageName: node linkType: hard +"@exodus/bytes@npm:^1.15.0": + version: 1.15.1 + resolution: "@exodus/bytes@npm:1.15.1" + peerDependencies: + "@noble/hashes": ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + "@noble/hashes": + optional: true + checksum: 10c0/333056a6953bbf875d9f3b86c32314de29458d842e5f56f6ef8034b18c2d9660184550093d1bae5de0064043d5e23f54cc03148798d9d29cf5167ac03f2e9f8c + languageName: node + linkType: hard + "@floating-ui/core@npm:^1.7.4": version: 1.7.4 resolution: "@floating-ui/core@npm:1.7.4" @@ -1792,14 +1804,14 @@ __metadata: version: 0.0.0-use.local resolution: "@modulify/m3-foundation@workspace:m3-foundation" dependencies: - "@eslint/js": "npm:^9.39.3" + "@eslint/js": "npm:^9.39.4" "@floating-ui/dom": "npm:^1.7.5" "@modulify/validator": "npm:^0.1.0" "@types/lodash.isequal": "npm:^4.5.8" "@types/node": "npm:^25.3.0" "@typescript-eslint/eslint-plugin": "npm:^8.56.0" "@typescript-eslint/parser": "npm:^8.56.0" - eslint: "npm:^9.39.3" + eslint: "npm:^9.39.4" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-unused-imports: "npm:^4.4.1" globals: "npm:^17.3.0" @@ -1811,8 +1823,8 @@ __metadata: tslib: "npm:^2.8.1" typescript: "npm:~5.9.3" typescript-eslint: "npm:^8.56.0" - uuid: "npm:^13.0.0" - vite: "npm:^7.3.1" + uuid: "npm:^14.0.1" + vite: "npm:^7.3.6" languageName: unknown linkType: soft @@ -1821,7 +1833,7 @@ __metadata: resolution: "@modulify/m3-react@workspace:m3-react" dependencies: "@chromatic-com/storybook": "npm:^5.0.1" - "@eslint/js": "npm:^9.39.3" + "@eslint/js": "npm:^9.39.4" "@floating-ui/core": "npm:^1.7.4" "@floating-ui/dom": "npm:^1.7.5" "@modulify/m3-foundation": "npm:0.0.0" @@ -1843,10 +1855,10 @@ __metadata: "@types/react-transition-group": "npm:^4.4.12" "@typescript-eslint/eslint-plugin": "npm:^8.56.0" "@typescript-eslint/parser": "npm:^8.56.0" - "@vitejs/plugin-react": "npm:^5.1.4" + "@vitejs/plugin-react": "npm:~5.1.4" "@vitest/browser": "npm:^4.1.9" "@vitest/browser-playwright": "npm:^4.1.9" - eslint: "npm:^9.39.3" + eslint: "npm:^9.39.4" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-react: "npm:^7.37.5" eslint-plugin-storybook: "npm:^10.2.10" @@ -1854,7 +1866,7 @@ __metadata: flag-icons: "npm:^7.5.0" globals: "npm:^17.3.0" highlight.js: "npm:^11.11.1" - jsdom: "npm:^28.1.0" + jsdom: "npm:^29.1.1" lodash.isequal: "npm:^4.5.0" playwright: "npm:^1.61.1" react: "npm:^18.2.0" @@ -1867,8 +1879,8 @@ __metadata: tslib: "npm:^2.8.1" typescript: "npm:~5.9.3" typescript-eslint: "npm:^8.56.0" - uuid: "npm:^13.0.0" - vite: "npm:^7.3.1" + uuid: "npm:^14.0.1" + vite: "npm:^7.3.6" vite-plugin-svgr: "npm:^4.5.0" vitest: "npm:^4.1.9" peerDependencies: @@ -1884,7 +1896,7 @@ __metadata: resolution: "@modulify/m3-vue@workspace:m3-vue" dependencies: "@chromatic-com/storybook": "npm:^5.0.1" - "@eslint/js": "npm:^9.39.3" + "@eslint/js": "npm:^9.39.4" "@floating-ui/core": "npm:^1.7.4" "@floating-ui/dom": "npm:^1.7.5" "@modulify/m3-foundation": "npm:0.0.0" @@ -1908,14 +1920,14 @@ __metadata: "@vitest/browser-playwright": "npm:^4.1.9" "@vue/compiler-sfc": "npm:^3.5.39" "@vue/language-server": "npm:^3.2.5" - eslint: "npm:^9.39.3" + eslint: "npm:^9.39.4" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-unused-imports: "npm:^4.4.1" eslint-plugin-vue: "npm:^10.8.0" flag-icons: "npm:^7.5.0" globals: "npm:^17.3.0" highlight.js: "npm:^11.11.1" - jsdom: "npm:^28.1.0" + jsdom: "npm:^29.1.1" lodash.isequal: "npm:^4.5.0" playwright: "npm:^1.61.1" react: "npm:^18.3.1" @@ -1926,14 +1938,14 @@ __metadata: tslib: "npm:^2.8.1" typescript: "npm:~5.9.3" typescript-eslint: "npm:^8.56.0" - uuid: "npm:^13.0.0" - vite: "npm:^7.3.1" + uuid: "npm:^14.0.1" + vite: "npm:^7.3.6" vite-svg-loader: "npm:^5.1.0" vitest: "npm:^4.1.9" vue: "npm:^3.5.28" vue-eslint-parser: "npm:^10.4.0" vue-router: "npm:^5.0.3" - vue-tsc: "npm:^2.2.0" + vue-tsc: "npm:^3.3.5" peerDependencies: vue: ^3.5 languageName: unknown @@ -1943,15 +1955,15 @@ __metadata: version: 0.0.0-use.local resolution: "@modulify/m3-web@workspace:." dependencies: - "@commitlint/cli": "npm:^20.4.2" - "@commitlint/config-conventional": "npm:^20.4.2" + "@commitlint/cli": "npm:^21.1.0" + "@commitlint/config-conventional": "npm:^21.1.0" "@vitest/browser": "npm:^4.1.9" "@vitest/browser-playwright": "npm:^4.1.9" "@vitest/coverage-istanbul": "npm:^4.1.9" "@vitest/ui": "npm:^4.1.9" canvas: "npm:^3.2.1" - jsdom: "npm:^28.1.0" - nyc: "npm:^17.1.0" + jsdom: "npm:^29.1.1" + nyc: "npm:^18.0.0" playwright: "npm:^1.61.1" typescript: "npm:~5.9.3" vitest: "npm:^4.1.9" @@ -2591,8 +2603,8 @@ __metadata: linkType: hard "@rollup/pluginutils@npm:^5.2.0": - version: 5.3.0 - resolution: "@rollup/pluginutils@npm:5.3.0" + version: 5.4.0 + resolution: "@rollup/pluginutils@npm:5.4.0" dependencies: "@types/estree": "npm:^1.0.0" estree-walker: "npm:^2.0.2" @@ -2602,7 +2614,7 @@ __metadata: peerDependenciesMeta: rollup: optional: true - checksum: 10c0/001834bf62d7cf5bac424d2617c113f7f7d3b2bf3c1778cbcccb72cdc957b68989f8e7747c782c2b911f1dde8257f56f8ac1e779e29e74e638e3f1e2cac2bcd0 + checksum: 10c0/ccc2cbd3a05df642df60ab05ffb81b2e564bd945e2a118bb8a474ea75b941033c8f44273133d4865643cca1492d0c80b14de1281f74779a64285a80fc3a194d8 languageName: node linkType: hard @@ -2788,6 +2800,15 @@ __metadata: languageName: node linkType: hard +"@simple-libs/child-process-utils@npm:^1.0.0": + version: 1.0.2 + resolution: "@simple-libs/child-process-utils@npm:1.0.2" + dependencies: + "@simple-libs/stream-utils": "npm:^1.2.0" + checksum: 10c0/a057603daf68a852d75bc6a840659291187b4bb5310e8d46e35dd5c1848047a15b40f6dd1917e17a533bd25d0a8ad75c48ef1a8301aad7e9a325c2b180e96cb6 + languageName: node + linkType: hard + "@simple-libs/stream-utils@npm:^1.2.0": version: 1.2.0 resolution: "@simple-libs/stream-utils@npm:1.2.0" @@ -3754,7 +3775,7 @@ __metadata: languageName: node linkType: hard -"@vitejs/plugin-react@npm:^5.1.4": +"@vitejs/plugin-react@npm:~5.1.4": version: 5.1.4 resolution: "@vitejs/plugin-react@npm:5.1.4" dependencies: @@ -4374,6 +4395,21 @@ __metadata: languageName: node linkType: hard +"@vue/language-core@npm:3.3.5": + version: 3.3.5 + resolution: "@vue/language-core@npm:3.3.5" + dependencies: + "@volar/language-core": "npm:2.4.28" + "@vue/compiler-dom": "npm:^3.5.0" + "@vue/shared": "npm:^3.5.0" + alien-signals: "npm:^3.2.0" + muggle-string: "npm:^0.4.1" + path-browserify: "npm:^1.0.1" + picomatch: "npm:^4.0.4" + checksum: 10c0/9c56201338ac4832eb48f3717e27721cc4e25d23e473fefa067452fa581b1cc8699c4d3c85fa434fc5737aa23eac4c6349fc3bcd0e96b2761373f0b69af9ccf5 + languageName: node + linkType: hard + "@vue/language-server@npm:^3.2.5": version: 3.2.5 resolution: "@vue/language-server@npm:3.2.5" @@ -4582,13 +4618,6 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": - version: 7.1.4 - resolution: "agent-base@npm:7.1.4" - checksum: 10c0/c2c9ab7599692d594b6a161559ada307b7a624fa4c7b03e3afdb5a5e31cd0e53269115b620fcab024c5ac6a6f37fa5eb2e004f076ad30f5f7e6b8b671f7b35fe - languageName: node - linkType: hard - "aggregate-error@npm:^3.0.0": version: 3.1.0 resolution: "aggregate-error@npm:3.1.0" @@ -4630,7 +4659,7 @@ __metadata: languageName: node linkType: hard -"alien-signals@npm:^3.0.0": +"alien-signals@npm:^3.0.0, alien-signals@npm:^3.2.0": version: 3.2.1 resolution: "alien-signals@npm:3.2.1" checksum: 10c0/4c4064faa208126177224d1ed6a2310687d452dec0771994e276d9af4c72e853fcb969ae4a7fcd034b1d1b9accb9500f4941178326eeea1cb8f64ec612853ef8 @@ -4676,7 +4705,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^6.1.0": +"ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": version: 6.2.3 resolution: "ansi-styles@npm:6.2.3" checksum: 10c0/23b8a4ce14e18fb854693b95351e286b771d23d8844057ed2e7d083cd3e708376c3323707ec6a24365f7d7eda3ca00327fe04092e29e551499ec4c8b7bfac868 @@ -5313,14 +5342,14 @@ __metadata: languageName: node linkType: hard -"cliui@npm:^8.0.1": - version: 8.0.1 - resolution: "cliui@npm:8.0.1" +"cliui@npm:^9.0.1": + version: 9.0.1 + resolution: "cliui@npm:9.0.1" dependencies: - string-width: "npm:^4.2.0" - strip-ansi: "npm:^6.0.1" - wrap-ansi: "npm:^7.0.0" - checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + string-width: "npm:^7.2.0" + strip-ansi: "npm:^7.1.0" + wrap-ansi: "npm:^9.0.0" + checksum: 10c0/13441832e9efe7c7a76bd2b8e683555c478d461a9f249dc5db9b17fe8d4b47fa9277b503914b90bd00e4a151abb6b9b02b2288972ffe2e5e3ca40bcb1c2330d3 languageName: node linkType: hard @@ -5450,7 +5479,7 @@ __metadata: languageName: node linkType: hard -"conventional-changelog-angular@npm:^8.1.0": +"conventional-changelog-angular@npm:^8.2.0": version: 8.3.1 resolution: "conventional-changelog-angular@npm:8.3.1" dependencies: @@ -5495,7 +5524,7 @@ __metadata: languageName: node linkType: hard -"conventional-changelog-conventionalcommits@npm:^9.1.0": +"conventional-changelog-conventionalcommits@npm:^9.2.0": version: 9.3.1 resolution: "conventional-changelog-conventionalcommits@npm:9.3.1" dependencies: @@ -5643,7 +5672,7 @@ __metadata: languageName: node linkType: hard -"conventional-commits-parser@npm:^6.2.1": +"conventional-commits-parser@npm:^6.3.0": version: 6.4.0 resolution: "conventional-commits-parser@npm:6.4.0" dependencies: @@ -5724,7 +5753,7 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^9.0.0": +"cosmiconfig@npm:^9.0.1": version: 9.0.2 resolution: "cosmiconfig@npm:9.0.2" dependencies: @@ -5782,7 +5811,7 @@ __metadata: languageName: node linkType: hard -"css-tree@npm:^3.0.0, css-tree@npm:^3.1.0": +"css-tree@npm:^3.0.0, css-tree@npm:^3.2.1": version: 3.2.1 resolution: "css-tree@npm:3.2.1" dependencies: @@ -5834,18 +5863,6 @@ __metadata: languageName: node linkType: hard -"cssstyle@npm:^6.0.1": - version: 6.2.0 - resolution: "cssstyle@npm:6.2.0" - dependencies: - "@asamuzakjp/css-color": "npm:^5.0.1" - "@csstools/css-syntax-patches-for-csstree": "npm:^1.0.28" - css-tree: "npm:^3.1.0" - lru-cache: "npm:^11.2.6" - checksum: 10c0/d5e61973a8c1b4fb9727edddfb9f2677c9a91b1db63787fc0c8bed639a227a97fcf930e5aabc3c64c8280d63169c632015a39da4a84083d1731c949437d0a2a2 - languageName: node - linkType: hard - "csstype@npm:^3.0.2, csstype@npm:^3.2.2, csstype@npm:^3.2.3": version: 3.2.3 resolution: "csstype@npm:3.2.3" @@ -5860,13 +5877,6 @@ __metadata: languageName: node linkType: hard -"dargs@npm:^8.0.0": - version: 8.1.0 - resolution: "dargs@npm:8.1.0" - checksum: 10c0/08cbd1ee4ac1a16fb7700e761af2e3e22d1bdc04ac4f851926f552dde8f9e57714c0d04013c2cca1cda0cba8fb637e0f93ad15d5285547a939dd1989ee06a82d - languageName: node - linkType: hard - "data-urls@npm:^7.0.0": version: 7.0.0 resolution: "data-urls@npm:7.0.0" @@ -5924,7 +5934,16 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0, debug@npm:^4.4.3": +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + languageName: node + linkType: hard + +"debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0, debug@npm:^4.4.3": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -5936,15 +5955,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.2.7": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: "npm:^2.1.1" - checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a - languageName: node - linkType: hard - "decamelize-keys@npm:^1.1.0": version: 1.1.1 resolution: "decamelize-keys@npm:1.1.1" @@ -6280,6 +6290,13 @@ __metadata: languageName: node linkType: hard +"emoji-regex@npm:^10.3.0": + version: 10.6.0 + resolution: "emoji-regex@npm:10.6.0" + checksum: 10c0/1e4aa097bb007301c3b4b1913879ae27327fdc48e93eeefefe3b87e495eb33c5af155300be951b4349ff6ac084f4403dc9eff970acba7c1c572d89396a9a32d7 + languageName: node + linkType: hard + "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -6527,6 +6544,20 @@ __metadata: languageName: node linkType: hard +"es-toolkit@npm:^1.46.0": + version: 1.49.0 + resolution: "es-toolkit@npm:1.49.0" + dependenciesMeta: + "@trivago/prettier-plugin-sort-imports@4.3.0": + unplugged: true + prettier-plugin-sort-re-exports@0.0.1: + unplugged: true + vitepress-plugin-sandpack@1.1.4: + unplugged: true + checksum: 10c0/ab0864bb0c5c494ed09043d53a74b58a0ab9df1b89b9b54bce72a63de2869152d7d65e489dc89ab671f0fea243728922c8a8f8c873f1b2a53350a23360b3e2df + languageName: node + linkType: hard + "es6-error@npm:^4.0.1": version: 4.1.1 resolution: "es6-error@npm:4.1.1" @@ -6816,7 +6847,7 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^9.39.3": +"eslint@npm:^9.39.4": version: 9.39.4 resolution: "eslint@npm:9.39.4" dependencies: @@ -7168,13 +7199,6 @@ __metadata: languageName: node linkType: hard -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 - languageName: node - linkType: hard - "fsevents@npm:2.3.2": version: 2.3.2 resolution: "fsevents@npm:2.3.2" @@ -7265,6 +7289,13 @@ __metadata: languageName: node linkType: hard +"get-east-asian-width@npm:^1.0.0": + version: 1.6.0 + resolution: "get-east-asian-width@npm:1.6.0" + checksum: 10c0/7e72e9550fd49ca5b246f9af6bb2afc129c96412845ff6556b3274fd44817a381702ca17028efe9866b261a3d44254cbf21e6c90cf05b4b61675630af776d431 + languageName: node + linkType: hard + "get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": version: 1.3.1 resolution: "get-intrinsic@npm:1.3.1" @@ -7343,16 +7374,15 @@ __metadata: languageName: node linkType: hard -"git-raw-commits@npm:^4.0.0": - version: 4.0.0 - resolution: "git-raw-commits@npm:4.0.0" +"git-raw-commits@npm:^5.0.0": + version: 5.0.1 + resolution: "git-raw-commits@npm:5.0.1" dependencies: - dargs: "npm:^8.0.0" - meow: "npm:^12.0.1" - split2: "npm:^4.0.0" + "@conventional-changelog/git-client": "npm:^2.6.0" + meow: "npm:^13.0.0" bin: - git-raw-commits: cli.mjs - checksum: 10c0/ab51335d9e55692fce8e42788013dba7a7e7bf9f5bf0622c8cd7ddc9206489e66bb939563fca4edb3aa87477e2118f052702aad1933b13c6fa738af7f29884f0 + git-raw-commits: src/cli.js + checksum: 10c0/51d27464bbcc8fe8164d79fc6425164374c00f0bc852e2b1e21061f0af0e56f505d03d7e2f30a52fa891703205d479c93bc0579ae49e9f00271c6537c4ab4f84 languageName: node linkType: hard @@ -7419,7 +7449,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^13.0.1": +"glob@npm:^13.0.1, glob@npm:^13.0.3, glob@npm:^13.0.6": version: 13.0.6 resolution: "glob@npm:13.0.6" dependencies: @@ -7430,26 +7460,12 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.1.1" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe - languageName: node - linkType: hard - -"global-directory@npm:^4.0.1": - version: 4.0.1 - resolution: "global-directory@npm:4.0.1" +"global-directory@npm:^5.0.0": + version: 5.0.0 + resolution: "global-directory@npm:5.0.0" dependencies: - ini: "npm:4.1.1" - checksum: 10c0/f9cbeef41db4876f94dd0bac1c1b4282a7de9c16350ecaaf83e7b2dd777b32704cc25beeb1170b5a63c42a2c9abfade74d46357fe0133e933218bc89e613d4b2 + ini: "npm:6.0.0" + checksum: 10c0/2b90eea8975bb332db7e8c9096ff310f0deb617d17e47e93b921d1c69f7677c1759a07009f2581f050d3ea08a3e079bf4ffdb9c34c94d48dc369c6577b3d45f4 languageName: node linkType: hard @@ -7659,26 +7675,6 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^7.0.2": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: "npm:^7.1.0" - debug: "npm:^4.3.4" - checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.6": - version: 7.0.6 - resolution: "https-proxy-agent@npm:7.0.6" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:4" - checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac - languageName: node - linkType: hard - "husky@npm:^9.1.7": version: 9.1.7 resolution: "husky@npm:9.1.7" @@ -7726,13 +7722,6 @@ __metadata: languageName: node linkType: hard -"import-meta-resolve@npm:^4.0.0": - version: 4.2.0 - resolution: "import-meta-resolve@npm:4.2.0" - checksum: 10c0/3ee8aeecb61d19b49d2703987f977e9d1c7d4ba47db615a570eaa02fe414f40dfa63f7b953e842cbe8470d26df6371332bfcf21b2fd92b0112f9fea80dde2c4c - languageName: node - linkType: hard - "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -7747,27 +7736,17 @@ __metadata: languageName: node linkType: hard -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: "npm:^1.3.0" - wrappy: "npm:1" - checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": +"inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 languageName: node linkType: hard -"ini@npm:4.1.1": - version: 4.1.1 - resolution: "ini@npm:4.1.1" - checksum: 10c0/7fddc8dfd3e63567d4fdd5d999d1bf8a8487f1479d0b34a1d01f28d391a9228d261e19abc38e1a6a1ceb3400c727204fce05725d5eb598dfcf2077a1e3afe211 +"ini@npm:6.0.0": + version: 6.0.0 + resolution: "ini@npm:6.0.0" + checksum: 10c0/9a7f55f306e2b25b41ae67c8b526e8f4673f057b70852b9025816ef4f15f07bf1ba35ed68ea4471ff7b31718f7ef1bc50d709f8d03cb012e10a3135eb99c7206 languageName: node linkType: hard @@ -8209,17 +8188,16 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-processinfo@npm:^2.0.2": - version: 2.0.3 - resolution: "istanbul-lib-processinfo@npm:2.0.3" +"istanbul-lib-processinfo@npm:^3.0.0": + version: 3.0.1 + resolution: "istanbul-lib-processinfo@npm:3.0.1" dependencies: archy: "npm:^1.0.0" cross-spawn: "npm:^7.0.3" istanbul-lib-coverage: "npm:^3.2.0" p-map: "npm:^3.0.0" - rimraf: "npm:^3.0.0" - uuid: "npm:^8.3.2" - checksum: 10c0/ffd0f9b1c8e266e980580f83e65397caeace3958e4b4326b4479dcb0e41a450698387b96b4d4823e63b7c4a403f72e6e30d9e788ddcf153edb422a9d6f64a998 + rimraf: "npm:^6.1.3" + checksum: 10c0/f9eb4d73fae12ab7f4075533725a2b8939dcb0375078d77d79000618e6b2dcacc0d26a9ca69cd2cd61f6b8b503316129ab007ae55880c2b8735516263631d465 languageName: node linkType: hard @@ -8352,37 +8330,37 @@ __metadata: languageName: node linkType: hard -"jsdom@npm:^28.1.0": - version: 28.1.0 - resolution: "jsdom@npm:28.1.0" +"jsdom@npm:^29.1.1": + version: 29.1.1 + resolution: "jsdom@npm:29.1.1" dependencies: - "@acemir/cssom": "npm:^0.9.31" - "@asamuzakjp/dom-selector": "npm:^6.8.1" + "@asamuzakjp/css-color": "npm:^5.1.11" + "@asamuzakjp/dom-selector": "npm:^7.1.1" "@bramus/specificity": "npm:^2.4.2" - "@exodus/bytes": "npm:^1.11.0" - cssstyle: "npm:^6.0.1" + "@csstools/css-syntax-patches-for-csstree": "npm:^1.1.3" + "@exodus/bytes": "npm:^1.15.0" + css-tree: "npm:^3.2.1" data-urls: "npm:^7.0.0" decimal.js: "npm:^10.6.0" html-encoding-sniffer: "npm:^6.0.0" - http-proxy-agent: "npm:^7.0.2" - https-proxy-agent: "npm:^7.0.6" is-potential-custom-element-name: "npm:^1.0.1" - parse5: "npm:^8.0.0" + lru-cache: "npm:^11.3.5" + parse5: "npm:^8.0.1" saxes: "npm:^6.0.0" symbol-tree: "npm:^3.2.4" - tough-cookie: "npm:^6.0.0" - undici: "npm:^7.21.0" + tough-cookie: "npm:^6.0.1" + undici: "npm:^7.25.0" w3c-xmlserializer: "npm:^5.0.0" webidl-conversions: "npm:^8.0.1" whatwg-mimetype: "npm:^5.0.0" - whatwg-url: "npm:^16.0.0" + whatwg-url: "npm:^16.0.1" xml-name-validator: "npm:^5.0.0" peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: canvas: optional: true - checksum: 10c0/341ecb4005be2dab3247dacc349a20285d7991b5cee3382301fcd69a4294b705b4147e7d9ae1ddfab466ba4b3aace97ded4f7b070de285262221cb2782965b25 + checksum: 10c0/20e2174b09d9d06393cb48e1392b7a1cb7191d6656a6f7b3b8fbf9853b4ab0ef60b4a42c2c55f71b55ca5da50ffa75bcdc6986210963182e7993c6f9cd4f499b languageName: node linkType: hard @@ -8743,13 +8721,6 @@ __metadata: languageName: node linkType: hard -"lodash.camelcase@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.camelcase@npm:4.3.0" - checksum: 10c0/fcba15d21a458076dd309fce6b1b4bf611d84a0ec252cb92447c948c533ac250b95d2e00955801ebc367e5af5ed288b996d75d37d2035260a937008e14eaf432 - languageName: node - linkType: hard - "lodash.flattendeep@npm:^4.4.0": version: 4.4.0 resolution: "lodash.flattendeep@npm:4.4.0" @@ -8771,13 +8742,6 @@ __metadata: languageName: node linkType: hard -"lodash.kebabcase@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.kebabcase@npm:4.1.1" - checksum: 10c0/da5d8f41dbb5bc723d4bf9203d5096ca8da804d6aec3d2b56457156ba6c8d999ff448d347ebd97490da853cb36696ea4da09a431499f1ee8deb17b094ecf4e33 - languageName: node - linkType: hard - "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -8785,34 +8749,6 @@ __metadata: languageName: node linkType: hard -"lodash.mergewith@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.mergewith@npm:4.6.2" - checksum: 10c0/4adbed65ff96fd65b0b3861f6899f98304f90fd71e7f1eb36c1270e05d500ee7f5ec44c02ef979b5ddbf75c0a0b9b99c35f0ad58f4011934c4d4e99e5200b3b5 - languageName: node - linkType: hard - -"lodash.snakecase@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.snakecase@npm:4.1.1" - checksum: 10c0/f0b3f2497eb20eea1a1cfc22d645ecaeb78ac14593eb0a40057977606d2f35f7aaff0913a06553c783b535aafc55b718f523f9eb78f8d5293f492af41002eaf9 - languageName: node - linkType: hard - -"lodash.startcase@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.startcase@npm:4.4.0" - checksum: 10c0/bd82aa87a45de8080e1c5ee61128c7aee77bf7f1d86f4ff94f4a6d7438fc9e15e5f03374b947be577a93804c8ad6241f0251beaf1452bf716064eeb657b3a9f0 - languageName: node - linkType: hard - -"lodash.upperfirst@npm:^4.3.1": - version: 4.3.1 - resolution: "lodash.upperfirst@npm:4.3.1" - checksum: 10c0/435625da4b3ee74e7a1367a780d9107ab0b13ef4359fc074b2a1a40458eb8d91b655af62f6795b7138d493303a98c0285340160341561d6896e4947e077fa975 - languageName: node - linkType: hard - "lodash@npm:^4.17.15": version: 4.18.1 resolution: "lodash@npm:4.18.1" @@ -8854,7 +8790,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^11.0.0, lru-cache@npm:^11.2.6": +"lru-cache@npm:^11.0.0, lru-cache@npm:^11.3.5": version: 11.5.1 resolution: "lru-cache@npm:11.5.1" checksum: 10c0/7b341cea79a8efe9c6a6f20c8757a77eca5b25d7ff983ccf4e11e547b81f6787824baa1c84705251dff84ab4ffac85717ac354b9d02e465f86a9f8b166409979 @@ -8991,13 +8927,6 @@ __metadata: languageName: node linkType: hard -"meow@npm:^12.0.1": - version: 12.1.1 - resolution: "meow@npm:12.1.1" - checksum: 10c0/a125ca99a32e2306e2f4cbe651a0d27f6eb67918d43a075f6e80b35e9bf372ebf0fc3a9fbc201cbbc9516444b6265fb3c9f80c5b7ebd32f548aa93eb7c28e088 - languageName: node - linkType: hard - "meow@npm:^13.0.0": version: 13.2.0 resolution: "meow@npm:13.2.0" @@ -9047,7 +8976,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2, minimatch@npm:^3.1.5": +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.2, minimatch@npm:^3.1.5": version: 3.1.5 resolution: "minimatch@npm:3.1.5" dependencies: @@ -9076,7 +9005,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.8": +"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 @@ -9307,9 +9236,9 @@ __metadata: languageName: node linkType: hard -"nyc@npm:^17.1.0": - version: 17.1.0 - resolution: "nyc@npm:17.1.0" +"nyc@npm:^18.0.0": + version: 18.0.0 + resolution: "nyc@npm:18.0.0" dependencies: "@istanbuljs/load-nyc-config": "npm:^1.0.0" "@istanbuljs/schema": "npm:^0.1.2" @@ -9320,11 +9249,11 @@ __metadata: find-up: "npm:^4.1.0" foreground-child: "npm:^3.3.0" get-package-type: "npm:^0.1.0" - glob: "npm:^7.1.6" + glob: "npm:^13.0.6" istanbul-lib-coverage: "npm:^3.0.0" istanbul-lib-hook: "npm:^3.0.0" istanbul-lib-instrument: "npm:^6.0.2" - istanbul-lib-processinfo: "npm:^2.0.2" + istanbul-lib-processinfo: "npm:^3.0.0" istanbul-lib-report: "npm:^3.0.0" istanbul-lib-source-maps: "npm:^4.0.0" istanbul-reports: "npm:^3.0.2" @@ -9333,14 +9262,14 @@ __metadata: p-map: "npm:^3.0.0" process-on-spawn: "npm:^1.0.0" resolve-from: "npm:^5.0.0" - rimraf: "npm:^3.0.0" + rimraf: "npm:^6.1.3" signal-exit: "npm:^3.0.2" - spawn-wrap: "npm:^2.0.0" - test-exclude: "npm:^6.0.0" + spawn-wrap: "npm:^3.0.0" + test-exclude: "npm:^8.0.0" yargs: "npm:^15.0.2" bin: nyc: bin/nyc.js - checksum: 10c0/653497bf11c53c70d821c18a2bfb7dba310b297b8bc83e5392e560c3d60d4dc9836b6c44f060065dfa99f7dacfd49147f8f60b160dfbe3f722517d4e7e236db2 + checksum: 10c0/1358e390623ec251250ca6786f0640f18b6b4db0b0e945362c91d1919fa3fcc5d065a47fa688fe04d1d8b76f33f6dfd79034e412ea161ba507a6ae7012f4550c languageName: node linkType: hard @@ -9443,7 +9372,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": +"once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -9723,7 +9652,7 @@ __metadata: languageName: node linkType: hard -"package-json-from-dist@npm:^1.0.0": +"package-json-from-dist@npm:^1.0.0, package-json-from-dist@npm:^1.0.1": version: 1.0.1 resolution: "package-json-from-dist@npm:1.0.1" checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b @@ -9761,7 +9690,7 @@ __metadata: languageName: node linkType: hard -"parse5@npm:^8.0.0": +"parse5@npm:^8.0.1": version: 8.0.1 resolution: "parse5@npm:8.0.1" dependencies: @@ -9791,13 +9720,6 @@ __metadata: languageName: node linkType: hard -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 - languageName: node - linkType: hard - "path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" @@ -10623,14 +10545,15 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^3.0.0": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" +"rimraf@npm:^6.1.3": + version: 6.1.3 + resolution: "rimraf@npm:6.1.3" dependencies: - glob: "npm:^7.1.3" + glob: "npm:^13.0.3" + package-json-from-dist: "npm:^1.0.1" bin: - rimraf: bin.js - checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 + rimraf: dist/esm/bin.mjs + checksum: 10c0/4a56537850102e20ba5d5eb49f366b4b7b2435389734b4b8480cf0e0eb0f6f5d0c44120a171aeb0d8f9ab40312a10d2262f3f50acbad803e32caef61b6cf86fc languageName: node linkType: hard @@ -10911,7 +10834,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2, semver@npm:^7.6.3, semver@npm:^7.7.3": +"semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2, semver@npm:^7.6.3, semver@npm:^7.7.3": version: 7.8.5 resolution: "semver@npm:7.8.5" bin: @@ -11102,17 +11025,18 @@ __metadata: languageName: node linkType: hard -"spawn-wrap@npm:^2.0.0": - version: 2.0.0 - resolution: "spawn-wrap@npm:2.0.0" +"spawn-wrap@npm:^3.0.0": + version: 3.0.0 + resolution: "spawn-wrap@npm:3.0.0" dependencies: + cross-spawn: "npm:^7.0.6" foreground-child: "npm:^2.0.0" is-windows: "npm:^1.0.2" make-dir: "npm:^3.0.0" - rimraf: "npm:^3.0.0" + rimraf: "npm:^6.1.3" signal-exit: "npm:^3.0.2" which: "npm:^2.0.1" - checksum: 10c0/0d30001391eedbd588722be74506d3e60582557e754fe3deb3f84f2c84ddca0d72d8132f16502cf312bacb8952cc7abe833d6f45b4e80c8baea3fa56c5554d3d + checksum: 10c0/46a6cfd37a5b59b198a19be1b8a4205a3a79eeeb98d36cd7d459aa5cbae0e91c5f58a67a023a0bd7f309929569faa370f22e3abd746782b535bdedd1f4d351b4 languageName: node linkType: hard @@ -11159,13 +11083,6 @@ __metadata: languageName: node linkType: hard -"split2@npm:^4.0.0": - version: 4.2.0 - resolution: "split2@npm:4.2.0" - checksum: 10c0/b292beb8ce9215f8c642bb68be6249c5a4c7f332fc8ecadae7be5cbdf1ea95addc95f0459ef2e7ad9d45fd1064698a097e4eb211c83e772b49bc0ee423e91534 - languageName: node - linkType: hard - "split@npm:^1.0.0": version: 1.0.1 resolution: "split@npm:1.0.1" @@ -11266,7 +11183,7 @@ __metadata: languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -11288,6 +11205,17 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^7.0.0, string-width@npm:^7.2.0": + version: 7.2.0 + resolution: "string-width@npm:7.2.0" + dependencies: + emoji-regex: "npm:^10.3.0" + get-east-asian-width: "npm:^1.0.0" + strip-ansi: "npm:^7.1.0" + checksum: 10c0/eb0430dd43f3199c7a46dcbf7a0b34539c76fe3aa62763d0b0655acdcbdf360b3f66f3d58ca25ba0205f42ea3491fa00f09426d3b7d3040e506878fc7664c9b9 + languageName: node + linkType: hard + "string.prototype.matchall@npm:^4.0.12": version: 4.0.12 resolution: "string.prototype.matchall@npm:4.0.12" @@ -11539,14 +11467,14 @@ __metadata: languageName: node linkType: hard -"test-exclude@npm:^6.0.0": - version: 6.0.0 - resolution: "test-exclude@npm:6.0.0" +"test-exclude@npm:^8.0.0": + version: 8.0.0 + resolution: "test-exclude@npm:8.0.0" dependencies: "@istanbuljs/schema": "npm:^0.1.2" - glob: "npm:^7.1.4" - minimatch: "npm:^3.0.4" - checksum: 10c0/019d33d81adff3f9f1bfcff18125fb2d3c65564f437d9be539270ee74b994986abb8260c7c2ce90e8f30162178b09dbbce33c6389273afac4f36069c48521f57 + glob: "npm:^13.0.6" + minimatch: "npm:^10.2.2" + checksum: 10c0/f2b613cb5ddc05d1357892f5da965a6f7af42b19a6b2fc30c9b93cb74adf5059a3a9f29818adb75c96c1747b3934caac90a9058f73ce0640ea101de828a11600 languageName: node linkType: hard @@ -11674,7 +11602,7 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^6.0.0": +"tough-cookie@npm:^6.0.1": version: 6.0.1 resolution: "tough-cookie@npm:6.0.1" dependencies: @@ -11991,7 +11919,7 @@ __metadata: languageName: node linkType: hard -"undici@npm:^7.21.0": +"undici@npm:^7.25.0": version: 7.28.0 resolution: "undici@npm:7.28.0" checksum: 10c0/fe781983a26098795e99bb1f64906cbb7d0bcaa029a26baade007b53ea67f2631d189b8f9671a31f4c8d0cb3773b7559608628ba54452fef51fec90e7c78bb0d @@ -12106,21 +12034,12 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^13.0.0": - version: 13.0.2 - resolution: "uuid@npm:13.0.2" +"uuid@npm:^14.0.1": + version: 14.0.1 + resolution: "uuid@npm:14.0.1" bin: uuid: dist-node/bin/uuid - checksum: 10c0/32c7ee84fa7c7966cc09b3a1514a752a8e2f609f15c00033fbaedc0255d577d1877b839f11ee537f37e587bbc620bbb98c3b3a1482931b8ed47d79497cd7a7cd - languageName: node - linkType: hard - -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 + checksum: 10c0/2d961289097cb68c37d93d1da0b5c3aafc1eb9948a455cca8d0ae53a099b2fe583b8933254a84097f700e6bac2e23033364904df0467c22551d5d9611febcaf6 languageName: node linkType: hard @@ -12223,7 +12142,7 @@ __metadata: languageName: node linkType: hard -"vite@npm:^7.3.1": +"vite@npm:^7.3.6": version: 7.3.6 resolution: "vite@npm:7.3.6" dependencies: @@ -12723,17 +12642,17 @@ __metadata: languageName: node linkType: hard -"vue-tsc@npm:^2.2.0": - version: 2.2.12 - resolution: "vue-tsc@npm:2.2.12" +"vue-tsc@npm:^3.3.5": + version: 3.3.5 + resolution: "vue-tsc@npm:3.3.5" dependencies: - "@volar/typescript": "npm:2.4.15" - "@vue/language-core": "npm:2.2.12" + "@volar/typescript": "npm:2.4.28" + "@vue/language-core": "npm:3.3.5" peerDependencies: typescript: ">=5.0.0" bin: - vue-tsc: ./bin/vue-tsc.js - checksum: 10c0/6c5159c064bc0a8628510bea1f55083a9ad03de35150e1d9ba5811b4e2c3fbc2a4c4d55fbe2d62fcad25c48771f62656e1b47ea5b072386914945707f97d7d65 + vue-tsc: bin/vue-tsc.js + checksum: 10c0/b3eecae069e2ae37544a7799f59a66b0f892d0a3d2a89f3f8e881c379a45232bb3ef2afc3d6c85fc3a83935f64c9149240db74972a6ee3feb6605b1622fec2d4 languageName: node linkType: hard @@ -12785,7 +12704,7 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:^16.0.0": +"whatwg-url@npm:^16.0.0, whatwg-url@npm:^16.0.1": version: 16.0.1 resolution: "whatwg-url@npm:16.0.1" dependencies: @@ -12957,6 +12876,17 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^9.0.0": + version: 9.0.2 + resolution: "wrap-ansi@npm:9.0.2" + dependencies: + ansi-styles: "npm:^6.2.1" + string-width: "npm:^7.0.0" + strip-ansi: "npm:^7.1.0" + checksum: 10c0/3305839b9a0d6fb930cb63a52f34d3936013d8b0682ff3ec133c9826512620f213800ffa19ea22904876d5b7e9a3c1f40682f03597d986a4ca881fa7b033688c + languageName: node + linkType: hard + "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" @@ -13089,10 +13019,10 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^21.1.1": - version: 21.1.1 - resolution: "yargs-parser@npm:21.1.1" - checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 +"yargs-parser@npm:^22.0.0": + version: 22.0.0 + resolution: "yargs-parser@npm:22.0.0" + checksum: 10c0/cb7ef81759c4271cb1d96b9351dbbc9a9ce35d3e1122d2b739bf6c432603824fa02c67cc12dcef6ea80283379d63495686e8f41cc7b06c6576e792aba4d33e1c languageName: node linkType: hard @@ -13130,18 +13060,17 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.0.0": - version: 17.7.3 - resolution: "yargs@npm:17.7.3" +"yargs@npm:^18.0.0": + version: 18.0.0 + resolution: "yargs@npm:18.0.0" dependencies: - cliui: "npm:^8.0.1" + cliui: "npm:^9.0.1" escalade: "npm:^3.1.1" get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.3" + string-width: "npm:^7.2.0" y18n: "npm:^5.0.5" - yargs-parser: "npm:^21.1.1" - checksum: 10c0/7a28572f7e785a57886e34fdbddb9b28756dec552e1453d5f6e7cdd00ad8721a4e8c4321d33683f5e61cacb36ad43258adbb48396b71ec4ed14abee0fc0d0c1f + yargs-parser: "npm:^22.0.0" + checksum: 10c0/bf290e4723876ea9c638c786a5c42ac28e03c9ca2325e1424bf43b94e5876456292d3ed905b853ebbba6daf43ed29e772ac2a6b3c5fb1b16533245d6211778f3 languageName: node linkType: hard From 43b56d71ff9dcd0b00cfdb060c1e49b12ed92891 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Sun, 28 Jun 2026 19:55:44 +0400 Subject: [PATCH 37/54] build: Storybook and Vite were updated --- m3-foundation/package.json | 2 +- m3-react/package.json | 26 +++++++++++++------------- m3-react/tests/M3Popper.test.tsx | 8 ++++++-- m3-vue/package.json | 20 ++++++++++---------- 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/m3-foundation/package.json b/m3-foundation/package.json index b90e362..e4cd641 100644 --- a/m3-foundation/package.json +++ b/m3-foundation/package.json @@ -39,7 +39,7 @@ "typescript": "~5.9.3", "typescript-eslint": "^8.56.0", "uuid": "^14.0.1", - "vite": "^7.3.6" + "vite": "^8.1.0" }, "contributors": [ "Zaitsev Kirill " diff --git a/m3-react/package.json b/m3-react/package.json index 9ab25fd..58062f5 100644 --- a/m3-react/package.json +++ b/m3-react/package.json @@ -45,15 +45,15 @@ "react-transition-state": "^2.1.1" }, "devDependencies": { - "@chromatic-com/storybook": "^5.0.1", + "@chromatic-com/storybook": "^5.2.1", "@eslint/js": "^9.39.4", - "@storybook/addon-a11y": "^10.2.10", - "@storybook/addon-docs": "^10.2.10", - "@storybook/addon-links": "^10.2.10", - "@storybook/addon-themes": "^10.2.10", - "@storybook/builder-vite": "^10.2.10", - "@storybook/react": "^10.2.10", - "@storybook/react-vite": "^10.2.10", + "@storybook/addon-a11y": "^10.4.6", + "@storybook/addon-docs": "^10.4.6", + "@storybook/addon-links": "^10.4.6", + "@storybook/addon-themes": "^10.4.6", + "@storybook/builder-vite": "^10.4.6", + "@storybook/react": "^10.4.6", + "@storybook/react-vite": "^10.4.6", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", @@ -65,13 +65,13 @@ "@types/react-transition-group": "^4.4.12", "@typescript-eslint/eslint-plugin": "^8.56.0", "@typescript-eslint/parser": "^8.56.0", - "@vitejs/plugin-react": "~5.1.4", + "@vitejs/plugin-react": "^6.0.3", "@vitest/browser": "^4.1.9", "@vitest/browser-playwright": "^4.1.9", "eslint": "^9.39.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-react": "^7.37.5", - "eslint-plugin-storybook": "^10.2.10", + "eslint-plugin-storybook": "^10.4.6", "eslint-plugin-unused-imports": "^4.4.1", "flag-icons": "^7.5.0", "globals": "^17.3.0", @@ -83,14 +83,14 @@ "react-transition-group": "^4.4.5", "react-transition-state": "^2.3.3", "sass": "^1.97.3", - "storybook": "^10.2.10", + "storybook": "^10.4.6", "ts-node": "^10.9.2", "tslib": "^2.8.1", "typescript": "~5.9.3", "typescript-eslint": "^8.56.0", "uuid": "^14.0.1", - "vite": "^7.3.6", - "vite-plugin-svgr": "^4.5.0", + "vite": "^8.1.0", + "vite-plugin-svgr": "^5.2.0", "vitest": "^4.1.9" }, "contributors": [ diff --git a/m3-react/tests/M3Popper.test.tsx b/m3-react/tests/M3Popper.test.tsx index 2fc1ca7..537f9d4 100644 --- a/m3-react/tests/M3Popper.test.tsx +++ b/m3-react/tests/M3Popper.test.tsx @@ -116,8 +116,12 @@ describe('m3-react/popper', () => { expect(popper.classList.contains('m3-popper_shown')).toBe(true) }) - document.body.dispatchEvent(new MouseEvent('mousedown', { bubbles: true })) - document.body.dispatchEvent(new MouseEvent('click', { bubbles: true })) + await act(async () => { + await new Promise(resolve => requestAnimationFrame(() => setTimeout(resolve, 0))) + }) + + fireEvent.mouseDown(document.body) + fireEvent.click(document.body) await waitFor(() => { expect(popper.classList.contains('m3-popper_shown')).toBe(false) diff --git a/m3-vue/package.json b/m3-vue/package.json index a0cbe3c..5c8b991 100644 --- a/m3-vue/package.json +++ b/m3-vue/package.json @@ -42,15 +42,15 @@ "vue": "^3.5" }, "devDependencies": { - "@chromatic-com/storybook": "^5.0.1", + "@chromatic-com/storybook": "^5.2.1", "@eslint/js": "^9.39.4", - "@storybook/addon-a11y": "^10.2.10", - "@storybook/addon-docs": "^10.2.10", - "@storybook/addon-links": "^10.2.10", - "@storybook/addon-themes": "^10.2.10", - "@storybook/builder-vite": "^10.2.10", - "@storybook/vue3": "^10.2.10", - "@storybook/vue3-vite": "^10.2.10", + "@storybook/addon-a11y": "^10.4.6", + "@storybook/addon-docs": "^10.4.6", + "@storybook/addon-links": "^10.4.6", + "@storybook/addon-themes": "^10.4.6", + "@storybook/builder-vite": "^10.4.6", + "@storybook/vue3": "^10.4.6", + "@storybook/vue3-vite": "^10.4.6", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/user-event": "^14.6.1", @@ -76,13 +76,13 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "sass": "^1.97.3", - "storybook": "^10.2.10", + "storybook": "^10.4.6", "ts-node": "^10.9.2", "tslib": "^2.8.1", "typescript": "~5.9.3", "typescript-eslint": "^8.56.0", "uuid": "^14.0.1", - "vite": "^7.3.6", + "vite": "^8.1.0", "vite-svg-loader": "^5.1.0", "vitest": "^4.1.9", "vue": "^3.5.28", From ae3b7dd038e126144f36f59beb448e1718059f64 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Sun, 28 Jun 2026 21:01:10 +0400 Subject: [PATCH 38/54] fix: Storybook test domains were allowed --- m3-react/storybook/main.ts | 10 ++++++++-- m3-vue/storybook/main.ts | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/m3-react/storybook/main.ts b/m3-react/storybook/main.ts index f07f9ab..534b294 100644 --- a/m3-react/storybook/main.ts +++ b/m3-react/storybook/main.ts @@ -3,6 +3,7 @@ import type { StorybookConfig } from '@storybook/react-vite' const DEFAULT_ALLOWED_HOSTS = [ 'localhost', '127.0.0.1', + '.modulify.test', ] const envAllowedHosts = (process.env.STORYBOOK_ALLOWED_HOSTS ?? '') @@ -10,6 +11,11 @@ const envAllowedHosts = (process.env.STORYBOOK_ALLOWED_HOSTS ?? '') .map(host => host.trim()) .filter(Boolean) +const allowedHosts = Array.from(new Set([ + ...DEFAULT_ALLOWED_HOSTS, + ...envAllowedHosts, +])) + const config: StorybookConfig = { addons: [ '@chromatic-com/storybook', @@ -19,6 +25,7 @@ const config: StorybookConfig = { '@storybook/addon-themes', ], core: { + allowedHosts, disableWhatsNewNotifications: true, builder: { name: '@storybook/builder-vite', @@ -47,8 +54,7 @@ const config: StorybookConfig = { if (config.server.allowedHosts !== true) { config.server.allowedHosts = [ ...(config.server.allowedHosts ?? []), - ...DEFAULT_ALLOWED_HOSTS, - ...envAllowedHosts, + ...allowedHosts, ] } diff --git a/m3-vue/storybook/main.ts b/m3-vue/storybook/main.ts index 9910401..dc6448a 100644 --- a/m3-vue/storybook/main.ts +++ b/m3-vue/storybook/main.ts @@ -3,6 +3,7 @@ import type { StorybookConfig } from '@storybook/vue3-vite' const DEFAULT_ALLOWED_HOSTS = [ 'localhost', '127.0.0.1', + '.modulify.test', ] const envAllowedHosts = (process.env.STORYBOOK_ALLOWED_HOSTS ?? '') @@ -10,6 +11,11 @@ const envAllowedHosts = (process.env.STORYBOOK_ALLOWED_HOSTS ?? '') .map(host => host.trim()) .filter(Boolean) +const allowedHosts = Array.from(new Set([ + ...DEFAULT_ALLOWED_HOSTS, + ...envAllowedHosts, +])) + const config: StorybookConfig = { addons: [ '@chromatic-com/storybook', @@ -19,6 +25,7 @@ const config: StorybookConfig = { '@storybook/addon-themes', ], core: { + allowedHosts, disableWhatsNewNotifications: true, builder: { name: '@storybook/builder-vite', @@ -47,8 +54,7 @@ const config: StorybookConfig = { if (config.server.allowedHosts !== true) { config.server.allowedHosts = [ ...(config.server.allowedHosts ?? []), - ...DEFAULT_ALLOWED_HOSTS, - ...envAllowedHosts, + ...allowedHosts, ] } From 752dc6dc73ab2118384824a99be7d05b1fd38440 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Sun, 28 Jun 2026 21:01:32 +0400 Subject: [PATCH 39/54] chore: Updated yarn.lock --- yarn.lock | 709 ++++++++++++++---------------------------------------- 1 file changed, 179 insertions(+), 530 deletions(-) diff --git a/yarn.lock b/yarn.lock index 301cb77..227964b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -377,13 +377,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/helper-plugin-utils@npm:7.29.7" - checksum: 10c0/380477a06133274a2759f9355929cb60a95e8b8fee624a1ae1fa349e1d1645b89daca456f72833f6d1062bffa12ee4271c5bf0cc5a61c0166cdc24c7591e2408 - languageName: node - linkType: hard - "@babel/helper-simple-access@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-simple-access@npm:7.22.5" @@ -636,28 +629,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-self@npm:^7.27.1": - version: 7.29.7 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.29.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.29.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/288995f0fd0d61ab740a315fb56c8255eb87dd4a4ac2ac7d0fdd4ce173c3878200141e80da2db0e598c7b2a71e74e604afdbb4c8e14ae6e0527ce0b6294c03da - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx-source@npm:^7.27.1": - version: 7.29.7 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.29.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.29.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/a121899631e6d99b9e1b276acf736dbb77948a31f8eeeae67b89c8a4ab0f05e51ba64544baa06c286a2b9944f227244e15aac464e2313d286d0511fe51e27975 - languageName: node - linkType: hard - "@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": version: 7.24.1 resolution: "@babel/runtime@npm:7.24.1" @@ -838,18 +809,17 @@ __metadata: languageName: node linkType: hard -"@chromatic-com/storybook@npm:^5.0.1": - version: 5.0.1 - resolution: "@chromatic-com/storybook@npm:5.0.1" +"@chromatic-com/storybook@npm:^5.2.1": + version: 5.2.1 + resolution: "@chromatic-com/storybook@npm:5.2.1" dependencies: "@neoconfetti/react": "npm:^1.0.0" - chromatic: "npm:^13.3.4" - filesize: "npm:^10.0.12" + chromatic: "npm:16.10.0" jsonfile: "npm:^6.1.0" strip-ansi: "npm:^7.1.0" peerDependencies: - storybook: ^0.0.0-0 || ^10.1.0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 - checksum: 10c0/feb76f32347b09cc45bde04e2dc4374510bbcd9410f4cef67b08f82be4d2ae625da2347f9495e7bb5cfa368fd5af40f97ef2fcd054313365d3bd20c175cf3975 + storybook: ^0.0.0-0 || ^10.1.0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 || ^10.4.0-0 || ^10.5.0-0 || ^10.6.0-0 + checksum: 10c0/066b0a75906936916cbafbcb26375509240025bbacda02d9ae4929aaec07ae3ec7792dddf0b03095b8792d7891a55c1d70af6496eda1d3932fa2e2b9caa2407e languageName: node linkType: hard @@ -1676,19 +1646,19 @@ __metadata: languageName: node linkType: hard -"@joshwooding/vite-plugin-react-docgen-typescript@npm:^0.6.4": - version: 0.6.4 - resolution: "@joshwooding/vite-plugin-react-docgen-typescript@npm:0.6.4" +"@joshwooding/vite-plugin-react-docgen-typescript@npm:^0.7.0": + version: 0.7.0 + resolution: "@joshwooding/vite-plugin-react-docgen-typescript@npm:0.7.0" dependencies: glob: "npm:^13.0.1" react-docgen-typescript: "npm:^2.2.2" peerDependencies: typescript: ">= 4.3.x" - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/73149b2d41d5b8eff7dfe4d037a6903fe4123ae46f3928d88535020539f44159c4ea1b342e6a77d4c14219f2f743fea0ef96e81279cce8b6d247dc4d582e27ed + checksum: 10c0/6d1a353e4dd0d9d641beafcf8d5c36805ad7f916ae07b817642033bc85c388f819f92dc94db192117dedfaa5d981ac5ef72911315e3e4bf2fe9e23d8956618e6 languageName: node linkType: hard @@ -1824,7 +1794,7 @@ __metadata: typescript: "npm:~5.9.3" typescript-eslint: "npm:^8.56.0" uuid: "npm:^14.0.1" - vite: "npm:^7.3.6" + vite: "npm:^8.1.0" languageName: unknown linkType: soft @@ -1832,18 +1802,18 @@ __metadata: version: 0.0.0-use.local resolution: "@modulify/m3-react@workspace:m3-react" dependencies: - "@chromatic-com/storybook": "npm:^5.0.1" + "@chromatic-com/storybook": "npm:^5.2.1" "@eslint/js": "npm:^9.39.4" "@floating-ui/core": "npm:^1.7.4" "@floating-ui/dom": "npm:^1.7.5" "@modulify/m3-foundation": "npm:0.0.0" - "@storybook/addon-a11y": "npm:^10.2.10" - "@storybook/addon-docs": "npm:^10.2.10" - "@storybook/addon-links": "npm:^10.2.10" - "@storybook/addon-themes": "npm:^10.2.10" - "@storybook/builder-vite": "npm:^10.2.10" - "@storybook/react": "npm:^10.2.10" - "@storybook/react-vite": "npm:^10.2.10" + "@storybook/addon-a11y": "npm:^10.4.6" + "@storybook/addon-docs": "npm:^10.4.6" + "@storybook/addon-links": "npm:^10.4.6" + "@storybook/addon-themes": "npm:^10.4.6" + "@storybook/builder-vite": "npm:^10.4.6" + "@storybook/react": "npm:^10.4.6" + "@storybook/react-vite": "npm:^10.4.6" "@testing-library/dom": "npm:^10.4.1" "@testing-library/jest-dom": "npm:^6.9.1" "@testing-library/react": "npm:^16.3.2" @@ -1855,13 +1825,13 @@ __metadata: "@types/react-transition-group": "npm:^4.4.12" "@typescript-eslint/eslint-plugin": "npm:^8.56.0" "@typescript-eslint/parser": "npm:^8.56.0" - "@vitejs/plugin-react": "npm:~5.1.4" + "@vitejs/plugin-react": "npm:^6.0.3" "@vitest/browser": "npm:^4.1.9" "@vitest/browser-playwright": "npm:^4.1.9" eslint: "npm:^9.39.4" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-react: "npm:^7.37.5" - eslint-plugin-storybook: "npm:^10.2.10" + eslint-plugin-storybook: "npm:^10.4.6" eslint-plugin-unused-imports: "npm:^4.4.1" flag-icons: "npm:^7.5.0" globals: "npm:^17.3.0" @@ -1874,14 +1844,14 @@ __metadata: react-transition-group: "npm:^4.4.5" react-transition-state: "npm:^2.3.3" sass: "npm:^1.97.3" - storybook: "npm:^10.2.10" + storybook: "npm:^10.4.6" ts-node: "npm:^10.9.2" tslib: "npm:^2.8.1" typescript: "npm:~5.9.3" typescript-eslint: "npm:^8.56.0" uuid: "npm:^14.0.1" - vite: "npm:^7.3.6" - vite-plugin-svgr: "npm:^4.5.0" + vite: "npm:^8.1.0" + vite-plugin-svgr: "npm:^5.2.0" vitest: "npm:^4.1.9" peerDependencies: react: ^18.2.0 @@ -1895,18 +1865,18 @@ __metadata: version: 0.0.0-use.local resolution: "@modulify/m3-vue@workspace:m3-vue" dependencies: - "@chromatic-com/storybook": "npm:^5.0.1" + "@chromatic-com/storybook": "npm:^5.2.1" "@eslint/js": "npm:^9.39.4" "@floating-ui/core": "npm:^1.7.4" "@floating-ui/dom": "npm:^1.7.5" "@modulify/m3-foundation": "npm:0.0.0" - "@storybook/addon-a11y": "npm:^10.2.10" - "@storybook/addon-docs": "npm:^10.2.10" - "@storybook/addon-links": "npm:^10.2.10" - "@storybook/addon-themes": "npm:^10.2.10" - "@storybook/builder-vite": "npm:^10.2.10" - "@storybook/vue3": "npm:^10.2.10" - "@storybook/vue3-vite": "npm:^10.2.10" + "@storybook/addon-a11y": "npm:^10.4.6" + "@storybook/addon-docs": "npm:^10.4.6" + "@storybook/addon-links": "npm:^10.4.6" + "@storybook/addon-themes": "npm:^10.4.6" + "@storybook/builder-vite": "npm:^10.4.6" + "@storybook/vue3": "npm:^10.4.6" + "@storybook/vue3-vite": "npm:^10.4.6" "@testing-library/dom": "npm:^10.4.1" "@testing-library/jest-dom": "npm:^6.9.1" "@testing-library/user-event": "npm:^14.6.1" @@ -1933,13 +1903,13 @@ __metadata: react: "npm:^18.3.1" react-dom: "npm:^18.3.1" sass: "npm:^1.97.3" - storybook: "npm:^10.2.10" + storybook: "npm:^10.4.6" ts-node: "npm:^10.9.2" tslib: "npm:^2.8.1" typescript: "npm:~5.9.3" typescript-eslint: "npm:^8.56.0" uuid: "npm:^14.0.1" - vite: "npm:^7.3.6" + vite: "npm:^8.1.0" vite-svg-loader: "npm:^5.1.0" vitest: "npm:^4.1.9" vue: "npm:^3.5.28" @@ -2572,14 +2542,7 @@ __metadata: languageName: node linkType: hard -"@rolldown/pluginutils@npm:1.0.0-rc.3": - version: 1.0.0-rc.3 - resolution: "@rolldown/pluginutils@npm:1.0.0-rc.3" - checksum: 10c0/3928b6282a30f307d1b075d2f217180ae173ea9e00638ce46ab65f089bd5f7a0b2c488ae1ce530f509387793c656a2910337c4cd68fa9d37d7e439365989e699 - languageName: node - linkType: hard - -"@rolldown/pluginutils@npm:^1.0.0": +"@rolldown/pluginutils@npm:^1.0.0, @rolldown/pluginutils@npm:^1.0.1": version: 1.0.1 resolution: "@rolldown/pluginutils@npm:1.0.1" checksum: 10c0/99d9b06d90196823e4d8c841f258db7a16e5dbba5824a2962b05d907b79f1ba929d56f22dd744fd530936e568c865ee56a719dc31e57e13bc0a8eb4764a8d8dd @@ -2602,7 +2565,7 @@ __metadata: languageName: node linkType: hard -"@rollup/pluginutils@npm:^5.2.0": +"@rollup/pluginutils@npm:^5.3.0": version: 5.4.0 resolution: "@rollup/pluginutils@npm:5.4.0" dependencies: @@ -2618,181 +2581,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.62.2" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@rollup/rollup-android-arm64@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-android-arm64@npm:4.62.2" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-arm64@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-darwin-arm64@npm:4.62.2" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-x64@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-darwin-x64@npm:4.62.2" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-arm64@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.62.2" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-x64@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-freebsd-x64@npm:4.62.2" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-gnueabihf@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.62.2" - conditions: os=linux & cpu=arm & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-musleabihf@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.62.2" - conditions: os=linux & cpu=arm & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-gnu@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.62.2" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-musl@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.62.2" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-loong64-gnu@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.62.2" - conditions: os=linux & cpu=loong64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-loong64-musl@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-linux-loong64-musl@npm:4.62.2" - conditions: os=linux & cpu=loong64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-ppc64-gnu@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.62.2" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-ppc64-musl@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-linux-ppc64-musl@npm:4.62.2" - conditions: os=linux & cpu=ppc64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-riscv64-gnu@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.62.2" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-riscv64-musl@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.62.2" - conditions: os=linux & cpu=riscv64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-s390x-gnu@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.62.2" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-gnu@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.62.2" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-musl@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.62.2" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-openbsd-x64@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-openbsd-x64@npm:4.62.2" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-openharmony-arm64@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-openharmony-arm64@npm:4.62.2" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-arm64-msvc@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.62.2" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-ia32-msvc@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.62.2" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-gnu@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-win32-x64-gnu@npm:4.62.2" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-msvc@npm:4.62.2": - version: 4.62.2 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.62.2" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@rtsao/scc@npm:^1.1.0": version: 1.1.0 resolution: "@rtsao/scc@npm:1.1.0" @@ -2823,83 +2611,90 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-a11y@npm:^10.2.10": - version: 10.2.10 - resolution: "@storybook/addon-a11y@npm:10.2.10" +"@storybook/addon-a11y@npm:^10.4.6": + version: 10.4.6 + resolution: "@storybook/addon-a11y@npm:10.4.6" dependencies: "@storybook/global": "npm:^5.0.0" axe-core: "npm:^4.2.0" peerDependencies: - storybook: ^10.2.10 - checksum: 10c0/c775343f60ba4ecc0b1f73be28b8bc94fbb0c287c0ea226c2bf5e43e0e2668fba3db2848a7899d689065f8d74bb80c8d0a6f646131c478641a08c866768342c2 + storybook: ^10.4.6 + checksum: 10c0/cdb88829b82bb2f2caac363eb54981d1573161494da8ac2feb840e36a51951a4a97ecb7985ac152a450b580ec8323dac3fba98dc5533e8b1d32421eeabb42a5e languageName: node linkType: hard -"@storybook/addon-docs@npm:^10.2.10": - version: 10.2.10 - resolution: "@storybook/addon-docs@npm:10.2.10" +"@storybook/addon-docs@npm:^10.4.6": + version: 10.4.6 + resolution: "@storybook/addon-docs@npm:10.4.6" dependencies: "@mdx-js/react": "npm:^3.0.0" - "@storybook/csf-plugin": "npm:10.2.10" - "@storybook/icons": "npm:^2.0.1" - "@storybook/react-dom-shim": "npm:10.2.10" + "@storybook/csf-plugin": "npm:10.4.6" + "@storybook/icons": "npm:^2.0.2" + "@storybook/react-dom-shim": "npm:10.4.6" react: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" react-dom: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^10.2.10 - checksum: 10c0/b39fc42e505aeb7633aa041a613d81bc2a4bb7916abb26f8414144d0a5cfb797c4d0353af07e5578f516be618947965235e5a017fb9db626ad98bd444df3dffe + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.4.6 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/427d1a0ef7a3c39205c1486b930628939ee5409f247623eee8c767c0cb041a62a3c853a27d650411aa6a8f5b5a881164e242fe963a5f6edbecd0283f4bf06e07 languageName: node linkType: hard -"@storybook/addon-links@npm:^10.2.10": - version: 10.2.10 - resolution: "@storybook/addon-links@npm:10.2.10" +"@storybook/addon-links@npm:^10.4.6": + version: 10.4.6 + resolution: "@storybook/addon-links@npm:10.4.6" dependencies: "@storybook/global": "npm:^5.0.0" peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.2.10 + storybook: ^10.4.6 peerDependenciesMeta: + "@types/react": + optional: true react: optional: true - checksum: 10c0/f0cd44c042fc3e6a02486a7e957d92bfc0f3d43a647ba236f4ef8b6f48ff05ad6380dccec206d2462a2fd0617d53d20d8dedc381b5e2194e82c03637277e5b31 + checksum: 10c0/bd03384e5cc82fc88ac0741bd79888fd9dbda842df5c433fa0ecfdb381321ccc74429bbbc79a00b316184af5b4cdfc0eb4b5f8547dc6682d0b4bfa809de4ca4c languageName: node linkType: hard -"@storybook/addon-themes@npm:^10.2.10": - version: 10.2.10 - resolution: "@storybook/addon-themes@npm:10.2.10" +"@storybook/addon-themes@npm:^10.4.6": + version: 10.4.6 + resolution: "@storybook/addon-themes@npm:10.4.6" dependencies: ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^10.2.10 - checksum: 10c0/ccbb25b5d6b2e771f0dbbc3247870749fb71205f4fcdf8084830d66eb5ad8cb44b80ae5cd6b8ea7583b01753c7bfb37dde42f51c30daf35fd13723e1eabd250b + storybook: ^10.4.6 + checksum: 10c0/1121f6d8de9ce016052ffdb7d4f3d73cc4f2088b56be34976dd77ba56891d487cc2b20aba2a31ac238654d82cfe5682c25c86740e3d80d6103ee16f887711379 languageName: node linkType: hard -"@storybook/builder-vite@npm:10.2.10, @storybook/builder-vite@npm:^10.2.10": - version: 10.2.10 - resolution: "@storybook/builder-vite@npm:10.2.10" +"@storybook/builder-vite@npm:10.4.6, @storybook/builder-vite@npm:^10.4.6": + version: 10.4.6 + resolution: "@storybook/builder-vite@npm:10.4.6" dependencies: - "@storybook/csf-plugin": "npm:10.2.10" + "@storybook/csf-plugin": "npm:10.4.6" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^10.2.10 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/7b2d55cb85f87cbcf908d240b52d39e8b699d6d5dca97583428220836276479a73f963a7b4da39fc79e79ec0899b5d4890635be5f9a02c51434b2e00717188d7 + storybook: ^10.4.6 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/6238a6574485b979f698fe4979df4307a1a2554748c7a6530e7985f5df238cc6419b53ea6812f4c206ec39d96554a911ba302b9aa19460bacb6097af8c4be36e languageName: node linkType: hard -"@storybook/csf-plugin@npm:10.2.10": - version: 10.2.10 - resolution: "@storybook/csf-plugin@npm:10.2.10" +"@storybook/csf-plugin@npm:10.4.6": + version: 10.4.6 + resolution: "@storybook/csf-plugin@npm:10.4.6" dependencies: unplugin: "npm:^2.3.5" peerDependencies: esbuild: "*" rollup: "*" - storybook: ^10.2.10 + storybook: ^10.4.6 vite: "*" webpack: "*" peerDependenciesMeta: @@ -2911,7 +2706,7 @@ __metadata: optional: true webpack: optional: true - checksum: 10c0/a51f59ae8068c505cc1dcb471aa2f5656c87fba61fc681a77529e6c189a6ba353d61f3f452ca66717e6ec3b2096879f6d6026c97743e781e7fa511cebbb3b363 + checksum: 10c0/73346ae0be948a2365b3fbc0f3b0fadfcb1c440accb40e012f3244417106c165baf83e3f4dff8c08ae7ca94ce6a26595d17fe09edd5e90c411c038ced0beba2b languageName: node linkType: hard @@ -2922,16 +2717,6 @@ __metadata: languageName: node linkType: hard -"@storybook/icons@npm:^2.0.1": - version: 2.0.1 - resolution: "@storybook/icons@npm:2.0.1" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/df2bbf1a5b50f12ab1bf78cae6de4dbf7c49df0e3a5f845553b51b20adbe8386a09fd172ea60342379f9284bb528cba2d0e2659cae6eb8d015cf92c8b32f1222 - languageName: node - linkType: hard - "@storybook/icons@npm:^2.0.2": version: 2.1.0 resolution: "@storybook/icons@npm:2.1.0" @@ -2941,25 +2726,32 @@ __metadata: languageName: node linkType: hard -"@storybook/react-dom-shim@npm:10.2.10": - version: 10.2.10 - resolution: "@storybook/react-dom-shim@npm:10.2.10" +"@storybook/react-dom-shim@npm:10.4.6": + version: 10.4.6 + resolution: "@storybook/react-dom-shim@npm:10.4.6" peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + "@types/react-dom": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.2.10 - checksum: 10c0/04c098a8c73182a2a69d9f8ca706c93f14a9b36945d946921c2815a7764122d0518de7005b1db84a4125331f92ee8498776c5e93eeab8a013bf82be1fcffcbc2 + storybook: ^10.4.6 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/d7b2f86be48714cbe217628207a9c6de43839cf74c684501f107049983e6444d0de6b7d84d006a0fb5b63e42ab789ea3abc40e2450a3dee6b38ceba482cc7176 languageName: node linkType: hard -"@storybook/react-vite@npm:^10.2.10": - version: 10.2.10 - resolution: "@storybook/react-vite@npm:10.2.10" +"@storybook/react-vite@npm:^10.4.6": + version: 10.4.6 + resolution: "@storybook/react-vite@npm:10.4.6" dependencies: - "@joshwooding/vite-plugin-react-docgen-typescript": "npm:^0.6.4" + "@joshwooding/vite-plugin-react-docgen-typescript": "npm:^0.7.0" "@rollup/pluginutils": "npm:^5.0.2" - "@storybook/builder-vite": "npm:10.2.10" - "@storybook/react": "npm:10.2.10" + "@storybook/builder-vite": "npm:10.4.6" + "@storybook/react": "npm:10.4.6" empathic: "npm:^2.0.0" magic-string: "npm:^0.30.0" react-docgen: "npm:^8.0.0" @@ -2968,59 +2760,66 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.2.10 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/8aec60cd636ff558fb0680863350d077d51f1094d184086ee9137a0866f260ccb5ad025800245bace99d053ccb42cc189342cba168cc809f6d9ddf7f7e5d7686 + storybook: ^10.4.6 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/5e85ce8c585c8cb9fee11bf2d0d574663818e806892cb72c8cab94c88445084b92632cabd2684178a64f53e2564cd8fb0ac586dabf1ff0c31279615c30d8c183 languageName: node linkType: hard -"@storybook/react@npm:10.2.10, @storybook/react@npm:^10.2.10": - version: 10.2.10 - resolution: "@storybook/react@npm:10.2.10" +"@storybook/react@npm:10.4.6, @storybook/react@npm:^10.4.6": + version: 10.4.6 + resolution: "@storybook/react@npm:10.4.6" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/react-dom-shim": "npm:10.2.10" + "@storybook/react-dom-shim": "npm:10.4.6" react-docgen: "npm:^8.0.2" + react-docgen-typescript: "npm:^2.2.2" peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + "@types/react-dom": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.2.10 + storybook: ^10.4.6 typescript: ">= 4.9.x" peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true typescript: optional: true - checksum: 10c0/89aad6797a0e83b7d4b9f6d30d6187db70a5d6e7a073bc30013e93ea8b3a0d5b46433b1f002dc12ae3755d0e9ac2d0242f55098e78d6baa6cc09b1d97bdf3dc7 + checksum: 10c0/8785d8665c47db86591964fdbde3601fa08f177cd81b85b99b01e2c89b3a0ef5635d71114836afc73944c1009a3fcb6157fe5fb6ef3a6b806eaaed601bb05ee0 languageName: node linkType: hard -"@storybook/vue3-vite@npm:^10.2.10": - version: 10.2.10 - resolution: "@storybook/vue3-vite@npm:10.2.10" +"@storybook/vue3-vite@npm:^10.4.6": + version: 10.4.6 + resolution: "@storybook/vue3-vite@npm:10.4.6" dependencies: - "@storybook/builder-vite": "npm:10.2.10" - "@storybook/vue3": "npm:10.2.10" + "@storybook/builder-vite": "npm:10.4.6" + "@storybook/vue3": "npm:10.4.6" magic-string: "npm:^0.30.0" typescript: "npm:^5.9.3" vue-component-meta: "npm:^2.0.0" vue-docgen-api: "npm:^4.75.1" peerDependencies: - storybook: ^10.2.10 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/afa8fce3dd9fa951b42626d420dabf67b8d9ee9fab834750e19f64d3b22cf9eae65b749d0a334218d009e22c572bf0e8605d5c44a0ed20dbf1898feeb25e8b9d + storybook: ^10.4.6 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/c21aa98f76e956413bb230355d3ac56543de625fe27846959f5671035584357fcb775202054d49d18028615c7adbb8c03f271efc1584618dfe1acdf87d9b1987 languageName: node linkType: hard -"@storybook/vue3@npm:10.2.10, @storybook/vue3@npm:^10.2.10": - version: 10.2.10 - resolution: "@storybook/vue3@npm:10.2.10" +"@storybook/vue3@npm:10.4.6, @storybook/vue3@npm:^10.4.6": + version: 10.4.6 + resolution: "@storybook/vue3@npm:10.4.6" dependencies: "@storybook/global": "npm:^5.0.0" - type-fest: "npm:~2.19" - vue-component-type-helpers: "npm:latest" + type-fest: "npm:^5.6.0" + vue-component-type-helpers: "npm:^3.2.9" peerDependencies: - storybook: ^10.2.10 + storybook: ^10.4.6 vue: ^3.0.0 - checksum: 10c0/7961831c852cc58750f34f238718a2315d78c5127327010d0da02d38e3c147f83dd51b88f0d336a6fc2c9d3b345d834b37a10c708e3f2720eeb782b069b335f0 + checksum: 10c0/19b26ca20b4f82141a56195a29098996a41cab9f4f16873e1de87e276764fd656997ddb775afcdd84a38f2840e681eb296ba958432f346a53b32ffb984bce5f1 languageName: node linkType: hard @@ -3368,13 +3167,6 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.9": - version: 1.0.9 - resolution: "@types/estree@npm:1.0.9" - checksum: 10c0/3ad3286ca2988cd550dafb8f2ad599c8474868e954fa601a36655bdfefd8039f7c714b8c1c7f2ae219ffbd58bd4660e66fa7479a0120fc02d4777057d4865387 - languageName: node - linkType: hard - "@types/estree@npm:^1.0.0": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" @@ -3775,19 +3567,21 @@ __metadata: languageName: node linkType: hard -"@vitejs/plugin-react@npm:~5.1.4": - version: 5.1.4 - resolution: "@vitejs/plugin-react@npm:5.1.4" +"@vitejs/plugin-react@npm:^6.0.3": + version: 6.0.3 + resolution: "@vitejs/plugin-react@npm:6.0.3" dependencies: - "@babel/core": "npm:^7.29.0" - "@babel/plugin-transform-react-jsx-self": "npm:^7.27.1" - "@babel/plugin-transform-react-jsx-source": "npm:^7.27.1" - "@rolldown/pluginutils": "npm:1.0.0-rc.3" - "@types/babel__core": "npm:^7.20.5" - react-refresh: "npm:^0.18.0" + "@rolldown/pluginutils": "npm:^1.0.1" peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/dd7b8f40717ecd4a5ab18f467134ea8135f9a443359333d71e4114aeacfc8b679be9fd36dc12290d076c78883a02e708bfe1f0d93411c06c9659da0879b952e3 + "@rolldown/plugin-babel": ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + "@rolldown/plugin-babel": + optional: true + babel-plugin-react-compiler: + optional: true + checksum: 10c0/592a93178c0eec420759d529a2c964a7103860808f549f72993b96a38c287c929a0d371cacbd932c37ee2118b830348db752cc01a31d688c71d19d74567251fa languageName: node linkType: hard @@ -5294,22 +5088,27 @@ __metadata: languageName: node linkType: hard -"chromatic@npm:^13.3.4": - version: 13.3.5 - resolution: "chromatic@npm:13.3.5" +"chromatic@npm:16.10.0": + version: 16.10.0 + resolution: "chromatic@npm:16.10.0" + dependencies: + semver: "npm:^7.3.5" peerDependencies: "@chromatic-com/cypress": ^0.*.* || ^1.0.0 "@chromatic-com/playwright": ^0.*.* || ^1.0.0 + "@chromatic-com/vitest": ^0.*.* || ^1.0.0 peerDependenciesMeta: "@chromatic-com/cypress": optional: true "@chromatic-com/playwright": optional: true + "@chromatic-com/vitest": + optional: true bin: - chroma: dist/bin.js - chromatic: dist/bin.js - chromatic-cli: dist/bin.js - checksum: 10c0/58b3d7984db000f8c7b605788569a24c3f3cd41bb6b2d3a94f18acc9ff11ce6c6881f795c8390a94ff721ccfcf8a2d7942e78a54a1f70294a7b3d35ccc382154 + chroma: dist/bin.cjs + chromatic: dist/bin.cjs + chromatic-cli: dist/bin.cjs + checksum: 10c0/4867da7b0512c6c86b00b7e633908e90594b893801202577d76849d9b0ba61c716dfa7479dcb5c0786665b7fe6560ede262ad6a16696fc74c2240cc6d5bf485c languageName: node linkType: hard @@ -6565,7 +6364,7 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0 || ^0.28.0, esbuild@npm:^0.27.0 || ^0.28.0": +"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0 || ^0.28.0": version: 0.28.1 resolution: "esbuild@npm:0.28.1" dependencies: @@ -6755,7 +6554,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-storybook@npm:^10.2.10": +"eslint-plugin-storybook@npm:^10.4.6": version: 10.4.6 resolution: "eslint-plugin-storybook@npm:10.4.6" dependencies: @@ -7076,13 +6875,6 @@ __metadata: languageName: node linkType: hard -"filesize@npm:^10.0.12": - version: 10.1.6 - resolution: "filesize@npm:10.1.6" - checksum: 10c0/9a196d64da4e947b8c0d294be09a3dfa7a634434a1fc5fb3465f1c9acc1237ea0363f245ba6e24477ea612754d942bc964d86e0e500905a72e9e0e17ae1bbdbc - languageName: node - linkType: hard - "find-cache-dir@npm:^3.2.0": version: 3.3.2 resolution: "find-cache-dir@npm:3.3.2" @@ -7209,7 +7001,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": +"fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -7228,7 +7020,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": +"fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -10249,13 +10041,6 @@ __metadata: languageName: node linkType: hard -"react-refresh@npm:^0.18.0": - version: 0.18.0 - resolution: "react-refresh@npm:0.18.0" - checksum: 10c0/34a262f7fd803433a534f50deb27a148112a81adcae440c7d1cbae7ef14d21ea8f2b3d783e858cb7698968183b77755a38b4d4b5b1d79b4f4689c2f6d358fff2 - languageName: node - linkType: hard - "react-transition-group@npm:^4.4.5": version: 4.4.5 resolution: "react-transition-group@npm:4.4.5" @@ -10615,96 +10400,6 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.43.0": - version: 4.62.2 - resolution: "rollup@npm:4.62.2" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.62.2" - "@rollup/rollup-android-arm64": "npm:4.62.2" - "@rollup/rollup-darwin-arm64": "npm:4.62.2" - "@rollup/rollup-darwin-x64": "npm:4.62.2" - "@rollup/rollup-freebsd-arm64": "npm:4.62.2" - "@rollup/rollup-freebsd-x64": "npm:4.62.2" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.62.2" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.62.2" - "@rollup/rollup-linux-arm64-gnu": "npm:4.62.2" - "@rollup/rollup-linux-arm64-musl": "npm:4.62.2" - "@rollup/rollup-linux-loong64-gnu": "npm:4.62.2" - "@rollup/rollup-linux-loong64-musl": "npm:4.62.2" - "@rollup/rollup-linux-ppc64-gnu": "npm:4.62.2" - "@rollup/rollup-linux-ppc64-musl": "npm:4.62.2" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.62.2" - "@rollup/rollup-linux-riscv64-musl": "npm:4.62.2" - "@rollup/rollup-linux-s390x-gnu": "npm:4.62.2" - "@rollup/rollup-linux-x64-gnu": "npm:4.62.2" - "@rollup/rollup-linux-x64-musl": "npm:4.62.2" - "@rollup/rollup-openbsd-x64": "npm:4.62.2" - "@rollup/rollup-openharmony-arm64": "npm:4.62.2" - "@rollup/rollup-win32-arm64-msvc": "npm:4.62.2" - "@rollup/rollup-win32-ia32-msvc": "npm:4.62.2" - "@rollup/rollup-win32-x64-gnu": "npm:4.62.2" - "@rollup/rollup-win32-x64-msvc": "npm:4.62.2" - "@types/estree": "npm:1.0.9" - fsevents: "npm:~2.3.2" - dependenciesMeta: - "@rollup/rollup-android-arm-eabi": - optional: true - "@rollup/rollup-android-arm64": - optional: true - "@rollup/rollup-darwin-arm64": - optional: true - "@rollup/rollup-darwin-x64": - optional: true - "@rollup/rollup-freebsd-arm64": - optional: true - "@rollup/rollup-freebsd-x64": - optional: true - "@rollup/rollup-linux-arm-gnueabihf": - optional: true - "@rollup/rollup-linux-arm-musleabihf": - optional: true - "@rollup/rollup-linux-arm64-gnu": - optional: true - "@rollup/rollup-linux-arm64-musl": - optional: true - "@rollup/rollup-linux-loong64-gnu": - optional: true - "@rollup/rollup-linux-loong64-musl": - optional: true - "@rollup/rollup-linux-ppc64-gnu": - optional: true - "@rollup/rollup-linux-ppc64-musl": - optional: true - "@rollup/rollup-linux-riscv64-gnu": - optional: true - "@rollup/rollup-linux-riscv64-musl": - optional: true - "@rollup/rollup-linux-s390x-gnu": - optional: true - "@rollup/rollup-linux-x64-gnu": - optional: true - "@rollup/rollup-linux-x64-musl": - optional: true - "@rollup/rollup-openbsd-x64": - optional: true - "@rollup/rollup-openharmony-arm64": - optional: true - "@rollup/rollup-win32-arm64-msvc": - optional: true - "@rollup/rollup-win32-ia32-msvc": - optional: true - "@rollup/rollup-win32-x64-gnu": - optional: true - "@rollup/rollup-win32-x64-msvc": - optional: true - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: 10c0/83ff5f4a1fea3fa05db2ef56beceee8c33d4a72b818e19c562f1e85c41076fe5b12aadc44048bb73e60b83336df82154b017fa6bf0186f3141643e6f215fbdcb - languageName: node - linkType: hard - "run-applescript@npm:^7.0.0": version: 7.1.0 resolution: "run-applescript@npm:7.1.0" @@ -11147,7 +10842,7 @@ __metadata: languageName: node linkType: hard -"storybook@npm:^10.2.10": +"storybook@npm:^10.4.6": version: 10.4.6 resolution: "storybook@npm:10.4.6" dependencies: @@ -11429,6 +11124,13 @@ __metadata: languageName: node linkType: hard +"tagged-tag@npm:^1.0.0": + version: 1.0.0 + resolution: "tagged-tag@npm:1.0.0" + checksum: 10c0/91d25c9ffb86a91f20522cefb2cbec9b64caa1febe27ad0df52f08993ff60888022d771e868e6416cf2e72dab68449d2139e8709ba009b74c6c7ecd4000048d1 + languageName: node + linkType: hard + "tar-fs@npm:^2.0.0": version: 2.1.5 resolution: "tar-fs@npm:2.1.5" @@ -11757,10 +11459,12 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:~2.19": - version: 2.19.0 - resolution: "type-fest@npm:2.19.0" - checksum: 10c0/a5a7ecf2e654251613218c215c7493574594951c08e52ab9881c9df6a6da0aeca7528c213c622bc374b4e0cb5c443aa3ab758da4e3c959783ce884c3194e12cb +"type-fest@npm:^5.6.0": + version: 5.7.0 + resolution: "type-fest@npm:5.7.0" + dependencies: + tagged-tag: "npm:^1.0.0" + checksum: 10c0/f71ed17b753649421e419db8cc2e140f930333a1467b1d9cca2e0e4052900fd442f2360bae73f3a6bf9340d949ac46d9a1598c709b4c8089272e7624df9c8716 languageName: node linkType: hard @@ -12060,16 +11764,16 @@ __metadata: languageName: node linkType: hard -"vite-plugin-svgr@npm:^4.5.0": - version: 4.5.0 - resolution: "vite-plugin-svgr@npm:4.5.0" +"vite-plugin-svgr@npm:^5.2.0": + version: 5.2.0 + resolution: "vite-plugin-svgr@npm:5.2.0" dependencies: - "@rollup/pluginutils": "npm:^5.2.0" + "@rollup/pluginutils": "npm:^5.3.0" "@svgr/core": "npm:^8.1.0" "@svgr/plugin-jsx": "npm:^8.1.0" peerDependencies: - vite: ">=2.6.0" - checksum: 10c0/3e1959fec626bb4f5a8ec13ff15bc40ffbc1c0ff38149bebe3f37dc2d67ed1f276f129ff7983e06946cf712e19996affd9d6868aa7d20d8921d1fe4449109b55 + vite: ">=3.0.0" + checksum: 10c0/818ddea9a25839f9a5e3903f55e738b3de2f76c374148a637e61e31e6a3ada815a061d3e8010306a9f2701827d2f34d8fbc5db47bf1e74059050ad7a57c0f601 languageName: node linkType: hard @@ -12085,7 +11789,7 @@ __metadata: languageName: node linkType: hard -"vite@npm:^6.0.0 || ^7.0.0 || ^8.0.0": +"vite@npm:^6.0.0 || ^7.0.0 || ^8.0.0, vite@npm:^8.1.0": version: 8.1.0 resolution: "vite@npm:8.1.0" dependencies: @@ -12142,61 +11846,6 @@ __metadata: languageName: node linkType: hard -"vite@npm:^7.3.6": - version: 7.3.6 - resolution: "vite@npm:7.3.6" - dependencies: - esbuild: "npm:^0.27.0 || ^0.28.0" - fdir: "npm:^6.5.0" - fsevents: "npm:~2.3.3" - picomatch: "npm:^4.0.3" - postcss: "npm:^8.5.6" - rollup: "npm:^4.43.0" - tinyglobby: "npm:^0.2.15" - peerDependencies: - "@types/node": ^20.19.0 || >=22.12.0 - jiti: ">=1.21.0" - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: ">=0.54.8" - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - bin: - vite: bin/vite.js - checksum: 10c0/c6d359f84ad362f5c97ff7988b77c90add04162c60cdf6059375a7d9e3217848c53a8cb6b6c48517bef84b6bba4c9bc85319a889b5236acb7d5a2bc8cb7b9a8d - languageName: node - linkType: hard - "vitest@npm:^4.1.9": version: 4.1.9 resolution: "vitest@npm:4.1.9" @@ -12548,7 +12197,7 @@ __metadata: languageName: node linkType: hard -"vue-component-type-helpers@npm:latest": +"vue-component-type-helpers@npm:^3.2.9": version: 3.3.5 resolution: "vue-component-type-helpers@npm:3.3.5" checksum: 10c0/4093b9e8845f4f89bb524aef60364913f2ed30f4bdcdf93ce438d61b50d969e3ef33e7b5b8173c74ed568a73af96977d6ef3fabdc385a647d20baba5385838b3 From 54166e149d67b60aeb1c2da3fe377bfb8d5c9402 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Mon, 29 Jun 2026 13:50:13 +0400 Subject: [PATCH 40/54] build: TypeScript 6 toolchain was enabled --- .yarnrc.yml.dist | 6 +-- m3-foundation/lib/predicates.ts | 9 ++-- m3-foundation/package.json | 8 +-- m3-foundation/tsconfig.json | 1 + m3-react/package.json | 8 +-- m3-react/shims-styles.d.ts | 1 + m3-react/src/components/icon/M3Icon.tsx | 4 +- .../components/navigation/M3Navigation.tsx | 2 +- m3-react/src/components/popper/hooks.ts | 2 +- .../components/rich-tooltip/M3RichTooltip.tsx | 2 +- .../components/scroll-rail/M3ScrollRail.tsx | 4 +- m3-react/src/hooks/useElementEffect.ts | 4 +- m3-react/src/hooks/useId.ts | 4 +- m3-react/src/hooks/useRecord.ts | 2 +- m3-react/src/utils/content.ts | 11 ++-- m3-react/storybook/preview.ts | 39 +++++++------- m3-react/tests/M3Button.test.tsx | 52 +++++++++++-------- m3-vue/package.json | 10 ++-- m3-vue/shims-styles.d.ts | 1 + m3-vue/src/components/menu/M3MenuItem.vue | 4 +- .../components/navigation/M3NavigationTab.vue | 2 +- m3-vue/src/components/slider/M3Slider.vue | 8 +-- m3-vue/storybook/preview.ts | 15 +++--- m3-vue/tests/M3Button.test.ts | 50 ++++++++++-------- m3-vue/tests/M3Navigation.test.ts | 2 +- m3-vue/tests/M3Popper.e2e.ts | 10 +++- package.json | 6 ++- tsconfig.json | 3 +- 28 files changed, 154 insertions(+), 116 deletions(-) create mode 100644 m3-react/shims-styles.d.ts create mode 100644 m3-vue/shims-styles.d.ts diff --git a/.yarnrc.yml.dist b/.yarnrc.yml.dist index b66fc11..2ecc46b 100644 --- a/.yarnrc.yml.dist +++ b/.yarnrc.yml.dist @@ -13,19 +13,19 @@ packageExtensions: "@commitlint/load@*": dependencies: "@types/node": "^25.3.0" - typescript: "~5.9.3" + typescript: "~6.0.3" "@storybook/addon-docs@*": dependencies: "@types/react": "^18.3.28" "@storybook/react-vite@*": dependencies: - typescript: "~5.9.3" + typescript: "~6.0.3" "@storybook/vue3-vite@*": dependencies: vue: "^3.5.28" "eslint-plugin-storybook@*": dependencies: - typescript: "~5.9.3" + typescript: "~6.0.3" "storybook@*": dependencies: "@testing-library/dom": "^10.4.1" diff --git a/m3-foundation/lib/predicates.ts b/m3-foundation/lib/predicates.ts index bb5b433..9099d00 100644 --- a/m3-foundation/lib/predicates.ts +++ b/m3-foundation/lib/predicates.ts @@ -48,17 +48,20 @@ export type ExtractRequired> = ExtractType> = Partial>> type TypeOf> = ExtractRequired & ExtractOptional +type ShapeKey> = Extract +type ShapeConfig = [Predicate, boolean] | Predicate export const isShape = >(shape: S) => { - const properties = Object.keys(shape) + const properties = Object.keys(shape) as ShapeKey[] + const shapeConfig = shape as Record, ShapeConfig> return (value: unknown): value is TypeOf => typeof value === 'object' && value !== null && properties.every(p => { - const config = shape[p] + const config = shapeConfig[p] const [predicate, required] = isArray(config) ? config : [config, false] if (!(p in value)) { return !required } - return predicate(value[p]) + return predicate((value as Record, unknown>)[p]) }) } diff --git a/m3-foundation/package.json b/m3-foundation/package.json index e4cd641..469039e 100644 --- a/m3-foundation/package.json +++ b/m3-foundation/package.json @@ -25,8 +25,8 @@ "@eslint/js": "^9.39.4", "@types/lodash.isequal": "^4.5.8", "@types/node": "^25.3.0", - "@typescript-eslint/eslint-plugin": "^8.56.0", - "@typescript-eslint/parser": "^8.56.0", + "@typescript-eslint/eslint-plugin": "^8.62.0", + "@typescript-eslint/parser": "^8.62.0", "eslint": "^9.39.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-unused-imports": "^4.4.1", @@ -36,8 +36,8 @@ "standard-version": "^9.5.0", "ts-node": "^10.9.2", "tslib": "^2.8.1", - "typescript": "~5.9.3", - "typescript-eslint": "^8.56.0", + "typescript": "~6.0.3", + "typescript-eslint": "^8.62.0", "uuid": "^14.0.1", "vite": "^8.1.0" }, diff --git a/m3-foundation/tsconfig.json b/m3-foundation/tsconfig.json index 79c707d..592a8a8 100644 --- a/m3-foundation/tsconfig.json +++ b/m3-foundation/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "esModuleInterop": true, + "ignoreDeprecations": "6.0", "module": "esnext", "moduleResolution": "node", "resolveJsonModule": true, diff --git a/m3-react/package.json b/m3-react/package.json index 58062f5..8ff2708 100644 --- a/m3-react/package.json +++ b/m3-react/package.json @@ -63,8 +63,8 @@ "@types/react": "^18.3.28", "@types/react-dom": "^18.3.7", "@types/react-transition-group": "^4.4.12", - "@typescript-eslint/eslint-plugin": "^8.56.0", - "@typescript-eslint/parser": "^8.56.0", + "@typescript-eslint/eslint-plugin": "^8.62.0", + "@typescript-eslint/parser": "^8.62.0", "@vitejs/plugin-react": "^6.0.3", "@vitest/browser": "^4.1.9", "@vitest/browser-playwright": "^4.1.9", @@ -86,8 +86,8 @@ "storybook": "^10.4.6", "ts-node": "^10.9.2", "tslib": "^2.8.1", - "typescript": "~5.9.3", - "typescript-eslint": "^8.56.0", + "typescript": "~6.0.3", + "typescript-eslint": "^8.62.0", "uuid": "^14.0.1", "vite": "^8.1.0", "vite-plugin-svgr": "^5.2.0", diff --git a/m3-react/shims-styles.d.ts b/m3-react/shims-styles.d.ts new file mode 100644 index 0000000..99508d5 --- /dev/null +++ b/m3-react/shims-styles.d.ts @@ -0,0 +1 @@ +declare module '*.scss' diff --git a/m3-react/src/components/icon/M3Icon.tsx b/m3-react/src/components/icon/M3Icon.tsx index a8d8b72..86a8e8d 100644 --- a/m3-react/src/components/icon/M3Icon.tsx +++ b/m3-react/src/components/icon/M3Icon.tsx @@ -25,7 +25,7 @@ const M3Icon: FC = ({ className = '', ...attrs }) => { - const appearanceInherited: Appearance = useContext(M3IconAppearance) + const appearanceInherited = useContext(M3IconAppearance) const appearanceActual: Appearance = appearanceInherited ?? appearance return ( @@ -42,4 +42,4 @@ const M3Icon: FC = ({ ) } -export default M3Icon \ No newline at end of file +export default M3Icon diff --git a/m3-react/src/components/navigation/M3Navigation.tsx b/m3-react/src/components/navigation/M3Navigation.tsx index 813a3ea..1126550 100644 --- a/m3-react/src/components/navigation/M3Navigation.tsx +++ b/m3-react/src/components/navigation/M3Navigation.tsx @@ -134,7 +134,7 @@ const M3Navigation: FC = ({ >
handlers.onToggle(false)} /> diff --git a/m3-react/src/components/popper/hooks.ts b/m3-react/src/components/popper/hooks.ts index 801a034..c0b9c9c 100644 --- a/m3-react/src/components/popper/hooks.ts +++ b/m3-react/src/components/popper/hooks.ts @@ -38,7 +38,7 @@ export const useAutoAdjust = ( }, [adjust]) export const useDelay = (delay: M3PopperProps['delay']) => { - const normalized = useMemo(() => normalizeDelay(delay), [delay]) + const normalized = useMemo(() => normalizeDelay(delay ?? 0), [delay]) return [ useMemo(() => normalized.show, [normalized]), diff --git a/m3-react/src/components/rich-tooltip/M3RichTooltip.tsx b/m3-react/src/components/rich-tooltip/M3RichTooltip.tsx index 6284532..599234c 100644 --- a/m3-react/src/components/rich-tooltip/M3RichTooltip.tsx +++ b/m3-react/src/components/rich-tooltip/M3RichTooltip.tsx @@ -49,7 +49,7 @@ const M3RichTooltip: ForwardRefRenderFunction< }) useImperativeHandle(ref, () => ({ - adjust: () => popper.current?.adjust(), + adjust: () => popper.current?.adjust() ?? Promise.resolve(), contains: (el: Element | null) => popper.current?.contains(el) ?? false, show: (immediately = false) => popper.current?.show(immediately), hide: (immediately = false, reason: 'generic') => popper.current?.hide(immediately, reason), diff --git a/m3-react/src/components/scroll-rail/M3ScrollRail.tsx b/m3-react/src/components/scroll-rail/M3ScrollRail.tsx index 9b9b423..16e501f 100644 --- a/m3-react/src/components/scroll-rail/M3ScrollRail.tsx +++ b/m3-react/src/components/scroll-rail/M3ScrollRail.tsx @@ -33,8 +33,8 @@ const M3ScrollRail: ForwardRefRenderFunction< M3ScrollRailMethods, M3ScrollRailProps > = ({ - horizontal, - disabled, + horizontal = false, + disabled = false, className = '', ...attrs }, ref) => { diff --git a/m3-react/src/hooks/useElementEffect.ts b/m3-react/src/hooks/useElementEffect.ts index fbc87d1..c5f37c6 100644 --- a/m3-react/src/hooks/useElementEffect.ts +++ b/m3-react/src/hooks/useElementEffect.ts @@ -13,10 +13,10 @@ const compose = (el: T, effect: ElementEffect | ElementEff return () => _destructors.forEach(d => d()) } -export default (ref: MutableRefObject, effect: ElementEffect | ElementEffect[]) => { +export default (ref: MutableRefObject, effect: ElementEffect | ElementEffect[]) => { return useEffect(() => { return ref.current ? compose(ref.current, effect) : () => {} }, [effect]) -} \ No newline at end of file +} diff --git a/m3-react/src/hooks/useId.ts b/m3-react/src/hooks/useId.ts index bf41fdd..6a7e4c5 100644 --- a/m3-react/src/hooks/useId.ts +++ b/m3-react/src/hooks/useId.ts @@ -1,4 +1,4 @@ import makeId from '@/utils/id' -import useFallback from '@/hooks/useFallback' +import { useMemo } from 'react' -export default (id: T, prefix: string) => useFallback(id, () => makeId(prefix)) +export default (id: string | null | undefined, prefix: string): string => useMemo(() => id ?? makeId(prefix), [id, prefix]) diff --git a/m3-react/src/hooks/useRecord.ts b/m3-react/src/hooks/useRecord.ts index f8dd157..d505d89 100644 --- a/m3-react/src/hooks/useRecord.ts +++ b/m3-react/src/hooks/useRecord.ts @@ -34,7 +34,7 @@ export default < if (ref.current[property as K] !== value) { ref.current[property as K] = value if (property in dispatchers) { - dispatchers[property](value) + dispatchers[property as K](value) } } return true diff --git a/m3-react/src/utils/content.ts b/m3-react/src/utils/content.ts index e00f262..3f69c9d 100644 --- a/m3-react/src/utils/content.ts +++ b/m3-react/src/utils/content.ts @@ -20,9 +20,10 @@ const CONFIG_KEYS = [ ] const SLOT_ID = Symbol.for('@modulify/m3-react.slot') -type SlotComponent = string | JSXElementConstructor type DuplicateSlotPolicy = 'error' | 'ignore' | 'warn' -type SlottedComponent = JSXElementConstructor & { +type AnyComponent = Exclude +type SlotComponent = string | AnyComponent +type SlottedComponent = AnyComponent & { [SLOT_ID]?: string; } @@ -76,10 +77,10 @@ export const normalize = (children: ReactNode): [ReactNode, boolean][] => { export const augment = < Props = Record, - Type extends string | JSXElementConstructor = string | JSXElementConstructor, ->(el: ReactElement, props: Props) => cloneElement(el, { ...props }) + Type extends string | AnyComponent = string | AnyComponent, +>(el: ReactElement, props: Props) => cloneElement(el, { ...props } as Partial) -export const defineSlot = >( +export const defineSlot = ( id: string, component: Component ): Component => { diff --git a/m3-react/storybook/preview.ts b/m3-react/storybook/preview.ts index 45bb8a0..0135ed7 100644 --- a/m3-react/storybook/preview.ts +++ b/m3-react/storybook/preview.ts @@ -120,24 +120,25 @@ export default { }, }, options: { - storySort: (left, right) => { - const withFallback = (story, key) => typeof story[key] === 'string' ? story[key] : '' - const normalize = (entry) => entry && typeof entry === 'object' ? entry : {} - const docsRank = (story) => { - const id = withFallback(story, 'id') - const name = withFallback(story, 'name').toLowerCase() - return story.type === 'docs' || name === 'docs' || id.endsWith('--docs') || id.endsWith('-docs') - ? 0 - : 1 - } - - const a = normalize(left) - const b = normalize(right) - - return withFallback(a, 'title').localeCompare(withFallback(b, 'title'), undefined, { numeric: true }) || - docsRank(a) - docsRank(b) || - withFallback(a, 'name').localeCompare(withFallback(b, 'name'), undefined, { numeric: true }) || - withFallback(a, 'id').localeCompare(withFallback(b, 'id'), undefined, { numeric: true }) + storySort: ( + left = { id: '', name: '', title: '', type: '' }, + right = { id: '', name: '', title: '', type: '' } + ) => { + const a = left || { id: '', name: '', title: '', type: '' } + const b = right || { id: '', name: '', title: '', type: '' } + const aTitle = typeof a.title === 'string' ? a.title : '' + const bTitle = typeof b.title === 'string' ? b.title : '' + const aId = typeof a.id === 'string' ? a.id : '' + const bId = typeof b.id === 'string' ? b.id : '' + const aName = typeof a.name === 'string' ? a.name : '' + const bName = typeof b.name === 'string' ? b.name : '' + const aDocsRank = a.type === 'docs' || aName.toLowerCase() === 'docs' || aId.endsWith('--docs') || aId.endsWith('-docs') ? 0 : 1 + const bDocsRank = b.type === 'docs' || bName.toLowerCase() === 'docs' || bId.endsWith('--docs') || bId.endsWith('-docs') ? 0 : 1 + + return aTitle.localeCompare(bTitle, undefined, { numeric: true }) || + aDocsRank - bDocsRank || + aName.localeCompare(bName, undefined, { numeric: true }) || + aId.localeCompare(bId, undefined, { numeric: true }) }, }, }, @@ -147,4 +148,4 @@ export default { defaultTheme: 'light', }), ], -} as Preview +} satisfies Preview diff --git a/m3-react/tests/M3Button.test.tsx b/m3-react/tests/M3Button.test.tsx index a603bfa..d095699 100644 --- a/m3-react/tests/M3Button.test.tsx +++ b/m3-react/tests/M3Button.test.tsx @@ -13,13 +13,26 @@ import { import { M3Button } from '@/components/button' import { M3Icon } from '@/components/icon' +const getElement = (container: HTMLElement, selector: string): Element => { + const element = container.querySelector(selector) + + expect(element).not.toBeNull() + + return element as Element +} + +const getChildNode = (node: ChildNode | null): ChildNode => { + expect(node).not.toBeNull() + + return node as ChildNode +} + describe('m3-react/button', () => { test('text node is wrapped', () => { const { container } = render(Some text) - const text = container.querySelector('.m3-button__text') + const text = getElement(container, '.m3-button__text') - expect(text).not.toBeNull() expect(text.innerHTML).toEqual('Some text') }) @@ -30,9 +43,8 @@ describe('m3-react/button', () => { ) - const icon = container.querySelector('.m3-button__icon > .m3-icon') + const icon = getElement(container, '.m3-button__icon > .m3-icon') - expect(icon).not.toBeNull() expect(icon.innerHTML).toEqual('edit') }) @@ -43,14 +55,12 @@ describe('m3-react/button', () => { ) - const icon = container.querySelector('.m3-button__icon > .m3-icon') + const icon = getElement(container, '.m3-button__icon > .m3-icon') - expect(icon).not.toBeNull() expect(icon.innerHTML).toEqual('edit') - const text = container.querySelector('.m3-button__text') + const text = getElement(container, '.m3-button__text') - expect(text).not.toBeNull() expect(text.innerHTML.trim()).toEqual('Some text') }) @@ -66,9 +76,8 @@ describe('m3-react/button', () => { ) - const text = container.querySelector(`.m3-button__text ${tag}`) + const text = getElement(container, `.m3-button__text ${tag}`) - expect(text).not.toBeNull() expect(text.innerHTML.trim()).toEqual('Some text') }) @@ -98,16 +107,15 @@ describe('m3-react/button', () => { const { container } = render() - const icon = container.querySelector('.m3-button__icon > .m3-icon') + const icon = getElement(container, '.m3-button__icon > .m3-icon') - expect(icon).not.toBeNull() expect(icon.innerHTML).toEqual('edit') - act(() => ref.current.setIconActive(false)) + expect(ref.current).not.toBeNull() + act(() => ref.current!.setIconActive(false)) - const text = container.querySelector('.m3-button__text') + const text = getElement(container, '.m3-button__text') - expect(text).not.toBeNull() expect(text.innerHTML).toEqual('Some text') }) @@ -137,22 +145,22 @@ describe('m3-react/button', () => { const { container } = render() - const contentBefore = container.querySelector('.m3-button__content') + const contentBefore = getElement(container, '.m3-button__content') expect(contentBefore.childElementCount).toEqual(2) - const icon = container.querySelector('.m3-icon') + const icon = getElement(container, '.m3-icon') - expect(icon).not.toBeNull() expect(icon.innerHTML).toEqual('edit') - expect(contentBefore.lastChild.textContent).toEqual('Some text') + expect(getChildNode(contentBefore.lastChild).textContent).toEqual('Some text') - act(() => ref.current.setIconActive(false)) + expect(ref.current).not.toBeNull() + act(() => ref.current!.setIconActive(false)) - const contentAfter = container.querySelector('.m3-button__content') + const contentAfter = getElement(container, '.m3-button__content') expect(contentAfter.childElementCount).toEqual(1) - expect(contentAfter.firstChild.textContent).toEqual('Some text') + expect(getChildNode(contentAfter.firstChild).textContent).toEqual('Some text') }) }) diff --git a/m3-vue/package.json b/m3-vue/package.json index 5c8b991..6e5a884 100644 --- a/m3-vue/package.json +++ b/m3-vue/package.json @@ -57,13 +57,13 @@ "@testing-library/vue": "^8.1.0", "@types/lodash.isequal": "^4.5.8", "@types/node": "^25.3.0", - "@typescript-eslint/eslint-plugin": "^8.56.0", - "@typescript-eslint/parser": "^8.56.0", + "@typescript-eslint/eslint-plugin": "^8.62.0", + "@typescript-eslint/parser": "^8.62.0", "@vitejs/plugin-vue": "^6.0.4", "@vitest/browser": "^4.1.9", "@vitest/browser-playwright": "^4.1.9", "@vue/compiler-sfc": "^3.5.39", - "@vue/language-server": "^3.2.5", + "@vue/language-server": "^3.3.5", "eslint": "^9.39.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-unused-imports": "^4.4.1", @@ -79,8 +79,8 @@ "storybook": "^10.4.6", "ts-node": "^10.9.2", "tslib": "^2.8.1", - "typescript": "~5.9.3", - "typescript-eslint": "^8.56.0", + "typescript": "~6.0.3", + "typescript-eslint": "^8.62.0", "uuid": "^14.0.1", "vite": "^8.1.0", "vite-svg-loader": "^5.1.0", diff --git a/m3-vue/shims-styles.d.ts b/m3-vue/shims-styles.d.ts new file mode 100644 index 0000000..99508d5 --- /dev/null +++ b/m3-vue/shims-styles.d.ts @@ -0,0 +1 @@ +declare module '*.scss' diff --git a/m3-vue/src/components/menu/M3MenuItem.vue b/m3-vue/src/components/menu/M3MenuItem.vue index d2e19cd..7fc4dbf 100644 --- a/m3-vue/src/components/menu/M3MenuItem.vue +++ b/m3-vue/src/components/menu/M3MenuItem.vue @@ -8,7 +8,7 @@ 'm3-menu-item_selected': selected, 'm3-menu-item_disabled': disabled, }" - @keyup.enter="event => ripple?.activate(event)" + @keyup.enter="onKeyUp" > @@ -79,4 +79,6 @@ defineProps({ const root = ref(null) const rootElement = computed(() => root.value?.el() ?? null) const ripple = ref | null>(null) + +const onKeyUp = (event: KeyboardEvent) => ripple.value?.activate(event) diff --git a/m3-vue/src/components/navigation/M3NavigationTab.vue b/m3-vue/src/components/navigation/M3NavigationTab.vue index 76c3b93..41bc63c 100644 --- a/m3-vue/src/components/navigation/M3NavigationTab.vue +++ b/m3-vue/src/components/navigation/M3NavigationTab.vue @@ -142,7 +142,7 @@ const _id = useId('m3-navigation-item', computed(() => props.id)) const appearance = inject>(M3NavigationAppearance, ref('auto')) const breakpoint = useBreakpoint() const button = ref(null) -const buttonElement = computed(() => button.value?.el()) +const buttonElement = computed(() => button.value?.el() ?? null) const inDrawer = computed(() => breakpoint.value.ge('large') || appearance.value === 'drawer') diff --git a/m3-vue/src/components/slider/M3Slider.vue b/m3-vue/src/components/slider/M3Slider.vue index a4526c3..35a585d 100644 --- a/m3-vue/src/components/slider/M3Slider.vue +++ b/m3-vue/src/components/slider/M3Slider.vue @@ -199,7 +199,7 @@ const ariaOptionsToAttrs = (options: AriaOptions): { } } -const restrict = (value: number, [min, max]) => Math.max(Math.min(max, value), min) +const restrict = (value: number, [min, max]: [number, number]) => Math.max(Math.min(max, value), min) const current = computed(() => { if (Array.isArray(props.value)) { @@ -240,8 +240,8 @@ const keys = { space: false, } -const addNotch = (el: HTMLElement) => { - if (!notches.value.includes(el)) { +const addNotch = (el: unknown) => { + if (el instanceof HTMLElement && !notches.value.includes(el)) { notches.value.push(el) } } @@ -334,7 +334,7 @@ const getEventShare = (event: MouseEvent | TouchEvent) => { } const getEventValue = (event: MouseEvent | TouchEvent) => { - return nearest(props.min + (props.max - props.min) * getEventShare(event)) + return nearest(props.min + (props.max - props.min) * (getEventShare(event) ?? 0)) } const stepFor = (leap: boolean) => { diff --git a/m3-vue/storybook/preview.ts b/m3-vue/storybook/preview.ts index b749950..087a947 100644 --- a/m3-vue/storybook/preview.ts +++ b/m3-vue/storybook/preview.ts @@ -120,14 +120,17 @@ export default { }, }, options: { - storySort: (a, b) => { - return a.id.endsWith('docs') && !b.id.endsWith('docs') + storySort: (a = { id: '' }, b = { id: '' }) => { + const aId = a?.id ?? '' + const bId = b?.id ?? '' + + return aId.endsWith('docs') && !bId.endsWith('docs') ? -1 - : !a.id.endsWith('docs') && b.id.endsWith('docs') + : !aId.endsWith('docs') && bId.endsWith('docs') ? 1 - : a.id === b.id + : aId === bId ? 0 - : a.id.localeCompare(b.id, undefined, { numeric: true }) + : aId.localeCompare(bId, undefined, { numeric: true }) }, }, }, @@ -138,4 +141,4 @@ export default { }), ], tags: ['autodocs'], -} as Preview +} satisfies Preview diff --git a/m3-vue/tests/M3Button.test.ts b/m3-vue/tests/M3Button.test.ts index 4c43d5f..63cf415 100644 --- a/m3-vue/tests/M3Button.test.ts +++ b/m3-vue/tests/M3Button.test.ts @@ -9,6 +9,20 @@ import { import { M3Button } from '@/components/button' import { M3Icon } from '@/components/icon' +const getElement = (container: ParentNode, selector: string): Element => { + const element = container.querySelector(selector) + + expect(element).not.toBeNull() + + return element as Element +} + +const getChildNode = (node: ChildNode | null): ChildNode => { + expect(node).not.toBeNull() + + return node as ChildNode +} + describe('m3-vue/button', () => { test('text node is wrapped', () => { const { container } = render(M3Button, { @@ -17,9 +31,8 @@ describe('m3-vue/button', () => { }, }) - const text = container.querySelector('.m3-button__text') + const text = getElement(container, '.m3-button__text') - expect(text).not.toBeNull() expect(text.innerHTML).toEqual('Some text') }) @@ -30,9 +43,8 @@ describe('m3-vue/button', () => { }, }) - const icon = container.querySelector('.m3-button__icon > .m3-icon') + const icon = getElement(container, '.m3-button__icon > .m3-icon') - expect(icon).not.toBeNull() expect(icon.innerHTML).toEqual('edit') }) @@ -46,14 +58,12 @@ describe('m3-vue/button', () => { }, }) - const icon = container.querySelector('.m3-button__icon > .m3-icon') + const icon = getElement(container, '.m3-button__icon > .m3-icon') - expect(icon).not.toBeNull() expect(icon.innerHTML).toEqual('edit') - const text = container.querySelector('.m3-button__text') + const text = getElement(container, '.m3-button__text') - expect(text).not.toBeNull() expect(text.innerHTML.trim()).toEqual('Some text') }) @@ -69,9 +79,8 @@ describe('m3-vue/button', () => { }, }) - const text = container.querySelector(`.m3-button__text ${tag}`) + const text = getElement(container, `.m3-button__text ${tag}`) - expect(text).not.toBeNull() expect(text.innerHTML.trim()).toEqual('Some text') }) @@ -87,18 +96,16 @@ describe('m3-vue/button', () => { }, }) - const icon = container.querySelector('.m3-button__icon > .m3-icon') + const icon = getElement(container, '.m3-button__icon > .m3-icon') - expect(icon).not.toBeNull() expect(icon.innerHTML).toEqual('edit') isIcon.value = false await nextTick() - const text = container.querySelector('.m3-button__text') + const text = getElement(container, '.m3-button__text') - expect(text).not.toBeNull() expect(text.innerHTML).toEqual('Some text') }) @@ -114,24 +121,23 @@ describe('m3-vue/button', () => { }, }) - const contentBefore = container.querySelector('.m3-button__content') + const contentBefore = getElement(container, '.m3-button__content') expect(contentBefore.childElementCount).toEqual(2) - const icon = container.querySelector('.m3-icon') + const icon = getElement(container, '.m3-icon') - expect(icon).not.toBeNull() expect(icon.innerHTML).toEqual('edit') - expect(contentBefore.lastChild.textContent).toEqual('Some text') + expect(getChildNode(contentBefore.lastChild).textContent).toEqual('Some text') iconExist.value = false await nextTick() - const contentAfter = container.querySelector('.m3-button__content') + const contentAfter = getElement(container, '.m3-button__content') expect(contentAfter.childElementCount).toEqual(1) - expect(contentAfter.firstChild.textContent).toEqual('Some text') + expect(getChildNode(contentAfter.firstChild).textContent).toEqual('Some text') }) test('button is link when passed prop href', () => { @@ -140,9 +146,9 @@ describe('m3-vue/button', () => { props: { href }, }) - const a = container.querySelector('.m3-button') + const a = getElement(container, '.m3-button') expect(a.tagName).toBe('A') expect(a.getAttribute('href')).toBe(href) }) -}) \ No newline at end of file +}) diff --git a/m3-vue/tests/M3Navigation.test.ts b/m3-vue/tests/M3Navigation.test.ts index 469db47..396bf8d 100644 --- a/m3-vue/tests/M3Navigation.test.ts +++ b/m3-vue/tests/M3Navigation.test.ts @@ -60,7 +60,7 @@ describe('m3-vue/navigation', () => { window.dispatchEvent(new Event('resize')) await nextTick() - expect(view.emitted()['update:expanded']?.some(([value]) => value === false)).toBe(true) + expect(view.emitted()['update:expanded']?.some(event => Array.isArray(event) && event[0] === false)).toBe(true) Object.defineProperty(window, 'innerWidth', { configurable: true, diff --git a/m3-vue/tests/M3Popper.e2e.ts b/m3-vue/tests/M3Popper.e2e.ts index dc82726..76f8e0a 100644 --- a/m3-vue/tests/M3Popper.e2e.ts +++ b/m3-vue/tests/M3Popper.e2e.ts @@ -119,9 +119,15 @@ const waitForPopper = async () => { expect(popper).not.toBeNull() }) + const getElement = (element: HTMLElement | null): HTMLElement => { + expect(element).not.toBeNull() + + return element as HTMLElement + } + return { - positioner: positioner as HTMLElement, - popper: popper as HTMLElement, + positioner: getElement(positioner), + popper: getElement(popper), } } diff --git a/package.json b/package.json index b7c4aee..8ed02fd 100644 --- a/package.json +++ b/package.json @@ -38,9 +38,13 @@ "jsdom": "^29.1.1", "nyc": "^18.0.0", "playwright": "^1.61.1", - "typescript": "~5.9.3", + "typescript": "~6.0.3", "vitest": "^4.1.9" }, + "resolutions": { + "@typescript-eslint/utils@npm:^8.48.0": "npm:8.62.0", + "typescript@npm:^5.9.3": "npm:6.0.3" + }, "contributors": [ "Tatyana Komolyh " ], diff --git a/tsconfig.json b/tsconfig.json index fc7bf56..4c884fd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,9 +1,10 @@ { "compilerOptions": { "esModuleInterop": true, + "ignoreDeprecations": "6.0", "module": "esnext", "moduleResolution": "node", "resolveJsonModule": true, "target": "ES2017" } -} \ No newline at end of file +} From 7fd935d38ed01417343b992873c6b1419d718e9c Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Mon, 29 Jun 2026 13:51:46 +0400 Subject: [PATCH 41/54] chore: Updated yarn.lock --- yarn.lock | 349 ++++++++++++++++-------------------------------------- 1 file changed, 105 insertions(+), 244 deletions(-) diff --git a/yarn.lock b/yarn.lock index 227964b..4cda3b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1779,8 +1779,8 @@ __metadata: "@modulify/validator": "npm:^0.1.0" "@types/lodash.isequal": "npm:^4.5.8" "@types/node": "npm:^25.3.0" - "@typescript-eslint/eslint-plugin": "npm:^8.56.0" - "@typescript-eslint/parser": "npm:^8.56.0" + "@typescript-eslint/eslint-plugin": "npm:^8.62.0" + "@typescript-eslint/parser": "npm:^8.62.0" eslint: "npm:^9.39.4" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-unused-imports: "npm:^4.4.1" @@ -1791,8 +1791,8 @@ __metadata: standard-version: "npm:^9.5.0" ts-node: "npm:^10.9.2" tslib: "npm:^2.8.1" - typescript: "npm:~5.9.3" - typescript-eslint: "npm:^8.56.0" + typescript: "npm:~6.0.3" + typescript-eslint: "npm:^8.62.0" uuid: "npm:^14.0.1" vite: "npm:^8.1.0" languageName: unknown @@ -1823,8 +1823,8 @@ __metadata: "@types/react": "npm:^18.3.28" "@types/react-dom": "npm:^18.3.7" "@types/react-transition-group": "npm:^4.4.12" - "@typescript-eslint/eslint-plugin": "npm:^8.56.0" - "@typescript-eslint/parser": "npm:^8.56.0" + "@typescript-eslint/eslint-plugin": "npm:^8.62.0" + "@typescript-eslint/parser": "npm:^8.62.0" "@vitejs/plugin-react": "npm:^6.0.3" "@vitest/browser": "npm:^4.1.9" "@vitest/browser-playwright": "npm:^4.1.9" @@ -1847,8 +1847,8 @@ __metadata: storybook: "npm:^10.4.6" ts-node: "npm:^10.9.2" tslib: "npm:^2.8.1" - typescript: "npm:~5.9.3" - typescript-eslint: "npm:^8.56.0" + typescript: "npm:~6.0.3" + typescript-eslint: "npm:^8.62.0" uuid: "npm:^14.0.1" vite: "npm:^8.1.0" vite-plugin-svgr: "npm:^5.2.0" @@ -1883,13 +1883,13 @@ __metadata: "@testing-library/vue": "npm:^8.1.0" "@types/lodash.isequal": "npm:^4.5.8" "@types/node": "npm:^25.3.0" - "@typescript-eslint/eslint-plugin": "npm:^8.56.0" - "@typescript-eslint/parser": "npm:^8.56.0" + "@typescript-eslint/eslint-plugin": "npm:^8.62.0" + "@typescript-eslint/parser": "npm:^8.62.0" "@vitejs/plugin-vue": "npm:^6.0.4" "@vitest/browser": "npm:^4.1.9" "@vitest/browser-playwright": "npm:^4.1.9" "@vue/compiler-sfc": "npm:^3.5.39" - "@vue/language-server": "npm:^3.2.5" + "@vue/language-server": "npm:^3.3.5" eslint: "npm:^9.39.4" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-unused-imports: "npm:^4.4.1" @@ -1906,8 +1906,8 @@ __metadata: storybook: "npm:^10.4.6" ts-node: "npm:^10.9.2" tslib: "npm:^2.8.1" - typescript: "npm:~5.9.3" - typescript-eslint: "npm:^8.56.0" + typescript: "npm:~6.0.3" + typescript-eslint: "npm:^8.62.0" uuid: "npm:^14.0.1" vite: "npm:^8.1.0" vite-svg-loader: "npm:^5.1.0" @@ -1935,7 +1935,7 @@ __metadata: jsdom: "npm:^29.1.1" nyc: "npm:^18.0.0" playwright: "npm:^1.61.1" - typescript: "npm:~5.9.3" + typescript: "npm:~6.0.3" vitest: "npm:^4.1.9" languageName: unknown linkType: soft @@ -3297,7 +3297,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.62.0": +"@typescript-eslint/eslint-plugin@npm:8.62.0, @typescript-eslint/eslint-plugin@npm:^8.62.0": version: 8.62.0 resolution: "@typescript-eslint/eslint-plugin@npm:8.62.0" dependencies: @@ -3317,27 +3317,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^8.56.0": - version: 8.56.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.56.0" - dependencies: - "@eslint-community/regexpp": "npm:^4.12.2" - "@typescript-eslint/scope-manager": "npm:8.56.0" - "@typescript-eslint/type-utils": "npm:8.56.0" - "@typescript-eslint/utils": "npm:8.56.0" - "@typescript-eslint/visitor-keys": "npm:8.56.0" - ignore: "npm:^7.0.5" - natural-compare: "npm:^1.4.0" - ts-api-utils: "npm:^2.4.0" - peerDependencies: - "@typescript-eslint/parser": ^8.56.0 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/26e56d14562b3d2d34b366859ec56668fdac909d6ea534451cdb4267846ff50dcccd0026a4eba71ca41f7c8bdef30ef1356620c1ff2363ad64bd8fad33a72b19 - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:8.62.0": +"@typescript-eslint/parser@npm:8.62.0, @typescript-eslint/parser@npm:^8.62.0": version: 8.62.0 resolution: "@typescript-eslint/parser@npm:8.62.0" dependencies: @@ -3353,35 +3333,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:^8.56.0": - version: 8.56.0 - resolution: "@typescript-eslint/parser@npm:8.56.0" - dependencies: - "@typescript-eslint/scope-manager": "npm:8.56.0" - "@typescript-eslint/types": "npm:8.56.0" - "@typescript-eslint/typescript-estree": "npm:8.56.0" - "@typescript-eslint/visitor-keys": "npm:8.56.0" - debug: "npm:^4.4.3" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/f3a29c6fdc4e0d1a1e7ddb9909ab839c2f67591933e432c10f44aabb69ae2229f8d2072a220f63b70618cc35c67ff53de0ed110be86b33f4f354c19993f764cb - languageName: node - linkType: hard - -"@typescript-eslint/project-service@npm:8.56.0": - version: 8.56.0 - resolution: "@typescript-eslint/project-service@npm:8.56.0" - dependencies: - "@typescript-eslint/tsconfig-utils": "npm:^8.56.0" - "@typescript-eslint/types": "npm:^8.56.0" - debug: "npm:^4.4.3" - peerDependencies: - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/8302dc30ad8c0342137998ea872782cdd673f9e7ec4b244eeb0976915b86d6c44ef55485e2cdac2987dbf309d3663aaf293c85e88326093fc7656b51432369f6 - languageName: node - linkType: hard - "@typescript-eslint/project-service@npm:8.62.0": version: 8.62.0 resolution: "@typescript-eslint/project-service@npm:8.62.0" @@ -3395,16 +3346,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.56.0": - version: 8.56.0 - resolution: "@typescript-eslint/scope-manager@npm:8.56.0" - dependencies: - "@typescript-eslint/types": "npm:8.56.0" - "@typescript-eslint/visitor-keys": "npm:8.56.0" - checksum: 10c0/898b705295e0a4081702a52f98e0d1e50f8047900becd087b232bc71f8af2b87ed70a065bed0076a26abec8f4e5c6bb4a3a0de33b7ea0e3704ecdc7487043b57 - languageName: node - linkType: hard - "@typescript-eslint/scope-manager@npm:8.62.0": version: 8.62.0 resolution: "@typescript-eslint/scope-manager@npm:8.62.0" @@ -3415,15 +3356,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/tsconfig-utils@npm:8.56.0, @typescript-eslint/tsconfig-utils@npm:^8.56.0": - version: 8.56.0 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.56.0" - peerDependencies: - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/20f48af8b497d8a730dcac3724314b4f49ecc436f8871f3e17f5193d83e7d290c8838a126971767cd011208969bc4ff0f4bddc40eac167348c88d29fdb379c8b - languageName: node - linkType: hard - "@typescript-eslint/tsconfig-utils@npm:8.62.0, @typescript-eslint/tsconfig-utils@npm:^8.62.0": version: 8.62.0 resolution: "@typescript-eslint/tsconfig-utils@npm:8.62.0" @@ -3433,22 +3365,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.56.0": - version: 8.56.0 - resolution: "@typescript-eslint/type-utils@npm:8.56.0" - dependencies: - "@typescript-eslint/types": "npm:8.56.0" - "@typescript-eslint/typescript-estree": "npm:8.56.0" - "@typescript-eslint/utils": "npm:8.56.0" - debug: "npm:^4.4.3" - ts-api-utils: "npm:^2.4.0" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/4da61c36fa46f9d21a519a06b4ea6c91e9fa8a8e420fede41fb5d0f29866faa11641562b6e01c221ca6ec86bc0c3ecd7b8f11fc85b92277c3fd450ffc8fa2522 - languageName: node - linkType: hard - "@typescript-eslint/type-utils@npm:8.62.0": version: 8.62.0 resolution: "@typescript-eslint/type-utils@npm:8.62.0" @@ -3465,13 +3381,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.56.0, @typescript-eslint/types@npm:^8.56.0": - version: 8.56.0 - resolution: "@typescript-eslint/types@npm:8.56.0" - checksum: 10c0/5deb4ebf5fa62f9f927f6aa45f7245aa03567e88941cd76e7b083175fd59fc40368a804ba7ff7581eac75706e42ddd5c77d2a60d6b1e76ab7865d559c9af9937 - languageName: node - linkType: hard - "@typescript-eslint/types@npm:8.62.0, @typescript-eslint/types@npm:^8.62.0": version: 8.62.0 resolution: "@typescript-eslint/types@npm:8.62.0" @@ -3479,25 +3388,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.56.0": - version: 8.56.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.56.0" - dependencies: - "@typescript-eslint/project-service": "npm:8.56.0" - "@typescript-eslint/tsconfig-utils": "npm:8.56.0" - "@typescript-eslint/types": "npm:8.56.0" - "@typescript-eslint/visitor-keys": "npm:8.56.0" - debug: "npm:^4.4.3" - minimatch: "npm:^9.0.5" - semver: "npm:^7.7.3" - tinyglobby: "npm:^0.2.15" - ts-api-utils: "npm:^2.4.0" - peerDependencies: - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/cc2ba5bbfabb71c1510aea8fb8bf0d8385cabb9ca5b65a621e73f3088a91089a02aea56a9d9a31bd707593b5ba4d33d0aa2fcbdeee3cc7f4eca8226107523c28 - languageName: node - linkType: hard - "@typescript-eslint/typescript-estree@npm:8.62.0": version: 8.62.0 resolution: "@typescript-eslint/typescript-estree@npm:8.62.0" @@ -3517,21 +3407,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.56.0, @typescript-eslint/utils@npm:^8.48.0": - version: 8.56.0 - resolution: "@typescript-eslint/utils@npm:8.56.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.9.1" - "@typescript-eslint/scope-manager": "npm:8.56.0" - "@typescript-eslint/types": "npm:8.56.0" - "@typescript-eslint/typescript-estree": "npm:8.56.0" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/49545d399345bb4d8113d1001ec60c05c7e0d28fd44cb3c75128e58a53c9bf7ae8d0680ca089a4f37ab9eea8a3ef39011fc731eb4ad8dd4ab642849d84318645 - languageName: node - linkType: hard - "@typescript-eslint/utils@npm:8.62.0": version: 8.62.0 resolution: "@typescript-eslint/utils@npm:8.62.0" @@ -3547,16 +3422,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.56.0": - version: 8.56.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.56.0" - dependencies: - "@typescript-eslint/types": "npm:8.56.0" - eslint-visitor-keys: "npm:^5.0.0" - checksum: 10c0/4cb7668430042da70707ac5cad826348e808af94095aca1f3d07d39d566745a33991d3defccd1e687f1b1f8aeea52eeb47591933e962452eb51c4bcd88773c12 - languageName: node - linkType: hard - "@typescript-eslint/visitor-keys@npm:8.62.0": version: 8.62.0 resolution: "@typescript-eslint/visitor-keys@npm:8.62.0" @@ -4174,21 +4039,6 @@ __metadata: languageName: node linkType: hard -"@vue/language-core@npm:3.2.5": - version: 3.2.5 - resolution: "@vue/language-core@npm:3.2.5" - dependencies: - "@volar/language-core": "npm:2.4.28" - "@vue/compiler-dom": "npm:^3.5.0" - "@vue/shared": "npm:^3.5.0" - alien-signals: "npm:^3.0.0" - muggle-string: "npm:^0.4.1" - path-browserify: "npm:^1.0.1" - picomatch: "npm:^4.0.2" - checksum: 10c0/aa94d56f1b39aead7b4289de9138d8754dfd1a1b1412b760fcc5dbdbb6c8c7ab6581395ef2bd963a85d5cb6da019f47be2a19510c472011de3de23af6a264cf8 - languageName: node - linkType: hard - "@vue/language-core@npm:3.3.5": version: 3.3.5 resolution: "@vue/language-core@npm:3.3.5" @@ -4204,41 +4054,54 @@ __metadata: languageName: node linkType: hard -"@vue/language-server@npm:^3.2.5": - version: 3.2.5 - resolution: "@vue/language-server@npm:3.2.5" +"@vue/language-plugin-pug@npm:~3.2.2": + version: 3.2.9 + resolution: "@vue/language-plugin-pug@npm:3.2.9" + dependencies: + "@volar/source-map": "npm:2.4.28" + muggle-string: "npm:^0.4.1" + pug-lexer: "npm:^5.0.1" + pug-parser: "npm:^6.0.0" + vscode-languageserver-textdocument: "npm:^1.0.12" + checksum: 10c0/7c8df39003d1c6e982fe01edc916dd52e6535ce32ec166625bd754e64753d7f05c3fb0231781799583c5937f446ae4d3a7c9e3c199c545acb807bb76737efe58 + languageName: node + linkType: hard + +"@vue/language-server@npm:^3.3.5": + version: 3.3.5 + resolution: "@vue/language-server@npm:3.3.5" dependencies: "@volar/language-server": "npm:2.4.28" - "@vue/language-core": "npm:3.2.5" - "@vue/language-service": "npm:3.2.5" - "@vue/typescript-plugin": "npm:3.2.5" - vscode-uri: "npm:^3.0.8" + "@vue/language-core": "npm:3.3.5" + "@vue/language-service": "npm:3.3.5" + "@vue/typescript-plugin": "npm:3.3.5" + vscode-uri: "npm:^3.1.0" peerDependencies: typescript: "*" bin: vue-language-server: bin/vue-language-server.js - checksum: 10c0/6da98b954521b424e6d010f161f8d633bd9a75a308f5bb9f53d560784e9358f7eb1fe3564c3bf9e6172c64b25b76974ab8dd282cbc730d7c0cd9f8d8a7179958 + checksum: 10c0/d7fd8e9bf0f83390e77e5a90cf0f63f2e2c6e9c32e966342d83583040b3293ad1989b169b52d75c8d51668c2c7677a121cb70c38408e1d0625357994334d7e4d languageName: node linkType: hard -"@vue/language-service@npm:3.2.5": - version: 3.2.5 - resolution: "@vue/language-service@npm:3.2.5" +"@vue/language-service@npm:3.3.5": + version: 3.3.5 + resolution: "@vue/language-service@npm:3.3.5" dependencies: "@volar/language-service": "npm:2.4.28" - "@vue/language-core": "npm:3.2.5" + "@vue/language-core": "npm:3.3.5" "@vue/shared": "npm:^3.5.0" path-browserify: "npm:^1.0.1" - volar-service-css: "npm:0.0.68" - volar-service-emmet: "npm:0.0.68" - volar-service-html: "npm:0.0.68" - volar-service-json: "npm:0.0.68" - volar-service-pug: "npm:0.0.68" - volar-service-pug-beautify: "npm:0.0.68" - volar-service-typescript: "npm:0.0.68" - vscode-html-languageservice: "npm:^5.2.0" - vscode-uri: "npm:^3.0.8" - checksum: 10c0/c5302e1fb2a50f831f0ae3ffa5e1b3b55cdc7ec4eede037a2b90c5e33f2c66c4c7ef86e025460e9b8dcdfa9d7fb2e3a47c9960d924bfbb6e6d2da1e617fde658 + volar-service-css: "npm:0.0.71" + volar-service-emmet: "npm:0.0.71" + volar-service-html: "npm:0.0.71" + volar-service-json: "npm:0.0.71" + volar-service-pug: "npm:0.0.71" + volar-service-pug-beautify: "npm:0.0.71" + volar-service-typescript: "npm:0.0.71" + vscode-html-languageservice: "npm:^5.6.2" + vscode-uri: "npm:^3.1.0" + checksum: 10c0/ce1ce3ed1c6b6a033b1da992d57e6dbfc5bce3badeb16b93b87f41a062b7add99c8477649cee78278a01f8330a5c75bc3543392bbb8d049f3a08aa606c25d475 languageName: node linkType: hard @@ -4323,16 +4186,16 @@ __metadata: languageName: node linkType: hard -"@vue/typescript-plugin@npm:3.2.5": - version: 3.2.5 - resolution: "@vue/typescript-plugin@npm:3.2.5" +"@vue/typescript-plugin@npm:3.3.5": + version: 3.3.5 + resolution: "@vue/typescript-plugin@npm:3.3.5" dependencies: "@volar/typescript": "npm:2.4.28" - "@vue/language-core": "npm:3.2.5" + "@vue/language-core": "npm:3.3.5" "@vue/shared": "npm:^3.5.0" path-browserify: "npm:^1.0.1" - vue-component-meta: "npm:3.2.5" - checksum: 10c0/c1c93be831f3fe60d85dcf5f1fdb6e531520197bb956c4f8346f11f91c8d3762fcda09ac46354e603c8b4561d9b027310a0a725364185f6064c03e67b2b6b7bf + vue-component-meta: "npm:3.3.5" + checksum: 10c0/f506043769d6a5395c6284e3549e81affd962b340bae79d743af497261509c56db892c0aad82f6832cb1437789054f6cb5b8de61729d238827d77bc5bf7e46a9 languageName: node linkType: hard @@ -4453,7 +4316,7 @@ __metadata: languageName: node linkType: hard -"alien-signals@npm:^3.0.0, alien-signals@npm:^3.2.0": +"alien-signals@npm:^3.2.0": version: 3.2.1 resolution: "alien-signals@npm:3.2.1" checksum: 10c0/4c4064faa208126177224d1ed6a2310687d452dec0771994e276d9af4c72e853fcb969ae4a7fcd034b1d1b9accb9500f4941178326eeea1cb8f64ec612853ef8 @@ -8777,7 +8640,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.1, minimatch@npm:^9.0.3, minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": +"minimatch@npm:^9.0.1, minimatch@npm:^9.0.3, minimatch@npm:^9.0.4": version: 9.0.9 resolution: "minimatch@npm:9.0.9" dependencies: @@ -11329,7 +11192,7 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^2.4.0, ts-api-utils@npm:^2.5.0": +"ts-api-utils@npm:^2.5.0": version: 2.5.0 resolution: "ts-api-utils@npm:2.5.0" peerDependencies: @@ -11546,7 +11409,7 @@ __metadata: languageName: node linkType: hard -"typescript-eslint@npm:^8.56.0": +"typescript-eslint@npm:^8.62.0": version: 8.62.0 resolution: "typescript-eslint@npm:8.62.0" dependencies: @@ -11561,23 +11424,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.9.3, typescript@npm:~5.9.3": - version: 5.9.3 - resolution: "typescript@npm:5.9.3" +"typescript@npm:6.0.3, typescript@npm:~6.0.3": + version: 6.0.3 + resolution: "typescript@npm:6.0.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5 + checksum: 10c0/4a25ff5045b984370f48f196b3a0120779b1b343d40b9a68d114ea5e5fff099809b2bb777576991a63a5cd59cf7bffd96ff6fe10afcefbcb8bd6fb96ad4b6606 languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.9.3#optional!builtin, typescript@patch:typescript@npm%3A~5.9.3#optional!builtin": - version: 5.9.3 - resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5" +"typescript@patch:typescript@npm%3A6.0.3#optional!builtin, typescript@patch:typescript@npm%3A~6.0.3#optional!builtin": + version: 6.0.3 + resolution: "typescript@patch:typescript@npm%3A6.0.3#optional!builtin::version=6.0.3&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/ad09fdf7a756814dce65bc60c1657b40d44451346858eea230e10f2e95a289d9183b6e32e5c11e95acc0ccc214b4f36289dcad4bf1886b0adb84d711d336a430 + checksum: 10c0/2f25c74e65663c248fa1ade2b8459d9ce5372ff9dad07067310f132966ebec1d93f6c42f0baf77a6b6a7a91460463f708e6887013aaade22111037457c6b25df languageName: node linkType: hard @@ -11921,9 +11784,9 @@ __metadata: languageName: node linkType: hard -"volar-service-css@npm:0.0.68": - version: 0.0.68 - resolution: "volar-service-css@npm:0.0.68" +"volar-service-css@npm:0.0.71": + version: 0.0.71 + resolution: "volar-service-css@npm:0.0.71" dependencies: vscode-css-languageservice: "npm:^6.3.0" vscode-languageserver-textdocument: "npm:^1.0.11" @@ -11933,13 +11796,13 @@ __metadata: peerDependenciesMeta: "@volar/language-service": optional: true - checksum: 10c0/e435b7d7723bd99f22541b26c120c061f14deda7627381107feab8ed0211c32aae5b8c619755a4697cb20e9001a083d94d67378eab86dca91de017ccb89a0e4e + checksum: 10c0/fd07e55786a18db2f671eea087e2d43116d8c0f504aac699a3b47fc9d6f53d66c0b3652062ca6ae08d8e59905564f72c63af9727d956165061849ab488462e2e languageName: node linkType: hard -"volar-service-emmet@npm:0.0.68": - version: 0.0.68 - resolution: "volar-service-emmet@npm:0.0.68" +"volar-service-emmet@npm:0.0.71": + version: 0.0.71 + resolution: "volar-service-emmet@npm:0.0.71" dependencies: "@emmetio/css-parser": "npm:^0.4.1" "@emmetio/html-matcher": "npm:^1.3.0" @@ -11950,13 +11813,13 @@ __metadata: peerDependenciesMeta: "@volar/language-service": optional: true - checksum: 10c0/86069a9baea2a9846b7a21b7a26c2fc2c657defc961fbc1b8681953fc54092ebeb099cb62a5f3d9808a520c354d43e197dfeb479e4332c3304d42b5c8fb91575 + checksum: 10c0/a3c95991859d0e7e06a23d1201fcbdddbb7be0c525a553881f14ab941efe331adbb27431caf67962ec43a077e424f7e30bada6a52254272572b93b01f55bcf73 languageName: node linkType: hard -"volar-service-html@npm:0.0.68": - version: 0.0.68 - resolution: "volar-service-html@npm:0.0.68" +"volar-service-html@npm:0.0.71": + version: 0.0.71 + resolution: "volar-service-html@npm:0.0.71" dependencies: vscode-html-languageservice: "npm:^5.3.0" vscode-languageserver-textdocument: "npm:^1.0.11" @@ -11966,13 +11829,13 @@ __metadata: peerDependenciesMeta: "@volar/language-service": optional: true - checksum: 10c0/4dc63c329f7449f978c5f02408927a80b5b74680d123d33eb49a9b4f2e3802bfa4a1f892aa29a8ee17605130b899854f8c416f4d84cffcdea28cf990d8414659 + checksum: 10c0/b1ff293413945cf7357aadc9484080863e7a855a919ccc4f379123ebabe16f9905f5bd19db60e08028a7282c2926762a006daddabd0e373d5040d32afe2ab364 languageName: node linkType: hard -"volar-service-json@npm:0.0.68": - version: 0.0.68 - resolution: "volar-service-json@npm:0.0.68" +"volar-service-json@npm:0.0.71": + version: 0.0.71 + resolution: "volar-service-json@npm:0.0.71" dependencies: vscode-json-languageservice: "npm:^5.4.0" vscode-uri: "npm:^3.0.8" @@ -11981,13 +11844,13 @@ __metadata: peerDependenciesMeta: "@volar/language-service": optional: true - checksum: 10c0/6bc64327617347428f6cf4c4761f799c1fef49b6e3bd5e5d8b1ea51766d560112edbadd0b4874a4b41053b44138c94971a4dffb0b81bd89c8bac322b8230189c + checksum: 10c0/5a437f590857e59af9b4fb91dfdf9bdb372c5897cadddea8d0b247e09eb2fc38ea7eb2ddd5c03b2b08e32034335c9672190cf4077a6007cbc97753bad8d94c34 languageName: node linkType: hard -"volar-service-pug-beautify@npm:0.0.68": - version: 0.0.68 - resolution: "volar-service-pug-beautify@npm:0.0.68" +"volar-service-pug-beautify@npm:0.0.71": + version: 0.0.71 + resolution: "volar-service-pug-beautify@npm:0.0.71" dependencies: "@johnsoncodehk/pug-beautify": "npm:^0.2.2" peerDependencies: @@ -11995,28 +11858,26 @@ __metadata: peerDependenciesMeta: "@volar/language-service": optional: true - checksum: 10c0/18122a8184e6a99cc56e61995e7f8679a22f6ae045a0914bc8c2240f8f8a16cd0381198f20cd2441ef953b3098c9dd6df2fd7a6468dbf186b84cf1721b3f30b7 + checksum: 10c0/a381627cb977a38b54894d1a895ee007093646cc39a59e1fb5a2332a08ca40daec8371eba5ec5463dcb89086b4d7100180743ab4995c2cd49033d78ecae78058 languageName: node linkType: hard -"volar-service-pug@npm:0.0.68": - version: 0.0.68 - resolution: "volar-service-pug@npm:0.0.68" +"volar-service-pug@npm:0.0.71": + version: 0.0.71 + resolution: "volar-service-pug@npm:0.0.71" dependencies: "@volar/language-service": "npm:~2.4.0" - muggle-string: "npm:^0.4.1" - pug-lexer: "npm:^5.0.1" - pug-parser: "npm:^6.0.0" - volar-service-html: "npm:0.0.68" + "@vue/language-plugin-pug": "npm:~3.2.2" + volar-service-html: "npm:0.0.71" vscode-html-languageservice: "npm:^5.3.0" vscode-languageserver-textdocument: "npm:^1.0.11" - checksum: 10c0/a1ba82036afe1ae5f83d5f167cb1f0c813412be83fa06274d5a084a2a87bea17b1ebd7be415f71abf5386dbde2c678d75761026c861892fbe9155911c145c5b4 + checksum: 10c0/14461c2a5c3f3cab5c5ed64b1123aad8b1c5e8c892a41c80ef3c26318d0c9bdf91ffdad1cbfc4d0fccea4ec9a92c65f6658cae322770a4f275bade4913cd2572 languageName: node linkType: hard -"volar-service-typescript@npm:0.0.68": - version: 0.0.68 - resolution: "volar-service-typescript@npm:0.0.68" +"volar-service-typescript@npm:0.0.71": + version: 0.0.71 + resolution: "volar-service-typescript@npm:0.0.71" dependencies: path-browserify: "npm:^1.0.1" semver: "npm:^7.6.2" @@ -12029,7 +11890,7 @@ __metadata: peerDependenciesMeta: "@volar/language-service": optional: true - checksum: 10c0/91f50d760437d3b77c1b9d04d2913ad6f81360e774a9f55e713a8d53fd813e76a7f8aa8f806b80919defab248ed31511843397d83b4924c119b73e8686966f84 + checksum: 10c0/c197666fca9810e72e9db81d15c527b21dbebd493966199b5e8d690204ba17cbc6cfaeed6be7d72b285bb795ff7fbb45a939463db0cb804360c4966e5811bbc0 languageName: node linkType: hard @@ -12045,7 +11906,7 @@ __metadata: languageName: node linkType: hard -"vscode-html-languageservice@npm:^5.2.0, vscode-html-languageservice@npm:^5.3.0": +"vscode-html-languageservice@npm:^5.3.0, vscode-html-languageservice@npm:^5.6.2": version: 5.6.2 resolution: "vscode-html-languageservice@npm:5.6.2" dependencies: @@ -12157,19 +12018,19 @@ __metadata: languageName: node linkType: hard -"vue-component-meta@npm:3.2.5": - version: 3.2.5 - resolution: "vue-component-meta@npm:3.2.5" +"vue-component-meta@npm:3.3.5": + version: 3.3.5 + resolution: "vue-component-meta@npm:3.3.5" dependencies: "@volar/typescript": "npm:2.4.28" - "@vue/language-core": "npm:3.2.5" + "@vue/language-core": "npm:3.3.5" path-browserify: "npm:^1.0.1" peerDependencies: typescript: "*" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/b13fc706f52a1877bc8328cf46e0d433698ecabd6afb2103c3e6695093683578c5686ff21b9677b695cbbc057e2280030e97c7100cd53fea2eabc3f18d3c2ab0 + checksum: 10c0/1b7670004e782e9bddb53bb3587e55130d174497a22762385b404e08a9b2276a65dc8964a94c04a28aa5d88bd96274f49eaca566a75c01416cf1e7bc708f8942 languageName: node linkType: hard From 52a65bd02fd157a7eb254317a2f46d3e762e0ecd Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Mon, 29 Jun 2026 14:10:37 +0400 Subject: [PATCH 42/54] build: TypeScript deprecations were resolved --- m3-foundation/tsconfig.json | 3 +-- m3-react/tsconfig.json | 1 - m3-react/vite.config.ts | 7 ++----- m3-vue/tsconfig.json | 1 - m3-vue/vite.config.ts | 7 ++----- tsconfig.json | 3 +-- 6 files changed, 6 insertions(+), 16 deletions(-) diff --git a/m3-foundation/tsconfig.json b/m3-foundation/tsconfig.json index 592a8a8..f5c5a2b 100644 --- a/m3-foundation/tsconfig.json +++ b/m3-foundation/tsconfig.json @@ -1,9 +1,8 @@ { "compilerOptions": { "esModuleInterop": true, - "ignoreDeprecations": "6.0", "module": "esnext", - "moduleResolution": "node", + "moduleResolution": "bundler", "resolveJsonModule": true, "target": "ES2017" }, diff --git a/m3-react/tsconfig.json b/m3-react/tsconfig.json index dd70f37..eaaa154 100644 --- a/m3-react/tsconfig.json +++ b/m3-react/tsconfig.json @@ -1,7 +1,6 @@ { "extends": "../tsconfig.json", "compilerOptions": { - "baseUrl": "./", "moduleResolution": "bundler", "jsx": "react-jsx", "lib": [ diff --git a/m3-react/vite.config.ts b/m3-react/vite.config.ts index 7d76b74..c7c037b 100644 --- a/m3-react/vite.config.ts +++ b/m3-react/vite.config.ts @@ -15,10 +15,7 @@ export default defineConfig({ name: '@modulify/m3-react', formats: ['es', 'cjs'], entry: resolve(__dirname, './src/index.ts'), - fileName: (format) => `m3-react.${{ - es: 'mjs', - cjs: 'cjs', - }[format]}`, + fileName: (format) => `m3-react.${format === 'es' ? 'mjs' : format}`, }, minify: false, rollupOptions: { @@ -31,4 +28,4 @@ export default defineConfig({ }, }, }, -}) \ No newline at end of file +}) diff --git a/m3-vue/tsconfig.json b/m3-vue/tsconfig.json index aa9fb50..958e380 100644 --- a/m3-vue/tsconfig.json +++ b/m3-vue/tsconfig.json @@ -1,7 +1,6 @@ { "extends": "../tsconfig.json", "compilerOptions": { - "baseUrl": "./", "moduleResolution": "bundler", "lib": [ "DOM", diff --git a/m3-vue/vite.config.ts b/m3-vue/vite.config.ts index 62cfa29..25edf18 100644 --- a/m3-vue/vite.config.ts +++ b/m3-vue/vite.config.ts @@ -15,10 +15,7 @@ export default defineConfig({ name: '@modulify/m3-vue', formats: ['es', 'cjs'], entry: resolve(__dirname, './src/index.ts'), - fileName: (format) => `m3-vue.${{ - es: 'mjs', - cjs: 'cjs', - }[format]}`, + fileName: (format) => `m3-vue.${format === 'es' ? 'mjs' : format}`, }, minify: false, rollupOptions: { @@ -31,4 +28,4 @@ export default defineConfig({ }, }, }, -}) \ No newline at end of file +}) diff --git a/tsconfig.json b/tsconfig.json index 4c884fd..e6f23f1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,9 +1,8 @@ { "compilerOptions": { "esModuleInterop": true, - "ignoreDeprecations": "6.0", "module": "esnext", - "moduleResolution": "node", + "moduleResolution": "bundler", "resolveJsonModule": true, "target": "ES2017" } From b088777633c3fff9cadfd7ed3d23d1d46cc71aa2 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Mon, 29 Jun 2026 14:34:02 +0400 Subject: [PATCH 43/54] build(m3-vue): ESLint Vue plugin was updated --- m3-vue/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/m3-vue/package.json b/m3-vue/package.json index 6e5a884..083a3bf 100644 --- a/m3-vue/package.json +++ b/m3-vue/package.json @@ -67,7 +67,7 @@ "eslint": "^9.39.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-unused-imports": "^4.4.1", - "eslint-plugin-vue": "^10.8.0", + "eslint-plugin-vue": "^10.9.2", "flag-icons": "^7.5.0", "globals": "^17.3.0", "highlight.js": "^11.11.1", From a20966d84f73344c401809723871c3270abc1555 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Mon, 29 Jun 2026 14:35:48 +0400 Subject: [PATCH 44/54] chore: Updated yarn.lock --- yarn.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4cda3b9..a107a1a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1893,7 +1893,7 @@ __metadata: eslint: "npm:^9.39.4" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-unused-imports: "npm:^4.4.1" - eslint-plugin-vue: "npm:^10.8.0" + eslint-plugin-vue: "npm:^10.9.2" flag-icons: "npm:^7.5.0" globals: "npm:^17.3.0" highlight.js: "npm:^11.11.1" @@ -6442,7 +6442,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-vue@npm:^10.8.0": +"eslint-plugin-vue@npm:^10.9.2": version: 10.9.2 resolution: "eslint-plugin-vue@npm:10.9.2" dependencies: From 104f490d3b7ada8f6b939698968dbf3965a24504 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Mon, 29 Jun 2026 15:16:46 +0400 Subject: [PATCH 45/54] build: Conventional release tooling was added --- Makefile | 1 + m3-foundation/package.json | 1 - package.json | 11 +++++++++++ recipes/release.mk | 11 +++++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 recipes/release.mk diff --git a/Makefile b/Makefile index 329754a..50547a5 100644 --- a/Makefile +++ b/Makefile @@ -37,6 +37,7 @@ build: node_modules ## [Build][docker] Creates a dist catalogue with library bui include recipes/lint.mk include recipes/tests.mk include recipes/storybook.mk +include recipes/release.mk include recipes/ci.mk include recipes/research.mk include recipes/exploration.mk diff --git a/m3-foundation/package.json b/m3-foundation/package.json index 469039e..8f6e20e 100644 --- a/m3-foundation/package.json +++ b/m3-foundation/package.json @@ -33,7 +33,6 @@ "globals": "^17.3.0", "husky": "^9.1.7", "sass": "^1.97.3", - "standard-version": "^9.5.0", "ts-node": "^10.9.2", "tslib": "^2.8.1", "typescript": "~6.0.3", diff --git a/package.json b/package.json index 8ed02fd..f78c3fa 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,8 @@ "build": "yarn workspaces foreach -W run build", "commitlint": "commitlint --edit", "eslint": "yarn workspaces foreach -W run eslint", + "release": "conventional-release", + "release:dry": "conventional-release --dry --verbose --tags", "test:e2e:react": "yarn workspace @modulify/m3-react test:e2e", "test:e2e:vue": "yarn workspace @modulify/m3-vue test:e2e", "test:e2e": "yarn test:e2e:react && yarn test:e2e:vue", @@ -30,6 +32,8 @@ "devDependencies": { "@commitlint/cli": "^21.1.0", "@commitlint/config-conventional": "^21.1.0", + "@modulify/conventional-release": "^0.1.3", + "@types/semver": "^7.7.1", "@vitest/browser": "^4.1.9", "@vitest/browser-playwright": "^4.1.9", "@vitest/coverage-istanbul": "^4.1.9", @@ -45,6 +49,13 @@ "@typescript-eslint/utils@npm:^8.48.0": "npm:8.62.0", "typescript@npm:^5.9.3": "npm:6.0.3" }, + "release": { + "mode": "sync", + "dependencyPolicy": "exact", + "install": [ + "--mode=update-lockfile" + ] + }, "contributors": [ "Tatyana Komolyh " ], diff --git a/recipes/release.mk b/recipes/release.mk new file mode 100644 index 0000000..6e07b17 --- /dev/null +++ b/recipes/release.mk @@ -0,0 +1,11 @@ +include recipes/common.mk + +.PHONY: release-dry +release-dry: node_modules ## [Release][docker] Shows the conventional release plan without writing files + $(TARGET_HEADER) + $(YARN) release:dry + +.PHONY: release +release: node_modules ## [Release][docker] Creates a conventional release commit and tags + $(TARGET_HEADER) + $(YARN) release From 5222685ff9cdfbea0c1b662ef191e448b1d9b2e2 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Mon, 29 Jun 2026 15:17:23 +0400 Subject: [PATCH 46/54] chore: Updated yarn.lock --- yarn.lock | 1272 ++++++++++------------------------------------------- 1 file changed, 237 insertions(+), 1035 deletions(-) diff --git a/yarn.lock b/yarn.lock index a107a1a..7a94276 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1589,13 +1589,6 @@ __metadata: languageName: node linkType: hard -"@hutson/parse-repository-url@npm:^3.0.0": - version: 3.0.2 - resolution: "@hutson/parse-repository-url@npm:3.0.2" - checksum: 10c0/d9197757ecad2df18d29d3e1d1fe0716d458fd88b849c71cbec9e78239f911074c97e8d764dfd8ed890431c1137e52dd7a337207fd65be20ce0784f7860ae4d1 - languageName: node - linkType: hard - "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -1610,6 +1603,13 @@ __metadata: languageName: node linkType: hard +"@isaacs/cliui@npm:^9.0.0": + version: 9.0.0 + resolution: "@isaacs/cliui@npm:9.0.0" + checksum: 10c0/971063b7296419f85053dacd0a0285dcadaa3dfc139228b23e016c1a9848121ad4aa5e7fcca7522062014e1eb6239a7424188b9f2cba893a79c90aae5710319c + languageName: node + linkType: hard + "@isaacs/fs-minipass@npm:^4.0.0": version: 4.0.1 resolution: "@isaacs/fs-minipass@npm:4.0.1" @@ -1770,6 +1770,95 @@ __metadata: languageName: node linkType: hard +"@modulify/conventional-bump@npm:^0.1.3": + version: 0.1.3 + resolution: "@modulify/conventional-bump@npm:0.1.3" + dependencies: + "@modulify/conventional-git": "npm:^0.1.3" + semver: "npm:^7.7.4" + peerDependencies: + "@types/node": ">=20" + "@types/semver": ^7.7.1 + peerDependenciesMeta: + "@types/node": + optional: true + "@types/semver": + optional: true + checksum: 10c0/f03c067fd7173de699b986a4261a71d777ce448cbbc9157a63aa0bbe0db4e9a71ff91cae927d654103e6bc344693c4c809262663c83df87fce7a332ef67149cb + languageName: node + linkType: hard + +"@modulify/conventional-changelog@npm:^0.1.3": + version: 0.1.3 + resolution: "@modulify/conventional-changelog@npm:0.1.3" + dependencies: + "@modulify/conventional-bump": "npm:^0.1.3" + "@modulify/conventional-git": "npm:^0.1.3" + "@types/nunjucks": "npm:^3.2.6" + nunjucks: "npm:^3.2.4" + peerDependencies: + "@types/node": ">=20" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/2a48c6baa566f1be514baed4db069a289738945c081be0b42701507cbe3965d95d4f7db62c7b4cebccff9a424553a21af3a25992b87adce23e442473a7565dd9 + languageName: node + linkType: hard + +"@modulify/conventional-git@npm:^0.1.3": + version: 0.1.3 + resolution: "@modulify/conventional-git@npm:0.1.3" + dependencies: + "@modulify/git-toolkit": "npm:^0.0.3" + semver: "npm:^7.7.4" + peerDependencies: + "@types/node": ">=20" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/2816827f0693b3eafa7b08f4b166840418f553f06e8dfdaad9dab7f2bdee164cdf3e8af80f75308a2482aef02d7b2ea893589cea5fe955474a6bf19864abd925 + languageName: node + linkType: hard + +"@modulify/conventional-release@npm:^0.1.3": + version: 0.1.3 + resolution: "@modulify/conventional-release@npm:0.1.3" + dependencies: + "@modulify/conventional-bump": "npm:^0.1.3" + "@modulify/conventional-changelog": "npm:^0.1.3" + "@modulify/conventional-git": "npm:^0.1.3" + "@modulify/git-toolkit": "npm:^0.0.3" + "@modulify/pkg": "npm:^1.0.1" + chalk: "npm:^5.6.2" + figures: "npm:^6.1.0" + semver: "npm:^7.7.4" + yargs: "npm:^17.7.2" + peerDependencies: + "@types/node": ">=20" + "@types/semver": ^7.7.1 + peerDependenciesMeta: + "@types/node": + optional: true + "@types/semver": + optional: true + bin: + conventional-release: bin/index.js + checksum: 10c0/8265285c6a8324bc349f8891a1a014d95109491cef915a111f85a10e6c5df833ae36551de64c77ef07fb6c65772e6c509c92883ca8923fff39dada03809ca687 + languageName: node + linkType: hard + +"@modulify/git-toolkit@npm:^0.0.3": + version: 0.0.3 + resolution: "@modulify/git-toolkit@npm:0.0.3" + peerDependencies: + "@types/node": ">=20" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/47579452bb3722eca9c54ddbc296e4106a6e1014f034b3dd8c602ab281d41d3879899d388ce34825de2947e9864158c9685959ab2b764db95ca9ecbd4b3895a4 + languageName: node + linkType: hard + "@modulify/m3-foundation@npm:0.0.0, @modulify/m3-foundation@workspace:m3-foundation": version: 0.0.0-use.local resolution: "@modulify/m3-foundation@workspace:m3-foundation" @@ -1788,7 +1877,6 @@ __metadata: husky: "npm:^9.1.7" lodash.isequal: "npm:^4.5.0" sass: "npm:^1.97.3" - standard-version: "npm:^9.5.0" ts-node: "npm:^10.9.2" tslib: "npm:^2.8.1" typescript: "npm:~6.0.3" @@ -1927,6 +2015,8 @@ __metadata: dependencies: "@commitlint/cli": "npm:^21.1.0" "@commitlint/config-conventional": "npm:^21.1.0" + "@modulify/conventional-release": "npm:^0.1.3" + "@types/semver": "npm:^7.7.1" "@vitest/browser": "npm:^4.1.9" "@vitest/browser-playwright": "npm:^4.1.9" "@vitest/coverage-istanbul": "npm:^4.1.9" @@ -1940,6 +2030,17 @@ __metadata: languageName: unknown linkType: soft +"@modulify/pkg@npm:^1.0.1": + version: 1.0.1 + resolution: "@modulify/pkg@npm:1.0.1" + dependencies: + detect-indent: "npm:^7.0.1" + detect-newline: "npm:^4.0.1" + glob: "npm:^11.0.0" + checksum: 10c0/09b3fac8bee717bbb987e5c41f0eac90990077acdd1b4e197e28765c1768162a13b241bb15d0f1630f82e9aa354ca124035e10f3d3790cb4cf1a730aa70b2c70 + languageName: node + linkType: hard + "@modulify/validator@npm:^0.1.0": version: 0.1.0 resolution: "@modulify/validator@npm:0.1.0" @@ -3232,13 +3333,6 @@ __metadata: languageName: node linkType: hard -"@types/minimist@npm:^1.2.0": - version: 1.2.5 - resolution: "@types/minimist@npm:1.2.5" - checksum: 10c0/3f791258d8e99a1d7d0ca2bda1ca6ea5a94e5e7b8fc6cde84dd79b0552da6fb68ade750f0e17718f6587783c24254bbca0357648dd59dc3812c150305cabdc46 - languageName: node - linkType: hard - "@types/node@npm:^25.3.0": version: 25.3.0 resolution: "@types/node@npm:25.3.0" @@ -3248,10 +3342,10 @@ __metadata: languageName: node linkType: hard -"@types/normalize-package-data@npm:^2.4.0": - version: 2.4.4 - resolution: "@types/normalize-package-data@npm:2.4.4" - checksum: 10c0/aef7bb9b015883d6f4119c423dd28c4bdc17b0e8a0ccf112c78b4fe0e91fbc4af7c6204b04bba0e199a57d2f3fbbd5b4a14bf8739bf9d2a39b2a0aad545e0f86 +"@types/nunjucks@npm:^3.2.6": + version: 3.2.6 + resolution: "@types/nunjucks@npm:3.2.6" + checksum: 10c0/bc62c5c9305c0c63a49a55c3553393fdc84d123b4831668212380077ee6646c3ba52bc49e3c651257addf3a47d775707dcefeaf5e1b76cf7f680096939894142 languageName: node linkType: hard @@ -3297,6 +3391,13 @@ __metadata: languageName: node linkType: hard +"@types/semver@npm:^7.7.1": + version: 7.7.1 + resolution: "@types/semver@npm:7.7.1" + checksum: 10c0/c938aef3bf79a73f0f3f6037c16e2e759ff40c54122ddf0b2583703393d8d3127130823facb880e694caa324eb6845628186aac1997ee8b31dc2d18fafe26268 + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:8.62.0, @typescript-eslint/eslint-plugin@npm:^8.62.0": version: 8.62.0 resolution: "@typescript-eslint/eslint-plugin@npm:8.62.0" @@ -4206,15 +4307,10 @@ __metadata: languageName: node linkType: hard -"JSONStream@npm:^1.0.4": - version: 1.3.5 - resolution: "JSONStream@npm:1.3.5" - dependencies: - jsonparse: "npm:^1.2.0" - through: "npm:>=2.2.7 <3" - bin: - JSONStream: ./bin.js - checksum: 10c0/0f54694da32224d57b715385d4a6b668d2117379d1f3223dc758459246cca58fdc4c628b83e8a8883334e454a0a30aa198ede77c788b55537c1844f686a751f2 +"a-sync-waterfall@npm:^1.0.0": + version: 1.0.1 + resolution: "a-sync-waterfall@npm:1.0.1" + checksum: 10c0/1c7b258da2c77eb1447dcc683afb10ca3dc8880de990562ccbb7b282538aba01e910345ce9e8500c1458272c7866b85fcfa5ca8159e33550b011ab5c586ec5a4 languageName: node linkType: hard @@ -4268,13 +4364,6 @@ __metadata: languageName: node linkType: hard -"add-stream@npm:^1.0.0": - version: 1.0.0 - resolution: "add-stream@npm:1.0.0" - checksum: 10c0/985014a14e76ca4cb24e0fc58bb1556794cf38c5c8937de335a10584f50a371dc48e1c34a59391c7eb9c1fc908b4b86764df5d2756f701df6ba95d1ca2f63ddc - languageName: node - linkType: hard - "aggregate-error@npm:^3.0.0": version: 3.1.0 resolution: "aggregate-error@npm:3.1.0" @@ -4547,14 +4636,7 @@ __metadata: languageName: node linkType: hard -"arrify@npm:^1.0.1": - version: 1.0.1 - resolution: "arrify@npm:1.0.1" - checksum: 10c0/c35c8d1a81bcd5474c0c57fe3f4bad1a4d46a5fa353cedcff7a54da315df60db71829e69104b859dff96c5d68af46bd2be259fe5e50dc6aa9df3b36bea0383ab - languageName: node - linkType: hard - -"asap@npm:~2.0.3": +"asap@npm:^2.0.3, asap@npm:~2.0.3": version: 2.0.6 resolution: "asap@npm:2.0.6" checksum: 10c0/c6d5e39fe1f15e4b87677460bd66b66050cd14c772269cee6688824c1410a08ab20254bb6784f9afb75af9144a9f9a7692d49547f4d19d715aeb7c0318f3136d @@ -4751,13 +4833,6 @@ __metadata: languageName: node linkType: hard -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 - languageName: node - linkType: hard - "buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" @@ -4828,17 +4903,6 @@ __metadata: languageName: node linkType: hard -"camelcase-keys@npm:^6.2.2": - version: 6.2.2 - resolution: "camelcase-keys@npm:6.2.2" - dependencies: - camelcase: "npm:^5.3.1" - map-obj: "npm:^4.0.0" - quick-lru: "npm:^4.0.1" - checksum: 10c0/bf1a28348c0f285c6c6f68fb98a9d088d3c0269fed0cdff3ea680d5a42df8a067b4de374e7a33e619eb9d5266a448fe66c2dd1f8e0c9209ebc348632882a3526 - languageName: node - linkType: hard - "camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": version: 5.3.1 resolution: "camelcase@npm:5.3.1" @@ -4912,6 +4976,13 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^5.6.2": + version: 5.6.2 + resolution: "chalk@npm:5.6.2" + checksum: 10c0/99a4b0f0e7991796b1e7e3f52dceb9137cae2a9dfc8fc0784a550dc4c558e15ab32ed70b14b21b52beb2679b4892b41a0aa44249bcb996f01e125d58477c6976 + languageName: node + linkType: hard + "character-parser@npm:^2.2.0": version: 2.2.0 resolution: "character-parser@npm:2.2.0" @@ -4993,14 +5064,14 @@ __metadata: languageName: node linkType: hard -"cliui@npm:^7.0.2": - version: 7.0.4 - resolution: "cliui@npm:7.0.4" +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" dependencies: string-width: "npm:^4.2.0" - strip-ansi: "npm:^6.0.0" + strip-ansi: "npm:^6.0.1" wrap-ansi: "npm:^7.0.0" - checksum: 10c0/6035f5daf7383470cef82b3d3db00bec70afb3423538c50394386ffbbab135e26c3689c41791f911fa71b62d13d3863c712fdd70f0fbdffd938a1e6fd09aac00 + checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 languageName: node linkType: hard @@ -5054,6 +5125,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^5.1.0": + version: 5.1.0 + resolution: "commander@npm:5.1.0" + checksum: 10c0/da9d71dbe4ce039faf1fe9eac3771dca8c11d66963341f62602f7b66e36d2a3f8883407af4f9a37b1db1a55c59c0c1325f186425764c2e963dc1d67aec2a4b6d + languageName: node + linkType: hard + "commander@npm:^7.2.0": version: 7.2.0 resolution: "commander@npm:7.2.0" @@ -5085,18 +5163,6 @@ __metadata: languageName: node linkType: hard -"concat-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "concat-stream@npm:2.0.0" - dependencies: - buffer-from: "npm:^1.0.0" - inherits: "npm:^2.0.3" - readable-stream: "npm:^3.0.2" - typedarray: "npm:^0.0.6" - checksum: 10c0/29565dd9198fe1d8cf57f6cc71527dbc6ad67e12e4ac9401feb389c53042b2dceedf47034cbe702dfc4fd8df3ae7e6bfeeebe732cc4fa2674e484c13f04c219a - languageName: node - linkType: hard - "confbox@npm:^0.1.8": version: 0.1.8 resolution: "confbox@npm:0.1.8" @@ -5131,16 +5197,6 @@ __metadata: languageName: node linkType: hard -"conventional-changelog-angular@npm:^5.0.12": - version: 5.0.13 - resolution: "conventional-changelog-angular@npm:5.0.13" - dependencies: - compare-func: "npm:^2.0.0" - q: "npm:^1.5.1" - checksum: 10c0/bca711b835fe01d75e3500b738f6525c91a12096218e917e9fd81bf9accf157f904fee16f88c523fd5462fb2a7cb1d060eb79e9bc9a3ccb04491f0c383b43231 - languageName: node - linkType: hard - "conventional-changelog-angular@npm:^8.2.0": version: 8.3.1 resolution: "conventional-changelog-angular@npm:8.3.1" @@ -5150,42 +5206,6 @@ __metadata: languageName: node linkType: hard -"conventional-changelog-atom@npm:^2.0.8": - version: 2.0.8 - resolution: "conventional-changelog-atom@npm:2.0.8" - dependencies: - q: "npm:^1.5.1" - checksum: 10c0/1c7e971e8ba58564397c2dfc9a7522f46bad315844ae782db66e27b2d584f22c21a757a429400657c2eef915690e8fd04bddfc3f8e9504d1fadccd8d0758217b - languageName: node - linkType: hard - -"conventional-changelog-codemirror@npm:^2.0.8": - version: 2.0.8 - resolution: "conventional-changelog-codemirror@npm:2.0.8" - dependencies: - q: "npm:^1.5.1" - checksum: 10c0/467c8c0daec0424acad6b30aa8897ea5e07c327352d3daae50f3a5427584bcb47d5ac5a3167eb7aeb818ebb856e2e81b19cab9a256fe6f21ad96e4a751599325 - languageName: node - linkType: hard - -"conventional-changelog-config-spec@npm:2.1.0": - version: 2.1.0 - resolution: "conventional-changelog-config-spec@npm:2.1.0" - checksum: 10c0/9448758697bbb1119df87815d8422940d14a656adb86e063c88d3d13533b61fb94a617cea7e6b58513640b6bd4c4a65af9cab63607cdcb971c405fb0b9256399 - languageName: node - linkType: hard - -"conventional-changelog-conventionalcommits@npm:4.6.3, conventional-changelog-conventionalcommits@npm:^4.5.0": - version: 4.6.3 - resolution: "conventional-changelog-conventionalcommits@npm:4.6.3" - dependencies: - compare-func: "npm:^2.0.0" - lodash: "npm:^4.17.15" - q: "npm:^1.5.1" - checksum: 10c0/f3b5e6132ec03dad4aa4a2b5ac47ee0e2ae8be6d0fa53a131c722412ce7c02a742c190790f15b5ab4983a31ce90b7066ce1f3f3d5cc4253aa3484ee414259bd2 - languageName: node - linkType: hard - "conventional-changelog-conventionalcommits@npm:^9.2.0": version: 9.3.1 resolution: "conventional-changelog-conventionalcommits@npm:9.3.1" @@ -5195,145 +5215,6 @@ __metadata: languageName: node linkType: hard -"conventional-changelog-core@npm:^4.2.1": - version: 4.2.4 - resolution: "conventional-changelog-core@npm:4.2.4" - dependencies: - add-stream: "npm:^1.0.0" - conventional-changelog-writer: "npm:^5.0.0" - conventional-commits-parser: "npm:^3.2.0" - dateformat: "npm:^3.0.0" - get-pkg-repo: "npm:^4.0.0" - git-raw-commits: "npm:^2.0.8" - git-remote-origin-url: "npm:^2.0.0" - git-semver-tags: "npm:^4.1.1" - lodash: "npm:^4.17.15" - normalize-package-data: "npm:^3.0.0" - q: "npm:^1.5.1" - read-pkg: "npm:^3.0.0" - read-pkg-up: "npm:^3.0.0" - through2: "npm:^4.0.0" - checksum: 10c0/4c9f30350250298d9bbb56988b3093ec7de593499a796609c5877115533362815434ff6df3493649e20b1b40399fef3d42032f39e8279bb8df192b89e6e32e69 - languageName: node - linkType: hard - -"conventional-changelog-ember@npm:^2.0.9": - version: 2.0.9 - resolution: "conventional-changelog-ember@npm:2.0.9" - dependencies: - q: "npm:^1.5.1" - checksum: 10c0/bc37a1ec320b56f9831ec6a156d77444743944cdc06ff23b1175a3a23063b907b31fad402566a281b722da1bc9fd687db993cc8dbe9a9baf6e38af24541ccfbc - languageName: node - linkType: hard - -"conventional-changelog-eslint@npm:^3.0.9": - version: 3.0.9 - resolution: "conventional-changelog-eslint@npm:3.0.9" - dependencies: - q: "npm:^1.5.1" - checksum: 10c0/340b3be510e6713e37f641f0efcb2d8d2bc0b2c1bc38e7c1e2107f69432606290661d43cbc5971b418dd87cd92c2acb86af857264643a607cd8f29887e28683d - languageName: node - linkType: hard - -"conventional-changelog-express@npm:^2.0.6": - version: 2.0.6 - resolution: "conventional-changelog-express@npm:2.0.6" - dependencies: - q: "npm:^1.5.1" - checksum: 10c0/11a02868847d7d1c585bd38cdd7e39636aefde3ef83138044d859d31c23afc1a82a3cab26c8b8aaae2f536b457b011232325c3ed3f2d6a9ec564522dae265ae2 - languageName: node - linkType: hard - -"conventional-changelog-jquery@npm:^3.0.11": - version: 3.0.11 - resolution: "conventional-changelog-jquery@npm:3.0.11" - dependencies: - q: "npm:^1.5.1" - checksum: 10c0/5662ff1bee271f6f7f2ca893b84942ec01e4a48299701b3323383dde3e461301c65f248dbcfa8219742258e96b1547ba5f21e66f4785fbc39cbe3074d46d71a4 - languageName: node - linkType: hard - -"conventional-changelog-jshint@npm:^2.0.9": - version: 2.0.9 - resolution: "conventional-changelog-jshint@npm:2.0.9" - dependencies: - compare-func: "npm:^2.0.0" - q: "npm:^1.5.1" - checksum: 10c0/3048c3a02b173836f5c2f9c326bac7e80386e7591b9734d4f3a91e7dfe87329fde03414c62fdebe718a82f29e61b1122343186180e7173a47513487b3cfb463d - languageName: node - linkType: hard - -"conventional-changelog-preset-loader@npm:^2.3.4": - version: 2.3.4 - resolution: "conventional-changelog-preset-loader@npm:2.3.4" - checksum: 10c0/a978bcd5fc2eb12b56bc03ec59705af32e521fd27b98a209a26767c2078d423e7d8e30c09d45547371631790f0387453434c73c4541521a7473dce14d5360c7d - languageName: node - linkType: hard - -"conventional-changelog-writer@npm:^5.0.0": - version: 5.0.1 - resolution: "conventional-changelog-writer@npm:5.0.1" - dependencies: - conventional-commits-filter: "npm:^2.0.7" - dateformat: "npm:^3.0.0" - handlebars: "npm:^4.7.7" - json-stringify-safe: "npm:^5.0.1" - lodash: "npm:^4.17.15" - meow: "npm:^8.0.0" - semver: "npm:^6.0.0" - split: "npm:^1.0.0" - through2: "npm:^4.0.0" - bin: - conventional-changelog-writer: cli.js - checksum: 10c0/268b56a3e4db07ad24da7134788c889ecd024cf2e7c0bfe8ca76f83e5db79f057538c45500b052a77b7933c4d0f47e2e807c6e756cbd5ad9db365744c9ce0e7f - languageName: node - linkType: hard - -"conventional-changelog@npm:3.1.25": - version: 3.1.25 - resolution: "conventional-changelog@npm:3.1.25" - dependencies: - conventional-changelog-angular: "npm:^5.0.12" - conventional-changelog-atom: "npm:^2.0.8" - conventional-changelog-codemirror: "npm:^2.0.8" - conventional-changelog-conventionalcommits: "npm:^4.5.0" - conventional-changelog-core: "npm:^4.2.1" - conventional-changelog-ember: "npm:^2.0.9" - conventional-changelog-eslint: "npm:^3.0.9" - conventional-changelog-express: "npm:^2.0.6" - conventional-changelog-jquery: "npm:^3.0.11" - conventional-changelog-jshint: "npm:^2.0.9" - conventional-changelog-preset-loader: "npm:^2.3.4" - checksum: 10c0/8065d5d742a400ab6d73ea5a42af746c3ec51e081e5ea542b00ebb220f904828002a04ae5841d5588a242773f8112f28bc353bf700fb0b2bda182fac6505c7a7 - languageName: node - linkType: hard - -"conventional-commits-filter@npm:^2.0.7": - version: 2.0.7 - resolution: "conventional-commits-filter@npm:2.0.7" - dependencies: - lodash.ismatch: "npm:^4.4.0" - modify-values: "npm:^1.0.0" - checksum: 10c0/df06fb29285b473614f5094e983d26fcc14cd0f64b2cbb2f65493fc8bd47c077c2310791d26f4b2b719e9585aaade95370e73230bff6647163164a18b9dfaa07 - languageName: node - linkType: hard - -"conventional-commits-parser@npm:^3.2.0": - version: 3.2.4 - resolution: "conventional-commits-parser@npm:3.2.4" - dependencies: - JSONStream: "npm:^1.0.4" - is-text-path: "npm:^1.0.1" - lodash: "npm:^4.17.15" - meow: "npm:^8.0.0" - split2: "npm:^3.0.0" - through2: "npm:^4.0.0" - bin: - conventional-commits-parser: cli.js - checksum: 10c0/122d7d7f991a04c8e3f703c0e4e9a25b2ecb20906f497e4486cb5c2acd9c68f6d9af745f7e79cb407538f50e840b33399274ac427b20971b98b335d1b66d3d17 - languageName: node - linkType: hard - "conventional-commits-parser@npm:^6.3.0": version: 6.4.0 resolution: "conventional-commits-parser@npm:6.4.0" @@ -5346,24 +5227,6 @@ __metadata: languageName: node linkType: hard -"conventional-recommended-bump@npm:6.1.0": - version: 6.1.0 - resolution: "conventional-recommended-bump@npm:6.1.0" - dependencies: - concat-stream: "npm:^2.0.0" - conventional-changelog-preset-loader: "npm:^2.3.4" - conventional-commits-filter: "npm:^2.0.7" - conventional-commits-parser: "npm:^3.2.0" - git-raw-commits: "npm:^2.0.8" - git-semver-tags: "npm:^4.1.1" - meow: "npm:^8.0.0" - q: "npm:^1.5.1" - bin: - conventional-recommended-bump: cli.js - checksum: 10c0/649e6230be7e96e057a542a2695710aeaee356297d307691b3398e0f18d596b4a5b3ba56307755e779d8687a13b2466844300c649eb23f44fe5f1db9f923f3f4 - languageName: node - linkType: hard - "convert-source-map@npm:^1.7.0": version: 1.9.0 resolution: "convert-source-map@npm:1.9.0" @@ -5378,13 +5241,6 @@ __metadata: languageName: node linkType: hard -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 - languageName: node - linkType: hard - "cosmiconfig-typescript-loader@npm:^6.1.0": version: 6.3.0 resolution: "cosmiconfig-typescript-loader@npm:6.3.0" @@ -5532,13 +5388,6 @@ __metadata: languageName: node linkType: hard -"dargs@npm:^7.0.0": - version: 7.0.0 - resolution: "dargs@npm:7.0.0" - checksum: 10c0/ec7f6a8315a8fa2f8b12d39207615bdf62b4d01f631b96fbe536c8ad5469ab9ed710d55811e564d0d5c1d548fc8cb6cc70bf0939f2415790159f5a75e0f96c92 - languageName: node - linkType: hard - "data-urls@npm:^7.0.0": version: 7.0.0 resolution: "data-urls@npm:7.0.0" @@ -5582,13 +5431,6 @@ __metadata: languageName: node linkType: hard -"dateformat@npm:^3.0.0": - version: 3.0.3 - resolution: "dateformat@npm:3.0.3" - checksum: 10c0/2effb8bef52ff912f87a05e4adbeacff46353e91313ad1ea9ed31412db26849f5a0fcc7e3ce36dbfb84fc6c881a986d5694f84838ad0da7000d5150693e78678 - languageName: node - linkType: hard - "de-indent@npm:^1.0.2": version: 1.0.2 resolution: "de-indent@npm:1.0.2" @@ -5617,17 +5459,7 @@ __metadata: languageName: node linkType: hard -"decamelize-keys@npm:^1.1.0": - version: 1.1.1 - resolution: "decamelize-keys@npm:1.1.1" - dependencies: - decamelize: "npm:^1.1.0" - map-obj: "npm:^1.0.0" - checksum: 10c0/4ca385933127437658338c65fb9aead5f21b28d3dd3ccd7956eb29aab0953b5d3c047fbc207111672220c71ecf7a4d34f36c92851b7bbde6fca1a02c541bdd7d - languageName: node - linkType: hard - -"decamelize@npm:^1.1.0, decamelize@npm:^1.2.0": +"decamelize@npm:^1.2.0": version: 1.2.0 resolution: "decamelize@npm:1.2.0" checksum: 10c0/85c39fe8fbf0482d4a1e224ef0119db5c1897f8503bcef8b826adff7a1b11414972f6fef2d7dec2ee0b4be3863cf64ac1439137ae9e6af23a3d8dcbe26a5b4b2 @@ -5759,10 +5591,10 @@ __metadata: languageName: node linkType: hard -"detect-indent@npm:^6.0.0": - version: 6.1.0 - resolution: "detect-indent@npm:6.1.0" - checksum: 10c0/dd83cdeda9af219cf77f5e9a0dc31d828c045337386cfb55ce04fad94ba872ee7957336834154f7647b89b899c3c7acc977c57a79b7c776b506240993f97acc7 +"detect-indent@npm:^7.0.1": + version: 7.0.2 + resolution: "detect-indent@npm:7.0.2" + checksum: 10c0/adb1334ca3fe516dc6817aff0a777540b88643ab92fe13a72d0f5d12721ca796ffdd0e5fedb7b45e6e82657156c6ad44f5d5758157f0439532ae7d07b595146b languageName: node linkType: hard @@ -5773,10 +5605,10 @@ __metadata: languageName: node linkType: hard -"detect-newline@npm:^3.1.0": - version: 3.1.0 - resolution: "detect-newline@npm:3.1.0" - checksum: 10c0/c38cfc8eeb9fda09febb44bcd85e467c970d4e3bf526095394e5a4f18bc26dd0cf6b22c69c1fa9969261521c593836db335c2795218f6d781a512aea2fb8209d +"detect-newline@npm:^4.0.1": + version: 4.0.1 + resolution: "detect-newline@npm:4.0.1" + checksum: 10c0/1cc1082e88ad477f30703ae9f23bd3e33816ea2db6a35333057e087d72d466f5a777809b71f560118ecff935d2c712f5b59e1008a8b56a900909d8fd4621c603 languageName: node linkType: hard @@ -5893,16 +5725,6 @@ __metadata: languageName: node linkType: hard -"dotgitignore@npm:^2.1.0": - version: 2.1.0 - resolution: "dotgitignore@npm:2.1.0" - dependencies: - find-up: "npm:^3.0.0" - minimatch: "npm:^3.0.4" - checksum: 10c0/92b7992423428ed80d79e38bbe699fbdff39189f4e7ce3c0d31ef2d8efce1438e6201dff2f8e9ce9b14fea78a90778648e4046ab7832220bc79d13ac85639fef - languageName: node - linkType: hard - "dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": version: 1.0.1 resolution: "dunder-proto@npm:1.0.1" @@ -6720,12 +6542,12 @@ __metadata: languageName: node linkType: hard -"figures@npm:^3.1.0": - version: 3.2.0 - resolution: "figures@npm:3.2.0" +"figures@npm:^6.1.0": + version: 6.1.0 + resolution: "figures@npm:6.1.0" dependencies: - escape-string-regexp: "npm:^1.0.5" - checksum: 10c0/9c421646ede432829a50bc4e55c7a4eb4bcb7cc07b5bab2f471ef1ab9a344595bbebb6c5c21470093fbb730cd81bbca119624c40473a125293f656f49cb47629 + is-unicode-supported: "npm:^2.0.0" + checksum: 10c0/9159df4264d62ef447a3931537de92f5012210cf5135c35c010df50a2169377581378149abfe1eb238bd6acbba1c0d547b1f18e0af6eee49e30363cedaffcfe4 languageName: node linkType: hard @@ -6749,24 +6571,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^2.0.0": - version: 2.1.0 - resolution: "find-up@npm:2.1.0" - dependencies: - locate-path: "npm:^2.0.0" - checksum: 10c0/c080875c9fe28eb1962f35cbe83c683796a0321899f1eed31a37577800055539815de13d53495049697d3ba313013344f843bb9401dd337a1b832be5edfc6840 - languageName: node - linkType: hard - -"find-up@npm:^3.0.0": - version: 3.0.0 - resolution: "find-up@npm:3.0.0" - dependencies: - locate-path: "npm:^3.0.0" - checksum: 10c0/2c2e7d0a26db858e2f624f39038c74739e38306dee42b45f404f770db357947be9d0d587f1cac72d20c114deb38aa57316e879eb0a78b17b46da7dab0a3bd6e3 - languageName: node - linkType: hard - "find-up@npm:^4.0.0, find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" @@ -6830,7 +6634,7 @@ __metadata: languageName: node linkType: hard -"foreground-child@npm:^3.1.0, foreground-child@npm:^3.3.0": +"foreground-child@npm:^3.1.0, foreground-child@npm:^3.3.0, foreground-child@npm:^3.3.1": version: 3.3.1 resolution: "foreground-child@npm:3.3.1" dependencies: @@ -6979,20 +6783,6 @@ __metadata: languageName: node linkType: hard -"get-pkg-repo@npm:^4.0.0": - version: 4.2.1 - resolution: "get-pkg-repo@npm:4.2.1" - dependencies: - "@hutson/parse-repository-url": "npm:^3.0.0" - hosted-git-info: "npm:^4.0.0" - through2: "npm:^2.0.0" - yargs: "npm:^16.2.0" - bin: - get-pkg-repo: src/cli.js - checksum: 10c0/1338d2e048a594da4a34e7dd69d909376d72784f5ba50963a242b4b35db77533786f618b3f6a9effdee2af20af4917a3b7cf12533b4575d7f9c163886be1fb62 - languageName: node - linkType: hard - "get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": version: 1.0.1 resolution: "get-proto@npm:1.0.1" @@ -7014,21 +6804,6 @@ __metadata: languageName: node linkType: hard -"git-raw-commits@npm:^2.0.8": - version: 2.0.11 - resolution: "git-raw-commits@npm:2.0.11" - dependencies: - dargs: "npm:^7.0.0" - lodash: "npm:^4.17.15" - meow: "npm:^8.0.0" - split2: "npm:^3.0.0" - through2: "npm:^4.0.0" - bin: - git-raw-commits: cli.js - checksum: 10c0/c9cee7ce11a6703098f028d7e47986d5d3e4147d66640086734d6ee2472296b8711f91b40ad458e95acac1bc33cf2898059f1dc890f91220ff89c5fcc609ab64 - languageName: node - linkType: hard - "git-raw-commits@npm:^5.0.0": version: 5.0.1 resolution: "git-raw-commits@npm:5.0.1" @@ -7041,37 +6816,6 @@ __metadata: languageName: node linkType: hard -"git-remote-origin-url@npm:^2.0.0": - version: 2.0.0 - resolution: "git-remote-origin-url@npm:2.0.0" - dependencies: - gitconfiglocal: "npm:^1.0.0" - pify: "npm:^2.3.0" - checksum: 10c0/3a846ce98ed36b2d0b801e8ec1ab299a236cfc6fa264bfdf9f42301abfdfd8715c946507fd83a10b9db449eb609ac6f8a2a341daf52e3af0000367487f486355 - languageName: node - linkType: hard - -"git-semver-tags@npm:^4.0.0, git-semver-tags@npm:^4.1.1": - version: 4.1.1 - resolution: "git-semver-tags@npm:4.1.1" - dependencies: - meow: "npm:^8.0.0" - semver: "npm:^6.0.0" - bin: - git-semver-tags: cli.js - checksum: 10c0/cd8c91c666901f8dd6381f4cef2aec32aa3f39e517bd8d8491f9133adf956dde9e0487d510fa0f12042fa474f21a8a88b4aa56db8b473979c7491109c57b7016 - languageName: node - linkType: hard - -"gitconfiglocal@npm:^1.0.0": - version: 1.0.0 - resolution: "gitconfiglocal@npm:1.0.0" - dependencies: - ini: "npm:^1.3.2" - checksum: 10c0/cfcb16344834113199f209f2758ced778dc30e075ddb49b5dde659b4dd2deadee824db0a1b77e1303cb594d9e8b2240da18c67705f657aa76affb444aa349005 - languageName: node - linkType: hard - "github-from-package@npm:0.0.0": version: 0.0.0 resolution: "github-from-package@npm:0.0.0" @@ -7104,6 +6848,22 @@ __metadata: languageName: node linkType: hard +"glob@npm:^11.0.0": + version: 11.1.0 + resolution: "glob@npm:11.1.0" + dependencies: + foreground-child: "npm:^3.3.1" + jackspeak: "npm:^4.1.1" + minimatch: "npm:^10.1.1" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^2.0.0" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/1ceae07f23e316a6fa74581d9a74be6e8c2e590d2f7205034dd5c0435c53f5f7b712c2be00c3b65bf0a49294a1c6f4b98cd84c7637e29453b5aa13b79f1763a2 + languageName: node + linkType: hard + "glob@npm:^13.0.1, glob@npm:^13.0.3, glob@npm:^13.0.6": version: 13.0.6 resolution: "glob@npm:13.0.6" @@ -7162,38 +6922,13 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.6": +"graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 languageName: node linkType: hard -"handlebars@npm:^4.7.7": - version: 4.7.9 - resolution: "handlebars@npm:4.7.9" - dependencies: - minimist: "npm:^1.2.5" - neo-async: "npm:^2.6.2" - source-map: "npm:^0.6.1" - uglify-js: "npm:^3.1.4" - wordwrap: "npm:^1.0.0" - dependenciesMeta: - uglify-js: - optional: true - bin: - handlebars: bin/handlebars - checksum: 10c0/22f8105a7e68e81aff2662bb434edf05f757d21d850731d71cec886d69c10cd33d3c43e34b2892968ec62de8241611851d3d0674c8ef324ea3e01dc66262faa9 - languageName: node - linkType: hard - -"hard-rejection@npm:^2.1.0": - version: 2.1.0 - resolution: "hard-rejection@npm:2.1.0" - checksum: 10c0/febc3343a1ad575aedcc112580835b44a89a89e01f400b4eda6e8110869edfdab0b00cd1bd4c3bfec9475a57e79e0b355aecd5be46454b6a62b9a359af60e564 - languageName: node - linkType: hard - "has-bigints@npm:^1.0.2": version: 1.1.0 resolution: "has-bigints@npm:1.1.0" @@ -7298,22 +7033,6 @@ __metadata: languageName: node linkType: hard -"hosted-git-info@npm:^2.1.4": - version: 2.8.9 - resolution: "hosted-git-info@npm:2.8.9" - checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 - languageName: node - linkType: hard - -"hosted-git-info@npm:^4.0.0, hosted-git-info@npm:^4.0.1": - version: 4.1.0 - resolution: "hosted-git-info@npm:4.1.0" - dependencies: - lru-cache: "npm:^6.0.0" - checksum: 10c0/150fbcb001600336d17fdbae803264abed013548eea7946c2264c49ebe2ebd8c4441ba71dd23dd8e18c65de79d637f98b22d4760ba5fb2e0b15d62543d0fff07 - languageName: node - linkType: hard - "html-encoding-sniffer@npm:^6.0.0": version: 6.0.0 resolution: "html-encoding-sniffer@npm:6.0.0" @@ -7391,7 +7110,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": +"inherits@npm:^2.0.3, inherits@npm:^2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 @@ -7405,7 +7124,7 @@ __metadata: languageName: node linkType: hard -"ini@npm:^1.3.2, ini@npm:^1.3.4, ini@npm:~1.3.0": +"ini@npm:^1.3.4, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a @@ -7490,7 +7209,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.16.1, is-core-module@npm:^2.16.2, is-core-module@npm:^2.5.0": +"is-core-module@npm:^2.16.1, is-core-module@npm:^2.16.2": version: 2.16.2 resolution: "is-core-module@npm:2.16.2" dependencies: @@ -7635,13 +7354,6 @@ __metadata: languageName: node linkType: hard -"is-plain-obj@npm:^1.1.0": - version: 1.1.0 - resolution: "is-plain-obj@npm:1.1.0" - checksum: 10c0/daaee1805add26f781b413fdf192fc91d52409583be30ace35c82607d440da63cc4cac0ac55136716688d6c0a2c6ef3edb2254fecbd1fe06056d6bd15975ee8c - languageName: node - linkType: hard - "is-plain-obj@npm:^4.1.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" @@ -7719,15 +7431,6 @@ __metadata: languageName: node linkType: hard -"is-text-path@npm:^1.0.1": - version: 1.0.1 - resolution: "is-text-path@npm:1.0.1" - dependencies: - text-extensions: "npm:^1.0.0" - checksum: 10c0/61c8650c29548febb6bf69e9541fc11abbbb087a0568df7bc471ba264e95fb254def4e610631cbab4ddb0a1a07949d06416f4ebeaf37875023fb184cdb87ee84 - languageName: node - linkType: hard - "is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": version: 1.1.15 resolution: "is-typed-array@npm:1.1.15" @@ -7744,6 +7447,13 @@ __metadata: languageName: node linkType: hard +"is-unicode-supported@npm:^2.0.0": + version: 2.1.0 + resolution: "is-unicode-supported@npm:2.1.0" + checksum: 10c0/a0f53e9a7c1fdbcf2d2ef6e40d4736fdffff1c9f8944c75e15425118ff3610172c87bf7bc6c34d3903b04be59790bb2212ddbe21ee65b5a97030fc50370545a5 + languageName: node + linkType: hard + "is-weakmap@npm:^2.0.2": version: 2.0.2 resolution: "is-weakmap@npm:2.0.2" @@ -7793,13 +7503,6 @@ __metadata: languageName: node linkType: hard -"isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d - languageName: node - linkType: hard - "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -7915,6 +7618,15 @@ __metadata: languageName: node linkType: hard +"jackspeak@npm:^4.1.1": + version: 4.2.3 + resolution: "jackspeak@npm:4.2.3" + dependencies: + "@isaacs/cliui": "npm:^9.0.0" + checksum: 10c0/b5c0c414f1607c2aa0597f4bf2c03b8443897fccd5fd3c2b3e4f77d556b2bc7c3d3413828ba91e0789f6fb40ad90242f7f89fb20aee9e9d705bc1681f7564f67 + languageName: node + linkType: hard + "jiti@npm:2.6.1": version: 2.6.1 resolution: "jiti@npm:2.6.1" @@ -8044,13 +7756,6 @@ __metadata: languageName: node linkType: hard -"json-parse-better-errors@npm:^1.0.1": - version: 1.0.2 - resolution: "json-parse-better-errors@npm:1.0.2" - checksum: 10c0/2f1287a7c833e397c9ddd361a78638e828fc523038bb3441fd4fc144cfd2c6cd4963ffb9e207e648cf7b692600f1e1e524e965c32df5152120910e4903a47dcb - languageName: node - linkType: hard - "json-parse-even-better-errors@npm:^2.3.0": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" @@ -8079,13 +7784,6 @@ __metadata: languageName: node linkType: hard -"json-stringify-safe@npm:^5.0.1": - version: 5.0.1 - resolution: "json-stringify-safe@npm:5.0.1" - checksum: 10c0/7dbf35cd0411d1d648dceb6d59ce5857ec939e52e4afc37601aa3da611f0987d5cee5b38d58329ceddf3ed48bd7215229c8d52059ab01f2444a338bf24ed0f37 - languageName: node - linkType: hard - "json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" @@ -8133,13 +7831,6 @@ __metadata: languageName: node linkType: hard -"jsonparse@npm:^1.2.0": - version: 1.3.1 - resolution: "jsonparse@npm:1.3.1" - checksum: 10c0/89bc68080cd0a0e276d4b5ab1b79cacd68f562467008d176dc23e16e97d4efec9e21741d92ba5087a8433526a45a7e6a9d5ef25408696c402ca1cfbc01a90bf0 - languageName: node - linkType: hard - "jstransformer@npm:1.0.0": version: 1.0.0 resolution: "jstransformer@npm:1.0.0" @@ -8171,13 +7862,6 @@ __metadata: languageName: node linkType: hard -"kind-of@npm:^6.0.3": - version: 6.0.3 - resolution: "kind-of@npm:6.0.3" - checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 - languageName: node - linkType: hard - "levn@npm:^0.4.1": version: 0.4.1 resolution: "levn@npm:0.4.1" @@ -8315,18 +7999,6 @@ __metadata: languageName: node linkType: hard -"load-json-file@npm:^4.0.0": - version: 4.0.0 - resolution: "load-json-file@npm:4.0.0" - dependencies: - graceful-fs: "npm:^4.1.2" - parse-json: "npm:^4.0.0" - pify: "npm:^3.0.0" - strip-bom: "npm:^3.0.0" - checksum: 10c0/6b48f6a0256bdfcc8970be2c57f68f10acb2ee7e63709b386b2febb6ad3c86198f840889cdbe71d28f741cbaa2f23a7771206b138cd1bdd159564511ca37c1d5 - languageName: node - linkType: hard - "local-pkg@npm:^1.1.2": version: 1.2.1 resolution: "local-pkg@npm:1.2.1" @@ -8338,26 +8010,6 @@ __metadata: languageName: node linkType: hard -"locate-path@npm:^2.0.0": - version: 2.0.0 - resolution: "locate-path@npm:2.0.0" - dependencies: - p-locate: "npm:^2.0.0" - path-exists: "npm:^3.0.0" - checksum: 10c0/24efa0e589be6aa3c469b502f795126b26ab97afa378846cb508174211515633b770aa0ba610cab113caedab8d2a4902b061a08aaed5297c12ab6f5be4df0133 - languageName: node - linkType: hard - -"locate-path@npm:^3.0.0": - version: 3.0.0 - resolution: "locate-path@npm:3.0.0" - dependencies: - p-locate: "npm:^3.0.0" - path-exists: "npm:^3.0.0" - checksum: 10c0/3db394b7829a7fe2f4fbdd25d3c4689b85f003c318c5da4052c7e56eed697da8f1bce5294f685c69ff76e32cba7a33629d94396976f6d05fb7f4c755c5e2ae8b - languageName: node - linkType: hard - "locate-path@npm:^5.0.0": version: 5.0.0 resolution: "locate-path@npm:5.0.0" @@ -8390,13 +8042,6 @@ __metadata: languageName: node linkType: hard -"lodash.ismatch@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.ismatch@npm:4.4.0" - checksum: 10c0/8f96a5dc4b8d3fc5a033dcb259d0c3148a1044fa4d02b4a0e8dce0fa1f2ef3ec4ac131e20b5cb2c985a4e9bcb1c37c0aa5af2cef70094959389617347b8fc645 - languageName: node - linkType: hard - "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -8404,13 +8049,6 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.15": - version: 4.18.1 - resolution: "lodash@npm:4.18.1" - checksum: 10c0/757228fc68805c59789e82185135cf85f05d0b2d3d54631d680ca79ec21944ec8314d4533639a14b8bcfbd97a517e78960933041a5af17ecb693ec6eecb99a27 - languageName: node - linkType: hard - "loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -8461,15 +8099,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 - languageName: node - linkType: hard - "lru-cache@npm:^8.0.3": version: 8.0.5 resolution: "lru-cache@npm:8.0.5" @@ -8540,20 +8169,6 @@ __metadata: languageName: node linkType: hard -"map-obj@npm:^1.0.0": - version: 1.0.1 - resolution: "map-obj@npm:1.0.1" - checksum: 10c0/ccca88395e7d38671ed9f5652ecf471ecd546924be2fb900836b9da35e068a96687d96a5f93dcdfa94d9a27d649d2f10a84595590f89a347fb4dda47629dcc52 - languageName: node - linkType: hard - -"map-obj@npm:^4.0.0": - version: 4.3.0 - resolution: "map-obj@npm:4.3.0" - checksum: 10c0/1c19e1c88513c8abdab25c316367154c6a0a6a0f77e3e8c391bb7c0e093aefed293f539d026dc013d86219e5e4c25f23b0003ea588be2101ccd757bacc12d43b - languageName: node - linkType: hard - "math-intrinsics@npm:^1.1.0": version: 1.1.0 resolution: "math-intrinsics@npm:1.1.0" @@ -8589,25 +8204,6 @@ __metadata: languageName: node linkType: hard -"meow@npm:^8.0.0": - version: 8.1.2 - resolution: "meow@npm:8.1.2" - dependencies: - "@types/minimist": "npm:^1.2.0" - camelcase-keys: "npm:^6.2.2" - decamelize-keys: "npm:^1.1.0" - hard-rejection: "npm:^2.1.0" - minimist-options: "npm:4.1.0" - normalize-package-data: "npm:^3.0.0" - read-pkg-up: "npm:^7.0.1" - redent: "npm:^3.0.0" - trim-newlines: "npm:^3.0.0" - type-fest: "npm:^0.18.0" - yargs-parser: "npm:^20.2.3" - checksum: 10c0/9a8d90e616f783650728a90f4ea1e5f763c1c5260369e6596b52430f877f4af8ecbaa8c9d952c93bbefd6d5bda4caed6a96a20ba7d27b511d2971909b01922a2 - languageName: node - linkType: hard - "mimic-response@npm:^3.1.0": version: 3.1.0 resolution: "mimic-response@npm:3.1.0" @@ -8622,7 +8218,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^10.2.2": +"minimatch@npm:^10.1.1, minimatch@npm:^10.2.2": version: 10.2.5 resolution: "minimatch@npm:10.2.5" dependencies: @@ -8631,7 +8227,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.1.2, minimatch@npm:^3.1.5": +"minimatch@npm:^3.1.2, minimatch@npm:^3.1.5": version: 3.1.5 resolution: "minimatch@npm:3.1.5" dependencies: @@ -8649,18 +8245,7 @@ __metadata: languageName: node linkType: hard -"minimist-options@npm:4.1.0": - version: 4.1.0 - resolution: "minimist-options@npm:4.1.0" - dependencies: - arrify: "npm:^1.0.1" - is-plain-obj: "npm:^1.1.0" - kind-of: "npm:^6.0.3" - checksum: 10c0/7871f9cdd15d1e7374e5b013e2ceda3d327a06a8c7b38ae16d9ef941e07d985e952c589e57213f7aa90a8744c60aed9524c0d85e501f5478382d9181f2763f54 - languageName: node - linkType: hard - -"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": +"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 @@ -8702,13 +8287,6 @@ __metadata: languageName: node linkType: hard -"modify-values@npm:^1.0.0": - version: 1.0.1 - resolution: "modify-values@npm:1.0.1" - checksum: 10c0/6acb1b82aaf7a02f9f7b554b20cbfc159f223a79c66b0a257511c5933d50b85e12ea1220b0a90a2af6f80bc29ff784f929a52a51881867a93ae6a12ce87a729a - languageName: node - linkType: hard - "mrmime@npm:^2.0.0": version: 2.0.1 resolution: "mrmime@npm:2.0.1" @@ -8753,13 +8331,6 @@ __metadata: languageName: node linkType: hard -"neo-async@npm:^2.6.2": - version: 2.6.2 - resolution: "neo-async@npm:2.6.2" - checksum: 10c0/c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d - languageName: node - linkType: hard - "no-case@npm:^3.0.4": version: 3.0.4 resolution: "no-case@npm:3.0.4" @@ -8858,30 +8429,6 @@ __metadata: languageName: node linkType: hard -"normalize-package-data@npm:^2.3.2, normalize-package-data@npm:^2.5.0": - version: 2.5.0 - resolution: "normalize-package-data@npm:2.5.0" - dependencies: - hosted-git-info: "npm:^2.1.4" - resolve: "npm:^1.10.0" - semver: "npm:2 || 3 || 4 || 5" - validate-npm-package-license: "npm:^3.0.1" - checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 - languageName: node - linkType: hard - -"normalize-package-data@npm:^3.0.0": - version: 3.0.3 - resolution: "normalize-package-data@npm:3.0.3" - dependencies: - hosted-git-info: "npm:^4.0.1" - is-core-module: "npm:^2.5.0" - semver: "npm:^7.3.4" - validate-npm-package-license: "npm:^3.0.1" - checksum: 10c0/e5d0f739ba2c465d41f77c9d950e291ea4af78f8816ddb91c5da62257c40b76d8c83278b0d08ffbcd0f187636ebddad20e181e924873916d03e6e5ea2ef026be - languageName: node - linkType: hard - "nth-check@npm:^2.0.1, nth-check@npm:^2.1.1": version: 2.1.1 resolution: "nth-check@npm:2.1.1" @@ -8891,6 +8438,24 @@ __metadata: languageName: node linkType: hard +"nunjucks@npm:^3.2.4": + version: 3.2.4 + resolution: "nunjucks@npm:3.2.4" + dependencies: + a-sync-waterfall: "npm:^1.0.0" + asap: "npm:^2.0.3" + commander: "npm:^5.1.0" + peerDependencies: + chokidar: ^3.3.0 + peerDependenciesMeta: + chokidar: + optional: true + bin: + nunjucks-precompile: bin/precompile + checksum: 10c0/7fe5197559b7c09972c79e2a86f9c093459b9075bc9b41134cd2bc599ae93567b53bd09d472a748edc736192d9ccd2998aa8c20cfcbe6a3fffd281f91897c888 + languageName: node + linkType: hard + "nyc@npm:^18.0.0": version: 18.0.0 resolution: "nyc@npm:18.0.0" @@ -9209,16 +8774,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^1.1.0": - version: 1.3.0 - resolution: "p-limit@npm:1.3.0" - dependencies: - p-try: "npm:^1.0.0" - checksum: 10c0/5c1b1d53d180b2c7501efb04b7c817448e10efe1ba46f4783f8951994d5027e4cd88f36ad79af50546682594c4ebd11702ac4b9364c47f8074890e2acad0edee - languageName: node - linkType: hard - -"p-limit@npm:^2.0.0, p-limit@npm:^2.2.0": +"p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" dependencies: @@ -9236,24 +8792,6 @@ __metadata: languageName: node linkType: hard -"p-locate@npm:^2.0.0": - version: 2.0.0 - resolution: "p-locate@npm:2.0.0" - dependencies: - p-limit: "npm:^1.1.0" - checksum: 10c0/82da4be88fb02fd29175e66021610c881938d3cc97c813c71c1a605fac05617d57fd5d3b337494a6106c0edb2a37c860241430851411f1b265108cead34aee67 - languageName: node - linkType: hard - -"p-locate@npm:^3.0.0": - version: 3.0.0 - resolution: "p-locate@npm:3.0.0" - dependencies: - p-limit: "npm:^2.0.0" - checksum: 10c0/7b7f06f718f19e989ce6280ed4396fb3c34dabdee0df948376483032f9d5ec22fdf7077ec942143a75827bb85b11da72016497fc10dac1106c837ed593969ee8 - languageName: node - linkType: hard - "p-locate@npm:^4.1.0": version: 4.1.0 resolution: "p-locate@npm:4.1.0" @@ -9281,13 +8819,6 @@ __metadata: languageName: node linkType: hard -"p-try@npm:^1.0.0": - version: 1.0.0 - resolution: "p-try@npm:1.0.0" - checksum: 10c0/757ba31de5819502b80c447826fac8be5f16d3cb4fbf9bc8bc4971dba0682e84ac33e4b24176ca7058c69e29f64f34d8d9e9b08e873b7b7bb0aa89d620fa224a - languageName: node - linkType: hard - "p-try@npm:^2.0.0": version: 2.2.0 resolution: "p-try@npm:2.2.0" @@ -9323,17 +8854,7 @@ __metadata: languageName: node linkType: hard -"parse-json@npm:^4.0.0": - version: 4.0.0 - resolution: "parse-json@npm:4.0.0" - dependencies: - error-ex: "npm:^1.3.1" - json-parse-better-errors: "npm:^1.0.1" - checksum: 10c0/8d80790b772ccb1bcea4e09e2697555e519d83d04a77c2b4237389b813f82898943a93ffff7d0d2406203bdd0c30dcf95b1661e3a53f83d0e417f053957bef32 - languageName: node - linkType: hard - -"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": +"parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" dependencies: @@ -9361,13 +8882,6 @@ __metadata: languageName: node linkType: hard -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 10c0/17d6a5664bc0a11d48e2b2127d28a0e58822c6740bde30403f08013da599182289c56518bec89407e3f31d3c2b6b296a4220bc3f867f0911fee6952208b04167 - languageName: node - linkType: hard - "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -9399,7 +8913,7 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^2.0.2": +"path-scurry@npm:^2.0.0, path-scurry@npm:^2.0.2": version: 2.0.2 resolution: "path-scurry@npm:2.0.2" dependencies: @@ -9409,15 +8923,6 @@ __metadata: languageName: node linkType: hard -"path-type@npm:^3.0.0": - version: 3.0.0 - resolution: "path-type@npm:3.0.0" - dependencies: - pify: "npm:^3.0.0" - checksum: 10c0/1332c632f1cac15790ebab8dd729b67ba04fc96f81647496feb1c2975d862d046f41e4b975dbd893048999b2cc90721f72924ad820acc58c78507ba7141a8e56 - languageName: node - linkType: hard - "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -9467,20 +8972,6 @@ __metadata: languageName: node linkType: hard -"pify@npm:^2.3.0": - version: 2.3.0 - resolution: "pify@npm:2.3.0" - checksum: 10c0/551ff8ab830b1052633f59cb8adc9ae8407a436e06b4a9718bcb27dc5844b83d535c3a8512b388b6062af65a98c49bdc0dd523d8b2617b188f7c8fee457158dc - languageName: node - linkType: hard - -"pify@npm:^3.0.0": - version: 3.0.0 - resolution: "pify@npm:3.0.0" - checksum: 10c0/fead19ed9d801f1b1fcd0638a1ac53eabbb0945bf615f2f8806a8b646565a04a1b0e7ef115c951d225f042cca388fdc1cd3add46d10d1ed6951c20bd2998af10 - languageName: node - linkType: hard - "pkg-dir@npm:^4.1.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" @@ -9618,13 +9109,6 @@ __metadata: languageName: node linkType: hard -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 - languageName: node - linkType: hard - "process-on-spawn@npm:^1.0.0": version: 1.1.0 resolution: "process-on-spawn@npm:1.1.0" @@ -9805,13 +9289,6 @@ __metadata: languageName: node linkType: hard -"q@npm:^1.5.1": - version: 1.5.1 - resolution: "q@npm:1.5.1" - checksum: 10c0/7855fbdba126cb7e92ef3a16b47ba998c0786ec7fface236e3eb0135b65df36429d91a86b1fff3ab0927b4ac4ee88a2c44527c7c3b8e2a37efbec9fe34803df4 - languageName: node - linkType: hard - "quansync@npm:^0.2.11": version: 0.2.11 resolution: "quansync@npm:0.2.11" @@ -9819,13 +9296,6 @@ __metadata: languageName: node linkType: hard -"quick-lru@npm:^4.0.1": - version: 4.0.1 - resolution: "quick-lru@npm:4.0.1" - checksum: 10c0/f9b1596fa7595a35c2f9d913ac312fede13d37dc8a747a51557ab36e11ce113bbe88ef4c0154968845559a7709cb6a7e7cbe75f7972182451cd45e7f057a334d - languageName: node - linkType: hard - "rc@npm:^1.2.7": version: 1.2.8 resolution: "rc@npm:1.2.8" @@ -9945,51 +9415,7 @@ __metadata: languageName: node linkType: hard -"read-pkg-up@npm:^3.0.0": - version: 3.0.0 - resolution: "read-pkg-up@npm:3.0.0" - dependencies: - find-up: "npm:^2.0.0" - read-pkg: "npm:^3.0.0" - checksum: 10c0/2cd0a180260b0d235990e6e9c8c2330a03882d36bc2eba8930e437ef23ee52a68a894e7e1ccb1c33f03bcceb270a861ee5f7eac686f238857755e2cddfb48ffd - languageName: node - linkType: hard - -"read-pkg-up@npm:^7.0.1": - version: 7.0.1 - resolution: "read-pkg-up@npm:7.0.1" - dependencies: - find-up: "npm:^4.1.0" - read-pkg: "npm:^5.2.0" - type-fest: "npm:^0.8.1" - checksum: 10c0/82b3ac9fd7c6ca1bdc1d7253eb1091a98ff3d195ee0a45386582ce3e69f90266163c34121e6a0a02f1630073a6c0585f7880b3865efcae9c452fa667f02ca385 - languageName: node - linkType: hard - -"read-pkg@npm:^3.0.0": - version: 3.0.0 - resolution: "read-pkg@npm:3.0.0" - dependencies: - load-json-file: "npm:^4.0.0" - normalize-package-data: "npm:^2.3.2" - path-type: "npm:^3.0.0" - checksum: 10c0/65acf2df89fbcd506b48b7ced56a255ba00adf7ecaa2db759c86cc58212f6fd80f1f0b7a85c848551a5d0685232e9b64f45c1fd5b48d85df2761a160767eeb93 - languageName: node - linkType: hard - -"read-pkg@npm:^5.2.0": - version: 5.2.0 - resolution: "read-pkg@npm:5.2.0" - dependencies: - "@types/normalize-package-data": "npm:^2.4.0" - normalize-package-data: "npm:^2.5.0" - parse-json: "npm:^5.0.0" - type-fest: "npm:^0.6.0" - checksum: 10c0/b51a17d4b51418e777029e3a7694c9bd6c578a5ab99db544764a0b0f2c7c0f58f8a6bc101f86a6fceb8ba6d237d67c89acf6170f6b98695d0420ddc86cf109fb - languageName: node - linkType: hard - -"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.2, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0": +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -10000,21 +9426,6 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:~2.3.6": - version: 2.3.8 - resolution: "readable-stream@npm:2.3.8" - dependencies: - core-util-is: "npm:~1.0.0" - inherits: "npm:~2.0.3" - isarray: "npm:~1.0.0" - process-nextick-args: "npm:~2.0.0" - safe-buffer: "npm:~5.1.1" - string_decoder: "npm:~1.1.1" - util-deprecate: "npm:~1.0.1" - checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa - languageName: node - linkType: hard - "readdirp@npm:^5.0.0": version: 5.0.0 resolution: "readdirp@npm:5.0.0" @@ -10133,7 +9544,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.10.0, resolve@npm:^1.15.1, resolve@npm:^1.22.1, resolve@npm:^1.22.8": +"resolve@npm:^1.15.1, resolve@npm:^1.22.1, resolve@npm:^1.22.8": version: 1.22.12 resolution: "resolve@npm:1.22.12" dependencies: @@ -10163,7 +9574,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.15.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": +"resolve@patch:resolve@npm%3A^1.15.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": version: 1.22.12 resolution: "resolve@patch:resolve@npm%3A1.22.12#optional!builtin::version=1.22.12&hash=c3c19d" dependencies: @@ -10290,13 +9701,6 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 - languageName: node - linkType: hard - "safe-push-apply@npm:^1.0.0": version: 1.0.0 resolution: "safe-push-apply@npm:1.0.0" @@ -10374,15 +9778,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:2 || 3 || 4 || 5": - version: 5.7.2 - resolution: "semver@npm:5.7.2" - bin: - semver: bin/semver - checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 - languageName: node - linkType: hard - "semver@npm:^6.0.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -10392,7 +9787,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2, semver@npm:^7.6.3, semver@npm:^7.7.3": +"semver@npm:^7.3.5, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2, semver@npm:^7.6.3, semver@npm:^7.7.3, semver@npm:^7.7.4": version: 7.8.5 resolution: "semver@npm:7.8.5" bin: @@ -10598,58 +9993,6 @@ __metadata: languageName: node linkType: hard -"spdx-correct@npm:^3.0.0": - version: 3.2.0 - resolution: "spdx-correct@npm:3.2.0" - dependencies: - spdx-expression-parse: "npm:^3.0.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 - languageName: node - linkType: hard - -"spdx-exceptions@npm:^2.1.0": - version: 2.5.0 - resolution: "spdx-exceptions@npm:2.5.0" - checksum: 10c0/37217b7762ee0ea0d8b7d0c29fd48b7e4dfb94096b109d6255b589c561f57da93bf4e328c0290046115961b9209a8051ad9f525e48d433082fc79f496a4ea940 - languageName: node - linkType: hard - -"spdx-expression-parse@npm:^3.0.0": - version: 3.0.1 - resolution: "spdx-expression-parse@npm:3.0.1" - dependencies: - spdx-exceptions: "npm:^2.1.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 - languageName: node - linkType: hard - -"spdx-license-ids@npm:^3.0.0": - version: 3.0.23 - resolution: "spdx-license-ids@npm:3.0.23" - checksum: 10c0/8495620f6f2a237749cce922ea2d593a66f7885c301b1a0f5542183e7041182f27f616a8f13345cefdea0c9b3e0899328e0aa8cec100cf4f3fac4bb3bd975515 - languageName: node - linkType: hard - -"split2@npm:^3.0.0": - version: 3.2.2 - resolution: "split2@npm:3.2.2" - dependencies: - readable-stream: "npm:^3.0.0" - checksum: 10c0/2dad5603c52b353939befa3e2f108f6e3aff42b204ad0f5f16dd12fd7c2beab48d117184ce6f7c8854f9ee5ffec6faae70d243711dd7d143a9f635b4a285de4e - languageName: node - linkType: hard - -"split@npm:^1.0.0": - version: 1.0.1 - resolution: "split@npm:1.0.1" - dependencies: - through: "npm:2" - checksum: 10c0/7f489e7ed5ff8a2e43295f30a5197ffcb2d6202c9cf99357f9690d645b19c812bccf0be3ff336fea5054cda17ac96b91d67147d95dbfc31fbb5804c61962af85 - languageName: node - linkType: hard - "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -10664,30 +10007,6 @@ __metadata: languageName: node linkType: hard -"standard-version@npm:^9.5.0": - version: 9.5.0 - resolution: "standard-version@npm:9.5.0" - dependencies: - chalk: "npm:^2.4.2" - conventional-changelog: "npm:3.1.25" - conventional-changelog-config-spec: "npm:2.1.0" - conventional-changelog-conventionalcommits: "npm:4.6.3" - conventional-recommended-bump: "npm:6.1.0" - detect-indent: "npm:^6.0.0" - detect-newline: "npm:^3.1.0" - dotgitignore: "npm:^2.1.0" - figures: "npm:^3.1.0" - find-up: "npm:^5.0.0" - git-semver-tags: "npm:^4.0.0" - semver: "npm:^7.1.1" - stringify-package: "npm:^1.0.1" - yargs: "npm:^16.0.0" - bin: - standard-version: bin/cli.js - checksum: 10c0/22aab8f4768b3d1126dae8cc74131119de140e760e7cb67b7278ae192d700fe51ffc153691de1dd1c6e1589f9828d052981684e7b9b6b9b8a30e5681e624dbc5 - languageName: node - linkType: hard - "std-env@npm:^4.0.0-rc.1": version: 4.1.0 resolution: "std-env@npm:4.1.0" @@ -10741,7 +10060,7 @@ __metadata: languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -10853,22 +10172,6 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" - dependencies: - safe-buffer: "npm:~5.1.0" - checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e - languageName: node - linkType: hard - -"stringify-package@npm:^1.0.1": - version: 1.0.1 - resolution: "stringify-package@npm:1.0.1" - checksum: 10c0/d531d27f29f31680d0d80ae7d4f4515b2a5988550f40f5f73bfc812f89c5fd2ea91a2ceb2361d04b03cfd8b49ee5715191fab252eea3618eee0b6c6ad9d882c8 - languageName: node - linkType: hard - "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -11043,39 +10346,6 @@ __metadata: languageName: node linkType: hard -"text-extensions@npm:^1.0.0": - version: 1.9.0 - resolution: "text-extensions@npm:1.9.0" - checksum: 10c0/9ad5a9f723a871e2d884e132d7e93f281c60b5759c95f3f6b04704856548715d93a36c10dbaf5f12b91bf405f0cf3893bf169d4d143c0f5509563b992d385443 - languageName: node - linkType: hard - -"through2@npm:^2.0.0": - version: 2.0.5 - resolution: "through2@npm:2.0.5" - dependencies: - readable-stream: "npm:~2.3.6" - xtend: "npm:~4.0.1" - checksum: 10c0/cbfe5b57943fa12b4f8c043658c2a00476216d79c014895cef1ac7a1d9a8b31f6b438d0e53eecbb81054b93128324a82ecd59ec1a4f91f01f7ac113dcb14eade - languageName: node - linkType: hard - -"through2@npm:^4.0.0": - version: 4.0.2 - resolution: "through2@npm:4.0.2" - dependencies: - readable-stream: "npm:3" - checksum: 10c0/3741564ae99990a4a79097fe7a4152c22348adc4faf2df9199a07a66c81ed2011da39f631e479fdc56483996a9d34a037ad64e76d79f18c782ab178ea9b6778c - languageName: node - linkType: hard - -"through@npm:2, through@npm:>=2.2.7 <3": - version: 2.3.8 - resolution: "through@npm:2.3.8" - checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc - languageName: node - linkType: hard - "tiny-invariant@npm:^1.3.3": version: 1.3.3 resolution: "tiny-invariant@npm:1.3.3" @@ -11185,13 +10455,6 @@ __metadata: languageName: node linkType: hard -"trim-newlines@npm:^3.0.0": - version: 3.0.1 - resolution: "trim-newlines@npm:3.0.1" - checksum: 10c0/03cfefde6c59ff57138412b8c6be922ecc5aec30694d784f2a65ef8dcbd47faef580b7de0c949345abdc56ec4b4abf64dd1e5aea619b200316e471a3dd5bf1f6 - languageName: node - linkType: hard - "ts-api-utils@npm:^2.5.0": version: 2.5.0 resolution: "ts-api-utils@npm:2.5.0" @@ -11301,21 +10564,7 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.18.0": - version: 0.18.1 - resolution: "type-fest@npm:0.18.1" - checksum: 10c0/303f5ecf40d03e1d5b635ce7660de3b33c18ed8ebc65d64920c02974d9e684c72483c23f9084587e9dd6466a2ece1da42ddc95b412a461794dd30baca95e2bac - languageName: node - linkType: hard - -"type-fest@npm:^0.6.0": - version: 0.6.0 - resolution: "type-fest@npm:0.6.0" - checksum: 10c0/0c585c26416fce9ecb5691873a1301b5aff54673c7999b6f925691ed01f5b9232db408cdbb0bd003d19f5ae284322523f44092d1f81ca0a48f11f7cf0be8cd38 - languageName: node - linkType: hard - -"type-fest@npm:^0.8.0, type-fest@npm:^0.8.1": +"type-fest@npm:^0.8.0": version: 0.8.1 resolution: "type-fest@npm:0.8.1" checksum: 10c0/dffbb99329da2aa840f506d376c863bd55f5636f4741ad6e65e82f5ce47e6914108f44f340a0b74009b0cb5d09d6752ae83203e53e98b1192cf80ecee5651636 @@ -11393,13 +10642,6 @@ __metadata: languageName: node linkType: hard -"typedarray@npm:^0.0.6": - version: 0.0.6 - resolution: "typedarray@npm:0.0.6" - checksum: 10c0/6005cb31df50eef8b1f3c780eb71a17925f3038a100d82f9406ac2ad1de5eb59f8e6decbdc145b3a1f8e5836e17b0c0002fb698b9fe2516b8f9f9ff602d36412 - languageName: node - linkType: hard - "typescript-auto-import-cache@npm:^0.3.5": version: 0.3.6 resolution: "typescript-auto-import-cache@npm:0.3.6" @@ -11451,15 +10693,6 @@ __metadata: languageName: node linkType: hard -"uglify-js@npm:^3.1.4": - version: 3.19.3 - resolution: "uglify-js@npm:3.19.3" - bin: - uglifyjs: bin/uglifyjs - checksum: 10c0/83b0a90eca35f778e07cad9622b80c448b6aad457c9ff8e568afed978212b42930a95f9e1be943a1ffa4258a3340fbb899f41461131c05bb1d0a9c303aed8479 - languageName: node - linkType: hard - "unbox-primitive@npm:^1.1.0": version: 1.1.0 resolution: "unbox-primitive@npm:1.1.0" @@ -11594,7 +10827,7 @@ __metadata: languageName: node linkType: hard -"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": +"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 @@ -11617,16 +10850,6 @@ __metadata: languageName: node linkType: hard -"validate-npm-package-license@npm:^3.0.1": - version: 3.0.4 - resolution: "validate-npm-package-license@npm:3.0.4" - dependencies: - spdx-correct: "npm:^3.0.0" - spdx-expression-parse: "npm:^3.0.0" - checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f - languageName: node - linkType: hard - "vite-plugin-svgr@npm:^5.2.0": version: 5.2.0 resolution: "vite-plugin-svgr@npm:5.2.0" @@ -12346,13 +11569,6 @@ __metadata: languageName: node linkType: hard -"wordwrap@npm:^1.0.0": - version: 1.0.0 - resolution: "wordwrap@npm:1.0.0" - checksum: 10c0/7ed2e44f3c33c5c3e3771134d2b0aee4314c9e49c749e37f464bf69f2bcdf0cbf9419ca638098e2717cff4875c47f56a007532f6111c3319f557a2ca91278e92 - languageName: node - linkType: hard - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" @@ -12461,13 +11677,6 @@ __metadata: languageName: node linkType: hard -"xtend@npm:~4.0.1": - version: 4.0.2 - resolution: "xtend@npm:4.0.2" - checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e - languageName: node - linkType: hard - "y18n@npm:^4.0.0": version: 4.0.3 resolution: "y18n@npm:4.0.3" @@ -12489,13 +11698,6 @@ __metadata: languageName: node linkType: hard -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a - languageName: node - linkType: hard - "yallist@npm:^5.0.0": version: 5.0.0 resolution: "yallist@npm:5.0.0" @@ -12522,10 +11724,10 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": - version: 20.2.9 - resolution: "yargs-parser@npm:20.2.9" - checksum: 10c0/0685a8e58bbfb57fab6aefe03c6da904a59769bd803a722bb098bd5b0f29d274a1357762c7258fb487512811b8063fb5d2824a3415a0a4540598335b3b086c72 +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 languageName: node linkType: hard @@ -12555,18 +11757,18 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^16.0.0, yargs@npm:^16.2.0": - version: 16.2.2 - resolution: "yargs@npm:16.2.2" +"yargs@npm:^17.7.2": + version: 17.7.3 + resolution: "yargs@npm:17.7.3" dependencies: - cliui: "npm:^7.0.2" + cliui: "npm:^8.0.1" escalade: "npm:^3.1.1" get-caller-file: "npm:^2.0.5" require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.0" + string-width: "npm:^4.2.3" y18n: "npm:^5.0.5" - yargs-parser: "npm:^20.2.2" - checksum: 10c0/1ca2152581ee7c9c9fb4174767ff7294b1c272d2d0a1f6eb13c39ce177fded85eb9c96711e00cd7913c0a9b88b6e763713ee11cae81b9b62fd97bdd0b03d5549 + yargs-parser: "npm:^21.1.1" + checksum: 10c0/7a28572f7e785a57886e34fdbddb9b28756dec552e1453d5f6e7cdd00ad8721a4e8c4321d33683f5e61cacb36ad43258adbb48396b71ec4ed14abee0fc0d0c1f languageName: node linkType: hard From 04f4828e9e4b5610877a3a37b28312a517a2d60f Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Mon, 29 Jun 2026 16:32:47 +0400 Subject: [PATCH 47/54] ci: Release pipeline was added --- .github/actions/setup-env/action.yml | 8 ++- .github/workflows/release.yml | 98 ++++++++++++++++++++++++++++ .github/workflows/tests.yml | 65 ++++++++++++++---- m3-foundation/package.json | 6 ++ m3-react/package.json | 9 ++- m3-vue/package.json | 9 ++- package.json | 7 ++ 7 files changed, 184 insertions(+), 18 deletions(-) create mode 100644 .github/workflows/release.yml diff --git a/.github/actions/setup-env/action.yml b/.github/actions/setup-env/action.yml index b20f5c9..58c4e75 100644 --- a/.github/actions/setup-env/action.yml +++ b/.github/actions/setup-env/action.yml @@ -10,7 +10,7 @@ runs: using: composite steps: - name: Use Node.js ${{ inputs.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ inputs.node-version }} @@ -19,7 +19,7 @@ runs: run: make .yarnrc.yml - name: Cache dependencies - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: .yarn key: ${{ runner.OS }}-node-${{ inputs.node-version }}-yarn-${{ hashFiles('**/yarn.lock') }} @@ -29,3 +29,7 @@ runs: - name: Install dependencies shell: bash run: yarn install + + - name: Fix PATH for workspace bins + shell: bash + run: echo "${{ github.workspace }}/node_modules/.bin" >> "$GITHUB_PATH" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..acd7979 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,98 @@ +name: Release + +on: + workflow_dispatch: + inputs: + prerelease: + type: choice + options: + - 'alpha' + - 'beta' + - 'rc' + - 'none' + description: Prerelease type + default: 'none' + +permissions: + contents: write + +jobs: + release: + runs-on: ubuntu-latest + timeout-minutes: 90 + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Node and dependencies + uses: ./.github/actions/setup-env + with: + node-version: '24.x' + + - name: Configure Git + run: | + git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + + - name: Run package type checks + run: yarn tsc + + - name: Run test type checks + run: yarn tsc:tests + + - name: Run e2e config type checks + run: yarn tsc:e2e + + - name: Run eslint + run: yarn eslint + + - name: Run tests + run: yarn test + + - name: Install Playwright Chromium + run: yarn playwright install --with-deps chromium + + - name: Run e2e tests + run: yarn test:e2e + + - name: Build packages + run: yarn build + + - name: Build React Storybook + run: yarn workspace @modulify/m3-react storybook:build --test --quiet + + - name: Build Vue Storybook + run: yarn workspace @modulify/m3-vue storybook:build --test --quiet + + - name: Run release [${{ inputs.prerelease }}] + if: ${{ inputs.prerelease != 'none' }} + env: + YARN_ENABLE_IMMUTABLE_INSTALLS: false + run: yarn release:${{ inputs.prerelease }} + + - name: Ensure stable release is running from main + if: ${{ inputs.prerelease == 'none' }} + run: | + if [ "${{ github.ref_name }}" != "main" ]; then + echo "Stable release is allowed only from main. Current ref: ${{ github.ref_name }}" + exit 1 + fi + + - name: Run release + if: ${{ inputs.prerelease == 'none' }} + env: + YARN_ENABLE_IMMUTABLE_INSTALLS: false + run: yarn release + + - name: Push current branch with tags + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: git push --follow-tags origin HEAD:${{ github.ref_name }} + + - name: Publish packages to npm + env: + YARN_NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: yarn publish:packages diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 066403a..18fc754 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -51,18 +51,29 @@ jobs: echo "has_open_pr=false" >> "$GITHUB_OUTPUT" fi - eslint: + workflow-lint: needs: pr-check if: github.event_name != 'push' || github.ref == 'refs/heads/main' || needs.pr-check.outputs.has_open_pr != 'true' runs-on: ubuntu-latest + steps: + - name: Using branch ${{ github.ref }} for repository ${{ github.repository }}. + uses: actions/checkout@v6 + + - name: Run actionlint + uses: devops-actions/actionlint@v0.1.10 + + eslint: + needs: workflow-lint + runs-on: ubuntu-latest + strategy: matrix: node-version: [ 22.x, 24.x ] steps: - name: Using branch ${{ github.ref }} for repository ${{ github.repository }}. - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Node and dependencies uses: ./.github/actions/setup-env @@ -72,11 +83,36 @@ jobs: - name: Run eslint run: yarn eslint - tests: + build: needs: eslint + runs-on: ubuntu-latest - timeout-minutes: 90 + strategy: + matrix: + node-version: [ 22.x, 24.x ] + + steps: + - name: Using branch ${{ github.ref }} for repository ${{ github.repository }}. + uses: actions/checkout@v6 + - name: Setup Node and dependencies + uses: ./.github/actions/setup-env + with: + node-version: ${{ matrix.node-version }} + + - name: Run package type checks + run: yarn tsc + + - name: Run e2e config type checks + if: matrix.node-version == '24.x' + run: yarn tsc:e2e + + - name: Build packages + run: yarn build + + tests: + needs: build + timeout-minutes: 90 runs-on: ubuntu-latest strategy: @@ -85,7 +121,7 @@ jobs: steps: - name: Using branch ${{ github.ref }} for repository ${{ github.repository }}. - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Node and dependencies uses: ./.github/actions/setup-env @@ -104,6 +140,10 @@ jobs: if: matrix.node-version == '24.x' run: yarn playwright install --with-deps chromium + - name: Run e2e tests + if: matrix.node-version == '24.x' + run: yarn test:e2e + - name: Run merged coverage if: matrix.node-version == '24.x' run: | @@ -121,7 +161,7 @@ jobs: - name: Upload Playwright/Vitest artifacts on failure if: failure() && matrix.node-version == '24.x' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: playwright-vitest-artifacts-node-24 path: artifacts @@ -129,7 +169,7 @@ jobs: - name: Upload merged coverage artifacts if: matrix.node-version == '24.x' && github.event_name == 'push' && github.ref == 'refs/heads/main' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: coverage-node-24 path: | @@ -140,15 +180,14 @@ jobs: codecov: if: github.event_name == 'push' && github.ref == 'refs/heads/main' needs: tests - runs-on: ubuntu-latest steps: - name: Using branch ${{ github.ref }} for repository ${{ github.repository }}. - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Download merged coverage artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: coverage-node-24 path: coverage @@ -164,10 +203,8 @@ jobs: verbose: true storybook-tests: - needs: eslint - + needs: build timeout-minutes: 60 - runs-on: ubuntu-latest strategy: @@ -176,7 +213,7 @@ jobs: steps: - name: Using branch ${{ github.ref }} for repository ${{ github.repository }}. - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Node and dependencies uses: ./.github/actions/setup-env diff --git a/m3-foundation/package.json b/m3-foundation/package.json index 8f6e20e..e756ff9 100644 --- a/m3-foundation/package.json +++ b/m3-foundation/package.json @@ -11,6 +11,12 @@ "scaffolding", "styles" ], + "files": [ + "assets", + "index.d.ts", + "lib", + "types" + ], "scripts": { "build": "echo \"No build available yet\"", "eslint": "eslint ./lib ./types", diff --git a/m3-react/package.json b/m3-react/package.json index 8ff2708..3b05697 100644 --- a/m3-react/package.json +++ b/m3-react/package.json @@ -10,9 +10,14 @@ "material design", "react" ], + "files": [ + "dist", + "types" + ], + "types": "./types/index.d.ts", "exports": { ".": { - "types": "./index.d.ts", + "types": "./types/index.d.ts", "require": "./dist/m3-react.cjs", "import": "./dist/m3-react.mjs", "default": "./dist/m3-react.mjs" @@ -47,6 +52,7 @@ "devDependencies": { "@chromatic-com/storybook": "^5.2.1", "@eslint/js": "^9.39.4", + "@modulify/conventional-release": "^0.1.3", "@storybook/addon-a11y": "^10.4.6", "@storybook/addon-docs": "^10.4.6", "@storybook/addon-links": "^10.4.6", @@ -63,6 +69,7 @@ "@types/react": "^18.3.28", "@types/react-dom": "^18.3.7", "@types/react-transition-group": "^4.4.12", + "@types/semver": "^7.7.1", "@typescript-eslint/eslint-plugin": "^8.62.0", "@typescript-eslint/parser": "^8.62.0", "@vitejs/plugin-react": "^6.0.3", diff --git a/m3-vue/package.json b/m3-vue/package.json index 083a3bf..5c80f67 100644 --- a/m3-vue/package.json +++ b/m3-vue/package.json @@ -10,9 +10,14 @@ "material design", "vue" ], + "files": [ + "dist", + "types" + ], + "types": "./types/index.d.ts", "exports": { ".": { - "types": "./index.d.ts", + "types": "./types/index.d.ts", "require": "./dist/m3-vue.cjs", "import": "./dist/m3-vue.mjs", "default": "./dist/m3-vue.mjs" @@ -44,6 +49,7 @@ "devDependencies": { "@chromatic-com/storybook": "^5.2.1", "@eslint/js": "^9.39.4", + "@modulify/conventional-release": "^0.1.3", "@storybook/addon-a11y": "^10.4.6", "@storybook/addon-docs": "^10.4.6", "@storybook/addon-links": "^10.4.6", @@ -57,6 +63,7 @@ "@testing-library/vue": "^8.1.0", "@types/lodash.isequal": "^4.5.8", "@types/node": "^25.3.0", + "@types/semver": "^7.7.1", "@typescript-eslint/eslint-plugin": "^8.62.0", "@typescript-eslint/parser": "^8.62.0", "@vitejs/plugin-vue": "^6.0.4", diff --git a/package.json b/package.json index f78c3fa..6f0ae7e 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,15 @@ "build": "yarn workspaces foreach -W run build", "commitlint": "commitlint --edit", "eslint": "yarn workspaces foreach -W run eslint", + "publish:foundation": "yarn workspace @modulify/m3-foundation npm publish --access public", + "publish:packages": "yarn publish:foundation && yarn publish:react && yarn publish:vue", + "publish:react": "yarn workspace @modulify/m3-react npm publish --access public", + "publish:vue": "yarn workspace @modulify/m3-vue npm publish --access public", "release": "conventional-release", + "release:alpha": "conventional-release --prerelease alpha", + "release:beta": "conventional-release --prerelease beta", "release:dry": "conventional-release --dry --verbose --tags", + "release:rc": "conventional-release --prerelease rc", "test:e2e:react": "yarn workspace @modulify/m3-react test:e2e", "test:e2e:vue": "yarn workspace @modulify/m3-vue test:e2e", "test:e2e": "yarn test:e2e:react && yarn test:e2e:vue", From c45ff7af2e7a392a49fdf2543aff5177f725cde8 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Mon, 29 Jun 2026 16:33:22 +0400 Subject: [PATCH 48/54] chore: Updated yarn.lock --- yarn.lock | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/yarn.lock b/yarn.lock index 7a94276..792862c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1894,6 +1894,7 @@ __metadata: "@eslint/js": "npm:^9.39.4" "@floating-ui/core": "npm:^1.7.4" "@floating-ui/dom": "npm:^1.7.5" + "@modulify/conventional-release": "npm:^0.1.3" "@modulify/m3-foundation": "npm:0.0.0" "@storybook/addon-a11y": "npm:^10.4.6" "@storybook/addon-docs": "npm:^10.4.6" @@ -1911,6 +1912,7 @@ __metadata: "@types/react": "npm:^18.3.28" "@types/react-dom": "npm:^18.3.7" "@types/react-transition-group": "npm:^4.4.12" + "@types/semver": "npm:^7.7.1" "@typescript-eslint/eslint-plugin": "npm:^8.62.0" "@typescript-eslint/parser": "npm:^8.62.0" "@vitejs/plugin-react": "npm:^6.0.3" @@ -1957,6 +1959,7 @@ __metadata: "@eslint/js": "npm:^9.39.4" "@floating-ui/core": "npm:^1.7.4" "@floating-ui/dom": "npm:^1.7.5" + "@modulify/conventional-release": "npm:^0.1.3" "@modulify/m3-foundation": "npm:0.0.0" "@storybook/addon-a11y": "npm:^10.4.6" "@storybook/addon-docs": "npm:^10.4.6" @@ -1971,6 +1974,7 @@ __metadata: "@testing-library/vue": "npm:^8.1.0" "@types/lodash.isequal": "npm:^4.5.8" "@types/node": "npm:^25.3.0" + "@types/semver": "npm:^7.7.1" "@typescript-eslint/eslint-plugin": "npm:^8.62.0" "@typescript-eslint/parser": "npm:^8.62.0" "@vitejs/plugin-vue": "npm:^6.0.4" From e2b504c615d333b05e8767bdf1dae582fbe5996c Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Mon, 29 Jun 2026 19:21:31 +0400 Subject: [PATCH 49/54] fix(m3-react): CJS build warning was removed --- m3-react/shims-vite.d.ts | 7 +++++++ m3-react/src/utils/content.ts | 4 +--- 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 m3-react/shims-vite.d.ts diff --git a/m3-react/shims-vite.d.ts b/m3-react/shims-vite.d.ts new file mode 100644 index 0000000..8211936 --- /dev/null +++ b/m3-react/shims-vite.d.ts @@ -0,0 +1,7 @@ +interface ImportMetaEnv { + readonly DEV: boolean; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/m3-react/src/utils/content.ts b/m3-react/src/utils/content.ts index 3f69c9d..3c5a05d 100644 --- a/m3-react/src/utils/content.ts +++ b/m3-react/src/utils/content.ts @@ -123,9 +123,7 @@ const isConfig = (value: Record): boolean => { } const shouldWarn = (): boolean => { - const meta = import.meta as ImportMeta & { env?: { DEV?: boolean; MODE?: string } } - - return meta.env?.DEV !== false && meta.env?.MODE !== 'production' + return import.meta.env.DEV } const handleDuplicateSlot = (name: string, policy: DuplicateSlotPolicy) => { From 42f07b455b245ce7e3c8ca9ce82f68ddd6caf3b8 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Mon, 29 Jun 2026 19:35:43 +0400 Subject: [PATCH 50/54] ci: Act fallback version was updated --- recipes/ci.mk | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/recipes/ci.mk b/recipes/ci.mk index 30dd1cf..ade3a75 100644 --- a/recipes/ci.mk +++ b/recipes/ci.mk @@ -1,3 +1,5 @@ +ACT_VERSION ?= v0.2.89 + .PHONY: ci-actionlint ci-actionlint: ## [CI][docker][lint] Lints GitHub Actions workflows locally (actionlint binary or docker image) $(TARGET_HEADER) @@ -17,7 +19,7 @@ ci-act-plan: ## [CI][docker] Shows act execution plan for tests workflow without @if command -v act >/dev/null 2>&1; then \ act -P ubuntu-latest=catthehacker/ubuntu:act-latest -n pull_request -W .github/workflows/tests.yml; \ elif command -v docker >/dev/null 2>&1; then \ - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v "$$(pwd):/repo" -w /repo alpine:3.20 sh -lc "apk add --no-cache curl tar >/dev/null && curl -fsSL https://github.com/nektos/act/releases/download/v0.2.84/act_Linux_x86_64.tar.gz | tar -xz -C /tmp && /tmp/act -P ubuntu-latest=catthehacker/ubuntu:act-latest -n pull_request -W .github/workflows/tests.yml"; \ + docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v "$$(pwd):/repo" -w /repo alpine:3.20 sh -lc "apk add --no-cache curl tar >/dev/null && curl -fsSL https://github.com/nektos/act/releases/download/$(ACT_VERSION)/act_Linux_x86_64.tar.gz | tar -xz -C /tmp && /tmp/act -P ubuntu-latest=catthehacker/ubuntu:act-latest -n pull_request -W .github/workflows/tests.yml"; \ else \ echo "act is not installed and docker is unavailable"; \ exit 1; \ @@ -30,7 +32,7 @@ ci-act-tests: ## [CI][docker][heavy][network] Runs tests workflow locally via ac @if command -v act >/dev/null 2>&1; then \ act -P ubuntu-latest=catthehacker/ubuntu:act-latest pull_request -W .github/workflows/tests.yml -j pr-check -j eslint -j tests -j storybook-tests; \ elif command -v docker >/dev/null 2>&1; then \ - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v "$$(pwd):/repo" -w /repo alpine:3.20 sh -lc "apk add --no-cache curl tar >/dev/null && curl -fsSL https://github.com/nektos/act/releases/download/v0.2.84/act_Linux_x86_64.tar.gz | tar -xz -C /tmp && /tmp/act -P ubuntu-latest=catthehacker/ubuntu:act-latest pull_request -W .github/workflows/tests.yml -j pr-check -j eslint -j tests -j storybook-tests"; \ + docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v "$$(pwd):/repo" -w /repo alpine:3.20 sh -lc "apk add --no-cache curl tar >/dev/null && curl -fsSL https://github.com/nektos/act/releases/download/$(ACT_VERSION)/act_Linux_x86_64.tar.gz | tar -xz -C /tmp && /tmp/act -P ubuntu-latest=catthehacker/ubuntu:act-latest pull_request -W .github/workflows/tests.yml -j pr-check -j eslint -j tests -j storybook-tests"; \ else \ echo "act is not installed and docker is unavailable"; \ exit 1; \ From 343d36c15d20a7701d3d4649e6384be904dfa704 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Tue, 30 Jun 2026 16:57:34 +0400 Subject: [PATCH 51/54] fix: Popper hidden state hit testing was fixed --- .../stylesheets/components/popper/index.scss | 2 + m3-react/tests/M3Popper.e2e.tsx | 40 +++++++++++++++++++ m3-react/tests/e2e.setup.ts | 2 + m3-react/vitest.config.e2e.ts | 3 ++ m3-vue/tests/M3Popper.e2e.ts | 21 ++++++++++ m3-vue/tests/e2e.setup.ts | 2 + m3-vue/vitest.config.e2e.ts | 3 ++ 7 files changed, 73 insertions(+) create mode 100644 m3-react/tests/e2e.setup.ts create mode 100644 m3-vue/tests/e2e.setup.ts diff --git a/m3-foundation/assets/stylesheets/components/popper/index.scss b/m3-foundation/assets/stylesheets/components/popper/index.scss index 200aba4..6bc8870 100644 --- a/m3-foundation/assets/stylesheets/components/popper/index.scss +++ b/m3-foundation/assets/stylesheets/components/popper/index.scss @@ -4,6 +4,7 @@ position: absolute; top: 0; left: 0; + pointer-events: none; } .m3-popper { @@ -50,6 +51,7 @@ &_shown { visibility: visible; opacity: 1; + pointer-events: auto; transition: opacity var(--m3-popper-opacity-enter-duration) var(--m3-popper-enter-easing), visibility 0s linear 0ms diff --git a/m3-react/tests/M3Popper.e2e.tsx b/m3-react/tests/M3Popper.e2e.tsx index 5f789fc..8ff4428 100644 --- a/m3-react/tests/M3Popper.e2e.tsx +++ b/m3-react/tests/M3Popper.e2e.tsx @@ -196,6 +196,46 @@ describe('m3-react/popper e2e', () => { }) }) + test('does not capture pointer events after hiding while still attached', async () => { + target = document.createElement('button') + document.body.append(target) + + const popperRef = createRef() + + const mounted = render( + + + + ) + unmount = mounted.unmount + + const { positioner, popper } = await waitForPopper() + + await waitFor(() => { + expect(popper.classList.contains('m3-popper_shown')).toBe(true) + expect(getComputedStyle(positioner).pointerEvents).toBe('none') + expect(getComputedStyle(popper).pointerEvents).toBe('auto') + }) + + await act(async () => { + popperRef.current?.hide(true) + }) + + await waitFor(() => { + expect(document.body.contains(positioner)).toBe(true) + expect(popper.classList.contains('m3-popper_shown')).toBe(false) + expect(getComputedStyle(positioner).pointerEvents).toBe('none') + expect(getComputedStyle(popper).pointerEvents).toBe('none') + }) + }) + test('changes geometry when placement switches from bottom to right', async () => { target = document.createElement('button') document.body.append(target) diff --git a/m3-react/tests/e2e.setup.ts b/m3-react/tests/e2e.setup.ts new file mode 100644 index 0000000..e56f0a8 --- /dev/null +++ b/m3-react/tests/e2e.setup.ts @@ -0,0 +1,2 @@ +import '@modulify/m3-foundation/assets/stylesheets/normalize.scss' +import '@modulify/m3-foundation/assets/stylesheets/index.scss' diff --git a/m3-react/vitest.config.e2e.ts b/m3-react/vitest.config.e2e.ts index ce0869c..5d9355c 100644 --- a/m3-react/vitest.config.e2e.ts +++ b/m3-react/vitest.config.e2e.ts @@ -23,6 +23,9 @@ export default mergeConfig(viteConfig, defineConfig({ include: [ 'tests/**/*.e2e.tsx', ], + setupFiles: [ + './tests/e2e.setup.ts', + ], browser: { enabled: true, provider: playwright({ diff --git a/m3-vue/tests/M3Popper.e2e.ts b/m3-vue/tests/M3Popper.e2e.ts index 76f8e0a..1f6add3 100644 --- a/m3-vue/tests/M3Popper.e2e.ts +++ b/m3-vue/tests/M3Popper.e2e.ts @@ -283,6 +283,27 @@ describe('m3-vue/popper e2e', () => { }) }) + test('does not capture pointer events after hiding while still attached', async () => { + const { positioner, popper } = await waitForPopper() + + await waitFor(() => { + expect(popper.classList.contains('m3-popper_shown')).toBe(true) + expect(getComputedStyle(positioner).pointerEvents).toBe('none') + expect(getComputedStyle(popper).pointerEvents).toBe('auto') + }) + + await (mounted as MountResult).setProps({ + shown: false, + }) + + await waitFor(() => { + expect(document.body.contains(positioner)).toBe(true) + expect(popper.classList.contains('m3-popper_shown')).toBe(false) + expect(getComputedStyle(positioner).pointerEvents).toBe('none') + expect(getComputedStyle(popper).pointerEvents).toBe('none') + }) + }) + test('changes geometry when placement switches from bottom to right', async () => { const { popper, diff --git a/m3-vue/tests/e2e.setup.ts b/m3-vue/tests/e2e.setup.ts new file mode 100644 index 0000000..e56f0a8 --- /dev/null +++ b/m3-vue/tests/e2e.setup.ts @@ -0,0 +1,2 @@ +import '@modulify/m3-foundation/assets/stylesheets/normalize.scss' +import '@modulify/m3-foundation/assets/stylesheets/index.scss' diff --git a/m3-vue/vitest.config.e2e.ts b/m3-vue/vitest.config.e2e.ts index 2026427..18a76c6 100644 --- a/m3-vue/vitest.config.e2e.ts +++ b/m3-vue/vitest.config.e2e.ts @@ -23,6 +23,9 @@ export default mergeConfig(viteConfig, defineConfig({ include: [ 'tests/**/*.e2e.ts', ], + setupFiles: [ + './tests/e2e.setup.ts', + ], browser: { enabled: true, provider: playwright({ From b2c11341db681a4aa8b3f5253a31f25b203faa0d Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Tue, 30 Jun 2026 18:03:25 +0400 Subject: [PATCH 52/54] chore: Updated yarn.lock --- yarn.lock | 519 +++++++++++------------------------------------------- 1 file changed, 104 insertions(+), 415 deletions(-) diff --git a/yarn.lock b/yarn.lock index 792862c..aed0643 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,16 +12,6 @@ __metadata: languageName: node linkType: hard -"@ampproject/remapping@npm:^2.2.0": - version: 2.3.0 - resolution: "@ampproject/remapping@npm:2.3.0" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed - languageName: node - linkType: hard - "@asamuzakjp/css-color@npm:^5.1.11": version: 5.1.11 resolution: "@asamuzakjp/css-color@npm:5.1.11" @@ -62,7 +52,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.1, @babel/code-frame@npm:^7.24.2": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4": version: 7.24.2 resolution: "@babel/code-frame@npm:7.24.2" dependencies: @@ -72,16 +62,6 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/code-frame@npm:7.25.7" - dependencies: - "@babel/highlight": "npm:^7.25.7" - picocolors: "npm:^1.0.0" - checksum: 10c0/14825c298bdec914caf3d24d1383b6d4cd6b030714686004992f4fc251831ecf432236652896f99d5d341f17170ae9a07b58d8d7b15aa0df8cfa1c5a7d5474bc - languageName: node - linkType: hard - "@babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.29.0": version: 7.29.0 resolution: "@babel/code-frame@npm:7.29.0" @@ -93,117 +73,44 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.23.5": - version: 7.24.1 - resolution: "@babel/compat-data@npm:7.24.1" - checksum: 10c0/8a1935450345c326b14ea632174696566ef9b353bd0d6fb682456c0774342eeee7654877ced410f24a731d386fdcbf980b75083fc764964d6f816b65792af2f5 - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.25.7": - version: 7.25.8 - resolution: "@babel/compat-data@npm:7.25.8" - checksum: 10c0/8b81c17580e5fb4cbb6a3c52079f8c283fc59c0c6bd2fe14cfcf9c44b32d2eaab71b02c5633e2c679f5896f73f8ac4036ba2e67a4c806e8f428e4b11f526d7f4 - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.28.6": - version: 7.29.0 - resolution: "@babel/compat-data@npm:7.29.0" - checksum: 10c0/08f348554989d23aa801bf1405aa34b15e841c0d52d79da7e524285c77a5f9d298e70e11d91cc578d8e2c9542efc586d50c5f5cf8e1915b254a9dcf786913a94 - languageName: node - linkType: hard - -"@babel/core@npm:^7.21.3": - version: 7.24.3 - resolution: "@babel/core@npm:7.24.3" +"@babel/code-frame@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/code-frame@npm:7.29.7" dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.2" - "@babel/generator": "npm:^7.24.1" - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.24.1" - "@babel/parser": "npm:^7.24.1" - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10c0/e6e756b6de27d0312514a005688fa1915c521ad4269a388913eff2120a546538078f8488d6d16e86f851872f263cb45a6bbae08738297afb9382600d2ac342a9 + "@babel/helper-validator-identifier": "npm:^7.29.7" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10c0/169fc2080169a40c1760155eaaaf739bcb882df0bec76a83adbda5493645bc17270a3434b8848c494b1933e96fe1d147370001e3cda09a39f43ae30f08ef2069 languageName: node linkType: hard -"@babel/core@npm:^7.23.9": - version: 7.25.8 - resolution: "@babel/core@npm:7.25.8" - dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.25.7" - "@babel/generator": "npm:^7.25.7" - "@babel/helper-compilation-targets": "npm:^7.25.7" - "@babel/helper-module-transforms": "npm:^7.25.7" - "@babel/helpers": "npm:^7.25.7" - "@babel/parser": "npm:^7.25.8" - "@babel/template": "npm:^7.25.7" - "@babel/traverse": "npm:^7.25.7" - "@babel/types": "npm:^7.25.8" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10c0/8411ea506e6f7c8a39ab5c1524b00589fa3b087edb47389708f7fe07170929192171734666e3ea10b95a951643a531a6d09eedfe071572c9ea28516646265086 +"@babel/compat-data@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/compat-data@npm:7.29.7" + checksum: 10c0/47913f05e08a45a1c9df38c02b4b49e391005085b489432647a1abe112e5d9c75e3be8ea5972b7f6da4ec5d1339922ceb9ea02b8a25d4ed1cb8636e5261f344e languageName: node linkType: hard -"@babel/core@npm:^7.28.0, @babel/core@npm:^7.29.0": - version: 7.29.0 - resolution: "@babel/core@npm:7.29.0" +"@babel/core@npm:^7.21.3, @babel/core@npm:^7.23.9, @babel/core@npm:^7.28.0, @babel/core@npm:^7.29.0": + version: 7.29.7 + resolution: "@babel/core@npm:7.29.7" dependencies: - "@babel/code-frame": "npm:^7.29.0" - "@babel/generator": "npm:^7.29.0" - "@babel/helper-compilation-targets": "npm:^7.28.6" - "@babel/helper-module-transforms": "npm:^7.28.6" - "@babel/helpers": "npm:^7.28.6" - "@babel/parser": "npm:^7.29.0" - "@babel/template": "npm:^7.28.6" - "@babel/traverse": "npm:^7.29.0" - "@babel/types": "npm:^7.29.0" + "@babel/code-frame": "npm:^7.29.7" + "@babel/generator": "npm:^7.29.7" + "@babel/helper-compilation-targets": "npm:^7.29.7" + "@babel/helper-module-transforms": "npm:^7.29.7" + "@babel/helpers": "npm:^7.29.7" + "@babel/parser": "npm:^7.29.7" + "@babel/template": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" "@jridgewell/remapping": "npm:^2.3.5" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/5127d2e8e842ae409e11bcbb5c2dff9874abf5415e8026925af7308e903f4f43397341467a130490d1a39884f461bc2b67f3063bce0be44340db89687fd852aa - languageName: node - linkType: hard - -"@babel/generator@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/generator@npm:7.24.1" - dependencies: - "@babel/types": "npm:^7.24.0" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: 10c0/f0eea7497657cdf68cfb4b7d181588e1498eefd1f303d73b0d8ca9b21a6db27136a6f5beb8f988b6bdcd4249870826080950450fd310951de42ecf36df274881 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/generator@npm:7.25.7" - dependencies: - "@babel/types": "npm:^7.25.7" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^3.0.2" - checksum: 10c0/c03a26c79864d60d04ce36b649c3fa0d6fd7b2bf6a22e22854a0457aa09206508392dd73ee40e7bc8d50b3602f9ff068afa47770cda091d332e7db1ca382ee96 + checksum: 10c0/112fb09c24de7a1de64d1de2c31fe65c4e6af4cb2fb6e6d99ea5373e6fc51e75b88581c0efae4c4c68f119a02a988c7106e95011a41530a2fb8ed793c7eaa07b languageName: node linkType: hard @@ -220,6 +127,19 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/generator@npm:7.29.7" + dependencies: + "@babel/parser": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" + jsesc: "npm:^3.0.2" + checksum: 10c0/9bf72b01b5bd0ea5b1288a0e37dbd360bff2f2b1ce73342c0d40fb3db2ec3dc004ada5ffa925c5e12939a416eed59e600d562b8ecd938ce0d27dfd0eb6c6c2b7 + languageName: node + linkType: hard + "@babel/generator@npm:^8.0.0-rc.4": version: 8.0.0 resolution: "@babel/generator@npm:8.0.0" @@ -234,59 +154,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/helper-compilation-targets@npm:7.23.6" - dependencies: - "@babel/compat-data": "npm:^7.23.5" - "@babel/helper-validator-option": "npm:^7.23.5" - browserslist: "npm:^4.22.2" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10c0/ba38506d11185f48b79abf439462ece271d3eead1673dd8814519c8c903c708523428806f05f2ec5efd0c56e4e278698fac967e5a4b5ee842c32415da54bc6fa - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-compilation-targets@npm:7.25.7" - dependencies: - "@babel/compat-data": "npm:^7.25.7" - "@babel/helper-validator-option": "npm:^7.25.7" - browserslist: "npm:^4.24.0" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10c0/705be7e5274a3fdade68e3e2cf42e2b600316ab52794e13b91299a16f16c926f15886b6e9d6df20eb943ccc1cdba5a363d4766f8d01e47b8e6f4e01175f5e66c - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/helper-compilation-targets@npm:7.28.6" +"@babel/helper-compilation-targets@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-compilation-targets@npm:7.29.7" dependencies: - "@babel/compat-data": "npm:^7.28.6" - "@babel/helper-validator-option": "npm:^7.27.1" + "@babel/compat-data": "npm:^7.29.7" + "@babel/helper-validator-option": "npm:^7.29.7" browserslist: "npm:^4.24.0" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10c0/3fcdf3b1b857a1578e99d20508859dbd3f22f3c87b8a0f3dc540627b4be539bae7f6e61e49d931542fe5b557545347272bbdacd7f58a5c77025a18b745593a50 - languageName: node - linkType: hard - -"@babel/helper-environment-visitor@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-environment-visitor@npm:7.22.20" - checksum: 10c0/e762c2d8f5d423af89bd7ae9abe35bd4836d2eb401af868a63bbb63220c513c783e25ef001019418560b3fdc6d9a6fb67e6c0b650bcdeb3a2ac44b5c3d2bdd94 - languageName: node - linkType: hard - -"@babel/helper-function-name@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-function-name@npm:7.23.0" - dependencies: - "@babel/template": "npm:^7.22.15" - "@babel/types": "npm:^7.23.0" - checksum: 10c0/d771dd1f3222b120518176733c52b7cadac1c256ff49b1889dbbe5e3fed81db855b8cc4e40d949c9d3eae0e795e8229c1c8c24c0e83f27cfa6ee3766696c6428 + checksum: 10c0/4c15fd4c69a0a7047799a28a88460c19cede0a0ee8af994ea169114986f4af48b92c7393a4a3fee0456c11a656eece3448a6ed06354453d6c27cccf17195453b languageName: node linkType: hard @@ -297,111 +174,33 @@ __metadata: languageName: node linkType: hard -"@babel/helper-hoist-variables@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-hoist-variables@npm:7.22.5" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/60a3077f756a1cd9f14eb89f0037f487d81ede2b7cfe652ea6869cd4ec4c782b0fb1de01b8494b9a2d2050e3d154d7d5ad3be24806790acfb8cbe2073bf1e208 - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.22.15": - version: 7.24.3 - resolution: "@babel/helper-module-imports@npm:7.24.3" - dependencies: - "@babel/types": "npm:^7.24.0" - checksum: 10c0/052c188adcd100f5e8b6ff0c9643ddaabc58b6700d3bbbc26804141ad68375a9f97d9d173658d373d31853019e65f62610239e3295cdd58e573bdcb2fded188d - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-module-imports@npm:7.25.7" - dependencies: - "@babel/traverse": "npm:^7.25.7" - "@babel/types": "npm:^7.25.7" - checksum: 10c0/0fd0c3673835e5bf75558e184bcadc47c1f6dd2fe2016d53ebe1e5a6ae931a44e093015c2f9a6651c1a89f25c76d9246710c2b0b460b95ee069c464f2837fa2c - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/helper-module-imports@npm:7.28.6" - dependencies: - "@babel/traverse": "npm:^7.28.6" - "@babel/types": "npm:^7.28.6" - checksum: 10c0/b49d8d8f204d9dbfd5ac70c54e533e5269afb3cea966a9d976722b13e9922cc773a653405f53c89acb247d5aebdae4681d631a3ae3df77ec046b58da76eda2ac - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/helper-module-transforms@npm:7.23.3" - dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-simple-access": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/helper-validator-identifier": "npm:^7.22.20" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/211e1399d0c4993671e8e5c2b25383f08bee40004ace5404ed4065f0e9258cc85d99c1b82fd456c030ce5cfd4d8f310355b54ef35de9924eabfc3dff1331d946 +"@babel/helper-globals@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-globals@npm:7.29.7" + checksum: 10c0/f38417c40b1129a1b2b519ca961b9040c8827d1444fd74068702286b91b77089431dc76b6b9d5c1496e5da2a4f3ad329c6946e688ba3fa0d1d0b3d2b4f34f36a languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-module-transforms@npm:7.25.7" +"@babel/helper-module-imports@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-module-imports@npm:7.29.7" dependencies: - "@babel/helper-module-imports": "npm:^7.25.7" - "@babel/helper-simple-access": "npm:^7.25.7" - "@babel/helper-validator-identifier": "npm:^7.25.7" - "@babel/traverse": "npm:^7.25.7" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/f37fa7d1d4df21690535b278468cbd5faf0133a3080f282000cfa4f3ffc9462a1458f866b04b6a2f2d1eec4691236cba9a867da61270dab3ab19846e62f05090 + "@babel/traverse": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10c0/6adf60d97356027413342a092f818d9678c4f5caff716a33e3284b5ae14e47a9e88059d421dde4ee4894691260039a12602c0e7becadc175602194b40dfa345d languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/helper-module-transforms@npm:7.28.6" +"@babel/helper-module-transforms@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-module-transforms@npm:7.29.7" dependencies: - "@babel/helper-module-imports": "npm:^7.28.6" - "@babel/helper-validator-identifier": "npm:^7.28.5" - "@babel/traverse": "npm:^7.28.6" + "@babel/helper-module-imports": "npm:^7.29.7" + "@babel/helper-validator-identifier": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/6f03e14fc30b287ce0b839474b5f271e72837d0cafe6b172d759184d998fbee3903a035e81e07c2c596449e504f453463d58baa65b6f40a37ded5bec74620b2b - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-simple-access@npm:7.22.5" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/f0cf81a30ba3d09a625fd50e5a9069e575c5b6719234e04ee74247057f8104beca89ed03e9217b6e9b0493434cedc18c5ecca4cea6244990836f1f893e140369 - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-simple-access@npm:7.25.7" - dependencies: - "@babel/traverse": "npm:^7.25.7" - "@babel/types": "npm:^7.25.7" - checksum: 10c0/eed1b499bfb4f613c18debd61517e3de77b6da2727ca025aa05ac81599e0269f1dddb5237db04e8bb598115d015874752e0a7f11ff38672d74a4976097417059 - languageName: node - linkType: hard - -"@babel/helper-split-export-declaration@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helper-split-export-declaration@npm:7.22.6" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/d83e4b623eaa9622c267d3c83583b72f3aac567dc393dda18e559d79187961cb29ae9c57b2664137fc3d19508370b12ec6a81d28af73a50e0846819cb21c6e44 + checksum: 10c0/ee5a2172c24a42be696836f4b0d947489c9729d8adf5821885cf77d1ad5333e3c447368e9a71f67df1099570490553dccf9f888ef0a92a48aa63cb086bd8c7e1 languageName: node linkType: hard @@ -489,55 +288,20 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: 10c0/af45d5c0defb292ba6fd38979e8f13d7da63f9623d8ab9ededc394f67eb45857d2601278d151ae9affb6e03d5d608485806cd45af08b4468a0515cf506510e94 - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-validator-option@npm:7.25.7" - checksum: 10c0/12ed418c8e3ed9ed44c8c80d823f4e42d399b5eb2e423adccb975e31a31a008cd3b5d8eab688b31f740caff4a1bb28fe06ea2fa7d635aee34cc0ad6995d50f0a - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-validator-option@npm:7.27.1" - checksum: 10c0/6fec5f006eba40001a20f26b1ef5dbbda377b7b68c8ad518c05baa9af3f396e780bdfded24c4eef95d14bb7b8fd56192a6ed38d5d439b97d10efc5f1a191d148 - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/helpers@npm:7.24.1" - dependencies: - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" - checksum: 10c0/b3445860ae749fc664682b291f092285e949114e8336784ae29f88eb4c176279b01cc6740005a017a0389ae4b4e928d5bbbc01de7da7e400c972e3d6f792063a - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helpers@npm:7.25.7" - dependencies: - "@babel/template": "npm:^7.25.7" - "@babel/types": "npm:^7.25.7" - checksum: 10c0/3b3ae9e373bd785414195ef8f59976a69d5a6ebe0ef2165fdcc5165e5c3ee09e0fcee94bb457df2ddb8c0532e4146d0a9b7a96b3497399a4bff4ffe196b30228 +"@babel/helper-validator-option@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-validator-option@npm:7.29.7" + checksum: 10c0/d2a06c6d0ac40ba4a2f219fc2cab249c7a94bacdb2686273b7f9598571c908809b48468ff588915a346e6cc7296f60b581023d1d498b747fed06f779d335c2cc languageName: node linkType: hard -"@babel/helpers@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/helpers@npm:7.28.6" +"@babel/helpers@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helpers@npm:7.29.7" dependencies: - "@babel/template": "npm:^7.28.6" - "@babel/types": "npm:^7.28.6" - checksum: 10c0/c4a779c66396bb0cf619402d92f1610601ff3832db2d3b86b9c9dd10983bf79502270e97ac6d5280cea1b1a37de2f06ecbac561bd2271545270407fbe64027cb + "@babel/template": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10c0/218e8d10953647c9f44775f5a022b227a182674853b5ea8631889deb7e1a3e4bc870388aaecf59bb8bd92a87f9a96220ed3f70a35bffec6bcf9169ecb67891ac languageName: node linkType: hard @@ -553,19 +317,7 @@ __metadata: languageName: node linkType: hard -"@babel/highlight@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/highlight@npm:7.25.7" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.25.7" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10c0/1f5894fdb0a0af6101fb2822369b2eeeae32cbeae2ef73ff73fc6a0a4a20471565cd9cfa589f54ed69df66adeca7c57266031ca9134b7bd244d023a488d419aa - languageName: node - linkType: hard - -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.1": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7": version: 7.24.1 resolution: "@babel/parser@npm:7.24.1" bin: @@ -574,7 +326,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.7, @babel/parser@npm:^7.25.8": +"@babel/parser@npm:^7.23.9": version: 7.25.8 resolution: "@babel/parser@npm:7.25.8" dependencies: @@ -629,43 +381,10 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": - version: 7.24.1 - resolution: "@babel/runtime@npm:7.24.1" - dependencies: - regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/500c6a99ddd84f37c7bc5dbc84777af47b1372b20e879941670451d55484faf18a673c5ebee9ca2b0f36208a729417873b35b1b92e76f811620f6adf7b8cb0f1 - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.23.2": - version: 7.25.7 - resolution: "@babel/runtime@npm:7.25.7" - dependencies: - regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/86b7829d2fc9343714a9afe92757cf96c4dc799006ca61d73cda62f4b9e29bfa1ce36794955bc6cb4c188f5b10db832c949339895e1bbe81a69022d9d578ce29 - languageName: node - linkType: hard - -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/template@npm:7.24.0" - dependencies: - "@babel/code-frame": "npm:^7.23.5" - "@babel/parser": "npm:^7.24.0" - "@babel/types": "npm:^7.24.0" - checksum: 10c0/9d3dd8d22fe1c36bc3bdef6118af1f4b030aaf6d7d2619f5da203efa818a2185d717523486c111de8d99a8649ddf4bbf6b2a7a64962d8411cf6a8fa89f010e54 - languageName: node - linkType: hard - -"@babel/template@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/template@npm:7.25.7" - dependencies: - "@babel/code-frame": "npm:^7.25.7" - "@babel/parser": "npm:^7.25.7" - "@babel/types": "npm:^7.25.7" - checksum: 10c0/8ae9e36e4330ee83d4832531d1d9bec7dc2ef6a2a8afa1ef1229506fd60667abcb17f306d1c3d7e582251270597022990c845d5d69e7add70a5aea66720decb9 +"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": + version: 7.29.7 + resolution: "@babel/runtime@npm:7.29.7" + checksum: 10c0/ca11572f7146b21e0bde6a9ed4bb6a89eafbee5f0944c7eb54d0d8a2dac962c33638a1d611e14faa71dfbb92b4b5f9236232208568a6b7d5c6f3f39ddb91771e languageName: node linkType: hard @@ -680,40 +399,18 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/traverse@npm:7.24.1" - dependencies: - "@babel/code-frame": "npm:^7.24.1" - "@babel/generator": "npm:^7.24.1" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-hoist-variables": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/c087b918f6823776537ba246136c70e7ce0719fc05361ebcbfd16f4e6f2f6f1f8f4f9167f1d9b675f27d12074839605189cc9d689de20b89a85e7c140f23daab - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/traverse@npm:7.25.7" +"@babel/template@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/template@npm:7.29.7" dependencies: - "@babel/code-frame": "npm:^7.25.7" - "@babel/generator": "npm:^7.25.7" - "@babel/parser": "npm:^7.25.7" - "@babel/template": "npm:^7.25.7" - "@babel/types": "npm:^7.25.7" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/75d73e52c507a7a7a4c7971d6bf4f8f26fdd094e0d3a0193d77edf6a5efa36fc3db91ec5cc48e8b94e6eb5d5ad21af0a1040e71309172851209415fd105efb1a + "@babel/code-frame": "npm:^7.29.7" + "@babel/parser": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10c0/8bb7f900dcab0e9e1c5ffbc33ca10e0d26b7b2e2ca804becb73ee771b9c4ed6e2908a4ae4a14c08560febb45d2b6b9a173955e42ad404d05f8b04840a14d9c58 languageName: node linkType: hard -"@babel/traverse@npm:^7.28.0, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": +"@babel/traverse@npm:^7.28.0": version: 7.29.0 resolution: "@babel/traverse@npm:7.29.0" dependencies: @@ -728,7 +425,22 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.0, @babel/types@npm:^7.8.3": +"@babel/traverse@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/traverse@npm:7.29.7" + dependencies: + "@babel/code-frame": "npm:^7.29.7" + "@babel/generator": "npm:^7.29.7" + "@babel/helper-globals": "npm:^7.29.7" + "@babel/parser": "npm:^7.29.7" + "@babel/template": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + debug: "npm:^4.3.1" + checksum: 10c0/e256a1fbdb956555b76f3c285b1e453f6bedec8b3afb61751d99d933efd11c7d79caf5ddf2493570058a9f7deaa1b48324380d7c1aa1443fd9508becbf56331a + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.8.3": version: 7.24.0 resolution: "@babel/types@npm:7.24.0" dependencies: @@ -750,7 +462,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.25.7, @babel/types@npm:^7.25.8": +"@babel/types@npm:^7.25.8": version: 7.25.8 resolution: "@babel/types@npm:7.25.8" dependencies: @@ -1748,7 +1460,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": +"@jridgewell/trace-mapping@npm:^0.3.24": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: @@ -4822,7 +4534,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.22.2, browserslist@npm:^4.24.0": +"browserslist@npm:^4.24.0": version: 4.28.4 resolution: "browserslist@npm:4.28.4" dependencies: @@ -6888,13 +6600,6 @@ __metadata: languageName: node linkType: hard -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 - languageName: node - linkType: hard - "globals@npm:^14.0.0": version: 14.0.0 resolution: "globals@npm:14.0.0" @@ -7735,15 +7440,6 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 - languageName: node - linkType: hard - "jsesc@npm:^3.0.2": version: 3.1.0 resolution: "jsesc@npm:3.1.0" @@ -9476,13 +9172,6 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.14.0": - version: 0.14.1 - resolution: "regenerator-runtime@npm:0.14.1" - checksum: 10c0/1b16eb2c4bceb1665c89de70dcb64126a22bc8eb958feef3cd68fe11ac6d2a4899b5cd1b80b0774c7c03591dc57d16631a7f69d2daa2ec98100e2f29f7ec4cc4 - languageName: node - linkType: hard - "regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" From 270e2544707300c368676a9965f40ba69b43c845 Mon Sep 17 00:00:00 2001 From: Zaitsev Kirill Date: Tue, 30 Jun 2026 18:08:20 +0400 Subject: [PATCH 53/54] refactor(m3-react): Surface review comments were resolved --- .../surface/orchestration/useSurfaceSideSheetMorph.ts | 2 +- .../examples/surface/SurfaceSideSheetDismissToRemove.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/m3-react/src/components/surface/orchestration/useSurfaceSideSheetMorph.ts b/m3-react/src/components/surface/orchestration/useSurfaceSideSheetMorph.ts index fb14894..a94bc67 100644 --- a/m3-react/src/components/surface/orchestration/useSurfaceSideSheetMorph.ts +++ b/m3-react/src/components/surface/orchestration/useSurfaceSideSheetMorph.ts @@ -91,7 +91,7 @@ export function useSurfaceSideSheetMorph(): UseSurfaceSideSheetMorphResult { const [modalRole, setModalRole] = useStateRef(DOCKED_SIDE_SHEET_DESCRIPTOR.variant) const [modalTransitionMs, setModalTransitionMs] = useStateRef(PANEL_TRANSITION_MS) const [transitioning, setTransitioning, transitioningRef] = useStateRef(false) - const [lastDockedGeometry, setLastDockedGeometry, lastDockedGeometryRef] = useStateRef(null) + const [, setLastDockedGeometry, lastDockedGeometryRef] = useStateRef(null) const dockedHostRef = useRef(null) const layoutRootRef = useRef(null) diff --git a/m3-react/storybook/examples/surface/SurfaceSideSheetDismissToRemove.tsx b/m3-react/storybook/examples/surface/SurfaceSideSheetDismissToRemove.tsx index 47dcd1f..c659bef 100644 --- a/m3-react/storybook/examples/surface/SurfaceSideSheetDismissToRemove.tsx +++ b/m3-react/storybook/examples/surface/SurfaceSideSheetDismissToRemove.tsx @@ -372,7 +372,7 @@ const SurfaceSideSheetDismissToRemove: FC = () => { className="surface-side-sheet__docked-host" style={{ width: `${sideSheetDockedWidth}px` }} > - {!sideSheetModal && !sheetRemoved ? ( + {!sideSheetModal ? ( Date: Tue, 30 Jun 2026 18:08:57 +0400 Subject: [PATCH 54/54] refactor(m3-vue): Surface review comments were resolved --- .../surface/orchestration/useSurfaceCardPageMorph.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/m3-vue/src/components/surface/orchestration/useSurfaceCardPageMorph.ts b/m3-vue/src/components/surface/orchestration/useSurfaceCardPageMorph.ts index 13a850b..3e589fa 100644 --- a/m3-vue/src/components/surface/orchestration/useSurfaceCardPageMorph.ts +++ b/m3-vue/src/components/surface/orchestration/useSurfaceCardPageMorph.ts @@ -170,11 +170,11 @@ export function useSurfaceCardPageMorph(transitionMs: number) { scheduleSyncMotion() }) - if (canvas.value && observer) { + if (canvas.value) { observer.observe(canvas.value) } - if (originSlot.value && observer) { + if (originSlot.value) { observer.observe(originSlot.value) } })