@propelinc/citrus-ui 0.6.0 → 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 (355) hide show
  1. package/README.md +54 -60
  2. package/dist/colors/colors.d.ts +31 -0
  3. package/dist/colors/theme.d.ts +2 -11
  4. package/dist/colors/util-classes.d.ts +11 -0
  5. package/dist/components/CAccordion.vue.d.ts +21 -0
  6. package/dist/components/CAccordionItem.vue.d.ts +41 -0
  7. package/dist/components/CAppBar.vue.d.ts +156 -0
  8. package/dist/components/CBadge.vue.d.ts +52 -0
  9. package/dist/components/CBottomSheet.vue.d.ts +226 -0
  10. package/dist/components/CButton/CButton.vue.d.ts +231 -0
  11. package/dist/components/CButton/types.d.ts +5 -0
  12. package/dist/components/CButtonStack.vue.d.ts +24 -0
  13. package/dist/components/CCard.vue.d.ts +107 -0
  14. package/dist/components/CCardFooter.vue.d.ts +26 -0
  15. package/dist/components/CCardHeader.vue.d.ts +3 -0
  16. package/dist/components/CCardSection.vue.d.ts +17 -0
  17. package/dist/components/CCheckbox.vue.d.ts +145 -0
  18. package/dist/components/CCol.vue.d.ts +21 -0
  19. package/dist/components/CDivider.vue.d.ts +17 -0
  20. package/dist/components/CDobField.vue.d.ts +2109 -0
  21. package/dist/components/CDobSelect.vue.d.ts +398 -0
  22. package/dist/components/CEmailField.vue.d.ts +699 -0
  23. package/dist/components/CExpandTransition.vue.d.ts +19 -0
  24. package/dist/components/CFadeTransition.vue.d.ts +3 -0
  25. package/dist/components/CFileInput.vue.d.ts +98 -0
  26. package/dist/components/CFixedPageFooter.vue.d.ts +106 -0
  27. package/dist/components/CForm.vue.d.ts +29 -0
  28. package/dist/components/CFormFieldCounter.vue.d.ts +42 -0
  29. package/dist/components/CIconButton.vue.d.ts +390 -0
  30. package/dist/components/CLabel.vue.d.ts +32 -0
  31. package/dist/components/CListItem.vue.d.ts +208 -0
  32. package/dist/components/CListItemContent.vue.d.ts +27 -0
  33. package/dist/components/CListItemIcon.vue.d.ts +54 -0
  34. package/dist/components/CLoader.vue.d.ts +73 -0
  35. package/dist/components/CLogo.vue.d.ts +19 -0
  36. package/dist/components/CMaskedTextField.vue.d.ts +2012 -0
  37. package/dist/components/CMenu.vue.d.ts +6 -0
  38. package/dist/components/CMenuItem.vue.d.ts +170 -0
  39. package/dist/components/CMenuLabel.vue.d.ts +3 -0
  40. package/dist/components/CModal.vue.d.ts +206 -0
  41. package/dist/components/CModalLoading.vue.d.ts +230 -0
  42. package/dist/components/CNotification.vue.d.ts +589 -0
  43. package/dist/components/CPhoneField.vue.d.ts +2088 -0
  44. package/dist/components/CPill.vue.d.ts +42 -0
  45. package/dist/components/CPillGroup.vue.d.ts +70 -0
  46. package/dist/components/CPopup.vue.d.ts +21 -0
  47. package/dist/components/CProgressLinear.vue.d.ts +61 -0
  48. package/dist/components/CProgressRing.vue.d.ts +103 -0
  49. package/dist/components/CRadio.vue.d.ts +73 -0
  50. package/dist/components/CRadioGroup.vue.d.ts +123 -0
  51. package/dist/components/CRebrand.vue.d.ts +28 -0
  52. package/dist/components/CRow.vue.d.ts +67 -0
  53. package/dist/components/CSafeArea.vue.d.ts +18 -0
  54. package/dist/components/CSectionHeader.vue.d.ts +28 -0
  55. package/dist/components/CSelect.vue.d.ts +293 -0
  56. package/dist/components/CSkeleton.vue.d.ts +3 -0
  57. package/dist/components/CSkeletonLoaderCard.vue.d.ts +21 -0
  58. package/dist/components/CSkeletonLoaderCircle.vue.d.ts +5 -0
  59. package/dist/components/CSkeletonLoaderText.vue.d.ts +44 -0
  60. package/dist/components/CSlideFadeTransition.vue.d.ts +58 -0
  61. package/dist/components/CSplitInput.vue.d.ts +2131 -0
  62. package/dist/components/CSquaredIcon.vue.d.ts +47 -0
  63. package/dist/components/CSsnField.vue.d.ts +2083 -0
  64. package/dist/components/CStatusDot.vue.d.ts +27 -0
  65. package/dist/components/CSwitch.vue.d.ts +54 -0
  66. package/dist/components/CSwitchListItem.vue.d.ts +392 -0
  67. package/dist/components/CTextArea.vue.d.ts +240 -0
  68. package/dist/components/CTextField.vue.d.ts +647 -0
  69. package/dist/components/CTextLink.vue.d.ts +55 -0
  70. package/dist/components/CThirdPartyLogo.vue.d.ts +128 -0
  71. package/dist/components/CTimeago.vue.d.ts +12 -0
  72. package/dist/components/CToast.vue.d.ts +458 -0
  73. package/dist/components/CToastsList.vue.d.ts +430 -0
  74. package/dist/components/CValidationMessage.vue.d.ts +45 -0
  75. package/dist/components/CZipcodeField.vue.d.ts +2080 -0
  76. package/dist/components/index.d.ts +66 -25
  77. package/dist/components/internal/CCloseButton.vue.d.ts +14 -0
  78. package/dist/composables/accessibility.d.ts +1 -0
  79. package/dist/composables/animation.d.ts +12 -0
  80. package/dist/composables/binding.d.ts +19 -0
  81. package/dist/composables/colors.d.ts +13 -0
  82. package/dist/composables/elements.d.ts +3 -0
  83. package/dist/composables/fields.d.ts +9 -0
  84. package/dist/composables/gestures.d.ts +53 -0
  85. package/dist/composables/i18n.d.ts +3 -0
  86. package/dist/composables/id.d.ts +11 -0
  87. package/dist/composables/input-mask.d.ts +18 -0
  88. package/dist/composables/router.d.ts +30 -0
  89. package/dist/composables/slots.d.ts +2 -0
  90. package/dist/composables/toast.d.ts +21 -0
  91. package/dist/composables/validations.d.ts +77 -0
  92. package/dist/index.css +1 -0
  93. package/dist/index.d.ts +5 -4
  94. package/dist/index.mjs +11738 -0
  95. package/dist/index.mjs.map +1 -0
  96. package/dist/plugin.d.ts +2 -2
  97. package/dist/services/animation.d.ts +17 -0
  98. package/dist/services/directives/index.d.ts +2 -0
  99. package/dist/services/directives/scroll-into-view.d.ts +7 -0
  100. package/dist/services/directives/tap-animation.d.ts +6 -0
  101. package/dist/services/id.d.ts +22 -0
  102. package/dist/services/injections/accordions.d.ts +3 -0
  103. package/dist/services/injections/animations.d.ts +2 -0
  104. package/dist/services/injections/buttons.d.ts +4 -0
  105. package/dist/services/injections/forms.d.ts +6 -0
  106. package/dist/services/injections/icon-buttons.d.ts +3 -0
  107. package/dist/services/injections/pills.d.ts +4 -0
  108. package/dist/services/injections/radio.d.ts +10 -0
  109. package/dist/styles/main.css +3002 -0
  110. package/dist/styles/utils.css +2319 -0
  111. package/dist/theme/icons.d.ts +35 -2
  112. package/dist/types/CForm.d.ts +12 -0
  113. package/dist/types/font-awesome.d.ts +5 -0
  114. package/dist/types.d.ts +12 -0
  115. package/index.ts +2 -0
  116. package/package.json +60 -45
  117. package/src/assets/fonts/grenette-regular.woff2 +0 -0
  118. package/src/assets/fonts/grenette-semibold.woff2 +0 -0
  119. package/src/assets/fonts/polymath.woff2 +0 -0
  120. package/src/assets/logos/propel/icon.svg +15 -0
  121. package/src/assets/logos/propel/lockup.svg +11 -0
  122. package/src/colors/colors.ts +173 -0
  123. package/src/colors/theme.ts +8 -14
  124. package/src/colors/util-classes.ts +49 -0
  125. package/src/componentResolver.js +33 -0
  126. package/src/components/CAccordion.vue +32 -7
  127. package/src/components/CAccordionItem.vue +109 -36
  128. package/src/components/CAppBar.vue +237 -0
  129. package/src/components/CBadge.vue +74 -0
  130. package/src/components/CBottomSheet.vue +430 -0
  131. package/src/components/CButton/CButton.vue +347 -0
  132. package/src/components/CButton/types.ts +5 -0
  133. package/src/components/CButtonStack.vue +36 -0
  134. package/src/components/CCard.vue +149 -41
  135. package/src/components/CCardFooter.vue +11 -27
  136. package/src/components/CCardHeader.vue +30 -21
  137. package/src/components/CCardSection.vue +23 -12
  138. package/src/components/CCheckbox.vue +191 -21
  139. package/src/components/CCol.vue +55 -0
  140. package/src/components/CDivider.vue +46 -0
  141. package/src/components/CDobField.vue +153 -0
  142. package/src/components/CDobSelect.vue +274 -0
  143. package/src/components/CEmailField.vue +61 -0
  144. package/src/components/CExpandTransition.vue +55 -0
  145. package/src/components/CFadeTransition.vue +23 -0
  146. package/src/components/CFileInput.vue +186 -0
  147. package/src/components/CFixedPageFooter.vue +76 -0
  148. package/src/components/CForm.vue +86 -0
  149. package/src/components/CFormFieldCounter.vue +40 -0
  150. package/src/components/CIconButton.vue +175 -59
  151. package/src/components/CLabel.vue +52 -0
  152. package/src/components/CListItem.vue +149 -45
  153. package/src/components/CListItemContent.vue +60 -0
  154. package/src/components/CListItemIcon.vue +27 -31
  155. package/src/components/CLoader.vue +156 -0
  156. package/src/components/CLogo.vue +23 -0
  157. package/src/components/CMaskedTextField.vue +118 -0
  158. package/src/components/CMenu.vue +24 -0
  159. package/src/components/CMenuItem.vue +106 -0
  160. package/src/components/CMenuLabel.vue +26 -0
  161. package/src/components/CModal.vue +198 -79
  162. package/src/components/CModalLoading.vue +27 -9
  163. package/src/components/CNotification.vue +86 -53
  164. package/src/components/CPhoneField.vue +69 -0
  165. package/src/components/CPill.vue +162 -0
  166. package/src/components/CPillGroup.vue +73 -0
  167. package/src/components/CPopup.vue +66 -0
  168. package/src/components/CProgressLinear.vue +52 -0
  169. package/src/components/CProgressRing.vue +126 -0
  170. package/src/components/CRadio.vue +138 -0
  171. package/src/components/CRadioGroup.vue +142 -0
  172. package/src/components/CRebrand.vue +28 -0
  173. package/src/components/CRow.vue +62 -0
  174. package/src/components/CSafeArea.vue +23 -0
  175. package/src/components/CSectionHeader.vue +50 -0
  176. package/src/components/CSelect.vue +223 -74
  177. package/src/components/CSkeleton.vue +65 -0
  178. package/src/components/CSkeletonLoaderCard.vue +29 -0
  179. package/src/components/CSkeletonLoaderCircle.vue +18 -14
  180. package/src/components/CSkeletonLoaderText.vue +127 -17
  181. package/src/components/CSlideFadeTransition.vue +100 -0
  182. package/src/components/CSplitInput.vue +111 -0
  183. package/src/components/CSquaredIcon.vue +83 -0
  184. package/src/components/CSsnField.vue +86 -0
  185. package/src/components/CStatusDot.vue +70 -0
  186. package/src/components/CSwitch.vue +125 -0
  187. package/src/components/CSwitchListItem.vue +110 -0
  188. package/src/components/CTextArea.vue +193 -47
  189. package/src/components/CTextField.vue +450 -93
  190. package/src/components/CTextLink.vue +48 -38
  191. package/src/components/CThirdPartyLogo.vue +127 -0
  192. package/src/components/CTimeago.vue +63 -0
  193. package/src/components/CToast.vue +259 -0
  194. package/src/components/CToastsList.vue +32 -0
  195. package/src/components/CValidationMessage.vue +70 -0
  196. package/src/components/CZipcodeField.vue +69 -0
  197. package/src/components/index.ts +66 -25
  198. package/src/components/internal/CCloseButton.vue +57 -0
  199. package/src/composables/accessibility.ts +29 -0
  200. package/src/composables/animation.ts +95 -0
  201. package/src/composables/binding.ts +34 -0
  202. package/src/composables/colors.ts +59 -0
  203. package/src/composables/elements.ts +72 -0
  204. package/src/composables/fields.ts +19 -0
  205. package/src/composables/gestures.ts +197 -0
  206. package/src/composables/i18n.ts +13 -0
  207. package/src/composables/id.ts +23 -0
  208. package/src/composables/input-mask.ts +139 -0
  209. package/src/composables/router.ts +64 -0
  210. package/src/composables/slots.ts +57 -0
  211. package/src/composables/toast.ts +64 -0
  212. package/src/composables/validations.ts +214 -0
  213. package/src/index.ts +7 -7
  214. package/src/plugin.ts +13 -6
  215. package/src/services/animation.ts +101 -0
  216. package/src/services/directives/index.ts +2 -0
  217. package/src/services/directives/scroll-into-view.ts +86 -0
  218. package/src/services/directives/tap-animation.ts +71 -0
  219. package/src/services/id.ts +31 -0
  220. package/src/services/injections/accordions.ts +4 -0
  221. package/src/services/injections/animations.ts +3 -0
  222. package/src/services/injections/buttons.ts +5 -0
  223. package/src/services/injections/forms.ts +8 -0
  224. package/src/services/injections/icon-buttons.ts +4 -0
  225. package/src/services/injections/pills.ts +7 -0
  226. package/src/services/injections/radio.ts +12 -0
  227. package/src/shims-vue.d.ts +6 -3
  228. package/src/styles/_animation.scss +19 -0
  229. package/src/styles/_button.scss +61 -0
  230. package/src/styles/_colors.scss +58 -11
  231. package/src/styles/_core.scss +248 -87
  232. package/src/styles/_form-fields.scss +68 -15
  233. package/src/styles/_grenette.scss +13 -0
  234. package/src/styles/_polymath.scss +14 -0
  235. package/src/styles/_reset.scss +105 -0
  236. package/src/styles/_shoelace.scss +46 -0
  237. package/src/styles/_typography.scss +40 -10
  238. package/src/styles/main.scss +6 -3
  239. package/src/styles/utils/a11y.scss +18 -0
  240. package/src/styles/utils/typography.scss +13 -0
  241. package/src/styles/utils.scss +560 -0
  242. package/src/styles/variables.scss +27 -15
  243. package/src/theme/icons.ts +16 -5
  244. package/src/types/CForm.ts +15 -0
  245. package/src/types/font-awesome.ts +6 -0
  246. package/src/types.ts +15 -0
  247. package/.browserslistrc +0 -3
  248. package/.eslintrc.js +0 -4
  249. package/.stylelintrc.js +0 -3
  250. package/babel.config.js +0 -3
  251. package/dist/citrus-ui.common.js +0 -43434
  252. package/dist/citrus-ui.common.js.map +0 -1
  253. package/dist/citrus-ui.css +0 -1
  254. package/dist/citrus-ui.umd.js +0 -43444
  255. package/dist/citrus-ui.umd.js.map +0 -1
  256. package/dist/citrus-ui.umd.min.js +0 -27
  257. package/dist/citrus-ui.umd.min.js.map +0 -1
  258. package/dist/demo.html +0 -10
  259. package/dist/fonts/Blitz-Script.85ed9abe.woff2 +0 -0
  260. package/dist/fonts/ObjectSans-Bold.5492f3d5.woff2 +0 -0
  261. package/dist/fonts/ObjectSans-BoldSlanted.29e2a87e.woff2 +0 -0
  262. package/dist/fonts/ObjectSans-Heavy.d0b2f035.woff2 +0 -0
  263. package/dist/fonts/ObjectSans-HeavySlanted.45e9c063.woff2 +0 -0
  264. package/dist/fonts/ObjectSans-Light.f885dec3.woff2 +0 -0
  265. package/dist/fonts/ObjectSans-LightSlanted.b8eb7c12.woff2 +0 -0
  266. package/dist/fonts/ObjectSans-Regular.e4ea0b90.woff2 +0 -0
  267. package/dist/fonts/ObjectSans-Slanted.57a90be9.woff2 +0 -0
  268. package/dist/fonts/ObjectSans-Thin.86d44227.woff2 +0 -0
  269. package/dist/fonts/ObjectSans-ThinSlanted.20342160.woff2 +0 -0
  270. package/jest.config.js +0 -9
  271. package/plopfile.js +0 -67
  272. package/project.json +0 -69
  273. package/src/assets/fonts/Blitz-Script.woff2 +0 -0
  274. package/src/assets/fonts/ObjectSans-Bold.woff2 +0 -0
  275. package/src/assets/fonts/ObjectSans-BoldSlanted.woff2 +0 -0
  276. package/src/assets/fonts/ObjectSans-Heavy.woff2 +0 -0
  277. package/src/assets/fonts/ObjectSans-HeavySlanted.woff2 +0 -0
  278. package/src/assets/fonts/ObjectSans-Light.woff2 +0 -0
  279. package/src/assets/fonts/ObjectSans-LightSlanted.woff2 +0 -0
  280. package/src/assets/fonts/ObjectSans-Regular.woff2 +0 -0
  281. package/src/assets/fonts/ObjectSans-Slanted.woff2 +0 -0
  282. package/src/assets/fonts/ObjectSans-Thin.woff2 +0 -0
  283. package/src/assets/fonts/ObjectSans-ThinSlanted.woff2 +0 -0
  284. package/src/components/CAlert.vue +0 -78
  285. package/src/components/CBanner.vue +0 -47
  286. package/src/components/CButton.vue +0 -146
  287. package/src/components/CListItemAction.vue +0 -29
  288. package/src/components/CSegmentedButton.vue +0 -47
  289. package/src/components/CSegmentedButtonOption.vue +0 -42
  290. package/src/components/helpers/FormField.vue +0 -48
  291. package/src/components/helpers/SelectInput.vue +0 -115
  292. package/src/shims-scss.d.ts +0 -4
  293. package/src/shims-vuetify.d.ts +0 -4
  294. package/src/styles/_blitz.scss +0 -8
  295. package/src/styles/_object-sans.scss +0 -23
  296. package/storybook-static/0.799c368cbe88266827ba.manager.bundle.js +0 -1
  297. package/storybook-static/0.a9f0a9ad.iframe.bundle.js +0 -3
  298. package/storybook-static/0.a9f0a9ad.iframe.bundle.js.LICENSE.txt +0 -8
  299. package/storybook-static/0.a9f0a9ad.iframe.bundle.js.map +0 -1
  300. package/storybook-static/1.0438fd8d.iframe.bundle.js +0 -3
  301. package/storybook-static/1.0438fd8d.iframe.bundle.js.LICENSE.txt +0 -17
  302. package/storybook-static/1.0438fd8d.iframe.bundle.js.map +0 -1
  303. package/storybook-static/1.9ebd2fb519f6726108de.manager.bundle.js +0 -1
  304. package/storybook-static/10.348d8814.iframe.bundle.js +0 -3
  305. package/storybook-static/10.348d8814.iframe.bundle.js.LICENSE.txt +0 -30
  306. package/storybook-static/10.348d8814.iframe.bundle.js.map +0 -1
  307. package/storybook-static/10.a85ea1a67689be8e19ff.manager.bundle.js +0 -1
  308. package/storybook-static/11.f4e922583ae35da460f3.manager.bundle.js +0 -2
  309. package/storybook-static/11.f4e922583ae35da460f3.manager.bundle.js.LICENSE.txt +0 -12
  310. package/storybook-static/12.1415460941f0bdcb8fa8.manager.bundle.js +0 -1
  311. package/storybook-static/2.75a17459.iframe.bundle.js +0 -3
  312. package/storybook-static/2.75a17459.iframe.bundle.js.LICENSE.txt +0 -26
  313. package/storybook-static/2.75a17459.iframe.bundle.js.map +0 -1
  314. package/storybook-static/5.f459d151315e6780c20f.manager.bundle.js +0 -2
  315. package/storybook-static/5.f459d151315e6780c20f.manager.bundle.js.LICENSE.txt +0 -8
  316. package/storybook-static/6.3bd64d820f3745f262ff.manager.bundle.js +0 -1
  317. package/storybook-static/6.ce8d99b4.iframe.bundle.js +0 -1
  318. package/storybook-static/7.3d04765dbf3f1dcd706c.manager.bundle.js +0 -1
  319. package/storybook-static/7.6633a922.iframe.bundle.js +0 -3
  320. package/storybook-static/7.6633a922.iframe.bundle.js.LICENSE.txt +0 -12
  321. package/storybook-static/7.6633a922.iframe.bundle.js.map +0 -1
  322. package/storybook-static/8.b541eadfcb9164835dfc.manager.bundle.js +0 -1
  323. package/storybook-static/8.fc5e1ebf.iframe.bundle.js +0 -1
  324. package/storybook-static/9.411ac8e451bbb10926c7.manager.bundle.js +0 -1
  325. package/storybook-static/9.724ac3ed.iframe.bundle.js +0 -3
  326. package/storybook-static/9.724ac3ed.iframe.bundle.js.LICENSE.txt +0 -15
  327. package/storybook-static/9.724ac3ed.iframe.bundle.js.map +0 -1
  328. package/storybook-static/css/main.95216119.css +0 -1
  329. package/storybook-static/css/vendors~main.02dc89bf.css +0 -1
  330. package/storybook-static/favicon.ico +0 -0
  331. package/storybook-static/fonts/Blitz-Script.85ed9abe.woff2 +0 -0
  332. package/storybook-static/fonts/ObjectSans-Bold.5492f3d5.woff2 +0 -0
  333. package/storybook-static/fonts/ObjectSans-BoldSlanted.29e2a87e.woff2 +0 -0
  334. package/storybook-static/fonts/ObjectSans-Heavy.d0b2f035.woff2 +0 -0
  335. package/storybook-static/fonts/ObjectSans-HeavySlanted.45e9c063.woff2 +0 -0
  336. package/storybook-static/fonts/ObjectSans-Light.f885dec3.woff2 +0 -0
  337. package/storybook-static/fonts/ObjectSans-LightSlanted.b8eb7c12.woff2 +0 -0
  338. package/storybook-static/fonts/ObjectSans-Regular.e4ea0b90.woff2 +0 -0
  339. package/storybook-static/fonts/ObjectSans-Slanted.57a90be9.woff2 +0 -0
  340. package/storybook-static/fonts/ObjectSans-Thin.86d44227.woff2 +0 -0
  341. package/storybook-static/fonts/ObjectSans-ThinSlanted.20342160.woff2 +0 -0
  342. package/storybook-static/iframe.html +0 -348
  343. package/storybook-static/index.html +0 -51
  344. package/storybook-static/main.7b4aec9c4352d4bb535b.manager.bundle.js +0 -1
  345. package/storybook-static/main.9e8c64c7.iframe.bundle.js +0 -1
  346. package/storybook-static/runtime~main.91a0c7330ab317d35c4a.manager.bundle.js +0 -1
  347. package/storybook-static/runtime~main.e4da100f.iframe.bundle.js +0 -1
  348. package/storybook-static/vendors~main.6660eda6.iframe.bundle.js +0 -7
  349. package/storybook-static/vendors~main.6660eda6.iframe.bundle.js.LICENSE.txt +0 -80
  350. package/storybook-static/vendors~main.6660eda6.iframe.bundle.js.map +0 -1
  351. package/storybook-static/vendors~main.f7f16cebbf3aa96a4f89.manager.bundle.js +0 -2
  352. package/storybook-static/vendors~main.f7f16cebbf3aa96a4f89.manager.bundle.js.LICENSE.txt +0 -110
  353. package/tsconfig.dist.json +0 -7
  354. package/tsconfig.json +0 -24
  355. package/vue.config.js +0 -5
