[0]['page']) {
+ await page.goto(
+ `/mc-populated-blank/deliver?mode=gather&role=student&demo=${encodeURIComponent(DEMO_ID)}&player=esm`
+ );
+ await page.waitForLoadState('domcontentloaded');
+ await page.waitForLoadState('networkidle');
+ await page.waitForSelector('[data-testid="role-student"]', { timeout: 20_000 });
+ await waitForMathRendering(page);
+}
+
+// ---------------------------------------------------------------------------
+// 1. Template and audio button are side-by-side (two-column grid)
+// sel_vic/main.scss: .sel-vic { display: grid; grid-template-columns: 75% 25% }
+// Currently the audio container stacks above the template (vertical layout).
+// In the reference both sit on the same row: sentence left ~75%, audio right ~25%.
+// ---------------------------------------------------------------------------
+test('sel-vic: template sentence and audio button are on the same row (two-column grid)', async ({
+ page,
+}) => {
+ await openSelVicRoute(page);
+ const root = deliveryContainer(page);
+
+ const templateLine = root.locator('.pie-template-line');
+ const audioContainer = root.locator('.pie-audio-container');
+ await expect(templateLine).toBeVisible();
+ await expect(audioContainer).toBeVisible();
+
+ const templateBox = await templateLine.boundingBox();
+ const audioBox = await audioContainer.boundingBox();
+ expect(templateBox).not.toBeNull();
+ expect(audioBox).not.toBeNull();
+
+ // When stacked: audioBox.y is noticeably above templateBox.y (audio renders first).
+ // When side-by-side: both share approximately the same top Y (within 20px).
+ const verticalDiff = Math.abs(templateBox?.y - audioBox?.y);
+ expect(verticalDiff).toBeLessThan(20);
+
+ // And they must not overlap horizontally — template is left of audio.
+ expect(templateBox?.x).toBeLessThan(audioBox?.x);
+});
+
+// ---------------------------------------------------------------------------
+// 2. Template sentence and blank slot are on the same line (no line break)
+// vic.scss: .rli-vic-answer uses inline flex — the tag wrapping the
+// template text must not break to a new line before the blank slot.
+// Same root cause as sr-vic:
defaults to display:block.
+// ---------------------------------------------------------------------------
+test('sel-vic: blank slot stays inline within the template sentence (no line break)', async ({
+ page,
+}) => {
+ await openSelVicRoute(page);
+ const root = deliveryContainer(page);
+
+ const templateLine = root.locator('.pie-template-line');
+ const blankSlot = root.locator('.pie-blank-slot');
+ await expect(templateLine).toBeVisible();
+ await expect(blankSlot).toBeVisible();
+
+ const templateBox = await templateLine.boundingBox();
+ const blankBox = await blankSlot.boundingBox();
+ expect(templateBox).not.toBeNull();
+ expect(blankBox).not.toBeNull();
+
+ // When blank wraps to a new line its top Y is significantly below the template top.
+ // When inline both start at the same Y (within 10px).
+ const verticalOffset = blankBox?.y - templateBox?.y;
+ expect(verticalOffset).toBeLessThan(10);
+});
+
+// ---------------------------------------------------------------------------
+// 3. Filled blank value text is red (#cc3333)
+// vic.scss: .rli-vic-cloze > .rli-vic-content-element { color: #cc3333 }
+// sel-vic inherits vic.scss. The filled-in answer text must be red.
+// Currently sel-vic.css has no color rule for .pie-blank-value.
+// ---------------------------------------------------------------------------
+test('sel-vic: filled blank value text color is #cc3333 (red)', async ({ page }) => {
+ await openSelVicRoute(page);
+ const root = deliveryContainer(page);
+
+ await root.locator('input[type="radio"]').first().check();
+ await page.waitForTimeout(100);
+
+ const blankValue = root.locator('.pie-blank-value');
+ await expect(blankValue).toBeVisible();
+
+ await expect(blankValue).toHaveCSS('color', 'rgb(204, 51, 51)');
+});
+
+// ---------------------------------------------------------------------------
+// 4. Choice rows are left-aligned with constrained width
+// sel_vic/main.scss: .sel-vic { max-width: 800px; margin: auto } and
+// vic.scss: .rli-vic-distractors { display: flex; flex-direction: column }
+// with .rli-vic-distractor { flex-direction: row-reverse; justify-content: start }
+// The choices fieldset should be no wider than 800px and left-aligned within
+// the constrained container.
+// Currently choice rows span the full viewport width.
+// ---------------------------------------------------------------------------
+test('sel-vic: choices fieldset width is at most 800px', async ({ page }) => {
+ await openSelVicRoute(page);
+ const root = deliveryContainer(page);
+
+ const fieldset = root.locator('.pie-choices-fieldset');
+ await expect(fieldset).toBeVisible();
+
+ const box = await fieldset.boundingBox();
+ expect(box).not.toBeNull();
+ expect(box?.width).toBeLessThanOrEqual(800);
+});
+
+// ---------------------------------------------------------------------------
+// 5. Choice label text is left-aligned
+// vic.scss: .rli-vic-distractor { flex-direction: row-reverse; justify-content: start }
+// places radio on the right and text on the left — text is left-aligned.
+// Currently .choice-html uses text-align: center and justify-content: center.
+// ---------------------------------------------------------------------------
+test('sel-vic: choice label text is left-aligned', async ({ page }) => {
+ await openSelVicRoute(page);
+ const root = deliveryContainer(page);
+
+ const firstLabel = root
+ .locator('.pie-choice:not(.pie-choice-horizontal) .pie-choice-label')
+ .first();
+ await expect(firstLabel).toBeVisible();
+
+ const textAlign = await firstLabel.evaluate((el) => getComputedStyle(el).textAlign);
+ expect(['left', 'start']).toContain(textAlign);
+});
+
+// ---------------------------------------------------------------------------
+// 6. Selected choice row has full-width yellow background (#fcfcd3)
+// vic.scss: .rli-vic-selected { background-color: #fcfcd3 } on the row element.
+// Currently background is applied only to .pie-choice-label-wrap.
+// ---------------------------------------------------------------------------
+test('sel-vic: selected choice row has full-width yellow background (#fcfcd3)', async ({
+ page,
+}) => {
+ await openSelVicRoute(page);
+ const root = deliveryContainer(page);
+
+ await root.locator('input[type="radio"]').first().check();
+ await page.waitForTimeout(100);
+
+ const selectedRow = root.locator('.pie-choice.is-selected').first();
+ await expect(selectedRow).toBeVisible();
+
+ await expect(selectedRow).toHaveCSS('background-color', 'rgb(252, 252, 211)');
+});
+
+// ---------------------------------------------------------------------------
+// 7. Hover background is applied to the full choice row (#f2f2f2)
+// vic.scss: .rli-vic-distractor:hover { background-color: #F2F2F2 } on the row.
+// Currently hover applies only to the inner .pie-choice-label-wrap with #ececec.
+// ---------------------------------------------------------------------------
+test('sel-vic: hovered unselected choice row background is #f2f2f2', async ({ page }) => {
+ await openSelVicRoute(page);
+ const root = deliveryContainer(page);
+
+ await expect(root.locator('input[type="radio"]:checked')).toHaveCount(0);
+
+ const firstRow = root.locator('.pie-choice:not(.pie-choice-horizontal)').first();
+ await expect(firstRow).toBeVisible();
+
+ await firstRow.hover();
+ await page.waitForTimeout(100);
+
+ await expect(firstRow).toHaveCSS('background-color', 'rgb(242, 242, 242)');
+});
+
+// ---------------------------------------------------------------------------
+// 8. Audio transcript is sr-only by default; revealed by rli-with-audio-transcript
+// sel_vic/main.scss: .rli-with-audio-transcript .rli-vic-audio-transcript { display: flex }
+// The transcript is hidden until an ancestor carries .rli-with-audio-transcript.
+// ---------------------------------------------------------------------------
+test('sel-vic: audio transcript is sr-only by default', async ({ page }) => {
+ await openSelVicRoute(page);
+ const transcript = deliveryContainer(page).locator('.pie-audio-transcript');
+ await expect(transcript).toBeAttached();
+ await expect(transcript).toHaveClass(/sr-only/);
+});
+
+test('sel-vic: audio transcript becomes visible when rli-with-audio-transcript is added to an ancestor', async ({
+ page,
+}) => {
+ await openSelVicRoute(page);
+ const transcript = deliveryContainer(page).locator('.pie-audio-transcript');
+ await expect(transcript).toHaveClass(/sr-only/);
+
+ await page.evaluate(() => {
+ document.querySelector('.demo-element-player')?.classList.add('rli-with-audio-transcript');
+ });
+
+ await expect(transcript).not.toHaveClass(/sr-only/);
+ await expect(transcript).toBeVisible();
+});
+
+// ---------------------------------------------------------------------------
+// 9. Audio transcript renders above the two-column grid (outside and above the
+// audio button / sentence row), not inside it.
+// Reference: sel_vic/src/question/index.js renders audioTranscript.render()
+// *before* the .sel-vic grid div, so it spans full width above both columns.
+// Currently the transcript may be placed inside the grid column alongside the
+// audio button, which means its bottom edge is at the same level as or below
+// the audio container's top edge.
+// ---------------------------------------------------------------------------
+test('sel-vic: audio transcript renders above the audio button (outside the two-column grid)', async ({
+ page,
+}) => {
+ await openSelVicRoute(page);
+ const root = deliveryContainer(page);
+
+ await page.evaluate(() => {
+ document.querySelector('.demo-element-player')?.classList.add('rli-with-audio-transcript');
+ });
+
+ const transcript = root.locator('.pie-audio-transcript');
+ const audioContainer = root.locator('.pie-audio-container');
+ await expect(transcript).toBeVisible();
+ await expect(audioContainer).toBeVisible();
+
+ const transcriptBox = await transcript.boundingBox();
+ const audioBox = await audioContainer.boundingBox();
+ expect(transcriptBox).not.toBeNull();
+ expect(audioBox).not.toBeNull();
+
+ // Transcript bottom edge must be above the audio container top edge.
+ expect(transcriptBox?.y + transcriptBox?.height).toBeLessThan(audioBox?.y);
+});
+
+// ---------------------------------------------------------------------------
+// Live side-by-side parity (requires LEARNOSITY_CONSUMER_KEY)
+// ---------------------------------------------------------------------------
+
+import { installAudioMock } from './audio-mock';
+import {
+ assertAudioPlayCycle,
+ assertBlankSlotAriaLabel,
+ assertBlankSlotAriaLive,
+ assertChoicesGroupAccessibleLabel,
+ assertChoicesGroupVisible,
+ assertScreenshotParity,
+} from './mc-populated-blank-parity-shared';
+import { PARITY_REGIONS } from './parity-regions';
+
+const CREDENTIALS_PRESENT = !!process.env.LEARNOSITY_CONSUMER_KEY;
+
+async function openSelVicParityRoute(page: import('@playwright/test').Page) {
+ await page.goto(`/mc-populated-blank/parity?demo=${encodeURIComponent(DEMO_ID)}`);
+ await page.waitForLoadState('domcontentloaded');
+ await page.waitForLoadState('networkidle');
+ await page.waitForSelector('#pie-container pie-element-player', { timeout: 20_000 });
+ await page.waitForSelector('[data-learnosity-ready="true"]', { timeout: 30_000 });
+}
+
+test.describe('sel-vic live parity — visual', () => {
+ test.skip(!CREDENTIALS_PRESENT, 'Skipped: LEARNOSITY_CONSUMER_KEY not set');
+
+ test('both sides render a choices group', async ({ page }) => {
+ await openSelVicParityRoute(page);
+ await assertChoicesGroupVisible(page);
+ });
+
+ test('filled blank value is red (#cc3333) on PIE side', async ({ page }) => {
+ await openSelVicParityRoute(page);
+ await page.locator('#pie-container input[type="radio"]').first().check();
+ await page.waitForTimeout(200);
+ const color = await page
+ .locator('#pie-container .pie-blank-value')
+ .first()
+ .evaluate((el) => getComputedStyle(el).color);
+ expect(color).toBe('rgb(204, 51, 51)');
+ });
+
+ test('transcript becomes visible on both sides when rli-with-audio-transcript is added to an ancestor', async ({
+ page,
+ }) => {
+ await openSelVicParityRoute(page);
+ await expect(page.locator('#pie-container .pie-audio-transcript')).toHaveClass(/sr-only/);
+
+ await page.evaluate(() => {
+ document.querySelector('#pie-container')?.classList.add('rli-with-audio-transcript');
+ document.querySelector('#learnosity-container')?.classList.add('rli-with-audio-transcript');
+ });
+
+ await expect(page.locator('#pie-container .pie-audio-transcript')).not.toHaveClass(/sr-only/);
+ const lrnTranscript = page
+ .locator(
+ '#learnosity-container [class*="audio-transcript"], #learnosity-container [class*="rli-vic-audio-transcript"]'
+ )
+ .first();
+ await expect(lrnTranscript).toBeVisible();
+ });
+
+ test('PIE stem and choices regions match Learnosity baseline screenshots', async ({
+ page,
+ }, testInfo) => {
+ await openSelVicParityRoute(page);
+ await assertScreenshotParity(page, testInfo, DEMO_ID, PARITY_REGIONS[DEMO_ID]);
+ });
+});
+
+test.describe('sel-vic live parity — aria', () => {
+ test.skip(!CREDENTIALS_PRESENT, 'Skipped: LEARNOSITY_CONSUMER_KEY not set');
+
+ test('choices group has an accessible label on both sides', async ({ page }) => {
+ await openSelVicParityRoute(page);
+ await assertChoicesGroupAccessibleLabel(page);
+ });
+
+ test('blank slot aria-label is "blank" on PIE side', async ({ page }) => {
+ await openSelVicParityRoute(page);
+ await assertBlankSlotAriaLabel(page);
+ });
+
+ test('blank slot has role="status" and aria-live="polite" on PIE side', async ({ page }) => {
+ await openSelVicParityRoute(page);
+ await assertBlankSlotAriaLive(page, { expectAriaAtomic: true });
+ });
+});
+
+test.describe('sel-vic live parity — behavioral', () => {
+ test.skip(!CREDENTIALS_PRESENT, 'Skipped: LEARNOSITY_CONSUMER_KEY not set');
+
+ test('PIE audio button cycles through play and ended states', async ({ page }) => {
+ await installAudioMock(page);
+ await openSelVicParityRoute(page);
+ await assertAudioPlayCycle(page);
+ });
+});
diff --git a/apps/element-demo/test/e2e/mc-populated-blank-selected-state-parity.spec.ts b/apps/element-demo/test/e2e/mc-populated-blank-selected-state-parity.spec.ts
new file mode 100644
index 00000000..7307172b
--- /dev/null
+++ b/apps/element-demo/test/e2e/mc-populated-blank-selected-state-parity.spec.ts
@@ -0,0 +1,83 @@
+/**
+ * Selected-state screenshot parity for mc-populated-blank.
+ *
+ * Captures stem and choices regions after the student selects the first choice.
+ * Covers all 14 text + graphic delivery variants (excludes ES and evaluate modes).
+ * Audio transcript is intentionally excluded — its rendering is unchanged by selection.
+ *
+ * Snapshot names: pie-${variantId}-stem-selected.png
+ * pie-${variantId}-choices-selected.png
+ */
+
+import { type Page, expect, test } from '@playwright/test';
+import { deliveryContainer, waitForMathRendering } from './test-helpers';
+
+const TEXT_VARIANTS = [
+ 'variant-sel-r1-plusggg',
+ 'variant-sr-vic',
+ 'variant-sel-vic',
+ 'variant-sel-r1-gplusggg',
+ 'variant-sel-r1-g-stem',
+ 'variant-sel-r1-gg-plus',
+ 'variant-sel-r1-ggplus',
+ 'variant-sel-r1-s3',
+] as const;
+
+const GRAPHIC_VARIANTS = [
+ 'variant-sel-r1-plusggg-graphic',
+ 'variant-sel-r1-gplusggg-graphic',
+ 'variant-sel-r1-gg-plus-graphic',
+ 'variant-sel-r1-ggplus-graphic',
+ 'variant-sel-r1-g-stem-graphic',
+ 'variant-sel-r1-s3-graphic',
+] as const;
+
+const GRAPHIC_SET = new Set(GRAPHIC_VARIANTS);
+
+async function openRoute(page: Page, demoId: string) {
+ await page.goto(
+ `/mc-populated-blank/deliver?mode=gather&role=student&demo=${encodeURIComponent(demoId)}&player=esm`
+ );
+ await page.waitForLoadState('domcontentloaded');
+ await page.waitForLoadState('networkidle');
+ await page.waitForSelector('[data-testid="role-student"]', { timeout: 20_000 });
+ await waitForMathRendering(page);
+
+ if (GRAPHIC_SET.has(demoId)) {
+ await page.waitForFunction(
+ () => {
+ const imgs = Array.from(document.querySelectorAll('.pie-choice img')) as HTMLImageElement[];
+ return imgs.length > 0 && imgs.every((img) => img.complete && img.naturalWidth > 0);
+ },
+ { timeout: 30_000 }
+ );
+ }
+}
+
+for (const demoId of [...TEXT_VARIANTS, ...GRAPHIC_VARIANTS]) {
+ test.describe(demoId, () => {
+ test('stem region matches snapshot after first choice selected', async ({ page }) => {
+ await openRoute(page, demoId);
+ const root = deliveryContainer(page);
+
+ await root.locator('input[type="radio"]').first().check();
+ await page.waitForTimeout(150);
+
+ const stem = root.locator('.pie-template-line');
+ await expect(stem).toBeVisible();
+ await expect(stem).toHaveScreenshot(`pie-${demoId}-stem-selected.png`);
+ });
+
+ test('choices region matches snapshot after first choice selected', async ({ page }) => {
+ await openRoute(page, demoId);
+ const root = deliveryContainer(page);
+
+ await root.locator('input[type="radio"]').first().check();
+ await page.waitForTimeout(150);
+
+ const choices = root.locator('.pie-choices-fieldset');
+ await expect(choices).toBeVisible();
+ await expect(choices).toHaveScreenshot(`pie-${demoId}-choices-selected.png`);
+ });
+ });
+}
diff --git a/apps/element-demo/test/e2e/mc-populated-blank-sr-vic-parity.spec.ts b/apps/element-demo/test/e2e/mc-populated-blank-sr-vic-parity.spec.ts
new file mode 100644
index 00000000..3d33f077
--- /dev/null
+++ b/apps/element-demo/test/e2e/mc-populated-blank-sr-vic-parity.spec.ts
@@ -0,0 +1,220 @@
+/**
+ * Visual-parity tests for mc-populated-blank (sr-vic variant).
+ *
+ * Each test corresponds to a gap visible in the side-by-side comparison of
+ * sr_vic.png (reference) vs McPopulatedBlankAsBuilt.png (current output).
+ * Reference CSS: web-ItemBankViewer/learnosity/templates/Renaissance/vic.scss
+ *
+ * All tests are expected to FAIL until the underlying style/layout issues are resolved.
+ *
+ * Reference variant: variant-sr-vic (inline_sentence layout, vertical choices)
+ */
+
+import { expect, test } from '@playwright/test';
+import { deliveryContainer, waitForMathRendering } from './test-helpers';
+
+const DEMO_ID = 'variant-sr-vic';
+
+async function openSrVicRoute(page: Parameters[0]['page']) {
+ await page.goto(
+ `/mc-populated-blank/deliver?mode=gather&role=student&demo=${encodeURIComponent(DEMO_ID)}&player=esm`
+ );
+ await page.waitForLoadState('domcontentloaded');
+ await page.waitForLoadState('networkidle');
+ await page.waitForSelector('[data-testid="role-student"]', { timeout: 20_000 });
+ await waitForMathRendering(page);
+}
+
+// ---------------------------------------------------------------------------
+// 1. Template sentence and blank slot are on the same line
+// vic.scss: .rli-vic-answer wraps sentence and cloze in inline flex so the
+// blank stays inline within the sentence text.
+// Current issue: the tag inside the template HTML is rendered as a
+// block element, pushing the blank slot to a new line.
+// ---------------------------------------------------------------------------
+test('sr-vic: blank slot stays inline within the template sentence (no line break)', async ({
+ page,
+}) => {
+ await openSrVicRoute(page);
+ const root = deliveryContainer(page);
+
+ const templateLine = root.locator('.pie-template-line');
+ const blankSlot = root.locator('.pie-blank-slot');
+ await expect(templateLine).toBeVisible();
+ await expect(blankSlot).toBeVisible();
+
+ const templateBox = await templateLine.boundingBox();
+ const blankBox = await blankSlot.boundingBox();
+ expect(templateBox).not.toBeNull();
+ expect(blankBox).not.toBeNull();
+
+ // When blank wraps: the
before it occupies one full line (~20px at 16px
+ // font / 123% line-height), so blankBox.y - templateBox.y ≈ 20px.
+ // When inline (correct): both start at the same Y, so difference ≈ 0.
+ const verticalOffset = blankBox?.y - templateBox?.y;
+ expect(verticalOffset).toBeLessThan(10);
+});
+
+// ---------------------------------------------------------------------------
+// 2. Filled blank value text is red (#cc3333)
+// vic.scss: .rli-vic-cloze > .rli-vic-content-element { color: #cc3333 }
+// The filled-in answer text inside the blank slot should be rendered in red.
+// Current sr-vic.css has no color override for .pie-blank-value.
+// ---------------------------------------------------------------------------
+test('sr-vic: filled blank value text color is #cc3333 (red)', async ({ page }) => {
+ await openSrVicRoute(page);
+ const root = deliveryContainer(page);
+
+ await root.locator('input[type="radio"]').first().check();
+ await page.waitForTimeout(100);
+
+ const blankValue = root.locator('.pie-blank-value');
+ await expect(blankValue).toBeVisible();
+
+ await expect(blankValue).toHaveCSS('color', 'rgb(204, 51, 51)');
+});
+
+// ---------------------------------------------------------------------------
+// 3. Selected choice row background is full-width yellow (#fcfcd3)
+// vic.scss: .rli-vic-selected { background-color: #fcfcd3 } is applied to
+// the whole distractor row element, covering radio + label together.
+// Currently background is applied only to .pie-choice-label-wrap, and uses
+// grey (#f1f1f1) as the default, not yellow (#fcfcd3).
+// ---------------------------------------------------------------------------
+test('sr-vic: selected choice row has full-width yellow background (#fcfcd3)', async ({ page }) => {
+ await openSrVicRoute(page);
+ const root = deliveryContainer(page);
+
+ await root.locator('input[type="radio"]').first().check();
+ await page.waitForTimeout(100);
+
+ const selectedRow = root.locator('.pie-choice.is-selected').first();
+ await expect(selectedRow).toBeVisible();
+
+ // Background must be on the row itself (covering radio + label),
+ // not only on the inner .pie-choice-label-wrap.
+ await expect(selectedRow).toHaveCSS('background-color', 'rgb(252, 252, 211)');
+});
+
+// ---------------------------------------------------------------------------
+// 4. Choice label text is left-aligned
+// vic.scss: distractor label text sits immediately right of the radio input
+// with no centering. Current .choice-html uses text-align: center and
+// justify-content: center, so text floats to the centre of the label area.
+// ---------------------------------------------------------------------------
+test('sr-vic: choice label text is left-aligned', async ({ page }) => {
+ await openSrVicRoute(page);
+ const root = deliveryContainer(page);
+
+ const firstLabel = root
+ .locator('.pie-choice:not(.pie-choice-horizontal) .pie-choice-label')
+ .first();
+ await expect(firstLabel).toBeVisible();
+
+ const textAlign = await firstLabel.evaluate((el) => getComputedStyle(el).textAlign);
+
+ expect(['left', 'start']).toContain(textAlign);
+});
+
+// ---------------------------------------------------------------------------
+// 5. Hover background is applied to the full choice row (#f2f2f2)
+// vic.scss: .rli-vic-distractor:hover { background-color: #F2F2F2 }
+// Currently hover background (#ececec) is applied to .pie-choice-label-wrap,
+// not the row, and uses the wrong colour.
+// ---------------------------------------------------------------------------
+test('sr-vic: hovered unselected choice row background is #f2f2f2', async ({ page }) => {
+ await openSrVicRoute(page);
+ const root = deliveryContainer(page);
+
+ await expect(root.locator('input[type="radio"]:checked')).toHaveCount(0);
+
+ const firstRow = root.locator('.pie-choice:not(.pie-choice-horizontal)').first();
+ await expect(firstRow).toBeVisible();
+
+ await firstRow.hover();
+ await page.waitForTimeout(100);
+
+ // Background must be on the row itself, not only the inner label wrapper.
+ await expect(firstRow).toHaveCSS('background-color', 'rgb(242, 242, 242)');
+});
+
+// ---------------------------------------------------------------------------
+// Live side-by-side parity (requires LEARNOSITY_CONSUMER_KEY)
+// ---------------------------------------------------------------------------
+
+import {
+ assertBlankSlotAriaLabel,
+ assertBlankSlotAriaLive,
+ assertChoicesGroupAccessibleLabel,
+ assertChoicesGroupVisible,
+ assertScreenshotParity,
+} from './mc-populated-blank-parity-shared';
+import { PARITY_REGIONS } from './parity-regions';
+
+const CREDENTIALS_PRESENT = !!process.env.LEARNOSITY_CONSUMER_KEY;
+
+async function openSrVicParityRoute(page: import('@playwright/test').Page) {
+ await page.goto(`/mc-populated-blank/parity?demo=${encodeURIComponent(DEMO_ID)}`);
+ await page.waitForLoadState('domcontentloaded');
+ await page.waitForLoadState('networkidle');
+ await page.waitForSelector('#pie-container pie-element-player', { timeout: 20_000 });
+ await page.waitForSelector('[data-learnosity-ready="true"]', { timeout: 30_000 });
+}
+
+test.describe('sr-vic live parity — visual', () => {
+ test.skip(!CREDENTIALS_PRESENT, 'Skipped: LEARNOSITY_CONSUMER_KEY not set');
+
+ test('both sides render a choices group', async ({ page }) => {
+ await openSrVicParityRoute(page);
+ await assertChoicesGroupVisible(page);
+ });
+
+ test('filled blank value is red (#cc3333) on PIE side', async ({ page }) => {
+ await openSrVicParityRoute(page);
+ await page.locator('#pie-container input[type="radio"]').first().check();
+ await page.waitForTimeout(200);
+ const color = await page
+ .locator('#pie-container .pie-blank-value')
+ .first()
+ .evaluate((el) => getComputedStyle(el).color);
+ expect(color).toBe('rgb(204, 51, 51)');
+ });
+
+ test('audio transcript is sr-only (not visibly rendered) on PIE side', async ({ page }) => {
+ await openSrVicParityRoute(page);
+ const transcript = page.locator('#pie-container .pie-audio-transcript');
+ // sr-vic uses showVisibleTranscript: false — transcript should be sr-only or absent
+ const isVisible = await transcript.isVisible().catch(() => false);
+ if (isVisible) {
+ const clip = await transcript.evaluate((el) => getComputedStyle(el).clip);
+ // sr-only uses clip: rect(0,0,0,0)
+ expect(clip).toMatch(/rect\(0/);
+ }
+ });
+
+ test('PIE stem and choices regions match Learnosity baseline screenshots', async ({
+ page,
+ }, testInfo) => {
+ await openSrVicParityRoute(page);
+ await assertScreenshotParity(page, testInfo, DEMO_ID, PARITY_REGIONS[DEMO_ID]);
+ });
+});
+
+test.describe('sr-vic live parity — aria', () => {
+ test.skip(!CREDENTIALS_PRESENT, 'Skipped: LEARNOSITY_CONSUMER_KEY not set');
+
+ test('choices group has an accessible label on both sides', async ({ page }) => {
+ await openSrVicParityRoute(page);
+ await assertChoicesGroupAccessibleLabel(page);
+ });
+
+ test('blank slot aria-label is "blank" on PIE side', async ({ page }) => {
+ await openSrVicParityRoute(page);
+ await assertBlankSlotAriaLabel(page);
+ });
+
+ test('blank slot has role="status" and aria-live="polite" on PIE side', async ({ page }) => {
+ await openSrVicParityRoute(page);
+ await assertBlankSlotAriaLive(page);
+ });
+});
diff --git a/apps/element-demo/test/e2e/mc-populated-blank-transcript-parity.spec.ts b/apps/element-demo/test/e2e/mc-populated-blank-transcript-parity.spec.ts
new file mode 100644
index 00000000..c359772e
--- /dev/null
+++ b/apps/element-demo/test/e2e/mc-populated-blank-transcript-parity.spec.ts
@@ -0,0 +1,250 @@
+/**
+ * Transcript visibility parity tests for mc-populated-blank.
+ *
+ * Reference: web-ItemBankViewer/learnosity/templates/Renaissance/sel_r1-_plusggg/
+ * The reference renders the transcript text when .rli-with-audio-transcript is
+ * present on an ancestor element — not via a model flag.
+ *
+ * Transcript visibility is driven entirely by the player-level ancestor class.
+ * There is no model-flag path — showVisibleTranscript on the model is ignored.
+ */
+
+import { expect, test } from '@playwright/test';
+import { deliveryContainer, waitForMathRendering } from './test-helpers';
+
+const DEMO_ID = 'variant-sel-r1-plusggg';
+const TRANSCRIPT_TEXT = 'The word is look. Pick the correct spelling of the word look.';
+
+async function openRoute(page: Parameters[0]['page'], demo = DEMO_ID) {
+ await page.goto(
+ `/mc-populated-blank/deliver?mode=gather&role=student&demo=${encodeURIComponent(demo)}&player=esm`
+ );
+ await page.waitForLoadState('networkidle');
+ await page.waitForSelector('[data-testid="role-student"]', { timeout: 20_000 });
+ await waitForMathRendering(page);
+}
+
+// ---------------------------------------------------------------------------
+// rli-with-audio-transcript ancestor class trigger (the bug case)
+// ---------------------------------------------------------------------------
+
+test('plusggg: transcript is sr-only without rli-with-audio-transcript ancestor', async ({
+ page,
+}) => {
+ await openRoute(page);
+ const root = deliveryContainer(page);
+ const transcript = root.locator('.pie-audio-transcript');
+ await expect(transcript).toBeAttached();
+ await expect(transcript).toHaveClass(/sr-only/);
+});
+
+test('plusggg: adding rli-with-audio-transcript to ancestor makes transcript visible', async ({
+ page,
+}) => {
+ await openRoute(page);
+ const root = deliveryContainer(page);
+ const transcript = root.locator('.pie-audio-transcript');
+
+ // Baseline: hidden
+ await expect(transcript).toHaveClass(/sr-only/);
+
+ // Add the class to the .demo-element-player ancestor (same as the toolbar checkbox does)
+ await page.evaluate(() => {
+ document.querySelector('.demo-element-player')?.classList.add('rli-with-audio-transcript');
+ });
+
+ await expect(transcript).not.toHaveClass(/sr-only/);
+ await expect(transcript).toBeVisible();
+});
+
+test('plusggg: removing rli-with-audio-transcript from ancestor hides transcript again', async ({
+ page,
+}) => {
+ await openRoute(page);
+ const root = deliveryContainer(page);
+ const transcript = root.locator('.pie-audio-transcript');
+
+ await page.evaluate(() => {
+ document.querySelector('.demo-element-player')?.classList.add('rli-with-audio-transcript');
+ });
+ await expect(transcript).not.toHaveClass(/sr-only/);
+
+ await page.evaluate(() => {
+ document.querySelector('.demo-element-player')?.classList.remove('rli-with-audio-transcript');
+ });
+ await expect(transcript).toHaveClass(/sr-only/);
+});
+
+test('plusggg: transcript contains the correct text when made visible via ancestor class', async ({
+ page,
+}) => {
+ await openRoute(page);
+ const root = deliveryContainer(page);
+
+ await page.evaluate(() => {
+ document.querySelector('.demo-element-player')?.classList.add('rli-with-audio-transcript');
+ });
+
+ const transcript = root.locator('.pie-audio-transcript');
+ await expect(transcript).toContainText(TRANSCRIPT_TEXT);
+});
+
+// ---------------------------------------------------------------------------
+// Visible transcript layout assertions (ancestor class path)
+// ---------------------------------------------------------------------------
+
+test('plusggg: transcript is visible when rli-with-audio-transcript is on an ancestor', async ({
+ page,
+}) => {
+ await openRoute(page);
+ const root = deliveryContainer(page);
+
+ await page.evaluate(() => {
+ document.querySelector('.demo-element-player')?.classList.add('rli-with-audio-transcript');
+ });
+
+ const transcript = root.locator('.pie-audio-transcript');
+ await expect(transcript).toBeVisible();
+ await expect(transcript).not.toHaveClass(/sr-only/);
+});
+
+test('plusggg: transcript text is center-aligned when visible', async ({ page }) => {
+ await openRoute(page);
+ const root = deliveryContainer(page);
+
+ await page.evaluate(() => {
+ document.querySelector('.demo-element-player')?.classList.add('rli-with-audio-transcript');
+ });
+
+ const transcript = root.locator('.pie-audio-transcript');
+ await expect(transcript).toHaveCSS('text-align', 'center');
+});
+
+test('plusggg: transcript renders above the choice tiles when visible', async ({ page }) => {
+ await openRoute(page);
+ const root = deliveryContainer(page);
+
+ await page.evaluate(() => {
+ document.querySelector('.demo-element-player')?.classList.add('rli-with-audio-transcript');
+ });
+
+ const transcript = root.locator('.pie-audio-transcript');
+ const firstChoice = root.locator('.pie-choice').first();
+
+ const transcriptBox = await transcript.boundingBox();
+ const choiceBox = await firstChoice.boundingBox();
+
+ expect(transcriptBox).not.toBeNull();
+ expect(choiceBox).not.toBeNull();
+ expect(transcriptBox?.y + transcriptBox?.height).toBeLessThan(choiceBox?.y);
+});
+
+// ---------------------------------------------------------------------------
+// Cross-variant: transcript hidden by default, revealed by rli-with-audio-transcript
+// Covers all variants that have audio + a transcript string.
+// ---------------------------------------------------------------------------
+
+// sr-vic is excluded: it has no audio component and therefore no transcript.
+// Only SEL variants have audio + transcript.
+const AUDIO_TRANSCRIPT_VARIANTS: Array<{ demoId: string; label: string }> = [
+ { demoId: 'variant-sel-r1-plusggg', label: 'plusggg' },
+ { demoId: 'variant-sel-vic', label: 'sel-vic' },
+ { demoId: 'variant-sel-r1-gplusggg', label: 'gplusggg' },
+ { demoId: 'variant-sel-r1-g-stem', label: 'g-stem' },
+ { demoId: 'variant-sel-r1-gg-plus', label: 'gg-plus' },
+ { demoId: 'variant-sel-r1-ggplus', label: 'ggplus' },
+ { demoId: 'variant-sel-r1-s3', label: 's3' },
+ { demoId: 'variant-sel-r1-plusggg-graphic', label: 'plusggg-graphic' },
+ { demoId: 'variant-sel-r1-gplusggg-graphic', label: 'gplusggg-graphic' },
+ { demoId: 'variant-sel-r1-gg-plus-graphic', label: 'gg-plus-graphic' },
+ { demoId: 'variant-sel-r1-ggplus-graphic', label: 'ggplus-graphic' },
+ { demoId: 'variant-sel-r1-g-stem-graphic', label: 'g-stem-graphic' },
+ { demoId: 'variant-sel-r1-s3-graphic', label: 's3-graphic' },
+];
+
+for (const { demoId, label } of AUDIO_TRANSCRIPT_VARIANTS) {
+ test(`${label}: transcript is sr-only by default (no rli-with-audio-transcript ancestor)`, async ({
+ page,
+ }) => {
+ await openRoute(page, demoId);
+ const transcript = deliveryContainer(page).locator('.pie-audio-transcript');
+ await expect(transcript).toBeAttached();
+ await expect(transcript).toHaveClass(/sr-only/);
+ });
+
+ test(`${label}: transcript becomes visible when rli-with-audio-transcript is added to an ancestor`, async ({
+ page,
+ }) => {
+ await openRoute(page, demoId);
+ const transcript = deliveryContainer(page).locator('.pie-audio-transcript');
+
+ await expect(transcript).toHaveClass(/sr-only/);
+
+ await page.evaluate(() => {
+ document.querySelector('.demo-element-player')?.classList.add('rli-with-audio-transcript');
+ });
+
+ await expect(transcript).not.toHaveClass(/sr-only/);
+ await expect(transcript).toBeVisible();
+ });
+
+ test(`${label}: transcript returns to sr-only when rli-with-audio-transcript is removed`, async ({
+ page,
+ }) => {
+ await openRoute(page, demoId);
+ const transcript = deliveryContainer(page).locator('.pie-audio-transcript');
+
+ await page.evaluate(() => {
+ document.querySelector('.demo-element-player')?.classList.add('rli-with-audio-transcript');
+ });
+ await expect(transcript).not.toHaveClass(/sr-only/);
+
+ await page.evaluate(() => {
+ document.querySelector('.demo-element-player')?.classList.remove('rli-with-audio-transcript');
+ });
+ await expect(transcript).toHaveClass(/sr-only/);
+ });
+
+ test(`${label}: transcript top is at or above all other question content when visible`, async ({
+ page,
+ }) => {
+ await openRoute(page, demoId);
+ const root = deliveryContainer(page);
+
+ await page.evaluate(() => {
+ document.querySelector('.demo-element-player')?.classList.add('rli-with-audio-transcript');
+ });
+
+ const transcript = root.locator('.pie-audio-transcript');
+ await expect(transcript).toBeVisible();
+
+ const transcriptBox = await transcript.boundingBox();
+ expect(transcriptBox).not.toBeNull();
+
+ // The transcript must be the topmost element — its top Y must be at or above
+ // all other visible content. The audio container may share the same grid row
+ // (token_sequence: 'transcript audio'), so we allow it to start above the
+ // transcript bottom but not above the transcript top.
+ const otherSelectors = ['.pie-template-line', '.pie-choices-fieldset', '.pie-sentence-line'];
+ for (const sel of otherSelectors) {
+ const el = root.locator(sel).first();
+ if (!(await el.isVisible())) continue;
+ const box = await el.boundingBox();
+ if (!box) continue;
+ expect(box.y).toBeGreaterThanOrEqual(transcriptBox?.y - 5);
+ }
+ });
+
+ test(`${label}: transcript region matches committed snapshot when visible`, async ({ page }) => {
+ await openRoute(page, demoId);
+ const root = deliveryContainer(page);
+
+ await page.evaluate(() => {
+ document.querySelector('.demo-element-player')?.classList.add('rli-with-audio-transcript');
+ });
+
+ const transcript = root.locator('.pie-audio-transcript');
+ await expect(transcript).toBeVisible();
+ await expect(transcript).toHaveScreenshot(`pie-${demoId}-transcript.png`);
+ });
+}
diff --git a/apps/element-demo/test/e2e/mc-populated-blank-visual-parity.spec.ts b/apps/element-demo/test/e2e/mc-populated-blank-visual-parity.spec.ts
new file mode 100644
index 00000000..980499e2
--- /dev/null
+++ b/apps/element-demo/test/e2e/mc-populated-blank-visual-parity.spec.ts
@@ -0,0 +1,375 @@
+/**
+ * Visual-parity tests for mc-populated-blank (plusggg / gplusggg variants).
+ *
+ * Each test corresponds to an annotated gap in the PIEOneer LSY-vs-PIE
+ * comparison screenshot. Expected values are sourced from the upstream
+ * Renaissance r1.scss. All tests are expected to FAIL until the underlying
+ * layout/style issues are resolved.
+ *
+ * Reference variant: variant-sel-r1-plusggg (audio_blank_only layout, horizontal choices)
+ * Reference CSS: web-ItemBankViewer/learnosity/templates/Renaissance/r1.scss
+ */
+
+import { expect, test } from '@playwright/test';
+import { deliveryContainer, waitForMathRendering } from './test-helpers';
+import {
+ assertChoicesGroupVisible,
+ assertScreenshotParity,
+} from './mc-populated-blank-parity-shared';
+import { PARITY_REGIONS } from './parity-regions';
+
+const DEMO_ID = 'variant-sel-r1-plusggg';
+const ELEMENT_SCOPE = '.delivery-view .element-container';
+
+async function openPlusgggRoute(page: Parameters[0]['page']) {
+ await page.goto(
+ `/mc-populated-blank/deliver?mode=gather&role=student&demo=${encodeURIComponent(DEMO_ID)}&player=esm`
+ );
+ await page.waitForLoadState('domcontentloaded');
+ await page.waitForLoadState('networkidle');
+ await page.waitForSelector('[data-testid="role-student"]', { timeout: 20_000 });
+ await waitForMathRendering(page);
+}
+
+// ---------------------------------------------------------------------------
+// 1. Space between distractors
+// r1.scss: .rli-r1-distractors uses justify-content: space-between at >=850px.
+// The minimum visible gap between adjacent tiles should be at least 16px.
+// ---------------------------------------------------------------------------
+test('plusggg: gap between adjacent choice tiles is at least 16px', async ({ page }) => {
+ await openPlusgggRoute(page);
+ const root = deliveryContainer(page);
+
+ const tiles = root.locator('.choice-row-horizontal');
+ await expect(tiles).toHaveCount(3);
+
+ const boxes = await tiles.evaluateAll((els) =>
+ els.map((el) => el.getBoundingClientRect().toJSON())
+ );
+
+ const gap01 = boxes[1].left - boxes[0].right;
+ const gap12 = boxes[2].left - boxes[1].right;
+
+ expect(gap01).toBeGreaterThanOrEqual(16);
+ expect(gap12).toBeGreaterThanOrEqual(16);
+});
+
+// ---------------------------------------------------------------------------
+// 2. Font size of choice label content
+// r1.scss: .rli-r1-content-element { font-size: 1.9em; line-height: 89px }
+// Computed font-size on the inner span should be >= 28px (1.8em × 16px base).
+// ---------------------------------------------------------------------------
+test('plusggg: choice label font-size is at least 28px', async ({ page }) => {
+ await openPlusgggRoute(page);
+ const root = deliveryContainer(page);
+
+ const firstLabel = root.locator('.pie-choice-label').first();
+ await expect(firstLabel).toBeVisible();
+
+ const computedFontSize = await firstLabel.evaluate((el) => {
+ const inner = el.querySelector('span') ?? el;
+ return parseFloat(getComputedStyle(inner).fontSize);
+ });
+
+ expect(computedFontSize).toBeGreaterThanOrEqual(28);
+});
+
+// ---------------------------------------------------------------------------
+// 3. Cloze marker (blank underline) thickness
+// r1.scss: .rli-r1-cloze { border-bottom: 6px solid }
+// Port currently uses 4px for audio_blank_only; expected is 6px.
+// ---------------------------------------------------------------------------
+test('plusggg: blank slot underline is 6px', async ({ page }) => {
+ await openPlusgggRoute(page);
+ const root = deliveryContainer(page);
+
+ const blank = root.locator('.pie-blank-slot');
+ await expect(blank).toBeVisible();
+
+ const borderWidth = await blank.evaluate((el) =>
+ parseFloat(getComputedStyle(el).borderBottomWidth)
+ );
+
+ expect(borderWidth).toBe(6);
+});
+
+// ---------------------------------------------------------------------------
+// 4. Space between cloze underline edges and the filled-in text
+// r1.scss: .rli-r1-cloze { padding-bottom: 4px } — visible gap between
+// text and the underline bottom edge. The blank slot should have at least
+// 4px bottom padding so the text doesn't sit flush on the underline.
+// ---------------------------------------------------------------------------
+test('plusggg: blank slot has at least 4px bottom padding', async ({ page }) => {
+ await openPlusgggRoute(page);
+ const root = deliveryContainer(page);
+
+ // Populate the blank so the padding is visible.
+ await root.locator('input[type="radio"]').first().check();
+ await page.waitForTimeout(100);
+
+ const blank = root.locator('.pie-blank-slot');
+ const paddingBottom = await blank.evaluate((el) =>
+ parseFloat(getComputedStyle(el).paddingBottom)
+ );
+
+ expect(paddingBottom).toBeGreaterThanOrEqual(4);
+});
+
+// ---------------------------------------------------------------------------
+// 5a. Color of unselected (non-hover) choice tile
+// r1.scss: .rli-r1-distractor has no background-color by default.
+// Unselected tiles must be transparent or white.
+// ---------------------------------------------------------------------------
+test('plusggg: unselected choice tile background is transparent or white', async ({ page }) => {
+ await openPlusgggRoute(page);
+ const root = deliveryContainer(page);
+
+ await expect(root.locator('input[type="radio"]:checked')).toHaveCount(0);
+
+ const firstTile = root.locator('.choice-tile').first();
+ await expect(firstTile).toBeVisible();
+
+ const bg = await firstTile.evaluate((el) => getComputedStyle(el).backgroundColor);
+
+ const isTransparentOrWhite =
+ bg === 'rgba(0, 0, 0, 0)' || bg === 'transparent' || bg === 'rgb(255, 255, 255)';
+ expect(isTransparentOrWhite).toBe(true);
+});
+
+// ---------------------------------------------------------------------------
+// 5b. Color of selected choice tile
+// r1.scss: .rli-r1-selected { background-color: #fcfcd3 } (light yellow)
+// Port currently uses #f1f1f1 (grey). Expected: rgb(252, 252, 211).
+// ---------------------------------------------------------------------------
+test('plusggg: selected choice tile background is light yellow (#fcfcd3)', async ({ page }) => {
+ await openPlusgggRoute(page);
+ const root = deliveryContainer(page);
+
+ await root.locator('input[type="radio"]').first().check();
+ await page.waitForTimeout(100);
+
+ const selectedTile = root.locator('.choice-row-horizontal.is-selected .choice-tile').first();
+ await expect(selectedTile).toBeVisible();
+
+ await expect(selectedTile).toHaveCSS('background-color', 'rgb(252, 252, 211)');
+});
+
+// ---------------------------------------------------------------------------
+// 6. Radio input sits away from the tile bottom edge
+// r1.scss: .rli-r1-distractor>input { padding: 20px } — browsers ignore
+// padding on radio inputs in getComputedStyle, so we test the visual gap
+// between the radio bottom edge and the tile bottom edge instead (>= 8px).
+// ---------------------------------------------------------------------------
+test('plusggg: radio input has at least 8px clearance from tile bottom edge', async ({ page }) => {
+ await openPlusgggRoute(page);
+ const root = deliveryContainer(page);
+
+ const firstTile = root.locator('.choice-tile').first();
+ const firstRadio = root.locator('.choice-radio-bottom').first();
+ await expect(firstTile).toBeVisible();
+ await expect(firstRadio).toBeVisible();
+
+ const tileBox = await firstTile.boundingBox();
+ const radioBox = await firstRadio.boundingBox();
+ expect(tileBox).not.toBeNull();
+ expect(radioBox).not.toBeNull();
+
+ const clearance = tileBox?.y + tileBox?.height - (radioBox?.y + radioBox?.height);
+ expect(clearance).toBeGreaterThanOrEqual(8);
+});
+
+// ---------------------------------------------------------------------------
+// 7. Blank slot height
+// r1.scss: .rli-r1-cloze { height: 160px }
+// The blank slot container should be at least 160px tall.
+// ---------------------------------------------------------------------------
+test('plusggg: blank slot height is at least 160px', async ({ page }) => {
+ await openPlusgggRoute(page);
+ const root = deliveryContainer(page);
+
+ const blank = root.locator('.pie-blank-slot');
+ await expect(blank).toBeVisible();
+
+ const box = await blank.boundingBox();
+ expect(box).not.toBeNull();
+ expect(box?.height).toBeGreaterThanOrEqual(160);
+});
+
+// ---------------------------------------------------------------------------
+// 8. Gap between blank slot and distractors group
+// r1.scss: .rli-r1-cloze { margin-bottom: 30px }
+// Distance between bottom of blank slot and top of first choice tile >= 30px.
+// ---------------------------------------------------------------------------
+test('plusggg: gap between blank slot and choice tiles is at least 30px', async ({ page }) => {
+ await openPlusgggRoute(page);
+ const root = deliveryContainer(page);
+
+ const blank = root.locator('.pie-blank-slot');
+ const firstTile = root.locator('.choice-row-horizontal').first();
+ await expect(blank).toBeVisible();
+ await expect(firstTile).toBeVisible();
+
+ const blankBox = await blank.boundingBox();
+ const tileBox = await firstTile.boundingBox();
+ expect(blankBox).not.toBeNull();
+ expect(tileBox).not.toBeNull();
+
+ const gap = tileBox?.y - (blankBox?.y + blankBox?.height);
+ expect(gap).toBeGreaterThanOrEqual(30);
+});
+
+// ---------------------------------------------------------------------------
+// 9. Distractor tile minimum height
+// r1.scss: .rli-r1-distractor { min-height: 180px }
+// Each horizontal choice tile should be at least 180px tall.
+// ---------------------------------------------------------------------------
+test('plusggg: each choice tile is at least 180px tall', async ({ page }) => {
+ await openPlusgggRoute(page);
+ const root = deliveryContainer(page);
+
+ const tiles = root.locator('.choice-row-horizontal');
+ await expect(tiles).toHaveCount(3);
+
+ const heights = await tiles.evaluateAll((els) =>
+ els.map((el) => el.getBoundingClientRect().height)
+ );
+
+ for (const h of heights) {
+ expect(h).toBeGreaterThanOrEqual(180);
+ }
+});
+
+// ---------------------------------------------------------------------------
+// 10. Content element min-height inside tile
+// r1.scss: .rli-r1-content-element { min-height: 150px }
+// The text content area inside each tile should be at least 150px tall.
+// ---------------------------------------------------------------------------
+test('plusggg: choice tile content area is at least 150px tall', async ({ page }) => {
+ await openPlusgggRoute(page);
+ const root = deliveryContainer(page);
+
+ const firstContent = root.locator('.choice-tile-content').first();
+ await expect(firstContent).toBeVisible();
+
+ const box = await firstContent.boundingBox();
+ expect(box).not.toBeNull();
+ expect(box?.height).toBeGreaterThanOrEqual(150);
+});
+
+// ---------------------------------------------------------------------------
+// 11. Hover background color on unselected tile
+// r1.scss: .rli-r1-distractor:hover { background-color: #f2f2f2 }
+// Port uses #ececec. Expected on hover: rgb(242, 242, 242).
+// ---------------------------------------------------------------------------
+test('plusggg: hovered unselected tile background is #f2f2f2', async ({ page }) => {
+ await openPlusgggRoute(page);
+ const root = deliveryContainer(page);
+
+ const firstTile = root.locator('.choice-tile').first();
+ await expect(firstTile).toBeVisible();
+
+ await firstTile.hover();
+ await page.waitForTimeout(100);
+
+ await expect(firstTile).toHaveCSS('background-color', 'rgb(242, 242, 242)');
+});
+
+// ---------------------------------------------------------------------------
+// 12. Distractors group is horizontally centered
+// r1.scss: .rli-r1-distractors { align-items: center } and the outer
+// container is centered. The choices fieldset mid-point should be within
+// 20px of the viewport horizontal center.
+// ---------------------------------------------------------------------------
+test('plusggg: choice tiles are horizontally centered in the viewport', async ({ page }) => {
+ await openPlusgggRoute(page);
+ const root = deliveryContainer(page);
+
+ const fieldset = root.locator('.pie-choices-fieldset');
+ await expect(fieldset).toBeVisible();
+
+ const [fieldsetBox, viewportWidth] = await Promise.all([
+ fieldset.boundingBox(),
+ page.evaluate(() => window.innerWidth),
+ ]);
+ expect(fieldsetBox).not.toBeNull();
+
+ const fieldsetMidX = fieldsetBox?.x + fieldsetBox?.width / 2;
+ const viewportMidX = viewportWidth / 2;
+
+ expect(Math.abs(fieldsetMidX - viewportMidX)).toBeLessThanOrEqual(20);
+});
+
+// ---------------------------------------------------------------------------
+// 13. Audio button is in the top-right corner
+// r1.scss: .rli-r1-instructions { align-items: flex-end } — the audio
+// button sits at the right edge of the component, above the choices.
+// ---------------------------------------------------------------------------
+test('plusggg: audio button is to the right of the blank slot', async ({ page }) => {
+ await openPlusgggRoute(page);
+ const root = deliveryContainer(page);
+
+ // The audio container spans ~875px with justify-content:flex-end; use the button itself
+ // for horizontal position checks rather than the wide container.
+ const listenButton = root.locator('.pie-listen-button');
+ const templateLine = root.locator('.pie-template-line');
+
+ await expect(listenButton).toBeVisible();
+ await expect(templateLine).toBeVisible();
+
+ const audioBox = await listenButton.boundingBox();
+ const templateBox = await templateLine.boundingBox();
+
+ expect(audioBox).not.toBeNull();
+ expect(templateBox).not.toBeNull();
+
+ // Listen button left edge must be to the right of the template line midpoint
+ const templateMidX = templateBox?.x + templateBox?.width / 2;
+ expect(audioBox?.x).toBeGreaterThan(templateMidX);
+});
+
+test('plusggg: audio button top is above or level with the blank slot top', async ({ page }) => {
+ await openPlusgggRoute(page);
+ const root = deliveryContainer(page);
+
+ const audioContainer = root.locator('.pie-audio-container');
+ const templateLine = root.locator('.pie-template-line');
+
+ const audioBox = await audioContainer.boundingBox();
+ const templateBox = await templateLine.boundingBox();
+
+ expect(audioBox).not.toBeNull();
+ expect(templateBox).not.toBeNull();
+
+ // Audio button top should be at or above the template line top
+ expect(audioBox?.y).toBeLessThanOrEqual(templateBox?.y + 10);
+});
+
+// ---------------------------------------------------------------------------
+// Live side-by-side parity (requires LEARNOSITY_CONSUMER_KEY)
+// ---------------------------------------------------------------------------
+
+const CREDENTIALS_PRESENT = !!process.env.LEARNOSITY_CONSUMER_KEY;
+
+async function openParityRoute(page: import('@playwright/test').Page) {
+ await page.goto(`/mc-populated-blank/parity?demo=${encodeURIComponent(DEMO_ID)}`);
+ await page.waitForLoadState('domcontentloaded');
+ await page.waitForLoadState('networkidle');
+ await page.waitForSelector('#pie-container pie-element-player', { timeout: 20_000 });
+ await page.waitForSelector('[data-learnosity-ready="true"]', { timeout: 30_000 });
+}
+
+test.describe('plusggg live parity — visual', () => {
+ test.skip(!CREDENTIALS_PRESENT, 'Skipped: LEARNOSITY_CONSUMER_KEY not set');
+
+ test('both sides render a choices group', async ({ page }) => {
+ await openParityRoute(page);
+ await assertChoicesGroupVisible(page);
+ });
+
+ test('PIE stem, choices, and audio regions match Learnosity baseline screenshots', async ({
+ page,
+ }, testInfo) => {
+ await openParityRoute(page);
+ await assertScreenshotParity(page, testInfo, DEMO_ID, PARITY_REGIONS[DEMO_ID]);
+ });
+});
diff --git a/apps/element-demo/test/e2e/parity-regions.ts b/apps/element-demo/test/e2e/parity-regions.ts
new file mode 100644
index 00000000..1d1a675c
--- /dev/null
+++ b/apps/element-demo/test/e2e/parity-regions.ts
@@ -0,0 +1,199 @@
+/**
+ * Region map for McPopulatedBlank screenshot parity tests.
+ *
+ * Each variant declares which crops are compared and at what threshold.
+ * Learnosity baselines are captured once (by a credentialed dev running
+ * capture-baselines.spec.ts) and committed to test/e2e/snapshots/learnosity/.
+ *
+ * Overrides: set maxDiffPixelRatio per region when PIE intentionally diverges
+ * from the Learnosity reference (e.g. an accessibility improvement). Always
+ * include a comment field explaining why.
+ *
+ * PIE selectors:
+ * stem → .pie-template-line
+ * choices → .pie-choices-fieldset
+ * audio → .pie-audio-container
+ *
+ * Learnosity selectors:
+ * stem → .rli-r1-stem (blank + adjacent tokens)
+ * choices → .rli-r1-distractors (choice tiles, role="group")
+ * audio → .rli-r1-instructions (listen button container)
+ */
+
+export interface RegionOverride {
+ maxDiffPixelRatio: number;
+ /** Required: explains why PIE diverges from the Learnosity reference. */
+ reason: string;
+}
+
+export interface ParityRegion {
+ /** Selector in the PIE panel (#pie-container). */
+ pie: string;
+ /** Selector in the Learnosity panel (#learnosity-container). */
+ learnosity: string;
+ /** Override default threshold when PIE intentionally differs. */
+ override?: RegionOverride;
+}
+
+export interface VariantRegions {
+ stem: ParityRegion;
+ choices: ParityRegion;
+ /** Omit for variants with no separate audio region (sr-vic, sel-vic). */
+ audio?: ParityRegion;
+}
+
+/** Default pixel diff ratio applied to all crops unless overridden. */
+export const DEFAULT_MAX_DIFF_PIXEL_RATIO = 0.1;
+
+export const PARITY_REGIONS: Record = {
+ 'variant-sel-r1-plusggg': {
+ stem: {
+ pie: '.pie-template-line',
+ learnosity: '.rli-r1-stem',
+ },
+ choices: {
+ pie: '.pie-choices-fieldset',
+ learnosity: '.rli-r1-distractors',
+ },
+ audio: {
+ pie: '.pie-audio-container',
+ learnosity: '.rli-r1-instructions',
+ },
+ },
+
+ 'variant-sel-r1-gplusggg': {
+ stem: {
+ pie: '.pie-template-line',
+ learnosity: '.rli-r1-stem',
+ },
+ choices: {
+ pie: '.pie-choices-fieldset',
+ learnosity: '.rli-r1-distractors',
+ },
+ audio: {
+ pie: '.pie-audio-container',
+ learnosity: '.rli-r1-instructions',
+ },
+ },
+
+ 'variant-sel-r1-gg-plus': {
+ stem: {
+ pie: '.pie-template-line',
+ learnosity: '.rli-r1-stem',
+ },
+ choices: {
+ pie: '.pie-choices-fieldset',
+ learnosity: '.rli-r1-distractors',
+ },
+ audio: {
+ pie: '.pie-audio-container',
+ learnosity: '.rli-r1-instructions',
+ },
+ },
+
+ 'variant-sel-r1-ggplus': {
+ stem: {
+ pie: '.pie-template-line',
+ learnosity: '.rli-r1-stem',
+ },
+ choices: {
+ pie: '.pie-choices-fieldset',
+ learnosity: '.rli-r1-distractors',
+ },
+ audio: {
+ pie: '.pie-audio-container',
+ learnosity: '.rli-r1-instructions',
+ },
+ },
+
+ 'variant-sel-r1-g-stem': {
+ stem: {
+ pie: '.pie-template-line',
+ learnosity: '.rli-r1-stem',
+ },
+ choices: {
+ pie: '.pie-choices-fieldset',
+ learnosity: '.rli-r1-distractors',
+ },
+ audio: {
+ pie: '.pie-audio-container',
+ learnosity: '.rli-r1-instructions',
+ },
+ },
+
+ 'variant-sel-r1-s3': {
+ stem: {
+ pie: '.pie-template-line',
+ learnosity: '.rli-r1-stem',
+ },
+ choices: {
+ pie: '.pie-choices-fieldset',
+ learnosity: '.rli-r1-distractors',
+ },
+ audio: {
+ pie: '.pie-audio-container',
+ learnosity: '.rli-r1-instructions',
+ },
+ },
+
+ // sel-vic: audio is embedded in the stem area, no separate audio crop needed.
+ 'variant-sel-vic': {
+ stem: {
+ pie: '.pie-template-line',
+ learnosity: '.rli-r1-stem',
+ },
+ choices: {
+ pie: '.pie-choices-fieldset',
+ learnosity: '.rli-r1-distractors',
+ },
+ },
+
+ // sr-vic: no audio component at all.
+ 'variant-sr-vic': {
+ stem: {
+ pie: '.pie-template-line',
+ learnosity: '.rli-r1-stem',
+ },
+ choices: {
+ pie: '.pie-choices-fieldset',
+ learnosity: '.rli-r1-distractors',
+ },
+ },
+
+ // Graphic (choiceMode=image) variants — no learnosityItemReference, PIE-only snapshots.
+ 'variant-sel-r1-plusggg-graphic': {
+ stem: { pie: '.pie-template-line', learnosity: '.rli-r1-stem' },
+ choices: { pie: '.pie-choices-fieldset', learnosity: '.rli-r1-distractors' },
+ audio: { pie: '.pie-audio-container', learnosity: '.rli-r1-instructions' },
+ },
+
+ 'variant-sel-r1-gplusggg-graphic': {
+ stem: { pie: '.pie-template-line', learnosity: '.rli-r1-stem' },
+ choices: { pie: '.pie-choices-fieldset', learnosity: '.rli-r1-distractors' },
+ audio: { pie: '.pie-audio-container', learnosity: '.rli-r1-instructions' },
+ },
+
+ 'variant-sel-r1-gg-plus-graphic': {
+ stem: { pie: '.pie-template-line', learnosity: '.rli-r1-stem' },
+ choices: { pie: '.pie-choices-fieldset', learnosity: '.rli-r1-distractors' },
+ audio: { pie: '.pie-audio-container', learnosity: '.rli-r1-instructions' },
+ },
+
+ 'variant-sel-r1-ggplus-graphic': {
+ stem: { pie: '.pie-template-line', learnosity: '.rli-r1-stem' },
+ choices: { pie: '.pie-choices-fieldset', learnosity: '.rli-r1-distractors' },
+ audio: { pie: '.pie-audio-container', learnosity: '.rli-r1-instructions' },
+ },
+
+ 'variant-sel-r1-g-stem-graphic': {
+ stem: { pie: '.pie-template-line', learnosity: '.rli-r1-stem' },
+ choices: { pie: '.pie-choices-fieldset', learnosity: '.rli-r1-distractors' },
+ audio: { pie: '.pie-audio-container', learnosity: '.rli-r1-instructions' },
+ },
+
+ 'variant-sel-r1-s3-graphic': {
+ stem: { pie: '.pie-template-line', learnosity: '.rli-r1-stem' },
+ choices: { pie: '.pie-choices-fieldset', learnosity: '.rli-r1-distractors' },
+ audio: { pie: '.pie-audio-container', learnosity: '.rli-r1-instructions' },
+ },
+};
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-g-stem-audio.png b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-g-stem-audio.png
new file mode 100644
index 00000000..11e6ece3
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-g-stem-audio.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-g-stem-choices.png b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-g-stem-choices.png
new file mode 100644
index 00000000..3c12fc09
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-g-stem-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-g-stem-stem.png b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-g-stem-stem.png
new file mode 100644
index 00000000..8455ac19
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-g-stem-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gg-plus-audio.png b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gg-plus-audio.png
new file mode 100644
index 00000000..30f87c96
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gg-plus-audio.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gg-plus-choices.png b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gg-plus-choices.png
new file mode 100644
index 00000000..857ca35f
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gg-plus-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gg-plus-stem.png b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gg-plus-stem.png
new file mode 100644
index 00000000..4e9ff884
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gg-plus-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-ggplus-audio.png b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-ggplus-audio.png
new file mode 100644
index 00000000..143a8588
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-ggplus-audio.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-ggplus-choices.png b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-ggplus-choices.png
new file mode 100644
index 00000000..ec5c615a
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-ggplus-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-ggplus-stem.png b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-ggplus-stem.png
new file mode 100644
index 00000000..d194a6c7
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-ggplus-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gplusggg-audio.png b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gplusggg-audio.png
new file mode 100644
index 00000000..0bbc043a
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gplusggg-audio.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gplusggg-choices.png b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gplusggg-choices.png
new file mode 100644
index 00000000..b9a0f8f2
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gplusggg-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gplusggg-stem.png b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gplusggg-stem.png
new file mode 100644
index 00000000..5945b8f4
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-gplusggg-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-plusggg-audio.png b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-plusggg-audio.png
new file mode 100644
index 00000000..e2f7969f
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-plusggg-audio.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-plusggg-choices.png b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-plusggg-choices.png
new file mode 100644
index 00000000..38fbd3fb
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-plusggg-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-plusggg-stem.png b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-plusggg-stem.png
new file mode 100644
index 00000000..fc288529
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity-variant-sel-r1-plusggg-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-g-stem-audio.png b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-g-stem-audio.png
new file mode 100644
index 00000000..0898be70
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-g-stem-audio.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-g-stem-choices.png b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-g-stem-choices.png
new file mode 100644
index 00000000..3c12fc09
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-g-stem-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-g-stem-stem.png b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-g-stem-stem.png
new file mode 100644
index 00000000..d50860d4
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-g-stem-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gg-plus-audio.png b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gg-plus-audio.png
new file mode 100644
index 00000000..7f2bb5de
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gg-plus-audio.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gg-plus-choices.png b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gg-plus-choices.png
new file mode 100644
index 00000000..857ca35f
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gg-plus-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gg-plus-stem.png b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gg-plus-stem.png
new file mode 100644
index 00000000..6a618d6f
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gg-plus-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-ggplus-audio.png b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-ggplus-audio.png
new file mode 100644
index 00000000..0918849b
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-ggplus-audio.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-ggplus-choices.png b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-ggplus-choices.png
new file mode 100644
index 00000000..ec5c615a
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-ggplus-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-ggplus-stem.png b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-ggplus-stem.png
new file mode 100644
index 00000000..398230ba
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-ggplus-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gplusggg-audio.png b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gplusggg-audio.png
new file mode 100644
index 00000000..5c4468c8
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gplusggg-audio.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gplusggg-choices.png b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gplusggg-choices.png
new file mode 100644
index 00000000..b9a0f8f2
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gplusggg-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gplusggg-stem.png b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gplusggg-stem.png
new file mode 100644
index 00000000..0242787e
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-gplusggg-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-plusggg-audio.png b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-plusggg-audio.png
new file mode 100644
index 00000000..059e4979
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-plusggg-audio.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-plusggg-choices.png b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-plusggg-choices.png
new file mode 100644
index 00000000..38fbd3fb
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-plusggg-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-plusggg-stem.png b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-plusggg-stem.png
new file mode 100644
index 00000000..b019a07f
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/learnosity/learnosity-variant-sel-r1-plusggg-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-audio.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-audio.png
new file mode 100644
index 00000000..a7d6ce08
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-audio.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-choices-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-choices-selected.png
new file mode 100644
index 00000000..a1318d78
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-choices-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-choices.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-choices.png
new file mode 100644
index 00000000..f774dd1f
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-graphic-choices-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-graphic-choices-selected.png
new file mode 100644
index 00000000..6588550c
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-graphic-choices-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-graphic-choices.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-graphic-choices.png
new file mode 100644
index 00000000..0a2b231b
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-graphic-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-graphic-stem-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-graphic-stem-selected.png
new file mode 100644
index 00000000..6132bc68
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-graphic-stem-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-graphic-stem.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-graphic-stem.png
new file mode 100644
index 00000000..b04b12dc
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-graphic-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-graphic-transcript.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-graphic-transcript.png
new file mode 100644
index 00000000..7957f1f5
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-graphic-transcript.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-stem-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-stem-selected.png
new file mode 100644
index 00000000..754934e3
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-stem-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-stem.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-stem.png
new file mode 100644
index 00000000..af30deec
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-transcript.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-transcript.png
new file mode 100644
index 00000000..3c15a196
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-g-stem-transcript.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-audio.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-audio.png
new file mode 100644
index 00000000..f29aa00c
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-audio.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-choices-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-choices-selected.png
new file mode 100644
index 00000000..48e986e1
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-choices-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-choices.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-choices.png
new file mode 100644
index 00000000..70611e7c
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-graphic-choices-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-graphic-choices-selected.png
new file mode 100644
index 00000000..3a6cc8ef
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-graphic-choices-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-graphic-choices.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-graphic-choices.png
new file mode 100644
index 00000000..aa334750
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-graphic-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-graphic-stem-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-graphic-stem-selected.png
new file mode 100644
index 00000000..b53620c0
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-graphic-stem-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-graphic-stem.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-graphic-stem.png
new file mode 100644
index 00000000..14e91adc
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-graphic-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-graphic-transcript.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-graphic-transcript.png
new file mode 100644
index 00000000..31750d75
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-graphic-transcript.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-stem-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-stem-selected.png
new file mode 100644
index 00000000..39233441
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-stem-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-stem.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-stem.png
new file mode 100644
index 00000000..b12a2877
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-transcript.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-transcript.png
new file mode 100644
index 00000000..72a8d86e
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gg-plus-transcript.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-audio.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-audio.png
new file mode 100644
index 00000000..a7d6ce08
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-audio.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-choices-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-choices-selected.png
new file mode 100644
index 00000000..12336462
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-choices-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-choices.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-choices.png
new file mode 100644
index 00000000..dfe8d502
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-graphic-choices-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-graphic-choices-selected.png
new file mode 100644
index 00000000..3a6cc8ef
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-graphic-choices-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-graphic-choices.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-graphic-choices.png
new file mode 100644
index 00000000..aa334750
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-graphic-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-graphic-stem-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-graphic-stem-selected.png
new file mode 100644
index 00000000..413f69a5
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-graphic-stem-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-graphic-stem.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-graphic-stem.png
new file mode 100644
index 00000000..64b2589c
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-graphic-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-graphic-transcript.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-graphic-transcript.png
new file mode 100644
index 00000000..31750d75
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-graphic-transcript.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-stem-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-stem-selected.png
new file mode 100644
index 00000000..d27c15e8
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-stem-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-stem.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-stem.png
new file mode 100644
index 00000000..e5800e05
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-transcript.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-transcript.png
new file mode 100644
index 00000000..9445a137
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-ggplus-transcript.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-audio.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-audio.png
new file mode 100644
index 00000000..99d41761
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-audio.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-choices-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-choices-selected.png
new file mode 100644
index 00000000..34997640
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-choices-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-choices.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-choices.png
new file mode 100644
index 00000000..6f6b631a
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-graphic-choices-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-graphic-choices-selected.png
new file mode 100644
index 00000000..c6bd383c
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-graphic-choices-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-graphic-choices.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-graphic-choices.png
new file mode 100644
index 00000000..811bcff4
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-graphic-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-graphic-stem-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-graphic-stem-selected.png
new file mode 100644
index 00000000..12c965f1
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-graphic-stem-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-graphic-stem.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-graphic-stem.png
new file mode 100644
index 00000000..29faf42e
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-graphic-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-graphic-transcript.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-graphic-transcript.png
new file mode 100644
index 00000000..382931ee
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-graphic-transcript.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-stem-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-stem-selected.png
new file mode 100644
index 00000000..c790c388
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-stem-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-stem.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-stem.png
new file mode 100644
index 00000000..7ea5235f
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-transcript.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-transcript.png
new file mode 100644
index 00000000..820ef03a
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-gplusggg-transcript.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-audio.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-audio.png
new file mode 100644
index 00000000..99d41761
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-audio.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-choices-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-choices-selected.png
new file mode 100644
index 00000000..dd7d6222
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-choices-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-choices.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-choices.png
new file mode 100644
index 00000000..052ea98d
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-graphic-choices-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-graphic-choices-selected.png
new file mode 100644
index 00000000..ec6e2e2e
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-graphic-choices-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-graphic-choices.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-graphic-choices.png
new file mode 100644
index 00000000..36a18e56
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-graphic-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-graphic-stem-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-graphic-stem-selected.png
new file mode 100644
index 00000000..2a8c6726
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-graphic-stem-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-graphic-stem.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-graphic-stem.png
new file mode 100644
index 00000000..b76a09b5
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-graphic-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-graphic-transcript.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-graphic-transcript.png
new file mode 100644
index 00000000..39c7cac5
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-graphic-transcript.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-stem-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-stem-selected.png
new file mode 100644
index 00000000..dc4e5833
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-stem-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-stem.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-stem.png
new file mode 100644
index 00000000..b76a09b5
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-transcript.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-transcript.png
new file mode 100644
index 00000000..acff76d5
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-plusggg-transcript.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-audio.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-audio.png
new file mode 100644
index 00000000..11958a25
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-audio.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-choices-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-choices-selected.png
new file mode 100644
index 00000000..72652f9c
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-choices-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-choices.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-choices.png
new file mode 100644
index 00000000..0d2e6628
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-graphic-choices-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-graphic-choices-selected.png
new file mode 100644
index 00000000..53364b63
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-graphic-choices-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-graphic-choices.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-graphic-choices.png
new file mode 100644
index 00000000..4f8aece0
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-graphic-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-graphic-stem-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-graphic-stem-selected.png
new file mode 100644
index 00000000..712abadd
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-graphic-stem-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-graphic-stem.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-graphic-stem.png
new file mode 100644
index 00000000..0fc52610
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-graphic-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-graphic-transcript.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-graphic-transcript.png
new file mode 100644
index 00000000..7e0299ac
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-graphic-transcript.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-stem-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-stem-selected.png
new file mode 100644
index 00000000..42f29e77
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-stem-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-stem.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-stem.png
new file mode 100644
index 00000000..0fc52610
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-transcript.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-transcript.png
new file mode 100644
index 00000000..7e216291
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-r1-s3-transcript.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-vic-choices-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-vic-choices-selected.png
new file mode 100644
index 00000000..dcb4a202
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-vic-choices-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-vic-choices.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-vic-choices.png
new file mode 100644
index 00000000..205560d4
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-vic-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-vic-stem-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-vic-stem-selected.png
new file mode 100644
index 00000000..7e22ea71
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-vic-stem-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-vic-stem.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-vic-stem.png
new file mode 100644
index 00000000..6c4e33c5
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-vic-stem.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sel-vic-transcript.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-vic-transcript.png
new file mode 100644
index 00000000..a513da13
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sel-vic-transcript.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sr-vic-choices-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sr-vic-choices-selected.png
new file mode 100644
index 00000000..3b27f0c4
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sr-vic-choices-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sr-vic-choices.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sr-vic-choices.png
new file mode 100644
index 00000000..b27a890a
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sr-vic-choices.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sr-vic-stem-selected.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sr-vic-stem-selected.png
new file mode 100644
index 00000000..df69d9f6
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sr-vic-stem-selected.png differ
diff --git a/apps/element-demo/test/e2e/snapshots/pie-variant-sr-vic-stem.png b/apps/element-demo/test/e2e/snapshots/pie-variant-sr-vic-stem.png
new file mode 100644
index 00000000..962fba69
Binary files /dev/null and b/apps/element-demo/test/e2e/snapshots/pie-variant-sr-vic-stem.png differ
diff --git a/apps/element-demo/test/e2e/test-helpers.ts b/apps/element-demo/test/e2e/test-helpers.ts
index 7840b1af..1aa2a3ce 100644
--- a/apps/element-demo/test/e2e/test-helpers.ts
+++ b/apps/element-demo/test/e2e/test-helpers.ts
@@ -75,11 +75,15 @@ export async function switchMode(page: Page, mode: 'gather' | 'view' | 'evaluate
}
/**
- * Switch role (student, instructor) via URL params.
+ * Switch role (student, instructor) by clicking the toolbar button.
+ * This uses SvelteKit client-side navigation so the in-memory session store is
+ * preserved. The toolbar buttons also set mode=evaluate (instructor) or
+ * mode=gather (student), matching what the app does when a user clicks them.
*/
export async function switchRole(page: Page, role: 'student' | 'instructor') {
- await navigateWithQueryParam(page, 'role', role);
- await page.waitForLoadState('networkidle');
+ await page.click(`[data-testid="role-${role}"]`);
+ const expectedRoleParam = `role=${role}`;
+ await page.waitForURL(`**${expectedRoleParam}**`, { timeout: 10_000 });
await waitForMathRendering(page);
}
diff --git a/apps/esm-player-test/src/js/sample-items.js b/apps/esm-player-test/src/js/sample-items.js
index c0af8de3..7eb5b790 100644
--- a/apps/esm-player-test/src/js/sample-items.js
+++ b/apps/esm-player-test/src/js/sample-items.js
@@ -288,7 +288,7 @@ export function getAllElementTypes() {
* @returns {string[]}
*/
export function getElementTypesForItem(item) {
- if (!item || !item.elements) {
+ if (!item?.elements) {
return [];
}
diff --git a/biome.json b/biome.json
index 5dcad697..af589ceb 100644
--- a/biome.json
+++ b/biome.json
@@ -1,5 +1,5 @@
{
- "$schema": "https://biomejs.dev/schemas/2.3.14/schema.json",
+ "$schema": "https://biomejs.dev/schemas/2.4.15/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
@@ -22,7 +22,9 @@
"!**/packages/elements-svelte/multiple-choice/src/configure",
"!packages/elements-react",
"!packages/lib-react",
- "!packages/shared/*/src/index.ts"
+ "!packages/shared/*/src/index.ts",
+ "!apps/esm-player-test/index.html",
+ "!packages/elements-svelte/simple-cloze/test.html"
]
},
"formatter": {
diff --git a/bun.lock b/bun.lock
index 2fbd3570..275f144b 100644
--- a/bun.lock
+++ b/bun.lock
@@ -310,7 +310,7 @@
},
"packages/elements-react/ebsr": {
"name": "@pie-element/ebsr",
- "version": "14.1.1-next.1",
+ "version": "14.1.1-next.2",
"dependencies": {
"@mui/material": "^7.3.4",
"@pie-element/multiple-choice": "workspace:*",
@@ -858,7 +858,7 @@
},
"packages/elements-react/multiple-choice": {
"name": "@pie-element/multiple-choice",
- "version": "13.1.1-next.1",
+ "version": "13.1.1-next.0",
"dependencies": {
"@emotion/react": "^11.14.0",
"@emotion/style": "^0.8.0",
@@ -1077,6 +1077,7 @@
"svelte": "^5.54.0",
"typescript": "^5.9.3",
"vite": "^8.0.1",
+ "vitest": "^4.1.0",
},
"peerDependencies": {
"svelte": "^5.0.0",
@@ -2001,11 +2002,11 @@
"packages": {
"@adobe/css-tools": ["@adobe/css-tools@4.4.4", "", {}, "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg=="],
- "@axe-core/playwright": ["@axe-core/playwright@4.11.1", "", { "dependencies": { "axe-core": "~4.11.1" }, "peerDependencies": { "playwright-core": ">= 1.0.0" } }, "sha512-mKEfoUIB1MkVTht0BGZFXtSAEKXMJoDkyV5YZ9jbBmZCcWDz71tegNsdTkIN8zc/yMi5Gm2kx7Z5YQ9PfWNAWw=="],
+ "@axe-core/playwright": ["@axe-core/playwright@4.11.3", "", { "dependencies": { "axe-core": "~4.11.4" }, "peerDependencies": { "playwright-core": ">= 1.0.0" } }, "sha512-h/kfksv4F0cVIDlKpT4700OehdRgpvuVskuQ2nb7/JmtWUXpe9ftHAPtwyXGvVSsa6SJ64A9ER7Zrzc/sIvC4w=="],
"@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="],
- "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="],
+ "@babel/compat-data": ["@babel/compat-data@7.29.3", "", {}, "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg=="],
"@babel/core": ["@babel/core@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="],
@@ -2029,13 +2030,13 @@
"@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="],
- "@babel/helpers": ["@babel/helpers@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="],
+ "@babel/helpers": ["@babel/helpers@7.29.2", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.29.0" } }, "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw=="],
- "@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="],
+ "@babel/parser": ["@babel/parser@7.29.3", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA=="],
"@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="],
- "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="],
+ "@babel/runtime": ["@babel/runtime@7.29.2", "", {}, "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g=="],
"@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="],
@@ -2045,39 +2046,39 @@
"@bcoe/v8-coverage": ["@bcoe/v8-coverage@1.0.2", "", {}, "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA=="],
- "@biomejs/biome": ["@biomejs/biome@2.3.14", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.3.14", "@biomejs/cli-darwin-x64": "2.3.14", "@biomejs/cli-linux-arm64": "2.3.14", "@biomejs/cli-linux-arm64-musl": "2.3.14", "@biomejs/cli-linux-x64": "2.3.14", "@biomejs/cli-linux-x64-musl": "2.3.14", "@biomejs/cli-win32-arm64": "2.3.14", "@biomejs/cli-win32-x64": "2.3.14" }, "bin": { "biome": "bin/biome" } }, "sha512-QMT6QviX0WqXJCaiqVMiBUCr5WRQ1iFSjvOLoTk6auKukJMvnMzWucXpwZB0e8F00/1/BsS9DzcKgWH+CLqVuA=="],
+ "@biomejs/biome": ["@biomejs/biome@2.4.15", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.4.15", "@biomejs/cli-darwin-x64": "2.4.15", "@biomejs/cli-linux-arm64": "2.4.15", "@biomejs/cli-linux-arm64-musl": "2.4.15", "@biomejs/cli-linux-x64": "2.4.15", "@biomejs/cli-linux-x64-musl": "2.4.15", "@biomejs/cli-win32-arm64": "2.4.15", "@biomejs/cli-win32-x64": "2.4.15" }, "bin": { "biome": "bin/biome" } }, "sha512-j5VH3a/h/HXTKBM50MDMxRCzkeLv9S2XJcW2WgnZT1+xyisi+0bISrXR82gCX+8S9lvK0skEvHJRN+3Ktr2hlw=="],
- "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.3.14", "", { "os": "darwin", "cpu": "arm64" }, "sha512-UJGPpvWJMkLxSRtpCAKfKh41Q4JJXisvxZL8ChN1eNW3m/WlPFJ6EFDCE7YfUb4XS8ZFi3C1dFpxUJ0Ety5n+A=="],
+ "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.4.15", "", { "os": "darwin", "cpu": "arm64" }, "sha512-rF3PPqLq1yoST79zaQbDjVJwsuIeci/O+9bgNmC5QpgOqz6aqYuzA4abyAGx+mgyiDXn4A049xAN8gijbuR1Qg=="],
- "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.3.14", "", { "os": "darwin", "cpu": "x64" }, "sha512-PNkLNQG6RLo8lG7QoWe/hhnMxJIt1tEimoXpGQjwS/dkdNiKBLPv4RpeQl8o3s1OKI3ZOR5XPiYtmbGGHAOnLA=="],
+ "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.4.15", "", { "os": "darwin", "cpu": "x64" }, "sha512-/5KHXYMfSJs1fNXiX30xFtI8JcCFV6zaVVLxOa0M2sfqBKHkpQhRTv94yxQWxeTY2lzo2OuTlNvPC+hDQt2wcQ=="],
- "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.3.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-KT67FKfzIw6DNnUNdYlBg+eU24Go3n75GWK6NwU4+yJmDYFe9i/MjiI+U/iEzKvo0g7G7MZqoyrhIYuND2w8QQ=="],
+ "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.4.15", "", { "os": "linux", "cpu": "arm64" }, "sha512-owaAMZD/T4LrD0ELNCk0Km3qrRHuM0X6EAyVE1FSqGY0rbLoiDLrO4Us2tllm6cAeB2Ioa9C2C08NZPdr8+0Ug=="],
- "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.3.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-LInRbXhYujtL3sH2TMCH/UBwJZsoGwfQjBrMfl84CD4hL/41C/EU5mldqf1yoFpsI0iPWuU83U+nB2TUUypWeg=="],
+ "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.4.15", "", { "os": "linux", "cpu": "arm64" }, "sha512-ZPcxznxm0pogHBLZhYntyR3sR+MrZjqJIKEr7ZqVen0Rl+P/4upVmfYXjftizi9RoqZntg33fv/1fbdhbYXpEQ=="],
- "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.3.14", "", { "os": "linux", "cpu": "x64" }, "sha512-ZsZzQsl9U+wxFrGGS4f6UxREUlgHwmEfu1IrXlgNFrNnd5Th6lIJr8KmSzu/+meSa9f4rzFrbEW9LBBA6ScoMA=="],
+ "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.4.15", "", { "os": "linux", "cpu": "x64" }, "sha512-0jj7THz12GbUOLmMibktK6DZjqz2zV64KFxyBtcFTKPiiOIY0a7vns1elpO1dERvxpsZ5ik0oFfz0oGwFde1+g=="],
- "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.3.14", "", { "os": "linux", "cpu": "x64" }, "sha512-KQU7EkbBBuHPW3/rAcoiVmhlPtDSGOGRPv9js7qJVpYTzjQmVR+C9Rfcz+ti8YCH+zT1J52tuBybtP4IodjxZQ=="],
+ "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.4.15", "", { "os": "linux", "cpu": "x64" }, "sha512-CNq/9W38SYSH023lfcQ4KKU8K0YX8T//FZUhcgtMMRABDojx5XsMV7jlweAvGSl389wJQB29Qo6Zb/a+jdvt+w=="],
- "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.3.14", "", { "os": "win32", "cpu": "arm64" }, "sha512-+IKYkj/pUBbnRf1G1+RlyA3LWiDgra1xpS7H2g4BuOzzRbRB+hmlw0yFsLprHhbbt7jUzbzAbAjK/Pn0FDnh1A=="],
+ "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.4.15", "", { "os": "win32", "cpu": "arm64" }, "sha512-ouhkYdlhp/1GghEJPdWwD/Vi3gQ1nFxuSpMolWsbq3Lsq3QUR4jl6UdhhscdCugKU5vOEuMiJhvKj66O0OCq+w=="],
- "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.3.14", "", { "os": "win32", "cpu": "x64" }, "sha512-oizCjdyQ3WJEswpb3Chdngeat56rIdSYK12JI3iI11Mt5T5EXcZ7WLuowzEaFPNJ3zmOQFliMN8QY1Pi+qsfdQ=="],
+ "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.4.15", "", { "os": "win32", "cpu": "x64" }, "sha512-zBrGq5mx5wwpnow4+2BxUvleDM+GNd4sLbPaMapsSLQLD0NGRCquqPBTgN+7XkUteHvj7M+BstuI8tmnV7+HgQ=="],
- "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.0.14", "", { "dependencies": { "@changesets/config": "^3.1.2", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA=="],
+ "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.1.1", "", { "dependencies": { "@changesets/config": "^3.1.4", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA=="],
- "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.9", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ=="],
+ "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.10", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A=="],
"@changesets/changelog-git": ["@changesets/changelog-git@0.2.1", "", { "dependencies": { "@changesets/types": "^6.1.0" } }, "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q=="],
- "@changesets/cli": ["@changesets/cli@2.29.8", "", { "dependencies": { "@changesets/apply-release-plan": "^7.0.14", "@changesets/assemble-release-plan": "^6.0.9", "@changesets/changelog-git": "^0.2.1", "@changesets/config": "^3.1.2", "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/get-release-plan": "^4.0.14", "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.6", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", "@inquirer/external-editor": "^1.0.2", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "ci-info": "^3.7.0", "enquirer": "^2.4.1", "fs-extra": "^7.0.1", "mri": "^1.2.0", "p-limit": "^2.2.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "resolve-from": "^5.0.0", "semver": "^7.5.3", "spawndamnit": "^3.0.1", "term-size": "^2.1.0" }, "bin": { "changeset": "bin.js" } }, "sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA=="],
+ "@changesets/cli": ["@changesets/cli@2.31.0", "", { "dependencies": { "@changesets/apply-release-plan": "^7.1.1", "@changesets/assemble-release-plan": "^6.0.10", "@changesets/changelog-git": "^0.2.1", "@changesets/config": "^3.1.4", "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.4", "@changesets/get-release-plan": "^4.0.16", "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.7", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", "@inquirer/external-editor": "^1.0.2", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "enquirer": "^2.4.1", "fs-extra": "^7.0.1", "mri": "^1.2.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "resolve-from": "^5.0.0", "semver": "^7.5.3", "spawndamnit": "^3.0.1", "term-size": "^2.1.0" }, "bin": { "changeset": "bin.js" } }, "sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg=="],
- "@changesets/config": ["@changesets/config@3.1.2", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/logger": "^0.1.1", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1", "micromatch": "^4.0.8" } }, "sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog=="],
+ "@changesets/config": ["@changesets/config@3.1.4", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.4", "@changesets/logger": "^0.1.1", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1", "micromatch": "^4.0.8" } }, "sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q=="],
"@changesets/errors": ["@changesets/errors@0.2.0", "", { "dependencies": { "extendable-error": "^0.1.5" } }, "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow=="],
- "@changesets/get-dependents-graph": ["@changesets/get-dependents-graph@2.1.3", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "picocolors": "^1.1.0", "semver": "^7.5.3" } }, "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ=="],
+ "@changesets/get-dependents-graph": ["@changesets/get-dependents-graph@2.1.4", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "picocolors": "^1.1.0", "semver": "^7.5.3" } }, "sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg=="],
- "@changesets/get-release-plan": ["@changesets/get-release-plan@4.0.14", "", { "dependencies": { "@changesets/assemble-release-plan": "^6.0.9", "@changesets/config": "^3.1.2", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.6", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g=="],
+ "@changesets/get-release-plan": ["@changesets/get-release-plan@4.0.16", "", { "dependencies": { "@changesets/assemble-release-plan": "^6.0.10", "@changesets/config": "^3.1.4", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.7", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g=="],
"@changesets/get-version-range-type": ["@changesets/get-version-range-type@0.4.0", "", {}, "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ=="],
@@ -2085,11 +2086,11 @@
"@changesets/logger": ["@changesets/logger@0.1.1", "", { "dependencies": { "picocolors": "^1.1.0" } }, "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg=="],
- "@changesets/parse": ["@changesets/parse@0.4.2", "", { "dependencies": { "@changesets/types": "^6.1.0", "js-yaml": "^4.1.1" } }, "sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA=="],
+ "@changesets/parse": ["@changesets/parse@0.4.3", "", { "dependencies": { "@changesets/types": "^6.1.0", "js-yaml": "^4.1.1" } }, "sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A=="],
"@changesets/pre": ["@changesets/pre@2.0.2", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1" } }, "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug=="],
- "@changesets/read": ["@changesets/read@0.6.6", "", { "dependencies": { "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/parse": "^0.4.2", "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "p-filter": "^2.1.0", "picocolors": "^1.1.0" } }, "sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg=="],
+ "@changesets/read": ["@changesets/read@0.6.7", "", { "dependencies": { "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/parse": "^0.4.3", "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "p-filter": "^2.1.0", "picocolors": "^1.1.0" } }, "sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA=="],
"@changesets/should-skip-package": ["@changesets/should-skip-package@0.1.2", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw=="],
@@ -2107,11 +2108,11 @@
"@dnd-kit/utilities": ["@dnd-kit/utilities@3.2.2", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg=="],
- "@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="],
+ "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="],
- "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
+ "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
- "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="],
+ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="],
"@emotion/babel-plugin": ["@emotion/babel-plugin@11.13.5", "", { "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", "stylis": "4.2.0" } }, "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ=="],
@@ -2149,87 +2150,85 @@
"@emotion/weak-memoize": ["@emotion/weak-memoize@0.4.0", "", {}, "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="],
- "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="],
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="],
- "@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="],
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="],
- "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="],
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="],
- "@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="],
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="],
- "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="],
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="],
- "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="],
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="],
- "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="],
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="],
- "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="],
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="],
- "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="],
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="],
- "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="],
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="],
- "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="],
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="],
- "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="],
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="],
- "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="],
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="],
- "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="],
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="],
- "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="],
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="],
- "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="],
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="],
- "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="],
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="],
- "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="],
+ "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="],
- "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="],
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="],
- "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="],
+ "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="],
- "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="],
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="],
- "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="],
+ "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="],
- "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="],
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="],
- "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="],
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="],
- "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="],
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="],
- "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="],
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="],
- "@floating-ui/core": ["@floating-ui/core@1.7.4", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg=="],
+ "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="],
- "@floating-ui/dom": ["@floating-ui/dom@1.7.5", "", { "dependencies": { "@floating-ui/core": "^1.7.4", "@floating-ui/utils": "^0.2.10" } }, "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg=="],
+ "@floating-ui/dom": ["@floating-ui/dom@1.7.6", "", { "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" } }, "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ=="],
- "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="],
+ "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="],
"@fontsource/stix-two-text": ["@fontsource/stix-two-text@5.2.8", "", {}, "sha512-izSPaqTexWhwhY8jKHg3O9J4KeC2Q5hXkqYt+1Ak2a7POMZ9sJKVlqJYByfAjRR/Lnla9jFIwZf9XYbQG9GNfA=="],
+ "@gar/promise-retry": ["@gar/promise-retry@1.0.3", "", {}, "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA=="],
+
"@hello-pangea/dnd": ["@hello-pangea/dnd@18.0.1", "", { "dependencies": { "@babel/runtime": "^7.26.7", "css-box-model": "^1.2.1", "raf-schd": "^4.0.3", "react-redux": "^9.2.0", "redux": "^5.0.1" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-xojVWG8s/TGrKT1fC8K2tIWeejJYTAeJuj36zM//yEm/ZrnZUSFGS15BpO+jGZT1ybWvyXmeDJwPYb4dhWlbZQ=="],
"@inquirer/external-editor": ["@inquirer/external-editor@1.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA=="],
- "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="],
-
- "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.1", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ=="],
-
"@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="],
- "@jest/diff-sequences": ["@jest/diff-sequences@30.0.1", "", {}, "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw=="],
+ "@jest/diff-sequences": ["@jest/diff-sequences@30.4.0", "", {}, "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g=="],
- "@jest/expect-utils": ["@jest/expect-utils@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0" } }, "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA=="],
+ "@jest/expect-utils": ["@jest/expect-utils@30.4.1", "", { "dependencies": { "@jest/get-type": "30.1.0" } }, "sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ=="],
"@jest/get-type": ["@jest/get-type@30.1.0", "", {}, "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA=="],
- "@jest/pattern": ["@jest/pattern@30.0.1", "", { "dependencies": { "@types/node": "*", "jest-regex-util": "30.0.1" } }, "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA=="],
+ "@jest/pattern": ["@jest/pattern@30.4.0", "", { "dependencies": { "@types/node": "*", "jest-regex-util": "30.4.0" } }, "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg=="],
- "@jest/schemas": ["@jest/schemas@30.0.5", "", { "dependencies": { "@sinclair/typebox": "^0.34.0" } }, "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA=="],
+ "@jest/schemas": ["@jest/schemas@30.4.1", "", { "dependencies": { "@sinclair/typebox": "^0.34.0" } }, "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q=="],
- "@jest/types": ["@jest/types@30.2.0", "", { "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg=="],
+ "@jest/types": ["@jest/types@30.4.1", "", { "dependencies": { "@jest/pattern": "30.4.0", "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ=="],
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
@@ -2257,23 +2256,23 @@
"@mdi/react": ["@mdi/react@1.6.1", "", { "dependencies": { "prop-types": "^15.7.2" } }, "sha512-4qZeDcluDFGFTWkHs86VOlHkm6gnKaMql13/gpIcUQ8kzxHgpj31NuCkD8abECVfbULJ3shc7Yt4HJ6Wu6SN4w=="],
- "@mui/core-downloads-tracker": ["@mui/core-downloads-tracker@7.3.7", "", {}, "sha512-8jWwS6FweMkpyRkrJooamUGe1CQfO1yJ+lM43IyUJbrhHW/ObES+6ry4vfGi8EKaldHL3t3BG1bcLcERuJPcjg=="],
+ "@mui/core-downloads-tracker": ["@mui/core-downloads-tracker@7.3.11", "", {}, "sha512-a7I/b/nBTdXYz2cOSlEmkQ9WWE1x8FHpqMhFPp+Y1VPFxcOw91G5ELOHARQAGSPy5V+UCgJua6K/1x70bAtQPw=="],
- "@mui/icons-material": ["@mui/icons-material@7.3.7", "", { "dependencies": { "@babel/runtime": "^7.28.4" }, "peerDependencies": { "@mui/material": "^7.3.7", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-3Q+ulAqG+A1+R4ebgoIs7AccaJhIGy+Xi/9OnvX376jQ6wcy+rz4geDGrxQxCGzdjOQr4Z3NgyFSZCz4T999lA=="],
+ "@mui/icons-material": ["@mui/icons-material@7.3.11", "", { "dependencies": { "@babel/runtime": "^7.28.6" }, "peerDependencies": { "@mui/material": "^7.3.11", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-+hz5ilwHZ3djd5es3sCErLioqe/NhZcYTsV/TNXZAMdJdb23F4xzJjqnnZdnurc3S1+ietcssRNqieOhPQLZ7Q=="],
- "@mui/material": ["@mui/material@7.3.7", "", { "dependencies": { "@babel/runtime": "^7.28.4", "@mui/core-downloads-tracker": "^7.3.7", "@mui/system": "^7.3.7", "@mui/types": "^7.4.10", "@mui/utils": "^7.3.7", "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.12", "clsx": "^2.1.1", "csstype": "^3.2.3", "prop-types": "^15.8.1", "react-is": "^19.2.3", "react-transition-group": "^4.4.5" }, "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", "@mui/material-pigment-css": "^7.3.7", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/react", "@emotion/styled", "@mui/material-pigment-css", "@types/react"] }, "sha512-6bdIxqzeOtBAj2wAsfhWCYyMKPLkRO9u/2o5yexcL0C3APqyy91iGSWgT3H7hg+zR2XgE61+WAu12wXPON8b6A=="],
+ "@mui/material": ["@mui/material@7.3.11", "", { "dependencies": { "@babel/runtime": "^7.28.6", "@mui/core-downloads-tracker": "^7.3.11", "@mui/system": "^7.3.11", "@mui/types": "^7.4.12", "@mui/utils": "^7.3.11", "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.12", "clsx": "^2.1.1", "csstype": "^3.2.3", "prop-types": "^15.8.1", "react-is": "^19.2.3", "react-transition-group": "^4.4.5" }, "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", "@mui/material-pigment-css": "^7.3.11", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/react", "@emotion/styled", "@mui/material-pigment-css", "@types/react"] }, "sha512-yq8bPc3LxOwKRWpcjRgDkYFmpM6aKlARfESTmOQcvLYFeJwtHte2tw6hJDrb8sk8wcvpDprHEHVaoUU0MslIkw=="],
- "@mui/private-theming": ["@mui/private-theming@7.3.7", "", { "dependencies": { "@babel/runtime": "^7.28.4", "@mui/utils": "^7.3.7", "prop-types": "^15.8.1" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-w7r1+CYhG0syCAQUWAuV5zSaU2/67WA9JXUderdb7DzCIJdp/5RmJv6L85wRjgKCMsxFF0Kfn0kPgPbPgw/jdw=="],
+ "@mui/private-theming": ["@mui/private-theming@7.3.11", "", { "dependencies": { "@babel/runtime": "^7.28.6", "@mui/utils": "^7.3.11", "prop-types": "^15.8.1" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9B+YKms0fRHbNrqp9tOT/DNbNnU5gyvJ1o3qAGXfq8GmZcbJnE3At9x07Zr/o0pkhzg4aDdwXVqe4+AcgtOCPA=="],
- "@mui/styled-engine": ["@mui/styled-engine@7.3.7", "", { "dependencies": { "@babel/runtime": "^7.28.4", "@emotion/cache": "^11.14.0", "@emotion/serialize": "^1.3.3", "@emotion/sheet": "^1.4.0", "csstype": "^3.2.3", "prop-types": "^15.8.1" }, "peerDependencies": { "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/react", "@emotion/styled"] }, "sha512-y/QkNXv6cF6dZ5APztd/dFWfQ6LHKPx3skyYO38YhQD4+Cxd6sFAL3Z38WMSSC8LQz145Mpp3CcLrSCLKPwYAg=="],
+ "@mui/styled-engine": ["@mui/styled-engine@7.3.10", "", { "dependencies": { "@babel/runtime": "^7.28.6", "@emotion/cache": "^11.14.0", "@emotion/serialize": "^1.3.3", "@emotion/sheet": "^1.4.0", "csstype": "^3.2.3", "prop-types": "^15.8.1" }, "peerDependencies": { "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/react", "@emotion/styled"] }, "sha512-WxE9SiF8xskAQqGjsp0poXCkCqsoXFEsSr0HBXfApmGHR+DBnXRp+z46Vsltg4gpPM4Z96DeAQRpeAOnhNg7Ng=="],
- "@mui/system": ["@mui/system@7.3.7", "", { "dependencies": { "@babel/runtime": "^7.28.4", "@mui/private-theming": "^7.3.7", "@mui/styled-engine": "^7.3.7", "@mui/types": "^7.4.10", "@mui/utils": "^7.3.7", "clsx": "^2.1.1", "csstype": "^3.2.3", "prop-types": "^15.8.1" }, "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/react", "@emotion/styled", "@types/react"] }, "sha512-DovL3k+FBRKnhmatzUMyO5bKkhMLlQ9L7Qw5qHrre3m8zCZmE+31NDVBFfqrbrA7sq681qaEIHdkWD5nmiAjyQ=="],
+ "@mui/system": ["@mui/system@7.3.11", "", { "dependencies": { "@babel/runtime": "^7.28.6", "@mui/private-theming": "^7.3.11", "@mui/styled-engine": "^7.3.10", "@mui/types": "^7.4.12", "@mui/utils": "^7.3.11", "clsx": "^2.1.1", "csstype": "^3.2.3", "prop-types": "^15.8.1" }, "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/react", "@emotion/styled", "@types/react"] }, "sha512-7izwGWdNawAKpBKcRlx7f2gFnAAjmASBWvMcyX4YYEeLOFsbfGRbUYGInvnAcUeql3rPxI7F9Ft4oY2OLRz44g=="],
- "@mui/types": ["@mui/types@7.4.10", "", { "dependencies": { "@babel/runtime": "^7.28.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-0+4mSjknSu218GW3isRqoxKRTOrTLd/vHi/7UC4+wZcUrOAqD9kRk7UQRL1mcrzqRoe7s3UT6rsRpbLkW5mHpQ=="],
+ "@mui/types": ["@mui/types@7.4.12", "", { "dependencies": { "@babel/runtime": "^7.28.6" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-iKNAF2u9PzSIj40CjvKJWxFXJo122jXVdrmdh0hMYd+FR+NuJMkr/L88XwWLCRiJ5P1j+uyac25+Kp6YC4hu6w=="],
- "@mui/utils": ["@mui/utils@7.3.7", "", { "dependencies": { "@babel/runtime": "^7.28.4", "@mui/types": "^7.4.10", "@types/prop-types": "^15.7.15", "clsx": "^2.1.1", "prop-types": "^15.8.1", "react-is": "^19.2.3" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-+YjnjMRnyeTkWnspzoxRdiSOgkrcpTikhNPoxOZW0APXx+urHtUoXJ9lbtCZRCA5a4dg5gSbd19alL1DvRs5fg=="],
+ "@mui/utils": ["@mui/utils@7.3.11", "", { "dependencies": { "@babel/runtime": "^7.28.6", "@mui/types": "^7.4.12", "@types/prop-types": "^15.7.15", "clsx": "^2.1.1", "prop-types": "^15.8.1", "react-is": "^19.2.3" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-XTjGnifwteg71/ij+0e7Y7d+hwyntMYP5wPoA/g2drdGH+Flkvjwy0OfrVpKBbaOvofq4zU/LIyUZyKgmWu18g=="],
- "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="],
+ "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="],
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
@@ -2285,25 +2284,25 @@
"@npmcli/fs": ["@npmcli/fs@5.0.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og=="],
- "@npmcli/git": ["@npmcli/git@7.0.1", "", { "dependencies": { "@npmcli/promise-spawn": "^9.0.0", "ini": "^6.0.0", "lru-cache": "^11.2.1", "npm-pick-manifest": "^11.0.1", "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^6.0.0" } }, "sha512-+XTFxK2jJF/EJJ5SoAzXk3qwIDfvFc5/g+bD274LZ7uY7LE8sTfG6Z8rOanPl2ZEvZWqNvmEdtXC25cE54VcoA=="],
+ "@npmcli/git": ["@npmcli/git@7.0.2", "", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/promise-spawn": "^9.0.0", "ini": "^6.0.0", "lru-cache": "^11.2.1", "npm-pick-manifest": "^11.0.1", "proc-log": "^6.0.0", "semver": "^7.3.5", "which": "^6.0.0" } }, "sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg=="],
"@npmcli/installed-package-contents": ["@npmcli/installed-package-contents@4.0.0", "", { "dependencies": { "npm-bundled": "^5.0.0", "npm-normalize-package-bin": "^5.0.0" }, "bin": { "installed-package-contents": "bin/index.js" } }, "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA=="],
"@npmcli/node-gyp": ["@npmcli/node-gyp@5.0.0", "", {}, "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ=="],
- "@npmcli/package-json": ["@npmcli/package-json@7.0.4", "", { "dependencies": { "@npmcli/git": "^7.0.0", "glob": "^13.0.0", "hosted-git-info": "^9.0.0", "json-parse-even-better-errors": "^5.0.0", "proc-log": "^6.0.0", "semver": "^7.5.3", "validate-npm-package-license": "^3.0.4" } }, "sha512-0wInJG3j/K40OJt/33ax47WfWMzZTm6OQxB9cDhTt5huCP2a9g2GnlsxmfN+PulItNPIpPrZ+kfwwUil7eHcZQ=="],
+ "@npmcli/package-json": ["@npmcli/package-json@7.0.5", "", { "dependencies": { "@npmcli/git": "^7.0.0", "glob": "^13.0.0", "hosted-git-info": "^9.0.0", "json-parse-even-better-errors": "^5.0.0", "proc-log": "^6.0.0", "semver": "^7.5.3", "spdx-expression-parse": "^4.0.0" } }, "sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ=="],
"@npmcli/promise-spawn": ["@npmcli/promise-spawn@9.0.1", "", { "dependencies": { "which": "^6.0.0" } }, "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q=="],
"@npmcli/redact": ["@npmcli/redact@4.0.0", "", {}, "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q=="],
- "@npmcli/run-script": ["@npmcli/run-script@10.0.3", "", { "dependencies": { "@npmcli/node-gyp": "^5.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "node-gyp": "^12.1.0", "proc-log": "^6.0.0", "which": "^6.0.0" } }, "sha512-ER2N6itRkzWbbtVmZ9WKaWxVlKlOeBFF1/7xx+KA5J1xKa4JjUwBdb6tDpk0v1qA+d+VDwHI9qmLcXSWcmi+Rw=="],
+ "@npmcli/run-script": ["@npmcli/run-script@10.0.4", "", { "dependencies": { "@npmcli/node-gyp": "^5.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "node-gyp": "^12.1.0", "proc-log": "^6.0.0" } }, "sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg=="],
- "@oclif/core": ["@oclif/core@4.8.0", "", { "dependencies": { "ansi-escapes": "^4.3.2", "ansis": "^3.17.0", "clean-stack": "^3.0.1", "cli-spinners": "^2.9.2", "debug": "^4.4.3", "ejs": "^3.1.10", "get-package-type": "^0.1.0", "indent-string": "^4.0.0", "is-wsl": "^2.2.0", "lilconfig": "^3.1.3", "minimatch": "^9.0.5", "semver": "^7.7.3", "string-width": "^4.2.3", "supports-color": "^8", "tinyglobby": "^0.2.14", "widest-line": "^3.1.0", "wordwrap": "^1.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-jteNUQKgJHLHFbbz806aGZqf+RJJ7t4gwF4MYa8fCwCxQ8/klJNWc0MvaJiBebk7Mc+J39mdlsB4XraaCKznFw=="],
+ "@oclif/core": ["@oclif/core@4.11.2", "", { "dependencies": { "ansi-escapes": "^4.3.2", "ansis": "^3.17.0", "clean-stack": "^3.0.1", "cli-spinners": "^2.9.2", "debug": "^4.4.3", "ejs": "^3.1.10", "get-package-type": "^0.1.0", "indent-string": "^4.0.0", "is-wsl": "^2.2.0", "lilconfig": "^3.1.3", "minimatch": "^10.2.5", "semver": "^7.8.0", "string-width": "^4.2.3", "supports-color": "^8", "tinyglobby": "^0.2.14", "widest-line": "^3.1.0", "wordwrap": "^1.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-LWDalCgy+hYyAkLa9sMIXMXk6ws5RzQhVnkmfXtVIIyEEYigbXQ/9/x+s76p53MiXxNc6SJB7lfwkPF+SdzfMQ=="],
- "@oclif/plugin-help": ["@oclif/plugin-help@6.2.37", "", { "dependencies": { "@oclif/core": "^4" } }, "sha512-5N/X/FzlJaYfpaHwDC0YHzOzKDWa41s9t+4FpCDu4f9OMReds4JeNBaaWk9rlIzdKjh2M6AC5Q18ORfECRkHGA=="],
+ "@oclif/plugin-help": ["@oclif/plugin-help@6.2.48", "", { "dependencies": { "@oclif/core": "^4" } }, "sha512-nvGLBtUZUWrHfoAEDRsRZUHKVwptyZ6F+MErdVRLQBo3dja0GCZH8DE33dA7mBux2KOmbxGqop15gyud9HZYhQ=="],
- "@oxc-project/types": ["@oxc-project/types@0.120.0", "", {}, "sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg=="],
+ "@oxc-project/types": ["@oxc-project/types@0.129.0", "", {}, "sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg=="],
"@pie-element/bundler-shared": ["@pie-element/bundler-shared@workspace:packages/shared/bundler-shared-compat"],
@@ -2463,7 +2462,7 @@
"@pie-lib/translator": ["@pie-lib/translator@workspace:packages/lib-react/translator"],
- "@playwright/test": ["@playwright/test@1.58.2", "", { "dependencies": { "playwright": "1.58.2" }, "bin": { "playwright": "cli.js" } }, "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA=="],
+ "@playwright/test": ["@playwright/test@1.59.1", "", { "dependencies": { "playwright": "1.59.1" }, "bin": { "playwright": "cli.js" } }, "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg=="],
"@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="],
@@ -2473,93 +2472,93 @@
"@remirror/core-constants": ["@remirror/core-constants@3.0.0", "", {}, "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg=="],
- "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.10", "", { "os": "android", "cpu": "arm64" }, "sha512-jOHxwXhxmFKuXztiu1ORieJeTbx5vrTkcOkkkn2d35726+iwhrY1w/+nYY/AGgF12thg33qC3R1LMBF5tHTZHg=="],
+ "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0", "", { "os": "android", "cpu": "arm64" }, "sha512-TWMZnRLMe63C2Lhyicviu7ZHaU4kxa6PS3rofvc9GmcvptzNN11BcfQ4Sl7MwTOsisQoa2keB/EBdNCAnUo8vA=="],
- "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gED05Teg/vtTZbIJBc4VNMAxAFDUPkuO/rAIyyxZjTj1a1/s6z5TII/5yMGZ0uLRCifEtwUQn8OlYzuYc0m70w=="],
+ "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-6XcD+8k0gPVItNagEw78/qqcBDwKcwDYS8V2hRmVsfUSIrd8cWe/CBvRDI5toqFyPfj+FJr6t8U6Xj2P2prEew=="],
- "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-rc.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-rI15NcM1mA48lqrIxVkHfAqcyFLcQwyXWThy+BQ5+mkKKPvSO26ir+ZDp36AgYoYVkqvMcdS8zOE6SeBsR9e8A=="],
+ "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-iN/tWVXRQDWvmZlKdceP1Dwug9GDpEymhb9p4xnEe6zvCg5lFmzVljl+1qR1NVx3yfGpr2Na+CuLmv5IU8uzfQ=="],
- "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-rc.10", "", { "os": "freebsd", "cpu": "x64" }, "sha512-XZRXHdTa+4ME1MuDVp021+doQ+z6Ei4CCFmNc5/sKbqb8YmkiJdj8QKlV3rCI0AJtAeSB5n0WGPuJWNL9p/L2w=="],
+ "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jjQMDvvwSOuhOwMszD/klSOjyWMM3zI64hWTj9KT5x4MxRbZAf+7vLQ6qouRhtsLVFHr3f0ILaJAfgENPiQdAQ=="],
- "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.10", "", { "os": "linux", "cpu": "arm" }, "sha512-R0SQMRluISSLzFE20sPWYHVmJdDQnRyc/FzSCN72BqQmh2SOZUFG+N3/vBZpR4C6WpEUVYJLrYUXaj43sJsNLA=="],
+ "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0", "", { "os": "linux", "cpu": "arm" }, "sha512-d//Dtg2x6/m3mbV64yUGNnDGNZaDGRpDLLNGerHQUVObuNaIQaaDp25yUiqGXtHEXX+NP2d0wAlmKgpYgIAJ2A=="],
- "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-rc.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-Y1reMrV/o+cwpduYhJuOE3OMKx32RMYCidf14y+HssARRmhDuWXJ4yVguDg2R/8SyyGNo+auzz64LnPK9Hq6jg=="],
+ "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-n7Ofp0mx+aB2cC+Sdy5YtMnXtY9lchnHbY+3Yt0uq9JsWQExf4f5Whu0tK0R8Jdc9S6RchTHjIFY7uc92puOVQ=="],
- "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-rc.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-vELN+HNb2IzuzSBUOD4NHmP9yrGwl1DVM29wlQvx1OLSclL0NgVWnVDKl/8tEks79EFek/kebQKnNJkIAA4W2g=="],
+ "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-EIVjy2cgd7uuMMo94FVkBp7F6DhcZAUwNURkSG3RwUmvAXR6s0ISxM81U+IydcZByPG0pZIHsf1b6kTxoFDgJA=="],
- "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.10", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ZqrufYTgzxbHwpqOjzSsb0UV/aV2TFIY5rP8HdsiPTv/CuAgCRjM6s9cYFwQ4CNH+hf9Y4erHW1GjZuZ7WoI7w=="],
+ "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-JEwwOPcwTLAcpDQlqSmjEmfs63xJnSiUNIGvLcDLUHCWK4XowpS/7c7tUsUH6uT/ct6bMUTdXKfI8967FYj6mg=="],
- "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.0-rc.10", "", { "os": "linux", "cpu": "s390x" }, "sha512-gSlmVS1FZJSRicA6IyjoRoKAFK7IIHBs7xJuHRSmjImqk3mPPWbR7RhbnfH2G6bcmMEllCt2vQ/7u9e6bBnByg=="],
+ "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-0wjCFhLrihtAubnT9iA0N++0pSV0z5Hg7tNGdNJ4RFaINceHadoF+kiFGyY1qSSNVIAZtLotG8Ju1bgDPkjnFA=="],
- "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-rc.10", "", { "os": "linux", "cpu": "x64" }, "sha512-eOCKUpluKgfObT2pHjztnaWEIbUabWzk3qPZ5PuacuPmr4+JtQG4k2vGTY0H15edaTnicgU428XW/IH6AimcQw=="],
+ "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Dfn7iak9BcMMePxcoJfpSbWqnEyrp/dRF63/8qW/eHBdOZov6x5aShLLEYGYdIeSJ6vMLK/XCVB+lGIxm41bQA=="],
- "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-rc.10", "", { "os": "linux", "cpu": "x64" }, "sha512-Xdf2jQbfQowJnLcgYfD/m0Uu0Qj5OdxKallD78/IPPfzaiaI4KRAwZzHcKQ4ig1gtg1SuzC7jovNiM2TzQsBXA=="],
+ "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0", "", { "os": "linux", "cpu": "x64" }, "sha512-5/utzzDmD/pD/bmuaUcbTf/sZYy0aztwIVlfpoW1fTjCZ0BaPOMVWGZL1zvgxyi7ZIVYWlxKONHmSbHuiOh8Jw=="],
- "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-rc.10", "", { "os": "none", "cpu": "arm64" }, "sha512-o1hYe8hLi1EY6jgPFyxQgQ1wcycX+qz8eEbVmot2hFkgUzPxy9+kF0u0NIQBeDq+Mko47AkaFFaChcvZa9UX9Q=="],
+ "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0", "", { "os": "none", "cpu": "arm64" }, "sha512-ouJs8VcUomfLfpbUECqFMRqdV4x6aeAK3MA4m6vTrJJjKyWTV5KnxZx7Jd9G+GlDaQQxubcba00x16OyJ1meig=="],
- "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-rc.10", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-Ugv9o7qYJudqQO5Y5y2N2SOo6S4WiqiNOpuQyoPInnhVzCY+wi/GHltcLHypG9DEUYMB0iTB/huJrpadiAcNcA=="],
+ "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-E+oHKGiDA+lsKMmFtffDDw91EryDT7uJocrIuCHqhm6bCTM6xFK+3gaCkYOHfPwQr0cCNarSM2xaELoQDz9jJg=="],
- "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-rc.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-7UODQb4fQUNT/vmgDZBl3XOBAIOutP5R3O/rkxg0aLfEGQ4opbCgU5vOw/scPe4xOqBwL9fw7/RP1vAMZ6QlAQ=="],
+ "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-yYK02n8Rngo+gbm1y6G0+7jk1sJ/2Wt7K0me0Y7k/ErBpyf+LJ2gFpqWVTcRV1rUepBlQRmpgWkTQCiiwrK0Ow=="],
- "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-rc.10", "", { "os": "win32", "cpu": "x64" }, "sha512-PYxKHMVHOb5NJuDL53vBUl1VwUjymDcYI6rzpIni0C9+9mTiJedvUxSk7/RPp7OOAm3v+EjgMu9bIy3N6b408w=="],
+ "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0", "", { "os": "win32", "cpu": "x64" }, "sha512-14bpChMahXRRXiTwahSl+zzHPW6qQTXtkMuJBFlbo+pqSAews2d4BdCSHfrJ/MBsCZtpmTafsY+1QhBzitcmdg=="],
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.7", "", {}, "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA=="],
"@sigstore/bundle": ["@sigstore/bundle@4.0.0", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.5.0" } }, "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A=="],
- "@sigstore/core": ["@sigstore/core@3.1.0", "", {}, "sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A=="],
+ "@sigstore/core": ["@sigstore/core@3.2.0", "", {}, "sha512-kxHrDQ9YgfrWUSXU0cjsQGv8JykOFZQ9ErNKbFPWzk3Hgpwu8x2hHrQ9IdA8yl+j9RTLTC3sAF3Tdq1IQCP4oA=="],
- "@sigstore/protobuf-specs": ["@sigstore/protobuf-specs@0.5.0", "", {}, "sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA=="],
+ "@sigstore/protobuf-specs": ["@sigstore/protobuf-specs@0.5.1", "", {}, "sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g=="],
- "@sigstore/sign": ["@sigstore/sign@4.1.0", "", { "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0", "make-fetch-happen": "^15.0.3", "proc-log": "^6.1.0", "promise-retry": "^2.0.1" } }, "sha512-Vx1RmLxLGnSUqx/o5/VsCjkuN5L7y+vxEEwawvc7u+6WtX2W4GNa7b9HEjmcRWohw/d6BpATXmvOwc78m+Swdg=="],
+ "@sigstore/sign": ["@sigstore/sign@4.1.1", "", { "dependencies": { "@gar/promise-retry": "^1.0.2", "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.2.0", "@sigstore/protobuf-specs": "^0.5.0", "make-fetch-happen": "^15.0.4", "proc-log": "^6.1.0" } }, "sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ=="],
- "@sigstore/tuf": ["@sigstore/tuf@4.0.1", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.5.0", "tuf-js": "^4.1.0" } }, "sha512-OPZBg8y5Vc9yZjmWCHrlWPMBqW5yd8+wFNl+thMdtcWz3vjVSoJQutF8YkrzI0SLGnkuFof4HSsWUhXrf219Lw=="],
+ "@sigstore/tuf": ["@sigstore/tuf@4.0.2", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.5.0", "tuf-js": "^4.1.0" } }, "sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ=="],
"@sigstore/verify": ["@sigstore/verify@3.1.0", "", { "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0" } }, "sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag=="],
- "@sinclair/typebox": ["@sinclair/typebox@0.34.48", "", {}, "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA=="],
+ "@sinclair/typebox": ["@sinclair/typebox@0.34.49", "", {}, "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A=="],
"@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
"@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="],
- "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.8", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA=="],
+ "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.9", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA=="],
"@sveltejs/adapter-auto": ["@sveltejs/adapter-auto@7.0.1", "", { "peerDependencies": { "@sveltejs/kit": "^2.0.0" } }, "sha512-dvuPm1E7M9NI/+canIQ6KKQDU2AkEefEZ2Dp7cY6uKoPq9Z/PhOXABe526UdW2mN986gjVkuSLkOYIBnS/M2LQ=="],
- "@sveltejs/kit": ["@sveltejs/kit@2.55.0", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.6.4", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "set-cookie-parser": "^3.0.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.3.3", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" }, "optionalPeers": ["@opentelemetry/api", "typescript"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-MdFRjevVxmAknf2NbaUkDF16jSIzXMWd4Nfah0Qp8TtQVoSp3bV4jKt8mX7z7qTUTWvgSaxtR0EG5WJf53gcuA=="],
+ "@sveltejs/kit": ["@sveltejs/kit@2.59.1", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.6.4", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "set-cookie-parser": "^3.0.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.3.3 || ^6.0.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" }, "optionalPeers": ["@opentelemetry/api", "typescript"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-d8OON70AphLdDesuTIl//M2O6fRTIicX8aYv8vhCiYEhTTI2OboKqey0Hu1A4VFhqwgqtq0vKDmPFGkw8kKmgw=="],
- "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@7.0.0", "", { "dependencies": { "deepmerge": "^4.3.1", "magic-string": "^0.30.21", "obug": "^2.1.0", "vitefu": "^1.1.2" }, "peerDependencies": { "svelte": "^5.46.4", "vite": "^8.0.0-beta.7 || ^8.0.0" } }, "sha512-ILXmxC7HAsnkK2eslgPetrqqW1BKSL7LktsFgqzNj83MaivMGZzluWq32m25j2mDOjmSKX7GGWahePhuEs7P/g=="],
+ "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@7.1.2", "", { "dependencies": { "deepmerge": "^4.3.1", "magic-string": "^0.30.21", "obug": "^2.1.0", "vitefu": "^1.1.2" }, "peerDependencies": { "svelte": "^5.46.4", "vite": "^8.0.0-beta.7 || ^8.0.0" } }, "sha512-DrUBA2UXRfDmUX/ZTiEopd3X40yavsJF1FX2RygcuIScHL7o5YX1fMvoYnDhjeJQC4weCOklirpNWlcb2NiSeA=="],
- "@tailwindcss/node": ["@tailwindcss/node@4.2.2", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.2" } }, "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA=="],
+ "@tailwindcss/node": ["@tailwindcss/node@4.3.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.21.0", "jiti": "^2.6.1", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.0" } }, "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g=="],
- "@tailwindcss/oxide": ["@tailwindcss/oxide@4.2.2", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.2.2", "@tailwindcss/oxide-darwin-arm64": "4.2.2", "@tailwindcss/oxide-darwin-x64": "4.2.2", "@tailwindcss/oxide-freebsd-x64": "4.2.2", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", "@tailwindcss/oxide-linux-x64-musl": "4.2.2", "@tailwindcss/oxide-wasm32-wasi": "4.2.2", "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" } }, "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg=="],
+ "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.0", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.0", "@tailwindcss/oxide-darwin-arm64": "4.3.0", "@tailwindcss/oxide-darwin-x64": "4.3.0", "@tailwindcss/oxide-freebsd-x64": "4.3.0", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", "@tailwindcss/oxide-linux-x64-musl": "4.3.0", "@tailwindcss/oxide-wasm32-wasi": "4.3.0", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" } }, "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg=="],
- "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.2.2", "", { "os": "android", "cpu": "arm64" }, "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg=="],
+ "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.0", "", { "os": "android", "cpu": "arm64" }, "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng=="],
- "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg=="],
+ "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ=="],
- "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.2.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw=="],
+ "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA=="],
- "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.2.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ=="],
+ "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ=="],
- "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2", "", { "os": "linux", "cpu": "arm" }, "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ=="],
+ "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0", "", { "os": "linux", "cpu": "arm" }, "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA=="],
- "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw=="],
+ "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg=="],
- "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag=="],
+ "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ=="],
- "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg=="],
+ "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ=="],
- "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ=="],
+ "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg=="],
- "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.2.2", "", { "dependencies": { "@emnapi/core": "^1.8.1", "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q=="],
+ "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.0", "", { "dependencies": { "@emnapi/core": "^1.10.0", "@emnapi/runtime": "^1.10.0", "@emnapi/wasi-threads": "^1.2.1", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA=="],
- "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.2.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ=="],
+ "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ=="],
- "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.2", "", { "os": "win32", "cpu": "x64" }, "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA=="],
+ "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA=="],
- "@tailwindcss/vite": ["@tailwindcss/vite@4.2.2", "", { "dependencies": { "@tailwindcss/node": "4.2.2", "@tailwindcss/oxide": "4.2.2", "tailwindcss": "4.2.2" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w=="],
+ "@tailwindcss/vite": ["@tailwindcss/vite@4.3.0", "", { "dependencies": { "@tailwindcss/node": "4.3.0", "@tailwindcss/oxide": "4.3.0", "tailwindcss": "4.3.0" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw=="],
"@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="],
@@ -2571,19 +2570,19 @@
"@tiptap/core": ["@tiptap/core@3.18.0", "", { "peerDependencies": { "@tiptap/pm": "^3.18.0" } }, "sha512-Gczd4GbK1DNgy/QUPElMVozoa0GW9mW8E31VIi7Q4a9PHHz8PcrxPmuWwtJ2q0PF8MWpOSLuBXoQTWaXZRPRnQ=="],
- "@tiptap/extension-blockquote": ["@tiptap/extension-blockquote@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-y3UfqY9KD5XwWz3ndiiJ089Ij2QKeiXy/g1/tlAN/F1AaWsnkHEHMLxCP1BIqmMpwsX7rZjMLN7G5Lp7c9682A=="],
+ "@tiptap/extension-blockquote": ["@tiptap/extension-blockquote@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-FdVZLZOkL06j3WLXOC2UeX7++Cj3qI2vfohruMJiz4vk1Q5UUH7G4+AykFzjzBJHrdEpkiRUkRpU1KZIWdbluw=="],
- "@tiptap/extension-bold": ["@tiptap/extension-bold@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-UZgb1d0XK4J/JRIZ7jW+s4S6KjuEDT2z1PPM6ugcgofgJkWQvRZelCPbmtSFd3kwsD+zr9UPVgTh9YIuGQ8t+Q=="],
+ "@tiptap/extension-bold": ["@tiptap/extension-bold@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-EAYdNzyOjlQh2VBY1EhdxtiTjVMaOAD6P0ezms60dKRjd4oj/8grfXfUqwgo4NVdFb11Ks85vXoHuXJSylfR4A=="],
- "@tiptap/extension-bubble-menu": ["@tiptap/extension-bubble-menu@3.19.0", "", { "dependencies": { "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-klNVIYGCdznhFkrRokzGd6cwzoi8J7E5KbuOfZBwFwhMKZhlz/gJfKmYg9TJopeUhrr2Z9yHgWTk8dh/YIJCdQ=="],
+ "@tiptap/extension-bubble-menu": ["@tiptap/extension-bubble-menu@3.23.1", "", { "dependencies": { "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-1advMCpPkHD/3ucZhYmNau8B4tF0L6iRAFhUOglp5bBZDuq13+rYujh3cm4vFmjH9KqThzpcUDn+ZU2c+mTMyw=="],
- "@tiptap/extension-bullet-list": ["@tiptap/extension-bullet-list@3.19.0", "", { "peerDependencies": { "@tiptap/extension-list": "^3.19.0" } }, "sha512-F9uNnqd0xkJbMmRxVI5RuVxwB9JaCH/xtRqOUNQZnRBt7IdAElCY+Dvb4hMCtiNv+enGM/RFGJuFHR9TxmI7rw=="],
+ "@tiptap/extension-bullet-list": ["@tiptap/extension-bullet-list@3.23.1", "", { "peerDependencies": { "@tiptap/extension-list": "3.23.1" } }, "sha512-owWnBBI4t+jqVDY0naDjhsAmrNGldh4czouef2K+mEf032B7uGsDVCwKp1qaX1JZesyYDfvXOaIwT22hNID2mw=="],
"@tiptap/extension-character-count": ["@tiptap/extension-character-count@3.0.9", "", { "peerDependencies": { "@tiptap/extensions": "^3.0.9" } }, "sha512-KKtHfvMlYCNszldPvmzDzvRSV/Xukb7T/t4IMPgFp2LUDPuBK1z4TPP8HEsONTFAAKc+JgnJPPkMxfhh/tFbnQ=="],
- "@tiptap/extension-code": ["@tiptap/extension-code@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-2kqqQIXBXj2Or+4qeY3WoE7msK+XaHKL6EKOcKlOP2BW8eYqNTPzNSL+PfBDQ3snA7ljZQkTs/j4GYDj90vR1A=="],
+ "@tiptap/extension-code": ["@tiptap/extension-code@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-nGuhb4YghgTfkejwWHrD9GSpwcC5kkVmm2sN/UY4yceDw+PkyysYKJWZehRLTOC8GNgSAhq/EeQeq14Xwk6dyg=="],
- "@tiptap/extension-code-block": ["@tiptap/extension-code-block@3.20.0", "", { "peerDependencies": { "@tiptap/core": "^3.20.0", "@tiptap/pm": "^3.20.0" } }, "sha512-lBbmNek14aCjrHcBcq3PRqWfNLvC6bcRa2Osc6e/LtmXlcpype4f6n+Yx+WZ+f2uUh0UmDRCz7BEyUETEsDmlQ=="],
+ "@tiptap/extension-code-block": ["@tiptap/extension-code-block@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-BdJGqM57CsKgYrQUZz78vIG8Yn7EpsE2pA7iKn5tYoSXpYtt0IaU4qB1heH7lwWD/vVCAm0YQVD7/0F+0++yhA=="],
"@tiptap/extension-code-block-lowlight": ["@tiptap/extension-code-block-lowlight@3.18.0", "", { "peerDependencies": { "@tiptap/core": "^3.18.0", "@tiptap/extension-code-block": "^3.18.0", "@tiptap/pm": "^3.18.0", "highlight.js": "^11", "lowlight": "^2 || ^3" } }, "sha512-euUvh9r1KNSua9X4VdMS6lcWgUkcd0YznCFhp4b5gSqT5/5F7tGlvEg5mNpBeNhOIreDQV6zfBc7HvLfh7cLEA=="],
@@ -2591,39 +2590,39 @@
"@tiptap/extension-document": ["@tiptap/extension-document@3.18.0", "", { "peerDependencies": { "@tiptap/core": "^3.18.0" } }, "sha512-e0hOGrjTMpCns8IC5p+c5CEiE1BBmFBFL+RpIxU/fjT2SaZ7q2xsFguBu94lQDT0cD6fdZokFRpGwEMxZNVGCg=="],
- "@tiptap/extension-dropcursor": ["@tiptap/extension-dropcursor@3.19.0", "", { "peerDependencies": { "@tiptap/extensions": "^3.19.0" } }, "sha512-sf3dEZXiLvsGqVK2maUIzXY6qtYYCvBumag7+VPTMGQ0D4hiZ1X/4ukt4+6VXDg5R2WP1CoIt/QvUetUjWNhbQ=="],
+ "@tiptap/extension-dropcursor": ["@tiptap/extension-dropcursor@3.23.1", "", { "peerDependencies": { "@tiptap/extensions": "3.23.1" } }, "sha512-WRN7e/h9m3uI5j9/+L6jcPhHbTL6aKxfFfQWZHNf5M8TqSL1P+/2h034td0XMj3n48i4fWyzjVUV9+sz6t2fDw=="],
- "@tiptap/extension-floating-menu": ["@tiptap/extension-floating-menu@3.19.0", "", { "peerDependencies": { "@floating-ui/dom": "^1.0.0", "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-JaoEkVRkt+Slq3tySlIsxnMnCjS0L5n1CA1hctjLy0iah8edetj3XD5mVv5iKqDzE+LIjF4nwLRRVKJPc8hFBg=="],
+ "@tiptap/extension-floating-menu": ["@tiptap/extension-floating-menu@3.23.1", "", { "peerDependencies": { "@floating-ui/dom": "^1.0.0", "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-XrYHpLn1DpLFSGTko9F9xgbNamL6fGpWkK4wqgwPVbg/SJwQCDO/9p5D3DtJTwD+xgw4sQ9as4O6rt6jx8JT+Q=="],
- "@tiptap/extension-gapcursor": ["@tiptap/extension-gapcursor@3.19.0", "", { "peerDependencies": { "@tiptap/extensions": "^3.19.0" } }, "sha512-w7DACS4oSZaDWjz7gropZHPc9oXqC9yERZTcjWxyORuuIh1JFf0TRYspleK+OK28plK/IftojD/yUDn1MTRhvA=="],
+ "@tiptap/extension-gapcursor": ["@tiptap/extension-gapcursor@3.23.1", "", { "peerDependencies": { "@tiptap/extensions": "3.23.1" } }, "sha512-E4hB0xquUpEXy7kboLBazrFyRCsN0j0fsTFR8udgQf5xetAVPhOexSTKuzOcU/n0kxsKJin7laYYEag/Fd2KNw=="],
- "@tiptap/extension-hard-break": ["@tiptap/extension-hard-break@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-lAmQraYhPS5hafvCl74xDB5+bLuNwBKIEsVoim35I0sDJj5nTrfhaZgMJ91VamMvT+6FF5f1dvBlxBxAWa8jew=="],
+ "@tiptap/extension-hard-break": ["@tiptap/extension-hard-break@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-XYkCKC5RVqMmmBk+nd22/6IDDx1OC54sdStH5VEHtfOrarriO0JztK8Mr0TijPPk9N4rKXsmndYZM2xyWZZytQ=="],
- "@tiptap/extension-heading": ["@tiptap/extension-heading@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-uLpLlfyp086WYNOc0ekm1gIZNlEDfmzOhKzB0Hbyi6jDagTS+p9mxUNYeYOn9jPUxpFov43+Wm/4E24oY6B+TQ=="],
+ "@tiptap/extension-heading": ["@tiptap/extension-heading@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-1z9yCSp8fevgX3r/4kWXO3of0WFCQWfYjWfHANvoJ4JQTYBkARjXlj1tbk5rrAJBFDDfKRkUpZOurXKgGo+h+g=="],
"@tiptap/extension-history": ["@tiptap/extension-history@3.18.0", "", { "peerDependencies": { "@tiptap/extensions": "^3.18.0" } }, "sha512-xIOxVPmQqqfVzt3zLTRahjTX0pAnfNVqIThYyNCP9/cgIjLJ8QuMjczurjVtVYHWdt6Fr0+d5KYUU6EmcyAmQQ=="],
- "@tiptap/extension-horizontal-rule": ["@tiptap/extension-horizontal-rule@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-iqUHmgMGhMgYGwG6L/4JdelVQ5Mstb4qHcgTGd/4dkcUOepILvhdxajPle7OEdf9sRgjQO6uoAU5BVZVC26+ng=="],
+ "@tiptap/extension-horizontal-rule": ["@tiptap/extension-horizontal-rule@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-30XUHXdEZxcz1FCWjz9HW2EEq06NQcAye6rXGnvHo6Y60iJ6MRsrX5byvceFNF9DTVtOIcUFBQ/psIiRcoi0KA=="],
"@tiptap/extension-image": ["@tiptap/extension-image@3.0.9", "", { "peerDependencies": { "@tiptap/core": "^3.0.9" } }, "sha512-/2igN/oIF58zqX5fcg00bf6qGLcQyXHysl5I8GiurkvO95d+SQTlYbJneSRUpt6CgrUKbhRnMBPVubmapgg+Zw=="],
- "@tiptap/extension-italic": ["@tiptap/extension-italic@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-6GffxOnS/tWyCbDkirWNZITiXRta9wrCmrfa4rh+v32wfaOL1RRQNyqo9qN6Wjyl1R42Js+yXTzTTzZsOaLMYA=="],
+ "@tiptap/extension-italic": ["@tiptap/extension-italic@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-lZB9YCjoVNDoPMguya66nBvaS/2YpGN5iAcjAGx/JQkCAZeOAtl9+ALMzbWPKH6tQP6m98YtkY1T7RXr++T0bA=="],
- "@tiptap/extension-link": ["@tiptap/extension-link@3.19.0", "", { "dependencies": { "linkifyjs": "^4.3.2" }, "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-HEGDJnnCPfr7KWu7Dsq+eRRe/mBCsv6DuI+7fhOCLDJjjKzNgrX2abbo/zG3D/4lCVFaVb+qawgJubgqXR/Smw=="],
+ "@tiptap/extension-link": ["@tiptap/extension-link@3.23.1", "", { "dependencies": { "linkifyjs": "^4.3.2" }, "peerDependencies": { "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-uOeyLqYQI0WG62agpFG24kVHSn3Z48gD8Y0uLLJbtzh/nDFC3d9So2sQGWlSVyMzsgkJ4k/9jNnxxsVO8qgJOg=="],
"@tiptap/extension-list": ["@tiptap/extension-list@3.0.9", "", { "peerDependencies": { "@tiptap/core": "^3.0.9", "@tiptap/pm": "^3.0.9" } }, "sha512-y5JQoFmVR+6FhDdEz2oFIMkURSRSDhCtsrlNWdUpSTGnTAa2WZT7nEhHcIMSGvYU3t0fkfLQ9yTMSaQZFa5GLA=="],
"@tiptap/extension-list-item": ["@tiptap/extension-list-item@3.0.9", "", { "peerDependencies": { "@tiptap/extension-list": "^3.0.9" } }, "sha512-K+ogk1BH/eYhsK9nSTXNdIXlxQcXzty6h1QFiZNr9XmaLk+q4NZFHR5FVz3EJ7QXyw+Gv/2FQn+T2Q/GpbMxZQ=="],
- "@tiptap/extension-list-keymap": ["@tiptap/extension-list-keymap@3.19.0", "", { "peerDependencies": { "@tiptap/extension-list": "^3.19.0" } }, "sha512-bxgmAgA3RzBGA0GyTwS2CC1c+QjkJJq9hC+S6PSOWELGRiTbwDN3MANksFXLjntkTa0N5fOnL27vBHtMStURqw=="],
+ "@tiptap/extension-list-keymap": ["@tiptap/extension-list-keymap@3.23.1", "", { "peerDependencies": { "@tiptap/extension-list": "3.23.1" } }, "sha512-sHbE5sxiJzhgGn94GUAzD4qKM9SyImBrOlAGS/EIe+pausjqQE7xi+YW0gRo2jG+gXhSYl4/oAGXQXzmSInSUQ=="],
- "@tiptap/extension-ordered-list": ["@tiptap/extension-ordered-list@3.19.0", "", { "peerDependencies": { "@tiptap/extension-list": "^3.19.0" } }, "sha512-cxGsINquwHYE1kmhAcLNLHAofmoDEG6jbesR5ybl7tU5JwtKVO7S/xZatll2DU1dsDAXWPWEeeMl4e/9svYjCg=="],
+ "@tiptap/extension-ordered-list": ["@tiptap/extension-ordered-list@3.23.1", "", { "peerDependencies": { "@tiptap/extension-list": "3.23.1" } }, "sha512-3GG7YFhVJWw/HWmRxvMMUC296x7TPBQRLsH4ryEC1SMAmVJnbTIvetyvIcLqLEXGW7Rj41S7SO8qjOXVceSOTA=="],
- "@tiptap/extension-paragraph": ["@tiptap/extension-paragraph@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-xWa6gj82l5+AzdYyrSk9P4ynySaDzg/SlR1FarXE5yPXibYzpS95IWaVR0m2Qaz7Rrk+IiYOTGxGRxcHLOelNg=="],
+ "@tiptap/extension-paragraph": ["@tiptap/extension-paragraph@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-GC7b6yAjASl1q9sNkPmukZmVYMfxx03EEhpMMrLYJY9GBz82Ald927yYQsOqf2aKA/Rjo/aZMYCGtjXkGk6aBA=="],
"@tiptap/extension-placeholder": ["@tiptap/extension-placeholder@3.20.0", "", { "peerDependencies": { "@tiptap/extensions": "^3.20.0" } }, "sha512-ZhYD3L5m16ydSe2z8vqz+RdtAG/iOQaFHHedFct70tKRoLqi2ajF5kgpemu8DwpaRTcyiCN4G99J/+MqehKNjQ=="],
- "@tiptap/extension-strike": ["@tiptap/extension-strike@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-xYpabHsv7PccLUBQaP8AYiFCnYbx6P93RHPd0lgNwhdOjYFd931Zy38RyoxPHAgbYVmhf1iyx7lpuLtBnhS5dA=="],
+ "@tiptap/extension-strike": ["@tiptap/extension-strike@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-+R5LG0ZW9SDZc4weA79uq6uUduVsCEph9tRcoQCRA82IVIiPYSTxTLew9odalmk/Mc7vdZvOK5jjtO5jUVw/rg=="],
"@tiptap/extension-subscript": ["@tiptap/extension-subscript@3.0.9", "", { "peerDependencies": { "@tiptap/core": "^3.0.9", "@tiptap/pm": "^3.0.9" } }, "sha512-FJi6TH5VnAGtqD7c8TX0JJGkabVTC69lEoSel8RUbK9P+NHk0hh1PEyCjHSNhGinepoB6GIi6+skvXHIkJb5xw=="],
@@ -2643,11 +2642,11 @@
"@tiptap/extension-text-style": ["@tiptap/extension-text-style@3.0.9", "", { "peerDependencies": { "@tiptap/core": "^3.0.9" } }, "sha512-x7SZLS537c7w789n8re0IktmkBZqz98dux/hwpFAcC4oL06YPjFG7Dy9mAiKcsKqKWI0eAyTQvMybz+TJusBbw=="],
- "@tiptap/extension-underline": ["@tiptap/extension-underline@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-800MGEWfG49j10wQzAFiW/ele1HT04MamcL8iyuPNu7ZbjbGN2yknvdrJlRy7hZlzIrVkZMr/1tz62KN33VHIw=="],
+ "@tiptap/extension-underline": ["@tiptap/extension-underline@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-+PvHyVozHyxJ9oWCIQx5JHBZ7LAa/sFJUOFaKyfmel4gL9AbP52MmvrciXARlZHd1WCULJtdbLan0+x5/D/9hQ=="],
- "@tiptap/extensions": ["@tiptap/extensions@3.20.0", "", { "peerDependencies": { "@tiptap/core": "^3.20.0", "@tiptap/pm": "^3.20.0" } }, "sha512-HIsXX942w3nbxEQBlMAAR/aa6qiMBEP7CsSMxaxmTIVAmW35p6yUASw6GdV1u0o3lCZjXq2OSRMTskzIqi5uLg=="],
+ "@tiptap/extensions": ["@tiptap/extensions@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-7UIn+idaVTVhdlP0KmgzBh8Csmwck357Dq4te5DuAxhSkN1gsXHlq39mpx907UYKJdSOgd+GMFeyOziPwSmbOQ=="],
- "@tiptap/pm": ["@tiptap/pm@3.19.0", "", { "dependencies": { "prosemirror-changeset": "^2.3.0", "prosemirror-collab": "^1.3.1", "prosemirror-commands": "^1.6.2", "prosemirror-dropcursor": "^1.8.1", "prosemirror-gapcursor": "^1.3.2", "prosemirror-history": "^1.4.1", "prosemirror-inputrules": "^1.4.0", "prosemirror-keymap": "^1.2.2", "prosemirror-markdown": "^1.13.1", "prosemirror-menu": "^1.2.4", "prosemirror-model": "^1.24.1", "prosemirror-schema-basic": "^1.2.3", "prosemirror-schema-list": "^1.5.0", "prosemirror-state": "^1.4.3", "prosemirror-tables": "^1.6.4", "prosemirror-trailing-node": "^3.0.0", "prosemirror-transform": "^1.10.2", "prosemirror-view": "^1.38.1" } }, "sha512-789zcnM4a8OWzvbD2DL31d0wbSm9BVeO/R7PLQwLIGysDI3qzrcclyZ8yhqOEVuvPitRRwYLq+mY14jz7kY4cw=="],
+ "@tiptap/pm": ["@tiptap/pm@3.23.1", "", { "dependencies": { "prosemirror-changeset": "^2.3.0", "prosemirror-commands": "^1.6.2", "prosemirror-dropcursor": "^1.8.1", "prosemirror-gapcursor": "^1.3.2", "prosemirror-history": "^1.4.1", "prosemirror-keymap": "^1.2.2", "prosemirror-model": "^1.24.1", "prosemirror-schema-list": "^1.5.0", "prosemirror-state": "^1.4.3", "prosemirror-tables": "^1.6.4", "prosemirror-transform": "^1.10.2", "prosemirror-view": "^1.38.1" } }, "sha512-8G+TkNsUHHAAJYREpA6fw+Dw/m2Y3Go4/QMQM8RYepid+wTeE1wSv7sBA/CBrphhYmJSWeTyCPtgQIxnTJXMCA=="],
"@tiptap/react": ["@tiptap/react@3.0.9", "", { "dependencies": { "@types/use-sync-external-store": "^0.0.6", "fast-deep-equal": "^3.1.3", "use-sync-external-store": "^1.4.0" }, "optionalDependencies": { "@tiptap/extension-bubble-menu": "^3.0.9", "@tiptap/extension-floating-menu": "^3.0.9" }, "peerDependencies": { "@tiptap/core": "^3.0.9", "@tiptap/pm": "^3.0.9", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-BbvWPSgYGvd9m8fPXKI81gf9KP+1SMCPpscbtbbhPyxiW2ziY+jwo+i7MwVI73P89hWAJCy/43UnOde438HmOA=="],
@@ -2657,29 +2656,29 @@
"@tufjs/models": ["@tufjs/models@4.1.0", "", { "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^10.1.1" } }, "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww=="],
- "@turbo/darwin-64": ["@turbo/darwin-64@2.9.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-hTEiNu2ABZZOO1qbjnKASI8eF3BdOOzU6iKv5w5uGOK65DDMc10cS40N1kqM99YT0uSAGUwNu6GdFctRPeEeVA=="],
+ "@turbo/darwin-64": ["@turbo/darwin-64@2.9.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-eu3eFRmE9NjgZ0wPdRJ44l+LGSeIky+tz5ZQd8zQkw/Yqi+BM7wq+8nbabeoiVUcICi/IZweMOKl/MCmkrd1+g=="],
- "@turbo/darwin-arm64": ["@turbo/darwin-arm64@2.9.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MinO40EEcP5mJiTVpfjtEulsEBhVeryfq21QhYtJZ8hQJLHGgy459rcmDVAY8/JERe4dkVU4KW+zoLF22o01EA=="],
+ "@turbo/darwin-arm64": ["@turbo/darwin-arm64@2.9.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RUkAE404z/J8NsyrUosMcBaXT6M4bRFxTQrmkDQBLQVXaC8Jl0e9bMvYDSX0GW7Ffm2m3j9y7RXgR1foeUAM9w=="],
- "@turbo/linux-64": ["@turbo/linux-64@2.9.9", "", { "os": "linux", "cpu": "x64" }, "sha512-7JNLw88Isk+gMlbsC8pulLDkrqe2B827ZsKFEHilb17AC6Xn/62pzH7afjY7fEU6Ayp4XP/vGhlRWOzqBvBvIQ=="],
+ "@turbo/linux-64": ["@turbo/linux-64@2.9.12", "", { "os": "linux", "cpu": "x64" }, "sha512-InIUtH7cw/vqXNX1Gr7QgWfmw3ct08pV5CpfdEOR48z2u2rzdmpIuk00B/Q2xCb0PMWtKgiMQynfuphmEuUyTQ=="],
- "@turbo/linux-arm64": ["@turbo/linux-arm64@2.9.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-0pnXDwPw1rHii98JZPRg7SvsjIzy7jrhkwGU9Jy5fVYoMdYd3P2vbtLfII+OJ0Mm4Ar5yykdHDTz3RWiRI1o9g=="],
+ "@turbo/linux-arm64": ["@turbo/linux-arm64@2.9.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-lC6nD//Xh67fmJM0LKaLsg74Wry0aYrgMklpiNgCbUaMdPIOqj0A00iri3NU7Lb7pZHx8ViisgpeDKlpSgFUCA=="],
- "@turbo/windows-64": ["@turbo/windows-64@2.9.9", "", { "os": "win32", "cpu": "x64" }, "sha512-vjDQycz4gQVvIq4n2rPtiiIESwJlAc406qtkiZlqyL+fHZEd9SxYNlBIFYtc5cuMuwrk+sIKrhN7XvwjmvS9YQ=="],
+ "@turbo/windows-64": ["@turbo/windows-64@2.9.12", "", { "os": "win32", "cpu": "x64" }, "sha512-conYri8VUl72JOdYnLDPYwzqbPcY5ECoHmo9FWoKznemhaAIilj4maHqs9Uar0aKfNoZIULniy+6iWaLtLO34A=="],
- "@turbo/windows-arm64": ["@turbo/windows-arm64@2.9.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-V6NiH43oCctepbOdQFp7UjqLyK8p6Tt824QA+G4TE+B1BBHu80A0W8OCL+H7uBJ3XZjAj/hvPDw3k3l65DoDGw=="],
+ "@turbo/windows-arm64": ["@turbo/windows-arm64@2.9.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-XoR4bsg62/L/esRVcmoMESEiNZ36+YmyjYGLpoqk8nwMgXzzVjNOgX0lRSz5w/U/ajLGv3nhMsS0Q2QOdvp2AQ=="],
- "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
+ "@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="],
"@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="],
- "@types/bun": ["@types/bun@1.3.8", "", { "dependencies": { "bun-types": "1.3.8" } }, "sha512-3LvWJ2q5GerAXYxO2mffLTqOzEu5qnhEAlh48Vnu8WQfnmSwbgagjGZV6BoHKJztENYEDn6QmVd949W4uESRJA=="],
+ "@types/bun": ["@types/bun@1.3.13", "", { "dependencies": { "bun-types": "1.3.13" } }, "sha512-9fqXWk5YIHGGnUau9TEi+qdlTYDAnOj+xLCmSTwXfAIqXr2x4tytJb43E9uCvt09zJURKXwAtkoH4nLQfzeTXw=="],
"@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="],
"@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="],
- "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="],
+ "@types/d3-array": ["@types/d3-array@3.0.3", "", {}, "sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ=="],
"@types/d3-color": ["@types/d3-color@3.1.0", "", {}, "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA=="],
@@ -2691,15 +2690,15 @@
"@types/d3-geo": ["@types/d3-geo@3.1.0", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ=="],
- "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="],
+ "@types/d3-interpolate": ["@types/d3-interpolate@3.0.1", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw=="],
"@types/d3-path": ["@types/d3-path@1.0.11", "", {}, "sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw=="],
- "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="],
+ "@types/d3-scale": ["@types/d3-scale@4.0.2", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA=="],
"@types/d3-shape": ["@types/d3-shape@1.3.12", "", { "dependencies": { "@types/d3-path": "^1" } }, "sha512-8oMzcd4+poSLGgV0R1Q1rOlx/xdmozS4Xab7np0eamFFUYq71AU9pOCJEFnkXW2aI/oXdVYJzw6pssbSut7Z9Q=="],
- "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="],
+ "@types/d3-time": ["@types/d3-time@3.0.0", "", {}, "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg=="],
"@types/d3-time-format": ["@types/d3-time-format@2.1.0", "", {}, "sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA=="],
@@ -2713,7 +2712,7 @@
"@types/eslint-scope": ["@types/eslint-scope@3.7.7", "", { "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg=="],
- "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+ "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
"@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="],
@@ -2735,7 +2734,7 @@
"@types/linkify-it": ["@types/linkify-it@5.0.0", "", {}, "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="],
- "@types/lodash": ["@types/lodash@4.17.23", "", {}, "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA=="],
+ "@types/lodash": ["@types/lodash@4.17.24", "", {}, "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ=="],
"@types/lodash-es": ["@types/lodash-es@4.17.12", "", { "dependencies": { "@types/lodash": "*" } }, "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ=="],
@@ -2743,7 +2742,7 @@
"@types/mdurl": ["@types/mdurl@2.0.0", "", {}, "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="],
- "@types/node": ["@types/node@25.2.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-BkmoP5/FhRYek5izySdkOneRyXYN35I860MFAGupTdebyE66uZaR+bXLHq8k4DirE5DwQi3NuhvRU1jqTVwUrQ=="],
+ "@types/node": ["@types/node@25.6.2", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw=="],
"@types/node-fetch": ["@types/node-fetch@2.6.13", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.4" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="],
@@ -2791,8 +2790,6 @@
"@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="],
- "@typescript-eslint/types": ["@typescript-eslint/types@8.58.0", "", {}, "sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww=="],
-
"@visx/axis": ["@visx/axis@3.12.0", "", { "dependencies": { "@types/react": "*", "@visx/group": "3.12.0", "@visx/point": "3.12.0", "@visx/scale": "3.12.0", "@visx/shape": "3.12.0", "@visx/text": "3.12.0", "classnames": "^2.3.1", "prop-types": "^15.6.0" }, "peerDependencies": { "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0" } }, "sha512-8MoWpfuaJkhm2Yg+HwyytK8nk+zDugCqTT/tRmQX7gW4LYrHYLXFUXOzbDyyBakCVaUbUaAhVFxpMASJiQKf7A=="],
"@visx/clip-path": ["@visx/clip-path@3.12.0", "", { "dependencies": { "@types/react": "*", "prop-types": "^15.5.10" }, "peerDependencies": { "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" } }, "sha512-pjpjyoQ15lhOrgpDhxfWKAxC4IswzREHGOHhrdWtxQbPoGzVZvFH8HHvwRi4afL11uYDO10z235MDnaDwP8GnQ=="],
@@ -2817,23 +2814,23 @@
"@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.1", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.7" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ=="],
- "@vitest/coverage-v8": ["@vitest/coverage-v8@4.1.0", "", { "dependencies": { "@bcoe/v8-coverage": "^1.0.2", "@vitest/utils": "4.1.0", "ast-v8-to-istanbul": "^1.0.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.2.0", "magicast": "^0.5.2", "obug": "^2.1.1", "std-env": "^4.0.0-rc.1", "tinyrainbow": "^3.0.3" }, "peerDependencies": { "@vitest/browser": "4.1.0", "vitest": "4.1.0" }, "optionalPeers": ["@vitest/browser"] }, "sha512-nDWulKeik2bL2Va/Wl4x7DLuTKAXa906iRFooIRPR+huHkcvp9QDkPQ2RJdmjOFrqOqvNfoSQLF68deE3xC3CQ=="],
+ "@vitest/coverage-v8": ["@vitest/coverage-v8@4.1.6", "", { "dependencies": { "@bcoe/v8-coverage": "^1.0.2", "@vitest/utils": "4.1.6", "ast-v8-to-istanbul": "^1.0.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.2.0", "magicast": "^0.5.2", "obug": "^2.1.1", "std-env": "^4.0.0-rc.1", "tinyrainbow": "^3.1.0" }, "peerDependencies": { "@vitest/browser": "4.1.6", "vitest": "4.1.6" }, "optionalPeers": ["@vitest/browser"] }, "sha512-36l628fQ/9a/8ihy97eOtEnvWQEdqULQOJtcaxtoNq0G1w3Mxd4szSahOaMM9/NGyZ+hyKcMtIW/WIxq0XQViQ=="],
- "@vitest/expect": ["@vitest/expect@4.1.0", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.0", "@vitest/utils": "4.1.0", "chai": "^6.2.2", "tinyrainbow": "^3.0.3" } }, "sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA=="],
+ "@vitest/expect": ["@vitest/expect@4.1.6", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.6", "@vitest/utils": "4.1.6", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" } }, "sha512-7EHDquPthALSV0jhhjgEW8FXaviMx7rSqu8W6oqCoAuOhKov814P99QDV1pxMA3QPv21YudvJngIhjrNI4opLg=="],
- "@vitest/mocker": ["@vitest/mocker@4.1.0", "", { "dependencies": { "@vitest/spy": "4.1.0", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw=="],
+ "@vitest/mocker": ["@vitest/mocker@4.1.6", "", { "dependencies": { "@vitest/spy": "4.1.6", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ=="],
- "@vitest/pretty-format": ["@vitest/pretty-format@4.1.0", "", { "dependencies": { "tinyrainbow": "^3.0.3" } }, "sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A=="],
+ "@vitest/pretty-format": ["@vitest/pretty-format@4.1.6", "", { "dependencies": { "tinyrainbow": "^3.1.0" } }, "sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw=="],
- "@vitest/runner": ["@vitest/runner@4.1.0", "", { "dependencies": { "@vitest/utils": "4.1.0", "pathe": "^2.0.3" } }, "sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ=="],
+ "@vitest/runner": ["@vitest/runner@4.1.6", "", { "dependencies": { "@vitest/utils": "4.1.6", "pathe": "^2.0.3" } }, "sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA=="],
- "@vitest/snapshot": ["@vitest/snapshot@4.1.0", "", { "dependencies": { "@vitest/pretty-format": "4.1.0", "@vitest/utils": "4.1.0", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg=="],
+ "@vitest/snapshot": ["@vitest/snapshot@4.1.6", "", { "dependencies": { "@vitest/pretty-format": "4.1.6", "@vitest/utils": "4.1.6", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-YhsdE6xAVfTDmzjxL2ZDUvjj+ZsgyOKe+TdQzqkD72wIOmHka8NuGQ6NpTNZv9D2Z63fbwWKJPeVpEw4EQgYxw=="],
- "@vitest/spy": ["@vitest/spy@4.1.0", "", {}, "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw=="],
+ "@vitest/spy": ["@vitest/spy@4.1.6", "", {}, "sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg=="],
- "@vitest/ui": ["@vitest/ui@4.1.0", "", { "dependencies": { "@vitest/utils": "4.1.0", "fflate": "^0.8.2", "flatted": "3.4.0", "pathe": "^2.0.3", "sirv": "^3.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.0.3" }, "peerDependencies": { "vitest": "4.1.0" } }, "sha512-sTSDtVM1GOevRGsCNhp1mBUHKo9Qlc55+HCreFT4fe99AHxl1QQNXSL3uj4Pkjh5yEuWZIx8E2tVC94nnBZECQ=="],
+ "@vitest/ui": ["@vitest/ui@4.1.6", "", { "dependencies": { "@vitest/utils": "4.1.6", "fflate": "^0.8.2", "flatted": "^3.4.2", "pathe": "^2.0.3", "sirv": "^3.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0" }, "peerDependencies": { "vitest": "4.1.6" } }, "sha512-wiu5em68DfGv/2HFvI1Njr7JI2CHcBlQvereSzVG8my53PRxjTNOCsD9VOkRKrsJBDHmyuXvosxWZw7T91a2mw=="],
- "@vitest/utils": ["@vitest/utils@4.1.0", "", { "dependencies": { "@vitest/pretty-format": "4.1.0", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.0.3" } }, "sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw=="],
+ "@vitest/utils": ["@vitest/utils@4.1.6", "", { "dependencies": { "@vitest/pretty-format": "4.1.6", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ=="],
"@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="],
@@ -2871,13 +2868,13 @@
"abbrev": ["abbrev@4.0.0", "", {}, "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA=="],
- "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
+ "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
"acorn-import-phases": ["acorn-import-phases@1.0.4", "", { "peerDependencies": { "acorn": "^8.14.0" } }, "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ=="],
"agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
- "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
+ "ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="],
"ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="],
@@ -2895,7 +2892,7 @@
"argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
- "aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="],
+ "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
"array-iterate": ["array-iterate@1.1.4", "", {}, "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA=="],
@@ -2911,7 +2908,7 @@
"asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
- "axe-core": ["axe-core@4.11.1", "", {}, "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A=="],
+ "axe-core": ["axe-core@4.11.4", "", {}, "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA=="],
"axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
@@ -2919,31 +2916,31 @@
"babel-plugin-styled-components": ["babel-plugin-styled-components@2.1.4", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-module-imports": "^7.22.5", "@babel/plugin-syntax-jsx": "^7.22.5", "lodash": "^4.17.21", "picomatch": "^2.3.1" }, "peerDependencies": { "styled-components": ">= 2" } }, "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g=="],
- "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+ "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
- "baseline-browser-mapping": ["baseline-browser-mapping@2.9.19", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg=="],
+ "baseline-browser-mapping": ["baseline-browser-mapping@2.10.29", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ=="],
"better-path-resolve": ["better-path-resolve@1.0.0", "", { "dependencies": { "is-windows": "^1.0.0" } }, "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g=="],
"big.js": ["big.js@5.2.2", "", {}, "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="],
- "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
+ "brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="],
"braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
"brcast": ["brcast@3.0.2", "", {}, "sha512-f5XwwFCCuvgqP2nMH/hJ74FqnGmb4X3D+NC//HphxJzzhsZvSZa+Hk/syB7j3ZHpPDLMoYU8oBgviRWfNvEfKA=="],
- "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="],
+ "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="],
"buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
- "bun-types": ["bun-types@1.3.11", "", { "dependencies": { "@types/node": "*" } }, "sha512-1KGPpoxQWl9f6wcZh57LvrPIInQMn2TQ7jsgxqpRzg+l0QPOFvJVH7HmvHo/AiPgwXy+/Thf6Ov3EdVn1vOabg=="],
+ "bun-types": ["bun-types@1.3.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA=="],
"bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="],
- "cacache": ["cacache@20.0.3", "", { "dependencies": { "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", "glob": "^13.0.0", "lru-cache": "^11.1.0", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", "ssri": "^13.0.0", "unique-filename": "^5.0.0" } }, "sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw=="],
+ "cacache": ["cacache@20.0.4", "", { "dependencies": { "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", "glob": "^13.0.0", "lru-cache": "^11.1.0", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", "ssri": "^13.0.0" } }, "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA=="],
- "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="],
+ "call-bind": ["call-bind@1.0.9", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" } }, "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ=="],
"call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
@@ -2955,7 +2952,7 @@
"camelize": ["camelize@1.0.1", "", {}, "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ=="],
- "caniuse-lite": ["caniuse-lite@1.0.30001769", "", {}, "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg=="],
+ "caniuse-lite": ["caniuse-lite@1.0.30001792", "", {}, "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw=="],
"chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="],
@@ -2969,7 +2966,7 @@
"chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="],
- "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="],
+ "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="],
"classnames": ["classnames@2.5.1", "", {}, "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="],
@@ -3007,7 +3004,7 @@
"css-jss": ["css-jss@10.10.0", "", { "dependencies": { "@babel/runtime": "^7.3.1", "jss": "^10.10.0", "jss-preset-default": "^10.10.0" } }, "sha512-YyMIS/LsSKEGXEaVJdjonWe18p4vXLo8CMA4FrW/kcaEyqdIGKCFXao31gbJddXEdIxSXFFURWrenBJPlKTgAA=="],
- "css-loader": ["css-loader@7.1.3", "", { "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.40", "postcss-modules-extract-imports": "^3.1.0", "postcss-modules-local-by-default": "^4.0.5", "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.6.3" }, "peerDependencies": { "@rspack/core": "0.x || 1.x", "webpack": "^5.27.0" }, "optionalPeers": ["@rspack/core", "webpack"] }, "sha512-frbERmjT0UC5lMheWpJmMilnt9GEhbZJN/heUb7/zaJYeIzj5St9HvDcfshzzOqbsS+rYpMk++2SD3vGETDSyA=="],
+ "css-loader": ["css-loader@7.1.4", "", { "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.40", "postcss-modules-extract-imports": "^3.1.0", "postcss-modules-local-by-default": "^4.0.5", "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.6.3" }, "peerDependencies": { "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "webpack": "^5.27.0" }, "optionalPeers": ["@rspack/core", "webpack"] }, "sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw=="],
"css-to-react-native": ["css-to-react-native@3.2.0", "", { "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", "postcss-value-parser": "^4.0.2" } }, "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ=="],
@@ -3069,7 +3066,7 @@
"degrees-radians": ["degrees-radians@1.0.3", "", {}, "sha512-Ac9inY6xtsBaVabYgiUVjYUhj0U3ojBm/5/zUHXqRW+8cJvgmu9AcXanfP2P+BWPk9w1EjJYtDS2y1Jx1sh3aQ=="],
- "delaunator": ["delaunator@5.0.1", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw=="],
+ "delaunator": ["delaunator@5.1.0", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ=="],
"delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
@@ -3079,7 +3076,7 @@
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
- "devalue": ["devalue@5.6.4", "", {}, "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA=="],
+ "devalue": ["devalue@5.8.0", "", {}, "sha512-2zA9pFEsnp7vWBZbXF5JAgAq0fsUIt/1XPbRiAmRV3lp/2C3upzH+sADiyy66aFCihoLEsrQHxNM5w1gIDfsBg=="],
"devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
@@ -3089,7 +3086,7 @@
"dom-helpers": ["dom-helpers@3.4.0", "", { "dependencies": { "@babel/runtime": "^7.1.2" } }, "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA=="],
- "dompurify": ["dompurify@3.3.1", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q=="],
+ "dompurify": ["dompurify@3.4.2", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA=="],
"dot-case": ["dot-case@2.1.1", "", { "dependencies": { "no-case": "^2.2.0" } }, "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug=="],
@@ -3097,24 +3094,20 @@
"ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="],
- "electron-to-chromium": ["electron-to-chromium@1.5.286", "", {}, "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A=="],
+ "electron-to-chromium": ["electron-to-chromium@1.5.353", "", {}, "sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w=="],
"emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
"emojis-list": ["emojis-list@3.0.0", "", {}, "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="],
- "encoding": ["encoding@0.1.13", "", { "dependencies": { "iconv-lite": "^0.6.2" } }, "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="],
-
- "enhanced-resolve": ["enhanced-resolve@5.19.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg=="],
+ "enhanced-resolve": ["enhanced-resolve@5.21.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q=="],
"enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="],
- "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
+ "entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="],
"env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="],
- "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="],
-
"error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="],
"es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
@@ -3127,11 +3120,11 @@
"es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="],
- "es-toolkit": ["es-toolkit@1.44.0", "", {}, "sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg=="],
+ "es-toolkit": ["es-toolkit@1.46.1", "", {}, "sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ=="],
- "esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="],
+ "esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="],
- "esbuild-loader": ["esbuild-loader@4.4.2", "", { "dependencies": { "esbuild": "^0.27.1", "get-tsconfig": "^4.10.1", "loader-utils": "^2.0.4", "webpack-sources": "^1.4.3" }, "peerDependencies": { "webpack": "^4.40.0 || ^5.0.0" } }, "sha512-8LdoT9sC7fzfvhxhsIAiWhzLJr9yT3ggmckXxsgvM07wgrRxhuT98XhLn3E7VczU5W5AFsPKv9DdWcZIubbWkQ=="],
+ "esbuild-loader": ["esbuild-loader@4.4.3", "", { "dependencies": { "esbuild": "^0.27.1", "get-tsconfig": "^4.10.1", "loader-utils": "^2.0.4", "webpack-sources": "^3.3.4" }, "peerDependencies": { "webpack": "^4.40.0 || ^5.0.0" } }, "sha512-Wpui03EzqC151xFteKlgJQhbyZl5CgnBpUHXVuao02nItULlkaTeiLdEMPTmR2zdwpEBWkXVNoT5dDOYJluUzg=="],
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
@@ -3147,7 +3140,7 @@
"esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
- "esrap": ["esrap@2.2.3", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ=="],
+ "esrap": ["esrap@2.2.7", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, "peerDependencies": { "@typescript-eslint/types": "^8.2.0" }, "optionalPeers": ["@typescript-eslint/types"] }, "sha512-Dl7o7btn2YXca1VXx+PVl+lKuZdHBm8oCFuckUxqchMvNMdHMJ/qF31wtPaVyWvFYLQePkbXJrirWzbAP6Yamw=="],
"esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
@@ -3159,7 +3152,7 @@
"events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="],
- "expect": ["expect@30.2.0", "", { "dependencies": { "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", "jest-matcher-utils": "30.2.0", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-util": "30.2.0" } }, "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw=="],
+ "expect": ["expect@30.4.1", "", { "dependencies": { "@jest/expect-utils": "30.4.1", "@jest/get-type": "30.1.0", "jest-matcher-utils": "30.4.1", "jest-message-util": "30.4.1", "jest-mock": "30.4.1", "jest-util": "30.4.1" } }, "sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA=="],
"expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="],
@@ -3171,7 +3164,7 @@
"fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
- "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="],
+ "fast-uri": ["fast-uri@3.1.2", "", {}, "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ=="],
"fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
@@ -3179,7 +3172,7 @@
"fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="],
- "filelist": ["filelist@1.0.4", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q=="],
+ "filelist": ["filelist@1.0.6", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA=="],
"fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
@@ -3187,7 +3180,7 @@
"find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="],
- "flatted": ["flatted@3.4.0", "", {}, "sha512-kC6Bb+ooptOIvWj5B63EQWkF0FEnNjV2ZNkLMLZRDDduIiWeFF4iKnslwhiWxjAdbg4NzTNo6h0qLuvFrcx+Sw=="],
+ "flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="],
"form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="],
@@ -3211,9 +3204,9 @@
"get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
- "get-tsconfig": ["get-tsconfig@4.13.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw=="],
+ "get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="],
- "glob": ["glob@13.0.1", "", { "dependencies": { "minimatch": "^10.1.2", "minipass": "^7.1.2", "path-scurry": "^2.0.0" } }, "sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w=="],
+ "glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="],
"glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
@@ -3225,7 +3218,7 @@
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
- "happy-dom": ["happy-dom@20.5.3", "", { "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", "entities": "^6.0.1", "whatwg-mimetype": "^3.0.0", "ws": "^8.18.3" } }, "sha512-xqAxGnkRU0KNhheHpxb3uScqg/aehqUiVto/a9ApWMyNvnH9CAqHYq9dEPAovM6bOGbLstmTfGIln5ZIezEU0g=="],
+ "happy-dom": ["happy-dom@20.9.0", "", { "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", "entities": "^7.0.1", "whatwg-mimetype": "^3.0.0", "ws": "^8.18.3" } }, "sha512-GZZ9mKe8r646NUAf/zemnGbjYh4Bt8/MqASJY+pSm5ZDtc3YQox+4gsLI7yi1hba6o+eCsGxpHn5+iEVn31/FQ=="],
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
@@ -3235,7 +3228,7 @@
"has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
- "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
+ "hasown": ["hasown@2.0.3", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg=="],
"he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="],
@@ -3245,7 +3238,7 @@
"hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="],
- "hosted-git-info": ["hosted-git-info@9.0.2", "", { "dependencies": { "lru-cache": "^11.1.0" } }, "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg=="],
+ "hosted-git-info": ["hosted-git-info@9.0.3", "", { "dependencies": { "lru-cache": "^11.1.0" } }, "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg=="],
"html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="],
@@ -3261,7 +3254,7 @@
"hyphenate-style-name": ["hyphenate-style-name@1.1.0", "", {}, "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw=="],
- "i18next": ["i18next@25.8.4", "", { "dependencies": { "@babel/runtime": "^7.28.4" }, "peerDependencies": { "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-a9A0MnUjKvzjEN/26ZY1okpra9kA8MEwzYEz1BNm+IyxUKPRH6ihf0p7vj8YvULwZHKHl3zkJ6KOt4hewxBecQ=="],
+ "i18next": ["i18next@25.10.10", "", { "dependencies": { "@babel/runtime": "^7.29.2" }, "peerDependencies": { "typescript": "^5 || ^6" }, "optionalPeers": ["typescript"] }, "sha512-cqUW2Z3EkRx7NqSyywjkgCLK7KLCL6IFVFcONG7nVYIJ3ekZ1/N5jUsihHV6Bq37NfhgtczxJcxduELtjTwkuQ=="],
"iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
@@ -3273,14 +3266,12 @@
"immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="],
- "immutable": ["immutable@4.3.7", "", {}, "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw=="],
+ "immutable": ["immutable@4.3.8", "", {}, "sha512-d/Ld9aLbKpNwyl0KiM2CT1WYvkitQ1TSvmRtkcV8FKStiDoA7Slzgjmb/1G2yhKM1p0XeNOieaTbFZmU1d3Xuw=="],
"import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
"import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="],
- "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
-
"indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="],
"inherits": ["inherits@2.0.3", "", {}, "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="],
@@ -3291,11 +3282,11 @@
"invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="],
- "ip-address": ["ip-address@10.1.0", "", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="],
+ "ip-address": ["ip-address@10.2.0", "", {}, "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA=="],
"is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
- "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
+ "is-core-module": ["is-core-module@2.16.2", "", { "dependencies": { "hasown": "^2.0.3" } }, "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA=="],
"is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="],
@@ -3327,7 +3318,7 @@
"is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="],
- "isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="],
+ "isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="],
"isobject": ["isobject@3.0.1", "", {}, "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="],
@@ -3343,21 +3334,21 @@
"javascript-natural-sort": ["javascript-natural-sort@0.7.1", "", {}, "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw=="],
- "jest-diff": ["jest-diff@30.2.0", "", { "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "pretty-format": "30.2.0" } }, "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A=="],
+ "jest-diff": ["jest-diff@30.4.1", "", { "dependencies": { "@jest/diff-sequences": "30.4.0", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "pretty-format": "30.4.1" } }, "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA=="],
- "jest-matcher-utils": ["jest-matcher-utils@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "jest-diff": "30.2.0", "pretty-format": "30.2.0" } }, "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg=="],
+ "jest-matcher-utils": ["jest-matcher-utils@30.4.1", "", { "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "jest-diff": "30.4.1", "pretty-format": "30.4.1" } }, "sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A=="],
- "jest-message-util": ["jest-message-util@30.2.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "micromatch": "^4.0.8", "pretty-format": "30.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw=="],
+ "jest-message-util": ["jest-message-util@30.4.1", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.4.1", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "jest-util": "30.4.1", "picomatch": "^4.0.3", "pretty-format": "30.4.1", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ=="],
- "jest-mock": ["jest-mock@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "jest-util": "30.2.0" } }, "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw=="],
+ "jest-mock": ["jest-mock@30.4.1", "", { "dependencies": { "@jest/types": "30.4.1", "@types/node": "*", "jest-util": "30.4.1" } }, "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw=="],
- "jest-regex-util": ["jest-regex-util@30.0.1", "", {}, "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA=="],
+ "jest-regex-util": ["jest-regex-util@30.4.0", "", {}, "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg=="],
- "jest-util": ["jest-util@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", "picomatch": "^4.0.2" } }, "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA=="],
+ "jest-util": ["jest-util@30.4.1", "", { "dependencies": { "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", "picomatch": "^4.0.3" } }, "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw=="],
"jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="],
- "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
+ "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="],
"jquery": ["jquery@3.7.1", "", {}, "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="],
@@ -3369,7 +3360,7 @@
"jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
- "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="],
+ "json-parse-even-better-errors": ["json-parse-even-better-errors@5.0.0", "", {}, "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ=="],
"json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
@@ -3433,27 +3424,27 @@
"konva": ["konva@8.3.0", "", {}, "sha512-V83lFjf1xPJp7SzWKktOgRFPYa8SOHKVfgru3jjdMjKTGNpCGrIh3CuJeKC/tJ5Fg0P3lOpPCR30gDbDsATmDA=="],
- "lefthook": ["lefthook@2.1.0", "", { "optionalDependencies": { "lefthook-darwin-arm64": "2.1.0", "lefthook-darwin-x64": "2.1.0", "lefthook-freebsd-arm64": "2.1.0", "lefthook-freebsd-x64": "2.1.0", "lefthook-linux-arm64": "2.1.0", "lefthook-linux-x64": "2.1.0", "lefthook-openbsd-arm64": "2.1.0", "lefthook-openbsd-x64": "2.1.0", "lefthook-windows-arm64": "2.1.0", "lefthook-windows-x64": "2.1.0" }, "bin": { "lefthook": "bin/index.js" } }, "sha512-+vS+yywGQW6CN1J1hbGkez//6ixGHIQqfxDN/d3JDm531w9GfGt2lAWTDfZTw/CEl80XsN0raFcnEraR3ldw9g=="],
+ "lefthook": ["lefthook@2.1.6", "", { "optionalDependencies": { "lefthook-darwin-arm64": "2.1.6", "lefthook-darwin-x64": "2.1.6", "lefthook-freebsd-arm64": "2.1.6", "lefthook-freebsd-x64": "2.1.6", "lefthook-linux-arm64": "2.1.6", "lefthook-linux-x64": "2.1.6", "lefthook-openbsd-arm64": "2.1.6", "lefthook-openbsd-x64": "2.1.6", "lefthook-windows-arm64": "2.1.6", "lefthook-windows-x64": "2.1.6" }, "bin": { "lefthook": "bin/index.js" } }, "sha512-w9sBoR0mdN+kJc3SB85VzpiAAl451/rxdCRcZlwW71QLjkeH3EBQFgc4VMj5apePychYDHAlqEWTB8J8JK/j1Q=="],
- "lefthook-darwin-arm64": ["lefthook-darwin-arm64@2.1.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-u2hjHLQXWSFfzO7ln2n/uEydSzfC9sc5cDC7tvKSuOdhvBwaJ0AQ7ZeuqqCQ4YfVIJfYOom1SVE9CBd10FVyig=="],
+ "lefthook-darwin-arm64": ["lefthook-darwin-arm64@2.1.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-hyB7eeiX78BS66f70byTJacDLC/xV1vgMv9n+idFUsrM7J3Udd/ag9Ag5NP3t0eN0EqQqAtrNnt35EH01lxnRQ=="],
- "lefthook-darwin-x64": ["lefthook-darwin-x64@2.1.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-zz5rcyrtOZpxon7uE+c0KC/o2ypJeLZql5CL0Y9oaTuECbmhfokm8glsGnyWstW/++PuMpZYYr/qsCJA5elxkQ=="],
+ "lefthook-darwin-x64": ["lefthook-darwin-x64@2.1.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-5Ka6cFxiH83krt+OMRQtmS6zqoZR5SLXSudLjTbZA1c3ZqF0+dqkeb4XcB6plx6WR0GFizabuc6Bi3iXPIe1eQ=="],
- "lefthook-freebsd-arm64": ["lefthook-freebsd-arm64@2.1.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-+mXNCNuFHNGYLrDqYWDeHH7kWCLCJFPpspx5PAAm+PD37PRMZJrTqDbaNK9qCghC1tdmT4/Lvilf/ewXHPlaKw=="],
+ "lefthook-freebsd-arm64": ["lefthook-freebsd-arm64@2.1.6", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-VswyOg5CVN3rMaOJ2HtnkltiMKgFHW/wouWxXsV8RxSa4tgWOKxM0EmSXi8qc2jX+LRga6B0uOY6toXS01zWxA=="],
- "lefthook-freebsd-x64": ["lefthook-freebsd-x64@2.1.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-+AU2HD7szuDsUdHue/E3OnF84B2ae/h7CGKpuIUHJntgoJ4kxf89oDvq2/xl8kDCn9cT76UUjgeZUgFYLRj+6Q=="],
+ "lefthook-freebsd-x64": ["lefthook-freebsd-x64@2.1.6", "", { "os": "freebsd", "cpu": "x64" }, "sha512-vXsCUFYuVwrVWwcypB7Zt2Hf+5pl1V1la7ZfvGYZaTRURu0zF/XUnMF/nOz/PebGv0f4x/iOWXWwP7E42xRWsg=="],
- "lefthook-linux-arm64": ["lefthook-linux-arm64@2.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-KM70eV1tsEib1/tk+3TFxIdH84EaYlIg5KTQWAg+LB1N23nTQ7lL4Dnh1je6f6KW4tf21nmoMUqsh0xvMkQk8Q=="],
+ "lefthook-linux-arm64": ["lefthook-linux-arm64@2.1.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-WDJiQhJdZOvKORZd+kF/ms2l6NSsXzdA9ahflyr65V90AC4jES223W8VtEMbGPUtHuGWMEZ/v/XvwlWv0Ioz9g=="],
- "lefthook-linux-x64": ["lefthook-linux-x64@2.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-6Bxmv+l7LiYq9W0IE6v2lmlRtBp6pisnlzhcouMGvH3rDwEGw11NAyRJZA3IPGEMAkIuhnlnVTUwAUzKomfJLg=="],
+ "lefthook-linux-x64": ["lefthook-linux-x64@2.1.6", "", { "os": "linux", "cpu": "x64" }, "sha512-C18nCd7nTX1AVL4TcvwMmLAO1VI1OuGluIOTjiPkBQ746Ls1HhL5rl//jMPACmT28YmxIQJ2ZcLPNmhvEVBZvw=="],
- "lefthook-openbsd-arm64": ["lefthook-openbsd-arm64@2.1.0", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-ppJNK0bBSPLC8gqksRw5zI/0uLeMA5cK+hmZ4ofcuGNmdrN1dfl2Tx84fdeef0NcQY0ii9Y3j3icIKngIoid/g=="],
+ "lefthook-openbsd-arm64": ["lefthook-openbsd-arm64@2.1.6", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-mZOMxM8HiPxVFXDO3PtCUbH4GB8rkveXhsgXF27oAZTYVzQ3gO9vT6r/pxit6msqRXz3fvcwimLVJgb8eRsa8A=="],
- "lefthook-openbsd-x64": ["lefthook-openbsd-x64@2.1.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-8k9lQsMYqQGu4spaQ8RNSOJidxIcOyfaoF2FPZhthtBfRV3cgVFGrsQ0hbIi5pvQRGUlCqYuCN79qauXHmnL3Q=="],
+ "lefthook-openbsd-x64": ["lefthook-openbsd-x64@2.1.6", "", { "os": "openbsd", "cpu": "x64" }, "sha512-sG9ALLZSnnMOfXu+B7SmxFhJhuoAh4bqi5En5aaHJET48TqrLOcWWZuH+7ArFM6gr/U5KfSUvdmHFmY8WqCcIg=="],
- "lefthook-windows-arm64": ["lefthook-windows-arm64@2.1.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-0WN+grrxt9zP9NGRcztoPXcz25tteem91rfLWgQFab+50csJ47zldlsB7/eOS/eHG5mUg5g5NPR4XefnXtjOcQ=="],
+ "lefthook-windows-arm64": ["lefthook-windows-arm64@2.1.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-lD8yFWY4Csuljd0Rqs7EQaySC0VvDf7V3rN1FhRMUISTRDHutebIom1Loc8ckQPvKYGC6mftT9k0GvipsS+Brw=="],
- "lefthook-windows-x64": ["lefthook-windows-x64@2.1.0", "", { "os": "win32", "cpu": "x64" }, "sha512-XbO/5nAZQLpUn0tPpgCYfFBFJHnymSglQ73jD6wymNrR1j8I5EcXGlP6YcLhnZ83yzsdLC+gup+N6IqUeiyRdw=="],
+ "lefthook-windows-x64": ["lefthook-windows-x64@2.1.6", "", { "os": "win32", "cpu": "x64" }, "sha512-q4z2n3xucLscoWiyMwFViEj3N8MDSkPulMwcJYuCYFHoPhP1h+icqNu7QRLGYj6AnVrCQweiUJY3Tb2X+GbD/A=="],
"lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
@@ -3493,7 +3484,7 @@
"lit-html": ["lit-html@3.3.2", "", { "dependencies": { "@types/trusted-types": "^2.0.2" } }, "sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw=="],
- "loader-runner": ["loader-runner@4.3.1", "", {}, "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q=="],
+ "loader-runner": ["loader-runner@4.3.2", "", {}, "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w=="],
"loader-utils": ["loader-utils@2.0.4", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^2.1.2" } }, "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw=="],
@@ -3501,9 +3492,9 @@
"locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
- "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="],
+ "lodash": ["lodash@4.18.1", "", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="],
- "lodash-es": ["lodash-es@4.17.23", "", {}, "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg=="],
+ "lodash-es": ["lodash-es@4.18.1", "", {}, "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A=="],
"lodash.startcase": ["lodash.startcase@4.4.0", "", {}, "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg=="],
@@ -3517,7 +3508,7 @@
"lowlight": ["lowlight@3.3.0", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.0.0", "highlight.js": "~11.11.0" } }, "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ=="],
- "lru-cache": ["lru-cache@11.2.5", "", {}, "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw=="],
+ "lru-cache": ["lru-cache@11.3.6", "", {}, "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A=="],
"lz-string": ["lz-string@1.5.0", "", { "bin": { "lz-string": "bin/bin.js" } }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="],
@@ -3527,9 +3518,9 @@
"make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="],
- "make-fetch-happen": ["make-fetch-happen@15.0.3", "", { "dependencies": { "@npmcli/agent": "^4.0.0", "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "ssri": "^13.0.0" } }, "sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw=="],
+ "make-fetch-happen": ["make-fetch-happen@15.0.5", "", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/agent": "^4.0.0", "@npmcli/redact": "^4.0.0", "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^6.0.0", "ssri": "^13.0.0" } }, "sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg=="],
- "markdown-it": ["markdown-it@14.1.0", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.0", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg=="],
+ "markdown-it": ["markdown-it@14.1.1", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.0", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA=="],
"math-expression-evaluator": ["math-expression-evaluator@1.4.0", "", {}, "sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw=="],
@@ -3545,21 +3536,21 @@
"micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
- "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
+ "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="],
"mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
"min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="],
- "minimatch": ["minimatch@10.1.2", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.1" } }, "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw=="],
+ "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
- "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
+ "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="],
"minipass-collect": ["minipass-collect@2.0.1", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw=="],
- "minipass-fetch": ["minipass-fetch@5.0.1", "", { "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^2.0.0", "minizlib": "^3.0.1" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "sha512-yHK8pb0iCGat0lDrs/D6RZmCdaBT64tULXjdxjSMAqoDi18Q3qKEUTHypHQZQd9+FYpIS+lkvpq6C/R6SbUeRw=="],
+ "minipass-fetch": ["minipass-fetch@5.0.2", "", { "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^2.0.0", "minizlib": "^3.0.1" }, "optionalDependencies": { "iconv-lite": "^0.7.2" } }, "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ=="],
- "minipass-flush": ["minipass-flush@1.0.5", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw=="],
+ "minipass-flush": ["minipass-flush@1.0.7", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA=="],
"minipass-pipeline": ["minipass-pipeline@1.2.4", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A=="],
@@ -3573,7 +3564,7 @@
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
- "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+ "nanoid": ["nanoid@3.3.12", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ=="],
"negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
@@ -3585,9 +3576,9 @@
"no-case": ["no-case@2.3.2", "", { "dependencies": { "lower-case": "^1.1.1" } }, "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ=="],
- "node-gyp": ["node-gyp@12.2.0", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", "make-fetch-happen": "^15.0.0", "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "tar": "^7.5.4", "tinyglobby": "^0.2.12", "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ=="],
+ "node-gyp": ["node-gyp@12.3.0", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "tar": "^7.5.4", "tinyglobby": "^0.2.12", "undici": "^6.25.0", "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg=="],
- "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="],
+ "node-releases": ["node-releases@2.0.38", "", {}, "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw=="],
"nopt": ["nopt@9.0.0", "", { "dependencies": { "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw=="],
@@ -3599,7 +3590,7 @@
"npm-package-arg": ["npm-package-arg@13.0.2", "", { "dependencies": { "hosted-git-info": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^7.0.0" } }, "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA=="],
- "npm-packlist": ["npm-packlist@10.0.3", "", { "dependencies": { "ignore-walk": "^8.0.0", "proc-log": "^6.0.0" } }, "sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg=="],
+ "npm-packlist": ["npm-packlist@10.0.4", "", { "dependencies": { "ignore-walk": "^8.0.0", "proc-log": "^6.0.0" } }, "sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng=="],
"npm-pick-manifest": ["npm-pick-manifest@11.0.3", "", { "dependencies": { "npm-install-checks": "^8.0.0", "npm-normalize-package-bin": "^5.0.0", "npm-package-arg": "^13.0.0", "semver": "^7.3.5" } }, "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ=="],
@@ -3631,7 +3622,7 @@
"package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="],
- "pacote": ["pacote@21.2.0", "", { "dependencies": { "@npmcli/git": "^7.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "@npmcli/run-script": "^10.0.0", "cacache": "^20.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^13.0.0", "npm-packlist": "^10.0.1", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "sigstore": "^4.0.0", "ssri": "^13.0.0", "tar": "^7.4.3" }, "bin": { "pacote": "bin/index.js" } }, "sha512-OwidJA8uHuGYxoZhe4DBv3JJqGg4ojjVV5dwvVxRKq+bOBpgYMbYd/onIvSU1sv5nQIsb+zp4/0uqv6giFQVjg=="],
+ "pacote": ["pacote@21.5.0", "", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/git": "^7.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "@npmcli/run-script": "^10.0.0", "cacache": "^20.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^13.0.0", "npm-packlist": "^10.0.1", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "proc-log": "^6.0.0", "sigstore": "^4.0.0", "ssri": "^13.0.0", "tar": "^7.4.3" }, "bin": { "pacote": "bin/index.js" } }, "sha512-VtZ0SB8mb5Tzw3dXDfVAIjhyVKUHZkS/ZH9/5mpKenwC9sFOXNI0JI7kEF7IMkwOnsWMFrvAZHzx1T5fmrp9FQ=="],
"param-case": ["param-case@2.1.1", "", { "dependencies": { "no-case": "^2.2.0" } }, "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w=="],
@@ -3651,7 +3642,7 @@
"path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
- "path-scurry": ["path-scurry@2.0.1", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA=="],
+ "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="],
"path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
@@ -3659,17 +3650,17 @@
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
- "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
+ "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
"pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="],
- "playwright": ["playwright@1.58.2", "", { "dependencies": { "playwright-core": "1.58.2" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A=="],
+ "playwright": ["playwright@1.59.1", "", { "dependencies": { "playwright-core": "1.59.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw=="],
- "playwright-core": ["playwright-core@1.58.2", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg=="],
+ "playwright-core": ["playwright-core@1.59.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg=="],
"pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="],
- "postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="],
+ "postcss": ["postcss@8.5.14", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg=="],
"postcss-modules-extract-imports": ["postcss-modules-extract-imports@3.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q=="],
@@ -3689,11 +3680,9 @@
"proc-log": ["proc-log@6.1.0", "", {}, "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ=="],
- "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="],
-
"prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="],
- "prosemirror-changeset": ["prosemirror-changeset@2.3.1", "", { "dependencies": { "prosemirror-transform": "^1.0.0" } }, "sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ=="],
+ "prosemirror-changeset": ["prosemirror-changeset@2.4.1", "", { "dependencies": { "prosemirror-transform": "^1.0.0" } }, "sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw=="],
"prosemirror-collab": ["prosemirror-collab@1.3.1", "", { "dependencies": { "prosemirror-state": "^1.0.0" } }, "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ=="],
@@ -3701,7 +3690,7 @@
"prosemirror-dropcursor": ["prosemirror-dropcursor@1.8.2", "", { "dependencies": { "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0", "prosemirror-view": "^1.1.0" } }, "sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw=="],
- "prosemirror-gapcursor": ["prosemirror-gapcursor@1.4.0", "", { "dependencies": { "prosemirror-keymap": "^1.0.0", "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", "prosemirror-view": "^1.0.0" } }, "sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ=="],
+ "prosemirror-gapcursor": ["prosemirror-gapcursor@1.4.1", "", { "dependencies": { "prosemirror-keymap": "^1.0.0", "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", "prosemirror-view": "^1.0.0" } }, "sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw=="],
"prosemirror-history": ["prosemirror-history@1.5.0", "", { "dependencies": { "prosemirror-state": "^1.2.2", "prosemirror-transform": "^1.0.0", "prosemirror-view": "^1.31.0", "rope-sequence": "^1.3.0" } }, "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg=="],
@@ -3711,7 +3700,7 @@
"prosemirror-markdown": ["prosemirror-markdown@1.13.4", "", { "dependencies": { "@types/markdown-it": "^14.0.0", "markdown-it": "^14.0.0", "prosemirror-model": "^1.25.0" } }, "sha512-D98dm4cQ3Hs6EmjK500TdAOew4Z03EV71ajEFiWra3Upr7diytJsjF4mPV2dW+eK5uNectiRj0xFxYI9NLXDbw=="],
- "prosemirror-menu": ["prosemirror-menu@1.2.5", "", { "dependencies": { "crelt": "^1.0.0", "prosemirror-commands": "^1.0.0", "prosemirror-history": "^1.0.0", "prosemirror-state": "^1.0.0" } }, "sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ=="],
+ "prosemirror-menu": ["prosemirror-menu@1.3.2", "", { "dependencies": { "crelt": "^1.0.0", "prosemirror-commands": "^1.0.0", "prosemirror-history": "^1.0.0", "prosemirror-state": "^1.0.0" } }, "sha512-6VgUJTYod0nMBlCaYJGhXGLu7Gt4AvcwcOq0YfJCY/6Uh+3S7UsWhpy6rJFCBFOmonq1hD8KyWOtZhkppd4YPg=="],
"prosemirror-model": ["prosemirror-model@1.25.4", "", { "dependencies": { "orderedmap": "^2.0.0" } }, "sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA=="],
@@ -3725,9 +3714,9 @@
"prosemirror-trailing-node": ["prosemirror-trailing-node@3.0.0", "", { "dependencies": { "@remirror/core-constants": "3.0.0", "escape-string-regexp": "^4.0.0" }, "peerDependencies": { "prosemirror-model": "^1.22.1", "prosemirror-state": "^1.4.2", "prosemirror-view": "^1.33.8" } }, "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ=="],
- "prosemirror-transform": ["prosemirror-transform@1.11.0", "", { "dependencies": { "prosemirror-model": "^1.21.0" } }, "sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw=="],
+ "prosemirror-transform": ["prosemirror-transform@1.12.0", "", { "dependencies": { "prosemirror-model": "^1.21.0" } }, "sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w=="],
- "prosemirror-view": ["prosemirror-view@1.41.6", "", { "dependencies": { "prosemirror-model": "^1.20.0", "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0" } }, "sha512-mxpcDG4hNQa/CPtzxjdlir5bJFDlm0/x5nGBbStB2BWX+XOQ9M8ekEG+ojqB5BcVu2Rc80/jssCMZzSstJuSYg=="],
+ "prosemirror-view": ["prosemirror-view@1.41.8", "", { "dependencies": { "prosemirror-model": "^1.20.0", "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0" } }, "sha512-TnKDdohEatgyZNGCDWIdccOHXhYloJwbwU+phw/a23KBvJIR9lWQWW7WHHK3vBdOLDNuF7TaX98GObUZOWkOnA=="],
"punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="],
@@ -3739,8 +3728,6 @@
"raf-schd": ["raf-schd@4.0.3", "", {}, "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ=="],
- "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="],
-
"react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="],
"react-attr-converter": ["react-attr-converter@0.3.1", "", {}, "sha512-dSxo2Mn6Zx4HajeCeQNLefwEO4kNtV/0E682R1+ZTyFRPqxDa5zYb5qM/ocqw9Bxr/kFQO0IUiqdV7wdHw+Cdg=="],
@@ -3753,7 +3740,11 @@
"react-input-autosize": ["react-input-autosize@2.2.2", "", { "dependencies": { "prop-types": "^15.5.8" }, "peerDependencies": { "react": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0" } }, "sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw=="],
- "react-is": ["react-is@19.2.4", "", {}, "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA=="],
+ "react-is": ["react-is@19.2.6", "", {}, "sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw=="],
+
+ "react-is-18": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="],
+
+ "react-is-19": ["react-is@19.2.6", "", {}, "sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw=="],
"react-jss": ["react-jss@10.10.0", "", { "dependencies": { "@babel/runtime": "^7.3.1", "@emotion/is-prop-valid": "^0.7.3", "css-jss": "10.10.0", "hoist-non-react-statics": "^3.2.0", "is-in-browser": "^1.1.3", "jss": "10.10.0", "jss-preset-default": "10.10.0", "prop-types": "^15.6.0", "shallow-equal": "^1.2.0", "theming": "^3.3.0", "tiny-warning": "^1.0.2" }, "peerDependencies": { "react": ">=16.8.6" } }, "sha512-WLiq84UYWqNBF6579/uprcIUnM1TSywYq6AIjKTTTG5ziJl9Uy+pwuvpN3apuyVwflMbD60PraeTKT7uWH9XEQ=="],
@@ -3777,7 +3768,7 @@
"read-yaml-file": ["read-yaml-file@1.1.0", "", { "dependencies": { "graceful-fs": "^4.1.5", "js-yaml": "^3.6.1", "pify": "^4.0.1", "strip-bom": "^3.0.0" } }, "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA=="],
- "recharts": ["recharts@3.7.0", "", { "dependencies": { "@reduxjs/toolkit": "1.x.x || 2.x.x", "clsx": "^2.1.1", "decimal.js-light": "^2.5.1", "es-toolkit": "^1.39.3", "eventemitter3": "^5.0.1", "immer": "^10.1.1", "react-redux": "8.x.x || 9.x.x", "reselect": "5.1.1", "tiny-invariant": "^1.3.3", "use-sync-external-store": "^1.2.2", "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-l2VCsy3XXeraxIID9fx23eCb6iCBsxUQDnE8tWm6DFdszVAO7WVY/ChAD9wVit01y6B2PMupYiMmQwhgPHc9Ew=="],
+ "recharts": ["recharts@3.8.1", "", { "dependencies": { "@reduxjs/toolkit": "^1.9.0 || 2.x.x", "clsx": "^2.1.1", "decimal.js-light": "^2.5.1", "es-toolkit": "^1.39.3", "eventemitter3": "^5.0.1", "immer": "^10.1.1", "react-redux": "8.x.x || 9.x.x", "reselect": "5.1.1", "tiny-invariant": "^1.3.3", "use-sync-external-store": "^1.2.2", "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg=="],
"redent": ["redent@3.0.0", "", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="],
@@ -3797,19 +3788,17 @@
"resize-observer-polyfill": ["resize-observer-polyfill@1.5.1", "", {}, "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="],
- "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="],
+ "resolve": ["resolve@1.22.12", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA=="],
"resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
"resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
- "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="],
-
"reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
- "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="],
+ "robust-predicates": ["robust-predicates@3.0.3", "", {}, "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA=="],
- "rolldown": ["rolldown@1.0.0-rc.10", "", { "dependencies": { "@oxc-project/types": "=0.120.0", "@rolldown/pluginutils": "1.0.0-rc.10" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.10", "@rolldown/binding-darwin-arm64": "1.0.0-rc.10", "@rolldown/binding-darwin-x64": "1.0.0-rc.10", "@rolldown/binding-freebsd-x64": "1.0.0-rc.10", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.10", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.10", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.10", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.10", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.10", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.10", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.10", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.10", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.10", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.10", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.10" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-q7j6vvarRFmKpgJUT8HCAUljkgzEp4LAhPlJUvQhA5LA1SUL36s5QCysMutErzL3EbNOZOkoziSx9iZC4FddKA=="],
+ "rolldown": ["rolldown@1.0.0", "", { "dependencies": { "@oxc-project/types": "=0.129.0", "@rolldown/pluginutils": "1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0", "@rolldown/binding-darwin-arm64": "1.0.0", "@rolldown/binding-darwin-x64": "1.0.0", "@rolldown/binding-freebsd-x64": "1.0.0", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0", "@rolldown/binding-linux-arm64-gnu": "1.0.0", "@rolldown/binding-linux-arm64-musl": "1.0.0", "@rolldown/binding-linux-ppc64-gnu": "1.0.0", "@rolldown/binding-linux-s390x-gnu": "1.0.0", "@rolldown/binding-linux-x64-gnu": "1.0.0", "@rolldown/binding-linux-x64-musl": "1.0.0", "@rolldown/binding-openharmony-arm64": "1.0.0", "@rolldown/binding-wasm32-wasi": "1.0.0", "@rolldown/binding-win32-arm64-msvc": "1.0.0", "@rolldown/binding-win32-x64-msvc": "1.0.0" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-yD986aXDESFGS95spT1LAv0jssywP4npMEjmMHyN2/5+eE8qQJUype2AaKkRiLgBgyD0LFlubwAht7VmY8rGoA=="],
"rope-sequence": ["rope-sequence@1.3.4", "", {}, "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ=="],
@@ -3817,8 +3806,6 @@
"run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
- "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
-
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
"scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="],
@@ -3829,13 +3816,11 @@
"seedrandom": ["seedrandom@3.0.5", "", {}, "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="],
- "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
+ "semver": ["semver@7.8.0", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA=="],
"sentence-case": ["sentence-case@2.1.1", "", { "dependencies": { "no-case": "^2.2.0", "upper-case-first": "^1.1.2" } }, "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ=="],
- "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="],
-
- "set-cookie-parser": ["set-cookie-parser@3.0.1", "", {}, "sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q=="],
+ "set-cookie-parser": ["set-cookie-parser@3.1.0", "", {}, "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw=="],
"set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="],
@@ -3861,12 +3846,10 @@
"snake-case": ["snake-case@2.1.0", "", { "dependencies": { "no-case": "^2.2.0" } }, "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q=="],
- "socks": ["socks@2.8.7", "", { "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" } }, "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A=="],
+ "socks": ["socks@2.8.9", "", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw=="],
"socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="],
- "source-list-map": ["source-list-map@2.0.1", "", {}, "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="],
-
"source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="],
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
@@ -3875,23 +3858,21 @@
"spawndamnit": ["spawndamnit@3.0.1", "", { "dependencies": { "cross-spawn": "^7.0.5", "signal-exit": "^4.0.1" } }, "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg=="],
- "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="],
-
"spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="],
- "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="],
+ "spdx-expression-parse": ["spdx-expression-parse@4.0.0", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ=="],
- "spdx-license-ids": ["spdx-license-ids@3.0.22", "", {}, "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ=="],
+ "spdx-license-ids": ["spdx-license-ids@3.0.23", "", {}, "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw=="],
"sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="],
- "ssri": ["ssri@13.0.0", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng=="],
+ "ssri": ["ssri@13.0.1", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ=="],
"stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="],
"stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="],
- "std-env": ["std-env@4.0.0", "", {}, "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ=="],
+ "std-env": ["std-env@4.1.0", "", {}, "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ=="],
"string-hash": ["string-hash@1.1.3", "", {}, "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A=="],
@@ -3913,7 +3894,7 @@
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
- "svelte": ["svelte@5.54.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.2", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-TTDxwYnHkova6Wsyj1PGt9TByuWqvMoeY1bQiuAf2DM/JeDSMw7FjRKzk8K/5mJ99vGOKhbCqTDpyAKwjp4igg=="],
+ "svelte": ["svelte@5.55.5", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-2uCs/LZ9us+AktdzYJM8OcxQ8qnPS1kpaO7syGT/MgO+6Qr1Ybl+TqPq+97u7PHqmmMlye5ZkoyXONy5mjjAbw=="],
"svelte-dev-helper": ["svelte-dev-helper@1.1.9", "", {}, "sha512-oU+Xv7Dl4kRU2kdFjsoPLfJfnt5hUhsFUZtuzI3Ku/f2iAFZqBoEuXOqK3N9ngD4dxQOmN4OKWPHVi3NeAeAfQ=="],
@@ -3925,17 +3906,17 @@
"symbol-observable": ["symbol-observable@1.2.0", "", {}, "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="],
- "tailwindcss": ["tailwindcss@4.2.2", "", {}, "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q=="],
+ "tailwindcss": ["tailwindcss@4.3.0", "", {}, "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q=="],
- "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="],
+ "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="],
- "tar": ["tar@7.5.7", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ=="],
+ "tar": ["tar@7.5.15", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ=="],
"term-size": ["term-size@2.2.1", "", {}, "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg=="],
- "terser": ["terser@5.46.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg=="],
+ "terser": ["terser@5.47.1", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw=="],
- "terser-webpack-plugin": ["terser-webpack-plugin@5.3.16", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q=="],
+ "terser-webpack-plugin": ["terser-webpack-plugin@5.6.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-Eum+5ajkaOhf5KbM26osvv21kLD7BaGqQ1UA4Ami4arYwylmGUQTgHFpHDdmJod1q4QXa66p0to/FBKID+J1vA=="],
"theming": ["theming@3.3.0", "", { "dependencies": { "hoist-non-react-statics": "^3.3.0", "prop-types": "^15.5.8", "react-display-name": "^0.2.4", "tiny-warning": "^1.0.2" }, "peerDependencies": { "react": ">=16.3" } }, "sha512-u6l4qTJRDaWZsqa8JugaNt7Xd8PPl9+gonZaIe28vAhqgHMIG/DOyFPqiKN/gQLQYj05tHv+YQdNILL4zoiAVA=="],
@@ -3947,11 +3928,11 @@
"tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="],
- "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="],
+ "tinyexec": ["tinyexec@1.1.2", "", {}, "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA=="],
- "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
+ "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="],
- "tinyrainbow": ["tinyrainbow@3.0.3", "", {}, "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q=="],
+ "tinyrainbow": ["tinyrainbow@3.1.0", "", {}, "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw=="],
"tippy.js": ["tippy.js@6.3.7", "", { "dependencies": { "@popperjs/core": "^2.9.0" } }, "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ=="],
@@ -3971,7 +3952,7 @@
"tuf-js": ["tuf-js@4.1.0", "", { "dependencies": { "@tufjs/models": "4.1.0", "debug": "^4.4.3", "make-fetch-happen": "^15.0.1" } }, "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ=="],
- "turbo": ["turbo@2.9.9", "", { "optionalDependencies": { "@turbo/darwin-64": "2.9.9", "@turbo/darwin-arm64": "2.9.9", "@turbo/linux-64": "2.9.9", "@turbo/linux-arm64": "2.9.9", "@turbo/windows-64": "2.9.9", "@turbo/windows-arm64": "2.9.9" }, "bin": { "turbo": "bin/turbo" } }, "sha512-3xfzXE/yTjhh0S5dIWlE+3E+J9A09REpLI1ZqVh2+HrNZoVzZn0pkvjiRgVK/Ev3PF9XnaTwCntTx+CADWXcyA=="],
+ "turbo": ["turbo@2.9.12", "", { "optionalDependencies": { "@turbo/darwin-64": "2.9.12", "@turbo/darwin-arm64": "2.9.12", "@turbo/linux-64": "2.9.12", "@turbo/linux-arm64": "2.9.12", "@turbo/windows-64": "2.9.12", "@turbo/windows-arm64": "2.9.12" }, "bin": { "turbo": "bin/turbo" } }, "sha512-lCPgus1NuTiBdaITWqzSH/Ff6HVL8HHGBtOXHg1dHRfcshN79XkygSdh0M6g8b0td91ILLG5MTkLOkp5UvyPJw=="],
"type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="],
@@ -3981,11 +3962,9 @@
"uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="],
- "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
-
- "unique-filename": ["unique-filename@5.0.0", "", { "dependencies": { "unique-slug": "^6.0.0" } }, "sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg=="],
+ "undici": ["undici@6.25.0", "", {}, "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg=="],
- "unique-slug": ["unique-slug@6.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw=="],
+ "undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="],
"unist-util-modify-children": ["unist-util-modify-children@1.1.6", "", { "dependencies": { "array-iterate": "^1.0.0" } }, "sha512-TOA6W9QLil+BrHqIZNR4o6IA5QwGOveMbnQxnWYq+7EFORx9vz/CHrtzF36zWrW61E2UKw7sM1KPtIgeceVwXw=="],
@@ -4005,17 +3984,15 @@
"util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
- "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="],
-
"validate-npm-package-name": ["validate-npm-package-name@7.0.2", "", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="],
"victory-vendor": ["victory-vendor@37.3.6", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ=="],
- "vite": ["vite@8.0.1", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.3", "postcss": "^8.5.8", "rolldown": "1.0.0-rc.10", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.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" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-wt+Z2qIhfFt85uiyRt5LPU4oVEJBXj8hZNWKeqFG4gRG/0RaRGJ7njQCwzFVjO+v4+Ipmf5CY7VdmZRAYYBPHw=="],
+ "vite": ["vite@8.0.12", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.14", "rolldown": "1.0.0", "tinyglobby": "^0.2.16" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.18", "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" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w2dDofOWv2QB09ZITZBsvKTVAlYvPR4IAmrY/v0ir9KvLs0xybR7i48wxhM1/oyBWO34wPns+bPGw5ZrZqDpZg=="],
- "vitefu": ["vitefu@1.1.2", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0" }, "optionalPeers": ["vite"] }, "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw=="],
+ "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="],
- "vitest": ["vitest@4.1.0", "", { "dependencies": { "@vitest/expect": "4.1.0", "@vitest/mocker": "4.1.0", "@vitest/pretty-format": "4.1.0", "@vitest/runner": "4.1.0", "@vitest/snapshot": "4.1.0", "@vitest/spy": "4.1.0", "@vitest/utils": "4.1.0", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.0.3", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0", "why-is-node-running": "^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.1.0", "@vitest/browser-preview": "4.1.0", "@vitest/browser-webdriverio": "4.1.0", "@vitest/ui": "4.1.0", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw=="],
+ "vitest": ["vitest@4.1.6", "", { "dependencies": { "@vitest/expect": "4.1.6", "@vitest/mocker": "4.1.6", "@vitest/pretty-format": "4.1.6", "@vitest/runner": "4.1.6", "@vitest/snapshot": "4.1.6", "@vitest/spy": "4.1.6", "@vitest/utils": "4.1.6", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^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.1.6", "@vitest/browser-preview": "4.1.6", "@vitest/browser-webdriverio": "4.1.6", "@vitest/coverage-istanbul": "4.1.6", "@vitest/coverage-v8": "4.1.6", "@vitest/ui": "4.1.6", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-6lvjbS3p9b4CrdCmguzbh2/4uoXhGE2q71R4OX5sqF9R1bo9Xd6fGrMAfvp5wnCzlBnFVdCOp6onuTQVbo8iUQ=="],
"w3c-keyname": ["w3c-keyname@2.2.8", "", {}, "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="],
@@ -4023,13 +4000,13 @@
"watchpack": ["watchpack@2.5.1", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg=="],
- "webpack": ["webpack@5.105.0", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.19.0", "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", "terser-webpack-plugin": "^5.3.16", "watchpack": "^2.5.1", "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw=="],
+ "webpack": ["webpack@5.106.2", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.16.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.20.0", "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "loader-runner": "^4.3.1", "mime-db": "^1.54.0", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", "terser-webpack-plugin": "^5.3.17", "watchpack": "^2.5.1", "webpack-sources": "^3.3.4" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA=="],
- "webpack-sources": ["webpack-sources@3.3.3", "", {}, "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg=="],
+ "webpack-sources": ["webpack-sources@3.4.1", "", {}, "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A=="],
"whatwg-mimetype": ["whatwg-mimetype@3.0.0", "", {}, "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q=="],
- "which": ["which@6.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg=="],
+ "which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="],
"why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="],
@@ -4039,13 +4016,13 @@
"wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
- "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="],
+ "ws": ["ws@8.20.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA=="],
"wsl-utils": ["wsl-utils@0.1.0", "", { "dependencies": { "is-wsl": "^3.1.0" } }, "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw=="],
"yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],
- "yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="],
+ "yaml": ["yaml@1.10.3", "", {}, "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA=="],
"zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="],
@@ -4097,15 +4074,7 @@
"@mui/utils/clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
- "@npmcli/package-json/json-parse-even-better-errors": ["json-parse-even-better-errors@5.0.0", "", {}, "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ=="],
-
- "@oclif/core/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
-
- "@pie-element/element-bundler/@types/node": ["@types/node@22.19.10", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-tF5VOugLS/EuDlTBijk0MqABfP8UxgYazTLo3uIn3b4yJgg26QRbVYJYsDtHrjdDUIRfP70+VfhTTc+CE1yskw=="],
-
- "@pie-element/element-bundler/svelte": ["svelte@5.55.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-QjvU7EFemf6mRzdMGlAFttMWtAAVXrax61SZYHdkD6yoVGQ89VeyKfZD4H1JrV1WLmJBxWhFch9H6ig/87VGjw=="],
-
- "@pie-element/mc-populated-blank/svelte": ["svelte@5.55.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-QjvU7EFemf6mRzdMGlAFttMWtAAVXrax61SZYHdkD6yoVGQ89VeyKfZD4H1JrV1WLmJBxWhFch9H6ig/87VGjw=="],
+ "@pie-element/element-bundler/@types/node": ["@types/node@22.19.18", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-9v00a+dn2yWVsYDEunWC4g/TcRKVq3r8N5FuZp7u0SGrPvdN9c2yXI9bBuf5Fl0hNCb+QTIePTn5pJs2pwBOQQ=="],
"@pie-element/multiple-choice/react-transition-group": ["react-transition-group@4.4.5", "", { "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", "prop-types": "^15.6.2" }, "peerDependencies": { "react": ">=16.6.0", "react-dom": ">=16.6.0" } }, "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="],
@@ -4113,29 +4082,15 @@
"@pie-element/placement-ordering/react-transition-group": ["react-transition-group@4.4.5", "", { "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", "prop-types": "^15.6.2" }, "peerDependencies": { "react": ">=16.6.0", "react-dom": ">=16.6.0" } }, "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="],
- "@pie-element/print-player/@types/node": ["@types/node@22.19.10", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-tF5VOugLS/EuDlTBijk0MqABfP8UxgYazTLo3uIn3b4yJgg26QRbVYJYsDtHrjdDUIRfP70+VfhTTc+CE1yskw=="],
-
- "@pie-element/shared-configure-events/@types/bun": ["@types/bun@1.3.13", "", { "dependencies": { "bun-types": "1.3.13" } }, "sha512-9fqXWk5YIHGGnUau9TEi+qdlTYDAnOj+xLCmSTwXfAIqXr2x4tytJb43E9uCvt09zJURKXwAtkoH4nLQfzeTXw=="],
-
- "@pie-element/shared-controller-utils/@types/bun": ["@types/bun@1.3.13", "", { "dependencies": { "bun-types": "1.3.13" } }, "sha512-9fqXWk5YIHGGnUau9TEi+qdlTYDAnOj+xLCmSTwXfAIqXr2x4tytJb43E9uCvt09zJURKXwAtkoH4nLQfzeTXw=="],
-
- "@pie-element/shared-feedback/@types/bun": ["@types/bun@1.3.13", "", { "dependencies": { "bun-types": "1.3.13" } }, "sha512-9fqXWk5YIHGGnUau9TEi+qdlTYDAnOj+xLCmSTwXfAIqXr2x4tytJb43E9uCvt09zJURKXwAtkoH4nLQfzeTXw=="],
-
- "@pie-element/shared-player-events/@types/bun": ["@types/bun@1.3.13", "", { "dependencies": { "bun-types": "1.3.13" } }, "sha512-9fqXWk5YIHGGnUau9TEi+qdlTYDAnOj+xLCmSTwXfAIqXr2x4tytJb43E9uCvt09zJURKXwAtkoH4nLQfzeTXw=="],
-
- "@pie-element/shared-utils/@types/bun": ["@types/bun@1.3.11", "", { "dependencies": { "bun-types": "1.3.11" } }, "sha512-5vPne5QvtpjGpsGYXiFyycfpDF2ECyPcTSsFBMa0fraoxiQyMJ3SmuQIGhzPg2WJuWxVBoxWJ2kClYTcw/4fAg=="],
-
- "@pie-element/simple-cloze/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
-
- "@pie-element/simple-cloze/@tiptap/starter-kit": ["@tiptap/starter-kit@3.19.0", "", { "dependencies": { "@tiptap/core": "^3.19.0", "@tiptap/extension-blockquote": "^3.19.0", "@tiptap/extension-bold": "^3.19.0", "@tiptap/extension-bullet-list": "^3.19.0", "@tiptap/extension-code": "^3.19.0", "@tiptap/extension-code-block": "^3.19.0", "@tiptap/extension-document": "^3.19.0", "@tiptap/extension-dropcursor": "^3.19.0", "@tiptap/extension-gapcursor": "^3.19.0", "@tiptap/extension-hard-break": "^3.19.0", "@tiptap/extension-heading": "^3.19.0", "@tiptap/extension-horizontal-rule": "^3.19.0", "@tiptap/extension-italic": "^3.19.0", "@tiptap/extension-link": "^3.19.0", "@tiptap/extension-list": "^3.19.0", "@tiptap/extension-list-item": "^3.19.0", "@tiptap/extension-list-keymap": "^3.19.0", "@tiptap/extension-ordered-list": "^3.19.0", "@tiptap/extension-paragraph": "^3.19.0", "@tiptap/extension-strike": "^3.19.0", "@tiptap/extension-text": "^3.19.0", "@tiptap/extension-underline": "^3.19.0", "@tiptap/extensions": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-dTCkHEz+Y8ADxX7h+xvl6caAj+3nII/wMB1rTQchSuNKqJTOrzyUsCWm094+IoZmLT738wANE0fRIgziNHs/ug=="],
+ "@pie-element/print-player/@types/node": ["@types/node@22.19.18", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-9v00a+dn2yWVsYDEunWC4g/TcRKVq3r8N5FuZp7u0SGrPvdN9c2yXI9bBuf5Fl0hNCb+QTIePTn5pJs2pwBOQQ=="],
- "@pie-element/simple-cloze/svelte": ["svelte@5.55.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-QjvU7EFemf6mRzdMGlAFttMWtAAVXrax61SZYHdkD6yoVGQ89VeyKfZD4H1JrV1WLmJBxWhFch9H6ig/87VGjw=="],
+ "@pie-element/simple-cloze/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@pie-element/venn-classification/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@pie-element/simple-cloze/@tiptap/starter-kit": ["@tiptap/starter-kit@3.23.1", "", { "dependencies": { "@tiptap/core": "^3.23.1", "@tiptap/extension-blockquote": "^3.23.1", "@tiptap/extension-bold": "^3.23.1", "@tiptap/extension-bullet-list": "^3.23.1", "@tiptap/extension-code": "^3.23.1", "@tiptap/extension-code-block": "^3.23.1", "@tiptap/extension-document": "^3.23.1", "@tiptap/extension-dropcursor": "^3.23.1", "@tiptap/extension-gapcursor": "^3.23.1", "@tiptap/extension-hard-break": "^3.23.1", "@tiptap/extension-heading": "^3.23.1", "@tiptap/extension-horizontal-rule": "^3.23.1", "@tiptap/extension-italic": "^3.23.1", "@tiptap/extension-link": "^3.23.1", "@tiptap/extension-list": "^3.23.1", "@tiptap/extension-list-item": "^3.23.1", "@tiptap/extension-list-keymap": "^3.23.1", "@tiptap/extension-ordered-list": "^3.23.1", "@tiptap/extension-paragraph": "^3.23.1", "@tiptap/extension-strike": "^3.23.1", "@tiptap/extension-text": "^3.23.1", "@tiptap/extension-underline": "^3.23.1", "@tiptap/extensions": "^3.23.1", "@tiptap/pm": "^3.23.1" } }, "sha512-CURePHQagBaZIDJrHH3of4Nmi0VYGpZ6yBlkdFxFHBxY9aeG2/h5kn+oHo8GbzkSFsRV+9olzRgDTOULVgs8pQ=="],
- "@pie-element/venn-classification/@tiptap/starter-kit": ["@tiptap/starter-kit@3.19.0", "", { "dependencies": { "@tiptap/core": "^3.19.0", "@tiptap/extension-blockquote": "^3.19.0", "@tiptap/extension-bold": "^3.19.0", "@tiptap/extension-bullet-list": "^3.19.0", "@tiptap/extension-code": "^3.19.0", "@tiptap/extension-code-block": "^3.19.0", "@tiptap/extension-document": "^3.19.0", "@tiptap/extension-dropcursor": "^3.19.0", "@tiptap/extension-gapcursor": "^3.19.0", "@tiptap/extension-hard-break": "^3.19.0", "@tiptap/extension-heading": "^3.19.0", "@tiptap/extension-horizontal-rule": "^3.19.0", "@tiptap/extension-italic": "^3.19.0", "@tiptap/extension-link": "^3.19.0", "@tiptap/extension-list": "^3.19.0", "@tiptap/extension-list-item": "^3.19.0", "@tiptap/extension-list-keymap": "^3.19.0", "@tiptap/extension-ordered-list": "^3.19.0", "@tiptap/extension-paragraph": "^3.19.0", "@tiptap/extension-strike": "^3.19.0", "@tiptap/extension-text": "^3.19.0", "@tiptap/extension-underline": "^3.19.0", "@tiptap/extensions": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-dTCkHEz+Y8ADxX7h+xvl6caAj+3nII/wMB1rTQchSuNKqJTOrzyUsCWm094+IoZmLT738wANE0fRIgziNHs/ug=="],
+ "@pie-element/venn-classification/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@pie-element/venn-classification/svelte": ["svelte@5.55.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-QjvU7EFemf6mRzdMGlAFttMWtAAVXrax61SZYHdkD6yoVGQ89VeyKfZD4H1JrV1WLmJBxWhFch9H6ig/87VGjw=="],
+ "@pie-element/venn-classification/@tiptap/starter-kit": ["@tiptap/starter-kit@3.23.1", "", { "dependencies": { "@tiptap/core": "^3.23.1", "@tiptap/extension-blockquote": "^3.23.1", "@tiptap/extension-bold": "^3.23.1", "@tiptap/extension-bullet-list": "^3.23.1", "@tiptap/extension-code": "^3.23.1", "@tiptap/extension-code-block": "^3.23.1", "@tiptap/extension-document": "^3.23.1", "@tiptap/extension-dropcursor": "^3.23.1", "@tiptap/extension-gapcursor": "^3.23.1", "@tiptap/extension-hard-break": "^3.23.1", "@tiptap/extension-heading": "^3.23.1", "@tiptap/extension-horizontal-rule": "^3.23.1", "@tiptap/extension-italic": "^3.23.1", "@tiptap/extension-link": "^3.23.1", "@tiptap/extension-list": "^3.23.1", "@tiptap/extension-list-item": "^3.23.1", "@tiptap/extension-list-keymap": "^3.23.1", "@tiptap/extension-ordered-list": "^3.23.1", "@tiptap/extension-paragraph": "^3.23.1", "@tiptap/extension-strike": "^3.23.1", "@tiptap/extension-text": "^3.23.1", "@tiptap/extension-underline": "^3.23.1", "@tiptap/extensions": "^3.23.1", "@tiptap/pm": "^3.23.1" } }, "sha512-CURePHQagBaZIDJrHH3of4Nmi0VYGpZ6yBlkdFxFHBxY9aeG2/h5kn+oHo8GbzkSFsRV+9olzRgDTOULVgs8pQ=="],
"@pie-framework/math-validation/mathjs": ["mathjs@9.5.2", "", { "dependencies": { "@babel/runtime": "^7.15.4", "complex.js": "^2.0.15", "decimal.js": "^10.3.1", "escape-latex": "^1.2.0", "fraction.js": "^4.1.1", "javascript-natural-sort": "^0.7.1", "seedrandom": "^3.0.5", "tiny-emitter": "^2.1.0", "typed-function": "^2.0.0" }, "bin": { "mathjs": "bin/cli.js" } }, "sha512-c0erTq0GP503/Ch2OtDOAn50GIOsuxTMjmE00NI/vKJFSWrDaQHRjx6ai+16xYv70yBSnnpUgHZGNf9FR9IwmA=="],
@@ -4149,137 +4104,117 @@
"@pie-lib/editable-html-tip-tap/react-jss": ["react-jss@8.6.1", "", { "dependencies": { "hoist-non-react-statics": "^2.5.0", "jss": "^9.7.0", "jss-preset-default": "^4.3.0", "prop-types": "^15.6.0", "theming": "^1.3.0" }, "peerDependencies": { "react": ">=0.13" } }, "sha512-SH6XrJDJkAphp602J14JTy3puB2Zxz1FkM3bKVE8wON+va99jnUTKWnzGECb3NfIn9JPR5vHykge7K3/A747xQ=="],
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@pie-lib/editable-html-tiptap-svelte/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-character-count": ["@tiptap/extension-character-count@3.19.0", "", { "peerDependencies": { "@tiptap/extensions": "^3.19.0" } }, "sha512-ElmlJkSD2tx7f2Hw12qQu4PD8GHfOQfY999EbJENQBtaz+uszUE19Grc1GNs5X+0T757OprM1A9EBPnMX667WQ=="],
+ "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-character-count": ["@tiptap/extension-character-count@3.23.1", "", { "peerDependencies": { "@tiptap/extensions": "3.23.1" } }, "sha512-BgXql4+Z+0KF1U1uW27zAygJXuNqDIjKv1Qx6svzSQ5n3TG04sAEGU8q3tyAGfkDxZHvZlZ7TQKPA+6bvDFnsA=="],
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-image": ["@tiptap/extension-image@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-/rGl8nBziBPVJJ/9639eQWFDKcI3RQsDM3s+cqYQMFQfMqc7sQB9h4o4sHCBpmKxk3Y0FV/0NjnjLbBVm8OKdQ=="],
+ "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-image": ["@tiptap/extension-image@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-rAyfh8HS0PfXS8PKl1VQUiDFzXtF5SlrILpOPmz+4Oc4pmI+/vN+ain4z8k6HRxWM03YVpvLvyeQ0OFwi/fq3A=="],
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-subscript": ["@tiptap/extension-subscript@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-RchUOSIDprlnuzmA/znZIBKMONIlCAXHuR6XkoNX2jFJ/9OHk/si+jEeY8jJfpPDpVqZ3KrwS/zJrqhU/pT+hQ=="],
+ "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-subscript": ["@tiptap/extension-subscript@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-Wqa7nwEy+SXHY9ORJ27kjC64XuV9eFQwpMpoWPjwZ15iCUMbGhk5PNl7m9jpqhu6NMOl3VDpXSpXlnKMH2uGJQ=="],
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-superscript": ["@tiptap/extension-superscript@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-PjLUGjM23/7hqFP5HS1DbdywRm63GhjJ5SD6KqNgyZQwcwDZeJTAW2b/LYTHAP+k07OxOLPdj/k4ntQKtgKNow=="],
+ "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-superscript": ["@tiptap/extension-superscript@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-+Y7PUqVtOTW8fWQYo7lzVQ/+D5T8c31nHQAhwiZadAo7Mr6RKvBPvR51n3obisrrLPXVfqiWNTUErd+7ZVkwbg=="],
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-table": ["@tiptap/extension-table@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-Lg8DlkkDUMYE/CcGOxoCWF98B2i7VWh+AGgqlF+XWrHjhlKHfENLRXm1a0vWuyyP3NknRYILoaaZ1s7QzmXKRA=="],
+ "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-table": ["@tiptap/extension-table@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-EOcz0TCC+1LJwM4c36YYwzdH4RaYAn2j0ypjeDflFwJWMMKXWdJDm/zHc2mW0i7aiuUUwQj9791NLEQOl3mPjg=="],
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-table-cell": ["@tiptap/extension-table-cell@3.19.0", "", { "peerDependencies": { "@tiptap/extension-table": "^3.19.0" } }, "sha512-T67EDWmiRdOGctolaUpMPXffDkEFL+NUppSV61cPU3jQtDwGg01meauy5u67u6OUM8ICiZ+Sc7Xd2DIt+7Nv5g=="],
+ "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-table-cell": ["@tiptap/extension-table-cell@3.23.1", "", { "peerDependencies": { "@tiptap/extension-table": "3.23.1" } }, "sha512-irRouV6h+sxg+VJrQAxBNTsRiGcTc2Qx0sLGd32KUUrKjOPEyFEdsZQGVFkbHIrFvDc2DnMR3vUpk7G7LxdBcw=="],
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-table-header": ["@tiptap/extension-table-header@3.19.0", "", { "peerDependencies": { "@tiptap/extension-table": "^3.19.0" } }, "sha512-fVHJUCfZp/JOE96hJ3paElRynpIVdukOiAjgZbaY9WuCKoXd3xYqdsbUSdf+XFmdPqwvQKhnkaY/qXW3FIxO3w=="],
+ "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-table-header": ["@tiptap/extension-table-header@3.23.1", "", { "peerDependencies": { "@tiptap/extension-table": "3.23.1" } }, "sha512-QJHavpzCStcR4FRKAqi9w19KZCbAcNNFNhli/d3e492wsEPcw35mXL2Urr+IJbIeWAnhUMHn/QSQKXr4VRjVkQ=="],
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-table-row": ["@tiptap/extension-table-row@3.19.0", "", { "peerDependencies": { "@tiptap/extension-table": "^3.19.0" } }, "sha512-L3DeIXQARCs+m4rsQWiUPJso1z6xZ6awa/Kc+PCoq7rbPLtwhWUIld3sm9gdLac61Mf/TVwb18EdfygHcU7jCA=="],
+ "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-table-row": ["@tiptap/extension-table-row@3.23.1", "", { "peerDependencies": { "@tiptap/extension-table": "3.23.1" } }, "sha512-PPP4nqlnCFwoZMcR/KgItj900vLqVn6pjLb9zKNb+H4uyA70TNn7xNN1jxUddxCz6AXDXfbRKR1YWF1kq8losg=="],
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-text-align": ["@tiptap/extension-text-align@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-cY8bHWYojLTHXZb2j2srdh7ltmDgnwXYvSxbPL4HK4j7XxQOGnOsTakgM/BNhxymOfEj2414i5Otyy8hlgviFA=="],
+ "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-text-align": ["@tiptap/extension-text-align@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-ap4ZN31v57mVX2P+0OoW5iO+ehsUNe0C5MgF/Ta2F/HRmTCc1M1mFqYUCk8zJYX1TFRV18vqK2j6STRBk0R8ng=="],
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-text-style": ["@tiptap/extension-text-style@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-R55V6iUfRq03SGt/R2KvaeN+XGFiKJHx1jFJhZzvnWhMV7YqjHSG2r4BLvpTq1HBqteMbEjI+EOnb4t9AKd6aQ=="],
+ "@pie-lib/editable-html-tiptap-svelte/@tiptap/extension-text-style": ["@tiptap/extension-text-style@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-q3GQQo+lBhrtNkqdbhYWnv/byG/RYAxVnNhYPQMubRzavGdXBU8NhpJ/47YYjPimG1sahzcs2aqy7amVd8ri/A=="],
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/starter-kit": ["@tiptap/starter-kit@3.19.0", "", { "dependencies": { "@tiptap/core": "^3.19.0", "@tiptap/extension-blockquote": "^3.19.0", "@tiptap/extension-bold": "^3.19.0", "@tiptap/extension-bullet-list": "^3.19.0", "@tiptap/extension-code": "^3.19.0", "@tiptap/extension-code-block": "^3.19.0", "@tiptap/extension-document": "^3.19.0", "@tiptap/extension-dropcursor": "^3.19.0", "@tiptap/extension-gapcursor": "^3.19.0", "@tiptap/extension-hard-break": "^3.19.0", "@tiptap/extension-heading": "^3.19.0", "@tiptap/extension-horizontal-rule": "^3.19.0", "@tiptap/extension-italic": "^3.19.0", "@tiptap/extension-link": "^3.19.0", "@tiptap/extension-list": "^3.19.0", "@tiptap/extension-list-item": "^3.19.0", "@tiptap/extension-list-keymap": "^3.19.0", "@tiptap/extension-ordered-list": "^3.19.0", "@tiptap/extension-paragraph": "^3.19.0", "@tiptap/extension-strike": "^3.19.0", "@tiptap/extension-text": "^3.19.0", "@tiptap/extension-underline": "^3.19.0", "@tiptap/extensions": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-dTCkHEz+Y8ADxX7h+xvl6caAj+3nII/wMB1rTQchSuNKqJTOrzyUsCWm094+IoZmLT738wANE0fRIgziNHs/ug=="],
-
- "@pie-lib/editable-html-tiptap-svelte/svelte": ["svelte@5.55.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-QjvU7EFemf6mRzdMGlAFttMWtAAVXrax61SZYHdkD6yoVGQ89VeyKfZD4H1JrV1WLmJBxWhFch9H6ig/87VGjw=="],
+ "@pie-lib/editable-html-tiptap-svelte/@tiptap/starter-kit": ["@tiptap/starter-kit@3.23.1", "", { "dependencies": { "@tiptap/core": "^3.23.1", "@tiptap/extension-blockquote": "^3.23.1", "@tiptap/extension-bold": "^3.23.1", "@tiptap/extension-bullet-list": "^3.23.1", "@tiptap/extension-code": "^3.23.1", "@tiptap/extension-code-block": "^3.23.1", "@tiptap/extension-document": "^3.23.1", "@tiptap/extension-dropcursor": "^3.23.1", "@tiptap/extension-gapcursor": "^3.23.1", "@tiptap/extension-hard-break": "^3.23.1", "@tiptap/extension-heading": "^3.23.1", "@tiptap/extension-horizontal-rule": "^3.23.1", "@tiptap/extension-italic": "^3.23.1", "@tiptap/extension-link": "^3.23.1", "@tiptap/extension-list": "^3.23.1", "@tiptap/extension-list-item": "^3.23.1", "@tiptap/extension-list-keymap": "^3.23.1", "@tiptap/extension-ordered-list": "^3.23.1", "@tiptap/extension-paragraph": "^3.23.1", "@tiptap/extension-strike": "^3.23.1", "@tiptap/extension-text": "^3.23.1", "@tiptap/extension-underline": "^3.23.1", "@tiptap/extensions": "^3.23.1", "@tiptap/pm": "^3.23.1" } }, "sha512-CURePHQagBaZIDJrHH3of4Nmi0VYGpZ6yBlkdFxFHBxY9aeG2/h5kn+oHo8GbzkSFsRV+9olzRgDTOULVgs8pQ=="],
"@pie-lib/render-ui/react-transition-group": ["react-transition-group@4.4.5", "", { "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", "prop-types": "^15.6.2" }, "peerDependencies": { "react": ">=16.6.0", "react-dom": ">=16.6.0" } }, "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="],
"@pie-lib/test-utils/@testing-library/jest-dom": ["@testing-library/jest-dom@5.17.0", "", { "dependencies": { "@adobe/css-tools": "^4.0.1", "@babel/runtime": "^7.9.2", "@types/testing-library__jest-dom": "^5.9.1", "aria-query": "^5.0.0", "chalk": "^3.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.5.6", "lodash": "^4.17.15", "redent": "^3.0.0" } }, "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg=="],
- "@reduxjs/toolkit/immer": ["immer@11.1.3", "", {}, "sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q=="],
+ "@reduxjs/toolkit/immer": ["immer@11.1.8", "", {}, "sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA=="],
"@reduxjs/toolkit/redux": ["redux@5.0.1", "", {}, "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="],
- "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="],
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" }, "bundled": true }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="],
- "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
- "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="],
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="],
- "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="],
+ "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="],
- "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
+ "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="],
"@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
- "@testing-library/dom/dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="],
-
- "@tiptap/extension-blockquote/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="],
- "@tiptap/extension-bold/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
-
- "@tiptap/extension-bubble-menu/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@testing-library/dom/dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="],
- "@tiptap/extension-bullet-list/@tiptap/extension-list": ["@tiptap/extension-list@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-N6nKbFB2VwMsPlCw67RlAtYSK48TAsAUgjnD+vd3ieSlIufdQnLXDFUP6hFKx9mwoUVUgZGz02RA6bkxOdYyTw=="],
+ "@tiptap/extension-blockquote/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/extension-code/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@tiptap/extension-bold/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/extension-code-block/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@tiptap/extension-bubble-menu/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/extension-floating-menu/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@tiptap/extension-bullet-list/@tiptap/extension-list": ["@tiptap/extension-list@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-v1AeXPpagslgRZdOp7WdjCoO4TjjNP8RM2R6Gqx0/inGaNXnM8zCMshOxZlAb03Ad7kq/4RGJmkpM/Jjsi6dEQ=="],
- "@tiptap/extension-hard-break/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@tiptap/extension-code/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/extension-heading/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@tiptap/extension-code-block/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/extension-horizontal-rule/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@tiptap/extension-floating-menu/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/extension-italic/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@tiptap/extension-hard-break/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/extension-link/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@tiptap/extension-heading/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/extension-list-keymap/@tiptap/extension-list": ["@tiptap/extension-list@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-N6nKbFB2VwMsPlCw67RlAtYSK48TAsAUgjnD+vd3ieSlIufdQnLXDFUP6hFKx9mwoUVUgZGz02RA6bkxOdYyTw=="],
+ "@tiptap/extension-horizontal-rule/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/extension-ordered-list/@tiptap/extension-list": ["@tiptap/extension-list@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-N6nKbFB2VwMsPlCw67RlAtYSK48TAsAUgjnD+vd3ieSlIufdQnLXDFUP6hFKx9mwoUVUgZGz02RA6bkxOdYyTw=="],
+ "@tiptap/extension-italic/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/extension-paragraph/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@tiptap/extension-link/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/extension-strike/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@tiptap/extension-list-keymap/@tiptap/extension-list": ["@tiptap/extension-list@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-v1AeXPpagslgRZdOp7WdjCoO4TjjNP8RM2R6Gqx0/inGaNXnM8zCMshOxZlAb03Ad7kq/4RGJmkpM/Jjsi6dEQ=="],
- "@tiptap/extension-underline/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@tiptap/extension-ordered-list/@tiptap/extension-list": ["@tiptap/extension-list@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-v1AeXPpagslgRZdOp7WdjCoO4TjjNP8RM2R6Gqx0/inGaNXnM8zCMshOxZlAb03Ad7kq/4RGJmkpM/Jjsi6dEQ=="],
- "@tiptap/extensions/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@tiptap/extension-paragraph/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/starter-kit/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@tiptap/extension-strike/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/starter-kit/@tiptap/extension-code-block": ["@tiptap/extension-code-block@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-b/2qR+tMn8MQb+eaFYgVk4qXnLNkkRYmwELQ8LEtEDQPxa5Vl7J3eu8+4OyoIFhZrNDZvvoEp80kHMCP8sI6rg=="],
+ "@tiptap/extension-underline/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/starter-kit/@tiptap/extension-list": ["@tiptap/extension-list@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-N6nKbFB2VwMsPlCw67RlAtYSK48TAsAUgjnD+vd3ieSlIufdQnLXDFUP6hFKx9mwoUVUgZGz02RA6bkxOdYyTw=="],
+ "@tiptap/extensions/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/starter-kit/@tiptap/extension-list-item": ["@tiptap/extension-list-item@3.19.0", "", { "peerDependencies": { "@tiptap/extension-list": "^3.19.0" } }, "sha512-VsSKuJz4/Tb6ZmFkXqWpDYkRzmaLTyE6dNSEpNmUpmZ32sMqo58mt11/huADNwfBFB0Ve7siH/VnFNIJYY3xvg=="],
+ "@tiptap/starter-kit/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/starter-kit/@tiptap/extensions": ["@tiptap/extensions@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-ZmGUhLbMWaGqnJh2Bry+6V4M6gMpUDYo4D1xNux5Gng/E/eYtc+PMxMZ/6F7tNTAuujLBOQKj6D+4SsSm457jw=="],
+ "@tiptap/starter-kit/@tiptap/extension-list": ["@tiptap/extension-list@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-v1AeXPpagslgRZdOp7WdjCoO4TjjNP8RM2R6Gqx0/inGaNXnM8zCMshOxZlAb03Ad7kq/4RGJmkpM/Jjsi6dEQ=="],
- "@types/bun/bun-types": ["bun-types@1.3.8", "", { "dependencies": { "@types/node": "*" } }, "sha512-fL99nxdOWvV4LqjmC+8Q9kW3M4QTtTR1eePs94v5ctGqU8OeceWrSUaRw3JYb7tU3FkMIAjkueehrHPPPGKi5Q=="],
+ "@tiptap/starter-kit/@tiptap/extension-list-item": ["@tiptap/extension-list-item@3.23.1", "", { "peerDependencies": { "@tiptap/extension-list": "3.23.1" } }, "sha512-Fk/884un5OSLCFxe2TbOmfp3sLMB5b76CnMjaSrvgfiaZnsV2WlJZGPXxCAPbxNIATTykNlSBsVuMBO7we64Vg=="],
- "@types/jest/pretty-format": ["pretty-format@30.2.0", "", { "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" } }, "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA=="],
+ "@types/jest/pretty-format": ["pretty-format@30.4.1", "", { "dependencies": { "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", "react-is-18": "npm:react-is@^18.3.1", "react-is-19": "npm:react-is@^19.2.5" } }, "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw=="],
"@visx/curve/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="],
"@visx/shape/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="],
- "@visx/vendor/@types/d3-array": ["@types/d3-array@3.0.3", "", {}, "sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ=="],
-
- "@visx/vendor/@types/d3-interpolate": ["@types/d3-interpolate@3.0.1", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw=="],
-
- "@visx/vendor/@types/d3-scale": ["@types/d3-scale@4.0.2", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA=="],
-
- "@visx/vendor/@types/d3-time": ["@types/d3-time@3.0.0", "", {}, "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg=="],
-
"@visx/vendor/d3-array": ["d3-array@3.2.1", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ=="],
"@visx/vendor/d3-format": ["d3-format@3.1.0", "", {}, "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="],
- "babel-plugin-styled-components/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
+ "babel-plugin-styled-components/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
"chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
"cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
- "css-loader/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
-
"d3-shape/d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="],
- "encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
-
- "esbuild-loader/webpack-sources": ["webpack-sources@1.4.3", "", { "dependencies": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" } }, "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ=="],
-
"esrecurse/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
- "filelist/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="],
+ "filelist/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="],
"hoist-non-react-statics/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
@@ -4291,20 +4226,18 @@
"jest-diff/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
- "jest-diff/pretty-format": ["pretty-format@30.2.0", "", { "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" } }, "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA=="],
+ "jest-diff/pretty-format": ["pretty-format@30.4.1", "", { "dependencies": { "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", "react-is-18": "npm:react-is@^18.3.1", "react-is-19": "npm:react-is@^19.2.5" } }, "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw=="],
"jest-matcher-utils/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
- "jest-matcher-utils/pretty-format": ["pretty-format@30.2.0", "", { "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" } }, "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA=="],
+ "jest-matcher-utils/pretty-format": ["pretty-format@30.4.1", "", { "dependencies": { "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", "react-is-18": "npm:react-is@^18.3.1", "react-is-19": "npm:react-is@^19.2.5" } }, "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw=="],
"jest-message-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
- "jest-message-util/pretty-format": ["pretty-format@30.2.0", "", { "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" } }, "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA=="],
+ "jest-message-util/pretty-format": ["pretty-format@30.4.1", "", { "dependencies": { "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", "react-is-18": "npm:react-is@^18.3.1", "react-is-19": "npm:react-is@^19.2.5" } }, "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw=="],
"jest-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
- "jest-util/ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="],
-
"jss-camel-case/jss": ["jss@9.8.7", "", { "dependencies": { "is-in-browser": "^1.1.3", "symbol-observable": "^1.1.0", "warning": "^3.0.0" } }, "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ=="],
"jss-compose/jss": ["jss@9.8.7", "", { "dependencies": { "is-in-browser": "^1.1.3", "symbol-observable": "^1.1.0", "warning": "^3.0.0" } }, "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ=="],
@@ -4331,7 +4264,9 @@
"markdown-it/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
- "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
+ "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
+
+ "mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
"minipass-flush/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
@@ -4339,6 +4274,8 @@
"p-filter/p-map": ["p-map@2.1.0", "", {}, "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="],
+ "parse-json/json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="],
+
"parse-latin/unist-util-modify-children": ["unist-util-modify-children@2.0.0", "", { "dependencies": { "array-iterate": "^1.0.0" } }, "sha512-HGrj7JQo9DwZt8XFsX8UD4gGqOsIlCih9opG6Y+N11XqkBGKzHo8cvDi+MfQQgiZ7zXRUiQREYHhjOBHERTMdg=="],
"playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="],
@@ -4365,9 +4302,11 @@
"reduce-css-calc/balanced-match": ["balanced-match@0.4.2", "", {}, "sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg=="],
+ "reduce-function-call/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
"redux-thunk/redux": ["redux@5.0.1", "", {}, "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="],
- "rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.10", "", {}, "sha512-UkVDEFk1w3mveXeKgaTuYfKWtPbvgck1dT8TUG3bnccrH0XtLTuAyfCoks4Q/M5ZGToSVJTIQYCzy2g/atAOeg=="],
+ "rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0", "", {}, "sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ=="],
"source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
@@ -4381,11 +4320,11 @@
"victory-vendor/@types/d3-shape": ["@types/d3-shape@3.1.8", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w=="],
- "vitest/es-module-lexer": ["es-module-lexer@2.0.0", "", {}, "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw=="],
+ "vitest/es-module-lexer": ["es-module-lexer@2.1.0", "", {}, "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ=="],
- "webpack/es-module-lexer": ["es-module-lexer@2.0.0", "", {}, "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw=="],
+ "webpack/es-module-lexer": ["es-module-lexer@2.1.0", "", {}, "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ=="],
- "wsl-utils/is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="],
+ "wsl-utils/is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="],
"@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
@@ -4409,18 +4348,6 @@
"@pie-element/element-bundler/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
- "@pie-element/element-bundler/svelte/aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="],
-
- "@pie-element/element-bundler/svelte/clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
-
- "@pie-element/element-bundler/svelte/esrap": ["esrap@2.2.4", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@typescript-eslint/types": "^8.2.0" } }, "sha512-suICpxAmZ9A8bzJjEl/+rLJiDKC0X4gYWUxT6URAWBLvlXmtbZd5ySMu/N2ZGEtMCAmflUDPSehrP9BQcsGcSg=="],
-
- "@pie-element/mc-populated-blank/svelte/aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="],
-
- "@pie-element/mc-populated-blank/svelte/clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
-
- "@pie-element/mc-populated-blank/svelte/esrap": ["esrap@2.2.4", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@typescript-eslint/types": "^8.2.0" } }, "sha512-suICpxAmZ9A8bzJjEl/+rLJiDKC0X4gYWUxT6URAWBLvlXmtbZd5ySMu/N2ZGEtMCAmflUDPSehrP9BQcsGcSg=="],
-
"@pie-element/multiple-choice/react-transition-group/dom-helpers": ["dom-helpers@5.2.1", "", { "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="],
"@pie-element/number-line/react-transition-group/dom-helpers": ["dom-helpers@5.2.1", "", { "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="],
@@ -4429,63 +4356,35 @@
"@pie-element/print-player/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
- "@pie-element/shared-configure-events/@types/bun/bun-types": ["bun-types@1.3.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA=="],
-
- "@pie-element/shared-controller-utils/@types/bun/bun-types": ["bun-types@1.3.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA=="],
-
- "@pie-element/shared-feedback/@types/bun/bun-types": ["bun-types@1.3.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA=="],
-
- "@pie-element/shared-player-events/@types/bun/bun-types": ["bun-types@1.3.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA=="],
-
- "@pie-element/simple-cloze/@tiptap/starter-kit/@tiptap/extension-code-block": ["@tiptap/extension-code-block@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-b/2qR+tMn8MQb+eaFYgVk4qXnLNkkRYmwELQ8LEtEDQPxa5Vl7J3eu8+4OyoIFhZrNDZvvoEp80kHMCP8sI6rg=="],
-
- "@pie-element/simple-cloze/@tiptap/starter-kit/@tiptap/extension-document": ["@tiptap/extension-document@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-AOf0kHKSFO0ymjVgYSYDncRXTITdTcrj1tqxVazrmO60KNl1Rc2dAggDvIVTEBy5NvceF0scc7q3sE/5ZtVV7A=="],
-
- "@pie-element/simple-cloze/@tiptap/starter-kit/@tiptap/extension-list": ["@tiptap/extension-list@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-N6nKbFB2VwMsPlCw67RlAtYSK48TAsAUgjnD+vd3ieSlIufdQnLXDFUP6hFKx9mwoUVUgZGz02RA6bkxOdYyTw=="],
-
- "@pie-element/simple-cloze/@tiptap/starter-kit/@tiptap/extension-list-item": ["@tiptap/extension-list-item@3.19.0", "", { "peerDependencies": { "@tiptap/extension-list": "^3.19.0" } }, "sha512-VsSKuJz4/Tb6ZmFkXqWpDYkRzmaLTyE6dNSEpNmUpmZ32sMqo58mt11/huADNwfBFB0Ve7siH/VnFNIJYY3xvg=="],
+ "@pie-element/simple-cloze/@tiptap/starter-kit/@tiptap/extension-document": ["@tiptap/extension-document@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-NA5Rx59HRwG6Hb6LwLpC5lE7z6vCj6f90S7RNNsnE+CyiXNR/OhY2BcjuxiGnascHvsnsAbvxGU3ymKMDgvDVg=="],
- "@pie-element/simple-cloze/@tiptap/starter-kit/@tiptap/extension-text": ["@tiptap/extension-text@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-K95+SnbZy0h6hNFtfy23n8t/nOcTFEf69In9TSFVVmwn/Nwlke+IfiESAkqbt1/7sKJeegRXYO7WzFEmFl9Q/g=="],
+ "@pie-element/simple-cloze/@tiptap/starter-kit/@tiptap/extension-list": ["@tiptap/extension-list@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-v1AeXPpagslgRZdOp7WdjCoO4TjjNP8RM2R6Gqx0/inGaNXnM8zCMshOxZlAb03Ad7kq/4RGJmkpM/Jjsi6dEQ=="],
- "@pie-element/simple-cloze/@tiptap/starter-kit/@tiptap/extensions": ["@tiptap/extensions@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-ZmGUhLbMWaGqnJh2Bry+6V4M6gMpUDYo4D1xNux5Gng/E/eYtc+PMxMZ/6F7tNTAuujLBOQKj6D+4SsSm457jw=="],
+ "@pie-element/simple-cloze/@tiptap/starter-kit/@tiptap/extension-list-item": ["@tiptap/extension-list-item@3.23.1", "", { "peerDependencies": { "@tiptap/extension-list": "3.23.1" } }, "sha512-Fk/884un5OSLCFxe2TbOmfp3sLMB5b76CnMjaSrvgfiaZnsV2WlJZGPXxCAPbxNIATTykNlSBsVuMBO7we64Vg=="],
- "@pie-element/simple-cloze/svelte/aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="],
+ "@pie-element/simple-cloze/@tiptap/starter-kit/@tiptap/extension-text": ["@tiptap/extension-text@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-k1Ki9bBV6mLz1mFP+Laqh1YHJ2MY0P8XzaMqpkgMndEBIJQ3XcpWQc5bfAlRnYcOI9ZXDbAgQ8CwgArxHmQWCQ=="],
- "@pie-element/simple-cloze/svelte/clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
+ "@pie-element/venn-classification/@tiptap/starter-kit/@tiptap/extension-document": ["@tiptap/extension-document@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-NA5Rx59HRwG6Hb6LwLpC5lE7z6vCj6f90S7RNNsnE+CyiXNR/OhY2BcjuxiGnascHvsnsAbvxGU3ymKMDgvDVg=="],
- "@pie-element/simple-cloze/svelte/esrap": ["esrap@2.2.4", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@typescript-eslint/types": "^8.2.0" } }, "sha512-suICpxAmZ9A8bzJjEl/+rLJiDKC0X4gYWUxT6URAWBLvlXmtbZd5ySMu/N2ZGEtMCAmflUDPSehrP9BQcsGcSg=="],
+ "@pie-element/venn-classification/@tiptap/starter-kit/@tiptap/extension-list": ["@tiptap/extension-list@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-v1AeXPpagslgRZdOp7WdjCoO4TjjNP8RM2R6Gqx0/inGaNXnM8zCMshOxZlAb03Ad7kq/4RGJmkpM/Jjsi6dEQ=="],
- "@pie-element/venn-classification/@tiptap/starter-kit/@tiptap/extension-code-block": ["@tiptap/extension-code-block@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-b/2qR+tMn8MQb+eaFYgVk4qXnLNkkRYmwELQ8LEtEDQPxa5Vl7J3eu8+4OyoIFhZrNDZvvoEp80kHMCP8sI6rg=="],
+ "@pie-element/venn-classification/@tiptap/starter-kit/@tiptap/extension-list-item": ["@tiptap/extension-list-item@3.23.1", "", { "peerDependencies": { "@tiptap/extension-list": "3.23.1" } }, "sha512-Fk/884un5OSLCFxe2TbOmfp3sLMB5b76CnMjaSrvgfiaZnsV2WlJZGPXxCAPbxNIATTykNlSBsVuMBO7we64Vg=="],
- "@pie-element/venn-classification/@tiptap/starter-kit/@tiptap/extension-document": ["@tiptap/extension-document@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-AOf0kHKSFO0ymjVgYSYDncRXTITdTcrj1tqxVazrmO60KNl1Rc2dAggDvIVTEBy5NvceF0scc7q3sE/5ZtVV7A=="],
-
- "@pie-element/venn-classification/@tiptap/starter-kit/@tiptap/extension-list": ["@tiptap/extension-list@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-N6nKbFB2VwMsPlCw67RlAtYSK48TAsAUgjnD+vd3ieSlIufdQnLXDFUP6hFKx9mwoUVUgZGz02RA6bkxOdYyTw=="],
-
- "@pie-element/venn-classification/@tiptap/starter-kit/@tiptap/extension-list-item": ["@tiptap/extension-list-item@3.19.0", "", { "peerDependencies": { "@tiptap/extension-list": "^3.19.0" } }, "sha512-VsSKuJz4/Tb6ZmFkXqWpDYkRzmaLTyE6dNSEpNmUpmZ32sMqo58mt11/huADNwfBFB0Ve7siH/VnFNIJYY3xvg=="],
-
- "@pie-element/venn-classification/@tiptap/starter-kit/@tiptap/extension-text": ["@tiptap/extension-text@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-K95+SnbZy0h6hNFtfy23n8t/nOcTFEf69In9TSFVVmwn/Nwlke+IfiESAkqbt1/7sKJeegRXYO7WzFEmFl9Q/g=="],
-
- "@pie-element/venn-classification/@tiptap/starter-kit/@tiptap/extensions": ["@tiptap/extensions@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-ZmGUhLbMWaGqnJh2Bry+6V4M6gMpUDYo4D1xNux5Gng/E/eYtc+PMxMZ/6F7tNTAuujLBOQKj6D+4SsSm457jw=="],
-
- "@pie-element/venn-classification/svelte/aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="],
-
- "@pie-element/venn-classification/svelte/clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
-
- "@pie-element/venn-classification/svelte/esrap": ["esrap@2.2.4", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@typescript-eslint/types": "^8.2.0" } }, "sha512-suICpxAmZ9A8bzJjEl/+rLJiDKC0X4gYWUxT6URAWBLvlXmtbZd5ySMu/N2ZGEtMCAmflUDPSehrP9BQcsGcSg=="],
+ "@pie-element/venn-classification/@tiptap/starter-kit/@tiptap/extension-text": ["@tiptap/extension-text@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-k1Ki9bBV6mLz1mFP+Laqh1YHJ2MY0P8XzaMqpkgMndEBIJQ3XcpWQc5bfAlRnYcOI9ZXDbAgQ8CwgArxHmQWCQ=="],
"@pie-lib/correct-answer-toggle/react-transition-group/dom-helpers": ["dom-helpers@5.2.1", "", { "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="],
- "@pie-lib/editable-html-tip-tap/@tiptap/starter-kit/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@pie-lib/editable-html-tip-tap/@tiptap/starter-kit/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@pie-lib/editable-html-tip-tap/@tiptap/starter-kit/@tiptap/extension-code-block": ["@tiptap/extension-code-block@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-b/2qR+tMn8MQb+eaFYgVk4qXnLNkkRYmwELQ8LEtEDQPxa5Vl7J3eu8+4OyoIFhZrNDZvvoEp80kHMCP8sI6rg=="],
+ "@pie-lib/editable-html-tip-tap/@tiptap/starter-kit/@tiptap/extension-document": ["@tiptap/extension-document@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-NA5Rx59HRwG6Hb6LwLpC5lE7z6vCj6f90S7RNNsnE+CyiXNR/OhY2BcjuxiGnascHvsnsAbvxGU3ymKMDgvDVg=="],
- "@pie-lib/editable-html-tip-tap/@tiptap/starter-kit/@tiptap/extension-list": ["@tiptap/extension-list@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-N6nKbFB2VwMsPlCw67RlAtYSK48TAsAUgjnD+vd3ieSlIufdQnLXDFUP6hFKx9mwoUVUgZGz02RA6bkxOdYyTw=="],
+ "@pie-lib/editable-html-tip-tap/@tiptap/starter-kit/@tiptap/extension-list": ["@tiptap/extension-list@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-v1AeXPpagslgRZdOp7WdjCoO4TjjNP8RM2R6Gqx0/inGaNXnM8zCMshOxZlAb03Ad7kq/4RGJmkpM/Jjsi6dEQ=="],
- "@pie-lib/editable-html-tip-tap/@tiptap/starter-kit/@tiptap/extension-list-item": ["@tiptap/extension-list-item@3.19.0", "", { "peerDependencies": { "@tiptap/extension-list": "^3.19.0" } }, "sha512-VsSKuJz4/Tb6ZmFkXqWpDYkRzmaLTyE6dNSEpNmUpmZ32sMqo58mt11/huADNwfBFB0Ve7siH/VnFNIJYY3xvg=="],
+ "@pie-lib/editable-html-tip-tap/@tiptap/starter-kit/@tiptap/extension-list-item": ["@tiptap/extension-list-item@3.23.1", "", { "peerDependencies": { "@tiptap/extension-list": "3.23.1" } }, "sha512-Fk/884un5OSLCFxe2TbOmfp3sLMB5b76CnMjaSrvgfiaZnsV2WlJZGPXxCAPbxNIATTykNlSBsVuMBO7we64Vg=="],
- "@pie-lib/editable-html-tip-tap/@tiptap/starter-kit/@tiptap/extensions": ["@tiptap/extensions@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-ZmGUhLbMWaGqnJh2Bry+6V4M6gMpUDYo4D1xNux5Gng/E/eYtc+PMxMZ/6F7tNTAuujLBOQKj6D+4SsSm457jw=="],
+ "@pie-lib/editable-html-tip-tap/@tiptap/starter-kit/@tiptap/extension-text": ["@tiptap/extension-text@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-k1Ki9bBV6mLz1mFP+Laqh1YHJ2MY0P8XzaMqpkgMndEBIJQ3XcpWQc5bfAlRnYcOI9ZXDbAgQ8CwgArxHmQWCQ=="],
- "@pie-lib/editable-html-tip-tap/@tiptap/starter-kit/@tiptap/pm": ["@tiptap/pm@3.19.0", "", { "dependencies": { "prosemirror-changeset": "^2.3.0", "prosemirror-collab": "^1.3.1", "prosemirror-commands": "^1.6.2", "prosemirror-dropcursor": "^1.8.1", "prosemirror-gapcursor": "^1.3.2", "prosemirror-history": "^1.4.1", "prosemirror-inputrules": "^1.4.0", "prosemirror-keymap": "^1.2.2", "prosemirror-markdown": "^1.13.1", "prosemirror-menu": "^1.2.4", "prosemirror-model": "^1.24.1", "prosemirror-schema-basic": "^1.2.3", "prosemirror-schema-list": "^1.5.0", "prosemirror-state": "^1.4.3", "prosemirror-tables": "^1.6.4", "prosemirror-trailing-node": "^3.0.0", "prosemirror-transform": "^1.10.2", "prosemirror-view": "^1.38.1" } }, "sha512-789zcnM4a8OWzvbD2DL31d0wbSm9BVeO/R7PLQwLIGysDI3qzrcclyZ8yhqOEVuvPitRRwYLq+mY14jz7kY4cw=="],
+ "@pie-lib/editable-html-tip-tap/@tiptap/starter-kit/@tiptap/pm": ["@tiptap/pm@3.23.1", "", { "dependencies": { "prosemirror-changeset": "^2.3.0", "prosemirror-commands": "^1.6.2", "prosemirror-dropcursor": "^1.8.1", "prosemirror-gapcursor": "^1.3.2", "prosemirror-history": "^1.4.1", "prosemirror-keymap": "^1.2.2", "prosemirror-model": "^1.24.1", "prosemirror-schema-list": "^1.5.0", "prosemirror-state": "^1.4.3", "prosemirror-tables": "^1.6.4", "prosemirror-transform": "^1.10.2", "prosemirror-view": "^1.38.1" } }, "sha512-8G+TkNsUHHAAJYREpA6fw+Dw/m2Y3Go4/QMQM8RYepid+wTeE1wSv7sBA/CBrphhYmJSWeTyCPtgQIxnTJXMCA=="],
"@pie-lib/editable-html-tip-tap/react-jss/hoist-non-react-statics": ["hoist-non-react-statics@2.5.5", "", {}, "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw=="],
@@ -4495,64 +4394,42 @@
"@pie-lib/editable-html-tip-tap/react-jss/theming": ["theming@1.3.0", "", { "dependencies": { "brcast": "^3.0.1", "is-function": "^1.0.1", "is-plain-object": "^2.0.1", "prop-types": "^15.5.8" }, "peerDependencies": { "react": ">=0.15" } }, "sha512-ya5Ef7XDGbTPBv5ENTwrwkPUexrlPeiAg/EI9kdlUAZhNlRbCdhMKRgjNX1IcmsmiPcqDQZE6BpSaH+cr31FKw=="],
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/starter-kit/@tiptap/extension-code-block": ["@tiptap/extension-code-block@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-b/2qR+tMn8MQb+eaFYgVk4qXnLNkkRYmwELQ8LEtEDQPxa5Vl7J3eu8+4OyoIFhZrNDZvvoEp80kHMCP8sI6rg=="],
-
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/starter-kit/@tiptap/extension-document": ["@tiptap/extension-document@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-AOf0kHKSFO0ymjVgYSYDncRXTITdTcrj1tqxVazrmO60KNl1Rc2dAggDvIVTEBy5NvceF0scc7q3sE/5ZtVV7A=="],
-
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/starter-kit/@tiptap/extension-list": ["@tiptap/extension-list@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-N6nKbFB2VwMsPlCw67RlAtYSK48TAsAUgjnD+vd3ieSlIufdQnLXDFUP6hFKx9mwoUVUgZGz02RA6bkxOdYyTw=="],
-
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/starter-kit/@tiptap/extension-list-item": ["@tiptap/extension-list-item@3.19.0", "", { "peerDependencies": { "@tiptap/extension-list": "^3.19.0" } }, "sha512-VsSKuJz4/Tb6ZmFkXqWpDYkRzmaLTyE6dNSEpNmUpmZ32sMqo58mt11/huADNwfBFB0Ve7siH/VnFNIJYY3xvg=="],
+ "@pie-lib/editable-html-tiptap-svelte/@tiptap/starter-kit/@tiptap/extension-document": ["@tiptap/extension-document@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-NA5Rx59HRwG6Hb6LwLpC5lE7z6vCj6f90S7RNNsnE+CyiXNR/OhY2BcjuxiGnascHvsnsAbvxGU3ymKMDgvDVg=="],
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/starter-kit/@tiptap/extension-text": ["@tiptap/extension-text@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0" } }, "sha512-K95+SnbZy0h6hNFtfy23n8t/nOcTFEf69In9TSFVVmwn/Nwlke+IfiESAkqbt1/7sKJeegRXYO7WzFEmFl9Q/g=="],
+ "@pie-lib/editable-html-tiptap-svelte/@tiptap/starter-kit/@tiptap/extension-list": ["@tiptap/extension-list@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1", "@tiptap/pm": "3.23.1" } }, "sha512-v1AeXPpagslgRZdOp7WdjCoO4TjjNP8RM2R6Gqx0/inGaNXnM8zCMshOxZlAb03Ad7kq/4RGJmkpM/Jjsi6dEQ=="],
- "@pie-lib/editable-html-tiptap-svelte/@tiptap/starter-kit/@tiptap/extensions": ["@tiptap/extensions@3.19.0", "", { "peerDependencies": { "@tiptap/core": "^3.19.0", "@tiptap/pm": "^3.19.0" } }, "sha512-ZmGUhLbMWaGqnJh2Bry+6V4M6gMpUDYo4D1xNux5Gng/E/eYtc+PMxMZ/6F7tNTAuujLBOQKj6D+4SsSm457jw=="],
+ "@pie-lib/editable-html-tiptap-svelte/@tiptap/starter-kit/@tiptap/extension-list-item": ["@tiptap/extension-list-item@3.23.1", "", { "peerDependencies": { "@tiptap/extension-list": "3.23.1" } }, "sha512-Fk/884un5OSLCFxe2TbOmfp3sLMB5b76CnMjaSrvgfiaZnsV2WlJZGPXxCAPbxNIATTykNlSBsVuMBO7we64Vg=="],
- "@pie-lib/editable-html-tiptap-svelte/svelte/aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="],
-
- "@pie-lib/editable-html-tiptap-svelte/svelte/clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
-
- "@pie-lib/editable-html-tiptap-svelte/svelte/esrap": ["esrap@2.2.4", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@typescript-eslint/types": "^8.2.0" } }, "sha512-suICpxAmZ9A8bzJjEl/+rLJiDKC0X4gYWUxT6URAWBLvlXmtbZd5ySMu/N2ZGEtMCAmflUDPSehrP9BQcsGcSg=="],
+ "@pie-lib/editable-html-tiptap-svelte/@tiptap/starter-kit/@tiptap/extension-text": ["@tiptap/extension-text@3.23.1", "", { "peerDependencies": { "@tiptap/core": "3.23.1" } }, "sha512-k1Ki9bBV6mLz1mFP+Laqh1YHJ2MY0P8XzaMqpkgMndEBIJQ3XcpWQc5bfAlRnYcOI9ZXDbAgQ8CwgArxHmQWCQ=="],
"@pie-lib/render-ui/react-transition-group/dom-helpers": ["dom-helpers@5.2.1", "", { "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="],
- "@pie-lib/test-utils/@testing-library/jest-dom/aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
-
"@pie-lib/test-utils/@testing-library/jest-dom/dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="],
- "@tiptap/extension-bullet-list/@tiptap/extension-list/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@tiptap/extension-bullet-list/@tiptap/extension-list/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/extension-list-keymap/@tiptap/extension-list/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@tiptap/extension-list-keymap/@tiptap/extension-list/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
- "@tiptap/extension-ordered-list/@tiptap/extension-list/@tiptap/core": ["@tiptap/core@3.19.0", "", { "peerDependencies": { "@tiptap/pm": "^3.19.0" } }, "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA=="],
+ "@tiptap/extension-ordered-list/@tiptap/extension-list/@tiptap/core": ["@tiptap/core@3.23.1", "", { "peerDependencies": { "@tiptap/pm": "3.23.1" } }, "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw=="],
"@types/jest/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="],
- "@types/jest/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="],
-
- "@visx/vendor/@types/d3-scale/@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="],
-
"cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
- "esbuild-loader/webpack-sources/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
+ "filelist/minimatch/brace-expansion": ["brace-expansion@2.1.0", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w=="],
"jest-diff/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
"jest-diff/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="],
- "jest-diff/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="],
-
"jest-matcher-utils/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
"jest-matcher-utils/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="],
- "jest-matcher-utils/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="],
-
"jest-message-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
"jest-message-util/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="],
- "jest-message-util/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="],
-
"jest-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
"minipass-flush/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
@@ -4564,5 +4441,7 @@
"read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
"styled-components/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="],
+
+ "filelist/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
}
}
diff --git a/docs/prds/mc-populated-blank-parity/PRD.md b/docs/prds/mc-populated-blank-parity/PRD.md
new file mode 100644
index 00000000..ba80ec3d
--- /dev/null
+++ b/docs/prds/mc-populated-blank-parity/PRD.md
@@ -0,0 +1,70 @@
+# McPopulatedBlank parity testing harness
+
+Status: **Proposal** · Impl. path: Extend `element-demo` + new test infrastructure
+
+## Context
+
+McPopulatedBlank is a PIE-framework port of the Renaissance Custom Question type defined in `web-ItemBankViewer/learnosity/templates/Renaissance`. The reference implementation is a set of Learnosity Custom Question API objects (JavaScript factories) that render inside the Learnosity Items API runtime. The PIE port must match the reference across three dimensions: visual layout, ARIA/accessibility semantics, and behavioral fidelity (audio playback, image switching during playback).
+
+The current parity test suite consists of static screenshot-derived CSS assertions, one spec file per variant. These cover layout geometry and computed CSS values but cannot test ARIA attributes, audio event sequencing, or the image-switching behavior that is the core interactive feature of several variants. The suite is also fragile: layout pixel thresholds break on minor CSS changes unrelated to parity.
+
+This PRD specifies a live side-by-side parity harness: the element-demo app hosts both the PIE rendering and a Learnosity rendering of the same item on a dedicated route, and Playwright tests compare the two live DOMs directly.
+
+## Goals
+
+- A dedicated parity route in element-demo renders PIE and Learnosity side by side for any variant, derived from the existing `mc-populated-blank.json` sample registry.
+- Playwright tests can assert visual, ARIA, and behavioral parity by querying both DOMs in a single test run, with no external authentication required.
+- Audio behavioral tests are deterministic — they do not depend on network audio playback or Chromium's audio stack.
+- Test organization mirrors the variant structure: one spec file per variant, covering all three parity dimensions.
+- The `mc-populated-blank.json` registry is extended to include image-based choice variants (currently only text-choice variants have Learnosity source references).
+
+## Non-goals
+
+- **Not a replacement for the existing parity specs.** The existing CSS-geometry tests provide a fast, CI-safe check against known values; they stay. The new harness supplements them with live cross-comparison.
+- **No authentication dependency.** The Learnosity signing endpoint lives inside element-demo and sources credentials from env vars, not from PIEOneer or any deployed service.
+- **Not a general Learnosity integration.** The signing endpoint and parity route exist solely as a local test harness. They are gated behind env var presence so they cannot function in production builds without credentials configured.
+- **No real audio playback in behavioral tests.** Chromium headless audio reliability is not the property being tested; what matters is whether the PIE and Learnosity implementations respond identically to the same audio lifecycle events. Real network audio is deferred to manual QA.
+- **No coverage of Learnosity authoring, scoring, or response-masking APIs.** Only the delivery rendering surface (gather mode) is in scope.
+
+## Proposed surface
+
+**New route**: `/mc-populated-blank/parity?demo=`
+
+- Server `load` function signs the Learnosity Items API payload using the demo ID to look up the item reference in `mc-populated-blank.json`.
+- Page renders two containers side by side: `#pie-container` (PIE element via the existing ESM player) and `#learnosity-container` (Learnosity Items API initialized via CDN script in `onMount`).
+- `onMount` polls via `setInterval` for a known sentinel element inside `#learnosity-container`; when found, sets `data-learnosity-ready="true"` on the container. The sentinel element is determined empirically during implementation by inspecting the headed browser.
+- Playwright tests `waitForSelector('[data-learnosity-ready="true"]')` before running assertions.
+
+**New signing endpoint**: `/mc-populated-blank/parity/sign` (or as a SvelteKit `+page.server.ts` load function — implementation may fold this into the page load rather than a separate endpoint)
+
+- Accepts demo ID, looks up `sourceReference` in `mc-populated-blank.json`, returns a signed Learnosity Items API init config.
+- Returns 503 if `LEARNOSITY_CONSUMER_KEY` / `LEARNOSITY_SECRET` env vars are absent.
+- Signing algorithm matches the existing implementation in `scripts/fetch-learnosity-item.mjs`.
+
+**Audio mock**: `page.addInitScript()` in test setup replaces `window.HTMLAudioElement` with a controllable fake that fires `play`, `pause`, `ended`, and `timeupdate` events on demand. Applied to both `#pie-container` and `#learnosity-container` contexts so behavioral assertions are symmetric.
+
+**`mc-populated-blank.json` additions**: new entries for image-based choice variants with `sourceReference` fields pointing to corresponding Learnosity items.
+
+**Test structure**: one spec file per variant (e.g. `mc-populated-blank-gplusggg-parity.spec.ts` extended, not replaced), structured in three sections — visual, ARIA, behavioral.
+
+**ARIA assertion list**: deferred — determined by inspecting both live DOMs during implementation. The principle is specific named attribute assertions on semantically corresponding elements (e.g. "both sides expose a radiogroup with an accessible label", "both sides have a polite live region on the blank slot"), not full accessibility tree snapshot diffs.
+
+## Worked example
+
+Demo ID `variant-sel-r1-gplusggg` maps to Learnosity item `11b4d9be-a79e-48c3-9e58-84f5be3dbb0f`. The parity route loads both renderings. A Playwright test:
+
+1. Waits for `[data-learnosity-ready="true"]`.
+2. Reads `aria-label` from the Learnosity blank slot and from the PIE `.pie-blank-slot` element.
+3. Asserts the two values communicate the same semantic intent (blank placeholder label).
+4. Fires a synthetic `play` event via the audio mock.
+5. Asserts both sides switch to their "playing" image state.
+
+## Accessibility
+
+This PRD adds test infrastructure, not a delivery surface. The ARIA parity tests are themselves an accessibility verification mechanism — they assert that the PIE element produces equivalent semantic markup to the reference. No new WCAG obligations arise from the harness itself.
+
+## Open questions
+
+- [ ] What is the reliable Learnosity sentinel element to poll for in `setInterval`? Determined by headed browser inspection during implementation.
+- [ ] Which specific ARIA attributes require cross-comparison assertions? Determined by inspecting both live DOMs during implementation.
+- [ ] Which image-based choice variants have corresponding Learnosity items available in the `1JQLtMp0itQcxfSQ` org? Requires a lookup pass against the Learnosity item bank.
diff --git a/docs/prds/mc-populated-blank-parity/issues/01-learnosity-signing-endpoint.md b/docs/prds/mc-populated-blank-parity/issues/01-learnosity-signing-endpoint.md
new file mode 100644
index 00000000..801dd8c5
--- /dev/null
+++ b/docs/prds/mc-populated-blank-parity/issues/01-learnosity-signing-endpoint.md
@@ -0,0 +1,19 @@
+# 01 — Learnosity signing endpoint
+
+Type: **AFK**
+
+## What to build
+
+Add a SvelteKit server `load` function to the parity route that signs a Learnosity Items API init payload. Given a `demo` query param, the load function looks up the corresponding `sourceReference` in `mc-populated-blank.json`, computes an HMAC-SHA256 signature using the algorithm already in `scripts/fetch-learnosity-item.mjs`, and returns the signed payload to the page. The signing logic runs server-side only; credentials never reach the browser.
+
+## Acceptance criteria
+
+- [ ] `GET /mc-populated-blank/parity?demo=variant-sel-r1-gplusggg` returns a page whose server load produced a signed Learnosity Items API init config (consumer key, timestamp, signature, items array).
+- [ ] Returns a 503 (or equivalent user-visible error) when `LEARNOSITY_CONSUMER_KEY` or `LEARNOSITY_SECRET` env vars are absent.
+- [ ] Returns a 404 (or equivalent) when the `demo` param does not match any entry in `mc-populated-blank.json`.
+- [ ] Returns a 400 (or equivalent) when the matched entry has no `sourceReference` field.
+- [ ] Signing algorithm produces output that Learnosity's Items API accepts (verify manually in headed browser during slice 2).
+
+## Blocked by
+
+None — can start immediately.
diff --git a/docs/prds/mc-populated-blank-parity/issues/02-parity-route-skeleton.md b/docs/prds/mc-populated-blank-parity/issues/02-parity-route-skeleton.md
new file mode 100644
index 00000000..7691565f
--- /dev/null
+++ b/docs/prds/mc-populated-blank-parity/issues/02-parity-route-skeleton.md
@@ -0,0 +1,22 @@
+# 02 — Parity route skeleton
+
+Type: **AFK**
+
+## What to build
+
+Add the `/mc-populated-blank/parity` SvelteKit route. The page renders two containers side by side: `#pie-container` (PIE element via the existing ESM player, identical to the deliver route) and `#learnosity-container` (Learnosity Items API initialized with the signed payload from the server load). In `onMount`, load the Learnosity CDN script, then call `LearnosityItems.init()` with the signed payload. Poll via `setInterval` for the sentinel element (placeholder constant — resolved in issue 03). When the sentinel is found, set `data-learnosity-ready="true"` on `#learnosity-container` and clear the interval.
+
+The route is demoable: navigating to it in a headed browser with credentials configured shows both renderings side by side.
+
+## Acceptance criteria
+
+- [ ] `/mc-populated-blank/parity?demo=variant-sel-r1-gplusggg` renders `#pie-container` and `#learnosity-container` side by side in a headed browser.
+- [ ] PIE element renders correctly (identical to the deliver route for the same demo).
+- [ ] Learnosity Items API initializes without console errors when credentials are present.
+- [ ] `data-learnosity-ready="true"` is set on `#learnosity-container` once Learnosity has rendered (sentinel placeholder may be a broad selector initially; sharpened in issue 03).
+- [ ] Page shows a clear error state when credentials are absent (propagated from the server load 503).
+- [ ] Route is excluded from the standard `test:e2e` run when credentials are absent (tests skip gracefully).
+
+## Blocked by
+
+- Issue 01 — Learnosity signing endpoint
diff --git a/docs/prds/mc-populated-blank-parity/issues/03-sentinel-element-identification.md b/docs/prds/mc-populated-blank-parity/issues/03-sentinel-element-identification.md
new file mode 100644
index 00000000..4e9810e6
--- /dev/null
+++ b/docs/prds/mc-populated-blank-parity/issues/03-sentinel-element-identification.md
@@ -0,0 +1,20 @@
+# 03 — Sentinel element identification
+
+Type: **HITL** ✅ Resolved — sentinel is `lrn-assess`
+
+## What to build
+
+Run the parity route in a headed browser with credentials configured. Inspect the Learnosity-rendered DOM in `#learnosity-container` to identify a reliable element that is always present once rendering is complete, regardless of variant. Commit the sentinel selector as a named constant in the parity route component, replacing the placeholder from issue 02.
+
+The sentinel must be present for all variants (gplusggg, sel-vic, sr-vic, s3, gg-plus, g-plus) — verify by loading at least two variants before committing.
+
+## Acceptance criteria
+
+- [ ] A specific CSS selector (or DOM attribute check) is identified that reliably indicates Learnosity rendering is complete across all variants.
+- [ ] The selector is committed as a named constant in the parity route.
+- [ ] `data-learnosity-ready="true"` fires consistently within 10 seconds of page load in a headed browser for at least two variants.
+- [ ] The constant and the reason for choosing it are documented in a one-line comment.
+
+## Blocked by
+
+- Issue 02 — Parity route skeleton
diff --git a/docs/prds/mc-populated-blank-parity/issues/04-audio-mock-utility.md b/docs/prds/mc-populated-blank-parity/issues/04-audio-mock-utility.md
new file mode 100644
index 00000000..a12c7ad4
--- /dev/null
+++ b/docs/prds/mc-populated-blank-parity/issues/04-audio-mock-utility.md
@@ -0,0 +1,21 @@
+# 04 — Audio mock utility
+
+Type: **AFK**
+
+## What to build
+
+Create a test helper that installs a controllable `HTMLAudioElement` fake via Playwright's `page.addInitScript()`. The fake replaces the native `HTMLAudioElement` before the page loads so both `#pie-container` and `#learnosity-container` use it. The helper exposes a per-test API to trigger audio lifecycle events (`play`, `pause`, `ended`, `timeupdate`) on demand from test code.
+
+The mock must be reversible — removing the `addInitScript()` call restores real audio. No test assertions depend on whether the mock or real audio is in use.
+
+## Acceptance criteria
+
+- [ ] `installAudioMock(page)` helper (in `test-helpers.ts` or a dedicated file) calls `page.addInitScript()` with a fake `HTMLAudioElement`.
+- [ ] The fake fires `play`, `pause`, `ended`, and `timeupdate` events when triggered via a test-exposed control (e.g. `window.__audioMock.trigger('play')`).
+- [ ] Applying the mock does not break page load or PIE element initialization.
+- [ ] A unit-level smoke test confirms the mock fires the expected events.
+- [ ] Removing the helper call from a test results in real `HTMLAudioElement` behavior (no side effects from the mock infrastructure).
+
+## Blocked by
+
+None — can start immediately.
diff --git a/docs/prds/mc-populated-blank-parity/issues/05-aria-attribute-list.md b/docs/prds/mc-populated-blank-parity/issues/05-aria-attribute-list.md
new file mode 100644
index 00000000..c4abc7dc
--- /dev/null
+++ b/docs/prds/mc-populated-blank-parity/issues/05-aria-attribute-list.md
@@ -0,0 +1,25 @@
+# 05 — ARIA attribute list determination
+
+Type: **HITL**
+
+## What to build
+
+With the parity route running in a headed browser, use `page.accessibility.snapshot()` and direct DOM inspection on both `#pie-container` and `#learnosity-container` for the `variant-sel-r1-gplusggg` variant to produce the definitive list of ARIA attributes the parity tests will assert.
+
+The goal is a specific, narrow list — not a full tree snapshot diff. For each attribute identified, document:
+- The semantic intent (e.g. "blank slot announces its label to screen readers")
+- The corresponding selector on each side
+- The assertion strategy (exact match, pattern match, or semantic equivalence)
+
+Commit the list as a comment block or small markdown note alongside the first variant spec (issue 06). It becomes the reference for all subsequent variant specs.
+
+## Acceptance criteria
+
+- [ ] ARIA attributes for at least the following elements are documented: blank slot, choices group/radiogroup, individual radio inputs, audio button, audio transcript region.
+- [ ] Each attribute entry specifies the PIE selector, the Learnosity selector, and the assertion strategy.
+- [ ] Any meaningful differences between PIE and Learnosity ARIA output are flagged for review (not silently papered over with loose assertions).
+- [ ] The list is committed to the repo alongside or within the issue 06 spec file.
+
+## Blocked by
+
+- Issue 02 — Parity route skeleton
diff --git a/docs/prds/mc-populated-blank-parity/issues/06-first-variant-parity-spec.md b/docs/prds/mc-populated-blank-parity/issues/06-first-variant-parity-spec.md
new file mode 100644
index 00000000..61fa193b
--- /dev/null
+++ b/docs/prds/mc-populated-blank-parity/issues/06-first-variant-parity-spec.md
@@ -0,0 +1,30 @@
+# 06 — First variant parity spec (gplusggg)
+
+Type: **AFK**
+
+## What to build
+
+Write the full parity spec for `variant-sel-r1-gplusggg` covering all three dimensions: visual, ARIA, and behavioral. This spec establishes the pattern all subsequent variant specs follow.
+
+**Visual**: assert that computed CSS values on semantically corresponding elements (tile background, blank underline thickness, font size, gap between tiles, audio button position) match between `#pie-container` and `#learnosity-container` — not against hardcoded pixel values.
+
+**ARIA**: assert the specific named attributes from the list produced in issue 05 on corresponding elements in both containers.
+
+**Behavioral**: using the audio mock from issue 04, fire a `play` event and assert both containers switch to their playing image state; fire `ended` and assert both return to their silent state.
+
+The existing `mc-populated-blank-gplusggg-parity.spec.ts` is extended (not replaced) with a new `describe` block scoped to the parity route. The old CSS-geometry assertions against hardcoded values remain.
+
+## Acceptance criteria
+
+- [ ] Spec navigates to `/mc-populated-blank/parity?demo=variant-sel-r1-gplusggg` and waits for `[data-learnosity-ready="true"]`.
+- [ ] Visual section: at least 5 CSS property cross-comparisons pass (PIE value === Learnosity value).
+- [ ] ARIA section: all attributes from the issue 05 list are asserted on both containers.
+- [ ] Behavioral section: audio mock `play` → both containers show playing state; `ended` → both show silent state.
+- [ ] Tests skip gracefully when `LEARNOSITY_CONSUMER_KEY` is absent.
+- [ ] Spec file structure (three `describe` blocks: visual, aria, behavioral) is documented in a comment for variant spec authors to follow.
+
+## Blocked by
+
+- Issue 03 — Sentinel element identification
+- Issue 04 — Audio mock utility
+- Issue 05 — ARIA attribute list determination
diff --git a/docs/prds/mc-populated-blank-parity/issues/07-remaining-variant-parity-specs.md b/docs/prds/mc-populated-blank-parity/issues/07-remaining-variant-parity-specs.md
new file mode 100644
index 00000000..73bdaed9
--- /dev/null
+++ b/docs/prds/mc-populated-blank-parity/issues/07-remaining-variant-parity-specs.md
@@ -0,0 +1,29 @@
+# 07 — Remaining variant parity specs
+
+Type: **AFK**
+
+## What to build
+
+Following the pattern established in issue 06, write parity specs for all remaining variants:
+
+- `sel_vic` — inline_sentence layout, vertical choices, visible audio + transcript
+- `sr_vic` — inline_sentence layout, vertical choices, no visible audio
+- `sel_r1-s3` — stimulus_image_blank layout
+- `sel_r1-_ggplusggg` — audio_blank_only, horizontal choices (gg variant)
+- `sel_r1-g_plusggg` — audio_blank_only, horizontal choices (g variant)
+
+Each spec extends the corresponding existing `*-parity.spec.ts` file with a new `describe` block scoped to the parity route. Existing hardcoded CSS-geometry assertions are not removed.
+
+Variant-specific behavioral differences (e.g. sel-vic has a visible transcript that toggles; sr-vic has a screen-reader-only transcript) should be reflected in the behavioral section of each spec.
+
+## Acceptance criteria
+
+- [ ] One extended parity spec per variant listed above.
+- [ ] Each spec passes the same three-section structure (visual, ARIA, behavioral) from issue 06.
+- [ ] Visual cross-comparisons cover the layout properties specific to each variant's profile (e.g. stimulus image position for s3, transcript visibility for sel-vic).
+- [ ] All specs skip gracefully when `LEARNOSITY_CONSUMER_KEY` is absent.
+- [ ] All new specs pass in CI when credentials are configured.
+
+## Blocked by
+
+- Issue 06 — First variant parity spec (gplusggg)
diff --git a/docs/prds/mc-populated-blank-parity/issues/08-image-based-variant-additions.md b/docs/prds/mc-populated-blank-parity/issues/08-image-based-variant-additions.md
new file mode 100644
index 00000000..e5e7c824
--- /dev/null
+++ b/docs/prds/mc-populated-blank-parity/issues/08-image-based-variant-additions.md
@@ -0,0 +1,32 @@
+# 08 — Image-based variant additions
+
+Type: **HITL**
+
+## What to build
+
+Identify Learnosity items in the `1JQLtMp0itQcxfSQ` org that use image-based choices (as opposed to text choices). Add corresponding entries to `mc-populated-blank.json` with `sourceReference` fields pointing to those items. These entries unlock parity testing for the image-choice rendering path, which current text-only variants do not exercise.
+
+Use `scripts/fetch-learnosity-item.mjs` to inspect candidate items and verify they map correctly to McPopulatedBlank's model shape (image URL, image alt, correct choice ID).
+
+## Acceptance criteria
+
+- [ ] At least one image-based choice variant entry added to `mc-populated-blank.json` with a valid `sourceReference`.
+- [ ] The new entry renders correctly on the existing deliver route (`/mc-populated-blank/deliver?demo=`).
+- [ ] The new entry renders correctly on the parity route (`/mc-populated-blank/parity?demo=`) once issues 01–02 are complete.
+- [ ] Image alt text from the Learnosity item is mapped to the PIE model's `imageAlt` field.
+
+## Blocked by
+
+None — can start immediately (parallel track; parity spec coverage depends on issues 01–06 being complete first).
+
+## Items to use for parity testing
+|item type|text (en)|text (es)|graphic (en)|graphic (es)|
+|-|-|-|-|-|
+|sel-r1-gg_plusggg|0d42ee84-b291-4336-b689-6912199fa81f|ea363a8b-26a1-44fb-bc8b-85f42758d952|bc827dec-cb5e-4f09-b7f0-e227c2912c2f|na|
+|sel-r1-g_plusggg|0060b039-2605-47a6-8305-96e0463fcfd0|8e2e031c-5594-4081-811b-ddfcbecd5667|e6dc4fe3-076d-4d39-963a-f5742987801a|na|
+|sel-r1-_plusggg|000eb0e6-92a0-43cd-bb1f-89ddb52da2e5|25bdc860-bd49-438d-a597-78561422037b|097f87c5-c474-4dda-97b2-46b30d598a54|a83f1d87-f3e5-4c0e-8eb4-408275336c0b|
+|sel-r1-_gplusggg|11b4d9be-a79e-48c3-9e58-84f5be3dbb0f|74a235ac-ba03-462d-9e78-077603f7f51e|a0c05ca1-127d-49eb-bb05-8ea7b5c1834f|na|
+|sel-r1-_ggplusggg|0291a767-2334-4742-a899-e4178e85fc02|23e2b004-9b64-41cb-b620-c108146d5a27|2e53a942-8ceb-46d4-bf56-ddd7b376f504|00cd1143-ceda-4f81-8f1f-6c9555d043e4|
+|sel-r1-s3plusggg|003dcbf8-ff38-4930-84ee-26ca8be834b9|5f9fcfe0-5870-4e1b-a436-49dceb43759d|c3b6c877-444d-4d27-9f1a-3cbc8af38b7a|na|
+|sel_vic|04973d1a-0557-4963-937d-7ac76ee3baeb|9264f1c0-a6c9-4920-bb9c-7590be3c172a|na|na|
+|sr_vic|00293f60-334f-48d0-b145-f7cb9f02a0fe|na|na|na|
\ No newline at end of file
diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json
index e107f65f..a869f55d 100644
--- a/packages/core/tsconfig.json
+++ b/packages/core/tsconfig.json
@@ -5,6 +5,7 @@
"rootDir": "./src",
"composite": true,
"noEmit": false,
+ "emitDeclarationOnly": false,
"allowImportingTsExtensions": false
},
"include": ["src/**/*"],
diff --git a/packages/element-player/src/lib/element-loader.ts b/packages/element-player/src/lib/element-loader.ts
index c9d3def9..259d210e 100644
--- a/packages/element-player/src/lib/element-loader.ts
+++ b/packages/element-player/src/lib/element-loader.ts
@@ -50,7 +50,7 @@ async function resolveModule(
return import(/* @vite-ignore */ modulePath);
}
// Let Vite resolve local workspace specifiers in ESM mode.
- return import(modulePath);
+ return import(/* @vite-ignore */ modulePath);
}
/**
diff --git a/packages/elements-svelte/mc-populated-blank/CONTEXT.md b/packages/elements-svelte/mc-populated-blank/CONTEXT.md
new file mode 100644
index 00000000..89601276
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/CONTEXT.md
@@ -0,0 +1,13 @@
+# McPopulatedBlank — Domain Glossary
+
+## ClozeMarker
+
+The inline visual slot within a sentence template that displays the student's currently selected answer. It renders in one of three states: empty (no selection), text (selected choice's label HTML), or image (selected choice's image). Carries the live-region ARIA contract (`role=status`, `aria-live=polite`) so screen readers announce selection changes without moving focus.
+
+Implemented as `ClozeMarker.svelte`. Not the same as the blank as a structural position in the template string — that is just the `{{blank}}` token placeholder.
+
+## ChoiceRow
+
+A single selectable answer tile. Renders in two layouts: **inline** (radio left, label right) and **horizontal** (label above, radio below, tile-style). Displays a correctness badge (✓ or ✕) in evaluate mode. Does not own selection state — selection is managed by the parent fieldset via event bubbling.
+
+Implemented as `ChoiceRow.svelte`.
diff --git a/packages/elements-svelte/mc-populated-blank/package.json b/packages/elements-svelte/mc-populated-blank/package.json
index fbeafeba..80831ae3 100644
--- a/packages/elements-svelte/mc-populated-blank/package.json
+++ b/packages/elements-svelte/mc-populated-blank/package.json
@@ -57,6 +57,7 @@
"@sveltejs/vite-plugin-svelte": "^7.0.0",
"svelte": "^5.54.0",
"typescript": "^5.9.3",
- "vite": "^8.0.1"
+ "vite": "^8.0.1",
+ "vitest": "^4.1.0"
}
}
diff --git a/packages/elements-svelte/mc-populated-blank/src/controller/defaults.ts b/packages/elements-svelte/mc-populated-blank/src/controller/defaults.ts
index 3512ba1f..08f084bc 100644
--- a/packages/elements-svelte/mc-populated-blank/src/controller/defaults.ts
+++ b/packages/elements-svelte/mc-populated-blank/src/controller/defaults.ts
@@ -1,43 +1,9 @@
+import { DEFAULT_LAYOUT_LIMITS } from '../shared/layoutLimits';
+
+export { DEFAULT_LAYOUT_LIMITS };
+
/** Token authors must include exactly once in `template` (HTML). */
export const BLANK_TOKEN = '{{blank}}';
-/** Baseline values tuned to match historical CQT visuals; override via model.layoutLimits. */
-export const DEFAULT_LAYOUT_LIMITS = {
- blankStandaloneWidthRem: 7,
- blankWideWidthRem: 10,
- blankUnderlineWidthPx: 2,
- blankUnderlineWideWidthPx: 4,
- horizontalChoiceWidthPx: 170,
- horizontalChoiceWidthVw: 30,
- horizontalChoiceTileMinHeightRem: 11,
- horizontalChoiceContentMinHeightRem: 7.5,
- selectedImageMaxHeightRem: 4,
- choiceImageMaxHeightRem: 5,
- listenButtonSizePx: 128,
- stimulusMinColumnPx: 210,
- textMinColumnPx: 260,
- legendMaxChars: 120,
- choiceGroupGapRem: 0.5,
- choiceRowGapRem: 0.5,
- toggleButtonGapRem: 0.5,
- horizontalChoiceRadioTopMarginRem: 0.5,
- audioBlankTemplateMarginTopRem: 0.8,
- audioBlankTemplateMarginBottomRem: 1.8,
- audioInstructionsMaxWidthPx: 875,
- narrowHorizontalChoiceMaxWidthPx: 230,
- stimulusGridColumnGapRem: 2,
- stimulusGridRowGapRem: 0.7,
- stimulusSentenceMarginTopRem: 0.2,
- stimulusChoicesMarginTopRem: 0.9,
- tokenGridColumnGapRem: 1.5,
- tokenGridRowGapRem: 0.8,
- tokenTemplateMarginTopRem: 0.6,
- tokenInlineTokenGapRem: 0.35,
- tokenChoicesMarginTopRem: 0.2,
- inlineGridColumnGapRem: 1.5,
- inlineGridRowGapRem: 0.65,
- inlineTemplateMarginTopRem: 0.45,
- inlineChoicesMarginTopRem: 0.25,
-} as const;
export default {
model: {
@@ -54,7 +20,7 @@ export default {
audioButtonSkinsByLocale: {},
uiText: {
answerChoices: 'Answer choices',
- selectedAnswerInSentence: 'Selected answer in sentence',
+ selectedAnswerInSentence: 'blank',
showCorrectAnswer: 'Show correct answer',
hideCorrectAnswer: 'Hide correct answer',
clickToEnableAutoplay: 'Click to enable audio autoplay',
@@ -62,6 +28,10 @@ export default {
transcriptLabel: 'Transcript',
listenLabelEn: 'Listen',
listenLabelEs: 'Escuchar',
+ listenSilentAlt: 'Repeat instructions',
+ listenPlayingAlt: 'Instructions are playing',
+ listenSilentAltEs: 'Escuchar. Repetir las instrucciones.',
+ listenPlayingAltEs: 'Escuchar. Estas son las instrucciones.',
},
sentenceHtml: '',
template: `The answer is ${BLANK_TOKEN}.
`,
diff --git a/packages/elements-svelte/mc-populated-blank/src/controller/index.test.ts b/packages/elements-svelte/mc-populated-blank/src/controller/index.test.ts
new file mode 100644
index 00000000..e0b7ead3
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/controller/index.test.ts
@@ -0,0 +1,428 @@
+/**
+ * Unit tests for the McPopulatedBlank controller.
+ *
+ * Cases are grouped by exported function.
+ *
+ * getCorrectness
+ * G1. No session → unanswered
+ * G2. No choiceId → unanswered
+ * G3. Correct choice selected → correct
+ * G4. Wrong choice selected → incorrect
+ *
+ * outcome
+ * O1. Empty session → score 0, empty: true
+ * O2. No choiceId → score 0, empty: true
+ * O3. Correct choice → score 1, empty: false
+ * O4. Wrong choice → score 0, empty: false
+ * O5. traceLog includes mode, selected id, correct id, final score
+ *
+ * model — choice ordering
+ * M1. shuffle=false → original order preserved
+ * M2. shuffle=true, instructor role → original order locked
+ * M3. shuffle=true, lockChoiceOrder=true → original order locked
+ * M4. shuffle=true, stored shuffle in session.data.shuffledValues → restored
+ * M5. shuffle=true, stored shuffle in session.shuffledValues (legacy) → restored
+ * M6. shuffle=true, stored shuffle has unknown ids → extras appended at end
+ * M7. shuffle=true, no stored shuffle → shuffled; updateSession called with new order
+ * M8. shuffle=true, no stored shuffle, no updateSession → shuffled silently (no throw)
+ *
+ * model — output fields
+ * M9. evaluate mode → correctness, responseCorrect, correctChoiceId present
+ * M10. gather mode → correctness fields absent
+ * M11. instructor + view mode → teacherInstructions included when enabled
+ * M12. student role → teacherInstructions always null
+ * M13. prompt included when promptEnabled=true
+ * M14. prompt null when promptEnabled=false
+ * M15. audioUrl null when hasAudio=false
+ * M16. audioUrl passed through when hasAudio=true
+ * M17. disabled=true in view/evaluate mode, false in gather
+ *
+ * validate
+ * V1. Valid question → empty errors object
+ * V2. promptEnabled + empty prompt → prompt error
+ * V3. populate_blank with no blank token → template error
+ * V4. populate_blank with two blank tokens → template error
+ * V5. audio_mc_only with a blank token → template error
+ * V6. Unknown interactionMode → interactionMode error
+ * V7. Fewer than two choices → choices error
+ * V8. Choice missing id → choices error
+ * V9. Text mode choice missing labelHtml → choices error
+ * V10. Image mode choice missing imageUrl → choices error
+ * V11. Image mode choice missing imageAlt → choices error
+ * V12. correctChoiceId not in choices → correctChoiceId error
+ * V13. hasAudio=true with no audioUrl → audioUrl error
+ * V14. layoutLimits with a non-positive value → layoutLimits error
+ * V15. layoutLimits with a valid value → no error
+ *
+ * createCorrectResponseSession
+ * CR1. Instructor + mode≠evaluate → session with correct choiceId
+ * CR2. Student role → null
+ * CR3. Evaluate mode → null
+ */
+
+import { describe, expect, it, vi } from 'vitest';
+import { getCorrectness, outcome, model, validate, createCorrectResponseSession } from './index';
+
+// ---------------------------------------------------------------------------
+// Shared fixtures
+// ---------------------------------------------------------------------------
+
+const CHOICES = [
+ { id: 'a', labelHtml: 'Alpha
' },
+ { id: 'b', labelHtml: 'Beta
' },
+ { id: 'c', labelHtml: 'Gamma
' },
+];
+
+const BASE_QUESTION = {
+ id: '1',
+ element: 'mc-populated-blank',
+ template: 'The answer is {{blank}}.
',
+ interactionMode: 'populate_blank' as const,
+ choiceMode: 'text' as const,
+ choices: CHOICES,
+ correctChoiceId: 'b',
+ hasAudio: false,
+ shuffle: false,
+};
+
+const GATHER_ENV = { mode: 'gather' as const, role: 'student' as const };
+const EVALUATE_ENV = { mode: 'evaluate' as const, role: 'student' as const };
+const INSTRUCTOR_VIEW_ENV = { mode: 'view' as const, role: 'instructor' as const };
+
+// ---------------------------------------------------------------------------
+// getCorrectness
+// ---------------------------------------------------------------------------
+
+describe('getCorrectness', () => {
+ it('G1: no session → unanswered', () => {
+ expect(getCorrectness(BASE_QUESTION, null as any)).toBe('unanswered');
+ });
+
+ it('G2: session with no choiceId → unanswered', () => {
+ expect(getCorrectness(BASE_QUESTION, {})).toBe('unanswered');
+ });
+
+ it('G3: correct choice selected → correct', () => {
+ expect(getCorrectness(BASE_QUESTION, { choiceId: 'b' })).toBe('correct');
+ });
+
+ it('G4: wrong choice selected → incorrect', () => {
+ expect(getCorrectness(BASE_QUESTION, { choiceId: 'a' })).toBe('incorrect');
+ });
+});
+
+// ---------------------------------------------------------------------------
+// outcome
+// ---------------------------------------------------------------------------
+
+describe('outcome', () => {
+ it('O1: empty session → score 0, empty: true', async () => {
+ const result = await outcome(BASE_QUESTION, {}, GATHER_ENV);
+ expect(result).toMatchObject({ score: 0, empty: true });
+ });
+
+ it('O2: session with no choiceId → score 0, empty: true', async () => {
+ const result = await outcome(BASE_QUESTION, { choiceId: '' }, GATHER_ENV);
+ expect(result).toMatchObject({ score: 0, empty: true });
+ });
+
+ it('O3: correct choice → score 1, empty: false', async () => {
+ const result = await outcome(BASE_QUESTION, { choiceId: 'b' }, EVALUATE_ENV);
+ expect(result).toMatchObject({ score: 1, empty: false });
+ });
+
+ it('O4: wrong choice → score 0, empty: false', async () => {
+ const result = await outcome(BASE_QUESTION, { choiceId: 'a' }, EVALUATE_ENV);
+ expect(result).toMatchObject({ score: 0, empty: false });
+ });
+
+ it('O5: traceLog includes mode, selected id, correct id, final score', async () => {
+ const result = (await outcome(BASE_QUESTION, { choiceId: 'a' }, EVALUATE_ENV)) as any;
+ const log = result.traceLog.join('\n');
+ expect(log).toContain('evaluate');
+ expect(log).toContain('a');
+ expect(log).toContain('b');
+ expect(log).toContain('0');
+ });
+});
+
+// ---------------------------------------------------------------------------
+// model — choice ordering
+// ---------------------------------------------------------------------------
+
+describe('model — choice ordering', () => {
+ it('M1: shuffle=false → original order preserved', async () => {
+ const result = (await model({ ...BASE_QUESTION, shuffle: false }, {}, GATHER_ENV)) as any;
+ expect(result.choices.map((c: any) => c.id)).toEqual(['a', 'b', 'c']);
+ });
+
+ it('M2: shuffle=true, instructor role → original order locked', async () => {
+ const result = (await model(
+ { ...BASE_QUESTION, shuffle: true },
+ {},
+ { mode: 'view', role: 'instructor' }
+ )) as any;
+ expect(result.choices.map((c: any) => c.id)).toEqual(['a', 'b', 'c']);
+ });
+
+ it('M3: shuffle=true, lockChoiceOrder=true → original order locked', async () => {
+ const result = (await model(
+ { ...BASE_QUESTION, shuffle: true, lockChoiceOrder: true },
+ {},
+ GATHER_ENV
+ )) as any;
+ expect(result.choices.map((c: any) => c.id)).toEqual(['a', 'b', 'c']);
+ });
+
+ it('M4: shuffle=true, stored shuffle in session.data.shuffledValues → order restored', async () => {
+ const session = { data: { shuffledValues: ['c', 'a', 'b'] } };
+ const result = (await model({ ...BASE_QUESTION, shuffle: true }, session, GATHER_ENV)) as any;
+ expect(result.choices.map((c: any) => c.id)).toEqual(['c', 'a', 'b']);
+ });
+
+ it('M5: shuffle=true, stored shuffle in session.shuffledValues (legacy) → order restored', async () => {
+ const session = { shuffledValues: ['b', 'c', 'a'] };
+ const result = (await model({ ...BASE_QUESTION, shuffle: true }, session, GATHER_ENV)) as any;
+ expect(result.choices.map((c: any) => c.id)).toEqual(['b', 'c', 'a']);
+ });
+
+ it('M6: shuffle=true, stored shuffle has unknown id → known ids first, extras appended', async () => {
+ const session = { data: { shuffledValues: ['c', 'a', 'unknown'] } };
+ const result = (await model({ ...BASE_QUESTION, shuffle: true }, session, GATHER_ENV)) as any;
+ const ids = result.choices.map((c: any) => c.id);
+ expect(ids[0]).toBe('c');
+ expect(ids[1]).toBe('a');
+ expect(ids[2]).toBe('b'); // leftover appended
+ expect(ids).not.toContain('unknown');
+ });
+
+ it('M7: shuffle=true, no stored shuffle → shuffled; updateSession called with new order', async () => {
+ const session = { id: 'sess-1', element: 'mc-populated-blank' };
+ const updateSession = vi.fn().mockResolvedValue(undefined);
+ await model({ ...BASE_QUESTION, shuffle: true }, session, GATHER_ENV, updateSession);
+ expect(updateSession).toHaveBeenCalledOnce();
+ const [id, element, data] = updateSession.mock.calls[0];
+ expect(id).toBe('sess-1');
+ expect(element).toBe('mc-populated-blank');
+ expect(data.shuffledValues).toHaveLength(3);
+ expect(new Set(data.shuffledValues)).toEqual(new Set(['a', 'b', 'c']));
+ });
+
+ it('M8: shuffle=true, no stored shuffle, no updateSession → shuffled silently without throw', async () => {
+ const session = { id: 'sess-1', element: 'mc-populated-blank' };
+ const result = (await model({ ...BASE_QUESTION, shuffle: true }, session, GATHER_ENV)) as any;
+ expect(result.choices).toHaveLength(3);
+ });
+});
+
+// ---------------------------------------------------------------------------
+// model — output fields
+// ---------------------------------------------------------------------------
+
+describe('model — output fields', () => {
+ it('M9: evaluate mode → correctness, responseCorrect, correctChoiceId in output', async () => {
+ const result = await model(BASE_QUESTION, { choiceId: 'b' }, EVALUATE_ENV);
+ expect(result.correctness).toBe('correct');
+ expect(result.responseCorrect).toBe(true);
+ expect(result.correctChoiceId).toBe('b');
+ });
+
+ it('M10: gather mode → correctness fields absent', async () => {
+ const result = await model(BASE_QUESTION, { choiceId: 'b' }, GATHER_ENV);
+ expect(result.correctness).toBeUndefined();
+ expect(result.responseCorrect).toBeUndefined();
+ expect(result.correctChoiceId).toBeUndefined();
+ });
+
+ it('M11: instructor + view mode → teacherInstructions included when enabled', async () => {
+ const q = {
+ ...BASE_QUESTION,
+ teacherInstructions: 'Do this.',
+ teacherInstructionsEnabled: true,
+ };
+ const result = await model(q, {}, INSTRUCTOR_VIEW_ENV);
+ expect(result.teacherInstructions).toBe('Do this.');
+ });
+
+ it('M12: student role → teacherInstructions always null', async () => {
+ const q = {
+ ...BASE_QUESTION,
+ teacherInstructions: 'Do this.',
+ teacherInstructionsEnabled: true,
+ };
+ const result = await model(q, {}, GATHER_ENV);
+ expect(result.teacherInstructions).toBeNull();
+ });
+
+ it('M13: promptEnabled=true → prompt included', async () => {
+ const q = { ...BASE_QUESTION, promptEnabled: true, prompt: 'Hello
' };
+ const result = await model(q, {}, GATHER_ENV);
+ expect(result.prompt).toBe('Hello
');
+ });
+
+ it('M14: promptEnabled=false → prompt null', async () => {
+ const q = { ...BASE_QUESTION, promptEnabled: false, prompt: 'Hello
' };
+ const result = await model(q, {}, GATHER_ENV);
+ expect(result.prompt).toBeNull();
+ });
+
+ it('M15: hasAudio=false → audioUrl null', async () => {
+ const q = { ...BASE_QUESTION, hasAudio: false, audioUrl: 'https://example.com/a.mp3' };
+ const result = await model(q, {}, GATHER_ENV);
+ expect(result.audioUrl).toBeNull();
+ });
+
+ it('M16: hasAudio=true → audioUrl passed through', async () => {
+ const q = { ...BASE_QUESTION, hasAudio: true, audioUrl: 'https://example.com/a.mp3' };
+ const result = await model(q, {}, GATHER_ENV);
+ expect(result.audioUrl).toBe('https://example.com/a.mp3');
+ });
+
+ it('M17: disabled=false in gather mode, disabled=true in view mode', async () => {
+ const gather = await model(BASE_QUESTION, {}, GATHER_ENV);
+ const view = await model(BASE_QUESTION, {}, { mode: 'view', role: 'student' });
+ expect(gather.disabled).toBe(false);
+ expect(view.disabled).toBe(true);
+ });
+});
+
+// ---------------------------------------------------------------------------
+// validate
+// ---------------------------------------------------------------------------
+
+describe('validate', () => {
+ it('V1: valid question → empty errors', () => {
+ expect(validate(BASE_QUESTION)).toEqual({});
+ });
+
+ it('V2: promptEnabled + empty prompt → prompt error', () => {
+ const errors = validate({ ...BASE_QUESTION, promptEnabled: true, prompt: '' });
+ expect(errors.prompt).toBeTruthy();
+ });
+
+ it('V3: populate_blank with no blank token → template error', () => {
+ const errors = validate({ ...BASE_QUESTION, template: 'No token here.
' });
+ expect(errors.template).toBeTruthy();
+ });
+
+ it('V4: populate_blank with two blank tokens → template error', () => {
+ const errors = validate({ ...BASE_QUESTION, template: '{{blank}} and {{blank}}
' });
+ expect(errors.template).toBeTruthy();
+ });
+
+ it('V5: audio_mc_only with a blank token in template → template error', () => {
+ const errors = validate({
+ ...BASE_QUESTION,
+ interactionMode: 'audio_mc_only',
+ template: '{{blank}}
',
+ });
+ expect(errors.template).toBeTruthy();
+ });
+
+ it('V6: unknown interactionMode → interactionMode error', () => {
+ const errors = validate({ ...BASE_QUESTION, interactionMode: 'unknown' as any });
+ expect(errors.interactionMode).toBeTruthy();
+ });
+
+ it('V7: fewer than two choices → choices error', () => {
+ const errors = validate({ ...BASE_QUESTION, choices: [CHOICES[0]] });
+ expect(errors.choices).toBeTruthy();
+ });
+
+ it('V8: choice missing id → choices error', () => {
+ const errors = validate({
+ ...BASE_QUESTION,
+ choices: [{ id: '', labelHtml: 'A
' }, CHOICES[1]],
+ });
+ expect(errors.choices).toBeTruthy();
+ });
+
+ it('V9: text mode choice missing labelHtml → choices error', () => {
+ const errors = validate({
+ ...BASE_QUESTION,
+ choiceMode: 'text',
+ choices: [{ id: 'a', labelHtml: '' }, CHOICES[1]],
+ });
+ expect(errors.choices).toBeTruthy();
+ });
+
+ it('V10: image mode choice missing imageUrl → choices error', () => {
+ const errors = validate({
+ ...BASE_QUESTION,
+ choiceMode: 'image',
+ choices: [
+ { id: 'a', imageUrl: '', imageAlt: 'Alt' },
+ { id: 'b', imageUrl: 'https://example.com/b.png', imageAlt: 'B' },
+ ],
+ });
+ expect(errors.choices).toBeTruthy();
+ });
+
+ it('V11: image mode choice missing imageAlt → choices error', () => {
+ const errors = validate({
+ ...BASE_QUESTION,
+ choiceMode: 'image',
+ choices: [
+ { id: 'a', imageUrl: 'https://example.com/a.png', imageAlt: '' },
+ { id: 'b', imageUrl: 'https://example.com/b.png', imageAlt: 'B' },
+ ],
+ });
+ expect(errors.choices).toBeTruthy();
+ });
+
+ it('V12: correctChoiceId not in choices → correctChoiceId error', () => {
+ const errors = validate({ ...BASE_QUESTION, correctChoiceId: 'z' });
+ expect(errors.correctChoiceId).toBeTruthy();
+ });
+
+ it('V13: hasAudio=true with no audioUrl → audioUrl error', () => {
+ const errors = validate({ ...BASE_QUESTION, hasAudio: true, audioUrl: '' });
+ expect(errors.audioUrl).toBeTruthy();
+ });
+
+ it('V14: layoutLimits with non-positive value → layoutLimits error', () => {
+ const errors = validate({
+ ...BASE_QUESTION,
+ layoutLimits: { blankStandaloneWidthRem: -1 } as any,
+ });
+ expect(errors.layoutLimits).toBeTruthy();
+ });
+
+ it('V15: layoutLimits with valid positive value → no error', () => {
+ const errors = validate({
+ ...BASE_QUESTION,
+ layoutLimits: { blankStandaloneWidthRem: 8 } as any,
+ });
+ expect(errors.layoutLimits).toBeUndefined();
+ });
+});
+
+// ---------------------------------------------------------------------------
+// createCorrectResponseSession
+// ---------------------------------------------------------------------------
+
+describe('createCorrectResponseSession', () => {
+ it('CR1: instructor + mode≠evaluate → session with correct choiceId', async () => {
+ const result = await createCorrectResponseSession(BASE_QUESTION, {
+ mode: 'view',
+ role: 'instructor',
+ });
+ expect(result).toMatchObject({ choiceId: 'b' });
+ });
+
+ it('CR2: student role → null', async () => {
+ const result = await createCorrectResponseSession(BASE_QUESTION, {
+ mode: 'view',
+ role: 'student',
+ });
+ expect(result).toBeNull();
+ });
+
+ it('CR3: evaluate mode (instructor) → null', async () => {
+ const result = await createCorrectResponseSession(BASE_QUESTION, {
+ mode: 'evaluate',
+ role: 'instructor',
+ });
+ expect(result).toBeNull();
+ });
+});
diff --git a/packages/elements-svelte/mc-populated-blank/src/controller/index.ts b/packages/elements-svelte/mc-populated-blank/src/controller/index.ts
index fb6da108..9dd67781 100644
--- a/packages/elements-svelte/mc-populated-blank/src/controller/index.ts
+++ b/packages/elements-svelte/mc-populated-blank/src/controller/index.ts
@@ -1,4 +1,11 @@
import defaults, { BLANK_TOKEN, DEFAULT_LAYOUT_LIMITS } from './defaults';
+import type {
+ McpbChoice,
+ McpbQuestion,
+ McpbSession,
+ McpbEnv,
+ McpbCorrectness,
+} from '../shared/types';
const isEmptyObject = (value: unknown): boolean =>
!!value &&
@@ -12,8 +19,8 @@ export function countBlankTokens(template: string): number {
return (template.match(re) || []).length;
}
-export const getCorrectness = (question: any, session: any) => {
- if (!session || !session.choiceId) {
+export const getCorrectness = (question: McpbQuestion, session: McpbSession): McpbCorrectness => {
+ if (!session?.choiceId) {
return 'unanswered';
}
const correct = question?.correctChoiceId || '';
@@ -23,28 +30,14 @@ export const getCorrectness = (question: any, session: any) => {
return 'incorrect';
};
-export const getPartialScore = (_question: any, session: any) => {
+export const getPartialScore = (_question: McpbQuestion, session: McpbSession) => {
if (!session || isEmptyObject(session) || !session.choiceId) {
return 0;
}
return 1;
};
-export const isComplete = (question: any, session: any, audioComplete = false) => {
- if (!session || !session.choiceId) {
- return false;
- }
- const autoplayAudioEnabled = !!question?.autoplayAudioEnabled;
- const completeAudioEnabled = !!question?.completeAudioEnabled;
- const requiresAudioCompletion =
- autoplayAudioEnabled && completeAudioEnabled && !!question?.hasAudio;
- if (requiresAudioCompletion && !audioComplete) {
- return false;
- }
- return true;
-};
-
-export const outcome = (question: any, session: any, env: any) =>
+export const outcome = (question: McpbQuestion, session: McpbSession, env: McpbEnv) =>
new Promise((resolve) => {
if (!session || isEmptyObject(session)) {
resolve({
@@ -77,7 +70,7 @@ export const outcome = (question: any, session: any, env: any) =>
resolve({ score, empty: false, traceLog });
});
-export const createDefaultModel = (model: any = {}) => ({
+export const createDefaultModel = (model: McpbQuestion = {}) => ({
...defaults.model,
...model,
layoutLimits: {
@@ -86,13 +79,13 @@ export const createDefaultModel = (model: any = {}) => ({
},
});
-export const normalize = (question: any = {}) => createDefaultModel(question);
+export const normalize = (question: McpbQuestion = {}) => createDefaultModel(question);
-export const normalizeSession = (s: any) => ({ ...s });
+export const normalizeSession = (s: McpbSession): McpbSession => ({ ...s });
-const shouldShuffleChoices = (question: any) => !!question?.shuffle;
+const shouldShuffleChoices = (question: McpbQuestion) => !!question?.shuffle;
-const shouldLockChoices = (question: any, env: any) => {
+const shouldLockChoices = (question: McpbQuestion, env: McpbEnv) => {
if (question?.lockChoiceOrder) return true;
if (env?.['@pie-element']?.lockChoiceOrder) return true;
return env?.role === 'instructor';
@@ -107,28 +100,43 @@ function shuffleArray(items: T[]): T[] {
return out;
}
-const getStoredShuffle = (session: any): string[] =>
+const getStoredShuffle = (session: McpbSession): string[] =>
Array.isArray(session?.data?.shuffledValues)
? session.data.shuffledValues
: Array.isArray(session?.shuffledValues)
? session.shuffledValues
: [];
-const applyShuffledValues = (choices: any[], shuffledValues: string[], choiceKey: string) => {
+const applyShuffledValues = (
+ choices: McpbChoice[],
+ shuffledValues: string[],
+ choiceKey: keyof McpbChoice
+) => {
const orderedChoices = shuffledValues
.map((value) => choices.find((choice) => choice?.[choiceKey] === value))
- .filter(Boolean);
+ .filter((c): c is McpbChoice => !!c);
if (orderedChoices.length === choices.length) {
return orderedChoices;
}
- const orderedValues = new Set(orderedChoices.map((choice: any) => choice[choiceKey]));
+ const orderedValues = new Set(orderedChoices.map((choice) => choice[choiceKey]));
const leftovers = choices.filter((choice) => !orderedValues.has(choice?.[choiceKey]));
return [...orderedChoices, ...leftovers];
};
-const getOrderedChoices = async (question: any, session: any, env: any, updateSession?: any) => {
+type UpdateSessionFn = (
+ id: string,
+ element: string,
+ data: { shuffledValues: string[] }
+) => Promise;
+
+const getOrderedChoices = async (
+ question: McpbQuestion,
+ session: McpbSession,
+ env: McpbEnv,
+ updateSession?: UpdateSessionFn
+) => {
const choices = Array.isArray(question?.choices) ? [...question.choices] : [];
if (!choices.length || !shouldShuffleChoices(question)) {
return choices;
@@ -155,13 +163,18 @@ const getOrderedChoices = async (question: any, session: any, env: any, updateSe
return shuffledChoices;
};
-export const model = async (question: any, session: any, env: any, updateSession?: any) => {
- session = session || {};
- const safeEnv = env || {};
+export const model = async (
+ question: McpbQuestion,
+ session: McpbSession | null,
+ env: McpbEnv | null,
+ updateSession?: UpdateSessionFn
+) => {
+ const safeSession: McpbSession = session || {};
+ const safeEnv: McpbEnv = env || {};
const normalizedQuestion = normalize(question);
- const choices = await getOrderedChoices(normalizedQuestion, session, safeEnv, updateSession);
+ const choices = await getOrderedChoices(normalizedQuestion, safeSession, safeEnv, updateSession);
- const out: any = {
+ const out: Record = {
prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
interactionMode: normalizedQuestion.interactionMode || 'populate_blank',
layoutProfile: normalizedQuestion.layoutProfile || '',
@@ -206,7 +219,7 @@ export const model = async (question: any, session: any, env: any, updateSession
};
if (safeEnv.mode === 'evaluate') {
- const correctness = getCorrectness(normalizedQuestion, session);
+ const correctness = getCorrectness(normalizedQuestion, safeSession);
out.correctness = correctness;
out.responseCorrect = correctness === 'correct';
out.correctChoiceId = normalizedQuestion.correctChoiceId;
@@ -223,7 +236,7 @@ export const model = async (question: any, session: any, env: any, updateSession
return out;
};
-export const createCorrectResponseSession = (question: any, env: any) => {
+export const createCorrectResponseSession = (question: McpbQuestion, env: McpbEnv) => {
return new Promise((resolve) => {
if (env.mode !== 'evaluate' && env.role === 'instructor') {
resolve({
@@ -237,18 +250,18 @@ export const createCorrectResponseSession = (question: any, env: any) => {
});
};
-export const validate = (model: any = {}, _config: any = {}) => {
- const errors: any = {};
+export const validate = (question: McpbQuestion = {}, _config: Record = {}) => {
+ const errors: Record = {};
- if (model.promptEnabled) {
- const p = model.prompt?.trim() || '';
+ if (question.promptEnabled) {
+ const p = question.prompt?.trim() || '';
if (!p || p === '
') {
errors.prompt = 'Prompt is required when prompt is enabled';
}
}
- const interactionMode = model.interactionMode || 'populate_blank';
- const template = model.template || '';
+ const interactionMode = question.interactionMode || 'populate_blank';
+ const template = question.template || '';
const n = countBlankTokens(template);
if (interactionMode === 'audio_mc_only') {
if (n > 0) {
@@ -264,12 +277,12 @@ export const validate = (model: any = {}, _config: any = {}) => {
errors.interactionMode = 'Unknown interaction mode';
}
- const choices = Array.isArray(model.choices) ? model.choices : [];
+ const choices = Array.isArray(question.choices) ? question.choices : [];
if (choices.length < 2) {
errors.choices = 'At least two choices are required';
}
- const mode = model.choiceMode || 'text';
+ const mode = question.choiceMode || 'text';
for (let i = 0; i < choices.length; i++) {
const c = choices[i];
if (!c?.id) {
@@ -294,19 +307,19 @@ export const validate = (model: any = {}, _config: any = {}) => {
}
}
- const correct = model.correctChoiceId;
- if (!correct || !choices.some((c: any) => c.id === correct)) {
+ const correct = question.correctChoiceId;
+ if (!correct || !choices.some((c) => c.id === correct)) {
errors.correctChoiceId = 'Correct choice must match one of the choice ids';
}
- if (model.hasAudio) {
- const hasAudioUrl = !!model.audioUrl?.trim();
+ if (question.hasAudio) {
+ const hasAudioUrl = !!question.audioUrl?.trim();
if (!hasAudioUrl) {
errors.audioUrl = 'A playable audio URL is required when audio is enabled';
}
}
- const limits = model?.layoutLimits;
+ const limits = question?.layoutLimits;
if (limits && typeof limits === 'object') {
const numericLimitKeys = [
'blankStandaloneWidthRem',
@@ -344,9 +357,9 @@ export const validate = (model: any = {}, _config: any = {}) => {
'inlineGridRowGapRem',
'inlineTemplateMarginTopRem',
'inlineChoicesMarginTopRem',
- ];
+ ] as const;
for (const key of numericLimitKeys) {
- if (limits[key] === undefined || limits[key] === null || limits[key] === '') continue;
+ if (limits[key] === undefined || limits[key] === null) continue;
const value = Number(limits[key]);
if (!Number.isFinite(value) || value <= 0) {
errors.layoutLimits = `${key} must be a positive number when provided`;
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/AudioPlayer.svelte b/packages/elements-svelte/mc-populated-blank/src/delivery/AudioPlayer.svelte
new file mode 100644
index 00000000..dfc9cd86
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/AudioPlayer.svelte
@@ -0,0 +1,246 @@
+
+
+{#if audioMode !== 'none'}
+
+ {#if audioMode === 'feature-button'}
+
+
+
+
+
+ {:else if audioMode === 'controls'}
+
+
+
+ {#if autoPlayPromptOpen}
+
+ {uiText.clickToEnableAutoplay}
+
+ {/if}
+ {:else if audioMode === 'error'}
+
{audioErrorMessage}
+ {/if}
+
+{/if}
+
+
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/AudioPlayer.test.ts b/packages/elements-svelte/mc-populated-blank/src/delivery/AudioPlayer.test.ts
new file mode 100644
index 00000000..77c45ba2
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/AudioPlayer.test.ts
@@ -0,0 +1,149 @@
+import { describe, it, expect, afterEach } from 'vitest';
+import { mount, unmount, flushSync } from 'svelte';
+import AudioPlayer from './AudioPlayer.svelte';
+
+const BASE_PROPS = {
+ hasAudio: true,
+ audioUrl: 'https://example.com/audio.mp3',
+ useFeatureButtonAudio: false,
+ autoplayEnabled: false,
+ audioTranscript: 'The word is look.',
+ showVisibleTranscript: false,
+ transcriptId: 'test-transcript',
+ featureAudioSkin: { silentUrl: '', playingUrl: '' },
+ uiText: {
+ clickToEnableAutoplay: 'Click to enable',
+ transcriptLabel: 'Transcript',
+ audioResourceUnavailable: 'Unavailable',
+ listenSilentAlt: 'Repeat instructions',
+ listenPlayingAlt: 'Instructions are playing',
+ listenSilentAltEs: 'Escuchar. Repetir las instrucciones.',
+ listenPlayingAltEs: 'Escuchar. Estas son las instrucciones.',
+ },
+};
+
+function mountPlayer(props: Partial) {
+ const target = document.createElement('div');
+ document.body.appendChild(target);
+ const component = mount(AudioPlayer, { target, props: { ...BASE_PROPS, ...props } });
+ return { target, component };
+}
+
+const mounts: Array<{ target: HTMLElement; component: ReturnType }> = [];
+
+afterEach(() => {
+ for (const { target, component } of mounts.splice(0)) {
+ unmount(component);
+ target.remove();
+ }
+});
+
+describe('AudioPlayer — audio element', () => {
+ it('renders native controls when hasAudio=true and useFeatureButtonAudio=false', () => {
+ const { target, component } = mountPlayer({ useFeatureButtonAudio: false });
+ mounts.push({ target, component });
+ flushSync();
+ expect(target.querySelector('.pie-audio-player')).not.toBeNull();
+ });
+
+ it('renders nothing when hasAudio is false', () => {
+ const { target, component } = mountPlayer({ hasAudio: false });
+ mounts.push({ target, component });
+ flushSync();
+ expect(target.querySelector('.pie-audio-container')).toBeNull();
+ });
+
+ it('renders an error message when hasAudio=true but audioUrl is missing', () => {
+ const { target, component } = mountPlayer({ audioUrl: undefined });
+ mounts.push({ target, component });
+ flushSync();
+ expect(target.querySelector('.pie-audio-error')).not.toBeNull();
+ });
+
+ it('renders the feature button when useFeatureButtonAudio=true', () => {
+ const { target, component } = mountPlayer({ useFeatureButtonAudio: true });
+ mounts.push({ target, component });
+ flushSync();
+ expect(target.querySelector('.pie-listen-button')).not.toBeNull();
+ });
+
+ it('silent image alt is "Repeat instructions" in feature-button mode', () => {
+ const { target, component } = mountPlayer({ useFeatureButtonAudio: true });
+ mounts.push({ target, component });
+ flushSync();
+ const imgs = target.querySelectorAll('.pie-listen-icon');
+ const alts = Array.from(imgs).map((el) => (el as HTMLImageElement).alt);
+ expect(alts).toContain('Repeat instructions');
+ });
+
+ it('playing image alt is "Instructions are playing" in feature-button mode', () => {
+ const { target, component } = mountPlayer({ useFeatureButtonAudio: true });
+ mounts.push({ target, component });
+ flushSync();
+ const imgs = target.querySelectorAll('.pie-listen-icon');
+ const alts = Array.from(imgs).map((el) => (el as HTMLImageElement).alt);
+ expect(alts).toContain('Instructions are playing');
+ });
+});
+
+describe('AudioPlayer — autoplay-blocked prompt', () => {
+ it('shows pie-audio-autoplay-enable when autoplay is blocked by the browser', async () => {
+ // Override HTMLAudioElement.play on the global so all audio elements reject
+ const originalPlay = HTMLMediaElement.prototype.play;
+ HTMLMediaElement.prototype.play = () =>
+ Promise.reject(new DOMException('autoplay blocked', 'NotAllowedError'));
+
+ const { target, component } = mountPlayer({
+ useFeatureButtonAudio: false,
+ autoplayEnabled: true,
+ });
+ mounts.push({ target, component });
+ flushSync();
+
+ // Allow the rejected promise microtask to settle
+ await Promise.resolve();
+ flushSync();
+
+ expect(target.querySelector('.pie-audio-autoplay-enable')).not.toBeNull();
+
+ HTMLMediaElement.prototype.play = originalPlay;
+ });
+
+ it('hides pie-audio-autoplay-enable when autoplay is not blocked', async () => {
+ const originalPlay = HTMLMediaElement.prototype.play;
+ HTMLMediaElement.prototype.play = () => Promise.resolve();
+
+ const { target, component } = mountPlayer({
+ useFeatureButtonAudio: false,
+ autoplayEnabled: true,
+ });
+ mounts.push({ target, component });
+ flushSync();
+ await Promise.resolve();
+ flushSync();
+
+ expect(target.querySelector('.pie-audio-autoplay-enable')).toBeNull();
+
+ HTMLMediaElement.prototype.play = originalPlay;
+ });
+
+ it('pie-audio-autoplay-enable is not rendered in feature-button mode even when autoplay is blocked', async () => {
+ const originalPlay = HTMLMediaElement.prototype.play;
+ HTMLMediaElement.prototype.play = () =>
+ Promise.reject(new DOMException('autoplay blocked', 'NotAllowedError'));
+
+ const { target, component } = mountPlayer({
+ useFeatureButtonAudio: true,
+ autoplayEnabled: true,
+ });
+ mounts.push({ target, component });
+ flushSync();
+ await Promise.resolve();
+ flushSync();
+
+ // Feature-button mode never shows the enable-autoplay prompt
+ expect(target.querySelector('.pie-audio-autoplay-enable')).toBeNull();
+
+ HTMLMediaElement.prototype.play = originalPlay;
+ });
+});
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/ChoiceRow.svelte b/packages/elements-svelte/mc-populated-blank/src/delivery/ChoiceRow.svelte
new file mode 100644
index 00000000..66ee297b
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/ChoiceRow.svelte
@@ -0,0 +1,222 @@
+
+
+
+
+
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/ChoiceRow.test.ts b/packages/elements-svelte/mc-populated-blank/src/delivery/ChoiceRow.test.ts
new file mode 100644
index 00000000..56974cd5
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/ChoiceRow.test.ts
@@ -0,0 +1,179 @@
+import { describe, it, expect, afterEach } from 'vitest';
+import { mount, unmount, flushSync } from 'svelte';
+import ChoiceRow from './ChoiceRow.svelte';
+
+const CHOICE = { id: 'choice-a', labelHtml: 'Look
' };
+const CHOICE_IMG = { id: 'choice-b', imageUrl: 'https://example.com/img.png', imageAlt: 'A cat' };
+
+const BASE = {
+ choice: CHOICE,
+ instanceId: 'test',
+ radioGroupName: 'test-group',
+};
+
+const mounts: Array<{ target: HTMLElement; component: ReturnType }> = [];
+
+function mountRow(props: Record) {
+ const target = document.createElement('div');
+ document.body.appendChild(target);
+ const component = mount(ChoiceRow, { target, props });
+ mounts.push({ target, component });
+ flushSync();
+ return target;
+}
+
+afterEach(() => {
+ for (const { target, component } of mounts.splice(0)) {
+ unmount(component);
+ target.remove();
+ }
+});
+
+describe('ChoiceRow — inline layout (isHorizontal=false)', () => {
+ it('renders a radio input and label for the choice', () => {
+ const target = mountRow({ ...BASE });
+ expect(target.querySelector('input[type="radio"]')).not.toBeNull();
+ expect(target.querySelector('label')).not.toBeNull();
+ });
+
+ it('radio id and label for are paired', () => {
+ const target = mountRow({ ...BASE });
+ const input = target.querySelector('input[type="radio"]') as HTMLInputElement;
+ const label = target.querySelector('label') as HTMLLabelElement;
+ expect(input.id).toBe('test-opt-choice-a');
+ expect(label.htmlFor).toBe('test-opt-choice-a');
+ });
+
+ it('radio has correct name and value', () => {
+ const target = mountRow({ ...BASE });
+ const input = target.querySelector('input[type="radio"]') as HTMLInputElement;
+ expect(input.name).toBe('test-group');
+ expect(input.value).toBe('choice-a');
+ });
+
+ it('radio is not checked when isSelected=false', () => {
+ const target = mountRow({ ...BASE, isSelected: false });
+ const input = target.querySelector('input[type="radio"]') as HTMLInputElement;
+ expect(input.checked).toBe(false);
+ });
+
+ it('radio is checked when isSelected=true', () => {
+ const target = mountRow({ ...BASE, isSelected: true });
+ const input = target.querySelector('input[type="radio"]') as HTMLInputElement;
+ expect(input.checked).toBe(true);
+ });
+
+ it('radio is disabled when isDisabled=true', () => {
+ const target = mountRow({ ...BASE, isDisabled: true });
+ const input = target.querySelector('input[type="radio"]') as HTMLInputElement;
+ expect(input.disabled).toBe(true);
+ });
+
+ it('inline radio has pie-choice-radio-inline class', () => {
+ const target = mountRow({ ...BASE });
+ const input = target.querySelector('input[type="radio"]') as HTMLInputElement;
+ expect(input.classList.contains('pie-choice-radio-inline')).toBe(true);
+ });
+
+ it('renders label html for text choice', () => {
+ const target = mountRow({ ...BASE });
+ expect(target.querySelector('.pie-choice-label')).not.toBeNull();
+ });
+
+ it('renders image for image choice', () => {
+ const target = mountRow({ ...BASE, choice: CHOICE_IMG, choiceMode: 'image' });
+ const img = target.querySelector('img.pie-choice-image') as HTMLImageElement;
+ expect(img).not.toBeNull();
+ expect(img.alt).toBe('A cat');
+ });
+});
+
+describe('ChoiceRow — horizontal layout (isHorizontal=true)', () => {
+ it('wraps radio inside label (tile layout)', () => {
+ const target = mountRow({ ...BASE, isHorizontal: true });
+ const label = target.querySelector('label.pie-choice-tile') as HTMLLabelElement;
+ expect(label).not.toBeNull();
+ expect(label.querySelector('input[type="radio"]')).not.toBeNull();
+ });
+
+ it('radio has pie-choice-radio-bottom class in horizontal mode', () => {
+ const target = mountRow({ ...BASE, isHorizontal: true });
+ const input = target.querySelector('input[type="radio"]') as HTMLInputElement;
+ expect(input.classList.contains('pie-choice-radio-bottom')).toBe(true);
+ });
+
+ it('choice content is inside pie-choice-tile-content', () => {
+ const target = mountRow({ ...BASE, isHorizontal: true });
+ expect(target.querySelector('.pie-choice-tile-content')).not.toBeNull();
+ });
+});
+
+describe('ChoiceRow — CSS state classes', () => {
+ it('applies is-selected and pie-choice-selected when isSelected=true', () => {
+ const target = mountRow({ ...BASE, isSelected: true });
+ const row = target.querySelector('.pie-choice') as HTMLElement;
+ expect(row.classList.contains('is-selected')).toBe(true);
+ expect(row.classList.contains('pie-choice-selected')).toBe(true);
+ });
+
+ it('does not apply selected classes when isSelected=false', () => {
+ const target = mountRow({ ...BASE, isSelected: false });
+ const row = target.querySelector('.pie-choice') as HTMLElement;
+ expect(row.classList.contains('is-selected')).toBe(false);
+ });
+
+ it('applies choice-correct and pie-choice-correct when correctness=correct', () => {
+ const target = mountRow({ ...BASE, correctness: 'correct' });
+ const row = target.querySelector('.pie-choice') as HTMLElement;
+ expect(row.classList.contains('choice-correct')).toBe(true);
+ expect(row.classList.contains('pie-choice-correct')).toBe(true);
+ });
+
+ it('applies choice-incorrect and pie-choice-incorrect when correctness=incorrect', () => {
+ const target = mountRow({ ...BASE, correctness: 'incorrect' });
+ const row = target.querySelector('.pie-choice') as HTMLElement;
+ expect(row.classList.contains('choice-incorrect')).toBe(true);
+ expect(row.classList.contains('pie-choice-incorrect')).toBe(true);
+ });
+
+ it('applies no correctness class when correctness=undefined', () => {
+ const target = mountRow({ ...BASE });
+ const row = target.querySelector('.pie-choice') as HTMLElement;
+ expect(row.classList.contains('choice-correct')).toBe(false);
+ expect(row.classList.contains('choice-incorrect')).toBe(false);
+ });
+});
+
+describe('ChoiceRow — feedback badge', () => {
+ it('renders no badge outside evaluate mode', () => {
+ const target = mountRow({ ...BASE, isEvaluateMode: false, correctness: 'correct' });
+ expect(target.querySelector('.pie-choice-feedback-badge')).toBeNull();
+ });
+
+ it('renders no badge in evaluate mode when correctness is undefined', () => {
+ const target = mountRow({ ...BASE, isEvaluateMode: true, correctness: undefined });
+ expect(target.querySelector('.pie-choice-feedback-badge')).toBeNull();
+ });
+
+ it('renders ✓ badge with pie-choice-feedback-correct in evaluate mode when correct', () => {
+ const target = mountRow({ ...BASE, isEvaluateMode: true, correctness: 'correct' });
+ const badge = target.querySelector('.pie-choice-feedback-badge') as HTMLElement;
+ expect(badge).not.toBeNull();
+ expect(badge.classList.contains('pie-choice-feedback-correct')).toBe(true);
+ expect(badge.textContent?.trim()).toBe('✓');
+ });
+
+ it('renders ✕ badge with pie-choice-feedback-incorrect in evaluate mode when incorrect', () => {
+ const target = mountRow({ ...BASE, isEvaluateMode: true, correctness: 'incorrect' });
+ const badge = target.querySelector('.pie-choice-feedback-badge') as HTMLElement;
+ expect(badge).not.toBeNull();
+ expect(badge.classList.contains('pie-choice-feedback-incorrect')).toBe(true);
+ expect(badge.textContent?.trim()).toBe('✕');
+ });
+
+ it('badge has aria-hidden=true', () => {
+ const target = mountRow({ ...BASE, isEvaluateMode: true, correctness: 'correct' });
+ const badge = target.querySelector('.pie-choice-feedback-badge') as HTMLElement;
+ expect(badge.getAttribute('aria-hidden')).toBe('true');
+ });
+});
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/ClozeMarker.svelte b/packages/elements-svelte/mc-populated-blank/src/delivery/ClozeMarker.svelte
new file mode 100644
index 00000000..3de14eb3
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/ClozeMarker.svelte
@@ -0,0 +1,83 @@
+
+
+
+ {#if choiceMode === 'image' && displayChoice?.imageUrl}
+
+ {:else if displayChoiceLabelHtml}
+ {@html displayChoiceLabelHtml}
+ {:else}
+
+ {/if}
+
+
+
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/ClozeMarker.test.ts b/packages/elements-svelte/mc-populated-blank/src/delivery/ClozeMarker.test.ts
new file mode 100644
index 00000000..6be042d3
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/ClozeMarker.test.ts
@@ -0,0 +1,128 @@
+import { describe, it, expect, afterEach } from 'vitest';
+import { mount, unmount, flushSync } from 'svelte';
+import ClozeMarker from './ClozeMarker.svelte';
+
+const BASE = {
+ blankWidth: '8rem',
+ blankBorderWidth: '2px',
+ ariaLabel: 'Selected answer',
+};
+
+const mounts: Array<{ target: HTMLElement; component: ReturnType }> = [];
+
+function mountSlot(props: Record) {
+ const target = document.createElement('div');
+ document.body.appendChild(target);
+ const component = mount(ClozeMarker, { target, props });
+ mounts.push({ target, component });
+ flushSync();
+ return target;
+}
+
+afterEach(() => {
+ for (const { target, component } of mounts.splice(0)) {
+ unmount(component);
+ target.remove();
+ }
+});
+
+describe('ClozeMarker — ARIA contract', () => {
+ it('renders a span with role=status', () => {
+ const target = mountSlot({ ...BASE });
+ const span = target.querySelector('.pie-blank-slot') as HTMLElement;
+ expect(span.getAttribute('role')).toBe('status');
+ });
+
+ it('has aria-live=polite and aria-atomic=true', () => {
+ const target = mountSlot({ ...BASE });
+ const span = target.querySelector('.pie-blank-slot') as HTMLElement;
+ expect(span.getAttribute('aria-live')).toBe('polite');
+ expect(span.getAttribute('aria-atomic')).toBe('true');
+ });
+
+ it('forwards ariaLabel to aria-label', () => {
+ const target = mountSlot({ ...BASE, ariaLabel: 'Your answer' });
+ const span = target.querySelector('.pie-blank-slot') as HTMLElement;
+ expect(span.getAttribute('aria-label')).toBe('Your answer');
+ });
+});
+
+describe('ClozeMarker — layout props', () => {
+ it('applies blankWidth and blankBorderWidth as inline styles', () => {
+ const target = mountSlot({ ...BASE, blankWidth: '10rem', blankBorderWidth: '4px' });
+ const span = target.querySelector('.pie-blank-slot') as HTMLElement;
+ expect(span.style.width).toBe('10rem');
+ expect(span.style.borderBottomWidth).toBe('4px');
+ });
+
+ it('applies standalone classes when isStandalone=true', () => {
+ const target = mountSlot({ ...BASE, isStandalone: true });
+ const span = target.querySelector('.pie-blank-slot') as HTMLElement;
+ expect(span.classList.contains('cloze-marker-standalone')).toBe(true);
+ expect(span.classList.contains('pie-blank-slot-standalone')).toBe(true);
+ });
+
+ it('does not apply standalone classes when isStandalone=false', () => {
+ const target = mountSlot({ ...BASE, isStandalone: false });
+ const span = target.querySelector('.pie-blank-slot') as HTMLElement;
+ expect(span.classList.contains('cloze-marker-standalone')).toBe(false);
+ });
+});
+
+describe('ClozeMarker — content modes', () => {
+ it('renders empty placeholder when no choice is set', () => {
+ const target = mountSlot({ ...BASE });
+ expect(target.querySelector('.cloze-marker-empty')).not.toBeNull();
+ expect(target.querySelector('.pie-blank-value')).toBeNull();
+ expect(target.querySelector('img')).toBeNull();
+ });
+
+ it('renders text value when displayChoiceLabelHtml is set', () => {
+ const target = mountSlot({ ...BASE, displayChoiceLabelHtml: 'Look
' });
+ expect(target.querySelector('.pie-blank-value')).not.toBeNull();
+ expect(target.querySelector('.cloze-marker-empty')).toBeNull();
+ });
+
+ it('renders image when choiceMode=image and displayChoice has imageUrl', () => {
+ const target = mountSlot({
+ ...BASE,
+ choiceMode: 'image',
+ displayChoice: { imageUrl: 'https://example.com/cat.png', imageAlt: 'A cat' },
+ });
+ const img = target.querySelector('img.pie-blank-image') as HTMLImageElement;
+ expect(img).not.toBeNull();
+ expect(img.alt).toBe('A cat');
+ expect(target.querySelector('.cloze-marker-empty')).toBeNull();
+ });
+
+ it('falls back to empty placeholder when choiceMode=image but imageUrl is missing', () => {
+ const target = mountSlot({
+ ...BASE,
+ choiceMode: 'image',
+ displayChoice: { imageUrl: undefined },
+ });
+ expect(target.querySelector('.cloze-marker-empty')).not.toBeNull();
+ expect(target.querySelector('img')).toBeNull();
+ });
+
+ it('uses fallback alt text when imageAlt is not provided', () => {
+ const target = mountSlot({
+ ...BASE,
+ choiceMode: 'image',
+ displayChoice: { imageUrl: 'https://example.com/img.png' },
+ });
+ const img = target.querySelector('img') as HTMLImageElement;
+ expect(img.alt).toBe('Selected answer image');
+ });
+
+ it('prefers image over text when both choiceMode=image and displayChoiceLabelHtml are set', () => {
+ const target = mountSlot({
+ ...BASE,
+ choiceMode: 'image',
+ displayChoice: { imageUrl: 'https://example.com/img.png', imageAlt: 'Cat' },
+ displayChoiceLabelHtml: 'Look
',
+ });
+ expect(target.querySelector('img')).not.toBeNull();
+ expect(target.querySelector('.pie-blank-value')).toBeNull();
+ });
+});
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/McPopulatedBlank.svelte b/packages/elements-svelte/mc-populated-blank/src/delivery/McPopulatedBlank.svelte
index 0a1ef950..6a29efee 100644
--- a/packages/elements-svelte/mc-populated-blank/src/delivery/McPopulatedBlank.svelte
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/McPopulatedBlank.svelte
@@ -12,78 +12,25 @@
{#if model?.prompt}
{@html model.prompt}
{/if}
+ {#if model?.audioTranscript}
+
+ {model.audioTranscript}
+
+ {/if}
+
{#if shouldShowCorrectAnswerToggle}
{
{/if}
- {#if model?.hasAudio}
-
- {#if hasPlayableAudio && useFeatureButtonAudio}
-
-
-
-
-
- {:else if hasPlayableAudio}
-
-
-
- {#if autoPlayPromptOpen}
-
- {uiText.clickToEnableAutoplay}
-
- {/if}
- {:else if hasAudioButMissingResource}
-
{audioErrorMessage}
- {/if}
- {#if model?.audioTranscript}
-
- {uiText.transcriptLabel}: {model.audioTranscript}
-
- {/if}
-
- {/if}
+
{#if model?.sentenceHtml}
@@ -709,27 +437,15 @@ $effect(() => {
{#if !isAudioOnlyMode}
{@html templateParts.before}
-
- {#if choiceMode === 'image' && displayChoice?.imageUrl}
-
- {:else if displayChoiceLabelHtml}
- {@html displayChoiceLabelHtml}
- {:else}
-
- {/if}
-
+
{@html templateParts.after}
{/if}
@@ -751,74 +467,17 @@ $effect(() => {
aria-describedby={resultText ? resultId : undefined}
>
{#each choices as c (c.id)}
- {@const choiceCorrectness = choiceCorrectnessById.get(c.id)}
-
+
{/each}
@@ -841,19 +500,6 @@ $effect(() => {
max-width: none;
}
- .blank-slot:focus-within {
- outline: 2px solid var(--pie-focus, #2563eb);
- outline-offset: 2px;
- }
-
- .blank-slot {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- text-align: center;
- vertical-align: baseline;
- }
-
.pie-toggle-correct-answer {
width: 100%;
cursor: pointer;
@@ -913,166 +559,8 @@ $effect(() => {
margin: 0;
}
- .blank-inner-empty {
- display: inline-block;
- min-width: 4ch;
- }
-
- .blank-slot-standalone {
- width: var(--mpb-blank-standalone-width, 7rem);
- }
-
- .listen-button {
- width: var(--mpb-listen-button-size, 128px);
- height: var(--mpb-listen-button-size, 128px);
- border: 0;
- padding: 0;
- background-color: transparent;
- cursor: pointer;
- z-index: 1;
- }
-
- .listen-button:hover {
- background-color: #e2f1fe;
- }
-
- .listen-feature-icon {
- width: var(--mpb-listen-button-size, 128px);
- height: var(--mpb-listen-button-size, 128px);
- object-fit: contain;
- display: none;
- }
-
- .listen-feature-icon.listen-active {
- display: block;
- }
-
- .choice-row-horizontal {
- flex-direction: column;
- align-items: center;
- width: min(var(--mpb-choice-width-px, 170px), var(--mpb-choice-width-vw, 30vw));
- gap: 0;
- }
-
- .choice-tile {
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- align-items: center;
- width: 100%;
- min-height: var(--mpb-choice-tile-min-height, 11rem);
- padding: 0.8rem 0.65rem 0.5rem;
- border-radius: 8px;
- background: transparent;
- transition: background-color 120ms ease-in-out;
- }
-
- .choice-tile-content {
- width: 100%;
- display: flex;
- align-items: center;
- justify-content: center;
- min-height: var(--mpb-choice-content-min-height, 7.5rem);
- }
-
- .choice-row-horizontal:hover .choice-tile {
- background: var(--pie-correct-answer-choice-hover-bg, #ececec);
- }
-
- .pie-choice-horizontal:not(.is-selected):not(:hover) .pie-choice-tile {
- background: transparent;
- }
-
- .choice-row-horizontal.is-selected .choice-tile {
- background: var(--pie-correct-answer-choice-selected-bg, #f1f1f1);
- }
-
- .choice-row-horizontal.is-selected:hover .choice-tile {
- background: var(--pie-correct-answer-choice-selected-bg, #f1f1f1);
- }
-
- .pie-choice:not(.pie-choice-horizontal):hover .pie-choice-label-wrap {
- background: var(--pie-correct-answer-choice-hover-bg, #ececec);
- }
-
- .pie-choice:not(.pie-choice-horizontal):not(.is-selected):not(:hover) .pie-choice-label-wrap {
- background: transparent;
- }
-
- .pie-choice:not(.pie-choice-horizontal).is-selected .pie-choice-label-wrap {
- background: var(--pie-correct-answer-choice-selected-bg, #f1f1f1);
- border-radius: 6px;
- }
-
- .pie-choice:not(.pie-choice-horizontal).is-selected:hover .pie-choice-label-wrap {
- background: var(--pie-correct-answer-choice-selected-bg, #f1f1f1);
- }
-
- .pie-choice.choice-correct {
- border-left: 3px solid var(--pie-correct-answer-choice-correct-border, #0ea449);
- }
-
- .pie-choice.choice-incorrect {
- border-left: 3px solid var(--pie-correct-answer-choice-incorrect-border, #bf0d00);
- }
-
- .pie-choice-horizontal.choice-correct .choice-tile {
- background: var(--pie-correct-answer-choice-correct-bg, #e8f5e9);
- }
-
- .pie-choice-horizontal.choice-incorrect .choice-tile {
- background: var(--pie-correct-answer-choice-incorrect-bg, #ffebee);
- }
-
- .pie-choice-feedback-badge {
- margin-left: auto;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- width: 1.1rem;
- height: 1.1rem;
- border-radius: 9999px;
- font-size: 0.72rem;
- line-height: 1;
- font-weight: 700;
- color: var(--pie-correct-answer-feedback-glyph-color, #fff);
- }
-
- .pie-choice-feedback-correct {
- background: var(--pie-correct-answer-feedback-correct-bg, #087d38);
- }
-
- .pie-choice-feedback-incorrect {
- background: var(--pie-correct-answer-feedback-incorrect-bg, #bf0d00);
- }
-
- .choice-row-horizontal :global(p) {
- margin: 0;
- text-align: center;
- }
-
- .choice-html :global(p) {
- margin: 0;
- }
-
- .choice-html {
- width: 100%;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- text-align: center;
- }
-
- .choice-radio-bottom {
- margin-top: var(--mpb-horizontal-choice-radio-top-margin, 0.5rem);
- }
-
- .choice-radio-inline {
- margin-top: var(--mpb-horizontal-choice-radio-top-margin, 0.5rem);
- }
-
- .layout-audio_blank_only .audio-container,
- .layout-stimulus_image_blank .audio-container {
+ .layout-audio_blank_only :global(.pie-audio-container),
+ .layout-stimulus_image_blank :global(.pie-audio-container) {
display: flex;
width: min(100%, var(--mpb-audio-instructions-max-width, 875px));
margin-left: auto;
@@ -1087,16 +575,24 @@ $effect(() => {
var(--mpb-audio-blank-template-margin-bottom, 1.8rem);
}
- .layout-audio_blank_only .blank-slot,
- .layout-stimulus_image_blank .blank-slot {
+ .layout-audio_blank_only fieldset {
+ display: flex;
+ justify-content: center;
+ }
+
+ .layout-audio_blank_only :global(.pie-blank-slot),
+ .layout-stimulus_image_blank :global(.pie-blank-slot) {
width: var(--mpb-blank-wide-width, 10rem);
- border-bottom-width: var(--mpb-blank-underline-wide-width, 4px);
+ border-bottom-width: var(--mpb-blank-underline-wide-width, 6px);
+ min-height: 160px;
+ padding-bottom: 4px;
}
.layout-stimulus_image_blank {
display: grid;
grid-template-columns: minmax(var(--mpb-stimulus-min-column, 210px), 1fr) auto;
grid-template-areas:
+ 'transcript transcript'
'sentence audio'
'. template'
'choices choices';
@@ -1105,7 +601,11 @@ $effect(() => {
align-items: start;
}
- .layout-stimulus_image_blank .audio-container {
+ .layout-stimulus_image_blank .pie-audio-transcript {
+ grid-area: transcript;
+ }
+
+ .layout-stimulus_image_blank :global(.pie-audio-container) {
grid-area: audio;
margin: 0;
}
@@ -1129,16 +629,21 @@ $effect(() => {
.layout-token_sequence {
display: grid;
- grid-template-columns: minmax(var(--mpb-text-min-column, 260px), 1fr) auto;
+ grid-template-columns: 1fr auto;
grid-template-areas:
- 'template audio'
- 'choices choices';
+ 'transcript audio'
+ 'template template'
+ 'choices choices';
column-gap: var(--mpb-token-grid-column-gap, 1.5rem);
row-gap: var(--mpb-token-grid-row-gap, 0.8rem);
align-items: start;
}
- .layout-token_sequence .audio-container {
+ .layout-token_sequence .pie-audio-transcript {
+ grid-area: transcript;
+ }
+
+ .layout-token_sequence :global(.pie-audio-container) {
grid-area: audio;
margin: 0;
justify-self: end;
@@ -1155,7 +660,7 @@ $effect(() => {
margin-left: var(--mpb-token-inline-token-gap, 0.35rem);
}
- .layout-token_sequence .blank-slot {
+ .layout-token_sequence :global(.pie-blank-slot) {
width: var(--mpb-blank-standalone-width, 7rem);
border-bottom-width: var(--mpb-blank-underline-wide-width, 4px);
margin-left: var(--mpb-token-inline-token-gap, 0.35rem);
@@ -1170,6 +675,7 @@ $effect(() => {
display: grid;
grid-template-columns: minmax(var(--mpb-text-min-column, 260px), 1fr) auto;
grid-template-areas:
+ 'transcript transcript'
'template audio'
'choices choices';
column-gap: var(--mpb-inline-grid-column-gap, 1.5rem);
@@ -1177,7 +683,11 @@ $effect(() => {
align-items: start;
}
- .layout-inline_sentence.has-inline-audio .audio-container {
+ .layout-inline_sentence.has-inline-audio .pie-audio-transcript {
+ grid-area: transcript;
+ }
+
+ .layout-inline_sentence.has-inline-audio :global(.pie-audio-container) {
grid-area: audio;
margin: 0;
justify-self: end;
@@ -1198,10 +708,10 @@ $effect(() => {
/* Match Learnosity responsive behavior for CQT audio-blank layouts:
at smaller widths, audio control shifts left and answer tiles stack. */
@media (max-width: 760px) {
- .layout-audio_blank_only .audio-container,
- .layout-stimulus_image_blank .audio-container,
- .layout-token_sequence .audio-container,
- .layout-inline_sentence.has-inline-audio .audio-container {
+ .layout-audio_blank_only :global(.pie-audio-container),
+ .layout-stimulus_image_blank :global(.pie-audio-container),
+ .layout-token_sequence :global(.pie-audio-container),
+ .layout-inline_sentence.has-inline-audio :global(.pie-audio-container) {
width: 100%;
margin-left: 0;
margin-right: 0;
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/McPopulatedBlank.transcript.test.ts b/packages/elements-svelte/mc-populated-blank/src/delivery/McPopulatedBlank.transcript.test.ts
new file mode 100644
index 00000000..81614d2a
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/McPopulatedBlank.transcript.test.ts
@@ -0,0 +1,154 @@
+import { describe, it, expect, afterEach } from 'vitest';
+import { mount, unmount, flushSync } from 'svelte';
+import McPopulatedBlank from './McPopulatedBlank.svelte';
+
+const BASE_MODEL = {
+ id: '1',
+ element: 'mc-populated-blank',
+ template: '
{{blank}}
',
+ choiceMode: 'text',
+ choices: [
+ { id: 'a', labelHtml: 'louk' },
+ { id: 'b', labelHtml: 'lok' },
+ { id: 'c', labelHtml: 'look' },
+ ],
+ correctChoiceId: 'c',
+ hasAudio: true,
+ audioUrl: 'https://example.com/audio.mp3',
+ audioTranscript: 'The word is look. Pick the correct spelling of the word look.',
+ interactionMode: 'populate_blank',
+ sentenceHtml: '',
+ layoutProfile: 'audio_blank_only',
+ customType: 'sel_r1-_plusggg',
+ useFeatureButtonAudio: true,
+ choiceLayout: 'horizontal',
+ autoplayAudioEnabled: false,
+ completeAudioEnabled: false,
+ showVisibleTranscript: false,
+ mode: 'gather',
+};
+
+function mountComponent(modelOverrides: Record
= {}) {
+ const target = document.createElement('div');
+ document.body.appendChild(target);
+ const component = mount(McPopulatedBlank as any, {
+ target,
+ props: { model: { ...BASE_MODEL, ...modelOverrides }, session: {} },
+ });
+ return { target, component };
+}
+
+const mounts: Array<{ target: HTMLElement; component: ReturnType }> = [];
+
+afterEach(() => {
+ for (const { target, component } of mounts.splice(0)) {
+ unmount(component);
+ target.remove();
+ }
+});
+
+describe('McPopulatedBlank — transcript rendering', () => {
+ it('renders transcript in the DOM when audioTranscript is set', () => {
+ const { target, component } = mountComponent();
+ mounts.push({ target, component });
+ flushSync();
+ expect(target.querySelector('.pie-audio-transcript')).not.toBeNull();
+ });
+
+ it('hides transcript with sr-only when showVisibleTranscript is false', () => {
+ const { target, component } = mountComponent({ showVisibleTranscript: false });
+ mounts.push({ target, component });
+ flushSync();
+ const transcript = target.querySelector('.pie-audio-transcript');
+ expect(transcript?.classList.contains('sr-only')).toBe(true);
+ });
+
+ it('shows transcript without sr-only when ancestor has rli-with-audio-transcript class', async () => {
+ const wrapper = document.createElement('div');
+ document.body.appendChild(wrapper);
+ const target = document.createElement('div');
+ wrapper.appendChild(target);
+ const component = mount(McPopulatedBlank as any, {
+ target,
+ props: { model: { ...BASE_MODEL }, session: {} },
+ });
+ mounts.push({ target, component });
+ flushSync();
+
+ wrapper.classList.add('rli-with-audio-transcript');
+ await new Promise((r) => setTimeout(r, 0));
+ flushSync();
+
+ const transcript = target.querySelector('.pie-audio-transcript');
+ expect(transcript?.classList.contains('sr-only')).toBe(false);
+ wrapper.remove();
+ });
+
+ it('transcript text has no label prefix', async () => {
+ const wrapper = document.createElement('div');
+ document.body.appendChild(wrapper);
+ const target = document.createElement('div');
+ wrapper.appendChild(target);
+ const component = mount(McPopulatedBlank as any, {
+ target,
+ props: { model: { ...BASE_MODEL }, session: {} },
+ });
+ mounts.push({ target, component });
+ flushSync();
+
+ wrapper.classList.add('rli-with-audio-transcript');
+ await new Promise((r) => setTimeout(r, 0));
+ flushSync();
+
+ const transcript = target.querySelector('.pie-audio-transcript');
+ expect(transcript?.textContent?.trim()).not.toMatch(/^Transcript:/i);
+ wrapper.remove();
+ });
+
+ it('transcript contains the audioTranscript text', () => {
+ const { target, component } = mountComponent();
+ mounts.push({ target, component });
+ flushSync();
+ const transcript = target.querySelector('.pie-audio-transcript');
+ expect(transcript?.textContent).toContain(BASE_MODEL.audioTranscript);
+ });
+
+ it('omits transcript element when audioTranscript is empty', () => {
+ const { target, component } = mountComponent({ audioTranscript: '' });
+ mounts.push({ target, component });
+ flushSync();
+ expect(target.querySelector('.pie-audio-transcript')).toBeNull();
+ });
+
+ it('transcript renders before the first choice tile', () => {
+ const { target, component } = mountComponent();
+ mounts.push({ target, component });
+ flushSync();
+ const all = Array.from(target.querySelectorAll('.pie-audio-transcript, .pie-choice'));
+ expect(all[0].classList.contains('pie-audio-transcript')).toBe(true);
+ });
+
+ it('shows transcript when ancestor gains rli-with-audio-transcript class', async () => {
+ const wrapper = document.createElement('div');
+ document.body.appendChild(wrapper);
+ const target = document.createElement('div');
+ wrapper.appendChild(target);
+ const component = mount(McPopulatedBlank as any, {
+ target,
+ props: { model: { ...BASE_MODEL, showVisibleTranscript: false }, session: {} },
+ });
+ mounts.push({ target, component });
+ flushSync();
+
+ const transcript = target.querySelector('.pie-audio-transcript');
+ expect(transcript?.classList.contains('sr-only')).toBe(true);
+
+ wrapper.classList.add('rli-with-audio-transcript');
+ // Allow MutationObserver microtask to fire
+ await new Promise((r) => setTimeout(r, 0));
+ flushSync();
+
+ expect(transcript?.classList.contains('sr-only')).toBe(false);
+ wrapper.remove();
+ });
+});
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/computeAudioMode.test.ts b/packages/elements-svelte/mc-populated-blank/src/delivery/computeAudioMode.test.ts
new file mode 100644
index 00000000..2456e923
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/computeAudioMode.test.ts
@@ -0,0 +1,40 @@
+import { describe, expect, it } from 'vitest';
+import { computeAudioMode } from './computeAudioMode';
+
+describe('computeAudioMode', () => {
+ it('C1: no audio → none regardless of audioUrl', () => {
+ expect(
+ computeAudioMode({
+ hasAudio: false,
+ audioUrl: 'http://example.com/a.mp3',
+ useFeatureButtonAudio: true,
+ })
+ ).toBe('none');
+ });
+
+ it('C2: audio enabled but no audioUrl → error', () => {
+ expect(
+ computeAudioMode({ hasAudio: true, audioUrl: undefined, useFeatureButtonAudio: false })
+ ).toBe('error');
+ });
+
+ it('C3: audio enabled, url present, feature button → feature-button', () => {
+ expect(
+ computeAudioMode({
+ hasAudio: true,
+ audioUrl: 'http://example.com/a.mp3',
+ useFeatureButtonAudio: true,
+ })
+ ).toBe('feature-button');
+ });
+
+ it('C4: audio enabled, url present, no feature button → controls', () => {
+ expect(
+ computeAudioMode({
+ hasAudio: true,
+ audioUrl: 'http://example.com/a.mp3',
+ useFeatureButtonAudio: false,
+ })
+ ).toBe('controls');
+ });
+});
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/computeAudioMode.ts b/packages/elements-svelte/mc-populated-blank/src/delivery/computeAudioMode.ts
new file mode 100644
index 00000000..be3f8910
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/computeAudioMode.ts
@@ -0,0 +1,11 @@
+export type AudioMode = 'feature-button' | 'controls' | 'error' | 'none';
+
+export function computeAudioMode(params: {
+ hasAudio: boolean;
+ audioUrl: string | undefined;
+ useFeatureButtonAudio: boolean;
+}): AudioMode {
+ if (!params.hasAudio) return 'none';
+ if (!params.audioUrl) return 'error';
+ return params.useFeatureButtonAudio ? 'feature-button' : 'controls';
+}
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/computeChoiceCorrectness.test.ts b/packages/elements-svelte/mc-populated-blank/src/delivery/computeChoiceCorrectness.test.ts
new file mode 100644
index 00000000..a9daf04a
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/computeChoiceCorrectness.test.ts
@@ -0,0 +1,120 @@
+/**
+ * Unit tests for computeChoiceCorrectness.
+ *
+ * This is the harness for extracting the choiceCorrectnessById state machine
+ * from McPopulatedBlank.svelte. The function takes five pure inputs and returns
+ * a Map — no component rendering required.
+ *
+ * Cases:
+ * C1. Not evaluate mode → empty map
+ * C2. Evaluate mode, no correctChoiceId → empty map
+ * C3. Reveal active, student chose correctly → { correctId: 'correct' } only
+ * C4. Reveal active, student chose wrong → { correctId: 'correct' } only (student badge suppressed)
+ * C5. Evaluate, unanswered → { correctId: 'incorrect' }
+ * C6. Evaluate, student chose correctly → { correctId: 'correct' }
+ * C7. Evaluate, student chose wrong → { studentId: 'incorrect', correctId: 'incorrect' }
+ * C8. Empty-string ids treated as "no selection" → C5 path, not C7
+ */
+
+import { describe, expect, it } from 'vitest';
+import { computeChoiceCorrectness } from './computeChoiceCorrectness';
+
+describe('computeChoiceCorrectness', () => {
+ // C1 — not in evaluate mode: no badges regardless of selection
+ it('C1: returns empty map when not in evaluate mode', () => {
+ const result = computeChoiceCorrectness({
+ isEvaluateMode: false,
+ correctChoiceId: 'choice-a',
+ selectedId: 'choice-b',
+ showCorrectAnswer: false,
+ });
+ expect(result.size).toBe(0);
+ });
+
+ // C2 — evaluate mode but no correct answer defined: nothing to badge
+ it('C2: returns empty map when correctChoiceId is absent', () => {
+ const result = computeChoiceCorrectness({
+ isEvaluateMode: true,
+ correctChoiceId: '',
+ selectedId: 'choice-b',
+ showCorrectAnswer: false,
+ });
+ expect(result.size).toBe(0);
+ });
+
+ // C3 — reveal active, student answered correctly: only the correct badge
+ it('C3: reveal active + correct selection → correct badge on correct choice only', () => {
+ const result = computeChoiceCorrectness({
+ isEvaluateMode: true,
+ correctChoiceId: 'choice-a',
+ selectedId: 'choice-a',
+ showCorrectAnswer: true,
+ });
+ expect(result.size).toBe(1);
+ expect(result.get('choice-a')).toBe('correct');
+ });
+
+ // C4 — reveal active, student chose wrong: correct badge only, student's badge suppressed
+ it('C4: reveal active + wrong selection → correct badge only, student choice suppressed', () => {
+ const result = computeChoiceCorrectness({
+ isEvaluateMode: true,
+ correctChoiceId: 'choice-a',
+ selectedId: 'choice-b',
+ showCorrectAnswer: true,
+ });
+ expect(result.size).toBe(1);
+ expect(result.get('choice-a')).toBe('correct');
+ expect(result.has('choice-b')).toBe(false);
+ });
+
+ // C5 — evaluate mode, student did not answer: flag the correct choice as missed
+ it('C5: unanswered in evaluate mode → correct choice marked incorrect (missed)', () => {
+ const result = computeChoiceCorrectness({
+ isEvaluateMode: true,
+ correctChoiceId: 'choice-a',
+ selectedId: '',
+ showCorrectAnswer: false,
+ });
+ expect(result.size).toBe(1);
+ expect(result.get('choice-a')).toBe('incorrect');
+ });
+
+ // C6 — evaluate mode, student chose the right answer
+ it('C6: correct selection in evaluate mode → correct badge on correct choice', () => {
+ const result = computeChoiceCorrectness({
+ isEvaluateMode: true,
+ correctChoiceId: 'choice-a',
+ selectedId: 'choice-a',
+ showCorrectAnswer: false,
+ });
+ expect(result.size).toBe(1);
+ expect(result.get('choice-a')).toBe('correct');
+ });
+
+ // C7 — evaluate mode, student chose the wrong answer: both choices badged incorrect
+ it('C7: wrong selection in evaluate mode → student choice and correct choice both marked incorrect', () => {
+ const result = computeChoiceCorrectness({
+ isEvaluateMode: true,
+ correctChoiceId: 'choice-a',
+ selectedId: 'choice-b',
+ showCorrectAnswer: false,
+ });
+ expect(result.size).toBe(2);
+ expect(result.get('choice-b')).toBe('incorrect');
+ expect(result.get('choice-a')).toBe('incorrect');
+ });
+
+ // C8 — both ids are empty strings: empty selectedId is "no selection", not a wrong answer
+ it('C8: empty-string selectedId is treated as unanswered (C5 path), not wrong answer (C7 path)', () => {
+ const result = computeChoiceCorrectness({
+ isEvaluateMode: true,
+ correctChoiceId: 'choice-a',
+ selectedId: '',
+ showCorrectAnswer: false,
+ });
+ // Must be C5 (size 1, correct choice marked incorrect) not C7 (size 2)
+ expect(result.size).toBe(1);
+ expect(result.get('choice-a')).toBe('incorrect');
+ expect(result.has('')).toBe(false);
+ });
+});
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/computeChoiceCorrectness.ts b/packages/elements-svelte/mc-populated-blank/src/delivery/computeChoiceCorrectness.ts
new file mode 100644
index 00000000..9ee5a828
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/computeChoiceCorrectness.ts
@@ -0,0 +1,42 @@
+export interface ChoiceCorrectnessParams {
+ isEvaluateMode: boolean;
+ correctChoiceId: string;
+ selectedId: string;
+ showCorrectAnswer: boolean;
+}
+
+/**
+ * Computes which choice ids should display a correctness badge and what kind.
+ *
+ * Reveal mode (showCorrectAnswer=true) shows only the canonical correct answer —
+ * the student's wrong selection is deliberately suppressed so the UI only
+ * highlights what to remember, not what to regret.
+ *
+ * Unanswered-in-evaluate (selectedId='') treats the correct choice as missed
+ * (incorrect badge) rather than triggering the two-badge wrong-answer path.
+ */
+export function computeChoiceCorrectness(
+ params: ChoiceCorrectnessParams
+): Map {
+ const map = new Map();
+ const { isEvaluateMode, correctChoiceId, selectedId, showCorrectAnswer } = params;
+
+ if (!isEvaluateMode || !correctChoiceId) {
+ return map;
+ }
+ if (showCorrectAnswer) {
+ map.set(correctChoiceId, 'correct');
+ return map;
+ }
+ if (!selectedId) {
+ map.set(correctChoiceId, 'incorrect');
+ return map;
+ }
+ if (selectedId === correctChoiceId) {
+ map.set(correctChoiceId, 'correct');
+ return map;
+ }
+ map.set(selectedId, 'incorrect');
+ map.set(correctChoiceId, 'incorrect');
+ return map;
+}
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/computeDisplayState.test.ts b/packages/elements-svelte/mc-populated-blank/src/delivery/computeDisplayState.test.ts
new file mode 100644
index 00000000..0a4062b3
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/computeDisplayState.test.ts
@@ -0,0 +1,274 @@
+/**
+ * Unit tests for computeDisplayState.
+ *
+ * computeFeatureAudioSkin
+ * A1. No locale, no overrides → default English skin
+ * A2. Spanish locale (es-MX) → built-in es skin
+ * A3. Exact locale match in byLocale → that skin
+ * A4. No exact match, lang prefix match (es) → lang skin
+ * A5. byLocale.default when no locale/lang match → byLocale.default skin
+ * A6. customSingle fallback when byLocale empty → customSingle
+ * A7. byLocale.default wins over customSingle
+ *
+ * computeDisplayChoiceId
+ * D1. Normal gather: returns selectedId
+ * D2. alwaysShowCorrect=true: returns correctChoiceId regardless
+ * D3. alwaysShowCorrect=true, no correctChoiceId: returns selectedId
+ * D4. evaluate + showCorrectAnswer=true: returns correctChoiceId
+ * D5. evaluate + showCorrectAnswer=false: returns selectedId
+ * D6. Not evaluate + showCorrectAnswer=true: returns selectedId (not overridden outside evaluate)
+ *
+ * computeResultText
+ * R1. Not evaluate mode → empty string
+ * R2. Evaluate + showCorrectAnswer=true → empty string (suppressed while reveal active)
+ * R3. Evaluate + correct → 'Correct answer selected'
+ * R4. Evaluate + incorrect + has selection → 'Incorrect answer selected'
+ * R5. Evaluate + incorrect + no selection → empty string (unanswered, no message)
+ * R6. Evaluate + unanswered (not correct, not incorrect) → empty string
+ *
+ * computeLegendText
+ * L1. Plain text prompt under limit → prompt text as-is
+ * L2. HTML prompt → tags stripped
+ * L3. Prompt over legendMaxChars → truncated with ellipsis
+ * L4. Empty prompt → answerChoicesLabel fallback
+ * L5. legendMaxChars < 8 → clamped to 8 before truncation
+ * L6. Whitespace-only prompt (after strip) → fallback
+ */
+
+import { describe, expect, it } from 'vitest';
+import {
+ computeFeatureAudioSkin,
+ computeDisplayChoiceId,
+ computeResultText,
+ computeLegendText,
+ DEFAULT_AUDIO_BUTTON_SKINS,
+} from './computeDisplayState';
+
+const CUSTOM_SKIN = {
+ silentUrl: 'https://example.com/s.svg',
+ playingUrl: 'https://example.com/p.svg',
+};
+const BY_LOCALE_SKIN = {
+ silentUrl: 'https://example.com/l.svg',
+ playingUrl: 'https://example.com/lp.svg',
+};
+
+// ---------------------------------------------------------------------------
+// computeFeatureAudioSkin
+// ---------------------------------------------------------------------------
+
+describe('computeFeatureAudioSkin', () => {
+ it('A1: no locale, no overrides → default English skin', () => {
+ const result = computeFeatureAudioSkin({
+ locale: '',
+ audioButtonSkin: null,
+ audioButtonSkinsByLocale: {},
+ });
+ expect(result).toEqual(DEFAULT_AUDIO_BUTTON_SKINS.default);
+ });
+
+ it('A2: Spanish locale (es-MX) → built-in es skin', () => {
+ const result = computeFeatureAudioSkin({
+ locale: 'es-MX',
+ audioButtonSkin: null,
+ audioButtonSkinsByLocale: {},
+ });
+ expect(result).toEqual(DEFAULT_AUDIO_BUTTON_SKINS.es);
+ });
+
+ it('A3: exact locale match in byLocale → that skin', () => {
+ const result = computeFeatureAudioSkin({
+ locale: 'fr-CA',
+ audioButtonSkin: null,
+ audioButtonSkinsByLocale: { 'fr-ca': BY_LOCALE_SKIN },
+ });
+ expect(result).toEqual(BY_LOCALE_SKIN);
+ });
+
+ it('A4: no exact match, lang prefix match → lang skin', () => {
+ const frSkin = { silentUrl: 'fr-s', playingUrl: 'fr-p' };
+ const result = computeFeatureAudioSkin({
+ locale: 'fr-CA',
+ audioButtonSkin: null,
+ audioButtonSkinsByLocale: { fr: frSkin },
+ });
+ expect(result).toEqual(frSkin);
+ });
+
+ it('A5: byLocale.default when no locale/lang match → byLocale.default', () => {
+ const defaultOverride = { silentUrl: 'def-s', playingUrl: 'def-p' };
+ const result = computeFeatureAudioSkin({
+ locale: 'de',
+ audioButtonSkin: null,
+ audioButtonSkinsByLocale: { default: defaultOverride },
+ });
+ expect(result).toEqual(defaultOverride);
+ });
+
+ it('A6: customSingle fallback when byLocale empty', () => {
+ const result = computeFeatureAudioSkin({
+ locale: '',
+ audioButtonSkin: CUSTOM_SKIN,
+ audioButtonSkinsByLocale: {},
+ });
+ expect(result).toEqual(CUSTOM_SKIN);
+ });
+
+ it('A7: byLocale.default wins over customSingle', () => {
+ const defaultOverride = { silentUrl: 'def-s', playingUrl: 'def-p' };
+ const result = computeFeatureAudioSkin({
+ locale: '',
+ audioButtonSkin: CUSTOM_SKIN,
+ audioButtonSkinsByLocale: { default: defaultOverride },
+ });
+ expect(result).toEqual(defaultOverride);
+ });
+});
+
+// ---------------------------------------------------------------------------
+// computeDisplayChoiceId
+// ---------------------------------------------------------------------------
+
+describe('computeDisplayChoiceId', () => {
+ const base = {
+ selectedId: 'a',
+ isEvaluateMode: false,
+ showCorrectAnswer: false,
+ alwaysShowCorrect: false,
+ correctChoiceId: 'b',
+ };
+
+ it('D1: gather mode → selectedId', () => {
+ expect(computeDisplayChoiceId({ ...base })).toBe('a');
+ });
+
+ it('D2: alwaysShowCorrect=true → correctChoiceId', () => {
+ expect(computeDisplayChoiceId({ ...base, alwaysShowCorrect: true })).toBe('b');
+ });
+
+ it('D3: alwaysShowCorrect=true, no correctChoiceId → selectedId', () => {
+ expect(computeDisplayChoiceId({ ...base, alwaysShowCorrect: true, correctChoiceId: '' })).toBe(
+ 'a'
+ );
+ });
+
+ it('D4: evaluate + showCorrectAnswer=true → correctChoiceId', () => {
+ expect(computeDisplayChoiceId({ ...base, isEvaluateMode: true, showCorrectAnswer: true })).toBe(
+ 'b'
+ );
+ });
+
+ it('D5: evaluate + showCorrectAnswer=false → selectedId', () => {
+ expect(
+ computeDisplayChoiceId({ ...base, isEvaluateMode: true, showCorrectAnswer: false })
+ ).toBe('a');
+ });
+
+ it('D6: not evaluate + showCorrectAnswer=true → selectedId (not overridden)', () => {
+ expect(
+ computeDisplayChoiceId({ ...base, isEvaluateMode: false, showCorrectAnswer: true })
+ ).toBe('a');
+ });
+});
+
+// ---------------------------------------------------------------------------
+// computeResultText
+// ---------------------------------------------------------------------------
+
+describe('computeResultText', () => {
+ const base = {
+ isEvaluateMode: true,
+ showCorrectAnswer: false,
+ isCorrect: false,
+ isIncorrect: false,
+ selectedId: '',
+ };
+
+ it('R1: not evaluate mode → empty string', () => {
+ expect(computeResultText({ ...base, isEvaluateMode: false })).toBe('');
+ });
+
+ it('R2: evaluate + showCorrectAnswer=true → empty string', () => {
+ expect(computeResultText({ ...base, isCorrect: true, showCorrectAnswer: true })).toBe('');
+ });
+
+ it('R3: evaluate + correct → Correct answer selected', () => {
+ expect(computeResultText({ ...base, isCorrect: true })).toBe('Correct answer selected');
+ });
+
+ it('R4: evaluate + incorrect + has selection → Incorrect answer selected', () => {
+ expect(computeResultText({ ...base, isIncorrect: true, selectedId: 'a' })).toBe(
+ 'Incorrect answer selected'
+ );
+ });
+
+ it('R5: evaluate + incorrect + no selection → empty string', () => {
+ expect(computeResultText({ ...base, isIncorrect: true, selectedId: '' })).toBe('');
+ });
+
+ it('R6: evaluate + unanswered (neither correct nor incorrect) → empty string', () => {
+ expect(computeResultText({ ...base })).toBe('');
+ });
+});
+
+// ---------------------------------------------------------------------------
+// computeLegendText
+// ---------------------------------------------------------------------------
+
+describe('computeLegendText', () => {
+ it('L1: plain text prompt under limit → prompt text', () => {
+ expect(
+ computeLegendText({
+ prompt: 'Choose the word',
+ legendMaxChars: 40,
+ answerChoicesLabel: 'Choices',
+ })
+ ).toBe('Choose the word');
+ });
+
+ it('L2: HTML prompt → tags stripped', () => {
+ expect(
+ computeLegendText({
+ prompt: 'Choose the word
',
+ legendMaxChars: 40,
+ answerChoicesLabel: 'Choices',
+ })
+ ).toBe('Choose the word');
+ });
+
+ it('L3: prompt over legendMaxChars → truncated with ellipsis', () => {
+ const result = computeLegendText({
+ prompt: 'Choose the correct spelling',
+ legendMaxChars: 10,
+ answerChoicesLabel: 'Choices',
+ });
+ expect(result.length).toBeLessThanOrEqual(10);
+ expect(result.endsWith('…')).toBe(true);
+ });
+
+ it('L4: empty prompt → answerChoicesLabel fallback', () => {
+ expect(
+ computeLegendText({ prompt: '', legendMaxChars: 40, answerChoicesLabel: 'Answer choices' })
+ ).toBe('Answer choices');
+ });
+
+ it('L5: legendMaxChars below 8 → clamped, no crash', () => {
+ const result = computeLegendText({
+ prompt: 'Hi there friend',
+ legendMaxChars: 2,
+ answerChoicesLabel: 'Choices',
+ });
+ expect(result.endsWith('…')).toBe(true);
+ expect(result.length).toBeGreaterThan(0);
+ });
+
+ it('L6: whitespace-only HTML prompt → fallback', () => {
+ expect(
+ computeLegendText({
+ prompt: '
',
+ legendMaxChars: 40,
+ answerChoicesLabel: 'Answer choices',
+ })
+ ).toBe('Answer choices');
+ });
+});
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/computeDisplayState.ts b/packages/elements-svelte/mc-populated-blank/src/delivery/computeDisplayState.ts
new file mode 100644
index 00000000..ac4fc797
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/computeDisplayState.ts
@@ -0,0 +1,101 @@
+export type AudioButtonSkin = { silentUrl: string; playingUrl: string };
+
+export const DEFAULT_AUDIO_BUTTON_SKINS: Record = {
+ default: {
+ silentUrl:
+ 'https://assets.learnosity.com/organisations/844/0c9f2aa3-3cd5-4de7-93ef-541c24ca35da.svg',
+ playingUrl:
+ 'https://assets.learnosity.com/organisations/844/231dfdc2-c113-4be5-91fb-e75a0ca5994b.svg',
+ },
+ es: {
+ silentUrl:
+ 'https://assets.learnosity.com/organisations/844/27a9d5b5-d873-4bd5-b9ba-22748782d8ba.svg',
+ playingUrl:
+ 'https://assets.learnosity.com/organisations/844/120f216d-96b7-4560-94b8-1d90710216b7.svg',
+ },
+};
+
+/**
+ * Resolves the audio button skin to display.
+ * Priority: byLocale[exact] > byLocale[lang] > byLocale.default > customSingle > built-in default
+ */
+export function computeFeatureAudioSkin(params: {
+ locale: unknown;
+ audioButtonSkin: unknown;
+ audioButtonSkinsByLocale: unknown;
+}): AudioButtonSkin {
+ const locale = String(params.locale || '').toLowerCase();
+ const lang = locale.slice(0, 2);
+ const byLocale =
+ params.audioButtonSkinsByLocale && typeof params.audioButtonSkinsByLocale === 'object'
+ ? (params.audioButtonSkinsByLocale as Record)
+ : {};
+ const customSingle =
+ params.audioButtonSkin && typeof params.audioButtonSkin === 'object'
+ ? (params.audioButtonSkin as AudioButtonSkin)
+ : null;
+ const defaultSkin = locale.startsWith('es')
+ ? DEFAULT_AUDIO_BUTTON_SKINS.es
+ : DEFAULT_AUDIO_BUTTON_SKINS.default;
+ return (byLocale[locale] ||
+ byLocale[lang] ||
+ byLocale.default ||
+ customSingle ||
+ defaultSkin) as AudioButtonSkin;
+}
+
+/**
+ * Returns the choice id that the ClozeMarker and selected-state highlight should display.
+ * When the correct answer is revealed (alwaysShowCorrect or evaluate+showCorrectAnswer),
+ * it shows the correct choice rather than the student's selection.
+ */
+export function computeDisplayChoiceId(params: {
+ selectedId: string;
+ isEvaluateMode: boolean;
+ showCorrectAnswer: boolean;
+ alwaysShowCorrect: boolean;
+ correctChoiceId: string;
+}): string {
+ const { selectedId, isEvaluateMode, showCorrectAnswer, alwaysShowCorrect, correctChoiceId } =
+ params;
+ if (alwaysShowCorrect && correctChoiceId) return correctChoiceId;
+ if (isEvaluateMode && showCorrectAnswer && correctChoiceId) return correctChoiceId;
+ return selectedId;
+}
+
+/**
+ * Returns the screen-reader-only result announcement text shown after evaluate mode scoring.
+ * Empty string means nothing is announced.
+ */
+export function computeResultText(params: {
+ isEvaluateMode: boolean;
+ showCorrectAnswer: boolean;
+ isCorrect: boolean;
+ isIncorrect: boolean;
+ selectedId: string;
+}): string {
+ const { isEvaluateMode, showCorrectAnswer, isCorrect, isIncorrect, selectedId } = params;
+ if (!isEvaluateMode || showCorrectAnswer) return '';
+ if (isCorrect) return 'Correct answer selected';
+ if (isIncorrect && selectedId) return 'Incorrect answer selected';
+ return '';
+}
+
+/**
+ * Returns the visible legend text for the choices fieldset.
+ * Strips HTML, truncates to legendMaxChars with an ellipsis, falls back to answerChoicesLabel.
+ */
+export function computeLegendText(params: {
+ prompt: string;
+ legendMaxChars: number;
+ answerChoicesLabel: string;
+}): string {
+ const { prompt, legendMaxChars, answerChoicesLabel } = params;
+ const plain = prompt
+ .replace(/<[^>]+>/g, ' ')
+ .replace(/\s+/g, ' ')
+ .trim();
+ const maxChars = Math.max(8, legendMaxChars);
+ if (!plain) return answerChoicesLabel;
+ return plain.length > maxChars ? `${plain.slice(0, Math.max(1, maxChars - 1))}…` : plain;
+}
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/computeLayoutProfile.test.ts b/packages/elements-svelte/mc-populated-blank/src/delivery/computeLayoutProfile.test.ts
new file mode 100644
index 00000000..bf74dd73
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/computeLayoutProfile.test.ts
@@ -0,0 +1,163 @@
+import { describe, it, expect } from 'vitest';
+import { computeLayoutProfile } from './computeLayoutProfile';
+
+describe('computeLayoutProfile — isAudioOnlyMode', () => {
+ it('is true when interactionMode is audio_mc_only', () => {
+ const { isAudioOnlyMode } = computeLayoutProfile({ interactionMode: 'audio_mc_only' });
+ expect(isAudioOnlyMode).toBe(true);
+ });
+
+ it('is false for any other interactionMode', () => {
+ expect(computeLayoutProfile({ interactionMode: 'populate_blank' }).isAudioOnlyMode).toBe(false);
+ expect(computeLayoutProfile({ interactionMode: '' }).isAudioOnlyMode).toBe(false);
+ expect(computeLayoutProfile({}).isAudioOnlyMode).toBe(false);
+ });
+});
+
+describe('computeLayoutProfile — isBlankOnlyTemplate', () => {
+ it('is true when template contains only the blank token', () => {
+ expect(computeLayoutProfile({ template: '{{blank}}' }).isBlankOnlyTemplate).toBe(true);
+ });
+
+ it('is true when blank token is wrapped in HTML tags', () => {
+ expect(computeLayoutProfile({ template: '{{blank}}
' }).isBlankOnlyTemplate).toBe(true);
+ });
+
+ it('is true when blank token is surrounded by whitespace after stripping', () => {
+ expect(computeLayoutProfile({ template: ' {{blank}}
' }).isBlankOnlyTemplate).toBe(
+ true
+ );
+ });
+
+ it('is true when template contains around the token', () => {
+ expect(computeLayoutProfile({ template: ' {{blank}} ' }).isBlankOnlyTemplate).toBe(
+ true
+ );
+ });
+
+ it('is false when template has text before the blank token', () => {
+ expect(computeLayoutProfile({ template: 'The word is {{blank}}.' }).isBlankOnlyTemplate).toBe(
+ false
+ );
+ });
+
+ it('is false when template has text after the blank token', () => {
+ expect(
+ computeLayoutProfile({ template: '{{blank}} is the answer.
' }).isBlankOnlyTemplate
+ ).toBe(false);
+ });
+
+ it('is false for empty template', () => {
+ expect(computeLayoutProfile({ template: '' }).isBlankOnlyTemplate).toBe(false);
+ expect(computeLayoutProfile({}).isBlankOnlyTemplate).toBe(false);
+ });
+});
+
+describe('computeLayoutProfile — choiceLayout and isHorizontalChoices', () => {
+ it('uses configured choiceLayout=horizontal when provided', () => {
+ const r = computeLayoutProfile({ choiceLayout: 'horizontal' });
+ expect(r.choiceLayout).toBe('horizontal');
+ expect(r.isHorizontalChoices).toBe(true);
+ });
+
+ it('uses configured choiceLayout=vertical when provided', () => {
+ const r = computeLayoutProfile({ choiceLayout: 'vertical' });
+ expect(r.choiceLayout).toBe('vertical');
+ expect(r.isHorizontalChoices).toBe(false);
+ });
+
+ it('defaults to horizontal when isAudioOnlyMode is true and no choiceLayout configured', () => {
+ const r = computeLayoutProfile({ interactionMode: 'audio_mc_only' });
+ expect(r.choiceLayout).toBe('horizontal');
+ expect(r.isHorizontalChoices).toBe(true);
+ });
+
+ it('defaults to horizontal when isBlankOnlyTemplate is true and no choiceLayout configured', () => {
+ const r = computeLayoutProfile({ template: '{{blank}}
' });
+ expect(r.choiceLayout).toBe('horizontal');
+ expect(r.isHorizontalChoices).toBe(true);
+ });
+
+ it('defaults to vertical for a normal sentence template', () => {
+ const r = computeLayoutProfile({ template: 'The word is {{blank}}.
' });
+ expect(r.choiceLayout).toBe('vertical');
+ expect(r.isHorizontalChoices).toBe(false);
+ });
+
+ it('configured choiceLayout overrides audio-only default', () => {
+ const r = computeLayoutProfile({ interactionMode: 'audio_mc_only', choiceLayout: 'vertical' });
+ expect(r.choiceLayout).toBe('vertical');
+ });
+});
+
+describe('computeLayoutProfile — hasInlineSentenceAudioLayout', () => {
+ it('is true when layoutProfile is inline_sentence and hasAudio is true', () => {
+ const r = computeLayoutProfile({ layoutProfile: 'inline_sentence', hasAudio: true });
+ expect(r.hasInlineSentenceAudioLayout).toBe(true);
+ });
+
+ it('is false when layoutProfile is inline_sentence but hasAudio is false', () => {
+ const r = computeLayoutProfile({ layoutProfile: 'inline_sentence', hasAudio: false });
+ expect(r.hasInlineSentenceAudioLayout).toBe(false);
+ });
+
+ it('is false for other profiles even when hasAudio is true', () => {
+ expect(
+ computeLayoutProfile({ layoutProfile: 'audio_blank_only', hasAudio: true })
+ .hasInlineSentenceAudioLayout
+ ).toBe(false);
+ expect(
+ computeLayoutProfile({ layoutProfile: '', hasAudio: true }).hasInlineSentenceAudioLayout
+ ).toBe(false);
+ });
+});
+
+describe('computeLayoutProfile — useFeatureButtonAudio', () => {
+ it('uses explicit boolean true when configured', () => {
+ const r = computeLayoutProfile({ useFeatureButtonAudio: true, hasAudio: false });
+ expect(r.useFeatureButtonAudio).toBe(true);
+ });
+
+ it('uses explicit boolean false when configured', () => {
+ const r = computeLayoutProfile({
+ useFeatureButtonAudio: false,
+ hasAudio: true,
+ layoutProfile: 'audio_blank_only',
+ });
+ expect(r.useFeatureButtonAudio).toBe(false);
+ });
+
+ it('derives true for audio_blank_only profile with hasAudio=true', () => {
+ const r = computeLayoutProfile({ layoutProfile: 'audio_blank_only', hasAudio: true });
+ expect(r.useFeatureButtonAudio).toBe(true);
+ });
+
+ it('derives true for stimulus_image_blank profile with hasAudio=true', () => {
+ const r = computeLayoutProfile({ layoutProfile: 'stimulus_image_blank', hasAudio: true });
+ expect(r.useFeatureButtonAudio).toBe(true);
+ });
+
+ it('derives true for token_sequence profile with hasAudio=true', () => {
+ const r = computeLayoutProfile({ layoutProfile: 'token_sequence', hasAudio: true });
+ expect(r.useFeatureButtonAudio).toBe(true);
+ });
+
+ it('derives false for inline_sentence profile (not in feature-button set)', () => {
+ const r = computeLayoutProfile({ layoutProfile: 'inline_sentence', hasAudio: true });
+ expect(r.useFeatureButtonAudio).toBe(false);
+ });
+
+ it('derives false when hasAudio is false regardless of profile', () => {
+ const r = computeLayoutProfile({ layoutProfile: 'audio_blank_only', hasAudio: false });
+ expect(r.useFeatureButtonAudio).toBe(false);
+ });
+
+ it('treats null as unconfigured and falls back to derived logic', () => {
+ const r = computeLayoutProfile({
+ useFeatureButtonAudio: null,
+ hasAudio: true,
+ layoutProfile: 'audio_blank_only',
+ });
+ expect(r.useFeatureButtonAudio).toBe(true);
+ });
+});
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/computeLayoutProfile.ts b/packages/elements-svelte/mc-populated-blank/src/delivery/computeLayoutProfile.ts
new file mode 100644
index 00000000..a008c063
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/computeLayoutProfile.ts
@@ -0,0 +1,72 @@
+const BLANK_TOKEN = '{{blank}}';
+
+export interface LayoutProfileParams {
+ interactionMode?: string;
+ template?: string;
+ choiceLayout?: string;
+ layoutProfile?: string;
+ hasAudio?: boolean;
+ useFeatureButtonAudio?: boolean | null;
+}
+
+export interface LayoutProfileResult {
+ isAudioOnlyMode: boolean;
+ isBlankOnlyTemplate: boolean;
+ choiceLayout: 'horizontal' | 'vertical';
+ isHorizontalChoices: boolean;
+ hasInlineSentenceAudioLayout: boolean;
+ useFeatureButtonAudio: boolean;
+}
+
+const FEATURE_BUTTON_PROFILES = new Set([
+ 'audio_blank_only',
+ 'stimulus_image_blank',
+ 'token_sequence',
+]);
+
+export function computeLayoutProfile(params: LayoutProfileParams): LayoutProfileResult {
+ const {
+ interactionMode = '',
+ template = '',
+ choiceLayout: configuredChoiceLayout,
+ layoutProfile = '',
+ hasAudio = false,
+ useFeatureButtonAudio: configuredFeatureButton,
+ } = params;
+
+ const isAudioOnlyMode = interactionMode === 'audio_mc_only';
+
+ const isBlankOnlyTemplate = (() => {
+ if (!template) return false;
+ const plain = template
+ .replace(/<[^>]+>/g, '')
+ .replace(/ /g, ' ')
+ .trim();
+ return plain === BLANK_TOKEN;
+ })();
+
+ const choiceLayout: 'horizontal' | 'vertical' =
+ configuredChoiceLayout === 'horizontal' || configuredChoiceLayout === 'vertical'
+ ? (configuredChoiceLayout as 'horizontal' | 'vertical')
+ : isAudioOnlyMode || isBlankOnlyTemplate
+ ? 'horizontal'
+ : 'vertical';
+
+ const isHorizontalChoices = choiceLayout === 'horizontal';
+
+ const hasInlineSentenceAudioLayout = layoutProfile === 'inline_sentence' && hasAudio;
+
+ const useFeatureButtonAudio =
+ typeof configuredFeatureButton === 'boolean'
+ ? configuredFeatureButton
+ : hasAudio && FEATURE_BUTTON_PROFILES.has(layoutProfile);
+
+ return {
+ isAudioOnlyMode,
+ isBlankOnlyTemplate,
+ choiceLayout,
+ isHorizontalChoices,
+ hasInlineSentenceAudioLayout,
+ useFeatureButtonAudio,
+ };
+}
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/computeLayoutStyle.test.ts b/packages/elements-svelte/mc-populated-blank/src/delivery/computeLayoutStyle.test.ts
new file mode 100644
index 00000000..1d6ddb0d
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/computeLayoutStyle.test.ts
@@ -0,0 +1,168 @@
+import { describe, expect, it } from 'vitest';
+import { computeLayoutStyle, DEFAULT_LAYOUT_LIMITS } from './computeLayoutStyle';
+
+const NO_CORRECT_ANSWER_VARS = '';
+const base = {
+ configuredLimits: {},
+ customProfilePresets: {},
+ correctAnswerStyleVars: NO_CORRECT_ANSWER_VARS,
+};
+
+// ---------------------------------------------------------------------------
+// blankWidth
+// ---------------------------------------------------------------------------
+describe('blankWidth', () => {
+ it('audio_blank_only → blankWideWidthRem', () => {
+ const { blankWidth } = computeLayoutStyle({
+ ...base,
+ layoutProfile: 'audio_blank_only',
+ isBlankOnlyTemplate: false,
+ });
+ expect(blankWidth).toBe(`${DEFAULT_LAYOUT_LIMITS.blankWideWidthRem}rem`);
+ });
+
+ it('stimulus_image_blank → blankWideWidthRem', () => {
+ const { blankWidth } = computeLayoutStyle({
+ ...base,
+ layoutProfile: 'stimulus_image_blank',
+ isBlankOnlyTemplate: false,
+ });
+ expect(blankWidth).toBe(`${DEFAULT_LAYOUT_LIMITS.blankWideWidthRem}rem`);
+ });
+
+ it('other profile + isBlankOnlyTemplate → blankStandaloneWidthRem', () => {
+ const { blankWidth } = computeLayoutStyle({
+ ...base,
+ layoutProfile: 'token_sequence',
+ isBlankOnlyTemplate: true,
+ });
+ expect(blankWidth).toBe(`${DEFAULT_LAYOUT_LIMITS.blankStandaloneWidthRem}rem`);
+ });
+
+ it('other profile + not blank-only → auto', () => {
+ const { blankWidth } = computeLayoutStyle({
+ ...base,
+ layoutProfile: 'inline_sentence',
+ isBlankOnlyTemplate: false,
+ });
+ expect(blankWidth).toBe('auto');
+ });
+});
+
+// ---------------------------------------------------------------------------
+// blankBorderWidth
+// ---------------------------------------------------------------------------
+describe('blankBorderWidth', () => {
+ it.each([
+ 'audio_blank_only',
+ 'stimulus_image_blank',
+ 'token_sequence',
+ ])('%s → blankUnderlineWideWidthPx (profile preset overrides to 6)', (profile) => {
+ const { blankBorderWidth } = computeLayoutStyle({
+ ...base,
+ layoutProfile: profile,
+ isBlankOnlyTemplate: false,
+ });
+ // All three wide-underline profiles have preset blankUnderlineWideWidthPx: 6
+ expect(blankBorderWidth).toBe('6px');
+ });
+
+ it('other profile → blankUnderlineWidthPx (default 2)', () => {
+ const { blankBorderWidth } = computeLayoutStyle({
+ ...base,
+ layoutProfile: 'inline_sentence',
+ isBlankOnlyTemplate: false,
+ });
+ expect(blankBorderWidth).toBe(`${DEFAULT_LAYOUT_LIMITS.blankUnderlineWidthPx}px`);
+ });
+});
+
+// ---------------------------------------------------------------------------
+// legendMaxChars — uses resolved limits so overrides are respected
+// ---------------------------------------------------------------------------
+describe('legendMaxChars', () => {
+ it('defaults to DEFAULT_LAYOUT_LIMITS.legendMaxChars', () => {
+ const { legendMaxChars } = computeLayoutStyle({
+ ...base,
+ layoutProfile: '',
+ isBlankOnlyTemplate: false,
+ });
+ expect(legendMaxChars).toBe(DEFAULT_LAYOUT_LIMITS.legendMaxChars);
+ });
+
+ it('configuredLimits override is respected', () => {
+ const { legendMaxChars } = computeLayoutStyle({
+ ...base,
+ layoutProfile: '',
+ isBlankOnlyTemplate: false,
+ configuredLimits: { legendMaxChars: 60 },
+ });
+ expect(legendMaxChars).toBe(60);
+ });
+});
+
+// ---------------------------------------------------------------------------
+// limit resolution order: defaults < configuredLimits < profile preset < custom preset
+// ---------------------------------------------------------------------------
+describe('limit resolution order', () => {
+ it('profile preset overrides configuredLimits', () => {
+ // audio_blank_only preset sets choiceGroupGapRem: 1; configured sets it to 0.1
+ const { rootStyle } = computeLayoutStyle({
+ ...base,
+ layoutProfile: 'audio_blank_only',
+ isBlankOnlyTemplate: false,
+ configuredLimits: { choiceGroupGapRem: 0.1 },
+ });
+ expect(rootStyle).toContain('--mpb-choice-group-gap:1rem');
+ });
+
+ it('customProfilePresets override the built-in profile preset', () => {
+ const { rootStyle } = computeLayoutStyle({
+ ...base,
+ layoutProfile: 'audio_blank_only',
+ isBlankOnlyTemplate: false,
+ customProfilePresets: { audio_blank_only: { choiceGroupGapRem: 2 } },
+ });
+ expect(rootStyle).toContain('--mpb-choice-group-gap:2rem');
+ });
+
+ it('ignores customProfilePresets for a different profile', () => {
+ const { rootStyle } = computeLayoutStyle({
+ ...base,
+ layoutProfile: 'audio_blank_only',
+ isBlankOnlyTemplate: false,
+ customProfilePresets: { token_sequence: { choiceGroupGapRem: 99 } },
+ });
+ // audio_blank_only preset value (1) should win, not 99
+ expect(rootStyle).toContain('--mpb-choice-group-gap:1rem');
+ });
+});
+
+// ---------------------------------------------------------------------------
+// rootStyle contains all expected CSS var groups
+// ---------------------------------------------------------------------------
+describe('rootStyle structure', () => {
+ it('includes blank, choice, audio, and grid vars', () => {
+ const { rootStyle } = computeLayoutStyle({
+ ...base,
+ layoutProfile: '',
+ isBlankOnlyTemplate: false,
+ });
+ expect(rootStyle).toContain('--mpb-blank-standalone-width:');
+ expect(rootStyle).toContain('--mpb-choice-width-px:');
+ expect(rootStyle).toContain('--mpb-listen-button-size:');
+ expect(rootStyle).toContain('--mpb-stimulus-grid-column-gap:');
+ expect(rootStyle).toContain('--mpb-token-grid-column-gap:');
+ expect(rootStyle).toContain('--mpb-inline-grid-column-gap:');
+ });
+
+ it('appends correctAnswerStyleVars at the end', () => {
+ const { rootStyle } = computeLayoutStyle({
+ ...base,
+ layoutProfile: '',
+ isBlankOnlyTemplate: false,
+ correctAnswerStyleVars: '--pie-foo:bar',
+ });
+ expect(rootStyle).toMatch(/--pie-foo:bar$/);
+ });
+});
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/computeLayoutStyle.ts b/packages/elements-svelte/mc-populated-blank/src/delivery/computeLayoutStyle.ts
new file mode 100644
index 00000000..826f7739
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/computeLayoutStyle.ts
@@ -0,0 +1,128 @@
+import { type LayoutLimits, DEFAULT_LAYOUT_LIMITS } from '../shared/layoutLimits';
+export type { LayoutLimits };
+export { DEFAULT_LAYOUT_LIMITS };
+
+/**
+ * Maps every LayoutLimits key (except legendMaxChars, which is a return value not a CSS var)
+ * to its --mpb-* CSS variable name and CSS unit.
+ * Add a single entry here when adding a new layout limit.
+ */
+export const CSS_VAR_SPEC: Record<
+ Exclude,
+ { varName: string; unit: string }
+> = {
+ blankStandaloneWidthRem: { varName: '--mpb-blank-standalone-width', unit: 'rem' },
+ blankWideWidthRem: { varName: '--mpb-blank-wide-width', unit: 'rem' },
+ blankUnderlineWidthPx: { varName: '--mpb-blank-underline-width', unit: 'px' },
+ blankUnderlineWideWidthPx: { varName: '--mpb-blank-underline-wide-width', unit: 'px' },
+ horizontalChoiceWidthPx: { varName: '--mpb-choice-width-px', unit: 'px' },
+ horizontalChoiceWidthVw: { varName: '--mpb-choice-width-vw', unit: 'vw' },
+ horizontalChoiceTileMinHeightRem: { varName: '--mpb-choice-tile-min-height', unit: 'rem' },
+ horizontalChoiceContentMinHeightRem: { varName: '--mpb-choice-content-min-height', unit: 'rem' },
+ choiceImageMaxHeightRem: { varName: '--mpb-choice-image-max-height', unit: 'rem' },
+ selectedImageMaxHeightRem: { varName: '--mpb-selected-image-max-height', unit: 'rem' },
+ choiceGroupGapRem: { varName: '--mpb-choice-group-gap', unit: 'rem' },
+ choiceRowGapRem: { varName: '--mpb-choice-row-gap', unit: 'rem' },
+ horizontalChoiceRadioTopMarginRem: {
+ varName: '--mpb-horizontal-choice-radio-top-margin',
+ unit: 'rem',
+ },
+ narrowHorizontalChoiceMaxWidthPx: { varName: '--mpb-narrow-choice-max-width', unit: 'px' },
+ toggleButtonGapRem: { varName: '--mpb-toggle-button-gap', unit: 'rem' },
+ listenButtonSizePx: { varName: '--mpb-listen-button-size', unit: 'px' },
+ audioBlankTemplateMarginTopRem: { varName: '--mpb-audio-blank-template-margin-top', unit: 'rem' },
+ audioBlankTemplateMarginBottomRem: {
+ varName: '--mpb-audio-blank-template-margin-bottom',
+ unit: 'rem',
+ },
+ audioInstructionsMaxWidthPx: { varName: '--mpb-audio-instructions-max-width', unit: 'px' },
+ stimulusMinColumnPx: { varName: '--mpb-stimulus-min-column', unit: 'px' },
+ textMinColumnPx: { varName: '--mpb-text-min-column', unit: 'px' },
+ stimulusGridColumnGapRem: { varName: '--mpb-stimulus-grid-column-gap', unit: 'rem' },
+ stimulusGridRowGapRem: { varName: '--mpb-stimulus-grid-row-gap', unit: 'rem' },
+ stimulusSentenceMarginTopRem: { varName: '--mpb-stimulus-sentence-margin-top', unit: 'rem' },
+ stimulusChoicesMarginTopRem: { varName: '--mpb-stimulus-choices-margin-top', unit: 'rem' },
+ tokenGridColumnGapRem: { varName: '--mpb-token-grid-column-gap', unit: 'rem' },
+ tokenGridRowGapRem: { varName: '--mpb-token-grid-row-gap', unit: 'rem' },
+ tokenTemplateMarginTopRem: { varName: '--mpb-token-template-margin-top', unit: 'rem' },
+ tokenInlineTokenGapRem: { varName: '--mpb-token-inline-token-gap', unit: 'rem' },
+ tokenChoicesMarginTopRem: { varName: '--mpb-token-choices-margin-top', unit: 'rem' },
+ inlineGridColumnGapRem: { varName: '--mpb-inline-grid-column-gap', unit: 'rem' },
+ inlineGridRowGapRem: { varName: '--mpb-inline-grid-row-gap', unit: 'rem' },
+ inlineTemplateMarginTopRem: { varName: '--mpb-inline-template-margin-top', unit: 'rem' },
+ inlineChoicesMarginTopRem: { varName: '--mpb-inline-choices-margin-top', unit: 'rem' },
+};
+
+export const DEFAULT_LAYOUT_PROFILE_PRESETS: Record> = {
+ audio_blank_only: {
+ blankWideWidthRem: 10,
+ blankUnderlineWideWidthPx: 6,
+ horizontalChoiceTileMinHeightRem: 11.25,
+ horizontalChoiceContentMinHeightRem: 9.375,
+ choiceGroupGapRem: 1,
+ audioBlankTemplateMarginBottomRem: 1.875,
+ },
+ stimulus_image_blank: {
+ blankWideWidthRem: 10,
+ blankUnderlineWideWidthPx: 6,
+ },
+ token_sequence: {
+ blankStandaloneWidthRem: 7,
+ blankUnderlineWideWidthPx: 6,
+ },
+};
+
+export interface LayoutStyleResult {
+ rootStyle: string;
+ blankWidth: string;
+ blankBorderWidth: string;
+ legendMaxChars: number;
+}
+
+export function computeLayoutStyle(params: {
+ layoutProfile: string;
+ isBlankOnlyTemplate: boolean;
+ configuredLimits: unknown;
+ customProfilePresets: unknown;
+ correctAnswerStyleVars: string;
+}): LayoutStyleResult {
+ const { layoutProfile, isBlankOnlyTemplate, correctAnswerStyleVars } = params;
+
+ const configured =
+ params.configuredLimits && typeof params.configuredLimits === 'object'
+ ? (params.configuredLimits as Partial)
+ : {};
+ const customPresets =
+ params.customProfilePresets && typeof params.customProfilePresets === 'object'
+ ? (params.customProfilePresets as Record)
+ : {};
+ const customForProfile =
+ customPresets[layoutProfile] && typeof customPresets[layoutProfile] === 'object'
+ ? (customPresets[layoutProfile] as Partial)
+ : {};
+ const profilePreset: Partial = {
+ ...(DEFAULT_LAYOUT_PROFILE_PRESETS[layoutProfile] ?? {}),
+ ...customForProfile,
+ };
+ const l: LayoutLimits = { ...DEFAULT_LAYOUT_LIMITS, ...configured, ...profilePreset };
+
+ const wideBlankProfiles = ['audio_blank_only', 'stimulus_image_blank'];
+ const wideUnderlineProfiles = ['audio_blank_only', 'stimulus_image_blank', 'token_sequence'];
+
+ const blankWidth = wideBlankProfiles.includes(layoutProfile)
+ ? `${l.blankWideWidthRem}rem`
+ : isBlankOnlyTemplate
+ ? `${l.blankStandaloneWidthRem}rem`
+ : 'auto';
+
+ const blankBorderWidth = wideUnderlineProfiles.includes(layoutProfile)
+ ? `${l.blankUnderlineWideWidthPx}px`
+ : `${l.blankUnderlineWidthPx}px`;
+
+ const cssVars = (Object.keys(CSS_VAR_SPEC) as (keyof typeof CSS_VAR_SPEC)[]).map(
+ (key) => `${CSS_VAR_SPEC[key].varName}:${l[key]}${CSS_VAR_SPEC[key].unit}`
+ );
+ const rootStyle = [...cssVars, correctAnswerStyleVars].join(';');
+
+ return { rootStyle, blankWidth, blankBorderWidth, legendMaxChars: l.legendMaxChars };
+}
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-base.css b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-base.css
new file mode 100644
index 00000000..4851b77c
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-base.css
@@ -0,0 +1,59 @@
+/* Shared base styles for all sel_r1-*_plusggg variants.
+ Applied via the data-mpb-variant="sel-r1-base" style element.
+ Uses [class*="variant-sel-r1-"] so it covers every r1 variant class.
+ Source: web-ItemBankViewer/learnosity/templates/Renaissance/r1.scss */
+
+/* r1.scss: Starial font throughout */
+[class*="variant-sel-r1-"] {
+ font-family: Starial, Arial, sans-serif;
+}
+
+/* r1.scss: .rli-r1-audio-transcript { font-family:Roboto; font-size:16px } */
+[class*="variant-sel-r1-"] .pie-audio-transcript {
+ font-family: Roboto, Arial, sans-serif;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+}
+
+/* r1.scss: .rli-r1-content-element { font-size: 1.9em } wraps all stem tokens.
+ Makes inline font-size spans in the template multiply on top of this base. */
+[class*="variant-sel-r1-"] .pie-template-line {
+ font-size: 1.9em;
+}
+
+/* r1.scss: .rli-r1-stem { display:flex; flex-direction:row; justify-content:center }
+ r1.scss: .rli-r1-content-element { margin-right:2px; margin-left:2px } — 4px total gap.
+ column-gap:4px replicates the 2px+2px per-element margin. */
+[class*="variant-sel-r1-"] .pie-template-line {
+ display: flex;
+ flex-direction: row;
+ align-items: baseline;
+ justify-content: center;
+ column-gap: 4px;
+}
+
+[class*="variant-sel-r1-"] .pie-template-line p {
+ margin: 0;
+ display: flex;
+ flex-direction: row;
+ align-items: baseline;
+ gap: 4px;
+}
+
+/* r1.scss: .rli-r1-content-element { min-width:150px; max-width:150px; min-height:150px;
+ line-height:89px } — every stem token (blank slot and adjacent spans) is a 150px box.
+ Scoped to token_sequence layout so the audio_blank_only standalone blank (160px) is unaffected. */
+[class*="variant-sel-r1-"].layout-token_sequence .pie-template-line span:not([class]),
+[class*="variant-sel-r1-"].layout-token_sequence .pie-template-line .pie-blank-slot {
+ min-width: 150px;
+ max-width: 150px;
+ min-height: 150px;
+ line-height: 89px;
+}
+
+/* r1.scss: .rli-r1-content-element { font-size:1.9em; line-height:89px } on distractors */
+[class*="variant-sel-r1-"] .pie-choice-label {
+ font-size: 1.9em;
+ line-height: 89px;
+}
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-g-stem.css b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-g-stem.css
index be624d64..376969ca 100644
--- a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-g-stem.css
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-g-stem.css
@@ -1,29 +1,14 @@
/* Source baseline: https://global-pr-ibvcustomfiles.renaissance-go.com/learnosity/sel_r1-g_plusggg/0.0.1/question.css */
+/* Shared r1 base styles (font, template-line flex, choice-label) are in sel-r1-base.css */
.mc-populated-blank-root.variant-sel-r1-g-stem {
- font-family: Starial, Arial, sans-serif;
max-width: 875px;
margin-inline: auto;
--mpb-listen-button-size: 128px;
--mpb-choice-width-px: 155px;
--mpb-choice-tile-min-height: 11.25rem;
--mpb-choice-content-min-height: 9.375rem;
- --pie-correct-answer-choice-hover-bg: #e2e2e2;
- --pie-correct-answer-choice-selected-bg: #fcfcd3;
-}
-
-.mc-populated-blank-root.variant-sel-r1-g-stem .pie-audio-transcript {
- font-family: Roboto, Arial, sans-serif;
- font-size: 16px;
- font-style: normal;
- font-weight: 400;
-}
-
-.mc-populated-blank-root.variant-sel-r1-g-stem .pie-choice-label {
- font-size: 1.9em;
- line-height: 89px;
-}
-
-.mc-populated-blank-root.variant-sel-r1-g-stem.layout-token_sequence {
- grid-template-columns: minmax(260px, auto) auto;
- justify-content: center;
+ --mpb-choice-hover-bg: #f2f2f2;
+ --mpb-choice-selected-bg: #fcfcd3;
+ /* r1.scss: .rli-r1-cloze { border-bottom: 6px solid } */
+ --mpb-blank-underline-wide-width: 6px;
}
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-gg-plus.css b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-gg-plus.css
index dfff75b1..d5b4808e 100644
--- a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-gg-plus.css
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-gg-plus.css
@@ -1,29 +1,12 @@
/* Source baseline: https://global-pr-ibvcustomfiles.renaissance-go.com/learnosity/sel_r1-gg_plusggg/0.0.1/question.css */
+/* Shared r1 base styles (font, template-line flex, choice-label) are in sel-r1-base.css */
.mc-populated-blank-root.variant-sel-r1-gg-plus {
- font-family: Starial, Arial, sans-serif;
max-width: 875px;
margin-inline: auto;
--mpb-listen-button-size: 128px;
--mpb-choice-width-px: 155px;
--mpb-choice-tile-min-height: 11.25rem;
--mpb-choice-content-min-height: 9.375rem;
- --pie-correct-answer-choice-hover-bg: #e2e2e2;
- --pie-correct-answer-choice-selected-bg: #fcfcd3;
-}
-
-.mc-populated-blank-root.variant-sel-r1-gg-plus .pie-audio-transcript {
- font-family: Roboto, Arial, sans-serif;
- font-size: 16px;
- font-style: normal;
- font-weight: 400;
-}
-
-.mc-populated-blank-root.variant-sel-r1-gg-plus .pie-choice-label {
- font-size: 1.9em;
- line-height: 89px;
-}
-
-.mc-populated-blank-root.variant-sel-r1-gg-plus.layout-token_sequence {
- grid-template-columns: minmax(260px, auto) auto;
- justify-content: center;
+ --mpb-choice-hover-bg: #f2f2f2;
+ --mpb-choice-selected-bg: #fcfcd3;
}
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-ggplus.css b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-ggplus.css
index 9d771155..092d8dce 100644
--- a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-ggplus.css
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-ggplus.css
@@ -1,34 +1,17 @@
/* Source baseline: https://global-pr-ibvcustomfiles.renaissance-go.com/learnosity/sel_r1-_ggplusggg/0.0.1/question.css */
+/* Shared r1 base styles (font, template-line flex, choice-label) are in sel-r1-base.css */
.mc-populated-blank-root.variant-sel-r1-ggplus {
- font-family: Starial, Arial, sans-serif;
max-width: 875px;
margin-inline: auto;
--mpb-listen-button-size: 128px;
--mpb-choice-width-px: 155px;
--mpb-choice-tile-min-height: 11.25rem;
--mpb-choice-content-min-height: 9.375rem;
- --pie-correct-answer-choice-hover-bg: #e2e2e2;
- --pie-correct-answer-choice-selected-bg: #fcfcd3;
+ --mpb-choice-hover-bg: #f2f2f2;
+ --mpb-choice-selected-bg: #fcfcd3;
}
-.mc-populated-blank-root.variant-sel-r1-ggplus .pie-audio-transcript {
- font-family: Roboto, Arial, sans-serif;
- font-size: 16px;
- font-style: normal;
- font-weight: 400;
-}
-
-.mc-populated-blank-root.variant-sel-r1-ggplus .pie-choice-label {
- font-size: 1.9em;
- line-height: 89px;
-}
-
-.mc-populated-blank-root.variant-sel-r1-ggplus.layout-token_sequence {
- grid-template-columns: minmax(260px, auto) auto;
- justify-content: center;
-}
-
-/* In this variant, the blank appears before trailing tokens; avoid offsetting it. */
+/* In this variant, the blank appears before trailing tokens; avoid left-margin offset. */
.mc-populated-blank-root.variant-sel-r1-ggplus.layout-token_sequence .pie-blank-slot {
margin-left: 0;
}
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-gplusggg.css b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-gplusggg.css
index b3e58971..c70c4e69 100644
--- a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-gplusggg.css
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-gplusggg.css
@@ -1,20 +1,25 @@
/* Source baseline: https://global-pr-ibvcustomfiles.renaissance-go.com/learnosity/sel_r1-_gplusggg/0.0.1/question.css */
+/* Shared r1 base styles (font, template-line flex, choice-label) are in sel-r1-base.css */
.mc-populated-blank-root.variant-sel-r1-gplusggg {
- font-family: Starial, Arial, sans-serif;
+ max-width: 875px;
+ margin-inline: auto;
--mpb-listen-button-size: 128px;
--mpb-choice-width-px: 155px;
--mpb-choice-tile-min-height: 11.25rem;
--mpb-choice-content-min-height: 9.375rem;
+ --mpb-choice-group-gap: 1rem;
+ --mpb-choice-hover-bg: #f2f2f2;
+ --mpb-choice-selected-bg: #fcfcd3;
}
-.mc-populated-blank-root.variant-sel-r1-gplusggg .pie-audio-transcript {
- font-family: Roboto, Arial, sans-serif;
- font-size: 16px;
- font-style: normal;
- font-weight: 400;
-}
-
-.mc-populated-blank-root.variant-sel-r1-gplusggg .pie-choice-label {
- font-size: 1.9em;
- line-height: 89px;
+/* r1.scss: .rli-r1-content-element boxes all have fixed line-height:89px, so every
+ token in the stem row shares a stable baseline regardless of content. In PIE,
+ the blank slot's baseline shifts when the empty placeholder (short ) is
+ replaced by the filled value span (full text height), dragging adjacent tokens
+ down by ~9px. Switching to align-items:center is safe here because gplusggg has
+ only one row of content (blank + "four"), so vertical centering and baseline
+ alignment produce the same visual result. The :is() wrapper raises specificity
+ above the base [class*=] rule without needing !important. */
+:is(.mc-populated-blank-root.variant-sel-r1-gplusggg) .pie-template-line {
+ align-items: center;
}
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-plusggg.css b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-plusggg.css
index 6db2be0a..59788060 100644
--- a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-plusggg.css
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-plusggg.css
@@ -1,20 +1,17 @@
/* Source baseline: https://global-pr-ibvcustomfiles.renaissance-go.com/learnosity/sel_r1-_plusggg/0.0.1/question.css */
+/* Shared r1 base styles (font, template-line flex, choice-label) are in sel-r1-base.css */
.mc-populated-blank-root.variant-sel-r1-plusggg {
- font-family: Starial, Arial, sans-serif;
+ max-width: 875px;
+ margin-inline: auto;
--mpb-listen-button-size: 128px;
--mpb-choice-width-px: 155px;
--mpb-choice-tile-min-height: 11.25rem;
--mpb-choice-content-min-height: 9.375rem;
+ --mpb-choice-group-gap: 1rem;
+ --mpb-choice-hover-bg: #f2f2f2;
+ --mpb-choice-selected-bg: #fcfcd3;
}
-.mc-populated-blank-root.variant-sel-r1-plusggg .pie-audio-transcript {
- font-family: Roboto, Arial, sans-serif;
- font-size: 16px;
- font-style: normal;
- font-weight: 400;
-}
-
-.mc-populated-blank-root.variant-sel-r1-plusggg .pie-choice-label {
- font-size: 1.9em;
- line-height: 89px;
+.mc-populated-blank-root.variant-sel-r1-plusggg {
+ --mpb-choice-radio-padding: 20px;
}
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-s3.css b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-s3.css
index 8aaa47e9..0ebf7407 100644
--- a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-s3.css
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-r1-s3.css
@@ -1,6 +1,6 @@
/* Source baseline: https://global-pr-ibvcustomfiles.renaissance-go.com/learnosity/sel_r1-s3_plusggg/0.0.1/question.css */
+/* Shared r1 base styles (font, template-line flex, choice-label) are in sel-r1-base.css */
.mc-populated-blank-root.variant-sel-r1-s3 {
- font-family: Starial, Arial, sans-serif;
max-width: 860px;
margin-inline: auto;
--mpb-listen-button-size: 128px;
@@ -17,13 +17,7 @@
--mpb-blank-wide-width: 6.8rem;
}
-.mc-populated-blank-root.variant-sel-r1-s3 .pie-audio-transcript {
- font-family: Roboto, Arial, sans-serif;
- font-size: 16px;
- font-style: normal;
- font-weight: 400;
-}
-
+/* s3 overrides base choice-label with font-weight:500 */
.mc-populated-blank-root.variant-sel-r1-s3 .pie-choice-label,
.mc-populated-blank-root.variant-sel-r1-s3 .pie-choice-label :is(span, p, div) {
font-size: 1.9em;
@@ -33,7 +27,6 @@
.mc-populated-blank-root.variant-sel-r1-s3 .pie-blank-value,
.mc-populated-blank-root.variant-sel-r1-s3 .pie-blank-value :is(span, p, div) {
- font-size: 1.9em;
line-height: 1.1;
white-space: nowrap;
}
@@ -46,6 +39,7 @@
.mc-populated-blank-root.variant-sel-r1-s3.layout-stimulus_image_blank {
grid-template-columns: minmax(220px, auto) auto auto;
grid-template-areas:
+ "transcript transcript transcript"
"sentence template audio"
"choices choices choices";
justify-content: center;
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-vic.css b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-vic.css
index df731787..44e590a8 100644
--- a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-vic.css
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sel-vic.css
@@ -1,4 +1,5 @@
/* Source baseline: https://global-pr-ibvcustomfiles.renaissance-go.com/learnosity/sel_vic/0.0.1/question.css */
+/* Reference layout: web-ItemBankViewer/learnosity/templates/Renaissance/sel_vic/scss/main.scss + vic.scss */
.mc-populated-blank-root.variant-sel-vic {
font-family: Starial, Arial, sans-serif;
font-size: 1.5em;
@@ -25,10 +26,70 @@
line-height: 123%;
}
+/* sel_vic/main.scss: template left ~75%, audio right ~25% on the same row.
+ Svelte scoping prevents the component-internal grid-area rule from reaching
+ .audio-container inside AudioPlayer, so we override it here via the global
+ .pie-audio-container class which is not subject to scope hashing. */
.mc-populated-blank-root.variant-sel-vic .pie-audio-container {
+ grid-area: audio;
+ margin: 0;
+ justify-self: end;
+ align-self: start;
min-height: 128px;
}
+/* vic.scss: sentence and cloze sit inline — the wrapper must not break to
+ a new line before the blank slot. */
+.mc-populated-blank-root.variant-sel-vic .pie-template-line p {
+ display: inline;
+ margin: 0;
+}
+
+/* vic.scss: .rli-vic-cloze > .rli-vic-content-element { color: #cc3333 } */
+.mc-populated-blank-root.variant-sel-vic .pie-blank-value {
+ color: #cc3333;
+}
+
+/* sel_vic/main.scss: .sel-vic { max-width: 800px } — the fieldset/choices must
+ also be constrained so rows don't span beyond 800px. */
+.mc-populated-blank-root.variant-sel-vic .pie-choices-fieldset {
+ max-width: 800px;
+ width: 100%;
+}
+
+/* vic.scss: distractor label text sits to the right of the radio — no centering. */
+.mc-populated-blank-root.variant-sel-vic .pie-choice-label {
+ text-align: left;
+ justify-content: flex-start;
+}
+
+/* vic.scss: .rli-vic-selected { background-color: #fcfcd3 } on the full row. */
+.mc-populated-blank-root.variant-sel-vic .pie-choice.is-selected {
+ background-color: #fcfcd3;
+ border-radius: 6px;
+}
+
+.mc-populated-blank-root.variant-sel-vic .pie-choice.is-selected .pie-choice-label-wrap {
+ background-color: transparent;
+}
+
+/* Selected state must win over hover. */
+.mc-populated-blank-root.variant-sel-vic .pie-choice:not(.pie-choice-horizontal).is-selected:hover {
+ background-color: #fcfcd3;
+}
+
+/* vic.scss: .rli-vic-distractor:hover { background-color: #F2F2F2 } on the full row. */
+.mc-populated-blank-root.variant-sel-vic .pie-choice:not(.pie-choice-horizontal):hover {
+ background-color: #f2f2f2;
+ border-radius: 6px;
+}
+
+.mc-populated-blank-root.variant-sel-vic
+ .pie-choice:not(.pie-choice-horizontal):hover
+ .pie-choice-label-wrap {
+ background-color: transparent;
+}
+
@media (min-width: 620px) {
.mc-populated-blank-root.variant-sel-vic .pie-audio-transcript {
min-width: 620px;
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sr-vic.css b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sr-vic.css
index 5fa42200..dc56617c 100644
--- a/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sr-vic.css
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/cqt-css/sr-vic.css
@@ -1,4 +1,5 @@
/* Source baseline: https://global-pr-ibvcustomfiles.renaissance-go.com/learnosity/sr-vic/0.0.1/question.css */
+/* Reference layout: web-ItemBankViewer/learnosity/templates/Renaissance/vic.scss */
.mc-populated-blank-root.variant-sr-vic {
font-family: Starial, Arial, sans-serif;
--mpb-inline-grid-column-gap: 1rem;
@@ -12,3 +13,51 @@
.mc-populated-blank-root.variant-sr-vic .pie-choice-label {
line-height: 123%;
}
+
+/* vic.scss: .rli-vic-answer uses display:flex so sentence and cloze stay on
+ one line. The template HTML wraps text in
, which is block by default and
+ breaks to a new line. Making
inline keeps the sentence and blank inline. */
+.mc-populated-blank-root.variant-sr-vic .pie-template-line p {
+ display: inline;
+ margin: 0;
+}
+
+/* vic.scss: .rli-vic-cloze > .rli-vic-content-element { color: #cc3333 } */
+.mc-populated-blank-root.variant-sr-vic .pie-blank-value {
+ color: #cc3333;
+}
+
+/* vic.scss: .rli-vic-selected { background-color: #fcfcd3 } applied to the
+ whole distractor row (radio + label), not just the label wrapper. */
+.mc-populated-blank-root.variant-sr-vic .pie-choice.is-selected {
+ background-color: #fcfcd3;
+ border-radius: 6px;
+}
+
+.mc-populated-blank-root.variant-sr-vic .pie-choice.is-selected .pie-choice-label-wrap {
+ background-color: transparent;
+}
+
+/* vic.scss: distractor label text sits to the right of the radio — no centering. */
+.mc-populated-blank-root.variant-sr-vic .pie-choice-label {
+ text-align: left;
+ justify-content: flex-start;
+}
+
+/* vic.scss: .rli-vic-distractor:hover { background-color: #F2F2F2 } applied to
+ the full row element, not only the inner label wrapper. */
+.mc-populated-blank-root.variant-sr-vic .pie-choice:not(.pie-choice-horizontal):hover {
+ background-color: #f2f2f2;
+ border-radius: 6px;
+}
+
+.mc-populated-blank-root.variant-sr-vic
+ .pie-choice:not(.pie-choice-horizontal):hover
+ .pie-choice-label-wrap {
+ background-color: transparent;
+}
+
+/* Selected state must win over hover — yellow persists when hovering a chosen row. */
+.mc-populated-blank-root.variant-sr-vic .pie-choice:not(.pie-choice-horizontal).is-selected:hover {
+ background-color: #fcfcd3;
+}
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/index.ts b/packages/elements-svelte/mc-populated-blank/src/delivery/index.ts
index 2694fc7c..9fdaa715 100644
--- a/packages/elements-svelte/mc-populated-blank/src/delivery/index.ts
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/index.ts
@@ -1,7 +1,14 @@
import McPopulatedBlankComponent from './McPopulatedBlank.svelte';
-import { isComplete as isControllerComplete } from '../controller';
import { ModelSetEvent, SessionChangedEvent } from '@pie-lib/delivery-events-svelte';
+function isComplete(model: any, session: any, audioComplete = false): boolean {
+ if (!session?.choiceId) return false;
+ const requiresAudioCompletion =
+ !!model?.autoplayAudioEnabled && !!model?.completeAudioEnabled && !!model?.hasAudio;
+ if (requiresAudioCompletion && !audioComplete) return false;
+ return true;
+}
+
const SvelteElementClass = (McPopulatedBlankComponent as any).element;
class McPopulatedBlankElement extends SvelteElementClass {
@@ -73,7 +80,7 @@ class McPopulatedBlankElement extends SvelteElementClass {
};
_isComplete = () => {
- return isControllerComplete(this._model, this._internalSession, this.audioComplete);
+ return isComplete(this._model, this._internalSession, this.audioComplete);
};
connectedCallback() {
diff --git a/packages/elements-svelte/mc-populated-blank/src/delivery/variant-css-map.ts b/packages/elements-svelte/mc-populated-blank/src/delivery/variant-css-map.ts
index bcd39b99..31013490 100644
--- a/packages/elements-svelte/mc-populated-blank/src/delivery/variant-css-map.ts
+++ b/packages/elements-svelte/mc-populated-blank/src/delivery/variant-css-map.ts
@@ -1,3 +1,4 @@
+import selR1BaseCss from './cqt-css/sel-r1-base.css?raw';
import selR1PlusgggCss from './cqt-css/sel-r1-plusggg.css?raw';
import srVicCss from './cqt-css/sr-vic.css?raw';
import selVicCss from './cqt-css/sel-vic.css?raw';
@@ -90,21 +91,34 @@ export const getVariantRootClass = (customType: unknown): string => {
return getVariantCssConfig(customType)?.variantClass || '';
};
-export const ensureVariantCssInjected = (config?: VariantCssConfig): void => {
- if (!config || !config.cssText || typeof document === 'undefined') {
- return;
- }
- const styleId = `mc-populated-blank-css-${config.variantId}`;
- const existing = document.getElementById(styleId) as HTMLStyleElement | null;
+const SEL_R1_VARIANT_IDS = new Set([
+ 'sel-r1-plusggg',
+ 'sel-r1-gplusggg',
+ 'sel-r1-g-stem',
+ 'sel-r1-gg-plus',
+ 'sel-r1-ggplus',
+ 'sel-r1-s3',
+]);
+
+const injectStyleOnce = (id: string, variantName: string, cssText: string): void => {
+ const existing = document.getElementById(id) as HTMLStyleElement | null;
if (existing) {
- if (existing.textContent !== config.cssText) {
- existing.textContent = config.cssText;
- }
+ if (existing.textContent !== cssText) existing.textContent = cssText;
return;
}
const style = document.createElement('style');
- style.id = styleId;
- style.setAttribute('data-mpb-variant', config.variantId);
- style.textContent = config.cssText;
+ style.id = id;
+ style.setAttribute('data-mpb-variant', variantName);
+ style.textContent = cssText;
document.head.appendChild(style);
};
+
+export const ensureVariantCssInjected = (config?: VariantCssConfig): void => {
+ if (!config?.cssText || typeof document === 'undefined') {
+ return;
+ }
+ if (SEL_R1_VARIANT_IDS.has(config.variantId)) {
+ injectStyleOnce('mc-populated-blank-css-sel-r1-base', 'sel-r1-base', selR1BaseCss);
+ }
+ injectStyleOnce(`mc-populated-blank-css-${config.variantId}`, config.variantId, config.cssText);
+};
diff --git a/packages/elements-svelte/mc-populated-blank/src/shared/layoutLimits.ts b/packages/elements-svelte/mc-populated-blank/src/shared/layoutLimits.ts
new file mode 100644
index 00000000..d3e3e674
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/shared/layoutLimits.ts
@@ -0,0 +1,76 @@
+export type LayoutLimits = {
+ blankStandaloneWidthRem: number;
+ blankWideWidthRem: number;
+ blankUnderlineWidthPx: number;
+ blankUnderlineWideWidthPx: number;
+ horizontalChoiceWidthPx: number;
+ horizontalChoiceWidthVw: number;
+ horizontalChoiceTileMinHeightRem: number;
+ horizontalChoiceContentMinHeightRem: number;
+ selectedImageMaxHeightRem: number;
+ choiceImageMaxHeightRem: number;
+ listenButtonSizePx: number;
+ stimulusMinColumnPx: number;
+ textMinColumnPx: number;
+ legendMaxChars: number;
+ choiceGroupGapRem: number;
+ choiceRowGapRem: number;
+ toggleButtonGapRem: number;
+ horizontalChoiceRadioTopMarginRem: number;
+ audioBlankTemplateMarginTopRem: number;
+ audioBlankTemplateMarginBottomRem: number;
+ audioInstructionsMaxWidthPx: number;
+ narrowHorizontalChoiceMaxWidthPx: number;
+ stimulusGridColumnGapRem: number;
+ stimulusGridRowGapRem: number;
+ stimulusSentenceMarginTopRem: number;
+ stimulusChoicesMarginTopRem: number;
+ tokenGridColumnGapRem: number;
+ tokenGridRowGapRem: number;
+ tokenTemplateMarginTopRem: number;
+ tokenInlineTokenGapRem: number;
+ tokenChoicesMarginTopRem: number;
+ inlineGridColumnGapRem: number;
+ inlineGridRowGapRem: number;
+ inlineTemplateMarginTopRem: number;
+ inlineChoicesMarginTopRem: number;
+};
+
+/** Baseline values tuned to match historical CQT visuals; override via model.layoutLimits. */
+export const DEFAULT_LAYOUT_LIMITS: LayoutLimits = {
+ blankStandaloneWidthRem: 7,
+ blankWideWidthRem: 10,
+ blankUnderlineWidthPx: 2,
+ blankUnderlineWideWidthPx: 4,
+ horizontalChoiceWidthPx: 170,
+ horizontalChoiceWidthVw: 30,
+ horizontalChoiceTileMinHeightRem: 11,
+ horizontalChoiceContentMinHeightRem: 7.5,
+ selectedImageMaxHeightRem: 4,
+ choiceImageMaxHeightRem: 5,
+ listenButtonSizePx: 128,
+ stimulusMinColumnPx: 210,
+ textMinColumnPx: 260,
+ legendMaxChars: 120,
+ choiceGroupGapRem: 0.5,
+ choiceRowGapRem: 0.5,
+ toggleButtonGapRem: 0.5,
+ horizontalChoiceRadioTopMarginRem: 0.5,
+ audioBlankTemplateMarginTopRem: 0.8,
+ audioBlankTemplateMarginBottomRem: 1.8,
+ audioInstructionsMaxWidthPx: 875,
+ narrowHorizontalChoiceMaxWidthPx: 230,
+ stimulusGridColumnGapRem: 2,
+ stimulusGridRowGapRem: 0.7,
+ stimulusSentenceMarginTopRem: 0.2,
+ stimulusChoicesMarginTopRem: 0.9,
+ tokenGridColumnGapRem: 1.5,
+ tokenGridRowGapRem: 0.8,
+ tokenTemplateMarginTopRem: 0.6,
+ tokenInlineTokenGapRem: 0.35,
+ tokenChoicesMarginTopRem: 0.2,
+ inlineGridColumnGapRem: 1.5,
+ inlineGridRowGapRem: 0.65,
+ inlineTemplateMarginTopRem: 0.45,
+ inlineChoicesMarginTopRem: 0.25,
+};
diff --git a/packages/elements-svelte/mc-populated-blank/src/shared/types.ts b/packages/elements-svelte/mc-populated-blank/src/shared/types.ts
new file mode 100644
index 00000000..c5ea2e69
--- /dev/null
+++ b/packages/elements-svelte/mc-populated-blank/src/shared/types.ts
@@ -0,0 +1,84 @@
+import type { LayoutLimits } from './layoutLimits';
+
+export type McpbChoiceMode = 'text' | 'image';
+export type McpbInteractionMode = 'populate_blank' | 'audio_mc_only';
+export type McpbDeliveryMode = 'gather' | 'view' | 'evaluate' | 'authoring' | 'print';
+export type McpbRole = 'student' | 'instructor';
+export type McpbCorrectness = 'correct' | 'incorrect' | 'unanswered';
+
+export interface McpbChoice {
+ id: string;
+ labelHtml?: string;
+ imageUrl?: string;
+ imageAlt?: string;
+}
+
+export interface McpbAudioButtonSkin {
+ silentUrl: string;
+ playingUrl: string;
+}
+
+export interface McpbUiText {
+ answerChoices?: string;
+ selectedAnswerInSentence?: string;
+ showCorrectAnswer?: string;
+ hideCorrectAnswer?: string;
+ clickToEnableAutoplay?: string;
+ audioResourceUnavailable?: string;
+ transcriptLabel?: string;
+ listenLabelEn?: string;
+ listenLabelEs?: string;
+ listenSilentAlt?: string;
+ listenPlayingAlt?: string;
+ listenSilentAltEs?: string;
+ listenPlayingAltEs?: string;
+}
+
+export interface McpbQuestion {
+ id?: string;
+ element?: string;
+ prompt?: string;
+ promptEnabled?: boolean;
+ interactionMode?: McpbInteractionMode;
+ layoutProfile?: string;
+ choiceLayout?: string;
+ layoutProfilePresets?: Record>;
+ layoutLimits?: Partial;
+ audioButtonSkin?: McpbAudioButtonSkin | null;
+ audioButtonSkinsByLocale?: Record;
+ uiText?: McpbUiText;
+ sentenceHtml?: string;
+ template?: string;
+ choiceMode?: McpbChoiceMode;
+ choices?: McpbChoice[];
+ correctChoiceId?: string;
+ hasAudio?: boolean;
+ autoplayAudioEnabled?: boolean;
+ completeAudioEnabled?: boolean;
+ audioUrl?: string;
+ audioTranscript?: string;
+ showVisibleTranscript?: boolean;
+ useFeatureButtonAudio?: boolean;
+ locale?: string;
+ shuffle?: boolean;
+ lockChoiceOrder?: boolean;
+ teacherInstructions?: string;
+ teacherInstructionsEnabled?: boolean;
+ customType?: string;
+}
+
+export interface McpbSession {
+ id?: string;
+ element?: string;
+ choiceId?: string;
+ audioStartTime?: number;
+ audioEndTime?: number;
+ shuffledValues?: string[];
+ data?: { shuffledValues?: string[] };
+}
+
+export interface McpbEnv {
+ mode?: McpbDeliveryMode;
+ role?: McpbRole;
+ '@pie-element'?: { lockChoiceOrder?: boolean };
+}
diff --git a/packages/elements-svelte/simple-cloze/src/controller/index.ts b/packages/elements-svelte/simple-cloze/src/controller/index.ts
index e9de7e78..f414d209 100644
--- a/packages/elements-svelte/simple-cloze/src/controller/index.ts
+++ b/packages/elements-svelte/simple-cloze/src/controller/index.ts
@@ -2,7 +2,7 @@ import { isEmpty } from 'lodash-es';
import defaults from './defaults';
export const getCorrectness = (question: any, session: any) => {
- if (!session || !session.response) {
+ if (!session?.response) {
return 'unanswered';
}
diff --git a/packages/print-player/src/markup-processor.ts b/packages/print-player/src/markup-processor.ts
index fe157a4c..0b063f6d 100644
--- a/packages/print-player/src/markup-processor.ts
+++ b/packages/print-player/src/markup-processor.ts
@@ -113,7 +113,7 @@ export const printItemAndFloaters = (
markup: r.html,
elements: Object.entries(item.elements).reduce((acc, [key, value]) => {
const res = resolutions.find((r) => r.tagName === key);
- if (!res || !res.printTagName) {
+ if (!res?.printTagName) {
throw new Error(`cant find resolution for element: ${key}`);
}
acc[res.printTagName] = value;
@@ -121,7 +121,7 @@ export const printItemAndFloaters = (
}, {}),
models: embedded.map((m) => {
const res = resolutions.find((r) => r.tagName === m.element);
- if (!res || !res.printTagName) {
+ if (!res?.printTagName) {
throw new Error(`cant find resolution for element: ${m.element}`);
}
return { ...m, element: res?.printTagName };
diff --git a/packages/shared/bundler-shared/tsconfig.json b/packages/shared/bundler-shared/tsconfig.json
index 916428e2..b5c6ef10 100644
--- a/packages/shared/bundler-shared/tsconfig.json
+++ b/packages/shared/bundler-shared/tsconfig.json
@@ -9,7 +9,8 @@
"module": "Node16",
"moduleResolution": "node16",
"allowImportingTsExtensions": false,
- "noEmit": false
+ "noEmit": false,
+ "emitDeclarationOnly": false
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist", "tests"]
diff --git a/scripts/fetch-learnosity-item.mjs b/scripts/fetch-learnosity-item.mjs
new file mode 100644
index 00000000..53f2033f
--- /dev/null
+++ b/scripts/fetch-learnosity-item.mjs
@@ -0,0 +1,140 @@
+#!/usr/bin/env node
+/**
+ * Fetches a Learnosity item + its questions via the Data API and prints
+ * the raw JSON to stdout (or writes it to a file with --out ).
+ *
+ * Usage:
+ * node scripts/fetch-learnosity-item.mjs --item
+ * node scripts/fetch-learnosity-item.mjs --item --out ./item.json
+ *
+ * Credentials (in priority order):
+ * 1. Environment variables: LEARNOSITY_CONSUMER_KEY, LEARNOSITY_SECRET, LEARNOSITY_DOMAIN
+ * 2. Hardcoded defaults (Learnosity public sandbox creds — won't reach production item banks)
+ *
+ * For production item banks, set the env vars to the credentials from pie-api-aws/.env.
+ */
+
+import { createHmac } from 'node:crypto';
+import { writeFileSync } from 'node:fs';
+
+// ---------------------------------------------------------------------------
+// Credentials
+// ---------------------------------------------------------------------------
+const CONSUMER_KEY = process.env.LEARNOSITY_CONSUMER_KEY ?? '1JQLtMp0itQcxfSQ';
+const SECRET = process.env.LEARNOSITY_SECRET ?? 'jnBfNnhw9zLcYUx6iaLycpZnUGgHdYVTVrEvPPxE';
+const DOMAIN = process.env.LEARNOSITY_DOMAIN ?? 'localhost';
+const DATA_API_BASE = process.env.LEARNOSITY_DATA_API_BASE ?? 'https://data.learnosity.com';
+
+// ---------------------------------------------------------------------------
+// Learnosity SDK signing (translated from the PHP/Node SDK)
+// ---------------------------------------------------------------------------
+function utcTimestamp() {
+ const iso = new Date().toISOString();
+ return (
+ iso.slice(0, 4) +
+ iso.slice(5, 7) +
+ iso.slice(8, 10) +
+ '-' +
+ iso.slice(11, 13) +
+ iso.slice(14, 16)
+ );
+}
+
+function sign(requestBody) {
+ const timestamp = utcTimestamp();
+ const securityPacket = {
+ consumer_key: CONSUMER_KEY,
+ domain: DOMAIN,
+ timestamp,
+ };
+
+ const requestString = JSON.stringify(requestBody);
+ const signatureArray = [
+ securityPacket.consumer_key,
+ securityPacket.domain,
+ securityPacket.timestamp,
+ requestString,
+ 'get',
+ ];
+
+ const hmac = createHmac('sha256', SECRET);
+ hmac.update(signatureArray.join('_'));
+ securityPacket.signature = '$02$' + hmac.digest('hex');
+
+ return { security: JSON.stringify(securityPacket), request: requestString, action: 'get' };
+}
+
+async function dataGet(entity, requestBody) {
+ const signed = sign(requestBody);
+ const form = new URLSearchParams();
+ form.set('security', signed.security);
+ form.set('request', signed.request);
+ form.set('action', signed.action);
+
+ const url = `${DATA_API_BASE.replace(/\/$/, '')}/v1/itembank/${entity}`;
+ const res = await fetch(url, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
+ body: form.toString(),
+ });
+
+ const text = await res.text();
+ if (!res.ok) {
+ throw new Error(`Data API ${entity} returned ${res.status}:\n${text}`);
+ }
+
+ const json = JSON.parse(text);
+ if (!json.meta?.status) {
+ throw new Error(`Data API ${entity} error:\n${JSON.stringify(json.meta, null, 2)}`);
+ }
+
+ return json;
+}
+
+// ---------------------------------------------------------------------------
+// CLI argument parsing
+// ---------------------------------------------------------------------------
+const args = process.argv.slice(2);
+const itemRef = args[args.indexOf('--item') + 1];
+const outPath = args.includes('--out') ? args[args.indexOf('--out') + 1] : null;
+
+if (!itemRef) {
+ console.error('Usage: node scripts/fetch-learnosity-item.mjs --item [--out ]');
+ process.exit(1);
+}
+
+// ---------------------------------------------------------------------------
+// Fetch item + questions
+// ---------------------------------------------------------------------------
+console.error(`Fetching item: ${itemRef}`);
+
+const itemsResp = await dataGet('items', { references: [itemRef], status: ['published'] });
+const items = itemsResp.data;
+
+if (!items || items.length === 0) {
+ throw new Error(`Item not found: ${itemRef}`);
+}
+
+const item = items[0];
+console.error(`Found item: ${item.reference} (${item.questions?.length ?? 0} questions)`);
+
+// Collect all question references from the item
+const questionRefs = (item.questions ?? []).map((q) => q.reference);
+
+let questions = [];
+if (questionRefs.length > 0) {
+ console.error(`Fetching ${questionRefs.length} question(s): ${questionRefs.join(', ')}`);
+ const questionsResp = await dataGet('questions', { references: questionRefs });
+ questions = questionsResp.data ?? [];
+}
+
+const result = { item, questions };
+
+const output = JSON.stringify(result, null, 2);
+
+if (outPath) {
+ writeFileSync(outPath, output, 'utf-8');
+ console.error(`Written to ${outPath}`);
+} else {
+ process.stdout.write(output + '\n');
+}
diff --git a/skills-lock.json b/skills-lock.json
new file mode 100644
index 00000000..55ed4f05
--- /dev/null
+++ b/skills-lock.json
@@ -0,0 +1,35 @@
+{
+ "version": 1,
+ "skills": {
+ "grill-me": {
+ "source": "mattpocock/skills",
+ "sourceType": "github",
+ "skillPath": "skills/productivity/grill-me/SKILL.md",
+ "computedHash": "784f0dbb7403b0f00324bce9a112f715342777a0daee7bbb7385f9c6f0a170ea"
+ },
+ "grill-with-docs": {
+ "source": "mattpocock/skills",
+ "sourceType": "github",
+ "skillPath": "skills/engineering/grill-with-docs/SKILL.md",
+ "computedHash": "31a5b1ae116558bf7d3f633f442835f54bd7645923d4f45c7823e52a97317666"
+ },
+ "improve-codebase-architecture": {
+ "source": "mattpocock/skills",
+ "sourceType": "github",
+ "skillPath": "skills/engineering/improve-codebase-architecture/SKILL.md",
+ "computedHash": "c77b86b4332919499608f9af1880074e1fec65a59b95c70c27a9f39cd137865e"
+ },
+ "to-issues": {
+ "source": "mattpocock/skills",
+ "sourceType": "github",
+ "skillPath": "skills/engineering/to-issues/SKILL.md",
+ "computedHash": "73a91f30784523aa59ec9b02769576ebfc738e2cd5ad8f6441076031f0a5d5ac"
+ },
+ "to-prd": {
+ "source": "mattpocock/skills",
+ "sourceType": "github",
+ "skillPath": "skills/engineering/to-prd/SKILL.md",
+ "computedHash": "fd8c259f9c44eff08e29a1a2fc71a806a3568d279a55387a361f78620b10f2aa"
+ }
+ }
+}
diff --git a/tools/cli/src/commands/upstream/sync.ts b/tools/cli/src/commands/upstream/sync.ts
index 99f51a14..bfb004d6 100644
--- a/tools/cli/src/commands/upstream/sync.ts
+++ b/tools/cli/src/commands/upstream/sync.ts
@@ -994,7 +994,7 @@ export default class Sync extends Command {
const pkgJsonPath = join(pkgPath, 'package.json');
const pkgJson = (await loadPackageJson(pkgJsonPath)) as PackageJson | null;
- if (!pkgJson || !pkgJson.dependencies) {
+ if (!pkgJson?.dependencies) {
continue;
}
diff --git a/tools/cli/src/utils/dependency-integrity.ts b/tools/cli/src/utils/dependency-integrity.ts
index 06651177..6f7e69a0 100644
--- a/tools/cli/src/utils/dependency-integrity.ts
+++ b/tools/cli/src/utils/dependency-integrity.ts
@@ -77,7 +77,7 @@ export async function analyzePackageDependencyIntegrity(
}
const pkgJson = (await loadPackageJson(pkgJsonPath)) as PackageJson | null;
- if (!pkgJson || !pkgJson.name) {
+ if (!pkgJson?.name) {
return null;
}
diff --git a/tools/cli/tsconfig.json b/tools/cli/tsconfig.json
index 4b60c22c..44f007ea 100644
--- a/tools/cli/tsconfig.json
+++ b/tools/cli/tsconfig.json
@@ -8,6 +8,7 @@
"moduleResolution": "NodeNext",
"types": ["node", "bun-types"],
"noEmit": false,
+ "emitDeclarationOnly": false,
"allowImportingTsExtensions": false
},
"include": ["src/**/*"],
diff --git a/tsconfig.base.json b/tsconfig.base.json
index aba90f2e..80f3a70d 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -9,6 +9,7 @@
"allowImportingTsExtensions": true,
"isolatedModules": true,
"noEmit": false,
+ "emitDeclarationOnly": true,
"jsx": "preserve",
"strict": true,
"noUnusedLocals": true,