@pnx-mixtape/mxds 0.0.19 → 0.0.21

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 (120) hide show
  1. package/README.md +18 -6
  2. package/dist/build/accordion.entry.js +2 -2
  3. package/dist/build/accordion.entry.js.map +1 -1
  4. package/dist/build/base.css +2 -1
  5. package/dist/build/button.css +4 -4
  6. package/dist/build/card.css +6 -5
  7. package/dist/build/chunks/{Accordion-deu4CCT-.js → Accordion-O-huO4At.js} +2 -2
  8. package/dist/build/chunks/{Accordion-deu4CCT-.js.map → Accordion-O-huO4At.js.map} +1 -1
  9. package/dist/build/chunks/{disclosure-widget-WwE5XplD.js → disclosure-widget-DVpnRsTI.js} +2 -2
  10. package/dist/build/chunks/{disclosure-widget-WwE5XplD.js.map → disclosure-widget-DVpnRsTI.js.map} +1 -1
  11. package/dist/build/chunks/{drop-menu.entry-e1iZ4ERw.js → drop-menu.entry-B4TtnC50.js} +2 -2
  12. package/dist/build/chunks/{drop-menu.entry-e1iZ4ERw.js.map → drop-menu.entry-B4TtnC50.js.map} +1 -1
  13. package/dist/build/chunks/{utilities-BeWkujCZ.js → utilities-DXELy_An.js} +91 -1
  14. package/dist/build/chunks/utilities-DXELy_An.js.map +1 -0
  15. package/dist/build/constants.css +6 -4
  16. package/dist/build/dialog.css +1 -9
  17. package/dist/build/dialog.entry.js +1 -1
  18. package/dist/build/drop-menu.entry.js +1 -1
  19. package/dist/build/filters.entry.js +1 -1
  20. package/dist/build/global-alert.entry.js +1 -1
  21. package/dist/build/header.css +49 -63
  22. package/dist/build/header.entry.js +1107 -21
  23. package/dist/build/header.entry.js.map +1 -1
  24. package/dist/build/hero-banner.css +12 -6
  25. package/dist/build/in-page-navigation.entry.js +1 -1
  26. package/dist/build/navigation.entry.js +2 -2
  27. package/dist/build/page.css +2 -2
  28. package/dist/build/pagination.css +15 -21
  29. package/dist/build/steps.css +11 -11
  30. package/dist/build/sticky.entry.js +1 -1
  31. package/dist/build/tabs.entry.js +2 -2
  32. package/dist/build/utilities.css +9 -1
  33. package/package.json +18 -29
  34. package/src/Atom/Button/_buttons-styles.css +3 -3
  35. package/src/Atom/Heading/Heading.tsx +1 -1
  36. package/src/Atom/Icon/Icon.tsx +1 -1
  37. package/src/Atom/Link/Link.stories.tsx +2 -6
  38. package/src/Atom/Link/Link.tsx +9 -4
  39. package/src/Atom/Link/_links.css +1 -0
  40. package/src/Component/Accordion/Accordion.stories.tsx +39 -9
  41. package/src/Component/Accordion/Accordion.tsx +28 -50
  42. package/src/Component/Accordion/Components/AccordionContent.tsx +24 -0
  43. package/src/Component/Accordion/Components/AccordionTitle.tsx +34 -0
  44. package/src/Component/Accordion/Components/AccordionTitleIcon.tsx +22 -0
  45. package/src/Component/Accordion/__snapshots__/Accordion.stories.tsx.snap +26 -0
  46. package/src/Component/Breadcrumb/Breadcrumb.tsx +8 -2
  47. package/src/Component/Breadcrumb/__snapshots__/Breadcrumb.stories.tsx.snap +7 -3
  48. package/src/Component/Card/Card.stories.tsx +22 -19
  49. package/src/Component/Card/Card.tsx +6 -28
  50. package/src/Component/Card/Components/CardContent.tsx +12 -0
  51. package/src/Component/Card/Components/CardMedia.tsx +17 -0
  52. package/src/Component/Card/__snapshots__/Card.stories.tsx.snap +9 -9
  53. package/src/Component/Card/card.css +3 -2
  54. package/src/Component/ContentBlock/Components/ContentBlockContent.tsx +14 -0
  55. package/src/Component/ContentBlock/Components/ContentBlockMedia.tsx +20 -0
  56. package/src/Component/ContentBlock/ContentBlock.stories.tsx +16 -13
  57. package/src/Component/ContentBlock/ContentBlock.tsx +5 -28
  58. package/src/Component/ContentBlock/__snapshots__/ContentBlock.stories.tsx.snap +0 -2
  59. package/src/Component/Dialog/Components/DialogCloseButton.tsx +18 -0
  60. package/src/Component/Dialog/Components/DialogContent.tsx +7 -0
  61. package/src/Component/Dialog/Dialog.stories.tsx +19 -24
  62. package/src/Component/Dialog/Dialog.tsx +31 -25
  63. package/src/Component/Dialog/__snapshots__/Dialog.stories.tsx.snap +14 -21
  64. package/src/Component/Dialog/dialog.css +0 -8
  65. package/src/Component/HeroBanner/HeroBanner.stories.ts +23 -12
  66. package/src/Component/HeroBanner/HeroBanner.stories.tsx +26 -7
  67. package/src/Component/HeroBanner/HeroBanner.tsx +2 -20
  68. package/src/Component/HeroBanner/__snapshots__/HeroBanner.stories.ts.snap +51 -3
  69. package/src/Component/HeroBanner/hero-banner.css +8 -4
  70. package/src/Component/HeroBanner/hero-banner.twig +2 -2
  71. package/src/Component/HeroSearch/HeroSearch.stories.ts +105 -0
  72. package/src/Component/HeroSearch/HeroSearch.stories.tsx +48 -0
  73. package/src/Component/HeroSearch/HeroSearch.tsx +32 -0
  74. package/src/Component/HeroSearch/__snapshots__/HeroSearch.stories.ts.snap +176 -0
  75. package/src/Component/HeroSearch/__snapshots__/HeroSearch.stories.tsx.snap +36 -0
  76. package/src/Component/HeroSearch/hero-search.twig +43 -0
  77. package/src/Component/InPageNavigation/InPageNavigation.stories.tsx +1 -1
  78. package/src/Component/InPageNavigation/InPageNavigation.tsx +1 -0
  79. package/src/Component/InPageNavigation/__snapshots__/InPageNavigation.stories.tsx.snap +1 -1
  80. package/src/Component/LinkList/LinkList.stories.ts +12 -0
  81. package/src/Component/LinkList/LinkList.stories.tsx +0 -6
  82. package/src/Component/LinkList/LinkList.tsx +5 -16
  83. package/src/Component/LinkList/__snapshots__/LinkList.stories.ts.snap +37 -0
  84. package/src/Component/LinkList/__snapshots__/LinkList.stories.tsx.snap +9 -29
  85. package/src/Component/LinkList/link-list.twig +1 -0
  86. package/src/Component/ListItem/Components/ListItemContent.tsx +12 -0
  87. package/src/Component/ListItem/Components/ListItemMedia.tsx +20 -0
  88. package/src/Component/ListItem/ListItem.stories.tsx +22 -19
  89. package/src/Component/ListItem/ListItem.tsx +3 -32
  90. package/src/Component/ListItem/__snapshots__/ListItem.stories.tsx.snap +3 -0
  91. package/src/Component/Pagination/Components/PaginationContext.tsx +10 -4
  92. package/src/Component/Pagination/Components/PaginationItem.tsx +10 -10
  93. package/src/Component/Pagination/Pagination.tsx +6 -2
  94. package/src/Component/Pagination/__snapshots__/Pagination.stories.tsx.snap +10 -4
  95. package/src/Component/Pagination/pagination.css +13 -18
  96. package/src/Component/Steps/__snapshots__/Steps.stories.ts.snap +12 -12
  97. package/src/Component/Steps/step-item.twig +1 -1
  98. package/src/Component/Steps/steps.css +1 -2
  99. package/src/Component/Tabs/Components/TabPanel.tsx +1 -1
  100. package/src/Component/Tabs/__snapshots__/Tabs.stories.tsx.snap +2 -0
  101. package/src/Component/Tile/Tile.stories.tsx +20 -15
  102. package/src/Component/Tile/__snapshots__/Tile.stories.tsx.snap +18 -23
  103. package/src/Layout/Header/Elements/GlobalToggle.ts +55 -21
  104. package/src/Layout/Header/__snapshots__/Header.stories.ts.snap +14 -14
  105. package/src/Layout/Header/__snapshots__/Header.stories.tsx.snap +2 -2
  106. package/src/Layout/Header/_header.css +2 -47
  107. package/src/Layout/Header/_toggles.css +37 -1
  108. package/src/Layout/Header/header.twig +5 -5
  109. package/src/Layout/Page/Page.stories.tsx +13 -4
  110. package/src/Layout/Page/__snapshots__/Page.stories.tsx.snap +2 -2
  111. package/src/Layout/Page/page.css +1 -1
  112. package/src/Layout/Section/__snapshots__/Section.stories.tsx.snap +3 -3
  113. package/src/Layout/Section/__snapshots__/SectionGrid.stories.tsx.snap +2 -2
  114. package/src/Layout/Sidebar/__snapshots__/Sidebar.stories.tsx.snap +3 -3
  115. package/src/Utility/utilities.css +8 -0
  116. package/src/constants.css +5 -3
  117. package/src/react.ts +30 -7
  118. package/src/tokens.js +3 -1
  119. package/dist/build/chunks/utilities-BeWkujCZ.js.map +0 -1
  120. package/src/Component/Tile/Tile.tsx +0 -53
