@echelon-foundry/design-system 0.13.0-main.263.1 → 0.13.0-main.264.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,17 @@ published as GitHub release tarballs
7
7
  and to npm. Earlier releases are described in `docs/CONSUMING-FORMA.md` and
8
8
  `HANDOFF.md`.
9
9
 
10
+ ## Unreleased
11
+
12
+ Patch candidate (proposed 0.13.1): marketing containment (MKT-CONTAIN, WI-0043). Found by the Echelon Diagnostic Framework site migration to 0.13.0. No class, token, element or attribute was removed or renamed.
13
+
14
+ ### Fixed
15
+ - **Text containment in marketing components.** LRP-001 (0.13.0) passed `overflow-wrap: break-word` only to the application containers. Marketing components hold the same kind of content, so list items, spans and divs inside them could still escape: on 0.13.0 a release URL in a `span` escaped `.ef-card` by 160px at 320px, and at 200% text ordinary list words ("explanations", "propagation") escaped a card by up to 18px. `.ef-site` now passes `break-word` from `.ef-hero`, `.ef-section-heading`, `.ef-card`, `.ef-facts`, `.ef-index`, `.ef-callout`, `.ef-cta`, `.ef-split`, `.ef-doc`, `.ef-prose`, `.ef-statement` and `.ef-site-footer`. Words that fit are never split; declared values (badges, steps, code) are unchanged.
16
+ - **Toned CTA at narrow widths.** `.ef-cta[data-ef-tone]` caps its inline padding at `12.5vw`, as a toned `.ef-section` already does (ULI-L05). At 320px and 200% text the uncapped padding left a 96px content box. Nothing changes at the default text size.
17
+
18
+ ### Tests
19
+ - `tests/browser/marketing-containment.spec.mjs` with `tests/browser/fixture/marketing-containment.html`: containment of every marketing container at 320, 375, 768 and 1280px with default and 200% text, the toned-CTA line length, and that fitting words in cards are not split. Nine of its ten tests fail on 0.13.0.
20
+
10
21
  ## 0.13.0
11
22
 
12
23
  Minor release: layout reliability (LRP-001). The source document is `.praxis/inbox/documents/2026-10-30-LRP-001-layout-reliability.md`; the baseline and the Indy Init report are in `docs/reliability/`. `@echelon-foundry/forma-conformance` 0.3.0 ships the new geometry checks.
package/dist/all.css CHANGED
@@ -8056,6 +8056,23 @@
8056
8056
  overflow-wrap: anywhere;
8057
8057
  }
8058
8058
 
8059
+ /*
8060
+ * Marketing containment (MKT-CONTAIN, WI-0043). LRP-001 passes
8061
+ * overflow-wrap: break-word to arbitrary content inside the application
8062
+ * containers; marketing components hold the same kind of content (list
8063
+ * items, spans and divs that the element rule above does not reach), so
8064
+ * they pass it on too. break-word never splits a word that fits and leaves
8065
+ * min-content sizes alone; declared values (badges, steps, code) win over
8066
+ * inheritance. Found by the EDF site at 320px: list words escaped a card at
8067
+ * 200% text and a release URL in a span escaped it at every width.
8068
+ */
8069
+ .ef-site :where(
8070
+ .ef-hero, .ef-section-heading, .ef-card, .ef-facts, .ef-index, .ef-callout,
8071
+ .ef-cta, .ef-split, .ef-doc, .ef-prose, .ef-statement, .ef-site-footer
8072
+ ) {
8073
+ overflow-wrap: break-word;
8074
+ }
8075
+
8059
8076
  .ef-site :where(hr) {
8060
8077
  margin-block: var(--ef-layout-section-space);
8061
8078
  border: 0;
@@ -8637,6 +8654,10 @@
8637
8654
 
8638
8655
  .ef-cta[data-ef-tone]:not([data-ef-tone="page"]) {
8639
8656
  padding: calc(var(--ef-layout-block-space) * 2);
8657
+ /* Same cap as a toned .ef-section (ULI-L05): at 320px and 200% text the
8658
+ uncapped inline padding left a 96px content box (MKT-CONTAIN). It
8659
+ changes nothing at the default text size. */
8660
+ padding-inline: min(calc(var(--ef-layout-block-space) * 2), 12.5vw);
8640
8661
  border-block-start: 0;
8641
8662
  }
8642
8663
 
@@ -342,7 +342,7 @@
342
342
  "tokens.css"
343
343
  ],
