@cfpb/cfpb-design-system 4.2.4 → 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 (124) hide show
  1. package/CHANGELOG.md +166 -1
  2. package/dist/components/cfpb-expandables/index.js +1 -1
  3. package/dist/components/cfpb-expandables/index.js.map +3 -3
  4. package/dist/components/cfpb-forms/index.js +1 -1
  5. package/dist/components/cfpb-forms/index.js.map +2 -2
  6. package/dist/elements/cfpb-button/index.js +4 -4
  7. package/dist/elements/cfpb-button/index.js.map +3 -3
  8. package/dist/elements/cfpb-checkbox-icon/index.js +29 -0
  9. package/dist/elements/{cfpb-checkbox → cfpb-checkbox-icon}/index.js.map +4 -4
  10. package/dist/elements/cfpb-expandable/index.css +2 -0
  11. package/dist/elements/cfpb-expandable/index.css.map +7 -0
  12. package/dist/elements/cfpb-expandable/index.js +33 -0
  13. package/dist/elements/cfpb-expandable/index.js.map +7 -0
  14. package/dist/elements/cfpb-file-upload/index.js +4 -4
  15. package/dist/elements/cfpb-file-upload/index.js.map +3 -3
  16. package/dist/elements/cfpb-form-alert/index.js +32 -0
  17. package/dist/elements/cfpb-form-alert/index.js.map +7 -0
  18. package/dist/elements/cfpb-form-choice/index.js +12 -3
  19. package/dist/elements/cfpb-form-choice/index.js.map +4 -4
  20. package/dist/elements/cfpb-form-search/index.js +41 -0
  21. package/dist/elements/cfpb-form-search/index.js.map +7 -0
  22. package/dist/elements/cfpb-form-search-input/index.js +41 -0
  23. package/dist/elements/cfpb-form-search-input/index.js.map +7 -0
  24. package/dist/elements/cfpb-icon-text/index.js +3 -3
  25. package/dist/elements/cfpb-icon-text/index.js.map +3 -3
  26. package/dist/elements/cfpb-label/index.js +3 -3
  27. package/dist/elements/cfpb-label/index.js.map +2 -2
  28. package/dist/elements/cfpb-list/index.js +39 -0
  29. package/dist/elements/cfpb-list/index.js.map +7 -0
  30. package/dist/elements/cfpb-list-item/index.js +39 -0
  31. package/dist/elements/cfpb-list-item/index.js.map +7 -0
  32. package/dist/elements/cfpb-multiselect/index.js +13 -4
  33. package/dist/elements/cfpb-multiselect/index.js.map +4 -4
  34. package/dist/elements/cfpb-pagination/index.js +3 -3
  35. package/dist/elements/cfpb-pagination/index.js.map +2 -2
  36. package/dist/elements/cfpb-select/index.css +2 -0
  37. package/dist/elements/cfpb-select/index.css.map +7 -0
  38. package/dist/elements/cfpb-select/index.js +42 -0
  39. package/dist/elements/cfpb-select/index.js.map +7 -0
  40. package/dist/elements/cfpb-select-list/index.js +39 -0
  41. package/dist/elements/cfpb-select-list/index.js.map +7 -0
  42. package/dist/elements/cfpb-tag-filter/index.js +3 -3
  43. package/dist/elements/cfpb-tag-filter/index.js.map +3 -3
  44. package/dist/elements/cfpb-tag-group/index.js +3 -3
  45. package/dist/elements/cfpb-tag-group/index.js.map +4 -4
  46. package/dist/elements/cfpb-tag-topic/index.js +4 -4
  47. package/dist/elements/cfpb-tag-topic/index.js.map +1 -1
  48. package/dist/elements/index.css +2 -0
  49. package/dist/elements/index.css.map +7 -0
  50. package/dist/elements/index.js +7 -6
  51. package/dist/elements/index.js.map +4 -4
  52. package/dist/index.js +7 -6
  53. package/dist/index.js.map +4 -4
  54. package/dist/utilities/index.js +1 -1
  55. package/dist/utilities/index.js.map +3 -3
  56. package/package.json +1 -1
  57. package/src/components/cfpb-expandables/expandable.js +3 -0
  58. package/src/components/cfpb-forms/multiselect.js +1 -1
  59. package/src/elements/abstracts/custom-props.css +123 -0
  60. package/src/elements/abstracts/grid-mixins.scss +83 -0
  61. package/src/elements/abstracts/heading-mixins.scss +346 -0
  62. package/src/elements/abstracts/index.scss +7 -0
  63. package/src/elements/abstracts/media-queries.scss +35 -0
  64. package/src/elements/abstracts/sizing-vars.scss +65 -0
  65. package/src/elements/abstracts/vars-breakpoints.scss +16 -0
  66. package/src/elements/abstracts/vars.css +79 -0
  67. package/src/elements/base/base.scss +375 -0
  68. package/src/elements/base/font.scss +27 -0
  69. package/src/elements/base/index.scss +3 -0
  70. package/src/elements/base/normalize.scss +290 -0
  71. package/src/elements/cfpb-button/cfpb-button-group.scss +10 -0
  72. package/src/elements/cfpb-button/cfpb-button-link.scss +96 -0
  73. package/src/elements/cfpb-button/cfpb-button.component.scss +11 -4
  74. package/src/elements/cfpb-button/cfpb-button.scss +222 -0
  75. package/src/elements/cfpb-button/index.js +28 -29
  76. package/src/elements/cfpb-button/vars.css +30 -0
  77. package/src/elements/cfpb-checkbox-icon/cfpb-checkbox-icon.component.scss +88 -0
  78. package/src/elements/cfpb-checkbox-icon/index.js +104 -0
  79. package/src/elements/cfpb-expandable/cfpb-expandable.component.scss +218 -0
  80. package/src/elements/cfpb-expandable/index.js +127 -0
  81. package/src/elements/cfpb-file-upload/cfpb-file-upload.component.scss +2 -2
  82. package/src/elements/cfpb-file-upload/index.js +16 -18
  83. package/src/elements/cfpb-form-alert/cfpb-form-alert.component.scss +36 -0
  84. package/src/elements/cfpb-form-alert/index.js +55 -0
  85. package/src/elements/cfpb-form-choice/cfpb-form-choice.component.scss +42 -81
  86. package/src/elements/cfpb-form-choice/index.js +58 -18
  87. package/src/elements/cfpb-form-search/cfpb-form-search.component.scss +54 -0
  88. package/src/elements/cfpb-form-search/index.js +194 -0
  89. package/src/elements/cfpb-form-search-input/cfpb-form-search-input.component.scss +217 -0
  90. package/src/elements/cfpb-form-search-input/index.js +136 -0
  91. package/src/elements/cfpb-icon-text/cfpb-icon-text.component.scss +32 -39
  92. package/src/elements/cfpb-icon-text/index.js +32 -104
  93. package/src/elements/cfpb-label/cfpb-label.component.scss +2 -2
  94. package/src/elements/cfpb-label/index.js +6 -9
  95. package/src/elements/cfpb-list/cfpb-list.component.scss +23 -0
  96. package/src/elements/cfpb-list/index.js +357 -0
  97. package/src/elements/cfpb-list/index.spec.js +169 -0
  98. package/src/elements/cfpb-list-item/cfpb-list-item.component.scss +69 -0
  99. package/src/elements/cfpb-list-item/index.js +215 -0
  100. package/src/elements/cfpb-pagination/cfpb-pagination.component.scss +2 -7
  101. package/src/elements/cfpb-pagination/index.js +6 -8
  102. package/src/elements/cfpb-select/cfpb-select.component.scss +241 -0
  103. package/src/elements/cfpb-select/index.js +381 -0
  104. package/src/elements/cfpb-tag-filter/cfpb-tag-filter.component.scss +6 -3
  105. package/src/elements/cfpb-tag-filter/index.js +15 -7
  106. package/src/elements/cfpb-tag-group/cfpb-tag-group.component.scss +2 -2
  107. package/src/elements/cfpb-tag-group/index.js +53 -6
  108. package/src/elements/cfpb-tag-topic/index.js +5 -7
  109. package/src/elements/cfpb-utilities/parse-child-data.js +50 -0
  110. package/src/elements/cfpb-utilities/parse-child-data.spec.js +56 -0
  111. package/src/elements/cfpb-utilities/search-service.js +46 -0
  112. package/src/elements/cfpb-utilities/search-service.spec.js +138 -0
  113. package/src/elements/cfpb-utilities/transition/transition.scss +98 -0
  114. package/src/elements/index.js +7 -1
  115. package/src/index.scss +11 -0
  116. package/src/tokens/abstracts/custom-props.json +1642 -0
  117. package/src/tokens/abstracts/vars.json +1319 -0
  118. package/src/tokens/cfpb-button/vars.json +436 -0
  119. package/src/utilities/transition/max-height-transition.js +74 -0
  120. package/dist/elements/cfpb-checkbox/index.js +0 -29
  121. package/src/elements/cfpb-multiselect/cfpb-multiselect.component.scss +0 -225
  122. package/src/elements/cfpb-multiselect/index.js +0 -444
  123. package/src/elements/cfpb-multiselect/multiselect-model.js +0 -288
  124. package/src/elements/cfpb-multiselect/multiselect-model.spec.js +0 -236
