baseline-foundry 0.1.6 → 0.2.0

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.
Files changed (80) hide show
  1. package/README.md +22 -7
  2. package/config/canonical-spacing.resolved.json +71 -0
  3. package/config/experiments/ibm-plex-engine-smoke.json +7 -6
  4. package/config/experiments/ubuntu-engine-smoke.json +7 -6
  5. package/config/foundation-theme.json +7 -6
  6. package/config/tiers/app.json +8 -9
  7. package/config/tiers/documentation.json +7 -8
  8. package/config/tiers/editorial.json +7 -8
  9. package/config/tiers/os.json +7 -8
  10. package/dist/application-layout.js +1 -1
  11. package/dist/build.d.ts +1 -0
  12. package/dist/build.js +98 -36
  13. package/dist/css-app-tier.js +4 -46
  14. package/dist/css-component-contracts.d.ts +7 -0
  15. package/dist/css-component-contracts.js +82 -0
  16. package/dist/css-components/application-geometry.d.ts +5 -0
  17. package/dist/css-components/application-geometry.js +31 -0
  18. package/dist/css-components/article-pagination.js +6 -5
  19. package/dist/css-components/button-actions.js +68 -4
  20. package/dist/css-components/cards-options.js +2 -2
  21. package/dist/css-components/chip-badge-status.d.ts +0 -1
  22. package/dist/css-components/chip-badge-status.js +37 -15
  23. package/dist/css-components/content-card.js +11 -10
  24. package/dist/css-components/control-geometry.d.ts +12 -0
  25. package/dist/css-components/control-geometry.js +22 -0
  26. package/dist/css-components/cta-figure-aspect.js +2 -2
  27. package/dist/css-components/document-navigation.js +28 -18
  28. package/dist/css-components/editorial-content.js +1 -1
  29. package/dist/css-components/icon.js +24 -2
  30. package/dist/css-components/interactive-feedback.js +27 -14
  31. package/dist/css-components/interactive-tables.js +9 -6
  32. package/dist/css-components/legacy-navigation.js +32 -25
  33. package/dist/css-components/list-tree.js +5 -5
  34. package/dist/css-components/list.js +17 -12
  35. package/dist/css-components/logo-media.js +2 -2
  36. package/dist/css-components/navigation-geometry.d.ts +5 -0
  37. package/dist/css-components/navigation-geometry.js +30 -0
  38. package/dist/css-components/nested-controls.d.ts +8 -0
  39. package/dist/css-components/nested-controls.js +37 -0
  40. package/dist/css-components/panel.js +12 -13
  41. package/dist/css-components/search-box-and-filter.d.ts +0 -1
  42. package/dist/css-components/search-box-and-filter.js +3 -3
  43. package/dist/css-components/sites-editorial-ports.js +8 -1
  44. package/dist/css-components/sites-foundation.js +2 -2
  45. package/dist/css-components/table.js +9 -1
  46. package/dist/css-components/tabs-choice-breadcrumbs.js +9 -9
  47. package/dist/css-components/tiered-list-equal-height-row.js +2 -2
  48. package/dist/css-components.js +99 -229
  49. package/dist/css.js +44 -1
  50. package/dist/dtcg-spacing.d.ts +40 -0
  51. package/dist/dtcg-spacing.js +163 -0
  52. package/dist/experiments/ibm-plex-engine-smoke/styles.css +557 -360
  53. package/dist/experiments/ibm-plex-engine-smoke/surfaces.json +182 -14
  54. package/dist/experiments/ibm-plex-engine-smoke/tokens.json +91 -7
  55. package/dist/index.d.ts +1 -0
  56. package/dist/presets/app-tier/styles.css +700 -494
  57. package/dist/presets/app-tier/surfaces.json +709 -29
  58. package/dist/presets/app-tier/tokens.json +178 -8
  59. package/dist/presets/prose/styles.css +699 -486
  60. package/dist/presets/prose/surfaces.json +709 -29
  61. package/dist/presets/prose/tokens.json +177 -7
  62. package/dist/styles.css +699 -486
  63. package/dist/surfaces.json +709 -29
  64. package/dist/tiers/app/styles.css +700 -494
  65. package/dist/tiers/app/surfaces.json +709 -29
  66. package/dist/tiers/app/tokens.json +178 -8
  67. package/dist/tiers/documentation/styles.css +699 -486
  68. package/dist/tiers/documentation/surfaces.json +709 -29
  69. package/dist/tiers/documentation/tokens.json +177 -7
  70. package/dist/tiers/editorial/styles.css +699 -486
  71. package/dist/tiers/editorial/surfaces.json +709 -29
  72. package/dist/tiers/editorial/tokens.json +177 -7
  73. package/dist/tiers/os/styles.css +699 -486
  74. package/dist/tiers/os/surfaces.json +709 -29
  75. package/dist/tiers/os/tokens.json +177 -7
  76. package/dist/tokens.json +177 -7
  77. package/dist/types.d.ts +13 -13
  78. package/dist/vanilla-theme-colors.js +5 -1
  79. package/docs/publishing.md +7 -1
  80. package/package.json +1 -1
