@pnx-mixtape/mxds 0.0.21 → 0.0.23

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 (380) hide show
  1. package/dist/build/accordion.entry.js +32 -43
  2. package/dist/build/accordion.entry.js.map +1 -1
  3. package/dist/build/base.css +19 -39
  4. package/dist/build/button.css +7 -8
  5. package/dist/build/chunks/{Accordion-O-huO4At.js → Accordion-D1HQ0FDq.js} +23 -21
  6. package/dist/build/chunks/{Accordion-O-huO4At.js.map → Accordion-D1HQ0FDq.js.map} +1 -1
  7. package/dist/build/chunks/disclosure-widget-CdjCdx7t.js +129 -0
  8. package/dist/build/chunks/disclosure-widget-CdjCdx7t.js.map +1 -0
  9. package/dist/build/chunks/drop-menu.entry-fzV-_VFl.js +70 -0
  10. package/dist/build/chunks/drop-menu.entry-fzV-_VFl.js.map +1 -0
  11. package/dist/build/chunks/{polyfills-C-B7iqDG.js → polyfills-DnrsypYs.js} +35 -26
  12. package/dist/build/chunks/polyfills-DnrsypYs.js.map +1 -0
  13. package/dist/build/chunks/popover.entry-BQvyR0d5.js +38 -0
  14. package/dist/build/chunks/popover.entry-BQvyR0d5.js.map +1 -0
  15. package/dist/build/chunks/{utilities-DXELy_An.js → utilities-Ci7wwNeg.js} +9 -106
  16. package/dist/build/chunks/utilities-Ci7wwNeg.js.map +1 -0
  17. package/dist/build/constants.css +10 -31
  18. package/dist/build/dialog.entry.js +23 -31
  19. package/dist/build/dialog.entry.js.map +1 -1
  20. package/dist/build/drop-menu.entry.js +1 -1
  21. package/dist/build/drupal.css +5 -9
  22. package/dist/build/filters.entry.js +54 -50
  23. package/dist/build/filters.entry.js.map +1 -1
  24. package/dist/build/form.css +12 -26
  25. package/dist/build/global-alert.entry.js +26 -19
  26. package/dist/build/global-alert.entry.js.map +1 -1
  27. package/dist/build/grid.css +3 -9
  28. package/dist/build/header.css +5 -3
  29. package/dist/build/header.entry.js +93 -88
  30. package/dist/build/header.entry.js.map +1 -1
  31. package/dist/build/icon.css +3 -3
  32. package/dist/build/in-page-navigation.entry.js +16 -12
  33. package/dist/build/in-page-navigation.entry.js.map +1 -1
  34. package/dist/build/navigation.css +21 -56
  35. package/dist/build/navigation.entry.js +148 -50
  36. package/dist/build/navigation.entry.js.map +1 -1
  37. package/dist/build/page.css +1 -1
  38. package/dist/build/popover.css +119 -0
  39. package/dist/build/popover.entry.js +2 -0
  40. package/dist/build/popover.entry.js.map +1 -0
  41. package/dist/build/section.css +1 -1
  42. package/dist/build/sticky.entry.js +11 -12
  43. package/dist/build/sticky.entry.js.map +1 -1
  44. package/dist/build/tabs.entry.js +108 -91
  45. package/dist/build/tabs.entry.js.map +1 -1
  46. package/dist/build/utility-list.css +43 -0
  47. package/dist/build/utility-list.entry.js +80 -0
  48. package/dist/build/utility-list.entry.js.map +1 -0
  49. package/package.json +9 -10
  50. package/src/Atom/{Base.mdx → Atom.mdx} +1 -1
  51. package/src/Atom/Background/Backgrounds.stories.ts +21 -4
  52. package/src/Atom/Background/__snapshots__/Backgrounds.stories.ts.snap +1 -1
  53. package/src/Atom/Background/_background.css +1 -2
  54. package/src/Atom/Blockquote/_blockquote.css +1 -2
  55. package/src/Atom/Button/Button.stories.ts +128 -19
  56. package/src/Atom/Button/__snapshots__/Button.stories.ts.snap +75 -11
  57. package/src/Atom/Button/__snapshots__/Button.stories.tsx.snap +1 -1
  58. package/src/Atom/Button/_buttons.css +5 -5
  59. package/src/Atom/DefinitionList/DefinitionList.stories.ts +20 -3
  60. package/src/Atom/DefinitionList/DefinitionList.stories.tsx +3 -9
  61. package/src/Atom/DefinitionList/DefinitionList.tsx +3 -4
  62. package/src/Atom/DefinitionList/__snapshots__/DefinitionList.stories.ts.snap +1 -1
  63. package/src/Atom/DefinitionList/__snapshots__/DefinitionList.stories.tsx.snap +1 -1
  64. package/src/Atom/Heading/Heading.stories.ts +49 -7
  65. package/src/Atom/Heading/Heading.tsx +1 -6
  66. package/src/Atom/Heading/__snapshots__/Heading.stories.ts.snap +9 -1
  67. package/src/Atom/Heading/__snapshots__/Heading.stories.tsx.snap +1 -1
  68. package/src/Atom/Heading/_headings.css +1 -2
  69. package/src/Atom/Icon/Icon.mdx +5 -1
  70. package/src/Atom/Icon/Icon.stories.ts +76 -6
  71. package/src/Atom/Icon/Icon.tsx +1 -8
  72. package/src/Atom/Icon/__snapshots__/Icon.stories.ts.snap +18 -4
  73. package/src/Atom/Icon/__snapshots__/Icon.stories.tsx.snap +1 -1
  74. package/src/Atom/Icon/_icon.css +1 -1
  75. package/src/Atom/Image/Image.stories.ts +4 -3
  76. package/src/Atom/Image/__snapshots__/Image.stories.ts.snap +1 -1
  77. package/src/Atom/Link/Link.stories.ts +74 -7
  78. package/src/Atom/Link/__snapshots__/Link.stories.ts.snap +4 -4
  79. package/src/Atom/Link/__snapshots__/Link.stories.tsx.snap +1 -1
  80. package/src/Atom/Media/Media.stories.ts +34 -5
  81. package/src/Atom/Media/Media.tsx +1 -6
  82. package/src/Atom/Media/__snapshots__/Media.stories.ts.snap +2 -2
  83. package/src/Atom/Media/__snapshots__/Media.stories.tsx.snap +1 -1
  84. package/src/Atom/Media/_media.css +2 -10
  85. package/src/Atom/Spacing/Spacing.stories.ts +45 -31
  86. package/src/Atom/Spacing/__snapshots__/Spacing.stories.ts.snap +5 -4
  87. package/src/Atom/Spacing/spacing.twig +5 -2
  88. package/src/Atom/Table/__snapshots__/Table.stories.ts.snap +1 -1
  89. package/src/Atom/Table/__snapshots__/TableResponsive.stories.ts.snap +1 -1
  90. package/src/Atom/Table/_table.css +1 -2
  91. package/src/Atom/Text/Text.stories.ts +62 -0
  92. package/src/Atom/Text/__snapshots__/{TextSizes.stories.ts.snap → Text.stories.ts.snap} +14 -27
  93. package/src/Atom/Text/__snapshots__/Text.stories.tsx.snap +1 -1
  94. package/src/Atom/Text/_text-sizes.css +2 -4
  95. package/src/Atom/Text/text-style.twig +11 -1
  96. package/src/Atom/Text/text-styles-example.twig +2 -16
  97. package/src/Atom/Video/Video.stories.ts +6 -4
  98. package/src/Atom/Video/Video.tsx +1 -5
  99. package/src/Atom/Video/__snapshots__/Video.stories.ts.snap +1 -1
  100. package/src/Atom/_generic.css +4 -4
  101. package/src/Atom/_hr.css +1 -2
  102. package/src/Component/Accordion/Accordion.stories.ts +26 -8
  103. package/src/Component/Accordion/Accordion.stories.tsx +8 -10
  104. package/src/Component/Accordion/Accordion.tsx +2 -13
  105. package/src/Component/Accordion/AccordionItem.stories.ts +90 -0
  106. package/src/Component/Accordion/Components/AccordionContent.tsx +1 -5
  107. package/src/Component/Accordion/Components/AccordionTitle.tsx +1 -4
  108. package/src/Component/Accordion/Elements/Accordion.ts +1 -1
  109. package/src/Component/Accordion/Elements/AccordionDiv.ts +4 -11
  110. package/src/Component/Accordion/Elements/AccordionGroup.ts +10 -24
  111. package/src/Component/Accordion/Elements/AccordionMobile.ts +4 -4
  112. package/src/Component/Accordion/__snapshots__/Accordion.stories.ts.snap +17 -6
  113. package/src/Component/Accordion/__snapshots__/Accordion.stories.tsx.snap +1 -1
  114. package/src/Component/Accordion/__snapshots__/AccordionItem.stories.ts.snap +90 -0
  115. package/src/Component/Accordion/accordion.css +7 -5
  116. package/src/Component/Accordion/twig/accordion-div.twig +13 -11
  117. package/src/Component/Accordion/twig/accordion-mobile.twig +13 -11
  118. package/src/Component/Breadcrumb/Breadcrumb.stories.ts +14 -0
  119. package/src/Component/Breadcrumb/Breadcrumb.tsx +2 -12
  120. package/src/Component/Breadcrumb/__snapshots__/Breadcrumb.stories.ts.snap +1 -1
  121. package/src/Component/Breadcrumb/__snapshots__/Breadcrumb.stories.tsx.snap +1 -1
  122. package/src/Component/Breadcrumb/breadcrumb.css +1 -4
  123. package/src/Component/Callout/Callout.stories.ts +20 -0
  124. package/src/Component/Callout/__snapshots__/Callout.stories.ts.snap +1 -1
  125. package/src/Component/Callout/callout.css +1 -2
  126. package/src/Component/Card/Card.stories.ts +129 -14
  127. package/src/Component/Card/Card.stories.tsx +2 -2
  128. package/src/Component/Card/Components/CardContent.tsx +1 -5
  129. package/src/Component/Card/__snapshots__/Card.stories.ts.snap +24 -24
  130. package/src/Component/Card/__snapshots__/Card.stories.tsx.snap +1 -1
  131. package/src/Component/Card/card.css +2 -6
  132. package/src/Component/Card/card.twig +1 -1
  133. package/src/Component/Carousel/Carousel.stories.ts +61 -8
  134. package/src/Component/Carousel/Elements/Carousel.ts +10 -19
  135. package/src/Component/Carousel/__snapshots__/Carousel.stories.ts.snap +321 -35
  136. package/src/Component/Carousel/carousel.css +1 -2
  137. package/src/Component/ContentBlock/Components/ContentBlockContent.tsx +1 -5
  138. package/src/Component/ContentBlock/Components/ContentBlockMedia.tsx +1 -4
  139. package/src/Component/ContentBlock/ContentBlock.stories.ts +63 -13
  140. package/src/Component/ContentBlock/ContentBlock.stories.tsx +2 -2
  141. package/src/Component/ContentBlock/ContentBlock.tsx +1 -5
  142. package/src/Component/ContentBlock/__snapshots__/ContentBlock.stories.ts.snap +11 -11
  143. package/src/Component/ContentBlock/__snapshots__/ContentBlock.stories.tsx.snap +1 -1
  144. package/src/Component/Dialog/Dialog.stories.ts +78 -21
  145. package/src/Component/Dialog/Dialog.stories.tsx +2 -3
  146. package/src/Component/Dialog/Elements/Dialog.ts +7 -16
  147. package/src/Component/Dialog/__snapshots__/Dialog.stories.ts.snap +8 -11
  148. package/src/Component/Dialog/__snapshots__/Dialog.stories.tsx.snap +1 -1
  149. package/src/Component/Dialog/dialog.css +1 -2
  150. package/src/Component/Dialog/dialog.twig +1 -1
  151. package/src/Component/DropMenu/Components/DropMenuContext.tsx +4 -12
  152. package/src/Component/DropMenu/DropMenu.stories.ts +60 -1
  153. package/src/Component/DropMenu/DropMenu.tsx +2 -7
  154. package/src/Component/DropMenu/Elements/DropMenu.ts +21 -91
  155. package/src/Component/DropMenu/__snapshots__/DropMenu.stories.ts.snap +53 -11
  156. package/src/Component/DropMenu/__snapshots__/DropMenu.stories.tsx.snap +1 -1
  157. package/src/Component/DropMenu/drop-menu.css +13 -41
  158. package/src/Component/DropMenu/drop-menu.twig +8 -6
  159. package/src/Component/Filters/Elements/Filters.ts +7 -11
  160. package/src/Component/Filters/FilterItem.stories.ts +180 -0
  161. package/src/Component/Filters/Filters.stories.ts +83 -8
  162. package/src/Component/Filters/__snapshots__/FilterItem.stories.ts.snap +135 -0
  163. package/src/Component/Filters/__snapshots__/Filters.stories.ts.snap +43 -41
  164. package/src/Component/Filters/filter-item.twig +1 -1
  165. package/src/Component/Filters/filters.css +33 -17
  166. package/src/Component/GlobalAlert/Elements/ClosableAlert.ts +8 -7
  167. package/src/Component/GlobalAlert/GlobalAlert.stories.ts +60 -12
  168. package/src/Component/GlobalAlert/GlobalAlert.stories.tsx +1 -2
  169. package/src/Component/GlobalAlert/__snapshots__/GlobalAlert.stories.ts.snap +8 -6
  170. package/src/Component/GlobalAlert/__snapshots__/GlobalAlert.stories.tsx.snap +3 -3
  171. package/src/Component/HeroBanner/HeroBanner.stories.ts +84 -7
  172. package/src/Component/HeroBanner/HeroBanner.stories.tsx +4 -4
  173. package/src/Component/HeroBanner/__snapshots__/HeroBanner.stories.ts.snap +91 -99
  174. package/src/Component/HeroBanner/__snapshots__/HeroBanner.stories.tsx.snap +1 -1
  175. package/src/Component/HeroSearch/HeroSearch.stories.ts +23 -4
  176. package/src/Component/HeroSearch/HeroSearch.stories.tsx +4 -4
  177. package/src/Component/HeroSearch/__snapshots__/HeroSearch.stories.ts.snap +10 -10
  178. package/src/Component/HeroSearch/__snapshots__/HeroSearch.stories.tsx.snap +1 -1
  179. package/src/Component/InPageAlert/InPageAlert.stories.ts +76 -8
  180. package/src/Component/InPageAlert/InPageAlert.stories.tsx +1 -2
  181. package/src/Component/InPageAlert/InPageAlert.tsx +1 -4
  182. package/src/Component/InPageAlert/__snapshots__/InPageAlert.stories.ts.snap +80 -2
  183. package/src/Component/InPageAlert/__snapshots__/InPageAlert.stories.tsx.snap +1 -1
  184. package/src/Component/InPageNavigation/Elements/InPageNavigation.ts +7 -9
  185. package/src/Component/InPageNavigation/Hooks/useInPageNavigation.ts +3 -5
  186. package/src/Component/InPageNavigation/InPageNavigation.stories.ts +44 -9
  187. package/src/Component/InPageNavigation/InPageNavigation.stories.tsx +32 -40
  188. package/src/Component/InPageNavigation/__snapshots__/InPageNavigation.stories.ts.snap +152 -5
  189. package/src/Component/InPageNavigation/__snapshots__/InPageNavigation.stories.tsx.snap +1 -1
  190. package/src/Component/LinkList/LinkList.stories.ts +23 -0
  191. package/src/Component/LinkList/__snapshots__/LinkList.stories.ts.snap +8 -8
  192. package/src/Component/LinkList/__snapshots__/LinkList.stories.tsx.snap +1 -1
  193. package/src/Component/LinkList/link-list.css +1 -2
  194. package/src/Component/ListItem/Components/ListItemContent.tsx +1 -5
  195. package/src/Component/ListItem/Components/ListItemMedia.tsx +1 -4
  196. package/src/Component/ListItem/ListItem.stories.ts +91 -11
  197. package/src/Component/ListItem/ListItem.stories.tsx +6 -7
  198. package/src/Component/ListItem/__snapshots__/ListItem.stories.ts.snap +1 -1
  199. package/src/Component/ListItem/__snapshots__/ListItem.stories.tsx.snap +1 -1
  200. package/src/Component/ListItem/list-item.css +1 -2
  201. package/src/Component/Navigation/Components/DropdownLevel.tsx +5 -13
  202. package/src/Component/Navigation/Elements/Navigation.ts +6 -13
  203. package/src/Component/Navigation/Navigation.stories.ts +48 -0
  204. package/src/Component/Navigation/__snapshots__/Dropdown.stories.tsx.snap +1 -1
  205. package/src/Component/Navigation/__snapshots__/Navigation.stories.ts.snap +1 -1
  206. package/src/Component/Navigation/__snapshots__/Navigation.stories.tsx.snap +1 -1
  207. package/src/Component/Navigation/_navigation-collapsible.css +2 -4
  208. package/src/Component/Navigation/_navigation-dropdown.css +10 -32
  209. package/src/Component/Navigation/_navigation-mega.css +1 -4
  210. package/src/Component/Navigation/_navigation.css +1 -4
  211. package/src/Component/Pagination/Components/PaginationContext.tsx +5 -19
  212. package/src/Component/Pagination/Components/PaginationItem.tsx +1 -5
  213. package/src/Component/Pagination/Pagination.stories.ts +28 -0
  214. package/src/Component/Pagination/Pagination.tsx +3 -11
  215. package/src/Component/Pagination/__snapshots__/Pagination.stories.ts.snap +3 -3
  216. package/src/Component/Pagination/__snapshots__/Pagination.stories.tsx.snap +1 -1
  217. package/src/Component/Pagination/pagination.css +1 -4
  218. package/src/Component/Popover/Elements/Popover.ts +55 -0
  219. package/src/Component/Popover/Popover.stories.ts +259 -0
  220. package/src/Component/Popover/__snapshots__/Popover.stories.ts.snap +508 -0
  221. package/src/Component/{DropMenu → Popover}/polyfills.js +6 -4
  222. package/src/Component/Popover/popover.css +113 -0
  223. package/src/Component/Popover/popover.entry.js +1 -0
  224. package/src/Component/Popover/popover.twig +27 -0
  225. package/src/Component/ResultsBar/Components/ResultsBarInfo.tsx +2 -7
  226. package/src/Component/ResultsBar/Components/ResultsBarSort.tsx +1 -6
  227. package/src/Component/ResultsBar/ResultsBar.stories.ts +34 -4
  228. package/src/Component/ResultsBar/__snapshots__/ResultsBar.stories.ts.snap +3 -3
  229. package/src/Component/ResultsBar/__snapshots__/ResultsBar.stories.tsx.snap +1 -1
  230. package/src/Component/SideNavigation/SideNavigation.stories.ts +40 -0
  231. package/src/Component/SideNavigation/__snapshots__/SideNavigation.stories.ts.snap +1 -1
  232. package/src/Component/SideNavigation/side-navigation.css +3 -6
  233. package/src/Component/SocialLinks/SocialLinks.stories.ts +20 -0
  234. package/src/Component/SocialLinks/__snapshots__/SocialLinks.stories.ts.snap +5 -5
  235. package/src/Component/SocialShare/SocialShare.stories.ts +37 -0
  236. package/src/Component/SocialShare/SocialShare.tsx +2 -4
  237. package/src/Component/SocialShare/__snapshots__/SocialShare.stories.ts.snap +40 -0
  238. package/src/Component/SocialShare/__snapshots__/SocialShare.stories.tsx.snap +1 -1
  239. package/src/Component/SocialShare/social-share.twig +34 -0
  240. package/src/Component/Steps/StepItem.stories.ts +48 -0
  241. package/src/Component/Steps/Steps.stories.ts +82 -13
  242. package/src/Component/Steps/__snapshots__/StepItem.stories.ts.snap +31 -0
  243. package/src/Component/Steps/__snapshots__/Steps.stories.ts.snap +109 -28
  244. package/src/Component/Steps/step-item.twig +1 -1
  245. package/src/Component/Steps/steps.css +4 -11
  246. package/src/Component/Sticky/Elements/Sticky.ts +3 -8
  247. package/src/Component/Sticky/Sticky.stories.ts +35 -3
  248. package/src/Component/Sticky/__snapshots__/Sticky.stories.ts.snap +1 -1
  249. package/src/Component/Sticky/__snapshots__/Sticky.stories.tsx.snap +1 -1
  250. package/src/Component/Sticky/sticky.twig +1 -1
  251. package/src/Component/Tabs/Components/Tab.tsx +2 -8
  252. package/src/Component/Tabs/Components/TabPanel.tsx +1 -5
  253. package/src/Component/Tabs/Elements/Tabs.ts +21 -31
  254. package/src/Component/Tabs/TabItem.stories.ts +52 -0
  255. package/src/Component/Tabs/Tabs.stories.ts +51 -8
  256. package/src/Component/Tabs/Tabs.tsx +6 -22
  257. package/src/Component/Tabs/__snapshots__/TabItem.stories.ts.snap +12 -0
  258. package/src/Component/Tabs/__snapshots__/Tabs.stories.ts.snap +127 -11
  259. package/src/Component/Tabs/__snapshots__/Tabs.stories.tsx.snap +1 -1
  260. package/src/Component/Tabs/tab-item.twig +1 -2
  261. package/src/Component/Tabs/tabs.css +56 -59
  262. package/src/Component/Tag/Tag.stories.ts +30 -0
  263. package/src/Component/Tag/Tag.tsx +1 -5
  264. package/src/Component/Tag/__snapshots__/Tag.stories.ts.snap +1 -1
  265. package/src/Component/Tag/__snapshots__/Tag.stories.tsx.snap +1 -1
  266. package/src/Component/Tag/tag.css +1 -4
  267. package/src/Component/UtilityList/Elements/UtilityList.ts +110 -0
  268. package/src/Component/UtilityList/UtilityList.stories.ts +72 -0
  269. package/src/Component/UtilityList/__snapshots__/UtilityList.stories.ts.snap +274 -0
  270. package/src/Component/UtilityList/utility-list.css +40 -0
  271. package/src/Component/UtilityList/utility-list.entry.js +1 -0
  272. package/src/Component/UtilityList/utility-list.twig +66 -0
  273. package/src/Form/Checkbox/FormCheckbox.stories.tsx +1 -3
  274. package/src/Form/Checkbox/FormCheckbox.tsx +4 -25
  275. package/src/Form/Checkbox/__snapshots__/Checkbox.stories.ts.snap +3 -3
  276. package/src/Form/Description/Description.stories.ts +1 -2
  277. package/src/Form/Description/FormStatus.stories.ts +1 -4
  278. package/src/Form/Description/__snapshots__/Description.stories.ts.snap +1 -1
  279. package/src/Form/Description/__snapshots__/FormDescription.stories.tsx.snap +1 -1
  280. package/src/Form/Description/__snapshots__/FormStatus.stories.ts.snap +3 -3
  281. package/src/Form/Form/Form.tsx +1 -3
  282. package/src/Form/Form/__snapshots__/Form.stories.tsx.snap +1 -1
  283. package/src/Form/Form/__snapshots__/FormTitle.stories.tsx.snap +1 -1
  284. package/src/Form/FormItem/FormItem.stories.ts +3 -9
  285. package/src/Form/FormItem/__snapshots__/FormItem.stories.ts.snap +18 -18
  286. package/src/Form/FormItem/__snapshots__/FormItem.stories.tsx.snap +1 -1
  287. package/src/Form/Label/FormLabel.tsx +1 -5
  288. package/src/Form/Label/__snapshots__/FormLabel.stories.tsx.snap +1 -1
  289. package/src/Form/Label/__snapshots__/Label.stories.ts.snap +3 -3
  290. package/src/Form/Radio/FormRadio.stories.tsx +1 -3
  291. package/src/Form/Radio/FormRadio.tsx +4 -25
  292. package/src/Form/Radio/__snapshots__/Radio.stories.ts.snap +9 -9
  293. package/src/Form/Search/__snapshots__/Search.stories.ts.snap +1 -1
  294. package/src/Form/Select/FormSelect.tsx +3 -9
  295. package/src/Form/Select/__snapshots__/FormSelect.stories.tsx.snap +1 -1
  296. package/src/Form/Select/__snapshots__/Select.stories.ts.snap +2 -2
  297. package/src/Form/TextInput/FormText.tsx +3 -9
  298. package/src/Form/TextInput/TextInput.stories.ts +1 -4
  299. package/src/Form/TextInput/__snapshots__/FormText.stories.tsx.snap +1 -1
  300. package/src/Form/TextInput/__snapshots__/InputDivider.stories.ts.snap +1 -1
  301. package/src/Form/TextInput/__snapshots__/TextInput.stories.ts.snap +3 -3
  302. package/src/Form/Textarea/FormTextarea.tsx +3 -9
  303. package/src/Form/Textarea/__snapshots__/FormTextarea.stories.tsx.snap +1 -1
  304. package/src/Form/Textarea/__snapshots__/Textarea.stories.ts.snap +2 -2
  305. package/src/Form/form.css +6 -14
  306. package/src/Introduction.mdx +1 -2
  307. package/src/Layout/Footer/Footer.stories.ts +1 -5
  308. package/src/Layout/Footer/Footer.stories.tsx +2 -3
  309. package/src/Layout/Footer/Footer.tsx +3 -12
  310. package/src/Layout/Footer/__snapshots__/Footer.stories.ts.snap +4 -4
  311. package/src/Layout/Footer/__snapshots__/Footer.stories.tsx.snap +1 -1
  312. package/src/Layout/Grid/Grid.stories.ts +40 -8
  313. package/src/Layout/Grid/Grid.tsx +1 -2
  314. package/src/Layout/Grid/GridItem.stories.ts +63 -0
  315. package/src/Layout/Grid/__snapshots__/Grid.stories.ts.snap +29 -4
  316. package/src/Layout/Grid/__snapshots__/Grid.stories.tsx.snap +1 -1
  317. package/src/Layout/Grid/__snapshots__/GridItem.stories.ts.snap +19 -0
  318. package/src/Layout/Grid/grid-item.twig +3 -9
  319. package/src/Layout/Grid/grid.css +1 -4
  320. package/src/Layout/Header/Elements/GlobalToggle.ts +9 -29
  321. package/src/Layout/Header/__snapshots__/Header.stories.ts.snap +25 -45
  322. package/src/Layout/Header/__snapshots__/Header.stories.tsx.snap +3 -3
  323. package/src/Layout/Header/_toggles.css +2 -2
  324. package/src/Layout/Header/header.twig +1 -1
  325. package/src/Layout/Masthead/Masthead.stories.ts +1 -4
  326. package/src/Layout/Masthead/__snapshots__/Masthead.stories.ts.snap +3 -3
  327. package/src/Layout/Page/Page.stories.tsx +2 -2
  328. package/src/Layout/Page/__snapshots__/Page.stories.tsx.snap +3 -3
  329. package/src/Layout/Page/page.css +2 -10
  330. package/src/Layout/Section/Background.stories.ts +14 -39
  331. package/src/Layout/Section/Breakouts.stories.ts +3 -0
  332. package/src/Layout/Section/Flow.stories.ts +3 -0
  333. package/src/Layout/Section/Section.stories.ts +93 -11
  334. package/src/Layout/Section/Section.tsx +3 -13
  335. package/src/Layout/Section/SectionGrid.tsx +2 -9
  336. package/src/Layout/Section/__snapshots__/Background.stories.ts.snap +4 -4
  337. package/src/Layout/Section/__snapshots__/Breakouts.stories.ts.snap +1 -1
  338. package/src/Layout/Section/__snapshots__/Flow.stories.ts.snap +1 -1
  339. package/src/Layout/Section/__snapshots__/Section.stories.ts.snap +93 -3
  340. package/src/Layout/Section/__snapshots__/Section.stories.tsx.snap +1 -1
  341. package/src/Layout/Section/__snapshots__/SectionGrid.stories.tsx.snap +1 -1
  342. package/src/Layout/Section/section.css +2 -5
  343. package/src/Layout/Section/section.twig +1 -3
  344. package/src/Layout/Sidebar/Sidebar.stories.ts +46 -4
  345. package/src/Layout/Sidebar/Sidebar.tsx +1 -3
  346. package/src/Layout/Sidebar/__snapshots__/Sidebar.stories.ts.snap +4 -4
  347. package/src/Layout/Sidebar/__snapshots__/Sidebar.stories.tsx.snap +1 -1
  348. package/src/Utility/Context/ImageComponent.tsx +4 -8
  349. package/src/Utility/Context/LinkComponent.tsx +1 -5
  350. package/src/Utility/Drupal/drupal.css +2 -4
  351. package/src/Utility/Elements/breakpoint-loader.ts +4 -10
  352. package/src/Utility/Elements/cookie-compliance.ts +2 -8
  353. package/src/Utility/Elements/disclosure-widget.ts +11 -18
  354. package/src/Utility/Elements/io-loader.ts +4 -6
  355. package/src/Utility/Elements/keyboard.ts +4 -14
  356. package/src/Utility/Hooks/useLocalStorage.ts +5 -18
  357. package/src/Utility/Hooks/useMediaQuery.ts +1 -4
  358. package/src/Utility/Hooks/useToggle.ts +1 -3
  359. package/src/Utility/global.d.ts +1 -5
  360. package/src/Utility/utilities.ts +20 -45
  361. package/src/constants.css +7 -28
  362. package/src/enums.ts +3 -1
  363. package/src/react.ts +5 -21
  364. package/src/tokens.js +2 -2
  365. package/dist/build/chunks/disclosure-widget-DVpnRsTI.js +0 -126
  366. package/dist/build/chunks/disclosure-widget-DVpnRsTI.js.map +0 -1
  367. package/dist/build/chunks/drop-menu.entry-B4TtnC50.js +0 -132
  368. package/dist/build/chunks/drop-menu.entry-B4TtnC50.js.map +0 -1
  369. package/dist/build/chunks/keyboard-rvZ4dfGF.js +0 -104
  370. package/dist/build/chunks/keyboard-rvZ4dfGF.js.map +0 -1
  371. package/dist/build/chunks/polyfills-C-B7iqDG.js.map +0 -1
  372. package/dist/build/chunks/utilities-DXELy_An.js.map +0 -1
  373. package/src/Atom/Text/TextSizes.stories.ts +0 -25
  374. package/src/Atom/Text/text-alignment.twig +0 -5
  375. package/src/Component/Accordion/twig/accordion-example.twig +0 -36
  376. package/src/Component/Tile/README.md +0 -3
  377. package/src/Component/Tile/Tile.stories.ts +0 -49
  378. package/src/Component/Tile/Tile.stories.tsx +0 -35
  379. package/src/Component/Tile/__snapshots__/Tile.stories.ts.snap +0 -57
  380. package/src/Component/Tile/__snapshots__/Tile.stories.tsx.snap +0 -23
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.entry.js","sources":["../../src/Component/Tabs/Elements/Tabs.ts"],"sourcesContent":["/**\n * Tab toggle handler\n */\n\nimport DropMenu, { DropMenuEvent } from \"../../DropMenu/Elements/DropMenu\"\nimport { createElement, makeAnchor } from \"../../../Utility/utilities\"\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 mq: string\n locationHash?: string\n tabFocus?: number = 0\n tabListClasses?: string\n dropTriggerClasses?: string\n dropMenuId?: string\n\n constructor() {\n super()\n this.internals_ = this.attachInternals()\n this.controller = new AbortController()\n this.mq = this.getAttribute(\"mq\") || \"(max-width: 720px)\"\n }\n\n connectedCallback(): void {\n if (!this.panels) return\n this.locationHash = window.location.hash\n\n this.tabs = new Map()\n this.panels.forEach((panel: HTMLDivElement): void => {\n const id: string = panel.id\n const name: string = panel.getAttribute(\"aria-label\")\n const tabTemplate = `<button type=\"button\" role=\"tab\" aria-controls=\"${id}\" aria-selected=\"false\">${name}</button>`\n const tab = createElement(tabTemplate) as HTMLButtonElement\n this.tabList.appendChild(tab)\n const button = createElement(tabTemplate) as HTMLButtonElement\n this.dropMenuMenu.appendChild(button)\n if (id && panel && button) {\n this.tabs.set(id, { panel, tab, button })\n }\n })\n\n const { signal }: AbortController = this.controller\n this.handleBreakpoint(this.breakpoint)\n this.breakpoint.addEventListener(\"change\", this.handleBreakpoint, {\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 handleBreakpoint = ({\n matches,\n }: MediaQueryList | MediaQueryListEvent): void => {\n const { signal }: AbortController = this.controller\n this.dropMenuTrigger.toggleAttribute(\"hidden\", !matches)\n this.tabList.toggleAttribute(\"hidden\", matches)\n if (matches) {\n this.dropMenuMenu.addEventListener(\n \"drop-menu-select\",\n this.handleDropMenuSelect,\n { signal },\n )\n this.tabList.removeEventListener(\"click\", this.handleClick)\n this.tabList.removeEventListener(\"keydown\", this.handleKeydown)\n } else {\n this.tabList.addEventListener(\"click\", this.handleClick, { signal })\n this.tabList.addEventListener(\"keydown\", this.handleKeydown, { signal })\n this.dropMenuMenu.removeEventListener(\n \"drop-menu-select\",\n this.handleDropMenuSelect,\n )\n }\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(): DropMenu | null {\n const existingMenu = this.querySelector(\"mx-dropmenu\")\n if (existingMenu) return existingMenu\n this.dropTriggerClasses =\n this.getAttribute(\"dropTriggerClasses\") ||\n \"mx-button mx-icon mx-icon--chevron-down mx-icon--end\"\n this.dropMenuId = this.id || makeAnchor(\"tab-drop-menu\")\n const name = `${this.dropMenuId}-target`\n const tabDropMenu = new DropMenu()\n tabDropMenu.setAttribute(\"closeOnClick\", \"true\")\n const trigger = createElement(`<button\n id=\"${name}\"\n class=\"mx-drop-menu__trigger ${this.dropTriggerClasses}\"\n popovertarget=\"${this.dropMenuId}\"\n hidden\n ></button>`)\n const menu = createElement(\n `<div\n class=\"mx-drop-menu\"\n id=\"${this.dropMenuId}\"\n aria-labelledby=\"${name}\"\n anchor=\"${name}\"\n popover\n role=\"tablist\"\n ></div>`,\n )\n tabDropMenu.append(trigger, menu)\n this.prepend(tabDropMenu)\n return tabDropMenu\n }\n\n get dropMenuMenu(): HTMLDivElement {\n return this.dropMenu.querySelector('[popover][role=\"tablist\"]')\n }\n\n get dropMenuTrigger(): HTMLButtonElement | null {\n return this.dropMenu.querySelector(\"[popovertarget]\")\n }\n\n get tabList(): HTMLDivElement {\n this.tabListClasses = this.getAttribute(\"tabListClasses\") || \"mx-tabs__list\"\n const existingTabList: HTMLDivElement = this.querySelector(\n '[role=\"tablist\"]:not([popover])',\n )\n if (existingTabList) return existingTabList\n const tabList = createElement(\n `<div class=\"${this.tabListClasses}\" role=\"tablist\" hidden></div>`,\n ) as HTMLDivElement\n this.prepend(tabList)\n return tabList\n }\n\n get triggers(): NodeListOf<HTMLButtonElement> | null {\n const triggers: NodeListOf<HTMLButtonElement> | null =\n this.tabList.querySelectorAll('[role=\"tab\"]')\n if (!triggers.length) {\n throw new Error(`${this.localName} must contain [role=\"tab\"]`)\n }\n return triggers\n }\n\n get panels(): NodeListOf<HTMLElement> | null {\n const panels: NodeListOf<HTMLElement> | null =\n this.querySelectorAll('[role=\"tabpanel\"]')\n if (!panels.length) {\n throw new Error(`${this.localName} must contain [role=\"tabpanel\"]`)\n }\n return panels\n }\n\n get active(): HTMLButtonElement {\n return this.querySelector('[aria-selected=\"true\"]')\n }\n\n get breakpoint(): MediaQueryList {\n return window.matchMedia(this.mq)\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
+ {"version":3,"file":"tabs.entry.js","sources":["../../node_modules/.pnpm/@pnx-mixtape+ids-shape@0.0.22_patch_hash=69b59e7d81ff2626b88306794fb0023d59b96636c48efd2ea6e59d66859857fb/node_modules/@pnx-mixtape/ids-shape/enums.ts","../../src/Component/Tabs/Elements/Tabs.ts"],"sourcesContent":["export enum AlignmentTypes {\n START = \"start\",\n END = \"end\",\n}\n\nexport enum FormStatusTypes {\n DEFAULT = \"default\",\n VALID = \"valid\",\n INVALID = \"invalid\"\n}\n\nexport enum InputTypeTypes {\n BUTTON = \"button\",\n CHECKBOX = \"checkbox\",\n COLOR = \"color\",\n DATE = \"date\",\n DATETIMELOCAL = \"datetime-local\",\n EMAIL = \"email\",\n FILE = \"file\",\n HIDDEN = \"hidden\",\n IMAGE = \"image\",\n MONTH = \"month\",\n NUMBER = \"number\",\n PASSWORD = \"password\",\n RADIO = \"radio\",\n RANGE = \"range\",\n RESET = \"reset\",\n SEARCH = \"search\",\n SUBMIT = \"submit\",\n TEL = \"tel\",\n TEXT = \"text\",\n TIME = \"time\",\n URL = \"url\",\n WEEK = \"week\"\n}\n\nexport enum MediaAlignmentTypes {\n LEFT = \"left\",\n RIGHT = \"right\",\n CENTER = \"center\"\n}\n\nexport enum IconColourModifier {\n INFO = \"info\",\n ERROR = \"error\",\n WARNING = \"warning\",\n SUCCESS = \"success\",\n BRAND = \"brand\",\n ACCENT = \"accent\"\n}\n\nexport enum IconRotateModifier {\n NINETY = \"rotate-90\",\n ONEEIGHTY = \"rotate-180\",\n TWOSEVENTY = \"rotate-270\",\n}\n\nexport enum IconSizeModifier {\n SMALL = \"sm\",\n MEDIUM = \"md\",\n LARGE = \"lg\",\n XLARGE = \"xl\",\n}\n\nexport enum ButtonTypes {\n INPUT = \"input\",\n BUTTON = \"button\",\n LINK = \"link\",\n SUBMIT = \"submit\",\n RESET = \"reset\",\n}\n\nexport enum ButtonModifiers {\n DARK = \"dark\",\n LIGHT = \"light\",\n WHITE = \"white\",\n DESTRUCTIVE = \"destructive\",\n FULL_WIDTH = \"full-width\",\n OUTLINE = \"outline\",\n}\n\nexport enum LoadingTypes {\n LAZY = \"lazy\",\n EAGER = \"eager\"\n}\n\nexport enum AsTypes {\n DIV = \"div\",\n LI = \"li\",\n ARTICLE = \"article\",\n ASIDE = \"aside\",\n SECTION = \"section\",\n}\n\nexport enum SectionTypes {\n DIV = \"div\",\n SECTION = \"section\",\n HEADER = \"header\",\n FOOTER = \"footer\",\n ASIDE = \"aside\",\n LIST = \"ul\",\n}\n\nexport enum SectionModifiers {\n S = \"s\",\n M = \"m\",\n L = \"l\",\n XL = \"xl\",\n TOP_S = \"top-s\",\n TOP_M = \"top-m\",\n TOP_L = \"top-l\",\n TOP_XL = \"top-xl\",\n BOTTOM_S = \"bottom-s\",\n BOTTOM_M = \"bottom-m\",\n BOTTOM_L = \"bottom-l\",\n BOTTOM_XL = \"bottom-xl\",\n}\n\nexport enum HeadingTypes {\n ONE = \"h1\",\n TWO = \"h2\",\n THREE = \"h3\",\n FOUR = \"h4\",\n FIVE = \"h5\",\n}\n\nexport enum TextModifiers {\n INTRO = \"intro\",\n SMALL = \"small\",\n ONE = \"h1\",\n TWO = \"h2\",\n THREE = \"h3\",\n FOUR = \"h4\",\n FIVE = \"h5\",\n}\n\nexport enum GlobalAlertTypes {\n LIGHT = \"light\",\n CRITICAL = \"critical\",\n}\n\nexport enum InPageAlertTypes {\n INFO = \"info\",\n ERROR = \"error\",\n WARNING = \"warning\",\n SUCCESS = \"success\",\n}\n\nexport enum TagTypes {\n TEXT = \"text\",\n LINK = \"link\",\n CHECKBOX = \"checkbox\"\n}\n\nexport enum GridModifiers {\n XS_2 = \"xs-2\",\n SM_2 = \"sm-2\",\n MD_2 = \"md-2\",\n LG_2 = \"lg-2\",\n XL_2 = \"xl-2\",\n MD_3 = \"md-3\",\n LG_3 = \"lg-3\",\n XL_3 = \"xl-3\",\n MD_4 = \"md-4\",\n LG_4 = \"lg-4\",\n XL_4 = \"xl-4\",\n}\n\nexport enum CardModifier {\n DARK = \"dark\",\n LIGHT = \"light\",\n SUPPLEMENTARY = \"supplementary\"\n}\n\nexport enum HeroBannerModifier {\n DARK = \"dark\",\n LIGHT = \"light\",\n WHITE = \"white\",\n GREY = \"off-white\"\n}\n\nexport enum StepsModifier {\n DARK = \"dark\",\n LIGHT = \"light\",\n SUPPLEMENTARY = \"supplementary\"\n}\n\nexport enum ListItemModifiers {\n BLOCK = \"block\",\n REVERSE = \"reversed\"\n}\n\nexport enum MastheadModifier {\n DARK = \"dark\",\n LIGHT = \"light\",\n}\n\nexport enum FooterModifier {\n DARK = \"dark\",\n LIGHT = \"light\",\n}\n\nexport enum PopoverPlacementModifier {\n TOP = \"top\",\n TOP_START = \"top-start\",\n TOP_END = \"top-end\",\n RIGHT = \"right\",\n RIGHT_START = \"right-start\",\n RIGHT_END = \"right-end\",\n LEFT = \"left\",\n LEFT_START = \"left-start\",\n LEFT_END = \"left-end\",\n BOTTOM = \"bottom\",\n BOTTOM_START = \"bottom-start\",\n BOTTOM_END = \"bottom-end\",\n TOP_CENTER = \"top-center\",\n LEFT_CENTER = \"left-center\",\n RIGHT_CENTER = \"right-center\",\n BOTTOM_CENTER = \"right-center\",\n}\n","/**\n * Tab toggle handler\n */\n\nimport DropMenu, { DropMenuEvent } from \"../../DropMenu/Elements/DropMenu\"\nimport { createElement, makeAnchor } from \"../../../Utility/utilities\"\nimport { PopoverPlacementModifier } from \"@pnx-mixtape/ids-shape\"\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 mq: string\n locationHash?: string\n tabFocus?: number = 0\n tabListClasses?: string\n dropTriggerClasses?: string\n dropMenuId?: string\n\n constructor() {\n super()\n this.internals_ = this.attachInternals()\n this.controller = new AbortController()\n this.mq = this.getAttribute(\"mq\") || \"(max-width: 720px)\"\n }\n\n connectedCallback(): void {\n if (!this.panels) return\n this.locationHash = window.location.hash\n\n this.tabs = new Map()\n this.panels.forEach((panel: HTMLDivElement): void => {\n const id: string = panel.id\n const name: string = panel.getAttribute(\"aria-label\")\n const tabTemplate = `<button type=\"button\" role=\"tab\" aria-controls=\"${id}\" aria-selected=\"false\">${name}</button>`\n const tab = createElement(tabTemplate) as HTMLButtonElement\n this.tabList.appendChild(tab)\n const button = createElement(tabTemplate) as HTMLButtonElement\n this.dropMenuMenu.appendChild(button)\n if (id && panel && button) {\n this.tabs.set(id, { panel, tab, button })\n }\n })\n\n const { signal }: AbortController = this.controller\n this.handleBreakpoint(this.breakpoint)\n this.breakpoint.addEventListener(\"change\", this.handleBreakpoint, {\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 handleBreakpoint = ({ matches }: MediaQueryList | MediaQueryListEvent): void => {\n const { signal }: AbortController = this.controller\n this.dropMenuTrigger.toggleAttribute(\"hidden\", !matches)\n this.tabList.toggleAttribute(\"hidden\", matches)\n if (matches) {\n this.dropMenuMenu.addEventListener(\"drop-menu-select\", this.handleDropMenuSelect, { signal })\n this.tabList.removeEventListener(\"click\", this.handleClick)\n this.tabList.removeEventListener(\"keydown\", this.handleKeydown)\n } else {\n this.tabList.addEventListener(\"click\", this.handleClick, { signal })\n this.tabList.addEventListener(\"keydown\", this.handleKeydown, { signal })\n this.dropMenuMenu.removeEventListener(\"drop-menu-select\", this.handleDropMenuSelect)\n }\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(): DropMenu | null {\n const existingMenu = this.querySelector(\"mx-dropmenu\")\n if (existingMenu) return existingMenu\n this.dropTriggerClasses =\n this.getAttribute(\"dropTriggerClasses\") ||\n \"mx-button mx-icon mx-icon--chevron-down mx-icon--end\"\n this.dropMenuId = this.id || makeAnchor(\"tab-drop-menu\")\n const name = `${this.dropMenuId}-target`\n const tabDropMenu = new DropMenu()\n tabDropMenu.setAttribute(\"closeOnClick\", \"true\")\n const trigger = createElement(`<button\n id=\"${name}\"\n class=\"mx-popover__trigger ${this.dropTriggerClasses}\"\n popovertarget=\"${this.dropMenuId}\"\n style=\"anchor-name: --${this.dropMenuId}\"\n hidden\n ></button>`)\n const menu = createElement(\n `<div\n class=\"mx-popover mx-drop-menu\"\n id=\"${this.dropMenuId}\"\n aria-describedby=\"${name}\"\n style=\"position-anchor: --${this.dropMenuId}\"\n data-placement=\"${PopoverPlacementModifier.BOTTOM_START}\"\n popover\n role=\"tablist\"\n ></div>`,\n )\n tabDropMenu.append(trigger, menu)\n this.prepend(tabDropMenu)\n return tabDropMenu\n }\n\n get dropMenuMenu(): HTMLDivElement {\n return this.dropMenu.querySelector('[popover][role=\"tablist\"]')\n }\n\n get dropMenuTrigger(): HTMLButtonElement | null {\n return this.dropMenu.querySelector(\"[popovertarget]\")\n }\n\n get tabList(): HTMLDivElement {\n this.tabListClasses = this.getAttribute(\"tabListClasses\") || \"mx-tabs__list\"\n const existingTabList: HTMLDivElement = this.querySelector('[role=\"tablist\"]:not([popover])')\n if (existingTabList) return existingTabList\n const tabList = createElement(\n `<div class=\"${this.tabListClasses}\" role=\"tablist\" hidden></div>`,\n ) as HTMLDivElement\n this.prepend(tabList)\n return tabList\n }\n\n get triggers(): NodeListOf<HTMLButtonElement> | null {\n const triggers: NodeListOf<HTMLButtonElement> | null =\n this.tabList.querySelectorAll('[role=\"tab\"]')\n if (!triggers.length) {\n throw new Error(`${this.localName} must contain [role=\"tab\"]`)\n }\n return triggers\n }\n\n get panels(): NodeListOf<HTMLElement> | null {\n const panels: NodeListOf<HTMLElement> | null = this.querySelectorAll(\"[data-tab]\")\n if (!panels.length) {\n throw new Error(`${this.localName} must contain [data-tab]`)\n }\n panels.forEach(panel => {\n panel.setAttribute(\"role\", \"tabpanel\")\n panel.setAttribute(\"tabindex\", \"0\")\n panel.setAttribute(\"aria-label\", panel.getAttribute(\"data-tab\"))\n })\n return panels\n }\n\n get active(): HTMLButtonElement {\n return this.querySelector('[aria-selected=\"true\"]')\n }\n\n get breakpoint(): MediaQueryList {\n return window.matchMedia(this.mq)\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(window.location.search)\n if (urlParams.get(\"tab\") === id) return\n urlParams.set(\"tab\", id)\n window.history.replaceState({}, \"\", `${window.location.pathname}?${urlParams.toString()}`)\n }\n}\n\nif (!customElements.get(\"mx-tabs\")) customElements.define(\"mx-tabs\", Tabs)\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"mx-tabs\": Tabs\n }\n}\n"],"names":["PopoverPlacementModifier"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Utility List
3
+ */
4
+
5
+ @layer design-system.defaults {
6
+ mx-utility-list {
7
+ display: block;
8
+ }
9
+
10
+ mx-utility-list:not(:defined) button:not([popovertarget]) {
11
+ pointer-events: none;
12
+ opacity: 0.7;
13
+ }
14
+ }
15
+
16
+ @layer design-system.components {
17
+ .mx-utility-list ul {
18
+ gap: var(--nav-gap, var(--spacing-xs));
19
+ }
20
+
21
+ .mx-utility-list:where(.mx-nav--inline) {
22
+ gap: 0;
23
+ gap: var(--inline-nav-gap, 0);
24
+ }
25
+
26
+ .mx-utility-list__share {
27
+ --utility-link-color: var(--colour-link);
28
+
29
+ min-inline-size: -moz-fit-content;
30
+
31
+ min-inline-size: fit-content;
32
+ }
33
+
34
+ .mx-utility-list__share a[href] {
35
+ --link-colour: var(--utility-link-color);
36
+ }
37
+
38
+ .mx-utility-list__share .mx-social-share {
39
+ justify-content: center;
40
+ }
41
+ }
42
+
43
+ /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxpdHktbGlzdC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0VBRUU7O0FBRUY7RUFDRTtJQUNFLGNBQWM7RUFNaEI7O0lBSkU7TUFDRSxvQkFBb0I7TUFDcEIsWUFBWTtJQUNkO0FBRUo7O0FBRUE7SUFFSTtNQUNFLHNDQUFzQztJQUN4Qzs7SUFFQTtNQUNFLE1BQTZCO01BQTdCLDZCQUE2QjtJQUMvQjs7RUFHRjtJQUNFLHdDQUF3Qzs7SUFFeEMsaUNBQTRCOztJQUE1Qiw0QkFBNEI7RUFTOUI7O0lBUEU7TUFDRSx3Q0FBd0M7SUFDMUM7O0lBRUE7TUFDRSx1QkFBdUI7SUFDekI7QUFFSiIsImZpbGUiOiJ1dGlsaXR5LWxpc3QuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVdGlsaXR5IExpc3RcbiAqL1xuXG5AbGF5ZXIgZGVzaWduLXN5c3RlbS5kZWZhdWx0cyB7XG4gIG14LXV0aWxpdHktbGlzdCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG5cbiAgICAmOm5vdCg6ZGVmaW5lZCkgYnV0dG9uOm5vdChbcG9wb3ZlcnRhcmdldF0pIHtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgb3BhY2l0eTogMC43O1xuICAgIH1cbiAgfVxufVxuXG5AbGF5ZXIgZGVzaWduLXN5c3RlbS5jb21wb25lbnRzIHtcbiAgLm14LXV0aWxpdHktbGlzdCB7XG4gICAgJiB1bCB7XG4gICAgICBnYXA6IHZhcigtLW5hdi1nYXAsIHZhcigtLXNwYWNpbmcteHMpKTtcbiAgICB9XG5cbiAgICAmOndoZXJlKC5teC1uYXYtLWlubGluZSkge1xuICAgICAgZ2FwOiB2YXIoLS1pbmxpbmUtbmF2LWdhcCwgMCk7XG4gICAgfVxuICB9XG5cbiAgLm14LXV0aWxpdHktbGlzdF9fc2hhcmUge1xuICAgIC0tdXRpbGl0eS1saW5rLWNvbG9yOiB2YXIoLS1jb2xvdXItbGluayk7XG5cbiAgICBtaW4taW5saW5lLXNpemU6IGZpdC1jb250ZW50O1xuXG4gICAgJiBhW2hyZWZdIHtcbiAgICAgIC0tbGluay1jb2xvdXI6IHZhcigtLXV0aWxpdHktbGluay1jb2xvcik7XG4gICAgfVxuXG4gICAgJiAubXgtc29jaWFsLXNoYXJlIHtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIH1cbiAgfVxufVxuIl19 */
@@ -0,0 +1,80 @@
1
+ class UtilityList extends HTMLElement {
2
+ internals_;
3
+ controller;
4
+ copyOriginalText;
5
+ copyOriginalIcon;
6
+ constructor() {
7
+ super();
8
+ this.internals_ = this.attachInternals();
9
+ this.controller = new AbortController();
10
+ this.copyOriginalIcon = "mx-icon--link";
11
+ }
12
+ connectedCallback() {
13
+ const { signal } = this.controller;
14
+ this.copyBtn?.addEventListener(
15
+ "click",
16
+ () => {
17
+ void this.handleCopy();
18
+ },
19
+ { signal }
20
+ );
21
+ this.printBtn?.addEventListener(
22
+ "click",
23
+ () => {
24
+ this.handlePrint();
25
+ },
26
+ { signal }
27
+ );
28
+ this.pdfBtn?.addEventListener(
29
+ "click",
30
+ () => {
31
+ this.handlePDF();
32
+ },
33
+ { signal }
34
+ );
35
+ }
36
+ disconnectedCallback() {
37
+ this.controller.abort();
38
+ }
39
+ handleCopy = async () => {
40
+ try {
41
+ await navigator.clipboard.write([
42
+ new ClipboardItem({
43
+ ["text/plain"]: window.location.href
44
+ })
45
+ ]).then(() => {
46
+ this.copyLabel.textContent = "Copied!";
47
+ this.copyIcon.classList.replace(this.copyOriginalIcon, "mx-icon--tick");
48
+ setTimeout(() => {
49
+ this.copyLabel.textContent = this.copyOriginalText;
50
+ this.copyIcon.classList.replace("mx-icon--tick", this.copyOriginalIcon);
51
+ }, 3e3);
52
+ });
53
+ } catch {
54
+ console.error("Could not copy the url to clipboard");
55
+ }
56
+ };
57
+ handlePrint = () => window.print();
58
+ // Defaults to Print dialog, to allow Save to PDF.
59
+ // if this needs to be changed, please extend the class.
60
+ handlePDF = () => window.print();
61
+ get copyBtn() {
62
+ return this.querySelector("button[data-copy]");
63
+ }
64
+ get copyLabel() {
65
+ const el = this.copyBtn.querySelector("span[data-copy-label]");
66
+ this.copyOriginalText = el?.textContent ?? void 0;
67
+ return el;
68
+ }
69
+ get copyIcon() {
70
+ return this.copyBtn.querySelector(".mx-icon");
71
+ }
72
+ get printBtn() {
73
+ return this.querySelector("button[data-print]");
74
+ }
75
+ get pdfBtn() {
76
+ return this.querySelector("button[data-pdf]");
77
+ }
78
+ }
79
+ if (!customElements.get("mx-utility-list")) customElements.define("mx-utility-list", UtilityList);
80
+ //# sourceMappingURL=utility-list.entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utility-list.entry.js","sources":["../../src/Component/UtilityList/Elements/UtilityList.ts"],"sourcesContent":["/**\n * UtilityList\n * @file Support copy and print functions.\n */\n\nexport default class UtilityList extends HTMLElement {\n internals_: ElementInternals\n controller: AbortController\n copyOriginalText?: string\n copyOriginalIcon?: string\n\n constructor() {\n super()\n this.internals_ = this.attachInternals()\n this.controller = new AbortController()\n this.copyOriginalIcon = \"mx-icon--link\"\n }\n\n connectedCallback(): void {\n const { signal }: AbortController = this.controller\n\n // Handle copy.\n this.copyBtn?.addEventListener(\n \"click\",\n (): void => {\n void this.handleCopy()\n },\n { signal },\n )\n\n // Handle print.\n this.printBtn?.addEventListener(\n \"click\",\n (): void => {\n this.handlePrint()\n },\n { signal },\n )\n\n // Handle PDF.\n this.pdfBtn?.addEventListener(\n \"click\",\n (): void => {\n this.handlePDF()\n },\n { signal },\n )\n }\n\n disconnectedCallback(): void {\n this.controller.abort()\n }\n\n handleCopy = async (): Promise<void> => {\n try {\n await navigator.clipboard\n .write([\n new ClipboardItem({\n [\"text/plain\"]: window.location.href,\n }),\n ])\n .then(() => {\n this.copyLabel.textContent = \"Copied!\"\n this.copyIcon.classList.replace(this.copyOriginalIcon, \"mx-icon--tick\")\n setTimeout(() => {\n this.copyLabel.textContent = this.copyOriginalText\n this.copyIcon.classList.replace(\"mx-icon--tick\", this.copyOriginalIcon)\n }, 3000)\n })\n } catch {\n console.error(\"Could not copy the url to clipboard\")\n }\n }\n\n handlePrint = (): void => window.print()\n\n // Defaults to Print dialog, to allow Save to PDF.\n // if this needs to be changed, please extend the class.\n handlePDF = (): void => window.print()\n\n get copyBtn(): HTMLButtonElement | null {\n return this.querySelector(\"button[data-copy]\")\n }\n\n get copyLabel(): HTMLSpanElement | null {\n const el: HTMLSpanElement = this.copyBtn.querySelector(\"span[data-copy-label]\")\n this.copyOriginalText = el?.textContent ?? undefined\n return el\n }\n\n get copyIcon(): HTMLSpanElement | null {\n return this.copyBtn.querySelector(\".mx-icon\")\n }\n\n get printBtn(): HTMLButtonElement | null {\n return this.querySelector(\"button[data-print]\")\n }\n\n get pdfBtn(): HTMLButtonElement | null {\n return this.querySelector(\"button[data-pdf]\")\n }\n}\n\nif (!customElements.get(\"mx-utility-list\")) customElements.define(\"mx-utility-list\", UtilityList)\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"mx-utility-list\": UtilityList\n }\n}\n"],"names":[],"mappings":"AAKA,MAAqB,oBAAoB,YAAY;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,cAAc;AACZ,UAAA;AACA,SAAK,aAAa,KAAK,gBAAA;AACvB,SAAK,aAAa,IAAI,gBAAA;AACtB,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,oBAA0B;AACxB,UAAM,EAAE,WAA4B,KAAK;AAGzC,SAAK,SAAS;AAAA,MACZ;AAAA,MACA,MAAY;AACV,aAAK,KAAK,WAAA;AAAA,MACZ;AAAA,MACA,EAAE,OAAA;AAAA,IAAO;AAIX,SAAK,UAAU;AAAA,MACb;AAAA,MACA,MAAY;AACV,aAAK,YAAA;AAAA,MACP;AAAA,MACA,EAAE,OAAA;AAAA,IAAO;AAIX,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,MAAY;AACV,aAAK,UAAA;AAAA,MACP;AAAA,MACA,EAAE,OAAA;AAAA,IAAO;AAAA,EAEb;AAAA,EAEA,uBAA6B;AAC3B,SAAK,WAAW,MAAA;AAAA,EAClB;AAAA,EAEA,aAAa,YAA2B;AACtC,QAAI;AACF,YAAM,UAAU,UACb,MAAM;AAAA,QACL,IAAI,cAAc;AAAA,UAChB,CAAC,YAAY,GAAG,OAAO,SAAS;AAAA,QAAA,CACjC;AAAA,MAAA,CACF,EACA,KAAK,MAAM;AACV,aAAK,UAAU,cAAc;AAC7B,aAAK,SAAS,UAAU,QAAQ,KAAK,kBAAkB,eAAe;AACtE,mBAAW,MAAM;AACf,eAAK,UAAU,cAAc,KAAK;AAClC,eAAK,SAAS,UAAU,QAAQ,iBAAiB,KAAK,gBAAgB;AAAA,QACxE,GAAG,GAAI;AAAA,MACT,CAAC;AAAA,IACL,QAAQ;AACN,cAAQ,MAAM,qCAAqC;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,cAAc,MAAY,OAAO,MAAA;AAAA;AAAA;AAAA,EAIjC,YAAY,MAAY,OAAO,MAAA;AAAA,EAE/B,IAAI,UAAoC;AACtC,WAAO,KAAK,cAAc,mBAAmB;AAAA,EAC/C;AAAA,EAEA,IAAI,YAAoC;AACtC,UAAM,KAAsB,KAAK,QAAQ,cAAc,uBAAuB;AAC9E,SAAK,mBAAmB,IAAI,eAAe;AAC3C,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,WAAmC;AACrC,WAAO,KAAK,QAAQ,cAAc,UAAU;AAAA,EAC9C;AAAA,EAEA,IAAI,WAAqC;AACvC,WAAO,KAAK,cAAc,oBAAoB;AAAA,EAChD;AAAA,EAEA,IAAI,SAAmC;AACrC,WAAO,KAAK,cAAc,kBAAkB;AAAA,EAC9C;AACF;AAEA,IAAI,CAAC,eAAe,IAAI,iBAAiB,EAAG,gBAAe,OAAO,mBAAmB,WAAW;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pnx-mixtape/mxds",
3
3
  "description": "The Mixtape Design System",
4
- "version": "0.0.21",
4
+ "version": "0.0.23",
5
5
  "dependencies": {
6
6
  "@floating-ui/dom": "^1.7.3",
7
7
  "@oddbird/popover-polyfill": "^0.6.1",
@@ -20,14 +20,13 @@
20
20
  "@csstools/postcss-global-data": "^3.0.0",
21
21
  "@csstools/stylelint-formatter-github": "^1.0.0",
22
22
  "@rollup/plugin-terser": "^0.4.4",
23
- "@storybook/addon-a11y": "^9.1.2",
24
- "@storybook/addon-docs": "^9.1.2",
25
- "@storybook/addon-links": "^9.1.2",
26
- "@storybook/html": "^9.1.7",
27
- "@storybook/html-vite": "^9.1.2",
28
- "@storybook/react": "^9.1.7",
29
- "@storybook/react-vite": "^9.1.2",
30
- "@storybook/test-runner": "^0.23.0",
23
+ "@storybook/addon-a11y": "^10.0.7",
24
+ "@storybook/addon-docs": "^10.0.7",
25
+ "@storybook/addon-links": "^10.0.7",
26
+ "@storybook/html-vite": "^10.0.7",
27
+ "@storybook/react": "^10.0.7",
28
+ "@storybook/react-vite": "^10.0.7",
29
+ "@storybook/test-runner": "^0.24.1",
31
30
  "@svgr/rollup": "^8.1.0",
32
31
  "@testing-library/dom": "^10.4.1",
33
32
  "@testing-library/jest-dom": "^6.7.0",
@@ -55,7 +54,7 @@
55
54
  "postcss-preset-env": "^10.2.4",
56
55
  "postcss-pxtorem": "^6.1.0",
57
56
  "prettier": "^3.6.2",
58
- "storybook": "^9.1.7",
57
+ "storybook": "^10.0.7",
59
58
  "stylelint": "^16.23.1",
60
59
  "stylelint-config-standard": "^39.0.0",
61
60
  "stylelint-use-logical-spec": "^5.0.1",
@@ -1,6 +1,6 @@
1
1
  import { Meta, ColorPalette, ColorItem } from "@storybook/addon-docs/blocks"
2
2
 
3
- <Meta title="Atom/Base" />
3
+ <Meta title="Atom/Atom" />
4
4
 
5
5
  # Base
6
6
 
@@ -7,34 +7,51 @@ type BackgroundsType = {
7
7
  modifier?: BackgroundStyles
8
8
  }
9
9
 
10
+ /**
11
+ * Background colours also set appropriate foreground colours to ensure contrast is met.
12
+ */
10
13
  const meta: Meta<BackgroundsType> = {
11
14
  title: "Atom/Backgrounds",
12
15
  tags: ["autodocs"],
13
16
  component: Component,
14
17
  argTypes: {
15
- modifier: { options: Object.values(BackgroundStyles), control: "select" },
18
+ modifier: {
19
+ description: "Define the colour the use.",
20
+ options: Object.values(BackgroundStyles),
21
+ control: "select",
22
+ table: {
23
+ type: { summary: "enum" },
24
+ },
25
+ },
16
26
  },
17
27
  }
18
28
 
19
29
  export default meta
20
30
  type Story = StoryObj<BackgroundsType>
21
31
 
22
- export const Backgrounds: Story = {
23
- args: {},
24
- }
32
+ export const Backgrounds: Story = {}
25
33
 
34
+ /**
35
+ * Nested elements can have their background reset to the default using the `.mx-background--reset` class.
36
+ */
26
37
  export const Alt: Story = {
27
38
  args: {
28
39
  modifier: BackgroundStyles.ALT,
29
40
  },
30
41
  }
31
42
 
43
+ /**
44
+ * Dark background set the colour scheme to `dark` to ensure foreground text meets contrast requirements.
45
+ */
32
46
  export const Reverse: Story = {
33
47
  args: {
34
48
  modifier: BackgroundStyles.REVERSE,
35
49
  },
36
50
  }
37
51
 
52
+ /**
53
+ * Link and line colour can also be customised per background.
54
+ */
38
55
  export const Primary: Story = {
39
56
  args: {
40
57
  modifier: BackgroundStyles.PRIMARY,
@@ -1,4 +1,4 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
1
+ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
2
2
 
3
3
  exports[`Atom/Backgrounds Accent smoke-test 1`] = `
4
4
  <div class="mx-page default">
@@ -42,8 +42,7 @@
42
42
  position: absolute;
43
43
  inline-size: 100%;
44
44
  min-block-size: 100%;
45
- filter: brightness(var(--bg-img-brightness, 1))
46
- saturate(var(--bg-img-saturate, 1.25))
45
+ filter: brightness(var(--bg-img-brightness, 1)) saturate(var(--bg-img-saturate, 1.25))
47
46
  opacity(var(--bg-img-opacity, 0.5));
48
47
  }
49
48
  }
@@ -1,7 +1,6 @@
1
1
  @layer design-system.defaults {
2
2
  blockquote {
3
3
  padding-inline-start: var(--line-gap, var(--gap));
4
- border-inline-start: var(--line-width, 6px) solid
5
- var(--line-colour, var(--colour-border));
4
+ border-inline-start: var(--line-width, 6px) solid var(--line-colour, var(--colour-border));
6
5
  }
7
6
  }
@@ -2,13 +2,12 @@ import { Meta, StoryObj } from "@storybook/html-vite"
2
2
  import Component from "./button.twig"
3
3
  import Icon from "../Icon/icon.twig"
4
4
  import "./button.css"
5
- import {
6
- Button as ButtonType,
7
- ButtonModifiers,
8
- ButtonTypes,
9
- } from "@pnx-mixtape/ids-shape"
5
+ import { Button as ButtonType, ButtonModifiers, ButtonTypes } from "@pnx-mixtape/ids-shape"
10
6
  import { Icons } from "../../enums"
11
7
 
8
+ /**
9
+ * A button atom with optional icon.
10
+ */
12
11
  const meta: Meta<ButtonType> = {
13
12
  title: "Atom/Button",
14
13
  tags: ["autodocs", "ids-mvp"],
@@ -18,40 +17,124 @@ const meta: Meta<ButtonType> = {
18
17
  as: ButtonTypes.BUTTON,
19
18
  },
20
19
  argTypes: {
20
+ title: {
21
+ description: "The button label",
22
+ type: {
23
+ name: "string",
24
+ required: true,
25
+ },
26
+ },
27
+ as: {
28
+ description: "Choose the type of button, or use a link instead.",
29
+ options: Object.values(ButtonTypes),
30
+ control: "select",
31
+ table: {
32
+ defaultValue: { summary: ButtonTypes.BUTTON },
33
+ type: { summary: "enum" },
34
+ },
35
+ },
36
+ href: {
37
+ description: "When using a Link, set the `href` value.",
38
+ type: "string",
39
+ if: { arg: "as", eq: ButtonTypes.LINK },
40
+ },
21
41
  modifiers: {
42
+ description:
43
+ "Define the style of the button. **outline** and **full-width** can be used with the other colour options.",
22
44
  options: Object.values(ButtonModifiers),
23
45
  control: "multi-select",
46
+ table: {
47
+ type: { summary: "enum" },
48
+ },
49
+ },
50
+ disabled: {
51
+ description: "Add the `[disabled]` attribute to the button.",
52
+ type: "boolean",
53
+ table: { defaultValue: { summary: "false" } },
54
+ if: { arg: "as", neq: ButtonTypes.LINK },
55
+ },
56
+ iconStart: {
57
+ description:
58
+ "An [Icon](/?path=/docs/atom-icon--docs) object, to display **before** the title.",
59
+ table: {
60
+ subcategory: "Icon",
61
+ },
62
+ },
63
+ iconEnd: {
64
+ description:
65
+ "An [Icon](/?path=/docs/atom-icon--docs) object, to display **after** the title.",
66
+ table: {
67
+ subcategory: "Icon",
68
+ },
69
+ },
70
+ iconOnly: {
71
+ description:
72
+ "When an icon is added, visually hide the button text so that only the icon is displayed.",
73
+ control: "boolean",
74
+ table: {
75
+ defaultValue: { summary: "false" },
76
+ subcategory: "Icon",
77
+ },
24
78
  },
25
- as: { options: Object.values(ButtonTypes), control: "select" },
26
- title: { control: "text" },
27
- href: { control: "text" },
28
- disabled: { control: "boolean" },
29
- // @ts-expect-error The controls follow the shape
30
- "iconStart.icon": { options: Object.values(Icons), control: "select" },
31
- "iconEnd.icon": { options: Object.values(Icons), control: "select" },
32
- iconOnly: { control: "boolean" },
33
79
  },
34
80
  }
35
81
 
36
82
  export default meta
37
83
  type Story = StoryObj<ButtonType>
38
84
 
39
- export const Button: Story = {
40
- args: {},
41
- }
85
+ export const Button: Story = {}
42
86
 
43
- export const Primary: Story = {
87
+ /**
88
+ * Primary style uses the **dark** modifier.
89
+ */
90
+ export const Dark: Story = {
44
91
  args: {
45
92
  modifiers: [ButtonModifiers.DARK],
46
93
  },
47
94
  }
48
95
 
49
- export const Text: Story = {
96
+ /**
97
+ * Outline can be combined with the **dark** or **destructive** modifier.
98
+ */
99
+ export const Outline: Story = {
100
+ args: {
101
+ modifiers: [ButtonModifiers.DARK, ButtonModifiers.OUTLINE],
102
+ },
103
+ }
104
+
105
+ /**
106
+ * Buttons can look more like hyperlinks by using the **light** modifier.
107
+ */
108
+ export const Light: Story = {
50
109
  args: {
51
110
  modifiers: [ButtonModifiers.LIGHT],
52
111
  },
53
112
  }
54
113
 
114
+ /**
115
+ * Destructive style should be reserved for cancel or delete buttons.
116
+ */
117
+ export const Destructive: Story = {
118
+ args: {
119
+ modifiers: [ButtonModifiers.DESTRUCTIVE],
120
+ },
121
+ }
122
+
123
+ /**
124
+ * White style is useful when on a dark background or overlaying an image.
125
+ */
126
+ export const White: Story = {
127
+ args: {
128
+ modifiers: [ButtonModifiers.WHITE],
129
+ },
130
+ globals: {
131
+ background: "mx-background--alt",
132
+ },
133
+ }
134
+
135
+ /**
136
+ * Button's can be a hyperlink element, though this usage should be limited (or combined with the **light** modifier).
137
+ */
55
138
  export const Link: Story = {
56
139
  args: {
57
140
  as: ButtonTypes.LINK,
@@ -59,10 +142,36 @@ export const Link: Story = {
59
142
  },
60
143
  }
61
144
 
62
- export const IconButton: Story = {
145
+ /**
146
+ * Icons can be added after the button text.
147
+ */
148
+ export const IconEnd: Story = {
63
149
  args: {
64
150
  iconEnd: Icon({
65
151
  icon: Icons.ARROW_RIGHT,
66
152
  }),
67
153
  },
68
154
  }
155
+
156
+ /**
157
+ * Icons can be added before the button text.
158
+ */
159
+ export const IconStart: Story = {
160
+ args: {
161
+ iconStart: Icon({
162
+ icon: Icons.ARROW_LEFT,
163
+ }),
164
+ },
165
+ }
166
+
167
+ /**
168
+ * Or the icon can visually hide the button text.
169
+ */
170
+ export const IconOnly: Story = {
171
+ args: {
172
+ iconStart: Icon({
173
+ icon: Icons.SEARCH,
174
+ }),
175
+ iconOnly: true,
176
+ },
177
+ }
@@ -1,8 +1,8 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
1
+ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
2
2
 
3
3
  exports[`Atom/Button Button smoke-test 1`] = `
4
4
  <div class="mx-page default">
5
- <button class="mx-button "
5
+ <button class="mx-button"
6
6
  type="button"
7
7
  >
8
8
  <span>
@@ -12,15 +12,79 @@ exports[`Atom/Button Button smoke-test 1`] = `
12
12
  </div>
13
13
  `;
14
14
 
15
- exports[`Atom/Button IconButton smoke-test 1`] = `
15
+ exports[`Atom/Button Dark smoke-test 1`] = `
16
16
  <div class="mx-page default">
17
- <button class="mx-button "
17
+ <button class="mx-button mx-button--dark"
18
18
  type="button"
19
19
  >
20
20
  <span>
21
21
  Button
22
22
  </span>
23
- <span class="mx-icon mx-icon--arrow-right ">
23
+ </button>
24
+ </div>
25
+ `;
26
+
27
+ exports[`Atom/Button Destructive smoke-test 1`] = `
28
+ <div class="mx-page default">
29
+ <button class="mx-button mx-button--destructive"
30
+ type="button"
31
+ >
32
+ <span>
33
+ Button
34
+ </span>
35
+ </button>
36
+ </div>
37
+ `;
38
+
39
+ exports[`Atom/Button IconEnd smoke-test 1`] = `
40
+ <div class="mx-page default">
41
+ <button class="mx-button"
42
+ type="button"
43
+ >
44
+ <span>
45
+ Button
46
+ </span>
47
+ <span class="mx-icon mx-icon--arrow-right">
48
+ </span>
49
+ </button>
50
+ </div>
51
+ `;
52
+
53
+ exports[`Atom/Button IconOnly smoke-test 1`] = `
54
+ <div class="mx-page default">
55
+ <button class="mx-button mx-button--icon-only"
56
+ type="button"
57
+ >
58
+ <span class="mx-icon mx-icon--search">
59
+ </span>
60
+ <span class="sr-only">
61
+ Button
62
+ </span>
63
+ </button>
64
+ </div>
65
+ `;
66
+
67
+ exports[`Atom/Button IconStart smoke-test 1`] = `
68
+ <div class="mx-page default">
69
+ <button class="mx-button"
70
+ type="button"
71
+ >
72
+ <span class="mx-icon mx-icon--arrow-left">
73
+ </span>
74
+ <span>
75
+ Button
76
+ </span>
77
+ </button>
78
+ </div>
79
+ `;
80
+
81
+ exports[`Atom/Button Light smoke-test 1`] = `
82
+ <div class="mx-page default">
83
+ <button class="mx-button mx-button--light"
84
+ type="button"
85
+ >
86
+ <span>
87
+ Button
24
88
  </span>
25
89
  </button>
26
90
  </div>
@@ -28,7 +92,7 @@ exports[`Atom/Button IconButton smoke-test 1`] = `
28
92
 
29
93
  exports[`Atom/Button Link smoke-test 1`] = `
30
94
  <div class="mx-page default">
31
- <a class="mx-button "
95
+ <a class="mx-button"
32
96
  href="#"
33
97
  >
34
98
  <span>
@@ -38,9 +102,9 @@ exports[`Atom/Button Link smoke-test 1`] = `
38
102
  </div>
39
103
  `;
40
104
 
41
- exports[`Atom/Button Primary smoke-test 1`] = `
105
+ exports[`Atom/Button Outline smoke-test 1`] = `
42
106
  <div class="mx-page default">
43
- <button class="mx-button mx-button--dark"
107
+ <button class="mx-button mx-button--dark mx-button--outline"
44
108
  type="button"
45
109
  >
46
110
  <span>
@@ -50,9 +114,9 @@ exports[`Atom/Button Primary smoke-test 1`] = `
50
114
  </div>
51
115
  `;
52
116
 
53
- exports[`Atom/Button Text smoke-test 1`] = `
54
- <div class="mx-page default">
55
- <button class="mx-button mx-button--light"
117
+ exports[`Atom/Button White smoke-test 1`] = `
118
+ <div class="mx-page mx-background--alt">
119
+ <button class="mx-button mx-button--white"
56
120
  type="button"
57
121
  >
58
122
  <span>