344
344
  "bytes": {
345
- "all.css": 344943,
345
+ "all.css": 346039,
346
346
  "assessment.css": 36343,
347
347
  "brands/echelon.css": 4213,
348
348
  "brands/example-harbor.css": 4229,
@@ -510,7 +510,7 @@
510
510
  "icons/warning.svg": 324,
511
511
  "icons/wifi-off.svg": 269,
512
512
  "icons/workflow.svg": 345,
513
- "marketing.css": 47868,
513
+ "marketing.css": 48964,
514
514
  "patterns/active-filter-summary.html": 532,
515
515
  "patterns/alert.html": 384,
516
516
  "patterns/allocation.html": 1033,
@@ -8061,6 +8061,23 @@
8061
8061
  overflow-wrap: anywhere;
8062
8062
  }
8063
8063
 
8064
+ /*
8065
+ * Marketing containment (MKT-CONTAIN, WI-0043). LRP-001 passes
8066
+ * overflow-wrap: break-word to arbitrary content inside the application
8067
+ * containers; marketing components hold the same kind of content (list
8068
+ * items, spans and divs that the element rule above does not reach), so
8069
+ * they pass it on too. break-word never splits a word that fits and leaves
8070
+ * min-content sizes alone; declared values (badges, steps, code) win over
8071
+ * inheritance. Found by the EDF site at 320px: list words escaped a card at
8072
+ * 200% text and a release URL in a span escaped it at every width.
8073
+ */
8074
+ .ef-site :where(
8075
+ .ef-hero, .ef-section-heading, .ef-card, .ef-facts, .ef-index, .ef-callout,
8076
+ .ef-cta, .ef-split, .ef-doc, .ef-prose, .ef-statement, .ef-site-footer
8077
+ ) {
8078
+ overflow-wrap: break-word;
8079
+ }
8080
+
8064
8081
  .ef-site :where(hr) {
8065
8082
  margin-block: var(--ef-layout-section-space);
8066
8083
  border: 0;
@@ -8642,6 +8659,10 @@
8642
8659
 
8643
8660
  .ef-cta[data-ef-tone]:not([data-ef-tone="page"]) {
8644
8661
  padding: calc(var(--ef-layout-block-space) * 2);
8662
+ /* Same cap as a toned .ef-section (ULI-L05): at 320px and 200% text the
8663
+ uncapped inline padding left a 96px content box (MKT-CONTAIN). It
8664
+ changes nothing at the default text size. */
8665
+ padding-inline: min(calc(var(--ef-layout-block-space) * 2), 12.5vw);
8645
8666
  border-block-start: 0;
8646
8667
  }
8647
8668
 
@@ -1353,6 +1353,23 @@
1353
1353
  overflow-wrap: anywhere;
1354
1354
  }
1355
1355
 
