@cfpb/cfpb-design-system 4.2.3 → 4.3.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 (147) hide show
  1. package/CHANGELOG.md +178 -1
  2. package/dist/base/index.css +1 -1
  3. package/dist/base/index.css.map +2 -2
  4. package/dist/base/index.js.map +1 -1
  5. package/dist/components/cfpb-buttons/index.css +1 -1
  6. package/dist/components/cfpb-buttons/index.css.map +2 -2
  7. package/dist/components/cfpb-buttons/index.js.map +1 -1
  8. package/dist/components/cfpb-expandables/index.css.map +1 -1
  9. package/dist/components/cfpb-expandables/index.js +1 -1
  10. package/dist/components/cfpb-expandables/index.js.map +3 -3
  11. package/dist/components/cfpb-forms/index.css +1 -1
  12. package/dist/components/cfpb-forms/index.css.map +2 -2
  13. package/dist/components/cfpb-forms/index.js +1 -1
  14. package/dist/components/cfpb-forms/index.js.map +2 -2
  15. package/dist/components/cfpb-layout/index.css +1 -1
  16. package/dist/components/cfpb-layout/index.css.map +1 -1
  17. package/dist/components/cfpb-notifications/index.css.map +1 -1
  18. package/dist/components/cfpb-pagination/index.css.map +1 -1
  19. package/dist/components/cfpb-tables/index.css.map +1 -1
  20. package/dist/components/cfpb-typography/index.css +1 -1
  21. package/dist/components/cfpb-typography/index.css.map +2 -2
  22. package/dist/components/cfpb-typography/index.js.map +1 -1
  23. package/dist/elements/cfpb-button/index.js +4 -4
  24. package/dist/elements/cfpb-button/index.js.map +3 -3
  25. package/dist/elements/cfpb-checkbox-icon/index.js +29 -0
  26. package/dist/elements/{cfpb-checkbox → cfpb-checkbox-icon}/index.js.map +4 -4
  27. package/dist/elements/cfpb-expandable/index.css +2 -0
  28. package/dist/elements/cfpb-expandable/index.css.map +7 -0
  29. package/dist/elements/cfpb-expandable/index.js +33 -0
  30. package/dist/elements/cfpb-expandable/index.js.map +7 -0
  31. package/dist/elements/cfpb-file-upload/index.js +4 -4
  32. package/dist/elements/cfpb-file-upload/index.js.map +3 -3
  33. package/dist/elements/cfpb-form-alert/index.js +32 -0
  34. package/dist/elements/cfpb-form-alert/index.js.map +7 -0
  35. package/dist/elements/cfpb-form-choice/index.js +12 -3
  36. package/dist/elements/cfpb-form-choice/index.js.map +4 -4
  37. package/dist/elements/cfpb-form-search/index.js +41 -0
  38. package/dist/elements/cfpb-form-search/index.js.map +7 -0
  39. package/dist/elements/cfpb-form-search-input/index.js +41 -0
  40. package/dist/elements/cfpb-form-search-input/index.js.map +7 -0
  41. package/dist/elements/cfpb-icon-text/index.js +3 -3
  42. package/dist/elements/cfpb-icon-text/index.js.map +3 -3
  43. package/dist/elements/cfpb-label/index.js +3 -3
  44. package/dist/elements/cfpb-label/index.js.map +2 -2
  45. package/dist/elements/cfpb-list/index.js +39 -0
  46. package/dist/elements/cfpb-list/index.js.map +7 -0
  47. package/dist/elements/cfpb-list-item/index.js +39 -0
  48. package/dist/elements/cfpb-list-item/index.js.map +7 -0
  49. package/dist/elements/cfpb-multiselect/index.js +13 -4
  50. package/dist/elements/cfpb-multiselect/index.js.map +4 -4
  51. package/dist/elements/cfpb-pagination/index.js +3 -3
  52. package/dist/elements/cfpb-pagination/index.js.map +2 -2
  53. package/dist/elements/cfpb-select/index.css +2 -0
  54. package/dist/elements/cfpb-select/index.css.map +7 -0
  55. package/dist/elements/cfpb-select/index.js +42 -0
  56. package/dist/elements/cfpb-select/index.js.map +7 -0
  57. package/dist/elements/cfpb-select-list/index.js +39 -0
  58. package/dist/elements/cfpb-select-list/index.js.map +7 -0
  59. package/dist/elements/cfpb-tag-filter/index.js +3 -3
  60. package/dist/elements/cfpb-tag-filter/index.js.map +3 -3
  61. package/dist/elements/cfpb-tag-group/index.js +3 -3
  62. package/dist/elements/cfpb-tag-group/index.js.map +4 -4
  63. package/dist/elements/cfpb-tag-topic/index.js +4 -4
  64. package/dist/elements/cfpb-tag-topic/index.js.map +2 -2
  65. package/dist/elements/index.css +2 -0
  66. package/dist/elements/index.css.map +7 -0
  67. package/dist/elements/index.js +7 -6
  68. package/dist/elements/index.js.map +4 -4
  69. package/dist/index.css +1 -1
  70. package/dist/index.css.map +2 -2
  71. package/dist/index.js +7 -6
  72. package/dist/index.js.map +4 -4
  73. package/dist/utilities/index.css.map +1 -1
  74. package/dist/utilities/index.js +1 -1
  75. package/dist/utilities/index.js.map +3 -3
  76. package/package.json +1 -1
  77. package/src/base/base.scss +1 -1
  78. package/src/components/cfpb-buttons/button-link.scss +0 -1
  79. package/src/components/cfpb-expandables/expandable.js +3 -0
  80. package/src/components/cfpb-forms/multiselect.js +1 -1
  81. package/src/components/cfpb-typography/mixins.scss +3 -0
  82. package/src/elements/abstracts/custom-props.css +123 -0
  83. package/src/elements/abstracts/grid-mixins.scss +83 -0
  84. package/src/elements/abstracts/heading-mixins.scss +346 -0
  85. package/src/elements/abstracts/index.scss +7 -0
  86. package/src/elements/abstracts/media-queries.scss +35 -0
  87. package/src/elements/abstracts/sizing-vars.scss +65 -0
  88. package/src/elements/abstracts/vars-breakpoints.scss +16 -0
  89. package/src/elements/abstracts/vars.css +79 -0
  90. package/src/elements/base/base.scss +375 -0
  91. package/src/elements/base/font.scss +27 -0
  92. package/src/elements/base/index.scss +3 -0
  93. package/src/elements/base/normalize.scss +290 -0
  94. package/src/elements/cfpb-button/cfpb-button-group.scss +10 -0
  95. package/src/elements/cfpb-button/cfpb-button-link.scss +96 -0
  96. package/src/elements/cfpb-button/cfpb-button.component.scss +11 -4
  97. package/src/elements/cfpb-button/cfpb-button.scss +222 -0
  98. package/src/elements/cfpb-button/index.js +28 -29
  99. package/src/elements/cfpb-button/vars.css +30 -0
  100. package/src/elements/cfpb-checkbox-icon/cfpb-checkbox-icon.component.scss +88 -0
  101. package/src/elements/cfpb-checkbox-icon/index.js +104 -0
  102. package/src/elements/cfpb-expandable/cfpb-expandable.component.scss +218 -0
  103. package/src/elements/cfpb-expandable/index.js +127 -0
  104. package/src/elements/cfpb-file-upload/cfpb-file-upload.component.scss +2 -2
  105. package/src/elements/cfpb-file-upload/index.js +16 -18
  106. package/src/elements/cfpb-form-alert/cfpb-form-alert.component.scss +36 -0
  107. package/src/elements/cfpb-form-alert/index.js +55 -0
  108. package/src/elements/cfpb-form-choice/cfpb-form-choice.component.scss +42 -81
  109. package/src/elements/cfpb-form-choice/index.js +58 -18
  110. package/src/elements/cfpb-form-search/cfpb-form-search.component.scss +54 -0
  111. package/src/elements/cfpb-form-search/index.js +194 -0
  112. package/src/elements/cfpb-form-search-input/cfpb-form-search-input.component.scss +217 -0
  113. package/src/elements/cfpb-form-search-input/index.js +136 -0
  114. package/src/elements/cfpb-icon-text/cfpb-icon-text.component.scss +32 -39
  115. package/src/elements/cfpb-icon-text/index.js +32 -104
  116. package/src/elements/cfpb-label/cfpb-label.component.scss +2 -2
  117. package/src/elements/cfpb-label/index.js +6 -9
  118. package/src/elements/cfpb-list/cfpb-list.component.scss +23 -0
  119. package/src/elements/cfpb-list/index.js +357 -0
  120. package/src/elements/cfpb-list/index.spec.js +169 -0
  121. package/src/elements/cfpb-list-item/cfpb-list-item.component.scss +69 -0
  122. package/src/elements/cfpb-list-item/index.js +215 -0
  123. package/src/elements/cfpb-pagination/cfpb-pagination.component.scss +2 -7
  124. package/src/elements/cfpb-pagination/index.js +6 -8
  125. package/src/elements/cfpb-select/cfpb-select.component.scss +241 -0
  126. package/src/elements/cfpb-select/index.js +381 -0
  127. package/src/elements/cfpb-tag-filter/cfpb-tag-filter.component.scss +6 -3
  128. package/src/elements/cfpb-tag-filter/index.js +15 -7
  129. package/src/elements/cfpb-tag-group/cfpb-tag-group.component.scss +2 -2
  130. package/src/elements/cfpb-tag-group/index.js +53 -6
  131. package/src/elements/cfpb-tag-topic/index.js +5 -7
  132. package/src/elements/cfpb-utilities/parse-child-data.js +50 -0
  133. package/src/elements/cfpb-utilities/parse-child-data.spec.js +56 -0
  134. package/src/elements/cfpb-utilities/search-service.js +46 -0
  135. package/src/elements/cfpb-utilities/search-service.spec.js +138 -0
  136. package/src/elements/cfpb-utilities/transition/transition.scss +98 -0
  137. package/src/elements/index.js +7 -1
  138. package/src/index.scss +11 -0
  139. package/src/tokens/abstracts/custom-props.json +1642 -0
  140. package/src/tokens/abstracts/vars.json +1319 -0
  141. package/src/tokens/cfpb-button/vars.json +436 -0
  142. package/src/utilities/transition/max-height-transition.js +74 -0
  143. package/dist/elements/cfpb-checkbox/index.js +0 -29
  144. package/src/elements/cfpb-multiselect/cfpb-multiselect.component.scss +0 -225
  145. package/src/elements/cfpb-multiselect/index.js +0 -444
  146. package/src/elements/cfpb-multiselect/multiselect-model.js +0 -288
  147. package/src/elements/cfpb-multiselect/multiselect-model.spec.js +0 -236
