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,184 @@
1
+ const SORT_BUTTON_SELECTOR = ".bf-table.is-sortable th[aria-sort] > .bf-table-sort-button";
2
+ const EXPAND_BUTTON_SELECTOR = ".bf-table.is-expanding .bf-table-expand-toggle[aria-controls]";
3
+ const MOBILE_CARD_TABLE_SELECTOR = ".bf-table.is-mobile-card";
4
+ const SORT_DIRECTIONS = ["none", "ascending", "descending"];
5
+ function closestButton(target, selector) {
6
+ if (!(target instanceof Element)) {
7
+ return null;
8
+ }
9
+ return target.closest(selector);
10
+ }
11
+ function nextSortDirection(value) {
12
+ const currentIndex = SORT_DIRECTIONS.indexOf(value);
13
+ return SORT_DIRECTIONS[(currentIndex + 1 + SORT_DIRECTIONS.length) % SORT_DIRECTIONS.length];
14
+ }
15
+ function sortableHeader(button) {
16
+ const header = button.closest("th[aria-sort]");
17
+ return header?.closest("table")?.classList.contains("is-sortable") ? header : null;
18
+ }
19
+ function directRows(body) {
20
+ return Array.from(body.children).filter((child) => child instanceof HTMLTableRowElement);
21
+ }
22
+ function defaultCompare(locale) {
23
+ const collator = new Intl.Collator(locale, { numeric: true, sensitivity: "base" });
24
+ return (valueA, valueB) => collator.compare(valueA, valueB);
25
+ }
26
+ function cellValue(row, columnIndex) {
27
+ const cell = row.cells.item(columnIndex);
28
+ if (!cell) {
29
+ return "";
30
+ }
31
+ return Array.from(cell.childNodes)
32
+ .filter(node => !(node instanceof Element && node.classList.contains("bf-table-card-label")))
33
+ .map(node => node.textContent ?? "")
34
+ .join(" ")
35
+ .trim();
36
+ }
37
+ export function initSortableTables(options = {}) {
38
+ const root = options.root ?? document;
39
+ const compare = options.compare ?? defaultCompare(options.locale);
40
+ const originalOrder = new WeakMap();
41
+ for (const table of Array.from(root.querySelectorAll(".bf-table.is-sortable"))) {
42
+ for (const body of Array.from(table.tBodies)) {
43
+ originalOrder.set(body, directRows(body));
44
+ }
45
+ }
46
+ const onClick = (event) => {
47
+ const button = closestButton(event.target, SORT_BUTTON_SELECTOR);
48
+ if (!button || !root.contains(button)) {
49
+ return;
50
+ }
51
+ const header = sortableHeader(button);
52
+ const table = header?.closest("table.bf-table.is-sortable");
53
+ if (!header || !table) {
54
+ return;
55
+ }
56
+ const columnIndex = header.cellIndex;
57
+ const direction = nextSortDirection(header.getAttribute("aria-sort"));
58
+ for (const sortable of Array.from(table.querySelectorAll("th[aria-sort]"))) {
59
+ sortable.setAttribute("aria-sort", "none");
60
+ }
61
+ header.setAttribute("aria-sort", direction);
62
+ for (const body of Array.from(table.tBodies)) {
63
+ const initialRows = originalOrder.get(body) ?? directRows(body);
64
+ originalOrder.set(body, initialRows);
65
+ const initialIndex = new Map(initialRows.map((row, index) => [row, index]));
66
+ const rows = direction === "none" ? [...initialRows] : directRows(body).map((row, index) => ({ row, index }));
67
+ if (direction !== "none") {
68
+ const context = { columnIndex, direction, table };
69
+ const multiplier = direction === "ascending" ? 1 : -1;
70
+ rows.sort((entryA, entryB) => {
71
+ if (!("row" in entryA) || !("row" in entryB)) {
72
+ return 0;
73
+ }
74
+ const result = compare(cellValue(entryA.row, columnIndex), cellValue(entryB.row, columnIndex), context);
75
+ return result === 0 ? entryA.index - entryB.index : result * multiplier;
76
+ });
77
+ }
78
+ for (const entry of rows) {
79
+ const row = entry instanceof HTMLTableRowElement ? entry : entry.row;
80
+ body.append(row);
81
+ }
82
+ if (direction === "none") {
83
+ for (const row of directRows(body)) {
84
+ if (!initialIndex.has(row)) {
85
+ body.append(row);
86
+ }
87
+ }
88
+ }
89
+ }
90
+ };
91
+ root.addEventListener("click", onClick);
92
+ return () => root.removeEventListener("click", onClick);
93
+ }
94
+ function controlledExpansionRow(button) {
95
+ const id = button.getAttribute("aria-controls");
96
+ const table = button.closest("table.bf-table.is-expanding");
97
+ if (!id || !table) {
98
+ return null;
99
+ }
100
+ const row = button.ownerDocument.getElementById(id);
101
+ return row instanceof HTMLTableRowElement && row.classList.contains("bf-table-expanding-row") && row.closest("table") === table
102
+ ? row
103
+ : null;
104
+ }
105
+ function expansionLabel(button) {
106
+ return button.querySelector(".bf-table-expand-toggle-label");
107
+ }
108
+ function syncExpansion(button, row, expanded, defaultExpandedLabel, defaultCollapsedLabel) {
109
+ button.setAttribute("aria-expanded", String(expanded));
110
+ row.hidden = !expanded;
111
+ row.setAttribute("aria-hidden", String(!expanded));
112
+ const label = expansionLabel(button);
113
+ if (label) {
114
+ label.textContent = expanded
115
+ ? button.getAttribute("data-bf-expanded-label")?.trim() || defaultExpandedLabel
116
+ : button.getAttribute("data-bf-collapsed-label")?.trim() || defaultCollapsedLabel;
117
+ }
118
+ }
119
+ export function initExpandingTables(options = {}) {
120
+ const root = options.root ?? document;
121
+ const expandedLabel = options.expandedLabel ?? "Hide details";
122
+ const collapsedLabel = options.collapsedLabel ?? "Show details";
123
+ for (const button of Array.from(root.querySelectorAll(EXPAND_BUTTON_SELECTOR))) {
124
+ const row = controlledExpansionRow(button);
125
+ if (row) {
126
+ syncExpansion(button, row, button.getAttribute("aria-expanded") === "true", expandedLabel, collapsedLabel);
127
+ }
128
+ }
129
+ const onClick = (event) => {
130
+ const button = closestButton(event.target, EXPAND_BUTTON_SELECTOR);
131
+ if (!button || !root.contains(button)) {
132
+ return;
133
+ }
134
+ const row = controlledExpansionRow(button);
135
+ if (!row) {
136
+ return;
137
+ }
138
+ event.preventDefault();
139
+ syncExpansion(button, row, button.getAttribute("aria-expanded") !== "true", expandedLabel, collapsedLabel);
140
+ };
141
+ root.addEventListener("click", onClick);
142
+ return () => root.removeEventListener("click", onClick);
143
+ }
144
+ export function initMobileCardTables(options = {}) {
145
+ const root = options.root ?? document;
146
+ const generatedLabels = [];
147
+ for (const table of Array.from(root.querySelectorAll(MOBILE_CARD_TABLE_SELECTOR))) {
148
+ const headingRow = table.tHead?.rows.item(table.tHead.rows.length - 1);
149
+ if (!headingRow) {
150
+ continue;
151
+ }
152
+ const headings = Array.from(headingRow.cells, heading => heading.textContent?.trim() ?? "");
153
+ for (const body of Array.from(table.tBodies)) {
154
+ for (const row of directRows(body)) {
155
+ for (const cell of Array.from(row.cells)) {
156
+ let label = cell.querySelector(":scope > .bf-table-card-label");
157
+ if (!label) {
158
+ label = cell.ownerDocument.createElement("span");
159
+ label.className = "bf-table-card-label";
160
+ label.setAttribute("aria-hidden", "true");
161
+ cell.prepend(label);
162
+ generatedLabels.push(label);
163
+ }
164
+ label.textContent = headings[cell.cellIndex] ?? "";
165
+ }
166
+ }
167
+ }
168
+ }
169
+ return () => {
170
+ for (const label of generatedLabels) {
171
+ label.remove();
172
+ }
173
+ };
174
+ }
175
+ export function initInteractiveTables(options = {}) {
176
+ const disposeSorting = initSortableTables(options);
177
+ const disposeExpanding = initExpandingTables(options);
178
+ const disposeMobileCards = initMobileCardTables(options);
179
+ return () => {
180
+ disposeMobileCards();
181
+ disposeExpanding();
182
+ disposeSorting();
183
+ };
184
+ }
@@ -0,0 +1,4 @@
1
+ export interface ListTreeInitOptions {
2
+ root?: ParentNode;
3
+ }
4
+ export declare function initListTree(options?: ListTreeInitOptions): () => void;
@@ -0,0 +1,44 @@
1
+ const TOGGLE_SELECTOR = ".bf-list-tree-toggle";
2
+ const ITEM_SELECTOR = ".bf-list-tree-item";
3
+ const LIST_SELECTOR = ".bf-list-tree";
4
+ function getNestedList(item, toggle) {
5
+ const listId = toggle.getAttribute("aria-controls");
6
+ if (listId) {
7
+ return toggle.ownerDocument.getElementById(listId);
8
+ }
9
+ for (const child of Array.from(item.children)) {
10
+ if (child instanceof HTMLElement && child.matches(LIST_SELECTOR)) {
11
+ return child;
12
+ }
13
+ }
14
+ return null;
15
+ }
16
+ export function initListTree(options = {}) {
17
+ const root = options.root ?? document;
18
+ const onClick = (event) => {
19
+ const target = event.target;
20
+ if (!(target instanceof Element)) {
21
+ return;
22
+ }
23
+ const toggle = target.closest(TOGGLE_SELECTOR);
24
+ if (!toggle) {
25
+ return;
26
+ }
27
+ const item = toggle.closest(ITEM_SELECTOR);
28
+ if (!item) {
29
+ return;
30
+ }
31
+ const isExpanded = toggle.getAttribute("aria-expanded") === "true" || item.getAttribute("aria-expanded") === "true";
32
+ const nextExpanded = String(!isExpanded);
33
+ item.setAttribute("aria-expanded", nextExpanded);
34
+ toggle.setAttribute("aria-expanded", nextExpanded);
35
+ const nestedList = getNestedList(item, toggle);
36
+ if (nestedList) {
37
+ nestedList.setAttribute("aria-hidden", String(isExpanded));
38
+ }
39
+ };
40
+ root.addEventListener("click", onClick);
41
+ return () => {
42
+ root.removeEventListener("click", onClick);
43
+ };
44
+ }
@@ -0,0 +1,4 @@
1
+ export interface PanelDrawerInitOptions {
2
+ root?: ParentNode;
3
+ }
4
+ export declare function initPanelDrawers(options?: PanelDrawerInitOptions): () => void;
@@ -0,0 +1,171 @@
1
+ const APPLICATION_SELECTOR = ".bf-application";
2
+ const DRAWER_SELECTOR = ".bf-aside.is-overlay, .bf-aside.is-drawer";
3
+ const TOGGLE_SELECTOR = "[data-panel-drawer-toggle]";
4
+ const CLOSE_SELECTOR = "[data-panel-drawer-close]";
5
+ const OVERLAY_SELECTOR = ".bf-application-overlay";
6
+ const APPLICATION_OPEN_CLASS = "is-drawer-expanded";
7
+ const DRAWER_OPEN_CLASS = "is-open";
8
+ const lastTriggerByDrawer = new WeakMap();
9
+ function queryAllWithinRoot(root, selector) {
10
+ const elements = Array.from(root.querySelectorAll(selector));
11
+ if (root instanceof Element && root.matches(selector)) {
12
+ elements.unshift(root);
13
+ }
14
+ return elements;
15
+ }
16
+ function getDrawers(root) {
17
+ return queryAllWithinRoot(root, DRAWER_SELECTOR);
18
+ }
19
+ function normalizeTargetId(value) {
20
+ if (!value) {
21
+ return null;
22
+ }
23
+ return value.startsWith("#") ? value.slice(1) : value;
24
+ }
25
+ function getApplication(drawer) {
26
+ return drawer.closest(APPLICATION_SELECTOR);
27
+ }
28
+ function getAssociatedToggles(root, drawer) {
29
+ return queryAllWithinRoot(root, TOGGLE_SELECTOR).filter(toggle => {
30
+ return resolveDrawer(toggle, root) === drawer;
31
+ });
32
+ }
33
+ function resolveDrawer(control, root) {
34
+ const targetId = normalizeTargetId(control.getAttribute("aria-controls")
35
+ ?? (control instanceof HTMLElement ? control.dataset.panelDrawerTarget ?? null : null));
36
+ if (targetId) {
37
+ const target = root.querySelector(`#${CSS.escape(targetId)}`);
38
+ if (target?.matches(DRAWER_SELECTOR)) {
39
+ return target;
40
+ }
41
+ }
42
+ const application = control.closest(APPLICATION_SELECTOR);
43
+ return application?.querySelector(DRAWER_SELECTOR) ?? null;
44
+ }
45
+ function updateToggles(root, drawer, expanded) {
46
+ for (const toggle of getAssociatedToggles(root, drawer)) {
47
+ toggle.setAttribute("aria-expanded", String(expanded));
48
+ }
49
+ }
50
+ function isOpen(drawer) {
51
+ const application = getApplication(drawer);
52
+ if (!application) {
53
+ return drawer.classList.contains(DRAWER_OPEN_CLASS);
54
+ }
55
+ return application.classList.contains(APPLICATION_OPEN_CLASS) || drawer.classList.contains(DRAWER_OPEN_CLASS);
56
+ }
57
+ function syncApplicationState(application) {
58
+ const hasOpenDrawer = Array.from(application.querySelectorAll(DRAWER_SELECTOR)).some(drawer => {
59
+ return drawer.classList.contains(DRAWER_OPEN_CLASS);
60
+ });
61
+ application.classList.toggle(APPLICATION_OPEN_CLASS, hasOpenDrawer);
62
+ const overlay = application.querySelector(OVERLAY_SELECTOR);
63
+ if (overlay) {
64
+ overlay.setAttribute("aria-hidden", String(!hasOpenDrawer));
65
+ }
66
+ }
67
+ function focusDrawer(drawer) {
68
+ const focusTarget = drawer.querySelector("[data-panel-drawer-autofocus], [data-panel-drawer-close], button, [href], input, select, textarea, [tabindex]:not([tabindex='-1'])");
69
+ if (focusTarget) {
70
+ queueMicrotask(() => focusTarget.focus());
71
+ }
72
+ }
73
+ function openDrawer(drawer, root, trigger) {
74
+ for (const otherDrawer of getDrawers(root)) {
75
+ if (otherDrawer !== drawer && isOpen(otherDrawer)) {
76
+ closeDrawer(otherDrawer, root, false);
77
+ }
78
+ }
79
+ drawer.classList.add(DRAWER_OPEN_CLASS);
80
+ drawer.setAttribute("aria-hidden", "false");
81
+ updateToggles(root, drawer, true);
82
+ const application = getApplication(drawer);
83
+ if (application) {
84
+ syncApplicationState(application);
85
+ }
86
+ if (trigger) {
87
+ lastTriggerByDrawer.set(drawer, trigger);
88
+ }
89
+ focusDrawer(drawer);
90
+ }
91
+ function closeDrawer(drawer, root, restoreFocus) {
92
+ drawer.classList.remove(DRAWER_OPEN_CLASS);
93
+ drawer.setAttribute("aria-hidden", "true");
94
+ updateToggles(root, drawer, false);
95
+ const application = getApplication(drawer);
96
+ if (application) {
97
+ syncApplicationState(application);
98
+ }
99
+ if (restoreFocus) {
100
+ lastTriggerByDrawer.get(drawer)?.focus();
101
+ }
102
+ }
103
+ function syncInitialState(root) {
104
+ for (const drawer of getDrawers(root)) {
105
+ drawer.setAttribute("aria-hidden", String(!isOpen(drawer)));
106
+ updateToggles(root, drawer, isOpen(drawer));
107
+ const application = getApplication(drawer);
108
+ if (application) {
109
+ syncApplicationState(application);
110
+ }
111
+ }
112
+ }
113
+ export function initPanelDrawers(options = {}) {
114
+ const root = options.root ?? document;
115
+ syncInitialState(root);
116
+ const onClick = (event) => {
117
+ const target = event.target;
118
+ if (!(target instanceof Element)) {
119
+ return;
120
+ }
121
+ const toggle = target.closest(TOGGLE_SELECTOR);
122
+ if (toggle) {
123
+ const drawer = resolveDrawer(toggle, root);
124
+ if (!drawer) {
125
+ return;
126
+ }
127
+ if (isOpen(drawer)) {
128
+ closeDrawer(drawer, root, false);
129
+ }
130
+ else {
131
+ openDrawer(drawer, root, toggle);
132
+ }
133
+ event.preventDefault();
134
+ return;
135
+ }
136
+ const closeControl = target.closest(CLOSE_SELECTOR);
137
+ if (closeControl) {
138
+ const drawer = resolveDrawer(closeControl, root)
139
+ ?? closeControl.closest(DRAWER_SELECTOR);
140
+ if (drawer) {
141
+ closeDrawer(drawer, root, true);
142
+ }
143
+ event.preventDefault();
144
+ return;
145
+ }
146
+ const overlay = target.closest(OVERLAY_SELECTOR);
147
+ if (overlay) {
148
+ const application = overlay.closest(APPLICATION_SELECTOR);
149
+ const drawer = application?.querySelector(DRAWER_SELECTOR);
150
+ if (drawer) {
151
+ closeDrawer(drawer, root, true);
152
+ }
153
+ }
154
+ };
155
+ const onKeyDown = (event) => {
156
+ if (!(event instanceof KeyboardEvent) || event.key !== "Escape") {
157
+ return;
158
+ }
159
+ for (const drawer of getDrawers(root)) {
160
+ if (isOpen(drawer)) {
161
+ closeDrawer(drawer, root, true);
162
+ }
163
+ }
164
+ };
165
+ root.addEventListener("click", onClick);
166
+ root.addEventListener("keydown", onKeyDown);
167
+ return () => {
168
+ root.removeEventListener("click", onClick);
169
+ root.removeEventListener("keydown", onKeyDown);
170
+ };
171
+ }