@@ -29,7 +29,7 @@ export function logoMediaCss() {
29
29
  align-items: center;
30
30
  display: flex;
31
31
  flex-wrap: wrap;
32
- column-gap: var(--bf-space-4);
32
+ column-gap: var(--bf-component-inline-inset-continuation);
33
33
  min-inline-size: 0;
34
34
  padding-block: var(--bf-space-1);
35
35
  }
@@ -202,7 +202,7 @@ export function logoMediaCss() {
202
202
 
203
203
  :where(.bf-theme) :where(.bf-media-object-meta) {
204
204
  align-items: start;
205
- column-gap: var(--bf-space-1);
205
+ column-gap: var(--bf-leading-mark-gap);
206
206
  display: grid;
207
207
  grid-template-columns: var(--bf-icon-size-default) minmax(0, 1fr);
208
208
  min-inline-size: 0;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shared disclosure and navigation geometry. Horizontal placement consumes
3
+ * the field/action/continuation insets instead of introducing another inset.
4
+ */
5
+ export declare function navigationGeometryCss(): string;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Shared disclosure and navigation geometry. Horizontal placement consumes
3
+ * the field/action/continuation insets instead of introducing another inset.
4
+ */
5
+ export function navigationGeometryCss() {
6
+ return `:where(.bf-theme) {
7
+ --bf-disclosure-gap: var(--bf-leading-mark-gap);
8
+ --bf-disclosure-icon-inline-size: 1rem;
9
+ --bf-disclosure-group-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - var(--bf-disclosure-icon-inline-size) - var(--bf-disclosure-gap)));
10
+ --bf-icon-label-optical-offset-block: 0.1875rem;
11
+ --bf-disclosure-icon-optical-offset-block: 0rem;
12
+ --bf-side-navigation-icon-optical-offset-block: var(--bf-icon-label-optical-offset-block);
13
+ --bf-side-navigation-icon-gap: var(--bf-leading-mark-gap);
14
+ --bf-navigation-bar-min-block-size: calc(var(--bf-baseline) * 6);
15
+ --bf-top-navigation-link-padding-inline: var(--bf-component-inline-inset-action);
16
+ --bf-top-navigation-end-slot-inline-size: calc(1rem + var(--bf-component-inline-inset-field));
17
+ --bf-top-navigation-search-toggle-inline-size: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
18
+ --bf-top-navigation-link-padding-block: max(var(--bf-body-nudge-start), calc(var(--bf-baseline) * 1.5));
19
+ --bf-top-navigation-search-max-inline-size: 20rem;
20
+ --bf-top-navigation-logo-tag-inline-size: 1.375rem;
21
+ --bf-top-navigation-logo-tag-block-size: 2.375rem;
22
+ --bf-top-navigation-logo-icon-size: 1rem;
23
+ --bf-top-navigation-logo-tag-gap: 0.25rem;
24
+ --bf-top-navigation-logo-icon-bottom-offset: 0.375rem;
25
+ --bf-top-navigation-logo-icon-optical-offset-inline: -0.0125rem;
26
+ --bf-navigation-brand-line-center-block: calc(var(--bf-top-navigation-logo-tag-block-size) - var(--bf-top-navigation-logo-icon-bottom-offset) - (var(--bf-top-navigation-logo-icon-size) / 2));
27
+ --bf-navigation-brand-block-size: calc(var(--bf-navigation-brand-line-center-block) * 2);
28
+ }
29
+ `;
30
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Explicit nested controls for composition inside a host-owned single-line
3
+ * row. Standalone controls retain the normal occupied-block contract.
4
+ */
5
+ export declare const nestedTextInputTypes: readonly ["text", "number", "search", "password", "email", "url", "tel"];
6
+ export declare const nestedFieldSelector: string;
7
+ export declare const nestedInteractiveSelector: string;
8
+ export declare function nestedControlsCss(): string;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Explicit nested controls for composition inside a host-owned single-line
3
+ * row. Standalone controls retain the normal occupied-block contract.
4
+ */
5
+ export const nestedTextInputTypes = ["text", "number", "search", "password", "email", "url", "tel"];
6
+ export const nestedFieldSelector = [
7
+ "input.bf-input.is-nested:not([type])",
8
+ ...nestedTextInputTypes.map(type => `input.bf-input.is-nested[type='${type}']`),
9
+ "select.bf-input.is-nested"
10
+ ].join(", ");
11
+ export const nestedInteractiveSelector = `${nestedFieldSelector}, .bf-button.is-nested:not(.is-link)`;
12
+ export function nestedControlsCss() {
13
+ return `:where(.bf-theme) :where(${nestedInteractiveSelector}) {
14
+ line-height: var(--bf-nested-row-line-height);
15
+ margin-block: 0;
16
+ padding-block: var(--bf-nested-framed-row-padding-block);
17
+ }
18
+
19
+ /* Replaced textual controls retain a browser-owned intrinsic block floor even
20
+ after their line and padding adopt the nested contract. This derived size is the exact
21
+ sum of that same line, padding and real borders; it is not a density target
22
+ independent of the active tier. */
23
+ :where(.bf-theme) :where(${nestedFieldSelector}) {
24
+ block-size: var(--bf-nested-framed-row-painted-block-size);
25
+ }
26
+
27
+ :where(.bf-theme) :where(.bf-checkbox.is-nested, .bf-radio.is-nested) {
28
+ --bf-tick-box-offset: var(--bf-nested-framed-row-visual-offset);
29
+ }
30
+
31
+ :where(.bf-theme) :where(.bf-checkbox.is-nested > .bf-checkbox-label, .bf-radio.is-nested > .bf-radio-label) {
32
+ line-height: var(--bf-nested-row-line-height);
33
+ margin-block: 0;
34
+ padding-block: var(--bf-nested-framed-row-padding-block);
35
+ }
36
+ `;
37
+ }
@@ -24,9 +24,8 @@ export function panelCss(options) {
24
24
  overscroll-behavior: contain;
25
25
  }
26
26
 
27
- /* Panel chrome and content consume the live page-grid gutter through a local
28
- * derived property, so their internal text rails follow the same
29
- * viewport brackets as surrounding page content. */
27
+ /* Panel chrome and content share the continuation component inset through a
28
+ * local property. Structural surface padding remains a separate contract. */
30
29
  :where(.bf-theme) :where(.bf-panel-header) {
31
30
  align-items: start;
32
31
  display: flex;
@@ -35,7 +34,7 @@ export function panelCss(options) {
35
34
  justify-content: space-between;
36
35
  padding-block-end: var(--bf-panel-padding-block);
37
36
  padding-block-start: var(--bf-panel-padding-block);
38
- padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
37
+ padding-inline: var(--bf-panel-content-padding-inline);
39
38
  }
40
39
 
41
40
  /* A navigation brand keeps the Canonical tag attached to the panel's top edge
@@ -45,7 +44,7 @@ export function panelCss(options) {
45
44
  gap: 0;
46
45
  padding-block: 0;
47
46
  padding-inline-end: 0;
48
- padding-inline-start: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
47
+ padding-inline-start: var(--bf-panel-content-padding-inline);
49
48
  }
50
49
 
51
50
  :where(.bf-theme) :where(.bf-panel-header.is-navigation-brand) > :where(.bf-top-navigation-logo.is-canonical-tagged) {
@@ -72,10 +71,10 @@ export function panelCss(options) {
72
71
  flex-wrap: wrap;
73
72
  gap: var(--bf-field-gap);
74
73
  justify-content: space-between;
75
- min-block-size: calc(var(--bf-control-box-size-compact) + var(--bf-panel-padding-block));
74
+ min-block-size: calc(var(--bf-interface-row-occupied-block-size) + var(--bf-panel-padding-block));
76
75
  padding-block-end: var(--bf-panel-padding-block);
77
76
  padding-block-start: 0;
78
- padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
77
+ padding-inline: var(--bf-panel-content-padding-inline);
79
78
  }
80
79
 
81
80
  :where(.bf-theme) :where(.bf-panel-footer.is-sticky) {
@@ -104,16 +103,16 @@ ${h4TypeStyles} margin: 0 0 var(--bf-h4-margin-bottom);
104
103
  ${bodyTypeStyles} align-items: center;
105
104
  appearance: none;
106
105
  background: transparent;
107
- border: 0;
106
+ border: 0 solid transparent;
107
+ border-block-width: var(--bf-border-width);
108
108
  color: var(--bf-color-text-default);
109
109
  cursor: pointer;
110
110
  display: inline-flex;
111
- gap: calc(var(--bf-baseline) * 0.5);
111
+ gap: var(--bf-leading-mark-gap);
112
112
  justify-content: flex-start;
113
- margin: 0;
114
- min-block-size: var(--bf-control-box-size-compact);
113
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
115
114
  min-inline-size: 0;
116
- padding-block: var(--bf-control-block-padding-compact);
115
+ padding-block: var(--bf-interface-row-padding-block);
117
116
  padding-inline: 0;
118
117
  text-align: left;
119
118
  }
@@ -136,7 +135,7 @@ ${bodyTypeStyles} align-items: center;
136
135
  min-block-size: 0;
137
136
  padding-block-end: var(--bf-panel-padding-block);
138
137
  padding-block-start: var(--bf-panel-padding-block);
139
- padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
138
+ padding-inline: var(--bf-panel-content-padding-inline);
140
139
  }
141
140
 
142
141
  :where(.bf-theme) :where(.bf-panel-content.is-flush) {
@@ -1,7 +1,6 @@
1
1
  type SearchBoxAndFilterCssOptions = {
2
2
  bodySelectedStartNudge: string;
3
3
  bodyTypeStyles: string;
4
- buttonBlockPaddingVar: string;
5
4
  inputMarginBottom: string;
6
5
  };
7
6
  export declare function searchBoxAndFilterCss(options: SearchBoxAndFilterCssOptions): string;
@@ -1,5 +1,5 @@
1
1
  export function searchBoxAndFilterCss(options) {
2
- const { bodySelectedStartNudge, bodyTypeStyles, buttonBlockPaddingVar, inputMarginBottom, } = options;
2
+ const { bodySelectedStartNudge, bodyTypeStyles, inputMarginBottom, } = options;
3
3
  return `:where(.bf-theme) :where(.bf-search-box) {
4
4
  --bf-search-box-action-inline-size: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
5
5
  --bf-search-box-trailing-inline-size: calc((var(--bf-search-box-action-inline-size) * 2) + var(--bf-border-width));
@@ -95,7 +95,7 @@ export function searchBoxAndFilterCss(options) {
95
95
  }
96
96
 
97
97
  :where(.bf-theme) :where(.bf-search-and-filter-search-container[aria-expanded='false']) {
98
- min-block-size: var(--bf-control-box-size);
98
+ min-block-size: var(--bf-interface-row-painted-block-size);
99
99
  }
100
100
 
101
101
  :where(.bf-theme) :where(.bf-search-and-filter-box) {
@@ -174,7 +174,7 @@ ${bodyTypeStyles} appearance: none;
174
174
  cursor: pointer;
175
175
  display: inline-flex;
176
176
  margin: 0;
177
- padding-block: ${buttonBlockPaddingVar};
177
+ padding-block: ${bodySelectedStartNudge};
178
178
  padding-inline: 0;
179
179
  position: static;
180
180
  }
@@ -68,7 +68,7 @@ export function sitesEditorialPortsCss() {
68
68
 
69
69
  /* Current Vanilla scopes a one-spacing-unit icon/value gap to the hero. */
70
70
  :where(.bf-theme) :where(.bf-hero-chip.bf-chip) {
71
- column-gap: var(--bf-space-1);
71
+ column-gap: var(--bf-leading-mark-gap);
72
72
  }
73
73
 
74
74
  :where(.bf-theme) :where(.bf-hero-media > :where(img, picture, video, canvas, svg), .bf-hero-signpost > :where(img, picture, video, canvas, svg)) {
@@ -117,6 +117,13 @@ export function sitesEditorialPortsCss() {
117
117
  }
118
118
  }
119
119
 
120
+ /* A hero can keep its entry rule while placing its content directly against
121
+ that boundary. Scope this exception to the hero instead of publishing a
122
+ global padding utility. */
123
+ :where(.bf-theme) :where(.bf-hero.is-top-flush) {
124
+ padding-block-start: 0;
125
+ }
126
+
120
127
  @container bf-hero (width >= 45rem) {
121
128
  :where(.bf-theme) :where(.bf-hero-layout) {
122
129
  column-gap: var(--bf-grid-gap-inline);
@@ -66,10 +66,10 @@ export function sitesFoundationCss() {
66
66
  text-underline-offset: 0.12em;
67
67
  }
68
68
 
69
- /* A balanced section switches at the shared readable 50/50 threshold. The
69
+ /* A balanced section switches at the standard medium container threshold. The
70
70
  layout descendant reacts to the root container; the query never tries to
71
71
  restyle the container that established it. */
72
- @container bf-basic-section (width >= 45rem) {
72
+ @container bf-basic-section (width >= 38.75rem) {
73
73
  :where(.bf-theme) :where(.bf-basic-section-layout) {
74
74
  column-gap: var(--bf-grid-gap-inline);
75
75
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -1,6 +1,14 @@
1
1
  export function tableCss(options) {
2
2
  const { bodyLineHeight, bodyMediumTypeStyles, bodyTypeStyles } = options;
3
- return `:where(.bf-theme) :where(.bf-table-scroll) {
3
+ return `:where(.bf-theme) {
4
+ --bf-table-row-border-size: var(--bf-border-width);
5
+ --bf-table-row-padding-block-start: var(--bf-in-box-row-padding-block-start);
6
+ --bf-table-row-block-size: var(--bf-interface-row-occupied-block-size);
7
+ --bf-table-row-padding-block-end: max(0rem, calc(var(--bf-table-row-block-size) - ${bodyLineHeight} - var(--bf-table-row-padding-block-start) - var(--bf-table-row-border-size)));
8
+ --bf-table-row-line-height: ${bodyLineHeight};
9
+ }
10
+
11
+ :where(.bf-theme) :where(.bf-table-scroll) {
4
12
  max-inline-size: 100%;
5
13
  min-inline-size: 0;
6
14
  overflow-x: auto;
@@ -32,11 +32,11 @@ ${bodyTypeStyles} align-items: center;
32
32
  color: var(--bf-color-text-muted);
33
33
  cursor: pointer;
34
34
  display: flex;
35
- gap: calc(var(--bf-baseline) * 0.5);
35
+ gap: var(--bf-leading-mark-gap);
36
36
  justify-content: center;
37
37
  margin-bottom: 0;
38
- padding-block-end: calc(var(--bf-single-line-row-padding-block) + var(--bf-single-line-row-margin-block-end));
39
- padding-block-start: var(--bf-single-line-row-padding-block);
38
+ padding-block-end: calc(var(--bf-interface-row-padding-block) + var(--bf-interface-row-compensation-block-end));
39
+ padding-block-start: var(--bf-interface-row-padding-block);
40
40
  padding-inline: var(--bf-component-inline-inset-action);
41
41
  text-decoration: none;
42
42
  }
@@ -79,7 +79,7 @@ ${bodyTypeStyles} align-items: center;
79
79
 
80
80
  :where(.bf-theme) :where(.bf-tabs.is-equal) :where(.bf-tabs-list) {
81
81
  display: grid;
82
- gap: calc(var(--bf-baseline) * 2);
82
+ gap: var(--bf-component-inline-inset-action);
83
83
  grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--bf-ui-tabs-equal-min)), 1fr));
84
84
  overflow: visible;
85
85
  white-space: normal;
@@ -109,7 +109,7 @@ ${bodyTypeStyles} align-items: center;
109
109
  color: var(--bf-color-text-default);
110
110
  cursor: pointer;
111
111
  display: grid;
112
- gap: calc(var(--bf-baseline) * 0.75);
112
+ gap: var(--bf-leading-mark-gap);
113
113
  grid-template-columns: auto minmax(0, 1fr) auto;
114
114
  margin: 0 0 ${buttonMarginBottom};
115
115
  min-inline-size: 0;
@@ -175,7 +175,7 @@ ${bodyCaseTypeStyles} color: var(--bf-color-text-muted);
175
175
  :where(.bf-theme) :where(.bf-inline-options-options) {
176
176
  display: flex;
177
177
  flex-wrap: wrap;
178
- gap: calc(var(--bf-baseline) * 3);
178
+ gap: var(--bf-component-inline-inset-continuation);
179
179
  }
180
180
 
181
181
  :where(.bf-theme) :where(.bf-inline-options-option) {
@@ -226,7 +226,7 @@ ${bodyTypeStyles} align-items: center;
226
226
  margin-bottom: ${buttonMarginBottom};
227
227
  max-inline-size: 100%;
228
228
  overflow: hidden;
229
- ${buttonPadding} padding-inline: var(--bf-control-inline-padding-action-bordered);
229
+ ${buttonPadding} padding-inline: var(--bf-component-inline-inset-action-bordered);
230
230
  text-align: center;
231
231
  text-decoration: none;
232
232
  text-overflow: ellipsis;
@@ -273,7 +273,7 @@ ${buttonPadding} padding-inline: var(--bf-control-inline-padding-action-bordere
273
273
  align-items: center;
274
274
  display: flex;
275
275
  flex-wrap: wrap;
276
- gap: calc(var(--bf-baseline) * 0.5) calc(var(--bf-baseline) * 1.25);
276
+ gap: calc(var(--bf-baseline) * 0.5) var(--bf-leading-mark-gap);
277
277
  list-style: none;
278
278
  margin: 0;
279
279
  min-inline-size: 0;
@@ -291,7 +291,7 @@ ${bodyCaseTypeStyles} color: var(--bf-color-text-muted);
291
291
  :where(.bf-theme) :where(.bf-breadcrumbs-item) + :where(.bf-breadcrumbs-item)::before {
292
292
  color: var(--bf-color-text-muted);
293
293
  content: "/";
294
- margin-inline-end: calc(var(--bf-baseline) * 0.75);
294
+ margin-inline-end: var(--bf-leading-mark-gap);
295
295
  }
296
296
 
297
297
  :where(.bf-theme) :where(.bf-breadcrumbs-item) a {
@@ -93,9 +93,9 @@ export function tieredListEqualHeightRowCss() {
93
93
  }
94
94
 
95
95
  /* ------------------------------------------------------------------ */
96
- /* Header split (≥ 45rem): the shared readable 50/50 title/content split. */
96
+ /* Header split (≥ 38.75rem): the standard medium 50/50 title/content split. */
97
97
  /* ------------------------------------------------------------------ */
98
- @container (width >= 45rem) {
98
+ @container (width >= 38.75rem) {
99
99
  :where(.bf-theme) :where(.bf-tiered-list:not(.is-description-full-width)) :where(.bf-tiered-list-header) {
100
100
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
101
101
  }