@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.
- package/.babelrc +10 -0
- package/.editorconfig +22 -0
- package/.eslintignore +5 -0
- package/.eslintrc.js +31 -0
- package/.storybook/.babelrc +4 -0
- package/.storybook/main.js +89 -0
- package/.storybook/preview-head.html +9 -0
- package/.storybook/preview.js +5 -0
- package/README.md +5 -0
- package/components/Accordion/Accordion.stories.js +20 -0
- package/components/Accordion/index.jsx +93 -0
- package/components/Alert/Alert.stories.js +61 -0
- package/components/Alert/index.js +46 -0
- package/components/Breadcrumb/Breadcrumb.md +28 -0
- package/components/Breadcrumb/Breadcrumb.stories.js +76 -0
- package/components/Breadcrumb/index.js +83 -0
- package/components/Button/Button.stories.js +121 -0
- package/components/Button/index.js +90 -0
- package/components/CalloutBox/CalloutBox.stories.js +94 -0
- package/components/CalloutBox/index.js +109 -0
- package/components/Card/Card.stories.js +163 -0
- package/components/Card/index.js +137 -0
- package/components/Dropdown/Dropdown.stories.js +94 -0
- package/components/Dropdown/index.js +85 -0
- package/components/Error/Collapsible.jsx +88 -0
- package/components/Error/ErrorUI.jsx +31 -0
- package/components/Error/error.js +26 -0
- package/components/FlashNotification/FlashNotificationUI.jsx +91 -0
- package/components/FlashNotification/index.js +30 -0
- package/components/Footer/Footer.stories.js +20 -0
- package/components/Footer/FooterUI.jsx +269 -0
- package/components/Footer/LegacyFooterUI.jsx +194 -0
- package/components/Footer/SocialLinks.jsx +60 -0
- package/components/Footer/Subscribe.jsx +34 -0
- package/components/Footer/footer.js +30 -0
- package/components/Header/Header.md +111 -0
- package/components/Header/Header.stories.js +32 -0
- package/components/Header/HeaderAccountMenu.jsx +169 -0
- package/components/Header/HeaderCancel.jsx +16 -0
- package/components/Header/HeaderContainer.jsx +63 -0
- package/components/Header/HeaderLogo.jsx +42 -0
- package/components/Header/HeaderMenuButton.js +50 -0
- package/components/Header/HeaderMenuItem.jsx +232 -0
- package/components/Header/HeaderMenuLink.js +50 -0
- package/components/Header/HeaderMenuSignOutButton.js +62 -0
- package/components/Header/HeaderMobileButton.js +37 -0
- package/components/Header/HeaderUI.jsx +167 -0
- package/components/Header/HelpIcon.jsx +32 -0
- package/components/Header/ImpersonatorBanner.jsx +57 -0
- package/components/Header/NavigationButtonIcon.jsx +27 -0
- package/components/Header/default-content.json +280 -0
- package/components/Header/header.js +40 -0
- package/components/Header/hooks.js +52 -0
- package/components/Header/utag-helpers.js +9 -0
- package/components/Infotip/Infotip.jsx +75 -0
- package/components/Infotip/Infotip.stories.js +50 -0
- package/components/Infotip/InfotipIcon.jsx +41 -0
- package/components/Infotip/index.js +3 -0
- package/components/Link/Link.stories.js +81 -0
- package/components/Link/index.js +61 -0
- package/components/Modal/LegacyModal.jsx +72 -0
- package/components/Modal/Modal.jsx +140 -0
- package/components/Modal/Modal.stories.js +159 -0
- package/components/Modal/index.jsx +22 -0
- package/components/NotificationBanner/NotificationBanner.stories.js +23 -0
- package/components/NotificationBanner/index.js +265 -0
- package/components/SanitizedContent/index.jsx +200 -0
- package/components/Search/Search.stories.js +21 -0
- package/components/Search/index.js +85 -0
- package/components/SessionDialog/sessionDialog.js +26 -0
- package/components/SessionDialogUI.jsx +261 -0
- package/components/SideNav/AnimationGroup/AnimationGroup.jsx +27 -0
- package/components/SideNav/Chart/ScoreChart.jsx +268 -0
- package/components/SideNav/Chart/__tests__/ScoreChart.test.js +22 -0
- package/components/SideNav/Chart/__tests__/__snapshots__/ScoreChart.test.js.snap +173 -0
- package/components/SideNav/Chart/index.js +3 -0
- package/components/SideNav/Content/LevelOneContent.jsx +208 -0
- package/components/SideNav/Content/LevelTwoContent.jsx +216 -0
- package/components/SideNav/Content/index.js +4 -0
- package/components/SideNav/Details/IndividualDetails.jsx +18 -0
- package/components/SideNav/Details/PracticeDetails.jsx +45 -0
- package/components/SideNav/Details/index.js +4 -0
- package/components/SideNav/Links/CmsSwitchLink.jsx +41 -0
- package/components/SideNav/Links/NavItemInline.jsx +54 -0
- package/components/SideNav/Links/NavLinkContainer.jsx +38 -0
- package/components/SideNav/Links/NavLinkDrawer.jsx +249 -0
- package/components/SideNav/Links/NavLinkInline.jsx +107 -0
- package/components/SideNav/Links/NavLinkToggle.jsx +34 -0
- package/components/SideNav/Links/index.js +13 -0
- package/components/SideNav/SideNav.md +50 -0
- package/components/SideNav/SideNav.stories.js +379 -0
- package/components/SideNav/UI/SideNavUI.jsx +333 -0
- package/components/SideNav/UI/default-content.json +99 -0
- package/components/SideNav/UI/index.js +3 -0
- package/components/SideNav/helpers.js +49 -0
- package/components/SideNav/index.js +53 -0
- package/components/Spinner/index.js +9 -0
- package/components/Tabs/Tab.js +26 -0
- package/components/Tabs/TabPanel.js +34 -0
- package/components/Tabs/Tabs.stories.js +120 -0
- package/components/Tabs/index.js +95 -0
- package/components/TextInput/TextInput.stories.js +118 -0
- package/components/TextInput/index.js +137 -0
- package/components/Tooltip/Tooltip.jsx +88 -0
- package/components/Tooltip/Tooltip.stories.js +80 -0
- package/components/Tooltip/index.js +3 -0
- package/components/Tooltip/position.js +68 -0
- package/components/UnwrappedSpinner/index.js +8 -0
- package/components/hooks/useGetConfig.js +74 -0
- package/components/index.js +126 -0
- package/dist/browser.js +3 -0
- package/dist/browser.js.LICENSE.txt +54 -0
- package/dist/browser.js.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.LICENSE.txt +54 -0
- package/dist/index.js.map +1 -0
- package/dist/react/index.js +3 -0
- package/dist/react/index.js.LICENSE.txt +71 -0
- package/dist/react/index.js.map +1 -0
- package/fonts/FontAwesome.otf +0 -0
- package/fonts/OFL.txt +92 -0
- package/fonts/Rubik-Black.ttf +0 -0
- package/fonts/Rubik-BlackItalic.ttf +0 -0
- package/fonts/Rubik-Bold.ttf +0 -0
- package/fonts/Rubik-BoldItalic.ttf +0 -0
- package/fonts/Rubik-Italic.ttf +0 -0
- package/fonts/Rubik-Light.ttf +0 -0
- package/fonts/Rubik-LightItalic.ttf +0 -0
- package/fonts/Rubik-Medium.ttf +0 -0
- package/fonts/Rubik-MediumItalic.ttf +0 -0
- package/fonts/Rubik-Regular.ttf +0 -0
- package/fonts/fontawesome-webfont.eot +0 -0
- package/fonts/fontawesome-webfont.svg +2671 -0
- package/fonts/fontawesome-webfont.ttf +0 -0
- package/fonts/fontawesome-webfont.woff +0 -0
- package/fonts/fontawesome-webfont.woff2 +0 -0
- package/images/favicon/android-chrome-192x192.png +0 -0
- package/images/favicon/android-chrome-256x256.png +0 -0
- package/images/favicon/apple-touch-icon.png +0 -0
- package/images/favicon/browserconfig.xml +9 -0
- package/images/favicon/favicon-16x16.png +0 -0
- package/images/favicon/favicon-32x32.png +0 -0
- package/images/favicon/favicon.ico +0 -0
- package/images/favicon/manifest.json +18 -0
- package/images/favicon/mstile-150x150.png +0 -0
- package/images/favicon/safari-pinned-tab.svg +32 -0
- package/images/hhs-logo-black.svg +10 -0
- package/images/hhs-logo-white.svg +10 -0
- package/images/icons/close-x.svg +6 -0
- package/images/icons/help-headset.svg +21 -0
- package/images/icons/svg/arrow-down.svg +1 -0
- package/images/icons/svg/arrow-download.svg +1 -0
- package/images/icons/svg/arrow-right.svg +1 -0
- package/images/icons/svg/calendar.svg +1 -0
- package/images/icons/svg/close.svg +1 -0
- package/images/icons/svg/download.svg +1 -0
- package/images/icons/svg/external.svg +1 -0
- package/images/icons/svg/file-upload.svg +1 -0
- package/images/icons/svg/print.svg +1 -0
- package/images/icons/svg/search.svg +7 -0
- package/images/icons/svg/tooltip-question.svg +6 -0
- package/images/icons/svg/trash.svg +1 -0
- package/images/icons/svg/upload.svg +1 -0
- package/images/qpp_logo_reversed.png +0 -0
- package/images/qpp_logo_rgb_color.png +0 -0
- package/index.js +31 -0
- package/jest/mediaFileTransformer.js +9 -0
- package/jest.config.js +188 -0
- package/lib/Chevron.jsx +32 -0
- package/lib/SvgComponents.jsx +539 -0
- package/lib/svg-definitions.svg +125 -0
- package/package.json +125 -0
- package/session/index.js +5 -0
- package/session/logout.js +65 -0
- package/session/refresh.js +49 -0
- package/session/ttl.js +37 -0
- package/styles/_global.scss +106 -0
- package/styles/_main.scss +15 -0
- package/styles/_paths.scss +1 -0
- package/styles/_qpp-style.scss +31 -0
- package/styles/components/_accordion.scss +289 -0
- package/styles/components/_alerts.scss +54 -0
- package/styles/components/_autocomplete.scss +47 -0
- package/styles/components/_breadcrumbs.scss +64 -0
- package/styles/components/_buttons.scss +580 -0
- package/styles/components/_error-page.scss +56 -0
- package/styles/components/_flash-notification.scss +98 -0
- package/styles/components/_fonts.scss +42 -0
- package/styles/components/_forms.scss +277 -0
- package/styles/components/_grid.scss +37 -0
- package/styles/components/_info-modal.scss +139 -0
- package/styles/components/_links.scss +12 -0
- package/styles/components/_modals.scss +18 -0
- package/styles/components/_notification-banner.scss +165 -0
- package/styles/components/_panels.scss +61 -0
- package/styles/components/_pie-chart.scss +13 -0
- package/styles/components/_score-chart.scss +164 -0
- package/styles/components/_spinner.scss +7 -0
- package/styles/components/_tables.scss +111 -0
- package/styles/components/_tabs.scss +69 -0
- package/styles/components/_text.scss +150 -0
- package/styles/components/_toggles.scss +3 -0
- package/styles/components/_tooltip.scss +23 -0
- package/styles/components/_variables.scss +157 -0
- package/styles/components/_wells.scss +92 -0
- package/styles/qppds/README.md +0 -0
- package/styles/qppds/base/_backgrounds.scss +7 -0
- package/styles/qppds/base/_fonts.scss +26 -0
- package/styles/qppds/base/_icon.scss +23 -0
- package/styles/qppds/base/_layout.scss +5 -0
- package/styles/qppds/base/_typography.scss +85 -0
- package/styles/qppds/base/index.scss +8 -0
- package/styles/qppds/components/_alert.scss +95 -0
- package/styles/qppds/components/_breadcrumbs.scss +70 -0
- package/styles/qppds/components/_button.scss +292 -0
- package/styles/qppds/components/_card.scss +175 -0
- package/styles/qppds/components/_dropdown.scss +55 -0
- package/styles/qppds/components/_footer.scss +597 -0
- package/styles/qppds/components/_header.scss +892 -0
- package/styles/qppds/components/_link.scss +52 -0
- package/styles/qppds/components/_modal.scss +118 -0
- package/styles/qppds/components/_page-header.scss +67 -0
- package/styles/qppds/components/_pagination.scss +227 -0
- package/styles/qppds/components/_search.scss +112 -0
- package/styles/qppds/components/_sidebar.scss +9 -0
- package/styles/qppds/components/_table.scss +139 -0
- package/styles/qppds/components/_tabs.scss +197 -0
- package/styles/qppds/components/_text-input.scss +60 -0
- package/styles/qppds/components/index.scss +16 -0
- package/styles/qppds/components/sidebar/_animations.scss +38 -0
- package/styles/qppds/components/sidebar/_cms.scss +61 -0
- package/styles/qppds/components/sidebar/_details.scss +58 -0
- package/styles/qppds/components/sidebar/_links.scss +444 -0
- package/styles/qppds/components/sidebar/_sidebar-animation.scss +125 -0
- package/styles/qppds/components/sidebar/_sidebar-tooltip.scss +33 -0
- package/styles/qppds/components/sidebar/_sidebar.scss +146 -0
- package/styles/qppds/components/sidebar/project-specific/_wi.scss +42 -0
- package/styles/qppds/index.scss +4 -0
- package/styles/qppds/settings/_functions.scss +4 -0
- package/styles/qppds/settings/_index.scss +3 -0
- package/styles/qppds/settings/mixins/_borders.scss +6 -0
- package/styles/qppds/settings/mixins/_focus.scss +28 -0
- package/styles/qppds/settings/mixins/_icons.scss +33 -0
- package/styles/qppds/settings/mixins/_index.scss +8 -0
- package/styles/qppds/settings/mixins/_layout.scss +74 -0
- package/styles/qppds/settings/mixins/_lists.scss +12 -0
- package/styles/qppds/settings/mixins/_table.scss +91 -0
- package/styles/qppds/settings/mixins/_type.scss +65 -0
- package/styles/qppds/settings/mixins/_visually-hidden.scss +30 -0
- package/styles/qppds/settings/variables/_color.scss +86 -0
- package/styles/qppds/settings/variables/_index.scss +3 -0
- package/styles/qppds/settings/variables/_layout.scss +67 -0
- package/styles/qppds/settings/variables/_type.scss +132 -0
- package/styles/qppds/utilities/_background-color.scss +134 -0
- package/styles/qppds/utilities/_color.scss +32 -0
- package/styles/qppds/utilities/_display-visibility.scss +83 -0
- package/styles/qppds/utilities/_flexbox.scss +240 -0
- package/styles/qppds/utilities/_font-family.scss +9 -0
- package/styles/qppds/utilities/_font-size.scss +8 -0
- package/styles/qppds/utilities/_font-weight.scss +8 -0
- package/styles/qppds/utilities/_height.scss +38 -0
- package/styles/qppds/utilities/_margin.scss +136 -0
- package/styles/qppds/utilities/_padding.scss +76 -0
- package/styles/qppds/utilities/_position.scss +24 -0
- package/styles/qppds/utilities/_text-align.scss +40 -0
- package/styles/qppds/utilities/_text-transform.scss +7 -0
- package/styles/qppds/utilities/_truncate.scss +8 -0
- package/styles/qppds/utilities/_width.scss +79 -0
- package/styles/qppds/utilities/index.scss +15 -0
- package/styles/qppds.scss +2 -0
- package/styles/third-party/_legacy-bootstrap.scss +19 -0
- package/styles/third-party/legacy-bootstrap/_buttons.scss +126 -0
- package/styles/third-party/legacy-bootstrap/_dropdowns.scss +211 -0
- package/styles/third-party/legacy-bootstrap/_forms.scss +510 -0
- package/styles/third-party/legacy-bootstrap/_grid.scss +73 -0
- package/styles/third-party/legacy-bootstrap/_mixins.scss +27 -0
- package/styles/third-party/legacy-bootstrap/_navbar.scss +644 -0
- package/styles/third-party/legacy-bootstrap/_navs.scss +193 -0
- package/styles/third-party/legacy-bootstrap/_normalize.scss +385 -0
- package/styles/third-party/legacy-bootstrap/_scaffolding.scss +116 -0
- package/styles/third-party/legacy-bootstrap/_variables.scss +858 -0
- package/styles/third-party/legacy-bootstrap/mixins/_buttons.scss +70 -0
- package/styles/third-party/legacy-bootstrap/mixins/_clearfix.scss +22 -0
- package/styles/third-party/legacy-bootstrap/mixins/_forms.scss +108 -0
- package/styles/third-party/legacy-bootstrap/mixins/_grid-framework.scss +86 -0
- package/styles/third-party/legacy-bootstrap/mixins/_grid.scss +112 -0
- package/styles/third-party/legacy-bootstrap/mixins/_labels.scss +12 -0
- package/styles/third-party/legacy-bootstrap/mixins/_nav-divider.scss +10 -0
- package/styles/third-party/legacy-bootstrap/mixins/_nav-vertical-align.scss +9 -0
- package/styles/third-party/legacy-bootstrap/mixins/_opacity.scss +7 -0
- package/styles/third-party/legacy-bootstrap/mixins/_panels.scss +30 -0
- package/styles/third-party/legacy-bootstrap/mixins/_reset-filter.scss +7 -0
- package/styles/third-party/legacy-bootstrap/mixins/_reset-text.scss +18 -0
- package/styles/third-party/legacy-bootstrap/mixins/_resize.scss +6 -0
- package/styles/third-party/legacy-bootstrap/mixins/_responsive-visibility.scss +25 -0
- package/styles/third-party/legacy-bootstrap/mixins/_size.scss +10 -0
- package/styles/third-party/legacy-bootstrap/mixins/_tab-focus.scss +9 -0
- package/styles/third-party/legacy-bootstrap/mixins/_table-row.scss +28 -0
- package/styles/third-party/legacy-bootstrap/mixins/_text-emphasis.scss +12 -0
- package/styles/third-party/legacy-bootstrap/mixins/_text-overflow.scss +8 -0
- package/styles/third-party/legacy-bootstrap/mixins/_vendor-prefixes.scss +182 -0
- package/styles/utility/_mixins.scss +46 -0
- package/styles/utility/_utilities.scss +73 -0
- package/test/components/Accordion.test.js +12 -0
- package/test/components/ErrorUI.test.js +33 -0
- package/test/components/FooterUI.test.js +90 -0
- package/test/components/HeaderUI.test.js +45 -0
- package/test/components/Infotip.test.js +73 -0
- package/test/components/SessionDialogUI.test.js +339 -0
- package/test/components/SideNavUI.test.js +23 -0
- package/test/components/Tooltip.test.js +147 -0
- package/test/index.test.js +8 -0
- package/test/session/session.test.js +221 -0
- package/test-setup.js +9 -0
- package/webpack.config.js +147 -0
- package/webpack.config.react.js +86 -0
package/.babelrc
ADDED
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/.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,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>
|
package/README.md
ADDED
|
@@ -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;
|