@financial-times/o3-form 0.3.3 → 0.5.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 (45) hide show
  1. package/cjs/CheckBox.d.ts +1 -1
  2. package/cjs/CheckBox.js +8 -3
  3. package/cjs/Error-summary.d.ts +6 -0
  4. package/cjs/Error-summary.js +30 -0
  5. package/cjs/PasswordInput.d.ts +6 -0
  6. package/cjs/PasswordInput.js +59 -0
  7. package/cjs/RadioButton.d.ts +7 -0
  8. package/cjs/RadioButton.js +54 -0
  9. package/cjs/TextInput.d.ts +1 -1
  10. package/cjs/TextInput.js +8 -5
  11. package/cjs/fieldComponents/Feedback.d.ts +6 -0
  12. package/cjs/fieldComponents/Feedback.js +7 -0
  13. package/cjs/fieldComponents/Form.d.ts +7 -0
  14. package/cjs/fieldComponents/Form.js +7 -0
  15. package/cjs/fieldComponents/FormField.d.ts +8 -0
  16. package/cjs/fieldComponents/FormField.js +72 -0
  17. package/cjs/{index-BZth9mTZ.d.ts → index-D6jDTWIC.d.ts} +19 -2
  18. package/cjs/index.d.ts +9 -14
  19. package/cjs/index.js +4 -0
  20. package/css/core.css +23 -0
  21. package/css/internal.css +23 -0
  22. package/css/main.css +231 -55
  23. package/css/professional.css +23 -0
  24. package/css/sustainable-views.css +23 -0
  25. package/css/whitelabel.css +15 -5
  26. package/esm/CheckBox.d.ts +1 -1
  27. package/esm/CheckBox.js +8 -3
  28. package/esm/Error-summary.d.ts +6 -0
  29. package/esm/Error-summary.js +30 -0
  30. package/esm/PasswordInput.d.ts +6 -0
  31. package/esm/PasswordInput.js +59 -0
  32. package/esm/RadioButton.d.ts +7 -0
  33. package/esm/RadioButton.js +54 -0
  34. package/esm/TextInput.d.ts +1 -1
  35. package/esm/TextInput.js +8 -5
  36. package/esm/fieldComponents/Feedback.d.mts +6 -0
  37. package/esm/fieldComponents/Feedback.js +7 -0
  38. package/esm/fieldComponents/Form.d.mts +7 -0
  39. package/esm/fieldComponents/Form.js +7 -0
  40. package/esm/fieldComponents/FormField.d.mts +8 -0
  41. package/esm/fieldComponents/FormField.js +72 -0
  42. package/esm/{index-BZth9mTZ.d.ts → index-D6jDTWIC.d.ts} +19 -2
  43. package/esm/index.d.ts +9 -14
  44. package/esm/index.js +4 -0
  45. package/package.json +1 -1
package/css/main.css CHANGED
@@ -1,6 +1,10 @@
1
1
  /* src/css/components/form.css */
2
2
  .o3-form {
3
3
  font-family: var(--o3-font-family-metric);
4
+ display: flex;
5
+ flex-direction: column;
6
+ justify-content: start;
7
+ gap: var(--o3-spacing-s);
4
8
  }
5
9
 
6
10
  /* src/css/components/form-field.css */
@@ -15,21 +19,25 @@
15
19
  padding: 0;
16
20
  border: 0;
17
21
  }
22
+ .o3-form-field:where(fieldset) legend {
23
+ margin-bottom: var(--o3-spacing-3xs);
24
+ }
25
+ .o3-form-field:where(fieldset) legend .o3-form-input__description {
26
+ margin-top: var(--o3-spacing-5xs);
27
+ display: block;
28
+ }
18
29
  .o3-form-field :is(.o3-form-field__label, .o3-form-field__title, .o3-form-field__legend) {
19
30
  font-size: var(--o3-font-size-metric2-negative-1);
20
31
  line-height: var(--o3-font-lineheight-metric2-negative-1);
21
32
  font-weight: var(--o3-font-weight-medium);
22
33
  color: var(--o3-color-use-case-body-text);
23
34
  }
