baseline-foundry 0.1.3

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 (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +588 -0
  3. package/config/experiments/ibm-plex-engine-smoke.json +115 -0
  4. package/config/experiments/ubuntu-engine-smoke.json +115 -0
  5. package/config/foundation-theme.json +117 -0
  6. package/config/tiers/app.json +120 -0
  7. package/config/tiers/documentation.json +120 -0
  8. package/config/tiers/editorial.json +120 -0
  9. package/config/tiers/os.json +120 -0
  10. package/dist/accordion.d.ts +5 -0
  11. package/dist/accordion.js +32 -0
  12. package/dist/application-layout.d.ts +4 -0
  13. package/dist/application-layout.js +181 -0
  14. package/dist/baseline-grid-overlay.d.ts +5 -0
  15. package/dist/baseline-grid-overlay.js +50 -0
  16. package/dist/baseline-grid-theme.d.ts +3 -0
  17. package/dist/baseline-grid-theme.js +3 -0
  18. package/dist/baseline-grid.d.ts +7 -0
  19. package/dist/baseline-grid.js +35 -0
  20. package/dist/build.d.ts +21 -0
  21. package/dist/build.js +440 -0
  22. package/dist/code-snippet.d.ts +6 -0
  23. package/dist/code-snippet.js +95 -0
  24. package/dist/contextual-menu.d.ts +4 -0
  25. package/dist/contextual-menu.js +156 -0
  26. package/dist/css-app-tier.d.ts +1 -0
  27. package/dist/css-app-tier.js +77 -0
  28. package/dist/css-components/article-pagination.d.ts +13 -0
  29. package/dist/css-components/article-pagination.js +151 -0
  30. package/dist/css-components/button-actions.d.ts +7 -0
  31. package/dist/css-components/button-actions.js +165 -0
  32. package/dist/css-components/cards-options.d.ts +6 -0
  33. package/dist/css-components/cards-options.js +180 -0
  34. package/dist/css-components/chip-badge-status.d.ts +10 -0
  35. package/dist/css-components/chip-badge-status.js +162 -0
  36. package/dist/css-components/content-card.d.ts +25 -0
  37. package/dist/css-components/content-card.js +517 -0
  38. package/dist/css-components/control-row.d.ts +2 -0
  39. package/dist/css-components/control-row.js +18 -0
  40. package/dist/css-components/cta-figure-aspect.d.ts +1 -0
  41. package/dist/css-components/cta-figure-aspect.js +123 -0
  42. package/dist/css-components/document-navigation.d.ts +13 -0
  43. package/dist/css-components/document-navigation.js +400 -0
  44. package/dist/css-components/editorial-content.d.ts +6 -0
  45. package/dist/css-components/editorial-content.js +52 -0
  46. package/dist/css-components/icon.d.ts +1 -0
  47. package/dist/css-components/icon.js +75 -0
  48. package/dist/css-components/interactive-feedback.d.ts +2 -0
  49. package/dist/css-components/interactive-feedback.js +230 -0
  50. package/dist/css-components/interactive-tables.d.ts +7 -0
  51. package/dist/css-components/interactive-tables.js +164 -0
  52. package/dist/css-components/linked-logo-site-layout.d.ts +21 -0
  53. package/dist/css-components/linked-logo-site-layout.js +214 -0
  54. package/dist/css-components/list-tree.d.ts +5 -0
  55. package/dist/css-components/list-tree.js +98 -0
  56. package/dist/css-components/list.d.ts +3 -0
  57. package/dist/css-components/list.js +119 -0
  58. package/dist/css-components/logo-media.d.ts +16 -0
  59. package/dist/css-components/logo-media.js +219 -0
  60. package/dist/css-components/navigation-layout.d.ts +5 -0
  61. package/dist/css-components/navigation-layout.js +151 -0
  62. package/dist/css-components/panel.d.ts +6 -0
  63. package/dist/css-components/panel.js +148 -0
  64. package/dist/css-components/search-box-and-filter.d.ts +9 -0
  65. package/dist/css-components/search-box-and-filter.js +267 -0
  66. package/dist/css-components/sites-editorial-ports.d.ts +19 -0
  67. package/dist/css-components/sites-editorial-ports.js +264 -0
  68. package/dist/css-components/sites-foundation.d.ts +17 -0
  69. package/dist/css-components/sites-foundation.js +173 -0
  70. package/dist/css-components/sites-rich-lists.d.ts +18 -0
  71. package/dist/css-components/sites-rich-lists.js +364 -0
  72. package/dist/css-components/static-content-ports.d.ts +14 -0
  73. package/dist/css-components/static-content-ports.js +206 -0
  74. package/dist/css-components/tab-section.d.ts +19 -0
  75. package/dist/css-components/tab-section.js +103 -0
  76. package/dist/css-components/table.d.ts +7 -0
  77. package/dist/css-components/table.js +79 -0
  78. package/dist/css-components/tabs-choice-breadcrumbs.d.ts +9 -0
  79. package/dist/css-components/tabs-choice-breadcrumbs.js +307 -0
  80. package/dist/css-components/tiered-list-equal-height-row.d.ts +1 -0
  81. package/dist/css-components/tiered-list-equal-height-row.js +286 -0
  82. package/dist/css-components.d.ts +2 -0
  83. package/dist/css-components.js +2701 -0
  84. package/dist/css-grid.d.ts +1 -0
  85. package/dist/css-grid.js +179 -0
  86. package/dist/css.d.ts +6 -0
  87. package/dist/css.js +431 -0
  88. package/dist/experiments/ibm-plex-engine-smoke/styles.css +8969 -0
  89. package/dist/experiments/ibm-plex-engine-smoke/surfaces.json +604 -0
  90. package/dist/experiments/ibm-plex-engine-smoke/tokens.json +217 -0
  91. package/dist/in-page-navigation.d.ts +7 -0
  92. package/dist/in-page-navigation.js +136 -0
  93. package/dist/index.d.ts +37 -0
  94. package/dist/index.js +18 -0
  95. package/dist/interactive-feedback.d.ts +14 -0
  96. package/dist/interactive-feedback.js +96 -0
  97. package/dist/interactive-tables.d.ts +28 -0
  98. package/dist/interactive-tables.js +184 -0
  99. package/dist/list-tree.d.ts +4 -0
  100. package/dist/list-tree.js +44 -0
  101. package/dist/panel-drawer.d.ts +4 -0
  102. package/dist/panel-drawer.js +171 -0
  103. package/dist/presets/app-tier/styles.css +9459 -0
  104. package/dist/presets/app-tier/surfaces.json +1225 -0
  105. package/dist/presets/app-tier/tokens.json +221 -0
  106. package/dist/presets/prose/styles.css +9442 -0
  107. package/dist/presets/prose/surfaces.json +1225 -0
  108. package/dist/presets/prose/tokens.json +221 -0
  109. package/dist/presets.d.ts +6 -0
  110. package/dist/presets.js +27 -0
  111. package/dist/range-controls.d.ts +9 -0
  112. package/dist/range-controls.js +73 -0
  113. package/dist/resizable-aside.d.ts +4 -0
  114. package/dist/resizable-aside.js +328 -0
  115. package/dist/side-navigation.d.ts +4 -0
  116. package/dist/side-navigation.js +219 -0
  117. package/dist/styles.css +9442 -0
  118. package/dist/surfaces.json +1225 -0
  119. package/dist/tabs.d.ts +4 -0
  120. package/dist/tabs.js +88 -0
  121. package/dist/tier-registry.d.ts +10 -0
  122. package/dist/tier-registry.js +25 -0
  123. package/dist/tiers/app/styles.css +9459 -0
  124. package/dist/tiers/app/surfaces.json +1225 -0
  125. package/dist/tiers/app/tokens.json +221 -0
  126. package/dist/tiers/documentation/styles.css +9442 -0
  127. package/dist/tiers/documentation/surfaces.json +1225 -0
  128. package/dist/tiers/documentation/tokens.json +221 -0
  129. package/dist/tiers/editorial/styles.css +9442 -0
  130. package/dist/tiers/editorial/surfaces.json +1225 -0
  131. package/dist/tiers/editorial/tokens.json +221 -0
  132. package/dist/tiers/os/styles.css +9442 -0
  133. package/dist/tiers/os/surfaces.json +1225 -0
  134. package/dist/tiers/os/tokens.json +221 -0
  135. package/dist/tokens.json +221 -0
  136. package/dist/tooltip.d.ts +4 -0
  137. package/dist/tooltip.js +70 -0
  138. package/dist/top-navigation.d.ts +4 -0
  139. package/dist/top-navigation.js +354 -0
  140. package/dist/types.d.ts +155 -0
  141. package/dist/types.js +1 -0
  142. package/dist/vanilla-theme-colors.d.ts +5 -0
  143. package/dist/vanilla-theme-colors.js +208 -0
  144. package/docs/publishing.md +66 -0
  145. package/package.json +108 -0
@@ -0,0 +1,120 @@
1
+ {
2
+ "baselineUnit": 0.5,
3
+ "fontFiles": [
4
+ {
5
+ "family": "ubuntu-sans",
6
+ "path": "../../assets/fonts/UbuntuSans[wdth,wght].ttf",
7
+ "cssFamily": "Ubuntu Sans",
8
+ "fontStyle": "normal",
9
+ "fontWeight": "100 800",
10
+ "fontStretch": "75% 100%",
11
+ "fontDisplay": "swap",
12
+ "emitFontFace": false
13
+ }
14
+ ],
15
+ "fontStacks": {
16
+ "ubuntu-sans": "\"Ubuntu Sans\", \"Segoe UI\", system-ui, sans-serif"
17
+ },
18
+ "elements": [
19
+ {
20
+ "identifier": "body",
21
+ "fontSize": 1,
22
+ "lineHeight": 3,
23
+ "spaceAfter": 2,
24
+ "fontFamily": "ubuntu-sans",
25
+ "fontWeight": 400,
26
+ "fontStyle": "normal"
27
+ },
28
+ {
29
+ "identifier": "h6",
30
+ "fontSize": 1,
31
+ "lineHeight": 3,
32
+ "spaceAfter": 2,
33
+ "fontFamily": "ubuntu-sans",
34
+ "fontWeight": 550,
35
+ "fontStyle": "normal"
36
+ },
37
+ {
38
+ "identifier": "h5",
39
+ "fontSize": 1,
40
+ "lineHeight": 3,
41
+ "spaceAfter": 2,
42
+ "fontFamily": "ubuntu-sans",
43
+ "fontWeight": 550,
44
+ "fontStyle": "normal",
45
+ "fontVariantCaps": "all-small-caps",
46
+ "letterSpacing": "0.05em"
47
+ },
48
+ {
49
+ "identifier": "h4",
50
+ "fontSize": 1.5,
51
+ "lineHeight": 4,
52
+ "spaceAfter": 2,
53
+ "fontFamily": "ubuntu-sans",
54
+ "fontWeight": 300,
55
+ "fontStyle": "normal"
56
+ },
57
+ {
58
+ "identifier": "h3",
59
+ "fontSize": 1.5,
60
+ "lineHeight": 4,
61
+ "spaceAfter": 2,
62
+ "fontFamily": "ubuntu-sans",
63
+ "fontWeight": 500,
64
+ "fontStyle": "normal"
65
+ },
66
+ {
67
+ "identifier": "h2",
68
+ "fontSize": 2.625,
69
+ "lineHeight": 6,
70
+ "spaceAfter": 2,
71
+ "fontFamily": "ubuntu-sans",
72
+ "fontWeight": 200,
73
+ "fontStyle": "normal"
74
+ },
75
+ {
76
+ "identifier": "h1",
77
+ "fontSize": 2.625,
78
+ "lineHeight": 6,
79
+ "spaceAfter": 2,
80
+ "fontFamily": "ubuntu-sans",
81
+ "fontWeight": 500,
82
+ "fontStyle": "normal"
83
+ }
84
+ ],
85
+ "roles": {
86
+ "body": "body",
87
+ "h1": "h1",
88
+ "h2": "h2",
89
+ "h3": "h3",
90
+ "h4": "h4",
91
+ "h5": "h5",
92
+ "h6": "h6"
93
+ },
94
+ "layout": {
95
+ "contentMaxWidthRem": 90,
96
+ "contentPaddingInlineRem": 1,
97
+ "measureRem": 40,
98
+ "sectionSpaceBaselineUnits": 8,
99
+ "sectionSpaceShallowBaselineUnits": 3,
100
+ "sectionSpaceDeepBaselineUnits": 16,
101
+ "stripSpaceBaselineUnits": 8,
102
+ "gridGapInlineBaselineUnits": 2,
103
+ "gridGapBlockBaselineUnits": 2,
104
+ "pageMarginBaselineUnits": 2
105
+ },
106
+ "components": {
107
+ "borderWidthPx": 1,
108
+ "radiusRem": 0,
109
+ "controlBlockPaddingRem": 0.5,
110
+ "controlCompactBlockPaddingRem": 0.25,
111
+ "controlInlinePaddingRem": 1,
112
+ "controlInlinePaddingActionRem": 1,
113
+ "controlInlinePaddingFieldRem": 0.5,
114
+ "controlVisualSizeRem": 1,
115
+ "fieldGapBaselineUnits": 1,
116
+ "panelPaddingInlineBaselineUnits": 2,
117
+ "panelPaddingBlockBaselineUnits": 2,
118
+ "accordionIndentBaselineUnits": 3
119
+ }
120
+ }
@@ -0,0 +1,120 @@
1
+ {
2
+ "baselineUnit": 0.25,
3
+ "fontFiles": [
4
+ {
5
+ "family": "ubuntu-sans",
6
+ "path": "../../assets/fonts/UbuntuSans[wdth,wght].ttf",
7
+ "cssFamily": "Ubuntu Sans",
8
+ "fontStyle": "normal",
9
+ "fontWeight": "100 800",
10
+ "fontStretch": "75% 100%",
11
+ "fontDisplay": "swap",
12
+ "emitFontFace": false
13
+ }
14
+ ],
15
+ "fontStacks": {
16
+ "ubuntu-sans": "\"Ubuntu Sans\", \"Segoe UI\", system-ui, sans-serif"
17
+ },
18
+ "elements": [
19
+ {
20
+ "identifier": "body",
21
+ "fontSize": 0.75,
22
+ "lineHeight": 4,
23
+ "spaceAfter": 3,
24
+ "fontFamily": "ubuntu-sans",
25
+ "fontWeight": 400,
26
+ "fontStyle": "normal"
27
+ },
28
+ {
29
+ "identifier": "h6",
30
+ "fontSize": 0.75,
31
+ "lineHeight": 4,
32
+ "spaceAfter": 3,
33
+ "fontFamily": "ubuntu-sans",
34
+ "fontWeight": 550,
35
+ "fontStyle": "normal"
36
+ },
37
+ {
38
+ "identifier": "h5",
39
+ "fontSize": 0.75,
40
+ "lineHeight": 4,
41
+ "spaceAfter": 3,
42
+ "fontFamily": "ubuntu-sans",
43
+ "fontWeight": 550,
44
+ "fontStyle": "normal",
45
+ "fontVariantCaps": "all-small-caps",
46
+ "letterSpacing": "0.05em"
47
+ },
48
+ {
49
+ "identifier": "h4",
50
+ "fontSize": 1,
51
+ "lineHeight": 4,
52
+ "spaceAfter": 3,
53
+ "fontFamily": "ubuntu-sans",
54
+ "fontWeight": 300,
55
+ "fontStyle": "normal"
56
+ },
57
+ {
58
+ "identifier": "h3",
59
+ "fontSize": 1,
60
+ "lineHeight": 4,
61
+ "spaceAfter": 3,
62
+ "fontFamily": "ubuntu-sans",
63
+ "fontWeight": 500,
64
+ "fontStyle": "normal"
65
+ },
66
+ {
67
+ "identifier": "h2",
68
+ "fontSize": 1.5,
69
+ "lineHeight": 6,
70
+ "spaceAfter": 3,
71
+ "fontFamily": "ubuntu-sans",
72
+ "fontWeight": 200,
73
+ "fontStyle": "normal"
74
+ },
75
+ {
76
+ "identifier": "h1",
77
+ "fontSize": 1.5,
78
+ "lineHeight": 6,
79
+ "spaceAfter": 3,
80
+ "fontFamily": "ubuntu-sans",
81
+ "fontWeight": 500,
82
+ "fontStyle": "normal"
83
+ }
84
+ ],
85
+ "roles": {
86
+ "body": "body",
87
+ "h1": "h1",
88
+ "h2": "h2",
89
+ "h3": "h3",
90
+ "h4": "h4",
91
+ "h5": "h5",
92
+ "h6": "h6"
93
+ },
94
+ "layout": {
95
+ "contentMaxWidthRem": 67.5,
96
+ "contentPaddingInlineRem": 0.75,
97
+ "measureRem": 30,
98
+ "sectionSpaceBaselineUnits": 12,
99
+ "sectionSpaceShallowBaselineUnits": 6,
100
+ "sectionSpaceDeepBaselineUnits": 24,
101
+ "stripSpaceBaselineUnits": 12,
102
+ "gridGapInlineBaselineUnits": 4,
103
+ "gridGapBlockBaselineUnits": 4,
104
+ "pageMarginBaselineUnits": 4
105
+ },
106
+ "components": {
107
+ "borderWidthPx": 1,
108
+ "radiusRem": 0,
109
+ "controlBlockPaddingRem": 0.375,
110
+ "controlCompactBlockPaddingRem": 0.25,
111
+ "controlInlinePaddingRem": 0.75,
112
+ "controlInlinePaddingActionRem": 0.5,
113
+ "controlInlinePaddingFieldRem": 0.25,
114
+ "controlVisualSizeRem": 0.75,
115
+ "fieldGapBaselineUnits": 1,
116
+ "panelPaddingInlineBaselineUnits": 4,
117
+ "panelPaddingBlockBaselineUnits": 4,
118
+ "accordionIndentBaselineUnits": 3
119
+ }
120
+ }
@@ -0,0 +1,5 @@
1
+ export interface AccordionInitOptions {
2
+ root?: ParentNode;
3
+ }
4
+ export declare function toggleAccordionButton(button: HTMLElement): void;
5
+ export declare function initAccordions(options?: AccordionInitOptions): () => void;
@@ -0,0 +1,32 @@
1
+ const TAB_SELECTOR = ".bf-accordion-tab";
2
+ export function toggleAccordionButton(button) {
3
+ const panelId = button.getAttribute("aria-controls");
4
+ if (!panelId) {
5
+ return;
6
+ }
7
+ const panel = button.ownerDocument.getElementById(panelId);
8
+ if (!panel) {
9
+ return;
10
+ }
11
+ const isOpen = button.getAttribute("aria-expanded") === "true";
12
+ button.setAttribute("aria-expanded", String(!isOpen));
13
+ panel.setAttribute("aria-hidden", String(isOpen));
14
+ }
15
+ export function initAccordions(options = {}) {
16
+ const root = options.root ?? document;
17
+ const onClick = (event) => {
18
+ const target = event.target;
19
+ if (!(target instanceof Element)) {
20
+ return;
21
+ }
22
+ const button = target.closest(TAB_SELECTOR);
23
+ if (!button) {
24
+ return;
25
+ }
26
+ toggleAccordionButton(button);
27
+ };
28
+ root.addEventListener("click", onClick);
29
+ return () => {
30
+ root.removeEventListener("click", onClick);
31
+ };
32
+ }
@@ -0,0 +1,4 @@
1
+ export interface ApplicationLayoutInitOptions {
2
+ root?: ParentNode;
3
+ }
4
+ export declare function initApplicationLayouts(options?: ApplicationLayoutInitOptions): () => void;
@@ -0,0 +1,181 @@
1
+ const APPLICATION_SELECTOR = ".bf-application";
2
+ const NAVIGATION_SELECTOR = ".bf-navigation";
3
+ const DRAWER_SELECTOR = ".bf-navigation-drawer";
4
+ const OVERLAY_SELECTOR = ".bf-navigation-overlay";
5
+ const TOGGLE_SELECTOR = "[data-application-layout-toggle]";
6
+ const CLOSE_SELECTOR = "[data-application-layout-close]";
7
+ const PIN_SELECTOR = "[data-application-layout-pin]";
8
+ const COLLAPSED_CLASS = "is-collapsed";
9
+ const PINNED_CLASS = "is-pinned";
10
+ const LARGE_BREAKPOINT = "(min-width: 64.75rem)";
11
+ const lastTriggerByNavigation = new WeakMap();
12
+ function queryAllWithinRoot(root, selector) {
13
+ const elements = Array.from(root.querySelectorAll(selector));
14
+ if (root instanceof Element && root.matches(selector)) {
15
+ elements.unshift(root);
16
+ }
17
+ return elements;
18
+ }
19
+ function getRootWindow(root) {
20
+ if (root instanceof Document) {
21
+ return root.defaultView;
22
+ }
23
+ return root.ownerDocument?.defaultView ?? null;
24
+ }
25
+ function getNavigations(root) {
26
+ return queryAllWithinRoot(root, NAVIGATION_SELECTOR);
27
+ }
28
+ function resolveNavigation(control, root) {
29
+ const controlsId = control.getAttribute("aria-controls");
30
+ if (controlsId) {
31
+ const navigation = root.querySelector(`#${CSS.escape(controlsId)}`);
32
+ if (navigation?.matches(NAVIGATION_SELECTOR)) {
33
+ return navigation;
34
+ }
35
+ }
36
+ const application = control.closest(APPLICATION_SELECTOR);
37
+ return application?.querySelector(NAVIGATION_SELECTOR) ?? null;
38
+ }
39
+ function getAssociatedControls(root, navigation, selector) {
40
+ return queryAllWithinRoot(root, selector).filter(control => {
41
+ return resolveNavigation(control, root) === navigation;
42
+ });
43
+ }
44
+ function getDrawer(navigation) {
45
+ return navigation.querySelector(DRAWER_SELECTOR);
46
+ }
47
+ function getOverlay(navigation) {
48
+ return navigation.querySelector(OVERLAY_SELECTOR);
49
+ }
50
+ function isLargeViewport(navigation) {
51
+ return navigation.ownerDocument.defaultView?.matchMedia(LARGE_BREAKPOINT).matches ?? false;
52
+ }
53
+ function isExpanded(navigation) {
54
+ return !navigation.classList.contains(COLLAPSED_CLASS);
55
+ }
56
+ function updateA11y(root, navigation) {
57
+ const expanded = isExpanded(navigation);
58
+ const largeViewport = isLargeViewport(navigation);
59
+ for (const toggle of getAssociatedControls(root, navigation, TOGGLE_SELECTOR)) {
60
+ toggle.setAttribute("aria-expanded", String(expanded));
61
+ }
62
+ for (const pinButton of getAssociatedControls(root, navigation, PIN_SELECTOR)) {
63
+ pinButton.setAttribute("aria-pressed", String(navigation.classList.contains(PINNED_CLASS)));
64
+ }
65
+ getDrawer(navigation)?.setAttribute("aria-hidden", String(!expanded && !largeViewport));
66
+ getOverlay(navigation)?.setAttribute("aria-hidden", String(!expanded || largeViewport));
67
+ }
68
+ function focusNavigation(navigation) {
69
+ const drawer = getDrawer(navigation);
70
+ if (!drawer) {
71
+ return;
72
+ }
73
+ const focusTarget = drawer.querySelector("[data-application-layout-close], [data-application-layout-pin], button, [href], input, select, textarea, [tabindex]:not([tabindex='-1'])");
74
+ if (focusTarget) {
75
+ queueMicrotask(() => focusTarget.focus());
76
+ }
77
+ }
78
+ function openNavigation(navigation, root, trigger) {
79
+ navigation.classList.remove(COLLAPSED_CLASS);
80
+ updateA11y(root, navigation);
81
+ if (trigger) {
82
+ lastTriggerByNavigation.set(navigation, trigger);
83
+ }
84
+ if (!isLargeViewport(navigation)) {
85
+ focusNavigation(navigation);
86
+ }
87
+ }
88
+ function closeNavigation(navigation, root, restoreFocus) {
89
+ navigation.classList.add(COLLAPSED_CLASS);
90
+ updateA11y(root, navigation);
91
+ if (restoreFocus) {
92
+ lastTriggerByNavigation.get(navigation)?.focus();
93
+ }
94
+ }
95
+ function togglePin(navigation, root) {
96
+ const pinned = navigation.classList.toggle(PINNED_CLASS);
97
+ if (pinned) {
98
+ navigation.classList.remove(COLLAPSED_CLASS);
99
+ }
100
+ updateA11y(root, navigation);
101
+ }
102
+ function syncInitialState(root) {
103
+ for (const navigation of getNavigations(root)) {
104
+ if (navigation.classList.contains(PINNED_CLASS)) {
105
+ navigation.classList.remove(COLLAPSED_CLASS);
106
+ }
107
+ updateA11y(root, navigation);
108
+ }
109
+ }
110
+ export function initApplicationLayouts(options = {}) {
111
+ const root = options.root ?? document;
112
+ const rootWindow = getRootWindow(root);
113
+ syncInitialState(root);
114
+ const onClick = (event) => {
115
+ const target = event.target;
116
+ if (!(target instanceof Element)) {
117
+ return;
118
+ }
119
+ const overlay = target.closest(OVERLAY_SELECTOR);
120
+ if (overlay) {
121
+ const navigation = overlay.closest(NAVIGATION_SELECTOR);
122
+ if (navigation && isExpanded(navigation)) {
123
+ event.preventDefault();
124
+ closeNavigation(navigation, root, true);
125
+ }
126
+ return;
127
+ }
128
+ const pinButton = target.closest(PIN_SELECTOR);
129
+ if (pinButton) {
130
+ const navigation = resolveNavigation(pinButton, root);
131
+ if (navigation) {
132
+ event.preventDefault();
133
+ togglePin(navigation, root);
134
+ }
135
+ return;
136
+ }
137
+ const closeButton = target.closest(CLOSE_SELECTOR);
138
+ if (closeButton) {
139
+ const navigation = resolveNavigation(closeButton, root);
140
+ if (navigation) {
141
+ event.preventDefault();
142
+ closeNavigation(navigation, root, true);
143
+ }
144
+ return;
145
+ }
146
+ const toggle = target.closest(TOGGLE_SELECTOR);
147
+ if (toggle) {
148
+ const navigation = resolveNavigation(toggle, root);
149
+ if (navigation) {
150
+ event.preventDefault();
151
+ if (isExpanded(navigation)) {
152
+ closeNavigation(navigation, root, false);
153
+ }
154
+ else {
155
+ openNavigation(navigation, root, toggle);
156
+ }
157
+ }
158
+ }
159
+ };
160
+ const onKeyDown = (event) => {
161
+ if (!(event instanceof KeyboardEvent) || event.key !== "Escape") {
162
+ return;
163
+ }
164
+ for (const navigation of getNavigations(root)) {
165
+ if (!isLargeViewport(navigation) && isExpanded(navigation)) {
166
+ closeNavigation(navigation, root, true);
167
+ }
168
+ }
169
+ };
170
+ const onResize = () => {
171
+ syncInitialState(root);
172
+ };
173
+ root.addEventListener("click", onClick);
174
+ root.addEventListener("keydown", onKeyDown);
175
+ rootWindow?.addEventListener("resize", onResize);
176
+ return () => {
177
+ root.removeEventListener("click", onClick);
178
+ root.removeEventListener("keydown", onKeyDown);
179
+ rootWindow?.removeEventListener("resize", onResize);
180
+ };
181
+ }
@@ -0,0 +1,5 @@
1
+ export interface BaselineGridOverlayOptions {
2
+ baselineUnit: string;
3
+ }
4
+ export declare function generateBaselineGridOverlayCss(options: BaselineGridOverlayOptions): string;
5
+ export declare function generateBaselineGridThemeOverrideCss(): string;
@@ -0,0 +1,50 @@
1
+ import { BASELINE_GRID_DARK_THEME_COLOR, BASELINE_GRID_DEFAULT_COLOR, BASELINE_GRID_LIGHT_THEME_COLOR } from "./baseline-grid-theme.js";
2
+ export function generateBaselineGridOverlayCss(options) {
3
+ return `.u-baseline-grid {
4
+ --bf-baseline-grid-color: ${BASELINE_GRID_DEFAULT_COLOR};
5
+ --bf-baseline-grid-page-color: transparent;
6
+ --bf-baseline-grid-offset: 0rem;
7
+ --bf-baseline-grid-size: var(--bf-baseline, ${options.baselineUnit});
8
+ position: relative;
9
+ }
10
+
11
+ .u-baseline-grid::after {
12
+ background-image: linear-gradient(
13
+ to top,
14
+ var(--bf-baseline-grid-color),
15
+ var(--bf-baseline-grid-color) 1px,
16
+ transparent 1px,
17
+ transparent
18
+ );
19
+ background-size: 100% var(--bf-baseline-grid-size);
20
+ bottom: 0;
21
+ content: "";
22
+ display: block;
23
+ left: 0;
24
+ pointer-events: none;
25
+ position: absolute;
26
+ right: 0;
27
+ top: var(--bf-baseline-grid-offset);
28
+ z-index: 200;
29
+ }
30
+
31
+ html.u-baseline-grid {
32
+ background-color: var(--bf-baseline-grid-page-color);
33
+ position: static;
34
+ }
35
+
36
+ html.u-baseline-grid::after {
37
+ z-index: -1;
38
+ }`;
39
+ }
40
+ export function generateBaselineGridThemeOverrideCss() {
41
+ return `:where(.bf-theme).u-baseline-grid,
42
+ :where(.bf-theme) .u-baseline-grid {
43
+ --bf-baseline-grid-color: ${BASELINE_GRID_LIGHT_THEME_COLOR};
44
+ }
45
+
46
+ :where(.bf-theme.is-dark).u-baseline-grid,
47
+ :where(.bf-theme.is-dark) .u-baseline-grid {
48
+ --bf-baseline-grid-color: ${BASELINE_GRID_DARK_THEME_COLOR};
49
+ }`;
50
+ }
@@ -0,0 +1,3 @@
1
+ export declare const BASELINE_GRID_DEFAULT_COLOR = "rgba(15, 23, 42, 0.06)";
2
+ export declare const BASELINE_GRID_LIGHT_THEME_COLOR = "rgba(20, 22, 28, 0.06)";
3
+ export declare const BASELINE_GRID_DARK_THEME_COLOR = "rgba(255, 255, 255, 0.06)";
@@ -0,0 +1,3 @@
1
+ export const BASELINE_GRID_DEFAULT_COLOR = "rgba(15, 23, 42, 0.06)";
2
+ export const BASELINE_GRID_LIGHT_THEME_COLOR = "rgba(20, 22, 28, 0.06)";
3
+ export const BASELINE_GRID_DARK_THEME_COLOR = "rgba(255, 255, 255, 0.06)";
@@ -0,0 +1,7 @@
1
+ export interface BaselineGridInitOptions {
2
+ defaultEnabled?: boolean;
3
+ toggleSelector?: string;
4
+ targetClassName?: string;
5
+ }
6
+ export declare function setupBaselineGridToggle(toggle: HTMLInputElement, options?: BaselineGridInitOptions): void;
7
+ export declare function initBaselineGridToggles(options?: BaselineGridInitOptions): void;
@@ -0,0 +1,35 @@
1
+ function getTargetElement(toggle) {
2
+ const targetId = toggle.getAttribute("aria-controls");
3
+ if (!targetId) {
4
+ return null;
5
+ }
6
+ return document.getElementById(targetId);
7
+ }
8
+ export function setupBaselineGridToggle(toggle, options = {}) {
9
+ const target = getTargetElement(toggle);
10
+ if (!target) {
11
+ return;
12
+ }
13
+ const targetClassName = options.targetClassName ?? "u-baseline-grid";
14
+ const defaultEnabled = options.defaultEnabled ?? false;
15
+ const isEnabled = target.classList.contains(targetClassName) || (defaultEnabled && toggle.dataset.baselineDefault !== "off");
16
+ target.classList.toggle(targetClassName, isEnabled);
17
+ toggle.checked = isEnabled;
18
+ toggle.addEventListener("change", () => {
19
+ target.classList.toggle(targetClassName, toggle.checked);
20
+ });
21
+ }
22
+ export function initBaselineGridToggles(options = {}) {
23
+ const toggleSelector = options.toggleSelector ?? ".js-baseline-toggle[aria-controls]";
24
+ const toggles = document.querySelectorAll(toggleSelector);
25
+ if (toggles.length > 0) {
26
+ toggles.forEach(toggle => {
27
+ setupBaselineGridToggle(toggle, options);
28
+ });
29
+ }
30
+ else if (options.defaultEnabled) {
31
+ // No toggle found; apply grid directly to body when default-on.
32
+ const targetClassName = options.targetClassName ?? "u-baseline-grid";
33
+ document.body.classList.add(targetClassName);
34
+ }
35
+ }
@@ -0,0 +1,21 @@
1
+ import type { PresetName, TierName } from "./presets.js";
2
+ import type { BuildThemeResult, DeriveBaselineTokensResult, ThemeConfig } from "./types.js";
3
+ export interface AdditionalThemeSurfaceBuildConfig {
4
+ name: string;
5
+ configPath: string;
6
+ className?: string;
7
+ label?: string;
8
+ }
9
+ export interface BuildThemeFromConfigOptions {
10
+ distDir?: string;
11
+ baselineDir?: string;
12
+ surfaceLabel?: string;
13
+ additionalSurfaces?: AdditionalThemeSurfaceBuildConfig[];
14
+ }
15
+ export declare function readThemeConfig(configPath: string): Promise<ThemeConfig>;
16
+ export declare function buildThemeFromConfig(configPath?: string, options?: BuildThemeFromConfigOptions): Promise<BuildThemeResult>;
17
+ export declare function buildThemeFromTier(tier: TierName): Promise<BuildThemeResult>;
18
+ export declare function buildThemeFromPreset(preset: PresetName): Promise<BuildThemeResult>;
19
+ export declare function deriveBaselineTokensFromConfig(configPath?: string, options?: {
20
+ baselineDir?: string;
21
+ }): Promise<DeriveBaselineTokensResult>;