1356
+ /*
1357
+ * Marketing containment (MKT-CONTAIN, WI-0043). LRP-001 passes
1358
+ * overflow-wrap: break-word to arbitrary content inside the application
1359
+ * containers; marketing components hold the same kind of content (list
1360
+ * items, spans and divs that the element rule above does not reach), so
1361
+ * they pass it on too. break-word never splits a word that fits and leaves
1362
+ * min-content sizes alone; declared values (badges, steps, code) win over
1363
+ * inheritance. Found by the EDF site at 320px: list words escaped a card at
1364
+ * 200% text and a release URL in a span escaped it at every width.
1365
+ */
1366
+ .ef-site :where(
1367
+ .ef-hero, .ef-section-heading, .ef-card, .ef-facts, .ef-index, .ef-callout,
1368
+ .ef-cta, .ef-split, .ef-doc, .ef-prose, .ef-statement, .ef-site-footer
1369
+ ) {
1370
+ overflow-wrap: break-word;
1371
+ }
1372
+
1356
1373
  .ef-site :where(hr) {
1357
1374
  margin-block: var(--ef-layout-section-space);
1358
1375
  border: 0;
@@ -1935,6 +1952,10 @@
1935
1952
 
1936
1953
  .ef-cta[data-ef-tone]:not([data-ef-tone="page"]) {
1937
1954
  padding: calc(var(--ef-layout-block-space) * 2);
1955
+ /* Same cap as a toned .ef-section (ULI-L05): at 320px and 200% text the
1956
+ uncapped inline padding left a 96px content box (MKT-CONTAIN). It
1957
+ changes nothing at the default text size. */
1958
+ padding-inline: min(calc(var(--ef-layout-block-space) * 2), 12.5vw);
1938
1959
  border-block-start: 0;
1939
1960
  }
1940
1961
 
@@ -1352,6 +1352,23 @@
1352
1352
  overflow-wrap: anywhere;
1353
1353
  }
1354
1354
 
