@madie/madie-design-system 1.0.0

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 (316) hide show
  1. package/.babelrc +10 -0
  2. package/.editorconfig +22 -0
  3. package/.eslintignore +5 -0
  4. package/.eslintrc.js +31 -0
  5. package/.storybook/.babelrc +4 -0
  6. package/.storybook/main.js +89 -0
  7. package/.storybook/preview-head.html +9 -0
  8. package/.storybook/preview.js +5 -0
  9. package/README.md +5 -0
  10. package/components/Accordion/Accordion.stories.js +20 -0
  11. package/components/Accordion/index.jsx +93 -0
  12. package/components/Alert/Alert.stories.js +61 -0
  13. package/components/Alert/index.js +46 -0
  14. package/components/Breadcrumb/Breadcrumb.md +28 -0
  15. package/components/Breadcrumb/Breadcrumb.stories.js +76 -0
  16. package/components/Breadcrumb/index.js +83 -0
  17. package/components/Button/Button.stories.js +121 -0
  18. package/components/Button/index.js +90 -0
  19. package/components/CalloutBox/CalloutBox.stories.js +94 -0
  20. package/components/CalloutBox/index.js +109 -0
  21. package/components/Card/Card.stories.js +163 -0
  22. package/components/Card/index.js +137 -0
  23. package/components/Dropdown/Dropdown.stories.js +94 -0
  24. package/components/Dropdown/index.js +85 -0
  25. package/components/Error/Collapsible.jsx +88 -0
  26. package/components/Error/ErrorUI.jsx +31 -0
  27. package/components/Error/error.js +26 -0
  28. package/components/FlashNotification/FlashNotificationUI.jsx +91 -0
  29. package/components/FlashNotification/index.js +30 -0
  30. package/components/Footer/Footer.stories.js +20 -0
  31. package/components/Footer/FooterUI.jsx +269 -0
  32. package/components/Footer/LegacyFooterUI.jsx +194 -0
  33. package/components/Footer/SocialLinks.jsx +60 -0
  34. package/components/Footer/Subscribe.jsx +34 -0
  35. package/components/Footer/footer.js +30 -0
  36. package/components/Header/Header.md +111 -0
  37. package/components/Header/Header.stories.js +32 -0
  38. package/components/Header/HeaderAccountMenu.jsx +169 -0
  39. package/components/Header/HeaderCancel.jsx +16 -0
  40. package/components/Header/HeaderContainer.jsx +63 -0
  41. package/components/Header/HeaderLogo.jsx +42 -0
  42. package/components/Header/HeaderMenuButton.js +50 -0
  43. package/components/Header/HeaderMenuItem.jsx +232 -0
  44. package/components/Header/HeaderMenuLink.js +50 -0
  45. package/components/Header/HeaderMenuSignOutButton.js +62 -0
  46. package/components/Header/HeaderMobileButton.js +37 -0
  47. package/components/Header/HeaderUI.jsx +167 -0
  48. package/components/Header/HelpIcon.jsx +32 -0
  49. package/components/Header/ImpersonatorBanner.jsx +57 -0
  50. package/components/Header/NavigationButtonIcon.jsx +27 -0
  51. package/components/Header/default-content.json +280 -0
  52. package/components/Header/header.js +40 -0
  53. package/components/Header/hooks.js +52 -0
  54. package/components/Header/utag-helpers.js +9 -0
  55. package/components/Infotip/Infotip.jsx +75 -0
  56. package/components/Infotip/Infotip.stories.js +50 -0
  57. package/components/Infotip/InfotipIcon.jsx +41 -0
  58. package/components/Infotip/index.js +3 -0
  59. package/components/Link/Link.stories.js +81 -0
  60. package/components/Link/index.js +61 -0
  61. package/components/Modal/LegacyModal.jsx +72 -0
  62. package/components/Modal/Modal.jsx +140 -0
  63. package/components/Modal/Modal.stories.js +159 -0
  64. package/components/Modal/index.jsx +22 -0
  65. package/components/NotificationBanner/NotificationBanner.stories.js +23 -0
  66. package/components/NotificationBanner/index.js +265 -0
  67. package/components/SanitizedContent/index.jsx +200 -0
  68. package/components/Search/Search.stories.js +21 -0
  69. package/components/Search/index.js +85 -0
  70. package/components/SessionDialog/sessionDialog.js +26 -0
  71. package/components/SessionDialogUI.jsx +261 -0
  72. package/components/SideNav/AnimationGroup/AnimationGroup.jsx +27 -0
  73. package/components/SideNav/Chart/ScoreChart.jsx +268 -0
  74. package/components/SideNav/Chart/__tests__/ScoreChart.test.js +22 -0
  75. package/components/SideNav/Chart/__tests__/__snapshots__/ScoreChart.test.js.snap +173 -0
  76. package/components/SideNav/Chart/index.js +3 -0
  77. package/components/SideNav/Content/LevelOneContent.jsx +208 -0
  78. package/components/SideNav/Content/LevelTwoContent.jsx +216 -0
  79. package/components/SideNav/Content/index.js +4 -0
  80. package/components/SideNav/Details/IndividualDetails.jsx +18 -0
  81. package/components/SideNav/Details/PracticeDetails.jsx +45 -0
  82. package/components/SideNav/Details/index.js +4 -0
  83. package/components/SideNav/Links/CmsSwitchLink.jsx +41 -0
  84. package/components/SideNav/Links/NavItemInline.jsx +54 -0
  85. package/components/SideNav/Links/NavLinkContainer.jsx +38 -0
  86. package/components/SideNav/Links/NavLinkDrawer.jsx +249 -0
  87. package/components/SideNav/Links/NavLinkInline.jsx +107 -0
  88. package/components/SideNav/Links/NavLinkToggle.jsx +34 -0
  89. package/components/SideNav/Links/index.js +13 -0
  90. package/components/SideNav/SideNav.md +50 -0
  91. package/components/SideNav/SideNav.stories.js +379 -0
  92. package/components/SideNav/UI/SideNavUI.jsx +333 -0
  93. package/components/SideNav/UI/default-content.json +99 -0
  94. package/components/SideNav/UI/index.js +3 -0
  95. package/components/SideNav/helpers.js +49 -0
  96. package/components/SideNav/index.js +53 -0
  97. package/components/Spinner/index.js +9 -0
  98. package/components/Tabs/Tab.js +26 -0
  99. package/components/Tabs/TabPanel.js +34 -0
  100. package/components/Tabs/Tabs.stories.js +120 -0
  101. package/components/Tabs/index.js +95 -0
  102. package/components/TextInput/TextInput.stories.js +118 -0
  103. package/components/TextInput/index.js +137 -0
  104. package/components/Tooltip/Tooltip.jsx +88 -0
  105. package/components/Tooltip/Tooltip.stories.js +80 -0
  106. package/components/Tooltip/index.js +3 -0
  107. package/components/Tooltip/position.js +68 -0
  108. package/components/UnwrappedSpinner/index.js +8 -0
  109. package/components/hooks/useGetConfig.js +74 -0
  110. package/components/index.js +126 -0
  111. package/dist/browser.js +3 -0
  112. package/dist/browser.js.LICENSE.txt +54 -0
  113. package/dist/browser.js.map +1 -0
  114. package/dist/index.js +3 -0
  115. package/dist/index.js.LICENSE.txt +54 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/react/index.js +3 -0
  118. package/dist/react/index.js.LICENSE.txt +71 -0
  119. package/dist/react/index.js.map +1 -0
  120. package/fonts/FontAwesome.otf +0 -0
  121. package/fonts/OFL.txt +92 -0
  122. package/fonts/Rubik-Black.ttf +0 -0
  123. package/fonts/Rubik-BlackItalic.ttf +0 -0
  124. package/fonts/Rubik-Bold.ttf +0 -0
  125. package/fonts/Rubik-BoldItalic.ttf +0 -0
  126. package/fonts/Rubik-Italic.ttf +0 -0
  127. package/fonts/Rubik-Light.ttf +0 -0
  128. package/fonts/Rubik-LightItalic.ttf +0 -0
  129. package/fonts/Rubik-Medium.ttf +0 -0
  130. package/fonts/Rubik-MediumItalic.ttf +0 -0
  131. package/fonts/Rubik-Regular.ttf +0 -0
  132. package/fonts/fontawesome-webfont.eot +0 -0
  133. package/fonts/fontawesome-webfont.svg +2671 -0
  134. package/fonts/fontawesome-webfont.ttf +0 -0
  135. package/fonts/fontawesome-webfont.woff +0 -0
  136. package/fonts/fontawesome-webfont.woff2 +0 -0
  137. package/images/favicon/android-chrome-192x192.png +0 -0
  138. package/images/favicon/android-chrome-256x256.png +0 -0
  139. package/images/favicon/apple-touch-icon.png +0 -0
  140. package/images/favicon/browserconfig.xml +9 -0
  141. package/images/favicon/favicon-16x16.png +0 -0
  142. package/images/favicon/favicon-32x32.png +0 -0
  143. package/images/favicon/favicon.ico +0 -0
  144. package/images/favicon/manifest.json +18 -0
  145. package/images/favicon/mstile-150x150.png +0 -0
  146. package/images/favicon/safari-pinned-tab.svg +32 -0
  147. package/images/hhs-logo-black.svg +10 -0
  148. package/images/hhs-logo-white.svg +10 -0
  149. package/images/icons/close-x.svg +6 -0
  150. package/images/icons/help-headset.svg +21 -0
  151. package/images/icons/svg/arrow-down.svg +1 -0
  152. package/images/icons/svg/arrow-download.svg +1 -0
  153. package/images/icons/svg/arrow-right.svg +1 -0
  154. package/images/icons/svg/calendar.svg +1 -0
  155. package/images/icons/svg/close.svg +1 -0
  156. package/images/icons/svg/download.svg +1 -0
  157. package/images/icons/svg/external.svg +1 -0
  158. package/images/icons/svg/file-upload.svg +1 -0
  159. package/images/icons/svg/print.svg +1 -0
  160. package/images/icons/svg/search.svg +7 -0
  161. package/images/icons/svg/tooltip-question.svg +6 -0
  162. package/images/icons/svg/trash.svg +1 -0
  163. package/images/icons/svg/upload.svg +1 -0
  164. package/images/qpp_logo_reversed.png +0 -0
  165. package/images/qpp_logo_rgb_color.png +0 -0
  166. package/index.js +31 -0
  167. package/jest/mediaFileTransformer.js +9 -0
  168. package/jest.config.js +188 -0
  169. package/lib/Chevron.jsx +32 -0
  170. package/lib/SvgComponents.jsx +539 -0
  171. package/lib/svg-definitions.svg +125 -0
  172. package/package.json +125 -0
  173. package/session/index.js +5 -0
  174. package/session/logout.js +65 -0
  175. package/session/refresh.js +49 -0
  176. package/session/ttl.js +37 -0
  177. package/styles/_global.scss +106 -0
  178. package/styles/_main.scss +15 -0
  179. package/styles/_paths.scss +1 -0
  180. package/styles/_qpp-style.scss +31 -0
  181. package/styles/components/_accordion.scss +289 -0
  182. package/styles/components/_alerts.scss +54 -0
  183. package/styles/components/_autocomplete.scss +47 -0
  184. package/styles/components/_breadcrumbs.scss +64 -0
  185. package/styles/components/_buttons.scss +580 -0
  186. package/styles/components/_error-page.scss +56 -0
  187. package/styles/components/_flash-notification.scss +98 -0
  188. package/styles/components/_fonts.scss +42 -0
  189. package/styles/components/_forms.scss +277 -0
  190. package/styles/components/_grid.scss +37 -0
  191. package/styles/components/_info-modal.scss +139 -0
  192. package/styles/components/_links.scss +12 -0
  193. package/styles/components/_modals.scss +18 -0
  194. package/styles/components/_notification-banner.scss +165 -0
  195. package/styles/components/_panels.scss +61 -0
  196. package/styles/components/_pie-chart.scss +13 -0
  197. package/styles/components/_score-chart.scss +164 -0
  198. package/styles/components/_spinner.scss +7 -0
  199. package/styles/components/_tables.scss +111 -0
  200. package/styles/components/_tabs.scss +69 -0
  201. package/styles/components/_text.scss +150 -0
  202. package/styles/components/_toggles.scss +3 -0
  203. package/styles/components/_tooltip.scss +23 -0
  204. package/styles/components/_variables.scss +157 -0
  205. package/styles/components/_wells.scss +92 -0
  206. package/styles/qppds/README.md +0 -0
  207. package/styles/qppds/base/_backgrounds.scss +7 -0
  208. package/styles/qppds/base/_fonts.scss +26 -0
  209. package/styles/qppds/base/_icon.scss +23 -0
  210. package/styles/qppds/base/_layout.scss +5 -0
  211. package/styles/qppds/base/_typography.scss +85 -0
  212. package/styles/qppds/base/index.scss +8 -0
  213. package/styles/qppds/components/_alert.scss +95 -0
  214. package/styles/qppds/components/_breadcrumbs.scss +70 -0
  215. package/styles/qppds/components/_button.scss +292 -0
  216. package/styles/qppds/components/_card.scss +175 -0
  217. package/styles/qppds/components/_dropdown.scss +55 -0
  218. package/styles/qppds/components/_footer.scss +597 -0
  219. package/styles/qppds/components/_header.scss +892 -0
  220. package/styles/qppds/components/_link.scss +52 -0
  221. package/styles/qppds/components/_modal.scss +118 -0
  222. package/styles/qppds/components/_page-header.scss +67 -0
  223. package/styles/qppds/components/_pagination.scss +227 -0
  224. package/styles/qppds/components/_search.scss +112 -0
  225. package/styles/qppds/components/_sidebar.scss +9 -0
  226. package/styles/qppds/components/_table.scss +139 -0
  227. package/styles/qppds/components/_tabs.scss +197 -0
  228. package/styles/qppds/components/_text-input.scss +60 -0
  229. package/styles/qppds/components/index.scss +16 -0
  230. package/styles/qppds/components/sidebar/_animations.scss +38 -0
  231. package/styles/qppds/components/sidebar/_cms.scss +61 -0
  232. package/styles/qppds/components/sidebar/_details.scss +58 -0
  233. package/styles/qppds/components/sidebar/_links.scss +444 -0
  234. package/styles/qppds/components/sidebar/_sidebar-animation.scss +125 -0
  235. package/styles/qppds/components/sidebar/_sidebar-tooltip.scss +33 -0
  236. package/styles/qppds/components/sidebar/_sidebar.scss +146 -0
  237. package/styles/qppds/components/sidebar/project-specific/_wi.scss +42 -0
  238. package/styles/qppds/index.scss +4 -0
  239. package/styles/qppds/settings/_functions.scss +4 -0
  240. package/styles/qppds/settings/_index.scss +3 -0
  241. package/styles/qppds/settings/mixins/_borders.scss +6 -0
  242. package/styles/qppds/settings/mixins/_focus.scss +28 -0
  243. package/styles/qppds/settings/mixins/_icons.scss +33 -0
  244. package/styles/qppds/settings/mixins/_index.scss +8 -0
  245. package/styles/qppds/settings/mixins/_layout.scss +74 -0
  246. package/styles/qppds/settings/mixins/_lists.scss +12 -0
  247. package/styles/qppds/settings/mixins/_table.scss +91 -0
  248. package/styles/qppds/settings/mixins/_type.scss +65 -0
  249. package/styles/qppds/settings/mixins/_visually-hidden.scss +30 -0
  250. package/styles/qppds/settings/variables/_color.scss +86 -0
  251. package/styles/qppds/settings/variables/_index.scss +3 -0
  252. package/styles/qppds/settings/variables/_layout.scss +67 -0
  253. package/styles/qppds/settings/variables/_type.scss +132 -0
  254. package/styles/qppds/utilities/_background-color.scss +134 -0
  255. package/styles/qppds/utilities/_color.scss +32 -0
  256. package/styles/qppds/utilities/_display-visibility.scss +83 -0
  257. package/styles/qppds/utilities/_flexbox.scss +240 -0
  258. package/styles/qppds/utilities/_font-family.scss +9 -0
  259. package/styles/qppds/utilities/_font-size.scss +8 -0
  260. package/styles/qppds/utilities/_font-weight.scss +8 -0
  261. package/styles/qppds/utilities/_height.scss +38 -0
  262. package/styles/qppds/utilities/_margin.scss +136 -0
  263. package/styles/qppds/utilities/_padding.scss +76 -0
  264. package/styles/qppds/utilities/_position.scss +24 -0
  265. package/styles/qppds/utilities/_text-align.scss +40 -0
  266. package/styles/qppds/utilities/_text-transform.scss +7 -0
  267. package/styles/qppds/utilities/_truncate.scss +8 -0
  268. package/styles/qppds/utilities/_width.scss +79 -0
  269. package/styles/qppds/utilities/index.scss +15 -0
  270. package/styles/qppds.scss +2 -0
  271. package/styles/third-party/_legacy-bootstrap.scss +19 -0
  272. package/styles/third-party/legacy-bootstrap/_buttons.scss +126 -0
  273. package/styles/third-party/legacy-bootstrap/_dropdowns.scss +211 -0
  274. package/styles/third-party/legacy-bootstrap/_forms.scss +510 -0
  275. package/styles/third-party/legacy-bootstrap/_grid.scss +73 -0
  276. package/styles/third-party/legacy-bootstrap/_mixins.scss +27 -0
  277. package/styles/third-party/legacy-bootstrap/_navbar.scss +644 -0
  278. package/styles/third-party/legacy-bootstrap/_navs.scss +193 -0
  279. package/styles/third-party/legacy-bootstrap/_normalize.scss +385 -0
  280. package/styles/third-party/legacy-bootstrap/_scaffolding.scss +116 -0
  281. package/styles/third-party/legacy-bootstrap/_variables.scss +858 -0
  282. package/styles/third-party/legacy-bootstrap/mixins/_buttons.scss +70 -0
  283. package/styles/third-party/legacy-bootstrap/mixins/_clearfix.scss +22 -0
  284. package/styles/third-party/legacy-bootstrap/mixins/_forms.scss +108 -0
  285. package/styles/third-party/legacy-bootstrap/mixins/_grid-framework.scss +86 -0
  286. package/styles/third-party/legacy-bootstrap/mixins/_grid.scss +112 -0
  287. package/styles/third-party/legacy-bootstrap/mixins/_labels.scss +12 -0
  288. package/styles/third-party/legacy-bootstrap/mixins/_nav-divider.scss +10 -0
  289. package/styles/third-party/legacy-bootstrap/mixins/_nav-vertical-align.scss +9 -0
  290. package/styles/third-party/legacy-bootstrap/mixins/_opacity.scss +7 -0
  291. package/styles/third-party/legacy-bootstrap/mixins/_panels.scss +30 -0
  292. package/styles/third-party/legacy-bootstrap/mixins/_reset-filter.scss +7 -0
  293. package/styles/third-party/legacy-bootstrap/mixins/_reset-text.scss +18 -0
  294. package/styles/third-party/legacy-bootstrap/mixins/_resize.scss +6 -0
  295. package/styles/third-party/legacy-bootstrap/mixins/_responsive-visibility.scss +25 -0
  296. package/styles/third-party/legacy-bootstrap/mixins/_size.scss +10 -0
  297. package/styles/third-party/legacy-bootstrap/mixins/_tab-focus.scss +9 -0
  298. package/styles/third-party/legacy-bootstrap/mixins/_table-row.scss +28 -0
  299. package/styles/third-party/legacy-bootstrap/mixins/_text-emphasis.scss +12 -0
  300. package/styles/third-party/legacy-bootstrap/mixins/_text-overflow.scss +8 -0
  301. package/styles/third-party/legacy-bootstrap/mixins/_vendor-prefixes.scss +182 -0
  302. package/styles/utility/_mixins.scss +46 -0
  303. package/styles/utility/_utilities.scss +73 -0
  304. package/test/components/Accordion.test.js +12 -0
  305. package/test/components/ErrorUI.test.js +33 -0
  306. package/test/components/FooterUI.test.js +90 -0
  307. package/test/components/HeaderUI.test.js +45 -0
  308. package/test/components/Infotip.test.js +73 -0
  309. package/test/components/SessionDialogUI.test.js +339 -0
  310. package/test/components/SideNavUI.test.js +23 -0
  311. package/test/components/Tooltip.test.js +147 -0
  312. package/test/index.test.js +8 -0
  313. package/test/session/session.test.js +221 -0
  314. package/test-setup.js +9 -0
  315. package/webpack.config.js +147 -0
  316. package/webpack.config.react.js +86 -0