24
- .o3-form-field :is(.o3-form-field__label, .o3-form-field__title, .o3-form-field__legend):has(~ .o3-form-input__checkbox > input:not(:required))::after {
35
+ .o3-form-field :is(.o3-form-field__label, .o3-form-field__title, .o3-form-field__legend).o3-form-field--optional::after {
25
36
  content: "(optional)";
26
37
  margin-left: var(--o3-spacing-3xs);
27
38
  color: var(--o3-color-use-case-muted-text);
28
39
  font-weight: var(--o3-font-weight-regular);
29
40
  }
30
- .o3-form-field .o3-form-field__legend {
31
- padding: 0 0 var(--o3-spacing-5xs) 0;
32
- }
33
41
  .o3-form-field .o3-form-input__description {
34
42
  font-size: var(--o3-font-size-metric2-negative-1);
35
43
  line-height: var(--o3-font-lineheight-metric2-negative-1);
@@ -50,7 +58,7 @@
50
58
  align-items: center;
51
59
  font-size: var(--o3-font-size-metric2-negative-1);
52
60
  line-height: var(--o3-font-lineheight-metric2-negative-1);
53
- color: var(--o3-color-palette-crimson);
61
+ color: var(--o3-color-use-case-error-text);
54
62
  }
55
63
  .o3-form-feedback__error-message {
56
64
  display: flex;
@@ -73,14 +81,17 @@
73
81
 
74
82
  /* src/css/components/text-input.css */
75
83
  .o3-form-text-input {
76
- border: var(--_o3-form-text-input-border);
84
+ border: var(--_o3-form-input-border);
77
85
  padding: var(--o3-spacing-3xs) var(--o3-spacing-2xs);
78
- background-color: var(--_o3-form-text-input-background-color);
86
+ background-color: var(--_o3-form-color-use-case-background);
79
87
  box-sizing: border-box;
80
- border-radius: var(--_o3-form-text-input-border-radius);
88
+ border-radius: var(--_o3-form-input-border-radius);
81
89
  --o3-grid-columns-to-span-count: 4;
82
90
  max-width: var(--_o3-form-text-input-max-width, var(--o3-grid-columns-to-span-width));
83
91
  }
92
+ .o3-form-text-input[class*=--short] {
93
+ box-sizing: initial;
94
+ }
84
95
  .o3-form-text-input--short-2 {
85
96
  --_o3-form-text-input-max-width: 1.5em;
86
97
  }
@@ -94,33 +105,39 @@
94
105
  --_o3-form-text-input-max-width: 4.5em;
95
106
  }
96
107
  .o3-form-text-input--error {
97
- border: var(--_o3-form-text-input-border-error);
98
- background-color: var(--_o3-form-text-input-background-color-error);
108
+ border: var(--_o3-form-input-border-error);
109
+ background-color: var(--_o3-form-color-use-case-background-error);
110
+ }
111
+ input[class*=o3-form-text-input][type=password]:disabled,
112
+ input[class*=o3-form-text-input][type=text]:disabled {
113
+ color: var(--o3-color-use-case-muted-text);
114
+ background-color: var(--_o3-form-color-use-case-background-disabled);
115
+ border-color: var(--_o3-form-color-use-case-border-disabled);
99
116
  }
100
117
 
101
118
  /* src/css/components/checkbox.css */
102
- .o3-form-input__checkbox-input + label::before {
119
+ .o3-form-input-checkbox__input + label::before {
103
120
  content: "";
104
121
  display: inline-block;
105
122
  width: var(--o3-spacing-s);
106
123
  height: var(--o3-spacing-s);
107
124
  margin-right: var(--o3-spacing-3xs);
108
- border: 2px solid var(--o3-color-palette-black-50);
109
- border-radius: var(--o3-spacing-5xs);
125
+ border: var(--_o3-form-input-border);
126
+ border-radius: var(--_o3-form-input-border-radius);
110
127
  box-sizing: border-box;
111
128
  }
112
- .o3-form-input__checkbox-input:hover + label::before {
113
- border-color: var(--o3-color-palette-black-40);
129
+ .o3-form-input-checkbox__input:hover + label::before {
130
+ border-color: var(--_o3-form-color-use-case-selected-hover);
114
131
  }
115
- .o3-form-input__checkbox-input:active + label::before {
116
- border-color: var(--o3-color-palette-black-30);
132
+ .o3-form-input-checkbox__input:active + label::before {
133
+ border-color: var(--_o3-form-color-use-case-selected-active);
117
134
  }
118
- .o3-form-input__checkbox-input:checked + label::after {
135
+ .o3-form-input-checkbox__input:checked + label::after {
119
136
  position: absolute;
120
137
  content: "";
121
138
  width: var(--o3-spacing-s);
122
139
  height: var(--o3-spacing-s);
123
- background-color: var(--o3-color-palette-white);
140
+ background-color: var(--_o3-form-color-use-case-background);
124
141
  -webkit-mask-image: var(--o3-icons-ft-icon-tick);
125
142
  mask-image: var(--o3-icons-ft-icon-tick);
126
143
  -webkit-mask-repeat: no-repeat;
@@ -128,45 +145,49 @@
128
145
  -webkit-mask-size: contain;
129
146
  mask-size: contain;
130
147
  }
131
- .o3-form-input__checkbox-input:checked + label::before {
132
- background-color: var(--o3-color-palette-black-50);
148
+ .o3-form-input-checkbox__input:checked + label::before {
149
+ background-color: var(--_o3-form-color-use-case-selected);
150
+ border-color: var(--_o3-form-color-use-case-selected);
133
151
  }
134
- .o3-form-input__checkbox-input:checked:hover + label::before {
135
- background-color: var(--o3-color-palette-black-40);
152
+ .o3-form-input-checkbox__input:checked:hover + label::before {
153
+ background-color: var(--_o3-form-color-use-case-selected-hover);
154
+ border-color: var(--_o3-form-color-use-case-selected-hover);
136
155
  }
137
- .o3-form-input__checkbox-input:checked:active + label::before {
138
- background-color: var(--o3-color-palette-black-30);
156
+ .o3-form-input-checkbox__input:checked:active + label::before {
157
+ background-color: var(--_o3-form-color-use-case-selected-active);
158
+ border-color: var(--_o3-form-color-use-case-selected-active);
139
159
  }
140
- .o3-form-input__checkbox-input:disabled + label::before {
141
- border-color: var(--o3-color-palette-black-30);
160
+ .o3-form-input-checkbox__input:disabled + label::before {
161
+ border-color: var(--_o3-form-color-use-case-border-disabled);
142
162
  }
143
- .o3-form-input__checkbox-input:disabled + label {
144
- color: var(--o3-color-palette-black-30);
163
+ .o3-form-input-checkbox__input:disabled + label {
164
+ color: var(--_o3-form-color-use-case-border-disabled);
145
165
  }
146
- .o3-form-input__checkbox-input:checked:disabled + label::before {
147
- background-color: var(--o3-color-palette-black-30);
166
+ .o3-form-input-checkbox__input:checked:disabled + label::before {
167
+ background-color: var(--_o3-form-color-use-case-selected-disabled);
168
+ border-color: var(--_o3-form-color-use-case-selected-disabled);
148
169
  }
149
- .o3-form-input__checkbox-input.o3-form-input-error + label::before {
170
+ .o3-form-input-checkbox__input.o3-form-input-error + label::before {
150
171
  border-color: var(--o3-color-use-case-error);
151
172
  background-color: var(--o3-color-use-case-error-background);
152
173
  }
153
- .o3-form-input__checkbox-input.o3-form-input-error:checked + label::before {
174
+ .o3-form-input-checkbox__input.o3-form-input-error:checked + label::before {
154
175
  border-color: var(--o3-color-use-case-error);
155
176
  background-color: var(--o3-color-use-case-error-background);
156
177
  }
157
- .o3-form-input__checkbox-input.o3-form-input-error:checked + label::after {
178
+ .o3-form-input-checkbox__input.o3-form-input-error:checked + label::after {
158
179
  background-color: var(--o3-color-use-case-error);
159
180
  }
160
- .o3-form-input__checkbox-input:indeterminate + label::before {
161
- border-color: var(--o3-color-palette-black-50);
162
- background-color: var(--o3-color-palette-black-50);
181
+ .o3-form-input-checkbox__input:indeterminate + label::before {
182
+ border-color: var(--_o3-form-color-use-case-selected);
183
+ background-color: var(--_o3-form-color-use-case-selected);
163
184
  }
164
- .o3-form-input__checkbox-input:indeterminate + label::after {
185
+ .o3-form-input-checkbox__input:indeterminate + label::after {
165
186
  position: absolute;
166
187
  content: "";
167
188
  width: var(--o3-spacing-s);
168
189
  height: var(--o3-spacing-s);
169
- background-color: var(--o3-color-palette-white);
190
+ background-color: var(--_o3-form-color-use-case-background);
170
191
  -webkit-mask-image: var(--o3-icons-ft-icon-minus);
171
192
  mask-image: var(--o3-icons-ft-icon-minus);
172
193
  -webkit-mask-repeat: no-repeat;
@@ -174,33 +195,188 @@
174
195
  -webkit-mask-size: contain;
175
196
  mask-size: contain;
176
197
  }
177
- .o3-form-input__checkbox-input:indeterminate:hover + label::before {
178
- border-color: var(--o3-color-palette-black-40);
179
- background-color: var(--o3-color-palette-black-40);
198
+ .o3-form-input-checkbox__input:indeterminate:hover + label::before {
199
+ border-color: var(--_o3-form-color-use-case-selected-hover);
200
+ background-color: var(--_o3-form-color-use-case-selected-hover);
180
201
  }
181
- .o3-form-input__checkbox-input:indeterminate:active + label::before,
182
- .o3-form-input__checkbox-input:indeterminate:disabled + label::before {
183
- border-color: var(--o3-color-palette-black-30);
184
- background-color: var(--o3-color-palette-black-30);
202
+ .o3-form-input-checkbox__input:indeterminate:active + label::before,
203
+ .o3-form-input-checkbox__input:indeterminate:disabled + label::before {
204
+ border-color: var(--_o3-form-color-use-case-selected-hover);
205
+ background-color: var(--_o3-form-color-use-case-selected-hover);
185
206
  }
186
- .o3-form-input__checkbox-input.o3-form-input-error:indeterminate + label::before {
207
+ .o3-form-input-checkbox__input.o3-form-input-error:indeterminate + label::before {
187
208
  border-color: var(--o3-color-use-case-error);
188
209
  background-color: var(--o3-color-use-case-error-background);
189
210
  }
190
- .o3-form-input__checkbox-input.o3-form-input-error:indeterminate + label::after {
211
+ .o3-form-input-checkbox__input.o3-form-input-error:indeterminate + label::after {
191
212
  background-color: var(--o3-color-use-case-error);
192
213
  }
193
- .o3-form-input__checkbox-label {
214
+ .o3-form-input-checkbox__input:focus + label::before {
215
+ box-shadow: var(--o3-focus-use-case-ring-inner), var(--03-focus-use-case-ring-outer);
216
+ outline: 3px solid transparent;
217
+ }
218
+ @supports selector(:focus-visible) {
219
+ .o3-form-input-checkbox__input:focus + label::before {
220
+ box-shadow: unset;
221
+ }
222
+ .o3-form-input-checkbox__input:focus-visible + label::before {
223
+ box-shadow: var(--o3-focus-use-case-ring-inner), var(--o3-focus-use-case-ring-outer);
224
+ outline: 3px solid transparent;
225
+ }
226
+ }
227
+ .o3-form-input-checkbox__label {
194
228
  display: flex;
195
229
  align-items: center;
196
- font-size: var(--o3-font-size-metric2-negative-1);
197
- line-height: var(--o3-font-lineheight-metric2-negative-1);
198
- font-weight: var(--o3-font-weight-regular);
230
+ font-size: var(--o3-typography-use-case-body-small-font-size);
231
+ line-height: var(--o3-typography-use-case-body-small-line-height);
232
+ font-weight: var(--o3-typography-use-case-body-small-font-weight);
233
+ color: var(--o3-color-use-case-body-text);
234
+ }
235
+
236
+ /* src/css/components/radio-button.css */
237
+ .o3-form-input-radio-button + label::before {
238
+ content: "";
239
+ display: inline-block;
240
+ width: var(--o3-spacing-s);
241
+ height: var(--o3-spacing-s);
242
+ margin-right: var(--o3-spacing-3xs);
243
+ border: var(--_o3-form-input-border);
244
+ border-radius: 50%;
245
+ box-sizing: border-box;
246
+ }
247
+ .o3-form-input-radio-button:hover + label::before {
248
+ border-color: var(--_o3-form-color-use-case-border-hover);
249
+ }
250
+ .o3-form-input-radio-button:active + label::before {
251
+ border-color: var(--_o3-form-color-use-case-border-active);
252
+ }
253
+ .o3-form-input-radio-button:checked + label::before {
254
+ border-color: var(--_o3-form-color-use-case-selected);
255
+ }
256
+ .o3-form-input-radio-button:checked + label::after {
257
+ position: absolute;
258
+ content: "";
259
+ width: var(--o3-spacing-3xs);
260
+ height: var(--o3-spacing-3xs);
261
+ background-color: var(--_o3-form-color-use-case-selected);
262
+ margin: 6px;
263
+ border-radius: 50%;
264
+ }
265
+ .o3-form-input-radio-button:checked:hover + label::before {
266
+ border-color: var(--_o3-form-color-use-case-selected-hover);
267
+ }
268
+ .o3-form-input-radio-button:checked:hover + label::after {
269
+ background-color: var(--_o3-form-color-use-case-selected-hover);
270
+ }
271
+ .o3-form-input-radio-button:checked:active + label::before {
272
+ border-color: var(--_o3-form-color-use-case-selected-active);
273
+ }
274
+ .o3-form-input-radio-button:checked:active + label::after {
275
+ background-color: var(--_o3-form-color-use-case-selected-active);
276
+ }
277
+ .o3-form-input-radio-button:disabled + label::before {
278
+ border-color: var(--_o3-form-color-use-case-border-disabled);
279
+ }
280
+ .o3-form-input-radio-button:disabled:checked + label::after {
281
+ background-color: var(--_o3-form-color-use-case-border-disabled);
282
+ }
283
+ .o3-form-input-radio-button:disabled + label {
284
+ color: var(--_o3-form-color-use-case-border-disabled);
285
+ }
286
+ .o3-form-input-radio-button.o3-form-input-error + label::before {
287
+ border-color: var(--o3-color-use-case-error);
288
+ background-color: var(--_o3-form-color-use-case-background-error);
289
+ }
290
+ .o3-form-input-radio-button.o3-form-input-error:checked + label::before {
291
+ border-color: var(--o3-color-use-case-error);
292
+ background-color: var(--_o3-form-color-use-case-background-error);
293
+ }
294
+ .o3-form-input-radio-button.o3-form-input-error:checked + label::after {
295
+ background-color: var(--o3-color-use-case-error);
296
+ }
297
+ .o3-form-input-radio-button:focus + label::before {
298
+ box-shadow: var(--o3-focus-use-case-ring-inner), var(--03-focus-use-case-ring-outer);
299
+ outline: 3px solid transparent;
300
+ }
301
+ @supports selector(:focus-visible) {
302
+ .o3-form-input-radio-button:focus + label::before {
303
+ box-shadow: unset;
304
+ }
305
+ .o3-form-input-radio-button:focus-visible + label::before {
306
+ box-shadow: var(--o3-focus-use-case-ring-inner), var(--o3-focus-use-case-ring-outer);
307
+ outline: 3px solid transparent;
308
+ }
309
+ }
310
+ .o3-form-input-radio-button__label {
311
+ display: flex;
312
+ align-items: center;
313
+ font-size: var(--o3-typography-use-case-body-small-font-size);
314
+ line-height: var(--o3-typography-use-case-body-small-line-height);
315
+ font-weight: var(--o3-typography-use-case-body-small-font-weight);
316
+ font-family: var(--o3-typography-use-case-body-small-font-family);
199
317
  color: var(--o3-color-use-case-body-text);
200
318
  }
201
- .o3-form-input__checkbox-label:focus-visible {
202
- padding: var(--o3-spacing-5xs);
203
- margin: calc(-1 * var(--o3-spacing-5xs)) 0 calc(-1 * var(--o3-spacing-5xs)) calc(-1 * var(--o3-spacing-5xs));
319
+
320
+ /* src/css/components/error-summary.css */
321
+ .o3-form__error-summary {
322
+ display: flex;
323
+ padding: var(--o3-spacing-xs);
324
+ background-color: var(--_o3-form-error-summary-background-color);
325
+ border-radius: var(--_o3-form-input-border-radius);
326
+ }
327
+ .o3-form__error-summary .o3-form__error-summary-icon::before {
328
+ content: "";
329
+ display: inline-block;
330
+ background-color: var(--o3-color-use-case-error);
331
+ width: var(--o3-typography-use-case-body-small-font-size);
332
+ height: var(--o3-typography-use-case-body-small-font-size);
333
+ -webkit-mask-image: var(--o3-icons-ft-icon-error);
334
+ mask-image: var(--o3-icons-ft-icon-error);
335
+ -webkit-mask-repeat: no-repeat;
336
+ mask-repeat: no-repeat;
337
+ -webkit-mask-size: contain;
338
+ mask-size: contain;
339
+ }
340
+ .o3-form__error-summary .o3-form__error-summary__heading {
341
+ margin-left: var(--o3-spacing-4xs);
342
+ }
343
+ .o3-form__error-summary .o3-form__error-summary__heading > span {
344
+ font-weight: var(--o3-font-weight-medium);
345
+ color: var(--o3-color-use-case-error-text);
346
+ display: inline-block;
347
+ margin-bottom: var(--o3-spacing-4xs);
348
+ }
349
+ .o3-form__error-summary .o3-forms__error-summary__list {
350
+ list-style-type: none;
351
+ padding-left: 0;
352
+ margin-top: 0;
353
+ margin-bottom: 0;
354
+ }
355
+ .o3-form__error-summary .o3-forms__error-summary__list li {
356
+ margin-bottom: var(--o3-spacing-4xs);
357
+ }
358
+ .o3-form__error-summary .o3-forms__error-summary__list li:last-child {
359
+ margin-bottom: 0;
360
+ }
361
+ .o3-form__error-summary .o3-forms__error-summary__list li a {
362
+ color: var(--o3-color-use-case-body-text);
363
+ text-decoration-color: var(--o3-color-use-case-body-text);
364
+ }
365
+ @media screen and (max-width: 489px) {
366
+ .o3-form__error-summary {
367
+ padding: var(--o3-spacing-3xs);
368
+ }
369
+ }
370
+
371
+ /* src/css/components/password-input.css */
372
+ .o3-password-input__controls {
373
+ display: flex;
374
+ justify-content: space-between;
375
+ --o3-grid-columns-to-span-count: 4;
376
+ max-width: var(--o3-grid-columns-to-span-width, 100%);
377
+ margin-top: var(--o3-spacing-3xs);
378
+ font-size: var(--o3-font-size-metric2-negative-1);
379
+ line-height: var(--o3-font-lineheight-metric2-negative-1);
204
380
  }
205
381
 
206
382
  /* main.css */
@@ -0,0 +1,23 @@
1
+ @import "@financial-times/o3-foundation/css/professional.css";
2
+ @import "./main.css";
3
+
4
+ /* src/css/tokens/core/professional/o3-form/_variables.css */
5
+ [data-o3-brand=professional] .o3-form {
6
+ --_o3-form-error-summary-background-color: rgba(204, 0, 0, 0.14);
7
+ --_o3-form-input-border-radius: 6px;
8
+ --_o3-form-color-use-case-background-error: rgba(204, 0, 0, 0.06);
9
+ --_o3-form-input-border: 2px solid var(--o3-color-palette-black-30);
10
+ --_o3-form-color-use-case-selected-disabled: var(--o3-color-use-case-button-disabled);
11
+ --_o3-form-color-use-case-selected-active: var(--o3-color-use-case-button-pressed);
12
+ --_o3-form-color-use-case-selected-hover: var(--o3-color-use-case-button-hover);
13
+ --_o3-form-color-use-case-border-disabled: var(--o3-color-palette-black-10);
14
+ --_o3-form-color-use-case-border-active: var(--o3-color-use-case-button-pressed);
15
+ --_o3-form-color-use-case-border-hover: var(--o3-color-use-case-button-hover);
16
+ --_o3-form-color-use-case-border: var(--o3-color-palette-black-50);
17
+ --_o3-form-color-use-case-background-disabled: var(--o3-color-palette-black-10);
18
+ --_o3-form-color-use-case-background: var(--o3-color-palette-white);
19
+ --_o3-form-input-border-error: 2px solid var(--o3-color-use-case-error);
20
+ --_o3-form-color-use-case-selected: var(--o3-color-use-case-button-default);
21
+ }
22
+
23
+ /* src/css/brands/professional.css */
@@ -0,0 +1,23 @@
1
+ @import "@financial-times/o3-foundation/css/sustainable-views.css";
2
+ @import "./main.css";
3
+
4
+ /* src/css/tokens/sustainable-views/o3-form/_variables.css */
5
+ [data-o3-brand=sustainable-views] .o3-form {
6
+ --_o3-form-error-summary-background-color: rgba(204, 0, 0, 0.14);
7
+ --_o3-form-input-border-radius: 6px;
8
+ --_o3-form-color-use-case-background-error: rgba(204, 0, 0, 0.06);
9
+ --_o3-form-input-border: 2px solid var(--o3-color-palette-black-30);
10
+ --_o3-form-color-use-case-selected-disabled: var(--o3-color-palette-black-10);
11
+ --_o3-form-color-use-case-border-disabled: var(--o3-color-use-case-button-disabled);
12
+ --_o3-form-color-use-case-border: var(--o3-color-palette-black-50);
13
+ --_o3-form-color-use-case-background-disabled: var(--o3-color-palette-black-10);
14
+ --_o3-form-color-use-case-background: var(--o3-color-palette-white);
15
+ --_o3-form-input-border-error: 2px solid var(--o3-color-use-case-error);
16
+ --_o3-form-color-use-case-selected-active: var(--o3-color-use-case-button-pressed);
17
+ --_o3-form-color-use-case-selected-hover: var(--o3-color-use-case-button-hover);
18
+ --_o3-form-color-use-case-selected: var(--o3-color-use-case-button-default);
19
+ --_o3-form-color-use-case-border-active: var(--o3-color-use-case-button-pressed);
20
+ --_o3-form-color-use-case-border-hover: var(--o3-color-use-case-button-hover);
21
+ }
22
+
23
+ /* src/css/brands/sustainable-views.css */
@@ -3,11 +3,21 @@
3
3
 
4
4
  /* src/css/tokens/whitelabel/o3-form/_variables.css */
5
5
  [data-o3-brand=whitelabel] .o3-form {
6
- --_o3-form-text-input-border-radius: 6px;
7
- --_o3-form-text-input-background-color-error: rgba(204, 0, 0, 0.06);
8
- --_o3-form-text-input-background-color: var(--o3-color-palette-white);
9
- --_o3-form-text-input-border: 2px solid var(--o3-color-palette-black-30);
10
- --_o3-form-text-input-border-error: 2px solid var(--o3-color-use-case-alert-text);
6
+ --_o3-form-color-use-case-background-error: rgba(204, 0, 0, 0.06);
7
+ --_o3-form-error-summary-background-color: rgba(204, 0, 0, 0.14);
8
+ --_o3-form-input-border-radius: 6px;
9
+ --_o3-form-color-use-case-border-disabled: var(--o3-color-palette-black-10);
10
+ --_o3-form-color-use-case-border: var(--o3-color-palette-black-50);
11
+ --_o3-form-color-use-case-background: var(--o3-color-palette-white);
12
+ --_o3-form-input-border: 2px solid var(--o3-color-palette-black-30);
13
+ --_o3-form-color-use-case-selected-disabled: var(--o3-color-use-case-button-disabled);
14
+ --_o3-form-color-use-case-selected-active: var(--o3-color-use-case-button-pressed);
15
+ --_o3-form-color-use-case-selected-hover: var(--o3-color-use-case-button-hover);
16
+ --_o3-form-color-use-case-selected: var(--o3-color-use-case-button-default);
17
+ --_o3-form-color-use-case-border-active: var(--o3-color-use-case-button-pressed);
18
+ --_o3-form-color-use-case-border-hover: var(--o3-color-use-case-button-hover);
19
+ --_o3-form-color-use-case-background-disabled: var(--o3-color-use-case-button-disabled);
20
+ --_o3-form-input-border-error: 2px solid var(--o3-color-use-case-error);
11
21
  }
12
22
 
13
23
  /* src/css/brands/whitelabel.css */
package/esm/CheckBox.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { C as CheckBoxProps, b as FormFieldsetProps } from './index-BZth9mTZ.js';
2
+ import { C as CheckBoxProps, F as FormFieldsetProps } from './index-D6jDTWIC.js';
3
3
 
4
4
  declare const CheckBoxItem: (props: CheckBoxProps) => react_jsx_runtime.JSX.Element;
5
5
  declare const CheckBox: (props: CheckBoxProps) => react_jsx_runtime.JSX.Element;
package/esm/CheckBox.js CHANGED
@@ -1,13 +1,18 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { createElement } from "react";
3
+ import { uidBuilder } from "@financial-times/o-utils";
3
4
  import { TitledFormField, FormFieldset } from "./fieldComponents/FormField";
5
+ const uniqueId = uidBuilder("o3-form-checkbox-input");
4
6
  const CheckBoxItem = (props) => {
5
7
  let { inputId, attributes, optional, error } = props;
6
- const classNames = ["o3-form-input__checkbox-input", "o3-visually-hidden"];
8
+ if (!inputId) {
9
+ inputId = uniqueId("_");
10
+ }
11
+ const classNames = ["o3-form-input-checkbox__input", "o3-visually-hidden"];
7
12
  if (error) {
8
13
  classNames.push("o3-form-input-error");
9
14
  }
10
- return /* @__PURE__ */ jsxs("div", { className: "o3-form-input__checkbox", children: [
15
+ return /* @__PURE__ */ jsxs("div", { className: "o3-form-input-checkbox", children: [
11
16
  /* @__PURE__ */ jsx(
12
17
  "input",
13
18
  {
@@ -19,7 +24,7 @@ const CheckBoxItem = (props) => {
19
24
  "aria-required": !optional
20
25
  }
21
26
  ),
22
- /* @__PURE__ */ jsx("label", { htmlFor: inputId, className: "o3-form-input__checkbox-label", children: props.checkboxLabel })
27
+ /* @__PURE__ */ jsx("label", { htmlFor: inputId, className: "o3-form-input-checkbox__label", children: props.checkboxLabel })
23
28
  ] });
24
29
  };
25
30
  const CheckBox = (props) => {
@@ -0,0 +1,6 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { E as ErrorSummaryProps } from './index-D6jDTWIC.js';
3
+
4
+ declare const ErrorSummary: ({ errors, errorMessage, }: ErrorSummaryProps) => react_jsx_runtime.JSX.Element;
5
+
6
+ export { ErrorSummary };
@@ -0,0 +1,30 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ const ErrorSummary = ({
3
+ errors,
4
+ errorMessage = "Please correct these errors and try again."
5
+ }) => {
6
+ return /* @__PURE__ */ jsxs("div", { className: "o3-form__error-summary", children: [
7
+ /* @__PURE__ */ jsx("span", { className: "o3-form__error-summary-icon" }),
8
+ /* @__PURE__ */ jsxs(
9
+ "div",
10
+ {
11
+ className: "o3-form__error-summary__heading",
12
+ role: "alert",
13
+ "aria-labelledby": "error-summary-title",
14
+ children: [
15
+ /* @__PURE__ */ jsx("span", { id: "error-summary-title", className: "o3-typography-heading5", children: errorMessage }),
16
+ /* @__PURE__ */ jsx("ul", { className: "o3-forms__error-summary__list o3-typography-body-small", children: errors.map(({ id, fieldName, message }) => /* @__PURE__ */ jsxs("li", { children: [
17
+ /* @__PURE__ */ jsx("a", { className: "o3-typography-link", href: `#${id}`, children: fieldName }),
18
+ /* @__PURE__ */ jsxs("span", { children: [
19
+ ": ",
20
+ message
21
+ ] })
22
+ ] }, id)) })
23
+ ]
24
+ }
25
+ )
26
+ ] });
27
+ };
28
+ export {
29
+ ErrorSummary
30
+ };
@@ -0,0 +1,6 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { P as PasswordInputProps } from './index-D6jDTWIC.js';
3
+
4
+ declare const PasswordInput: ({ label, feedback, description, disabled, attributes, inputId, optional, }: PasswordInputProps) => react_jsx_runtime.JSX.Element;
5
+
6
+ export { PasswordInput };
@@ -0,0 +1,59 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { uidBuilder } from "@financial-times/o-utils";
3
+ import { LabeledFormField } from "./fieldComponents/FormField";
4
+ import { CheckBoxItem } from "./CheckBox";
5
+ const uniqueId = uidBuilder("o3-form-password-input");
6
+ const PasswordInput = ({
7
+ label,
8
+ feedback,
9
+ description,
10
+ disabled,
11
+ attributes,
12
+ inputId,
13
+ optional
14
+ }) => {
15
+ const id = inputId || uniqueId("_");
16
+ const showPasswordId = `${id}-showPassword`;
17
+ const inputClasses = ["o3-form", "o3-form-text-input"];
18
+ if (feedback && feedback.type === "error") {
19
+ inputClasses.push("o3-form-text-input--error");
20
+ }
21
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
22
+ /* @__PURE__ */ jsx(
23
+ LabeledFormField,
24
+ {
25
+ label,
26
+ feedback,
27
+ description,
28
+ inputId: id,
29
+ optional,
30
+ children: /* @__PURE__ */ jsx(
31
+ "input",
32
+ {
33
+ ...attributes,
34
+ id,
35
+ disabled,
36
+ className: inputClasses.join(" "),
37
+ required: !optional,
38
+ "aria-required": !optional,
39
+ type: "password"
40
+ }
41
+ )
42
+ }
43
+ ),
44
+ /* @__PURE__ */ jsxs("div", { className: "o3-password-input__controls", children: [
45
+ /* @__PURE__ */ jsx(
46
+ CheckBoxItem,
47
+ {
48
+ attributes: { disabled },
49
+ inputId: showPasswordId,
50
+ checkboxLabel: "Show Password"
51
+ }
52
+ ),
53
+ !disabled && /* @__PURE__ */ jsx("a", { className: "o3-typography-link", href: "", children: "Forgot password?" })
54
+ ] })
55
+ ] });
56
+ };
57
+ export {
58
+ PasswordInput
59
+ };
@@ -0,0 +1,7 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { R as RadioButtonProps, F as FormFieldsetProps } from './index-D6jDTWIC.js';
3
+
4
+ declare const RadioButtonItem: (props: RadioButtonProps) => react_jsx_runtime.JSX.Element;
5
+ declare const RadioButtonGroup: (props: FormFieldsetProps) => react_jsx_runtime.JSX.Element;
6
+
7
+ export { RadioButtonGroup, RadioButtonItem };