@financial-times/o3-form 0.3.3 → 0.4.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 (41) hide show
  1. package/cjs/CheckBox.d.ts +1 -1
  2. package/cjs/CheckBox.js +3 -3
  3. package/cjs/Error-summary.d.ts +6 -0
  4. package/cjs/Error-summary.js +30 -0
  5. package/cjs/PasswordInput.d.ts +9 -0
  6. package/cjs/PasswordInput.js +55 -0
  7. package/cjs/RadioButton.d.ts +7 -0
  8. package/cjs/RadioButton.js +52 -0
  9. package/cjs/TextInput.d.ts +1 -1
  10. package/cjs/TextInput.js +3 -3
  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 +69 -0
  17. package/cjs/{index-BZth9mTZ.d.ts → index-CHdbHHZ0.d.ts} +15 -2
  18. package/cjs/index.d.ts +9 -14
  19. package/cjs/index.js +4 -0
  20. package/css/main.css +200 -50
  21. package/css/whitelabel.css +15 -5
  22. package/esm/CheckBox.d.ts +1 -1
  23. package/esm/CheckBox.js +3 -3
  24. package/esm/Error-summary.d.ts +6 -0
  25. package/esm/Error-summary.js +30 -0
  26. package/esm/PasswordInput.d.ts +9 -0
  27. package/esm/PasswordInput.js +55 -0
  28. package/esm/RadioButton.d.ts +7 -0
  29. package/esm/RadioButton.js +52 -0
  30. package/esm/TextInput.d.ts +1 -1
  31. package/esm/TextInput.js +3 -3
  32. package/esm/fieldComponents/Feedback.d.mts +6 -0
  33. package/esm/fieldComponents/Feedback.js +7 -0
  34. package/esm/fieldComponents/Form.d.mts +7 -0
  35. package/esm/fieldComponents/Form.js +7 -0
  36. package/esm/fieldComponents/FormField.d.mts +8 -0
  37. package/esm/fieldComponents/FormField.js +69 -0
  38. package/esm/{index-BZth9mTZ.d.ts → index-CHdbHHZ0.d.ts} +15 -2
  39. package/esm/index.d.ts +9 -14
  40. package/esm/index.js +4 -0
  41. package/package.json +1 -1
package/cjs/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-CHdbHHZ0.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/cjs/CheckBox.js CHANGED
@@ -3,11 +3,11 @@ var _react = require('react');
3
3
  var _FormField = require('./fieldComponents/FormField');
4
4
  const CheckBoxItem = (props) => {
5
5
  let { inputId, attributes, optional, error } = props;
6
- const classNames = ["o3-form-input__checkbox-input", "o3-visually-hidden"];
6
+ const classNames = ["o3-form-input-checkbox__input", "o3-visually-hidden"];
7
7
  if (error) {
8
8
  classNames.push("o3-form-input-error");
9
9
  }
10
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "o3-form-input__checkbox", children: [
10
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "o3-form-input-checkbox", children: [
11
11
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
12
12
  "input",
13
13
  {
@@ -19,7 +19,7 @@ const CheckBoxItem = (props) => {
19
19
  "aria-required": !optional
20
20
  }
21
21
  ),
22
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "label", { htmlFor: inputId, className: "o3-form-input__checkbox-label", children: props.checkboxLabel })
22
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "label", { htmlFor: inputId, className: "o3-form-input-checkbox__label", children: props.checkboxLabel })
23
23
  ] });
24
24
  };
25
25
  const CheckBox = (props) => {
@@ -0,0 +1,6 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { E as ErrorSummaryProps } from './index-CHdbHHZ0.js';
3
+
4
+ declare const ErrorSummary: ({ errors, errorMessage, }: ErrorSummaryProps) => react_jsx_runtime.JSX.Element;
5
+
6
+ export { ErrorSummary };
@@ -0,0 +1,30 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _jsxruntime = require('react/jsx-runtime');
2
+ const ErrorSummary = ({
3
+ errors,
4
+ errorMessage = "Please correct these errors and try again."
5
+ }) => {
6
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "o3-form__error-summary", children: [
7
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "o3-form__error-summary-icon" }),
8
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
9
+ "div",
10
+ {
11
+ className: "o3-form__error-summary__heading",
12
+ role: "alert",
13
+ "aria-labelledby": "error-summary-title",
14
+ children: [
15
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { id: "error-summary-title", className: "o3-typography-heading5", children: errorMessage }),
16
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "ul", { className: "o3-forms__error-summary__list o3-typography-body-small", children: errors.map(({ id, fieldName, message }) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "li", { children: [
17
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "a", { className: "o3-typography-link", href: `#${id}`, children: fieldName }),
18
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { children: [
19
+ ": ",
20
+ message
21
+ ] })
22
+ ] }, id)) })
23
+ ]
24
+ }
25
+ )
26
+ ] });
27
+ };
28
+
29
+
30
+ exports.ErrorSummary = ErrorSummary;
@@ -0,0 +1,9 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { a as FormFieldProps } from './index-CHdbHHZ0.js';
3
+
4
+ interface PasswordInputProps extends FormFieldProps {
5
+ disabled?: boolean;
6
+ }
7
+ declare const PasswordInput: ({ label, feedback, description, disabled, attributes, inputId, optional, }: PasswordInputProps) => react_jsx_runtime.JSX.Element;
8
+
9
+ export { PasswordInput };
@@ -0,0 +1,55 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _jsxruntime = require('react/jsx-runtime');
2
+ var _FormField = require('./fieldComponents/FormField');
3
+ var _CheckBox = require('./CheckBox');
4
+ const PasswordInput = ({
5
+ label,
6
+ feedback,
7
+ description,
8
+ disabled,
9
+ attributes,
10
+ inputId,
11
+ optional
12
+ }) => {
13
+ const inputClasses = ["o3-form", "o3-form-text-input"];
14
+ if (feedback && feedback.type === "error") {
15
+ inputClasses.push("o3-form-text-input--error");
16
+ }
17
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
18
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
19
+ _FormField.LabeledFormField,
20
+ {
21
+ label,
22
+ feedback,
23
+ description,
24
+ inputId,
25
+ optional,
26
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
27
+ "input",
28
+ {
29
+ ...attributes,
30
+ id: inputId,
31
+ disabled,
32
+ className: inputClasses.join(" "),
33
+ required: !optional,
34
+ "aria-required": !optional,
35
+ type: "password"
36
+ }
37
+ )
38
+ }
39
+ ),
40
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "o3-password-input__controls", children: [
41
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
42
+ _CheckBox.CheckBoxItem,
43
+ {
44
+ attributes: { disabled },
45
+ inputId: "showPassword",
46
+ checkboxLabel: "Show Password"
47
+ }
48
+ ),
49
+ !disabled && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "a", { href: "", children: "Forgot password?" })
50
+ ] })
51
+ ] });
52
+ };
53
+
54
+
55
+ exports.PasswordInput = PasswordInput;
@@ -0,0 +1,7 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { R as RadioButtonProps, F as FormFieldsetProps } from './index-CHdbHHZ0.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 };
@@ -0,0 +1,52 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _jsxruntime = require('react/jsx-runtime');
2
+ var _react = require('react');
3
+ var _FormField = require('./fieldComponents/FormField');
4
+ const RadioButtonItem = (props) => {
5
+ let { inputId, attributes, optional, error } = props;
6
+ const classNames = [
7
+ "o3-form-input-radio-button",
8
+ "o3-visually-hidden"
9
+ ];
10
+ if (error) {
11
+ classNames.push("o3-form-input-error");
12
+ }
13
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { children: [
14
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
15
+ "input",
16
+ {
17
+ ...attributes,
18
+ type: "radio",
19
+ id: inputId,
20
+ className: classNames.join(" "),
21
+ required: !optional,
22
+ "aria-required": !optional
23
+ }
24
+ ),
25
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "label", { htmlFor: inputId, className: "o3-form-input-radio-button__label", children: props.radioButtonLabel })
26
+ ] });
27
+ };
28
+ const RadioButtonGroup = (props) => {
29
+ const { children, ...restProps } = props;
30
+ const radioGroupName = Math.random().toString(36).substring(7);
31
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _FormField.FormFieldset, { ...restProps, children: children.map((child) => {
32
+ const hasError = _optionalChain([props, 'access', _ => _.feedback, 'optionalAccess', _2 => _2.errorElementIds, 'optionalAccess', _3 => _3.includes, 'call', _4 => _4(
33
+ child.props.inputId
34
+ )]);
35
+ return /* @__PURE__ */ _react.createElement.call(void 0,
36
+ RadioButtonItem,
37
+ {
38
+ ...child.props,
39
+ error: hasError,
40
+ key: child.props.inputId,
41
+ attributes: {
42
+ ...child.props.attributes,
43
+ name: radioGroupName
44
+ }
45
+ }
46
+ );
47
+ }) });
48
+ };
49
+
50
+
51
+
52
+ exports.RadioButtonGroup = RadioButtonGroup; exports.RadioButtonItem = RadioButtonItem;
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { T as TextInputProps } from './index-BZth9mTZ.js';
2
+ import { T as TextInputProps } from './index-CHdbHHZ0.js';
3
3
 
