@cfpb/cfpb-design-system 4.2.4 → 4.3.1

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 (218) hide show
  1. package/CHANGELOG.md +186 -1
  2. package/dist/components/cfpb-buttons/index.css +1 -1
  3. package/dist/components/cfpb-buttons/index.css.map +2 -2
  4. package/dist/components/cfpb-buttons/index.js +1 -1
  5. package/dist/components/cfpb-buttons/index.js.map +1 -1
  6. package/dist/components/cfpb-expandables/index.css +1 -1
  7. package/dist/components/cfpb-expandables/index.css.map +2 -2
  8. package/dist/components/cfpb-expandables/index.js +1 -1
  9. package/dist/components/cfpb-expandables/index.js.map +4 -4
  10. package/dist/components/cfpb-forms/index.css +1 -1
  11. package/dist/components/cfpb-forms/index.css.map +2 -2
  12. package/dist/components/cfpb-forms/index.js +1 -1
  13. package/dist/components/cfpb-forms/index.js.map +2 -2
  14. package/dist/components/cfpb-icons/index.css +1 -1
  15. package/dist/components/cfpb-icons/index.css.map +2 -2
  16. package/dist/components/cfpb-icons/index.js +1 -1
  17. package/dist/components/cfpb-icons/index.js.map +1 -1
  18. package/dist/components/cfpb-layout/index.css +1 -1
  19. package/dist/components/cfpb-layout/index.css.map +2 -2
  20. package/dist/components/cfpb-layout/index.js +1 -1
  21. package/dist/components/cfpb-layout/index.js.map +1 -1
  22. package/dist/components/cfpb-notifications/index.css +1 -1
  23. package/dist/components/cfpb-notifications/index.css.map +2 -2
  24. package/dist/components/cfpb-notifications/index.js +1 -1
  25. package/dist/components/cfpb-notifications/index.js.map +1 -1
  26. package/dist/components/cfpb-pagination/index.css +1 -1
  27. package/dist/components/cfpb-pagination/index.css.map +2 -2
  28. package/dist/components/cfpb-pagination/index.js +1 -1
  29. package/dist/components/cfpb-pagination/index.js.map +1 -1
  30. package/dist/components/cfpb-tables/index.css +1 -1
  31. package/dist/components/cfpb-tables/index.css.map +2 -2
  32. package/dist/components/cfpb-tables/index.js +1 -1
  33. package/dist/components/cfpb-tables/index.js.map +1 -1
  34. package/dist/components/cfpb-tooltips/index.css +1 -1
  35. package/dist/components/cfpb-tooltips/index.css.map +2 -2
  36. package/dist/components/cfpb-tooltips/index.js +1 -1
  37. package/dist/components/cfpb-tooltips/index.js.map +1 -1
  38. package/dist/components/cfpb-typography/index.css +1 -1
  39. package/dist/components/cfpb-typography/index.css.map +2 -2
  40. package/dist/components/cfpb-typography/index.js +1 -1
  41. package/dist/components/cfpb-typography/index.js.map +1 -1
  42. package/dist/elements/abstracts/index.js +2 -0
  43. package/dist/elements/abstracts/index.js.map +7 -0
  44. package/dist/elements/base/index.css +3 -0
  45. package/dist/elements/base/index.css.map +7 -0
  46. package/dist/elements/base/index.js +2 -0
  47. package/dist/elements/base/index.js.map +7 -0
  48. package/dist/elements/cfpb-button/index.js +4 -4
  49. package/dist/elements/cfpb-button/index.js.map +3 -3
  50. package/dist/elements/cfpb-checkbox-icon/index.js +29 -0
  51. package/dist/elements/{cfpb-checkbox → cfpb-checkbox-icon}/index.js.map +4 -4
  52. package/dist/elements/cfpb-expandable/index.css +2 -0
  53. package/dist/elements/cfpb-expandable/index.css.map +7 -0
  54. package/dist/elements/cfpb-expandable/index.js +33 -0
  55. package/dist/elements/cfpb-expandable/index.js.map +7 -0
  56. package/dist/elements/cfpb-file-upload/index.js +4 -4
  57. package/dist/elements/cfpb-file-upload/index.js.map +3 -3
  58. package/dist/elements/cfpb-form-alert/index.js +32 -0
  59. package/dist/elements/cfpb-form-alert/index.js.map +7 -0
  60. package/dist/elements/cfpb-form-choice/index.js +12 -3
  61. package/dist/elements/cfpb-form-choice/index.js.map +4 -4
  62. package/dist/elements/cfpb-form-search/index.js +41 -0
  63. package/dist/elements/cfpb-form-search/index.js.map +7 -0
  64. package/dist/elements/cfpb-form-search-input/index.js +41 -0
  65. package/dist/elements/cfpb-form-search-input/index.js.map +7 -0
  66. package/dist/elements/cfpb-icon-text/index.js +3 -3
  67. package/dist/elements/cfpb-icon-text/index.js.map +3 -3
  68. package/dist/elements/cfpb-label/index.js +3 -3
  69. package/dist/elements/cfpb-label/index.js.map +2 -2
  70. package/dist/elements/cfpb-list/index.js +39 -0
  71. package/dist/elements/cfpb-list/index.js.map +7 -0
  72. package/dist/elements/cfpb-list-item/index.js +39 -0
  73. package/dist/elements/cfpb-list-item/index.js.map +7 -0
  74. package/dist/elements/cfpb-multiselect/index.js +13 -4
  75. package/dist/elements/cfpb-multiselect/index.js.map +4 -4
  76. package/dist/elements/cfpb-pagination/index.js +3 -3
  77. package/dist/elements/cfpb-pagination/index.js.map +2 -2
  78. package/dist/elements/cfpb-select/index.css +2 -0
  79. package/dist/elements/cfpb-select/index.css.map +7 -0
  80. package/dist/elements/cfpb-select/index.js +42 -0
  81. package/dist/elements/cfpb-select/index.js.map +7 -0
  82. package/dist/elements/cfpb-select-list/index.js +39 -0
  83. package/dist/elements/cfpb-select-list/index.js.map +7 -0
  84. package/dist/elements/cfpb-tag-filter/index.js +3 -3
  85. package/dist/elements/cfpb-tag-filter/index.js.map +3 -3
  86. package/dist/elements/cfpb-tag-group/index.js +3 -3
  87. package/dist/elements/cfpb-tag-group/index.js.map +4 -4
  88. package/dist/elements/cfpb-tag-topic/index.js +4 -4
  89. package/dist/elements/cfpb-tag-topic/index.js.map +2 -2
  90. package/dist/elements/index.css +2 -0
  91. package/dist/elements/index.css.map +7 -0
  92. package/dist/elements/index.js +7 -6
  93. package/dist/elements/index.js.map +4 -4
  94. package/dist/index.css +1 -1
  95. package/dist/index.css.map +3 -3
  96. package/dist/index.js +7 -6
  97. package/dist/index.js.map +4 -4
  98. package/dist/utilities/index.css +1 -1
  99. package/dist/utilities/index.css.map +2 -2
  100. package/dist/utilities/index.js +1 -1
  101. package/dist/utilities/index.js.map +4 -4
  102. package/package.json +1 -1
  103. package/src/components/cfpb-buttons/button-group.scss +1 -1
  104. package/src/components/cfpb-buttons/button-link.scss +10 -54
  105. package/src/components/cfpb-buttons/button.scss +3 -3
  106. package/src/components/cfpb-buttons/vars.scss +1 -1
  107. package/src/components/cfpb-expandables/expandable-group.scss +1 -1
  108. package/src/components/cfpb-expandables/expandable.js +3 -0
  109. package/src/components/cfpb-expandables/expandable.scss +1 -1
  110. package/src/components/cfpb-expandables/summary.scss +1 -1
  111. package/src/components/cfpb-forms/form-alert.scss +1 -1
  112. package/src/components/cfpb-forms/form-field.scss +6 -6
  113. package/src/components/cfpb-forms/form.scss +1 -1
  114. package/src/components/cfpb-forms/label.scss +2 -2
  115. package/src/components/cfpb-forms/multiselect.js +1 -1
  116. package/src/components/cfpb-forms/multiselect.scss +1 -1
  117. package/src/components/cfpb-forms/range.scss +7 -7
  118. package/src/components/cfpb-forms/search-input.scss +1 -1
  119. package/src/components/cfpb-forms/select.scss +1 -1
  120. package/src/components/cfpb-forms/tag.scss +1 -1
  121. package/src/components/cfpb-forms/text-input.scss +1 -1
  122. package/src/components/cfpb-icons/icon.scss +1 -1
  123. package/src/components/cfpb-layout/card-group.scss +1 -1
  124. package/src/components/cfpb-layout/card.scss +1 -1
  125. package/src/components/cfpb-layout/email-signup.scss +1 -1
  126. package/src/components/cfpb-layout/featured-content-module.scss +1 -1
  127. package/src/components/cfpb-layout/hero.scss +1 -1
  128. package/src/components/cfpb-layout/layout.scss +9 -9
  129. package/src/components/cfpb-layout/well.scss +1 -1
  130. package/src/components/cfpb-notifications/banner.scss +1 -1
  131. package/src/components/cfpb-notifications/notification.scss +1 -1
  132. package/src/components/cfpb-pagination/pagination.scss +1 -1
  133. package/src/components/cfpb-tables/table.scss +1 -1
  134. package/src/components/cfpb-tooltips/tooltip.scss +1 -1
  135. package/src/components/cfpb-typography/date.scss +1 -1
  136. package/src/components/cfpb-typography/list.scss +1 -1
  137. package/src/components/cfpb-typography/meta-header.scss +1 -1
  138. package/src/components/cfpb-typography/mixins.scss +1 -1
  139. package/src/components/cfpb-typography/pull-quote.scss +1 -1
  140. package/src/components/cfpb-typography/slug-header.scss +1 -1
  141. package/src/components/cfpb-typography/tagline.scss +1 -1
  142. package/src/elements/abstracts/custom-props.css +123 -0
  143. package/src/{abstracts → elements/abstracts}/grid-mixins.scss +2 -1
  144. package/src/{abstracts → elements/abstracts}/heading-mixins.scss +1 -0
  145. package/src/{abstracts → elements/abstracts}/index.scss +1 -0
  146. package/src/{abstracts → elements/abstracts}/media-queries.scss +1 -1
  147. package/src/elements/abstracts/sizing-vars.scss +66 -0
  148. package/src/elements/abstracts/vars.css +79 -0
  149. package/src/{base → elements/base}/base.scss +14 -14
  150. package/src/elements/cfpb-button/cfpb-button-group.scss +12 -0
  151. package/src/elements/cfpb-button/cfpb-button-link.scss +103 -0
  152. package/src/elements/cfpb-button/cfpb-button.component.scss +11 -4
  153. package/src/elements/cfpb-button/cfpb-button.scss +218 -0
  154. package/src/elements/cfpb-button/index.js +44 -30
  155. package/src/elements/cfpb-button/vars.css +30 -0
  156. package/src/elements/cfpb-checkbox-icon/cfpb-checkbox-icon.component.scss +88 -0
  157. package/src/elements/cfpb-checkbox-icon/index.js +104 -0
  158. package/src/elements/cfpb-expandable/cfpb-expandable.component.scss +218 -0
  159. package/src/elements/cfpb-expandable/index.js +127 -0
  160. package/src/elements/cfpb-file-upload/cfpb-file-upload.component.scss +2 -2
  161. package/src/elements/cfpb-file-upload/index.js +25 -27
  162. package/src/elements/cfpb-form-alert/cfpb-form-alert.component.scss +36 -0
  163. package/src/elements/cfpb-form-alert/index.js +55 -0
  164. package/src/elements/cfpb-form-choice/cfpb-form-choice.component.scss +42 -81
  165. package/src/elements/cfpb-form-choice/index.js +58 -18
  166. package/src/elements/cfpb-form-search/cfpb-form-search.component.scss +54 -0
  167. package/src/elements/cfpb-form-search/index.js +194 -0
  168. package/src/elements/cfpb-form-search-input/cfpb-form-search-input.component.scss +217 -0
  169. package/src/elements/cfpb-form-search-input/index.js +140 -0
  170. package/src/elements/cfpb-icon-text/cfpb-icon-text.component.scss +33 -39
  171. package/src/elements/cfpb-icon-text/index.js +32 -104
  172. package/src/elements/cfpb-label/cfpb-label.component.scss +2 -2
  173. package/src/elements/cfpb-label/index.js +6 -9
  174. package/src/elements/cfpb-list/cfpb-list.component.scss +34 -0
  175. package/src/elements/cfpb-list/index.js +379 -0
  176. package/src/elements/cfpb-list/index.spec.js +214 -0
  177. package/src/elements/cfpb-list-item/cfpb-list-item.component.scss +69 -0
  178. package/src/elements/cfpb-list-item/index.js +215 -0
  179. package/src/elements/cfpb-pagination/cfpb-pagination.component.scss +2 -7
  180. package/src/elements/cfpb-pagination/index.js +6 -8
  181. package/src/elements/cfpb-select/cfpb-select.component.scss +241 -0
  182. package/src/elements/cfpb-select/index.js +371 -0
  183. package/src/elements/cfpb-select/multiple-select-event-proxy.js +88 -0
  184. package/src/elements/cfpb-select/single-select-event-proxy.js +47 -0
  185. package/src/elements/cfpb-tag-filter/cfpb-tag-filter.component.scss +6 -3
  186. package/src/elements/cfpb-tag-filter/index.js +15 -7
  187. package/src/elements/cfpb-tag-group/cfpb-tag-group.component.scss +2 -2
  188. package/src/elements/cfpb-tag-group/index.js +53 -6
  189. package/src/elements/cfpb-tag-topic/cfpb-tag-topic.component.scss +2 -2
  190. package/src/elements/cfpb-tag-topic/index.js +5 -7
  191. package/src/elements/cfpb-utilities/parse-child-data.js +50 -0
  192. package/src/elements/cfpb-utilities/parse-child-data.spec.js +56 -0
  193. package/src/elements/cfpb-utilities/search-service.js +46 -0
  194. package/src/elements/cfpb-utilities/search-service.spec.js +138 -0
  195. package/src/elements/cfpb-utilities/transition/transition.scss +98 -0
  196. package/src/elements/index.js +7 -1
  197. package/src/index.js +2 -2
  198. package/src/index.scss +14 -2
  199. package/src/tokens/abstracts/custom-props.json +1642 -0
  200. package/src/tokens/abstracts/vars.json +1319 -0
  201. package/src/tokens/cfpb-button/vars.json +436 -0
  202. package/src/utilities/breakpoint-state.js +1 -1
  203. package/src/utilities/transition/max-height-transition.js +74 -0
  204. package/src/utilities/utilities.scss +1 -1
  205. package/dist/elements/cfpb-checkbox/index.js +0 -29
  206. package/src/abstracts/custom-props.scss +0 -175
  207. package/src/abstracts/vars.scss +0 -184
  208. package/src/elements/cfpb-multiselect/cfpb-multiselect.component.scss +0 -225
  209. package/src/elements/cfpb-multiselect/index.js +0 -444
  210. package/src/elements/cfpb-multiselect/multiselect-model.js +0 -288
  211. package/src/elements/cfpb-multiselect/multiselect-model.spec.js +0 -236
  212. /package/src/{abstracts → elements/abstracts}/index.js +0 -0
  213. /package/src/{abstracts → elements/abstracts}/vars-breakpoints.js +0 -0
  214. /package/src/{abstracts → elements/abstracts}/vars-breakpoints.scss +0 -0
  215. /package/src/{base → elements/base}/font.scss +0 -0
  216. /package/src/{base → elements/base}/index.js +0 -0
  217. /package/src/{base → elements/base}/index.scss +0 -0
  218. /package/src/{base → elements/base}/normalize.scss +0 -0
