@pnx-mixtape/mxds 0.0.2 → 0.0.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 (183) hide show
  1. package/README.md +13 -13
  2. package/dist/build/accordion.css +1 -108
  3. package/dist/build/accordion.entry.js +1 -0
  4. package/dist/build/base.css +1 -1000
  5. package/dist/build/breadcrumb.css +1 -47
  6. package/dist/build/button.css +1 -126
  7. package/dist/build/callout.css +1 -11
  8. package/dist/build/card.css +1 -135
  9. package/dist/build/chunks/disclosure-widget-CfhDmuvA.js +1 -0
  10. package/dist/build/chunks/keyboard-Cs0cduxq.js +1 -0
  11. package/dist/build/chunks/polyfills-DUM8gN-6.js +1 -0
  12. package/dist/build/chunks/popover-BGbvrIUp.js +1 -0
  13. package/dist/build/chunks/utilities-Bzel_okZ.js +2 -0
  14. package/dist/build/constants.css +1 -120
  15. package/dist/build/container-grid.css +1 -207
  16. package/dist/build/content-block.css +1 -23
  17. package/dist/build/dialog.css +1 -98
  18. package/dist/build/dialog.entry.js +1 -0
  19. package/dist/build/drop-menu.css +1 -78
  20. package/dist/build/drop-menu.entry.js +1 -0
  21. package/dist/build/drupal.css +1 -74
  22. package/dist/build/footer-menu.css +1 -32
  23. package/dist/build/footer.css +1 -61
  24. package/dist/build/form.css +1 -589
  25. package/dist/build/grid.css +1 -200
  26. package/dist/build/header.css +1 -131
  27. package/dist/build/header.entry.js +1 -0
  28. package/dist/build/hero-banner.css +1 -62
  29. package/dist/build/icon.css +1 -399
  30. package/dist/build/in-page-alert.css +1 -94
  31. package/dist/build/in-page-alert.entry.js +1 -0
  32. package/dist/build/in-page-navigation.css +1 -17
  33. package/dist/build/in-page-navigation.entry.js +1 -0
  34. package/dist/build/index.css +1 -4980
  35. package/dist/build/link-list.css +1 -72
  36. package/dist/build/masthead.css +1 -39
  37. package/dist/build/nav-list.css +1 -29
  38. package/dist/build/navigation.css +1 -371
  39. package/dist/build/navigation.entry.js +1 -0
  40. package/dist/build/page.css +1 -184
  41. package/dist/build/pagination.css +1 -123
  42. package/dist/build/section.css +1 -160
  43. package/dist/build/sidebar.css +1 -105
  44. package/dist/build/sticky.css +1 -47
  45. package/dist/build/sticky.entry.js +1 -0
  46. package/dist/build/tabs.css +1 -106
  47. package/dist/build/tabs.entry.js +1 -0
  48. package/dist/build/tag.css +1 -67
  49. package/dist/build/tiles.css +1 -61
  50. package/dist/build/utilities.css +1 -175
  51. package/package.json +4 -3
  52. package/src/Atom/Background/_background.css +1 -22
  53. package/src/Atom/Blockquote/_blockquote.css +1 -1
  54. package/src/Atom/Button/README.md +3 -3
  55. package/src/Atom/Button/_buttons-styles.css +1 -1
  56. package/src/Atom/Button/_buttons.css +1 -1
  57. package/src/Atom/Heading/_headings.css +1 -1
  58. package/src/Atom/Icon/README.md +1 -1
  59. package/src/Atom/Icon/_extended-set.css +1 -1
  60. package/src/Atom/Icon/_icon.css +5 -5
  61. package/src/Atom/Image/_image.css +1 -1
  62. package/src/Atom/Link/_links.css +1 -1
  63. package/src/Atom/Media/_media.css +1 -1
  64. package/src/Atom/Media/media.twig +1 -5
  65. package/src/Atom/NavList/nav-list.css +1 -1
  66. package/src/Atom/README.md +1 -1
  67. package/src/Atom/Spacing/_spacing.css +1 -1
  68. package/src/Atom/Table/_table.css +1 -1
  69. package/src/Atom/Text/_text-align.css +1 -1
  70. package/src/Atom/Text/_text-sizes.css +1 -1
  71. package/src/Atom/Video/_video.css +1 -1
  72. package/src/Atom/Video/video.twig +10 -4
  73. package/src/Atom/_animated.css +1 -1
  74. package/src/Atom/_flow-legacy.css +1 -1
  75. package/src/Atom/_flow.css +1 -1
  76. package/src/Atom/_generic.css +1 -1
  77. package/src/Atom/_hr.css +1 -1
  78. package/src/Atom/base.css +2 -2
  79. package/src/Component/Accordion/README.md +7 -17
  80. package/src/Component/Accordion/accordion.css +2 -2
  81. package/src/Component/Accordion/accordion.entry.js +2 -0
  82. package/src/Component/Breadcrumb/breadcrumb.css +1 -1
  83. package/src/Component/Callout/callout.css +1 -1
  84. package/src/Component/Card/README.md +7 -13
  85. package/src/Component/Card/card.css +3 -3
  86. package/src/Component/ContentBlock/README.md +7 -13
  87. package/src/Component/ContentBlock/content-block.css +2 -2
  88. package/src/Component/Dialog/README.md +15 -49
  89. package/src/Component/Dialog/dialog.css +3 -3
  90. package/src/Component/Dialog/dialog.entry.js +1 -0
  91. package/src/Component/DropMenu/README.md +19 -4
  92. package/src/Component/DropMenu/drop-menu.css +1 -1
  93. package/src/Component/DropMenu/drop-menu.entry.js +1 -0
  94. package/src/Component/HeroBanner/hero-banner.css +1 -1
  95. package/src/Component/HeroBanner/hero-banner.twig +1 -0
  96. package/src/Component/InPageAlert/README.md +4 -4
  97. package/src/Component/InPageAlert/in-page-alert.css +2 -2
  98. package/src/Component/InPageAlert/in-page-alert.entry.js +1 -0
  99. package/src/Component/InPageNavigation/README.md +10 -15
  100. package/src/Component/InPageNavigation/in-page-navigation.css +2 -2
  101. package/src/Component/InPageNavigation/in-page-navigation.entry.js +1 -0
  102. package/src/Component/LinkList/README.md +3 -3
  103. package/src/Component/LinkList/link-list.css +1 -1
  104. package/src/Component/Navigation/README.md +16 -7
  105. package/src/Component/Navigation/_navigation-collapsible.css +1 -1
  106. package/src/Component/Navigation/_navigation-dropdown.css +1 -1
  107. package/src/Component/Navigation/_navigation-mega.css +1 -1
  108. package/src/Component/Navigation/_navigation.css +1 -1
  109. package/src/Component/Navigation/navigation.entry.js +1 -0
  110. package/src/Component/Pagination/README.md +3 -3
  111. package/src/Component/Pagination/pagination.css +1 -1
  112. package/src/Component/Sticky/README.md +12 -5
  113. package/src/Component/Sticky/sticky.css +2 -2
  114. package/src/Component/Sticky/sticky.entry.js +1 -0
  115. package/src/Component/Tabs/README.md +12 -4
  116. package/src/Component/Tabs/tabs.css +2 -2
  117. package/src/Component/Tabs/tabs.entry.js +1 -0
  118. package/src/Component/Tag/README.md +2 -2
  119. package/src/Component/Tag/tag.css +1 -1
  120. package/src/Component/Tile/tiles.css +1 -1
  121. package/src/Form/README.md +2 -2
  122. package/src/Form/form.css +12 -12
  123. package/src/Layout/Footer/FooterMenu/footer-menu.css +1 -1
  124. package/src/Layout/Footer/footer.css +1 -1
  125. package/src/Layout/Grid/container-grid.css +2 -2
  126. package/src/Layout/Grid/grid.css +2 -2
  127. package/src/Layout/Header/_header.css +1 -1
  128. package/src/Layout/Header/_toggles.css +1 -1
  129. package/src/Layout/Header/header.entry.js +1 -0
  130. package/src/Layout/Masthead/masthead.css +5 -5
  131. package/src/Layout/Masthead/masthead.twig +2 -2
  132. package/src/Layout/Page/README.md +2 -2
  133. package/src/Layout/Page/page.css +2 -2
  134. package/src/Layout/README.md +3 -2
  135. package/src/Layout/Section/section.css +4 -4
  136. package/src/Layout/Sidebar/sidebar.css +1 -1
  137. package/src/Utility/Drupal/README.md +1 -1
  138. package/src/Utility/README.md +1 -1
  139. package/src/Utility/_layout-utils.css +1 -1
  140. package/src/Utility/utilities.css +3 -3
  141. package/dist/build/Accordion.js +0 -61
  142. package/dist/build/Accordion.js.map +0 -1
  143. package/dist/build/AccordionDiv.js +0 -62
  144. package/dist/build/AccordionDiv.js.map +0 -1
  145. package/dist/build/AccordionGroup.js +0 -85
  146. package/dist/build/AccordionGroup.js.map +0 -1
  147. package/dist/build/AccordionMobile.js +0 -31
  148. package/dist/build/AccordionMobile.js.map +0 -1
  149. package/dist/build/Dialog.js +0 -116
  150. package/dist/build/Dialog.js.map +0 -1
  151. package/dist/build/DropMenu.js +0 -132
  152. package/dist/build/DropMenu.js.map +0 -1
  153. package/dist/build/GlobalToggle.js +0 -103
  154. package/dist/build/GlobalToggle.js.map +0 -1
  155. package/dist/build/InPageAlert.js +0 -61
  156. package/dist/build/InPageAlert.js.map +0 -1
  157. package/dist/build/InPageNavigation.js +0 -92
  158. package/dist/build/InPageNavigation.js.map +0 -1
  159. package/dist/build/Navigation.js +0 -126
  160. package/dist/build/Navigation.js.map +0 -1
  161. package/dist/build/Sticky.js +0 -63
  162. package/dist/build/Sticky.js.map +0 -1
  163. package/dist/build/Tabs.js +0 -164
  164. package/dist/build/Tabs.js.map +0 -1
  165. package/dist/build/breakpoint-loader.js +0 -52
  166. package/dist/build/breakpoint-loader.js.map +0 -1
  167. package/dist/build/chunks/js.cookie-CiMiGxWx.js +0 -101
  168. package/dist/build/chunks/js.cookie-CiMiGxWx.js.map +0 -1
  169. package/dist/build/chunks/polyfills-CJ5uTmUJ.js +0 -749
  170. package/dist/build/chunks/polyfills-CJ5uTmUJ.js.map +0 -1
  171. package/dist/build/chunks/popover-wbPSyFRj.js +0 -654
  172. package/dist/build/chunks/popover-wbPSyFRj.js.map +0 -1
  173. package/dist/build/chunks/utilities-BIk0P2KX.js +0 -61
  174. package/dist/build/chunks/utilities-BIk0P2KX.js.map +0 -1
  175. package/dist/build/cookie-compliance.js +0 -122
  176. package/dist/build/cookie-compliance.js.map +0 -1
  177. package/dist/build/disclosure-widget.js +0 -124
  178. package/dist/build/disclosure-widget.js.map +0 -1
  179. package/dist/build/io-loader.js +0 -44
  180. package/dist/build/io-loader.js.map +0 -1
  181. package/dist/build/keyboard.js +0 -101
  182. package/dist/build/keyboard.js.map +0 -1
  183. package/src/index.css +0 -27