package/package.json CHANGED
@@ -1,27 +1,24 @@
1
1
  {
2
2
  "name": "@pnx-mixtape/mxds",
3
3
  "description": "The Mixtape Design System",
4
- "version": "0.0.19",
4
+ "version": "0.0.21",
5
5
  "dependencies": {
6
6
  "@floating-ui/dom": "^1.7.3",
7
7
  "@oddbird/popover-polyfill": "^0.6.1",
8
- "@pnx-mixtape/ids-shape": "^0.0.21",
8
+ "@pnx-mixtape/ids-shape": "^0.0.22",
9
9
  "@types/react": "^19.1.10",
10
10
  "@types/react-dom": "^19.1.7",
11
11
  "classnames": "^2.5.1",
12
+ "focus-trap": "^7.6.5",
12
13
  "js-cookie": "^3.0.5",
13
14
  "react": "^19.1.1",
14
15
  "react-aria": "^3.42.0",
15
16
  "react-dom": "^19.1.1",
16
- "react-stately": "^3.40.0",
17
- "tabbable": "^6.2.0"
17
+ "react-stately": "^3.40.0"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@csstools/postcss-global-data": "^3.0.0",
21
21
  "@csstools/stylelint-formatter-github": "^1.0.0",
22
- "@eslint-react/eslint-plugin": "^1.52.4",
23
- "@eslint/eslintrc": "^3.3.1",
24
- "@eslint/js": "^9.33.0",
25
22
  "@rollup/plugin-terser": "^0.4.4",
26
23
  "@storybook/addon-a11y": "^9.1.2",
27
24
  "@storybook/addon-docs": "^9.1.2",
@@ -37,7 +34,6 @@
37
34
  "@testing-library/react": "^16.3.0",
38
35
  "@testing-library/user-event": "^14.6.1",
39
36
  "@types/node": "^24.5.2",
40
- "@typescript-eslint/parser": "^8.39.1",
41
37
  "@vitejs/plugin-react": "^5.0.0",
42
38
  "@vitest/ui": "^3.2.4",
43
39
  "axe-playwright": "^2.1.0",
@@ -48,16 +44,9 @@
48
44
  "cz-conventional-changelog": "^3.3.0",
49
45
  "drupal-attribute": "^1.1.0",
50
46
  "drupal-twig-extensions": "1.0.0-beta.5",
51
- "eslint": "^9.33.0",
52
- "eslint-config-prettier": "^10.1.8",
53
- "eslint-formatter-gha": "^1.6.0",
54
- "eslint-plugin-react": "^7.37.5",
55
- "eslint-plugin-storybook": "^9.1.2",
56
- "eslint-plugin-testing-library": "^7.6.6",
57
- "eslint-plugin-unused-imports": "^4.1.4",
58
- "globals": "^16.3.0",
59
47
  "http-server": "^14.1.1",
60
48
  "jsdom": "^26.1.0",
49
+ "oxlint": "^1.23.0",
61
50
  "playwright": "^1.55.0",
62
51
  "postcss": "^8.5.6",
63
52
  "postcss-design-tokens": "^1.3.0",
@@ -73,7 +62,6 @@
73
62
  "tinyglobby": "^0.2.14",
74
63
  "twig": "^1.17.1",
75
64
  "typescript": "^5.9.2",
76
- "typescript-eslint": "^8.39.1",
77
65
  "vite": "^7.1.6",
78
66
  "vite-plugin-twig-drupal": "^1.6.2",
79
67
  "wait-on": "^9.0.0"
@@ -105,35 +93,36 @@
105
93
  "./src/*": "./src/*"
106
94
  },
107
95
  "scripts": {
108
- "dev": "concurrently -k -n \"VITE,STORYBOOK\" -c \"#636cff,#ff4785\" \"pnpm run dev-vite\" \"pnpm run dev-storybook\"",
109
- "build": "concurrently -n \"VITE,STORYBOOK\" -c \"#636cff,#ff4785\" \"pnpm run build-vite\" \"pnpm run build-storybook\"",
96
+ "dev": "concurrently -k -n \"VITE,STORYBOOK\" -c \"#636cff,#ff4785\" \"pnpm dev-vite\" \"pnpm dev-storybook\"",
97
+ "build": "concurrently -n \"VITE,STORYBOOK\" -c \"#636cff,#ff4785\" \"pnpm build-vite\" \"pnpm build-storybook\"",
110
98
  "dev-storybook-html": "storybook dev -p 6006",
111
99
  "dev-storybook-react": "storybook dev -p 6008 -c .storybook-react",
112
100
  "dev-storybook": "concurrently \"npm:dev-storybook-*\"",
113
- "build-storybook": "pnpm run build-storybook-html && pnpm run build-storybook-react",
101
+ "build-storybook": "pnpm build-storybook-html && pnpm build-storybook-react",
114
102
  "build-storybook-html": "storybook build -o dist/storybook",
115
103
  "build-storybook-react": "storybook build -o dist/storybook/react -c .storybook-react",
116
104
  "dev-vite": "vite build -w -m development",
117
105
  "build-vite": "vite build",
118
- "format": "prettier --write \"**/*.{css,ts,tsx,js,jsx,json,md,mdx}\" && pnpm run fix-css && pnpm run fix-js",
119
- "lint": "pnpm run lint-prettier && pnpm run lint-css && pnpm run lint-ts && pnpm run lint-js",
106
+ "format": "prettier --write \"**/*.{css,ts,tsx,js,jsx,json,md,mdx}\" && pnpm fix-css && pnpm fix-js",
107
+ "lint": "pnpm lint-prettier && pnpm lint-css && pnpm lint-ts && pnpm lint-js",
120
108
  "lint-prettier": "prettier --check \"**/*.{css,ts,tsx,js,jsx,json,md,mdx}\"",
121
109
  "lint-css": "stylelint \"./**/*.css\"",
122
110
  "lint-css-ci": "stylelint \"./**/*.css\" --custom-formatter @csstools/stylelint-formatter-github",
123
- "fix-css": "pnpm run lint-css --fix",
124
- "lint-js": "eslint \"./**/*.{ts,tsx}\"",
125
- "lint-js-ci": "eslint \"./**/*.{ts,tsx}\" --format gha",
126
- "fix-js": "pnpm run lint-js --fix",
111
+ "fix-css": "pnpm lint-css --fix",
112
+ "lint-js": "oxlint \"./**/*.{ts,tsx}\"",
113
+ "lint-js-ci": "oxlint \"./**/*.{ts,tsx}\" --format github",
114
+ "fix-js": "pnpm lint-js --fix",
127
115
  "lint-ts": "tsc",
128
- "test": "pnpm run test-storybook",
116
+ "test": "pnpm test-storybook",
129
117
  "test-vitest": "vitest --run",
130
118
  "test-storybook": "concurrently \"npm:test-storybook-*\"",
131
119
  "test-storybook-html": "test-storybook --maxWorkers=2",
132
120
  "test-storybook-react": "test-storybook --maxWorkers=2 --url http://127.0.0.1:6008 -c .storybook-react",
133
121
  "clean": "rm -rf ./dist",
134
122
  "commit": "git-cz",
123
+ "bump-version": "pnpm version patch -m \"chore: tag %s\"",
135
124
  "http-server": "http-server ./dist/storybook -i -p 3001 --silent",
136
- "build-ci": "pnpm run build",
137
- "lint-ci": "pnpm run lint-prettier && pnpm run lint-css-ci && pnpm run lint-ts && pnpm run lint-js-ci"
125
+ "build-ci": "pnpm build",
126
+ "lint-ci": "pnpm lint-prettier && pnpm lint-css-ci && pnpm lint-ts && pnpm lint-js-ci"
138
127
  }
139
128
  }