4
4
  declare const TextInput: ({ label, feedback, description, disabled, length, attributes, inputId, optional, }: TextInputProps) => react_jsx_runtime.JSX.Element;
5
5
 
package/cjs/TextInput.js CHANGED
@@ -1,5 +1,4 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _jsxruntime = require('react/jsx-runtime');
2
- require('../../main.css');
3
2
  var _FormField = require('./fieldComponents/FormField');
4
3
  const TextInput = ({
5
4
  label,
@@ -25,6 +24,7 @@ const TextInput = ({
25
24
  feedback,
26
25
  description,
27
26
  inputId,
27
+ optional,
28
28
  children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
29
29
  "input",
30
30
  {
@@ -32,8 +32,8 @@ const TextInput = ({
32
32
  id: inputId,
33
33
  disabled,
34
34
  className: inputClasses.join(" "),
35
- required: optional,
36
- "aria-required": optional,
35
+ required: !optional,
36
+ "aria-required": !optional,
37
37
  maxLength: length,
38
38
  type: "text"
39
39
  }
@@ -0,0 +1,6 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { b as FeedbackProps } from '../index-CHdbHHZ0.js';
3
+
4
+ declare const Feedback: ({ message, type }: FeedbackProps) => react_jsx_runtime.JSX.Element;
5
+
6
+ export { Feedback };
@@ -0,0 +1,7 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _jsxruntime = require('react/jsx-runtime');
2
+ const Feedback = ({ message, type }) => {
3
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: `o3-form-feedback o3-form-feedback__${type}`, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: `o3-form-feedback__${type}-message`, children: message }) });
4
+ };
5
+
6
+
7
+ exports.Feedback = Feedback;
@@ -0,0 +1,7 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare const Form: ({ children }: {
4
+ children: JSX.Element | JSX.Element[];
5
+ }) => react_jsx_runtime.JSX.Element;
6
+
7
+ export { Form };
@@ -0,0 +1,7 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _jsxruntime = require('react/jsx-runtime');
2
+ const Form = ({ children }) => {
3
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "form", { className: "o3-form", children });
4
+ };
5
+
6
+
7
+ exports.Form = Form;
@@ -0,0 +1,8 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { a as FormFieldProps, F as FormFieldsetProps } from '../index-CHdbHHZ0.js';
3
+
4
+ declare const LabeledFormField: ({ inputId, label, description, feedback, children, optional }: FormFieldProps) => react_jsx_runtime.JSX.Element;
5
+ declare const TitledFormField: ({ label, description, feedback, children, optional }: FormFieldProps) => react_jsx_runtime.JSX.Element;
6
+ declare const FormFieldset: ({ label, description, feedback, children, optional }: FormFieldsetProps) => react_jsx_runtime.JSX.Element;
7
+
8
+ export { FormFieldset, LabeledFormField, TitledFormField };
@@ -0,0 +1,69 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _jsxruntime = require('react/jsx-runtime');
2
+ var _outils = require('@financial-times/o-utils');
3
+ var _Feedback = require('./Feedback');
4
+ const uniqueId = _outils.uidBuilder.call(void 0, "o3-form");
5
+ const LabeledFormField = ({
6
+ inputId,
7
+ label,
8
+ description,
9
+ feedback,
10
+ children,
11
+ optional
12
+ }) => {
13
+ const id = inputId || uniqueId("input_");
14
+ const descriptionId = description ? uniqueId("description_") : void 0;
15
+ const labelClasses = ["o3-form-field__label"];
16
+ if (optional) {
17
+ labelClasses.push("o3-form-field--optional");
18
+ }
19
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "o3-form-field", children: [
20
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "label", { className: labelClasses.join(" "), htmlFor: id, children: label }),
21
+ description && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "o3-form-input__description", id: descriptionId, children: description }),
22
+ children,
23
+ feedback && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Feedback.Feedback, { ...feedback })
24
+ ] });
25
+ };
26
+ const TitledFormField = ({
27
+ label,
28
+ description,
29
+ feedback,
30
+ children,
31
+ optional
32
+ }) => {
33
+ const descriptionId = description ? uniqueId("description_") : void 0;
34
+ const labelId = uniqueId("label_");
35
+ const labelClasses = ["o3-form-field__title"];
36
+ if (optional) {
37
+ labelClasses.push("o3-form-field--optional");
38
+ }
39
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "o3-form-field", children: [
40
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: labelClasses.join(" "), id: labelId, children: label }),
41
+ description && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "o3-form-input__description", id: descriptionId, children: description }),
42
+ children,
43
+ feedback && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Feedback.Feedback, { ...feedback })
44
+ ] });
45
+ };
46
+ const FormFieldset = ({
47
+ label,
48
+ description,
49
+ feedback,
50
+ children,
51
+ optional
52
+ }) => {
53
+ const descriptionId = uniqueId("checkbox_");
54
+ const labelClasses = ["o3-form-field__legend"];
55
+ if (optional) {
56
+ labelClasses.push("o3-form-field--optional");
57
+ }
58
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "fieldset", { className: "o3-form-field", "aria-describedby": `${descriptionId}`, children: [
59
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "legend", { className: labelClasses.join(" "), children: label }),
60
+ description && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "o3-form-input__description", id: descriptionId, children: description }),
61
+ children,
62
+ feedback && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Feedback.Feedback, { ...feedback })
63
+ ] });
64
+ };
65
+
66
+
67
+
68
+
69
+ exports.FormFieldset = FormFieldset; exports.LabeledFormField = LabeledFormField; exports.TitledFormField = TitledFormField;
@@ -6,7 +6,7 @@ type BaseInputProps = {
6
6
  error?: boolean;
7
7
  attributes?: JSX.IntrinsicElements['input'];
8
8
  };