@@ -0,0 +1,60 @@
1
+ <template>
2
+ <div class="c-list-item-content" data-test="list-item-content">
3
+ <slot>
4
+ <div
5
+ v-if="title || titleSlotHasContent"
6
+ class="c-list-item-content__title"
7
+ data-test="list-item-title"
8
+ >
9
+ <slot name="title">{{ title }}</slot>
10
+ </div>
11
+ <div
12
+ v-if="label || labelSlotHasContent"
13
+ class="c-list-item-content__label"
14
+ data-test="list-item-label"
15
+ >
16
+ <slot name="label">{{ label }}</slot>
17
+ </div>
18
+ </slot>
19
+ </div>
20
+ </template>
21
+
22
+ <script lang="ts">
23
+ import { defineComponent } from 'vue';
24
+
25
+ import { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';
26
+
27
+ export default defineComponent({
28
+ name: 'CListItemContent',
29
+ props: {
30
+ title: { type: String, default: '' },
31
+ label: { type: String, default: '' },
32
+ },
33
+ setup() {
34
+ const titleSlotHasContent = useSlotHasContent('title');
35
+ const labelSlotHasContent = useSlotHasContent('label');
36
+
37
+ return { titleSlotHasContent, labelSlotHasContent };
38
+ },
39
+ });
40
+ </script>
41
+
42
+ <style lang="scss" scoped>
43
+ @import '@propelinc/citrus-ui/src/styles/core';
44
+
45
+ .c-list-item-content {
46
+ flex: 1 1 auto;
47
+ min-width: 0;
48
+ }
49
+
50
+ .c-list-item-content__title {
51
+ @include subheadline;
52
+
53
+ align-items: center;
54
+ display: flex;
55
+
56
+ & + .c-list-item-content__label {
57
+ margin-top: 2px;
58
+ }
59
+ }
60
+ </style>
@@ -1,43 +1,39 @@
1
1
  <template>
2
- <v-list-item-icon
3
- class="c-list-item__icon"
4
- :class="{ 'c-list-item__icon--fixed-size': fixedSize }"
2
+ <CSquaredIcon
3
+ v-if="icon || iconSlotHasContent"
4
+ :icon="icon"
5
+ :color="iconColor"
6
+ class="c-list-item-icon"
5
7
  >
6
- <slot>
7
- <font-awesome-icon
8
- v-if="icon"
9
- data-test="list-item-icon"
10
- :fixed-width="fixedSize"
11
- :icon="icon"
12
- />
13
- </slot>
14
- </v-list-item-icon>
8
+ <slot name="icon" />
9
+ </CSquaredIcon>
15
10
  </template>
16
11
 
17
12
  <script lang="ts">
18
- import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
19
- import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
20
- import { Component, Vue, Prop } from 'vue-property-decorator';
13
+ import { defineComponent } from 'vue';
21
14
 
22
- @Component({ name: 'CListItemIcon', components: { FontAwesomeIcon } })
23
- export default class CListItemIcon extends Vue {
24
- @Prop({ type: [String, Array, Object] }) icon?: IconDefinition;
25
- @Prop({ type: Boolean, default: true }) fixedSize!: boolean;
26
- }
15
+ import CSquaredIcon from '@propelinc/citrus-ui/src/components/CSquaredIcon.vue';
16
+ import { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';
17
+
18
+ export default defineComponent({
19
+ name: 'CListItemIcon',
20
+ components: { CSquaredIcon },
21
+ props: {
22
+ icon: CSquaredIcon.props.icon,
23
+ iconColor: CSquaredIcon.props.color,
24
+ },
25
+ setup() {
26
+ const iconSlotHasContent = useSlotHasContent('icon');
27
+
28
+ return { iconSlotHasContent };
29
+ },
30
+ });
27
31
  </script>
28
32
 
29
33
  <style lang="scss" scoped>
30
- @import '~@/styles/core.scss';
31
-
32
- .c-list-item__icon {
33
- font-size: $font-size-icon-medium;
34
- }
34
+ @import '@propelinc/citrus-ui/src/styles/core';
35
35
 
36
- .c-list-item__icon--fixed-size {
37
- align-items: center;
38
- display: flex;
39
- height: 16px;
40
- justify-content: center;
41
- width: 20px;
36
+ .c-list-item-icon {
37
+ flex: none;
42
38
  }
43
39
  </style>
@@ -0,0 +1,156 @@
1
+ <template>
2
+ <span
3
+ :aria-label="accessibleText || $t('Loading...')"
4
+ class="c-loader"
5
+ :data-size="computedSize"
6
+ data-test="loader"
7
+ role="progressbar"
8
+ :style="{
9
+ '--indicator-color': indicatorColorCode,
10
+ '--loader-size': SIZE_TO_FONT_SIZE[computedSize],
11
+ '--track-color': trackColorCode,
12
+ '--track-width': SIZE_TO_TRACK_WIDTH[computedSize],
13
+ }"
14
+ >
15
+ <svg class="c-loader__svg">
16
+ <circle class="c-loader__track" />
17
+ <circle class="c-loader__indicator" />
18
+ </svg>
19
+ </span>
20
+ </template>
21
+
22
+ <script lang="ts">
23
+ import { type PropType, computed, defineComponent } from 'vue';
24
+
25
+ import Colors, { type HexColor, isValidColor } from '@propelinc/citrus-ui/src/colors/colors';
26
+ import { useCssColor } from '@propelinc/citrus-ui/src/composables/colors';
27
+
28
+ type Size = 'sm' | 'md' | 'lg';
29
+
30
+ const SIZE_TO_FONT_SIZE: Record<Size, `${number}px`> = {
31
+ sm: '20px',
32
+ md: '26px',
33
+ lg: '32px',
34
+ };
35
+
36
+ const SIZE_TO_TRACK_WIDTH: Record<Size, `${number}px`> = {
37
+ sm: '2.5px',
38
+ md: '3px',
39
+ lg: '3px',
40
+ };
41
+
42
+ export default defineComponent({
43
+ props: {
44
+ /** Customizes screen reader only text alternative, should be translated */
45
+ accessibleText: { type: String, default: undefined },
46
+ /** Sets the color of the indicator of the loader */
47
+ color: {
48
+ type: String as PropType<HexColor | keyof typeof Colors>,
49
+ default: 'default',
50
+ validator: isValidColor,
51
+ },
52
+ /** @deprecated Shows a smaller version of the loading icon */
53
+ small: { type: Boolean, default: false },
54
+ /** Sets the size of the loader */
55
+ size: { type: String as PropType<Size>, default: 'lg' },
56
+ /** Sets the color of the track of the loader */
57
+ trackColor: {
58
+ type: String as PropType<HexColor | keyof typeof Colors>,
59
+ default: 'default',
60
+ validator: isValidColor,
61
+ },
62
+ },
63
+ setup(props) {
64
+ const computedColor = computed(() => {
65
+ return props.color === 'default' ? 'black' : props.color;
66
+ });
67
+
68
+ const computedTrackColor = computed(() => {
69
+ // If _any_ trackColor is provided, use that
70
+ if (props.trackColor !== 'default') {
71
+ return props.trackColor;
72
+ }
73
+
74
+ // trackColor is 'default', determine which default color it should use
75
+ if (props.color === 'white' || props.color === Colors.WHITE) {
76
+ return 'gray-500';
77
+ }
78
+
79
+ return 'gray-200';
80
+ });
81
+
82
+ const computedSize = computed((): Size => {
83
+ if (props.small) {
84
+ return 'sm';
85
+ }
86
+ return props.size;
87
+ });
88
+
89
+ const { cssColor: indicatorColorCode } = useCssColor(computedColor);
90
+ const { cssColor: trackColorCode } = useCssColor(computedTrackColor);
91
+
92
+ return {
93
+ computedSize,
94
+ indicatorColorCode,
95
+ SIZE_TO_FONT_SIZE,
96
+ SIZE_TO_TRACK_WIDTH,
97
+ trackColorCode,
98
+ };
99
+ },
100
+ });
101
+ </script>
102
+
103
+ <style lang="scss" scoped>
104
+ .c-loader {
105
+ display: inline-flex;
106
+ font-size: var(--loader-size);
107
+ height: 1em;
108
+ width: 1em;
109
+
110
+ &__svg {
111
+ flex: 1 1 auto;
112
+ height: 100%;
113
+ overflow: visible;
114
+ width: 100%;
115
+ }
116
+
117
+ &__indicator,
118
+ &__track {
119
+ cx: 0.5em;
120
+ cy: 0.5em;
121
+ fill: none;
122
+ r: calc(0.5em - var(--track-width) / 2);
123
+ stroke-width: var(--track-width);
124
+ }
125
+
126
+ &__indicator {
127
+ animation: spin 2000ms linear infinite;
128
+ stroke: var(--indicator-color);
129
+ stroke-dasharray: 150% 75%;
130
+ stroke-linecap: round;
131
+ transform-origin: 50% 50%;
132
+ }
133
+
134
+ &__track {
135
+ stroke: var(--track-color);
136
+ transform-origin: 0% 0%;
137
+ }
138
+
139
+ @keyframes spin {
140
+ 0% {
141
+ stroke-dasharray: 0.05em 3em;
142
+ transform: rotate(0deg);
143
+ }
144
+
145
+ 50% {
146
+ stroke-dasharray: 1.375em 1.375em;
147
+ transform: rotate(450deg);
148
+ }
149
+
150
+ 100% {
151
+ stroke-dasharray: 0.05em 3em;
152
+ transform: rotate(1080deg);
153
+ }
154
+ }
155
+ }
156
+ </style>
@@ -0,0 +1,23 @@
1
+ <template>
2
+ <img :src="src" :alt="$t('{appName}')" />
3
+ </template>
4
+
5
+ <script lang="ts">
6
+ import { computed, defineComponent } from 'vue';
7
+
8
+ import propelIcon from '@propelinc/citrus-ui/src/assets/logos/propel/icon.svg';
9
+ import propelLockup from '@propelinc/citrus-ui/src/assets/logos/propel/lockup.svg';
10
+
11
+ export default defineComponent({
12
+ props: {
13
+ /** Show just the orange icon */
14
+ icon: { type: Boolean, default: false },
15
+ },
16
+ setup(props) {
17
+ const src = computed(() => {
18
+ return props.icon ? propelIcon : propelLockup;
19
+ });
20
+ return { src };
21
+ },
22
+ });
23
+ </script>
@@ -0,0 +1,118 @@
1
+ <template>
2
+ <CTextField
3
+ v-bind="$attrs"
4
+ :id="id"
5
+ ref="textField"
6
+ :data-test="dataTest"
7
+ :data-mask="mask"
8
+ :value="maskedValue"
9
+ :label="label"
10
+ :placeholder="placeholder"
11
+ :minlength="maskedMinLength !== null ? maskedMinLength : undefined"
12
+ :maxlength="maskedMaxLength !== null ? maskedMaxLength : undefined"
13
+ :rules="unmaskRules ? unmaskedRules : rules"
14
+ :counter="counter"
15
+ :counter-value="counterValue"
16
+ @keyup="$emit('keyup', $event)"
17
+ @keydown="$emit('keydown', $event)"
18
+ @keypress="$emit('keypress', $event)"
19
+ @blur="$emit('blur', $event)"
20
+ @focus="$emit('focus', $event)"
21
+ @change="$emit('change', $event)"
22
+ >
23
+ <template #label>
24
+ <slot name="label" />
25
+ </template>
26
+ <template #prepend-inner>
27
+ <slot name="prepend-inner" />
28
+ </template>
29
+ <template #append>
30
+ <slot name="append" />
31
+ </template>
32
+ <template #message>
33
+ <slot name="message" />
34
+ </template>
35
+ </CTextField>
36
+ </template>
37
+
38
+ <script lang="ts">
39
+ import type { MaskOptions, MaskTokens, MaskaDetail } from 'maska';
40
+ import { type PropType, computed, defineComponent, ref, toRefs } from 'vue';
41
+
42
+ import CTextField from '@propelinc/citrus-ui/src/components/CTextField.vue';
43
+ import {
44
+ useInputMask,
45
+ useMaskedMaxLength,
46
+ useMaskedMinLength,
47
+ } from '@propelinc/citrus-ui/src/composables/input-mask';
48
+ import type { Rules } from '@propelinc/citrus-ui/src/composables/validations';
49
+
50
+ export default defineComponent({
51
+ name: 'CMaskedTextField',
52
+ components: { CTextField },
53
+ props: {
54
+ counter: { type: Number as PropType<number | null>, default: null },
55
+ dataTest: { type: String, default: 'masked-text-field' },
56
+ id: { type: String, default: undefined },
57
+ label: { type: String as PropType<string | null>, default: null },
58
+ mask: {
59
+ type: [String, Array, Function] as PropType<MaskOptions['mask'] | null>,
60
+ required: true,
61
+ },
62
+ minlength: { type: [Number, String], default: null },
63
+ maxlength: { type: [Number, String], default: null },
64
+ placeholder: { type: String, default: undefined },
65
+ rules: { type: Array as PropType<Rules<string>>, default: () => [] },
66
+ tokens: { type: Object as PropType<MaskTokens | null>, default: null },
67
+ unmaskRules: { type: Boolean, default: true },
68
+ value: { type: String, default: '' },
69
+ },
70
+ emits: ['keyup', 'keydown', 'keypress', 'input', 'focus', 'blur', 'change', 'input:masked'],
71
+ setup(props, { emit, expose }) {
72
+ const { minlength, maxlength, value } = toRefs(props);
73
+
74
+ const textField = ref<typeof CTextField | null>(null);
75
+ const input = computed(() => textField.value?.input);
76
+ const maskOptions = computed<MaskOptions>(() => {
77
+ return {
78
+ mask: props.mask,
79
+ tokens: {
80
+ // NOTE (ej): For the EBT Card Number we accept a mask 'N' from the server
81
+ // to hide all but the last 4 digits. e.g. XXXXXXXXXXXXXXX2114
82
+ N: { pattern: /[0-9X]/ },
83
+ ...props.tokens,
84
+ },
85
+ onMaska: (detail: MaskaDetail): void => {
86
+ emit('input', detail.unmasked);
87
+ emit('input:masked', detail.masked);
88
+ },
89
+ };
90
+ });
91
+
92
+ const { maskedValue, mask: inputMask, unmaskedValue } = useInputMask(input, value, maskOptions);
93
+ const maskedMinLength = useMaskedMinLength(minlength, value, maskOptions);
94
+ const maskedMaxLength = useMaskedMaxLength(maxlength, maskOptions);
95
+ const counterValue = computed<number>(() => unmaskedValue.value.length);
96
+
97
+ const unmaskedRules = computed<Rules<string>>(() => {
98
+ return props.rules.map((rule) => {
99
+ return (value): string | boolean => {
100
+ const unmaskedValue = inputMask.value?.unmasked(value) ?? value;
101
+ return rule(unmaskedValue);
102
+ };
103
+ });
104
+ });
105
+
106
+ expose({ input });
107
+
108
+ return {
109
+ counterValue,
110
+ maskedMinLength,
111
+ maskedMaxLength,
112
+ maskedValue,
113
+ textField,
114
+ unmaskedRules,
115
+ };
116
+ },
117
+ });
118
+ </script>
@@ -0,0 +1,24 @@
1
+ <template>
2
+ <sl-menu class="c-menu pa-0 elevation-4" @sl-select="$emit('select', $event.detail.item)">
3
+ <slot />
4
+ </sl-menu>
5
+ </template>
6
+
7
+ <script lang="ts">
8
+ import '@shoelace-style/shoelace/dist/components/menu/menu.js';
9
+ import { defineComponent } from 'vue';
10
+ export type { default as SlMenuItem } from '@shoelace-style/shoelace/dist/components/menu-item/menu-item.js';
11
+
12
+ export default defineComponent({
13
+ name: 'CMenu',
14
+ emits: ['select'],
15
+ });
16
+ </script>
17
+
18
+ <style lang="scss" scoped>
19
+ @import '@propelinc/citrus-ui/src/styles/core';
20
+
21
+ .c-menu {
22
+ --sl-panel-border-width: $border-width;
23
+ }
24
+ </style>
@@ -0,0 +1,106 @@
1
+ <template>
2
+ <sl-menu-item
3
+ :type="checkable ? 'checkbox' : 'normal'"
4
+ :checked="checked"
5
+ class="menu-item"
6
+ :class="{ selectable }"
7
+ @click="onClick"
8
+ >
9
+ <div slot="prefix">
10
+ <slot name="prepend-inner">
11
+ <template v-if="checkable">
12
+ <CCheckbox
13
+ v-if="checkType === 'checkbox'"
14
+ :value="checked"
15
+ variant="minimal"
16
+ hide-details
17
+ aria-hidden="true"
18
+ class="checkbox mr-3"
19
+ />
20
+ <div v-else class="check-icon mr-3">
21
+ <FontAwesomeIcon v-if="checked" :icon="faCheck" />
22
+ </div>
23
+ </template>
24
+ </slot>
25
+ </div>
26
+ <slot />
27
+ </sl-menu-item>
28
+ </template>
29
+
30
+ <script lang="ts">
31
+ import { faCheck } from '@fortawesome/pro-regular-svg-icons';
32
+ import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
33
+ import { type PropType, defineComponent } from 'vue';
34
+
35
+ import '@shoelace-style/shoelace/dist/components/menu-item/menu-item.js';
36
+ import CCheckbox from '@propelinc/citrus-ui/src/components/CCheckbox.vue';
37
+
38
+ export default defineComponent({
39
+ name: 'CMenuItem',
40
+ components: { CCheckbox, FontAwesomeIcon },
41
+ props: {
42
+ /** Controls whether the item has hover-state styles and responds to click events */
43
+ selectable: { type: Boolean, default: true },
44
+ /** Controls whether to enable and display a checked state */
45
+ checkable: { type: Boolean },
46
+ /** Reflects the item's checked state */
47
+ checked: { type: Boolean },
48
+ /** Controls what style of checking to apply, either a checkbox, or just a check icon */
49
+ checkType: { type: String as PropType<'checkbox' | 'icon'>, default: 'checkbox' },
50
+ },
51
+ setup(props) {
52
+ const onClick = (e: Event): void => {
53
+ if (!props.selectable) {
54
+ e.preventDefault();
55
+ e.stopPropagation();
56
+ }
57
+ };
58
+
59
+ return { faCheck, onClick };
60
+ },
61
+ });
62
+ </script>
63
+
64
+ <style lang="scss" scoped>
65
+ @import '@propelinc/citrus-ui/src/styles/core';
66
+
67
+ .menu-item {
68
+ &::part(base) {
69
+ @include body-emphasized;
70
+
71
+ --sl-spacing-x-small: 12px;
72
+
73
+ align-items: center;
74
+ background-color: $color-white;
75
+ color: $color-black;
76
+ cursor: initial;
77
+ padding: 12px 16px;
78
+ }
79
+
80
+ &.selectable::part(base):hover {
81
+ background-color: var(--sl-color-neutral-100);
82
+ color: var(--sl-color-neutral-1000);
83
+ cursor: pointer;
84
+ }
85
+
86
+ &::part(checked-icon) {
87
+ // Hide Shoelace's built-in checkmark, as it is not customizable and does not match our standard
88
+ // checkmark icon.
89
+ display: none;
90
+ }
91
+
92
+ &::part(submenu-icon) {
93
+ display: none;
94
+ }
95
+
96
+ .checkbox {
97
+ // We're using CCheckbox exclusively as a visual reflection of sl-menu-item's internal checked
98
+ // state, so it should not capture any mouse events.
99
+ pointer-events: none;
100
+ }
101
+
102
+ .check-icon {
103
+ width: 14px;
104
+ }
105
+ }
106
+ </style>
@@ -0,0 +1,26 @@
1
+ <template>
2
+ <sl-menu-label class="menu-label pt-3 px-4">
3
+ <slot />
4
+ </sl-menu-label>
5
+ </template>
6
+
7
+ <script lang="ts">
8
+ import '@shoelace-style/shoelace/dist/components/menu-label/menu-label.js';
9
+ import { defineComponent } from 'vue';
10
+
11
+ export default defineComponent({
12
+ name: 'CMenuLabel',
13
+ });
14
+ </script>
15
+
16
+ <style lang="scss" scoped>
17
+ @import '@propelinc/citrus-ui/src/styles/core';
18
+
19
+ .menu-label {
20
+ &::part(base) {
21
+ @include eyebrow;
22
+
23
+ padding: 0;
24
+ }
25
+ }
26
+ </style>