@@ -8,7 +8,7 @@
8
8
  --background: var(--colour-link);
9
9
  --foreground: var(--colour-foreground-reverse);
10
10
 
11
- &.button--outline {
11
+ &.mx-button--outline {
12
12
  --background: transparent;
13
13
  --foreground: var(--colour-primary);
14
14
  }
@@ -29,7 +29,7 @@
29
29
  --background: var(--colour-error);
30
30
  --foreground: var(--colour-foreground-reverse);
31
31
 
32
- &.button--outline {
32
+ &.mx-button--outline {
33
33
  --background: transparent;
34
34
  --foreground: var(--colour-error);
35
35
  }
@@ -40,7 +40,7 @@
40
40
  --background: var(--colour-foreground-reverse);
41
41
  --foreground: var(--colour-foreground);
42
42
 
43
- &.button--outline {
43
+ &.mx-button--outline {
44
44
  --background: transparent;
45
45
  --foreground: var(--colour-foreground-reverse);
46
46
  }
@@ -6,7 +6,7 @@ import { HeadingTypes } from "@pnx-mixtape/ids-shape"
6
6
 
7
7
  export type HeadingProps = PropsWithChildren & {
8
8
  as?: HeadingTypes
9
- modifier?: HeadingStyles
9
+ modifier?: HeadingTypes | HeadingStyles
10
10
  className?: string
11
11
  id?: string
12
12
  }
@@ -4,7 +4,7 @@ import { Icons } from "../../enums"
4
4
  import { Icon as IconType } from "@pnx-mixtape/ids-shape"
5
5
 
6
6
  export type IconProps = IconType & {
7
- icon: Icons[]
7
+ icon: Icons
8
8
  }
9
9
 
10
10
  const Icon = ({
@@ -1,6 +1,5 @@
1
1
  import { Meta, StoryObj } from "@storybook/react-vite"
2
2
  import Component from "./Link"
3
- import { LinkStyles } from "../../enums"
4
3
 
5
4
  const meta: Meta<typeof Component> = {
6
5
  title: "Atom/Link",
@@ -10,9 +9,6 @@ const meta: Meta<typeof Component> = {
10
9
  children: "Link",
11
10
  to: "http://example.com",
12
11
  },
13
- argTypes: {
14
- modifier: { options: Object.values(LinkStyles), control: "radio" },
15
- },
16
12
  }
17
13
  export default meta
18
14
  type Story = StoryObj<typeof meta>
@@ -20,11 +16,11 @@ type Story = StoryObj<typeof meta>
20
16
  export const Link: Story = {}
21
17
  export const External: Story = {
22
18
  args: {
23
- modifier: LinkStyles.EXTERNAL,
19
+ external: true,
24
20
  },
25
21
  }
26
22
  export const More: Story = {
27
23
  args: {
28
- modifier: LinkStyles.MORE,
24
+ more: true,
29
25
  },
30
26
  }
@@ -1,12 +1,13 @@
1
1
  import { JSX, ComponentPropsWithoutRef, PropsWithChildren } from "react"
2
2
  import classNames from "classnames"
3
3
  import { useLinkComponent } from "../../react"
4
- import { LinkStyles } from "../../enums"
5
4
 
6
5
  type LinkProps = ComponentPropsWithoutRef<"a"> &
7
6
  PropsWithChildren & {
8
7
  to: string
9
- modifier?: LinkStyles
8
+ more?: boolean
9
+ external?: boolean
10
+ download?: boolean
10
11
  className?: string
11
12
  allyText?: string
12
13
  }
@@ -15,7 +16,9 @@ const Link = ({
15
16
  to,
16
17
  children,
17
18
  allyText,
18
- modifier,
19
+ more,
20
+ external,
21
+ download,
19
22
  className = "mx-link",
20
23
  ...props
21
24
  }: LinkProps): JSX.Element => {
@@ -25,7 +28,9 @@ const Link = ({
25
28
  <LinkComponent
26
29
  to={to}
27
30
  className={classNames(className, {
28
- [`mx-link--${modifier}`]: modifier,
31
+ "mx-link--more": more,
32
+ "mx-link--external": external,
33
+ "mx-link--download": download,
29
34
  })}
30
35
  {...props}
31
36
  >
@@ -31,6 +31,7 @@
31
31
 
32
32
  .mx-link--more {
33
33
  font-weight: var(--font-weight-bold);
34
+ display: inline-flex;
34
35
 
35
36
  &:hover .mx-icon {
36
37
  transform: translateX(3px);
@@ -1,21 +1,51 @@
1
1
  import { Meta, StoryObj } from "@storybook/react-vite"
2
- import { AccordionStyles, HeadingLevels } from "../../enums"
3
2
  import Component from "./Accordion"
3
+ import AccordionTitle from "./Components/AccordionTitle"
4
+ import AccordionContent from "./Components/AccordionContent"
5
+ import AccordionTitleIcon from "./Components/AccordionTitleIcon"
4
6
  import "./accordion.css"
7
+ import { HeadingTypes } from "@pnx-mixtape/ids-shape"
5
8
 
6
9
  const meta: Meta<typeof Component> = {
7
10
  component: Component,
8
11
  tags: ["autodocs"],
9
12
  args: {
10
- title: "Open me!",
11
- modifier: AccordionStyles.DIVIDED,
12
- children:
13
- "I'm baby air plant hashtag letterpress blue bottle. Cloud bread dreamcatcher everyday carry lumbersexual, iceland cardigan swag chicharrones lo-fi fanny pack affogato freegan XOXO shaman. Shoreditch cloud bread waistcoat tbh XOXO. Chillwave pour-over umami pug glossier health goth.",
14
- },
15
- argTypes: {
16
- modifier: { options: Object.values(AccordionStyles) },
17
- headingLevel: { options: Object.values(HeadingLevels) },
13
+ children: (
14
+ <>
15
+ <AccordionTitle>
16
+ Open me!
17
+ <AccordionTitleIcon />
18
+ </AccordionTitle>
19
+ <AccordionContent>
20
+ I'm baby air plant hashtag letterpress blue bottle. Cloud bread
21
+ dreamcatcher everyday carry lumbersexual, iceland cardigan swag
22
+ chicharrones lo-fi fanny pack affogato freegan XOXO shaman. Shoreditch
23
+ cloud bread waistcoat tbh XOXO. Chillwave pour-over umami pug glossier
24
+ health goth.
25
+ </AccordionContent>
26
+ </>
27
+ ),
18
28
  },
19
29
  }
20
30
  export default meta
21
31
  export const Accordion: StoryObj<typeof meta> = {}
32
+
33
+ export const HeadingLevel: StoryObj<typeof meta> = {
34
+ args: {
35
+ children: (
36
+ <>
37
+ <AccordionTitle headingLevel={HeadingTypes.TWO}>
38
+ Open me!
39
+ <AccordionTitleIcon />
40
+ </AccordionTitle>
41
+ <AccordionContent>
42
+ I'm baby air plant hashtag letterpress blue bottle. Cloud bread
43
+ dreamcatcher everyday carry lumbersexual, iceland cardigan swag
44
+ chicharrones lo-fi fanny pack affogato freegan XOXO shaman. Shoreditch
45
+ cloud bread waistcoat tbh XOXO. Chillwave pour-over umami pug glossier
46
+ health goth.
47
+ </AccordionContent>
48
+ </>
49
+ ),
50
+ },
51
+ }
@@ -1,28 +1,37 @@
1
- import { JSX, PropsWithChildren, useEffect, useId, Fragment } from "react"
1
+ import {
2
+ JSX,
3
+ PropsWithChildren,
4
+ useEffect,
5
+ useId,
6
+ createContext,
7
+ use,
8
+ useMemo,
9
+ } from "react"
2
10
  import classNames from "classnames"
3
- import { AccordionStyles, HeadingLevels } from "../../enums"
4
11
  import useToggle from "../../Utility/Hooks/useToggle"
5
12
 
13
+ type AccordionContextValues = {
14
+ toggle: (value?: boolean) => void
15
+ on: boolean
16
+ id: string
17
+ }
18
+
19
+ export const AccordionContext = createContext<AccordionContextValues>(null)
20
+ export const useAccordion = () => use(AccordionContext)
21
+
6
22
  type AccordionProps = PropsWithChildren & {
7
- title: string
8
23
  active?: boolean
9
24
  id?: string
10
- headingLevel?: HeadingLevels
11
- modifier?: AccordionStyles
12
25
  }
13
26
 
14
27
  const Accordion = ({
15
- title,
16
28
  children,
17
29
  active = false,
18
30
  id = null,
19
- modifier = null,
20
- headingLevel = null,
21
31
  ...props
22
32
  }: AccordionProps): JSX.Element => {
23
33
  const [on, toggle] = useToggle(active)
24
34
  const accordionId: string = id || useId()
25
- const Heading = headingLevel ? headingLevel : Fragment
26
35
 
27
36
  useEffect(() => {
28
37
  if (typeof window === "undefined") return
@@ -31,52 +40,21 @@ const Accordion = ({
31
40
  }
32
41
  }, [accordionId])
33
42
 
43
+ const values = useMemo(
44
+ () => ({ on, toggle, id: accordionId }),
45
+ [on, toggle, accordionId],
46
+ )
47
+
34
48
  return (
35
- <div
36
- className={classNames("mx-accordion", {
37
- [`mx-accordion--${modifier}`]: modifier,
38
- })}
39
- data-open={on}
40
- {...props}
41
- >
42
- <Heading>
43
- <button
44
- type="button"
45
- className="mx-accordion__toggle"
46
- id={accordionId}
47
- aria-expanded={on}
48
- onClick={() => toggle()}
49
- onKeyDown={({ key }) => {
50
- if (key === "Enter") toggle()
51
- }}
52
- >
53
- {title}
54
- <span
55
- className={classNames(
56
- "mx-button",
57
- "mx-button--small",
58
- "mx-icon",
59
- "mx-button--icon-only",
60
- "mx-icon--chevron-down",
61
- )}
62
- aria-hidden="true"
63
- />
64
- </button>
65
- </Heading>
49
+ <AccordionContext value={values}>
66
50
  <div
67
- role="region"
68
- aria-labelledby={accordionId}
69
- className={classNames(
70
- "mx-accordion__content",
71
- "mx-rich-text",
72
- "mx-vertical-flow",
73
- )}
74
- // @ts-expect-error inert is allowed.
75
- inert={!on ? "" : null}
51
+ className={classNames("mx-accordion", "mx-accordion--divided")}
52
+ data-open={on}
53
+ {...props}
76
54
  >
77
55
  {children}
78
56
  </div>
79
- </div>
57
+ </AccordionContext>
80
58
  )
81
59
  }
82
60
 
@@ -0,0 +1,24 @@
1
+ import { JSX, PropsWithChildren } from "react"
2
+ import classNames from "classnames"
3
+ import { useAccordion } from "../Accordion"
4
+
5
+ const AccordionContent = ({ children }: PropsWithChildren): JSX.Element => {
6
+ const { id, on } = useAccordion()
7
+ return (
8
+ <div
9
+ role="region"
10
+ aria-labelledby={id}
11
+ className={classNames(
12
+ "mx-accordion__content",
13
+ "mx-rich-text",
14
+ "mx-vertical-flow",
15
+ )}
16
+ // @ts-expect-error inert is allowed.
17
+ inert={!on ? "" : null}
18
+ >
19
+ {children}
20
+ </div>
21
+ )
22
+ }
23
+
24
+ export default AccordionContent
@@ -0,0 +1,34 @@
1
+ import { JSX, PropsWithChildren, Fragment } from "react"
2
+ import { HeadingTypes } from "@pnx-mixtape/ids-shape"
3
+ import { useAccordion } from "../Accordion"
4
+
5
+ type AccordionTitleProps = PropsWithChildren & {
6
+ headingLevel?: HeadingTypes
7
+ }
8
+
9
+ const AccordionTitle = ({
10
+ children,
11
+ headingLevel = null,
12
+ }: AccordionTitleProps): JSX.Element => {
13
+ const { id, on, toggle } = useAccordion()
14
+ const Heading = headingLevel ? headingLevel : Fragment
15
+
16
+ return (
17
+ <Heading>
18
+ <button
19
+ type="button"
20
+ className="mx-accordion__toggle"
21
+ id={id}
22
+ aria-expanded={on}
23
+ onClick={() => toggle()}
24
+ onKeyDown={({ key }) => {
25
+ if (key === "Enter") toggle()
26
+ }}
27
+ >
28
+ {children}
29
+ </button>
30
+ </Heading>
31
+ )
32
+ }
33
+
34
+ export default AccordionTitle
@@ -0,0 +1,22 @@
1
+ import { JSX } from "react"
2
+ import classNames from "classnames"
3
+
4
+ type AccordionTitleIconProps = {
5
+ className?: string | string[]
6
+ }
7
+
8
+ const defaultClassNames = [
9
+ "mx-button",
10
+ "mx-button--small",
11
+ "mx-icon",
12
+ "mx-button--icon-only",
13
+ "mx-icon--chevron-down",
14
+ ]
15
+
16
+ const AccordionTitleIcon = ({
17
+ className = defaultClassNames,
18
+ }: AccordionTitleIconProps): JSX.Element => {
19
+ return <span className={classNames(className)} aria-hidden="true" />
20
+ }
21
+
22
+ export default AccordionTitleIcon
@@ -23,3 +23,29 @@ exports[`Component/Accordion Accordion smoke-test 1`] = `
23
23
  </div>
24
24
  </div>
25
25
  `;
26
+
27
+ exports[`Component/Accordion HeadingLevel smoke-test 1`] = `
28
+ <div class="mx-accordion mx-accordion--divided"
29
+ data-open="false"
30
+ >
31
+ <h2>
32
+ <button type="button"
33
+ class="mx-accordion__toggle"
34
+ id="unique-0"
35
+ aria-expanded="false"
36
+ >
37
+ Open me!
38
+ <span class="mx-button mx-button--small mx-icon mx-button--icon-only mx-icon--chevron-down"
39
+ aria-hidden="true"
40
+ >
41
+ </span>
42
+ </button>
43
+ </h2>
44
+ <div role="region"
45
+ aria-labelledby="unique-0"
46
+ class="mx-accordion__content mx-rich-text mx-vertical-flow"
47
+ >
48
+ I'm baby air plant hashtag letterpress blue bottle. Cloud bread dreamcatcher everyday carry lumbersexual, iceland cardigan swag chicharrones lo-fi fanny pack affogato freegan XOXO shaman. Shoreditch cloud bread waistcoat tbh XOXO. Chillwave pour-over umami pug glossier health goth.
49
+ </div>
50
+ </div>
51
+ `;
@@ -16,7 +16,13 @@ const Breadcrumb = ({
16
16
  ...props
17
17
  }: BreadcrumbProps): JSX.Element => (
18
18
  <nav
19
- className={classNames("nav", "nav--breadcrumb", "nav--inline", className)}
19
+ className={classNames(
20
+ "mx-nav",
21
+ "mx-nav--breadcrumb",
22
+ "mx-nav--inline",
23
+ className,
24
+ )}
25
+ aria-label="You are here"
20
26
  {...props}
21
27
  >
22
28
  <ul>
@@ -26,7 +32,7 @@ const Breadcrumb = ({
26
32
  <Link to={item.to}>{item.title}</Link>
27
33
  </li>
28
34
  ))}
29
- {title && <li className="nav__item--current">{title}</li>}
35
+ {title && <li>{title}</li>}
30
36
  </ul>
31
37
  </nav>
32
38
  )
@@ -1,7 +1,9 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
3
  exports[`Component/Breadcrumb Breadcrumb smoke-test 1`] = `
4
- <nav class="nav nav--breadcrumb nav--inline">
4
+ <nav class="mx-nav mx-nav--breadcrumb mx-nav--inline"
5
+ aria-label="You are here"
6
+ >
5
7
  <ul>
6
8
  <li>
7
9
  <a href="#"
@@ -24,7 +26,7 @@ exports[`Component/Breadcrumb Breadcrumb smoke-test 1`] = `
24
26
  Contact
25
27
  </a>
26
28
  </li>
27
- <li class="nav__item--current">
29
+ <li>
28
30
  Current page title
29
31
  </li>
30
32
  </ul>
@@ -32,7 +34,9 @@ exports[`Component/Breadcrumb Breadcrumb smoke-test 1`] = `
32
34
  `;
33
35
 
34
36
  exports[`Component/Breadcrumb NoCurrentPage smoke-test 1`] = `
35
- <nav class="nav nav--breadcrumb nav--inline">
37
+ <nav class="mx-nav mx-nav--breadcrumb mx-nav--inline"
38
+ aria-label="You are here"
39
+ >
36
40
  <ul>
37
41
  <li>
38
42
  <a href="#"
@@ -1,36 +1,39 @@
1
1
  import { Meta, StoryObj } from "@storybook/react-vite"
2
2
  import Component from "./Card"
3
+ import CardContent from "./Components/CardContent"
4
+ import CardMedia from "./Components/CardMedia"
5
+ import Heading from "../../Atom/Heading/Heading"
3
6
  import Link from "../../Atom/Link/Link"
4
7
  import Text from "../../Atom/Text/Text"
5
8
  import Media from "../../Atom/Media/Media"
6
9
  import "./card.css"
7
- import { HeadingStyles, LinkStyles } from "../../enums"
8
- import { AsTypes, HeadingTypes } from "@pnx-mixtape/ids-shape"
10
+ import { AsTypes } from "@pnx-mixtape/ids-shape"
9
11
 
10
12
  const meta: Meta<typeof Component> = {
11
13
  tags: ["autodocs"],
12
14
  component: Component,
13
15
  argTypes: {
14
16
  children: { table: { disable: true } },
15
- image: { table: { disable: true } },
16
- headingLevel: { options: Object.values(HeadingTypes) },
17
- headingModifier: { options: Object.values(HeadingStyles) },
18
17
  as: { options: Object.values(AsTypes) },
19
18
  },
20
19
  args: {
21
- title: "Key feature or Section Name",
22
20
  children: (
23
21
  <>
24
- <Text>
25
- A short description to help explain enough about the subject matter to
26
- encourage visitors to learn more.
27
- </Text>
28
- <Link modifier={LinkStyles.MORE} to="http://example.com">
29
- Learn More
30
- </Link>
22
+ <CardMedia skeleton>
23
+ <Media src="https://picsum.photos/id/56/558/418?grayscale" alt="" />
24
+ </CardMedia>
25
+ <CardContent>
26
+ <Heading>Key feature or Section Name</Heading>
27
+ <Text>
28
+ A short description to help explain enough about the subject matter
29
+ to encourage visitors to learn more.
30
+ </Text>
31
+ <Link more to="http://example.com">
32
+ Learn More
33
+ </Link>
34
+ </CardContent>
31
35
  </>
32
36
  ),
33
- image: <Media src="https://picsum.photos/id/56/558/418?grayscale" alt="" />,
34
37
  },
35
38
  }
36
39
 
@@ -38,14 +41,14 @@ export default meta
38
41
  type Story = StoryObj<typeof Component>
39
42
 
40
43
  export const Card: Story = {}
41
- export const Linked: Story = {
44
+
45
+ export const Reverse: Story = {
42
46
  args: {
43
- clickable: true,
47
+ reversed: true,
44
48
  },
45
49
  }
46
- export const Right: Story = {
50
+ export const BlockLink: Story = {
47
51
  args: {
48
- right: true,
49
- headingLevel: HeadingTypes.TWO,
52
+ block: true,
50
53
  },
51
54
  }