@@ -0,0 +1,169 @@
1
+ import { jest } from '@jest/globals';
2
+ import { CfpbList } from './index';
3
+
4
+ beforeAll(() => {
5
+ CfpbList.init();
6
+ });
7
+
8
+ describe('<cfpb-list> tests', () => {
9
+ let list;
10
+
11
+ beforeEach(() => {
12
+ list = document.createElement('cfpb-list');
13
+ document.body.appendChild(list);
14
+ });
15
+
16
+ afterEach(() => {
17
+ document.body.innerHTML = '';
18
+ });
19
+
20
+ test('renders childData and sets checked state (single)', async () => {
21
+ list.childData = JSON.stringify([
22
+ { value: 'A', checked: true },
23
+ { value: 'B', checked: true },
24
+ { value: 'C' },
25
+ ]);
26
+
27
+ await list.updateComplete;
28
+
29
+ expect(list.items.length).toBe(3);
30
+ // Only first checked stays true in single select
31
+ expect(list.items[0].checked).toBe(true);
32
+ expect(list.items[1].checked).toBe(false);
33
+ expect(list.items[2].checked).toBe(false);
34
+ expect(list.checkedItems).toEqual([list.items[0]]);
35
+ });
36
+
37
+ test('multiple selection mode allows multiple checked items', async () => {
38
+ list.multiple = true;
39
+ list.childData = JSON.stringify([
40
+ { value: 'A', checked: true },
41
+ { value: 'B', checked: true },
42
+ { value: 'C' },
43
+ ]);
44
+
45
+ await list.updateComplete;
46
+
47
+ expect(list.checkedItems.length).toBe(2);
48
+ expect(list.checkedItems).toContain(list.items[0]);
49
+ expect(list.checkedItems).toContain(list.items[1]);
50
+
51
+ // Uncheck an item
52
+ const event = new CustomEvent('click-item', {
53
+ bubbles: true,
54
+ composed: true,
55
+ });
56
+ list.items[0].checked = false;
57
+ list.items[0].dispatchEvent(event);
58
+
59
+ expect(list.checkedItems).toEqual([list.items[1]]);
60
+ });
61
+
62
+ test('click-item toggles single selection', async () => {
63
+ list.childData = JSON.stringify([{ value: 'A' }, { value: 'B' }]);
64
+
65
+ await list.updateComplete;
66
+
67
+ const clickSpy = jest.fn();
68
+ list.addEventListener('item-click', clickSpy);
69
+
70
+ // Click first item
71
+ list.items[0].checked = true;
72
+ list.items[0].dispatchEvent(
73
+ new CustomEvent('click-item', { bubbles: true, composed: true }),
74
+ );
75
+
76
+ expect(list.checkedItems).toEqual([list.items[0]]);
77
+ expect(clickSpy).toHaveBeenCalledTimes(1);
78
+
79
+ // Click again to uncheck
80
+ list.items[0].checked = false;
81
+ list.items[0].dispatchEvent(
82
+ new CustomEvent('click-item', { bubbles: true, composed: true }),
83
+ );
84
+ expect(list.checkedItems).toEqual([]);
85
+ });
86
+
87
+ test('replaces prior click listeners on items', async () => {
88
+ list.childData = JSON.stringify([{ value: 'X' }]);
89
+ await list.updateComplete;
90
+
91
+ const listenerSpy = jest.fn();
92
+ list.addEventListener('item-click', listenerSpy);
93
+
94
+ // Trigger click-item event
95
+ const event = new CustomEvent('click-item', {
96
+ bubbles: true,
97
+ composed: true,
98
+ });
99
+ list.items[0].dispatchEvent(event);
100
+
101
+ expect(listenerSpy).toHaveBeenCalled();
102
+ });
103
+
104
+ test('filterItems hides items and sets focused index', async () => {
105
+ list.childData = JSON.stringify([
106
+ { value: 'A' },
107
+ { value: 'B' },
108
+ { value: 'C' },
109
+ ]);
110
+ await list.updateComplete;
111
+
112
+ list.filterItems(['B']);
113
+ expect(list.visibleItems.length).toBe(1);
114
+ expect(list.visibleItems[0].value).toBe('B');
115
+ expect(list.items[0].hidden).toBe(true);
116
+ expect(list.items[1].hidden).toBe(false);
117
+ expect(list.items[2].hidden).toBe(true);
118
+ });
119
+
120
+ test('arrow keys skip hidden items', async () => {
121
+ list.childData = JSON.stringify([
122
+ { value: 'A' },
123
+ { value: 'B' },
124
+ { value: 'C' },
125
+ ]);
126
+ await list.updateComplete;
127
+
128
+ list.filterItems(['C']); // only C visible
129
+
130
+ list.focusItemAt(0);
131
+ expect(document.activeElement.value).toBe('C');
132
+
133
+ // Press ArrowDown, should wrap to same visible item
134
+ list.shadowRoot
135
+ .querySelector('div')
136
+ .dispatchEvent(
137
+ new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }),
138
+ );
139
+ expect(document.activeElement.value).toBe('C');
140
+
141
+ // Press ArrowUp
142
+ list.shadowRoot
143
+ .querySelector('div')
144
+ .dispatchEvent(
145
+ new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true }),
146
+ );
147
+ expect(document.activeElement.value).toBe('C');
148
+ });
149
+
150
+ test('showAllItems unhides all items', async () => {
151
+ list.childData = JSON.stringify([
152
+ { value: 'A', hidden: true },
153
+ { value: 'B', hidden: true },
154
+ ]);
155
+ await list.updateComplete;
156
+
157
+ list.showAllItems();
158
+ expect(list.items.every((i) => i.hidden === false)).toBe(true);
159
+ expect(list.visibleItems.length).toBe(2);
160
+ });
161
+
162
+ test('invalid childData logs error', async () => {
163
+ console.error = jest.fn();
164
+ list.childData = 'not-json';
165
+ await list.updateComplete;
166
+
167
+ expect(console.error).toHaveBeenCalled();
168
+ });
169
+ });
@@ -0,0 +1,69 @@
1
+ @use 'sass:math';
2
+ @use '@cfpb/cfpb-design-system/src/elements/abstracts' as *;
3
+
4
+ :host {
5
+ // Theme variables.
6
+ --list-item-bg-hover: var(--gray-5);
7
+ --list-item-border-focus: var(--pacific);
8
+
9
+ display: block;
10
+
11
+ .container {
12
+ display: block;
13
+ padding: 6.5px 10px;
14
+ }
15
+
16
+ .checkbox {
17
+ display: inline-grid;
18
+
19
+ // 30px is width of checkbox/radio button plus the needed padding.
20
+ grid-template-columns: math.div(30px, $base-font-size-px) + em auto;
21
+ vertical-align: top;
22
+
23
+ // Wrap long words in narrow form fields to prevent clipping
24
+ overflow-wrap: anywhere;
25
+ }
26
+
27
+ .selectable {
28
+ cursor: pointer;
29
+
30
+ &:hover {
31
+ background: var(--list-item-bg-hover);
32
+ transition: background-color 0.2s;
33
+ cursor: pointer;
34
+ }
35
+ }
36
+ }
37
+
38
+ // Remove default focus ring.
39
+ :host(:focus) {
40
+ outline: none;
41
+ }
42
+
43
+ // Add custom focus ring.
44
+ :host(:not([disabled]):focus-within) {
45
+ outline: 1px dotted var(--list-item-border-focus);
46
+ outline-offset: 2px;
47
+ }
48
+
49
+ :host([checked]) {
50
+ .checkbox::before {
51
+ --cfpb-background-icon-svg: 'approved';
52
+
53
+ background-size: auto $cf-icon-height;
54
+ background-repeat: no-repeat;
55
+ background-position: center 0;
56
+ }
57
+ }
58
+
59
+ :host([type='plain']) {
60
+ .checkbox::before {
61
+ border-color: transparent;
62
+ outline-color: transparent;
63
+ background-color: transparent;
64
+ }
65
+ }
66
+
67
+ :host([hidden]) {
68
+ display: none;
69
+ }
@@ -0,0 +1,215 @@
1
+ import { html, LitElement, css, unsafeCSS } from 'lit';
2
+ import styles from './cfpb-list-item.component.scss';
3
+ import { ref, createRef } from 'lit/directives/ref.js';
4
+ import { CfpbCheckboxIcon } from '../cfpb-checkbox-icon';
5
+
6
+ /**
7
+ * @element cfpb-list-item.
8
+ * @slot - The text for the list item.
9
+ */
10
+ export class CfpbListItem extends LitElement {
11
+ static styles = css`
12
+ ${unsafeCSS(styles)}
13
+ `;
14
+
15
+ #checkboxIcon = createRef();
16
+ #value;
17
+ #inList = false;
18
+
19
+ /**
20
+ * @property {string} type - Choice type: plain, check, checkbox.
21
+ * @property {boolean} checked - Whether the list item is checked or not.
22
+ * @property {boolean} disabled - Whether the list item is selectable or not.
23
+ * @property {boolean} hidden - Whether the list item is hidden or not.
24
+ * @returns {object} The map of properties.
25
+ */
26
+ static properties = {
27
+ type: { type: String, reflect: true },
28
+ checked: { type: Boolean, reflect: true },
29
+ disabled: { type: Boolean, reflect: true },
30
+ hidden: { type: Boolean, reflect: true },
31
+ href: { type: String, refrect: true },
32
+ };
33
+
34
+ constructor() {
35
+ super();
36
+ this.type = 'plain';
37
+ this.checked = false;
38
+ this.disabled = false;
39
+ this.hidden = false;
40
+ this.href = '';
41
+ }
42
+
43
+ firstUpdated() {
44
+ // Make host focusable only if not disabled
45
+ this.tabIndex = this.disabled ? -1 : 0;
46
+
47
+ // Only add keydown if NOT inside a list
48
+ if (!this.#inList) {
49
+ this.addEventListener('keydown', this.#onKeyDown);
50
+ }
51
+
52
+ this.addEventListener('click', this.#onClick);
53
+ }
54
+
55
+ connectedCallback() {
56
+ super.connectedCallback();
57
+
58
+ // Detect if inside a listbox
59
+ this.#inList = this.closest('[role=listbox]') !== null;
60
+
61
+ if (this.#inList) {
62
+ this.setAttribute('role', 'option');
63
+ this.setAttribute('aria-disabled', this.disabled ? 'true' : 'false');
64
+ this.setAttribute('aria-selected', this.checked ? 'true' : 'false');
65
+
66
+ // Disable internal keyboard handling if inside list
67
+ this.tabIndex = -1;
68
+ } else {
69
+ // Not inside list, remove list-specific ARIA
70
+ this.removeAttribute('role');
71
+ this.removeAttribute('aria-disabled');
72
+ this.removeAttribute('aria-selected');
73
+ }
74
+ }
75
+
76
+ updated(changed) {
77
+ if (changed.has('checked') && this.#inList) {
78
+ this.setAttribute('aria-selected', this.checked ? 'true' : 'false');
79
+ }
80
+
81
+ if (changed.has('disabled')) {
82
+ this.tabIndex = this.disabled ? -1 : 0;
83
+ if (this.#inList) {
84
+ this.setAttribute('aria-disabled', this.disabled ? 'true' : 'false');
85
+ }
86
+ }
87
+
88
+ if (changed.has('hidden')) {
89
+ this.setAttribute('aria-hidden', this.hidden ? 'true' : 'false');
90
+ if (this.hidden) {
91
+ this.tabIndex = -1;
92
+ }
93
+ }
94
+ }
95
+
96
+ #toggleChecked() {
97
+ // If the item has an href attribute, go to that page.
98
+ if (this.href !== '') {
99
+ window.location.href = this.href;
100
+ }
101
+
102
+ // … Otherwise, toggle the checked state.
103
+ this.checked = !this.checked;
104
+ this.dispatchEvent(
105
+ new CustomEvent('click-item', {
106
+ detail: { checked: this.checked, value: this.value },
107
+ bubbles: true,
108
+ composed: true,
109
+ }),
110
+ );
111
+ }
112
+
113
+ #onClick() {
114
+ if (!this.disabled && !this.hidden) this.#toggleChecked();
115
+ }
116
+
117
+ #onKeyDown(evt) {
118
+ if (this.disabled || this.hidden) return;
119
+
120
+ if (evt.key === ' ' || evt.key === 'Enter') {
121
+ evt.preventDefault();
122
+ this.#toggleChecked();
123
+ }
124
+ }
125
+
126
+ #onMouseOver() {
127
+ this.#checkboxIcon.value?.mouseover();
128
+ }
129
+
130
+ #onMouseLeave() {
131
+ this.#checkboxIcon.value?.mouseleave();
132
+ }
133
+
134
+ get value() {
135
+ if (this.#value) return this.#value;
136
+
137
+ const slot = this.shadowRoot?.querySelector('slot');
138
+ if (!slot) return '';
139
+
140
+ this.#value = slot
141
+ .assignedNodes({ flatten: true })
142
+ .map((node) => node.textContent)
143
+ .join('')
144
+ .trim();
145
+
146
+ return this.#value;
147
+ }
148
+
149
+ set value(val) {
150
+ this.#value = val;
151
+ }
152
+
153
+ render() {
154
+ return html`
155
+ <div
156
+ part="container"
157
+ class="container
158
+ ${this.disabled ? '' : 'selectable'}"
159
+ @mouseover=${this.#onMouseOver}
160
+ @mouseleave=${this.#onMouseLeave}
161
+ >
162
+ ${this.#chooseRender()}
163
+ </div>
164
+ `;
165
+ }
166
+
167
+ #chooseRender() {
168
+ switch (this.type) {
169
+ case 'check':
170
+ return this.#renderCheck();
171
+ case 'checkbox':
172
+ return this.#renderCheckbox();
173
+ default:
174
+ return this.#renderPlain();
175
+ }
176
+ }
177
+
178
+ #renderPlain() {
179
+ return html`<div><slot></slot></div>`;
180
+ }
181
+
182
+ #renderCheck() {
183
+ return html`
184
+ <div class="checkbox">
185
+ <cfpb-checkbox-icon
186
+ borderless
187
+ ?disabled=${this.disabled}
188
+ ?checked=${this.checked}
189
+ ></cfpb-checkbox-icon>
190
+ <slot></slot>
191
+ </div>
192
+ `;
193
+ }
194
+
195
+ #renderCheckbox() {
196
+ return html`
197
+ <div class="checkbox">
198
+ <cfpb-checkbox-icon
199
+ ?disabled=${this.disabled}
200
+ ?checked=${this.checked}
201
+ ${ref(this.#checkboxIcon)}
202
+ ></cfpb-checkbox-icon>
203
+ <slot></slot>
204
+ </div>
205
+ `;
206
+ }
207
+
208
+ static init() {
209
+ CfpbCheckboxIcon.init();
210
+
211
+ if (!window.customElements.get('cfpb-list-item')) {
212
+ window.customElements.define('cfpb-list-item', CfpbListItem);
213
+ }
214
+ }
215
+ }
@@ -1,16 +1,11 @@
1
1
  @use 'sass:math';