9
- interface TextInputProps extends FormFieldProps {
9
+ interface TextInputProps extends BaseInputProps {
10
10
  disabled?: boolean;
11
11
  length?: 2 | 3 | 4 | 5;
12
12
  feedback?: FeedbackProps;
@@ -16,11 +16,16 @@ interface CheckBoxProps extends BaseInputProps {
16
16
  checkboxLabel: string;
17
17
  feedback?: FeedbackProps;
18
18
  }
19
+ interface RadioButtonProps extends BaseInputProps {
20
+ inputId: string;
21
+ radioButtonLabel: string;
22
+ }
19
23
  interface FormFieldsetProps {
20
24
  label: string;
21
25
  description?: string;
22
26
  children: JSX.Element | JSX.Element[];
23
27
  feedback?: FeedbackProps;
28
+ optional?: boolean;
24
29
  }
25
30
  interface FormFieldProps extends BaseInputProps {
26
31
  feedback?: FeedbackProps;
@@ -31,5 +36,13 @@ type FeedbackProps = {
31
36
  message: string;
32
37
  type: 'error';
33
38
  };
39
+ type ErrorSummaryProps = {
40
+ errorMessage?: string;
41
+ errors: {
42
+ id: string;
43
+ fieldName: string;
44
+ message: string;
45
+ }[];
46
+ };
34
47
 
35
- export type { CheckBoxProps as C, FeedbackProps as F, TextInputProps as T, FormFieldProps as a, FormFieldsetProps as b };
48
+ export type { CheckBoxProps as C, ErrorSummaryProps as E, FormFieldsetProps as F, RadioButtonProps as R, TextInputProps as T, FormFieldProps as a, FeedbackProps as b };
package/cjs/index.d.ts CHANGED
@@ -1,15 +1,10 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { F as FeedbackProps, a as FormFieldProps, b as FormFieldsetProps } from './index-BZth9mTZ.js';
1
+ export { Feedback } from './fieldComponents/Feedback.js';
2
+ export { FormFieldset, LabeledFormField, TitledFormField } from './fieldComponents/FormField.js';
3
+ export { Form } from './fieldComponents/Form.js';
3
4
  export { CheckBox, CheckBoxGroup, CheckBoxItem } from './CheckBox.js';
4
-
5
- declare const Feedback: ({ message, type }: FeedbackProps) => react_jsx_runtime.JSX.Element;
6
-
7
- declare const LabeledFormField: ({ inputId, label, description, feedback, children, }: FormFieldProps) => react_jsx_runtime.JSX.Element;
8
- declare const TitledFormField: ({ label, description, feedback, children, }: FormFieldProps) => react_jsx_runtime.JSX.Element;
9
- declare const FormFieldset: ({ label, description, feedback, children, }: FormFieldsetProps) => react_jsx_runtime.JSX.Element;
10
-
11
- declare const Form: ({ children }: {
12
- children: JSX.Element | JSX.Element[];
13
- }) => react_jsx_runtime.JSX.Element;
14
-
15
- export { Feedback, Form, FormFieldset, LabeledFormField, TitledFormField };
5
+ export { RadioButtonGroup, RadioButtonItem } from './RadioButton.js';
6
+ export { ErrorSummary } from './Error-summary.js';
7
+ export { PasswordInput } from './PasswordInput.js';
8
+ export { TextInput } from './TextInput.js';
9
+ import 'react/jsx-runtime';
10
+ import './index-CHdbHHZ0.js';
package/cjs/index.js CHANGED
@@ -2,3 +2,7 @@
2
2
  var _FormField = require('./fieldComponents/FormField'); _createStarExport(_FormField);
3
3
  var _Form = require('./fieldComponents/Form'); _createStarExport(_Form);
4
4
  var _CheckBox = require('./CheckBox'); _createStarExport(_CheckBox);
5
+ var _RadioButton = require('./RadioButton'); _createStarExport(_RadioButton);
6
+ var _Errorsummary = require('./Error-summary'); _createStarExport(_Errorsummary);
7
+ var _PasswordInput = require('./PasswordInput'); _createStarExport(_PasswordInput);
8
+ var _TextInput = require('./TextInput'); _createStarExport(_TextInput);
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 */
@@ -21,7 +25,7 @@
21
25
  font-weight: var(--o3-font-weight-medium);
22
26
  color: var(--o3-color-use-case-body-text);
23
27
  }
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 {
28
+ .o3-form-field :is(.o3-form-field__label, .o3-form-field__title, .o3-form-field__legend).o3-form-field--optional::after {
25
29
  content: "(optional)";
26
30
  margin-left: var(--o3-spacing-3xs);
27
31
  color: var(--o3-color-use-case-muted-text);
@@ -50,7 +54,7 @@
50
54
  align-items: center;
51
55
  font-size: var(--o3-font-size-metric2-negative-1);
52
56
  line-height: var(--o3-font-lineheight-metric2-negative-1);
53
- color: var(--o3-color-palette-crimson);
57
+ color: var(--o3-color-use-case-error-text);
54
58
  }
55
59
  .o3-form-feedback__error-message {
56
60
  display: flex;
@@ -73,14 +77,17 @@
73
77
 
74
78
  /* src/css/components/text-input.css */
75
79
  .o3-form-text-input {
76
- border: var(--_o3-form-text-input-border);
80
+ border: var(--_o3-form-input-border);
77
81
  padding: var(--o3-spacing-3xs) var(--o3-spacing-2xs);
78
- background-color: var(--_o3-form-text-input-background-color);
82
+ background-color: var(--o3-form-color-use-case-background);
79
83
  box-sizing: border-box;
80
- border-radius: var(--_o3-form-text-input-border-radius);
84
+ border-radius: var(--_o3-form-input-border-radius);
81
85
  --o3-grid-columns-to-span-count: 4;
82
86
  max-width: var(--_o3-form-text-input-max-width, var(--o3-grid-columns-to-span-width));
83
87
  }
88
+ .o3-form-text-input[class*=--short] {
89
+ box-sizing: initial;
90
+ }
84
91
  .o3-form-text-input--short-2 {
85
92
  --_o3-form-text-input-max-width: 1.5em;
86
93
  }
@@ -94,33 +101,39 @@
94
101
  --_o3-form-text-input-max-width: 4.5em;
95
102
  }
96
103
  .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);
104
+ border: var(--_o3-form-input-border-error);
105
+ background-color: var(--o3-form-color-use-case-background-error);
106
+ }
107
+ input[class*=o3-form-text-input][type=password]:disabled,
108
+ input[class*=o3-form-text-input][type=text]:disabled {
109
+ color: var(--o3-color-use-case-muted-text);
110
+ background-color: var(--o3-form-color-use-case-background-disabled);
111
+ border-color: var(--o3-form-color-use-case-border-disabled);
99
112
  }
100
113
 
101
114
  /* src/css/components/checkbox.css */
102
- .o3-form-input__checkbox-input + label::before {
115
+ .o3-form-input-checkbox__input + label::before {
103
116
  content: "";
104
117
  display: inline-block;
105
118
  width: var(--o3-spacing-s);
106
119
  height: var(--o3-spacing-s);
107
120
  margin-right: var(--o3-spacing-3xs);
108
- border: 2px solid var(--o3-color-palette-black-50);
109
- border-radius: var(--o3-spacing-5xs);
121
+ border: var(--_o3-form-input-border);
122
+ border-radius: var(--_o3-form-input-border-radius);
110
123
  box-sizing: border-box;
111
124
  }
112
- .o3-form-input__checkbox-input:hover + label::before {
113
- border-color: var(--o3-color-palette-black-40);
125
+ .o3-form-input-checkbox__input:hover + label::before {
126
+ border-color: var(--o3-form-color-use-case-selected-hover);
114
127
  }
115
- .o3-form-input__checkbox-input:active + label::before {
116
- border-color: var(--o3-color-palette-black-30);
128
+ .o3-form-input-checkbox__input:active + label::before {
129
+ border-color: var(--o3-form-color-use-case-selected-active);
117
130
  }
118
- .o3-form-input__checkbox-input:checked + label::after {
131
+ .o3-form-input-checkbox__input:checked + label::after {
119
132
  position: absolute;
120
133
  content: "";
121
134
  width: var(--o3-spacing-s);
122
135
  height: var(--o3-spacing-s);
123
- background-color: var(--o3-color-palette-white);
136
+ background-color: var(--o3-form-color-use-case-background);
124
137
  -webkit-mask-image: var(--o3-icons-ft-icon-tick);
125
138
  mask-image: var(--o3-icons-ft-icon-tick);
126
139
  -webkit-mask-repeat: no-repeat;
@@ -128,45 +141,49 @@
128
141
  -webkit-mask-size: contain;
129
142
  mask-size: contain;
130
143
  }
131
- .o3-form-input__checkbox-input:checked + label::before {
132
- background-color: var(--o3-color-palette-black-50);
144
+ .o3-form-input-checkbox__input:checked + label::before {
145
+ background-color: var(--o3-form-color-use-case-selected-active);
146
+ border-color: var(--o3-form-color-use-case-selected-active);
133
147
  }
134
- .o3-form-input__checkbox-input:checked:hover + label::before {
135
- background-color: var(--o3-color-palette-black-40);
148
+ .o3-form-input-checkbox__input:checked:hover + label::before {
149
+ background-color: var(--o3-form-color-use-case-selected-hover);
150
+ border-color: var(--o3-form-color-use-case-selected-hover);
136
151
  }
137
- .o3-form-input__checkbox-input:checked:active + label::before {
138
- background-color: var(--o3-color-palette-black-30);
152
+ .o3-form-input-checkbox__input:checked:active + label::before {
153
+ background-color: var(--o3-form-color-use-case-selected-active);
154
+ border-color: var(--o3-form-color-use-case-selected-active);
139
155
  }
140
- .o3-form-input__checkbox-input:disabled + label::before {
141
- border-color: var(--o3-color-palette-black-30);
156
+ .o3-form-input-checkbox__input:disabled + label::before {
157
+ border-color: var(--o3-form-color-use-case-border-disabled);
142
158
  }
143
- .o3-form-input__checkbox-input:disabled + label {
144
- color: var(--o3-color-palette-black-30);
159
+ .o3-form-input-checkbox__input:disabled + label {
160
+ color: var(--o3-form-color-use-case-border-disabled);
145
161
  }
146
- .o3-form-input__checkbox-input:checked:disabled + label::before {
147
- background-color: var(--o3-color-palette-black-30);
162
+ .o3-form-input-checkbox__input:checked:disabled + label::before {
163
+ background-color: var(--o3-form-color-use-case-selected-disabled);
164
+ border-color: var(--o3-form-color-use-case-selected-disabled);
148
165
  }
149
- .o3-form-input__checkbox-input.o3-form-input-error + label::before {
166
+ .o3-form-input-checkbox__input.o3-form-input-error + label::before {
150
167
  border-color: var(--o3-color-use-case-error);
151
168
  background-color: var(--o3-color-use-case-error-background);
152
169
  }
153
- .o3-form-input__checkbox-input.o3-form-input-error:checked + label::before {
170
+ .o3-form-input-checkbox__input.o3-form-input-error:checked + label::before {
154
171
  border-color: var(--o3-color-use-case-error);
155
172
  background-color: var(--o3-color-use-case-error-background);
156
173
  }
157
- .o3-form-input__checkbox-input.o3-form-input-error:checked + label::after {
174
+ .o3-form-input-checkbox__input.o3-form-input-error:checked + label::after {
158
175
  background-color: var(--o3-color-use-case-error);
159
176
  }
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);
177
+ .o3-form-input-checkbox__input:indeterminate + label::before {
178
+ border-color: var(--o3-form-color-use-case-selected-active);
179
+ background-color: var(--o3-form-color-use-case-selected-active);
163
180
  }
164
- .o3-form-input__checkbox-input:indeterminate + label::after {
181
+ .o3-form-input-checkbox__input:indeterminate + label::after {
165
182
  position: absolute;
166
183
  content: "";
167
184
  width: var(--o3-spacing-s);
168
185
  height: var(--o3-spacing-s);
169
- background-color: var(--o3-color-palette-white);
186
+ background-color: var(--o3-form-color-use-case-background);
170
187
  -webkit-mask-image: var(--o3-icons-ft-icon-minus);
171
188
  mask-image: var(--o3-icons-ft-icon-minus);
172
189
  -webkit-mask-repeat: no-repeat;
@@ -174,33 +191,166 @@
174
191
  -webkit-mask-size: contain;
175
192
  mask-size: contain;
176
193
  }
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);
194
+ .o3-form-input-checkbox__input:indeterminate:hover + label::before {
195
+ border-color: var(--o3-form-color-use-case-selected-hover);
196
+ background-color: var(--o3-form-color-use-case-selected-hover);
180
197
  }
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);
198
+ .o3-form-input-checkbox__input:indeterminate:active + label::before,
199
+ .o3-form-input-checkbox__input:indeterminate:disabled + label::before {
200
+ border-color: var(--o3-form-color-use-case-selected-hover);
201
+ background-color: var(--o3-form-color-use-case-selected-hover);
185
202
  }
186
- .o3-form-input__checkbox-input.o3-form-input-error:indeterminate + label::before {
203
+ .o3-form-input-checkbox__input.o3-form-input-error:indeterminate + label::before {
187
204
  border-color: var(--o3-color-use-case-error);
188
205
  background-color: var(--o3-color-use-case-error-background);
189
206
  }
190
- .o3-form-input__checkbox-input.o3-form-input-error:indeterminate + label::after {
207
+ .o3-form-input-checkbox__input.o3-form-input-error:indeterminate + label::after {
191
208
  background-color: var(--o3-color-use-case-error);
192
209
  }
193
- .o3-form-input__checkbox-label {
210
+ .o3-form-input-checkbox__label {
194
211
  display: flex;
195
212
  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);
213
+ font-size: var(--o3-typography-use-case-body-small-font-size);
214
+ line-height: var(--o3-typography-use-case-body-small-line-height);
215
+ font-weight: var(--o3-typography-use-case-body-small-font-weight);
199
216
  color: var(--o3-color-use-case-body-text);
200
217
  }
201
- .o3-form-input__checkbox-label:focus-visible {
218
+ .o3-form-input-checkbox__label:focus-visible {
202
219
  padding: var(--o3-spacing-5xs);
203
220
  margin: calc(-1 * var(--o3-spacing-5xs)) 0 calc(-1 * var(--o3-spacing-5xs)) calc(-1 * var(--o3-spacing-5xs));
204
221
  }
205
222
 
223
+ /* src/css/components/radio-button.css */
224
+ .o3-form-input-radio-button + label::before {
225
+ content: "";
226
+ display: inline-block;
227
+ width: var(--o3-spacing-s);
228
+ height: var(--o3-spacing-s);
229
+ margin-right: var(--o3-spacing-3xs);
230
+ border: var(--_o3-form-input-border);
231
+ border-radius: 50%;
232
+ box-sizing: border-box;
233
+ }
234
+ .o3-form-input-radio-button:hover + label::before {
235
+ border-color: var(--o3-form-color-use-case-border-hover);
236
+ }
237
+ .o3-form-input-radio-button:active + label::before {
238
+ border-color: var(--o3-form-color-use-case-border-active);
239
+ }
240
+ .o3-form-input-radio-button:checked + label::before {
241
+ border-color: var(--o3-form-color-use-case-selected);
242
+ }
243
+ .o3-form-input-radio-button:checked + label::after {
244
+ position: absolute;
245
+ content: "";
246
+ width: var(--o3-spacing-3xs);
247
+ height: var(--o3-spacing-3xs);
248
+ background-color: var(--o3-form-color-use-case-selected);
249
+ margin: 6px;
250
+ border-radius: 50%;
251
+ }
252
+ .o3-form-input-radio-button:checked:hover + label::before {
253
+ border-color: var(--o3-form-color-use-case-selected-hover);
254
+ }
255
+ .o3-form-input-radio-button:checked:hover + label::after {
256
+ background-color: var(--o3-form-color-use-case-selected-hover);
257
+ }
258
+ .o3-form-input-radio-button:checked:active + label::before {
259
+ border-color: var(--o3-form-color-use-case-selected-active);
260
+ }
261
+ .o3-form-input-radio-button:checked:active + label::after {
262
+ background-color: var(--o3-form-color-use-case-selected-active);
263
+ }
264
+ .o3-form-input-radio-button:disabled + label::before {
265
+ border-color: var(--o3-form-color-use-case-border-disabled);
266
+ }
267
+ .o3-form-input-radio-button:disabled:checked + label::after {
268
+ background-color: var(--o3-form-color-use-case-border-disabled);
269
+ }
270
+ .o3-form-input-radio-button:disabled + label {
271
+ color: var(--o3-form-color-use-case-border-disabled);
272
+ }
273
+ .o3-form-input-radio-button.o3-form-input-error + label::before {
274
+ border-color: var(--o3-color-use-case-error);
275
+ background-color: var(--o3-form-color-use-case-background-error);
276
+ }
277
+ .o3-form-input-radio-button.o3-form-input-error:checked + label::before {
278
+ border-color: var(--o3-color-use-case-error);
279
+ background-color: var(--o3-form-color-use-case-background-error);
280
+ }
281
+ .o3-form-input-radio-button.o3-form-input-error:checked + label::after {
282
+ background-color: var(--o3-color-use-case-error);
283
+ }
284
+ .o3-form-input-radio-button__label {
285
+ display: flex;
286
+ align-items: center;
287
+ font-size: var(--o3-typography-use-case-body-small-font-size);
288
+ line-height: var(--o3-typography-use-case-body-small-line-height);
289
+ font-weight: var(--o3-typography-use-case-body-small-font-weight);
290
+ font-family: var(--o3-typography-use-case-body-small-font-family);
291
+ color: var(--o3-color-use-case-body-text);
292
+ }
293
+
294
+ /* src/css/components/error-summary.css */
295
+ .o3-form__error-summary {
296
+ display: flex;
297
+ padding: var(--o3-spacing-xs);
298
+ background-color: var(--_o3-form-error-summary-background-color);
299
+ border-radius: var(--_o3-form-input-border-radius);
300
+ }
301
+ .o3-form__error-summary .o3-form__error-summary-icon::before {
302
+ content: "";
303
+ display: inline-block;
304
+ background-color: var(--o3-color-use-case-error);
305
+ width: var(--o3-typography-use-case-body-small-font-size);
306
+ height: var(--o3-typography-use-case-body-small-font-size);
307
+ -webkit-mask-image: var(--o3-icons-ft-icon-error);
308
+ mask-image: var(--o3-icons-ft-icon-error);
309
+ -webkit-mask-repeat: no-repeat;
310
+ mask-repeat: no-repeat;
311
+ -webkit-mask-size: contain;
312
+ mask-size: contain;
313
+ }
314
+ .o3-form__error-summary .o3-form__error-summary__heading {
315
+ margin-left: var(--o3-spacing-4xs);
316
+ }
317
+ .o3-form__error-summary .o3-form__error-summary__heading > span {
318
+ font-weight: var(--o3-font-weight-medium);
319
+ color: var(--o3-color-use-case-error-text);
320
+ display: inline-block;
321
+ margin-bottom: var(--o3-spacing-4xs);
322
+ }
323
+ .o3-form__error-summary .o3-forms__error-summary__list {
324
+ list-style-type: none;
325
+ padding-left: 0;
326
+ margin-top: 0;
327
+ margin-bottom: 0;
328
+ }
329
+ .o3-form__error-summary .o3-forms__error-summary__list li {
330
+ margin-bottom: var(--o3-spacing-4xs);
331
+ }
332
+ .o3-form__error-summary .o3-forms__error-summary__list li:last-child {
333
+ margin-bottom: 0;
334
+ }
335
+ .o3-form__error-summary .o3-forms__error-summary__list li a {
336
+ color: var(--o3-color-use-case-body-text);
337
+ text-decoration-color: var(--o3-color-use-case-body-text);
338
+ }
339
+ @media screen and (max-width: 489px) {
340
+ .o3-form__error-summary {
341
+ padding: var(--o3-spacing-3xs);
342
+ }
343
+ }
344
+
345
+ /* src/css/components/password-input.css */
346
+ .o3-password-input__controls {
347
+ display: flex;
348
+ justify-content: space-between;
349
+ --o3-grid-columns-to-span-count: 4;
350
+ max-width: var(--o3-grid-columns-to-span-width, 100%);
351
+ margin-top: var(--o3-spacing-3xs);
352
+ font-size: var(--o3-font-size-metric2-negative-1);
353
+ line-height: var(--o3-font-lineheight-metric2-negative-1);
354
+ }
355
+
206
356
  /* main.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-selected-disabled: var(--o3-color-palette-black-30);
10
+ --o3-form-color-use-case-selected-active: var(--o3-color-palette-black-40);
11
+ --o3-form-color-use-case-selected-hover: var(--o3-color-palette-black-30);
12
+ --o3-form-color-use-case-selected: var(--o3-color-palette-black-50);
13
+ --o3-form-color-use-case-border-disabled: var(--o3-color-palette-black-30);
14
+ --o3-form-color-use-case-border-active: var(--o3-color-palette-black-40);
15
+ --o3-form-color-use-case-border-hover: var(--o3-color-palette-black-20);
16
+ --o3-form-color-use-case-border: var(--o3-color-palette-black-30);
17
+ --o3-form-color-use-case-background-disabled: var(--o3-color-palette-black-5);
18
+ --o3-form-color-use-case-background: var(--o3-color-palette-white);
19
+ --_o3-form-input-border: 2px solid var(--o3-color-palette-black-30);
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-CHdbHHZ0.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
@@ -3,11 +3,11 @@ import { createElement } from "react";
3
3
  import { TitledFormField, FormFieldset } from "./fieldComponents/FormField";
4
4
  const CheckBoxItem = (props) => {
5
5
  let { inputId, attributes, optional, error } = props;
6
- const classNames = ["o3-form-input__checkbox-input", "o3-visually-hidden"];
6
+ const classNames = ["o3-form-input-checkbox__input", "o3-visually-hidden"];
7
7
  if (error) {
8
8
  classNames.push("o3-form-input-error");
9
9
  }
10
- return /* @__PURE__ */ jsxs("div", { className: "o3-form-input__checkbox", children: [
10
+ return /* @__PURE__ */ jsxs("div", { className: "o3-form-input-checkbox", children: [
11
11
  /* @__PURE__ */ jsx(
12
12
  "input",
13
13
  {
@@ -19,7 +19,7 @@ const CheckBoxItem = (props) => {
19
19
  "aria-required": !optional
20
20
  }
21
21
  ),
22
- /* @__PURE__ */ jsx("label", { htmlFor: inputId, className: "o3-form-input__checkbox-label", children: props.checkboxLabel })
22
+ /* @__PURE__ */ jsx("label", { htmlFor: inputId, className: "o3-form-input-checkbox__label", children: props.checkboxLabel })
23
23
  ] });
24
24
  };
25
25
  const CheckBox = (props) => {
@@ -0,0 +1,6 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { E as ErrorSummaryProps } from './index-CHdbHHZ0.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,9 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { a as FormFieldProps } from './index-CHdbHHZ0.js';
3
+
4
+ interface PasswordInputProps extends FormFieldProps {
5
+ disabled?: boolean;
6
+ }
7
+ declare const PasswordInput: ({ label, feedback, description, disabled, attributes, inputId, optional, }: PasswordInputProps) => react_jsx_runtime.JSX.Element;
8
+
9
+ export { PasswordInput };
@@ -0,0 +1,55 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { LabeledFormField } from "./fieldComponents/FormField";
3
+ import { CheckBoxItem } from "./CheckBox";
4
+ const PasswordInput = ({
5
+ label,
6
+ feedback,
7
+ description,
8
+ disabled,
9
+ attributes,
10
+ inputId,
11
+ optional
12
+ }) => {
13
+ const inputClasses = ["o3-form", "o3-form-text-input"];
14
+ if (feedback && feedback.type === "error") {
15
+ inputClasses.push("o3-form-text-input--error");
16
+ }
17
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
18
+ /* @__PURE__ */ jsx(
19
+ LabeledFormField,
20
+ {
21
+ label,
22
+ feedback,
23
+ description,
24
+ inputId,
25
+ optional,
26
+ children: /* @__PURE__ */ jsx(
27
+ "input",
28
+ {
29
+ ...attributes,
30
+ id: inputId,
31
+ disabled,
32
+ className: inputClasses.join(" "),
33
+ required: !optional,
34
+ "aria-required": !optional,
35
+ type: "password"
36
+ }
37
+ )
38
+ }
39
+ ),
40
+ /* @__PURE__ */ jsxs("div", { className: "o3-password-input__controls", children: [
41
+ /* @__PURE__ */ jsx(
42
+ CheckBoxItem,
43
+ {
44
+ attributes: { disabled },
45
+ inputId: "showPassword",
46
+ checkboxLabel: "Show Password"
47
+ }
48
+ ),
49
+ !disabled && /* @__PURE__ */ jsx("a", { href: "", children: "Forgot password?" })
50
+ ] })
51
+ ] });
52
+ };
53
+ export {
54
+ PasswordInput
55
+ };
@@ -0,0 +1,7 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { R as RadioButtonProps, F as FormFieldsetProps } from './index-CHdbHHZ0.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 };
@@ -0,0 +1,52 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { createElement } from "react";
3
+ import { FormFieldset } from "./fieldComponents/FormField";
4
+ const RadioButtonItem = (props) => {
5
+ let { inputId, attributes, optional, error } = props;
6
+ const classNames = [
7
+ "o3-form-input-radio-button",
8
+ "o3-visually-hidden"
9
+ ];
10
+ if (error) {
11
+ classNames.push("o3-form-input-error");
12
+ }
13
+ return /* @__PURE__ */ jsxs("div", { children: [
14
+ /* @__PURE__ */ jsx(
15
+ "input",
16
+ {
17
+ ...attributes,
18
+ type: "radio",
19
+ id: inputId,
20
+ className: classNames.join(" "),
21
+ required: !optional,
22
+ "aria-required": !optional
23
+ }
24
+ ),
25
+ /* @__PURE__ */ jsx("label", { htmlFor: inputId, className: "o3-form-input-radio-button__label", children: props.radioButtonLabel })
26
+ ] });
27
+ };
28
+ const RadioButtonGroup = (props) => {
29
+ const { children, ...restProps } = props;
30
+ const radioGroupName = Math.random().toString(36).substring(7);
31
+ return /* @__PURE__ */ jsx(FormFieldset, { ...restProps, children: children.map((child) => {
32
+ const hasError = props.feedback?.errorElementIds?.includes(
33
+ child.props.inputId
34
+ );
35
+ return /* @__PURE__ */ createElement(
36
+ RadioButtonItem,
37
+ {
38
+ ...child.props,
39
+ error: hasError,
40
+ key: child.props.inputId,
41
+ attributes: {
42
+ ...child.props.attributes,
43
+ name: radioGroupName
44
+ }
45
+ }
46
+ );
47
+ }) });
48
+ };
49
+ export {
50
+ RadioButtonGroup,
51
+ RadioButtonItem
52
+ };
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { T as TextInputProps } from './index-BZth9mTZ.js';
2
+ import { T as TextInputProps } from './index-CHdbHHZ0.js';
3
3
 
4
4
  declare const TextInput: ({ label, feedback, description, disabled, length, attributes, inputId, optional, }: TextInputProps) => react_jsx_runtime.JSX.Element;
5
5
 
package/esm/TextInput.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
- import "../../main.css";
3
2
  import { LabeledFormField } from "./fieldComponents/FormField";
4
3
  const TextInput = ({
5
4
  label,
@@ -25,6 +24,7 @@ const TextInput = ({
25
24
  feedback,
26
25
  description,
27
26
  inputId,
27
+ optional,
28
28
  children: /* @__PURE__ */ jsx(
29
29
  "input",
30
30
  {
@@ -32,8 +32,8 @@ const TextInput = ({
32
32
  id: inputId,
33
33
  disabled,
34
34
  className: inputClasses.join(" "),
35
- required: optional,
36
- "aria-required": optional,
35
+ required: !optional,
36
+ "aria-required": !optional,
37
37
  maxLength: length,
38
38
  type: "text"
39
39
  }
@@ -0,0 +1,6 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { b as FeedbackProps } from '../index-CHdbHHZ0.mjs';
3
+
4
+ declare const Feedback: ({ message, type }: FeedbackProps) => react_jsx_runtime.JSX.Element;
5
+
6
+ export { Feedback };
@@ -0,0 +1,7 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ const Feedback = ({ message, type }) => {
3
+ return /* @__PURE__ */ jsx("div", { className: `o3-form-feedback o3-form-feedback__${type}`, children: /* @__PURE__ */ jsx("span", { className: `o3-form-feedback__${type}-message`, children: message }) });
4
+ };
5
+ export {
6
+ Feedback
7
+ };
@@ -0,0 +1,7 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare const Form: ({ children }: {
4
+ children: JSX.Element | JSX.Element[];
5
+ }) => react_jsx_runtime.JSX.Element;
6
+
7
+ export { Form };
@@ -0,0 +1,7 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ const Form = ({ children }) => {
3
+ return /* @__PURE__ */ jsx("form", { className: "o3-form", children });
4
+ };
5
+ export {
6
+ Form
7
+ };
@@ -0,0 +1,8 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { a as FormFieldProps, F as FormFieldsetProps } from '../index-CHdbHHZ0.mjs';
3
+
4
+ declare const LabeledFormField: ({ inputId, label, description, feedback, children, optional }: FormFieldProps) => react_jsx_runtime.JSX.Element;
5
+ declare const TitledFormField: ({ label, description, feedback, children, optional }: FormFieldProps) => react_jsx_runtime.JSX.Element;
6
+ declare const FormFieldset: ({ label, description, feedback, children, optional }: FormFieldsetProps) => react_jsx_runtime.JSX.Element;
7
+
8
+ export { FormFieldset, LabeledFormField, TitledFormField };
@@ -0,0 +1,69 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { uidBuilder } from "@financial-times/o-utils";
3
+ import { Feedback } from "./Feedback";
4
+ const uniqueId = uidBuilder("o3-form");
5
+ const LabeledFormField = ({
6
+ inputId,
7
+ label,
8
+ description,
9
+ feedback,
10
+ children,
11
+ optional
12
+ }) => {
13
+ const id = inputId || uniqueId("input_");
14
+ const descriptionId = description ? uniqueId("description_") : void 0;
15
+ const labelClasses = ["o3-form-field__label"];
16
+ if (optional) {
17
+ labelClasses.push("o3-form-field--optional");
18
+ }
19
+ return /* @__PURE__ */ jsxs("div", { className: "o3-form-field", children: [
20
+ /* @__PURE__ */ jsx("label", { className: labelClasses.join(" "), htmlFor: id, children: label }),
21
+ description && /* @__PURE__ */ jsx("span", { className: "o3-form-input__description", id: descriptionId, children: description }),
22
+ children,
23
+ feedback && /* @__PURE__ */ jsx(Feedback, { ...feedback })
24
+ ] });
25
+ };
26
+ const TitledFormField = ({
27
+ label,
28
+ description,
29
+ feedback,
30
+ children,
31
+ optional
32
+ }) => {
33
+ const descriptionId = description ? uniqueId("description_") : void 0;
34
+ const labelId = uniqueId("label_");
35
+ const labelClasses = ["o3-form-field__title"];
36
+ if (optional) {
37
+ labelClasses.push("o3-form-field--optional");
38
+ }
39
+ return /* @__PURE__ */ jsxs("div", { className: "o3-form-field", children: [
40
+ /* @__PURE__ */ jsx("span", { className: labelClasses.join(" "), id: labelId, children: label }),
41
+ description && /* @__PURE__ */ jsx("span", { className: "o3-form-input__description", id: descriptionId, children: description }),
42
+ children,
43
+ feedback && /* @__PURE__ */ jsx(Feedback, { ...feedback })
44
+ ] });
45
+ };
46
+ const FormFieldset = ({
47
+ label,
48
+ description,
49
+ feedback,
50
+ children,
51
+ optional
52
+ }) => {
53
+ const descriptionId = uniqueId("checkbox_");
54
+ const labelClasses = ["o3-form-field__legend"];
55
+ if (optional) {
56
+ labelClasses.push("o3-form-field--optional");
57
+ }
58
+ return /* @__PURE__ */ jsxs("fieldset", { className: "o3-form-field", "aria-describedby": `${descriptionId}`, children: [
59
+ /* @__PURE__ */ jsx("legend", { className: labelClasses.join(" "), children: label }),
60
+ description && /* @__PURE__ */ jsx("span", { className: "o3-form-input__description", id: descriptionId, children: description }),
61
+ children,
62
+ feedback && /* @__PURE__ */ jsx(Feedback, { ...feedback })
63
+ ] });
64
+ };
65
+ export {
66
+ FormFieldset,
67
+ LabeledFormField,
68
+ TitledFormField
69
+ };
@@ -6,7 +6,7 @@ type BaseInputProps = {
6
6
  error?: boolean;
7
7
  attributes?: JSX.IntrinsicElements['input'];
8
8
  };
9
- interface TextInputProps extends FormFieldProps {
9
+ interface TextInputProps extends BaseInputProps {
10
10
  disabled?: boolean;
11
11
  length?: 2 | 3 | 4 | 5;
12
12
  feedback?: FeedbackProps;
@@ -16,11 +16,16 @@ interface CheckBoxProps extends BaseInputProps {
16
16
  checkboxLabel: string;
17
17
  feedback?: FeedbackProps;
18
18
  }
19
+ interface RadioButtonProps extends BaseInputProps {
20
+ inputId: string;
21
+ radioButtonLabel: string;
22
+ }
19
23
  interface FormFieldsetProps {
20
24
  label: string;
21
25
  description?: string;
22
26
  children: JSX.Element | JSX.Element[];
23
27
  feedback?: FeedbackProps;
28
+ optional?: boolean;
24
29
  }
25
30
  interface FormFieldProps extends BaseInputProps {
26
31
  feedback?: FeedbackProps;
@@ -31,5 +36,13 @@ type FeedbackProps = {
31
36
  message: string;
32
37
  type: 'error';
33
38
  };
39
+ type ErrorSummaryProps = {
40
+ errorMessage?: string;
41
+ errors: {
42
+ id: string;
43
+ fieldName: string;
44
+ message: string;
45
+ }[];
46
+ };
34
47
 
35
- export type { CheckBoxProps as C, FeedbackProps as F, TextInputProps as T, FormFieldProps as a, FormFieldsetProps as b };
48
+ export type { CheckBoxProps as C, ErrorSummaryProps as E, FormFieldsetProps as F, RadioButtonProps as R, TextInputProps as T, FormFieldProps as a, FeedbackProps as b };
package/esm/index.d.ts CHANGED
@@ -1,15 +1,10 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { F as FeedbackProps, a as FormFieldProps, b as FormFieldsetProps } from './index-BZth9mTZ.js';
1
+ export { Feedback } from './fieldComponents/Feedback.js';
2
+ export { FormFieldset, LabeledFormField, TitledFormField } from './fieldComponents/FormField.js';
3
+ export { Form } from './fieldComponents/Form.js';
3
4
  export { CheckBox, CheckBoxGroup, CheckBoxItem } from './CheckBox.js';
4
-
5
- declare const Feedback: ({ message, type }: FeedbackProps) => react_jsx_runtime.JSX.Element;
6
-
7
- declare const LabeledFormField: ({ inputId, label, description, feedback, children, }: FormFieldProps) => react_jsx_runtime.JSX.Element;
8
- declare const TitledFormField: ({ label, description, feedback, children, }: FormFieldProps) => react_jsx_runtime.JSX.Element;
9
- declare const FormFieldset: ({ label, description, feedback, children, }: FormFieldsetProps) => react_jsx_runtime.JSX.Element;
10
-
11
- declare const Form: ({ children }: {
12
- children: JSX.Element | JSX.Element[];
13
- }) => react_jsx_runtime.JSX.Element;
14
-
15
- export { Feedback, Form, FormFieldset, LabeledFormField, TitledFormField };
5
+ export { RadioButtonGroup, RadioButtonItem } from './RadioButton.js';
6
+ export { ErrorSummary } from './Error-summary.js';
7
+ export { PasswordInput } from './PasswordInput.js';
8
+ export { TextInput } from './TextInput.js';
9
+ import 'react/jsx-runtime';
10
+ import './index-CHdbHHZ0.js';
package/esm/index.js CHANGED
@@ -2,3 +2,7 @@ export * from "./fieldComponents/Feedback";
2
2
  export * from "./fieldComponents/FormField";
3
3
  export * from "./fieldComponents/Form";
4
4
  export * from "./CheckBox";
5
+ export * from "./RadioButton";
6
+ export * from "./Error-summary";
7
+ export * from "./PasswordInput";
8
+ export * from "./TextInput";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@financial-times/o3-form",
3
- "version": "0.3.3",
3
+ "version": "0.4.0",
4
4
  "description": "Provides a viewport-aware tooltip for annotating or or highlighting other aspects of a product's UI",
5
5
  "keywords": [
6
6
  "form",