@@ -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"
@@ -0,0 +1,241 @@
1
+ @use 'sass:math';
2
+ @use '@cfpb/cfpb-design-system/src/abstracts' as *;
3
+ @use '@cfpb/cfpb-design-system/src/base' as *;
4
+ @use '@cfpb/cfpb-design-system/src/utilities' as *;
5
+ @use '@cfpb/cfpb-design-system/src/components/cfpb-icons/icon';
6
+ @use '../cfpb-utilities/transition/transition.scss' as *;
7
+
8
+ :host {
9
+ // Theme
10
+ --select-border-default: var(--gray-60); // $input-border
11
+ --select-border-width-default: 1px;
12
+ --select-border-error: var(--red);
13
+ --select-border-width-error: 2px;
14
+ --select-border-hover-default: var(--pacific); // $input-border-hover
15
+ --select-border-focus-default: var(--pacific); // $input-border-focused
16
+ --select-bg-disabled-default: var(--gray-10); // $input-bg-disabled
17
+ --select-icon-bg-default: var(--gray-10);
18
+ --select-text-disabled-default: var(--gray-dark); // $input-text-disabled
19
+
20
+ // Private variables.
21
+ --select-border: var(--select-border-default);
22
+ --select-border-width: var(--select-border-width-default);
23
+ --select-border-hover: var(--select-border-hover-default);
24
+ --select-border-focus: var(--select-border-focus-default);
25
+
26
+ // Hide light DOM content.
27
+ ::slotted(ul),
28
+ ::slotted(ol) {
29
+ display: none !important;
30
+ }
31
+
32
+ //
33
+ // Custom scrollbar
34
+ //
35
+
36
+ // Reset lack of scrollbar on Apple devices.
37
+ ::-webkit-scrollbar {
38
+ appearance: none;
39
+ width: 7px;
40
+ }
41
+
42
+ ::-webkit-scrollbar-thumb {
43
+ background-color: var(--pacific-20);
44
+ box-shadow: 0 0 1px var(--gray-10);
45
+ }
46
+
47
+ //
48
+ // Base styling
49
+ //
50
+
51
+ button {
52
+ // This line-height settings is larger than base.scss to
53
+ // accommodate the SVG height.
54
+ line-height: math.div(21px, $base-font-size-px);
55
+
56
+ // Remove default focus ring.
57
+ outline: none;
58
+ }
59
+
60
+ //
61
+ // Recommended select pattern
62
+ //
63
+
64
+ .o-select {
65
+ position: relative;
66
+ display: grid;
67
+ grid-template-columns: 1fr 38px;
68
+
69
+ &:hover {
70
+ border-color: var(--select-border-hover);
71
+ box-shadow: 0 0 0 1px var(--select-border-hover);
72
+ }
73
+
74
+ &:focus,
75
+ &:focus-within {
76
+ outline: 1px dotted var(--select-border-focus);
77
+ outline-offset: 2px;
78
+
79
+ box-shadow: 0 0 0 1px var(--select-border-focus);
80
+ }
81
+
82
+ //
83
+ // Header
84
+ //
85
+
86
+ &__header {
87
+ padding: 0;
88
+ border: 0;
89
+ background-color: transparent;
90
+ cursor: pointer;
91
+
92
+ display: flex;
93
+
94
+ // Single select.
95
+ &:has(.o-select__label) {
96
+ justify-content: space-between;
97
+ align-items: center;
98
+ gap: 10px;
99
+ }
100
+
101
+ // Multiselect.
102
+ cfpb-form-search-input {
103
+ width: 100%;
104
+ }
105
+
106
+ .o-select__cue-close,
107
+ .o-select__cue-open {
108
+ display: none;
109
+ }
110
+
111
+ &[aria-expanded='false'] .o-select__cue-open {
112
+ display: block;
113
+ }
114
+
115
+ &[aria-expanded='true'] .o-select__cue-close {
116
+ display: block;
117
+ }
118
+ }
119
+
120
+ .no-results {
121
+ padding: 6.5px 10px;
122
+ }
123
+
124
+ // Using the button element with .o-select__header requires setting
125
+ // an explicit width.
126
+ button.o-select__header {
127
+ width: 100%;
128
+ text-align: left;
129
+ }
130
+
131
+ //
132
+ // select text elements
133
+ //
134
+
135
+ &__label {
136
+ // Grow to available width.
137
+ flex-grow: 1;
138
+ padding: math.div(7px, $base-font-size-px) + em
139
+ math.div(10px, $base-font-size-px) + em;
140
+
141
+ cursor: pointer;
142
+ }
143
+
144
+ &__cues {
145
+ align-self: center;
146
+ background: var(--select-icon-bg-default);
147
+ border-left: 1px solid var(--select-border-default);
148
+ padding: math.div(7px, $base-font-size-px) + em
149
+ math.div(10px, $base-font-size-px) + em;
150
+ }
151
+
152
+ &__content {
153
+ box-sizing: border-box;
154
+ overflow-x: hidden;
155
+ overflow-y: scroll;
156
+ position: absolute;
157
+ z-index: 10;
158
+ width: calc(100% + 2px);
159
+ left: -1px;
160
+ border: 2px solid var(--pacific);
161
+ background-color: var(--white);
162
+ padding: 0;
163
+
164
+ &::after {
165
+ padding-bottom: math.div(15px, $base-font-size-px) + em;
166
+ width: 100%;
167
+ }
168
+ }
169
+
170
+ //
171
+ // select with a border modifier
172
+ //
173
+
174
+ &--border {
175
+ border: 1px solid var(--select-border);
176
+ }
177
+
178
+ @media print {
179
+ // Hide the interactive select cues when printing
180
+ &__header[aria-expanded='true'] &__cue-close,
181
+ &__header[aria-expanded='false'] &__cue-open {
182
+ display: none;
183
+ } // Ensure all selects are expanded when printing.
184
+ // To accommodate print stylesheets that display the raw URL after links,
185
+ // set an enormous max height to accommodate selects that have a lot of links.
186
+ &__content[aria-expanded='false'] {
187
+ display: block;
188
+ max-height: 99999px !important;
189
+ }
190
+ }
191
+
192
+ &--down {
193
+ &::before {
194
+ bottom: -1px;
195
+ }
196
+
197
+ .o-select__content {
198
+ border-top: 0;
199
+ top: 35px;
200
+ }
201
+ }
202
+
203
+ &--up {
204
+ .o-select__content {
205
+ border-bottom: 0;
206
+ top: unset;
207
+ }
208
+ }
209
+ }
210
+ }
211
+
212
+ // The drop-down is expanded.
213
+ :host([open]) {
214
+ .o-select {
215
+ // The divider between __header and __content.
216
+ &::before {
217
+ position: absolute;
218
+ z-index: 11;
219
+ content: '';
220
+ display: block;
221
+ width: 100%;
222
+ border-top: 1px solid var(--select-border);
223
+ pointer-events: none;
224
+ }
225
+ }
226
+ }
227
+
228
+ // Used when the set language reads right-to-left
229
+ html[lang='ar'] {
230
+ :host {
231
+ .o-select {
232
+ &__header {
233
+ text-align: right;
234
+ }
235
+
236
+ &__cues {
237
+ text-align: left;
238
+ }
239
+ }
240
+ }
241
+ }