2
- @use '@cfpb/cfpb-design-system/src/abstracts' as *;
2
+ @use '@cfpb/cfpb-design-system/src/elements/abstracts' as *;
3
3
  @use '@cfpb/cfpb-design-system/src/utilities' as *;
4
+ @use '@cfpb/cfpb-design-system/src/components/cfpb-icons/icon' as *;
4
5
 
5
6
  :host {
6
7
  width: 100%;
7
8
 
8
- .cf-icon-svg {
9
- height: $cf-icon-height;
10
- vertical-align: middle;
11
- fill: currentcolor;
12
- }
13
-
14
9
  .m-pagination {
15
10
  display: grid;
16
11
  grid-template-columns: auto 1fr auto;
@@ -24,13 +24,11 @@ export class CfpbPagination extends LitElement {
24
24
  * @property {number} maxPage - The maximum page count.
25
25
  * @returns {object} The map of properties.
26
26
  */
27
- static get properties() {
28
- return {
29
- currentPage: { type: Number, attribute: 'value', reflect: true },
30
- maxPage: { type: Number, attribute: 'max', reflect: true },
31
- lang: { type: String, reflect: true },
32
- };
33
- }
27
+ static properties = {
28
+ currentPage: { type: Number, attribute: 'value', reflect: true },
29
+ maxPage: { type: Number, attribute: 'max', reflect: true },
30
+ lang: { type: String, reflect: true },
31
+ };
34
32
 
35
33
  constructor() {
36
34
  super();
@@ -146,7 +144,7 @@ export class CfpbPagination extends LitElement {
146
144
  <nav
147
145
  class="m-pagination"
148
146
  role="navigation"
149
- aria-label="${trans('page number')}"
147
+ aria-label=${trans('page number')}
150
148
  >
151
149
  <cfpb-button
152
150
  class="m-pagination__btn-prev"