1355
+ /*
1356
+ * Marketing containment (MKT-CONTAIN, WI-0043). LRP-001 passes
1357
+ * overflow-wrap: break-word to arbitrary content inside the application
1358
+ * containers; marketing components hold the same kind of content (list
1359
+ * items, spans and divs that the element rule above does not reach), so
1360
+ * they pass it on too. break-word never splits a word that fits and leaves
1361
+ * min-content sizes alone; declared values (badges, steps, code) win over
1362
+ * inheritance. Found by the EDF site at 320px: list words escaped a card at
1363
+ * 200% text and a release URL in a span escaped it at every width.
1364
+ */
1365
+ .ef-site :where(
1366
+ .ef-hero, .ef-section-heading, .ef-card, .ef-facts, .ef-index, .ef-callout,
1367
+ .ef-cta, .ef-split, .ef-doc, .ef-prose, .ef-statement, .ef-site-footer
1368
+ ) {
1369
+ overflow-wrap: break-word;
1370
+ }
1371
+
1355
1372
  .ef-site :where(hr) {
1356
1373
  margin-block: var(--ef-layout-section-space);
1357
1374
  border: 0;
@@ -1934,6 +1951,10 @@
1934
1951
 
1935
1952
  .ef-cta[data-ef-tone]:not([data-ef-tone="page"]) {
1936
1953
  padding: calc(var(--ef-layout-block-space) * 2);
1954
+ /* Same cap as a toned .ef-section (ULI-L05): at 320px and 200% text the
1955
+ uncapped inline padding left a 96px content box (MKT-CONTAIN). It
1956
+ changes nothing at the default text size. */
1957
+ padding-inline: min(calc(var(--ef-layout-block-space) * 2), 12.5vw);
1937
1958
  border-block-start: 0;
1938
1959
  }
1939
1960
 
@@ -8,8 +8,8 @@
8
8
  {
9
9
  "file": "forma-marketing.css",
10
10
  "description": "Brand-neutral marketing layer: core tokens, role defaults, Forma foundations, marketing foundations, components, and layouts.",
11
- "bytes": 95041,
12
- "sha256": "a2248c09b9c7731178f3046a245541fb240715c12b21638300d56a4fdd61819d",
11
+ "bytes": 96137,
12
+ "sha256": "08c70e579ad93f28d2dedf5d4c5e1b7d455773acff50b19a2a688f132123b9df",
13
13
  "sources": [
14
14
  "dist/tokens.css",
15
15
  "src/marketing/roles.css",
@@ -32,8 +32,8 @@
32
32
  {
33
33
  "file": "forma-echelon-marketing.css",
34
34
  "description": "Single-file Echelon marketing presentation: forma-marketing.css followed by the Echelon theme. Most sites load only this file.",
35
- "bytes": 101181,
36
- "sha256": "cdf0ebfa0b60219e72d1c32dc0ac068d73255654748b55283bbb1c7a9db78a7f",
35
+ "bytes": 102277,
36
+ "sha256": "d440c969a3defb5e8eb51043da8b66d3faa29094a429ece6a046deeea98377cb",
37
37
  "sources": [
38
38
  "artifact:forma-marketing.css",
39
39
  "artifact:forma-marketing-theme-echelon.css"
@@ -42,8 +42,8 @@
42
42
  {
43
43
  "file": "forma-all.css",
44
44
  "description": "Complete Forma surface (application components, assessment, and marketing layers) for sites that also present Forma application patterns such as data grids or status lozenges.",
45
- "bytes": 345306,
46
- "sha256": "403d708505fc3fe2ac7bd2c78220e98ad9236a5c82f76d1b88d7a9c4b01ee213",
45
+ "bytes": 346402,
46
+ "sha256": "0ba4ce2e6ef70b94000a725780d90e0061b312960265387bc3e2e06c34b92484",
47
47
  "sources": [
48
48
  "dist/all.css"
49
49
  ]
@@ -1,4 +1,4 @@
1
- a2248c09b9c7731178f3046a245541fb240715c12b21638300d56a4fdd61819d forma-marketing.css
1
+ 08c70e579ad93f28d2dedf5d4c5e1b7d455773acff50b19a2a688f132123b9df forma-marketing.css
2
2
  0b803cade4de294a2e15ac8a8482cb2448617a2558d70fc6542a4b3b9a357bf2 forma-marketing-theme-echelon.css
3
- cdf0ebfa0b60219e72d1c32dc0ac068d73255654748b55283bbb1c7a9db78a7f forma-echelon-marketing.css
4
- 403d708505fc3fe2ac7bd2c78220e98ad9236a5c82f76d1b88d7a9c4b01ee213 forma-all.css
3
+ d440c969a3defb5e8eb51043da8b66d3faa29094a429ece6a046deeea98377cb forma-echelon-marketing.css
4
+ 0ba4ce2e6ef70b94000a725780d90e0061b312960265387bc3e2e06c34b92484 forma-all.css
@@ -285,6 +285,23 @@
285
285
  overflow-wrap: anywhere;
286
286
  }
287
287
 
288
+ /*
289
+ * Marketing containment (MKT-CONTAIN, WI-0043). LRP-001 passes
290
+ * overflow-wrap: break-word to arbitrary content inside the application
291
+ * containers; marketing components hold the same kind of content (list
292
+ * items, spans and divs that the element rule above does not reach), so
293
+ * they pass it on too. break-word never splits a word that fits and leaves
294
+ * min-content sizes alone; declared values (badges, steps, code) win over
295
+ * inheritance. Found by the EDF site at 320px: list words escaped a card at
296
+ * 200% text and a release URL in a span escaped it at every width.
297
+ */
298
+ .ef-site :where(
299
+ .ef-hero, .ef-section-heading, .ef-card, .ef-facts, .ef-index, .ef-callout,
300
+ .ef-cta, .ef-split, .ef-doc, .ef-prose, .ef-statement, .ef-site-footer
301
+ ) {
302
+ overflow-wrap: break-word;
303
+ }
304
+
288
305
  .ef-site :where(hr) {
289
306
  margin-block: var(--ef-layout-section-space);
290
307
  border: 0;
@@ -866,6 +883,10 @@
866
883
 
867
884
  .ef-cta[data-ef-tone]:not([data-ef-tone="page"]) {
868
885
  padding: calc(var(--ef-layout-block-space) * 2);
886
+ /* Same cap as a toned .ef-section (ULI-L05): at 320px and 200% text the
887
+ uncapped inline padding left a 96px content box (MKT-CONTAIN). It
888
+ changes nothing at the default text size. */
889
+ padding-inline: min(calc(var(--ef-layout-block-space) * 2), 12.5vw);
869
890
  border-block-start: 0;
870
891
  }
871
892
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@echelon-foundry/design-system",
3
- "version": "0.13.0-main.263.1",
3
+ "version": "0.13.0-main.264.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Zero-component-runtime HTML and CSS design system for Echelon Foundry applications.",