@@ -125,7 +125,7 @@ describe('chrome-parts builders DLA parity', () => {
});
});
- it('mountPartMarkup emits DLA anchored empty group markup with optional sticky state', () => {
+ it('mountPartMarkup emits reference anchored empty group markup with optional sticky state', () => {
const html = mountPartMarkup(
{ id: 'siteHeader', classes: ['chrome'] },
{ kind: 'sticky', toggleClass: 'is-scrolled', offset: 24 }
@@ -136,9 +136,9 @@ describe('chrome-parts builders DLA parity', () => {
`\n` +
`\n` +
`\n` +
- `\n` +
- `\n` +
- ``
+ `\n` +
+ `\n` +
+ ``
);
expect(blockMarkupRoundtrips(html)).toEqual({ ok: true });
});
diff --git a/packages/blocks-engine/src/__tests__/theme-chrome-signature-parity.test.ts b/packages/blocks-engine/src/__tests__/theme-chrome-signature-parity.test.ts
index a61173714..03c0644a0 100644
--- a/packages/blocks-engine/src/__tests__/theme-chrome-signature-parity.test.ts
+++ b/packages/blocks-engine/src/__tests__/theme-chrome-signature-parity.test.ts
@@ -6,8 +6,8 @@ import {
stripActiveNavState,
} from '../theme/index.js';
-describe('chrome signature DLA parity', () => {
- it('strips active nav state exactly like DLA chrome-canonicalize', () => {
+describe('chrome signature reference parity', () => {
+ it('strips active nav state exactly like reference chrome-canonicalize', () => {
expect(
stripActiveNavState(
'Home'
diff --git a/packages/blocks-engine/src/__tests__/theme-contracts.test.ts b/packages/blocks-engine/src/__tests__/theme-contracts.test.ts
index 0b245f4e3..e830bb6a5 100644
--- a/packages/blocks-engine/src/__tests__/theme-contracts.test.ts
+++ b/packages/blocks-engine/src/__tests__/theme-contracts.test.ts
@@ -536,7 +536,7 @@ describe('theme public contract', () => {
});
-describe('fallback diagnostics DLA parity', () => {
+describe('fallback diagnostics reference parity', () => {
it('emits dropped_images reasonCode with media-first precedence when text coverage is also below floor', () => {
const section = diagnosticSection({
sectionIndex: 7,
@@ -576,7 +576,7 @@ describe('fallback diagnostics DLA parity', () => {
});
});
- it('emits text_coverage_below_floor reasonCode when text is below the DLA floor without dropped media', () => {
+ it('emits text_coverage_below_floor reasonCode when text is below the reference floor without dropped media', () => {
const section = diagnosticSection({
sectionIndex: 3,
interactionModel: 'cta',
@@ -681,7 +681,7 @@ describe('fallback diagnostics DLA parity', () => {
]);
});
- it('matches the DLA decorative_asset_triaged diagnostic record shape', () => {
+ it('matches the reference decorative_asset_triaged diagnostic record shape', () => {
expect(
buildTriageRemovalDiagnostic({
page: '/about',
@@ -713,7 +713,7 @@ describe('fallback diagnostics DLA parity', () => {
});
});
-describe('formToBlocks DLA parity', () => {
+describe('formToBlocks reference parity', () => {
it('lets a consumer supply a provider-neutral form materializer', () => {
const custom: FormMaterializer = {
name: 'custom-provider',
@@ -748,7 +748,7 @@ describe('formToBlocks DLA parity', () => {
]);
});
- it('exports the DLA form-blocks surface and emits jetpack/field-* blocks for every mapped field kind', () => {
+ it('exports the reference form-blocks surface and emits jetpack/field-* blocks for every mapped field kind', () => {
const formToBlocksType: (form: SectionSpecForm) => FormBlocksResult = formToBlocks;
void formToBlocksType;
@@ -774,7 +774,7 @@ describe('formToBlocks DLA parity', () => {
}
});
- it('keeps authored options in DLA attr grammar for radio, select, and checkbox groups', () => {
+ it('keeps authored options in reference attr grammar for radio, select, and checkbox groups', () => {
const radio = formToBlocks(
sectionForm([formField({ kind: 'radio', label: 'Size', options: ['Small', 'Large', 'Medium'] })]),
);
@@ -812,7 +812,7 @@ describe('formToBlocks DLA parity', () => {
assertBalanced(result.markup);
});
- it('matches the DLA multi-field golden, including stable attr order and skipped fields', () => {
+ it('matches the reference multi-field golden, including stable attr order and skipped fields', () => {
const result = formToBlocks(
sectionForm(
[
@@ -850,7 +850,7 @@ describe('formToBlocks DLA parity', () => {
expect(result.markup).not.toContain('Campaign id');
});
- it('matches the DLA zero-field golden and escapes hostile labels like the DLA serializer', () => {
+ it('matches the reference zero-field golden and escapes hostile labels like the reference serializer', () => {
const result = formToBlocks(sectionForm([], 'Continue'));
expect(result.markup).toBe(
diff --git a/packages/blocks-engine/src/__tests__/theme-font-faces.test.ts b/packages/blocks-engine/src/__tests__/theme-font-faces.test.ts
index 00b9929fa..f84545114 100644
--- a/packages/blocks-engine/src/__tests__/theme-font-faces.test.ts
+++ b/packages/blocks-engine/src/__tests__/theme-font-faces.test.ts
@@ -122,7 +122,7 @@ describe('stripUnusedFontFaces', () => {
});
});
-describe('font helper DLA parity surface', () => {
+describe('font helper reference parity surface', () => {
it('extractGoogleFontCssUrls finds unique css/css2 URLs and decodes HTML ampersands', () => {
const urls = extractGoogleFontCssUrls([
'',
@@ -136,7 +136,7 @@ describe('font helper DLA parity surface', () => {
]);
});
- it('parseCapturedFontFaces preserves the DLA third-party host filter', () => {
+ it('parseCapturedFontFaces preserves the reference third-party host filter', () => {
const faces = parseCapturedFontFaces(`
@font-face {
font-family: "Roboto";
@@ -221,7 +221,7 @@ describe('font helper DLA parity surface', () => {
);
});
- it('absolutizeFontUrl and fontFilename match DLA golden behavior', () => {
+ it('absolutizeFontUrl and fontFilename match reference golden behavior', () => {
expect(absolutizeFontUrl('//cdn.example.com/fonts/acme.woff2')).toBe(
'https://cdn.example.com/fonts/acme.woff2'
);
@@ -240,7 +240,7 @@ describe('font helper DLA parity surface', () => {
expect(fontFilename(face)).toBe('Acme-Display-400.woff2');
});
- it('buildFontFaceCss emits the DLA self-hosted source-font block', () => {
+ it('buildFontFaceCss emits the reference self-hosted source-font block', () => {
const faces: LocalFontFace[] = [
{
family: 'Acme Display',
@@ -289,7 +289,7 @@ describe('font helper DLA parity surface', () => {
).toBe('a{}b{}');
});
- it('stripUnusedCarryFontFaces returns kept URLs and DLA stripped count', () => {
+ it('stripUnusedCarryFontFaces returns kept URLs and reference stripped count', () => {
const usedFace =
"@font-face{font-family:'Libre Baskerville';src:url(/fonts/libre.woff2) format('woff2')}";
const unusedFace =
diff --git a/packages/blocks-engine/src/__tests__/theme-html-fallback-surface.test.ts b/packages/blocks-engine/src/__tests__/theme-html-fallback-surface.test.ts
index 5663558ca..f28ee485e 100644
--- a/packages/blocks-engine/src/__tests__/theme-html-fallback-surface.test.ts
+++ b/packages/blocks-engine/src/__tests__/theme-html-fallback-surface.test.ts
@@ -41,7 +41,7 @@ describe('theme html fallback public surface', () => {
);
});
- it('classifies WordPress layout markup by the DLA marker set', () => {
+ it('classifies WordPress layout markup by the reference marker set', () => {
expect(
[
'',
@@ -137,7 +137,7 @@ describe('theme html fallback public surface', () => {
);
});
- it('rewrites internal hrefs with DLA path, host, fragment, and quote semantics', () => {
+ it('rewrites internal hrefs with reference path, host, fragment, and quote semantics', () => {
const missed: string[] = [];
const linkMap: InternalLinkMap = new Map([
['example.test/contact', '/contact/'],
@@ -158,7 +158,7 @@ describe('theme html fallback public surface', () => {
expect(missed).toEqual(['/missing']);
});
- it('reports DLA injection vectors and allows sanctioned theme PHP forms', () => {
+ it('reports reference injection vectors and allows sanctioned theme PHP forms', () => {
expect(
scanForInjection(
'',
diff --git a/packages/blocks-engine/src/__tests__/theme-ingest.test.ts b/packages/blocks-engine/src/__tests__/theme-ingest.test.ts
index 51e92166a..b9d5466da 100644
--- a/packages/blocks-engine/src/__tests__/theme-ingest.test.ts
+++ b/packages/blocks-engine/src/__tests__/theme-ingest.test.ts
@@ -70,7 +70,7 @@ describe('theme ingest', () => {
expect(services?.html).toContain('Blocks Engine Services');
});
- it('maps nested paths to DLA-compatible slugs', () => {
+ it('maps nested paths to reference-compatible slugs', () => {
expect(slugFromRelPath(join('index.html'))).toBe('home');
expect(slugFromRelPath(join('blog', 'index.html'))).toBe('blog');
expect(slugFromRelPath(join('blog', 'Launch Notes.html'))).toBe('blog-launch-notes');
diff --git a/packages/blocks-engine/src/__tests__/theme-native-low-level-parity.test.ts b/packages/blocks-engine/src/__tests__/theme-native-low-level-parity.test.ts
index a5f165513..a7e47cd33 100644
--- a/packages/blocks-engine/src/__tests__/theme-native-low-level-parity.test.ts
+++ b/packages/blocks-engine/src/__tests__/theme-native-low-level-parity.test.ts
@@ -1,6 +1,6 @@
import { describe, expect, it } from 'vitest';
-import expectedGoldens from '../__fixtures__/native-low-level-dla-goldens.json' with { type: 'json' };
+import expectedGoldens from '../__fixtures__/native-low-level-reference-goldens.json' with { type: 'json' };
import {
runNativeLowLevelParity,
type NativeLowLevelImpl,
@@ -101,8 +101,8 @@ function collectDiffs(actual: NativeLowLevelParityFile, expected: NativeLowLevel
return diffs;
}
-describe('native low-level helper DLA-today parity', () => {
- it('matches mechanically derived DLA helper outputs byte-for-byte and is stable on rerun', () => {
+describe('native low-level helper reference parity', () => {
+ it('matches mechanically derived reference helper outputs byte-for-byte and is stable on rerun', () => {
const first = runNativeLowLevelParity(engineImpl);
const second = runNativeLowLevelParity(engineImpl);
expect(stableJson(first)).toBe(stableJson(second));
diff --git a/packages/blocks-engine/src/__tests__/theme-native-renderers-dispatch-parity.test.ts b/packages/blocks-engine/src/__tests__/theme-native-renderers-dispatch-parity.test.ts
index 6e1e71f1d..214f4cc4a 100644
--- a/packages/blocks-engine/src/__tests__/theme-native-renderers-dispatch-parity.test.ts
+++ b/packages/blocks-engine/src/__tests__/theme-native-renderers-dispatch-parity.test.ts
@@ -1,6 +1,6 @@
import { describe, expect, it } from 'vitest';
-import expectedGoldens from '../__fixtures__/native-dispatch-renderer-dla-goldens.json' with { type: 'json' };
+import expectedGoldens from '../__fixtures__/native-dispatch-renderer-reference-goldens.json' with { type: 'json' };
import {
ALL_RENDER_SECTION_INTERACTION_MODELS,
nativeDispatchRenderCtx,
@@ -97,8 +97,8 @@ function renderDirectTarget(entry: NativeRenderSectionCase): NativeRenderOut {
}
}
-describe('native dispatch renderer DLA-today parity', () => {
- it('matches mechanically derived DLA renderer outputs byte-for-byte and is stable on rerun', () => {
+describe('native dispatch renderer reference parity', () => {
+ it('matches mechanically derived reference renderer outputs byte-for-byte and is stable on rerun', () => {
const first = runNativeDispatchRendererParity(engineImpl);
const second = runNativeDispatchRendererParity(engineImpl);
expect(stableJson(first)).toBe(stableJson(second));
diff --git a/packages/blocks-engine/src/__tests__/theme-native-renderers-section-parity.test.ts b/packages/blocks-engine/src/__tests__/theme-native-renderers-section-parity.test.ts
index 6326514b6..6e5ae75e3 100644
--- a/packages/blocks-engine/src/__tests__/theme-native-renderers-section-parity.test.ts
+++ b/packages/blocks-engine/src/__tests__/theme-native-renderers-section-parity.test.ts
@@ -1,6 +1,6 @@
import { describe, expect, it } from 'vitest';
-import expectedGoldens from '../__fixtures__/native-section-renderer-dla-goldens.json' with { type: 'json' };
+import expectedGoldens from '../__fixtures__/native-section-renderer-reference-goldens.json' with { type: 'json' };
import {
runNativeSectionRendererParity,
type NativeSectionRendererImpl,
@@ -46,8 +46,8 @@ function collectDiffs(actual: NativeSectionRendererParityFile, expected: NativeS
return diffs;
}
-describe('native section renderer DLA-today parity', () => {
- it('matches mechanically derived DLA renderer outputs byte-for-byte and is stable on rerun', () => {
+describe('native section renderer reference parity', () => {
+ it('matches mechanically derived reference renderer outputs byte-for-byte and is stable on rerun', () => {
const first = runNativeSectionRendererParity(engineImpl);
const second = runNativeSectionRendererParity(engineImpl);
expect(stableJson(first)).toBe(stableJson(second));
diff --git a/packages/blocks-engine/src/__tests__/theme-native-renderers-text-parity.test.ts b/packages/blocks-engine/src/__tests__/theme-native-renderers-text-parity.test.ts
index 15ba4666b..c1c826ee1 100644
--- a/packages/blocks-engine/src/__tests__/theme-native-renderers-text-parity.test.ts
+++ b/packages/blocks-engine/src/__tests__/theme-native-renderers-text-parity.test.ts
@@ -1,6 +1,6 @@
import { describe, expect, it } from 'vitest';
-import expectedGoldens from '../__fixtures__/native-text-renderer-dla-goldens.json' with { type: 'json' };
+import expectedGoldens from '../__fixtures__/native-text-renderer-reference-goldens.json' with { type: 'json' };
import {
runNativeTextRendererParity,
type NativeTextRendererImpl,
@@ -53,8 +53,8 @@ function collectDiffs(actual: NativeTextRendererParityFile, expected: NativeText
return diffs;
}
-describe('native text renderer DLA-today parity', () => {
- it('matches mechanically derived DLA renderer outputs byte-for-byte and is stable on rerun', () => {
+describe('native text renderer reference parity', () => {
+ it('matches mechanically derived reference renderer outputs byte-for-byte and is stable on rerun', () => {
const first = runNativeTextRendererParity(engineImpl);
const second = runNativeTextRendererParity(engineImpl);
expect(stableJson(first)).toBe(stableJson(second));
diff --git a/packages/blocks-engine/src/__tests__/theme-page-reconstruct-helpers-parity.test.ts b/packages/blocks-engine/src/__tests__/theme-page-reconstruct-helpers-parity.test.ts
index 2bafddcaf..48ffe9058 100644
--- a/packages/blocks-engine/src/__tests__/theme-page-reconstruct-helpers-parity.test.ts
+++ b/packages/blocks-engine/src/__tests__/theme-page-reconstruct-helpers-parity.test.ts
@@ -40,7 +40,7 @@ function section(partial: Partial): SectionSpec {
}
describe('page reconstruct helper public surface', () => {
- it('exports the DLA page-reconstruct helper surface from theme/index', () => {
+ it('exports the reference page-reconstruct helper surface from theme/index', () => {
expect(theme).toEqual(
expect.objectContaining({
normalizeCopy: expect.any(Function),
@@ -70,14 +70,14 @@ describe('page reconstruct helper public surface', () => {
});
});
-describe('normalizeCopy DLA parity', () => {
+describe('normalizeCopy reference parity', () => {
it('collapses whitespace and strips soft-hyphen and zero-width copy noise', () => {
expect(normalizeCopy(' foo\u00ad\u200b bar\n baz ')).toBe('foo bar baz');
expect(normalizeCopy('\ufeffA\u200c\tB\u200d\r\nC\u00ad')).toBe('A B C');
});
});
-describe('sanitizePatternHeaderField DLA parity', () => {
+describe('sanitizePatternHeaderField reference parity', () => {
it('strips PHP doc-comment and PHP-tag delimiters without rewriting visible text', () => {
expect(sanitizePatternHeaderField('*/ evil(); /*')).toBe('evil();');
expect(sanitizePatternHeaderField('a c')).toBe('a php b c');
@@ -87,7 +87,7 @@ describe('sanitizePatternHeaderField DLA parity', () => {
});
});
-describe('stripChrome DLA parity', () => {
+describe('stripChrome reference parity', () => {
it('drops leading header chrome and trailing footer/nav chrome while preserving middle content', () => {
const out = stripChrome([
section({
@@ -129,7 +129,7 @@ describe('stripChrome DLA parity', () => {
});
});
-describe('sanitizeSvgAsset DLA parity', () => {
+describe('sanitizeSvgAsset reference parity', () => {
it('removes active SVG content and keeps inert icon markup as concrete goldens', () => {
expect(
sanitizeSvgAsset(
diff --git a/packages/blocks-engine/src/__tests__/theme-reconstruct-dla-baseline-parity.test.ts b/packages/blocks-engine/src/__tests__/theme-reconstruct-reference-baseline-parity.test.ts
similarity index 87%
rename from packages/blocks-engine/src/__tests__/theme-reconstruct-dla-baseline-parity.test.ts
rename to packages/blocks-engine/src/__tests__/theme-reconstruct-reference-baseline-parity.test.ts
index 198896f3c..1adfcddc8 100644
--- a/packages/blocks-engine/src/__tests__/theme-reconstruct-dla-baseline-parity.test.ts
+++ b/packages/blocks-engine/src/__tests__/theme-reconstruct-reference-baseline-parity.test.ts
@@ -6,7 +6,7 @@ import {
reconstructBaselineCases,
type FrozenConvertedSection,
type FrozenReconstructCase,
-} from '../__fixtures__/page-reconstruct-dla-baseline.corpus.js';
+} from '../__fixtures__/page-reconstruct-reference-baseline.corpus.js';
import { reconstructNativeAggregate } from '../theme/reconstruct.js';
import type { SectionRenderOptions } from '../theme/native-reconstruct-types.js';
@@ -35,7 +35,7 @@ interface BaselineFile {
}
const GOLDEN_PATH = fileURLToPath(
- new URL('../__fixtures__/page-reconstruct-dla-baseline.goldens.json', import.meta.url),
+ new URL('../__fixtures__/page-reconstruct-reference-baseline.goldens.json', import.meta.url),
);
function hydrateOptions(testCase: FrozenReconstructCase): SectionRenderOptions {
@@ -84,7 +84,7 @@ function runCorpus(): BaselineFile {
function readGolden(): BaselineFile {
if (!existsSync(GOLDEN_PATH)) {
- throw new Error(`Missing DLA reconstruct baseline golden: ${GOLDEN_PATH}`);
+ throw new Error(`Missing reference reconstruct baseline golden: ${GOLDEN_PATH}`);
}
return JSON.parse(readFileSync(GOLDEN_PATH, 'utf8')) as BaselineFile;
}
@@ -119,14 +119,14 @@ function collectDiffs(actual: BaselineFile, expected: BaselineFile): string[] {
return diffs;
}
-describe('theme reconstruct DLA-today baseline parity', () => {
- it('matches the 35-case DLA baseline and is byte-stable across two runs', () => {
+describe('theme reconstruct reference baseline parity', () => {
+ it('matches the 35-case reference baseline and is byte-stable across two runs', () => {
const first = runCorpus();
const second = runCorpus();
expect(collectDiffs(first, second)).toEqual([]);
const diffs = collectDiffs(first, readGolden());
- console.info(`Engine reconstruct DLA baseline parity: cases=${first.cases.length} diffs=${diffs.length}`);
+ console.info(`Engine reconstruct reference baseline parity: cases=${first.cases.length} diffs=${diffs.length}`);
expect(diffs).toEqual([]);
});
});
diff --git a/packages/blocks-engine/src/__tests__/theme-region-audit-parity.test.ts b/packages/blocks-engine/src/__tests__/theme-region-audit-parity.test.ts
index a6335c65f..24be2b1c8 100644
--- a/packages/blocks-engine/src/__tests__/theme-region-audit-parity.test.ts
+++ b/packages/blocks-engine/src/__tests__/theme-region-audit-parity.test.ts
@@ -1,4 +1,4 @@
-import expectedGoldens from '../__fixtures__/region-audit-dla-goldens.json' with { type: 'json' };
+import expectedGoldens from '../__fixtures__/region-audit-reference-goldens.json' with { type: 'json' };
import {
regionAuditCases,
runRegionAuditParity,
@@ -26,7 +26,7 @@ function collectDiffs(actual: RegionAuditParityFile, expected: RegionAuditParity
for (const actualCase of actual.cases) {
const expectedCase = expectedById.get(actualCase.id);
if (!expectedCase) {
- diffs.push(`${actualCase.id}: missing from checked-in DLA goldens`);
+ diffs.push(`${actualCase.id}: missing from checked-in reference goldens`);
continue;
}
if (stableJson(actualCase.input) !== stableJson(expectedCase.input)) {
@@ -53,8 +53,8 @@ function collectDiffs(actual: RegionAuditParityFile, expected: RegionAuditParity
return diffs;
}
-describe('region audit DLA parity', () => {
- it('matches checked-in DLA region census and reconciliation goldens byte-for-byte', () => {
+describe('region audit reference parity', () => {
+ it('matches checked-in reference region census and reconciliation goldens byte-for-byte', () => {
const first = runRegionAuditParity({
extractSourceLandmarksFromHtml,
selectorForHtmlRoot,
diff --git a/packages/blocks-engine/src/__tests__/theme-section-coverage.test.ts b/packages/blocks-engine/src/__tests__/theme-section-coverage.test.ts
index ed1bd7fde..9da144f12 100644
--- a/packages/blocks-engine/src/__tests__/theme-section-coverage.test.ts
+++ b/packages/blocks-engine/src/__tests__/theme-section-coverage.test.ts
@@ -166,7 +166,7 @@ describe('theme section coverage contract', () => {
});
});
- describe('measureConvertedCoverage DLA parity', () => {
+ describe('measureConvertedCoverage reference parity', () => {
it('reports full converted text and image coverage as not lost', () => {
const result = measureConvertedCoverage(
captured(['Hero headline', 'Detailed copy', 'Start now'], ['assets/hero.jpg']),
@@ -223,7 +223,7 @@ describe('theme section coverage contract', () => {
expect(result.lost).toBe(true);
});
- it('folds glyph variants like the DLA section coverage oracle', () => {
+ it('folds glyph variants like the reference section coverage oracle', () => {
expect(
foldText(
'\u2018Smart\u2019 \u201cquotes\u201d \u2013 \u2014 \u2012 wait\u2026\nagain'
diff --git a/packages/blocks-engine/src/__tests__/theme-segment-parity.test.ts b/packages/blocks-engine/src/__tests__/theme-segment-parity.test.ts
index 5c6767f78..b28604185 100644
--- a/packages/blocks-engine/src/__tests__/theme-segment-parity.test.ts
+++ b/packages/blocks-engine/src/__tests__/theme-segment-parity.test.ts
@@ -3,7 +3,7 @@ import { describe, expect, it } from 'vitest';
import * as theme from '../theme/index.js';
import { segmentPage } from '../theme/index.js';
-describe('segmentPage DLA parity', () => {
+describe('segmentPage reference parity', () => {
it('exposes the additive segmentPage public surface from theme/index', () => {
expect(theme).toEqual(
expect.objectContaining({
@@ -12,7 +12,7 @@ describe('segmentPage DLA parity', () => {
);
});
- it('identifies header, nav, footer, and body sections on a DLA fixture', () => {
+ it('identifies header, nav, footer, and body sections on a reference fixture', () => {
const html =
'
Hi
Feat
';
@@ -70,7 +70,7 @@ describe('segmentPage DLA parity', () => {
]);
});
- it('segments a no-chrome page and escapes loose decoded text like DLA', () => {
+ it('segments a no-chrome page and escapes loose decoded text like reference', () => {
const html =
'Hello <b>bold</b>
S text
';
diff --git a/packages/blocks-engine/src/__tests__/theme-source-assets-parity.test.ts b/packages/blocks-engine/src/__tests__/theme-source-assets-parity.test.ts
index 2bdd45521..78fedc6e7 100644
--- a/packages/blocks-engine/src/__tests__/theme-source-assets-parity.test.ts
+++ b/packages/blocks-engine/src/__tests__/theme-source-assets-parity.test.ts
@@ -14,7 +14,7 @@ import {
WP_COMPAT_CSS,
} from '../theme/index.js';
-const DLA_WP_COMPAT_CSS = `/* wp-compat: neutralize WP wrapper interference for carried source CSS */
+const REFERENCE_WP_COMPAT_CSS = `/* wp-compat: neutralize WP wrapper interference for carried source CSS */
/* NOTE deliberately NO .wp-block-template-part{display:contents} here: our
parts use tagName header/footer, so the wrapper IS the semantic element —
display:contents would destroy the box that source header{}/footer{} rules
@@ -83,7 +83,7 @@ function writeFixture(dir: string, relPath: string, contents = ''): void {
writeFileSync(abs, contents, 'utf8');
}
-describe('source assets DLA parity', () => {
+describe('source assets reference parity', () => {
it('exposes the additive source-assets public surface from theme/index', () => {
expect(theme).toEqual(
expect.objectContaining({
@@ -105,8 +105,8 @@ describe('source assets DLA parity', () => {
);
});
- it('keeps the WP compat CSS byte-for-byte equal to the DLA golden string', () => {
- expect(WP_COMPAT_CSS).toBe(DLA_WP_COMPAT_CSS);
+ it('keeps the WP compat CSS byte-for-byte equal to the reference golden string', () => {
+ expect(WP_COMPAT_CSS).toBe(REFERENCE_WP_COMPAT_CSS);
});
it('replays source nav anchor rules against core/navigation wrapper markup', () => {
@@ -206,7 +206,7 @@ describe('source assets DLA parity', () => {
});
});
- it('collects local HTML img src refs with DLA regex and path resolution semantics', () => {
+ it('collects local HTML img src refs with reference regex and path resolution semantics', () => {
withTempDir((dir) => {
writeFixture(dir, 'pages/deep/img/double.png');
writeFixture(dir, 'pages/deep/img/single.jpg');
@@ -309,7 +309,7 @@ describe('source assets DLA parity', () => {
expect(result.jsFiles).toEqual(['assets/js/lib.js', 'assets/js/app.js']);
expect(result.skippedUnlinked).toEqual(['stale.js', 'style.css']);
const expectedBase =
- DLA_WP_COMPAT_CSS +
+ REFERENCE_WP_COMPAT_CSS +
[
'\n.base { background: url(media/bg.png); color: black; }',
'.base { color: white; }',
diff --git a/packages/blocks-engine/src/__tests__/theme-variation-hoist-parity.test.ts b/packages/blocks-engine/src/__tests__/theme-variation-hoist-parity.test.ts
index e759d856b..17e5ceefa 100644
--- a/packages/blocks-engine/src/__tests__/theme-variation-hoist-parity.test.ts
+++ b/packages/blocks-engine/src/__tests__/theme-variation-hoist-parity.test.ts
@@ -1,6 +1,6 @@
import { describe, expect, it } from 'vitest';
-import expectedGoldens from './fixtures/variation-hoist-dla-goldens.json' with { type: 'json' };
+import expectedGoldens from './fixtures/variation-hoist-reference-goldens.json' with { type: 'json' };
import {
runVariationHoistParity,
variationHoistCases,
@@ -58,7 +58,7 @@ function collectDiffs(actual: VariationHoistParityFile, expected: VariationHoist
for (const actualCase of actual.cases) {
const expectedCase = expectedById.get(actualCase.id);
if (!expectedCase) {
- diffs.push(`${actualCase.id}: missing from checked-in DLA goldens`);
+ diffs.push(`${actualCase.id}: missing from checked-in reference goldens`);
continue;
}
if (stableJson(actualCase.options) !== stableJson(expectedCase.options)) {
@@ -82,8 +82,8 @@ function collectDiffs(actual: VariationHoistParityFile, expected: VariationHoist
return diffs;
}
-describe('variation hoist DLA parity', () => {
- it('matches checked-in DLA hoistVariations and applyHoistSwaps goldens byte-for-byte', () => {
+describe('variation hoist reference parity', () => {
+ it('matches checked-in reference hoistVariations and applyHoistSwaps goldens byte-for-byte', () => {
const first = runVariationHoistParity(engineImpl) as VariationHoistParityFile;
const second = runVariationHoistParity(engineImpl) as VariationHoistParityFile;
expect(stableJson(first)).toBe(stableJson(second));
diff --git a/packages/blocks-engine/src/theme/assemble.ts b/packages/blocks-engine/src/theme/assemble.ts
index 9e67bef10..ca3d5702d 100644
--- a/packages/blocks-engine/src/theme/assemble.ts
+++ b/packages/blocks-engine/src/theme/assemble.ts
@@ -100,7 +100,7 @@ export function assemble(parts: ThemeAssemblyParts): ThemeModel {
* global block gap would otherwise inject a ~24px margin above every section after
* the first, reading as a stray stripe above full-bleed bands. This neutralizes the
* block gap on those wrappers only — via CSS, so the section block markup stays
- * byte-identical to the DLA reference. Blocks the user adds in the editor are not
+ * byte-identical to the reference implementation. Blocks the user adds in the editor are not
* align:full, so they keep WordPress's default block gap. The selector outweighs
* core's zero-specificity `:where(...) > * + *` gap rule.
*/
diff --git a/packages/blocks-engine/src/theme/chrome-parts-builders.ts b/packages/blocks-engine/src/theme/chrome-parts-builders.ts
index 84f3ddf81..c840b5cdb 100644
--- a/packages/blocks-engine/src/theme/chrome-parts-builders.ts
+++ b/packages/blocks-engine/src/theme/chrome-parts-builders.ts
@@ -218,10 +218,10 @@ function stickyStateBlock(sticky: StickyBehavior): string {
'\\u0027'
);
return (
- `\n\n` +
- `
\n' +
@@ -16,7 +16,7 @@ const DLA_CAPTURED_MARKUP =
'\n' +
'';
-const DLA_CAPTURED_CSS =
+const REFERENCE_CAPTURED_CSS =
'.lib-i513454c2bb{margin:20px 0 0;font-size:clamp(3rem,9vw,6.5rem)}\n' +
'.lib-i91a84cc172{max-width:46ch}';
@@ -54,7 +54,7 @@ function sectionSpec(overrides: Partial = {}): SectionSpec {
}
describe('preserveDomStrategy lib-i parity', () => {
- it('emits byte-identical lib-i core markup and css to DLA emitSectionBlocks', () => {
+ it('emits byte-identical lib-i core markup and css to reference emitSectionBlocks', () => {
const aggregate = reconstructNativeAggregate(
[
sectionSpec({
@@ -67,8 +67,8 @@ describe('preserveDomStrategy lib-i parity', () => {
const engineMarkup = aggregate.sectionMarkup[0];
const engineCss = aggregate.dedup?.cssRules?.join('\n') ?? '';
- expect(engineMarkup).toBe(DLA_CAPTURED_MARKUP);
- expect(engineCss).toBe(DLA_CAPTURED_CSS);
- console.info('P3-S3 lib-i DLA parity identical=true');
+ expect(engineMarkup).toBe(REFERENCE_CAPTURED_MARKUP);
+ expect(engineCss).toBe(REFERENCE_CAPTURED_CSS);
+ console.info('P3-S3 lib-i reference parity identical=true');
});
});
diff --git a/packages/blocks-engine/src/theme/preserve-dom/strategy.ts b/packages/blocks-engine/src/theme/preserve-dom/strategy.ts
index 22ad14846..14428a8ce 100644
--- a/packages/blocks-engine/src/theme/preserve-dom/strategy.ts
+++ b/packages/blocks-engine/src/theme/preserve-dom/strategy.ts
@@ -263,7 +263,7 @@ function emitChild($: CheerioAPI, el: Element, sheet: InstanceStyleSheet, state:
// Un-convertible element kind (svg, table, form, media): keep it losslessly as a nested
// core/html island instead of dropping it — preserves the visual AND its source classes
// (so carried CSS still binds → visual parity) while the rest of the section stays native
- // editable blocks. This is DLA's per-element island behavior (apply-block-recipe).
+ // editable blocks. This is the reference implementation's per-element island behavior (apply-block-recipe).
const verbatim = $.html(el).trim();
if (verbatim) return { markup: coreHtmlIsland(verbatim), clean: true };
return { markup: '', clean: false };
diff --git a/packages/blocks-engine/src/theme/reconstruct.ts b/packages/blocks-engine/src/theme/reconstruct.ts
index 8f19a7556..4a198e7ca 100644
--- a/packages/blocks-engine/src/theme/reconstruct.ts
+++ b/packages/blocks-engine/src/theme/reconstruct.ts
@@ -620,7 +620,7 @@ function islandDecision(
export const classifySemanticStrategy: SectionStrategy = {
name: 'classify-semantic',
render(section, options, ctx) {
- // Convert-or-island hybrid (ported from data-liberation-agent): a clean canonical
+ // Convert-or-island hybrid (ported from the reference implementation): a clean canonical
// conversion (wpHtmlResidue 0) becomes editable blocks; otherwise the section
// falls back to a faithful verbatim island. nativeDecision is the last resort for
// synthetic specs that carry no source HTML to island.
@@ -633,7 +633,7 @@ export const classifySemanticStrategy: SectionStrategy = {
},
};
-// Default reconstruction (the DLA-faithful path): preserve-dom first — native editable
+// Default reconstruction (the reference-faithful path): preserve-dom first — native editable
// blocks that keep their source classes (so carried CSS binds → visual parity), with nested
// core/html islands for the elements that can't become core blocks. Falls back to a whole-
// section verbatim island, then native rendering, only when preserve-dom has no usable source
@@ -650,13 +650,13 @@ export const defaultReconstructStrategy: SectionStrategy = {
},
};
-// Structured reconstruction (the pre-preserve-dom DLA blocks-path fidelity): interpret the
+// Structured reconstruction (the pre-preserve-dom reference blocks-path fidelity): interpret the
// SectionSpec into clean, theme-styled canonical blocks FIRST (nativeDecision → renderSection →
// renderCover/renderCardGrid/renderMediaText/…), with a verbatim core/html island only as the
// coverage fallback. Unlike defaultReconstructStrategy/classifySemanticStrategy, it does NOT
// preserve source classes or island whole sections by default — so the output is self-contained
// and renders from the THEME alone, with no dependency on carried source CSS. This is the right
-// strategy for a no-CSS-carry blocks pipeline (e.g. data-liberation's blocks reconstruct path);
+// strategy for a no-CSS-carry blocks pipeline (e.g. a capture producer's blocks reconstruct path);
// the carried-CSS paths (local-convert, theme-carry) keep defaultReconstructStrategy. Additive:
// selecting it does not change the default, so those paths are unaffected.
export const structuredStrategy: SectionStrategy = {
diff --git a/php-transformer/README.md b/php-transformer/README.md
index 6beaa48fe..df64cafb7 100644
--- a/php-transformer/README.md
+++ b/php-transformer/README.md
@@ -189,7 +189,9 @@ Visual parity tooling should use the product-neutral report/config contracts in
WordPress materializers that consume the self-contained `wordpress-site-plan/v2` contract should use `WordPressSitePlan\WordPressSitePlanView::fromResult()`. It preserves the exact canonical plan plus Gutenberg gaps, companion-plugin payload, font materialization metadata, and plan diagnostics while omitting the duplicated compiled-site, root asset, document, and block projections.
-Icon-only social rows carry a uniform glyph colour onto `core/social-links`. A captured `data-dla-glyph-color` wins over decoding the icon image, and the attribute never reaches output; see [Social icon glyph colour](docs/glyph-color.md).
+Capture tools describe what they observed in a rendered source (document variants, dialog and disclosure bindings, galleries, collection filters, glyph colour) with the producer-neutral capture-evidence vocabulary: `data-blocks-engine-capture-*` attributes and classes plus `blocks-engine-capture/*` sidecar schemas, published as `Contract\CaptureEvidence` and documented in [Capture evidence](docs/contracts/capture-evidence.md). Any capture producer may emit it.
+
+Icon-only social rows carry a uniform glyph colour onto `core/social-links`. A captured `data-blocks-engine-capture-glyph-color` wins over decoding the icon image, and the attribute never reaches output; see [Social icon glyph colour](docs/glyph-color.md).
`HtmlTransformer` preserves syntax-highlight spans inside `
` when they use safe inline tags and bounded attributes, while plain code remains escaped as text. Figure-wrapped testimonials and quote shapes are normalized to core quote or pullquote blocks with attribution from `cite`, `footer`, or `figcaption` content.
diff --git a/php-transformer/composer.json b/php-transformer/composer.json
index 82d0ab710..5024d20ef 100644
--- a/php-transformer/composer.json
+++ b/php-transformer/composer.json
@@ -69,6 +69,9 @@
"php tests/contract/namespace-resolution.php",
"php tests/contract/layer-direction.php",
"php tests/contract/throw-classification.php",
+ "php tests/contract/producer-neutral-source.php",
+ "php tests/contract/capture-evidence-vocabulary.php",
+ "php tests/contract/capture-evidence-equivalence.php",
"php tests/contract/runtime-no-wordpress.php",
"php tests/contract/runtime-no-markdown.php",
"php tests/contract/runtime-wordpress-stubs.php",
diff --git a/php-transformer/docs/captured-galleries.md b/php-transformer/docs/captured-galleries.md
index 678211158..baf10663b 100644
--- a/php-transformer/docs/captured-galleries.md
+++ b/php-transformer/docs/captured-galleries.md
@@ -18,8 +18,8 @@ different inline and expanded order; selection maps each inline frame to its
observed expanded frame by image identity, rather than assuming equal indices.
The consumer admits 2–24 frames and a complete, identity-checked selection
-bijection. The root's `data-dla-gallery-source` and
-`data-dla-gallery-capture-width` bind evidence to the emitted responsive document.
+bijection. The root's `data-blocks-engine-capture-gallery-source` and
+`data-blocks-engine-capture-gallery-capture-width` bind evidence to the emitted responsive document.
A collapsed responsive document can retain one captured viewport. Each emitted
native carousel keeps its own initial state. Complete inline-only evidence still
produces native navigation; an unobserved lightbox remains unproven.
@@ -43,7 +43,7 @@ contracts used by independently authored carousels and dialogs.
checks trigger identity and native-image roundtrip, and rejects an identity-wrong
selection that has the correct array shape.
-For the actual producer-to-WordPress gate, provide a genuine portable DLA capture
+For the actual producer-to-WordPress gate, provide a genuine portable capture
at `tests/fixtures/captured-gallery/`, including `website/`, the matching capture
receipt, and interaction report. Then run:
diff --git a/php-transformer/docs/collection-filters.md b/php-transformer/docs/collection-filters.md
index 1203e8630..3d8821d47 100644
--- a/php-transformer/docs/collection-filters.md
+++ b/php-transformer/docs/collection-filters.md
@@ -1,6 +1,6 @@
# Verified editable collection filters
-The collection filter companion consumes Data Liberation Agent's bounded
+The collection filter companion consumes a capture producer's bounded
`typed-search` evidence. It is a local collection predicate, with independently
observed category membership, rather than a site-wide WordPress search.
@@ -36,17 +36,17 @@ inside/after placement and is shown only when no item matches.
## Finite bootstrap
-`finiteBootstrap.schema` must be `data-liberation/finite-bootstrap/v1`. That
+`finiteBootstrap.schema` must be `blocks-engine-capture/finite-bootstrap/v1`. That
record is admitted only when restoration, replay, observed-response replay,
intercepted verification, declared count, complete text-only coverage, observed
answers, universal-query order, and ordered global/category probes all recompute.
Category mode shows the selected category. A nonempty query searches the whole
universe and hides the category strip, not the input, status, or results.
-Optional `finiteBootstrap.status` uses `data-liberation/collection-status/v1`.
+Optional `finiteBootstrap.status` uses `blocks-engine-capture/collection-status/v1`.
Absent status is valid and adds no label. A present record is projected only
when every node has source HTML, `{count}` or `{query}` tokens, matching binds,
`before-items` or `after-items`, and `hidesAtZero: true`. The runtime writes
-`textContent` from the editable `data-dla-status-template` attribute. An empty
+`textContent` from the editable `data-blocks-engine-capture-status-template` attribute. An empty
query hides those labels. At zero they stay hidden. When the source empty
state contains that count template rendered at zero with the same tag, role,
live attributes, and class, that node remains the collection status and the
diff --git a/php-transformer/docs/contracts/capture-evidence.md b/php-transformer/docs/contracts/capture-evidence.md
new file mode 100644
index 000000000..57002f703
--- /dev/null
+++ b/php-transformer/docs/contracts/capture-evidence.md
@@ -0,0 +1,226 @@
+# Capture evidence
+
+A capture tool renders a source site and records what it observed beside the
+captured HTML: which copy of the page is the mobile document, which control
+opens which panel, how a gallery cycles, which items a collection filter
+shows, the rendered colour of an icon. Blocks Engine reads that evidence to
+produce native, editable blocks instead of a frozen snapshot.
+
+This page is Blocks Engine's **producer-neutral input contract** for that
+evidence. Any capture tool may emit it. The names are published once in
+[`CaptureEvidence`](../../src/Contract/CaptureEvidence.php); the transformer
+never spells them anywhere else, and
+`tests/contract/capture-evidence-vocabulary.php` keeps this page, the
+constants and their use in `src/` identical.
+
+## Namespace
+
+- Every attribute, class, id suffix and probe token starts with
+ `data-blocks-engine-capture-` (id suffixes with `--data-blocks-engine-capture-`).
+ Classes use the same prefix as attributes on purpose: `blocks-engine-*`
+ classes are the engine's own generated classes, which conversion strips or
+ ignores as source styling, so capture classes must stay outside it.
+- Sidecar schemas are `blocks-engine-capture//v`.
+- A producer that observes something this page does not list may still use
+ the namespace; the transformer ignores names it does not read.
+- Attribute values are case-sensitive and trimmed unless noted. A flag
+ attribute is present-or-absent; its value is ignored.
+
+## Names
+
+Two audiences read this vocabulary:
+
+- **Consumed by Blocks Engine**: every section below except the last. The
+ transformer reads (and, where marked, emits) these names.
+- **Published for downstream importers**: the last section. Blocks Engine
+ never reads these names; it publishes them so importers such as Static Site
+ Importer and every producer share one spelling. They are flagged in
+ `CaptureEvidence::PUBLISHED_FOR_DOWNSTREAM`, and the contract test fails if
+ the transformer starts reading one without moving it to a consumed section.
+
+### Prefixes
+
+| Name | Kind | Meaning |
+| ---- | ---- | ------- |
+| `data-blocks-engine-capture-` | attribute prefix | Every capture attribute. Author selectors negating a capture attribute on `html`/`:root` are runtime document state and stay live. |
+| `--data-blocks-engine-capture-` | id suffix prefix | A non-default document variant's copy of a shared source id: `--data-blocks-engine-capture-mobile`, or `--data-blocks-engine-capture-` for `site-document-variant-` and declared device documents. The transformer applies the same suffix and points variant-scoped author id selectors at it. |
+
+### Document variants
+
+| Name | Kind | Value | Meaning |
+| ---- | ---- | ----- | ------- |
+| `data-blocks-engine-capture-document-scope` | attribute (flag) | ignored | The element is a body-equivalent document root. With `device-document` it declares a device profile. |
+| `data-blocks-engine-capture-device-document` | attribute | `[a-z][a-z0-9_-]{0,63}` | Profile id of a declared document scope. |
+| `data-blocks-engine-capture-mobile-document` | class | — | Root of the mobile copy of a responsive capture. |
+| `data-blocks-engine-capture-desktop-document` | class | — | Root of the desktop (default) copy of a responsive capture. |
+| `data-blocks-engine-capture-responsive-counterpart-` | class prefix | 12 lowercase hex digits | Pairs an element in the default document with its counterpart in another variant. |
+| `data-blocks-engine-capture-responsive-source` | attribute | source id | Source identity of a responsive counterpart; ignored when comparing shared chrome. |
+| `data-blocks-engine-capture-source-media` | attribute on `'
. '' . $body . $disclosureRuntime . '';
@@ -45,15 +45,15 @@
// 1. A builder widget root whose class tokens look like an app root, inside a
// declared capture scope, stays editable: its attribute-bound controls are
// retained by native blocks instead of preserving the subtree as core/html.
-$scoped = $compile($page('
'), 'Widget headings materialize as native heading blocks.');
$assert(str_contains($scopedMarkup, '
Summary for entry 3.
'), 'Widget summaries materialize as native paragraph blocks.');
-$assert(3 === substr_count($scopedMarkup, 'data-dla-dialog-trigger="entry-menu-'), 'Every attribute-bound trigger keeps its runtime binding on the frontend.');
-$assert(str_contains($scopedMarkup, 'data-dla-dialog-close="entry-menu-1"'), 'The attribute-bound close control keeps its runtime binding.');
+$assert(3 === substr_count($scopedMarkup, 'data-blocks-engine-capture-dialog-trigger="entry-menu-'), 'Every attribute-bound trigger keeps its runtime binding on the frontend.');
+$assert(str_contains($scopedMarkup, 'data-blocks-engine-capture-dialog-close="entry-menu-1"'), 'The attribute-bound close control keeps its runtime binding.');
$assert(str_contains($scopedMarkup, 'feed-root blog-surface is-desktop app-desktop'), 'The widget root keeps its source classes on a native carrier.');
// 2. The same widget outside a declared capture scope keeps the established
@@ -64,7 +64,7 @@
// 3. Inside a captured scope, targets addressed by identity (class or id
// selectors) are still app-shell evidence.
$identityAddressed = (new HtmlTransformer())->transform(
- '
'
+ '
'
. '
Cell one
Cell two
',
array('source' => 'index.html', 'runtime_dom_selectors' => array('.cell'), 'runtime_behavioral_selectors' => array('.cell'))
)->toArray();
@@ -74,16 +74,16 @@
// stays with the media owner, which saves the host verbatim, instead of
// becoming a raw core/html island.
$effectsRuntime = '';
-$host = ''
+$host = ''
. '';
$hostResult = $compile('Hero'
- . '
'), 'Content beside the bound host stays native.');
$hostDomIslands = array_filter($islands($hostResult, 'dom'), static fn (array $island): bool => '#hero-frame' === ($island['selector'] ?? ''));
$assert(array() === $hostDomIslands, 'Responsive media retains the runtime DOM contract natively, so no runtime DOM island is recorded for the host.');
diff --git a/php-transformer/tests/contract/dialog-document-scope.php b/php-transformer/tests/contract/dialog-document-scope.php
index e3a04eead..08e287e82 100644
--- a/php-transformer/tests/contract/dialog-document-scope.php
+++ b/php-transformer/tests/contract/dialog-document-scope.php
@@ -19,8 +19,8 @@
$names = array_column($blocks, 'blockName');
$assert(!in_array('core/html', $names, true), 'A document-scope lookup and deeply nested dialog do not turn the page into core/html: ' . $variant);
$assert(in_array('core/heading', $names, true) && in_array('core/paragraph', $names, true), 'Unrelated main/footer remain native editable blocks.');
- $assert(str_contains($result['serialized_blocks'], 'data-dla-document-scope') && str_contains($result['serialized_blocks'], 'data-dla-dialog-ancestor-unverified'), 'Document identity and unverified ancestor proof remain reviewable in emitted markup.');
- $assert(str_contains($result['serialized_blocks'], 'data-dla-dialog-panel="gallery-' . $variant . '"') && str_contains($result['serialized_blocks'], 'Captured image caption.'), 'The wired popup remains editable in its declared source document scope.');
+ $assert(str_contains($result['serialized_blocks'], 'data-blocks-engine-capture-document-scope') && str_contains($result['serialized_blocks'], 'data-blocks-engine-capture-dialog-ancestor-unverified'), 'Document identity and unverified ancestor proof remain reviewable in emitted markup.');
+ $assert(str_contains($result['serialized_blocks'], 'data-blocks-engine-capture-dialog-panel="gallery-' . $variant . '"') && str_contains($result['serialized_blocks'], 'Captured image caption.'), 'The wired popup remains editable in its declared source document scope.');
$assert('pass' === (new Runtime())->validateBlockSerialization($result['blocks'])['status'], 'The document and popup serialize as valid editable blocks.');
}
$unknown = (new ArtifactCompiler())->compile($fixture('desktop', true))->toArray();
@@ -32,7 +32,7 @@
$static = $fixture();
$static['files']['index.html'] = str_replace(array('', ''), array('
', '
'), $static['files']['index.html']);
-$static['files']['index.html'] = str_replace('data-liberation-desktop-document', 'site-document-variant-portrait', $static['files']['index.html']);
+$static['files']['index.html'] = str_replace('data-blocks-engine-capture-desktop-document', 'site-document-variant-portrait', $static['files']['index.html']);
$result = (new ArtifactCompiler())->compile($static)->toArray();
foreach (array_filter($flatten($result['blocks']), static fn(array $block): bool => 'core/html' === $block['blockName']) as $block) {
$assert(!str_contains($block['innerHTML'], 'Unrelated main copy.'), 'An unrelated canvas does not move a page-wide fallback to the next static ancestor.');
diff --git a/php-transformer/tests/contract/entry-point-transform-parity.php b/php-transformer/tests/contract/entry-point-transform-parity.php
index 373f13341..63343d6fa 100644
--- a/php-transformer/tests/contract/entry-point-transform-parity.php
+++ b/php-transformer/tests/contract/entry-point-transform-parity.php
@@ -97,8 +97,8 @@
'responsive document variants' => array(
'files' => array(
'index.html' => ''
- . '
' . $menu() . '
Home
'
- . '
' . $menu() . '
Home
'
+ . '
' . $menu() . '
Home
'
+ . '
' . $menu() . '
Home
'
. '',
),
'options' => array(),
diff --git a/php-transformer/tests/contract/form-control-not-menu-toggle.php b/php-transformer/tests/contract/form-control-not-menu-toggle.php
index f2f1b72bb..c0f5aab99 100644
--- a/php-transformer/tests/contract/form-control-not-menu-toggle.php
+++ b/php-transformer/tests/contract/form-control-not-menu-toggle.php
@@ -15,11 +15,11 @@
// navigation. Far below it, a contact form has a phone field whose country
// picker is a labelless button with `aria-expanded`. That picker opens its own
// list; it must not be taken for the menu toggle and claim the menu dialog.
-$disclosure = ''
- . '' . "\n" . '';
-$roots = $method->invoke(null, $variant('data-liberation-desktop-document', 'SITE_HEADER') . "\n" . $variant('data-liberation-mobile-document', 'SITE_HEADER--dla-mobile'));
-$assert(array('SITE_HEADER', 'SITE_HEADER--dla-mobile') === $roots, '4a: each viewport partition contributes its own root anchor: ' . json_encode($roots));
+$roots = $method->invoke(null, $variant('data-blocks-engine-capture-desktop-document', 'SITE_HEADER') . "\n" . $variant('data-blocks-engine-capture-mobile-document', 'SITE_HEADER--data-blocks-engine-capture-mobile'));
+$assert(array('SITE_HEADER', 'SITE_HEADER--data-blocks-engine-capture-mobile') === $roots, '4a: each viewport partition contributes its own root anchor: ' . json_encode($roots));
$plain = $method->invoke(null, '');
$assert(array('site-top') === $plain, '4b: an unpartitioned part names its single root: ' . json_encode($plain));
$wrapped = $method->invoke(null, '
')->toArray();
+$wixCapture = (new HtmlTransformer())->transform('
First testimonial
First complete testimonial.
Second testimonial
Second complete testimonial.
')->toArray();
$wixBlock = $wixCapture['blocks'][0] ?? array();
$wixMarkup = (string) ($wixCapture['serialized_blocks'] ?? '');
$assert(
diff --git a/php-transformer/tests/unit/authored-marquee-block.php b/php-transformer/tests/unit/authored-marquee-block.php
index b75176253..bdda90c45 100644
--- a/php-transformer/tests/unit/authored-marquee-block.php
+++ b/php-transformer/tests/unit/authored-marquee-block.php
@@ -137,7 +137,7 @@
$assert(!str_contains((string) ($media['serialized_blocks'] ?? ''), 'layout-shell'), 'a paragraph with media is not an empty layout shell');
$interactive = ( new HtmlTransformer() )->transform('')->toArray();
$assert(!str_contains((string) ($interactive['serialized_blocks'] ?? ''), 'layout-shell'), 'a control without a source layout box is not claimed as empty geometry');
-$sourceParagraph = '
';
+$sourceParagraph = '
';
$sourceCss = '.teOS5h{gap:var(--spaceBetweenItems,10px);display:flex}.dblW_r{overflow-x:clip}.Qbdehy{font:var(--font);padding-right:var(--spaceBetweenItems,10px)}.Qbdehy[data-marquee-animation=left]{animation-duration:var(--marquee-duration,40s)}.kgbJ1s:not(:focus):not(:active){opacity:0;width:1px}';
$sourceCopies = ( new HtmlTransformer() )->transform($sourceParagraph . $sourceParagraph, array( 'static_css' => $sourceCss, 'runtime_dom_selectors' => array() ))->toArray();
$sourceMarkup = (string) ($sourceCopies['serialized_blocks'] ?? '');
diff --git a/php-transformer/tests/unit/authored-select-block.php b/php-transformer/tests/unit/authored-select-block.php
index be51259b2..365acaec0 100644
--- a/php-transformer/tests/unit/authored-select-block.php
+++ b/php-transformer/tests/unit/authored-select-block.php
@@ -113,8 +113,8 @@ function walk( node ) { if ( ! node || 'object' !== typeof node ) return null; i
$assert($selectedMarkup === $saveMarkup($generator, $selectedAttrs), 'selected-value companion metadata does not invalidate the saved native select');
$listboxResult = ( new HtmlTransformer() )->transform(
- '