@@ -0,0 +1,218 @@
1
+ @use 'sass:math';
2
+ @use './vars' as *;
3
+ @use '@cfpb/cfpb-design-system/src/elements/abstracts' as *;
4
+ @use '@cfpb/cfpb-design-system/src/elements/cfpb-icon-text/cfpb-icon-text.component' as *;
5
+
6
+ :host {
7
+ //
8
+ // Default button
9
+ //
10
+
11
+ button.a-btn::-moz-focus-inner,
12
+ input.a-btn::-moz-focus-inner {
13
+ // Fixes inconsistent button.btn height in Firefox.
14
+ // Helps with inconsistent input.btn height in Firefox but not completely.
15
+ border: 0;
16
+ }
17
+
18
+ .a-btn {
19
+ line-height: math.div(19px, $base-font-size-px);
20
+ appearance: none;
21
+ display: flex;
22
+ gap: math.div(10px, $base-font-size-px) + rem;
23
+
24
+ box-sizing: border-box;
25
+ padding: math.div($btn-v-padding, $btn-font-size) + em
26
+ math.div($btn-h-padding, $btn-font-size) + em;
27
+ border: 0;
28
+ margin: 0;
29
+ border-radius: math.div($btn-border-radius-size, $btn-font-size) + em;
30
+ cursor: pointer;
31
+ font-size: math.div($btn-font-size, $base-font-size-px) + em;
32
+ font-weight: 500;
33
+ text-align: center;
34
+ text-decoration: none;
35
+ transition: background-color 0.1s;
36
+ width: fit-content;
37
+ height: fit-content;
38
+ justify-content: center;
39
+ align-items: center;
40
+
41
+ &,
42
+ &:link,
43
+ &:visited {
44
+ background-color: var(--btn-bg);
45
+ color: var(--btn-text);
46
+ }
47
+
48
+ &:hover,
49
+ &.hover,
50
+ &:focus,
51
+ &.focus {
52
+ background-color: var(--btn-bg-hover);
53
+ color: var(--btn-text);
54
+ }
55
+
56
+ &:focus,
57
+ &.focus {
58
+ outline: 1px dotted var(--btn-bg);
59
+
60
+ // The outline-offset property is not supported everywhere (e.g. IE)
61
+ // but it adds a nice touch in browsers where it is.
62
+ outline-offset: 1px;
63
+ }
64
+
65
+ &:active,
66
+ &.active {
67
+ background-color: var(--btn-bg-active);
68
+ }
69
+
70
+ //
71
+ // Secondary button
72
+ //
73
+
74
+ &--secondary {
75
+ &,
76
+ &:link,
77
+ &:visited {
78
+ background-color: var(--btn-secondary-bg);
79
+ color: var(--btn-secondary-text);
80
+ box-shadow: 0 0 0 1px var(--btn-secondary-border) inset;
81
+ }
82
+
83
+ &:hover,
84
+ &.hover,
85
+ &:focus,
86
+ &.focus {
87
+ background-color: var(--btn-secondary-bg-hover);
88
+ color: var(--btn-secondary-text-hover);
89
+ box-shadow: 0 0 0 1px var(--btn-secondary-border-hover) inset;
90
+ }
91
+
92
+ &:focus,
93
+ &.focus {
94
+ outline-color: var(--btn-secondary-border);
95
+ }
96
+
97
+ &:active,
98
+ &.active {
99
+ background-color: var(--btn-secondary-bg-active);
100
+ color: var(--btn-secondary-text-active);
101
+ box-shadow: 0 0 0 1px var(--btn-secondary-border-active) inset;
102
+ }
103
+ }
104
+
105
+ //
106
+ // Destructive action button
107
+ //
108
+
109
+ &--warning {
110
+ &,
111
+ &:link,
112
+ &:visited {
113
+ background-color: var(--btn-warning-bg);
114
+ color: var(--btn-warning-text);
115
+ }
116
+
117
+ &:hover,
118
+ &.hover,
119
+ &:focus,
120
+ &.focus {
121
+ background-color: var(--btn-warning-bg-hover);
122
+ }
123
+
124
+ &:focus,
125
+ &.focus {
126
+ outline-color: var(--btn-warning-bg);
127
+ }
128
+
129
+ &:active,
130
+ &.active {
131
+ background-color: var(--btn-warning-bg-active);
132
+ }
133
+ }
134
+
135
+ //
136
+ // Disabled button
137
+ //
138
+
139
+ &--disabled,
140
+ &[disabled],
141
+ &[aria-disabled='true'] {
142
+ &,
143
+ &:link,
144
+ &:visited,
145
+ &:hover,
146
+ &.hover,
147
+ &:focus,
148
+ &.focus,
149
+ &:active,
150
+ &.active {
151
+ background-color: var(--btn-disabled-bg);
152
+ color: var(--btn-disabled-text);
153
+ box-shadow: none; // Added by secondary variant.
154
+ cursor: not-allowed;
155
+ }
156
+
157
+ &:focus,
158
+ &.focus {
159
+ outline-color: var(--btn-disabled-outline);
160
+ }
161
+ }
162
+
163
+ //
164
+ // Full width button on x-small screens
165
+ //
166
+ &--full-on-xs {
167
+ // Mobile only.
168
+ @include respond-to-max($bp-xs-max) {
169
+ width: 100%;
170
+ }
171
+ }
172
+
173
+ // Set either the text or icon as the last item in the button.
174
+ &:has(svg + span) {
175
+ span {
176
+ order: 3;
177
+ }
178
+ }
179
+
180
+ &:has(span + svg) {
181
+ svg {
182
+ order: 3;
183
+
184
+ // Prevent icon from shrinking when button wraps.
185
+ flex: none;
186
+ }
187
+ }
188
+
189
+ // Handle button with icon divider logic.
190
+ &:not(.a-btn--hide-icon):has(svg + span)::before,
191
+ &:not(.a-btn--hide-icon):has(span + svg)::before {
192
+ @include u-btn-divider;
193
+ }
194
+
195
+ // Handle different coloring in divider.
196
+ &--secondary:has(svg)::before {
197
+ border-color: var(--btn-secondary-divider) !important;
198
+ }
199
+
200
+ &--warning:has(svg)::before {
201
+ border-color: var(--btn-warning-divider) !important;
202
+ }
203
+
204
+ &--disabled:has(svg)::before,
205
+ &[disabled]:has(svg)::before,
206
+ &[aria-disabled='true']:has(svg)::before {
207
+ border-color: var(--btn-disabled-divider) !important;
208
+ }
209
+
210
+ // Hide the icon if the a-btn--hide-icon modifier is set.
211
+ // Useful for showing and hiding a loading icon, for example.
212
+ &--hide-icon {
213
+ svg {
214
+ display: none;
215
+ }
216
+ }
217
+ }
218
+ }
@@ -24,41 +24,40 @@ export class CfpbButton extends LitElement {
24
24
  * @property {string} type - The button type: button, submit, or reset.
25
25
  * @property {string} href - The URL to link to (makes the button a link).
26
26
  * @property {boolean} disabled - Whether the button is disabled or not.
27
- * @property {string} variant - The button variant: secondary and warning.
27
+ * @property {string} variant
28
+ * The button variant: primary, secondary, or warning.
28
29
  * @property {boolean} fullOnMobile - Whether to be width 100% on mobile.
29
30
  * @property {boolean} flushLeft - Whether button is not rounded on left.
30
31
  * @property {boolean} flushRight - Whether button is not rounded on right.
31
32
  * @property {boolean} styleAsLink - Style the button as a link.
32
33
  * @returns {object} The map of properties.
33
34
  */
34
- static get properties() {
35
- return {
36
- type: { type: String },
37
- href: { type: String },
38
- disabled: { type: Boolean, reflect: true },
39
- variant: { type: String },
40
- fullOnMobile: {
41
- type: Boolean,
42
- attribute: 'full-on-mobile',
43
- reflect: true,
44
- },
45
- flushLeft: {
46
- type: Boolean,
47
- attribute: 'flush-left',
48
- reflect: true,
49
- },
50
- flushRight: {
51
- type: Boolean,
52
- attribute: 'flush-right',
53
- reflect: true,
54
- },
55
- styleAsLink: {
56
- type: Boolean,
57
- attribute: 'style-as-link',
58
- reflect: true,
59
- },
60
- };
61
- }
35
+ static properties = {
36
+ type: { type: String },
37
+ href: { type: String },
38
+ disabled: { type: Boolean, reflect: true },
39
+ variant: { type: String },
40
+ fullOnMobile: {
41
+ type: Boolean,
42
+ attribute: 'full-on-mobile',
43
+ reflect: true,
44
+ },
45
+ flushLeft: {
46
+ type: Boolean,
47
+ attribute: 'flush-left',
48
+ reflect: true,
49
+ },
50
+ flushRight: {
51
+ type: Boolean,
52
+ attribute: 'flush-right',
53
+ reflect: true,
54
+ },
55
+ styleAsLink: {
56
+ type: Boolean,
57
+ attribute: 'style-as-link',
58
+ reflect: true,
59
+ },
60
+ };
62
61
 
63
62
  // DOM references.
64
63
  #iconTextDom = createRef();
@@ -93,6 +92,17 @@ export class CfpbButton extends LitElement {
93
92
  this.#iconTextDom.value?.showIcon();
94
93
  }
95
94
 
95
+ get dividerColorVar() {
96
+ switch (this.variant) {
97
+ case 'warning':
98
+ return '--btn-warning-divider';
99
+ case 'secondary':
100
+ return '--btn-secondary-divider';
101
+ default:
102
+ return '--btn-divider';
103
+ }
104
+ }
105
+
96
106
  /**
97
107
  * Ensure the variant value is valid, and fall back to a default if not.
98
108
  * @returns {string} A valid variant value string.
@@ -123,7 +133,11 @@ export class CfpbButton extends LitElement {
123
133
 
124
134
  #renderTextAndIcon() {
125
135
  return html`
126
- <cfpb-icon-text ${ref(this.#iconTextDom)} ?disabled=${this.disabled}>
136
+ <cfpb-icon-text
137
+ ${ref(this.#iconTextDom)}
138
+ ?disabled=${this.disabled}
139
+ style="--icon-text-divider: var(${this.dividerColorVar})"
140
+ >
127
141
  <slot></slot>
128
142
  </cfpb-icon-text>
129
143
  `;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Do not edit directly, this file was auto-generated.
3
+ */
4
+
5
+ :root {
6
+ --btn-bg: var(--pacific);
7
+ --btn-bg-active: var(--navy);
8
+ --btn-bg-hover: var(--pacific-dark);
9
+ --btn-disabled-bg: var(--gray-20);
10
+ --btn-disabled-divider: var(--gray-60);
11
+ --btn-disabled-outline: var(--gray-20);
12
+ --btn-disabled-text: var(--gray-dark);
13
+ --btn-divider: var(--pacific-60);
14
+ --btn-secondary-bg: var(--white);
15
+ --btn-secondary-bg-active: var(--pacific-20);
16
+ --btn-secondary-bg-hover: var(--pacific-10);
17
+ --btn-secondary-border: var(--pacific);
18
+ --btn-secondary-border-active: var(--navy);
19
+ --btn-secondary-border-hover: var(--pacific-dark);
20
+ --btn-secondary-divider: var(--pacific-60);
21
+ --btn-secondary-text: var(--pacific);
22
+ --btn-secondary-text-active: var(--navy);
23
+ --btn-secondary-text-hover: var(--pacific-dark);
24
+ --btn-text: var(--white);
25
+ --btn-warning-bg: var(--red-mid-dark);
26
+ --btn-warning-bg-active: var(--gray-dark);
27
+ --btn-warning-bg-hover: var(--red-dark);
28
+ --btn-warning-divider: var(--red-60);
29
+ --btn-warning-text: var(--white);
30
+ }
@@ -0,0 +1,88 @@
1
+ @use 'sass:math';
2
+ @use '@cfpb/cfpb-design-system/src/elements/abstracts' as *;
3
+ @use '@cfpb/cfpb-design-system/src/utilities' as *;
4
+
5
+ :host {
6
+ // Theme variables.
7
+ --choice-border: var(--choice-border-default);
8
+ --choice-border-hover: var(--choice-border-hover-default);
9
+ --choice-bg: var(--choice-bg-default);
10
+ --choice-bg-selected: var(--choice-bg-selected-default);
11
+
12
+ // Private variables.
13
+ --choice-border-width-addendum: 0;
14
+
15
+ .cfpb-checkbox-icon::before {
16
+ display: inline-block;
17
+ grid-row-start: 1;
18
+ grid-row-end: 3;
19
+ border: 1px solid var(--choice-border);
20
+ outline: var(--choice-border-width-addendum) solid var(--choice-border);
21
+ height: math.div(18px, $base-font-size-px) + em;
22
+ width: math.div(18px, $base-font-size-px) + em;
23
+ margin-right: 10px;
24
+ background-color: var(--choice-bg);
25
+ content: '';
26
+ vertical-align: top;
27
+
28
+ // Offset so that the checkbox/radio fits within focused area.
29
+ position: relative;
30
+ top: 1px;
31
+ left: 1px;
32
+ }
33
+
34
+ .checked::before {
35
+ --cfpb-background-icon-svg: 'approved';
36
+ background-size: auto $cf-icon-height;
37
+ background-repeat: no-repeat;
38
+ background-position: center 0;
39
+ }
40
+
41
+ .disabled::before {
42
+ cursor: not-allowed;
43
+
44
+ --choice-border: var(--choice-border-disabled);
45
+ --choice-bg: var(--choice-bg-disabled);
46
+ --choice-bg-selected: var(--choice-bg-selected-disabled);
47
+ }
48
+
49
+ .checked.disabled::before {
50
+ // RGB values are CFPB gray (#5a5d61).
51
+ // For some reason SVG isn't accepting hex values for the fill.
52
+ --cfpb-background-icon-svg: 'approved rgb(90,93,97)';
53
+ }
54
+
55
+ .cfpb-checkbox-icon:not(.disabled, .borderless).focus::before,
56
+ .cfpb-checkbox-icon:not(.disabled, .borderless):focus::before,
57
+ .cfpb-checkbox-icon:not(.disabled, .borderless).hover::before,
58
+ .cfpb-checkbox-icon:not(.disabled, .borderless):hover::before {
59
+ cursor: pointer;
60
+ border-color: var(--choice-border-hover);
61
+ box-shadow: 0 0 0 1px var(--choice-border-hover);
62
+ outline-color: var(--choice-border-hover);
63
+ }
64
+
65
+ .validation-error,
66
+ .validation-warning,
67
+ .validation-success {
68
+ --choice-border-width-addendum: 1px;
69
+ }
70
+
71
+ .validation-error {
72
+ --choice-border: var(--choice-border-error);
73
+ }
74
+
75
+ .validation-warning {
76
+ --choice-border: var(--choice-border-warning);
77
+ }
78
+
79
+ .validation-success {
80
+ --choice-border: var(--choice-border-success);
81
+ }
82
+
83
+ .borderless::before {
84
+ border-color: transparent;
85
+ outline-color: transparent;
86
+ background-color: transparent;
87
+ }
88
+ }
@@ -0,0 +1,104 @@
1
+ import { html, LitElement, css, unsafeCSS } from 'lit';
2
+ import styles from './cfpb-checkbox-icon.component.scss';
3
+
4
+ // The validation states are error, warning, or success.
5
+ const VALID_VALIDATION = ['error', 'warning', 'success'];
6
+
7
+ /**
8
+ * @element cfpb-checkbox-icon
9
+ */
10
+ export class CfpbCheckboxIcon extends LitElement {
11
+ static styles = css`
12
+ ${unsafeCSS(styles)}
13
+ `;
14
+
15
+ #hover;
16
+ #focus;
17
+
18
+ /**
19
+ * @property {boolean} borderless - Whether the checkbox has a border or not.
20
+ * @property {boolean} checked - Whether the checkbox is checked or not.
21
+ * @property {boolean} disabled - Whether the checkbox is disabled or not.
22
+ * @property {string} validation - Validation style: error, warning, success.
23
+ * @returns {object} The map of properties.
24
+ */
25
+ static properties = {
26
+ borderless: { type: Boolean, reflect: true },
27
+ checked: { type: Boolean, reflect: true },
28
+ disabled: { type: Boolean, reflect: true },
29
+ validation: { type: String, reflect: true },
30
+ };
31
+
32
+ constructor() {
33
+ super();
34
+ this.borderless = false;
35
+ this.checked = false;
36
+ this.disabled = false;
37
+ this.validation = '';
38
+ this.#hover = false;
39
+ this.#focus = false;
40
+ }
41
+
42
+ /**
43
+ * Ensure the validation value is valid, and fall back to a default if not.
44
+ * @returns {string|undefined} A valid validation value string, or undefined.
45
+ */
46
+ get #validValidation() {
47
+ return VALID_VALIDATION.includes(this.validation)
48
+ ? this.validation
49
+ : undefined;
50
+ }
51
+
52
+ mouseover() {
53
+ if (!this.disabled) {
54
+ this.#hover = true;
55
+ this.requestUpdate();
56
+ }
57
+ }
58
+
59
+ mouseleave() {
60
+ this.#hover = false;
61
+ this.requestUpdate();
62
+ }
63
+
64
+ focus() {
65
+ if (!this.disabled) {
66
+ this.#focus = true;
67
+ this.requestUpdate();
68
+ }
69
+ }
70
+
71
+ blur() {
72
+ this.#focus = false;
73
+ this.requestUpdate();
74
+ }
75
+
76
+ #computeClassString() {
77
+ return [
78
+ 'cfpb-checkbox-icon',
79
+ this.checked && 'checked',
80
+ this.disabled && 'disabled',
81
+ this.borderless && 'borderless',
82
+ this.#validValidation && `validation-${this.#validValidation}`,
83
+ this.#hover && 'hover',
84
+ this.#focus && 'focus',
85
+ ]
86
+ .filter(Boolean)
87
+ .join(' ');
88
+ }
89
+
90
+ render() {
91
+ return html`
92
+ <div
93
+ class=${this.#computeClassString()}
94
+ ?disabled=${this.disabled}
95
+ aria-hidden="true"
96
+ ></div>
97
+ `;
98
+ }
99
+
100
+ static init() {
101
+ window.customElements.get('cfpb-checkbox-icon') ||
102
+ window.customElements.define('cfpb-checkbox-icon', CfpbCheckboxIcon);
103
+ }
104
+ }