@@ -1 +0,0 @@
1
- {"version":3,"file":"InPageAlert.js","sources":["../../src/Component/InPageAlert/Elements/InPageAlert.ts"],"sourcesContent":["/**\n * @file InPageAlerts\n *\n * When a InPageAlert is closed the id is written to local storage.\n * This is checked as the page is re-rendered, if a InPageAlert with the same ID is\n * created it will be removed from the dom.\n */\n\nimport { makeAnchor, createElement } from \"../../../Utility/utilities\"\n\nexport default class InPageAlert extends HTMLElement {\n internals_: ElementInternals\n controller: AbortController\n\n constructor() {\n super()\n this.internals_ = this.attachInternals()\n this.controller = new AbortController()\n }\n\n connectedCallback(): void {\n this.id = this.id || this.generatedId()\n if (this.localStorage) {\n this.controller.abort()\n this.remove()\n return\n }\n const { signal }: AbortController = this.controller\n this.close?.addEventListener(\"click\", this.handleClose, { signal })\n }\n\n disconnectedCallback(): void {\n this.controller.abort()\n this.close.remove()\n }\n\n /**\n * Handle close button click event.\n */\n handleClose = (): void => {\n this.controller.abort()\n this.remove()\n this.localStorage = \"true\"\n const newEvent: CustomEvent<{ id: string; target: InPageAlert }> =\n new CustomEvent(\"InPageAlert-close\", {\n bubbles: true,\n cancelable: true,\n detail: {\n id: this.id,\n target: this,\n },\n })\n this.dispatchEvent(newEvent)\n }\n\n get localStorage(): string {\n return localStorage.getItem(this.id)\n }\n\n set localStorage(value: string) {\n localStorage.setItem(this.id, value)\n }\n\n get close(): HTMLButtonElement {\n let closeBtn: HTMLButtonElement = this.querySelector(\".icon--close\")\n if (!closeBtn) {\n closeBtn = createElement(\n `<button class=\"icon icon--close\" aria-controls=\"${this.id}\" aria-label=\"Close InPageAlert\" type=\"button\"></button>`,\n ) as HTMLButtonElement\n this.appendChild(closeBtn)\n }\n return closeBtn\n }\n\n generatedId(): string {\n const id = `mx-alert-${Math.floor(Math.random() * Math.floor(10000))}`\n return makeAnchor(id, 20)\n }\n}\n\ncustomElements.define(\"mx-closable-alert\", InPageAlert)\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"mx-closable-alert\": InPageAlert\n }\n}\n"],"names":[],"mappings":";AAUA,MAAqB,oBAAoB,YAAY;AAAA,EAInD,cAAc;AACN;AAwBR,SAAA,cAAc,MAAY;AACxB,WAAK,WAAW;AAChB,WAAK,OAAO;AACZ,WAAK,eAAe;AACd,YAAA,WACJ,IAAI,YAAY,qBAAqB;AAAA,QACnC,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN,IAAI,KAAK;AAAA,UACT,QAAQ;AAAA,QACV;AAAA,MAAA,CACD;AACH,WAAK,cAAc,QAAQ;AAAA,IAAA;AApCtB,SAAA,aAAa,KAAK;AAClB,SAAA,aAAa,IAAI;EACxB;AAAA,EAEA,oBAA0B;AACxB,SAAK,KAAK,KAAK,MAAM,KAAK,YAAY;AACtC,QAAI,KAAK,cAAc;AACrB,WAAK,WAAW;AAChB,WAAK,OAAO;AACZ;AAAA,IACF;AACM,UAAA,EAAE,OAAO,IAAqB,KAAK;AACzC,SAAK,OAAO,iBAAiB,SAAS,KAAK,aAAa,EAAE,QAAQ;AAAA,EACpE;AAAA,EAEA,uBAA6B;AAC3B,SAAK,WAAW;AAChB,SAAK,MAAM;EACb;AAAA,EAqBA,IAAI,eAAuB;AAClB,WAAA,aAAa,QAAQ,KAAK,EAAE;AAAA,EACrC;AAAA,EAEA,IAAI,aAAa,OAAe;AACjB,iBAAA,QAAQ,KAAK,IAAI,KAAK;AAAA,EACrC;AAAA,EAEA,IAAI,QAA2B;AACzB,QAAA,WAA8B,KAAK,cAAc,cAAc;AACnE,QAAI,CAAC,UAAU;AACF,iBAAA;AAAA,QACT,mDAAmD,KAAK,EAAE;AAAA,MAAA;AAE5D,WAAK,YAAY,QAAQ;AAAA,IAC3B;AACO,WAAA;AAAA,EACT;AAAA,EAEA,cAAsB;AACd,UAAA,KAAK,YAAY,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,MAAM,GAAK,CAAC,CAAC;AAC7D,WAAA,WAAW,IAAI,EAAE;AAAA,EAC1B;AACF;AAEA,eAAe,OAAO,qBAAqB,WAAW;"}
@@ -1,92 +0,0 @@
1
- import { m as makeAnchor, c as createElement } from "./chunks/utilities-BIk0P2KX.js";
2
- class InPageNavigation extends HTMLElement {
3
- constructor() {
4
- super();
5
- this.handleClick = (target) => {
6
- this.active = this.items.find((item) => item.link === target);
7
- if (!this.links || !this.active) return;
8
- this.links.forEach((link) => link.classList.remove("is-active"));
9
- this.active.link.classList.add("is-active");
10
- };
11
- this.internals_ = this.attachInternals();
12
- this.controller = new AbortController();
13
- this.headingLevels = this.dataset?.headings || "h2";
14
- this.items = [];
15
- }
16
- connectedCallback() {
17
- if (!this.menu || !this.headings) return;
18
- this.headings.forEach((heading) => {
19
- const listItem = this.generateListItem(heading);
20
- const link = this.generateAnchor(heading);
21
- this.items.push({ link, heading });
22
- listItem.appendChild(link);
23
- this.menu?.appendChild(listItem);
24
- });
25
- const { signal } = this.controller;
26
- this.menu.addEventListener(
27
- "click",
28
- (e) => {
29
- const { target } = e;
30
- if (!(target instanceof HTMLAnchorElement)) return;
31
- this.handleClick(target);
32
- },
33
- {
34
- signal
35
- }
36
- );
37
- }
38
- disconnectedCallback() {
39
- if (!this.menu || !this.headings) return;
40
- this.menu.textContent = "";
41
- this.items = [];
42
- this.controller.abort();
43
- }
44
- get menu() {
45
- const menu = this.querySelector("ul, ol");
46
- if (!menu) {
47
- throw new Error(`${this.localName} must contain a <ul> or <ol> element.`);
48
- }
49
- return menu;
50
- }
51
- get container() {
52
- const selector = this.getAttribute("data-content");
53
- if (!selector) {
54
- throw new Error(
55
- `${this.localName} must have a [data-content] attribute that contains the content selector.`
56
- );
57
- }
58
- return this.closest(selector) || this.parentElement.querySelector(selector);
59
- }
60
- get headings() {
61
- return this.container?.querySelectorAll(this.headingLevels);
62
- }
63
- get links() {
64
- return this.menu?.querySelectorAll("a");
65
- }
66
- generatedId(heading) {
67
- const string = heading?.textContent?.trim();
68
- return !string ? "" : makeAnchor(string);
69
- }
70
- generateAnchor(heading) {
71
- const { textContent, id } = heading;
72
- const linkText = heading.getAttribute("data-in-page-navigation-title") || textContent;
73
- const targetID = id || this.generatedId(heading);
74
- if (!id) heading.id = targetID;
75
- const item = createElement(
76
- `<a href="#${targetID}" class="icon icon--chevron-right">${linkText}</a>`
77
- );
78
- return item;
79
- }
80
- generateListItem(heading) {
81
- const { tagName } = heading;
82
- const item = createElement(
83
- `<li class="in-page-navigation__level--${tagName.toLowerCase()}"></li>`
84
- );
85
- return item;
86
- }
87
- }
88
- customElements.define("mx-in-page-navigation", InPageNavigation);
89
- export {
90
- InPageNavigation as default
91
- };
92
- //# sourceMappingURL=InPageNavigation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"InPageNavigation.js","sources":["../../src/Component/InPageNavigation/Elements/InPageNavigation.ts"],"sourcesContent":["/**\n * DialogBase\n * @file Support opening/closing, and adding a scroll lock to the body.\n */\n\nimport { makeAnchor, createElement } from \"../../../Utility/utilities\"\n\nexport default class InPageNavigation extends HTMLElement {\n internals_: ElementInternals\n controller: AbortController\n headingLevels: string\n items: { link: HTMLAnchorElement; heading: HTMLHeadingElement }[]\n active: { link: HTMLAnchorElement; heading: HTMLHeadingElement } | undefined\n\n constructor() {\n super()\n this.internals_ = this.attachInternals()\n this.controller = new AbortController()\n this.headingLevels = this.dataset?.headings || \"h2\"\n this.items = []\n }\n\n connectedCallback(): void {\n if (!this.menu || !this.headings) return\n\n this.headings.forEach((heading: HTMLHeadingElement) => {\n const listItem: HTMLLIElement = this.generateListItem(heading)\n const link: HTMLAnchorElement = this.generateAnchor(heading)\n this.items.push({ link, heading })\n listItem.appendChild(link)\n this.menu?.appendChild(listItem)\n })\n\n const { signal }: AbortController = this.controller\n\n // Open on toggle click.\n this.menu.addEventListener(\n \"click\",\n (e: MouseEvent): void => {\n const { target } = e\n if (!(target instanceof HTMLAnchorElement)) return\n this.handleClick(target)\n },\n {\n signal,\n },\n )\n }\n\n disconnectedCallback(): void {\n if (!this.menu || !this.headings) return\n this.menu.textContent = \"\"\n this.items = []\n this.controller.abort()\n }\n\n handleClick = (target: EventTarget | null): void => {\n this.active = this.items.find(item => item.link === target)\n if (!this.links || !this.active) return\n this.links.forEach(link => link.classList.remove(\"is-active\"))\n this.active.link.classList.add(\"is-active\")\n }\n\n get menu(): HTMLUListElement | HTMLOListElement | null {\n const menu: HTMLUListElement | HTMLOListElement | null =\n this.querySelector(\"ul, ol\")\n if (!menu) {\n throw new Error(`${this.localName} must contain a <ul> or <ol> element.`)\n }\n return menu\n }\n\n get container(): HTMLElement | null {\n const selector: string | null = this.getAttribute(\"data-content\")\n if (!selector) {\n throw new Error(\n `${this.localName} must have a [data-content] attribute that contains the content selector.`,\n )\n }\n return this.closest(selector) || this.parentElement.querySelector(selector)\n }\n\n get headings(): NodeListOf<HTMLHeadingElement> | undefined {\n return this.container?.querySelectorAll(this.headingLevels)\n }\n\n get links(): NodeListOf<HTMLAnchorElement> | undefined {\n return this.menu?.querySelectorAll(\"a\")\n }\n\n generatedId(heading: HTMLHeadingElement): string {\n const string: string | undefined = heading?.textContent?.trim()\n return !string ? \"\" : makeAnchor(string)\n }\n\n generateAnchor(heading: HTMLHeadingElement): HTMLAnchorElement {\n const { textContent, id } = heading\n const linkText: string | null =\n heading.getAttribute(\"data-in-page-navigation-title\") || textContent\n const targetID: string = id || this.generatedId(heading)\n if (!id) heading.id = targetID\n const item: Element = createElement(\n `<a href=\"#${targetID}\" class=\"icon icon--chevron-right\">${linkText}</a>`,\n )\n\n return item as HTMLAnchorElement\n }\n\n generateListItem(heading: HTMLHeadingElement): HTMLLIElement {\n const { tagName } = heading\n const item: Element = createElement(\n `<li class=\"in-page-navigation__level--${tagName.toLowerCase()}\"></li>`,\n )\n\n return item as HTMLLIElement\n }\n}\n\ncustomElements.define(\"mx-in-page-navigation\", InPageNavigation)\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"mx-in-page-navigation\": InPageNavigation\n }\n}\n"],"names":[],"mappings":";AAOA,MAAqB,yBAAyB,YAAY;AAAA,EAOxD,cAAc;AACN;AAyCR,SAAA,cAAc,CAAC,WAAqC;AAClD,WAAK,SAAS,KAAK,MAAM,KAAK,CAAQ,SAAA,KAAK,SAAS,MAAM;AAC1D,UAAI,CAAC,KAAK,SAAS,CAAC,KAAK,OAAQ;AACjC,WAAK,MAAM,QAAQ,CAAA,SAAQ,KAAK,UAAU,OAAO,WAAW,CAAC;AAC7D,WAAK,OAAO,KAAK,UAAU,IAAI,WAAW;AAAA,IAAA;AA5CrC,SAAA,aAAa,KAAK;AAClB,SAAA,aAAa,IAAI;AACjB,SAAA,gBAAgB,KAAK,SAAS,YAAY;AAC/C,SAAK,QAAQ;EACf;AAAA,EAEA,oBAA0B;AACxB,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,SAAU;AAE7B,SAAA,SAAS,QAAQ,CAAC,YAAgC;AAC/C,YAAA,WAA0B,KAAK,iBAAiB,OAAO;AACvD,YAAA,OAA0B,KAAK,eAAe,OAAO;AAC3D,WAAK,MAAM,KAAK,EAAE,MAAM,QAAS,CAAA;AACjC,eAAS,YAAY,IAAI;AACpB,WAAA,MAAM,YAAY,QAAQ;AAAA,IAAA,CAChC;AAEK,UAAA,EAAE,OAAO,IAAqB,KAAK;AAGzC,SAAK,KAAK;AAAA,MACR;AAAA,MACA,CAAC,MAAwB;AACjB,cAAA,EAAE,OAAW,IAAA;AACf,YAAA,EAAE,kBAAkB,mBAAoB;AAC5C,aAAK,YAAY,MAAM;AAAA,MACzB;AAAA,MACA;AAAA,QACE;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,uBAA6B;AAC3B,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,SAAU;AAClC,SAAK,KAAK,cAAc;AACxB,SAAK,QAAQ;AACb,SAAK,WAAW;EAClB;AAAA,EASA,IAAI,OAAmD;AAC/C,UAAA,OACJ,KAAK,cAAc,QAAQ;AAC7B,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,GAAG,KAAK,SAAS,uCAAuC;AAAA,IAC1E;AACO,WAAA;AAAA,EACT;AAAA,EAEA,IAAI,YAAgC;AAC5B,UAAA,WAA0B,KAAK,aAAa,cAAc;AAChE,QAAI,CAAC,UAAU;AACb,YAAM,IAAI;AAAA,QACR,GAAG,KAAK,SAAS;AAAA,MAAA;AAAA,IAErB;AACA,WAAO,KAAK,QAAQ,QAAQ,KAAK,KAAK,cAAc,cAAc,QAAQ;AAAA,EAC5E;AAAA,EAEA,IAAI,WAAuD;AACzD,WAAO,KAAK,WAAW,iBAAiB,KAAK,aAAa;AAAA,EAC5D;AAAA,EAEA,IAAI,QAAmD;AAC9C,WAAA,KAAK,MAAM,iBAAiB,GAAG;AAAA,EACxC;AAAA,EAEA,YAAY,SAAqC;AACzC,UAAA,SAA6B,SAAS,aAAa,KAAK;AAC9D,WAAO,CAAC,SAAS,KAAK,WAAW,MAAM;AAAA,EACzC;AAAA,EAEA,eAAe,SAAgD;AACvD,UAAA,EAAE,aAAa,GAAO,IAAA;AAC5B,UAAM,WACJ,QAAQ,aAAa,+BAA+B,KAAK;AAC3D,UAAM,WAAmB,MAAM,KAAK,YAAY,OAAO;AACnD,QAAA,CAAC,GAAI,SAAQ,KAAK;AACtB,UAAM,OAAgB;AAAA,MACpB,aAAa,QAAQ,sCAAsC,QAAQ;AAAA,IAAA;AAG9D,WAAA;AAAA,EACT;AAAA,EAEA,iBAAiB,SAA4C;AACrD,UAAA,EAAE,QAAY,IAAA;AACpB,UAAM,OAAgB;AAAA,MACpB,yCAAyC,QAAQ,YAAA,CAAa;AAAA,IAAA;AAGzD,WAAA;AAAA,EACT;AACF;AAEA,eAAe,OAAO,yBAAyB,gBAAgB;"}
@@ -1,126 +0,0 @@
1
- import { m as makeAnchor } from "./chunks/utilities-BIk0P2KX.js";
2
- import Keyboard from "./keyboard.js";
3
- import DisclosureWidget from "./disclosure-widget.js";
4
- class Navigation extends HTMLElement {
5
- constructor() {
6
- super();
7
- this.handleDisclosure = ({ detail }) => {
8
- const { isOpen, id } = detail;
9
- const { item } = this.subNavs.get(id);
10
- item.classList.toggle("nav--open");
11
- if (isOpen) {
12
- this.keyboard.attachPopup(id, this.handleCloseAny);
13
- } else {
14
- this.keyboard.detachPopup(id);
15
- }
16
- };
17
- this.handleCloseAny = () => {
18
- this.subNavs.forEach(({ widget }) => {
19
- if (!widget) return;
20
- if (widget.isOpen) widget.handleToggle();
21
- });
22
- };
23
- this.handleFlyout = (event) => {
24
- const target = event.target;
25
- const parent = target.closest("li");
26
- if (!parent) return;
27
- const subnav = parent.querySelector(":scope > ul");
28
- if (!subnav) return;
29
- this.subNavs.forEach(({ widget, list }) => {
30
- if (!widget) return;
31
- if (widget.isOpen) widget.handleToggle();
32
- if (list.id === subnav.id) widget.handleToggle();
33
- });
34
- };
35
- this.handleBreakpoint = ({
36
- matches
37
- }) => {
38
- if (matches) {
39
- this.addEventListener("mouseover", this.handleFlyout);
40
- this.addEventListener("mouseleave", this.handleCloseAny);
41
- if (this.edgeCheck) this.handleEdgeCheck();
42
- } else {
43
- this.removeEventListener("mouseover", this.handleFlyout);
44
- this.removeEventListener("mouseleave", this.handleCloseAny);
45
- }
46
- };
47
- this.internals_ = this.attachInternals();
48
- this.controller = new AbortController();
49
- this.flyout = this.hasAttribute("flyout");
50
- }
51
- connectedCallback() {
52
- const { signal } = this.controller;
53
- this.keyboard = new Keyboard();
54
- this.keyboard.attachEventListeners(signal);
55
- this.addEventListener("focusin", () => {
56
- this.keyboard.attachMenu(this, this.links);
57
- });
58
- this.addEventListener("focusout", () => {
59
- this.keyboard.detachMenu();
60
- });
61
- if (!this.lists.length) return;
62
- this.subNavs = /* @__PURE__ */ new Map();
63
- this.lists.forEach((list, index) => {
64
- const item = list.closest("li");
65
- const link = item.querySelector(":scope > a");
66
- const id = makeAnchor(`subnav-${index}-${link.textContent}`, 30);
67
- const trigger = item.querySelector(
68
- ":scope > button.nav__toggle"
69
- );
70
- if (item && link && trigger) {
71
- const labelId = `list-label-${id}`;
72
- link.setAttribute("id", labelId);
73
- list.setAttribute("id", id);
74
- list.setAttribute("aria-labelledby", labelId);
75
- const widget = new DisclosureWidget(trigger, list);
76
- widget.init();
77
- this.subNavs.set(id, { item, trigger, list, link, widget });
78
- }
79
- });
80
- this.addEventListener("disclosure-toggle", this.handleDisclosure);
81
- if (!this.flyout) return;
82
- this.edgeCheck = this.hasAttribute("edgeCheck");
83
- this.mq = this.getAttribute("mq") || "(min-width: 720px)";
84
- this.handleBreakpoint(this.breakpoint);
85
- this.breakpoint.addEventListener("change", this.handleBreakpoint, {
86
- signal
87
- });
88
- }
89
- disconnectedCallback() {
90
- this.controller.abort();
91
- this.subNavs.forEach((subNav) => subNav.widget.detach());
92
- }
93
- handleEdgeCheck() {
94
- const windowInnerWidth = window.innerWidth;
95
- const edgeCheck = new IntersectionObserver(
96
- ([{ boundingClientRect, target }], obs) => {
97
- if (windowInnerWidth < boundingClientRect.right)
98
- target.classList.add("nav--reverse");
99
- obs.disconnect();
100
- }
101
- );
102
- this.subNavs.forEach(({ list }) => {
103
- edgeCheck.observe(list);
104
- const nestedLists = list.querySelectorAll("ul");
105
- nestedLists.forEach((nestedList) => edgeCheck.observe(nestedList));
106
- });
107
- }
108
- get links() {
109
- const links = this.querySelectorAll("a");
110
- if (!links.length) {
111
- throw new Error(`${this.localName} must links`);
112
- }
113
- return links;
114
- }
115
- get lists() {
116
- return this.querySelectorAll("li > ul");
117
- }
118
- get breakpoint() {
119
- return window.matchMedia(this.mq);
120
- }
121
- }
122
- customElements.define("mx-nav", Navigation);
123
- export {
124
- Navigation as default
125
- };
126
- //# sourceMappingURL=Navigation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Navigation.js","sources":["../../src/Component/Navigation/Elements/Navigation.ts"],"sourcesContent":["/**\n * Main Navigation\n * @file Drop down navigation handler.\n */\n\nimport {\n Keyboard,\n makeAnchor,\n DisclosureWidget,\n DisclosureWidgetEvent,\n} from \"../../../Utility/utilities\"\n\ntype SubNavType = {\n list: HTMLElement\n trigger: HTMLButtonElement\n link: HTMLAnchorElement\n item?: HTMLLIElement\n widget?: DisclosureWidget\n linkWidget?: DisclosureWidget\n}\n\nexport default class Navigation extends HTMLElement {\n internals_: ElementInternals\n controller: AbortController\n keyboard: Keyboard\n subNavs?: Map<string, SubNavType>\n flyout?: boolean\n edgeCheck!: boolean\n mq!: string\n\n constructor() {\n super()\n this.internals_ = this.attachInternals()\n this.controller = new AbortController()\n this.flyout = this.hasAttribute(\"flyout\")\n }\n\n connectedCallback(): void {\n const { signal }: AbortController = this.controller\n\n // Add keyboard navigation events.\n this.keyboard = new Keyboard()\n this.keyboard.attachEventListeners(signal)\n\n // Add keyboard focus handler for menu links.\n this.addEventListener(\"focusin\", () => {\n this.keyboard.attachMenu(this, this.links)\n })\n this.addEventListener(\"focusout\", () => {\n this.keyboard.detachMenu()\n })\n\n if (!this.lists.length) return\n this.subNavs = new Map()\n this.lists.forEach((list: HTMLUListElement, index: number): void => {\n const item: HTMLLIElement = list.closest(\"li\")\n const link: HTMLAnchorElement = item.querySelector(\":scope > a\")\n const id: string = makeAnchor(`subnav-${index}-${link.textContent}`, 30)\n const trigger: HTMLButtonElement = item.querySelector(\n \":scope > button.nav__toggle\",\n )\n if (item && link && trigger) {\n const labelId = `list-label-${id}`\n link.setAttribute(\"id\", labelId)\n list.setAttribute(\"id\", id)\n list.setAttribute(\"aria-labelledby\", labelId)\n const widget = new DisclosureWidget(trigger, list)\n widget.init()\n this.subNavs.set(id, { item, trigger, list, link, widget })\n }\n })\n\n this.addEventListener(\"disclosure-toggle\", this.handleDisclosure)\n\n if (!this.flyout) return\n this.edgeCheck = this.hasAttribute(\"edgeCheck\")\n this.mq = this.getAttribute(\"mq\") || \"(min-width: 720px)\"\n this.handleBreakpoint(this.breakpoint)\n this.breakpoint.addEventListener(\"change\", this.handleBreakpoint, {\n signal,\n })\n }\n\n disconnectedCallback(): void {\n this.controller.abort()\n this.subNavs.forEach((subNav: SubNavType): void => subNav.widget.detach())\n }\n\n handleDisclosure = ({ detail }: CustomEvent<DisclosureWidgetEvent>): void => {\n const { isOpen, id } = detail\n const { item } = this.subNavs.get(id)\n item.classList.toggle(\"nav--open\")\n if (isOpen) {\n this.keyboard.attachPopup(id, this.handleCloseAny)\n } else {\n this.keyboard.detachPopup(id)\n }\n }\n\n handleCloseAny = (): void => {\n this.subNavs.forEach(({ widget }: SubNavType): void => {\n if (!widget) return\n if (widget.isOpen) widget.handleToggle()\n })\n }\n\n handleFlyout = (event: MouseEvent): void => {\n const target = event.target as HTMLElement\n const parent: HTMLLIElement = target.closest(\"li\")\n if (!parent) return\n const subnav: HTMLUListElement = parent.querySelector(\":scope > ul\")\n if (!subnav) return\n this.subNavs.forEach(({ widget, list }: SubNavType): void => {\n if (!widget) return\n if (widget.isOpen) widget.handleToggle()\n if (list.id === subnav.id) widget.handleToggle()\n })\n }\n\n handleBreakpoint = ({\n matches,\n }: MediaQueryList | MediaQueryListEvent): void => {\n if (matches) {\n this.addEventListener(\"mouseover\", this.handleFlyout)\n this.addEventListener(\"mouseleave\", this.handleCloseAny)\n if (this.edgeCheck) this.handleEdgeCheck()\n } else {\n this.removeEventListener(\"mouseover\", this.handleFlyout)\n this.removeEventListener(\"mouseleave\", this.handleCloseAny)\n }\n }\n\n handleEdgeCheck() {\n const windowInnerWidth: number = window.innerWidth\n const edgeCheck: IntersectionObserver = new IntersectionObserver(\n ([{ boundingClientRect, target }], obs) => {\n if (windowInnerWidth < boundingClientRect.right)\n target.classList.add(\"nav--reverse\")\n obs.disconnect()\n },\n )\n this.subNavs.forEach(({ list }: SubNavType): void => {\n edgeCheck.observe(list)\n const nestedLists: NodeListOf<HTMLUListElement> =\n list.querySelectorAll(\"ul\")\n nestedLists.forEach(nestedList => edgeCheck.observe(nestedList))\n })\n }\n\n get links(): NodeListOf<HTMLAnchorElement> | null {\n const links: NodeListOf<HTMLAnchorElement> | null =\n this.querySelectorAll(\"a\")\n if (!links.length) {\n throw new Error(`${this.localName} must links`)\n }\n return links\n }\n\n get lists(): NodeListOf<HTMLUListElement> | null {\n return this.querySelectorAll(\"li > ul\")\n }\n\n get breakpoint(): MediaQueryList {\n return window.matchMedia(this.mq)\n }\n}\n\ncustomElements.define(\"mx-nav\", Navigation)\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"mx-nav\": Navigation\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,63 +0,0 @@
1
- import { c as createElement } from "./chunks/utilities-BIk0P2KX.js";
2
- class Sticky extends HTMLElement {
3
- constructor() {
4
- super();
5
- this.root = null;
6
- this.rootMargin = "0px 0px 0px 0px";
7
- this.thresholds = [0];
8
- this.internals_ = this.attachInternals();
9
- }
10
- connectedCallback() {
11
- this.offsetPropName = this.getAttribute("offsetpropname");
12
- const options = {
13
- root: this.root,
14
- rootMargin: this.rootMargin,
15
- thresholds: this.thresholds
16
- };
17
- this.iO = new IntersectionObserver(([{ boundingClientRect }]) => {
18
- const isSticky = boundingClientRect.y < 0;
19
- this.classList.toggle("is-stuck", isSticky);
20
- const newEvent = new CustomEvent("sticky-toggle", {
21
- bubbles: true,
22
- cancelable: true,
23
- detail: {
24
- isSticky,
25
- options,
26
- target: this
27
- }
28
- });
29
- this.dispatchEvent(newEvent);
30
- }, options);
31
- this.iO.observe(this.trigger);
32
- if (!this.offsetPropName) return;
33
- this.rO = new ResizeObserver((entries) => {
34
- entries.forEach(({ borderBoxSize }) => {
35
- const [{ blockSize }] = borderBoxSize;
36
- document.body.style.setProperty(
37
- this.offsetPropName,
38
- `${blockSize.toFixed(1)}px`
39
- );
40
- });
41
- });
42
- this.rO.observe(this);
43
- }
44
- disconnectedCallback() {
45
- this.iO.unobserve(this.trigger);
46
- this.rO.disconnect();
47
- }
48
- get trigger() {
49
- let trigger = this.querySelector(".sticky__trigger");
50
- if (!trigger) {
51
- trigger = createElement(
52
- '<div class="sticky__trigger"></div>'
53
- );
54
- this.insertAdjacentElement("beforebegin", trigger);
55
- }
56
- return trigger;
57
- }
58
- }
59
- customElements.define("mx-sticky", Sticky);
60
- export {
61
- Sticky as default
62
- };
63
- //# sourceMappingURL=Sticky.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Sticky.js","sources":["../../src/Component/Sticky/Elements/Sticky.ts"],"sourcesContent":["/**\n * Sticky \"is-stuck\" and offset handler.\n */\n\nimport { createElement } from \"../../../Utility/utilities\"\n\ntype IOOptions = {\n root: IntersectionObserver[\"root\"]\n rootMargin: IntersectionObserver[\"rootMargin\"]\n thresholds: IntersectionObserver[\"thresholds\"]\n}\n\nexport default class Sticky extends HTMLElement {\n internals_: ElementInternals\n iO: IntersectionObserver\n rO?: ResizeObserver\n offsetPropName?: string\n root?: IOOptions[\"root\"] = null\n rootMargin?: IOOptions[\"rootMargin\"] = \"0px 0px 0px 0px\"\n thresholds?: IOOptions[\"thresholds\"] = [0]\n\n constructor() {\n super()\n this.internals_ = this.attachInternals()\n }\n\n connectedCallback(): void {\n this.offsetPropName = this.getAttribute(\"offsetpropname\")\n const options: IOOptions = {\n root: this.root,\n rootMargin: this.rootMargin,\n thresholds: this.thresholds,\n }\n\n // Toggle \"is-stuck\" and emit event.\n this.iO = new IntersectionObserver(([{ boundingClientRect }]) => {\n const isSticky: boolean = boundingClientRect.y < 0\n this.classList.toggle(\"is-stuck\", isSticky)\n const newEvent: CustomEvent<{\n isSticky: boolean\n options: IOOptions\n target: Sticky\n }> = new CustomEvent(\"sticky-toggle\", {\n bubbles: true,\n cancelable: true,\n detail: {\n isSticky,\n options,\n target: this,\n },\n })\n this.dispatchEvent(newEvent)\n }, options)\n this.iO.observe(this.trigger)\n\n // If offsetPropName, record its height.\n if (!this.offsetPropName) return\n this.rO = new ResizeObserver(entries => {\n entries.forEach(({ borderBoxSize }) => {\n const [{ blockSize }] = borderBoxSize\n document.body.style.setProperty(\n this.offsetPropName,\n `${blockSize.toFixed(1)}px`,\n )\n })\n })\n this.rO.observe(this)\n }\n\n disconnectedCallback(): void {\n this.iO.unobserve(this.trigger)\n this.rO.disconnect()\n }\n\n get trigger(): HTMLDivElement {\n let trigger: HTMLDivElement | null = this.querySelector(\".sticky__trigger\")\n if (!trigger) {\n trigger = createElement(\n '<div class=\"sticky__trigger\"></div>',\n ) as HTMLDivElement\n this.insertAdjacentElement(\"beforebegin\", trigger)\n }\n return trigger\n }\n}\n\ncustomElements.define(\"mx-sticky\", Sticky)\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"mx-sticky\": Sticky\n }\n}\n"],"names":[],"mappings":";AAYA,MAAqB,eAAe,YAAY;AAAA,EAS9C,cAAc;AACN;AALmB,SAAA,OAAA;AACY,SAAA,aAAA;AACvC,SAAA,aAAuC,CAAC,CAAC;AAIlC,SAAA,aAAa,KAAK;EACzB;AAAA,EAEA,oBAA0B;AACnB,SAAA,iBAAiB,KAAK,aAAa,gBAAgB;AACxD,UAAM,UAAqB;AAAA,MACzB,MAAM,KAAK;AAAA,MACX,YAAY,KAAK;AAAA,MACjB,YAAY,KAAK;AAAA,IAAA;AAId,SAAA,KAAK,IAAI,qBAAqB,CAAC,CAAC,EAAE,mBAAA,CAAoB,MAAM;AACzD,YAAA,WAAoB,mBAAmB,IAAI;AAC5C,WAAA,UAAU,OAAO,YAAY,QAAQ;AACpC,YAAA,WAID,IAAI,YAAY,iBAAiB;AAAA,QACpC,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MAAA,CACD;AACD,WAAK,cAAc,QAAQ;AAAA,OAC1B,OAAO;AACL,SAAA,GAAG,QAAQ,KAAK,OAAO;AAGxB,QAAA,CAAC,KAAK,eAAgB;AACrB,SAAA,KAAK,IAAI,eAAe,CAAW,YAAA;AACtC,cAAQ,QAAQ,CAAC,EAAE,oBAAoB;AACrC,cAAM,CAAC,EAAE,WAAW,IAAI;AACxB,iBAAS,KAAK,MAAM;AAAA,UAClB,KAAK;AAAA,UACL,GAAG,UAAU,QAAQ,CAAC,CAAC;AAAA,QAAA;AAAA,MACzB,CACD;AAAA,IAAA,CACF;AACI,SAAA,GAAG,QAAQ,IAAI;AAAA,EACtB;AAAA,EAEA,uBAA6B;AACtB,SAAA,GAAG,UAAU,KAAK,OAAO;AAC9B,SAAK,GAAG;EACV;AAAA,EAEA,IAAI,UAA0B;AACxB,QAAA,UAAiC,KAAK,cAAc,kBAAkB;AAC1E,QAAI,CAAC,SAAS;AACF,gBAAA;AAAA,QACR;AAAA,MAAA;AAEG,WAAA,sBAAsB,eAAe,OAAO;AAAA,IACnD;AACO,WAAA;AAAA,EACT;AACF;AAEA,eAAe,OAAO,aAAa,MAAM;"}
@@ -1,164 +0,0 @@
1
- import "./DropMenu.js";
2
- class Tabs extends HTMLElement {
3
- constructor() {
4
- super();
5
- this.tabFocus = 0;
6
- this.handleKeydown = ({ key }) => {
7
- if (key === "ArrowRight" || key === "ArrowLeft") {
8
- this.triggers[this.tabFocus].setAttribute("tabindex", "-1");
9
- if (key === "ArrowRight") {
10
- this.tabFocus += 1;
11
- if (this.tabFocus >= this.triggers.length) {
12
- this.tabFocus = 0;
13
- }
14
- } else if (key === "ArrowLeft") {
15
- this.tabFocus -= 1;
16
- if (this.tabFocus < 0) {
17
- this.tabFocus = this.triggers.length - 1;
18
- }
19
- }
20
- this.triggers[this.tabFocus].setAttribute("tabindex", "0");
21
- this.triggers[this.tabFocus].focus();
22
- }
23
- };
24
- this.handleClick = (event) => {
25
- const target = event.target;
26
- if (!(target instanceof HTMLButtonElement)) return;
27
- event.preventDefault();
28
- const id = target.getAttribute("aria-controls");
29
- this.handleTabChange(id);
30
- };
31
- this.handleDropMenuSelect = (event) => {
32
- const target = event.detail.target;
33
- if (!(target instanceof HTMLButtonElement)) return;
34
- const id = target.getAttribute("aria-controls");
35
- this.handleTabChange(id);
36
- };
37
- this.handleTabChange = (id) => {
38
- this.active = id;
39
- this.handleUrlParams(id);
40
- const { panel, tab, button } = this.tabs.get(id);
41
- panel.focus({ preventScroll: true });
42
- const newEvent = new CustomEvent("tab-toggle", {
43
- bubbles: true,
44
- cancelable: true,
45
- detail: { id, tab, button, panel }
46
- });
47
- this.dispatchEvent(newEvent);
48
- };
49
- this.handleUrlParams = (id) => {
50
- const urlParams = new URLSearchParams(
51
- window.location.search
52
- );
53
- if (urlParams.get("tab") === id) return;
54
- urlParams.set("tab", id);
55
- window.history.replaceState(
56
- {},
57
- "",
58
- `${window.location.pathname}?${urlParams.toString()}`
59
- );
60
- };
61
- this.internals_ = this.attachInternals();
62
- this.controller = new AbortController();
63
- }
64
- connectedCallback() {
65
- if (!this.triggers || !this.panels) return;
66
- this.locationHash = window.location.hash;
67
- this.tabs = /* @__PURE__ */ new Map();
68
- this.triggers.forEach((tab) => {
69
- const id = tab.getAttribute("aria-controls");
70
- const panel = this.querySelector(`#${id}`);
71
- const button = this.dropMenu.querySelector(
72
- `[aria-controls=${id}]`
73
- );
74
- if (id && panel && button) {
75
- const labelId = `tab-label-${id}`;
76
- tab.setAttribute("id", labelId);
77
- tab.setAttribute("role", "tab");
78
- tab.setAttribute("aria-selected", "false");
79
- tab.setAttribute("tab-index", "-1");
80
- panel.setAttribute("aria-labelledby", labelId);
81
- panel.setAttribute("role", "tabpanel");
82
- panel.setAttribute("tab-index", "0");
83
- this.tabs.set(id, { panel, tab, button });
84
- }
85
- });
86
- const { signal } = this.controller;
87
- this.menu.addEventListener("click", this.handleClick, { signal });
88
- this.menu.addEventListener("keydown", this.handleKeydown, { signal });
89
- this.dropMenu.addEventListener(
90
- "drop-menu-select",
91
- this.handleDropMenuSelect,
92
- { signal }
93
- );
94
- const hashEl = this.locationHash ? this.querySelector(this.locationHash) : null;
95
- if (hashEl) {
96
- this.active = hashEl.id;
97
- } else if (!this.active) {
98
- this.active = this.panels[0].id;
99
- }
100
- }
101
- disconnectedCallback() {
102
- this.controller.abort();
103
- }
104
- get dropMenu() {
105
- const dropMenu = this.querySelector(".drop-menu");
106
- if (!dropMenu) {
107
- throw new Error(`${this.localName} must contain a .drop-menu`);
108
- }
109
- return dropMenu;
110
- }
111
- get dropMenuTrigger() {
112
- const trigger = this.querySelector(
113
- ".drop-menu__trigger"
114
- );
115
- if (!trigger) {
116
- throw new Error(`${this.localName} must contain a .drop-menu__trigger`);
117
- }
118
- return trigger;
119
- }
120
- get menu() {
121
- const menu = this.querySelector(".tab__list");
122
- if (!menu) {
123
- throw new Error(`${this.localName} must contain a .tab__list`);
124
- }
125
- menu.setAttribute("role", "tablist");
126
- return menu;
127
- }
128
- get triggers() {
129
- const triggers = this.querySelectorAll(".tab__list button");
130
- if (!triggers.length) {
131
- throw new Error(`${this.localName} must contain .tab__list buttons`);
132
- }
133
- return triggers;
134
- }
135
- get panels() {
136
- const panels = this.querySelectorAll(".tab__panel");
137
- if (!panels.length) {
138
- throw new Error(`${this.localName} must contain .tab__panel's`);
139
- }
140
- return panels;
141
- }
142
- get active() {
143
- return this.querySelector('[aria-selected="true"]');
144
- }
145
- set active(id) {
146
- this.tabs.forEach(({ tab, panel }, key) => {
147
- if (key === id) {
148
- tab.setAttribute("aria-selected", "true");
149
- tab.setAttribute("tab-index", "0");
150
- panel.removeAttribute("inert");
151
- this.dropMenuTrigger.textContent = tab.textContent;
152
- } else {
153
- tab.setAttribute("aria-selected", "false");
154
- tab.setAttribute("tab-index", "-1");
155
- panel.setAttribute("inert", "");
156
- }
157
- });
158
- }
159
- }
160
- customElements.define("mx-tabs", Tabs);
161
- export {
162
- Tabs as default
163
- };
164
- //# sourceMappingURL=Tabs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Tabs.js","sources":["../../src/Component/Tabs/Elements/Tabs.ts"],"sourcesContent":["/**\n * Tab toggle handler\n */\nimport \"../../DropMenu/Elements/DropMenu\"\nimport type { DropMenuEvent } from \"../../DropMenu/Elements/DropMenu\"\n\ntype TabsType = {\n panel: HTMLElement\n tab: HTMLButtonElement\n button: HTMLButtonElement\n}\n\nexport default class Tabs extends HTMLElement {\n internals_: ElementInternals\n controller: AbortController\n tabs?: Map<string, TabsType>\n locationHash?: string\n tabFocus?: number = 0\n\n constructor() {\n super()\n this.internals_ = this.attachInternals()\n this.controller = new AbortController()\n }\n\n connectedCallback(): void {\n if (!this.triggers || !this.panels) return\n this.locationHash = window.location.hash\n\n this.tabs = new Map()\n this.triggers.forEach((tab: HTMLButtonElement): void => {\n const id: string = tab.getAttribute(\"aria-controls\")\n const panel: HTMLElement = this.querySelector(`#${id}`)\n const button: HTMLButtonElement = this.dropMenu.querySelector(\n `[aria-controls=${id}]`,\n )\n if (id && panel && button) {\n const labelId = `tab-label-${id}`\n tab.setAttribute(\"id\", labelId)\n tab.setAttribute(\"role\", \"tab\")\n tab.setAttribute(\"aria-selected\", \"false\")\n tab.setAttribute(\"tab-index\", \"-1\")\n panel.setAttribute(\"aria-labelledby\", labelId)\n panel.setAttribute(\"role\", \"tabpanel\")\n panel.setAttribute(\"tab-index\", \"0\")\n this.tabs.set(id, { panel, tab, button })\n }\n })\n\n const { signal }: AbortController = this.controller\n this.menu.addEventListener(\"click\", this.handleClick, { signal })\n this.menu.addEventListener(\"keydown\", this.handleKeydown, { signal })\n\n this.dropMenu.addEventListener(\n \"drop-menu-select\",\n this.handleDropMenuSelect,\n { signal },\n )\n\n const hashEl: HTMLElement | null = this.locationHash\n ? this.querySelector(this.locationHash)\n : null\n if (hashEl) {\n this.active = hashEl.id\n } else if (!this.active) {\n this.active = this.panels[0].id\n }\n }\n\n disconnectedCallback(): void {\n this.controller.abort()\n }\n\n handleKeydown = ({ key }: KeyboardEvent): void => {\n if (key === \"ArrowRight\" || key === \"ArrowLeft\") {\n this.triggers[this.tabFocus].setAttribute(\"tabindex\", \"-1\")\n if (key === \"ArrowRight\") {\n this.tabFocus += 1\n // If we're at the end, go to the start\n if (this.tabFocus >= this.triggers.length) {\n this.tabFocus = 0\n }\n // Move left\n } else if (key === \"ArrowLeft\") {\n this.tabFocus -= 1\n // If we're at the start, move to the end\n if (this.tabFocus < 0) {\n this.tabFocus = this.triggers.length - 1\n }\n }\n this.triggers[this.tabFocus].setAttribute(\"tabindex\", \"0\")\n this.triggers[this.tabFocus].focus()\n }\n }\n\n handleClick = (event: MouseEvent): void => {\n const target = event.target as HTMLButtonElement\n if (!(target instanceof HTMLButtonElement)) return\n event.preventDefault()\n const id: string = target.getAttribute(\"aria-controls\")\n this.handleTabChange(id)\n }\n\n handleDropMenuSelect = (event: DropMenuEvent): void => {\n const target = event.detail.target as HTMLButtonElement\n if (!(target instanceof HTMLButtonElement)) return\n const id = target.getAttribute(\"aria-controls\")\n this.handleTabChange(id)\n }\n\n handleTabChange = (id: string): void => {\n this.active = id\n this.handleUrlParams(id)\n const { panel, tab, button } = this.tabs.get(id)\n panel.focus({ preventScroll: true })\n const newEvent: CustomEvent<{\n id: string\n tab: HTMLButtonElement\n button: HTMLButtonElement\n panel: HTMLElement\n }> = new CustomEvent(\"tab-toggle\", {\n bubbles: true,\n cancelable: true,\n detail: { id, tab, button, panel },\n })\n this.dispatchEvent(newEvent)\n }\n\n get dropMenu(): HTMLDivElement | null {\n const dropMenu: HTMLDivElement | null = this.querySelector(\".drop-menu\")\n if (!dropMenu) {\n throw new Error(`${this.localName} must contain a .drop-menu`)\n }\n return dropMenu\n }\n\n get dropMenuTrigger(): HTMLButtonElement | null {\n const trigger: HTMLButtonElement | null = this.querySelector(\n \".drop-menu__trigger\",\n )\n if (!trigger) {\n throw new Error(`${this.localName} must contain a .drop-menu__trigger`)\n }\n return trigger\n }\n\n get menu(): HTMLDivElement | null {\n const menu: HTMLDivElement | null = this.querySelector(\".tab__list\")\n if (!menu) {\n throw new Error(`${this.localName} must contain a .tab__list`)\n }\n menu.setAttribute(\"role\", \"tablist\")\n return menu\n }\n\n get triggers(): NodeListOf<HTMLButtonElement> | null {\n const triggers: NodeListOf<HTMLButtonElement> | null =\n this.querySelectorAll(\".tab__list button\")\n if (!triggers.length) {\n throw new Error(`${this.localName} must contain .tab__list buttons`)\n }\n return triggers\n }\n\n get panels(): NodeListOf<HTMLElement> | null {\n const panels: NodeListOf<HTMLElement> | null =\n this.querySelectorAll(\".tab__panel\")\n if (!panels.length) {\n throw new Error(`${this.localName} must contain .tab__panel's`)\n }\n return panels\n }\n\n get active(): HTMLButtonElement {\n return this.querySelector('[aria-selected=\"true\"]')\n }\n\n set active(id: string) {\n this.tabs.forEach(({ tab, panel }: TabsType, key: string): void => {\n if (key === id) {\n tab.setAttribute(\"aria-selected\", \"true\")\n tab.setAttribute(\"tab-index\", \"0\")\n panel.removeAttribute(\"inert\")\n this.dropMenuTrigger.textContent = tab.textContent\n } else {\n tab.setAttribute(\"aria-selected\", \"false\")\n tab.setAttribute(\"tab-index\", \"-1\")\n panel.setAttribute(\"inert\", \"\")\n }\n })\n }\n\n handleUrlParams = (id: string): void => {\n const urlParams: URLSearchParams = new URLSearchParams(\n window.location.search,\n )\n if (urlParams.get(\"tab\") === id) return\n urlParams.set(\"tab\", id)\n window.history.replaceState(\n {},\n \"\",\n `${window.location.pathname}?${urlParams.toString()}`,\n )\n }\n}\n\ncustomElements.define(\"mx-tabs\", Tabs)\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"mx-tabs\": Tabs\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,52 +0,0 @@
1
- const _BreakpointLoader = class _BreakpointLoader {
2
- constructor(el, callback, options = { mediaQuery: "(max-width: 720px)" }) {
3
- this.init = () => {
4
- this.responsiveCheck(this.breakpoint);
5
- this.breakpoint.addEventListener("change", this.responsiveCheck);
6
- this.fallbackBtn?.addEventListener("click", this.handleClick);
7
- };
8
- this.responsiveCheck = ({ matches }) => {
9
- matches && this.load().catch((error) => this.handleError(error));
10
- };
11
- this.load = async () => {
12
- try {
13
- await this.callback();
14
- } catch (error) {
15
- this.handleError(error);
16
- }
17
- this.breakpoint.removeEventListener("change", this.responsiveCheck);
18
- };
19
- this.handleClick = () => {
20
- this.load().catch((error) => this.handleError(error));
21
- };
22
- this.handleError = (error) => {
23
- console.error(error);
24
- this.errorMsg?.removeAttribute("hidden");
25
- };
26
- if (!el) {
27
- throw new Error("Element is null or empty.");
28
- }
29
- this.el = el;
30
- this.callback = callback;
31
- this.breakpoint = window.matchMedia(options.mediaQuery);
32
- this.options = { ...options };
33
- this.fallbackBtn = this.el.querySelector("[data-load-fallback]");
34
- this.errorMsg = this.el.querySelector("[data-load-error]");
35
- }
36
- };
37
- _BreakpointLoader.create = (selector, callback, options = {}) => {
38
- if (!Object.hasOwn(window, "once")) return;
39
- window.once("breakpoint-loader", selector)?.forEach((el) => {
40
- const loader = new _BreakpointLoader(
41
- el,
42
- callback,
43
- options
44
- );
45
- loader.init();
46
- });
47
- };
48
- let BreakpointLoader = _BreakpointLoader;
49
- export {
50
- BreakpointLoader as default
51
- };
52
- //# sourceMappingURL=breakpoint-loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"breakpoint-loader.js","sources":["../../src/Utility/Elements/breakpoint-loader.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Lazy Load a component based on breakpoint.\n */\n\ntype BreakpointLoaderOptions = {\n mediaQuery?: string\n}\n\nexport default class BreakpointLoader {\n el: HTMLElement\n callback: () => any\n breakpoint: MediaQueryList\n options: BreakpointLoaderOptions\n fallbackBtn?: HTMLButtonElement\n errorMsg?: HTMLElement\n\n constructor(\n el: HTMLElement,\n callback: () => any,\n options: BreakpointLoaderOptions = { mediaQuery: \"(max-width: 720px)\" },\n ) {\n if (!el) {\n throw new Error(\"Element is null or empty.\")\n }\n this.el = el\n this.callback = callback\n this.breakpoint = window.matchMedia(options.mediaQuery)\n this.options = { ...options }\n this.fallbackBtn = this.el.querySelector(\"[data-load-fallback]\")\n this.errorMsg = this.el.querySelector(\"[data-load-error]\")\n }\n\n init = (): void => {\n this.responsiveCheck(this.breakpoint)\n this.breakpoint.addEventListener(\"change\", this.responsiveCheck)\n this.fallbackBtn?.addEventListener(\"click\", this.handleClick)\n }\n\n responsiveCheck = ({ matches }): void => {\n matches && this.load().catch(error => this.handleError(error))\n }\n\n load = async (): Promise<void> => {\n try {\n await this.callback()\n } catch (error) {\n this.handleError(error)\n }\n this.breakpoint.removeEventListener(\"change\", this.responsiveCheck)\n }\n\n handleClick = (): void => {\n this.load().catch(error => this.handleError(error))\n }\n\n handleError = (error): void => {\n console.error(error) // eslint-disable-line no-console\n this.errorMsg?.removeAttribute(\"hidden\")\n }\n\n static create = (\n selector: string,\n callback: () => any,\n options: BreakpointLoaderOptions = {},\n ): void => {\n if (!Object.hasOwn(window, \"once\")) return\n window\n .once(\"breakpoint-loader\", selector)\n ?.forEach((el: HTMLElement): void => {\n const loader: BreakpointLoader = new BreakpointLoader(\n el,\n callback,\n options,\n )\n loader.init()\n })\n }\n}\n"],"names":[],"mappings":"AASA,MAAqB,oBAArB,MAAqB,kBAAiB;AAAA,EAQpC,YACE,IACA,UACA,UAAmC,EAAE,YAAY,wBACjD;AAYF,SAAA,OAAO,MAAY;AACZ,WAAA,gBAAgB,KAAK,UAAU;AACpC,WAAK,WAAW,iBAAiB,UAAU,KAAK,eAAe;AAC/D,WAAK,aAAa,iBAAiB,SAAS,KAAK,WAAW;AAAA,IAAA;AAG5C,SAAA,kBAAA,CAAC,EAAE,cAAoB;AAC5B,iBAAA,KAAK,OAAO,MAAM,WAAS,KAAK,YAAY,KAAK,CAAC;AAAA,IAAA;AAG/D,SAAA,OAAO,YAA2B;AAC5B,UAAA;AACF,cAAM,KAAK;eACJ,OAAO;AACd,aAAK,YAAY,KAAK;AAAA,MACxB;AACA,WAAK,WAAW,oBAAoB,UAAU,KAAK,eAAe;AAAA,IAAA;AAGpE,SAAA,cAAc,MAAY;AACxB,WAAK,KAAO,EAAA,MAAM,WAAS,KAAK,YAAY,KAAK,CAAC;AAAA,IAAA;AAGpD,SAAA,cAAc,CAAC,UAAgB;AAC7B,cAAQ,MAAM,KAAK;AACd,WAAA,UAAU,gBAAgB,QAAQ;AAAA,IAAA;AApCvC,QAAI,CAAC,IAAI;AACD,YAAA,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AACA,SAAK,KAAK;AACV,SAAK,WAAW;AAChB,SAAK,aAAa,OAAO,WAAW,QAAQ,UAAU;AACjD,SAAA,UAAU,EAAE,GAAG;AACpB,SAAK,cAAc,KAAK,GAAG,cAAc,sBAAsB;AAC/D,SAAK,WAAW,KAAK,GAAG,cAAc,mBAAmB;AAAA,EAC3D;AA+CF;AAjBE,kBAAO,SAAS,CACd,UACA,UACA,UAAmC,CAAA,MAC1B;AACT,MAAI,CAAC,OAAO,OAAO,QAAQ,MAAM,EAAG;AACpC,SACG,KAAK,qBAAqB,QAAQ,GACjC,QAAQ,CAAC,OAA0B;AACnC,UAAM,SAA2B,IAAI;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,WAAO,KAAK;AAAA,EAAA,CACb;AAAA;AAnEP,IAAqB,mBAArB;"}