@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
@@ -0,0 +1,269 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import axios from 'axios';
4
+
5
+ import InfoTip from '../Infotip/Infotip';
6
+ import LegacyFooterUI from './LegacyFooterUI';
7
+ import Subscribe from './Subscribe';
8
+ import SocialLinks from './SocialLinks';
9
+
10
+ const infoTipLabel =
11
+ 'When dialing 711, you will automatically be connected to a TRS Communications Assistant who will relay your conversation to the help desk agent with strict confidentiality.';
12
+
13
+ const FooterUI = (props) => {
14
+ const isNewFooter = props.isNewFooter;
15
+ const isIESupportPage = props.isIESupportPage;
16
+ const signUpNowLink = props.showHcdResearch
17
+ ? '/about/hcd-research'
18
+ : 'mailto:QPPUserResearch@cms.hhs.gov?subject=Sign up for feedback sessions&body=Please let us know your role and how many Tax Identification Numbers (TINs) you represent. Don’t send us your actual TINs, that is confidential information that should not be shared with this email address. If you do not represent a practice, let us know what work you do in connection to QPP.';
19
+ const [listServ, setListServ] = useState(false);
20
+
21
+ const setLink = (link) => {
22
+ return isIESupportPage ? '/' : link;
23
+ };
24
+
25
+ // The footer content is populated with the following priority order:
26
+ // 1. Use the footer content in localStorage if it's there
27
+ // 2. If not, make a call to get it from the QPPFE endpoint. Hydrate the localStorage item with the response.
28
+ // 3. If the call fails, use the default value
29
+ useEffect(() => {
30
+ const storageContent = JSON.parse(
31
+ localStorage.getItem('qpp_footer_listServ')
32
+ );
33
+ if (
34
+ storageContent?.content &&
35
+ new Date().valueOf() < storageContent.expiration
36
+ ) {
37
+ setListServ(storageContent.listServ);
38
+ } else {
39
+ const origin = window.location.origin;
40
+ axios
41
+ .get(
42
+ !origin.includes('localhost')
43
+ ? `${origin}/config/footer`
44
+ : 'https://qpp.cms.gov/config/footer'
45
+ )
46
+ .then(({ data: { data = {} } }) => {
47
+ localStorage.setItem(
48
+ 'qpp_footer_listServ',
49
+ JSON.stringify({
50
+ listServ: data.listServ,
51
+ })
52
+ );
53
+ setListServ(data.listServ);
54
+ })
55
+ .catch((e) => {
56
+ setListServ(false);
57
+ });
58
+ }
59
+ }, []);
60
+ if (isNewFooter) {
61
+ return (
62
+ <>
63
+ {!isIESupportPage && (
64
+ <div className="feedback-session-sign-up">
65
+ <div className="responsive-container">
66
+ <hr />
67
+ <p>
68
+ <strong>Help shape the future of QPP.</strong> Participate in a
69
+ user feedback session.{' '}
70
+ <a className="email-note-link" href={signUpNowLink}>
71
+ Sign up now
72
+ </a>
73
+ </p>
74
+ </div>
75
+ </div>
76
+ )}
77
+ <footer className="global-footer">
78
+ <div className="build-version" id="build-version">
79
+ {props.buildVersion}
80
+ </div>
81
+
82
+ <div className="responsive-container">
83
+ <>
84
+ {!isIESupportPage && (
85
+ <div className="global-footer-container">
86
+ <div className="footer-resources">
87
+ <p className="sub-title">Resources</p>
88
+ <ul>
89
+ <li>
90
+ <a
91
+ href="/about/resource-library"
92
+ aria-label="Resource Library"
93
+ data-track-category="FooterNav"
94
+ data-track-action="OpenEducationAndTools"
95
+ data-track-label="Education and Tools"
96
+ >
97
+ Resource Library
98
+ </a>
99
+ </li>
100
+ <li>
101
+ <a
102
+ href="/resources/help-and-support"
103
+ aria-label="Help and Support"
104
+ data-track-category="FooterNav"
105
+ data-track-action="OpenHelpAndSupport"
106
+ data-track-label="Help and Support"
107
+ >
108
+ Help and Support
109
+ </a>
110
+ </li>
111
+ <li>
112
+ <a
113
+ href="/about/small-underserved-rural-practices"
114
+ aria-label="Support for Small Practices"
115
+ data-track-category="FooterNav"
116
+ data-track-action="OpenSupportSmallPractices"
117
+ data-track-label="Support for Small Practices"
118
+ >
119
+ Support for Small Practices
120
+ </a>
121
+ </li>
122
+ <li>
123
+ <a
124
+ href="/developers"
125
+ aria-label="Developer Tools"
126
+ data-track-category="FooterNav"
127
+ data-track-action="OpenDeveloperTools"
128
+ data-track-label="Quality Payment Program"
129
+ >
130
+ Developer Tools
131
+ </a>
132
+ </li>
133
+ <li>
134
+ <a
135
+ href="/glossary"
136
+ aria-label="Glossary"
137
+ data-track-category="FooterNav"
138
+ data-track-action="OpenGlossary"
139
+ data-track-label="Glossary"
140
+ >
141
+ Glossary
142
+ </a>
143
+ </li>
144
+ </ul>
145
+ </div>
146
+ <div className="footer-contact-cms">
147
+ <p className="sub-title">Contact CMS</p>
148
+ <p className="contact-title">By Phone:</p>
149
+ <p>Monday - Friday 8 a.m - 8 p.m ET</p>
150
+ <p>
151
+ 1-866-288-8292 (TRS: 711)
152
+ <span className="footer-trs-infotip">
153
+ <InfoTip label={infoTipLabel} />
154
+ </span>
155
+ </p>
156
+
157
+ <p className="contact-title">By Email:</p>
158
+ <p>
159
+ <a
160
+ aria-label="QPP@cms.hhs.gov"
161
+ href="mailto:QPP@cms.hhs.gov"
162
+ className="email-link"
163
+ >
164
+ QPP@cms.hhs.gov
165
+ </a>
166
+ </p>
167
+ </div>
168
+ <div className="footer-social-newsletter">
169
+ <p className="sub-title">Stay Connected</p>
170
+ <SocialLinks />
171
+ <p className="sub-title">
172
+ {listServ
173
+ ? 'Sign Up for the QPP Listserv'
174
+ : 'Sign Up for the QPP Newsletter'}
175
+ </p>
176
+ <Subscribe />
177
+ </div>
178
+ </div>
179
+ )}
180
+ <hr />
181
+ </>
182
+
183
+ <div className="other-links">
184
+ <ul className="small">
185
+ <li>
186
+ <a
187
+ href={setLink('/privacy')}
188
+ aria-label="Notice of Privacy and Disclaimer"
189
+ data-track-category="FooterNav"
190
+ data-track-action="OpenPrivacyDisclaimer"
191
+ data-track-label="Notice of Privacy and Disclaimer"
192
+ >
193
+ CMS Privacy Notice
194
+ </a>
195
+ </li>
196
+ <li className="divider"></li>{' '}
197
+ <li>
198
+ <a
199
+ href={setLink('/accessibility')}
200
+ aria-label="Accessibility"
201
+ data-track-category="FooterNav"
202
+ data-track-action="OpenAccessibility"
203
+ data-track-label="Accessibility"
204
+ >
205
+ Accessibility
206
+ </a>
207
+ </li>
208
+ <li className="divider"></li>{' '}
209
+ <li>
210
+ <a
211
+ aria-label="Download Adobe Reader"
212
+ className="adobe-link"
213
+ rel="noopener noreferrer"
214
+ target="_blank"
215
+ href={setLink('https://get.adobe.com/reader')}
216
+ data-track-category="FooterNav"
217
+ data-track-action="DownloadAdobeReader"
218
+ data-track-label="AdobeReader"
219
+ >
220
+ Download Adobe Reader
221
+ </a>
222
+ </li>
223
+ </ul>
224
+ <hr />
225
+ </div>
226
+ <div className="qpp-hhs-logo-container">
227
+ <div className="qpp-logo-container">
228
+ <img
229
+ className="qpp-logo"
230
+ src="/images/qpp_logo_rgb_color.png"
231
+ alt="qpp logo"
232
+ />
233
+ </div>
234
+ <div className="hhs-logo-container">
235
+ <img
236
+ className="hhs-logo"
237
+ alt="Department of Health &amp; Human Services USA"
238
+ src="/images/hhs-logo-black.svg"
239
+ />
240
+ <p>
241
+ A federal government website managed and paid for by the U.S
242
+ Centers for Medicare &amp; Medicaid Services. 7500 Security
243
+ Boulevard, Baltimore MD 21244
244
+ </p>
245
+ </div>
246
+ </div>
247
+ </div>
248
+ </footer>
249
+ </>
250
+ );
251
+ }
252
+ return (
253
+ <LegacyFooterUI
254
+ buildVersion={props.buildVersion}
255
+ isFullWidth={props.isFullWidth}
256
+ signUpNowLink={signUpNowLink}
257
+ />
258
+ );
259
+ };
260
+
261
+ FooterUI.propTypes = {
262
+ buildVersion: PropTypes.string,
263
+ isFullWidth: PropTypes.bool,
264
+ isNewFooter: PropTypes.bool,
265
+ isIESupportPage: PropTypes.bool,
266
+ showHcdResearch: PropTypes.bool,
267
+ };
268
+
269
+ export default FooterUI;
@@ -0,0 +1,194 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import InfoTip from '../Infotip/Infotip';
4
+
5
+ const infoTipLabel =
6
+ 'When dialing 711, you will automatically be connected to a TRS Communications Assistant who will relay your conversation to the help desk agent with strict confidentiality.';
7
+
8
+ const LegacyFooterUI = ({ buildVersion, isFullWidth, signUpNowLink }) => {
9
+ return (
10
+ <footer className="legacy-footer">
11
+ <div className="build-version" id="build-version">
12
+ {buildVersion}
13
+ </div>
14
+ <div className="banner">
15
+ <div
16
+ className={
17
+ isFullWidth ? 'container-full-width' : 'responsive-container'
18
+ }
19
+ >
20
+ <div className="row">
21
+ <div className="col-sm-12 col-md-12 col-lg-12">
22
+ <span>Help shape the future of QPP</span> by participating in user
23
+ feedback sessions.{' '}
24
+ <a className="email-note-link" href={signUpNowLink}>
25
+ Send us an email to sign up
26
+ </a>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ <div
32
+ className={
33
+ isFullWidth ? 'container-full-width' : 'responsive-container'
34
+ }
35
+ >
36
+ <div className="row">
37
+ <div
38
+ className={
39
+ isFullWidth
40
+ ? 'col-sm-12 col-md-8 col-lg-8'
41
+ : 'col-sm-8 col-md-9 col-lg-9'
42
+ }
43
+ >
44
+ <div className="logo-container">
45
+ <img
46
+ src="/images/qpp_logo_reversed.png"
47
+ alt="Quality Payment Program"
48
+ className="qpp-logo"
49
+ />
50
+ <div className="social-container">
51
+ <a
52
+ rel="noopener noreferrer"
53
+ target="_blank"
54
+ className="social-link"
55
+ href="https://twitter.com/CMSGov"
56
+ aria-label="Follow us on Twitter. This link opens in a new window."
57
+ >
58
+ <span className="glyphicon glyphicon-twitter"></span>
59
+ </a>
60
+ <a
61
+ rel="noopener noreferrer"
62
+ target="_blank"
63
+ className="social-link"
64
+ href="https://www.youtube.com/playlist?list=PLaV7m2-zFKpj_6fBsqav6GvFzzq9oOpkk"
65
+ aria-label="Follow us on YouTube. This link opens in a new window."
66
+ >
67
+ <span className="glyphicon glyphicon-youtube"></span>
68
+ </a>
69
+ </div>
70
+ </div>
71
+ <div className="links">
72
+ <ul>
73
+ <li>
74
+ <a
75
+ href="/developers"
76
+ data-track-category="FooterNav"
77
+ data-track-action="OpenDeveloperTools"
78
+ data-track-label="Quality Payment Program"
79
+ >
80
+ Developer Tools
81
+ </a>
82
+ </li>
83
+ <li>
84
+ <a
85
+ href="/about/resource-library"
86
+ data-track-category="FooterNav"
87
+ data-track-action="OpenEducationAndTools"
88
+ data-track-label="Education and Tools"
89
+ >
90
+ Resource Library
91
+ </a>
92
+ </li>
93
+ <li>
94
+ <a
95
+ href="/glossary"
96
+ data-track-category="FooterNav"
97
+ data-track-action="OpenGlossary"
98
+ data-track-label="Glossary"
99
+ >
100
+ Glossary
101
+ </a>
102
+ </li>
103
+ <li>
104
+ <a
105
+ href="/resources/help-and-support"
106
+ data-track-category="FooterNav"
107
+ data-track-action="OpenHelpAndSupport"
108
+ data-track-label="Help and Support"
109
+ >
110
+ Help and Support
111
+ </a>
112
+ </li>
113
+ </ul>
114
+ <ul className="small">
115
+ <li>
116
+ <a
117
+ href="/privacy"
118
+ data-track-category="FooterNav"
119
+ data-track-action="OpenPrivacyDisclaimer"
120
+ data-track-label="Notice of Privacy and Disclaimer"
121
+ >
122
+ CMS Privacy Notice
123
+ </a>
124
+ </li>
125
+ <span className="divider"></span>
126
+ <li>
127
+ <a
128
+ href="/accessibility"
129
+ data-track-category="FooterNav"
130
+ data-track-action="OpenAccessibility"
131
+ data-track-label="Accessibility"
132
+ >
133
+ Accessibility
134
+ </a>
135
+ </li>
136
+ <span className="divider"></span>
137
+ <li>
138
+ <a
139
+ className="adobe-link"
140
+ rel="noopener noreferrer"
141
+ target="_blank"
142
+ href="https://get.adobe.com/reader"
143
+ data-track-category="FooterNav"
144
+ data-track-action="DownloadAdobeReader"
145
+ data-track-label="AdobeReader"
146
+ >
147
+ <svg className="icon">
148
+ <use xlinkHref="#icon-download" />
149
+ </svg>
150
+ Download Adobe Reader
151
+ </a>
152
+ </li>
153
+ <span className="divider"></span>
154
+ <li>
155
+ <a href="mailto:QPP@cms.hhs.gov" className="email-link">
156
+ QPP@cms.hhs.gov
157
+ </a>
158
+ </li>
159
+ <li>
160
+ 1-866-288-8292 (TRS: 711)
161
+ <div className="footer-trs-infotip">
162
+ <InfoTip lightIcon label={infoTipLabel} />
163
+ </div>
164
+ </li>
165
+ </ul>
166
+ </div>
167
+ </div>
168
+ <div
169
+ className={
170
+ isFullWidth
171
+ ? 'col-sm-12 col-md-4 col-lg-4'
172
+ : 'col-sm-4 col-md-3 col-lg-3'
173
+ }
174
+ >
175
+ <div className="hhs-logo-container">
176
+ <img
177
+ alt="Department of Health &amp; Human Services USA"
178
+ src="/images/hhs-logo-white.svg"
179
+ />
180
+ </div>
181
+ </div>
182
+ </div>
183
+ </div>
184
+ </footer>
185
+ );
186
+ };
187
+
188
+ LegacyFooterUI.propTypes = {
189
+ buildVersion: PropTypes.string,
190
+ isFullWidth: PropTypes.bool,
191
+ signUpNowLink: PropTypes.string,
192
+ };
193
+
194
+ export default LegacyFooterUI;
@@ -0,0 +1,60 @@
1
+ import React from 'react';
2
+
3
+ const SocialLinks = () => (
4
+ <div className="social-container">
5
+ <a
6
+ rel="noopener noreferrer"
7
+ target="_blank"
8
+ className="social-link"
9
+ href="https://twitter.com/CMSGov"
10
+ aria-label="Follow us on Twitter. This link opens in a new window."
11
+ >
12
+ <svg width="19px" height="16px" viewBox="0 0 19 16">
13
+ <g stroke="none" strokeWidth="1" fill="none" fillRule="evenodd">
14
+ <g
15
+ transform="translate(-763.000000, -177.000000)"
16
+ fill="#242424"
17
+ fillRule="nonzero"
18
+ >
19
+ <g transform="translate(763.000000, 140.000000)">
20
+ <g transform="translate(0.000000, 37.000000)">
21
+ <path
22
+ d="M16.9243259,4.73901817 C16.9243259,4.57725788 16.9243259,4.41549759 16.916868,4.25373729 C17.6626567,3.71698723 18.3114928,3.05524058 18.826087,2.30526104 C18.1250456,2.6067234 17.3867149,2.81260014 16.6260105,2.90083303 C17.4240043,2.43025763 18.0206352,1.68763083 18.3040349,0.812654705 C17.5507884,1.25381914 16.7304209,1.56263424 15.8727639,1.72439454 C14.425934,0.202377237 12.0021209,0.128849832 10.4583384,1.56263424 C9.46643951,2.48172682 9.04133999,3.8566893 9.35457121,5.16547712 C6.28192201,5.01106957 3.41063575,3.5846379 1.47158528,1.22440818 C0.457312727,2.94494947 0.971906889,5.15077164 2.65738922,6.26103547 C2.04584253,6.24632999 1.45666951,6.0845697 0.919701685,5.79046007 C0.919701685,5.80516555 0.919701685,5.81987104 0.919701685,5.83457652 C0.919701685,7.62864522 2.20245815,9.17272074 3.99235089,9.53300502 C3.42555152,9.68741258 2.83637849,9.7094708 2.26212124,9.59917969 C2.76179963,11.1359025 4.20117171,12.1873444 5.83444883,12.2167553 C4.4771135,13.2681972 2.80654695,13.8343583 1.08377519,13.8343583 C0.778001843,13.8343583 0.4722285,13.8123 0.173913043,13.7828891 C1.93397424,14.8784474 3.96251934,15.4666667 6.04326965,15.4666667 C13.0760565,15.4666667 16.9243259,9.71682354 16.9243259,4.73901817 Z"
23
+ id="twitter-icon"
24
+ ></path>
25
+ </g>
26
+ </g>
27
+ </g>
28
+ </g>
29
+ </svg>
30
+ </a>
31
+ <a
32
+ rel="noopener noreferrer"
33
+ target="_blank"
34
+ className="social-link"
35
+ href="https://www.youtube.com/playlist?list=PLaV7m2-zFKpj_6fBsqav6GvFzzq9oOpkk"
36
+ aria-label="Follow us on YouTube. This link opens in a new window."
37
+ >
38
+ <svg width="19px" height="14px" viewBox="0 0 19 14">
39
+ <g stroke="none" strokeWidth="1" fill="none" fillRule="evenodd">
40
+ <g
41
+ transform="translate(-801.000000, -179.000000)"
42
+ fill="#242424"
43
+ fillRule="nonzero"
44
+ >
45
+ <g transform="translate(763.000000, 140.000000)">
46
+ <g id="Group" transform="translate(38.000000, 39.000000)">
47
+ <path
48
+ d="M17.7486957,2.84298208 C17.551087,2.10010036 16.9670652,1.51515412 16.2265217,1.3162724 C14.8843478,0.955555556 9.5,0.955555556 9.5,0.955555556 C9.5,0.955555556 4.11565217,0.955555556 2.77347826,1.3162724 C2.03293478,1.51515412 1.44891304,2.10010036 1.25130435,2.84298208 C0.891304348,4.19030824 0.891304348,7 0.891304348,7 C0.891304348,7 0.891304348,9.80969176 1.25130435,11.1570179 C1.44891304,11.8998996 2.03293478,12.4848459 2.77347826,12.6837276 C4.11565217,13.0444444 9.5,13.0444444 9.5,13.0444444 C9.5,13.0444444 14.8843478,13.0444444 16.2265217,12.6837276 C16.9670652,12.4848459 17.551087,11.8998996 17.7486957,11.1570179 C18.1086957,9.80969176 18.1086957,7 18.1086957,7 C18.1086957,7 18.1086957,4.19030824 17.7486957,2.84298208 Z M7.73913043,9.5513405 L7.73913043,4.4486595 L12.2391304,7 L7.73913043,9.5513405 Z"
49
+ id="Youtube-icon"
50
+ ></path>
51
+ </g>
52
+ </g>
53
+ </g>
54
+ </g>
55
+ </svg>
56
+ </a>
57
+ </div>
58
+ );
59
+
60
+ export default SocialLinks;
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+
3
+ const Subscribe = () => (
4
+ <div className="subscriber-form">
5
+ <form
6
+ action="https://public.govdelivery.com/accounts/USCMS/subscriber/qualify"
7
+ target="_blank"
8
+ acceptCharset="UTF-8"
9
+ method="get"
10
+ rel="noopener noreferrer"
11
+ >
12
+ <input type="hidden" name="topic_id" value="USCMS_12196" />
13
+ <label className="sr-only" htmlFor="email-subscribe">
14
+ Email address
15
+ </label>
16
+ <input
17
+ id="email-subscribe"
18
+ className="form-control"
19
+ type="email"
20
+ name="email"
21
+ placeholder="Enter your Email"
22
+ />
23
+ <button
24
+ className="btn btn-subscribe js-subscribe-submit"
25
+ type="submit"
26
+ name="commit"
27
+ >
28
+ Subscribe
29
+ </button>
30
+ </form>
31
+ </div>
32
+ );
33
+
34
+ export default Subscribe;
@@ -0,0 +1,30 @@
1
+ /* global buildVersion */
2
+ // buildVersion above is defined in webpack.config.js
3
+ import React from 'react';
4
+ import { render } from 'react-dom';
5
+ import FooterUI from './FooterUI';
6
+
7
+ /**
8
+ * Renders the QPP Footer content.
9
+ */
10
+ export default class Footer {
11
+ /**
12
+ * @param {Object} options - An object containing content and config data
13
+ * @param {HTMLElement} options.rootElement - Elem inside which to render
14
+ */
15
+ constructor(options) {
16
+ if (options.hasOwnProperty('rootElement')) {
17
+ render(
18
+ <FooterUI
19
+ buildVersion={buildVersion}
20
+ isFullWidth={options.isFullWidth}
21
+ isNewFooter={options.isNewFooter}
22
+ showHcdResearch={options.showHcdResearch}
23
+ />,
24
+ options.rootElement
25
+ );
26
+ } else {
27
+ render(<FooterUI buildVersion={buildVersion} />, options);
28
+ }
29
+ }
30
+ }