package/.babelrc ADDED
@@ -0,0 +1,10 @@
1
+ {
2
+ "presets": [
3
+ "@babel/preset-react",
4
+ "@babel/preset-env"
5
+ ],
6
+ "plugins": [
7
+ "transform-es2015-modules-umd",
8
+ "transform-class-properties"
9
+ ]
10
+ }
package/.editorconfig ADDED
@@ -0,0 +1,22 @@
1
+ # EditorConfig helps developers define and maintain consistent
2
+ # coding styles between different editors and IDEs
3
+ # editorconfig.org
4
+
5
+ root = true
6
+
7
+ [*]
8
+ indent_style = space
9
+ indent_size = 4
10
+ end_of_line = lf
11
+ charset = utf-8
12
+ trim_trailing_whitespace = true
13
+ insert_final_newline = true
14
+
15
+ [*.scss]
16
+ indent_style = tab
17
+
18
+ [*.md]
19
+ trim_trailing_whitespace = false
20
+
21
+ [*.{pug, yml, yaml, rb, py}]
22
+ indent_size = 2
package/.eslintignore ADDED
@@ -0,0 +1,5 @@
1
+ _*
2
+ css
3
+ dist
4
+ node_modules
5
+ test
package/.eslintrc.js ADDED
@@ -0,0 +1,31 @@
1
+ module.exports = {
2
+ extends: ['eslint:recommended', 'plugin:react/recommended'],
3
+ parser: 'babel-eslint',
4
+ parserOptions: {
5
+ sourceType: 'module',
6
+ ecmaFeatures: {
7
+ jsx: true
8
+ }
9
+ },
10
+ env: {
11
+ es6: true,
12
+ node: true,
13
+ browser: true,
14
+ jquery: true,
15
+ mocha: true
16
+ },
17
+ rules: {
18
+ 'no-unused-vars': [
19
+ 'error',
20
+ {
21
+ args: 'none'
22
+ }
23
+ ],
24
+ 'linebreak-style': ['error', 'unix'],
25
+ 'no-console': 0,
26
+ 'no-prototype-builtins': [0]
27
+ },
28
+ settings: {
29
+ react: { version: 'detect' }
30
+ }
31
+ };
@@ -0,0 +1,4 @@
1
+ {
2
+ "presets": ["@babel/preset-react", "@babel/preset-env"],
3
+ "plugins": ["transform-class-properties"]
4
+ }
@@ -0,0 +1,89 @@
1
+ const path = require('path');
2
+ const CopyWebpackPlugin = require('copy-webpack-plugin');
3
+
4
+ module.exports = {
5
+ stories: [
6
+ '../components/**/*.stories.@(js|jsx|mdx)',
7
+ '../lib/**/*.stories.@(js|jsx|mdx)',
8
+ ],
9
+ addons: [
10
+ '@storybook/addon-actions',
11
+ '@storybook/addon-links',
12
+ '@storybook/addon-storysource',
13
+ '@storybook/addon-knobs',
14
+ '@storybook/addon-a11y',
15
+ '@storybook/addon-docs',
16
+ '@storybook/addon-backgrounds',
17
+ '@storybook/addon-viewport',
18
+ '@storybook/addon-postcss',
19
+ ],
20
+ webpackFinal: async (config) => {
21
+ // do mutation to the config
22
+
23
+ config.plugins.push(
24
+ new CopyWebpackPlugin([
25
+ {
26
+ from: path.join(__dirname, '..', '..', 'shared', 'fonts/'),
27
+ to: 'fonts/',
28
+ },
29
+ {
30
+ from: path.join(__dirname, '..', '..', 'shared', 'images/'),
31
+ to: 'images/',
32
+ force: true,
33
+ },
34
+ ])
35
+ );
36
+
37
+ config.module.rules.push({
38
+ test: /\.scss$/,
39
+ resolve: {
40
+ extensions: ['.scss', '.sass'],
41
+ },
42
+ use: [
43
+ { loader: 'style-loader' },
44
+ {
45
+ loader: 'css-loader',
46
+ options: { sourceMap: true, importLoaders: 1 },
47
+ },
48
+ {
49
+ loader: 'sass-loader',
50
+ options: {
51
+ sourceMap: true,
52
+ },
53
+ },
54
+ ],
55
+ });
56
+
57
+ config.module.rules.push({
58
+ test: /\.svg$/,
59
+ use: [
60
+ 'raw-loader',
61
+ {
62
+ loader: 'svgo-loader',
63
+ options: {
64
+ plugins: [
65
+ { removeTitle: true },
66
+ { convertColors: { shorthex: false } },
67
+ { convertPathData: false },
68
+ ],
69
+ },
70
+ },
71
+ ],
72
+ });
73
+
74
+ // Modify default storybook SVG loader so we can use the one expected by qpp-style
75
+ // NOTE: When updating storybook dependency, double check this override.
76
+ const staticAssetLoader = config.module.rules.find((rule) => {
77
+ const regExp = rule.test;
78
+ const isRegExp = regExp && typeof regExp.test === 'function';
79
+ return isRegExp && regExp.test('.svg');
80
+ });
81
+
82
+ if (staticAssetLoader) {
83
+ // remove svg matching from storybook's default static asset loader
84
+ staticAssetLoader.test = /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|cur|ani|pdf)(\?.*)?$/;
85
+ }
86
+
87
+ return config;
88
+ },
89
+ };
@@ -0,0 +1,9 @@
1
+ <!--
2
+ Boottrap navbar and dropdowns used by <Header> component require jQuery
3
+ TODO: <Header> should be refactored to no longer rely on bootstrap.
4
+ -->
5
+ <script
6
+ src="https://code.jquery.com/jquery-3.5.1.min.js"
7
+ integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
8
+ crossorigin="anonymous"
9
+ ></script>
@@ -0,0 +1,5 @@
1
+ import '../../shared/styles/_main.scss';
2
+
3
+ export const parameters = {
4
+ layout: 'fullscreen',
5
+ };
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # QPP-Style React
2
+
3
+ This directory contains react implementations of the components for QPP.
4
+
5
+ A storybook with examples is published at [https://cmsgov.github.io/qpp-style](https://cmsgov.github.io/qpp-style)
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import Accordion from '.';
3
+
4
+ export default {
5
+ title: 'Accordion',
6
+ component: Accordion,
7
+ };
8
+
9
+ export const Example = () => (
10
+ <div style={{ padding: '20px', maxWidth: '500px' }}>
11
+ <Accordion title="Accordion title">My accordion content</Accordion>
12
+ </div>
13
+ );
14
+
15
+ export const Focus = () => (
16
+ <div style={{ padding: '20px', maxWidth: '500px' }}>
17
+ <input />
18
+ <Accordion title="Accordion title">My accordion content</Accordion>
19
+ </div>
20
+ );
@@ -0,0 +1,93 @@
1
+ import React, { useState, useRef, useEffect } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Chevron } from '../../lib/Chevron.jsx';
4
+
5
+ const Accordion = (props) => {
6
+ const content = useRef(null);
7
+ const [setActive, setActiveState] = useState(props.isOpen ? 'active' : '');
8
+ const ariaPressed = setActive ? 'true' : 'false';
9
+ const getHeight = (node) => {
10
+ if (node) {
11
+ return `${node.scrollHeight}px`;
12
+ }
13
+ return 'auto';
14
+ };
15
+ const height = setActive ? getHeight(content.current) : '0px';
16
+ const rotate = setActive ? 'accordion-icon rotate' : 'accordion-icon';
17
+
18
+ function toggleAccordion() {
19
+ setActiveState(setActive === '' ? 'active' : '');
20
+ }
21
+
22
+ function openAccordion() {
23
+ setActiveState('active');
24
+ }
25
+
26
+ function closeAccordion() {
27
+ setActiveState('');
28
+ }
29
+
30
+ useEffect(() => {
31
+ if (props.isOpen) {
32
+ openAccordion();
33
+ } else {
34
+ closeAccordion();
35
+ }
36
+ }, [props.isOpen]);
37
+
38
+ return (
39
+ <div className="accordion-section" data-testid="accordion">
40
+ <button
41
+ className={`accordion ${setActive}`}
42
+ aria-label={props.title}
43
+ aria-pressed={ariaPressed}
44
+ aria-expanded={ariaPressed}
45
+ tabIndex="0"
46
+ onClick={toggleAccordion}
47
+ >
48
+ <div className="accordion-left-title">
49
+ <p className="accordion-title">{props.title}</p>
50
+ {props.subTitle && (
51
+ <p className="accordion-subtitle">{props.subTitle}</p>
52
+ )}
53
+ </div>
54
+ {props.centerItem && (
55
+ <div className="accordion-center">
56
+ <p>{props.centerItem}</p>
57
+ </div>
58
+ )}
59
+ {props.rightItem && (
60
+ <div className="accordion-right">
61
+ <p>{props.rightItem}</p>
62
+ </div>
63
+ )}
64
+ <div className="chevron-container">
65
+ <Chevron className={rotate} />
66
+ </div>
67
+ </button>
68
+ <div
69
+ ref={content}
70
+ style={{ maxHeight: height }}
71
+ className="accordion-content"
72
+ >
73
+ <div className="accordion-text dashed-border">{props.children}</div>
74
+ </div>
75
+ </div>
76
+ );
77
+ };
78
+
79
+ Accordion.propTypes = {
80
+ title: PropTypes.string.isRequired,
81
+ subTitle: PropTypes.string,
82
+ children: PropTypes.any.isRequired,
83
+ centerItem: PropTypes.string,
84
+ rightItem: PropTypes.string,
85
+ isOpen: PropTypes.bool,
86
+ };
87
+
88
+ Accordion.defaultProps = {
89
+ title: '',
90
+ isOpen: false,
91
+ };
92
+
93
+ export default Accordion;
@@ -0,0 +1,61 @@
1
+ import React from 'react';
2
+
3
+ import Alert from './index';
4
+
5
+ export default {
6
+ title: 'Alert',
7
+ component: Alert,
8
+ };
9
+
10
+ export const Default = () => (
11
+ <div className="qpp-u-padding--16">
12
+ <h1 className="h3">Information</h1>
13
+ <Alert
14
+ title='Information Alert'
15
+ description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi imperdiet consequat ex ut vestibulum. Sed vel erat aliquet arcu eleifend gravida."
16
+ />
17
+ <h2 className="h3">Warning</h2>
18
+ <Alert
19
+ variant="warning"
20
+ title={{ headingLevel: 'h3', text: 'Warning Alert' }}
21
+ >
22
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi imperdiet
23
+ consequat ex ut vestibulum. Sed vel erat aliquet arcu eleifend gravida.
24
+ </Alert>
25
+ <h2 className="h3">Error</h2>
26
+ <Alert variant="error" title={{ headingLevel: 'h3', text: 'Error Alert' }}>
27
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi imperdiet
28
+ consequat ex ut vestibulum. Sed vel erat aliquet arcu eleifend gravida.
29
+ </Alert>
30
+ <h2 className="h3">Success</h2>
31
+ <Alert
32
+ variant="success"
33
+ title={{ headingLevel: 'h3', text: 'Success Alert' }}
34
+ >
35
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi imperdiet
36
+ consequat ex ut vestibulum. Sed vel erat aliquet arcu eleifend gravida.
37
+ </Alert>
38
+ </div>
39
+ );
40
+
41
+ export const WithoutHeading = () => (
42
+ <div className="qpp-u-padding--16">
43
+ <h1 className="h3">Information</h1>
44
+ <Alert description="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi imperdiet consequat ex ut vestibulum. Sed vel erat aliquet arcu eleifend gravida." />
45
+ <h1 className="h3">Warning</h1>
46
+ <Alert variant="warning">
47
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi imperdiet
48
+ consequat ex ut vestibulum. Sed vel erat aliquet arcu eleifend gravida.
49
+ </Alert>
50
+ <h1 className="h3">Error</h1>
51
+ <Alert variant="error">
52
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi imperdiet
53
+ consequat ex ut vestibulum. Sed vel erat aliquet arcu eleifend gravida.
54
+ </Alert>
55
+ <h1 className="h3">Success</h1>
56
+ <Alert variant="success">
57
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi imperdiet
58
+ consequat ex ut vestibulum. Sed vel erat aliquet arcu eleifend gravida.
59
+ </Alert>
60
+ </div>
61
+ );
@@ -0,0 +1,46 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ const Alert = ({ title, children, description, variant, className, ...rest }) => {
5
+ const HeadingComponent = title?.headingLevel || 'h2';
6
+ return (
7
+ <div
8
+ className={`qpp-c-alert qpp-c-alert--${variant} ${className}`}
9
+ role="alert"
10
+ {...rest}
11
+ >
12
+ <div className="qpp-c-alert__body">
13
+ {title && (
14
+ <HeadingComponent className="h4 qpp-c-alert__heading">
15
+ {typeof title === 'object' ? title.text : title}
16
+ </HeadingComponent>
17
+ )}
18
+ {description && <p className="qpp-c-alert__text">{description}</p>}
19
+ {children}
20
+ </div>
21
+ </div>
22
+ );
23
+ };
24
+
25
+ Alert.propTypes = {
26
+ children: PropTypes.node,
27
+ className: PropTypes.string,
28
+ description: PropTypes.string,
29
+ title: PropTypes.oneOfType([
30
+ PropTypes.string,
31
+ PropTypes.shape({
32
+ text: PropTypes.string,
33
+ headingLevel: PropTypes.string,
34
+ }),
35
+ ]),
36
+ variant: PropTypes.oneOf(['info', 'warning', 'success', 'error']),
37
+ };
38
+ Alert.defaultProps = {
39
+ children: null,
40
+ className: '',
41
+ description: null,
42
+ title: null,
43
+ variant: 'info',
44
+ };
45
+
46
+ export default Alert;
@@ -0,0 +1,28 @@
1
+ # Breadcrumb Component
2
+
3
+ The Breadcrumb component is a secondary navigation scheme that reveals the user's location.
4
+
5
+ ### Props
6
+
7
+ | Property name | Type | Required | Default Value | Description |
8
+ | --------------------- | ---------- | -------- | ------------- | ------------------------------------------ |
9
+ | `breadcrumbClass` | `String` | `false` | '' | class to append to Breadcrumb nav element |
10
+ | `crumbs` | `Array` | `true` | | array of breadcrumbs |
11
+ | `dark` | `Boolean` | `false` | `false` | Use dark mode theme |
12
+ | `RouterLink` | `Function` | `false` | `null` | Link component to use instead of `<a>` |
13
+ | `routerExcludedLinks` | `Array` | `false` | `[]` | Array of paths to exclude from using Link |
14
+
15
+ ### Crumbs
16
+
17
+ Each crumb can be a string or an object with the following properties.
18
+
19
+ | Property name | Type | Required | Description |
20
+ | ------------- | -------- | -------- | -------------------------- |
21
+ | `url` | `String` | `true` | url |
22
+ | `title` | `String` | `true` | Menu item string displayed |
23
+ | `category` | `String` | `true` | Data tracking category |
24
+ | `label` | `String` | `true` | Data tracking label |
25
+
26
+ ### RouterLink
27
+
28
+ The `RouterLink` is only used by the Frontend to enable using push state for navigation. The `routerExcludedLinks` provides a way to opt certain links out of using the RouterLink.
@@ -0,0 +1,76 @@
1
+ import React from 'react';
2
+ import Breadcrumb from './index';
3
+ import { withKnobs, boolean } from '@storybook/addon-knobs';
4
+
5
+ export default {
6
+ title: 'Breadcrumb',
7
+ component: Breadcrumb,
8
+ decorators: [withKnobs],
9
+ };
10
+
11
+ export const ExampleLightBreadcrumb = () => (
12
+ <div className="qppds qpp-u-padding--16 qpp-u-fill--blue-80">
13
+ <Breadcrumb
14
+ newBreadcrumb={boolean('newBreadcrumb', true)}
15
+ crumbs={[
16
+ {
17
+ url: '/',
18
+ category: 'MainContent',
19
+ label: 'Home',
20
+ title: 'Home',
21
+ },
22
+ {
23
+ url: '/',
24
+ category: 'MainContent',
25
+ label: 'Mips Overview',
26
+ title: 'Mips Overview',
27
+ },
28
+ ]}
29
+ />
30
+ </div>
31
+ );
32
+
33
+ ExampleLightBreadcrumb.storyName = 'Light';
34
+
35
+ export const ExampleScreenreaderOnlyBreadcrumb = () => (
36
+ <div className="qppds qpp-u-padding--16 qpp-u-fill--blue-80">
37
+ <Breadcrumb
38
+ newBreadcrumb={boolean('newBreadcrumb', true)}
39
+ crumbs={[
40
+ {
41
+ url: '/',
42
+ category: 'MainContent',
43
+ label: 'Home',
44
+ title: 'Home',
45
+ },
46
+ 'Mips Overview',
47
+ ]}
48
+ />
49
+ </div>
50
+ );
51
+ ExampleScreenreaderOnlyBreadcrumb.storyName = 'SR Only Breadcrumb';
52
+
53
+ export const ExampleDarkBreadcrumb = () => (
54
+ <div className="qppds qpp-u-padding--16">
55
+ <Breadcrumb
56
+ newBreadcrumb={boolean('newBreadcrumb', true)}
57
+ dark
58
+ crumbs={[
59
+ {
60
+ url: '/',
61
+ category: 'MainContent',
62
+ label: 'Home',
63
+ title: 'Home',
64
+ },
65
+ {
66
+ url: '/',
67
+ category: 'MainContent',
68
+ label: 'Mips Overview',
69
+ title: 'Mips Overview',
70
+ },
71
+ ]}
72
+ />
73
+ </div>
74
+ );
75
+
76
+ ExampleDarkBreadcrumb.storyName = 'Dark';
@@ -0,0 +1,83 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ const Breadcrumb = ({
5
+ breadcrumbClass,
6
+ crumbs,
7
+ dark,
8
+ RouterLink,
9
+ routerExcludedLinks,
10
+ }) => {
11
+ return (
12
+ <nav
13
+ className={`qpp-c-breadcrumbs ${
14
+ !dark ? 'qpp-c-breadcrumbs--light' : ''
15
+ } ${breadcrumbClass}`}
16
+ aria-label="Breadcrumbs"
17
+ >
18
+ <ol className="qpp-c-breadcrumbs__list">
19
+ {crumbs.map((crumb, i) => {
20
+ if (crumb.url) {
21
+ if (RouterLink && !routerExcludedLinks.includes(crumb.url)) {
22
+ return (
23
+ <li className="qpp-c-breadcrumbs__list-item" key={crumb.title}>
24
+ <RouterLink
25
+ className="qpp-c-breadcrumbs__link"
26
+ to={crumb.url}
27
+ data-track-category={crumb.category}
28
+ data-track-action="Click"
29
+ data-track-label={crumb.label}
30
+ >
31
+ <span>{crumb.title}</span>
32
+ </RouterLink>
33
+ </li>
34
+ );
35
+ }
36
+ return (
37
+ <li className="qpp-c-breadcrumbs__list-item" key={crumb.title}>
38
+ <a
39
+ className="qpp-c-breadcrumbs__link"
40
+ href={crumb.url}
41
+ data-track-category={crumb.category}
42
+ data-track-action="Click"
43
+ data-track-label={crumb.label}
44
+ >
45
+ <span>{crumb.title}</span>
46
+ </a>
47
+ </li>
48
+ );
49
+ } else {
50
+ return (
51
+ <li
52
+ key={crumb}
53
+ className={`${
54
+ i === crumbs.length - 1 ? 'sr-only' : ''
55
+ } qpp-c-breadcrumbs__list-itemqpp-c-breadcrumbs__list-item--current`}
56
+ aria-current="page"
57
+ >
58
+ <span>{crumb}</span>
59
+ </li>
60
+ );
61
+ }
62
+ })}
63
+ </ol>
64
+ </nav>
65
+ );
66
+ };
67
+
68
+ Breadcrumb.propTypes = {
69
+ breadcrumbClass: PropTypes.string,
70
+ crumbs: PropTypes.array.isRequired,
71
+ dark: PropTypes.bool,
72
+ RouterLink: PropTypes.func,
73
+ routerExcludedLinks: PropTypes.array,
74
+ };
75
+
76
+ Breadcrumb.defaultProps = {
77
+ breadcrumbClass: '',
78
+ dark: false,
79
+ RouterLink: null,
80
+ routerExcludedLinks: [],
81
+ };
82
+
83
+ export default Breadcrumb;