@a-type/ui 6.1.42 → 6.1.43

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 (37) hide show
  1. package/dist/components/forms/CheckboxField.js +1 -1
  2. package/dist/components/forms/CheckboxField.js.map +1 -1
  3. package/dist/components/forms/EmojiField.js +1 -1
  4. package/dist/components/forms/EmojiField.js.map +1 -1
  5. package/dist/components/forms/Field.d.ts +3 -0
  6. package/dist/components/forms/Field.js +30 -0
  7. package/dist/components/forms/Field.js.map +1 -1
  8. package/dist/components/forms/Field.module.css +10 -3
  9. package/dist/components/forms/FormError.d.ts +17 -0
  10. package/dist/components/forms/FormError.js +79 -0
  11. package/dist/components/forms/FormError.js.map +1 -0
  12. package/dist/components/forms/FormikForm.stories.js +5 -1
  13. package/dist/components/forms/FormikForm.stories.js.map +1 -1
  14. package/dist/components/forms/NumberStepperField.js +1 -1
  15. package/dist/components/forms/NumberStepperField.js.map +1 -1
  16. package/dist/components/forms/SwitchField.js +1 -1
  17. package/dist/components/forms/SwitchField.js.map +1 -1
  18. package/dist/components/forms/TextField.js +5 -4
  19. package/dist/components/forms/TextField.js.map +1 -1
  20. package/dist/components/forms/ToggleGroupField.js +1 -1
  21. package/dist/components/forms/ToggleGroupField.js.map +1 -1
  22. package/dist/components/input/Input.module.css +10 -0
  23. package/dist/hooks/useTitleBarColor.js +0 -1
  24. package/dist/hooks/useTitleBarColor.js.map +1 -1
  25. package/package.json +1 -1
  26. package/src/components/forms/CheckboxField.tsx +1 -0
  27. package/src/components/forms/EmojiField.tsx +1 -0
  28. package/src/components/forms/Field.module.css +10 -3
  29. package/src/components/forms/Field.tsx +42 -0
  30. package/src/components/forms/FormError.tsx +127 -0
  31. package/src/components/forms/FormikForm.stories.tsx +6 -0
  32. package/src/components/forms/NumberStepperField.tsx +1 -0
  33. package/src/components/forms/SwitchField.tsx +1 -0
  34. package/src/components/forms/TextField.tsx +21 -4
  35. package/src/components/forms/ToggleGroupField.tsx +1 -0
  36. package/src/components/input/Input.module.css +10 -0
  37. package/src/hooks/useTitleBarColor.ts +0 -1
@@ -20,6 +20,6 @@ export function CheckboxField(_a) {
20
20
  const id = useIdOrGenerated(providedId);
21
21
  return (_jsxs(Field, { horizontal: true, className: className, style: style, id: id, children: [_jsx(Field.Control, { render: _jsx(Checkbox, Object.assign({}, props, { checked: props.checked, onCheckedChange: (v) => {
22
22
  tools.setValue(!!v);
23
- } }, rest)) }), label && _jsx(Field.Label, { children: label }), description && _jsx(Field.Description, { children: description })] }));
23
+ } }, rest)) }), label && _jsx(Field.Label, { children: label }), description && _jsx(Field.Description, { children: description }), _jsx(Field.Error, { fieldName: name })] }));
24
24
  }
25
25
  //# sourceMappingURL=CheckboxField.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CheckboxField.js","sourceRoot":"","sources":["../../../src/components/forms/CheckboxField.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAYnC,MAAM,UAAU,aAAa,CAAC,EAST;QATS,EAC7B,IAAI,EACJ,KAAK,EACL,SAAS,EACT,KAAK,EACL,QAAQ,EACR,EAAE,EAAE,UAAU,EACd,WAAW,OAES,EADjB,IAAI,cARsB,wEAS7B,CADO;IAEP,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IACzE,MAAM,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACxC,OAAO,CACN,MAAC,KAAK,IAAC,UAAU,QAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,aAC3D,KAAC,KAAK,CAAC,OAAO,IACb,MAAM,EACL,KAAC,QAAQ,oBACJ,KAAK,IACT,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE;wBACtB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrB,CAAC,IACG,IAAI,EACP,GAEF,EACD,KAAK,IAAI,KAAC,KAAK,CAAC,KAAK,cAAE,KAAK,GAAe,EAC3C,WAAW,IAAI,KAAC,KAAK,CAAC,WAAW,cAAE,WAAW,GAAqB,IAC7D,CACR,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"CheckboxField.js","sourceRoot":"","sources":["../../../src/components/forms/CheckboxField.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAYnC,MAAM,UAAU,aAAa,CAAC,EAST;QATS,EAC7B,IAAI,EACJ,KAAK,EACL,SAAS,EACT,KAAK,EACL,QAAQ,EACR,EAAE,EAAE,UAAU,EACd,WAAW,OAES,EADjB,IAAI,cARsB,wEAS7B,CADO;IAEP,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IACzE,MAAM,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACxC,OAAO,CACN,MAAC,KAAK,IAAC,UAAU,QAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,aAC3D,KAAC,KAAK,CAAC,OAAO,IACb,MAAM,EACL,KAAC,QAAQ,oBACJ,KAAK,IACT,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE;wBACtB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrB,CAAC,IACG,IAAI,EACP,GAEF,EACD,KAAK,IAAI,KAAC,KAAK,CAAC,KAAK,cAAE,KAAK,GAAe,EAC3C,WAAW,IAAI,KAAC,KAAK,CAAC,WAAW,cAAE,WAAW,GAAqB,EACpE,KAAC,KAAK,CAAC,KAAK,IAAC,SAAS,EAAE,IAAI,GAAI,IACzB,CACR,CAAC;AACH,CAAC"}
@@ -32,6 +32,6 @@ export function EmojiField(_a) {
32
32
  : () => {
33
33
  tools.setValue('');
34
34
  setOpen(false);
35
- }, id: id }) })] }), label && _jsx(Field.Label, { children: label }), description && _jsx(Field.Description, { children: description })] }));
35
+ }, id: id }) })] }), label && _jsx(Field.Label, { children: label }), description && _jsx(Field.Description, { children: description }), _jsx(Field.Error, { fieldName: name })] }));
36
36
  }
37
37
  //# sourceMappingURL=EmojiField.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmojiField.js","sourceRoot":"","sources":["../../../src/components/forms/EmojiField.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAa,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,GAAG,MAAM,yBAAyB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAWnC,MAAM,UAAU,UAAU,CAAC,EAST;QATS,EAC1B,IAAI,EACJ,KAAK,EACL,SAAS,EACT,QAAQ,EACR,EAAE,EAAE,UAAU,EACd,WAAW,EACX,KAAK,OAEY,EADd,IAAI,cARmB,wEAS1B,CADO;IAEP,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,CACN,MAAC,KAAK,IAAC,UAAU,QAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,aAC3D,MAAC,OAAO,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,aACzC,KAAC,KAAK,CAAC,OAAO,IAAC,MAAM,EAAE,8BAAO,IAAI,EAAC,QAAQ,IAAK,KAAK,EAAI,GAAI,EAC7D,KAAC,OAAO,CAAC,OAAO,IACf,MAAM,EACL,KAAC,MAAM,kBACN,EAAE,EAAE,GAAG,EAAE,UAAU,gBACR,cAAc,EACzB,IAAI,EAAC,SAAS,EACd,QAAQ,EAAC,OAAO,IACZ,IAAI,cAER,KAAC,MAAM,CAAC,IAAI,IAAC,SAAS,EAAE,GAAG,CAAC,WAAW,YACrC,KAAK,CAAC,KAAK,IAAI,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,GAAG,GACxB,IACN,GAET,EACF,KAAC,OAAO,CAAC,OAAO,cACf,KAAC,WAAW,IACX,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE;gCACpB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gCAClB,OAAO,CAAC,KAAK,CAAC,CAAC;4BAChB,CAAC,EACD,OAAO,EACN,QAAQ;gCACP,CAAC,CAAC,SAAS;gCACX,CAAC,CAAC,GAAG,EAAE;oCACL,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oCACnB,OAAO,CAAC,KAAK,CAAC,CAAC;gCACf,CAAC,EAEL,EAAE,EAAE,EAAE,GACL,GACe,IACT,EACT,KAAK,IAAI,KAAC,KAAK,CAAC,KAAK,cAAE,KAAK,GAAe,EAC3C,WAAW,IAAI,KAAC,KAAK,CAAC,WAAW,cAAE,WAAW,GAAqB,IAC7D,CACR,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"EmojiField.js","sourceRoot":"","sources":["../../../src/components/forms/EmojiField.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAa,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,GAAG,MAAM,yBAAyB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAWnC,MAAM,UAAU,UAAU,CAAC,EAST;QATS,EAC1B,IAAI,EACJ,KAAK,EACL,SAAS,EACT,QAAQ,EACR,EAAE,EAAE,UAAU,EACd,WAAW,EACX,KAAK,OAEY,EADd,IAAI,cARmB,wEAS1B,CADO;IAEP,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,CACN,MAAC,KAAK,IAAC,UAAU,QAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,aAC3D,MAAC,OAAO,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,aACzC,KAAC,KAAK,CAAC,OAAO,IAAC,MAAM,EAAE,8BAAO,IAAI,EAAC,QAAQ,IAAK,KAAK,EAAI,GAAI,EAC7D,KAAC,OAAO,CAAC,OAAO,IACf,MAAM,EACL,KAAC,MAAM,kBACN,EAAE,EAAE,GAAG,EAAE,UAAU,gBACR,cAAc,EACzB,IAAI,EAAC,SAAS,EACd,QAAQ,EAAC,OAAO,IACZ,IAAI,cAER,KAAC,MAAM,CAAC,IAAI,IAAC,SAAS,EAAE,GAAG,CAAC,WAAW,YACrC,KAAK,CAAC,KAAK,IAAI,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,GAAG,GACxB,IACN,GAET,EACF,KAAC,OAAO,CAAC,OAAO,cACf,KAAC,WAAW,IACX,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE;gCACpB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gCAClB,OAAO,CAAC,KAAK,CAAC,CAAC;4BAChB,CAAC,EACD,OAAO,EACN,QAAQ;gCACP,CAAC,CAAC,SAAS;gCACX,CAAC,CAAC,GAAG,EAAE;oCACL,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oCACnB,OAAO,CAAC,KAAK,CAAC,CAAC;gCACf,CAAC,EAEL,EAAE,EAAE,EAAE,GACL,GACe,IACT,EACT,KAAK,IAAI,KAAC,KAAK,CAAC,KAAK,cAAE,KAAK,GAAe,EAC3C,WAAW,IAAI,KAAC,KAAK,CAAC,WAAW,cAAE,WAAW,GAAqB,EACpE,KAAC,KAAK,CAAC,KAAK,IAAC,SAAS,EAAE,IAAI,GAAI,IACzB,CACR,CAAC;AACH,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { UseRenderComponentProps } from '@base-ui/react';
2
2
  import { ComponentProps } from 'react';
3
3
  import { SlotDiv, SlotDivProps } from '../utility/SlotDiv.js';
4
+ import { FormErrorProps } from './FormError.js';
4
5
  export interface FieldRootProps extends SlotDivProps {
5
6
  horizontal?: boolean;
6
7
  stretch?: boolean;
@@ -14,9 +15,11 @@ declare function FieldRoot({ className, horizontal, stretch, reverse, id, ...pro
14
15
  declare function FieldControl({ className, ref, ...props }: ComponentProps<typeof SlotDiv>): import("react/jsx-runtime").JSX.Element;
15
16
  declare function FieldLabel({ className, ref, render, ...props }: UseRenderComponentProps<'label'>): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
16
17
  declare function FieldDescription({ className, render, ref, ...props }: UseRenderComponentProps<'div'>): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
18
+ declare function FieldError({ className, ...props }: FormErrorProps): import("react/jsx-runtime").JSX.Element;
17
19
  export declare const Field: typeof FieldRoot & {
18
20
  Label: typeof FieldLabel;
19
21
  Description: typeof FieldDescription;
20
22
  Control: typeof FieldControl;
23
+ Error: typeof FieldError;
21
24
  };
22
25
  export {};
@@ -16,6 +16,7 @@ import { createContext, useContext, useEffect, useRef, useState, } from 'react';
16
16
  import useMergedRef from '../../hooks/useMergedRef.js';
17
17
  import { SlotDiv } from '../utility/SlotDiv.js';
18
18
  import cls from './Field.module.css';
19
+ import { FormError } from './FormError.js';
19
20
  const FieldContext = createContext({
20
21
  events: new EventTarget(),
21
22
  });
@@ -46,6 +47,23 @@ function FieldControl(_a) {
46
47
  events.removeEventListener('description-visible', onDescriptionVisible);
47
48
  };
48
49
  }, [events, id]);
50
+ useEffect(() => {
51
+ if (!id)
52
+ return;
53
+ function onErrorVisible(event) {
54
+ var _a, _b;
55
+ if (event.detail === true) {
56
+ (_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-errormessage', `${id}-error`);
57
+ }
58
+ else {
59
+ (_b = innerRef.current) === null || _b === void 0 ? void 0 : _b.removeAttribute('aria-errormessage');
60
+ }
61
+ }
62
+ events.addEventListener('error-visible', onErrorVisible);
63
+ return () => {
64
+ events.removeEventListener('error-visible', onErrorVisible);
65
+ };
66
+ }, [events, id]);
49
67
  return (_jsx(SlotDiv, Object.assign({ className: clsx(cls.control, className), id: id, ref: finalRef }, props)));
50
68
  }
51
69
  function FieldLabel(_a) {
@@ -74,9 +92,21 @@ function FieldDescription(_a) {
74
92
  ref,
75
93
  });
76
94
  }
95
+ function FieldError(_a) {
96
+ var { className } = _a, props = __rest(_a, ["className"]);
97
+ const { id, events } = useContext(FieldContext);
98
+ useEffect(() => {
99
+ events.dispatchEvent(new CustomEvent('error-visible', { detail: true }));
100
+ return () => {
101
+ events.dispatchEvent(new CustomEvent('error-visible', { detail: false }));
102
+ };
103
+ }, [events]);
104
+ return (_jsx(FormError, Object.assign({ className: clsx(cls.error, className), id: id ? `${id}-error` : undefined, inputId: id }, props)));
105
+ }
77
106
  export const Field = Object.assign(FieldRoot, {
78
107
  Label: FieldLabel,
79
108
  Description: FieldDescription,
80
109
  Control: FieldControl,
110
+ Error: FieldError,
81
111
  });
82
112
  //# sourceMappingURL=Field.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Field.js","sourceRoot":"","sources":["../../../src/components/forms/Field.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAA2B,MAAM,gBAAgB,CAAC;AACpE,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAEN,aAAa,EACb,UAAU,EACV,SAAS,EACT,MAAM,EACN,QAAQ,GACR,MAAM,OAAO,CAAC;AACf,OAAO,YAAY,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,OAAO,EAAgB,MAAM,uBAAuB,CAAC;AAC9D,OAAO,GAAG,MAAM,oBAAoB,CAAC;AAYrC,MAAM,YAAY,GAAG,aAAa,CAAuC;IACxE,MAAM,EAAE,IAAI,WAAW,EAAE;CACzB,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,EAOF;QAPE,EAClB,SAAS,EACT,UAAU,EACV,OAAO,EACP,OAAO,EACP,EAAE,OAEc,EADb,KAAK,cANU,uDAOlB,CADQ;IAER,MAAM,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;IACnD,OAAO,CACN,KAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,YAC3C,KAAC,OAAO,kBACP,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,qBACnB,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,kBAC9B,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,kBACxB,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAClC,KAAK,EACR,GACqB,CACxB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,EAIW;QAJX,EACrB,SAAS,EACT,GAAG,OAE6B,EAD7B,KAAK,cAHa,oBAIrB,CADQ;IAER,MAAM,QAAQ,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAEhD,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,EAAE;YAAE,OAAO;QAEhB,SAAS,oBAAoB,CAAC,KAAkB;;YAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBAC3B,MAAA,QAAQ,CAAC,OAAO,0CAAE,YAAY,CAAC,kBAAkB,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;YACzE,CAAC;iBAAM,CAAC;gBACP,MAAA,QAAQ,CAAC,OAAO,0CAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;YACvD,CAAC;QACF,CAAC;QAED,MAAM,CAAC,gBAAgB,CACtB,qBAAqB,EACrB,oBAAqC,CACrC,CAAC;QACF,OAAO,GAAG,EAAE;YACX,MAAM,CAAC,mBAAmB,CACzB,qBAAqB,EACrB,oBAAqC,CACrC,CAAC;QACH,CAAC,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAEjB,OAAO,CACN,KAAC,OAAO,kBACP,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,EACvC,EAAE,EAAE,EAAE,EACN,GAAG,EAAE,QAAQ,IACT,KAAK,EACR,CACF,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,EAKe;QALf,EACnB,SAAS,EACT,GAAG,EACH,MAAM,OAE4B,EAD/B,KAAK,cAJW,8BAKnB,CADQ;IAER,MAAM,EAAE,EAAE,EAAE,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACxC,OAAO,SAAS,CAAC;QAChB,cAAc,EAAE,OAAO;QACvB,KAAK,kBACJ,OAAO,EAAE,EAAE,EACX,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,IAClC,KAAK,CACR;QACD,GAAG;QACH,MAAM;KACN,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,EAKO;QALP,EACzB,SAAS,EACT,MAAM,EACN,GAAG,OAE6B,EAD7B,KAAK,cAJiB,8BAKzB,CADQ;IAER,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAEhD,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,CAAC,aAAa,CACnB,IAAI,WAAW,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CACxD,CAAC;QACF,OAAO,GAAG,EAAE;YACX,MAAM,CAAC,aAAa,CACnB,IAAI,WAAW,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CACzD,CAAC;QACH,CAAC,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,SAAS,CAAC;QAChB,cAAc,EAAE,KAAK;QACrB,KAAK,kBACJ,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,EAC1D,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,IACrC,KAAK,CACR;QACD,MAAM;QACN,GAAG;KACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE;IAC7C,KAAK,EAAE,UAAU;IACjB,WAAW,EAAE,gBAAgB;IAC7B,OAAO,EAAE,YAAY;CACrB,CAAC,CAAC"}
1
+ {"version":3,"file":"Field.js","sourceRoot":"","sources":["../../../src/components/forms/Field.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  @layer components {.root {
2
2
  display: grid;
3
- grid-template-areas: 'label' 'control' 'description';
3
+ grid-template-areas: 'label' 'control' 'description' 'error';
4
4
  justify-content: start;
5
5
  border: none;
6
6
  padding: 0;
@@ -9,10 +9,10 @@
9
9
  &[data-horizontal] {
10
10
  flex-direction: row;
11
11
  align-items: center;
12
- grid-template-areas: 'control label' 'description description';
12
+ grid-template-areas: 'control label' 'description description' 'error error';
13
13
  grid-template-columns: auto 1fr;
14
14
  &[data-reverse] {
15
- grid-template-areas: 'label control' 'description description';
15
+ grid-template-areas: 'label control' 'description description' 'error error';
16
16
  grid-template-columns: auto 1fr;
17
17
  }
18
18
  }
@@ -61,4 +61,11 @@
61
61
  margin-top: var(--m-sp-sm);
62
62
  margin-left: calc(var(--m-global-shape-roundness) * var(--m-sp-md));
63
63
  }
64
+
65
+ .error {
66
+ grid-area: error;
67
+ font-style: italic;
68
+ margin-top: var(--m-sp-sm);
69
+ margin-left: calc(var(--m-global-shape-roundness) * var(--m-sp-md));
70
+ }
64
71
  }
@@ -0,0 +1,17 @@
1
+ import { TypographyProps } from '../typography/typography.js';
2
+ export interface FormErrorProps extends TypographyProps {
3
+ /**
4
+ * Filter to a single field
5
+ */
6
+ fieldName?: string;
7
+ /**
8
+ * When to show an error, paired with fieldName.
9
+ */
10
+ condition?: 'touched' | 'always' | 'dirty';
11
+ /**
12
+ * Connect to an HTML input to also display native
13
+ * HTML validation errors.
14
+ */
15
+ inputId?: string;
16
+ }
17
+ export declare function FormError({ fieldName, condition, inputId, ...rest }: FormErrorProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,79 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { useFormikContext } from 'formik';
14
+ import { useEffect, useState } from 'react';
15
+ import { Text } from '../typography/typography.js';
16
+ export function FormError(_a) {
17
+ var { fieldName, condition = 'touched', inputId } = _a, rest = __rest(_a, ["fieldName", "condition", "inputId"]);
18
+ const { errors, touched, dirty } = useFormikContext();
19
+ const nativeError = useNativeError(inputId);
20
+ if (condition === 'dirty' && !dirty) {
21
+ return null;
22
+ }
23
+ if (fieldName) {
24
+ const error = nativeError || errors[fieldName];
25
+ if (error) {
26
+ if (condition === 'touched' && !touched[fieldName]) {
27
+ return null;
28
+ }
29
+ return (_jsx(Text, Object.assign({ emphasis: "ambient", color: "attention" }, rest, { children: _jsx(FormErrorFormatted, { error: error }) })));
30
+ }
31
+ return null;
32
+ }
33
+ const errorMessages = Object.values(errors)
34
+ .flat()
35
+ .filter((e) => !!e)
36
+ .concat(nativeError ? [nativeError] : []);
37
+ if (errorMessages.length === 0) {
38
+ return null;
39
+ }
40
+ return (_jsx(Text, Object.assign({ emphasis: "ambient", color: "attention" }, rest, { children: _jsx(FormErrorFormatted, { error: errorMessages }) })));
41
+ }
42
+ function FormErrorFormatted({ error, }) {
43
+ if (typeof error === 'string') {
44
+ return _jsx("span", { children: error });
45
+ }
46
+ else if (Array.isArray(error)) {
47
+ return (_jsx("span", { children: error.map((err, index) => (_jsx(FormErrorFormatted, { error: err }, index))) }));
48
+ }
49
+ else if (typeof error === 'object' && error !== null) {
50
+ return (_jsx("span", { children: Object.entries(error).map(([, err], index) => (_jsxs("span", { children: [_jsx(FormErrorFormatted, { error: err }), index < Object.entries(error).length - 1 ? ', ' : ''] }, index))) }));
51
+ }
52
+ return null;
53
+ }
54
+ function useNativeError(inputId) {
55
+ const [nativeError, setNativeError] = useState(null);
56
+ useEffect(() => {
57
+ if (!inputId)
58
+ return;
59
+ const input = document.getElementById(inputId);
60
+ if (!input) {
61
+ return;
62
+ }
63
+ function handleInput() {
64
+ var _a;
65
+ if (input === null || input === void 0 ? void 0 : input.validity.valid) {
66
+ setNativeError(null);
67
+ }
68
+ else {
69
+ setNativeError((_a = input === null || input === void 0 ? void 0 : input.validationMessage) !== null && _a !== void 0 ? _a : 'Validation error');
70
+ }
71
+ }
72
+ input.addEventListener('input', handleInput);
73
+ return () => {
74
+ input.removeEventListener('input', handleInput);
75
+ };
76
+ }, [inputId]);
77
+ return nativeError;
78
+ }
79
+ //# sourceMappingURL=FormError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormError.js","sourceRoot":"","sources":["../../../src/components/forms/FormError.tsx"],"names":[],"mappings":"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"}
@@ -43,7 +43,11 @@ export const Default = {
43
43
  newsletter: false,
44
44
  plan: 'basic',
45
45
  emoji: '',
46
- } }, args, { children: [_jsx(TextField, { name: "email", type: "email", label: "Email", placeholder: "you@example.com" }), _jsx(TextField, { name: "password", type: "password", label: "Password", description: "Make it a good one" }), _jsx(NumberStepperField, { name: "age", label: "Age", min: 13, max: 100, description: "You can mail your government ID to us, don't worry, we're the good guys" }), _jsx(CheckboxField, { name: "tos", label: "I agree", description: "To what? Not telling." }), _jsx(SwitchField, { name: "newsletter", label: "Subscribe to newsletter", description: "Don't worry, we don't bother you much" }), _jsxs(ToggleGroupField, { type: "single", name: "plan", label: "Select your plan", required: true, description: "Please do the expensive one!!!", children: [_jsx(ToggleGroupField.Item, { value: "basic", children: "Basic" }), _jsx(ToggleGroupField.Item, { value: "pro", children: "Pro" }), _jsx(ToggleGroupField.Item, { value: "enterprise", className: "@mode-accent", children: "Enterprise" })] }), _jsx(EmojiField, { name: "emoji", label: "Favorite Emoji" }), _jsx(SubmitButton, { children: "Sign up" })] })));
46
+ }, validate: (values) => {
47
+ if (!values.email.endsWith('.com')) {
48
+ return { email: 'Email must end with .com' };
49
+ }
50
+ } }, args, { children: [_jsx(TextField, { name: "email", type: "email", label: "Email", placeholder: "you@example.com" }), _jsx(TextField, { name: "password", type: "password", label: "Password", minLength: 8, description: "Make it a good one" }), _jsx(NumberStepperField, { name: "age", label: "Age", min: 13, max: 100, description: "You can mail your government ID to us, don't worry, we're the good guys" }), _jsx(CheckboxField, { name: "tos", label: "I agree", description: "To what? Not telling." }), _jsx(SwitchField, { name: "newsletter", label: "Subscribe to newsletter", description: "Don't worry, we don't bother you much" }), _jsxs(ToggleGroupField, { type: "single", name: "plan", label: "Select your plan", required: true, description: "Please do the expensive one!!!", children: [_jsx(ToggleGroupField.Item, { value: "basic", children: "Basic" }), _jsx(ToggleGroupField.Item, { value: "pro", children: "Pro" }), _jsx(ToggleGroupField.Item, { value: "enterprise", className: "@mode-accent", children: "Enterprise" })] }), _jsx(EmojiField, { name: "emoji", label: "Favorite Emoji" }), _jsx(SubmitButton, { children: "Sign up" })] })));
47
51
  },
48
52
  };
49
53
  //# sourceMappingURL=FormikForm.stories.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormikForm.stories.js","sourceRoot":"","sources":["../../../src/components/forms/FormikForm.stories.tsx"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,IAAI,GAAG;IACZ,KAAK,EAAE,iBAAiB;IACxB,SAAS,EAAE,UAAU;IACrB,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE;QACX,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC5B;CACiC,CAAC;AAEpC,eAAe,IAAI,CAAC;AAIpB,MAAM,CAAC,MAAM,OAAO,GAAU;IAC7B,IAAI,EAAE;QACL,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YACpB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;KACD;IACD,MAAM,CAAC,EAA6B;YAA7B,EAAE,aAAa,EAAE,CAAC,OAAW,EAAN,IAAI,cAA3B,iBAA6B,CAAF;QACjC,OAAO,CACN,MAAC,UAAU,kBACV,aAAa,EAAE;gBACd,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,EAAE;gBACZ,GAAG,EAAE,EAAE;gBACP,GAAG,EAAE,KAAK;gBACV,UAAU,EAAE,KAAK;gBACjB,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE;aACT,IACG,IAAI,eAER,KAAC,SAAS,IACT,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,OAAO,EACZ,KAAK,EAAC,OAAO,EACb,WAAW,EAAC,iBAAiB,GAC5B,EACF,KAAC,SAAS,IACT,IAAI,EAAC,UAAU,EACf,IAAI,EAAC,UAAU,EACf,KAAK,EAAC,UAAU,EAChB,WAAW,EAAC,oBAAoB,GAC/B,EACF,KAAC,kBAAkB,IAClB,IAAI,EAAC,KAAK,EACV,KAAK,EAAC,KAAK,EACX,GAAG,EAAE,EAAE,EACP,GAAG,EAAE,GAAG,EACR,WAAW,EAAC,yEAAyE,GACpF,EACF,KAAC,aAAa,IACb,IAAI,EAAC,KAAK,EACV,KAAK,EAAC,SAAS,EACf,WAAW,EAAC,uBAAuB,GAClC,EACF,KAAC,WAAW,IACX,IAAI,EAAC,YAAY,EACjB,KAAK,EAAC,yBAAyB,EAC/B,WAAW,EAAC,uCAAuC,GAClD,EACF,MAAC,gBAAgB,IAChB,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,MAAM,EACX,KAAK,EAAC,kBAAkB,EACxB,QAAQ,QACR,WAAW,EAAC,gCAAgC,aAE5C,KAAC,gBAAgB,CAAC,IAAI,IAAC,KAAK,EAAC,OAAO,sBAA8B,EAClE,KAAC,gBAAgB,CAAC,IAAI,IAAC,KAAK,EAAC,KAAK,oBAA4B,EAC9D,KAAC,gBAAgB,CAAC,IAAI,IAAC,KAAK,EAAC,YAAY,EAAC,SAAS,EAAC,cAAc,2BAE1C,IACN,EACnB,KAAC,UAAU,IAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,gBAAgB,GAAG,EAClD,KAAC,YAAY,0BAAuB,KACxB,CACb,CAAC;IACH,CAAC;CACD,CAAC"}
1
+ {"version":3,"file":"FormikForm.stories.js","sourceRoot":"","sources":["../../../src/components/forms/FormikForm.stories.tsx"],"names":[],"mappings":"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"}
@@ -21,6 +21,6 @@ export function NumberStepperField(_a) {
21
21
  return (_jsxs(Field, { className: className, style: style, id: id, children: [label && _jsx(Field.Label, { children: label }), _jsx(Field.Control, { render: (composed) => (_jsxs(_Fragment, { children: [_jsx("input", Object.assign({ type: "hidden" }, props, composed)), _jsx(NumberStepper, Object.assign({ value: field.value, onChange: (v) => {
22
22
  tools.setValue(v);
23
23
  onChange === null || onChange === void 0 ? void 0 : onChange(v);
24
- } }, rest))] })) }), description && _jsx(Field.Description, { children: description })] }));
24
+ } }, rest))] })) }), description && _jsx(Field.Description, { children: description }), _jsx(Field.Error, { fieldName: name })] }));
25
25
  }
26
26
  //# sourceMappingURL=NumberStepperField.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NumberStepperField.js","sourceRoot":"","sources":["../../../src/components/forms/NumberStepperField.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EACN,aAAa,GAEb,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAgBnC,MAAM,UAAU,kBAAkB,CAAC,EAST;QATS,EAClC,IAAI,EACJ,KAAK,EACL,SAAS,EACT,KAAK,EACL,EAAE,EAAE,UAAU,EACd,QAAQ,EACR,WAAW,OAEc,EADtB,IAAI,cAR2B,wEASlC,CADO;IAEP,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACxC,OAAO,CACN,MAAC,KAAK,IAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,aAC/C,KAAK,IAAI,KAAC,KAAK,CAAC,KAAK,cAAE,KAAK,GAAe,EAC5C,KAAC,KAAK,CAAC,OAAO,IACb,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CACrB,8BACC,8BAAO,IAAI,EAAC,QAAQ,IAAK,KAAK,EAAM,QAAQ,EAAI,EAChD,KAAC,aAAa,kBACb,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gCACf,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gCAClB,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,CAAC,CAAC,CAAC;4BACf,CAAC,IACG,IAAI,EACP,IACA,CACH,GACA,EACD,WAAW,IAAI,KAAC,KAAK,CAAC,WAAW,cAAE,WAAW,GAAqB,IAC7D,CACR,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"NumberStepperField.js","sourceRoot":"","sources":["../../../src/components/forms/NumberStepperField.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EACN,aAAa,GAEb,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAgBnC,MAAM,UAAU,kBAAkB,CAAC,EAST;QATS,EAClC,IAAI,EACJ,KAAK,EACL,SAAS,EACT,KAAK,EACL,EAAE,EAAE,UAAU,EACd,QAAQ,EACR,WAAW,OAEc,EADtB,IAAI,cAR2B,wEASlC,CADO;IAEP,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACxC,OAAO,CACN,MAAC,KAAK,IAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,aAC/C,KAAK,IAAI,KAAC,KAAK,CAAC,KAAK,cAAE,KAAK,GAAe,EAC5C,KAAC,KAAK,CAAC,OAAO,IACb,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CACrB,8BACC,8BAAO,IAAI,EAAC,QAAQ,IAAK,KAAK,EAAM,QAAQ,EAAI,EAChD,KAAC,aAAa,kBACb,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gCACf,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gCAClB,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,CAAC,CAAC,CAAC;4BACf,CAAC,IACG,IAAI,EACP,IACA,CACH,GACA,EACD,WAAW,IAAI,KAAC,KAAK,CAAC,WAAW,cAAE,WAAW,GAAqB,EACpE,KAAC,KAAK,CAAC,KAAK,IAAC,SAAS,EAAE,IAAI,GAAI,IACzB,CACR,CAAC;AACH,CAAC"}
@@ -20,6 +20,6 @@ export function SwitchField(_a) {
20
20
  const id = useIdOrGenerated(providedId);
21
21
  return (_jsxs(Field, { horizontal: true, className: className, id: id, children: [_jsx(Field.Control, { render: _jsx(Switch, Object.assign({}, props, { checked: props.checked, onCheckedChange: (v) => {
22
22
  tools.setValue(!!v);
23
- } }, rest)) }), label && _jsx(Field.Label, { children: label }), description && _jsx(Field.Description, { children: description })] }));
23
+ } }, rest)) }), label && _jsx(Field.Label, { children: label }), description && _jsx(Field.Description, { children: description }), _jsx(Field.Error, { fieldName: name })] }));
24
24
  }
25
25
  //# sourceMappingURL=SwitchField.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchField.js","sourceRoot":"","sources":["../../../src/components/forms/SwitchField.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAWnC,MAAM,UAAU,WAAW,CAAC,EAQT;QARS,EAC3B,IAAI,EACJ,KAAK,EACL,SAAS,EACT,QAAQ,EACR,EAAE,EAAE,UAAU,EACd,WAAW,OAEO,EADf,IAAI,cAPoB,+DAQ3B,CADO;IAEP,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IACzE,MAAM,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACxC,OAAO,CACN,MAAC,KAAK,IAAC,UAAU,QAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,aAC7C,KAAC,KAAK,CAAC,OAAO,IACb,MAAM,EACL,KAAC,MAAM,oBACF,KAAK,IACT,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE;wBACtB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrB,CAAC,IACG,IAAI,EACP,GAEF,EACD,KAAK,IAAI,KAAC,KAAK,CAAC,KAAK,cAAE,KAAK,GAAe,EAC3C,WAAW,IAAI,KAAC,KAAK,CAAC,WAAW,cAAE,WAAW,GAAqB,IAC7D,CACR,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"SwitchField.js","sourceRoot":"","sources":["../../../src/components/forms/SwitchField.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAWnC,MAAM,UAAU,WAAW,CAAC,EAQT;QARS,EAC3B,IAAI,EACJ,KAAK,EACL,SAAS,EACT,QAAQ,EACR,EAAE,EAAE,UAAU,EACd,WAAW,OAEO,EADf,IAAI,cAPoB,+DAQ3B,CADO;IAEP,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IACzE,MAAM,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACxC,OAAO,CACN,MAAC,KAAK,IAAC,UAAU,QAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,aAC7C,KAAC,KAAK,CAAC,OAAO,IACb,MAAM,EACL,KAAC,MAAM,oBACF,KAAK,IACT,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE;wBACtB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrB,CAAC,IACG,IAAI,EACP,GAEF,EACD,KAAK,IAAI,KAAC,KAAK,CAAC,KAAK,cAAE,KAAK,GAAe,EAC3C,WAAW,IAAI,KAAC,KAAK,CAAC,WAAW,cAAE,WAAW,GAAqB,EACpE,KAAC,KAAK,CAAC,KAAK,IAAC,SAAS,EAAE,IAAI,GAAI,IACzB,CACR,CAAC;AACH,CAAC"}
@@ -22,7 +22,7 @@ import cls from './TextField.module.css';
22
22
  const emptyRef = (() => { });
23
23
  export const TextField = function TextField(_a) {
24
24
  var { ref, name, label, className, style, autoFocusDelay, autoFocus, inputRef, onChange, onFocus, onBlur, id: providedId, inputClassName, description } = _a, rest = __rest(_a, ["ref", "name", "label", "className", "style", "autoFocusDelay", "autoFocus", "inputRef", "onChange", "onFocus", "onBlur", "id", "inputClassName", "description"]);
25
- const [props] = useField({
25
+ const [props, meta] = useField({
26
26
  name,
27
27
  onChange,
28
28
  onFocus,
@@ -38,11 +38,12 @@ export const TextField = function TextField(_a) {
38
38
  }, autoFocusDelay);
39
39
  }
40
40
  }, [autoFocusDelay]);
41
- return (_jsxs(Field, { className: className, style: style, stretch: true, ref: ref, id: id, children: [label && _jsx(Field.Label, { children: label }), _jsx(Field.Control, { render: _jsx(Input, Object.assign({}, props, rest, { autoFocus: autoFocus, className: clsx(cls.input, inputClassName), ref: useMergedRef(innerInputRef, inputRef || emptyRef) })) }), description && _jsx(Field.Description, { children: description })] }));
41
+ const showError = meta.touched && !!meta.error && meta.error.length > 0;
42
+ return (_jsxs(Field, { className: clsx(showError && '@mode-attention', className), style: style, stretch: true, ref: ref, id: id, children: [label && _jsx(Field.Label, { children: label }), _jsx(Field.Control, { render: _jsx(Input, Object.assign({}, props, rest, { autoFocus: autoFocus, className: clsx(cls.input, inputClassName), ref: useMergedRef(innerInputRef, inputRef || emptyRef), "aria-invalid": showError })) }), description && _jsx(Field.Description, { children: description }), _jsx(Field.Error, { fieldName: name })] }));
42
43
  };
43
44
  export function TextAreaField(_a) {
44
45
  var { name, label, className, style, inputRef, onKeyDown, submitOnEnter, id: providedId, textAreaClassName, description, ref } = _a, rest = __rest(_a, ["name", "label", "className", "style", "inputRef", "onKeyDown", "submitOnEnter", "id", "textAreaClassName", "description", "ref"]);
45
- const [props] = useField(name);
46
+ const [props, meta] = useField(name);
46
47
  const { submitForm } = useFormikContext();
47
48
  const onKeyDownInner = useCallback((e) => {
48
49
  if (submitOnEnter && e.key === 'Enter' && !e.shiftKey) {
@@ -52,6 +53,6 @@ export function TextAreaField(_a) {
52
53
  onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(e);
53
54
  }, [submitOnEnter, onKeyDown, submitForm]);
54
55
  const id = useIdOrGenerated(providedId);
55
- return (_jsxs(Field, { stretch: true, className: className, style: style, ref: ref, id: id, children: [label && _jsx(Field.Label, { children: label }), _jsx(Field.Control, { render: _jsx(TextArea, Object.assign({ ref: inputRef }, props, rest, { className: clsx(cls.input, textAreaClassName), onKeyDown: onKeyDownInner })) }), description && _jsx(Field.Description, { children: description })] }));
56
+ return (_jsxs(Field, { stretch: true, className: clsx(meta.error && '@mode-attention', className), style: style, ref: ref, id: id, children: [label && _jsx(Field.Label, { children: label }), _jsx(Field.Control, { render: _jsx(TextArea, Object.assign({ ref: inputRef }, props, rest, { className: clsx(cls.input, textAreaClassName), onKeyDown: onKeyDownInner })) }), description && _jsx(Field.Description, { children: description }), _jsx(Field.Error, { fieldName: name })] }));
56
57
  }
57
58
  //# sourceMappingURL=TextField.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextField.js","sourceRoot":"","sources":["../../../src/components/forms/TextField.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TextField.js","sourceRoot":"","sources":["../../../src/components/forms/TextField.tsx"],"names":[],"mappings":"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"}
@@ -25,7 +25,7 @@ function ToggleGroupFieldDefault(_a) {
25
25
  else {
26
26
  tools.setValue(v[0]);
27
27
  }
28
- }, multiple: multiple || type === 'multiple' }, props)) }), description && _jsx(Field.Description, { children: description })] }));
28
+ }, multiple: multiple || type === 'multiple' }, props)) }), description && _jsx(Field.Description, { children: description }), _jsx(Field.Error, { fieldName: name })] }));
29
29
  }
30
30
  export const ToggleGroupField = Object.assign(ToggleGroupFieldDefault, {
31
31
  Item: ToggleGroup.Item,
@@ -1 +1 @@
1
- {"version":3,"file":"ToggleGroupField.js","sourceRoot":"","sources":["../../../src/components/forms/ToggleGroupField.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAoB,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAgBnC,SAAS,uBAAuB,CAAC,EAWD;QAXC,EAChC,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,SAAS,EACT,KAAK,EACL,IAAI,GAAG,QAAQ,EACf,QAAQ,EACR,WAAW,EACX,EAAE,EAAE,UAAU,OAEiB,EAD5B,KAAK,cAVwB,4FAWhC,CADQ;IAER,MAAM,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,QAAQ,iBAAG,IAAI,EAAE,QAAQ,IAAK,KAAK,EAAG,CAAC;IAEtE,OAAO,CACN,MAAC,KAAK,IAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAY,aACrE,KAAK,IAAI,KAAC,KAAK,CAAC,KAAK,IAAC,MAAM,EAAE,kBAAU,YAAG,KAAK,GAAe,EAChE,KAAC,KAAK,CAAC,OAAO,IACb,MAAM,EACL,KAAC,WAAW,oBACP,UAAU,IACd,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE;wBACpB,IAAI,QAAQ,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;4BACrC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;wBACnB,CAAC;6BAAM,CAAC;4BACP,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACtB,CAAC;oBACF,CAAC,EACD,QAAQ,EAAE,QAAQ,IAAI,IAAI,KAAK,UAAU,IACrC,KAAK,EACR,GAEF,EACD,WAAW,IAAI,KAAC,KAAK,CAAC,WAAW,cAAE,WAAW,GAAqB,IAC7D,CACR,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE;IACtE,IAAI,EAAE,WAAW,CAAC,IAAI;CACtB,CAAC,CAAC"}
1
+ {"version":3,"file":"ToggleGroupField.js","sourceRoot":"","sources":["../../../src/components/forms/ToggleGroupField.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAoB,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAgBnC,SAAS,uBAAuB,CAAC,EAWD;QAXC,EAChC,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,SAAS,EACT,KAAK,EACL,IAAI,GAAG,QAAQ,EACf,QAAQ,EACR,WAAW,EACX,EAAE,EAAE,UAAU,OAEiB,EAD5B,KAAK,cAVwB,4FAWhC,CADQ;IAER,MAAM,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,QAAQ,iBAAG,IAAI,EAAE,QAAQ,IAAK,KAAK,EAAG,CAAC;IAEtE,OAAO,CACN,MAAC,KAAK,IAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAY,aACrE,KAAK,IAAI,KAAC,KAAK,CAAC,KAAK,IAAC,MAAM,EAAE,kBAAU,YAAG,KAAK,GAAe,EAChE,KAAC,KAAK,CAAC,OAAO,IACb,MAAM,EACL,KAAC,WAAW,oBACP,UAAU,IACd,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE;wBACpB,IAAI,QAAQ,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;4BACrC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;wBACnB,CAAC;6BAAM,CAAC;4BACP,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACtB,CAAC;oBACF,CAAC,EACD,QAAQ,EAAE,QAAQ,IAAI,IAAI,KAAK,UAAU,IACrC,KAAK,EACR,GAEF,EACD,WAAW,IAAI,KAAC,KAAK,CAAC,WAAW,cAAE,WAAW,GAAqB,EACpE,KAAC,KAAK,CAAC,KAAK,IAAC,SAAS,EAAE,IAAI,GAAI,IACzB,CACR,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE;IACtE,IAAI,EAAE,WAAW,CAAC,IAAI;CACtB,CAAC,CAAC"}
@@ -57,6 +57,16 @@
57
57
  line-height: var(--m-prose-secondary-lineHeight);
58
58
  font-weight: var(--m-prose-secondary-weight);
59
59
 
60
+ &:has(input:invalid:not(:focus)),
61
+ &:has(textarea:invalid:not(:focus)),
62
+ &:has([contenteditable]:invalid:not(:focus)),
63
+ &:has(input[aria-invalid='true']:not(:focus)),
64
+ &:has(textarea[aria-invalid='true']:not(:focus)),
65
+ &:has([contenteditable][aria-invalid='true']:not(:focus)) {
66
+ @apply --mx-borderColor(var(--m-color-attention-heavy));
67
+ @apply --mx-bg(var(--m-color-attention-wash));
68
+ }
69
+
60
70
  &:has(input:disabled),
61
71
  &:has(textarea:disabled),
62
72
  &:has([contenteditable]:disabled) {
@@ -27,7 +27,6 @@ function changeThemeColor(color) {
27
27
  document.head.appendChild(metaThemeColor);
28
28
  }
29
29
  metaThemeColor === null || metaThemeColor === void 0 ? void 0 : metaThemeColor.setAttribute('content', color);
30
- console.log('set title bar color', color);
31
30
  }
32
31
  export function useTitleBarColor(color) {
33
32
  const colorMode = useResolvedColorMode();
@@ -1 +1 @@
1
- {"version":3,"file":"useTitleBarColor.js","sourceRoot":"","sources":["../../src/hooks/useTitleBarColor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useTitleBarColor.js","sourceRoot":"","sources":["../../src/hooks/useTitleBarColor.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,IAAI,YAAY,GAAG,SAAS,CAAC;AAC7B,SAAS,eAAe;;IACvB,OAAO,MAAA,QAAQ;SACb,aAAa,CAAC,wBAAwB,CAAC,0CACtC,YAAY,CAAC,SAAS,CAAC,CAAC;AAC5B,CAAC;AACD,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;IACrC,YAAY,GAAG,MAAA,eAAe,EAAE,mCAAI,YAAY,CAAC;AAClD,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACtC,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;QACrC,OAAO;IACR,CAAC;IACD,gCAAgC;IAChC,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC;QACtC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC;IACtE,IAAI,CAAC,cAAc,EAAE,CAAC;QACrB,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAChD,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACnD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC;IACD,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC/B,KAA+C;IAE/C,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;IACzC,SAAS,CAAC,GAAG,EAAE;;QACd,MAAM,UAAU,GACf,OAAO,KAAK,KAAK,QAAQ;YACxB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,SAAS,KAAK,MAAM;gBACtB,CAAC,CAAC,KAAK,CAAC,IAAI;gBACZ,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QAChB,MAAM,aAAa,GAClB,MAAA,MAAA,QAAQ;aACN,aAAa,CAAC,wBAAwB,CAAC,0CACtC,YAAY,CAAC,SAAS,CAAC,mCAAI,YAAY,CAAC;QAC5C,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACX,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,mBAAmB;IAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;IACzE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAAkB,EAAE,IAAc;IACnE,MAAM,EAAE,QAAQ,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAC3C,2EAA2E;IAC3E,0EAA0E;IAC1E,0EAA0E;IAC1E,yCAAyC;IACzC,MAAM,OAAO,GAAG,oBAAoB,CACnC,CAAC,aAAa,EAAE,EAAE;QACjB,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC;QAC7D,OAAO,GAAG,EAAE;YACX,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC;QACjE,CAAC,CAAC;IACH,CAAC,EACD,GAAG,EAAE,CAAC,QAAQ,CAAC,eAAe,KAAK,SAAS,EAC5C,GAAG,EAAE,CAAC,IAAI,CACV,CAAC;IAEF,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IAEpC,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,IAAI;YAAE,OAAO;QACjB,MAAM,aAAa,GAAG,eAAe,EAAE,CAAC;QAExC,KAAK,UAAU,MAAM;YACpB,IAAI,CAAC;gBACJ,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;gBACxE,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE;oBACnD,YAAY,EAAE,OAAO;iBACrB,CAAC,CAAC;gBACH,IAAI,KAAK,EAAE,CAAC;oBACX,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;gBACzC,CAAC;YACF,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAC;YACrD,CAAC;QACF,CAAC;QACD,MAAM,EAAE,CAAC;QAET,IAAI,aAAa,EAAE,CAAC;YACnB,OAAO,GAAG,EAAE;gBACX,QAAQ,CAAC,aAAa,CAAC,CAAC;YACzB,CAAC,CAAC;QACH,CAAC;IACF,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAkB,EAAE,IAAY;IACzD,IAAI,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,CAAC;IACF,CAAC;IACD,OAAO,UAAU,CAAC;AACnB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a-type/ui",
3
- "version": "6.1.42",
3
+ "version": "6.1.43",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "url": "https://github.com/a-type/ui"
@@ -42,6 +42,7 @@ export function CheckboxField({
42
42
  />
43
43
  {label && <Field.Label>{label}</Field.Label>}
44
44
  {description && <Field.Description>{description}</Field.Description>}
45
+ <Field.Error fieldName={name} />
45
46
  </Field>
46
47
  );
47
48
  }
@@ -69,6 +69,7 @@ export function EmojiField({
69
69
  </Popover>
70
70
  {label && <Field.Label>{label}</Field.Label>}
71
71
  {description && <Field.Description>{description}</Field.Description>}
72
+ <Field.Error fieldName={name} />
72
73
  </Field>
73
74
  );
74
75
  }
@@ -1,6 +1,6 @@
1
1
  .root {
2
2
  display: grid;
3
- grid-template-areas: 'label' 'control' 'description';
3
+ grid-template-areas: 'label' 'control' 'description' 'error';
4
4
  justify-content: start;
5
5
  border: none;
6
6
  padding: 0;
@@ -9,10 +9,10 @@
9
9
  &[data-horizontal] {
10
10
  flex-direction: row;
11
11
  align-items: center;
12
- grid-template-areas: 'control label' 'description description';
12
+ grid-template-areas: 'control label' 'description description' 'error error';
13
13
  grid-template-columns: auto 1fr;
14
14
  &[data-reverse] {
15
- grid-template-areas: 'label control' 'description description';
15
+ grid-template-areas: 'label control' 'description description' 'error error';
16
16
  grid-template-columns: auto 1fr;
17
17
  }
18
18
  }
@@ -61,3 +61,10 @@
61
61
  margin-top: var(--m-sp-sm);
62
62
  margin-left: calc(var(--m-global-shape-roundness) * var(--m-sp-md));
63
63
  }
64
+
65
+ .error {
66
+ grid-area: error;
67
+ font-style: italic;
68
+ margin-top: var(--m-sp-sm);
69
+ margin-left: calc(var(--m-global-shape-roundness) * var(--m-sp-md));
70
+ }
@@ -11,6 +11,7 @@ import {
11
11
  import useMergedRef from '../../hooks/useMergedRef.js';
12
12
  import { SlotDiv, SlotDivProps } from '../utility/SlotDiv.js';
13
13
  import cls from './Field.module.css';
14
+ import { FormError, FormErrorProps } from './FormError.js';
14
15
 
15
16
  export interface FieldRootProps extends SlotDivProps {
16
17
  horizontal?: boolean;
@@ -80,6 +81,26 @@ function FieldControl({
80
81
  };
81
82
  }, [events, id]);
82
83
 
84
+ useEffect(() => {
85
+ if (!id) return;
86
+
87
+ function onErrorVisible(event: CustomEvent) {
88
+ if (event.detail === true) {
89
+ innerRef.current?.setAttribute('aria-errormessage', `${id}-error`);
90
+ } else {
91
+ innerRef.current?.removeAttribute('aria-errormessage');
92
+ }
93
+ }
94
+
95
+ events.addEventListener('error-visible', onErrorVisible as EventListener);
96
+ return () => {
97
+ events.removeEventListener(
98
+ 'error-visible',
99
+ onErrorVisible as EventListener,
100
+ );
101
+ };
102
+ }, [events, id]);
103
+
83
104
  return (
84
105
  <SlotDiv
85
106
  className={clsx(cls.control, className)}
@@ -140,8 +161,29 @@ function FieldDescription({
140
161
  });
141
162
  }
142
163
 
164
+ function FieldError({ className, ...props }: FormErrorProps) {
165
+ const { id, events } = useContext(FieldContext);
166
+
167
+ useEffect(() => {
168
+ events.dispatchEvent(new CustomEvent('error-visible', { detail: true }));
169
+ return () => {
170
+ events.dispatchEvent(new CustomEvent('error-visible', { detail: false }));
171
+ };
172
+ }, [events]);
173
+
174
+ return (
175
+ <FormError
176
+ className={clsx(cls.error, className)}
177
+ id={id ? `${id}-error` : undefined}
178
+ inputId={id}
179
+ {...props}
180
+ />
181
+ );
182
+ }
183
+
143
184
  export const Field = Object.assign(FieldRoot, {
144
185
  Label: FieldLabel,
145
186
  Description: FieldDescription,
146
187
  Control: FieldControl,
188
+ Error: FieldError,
147
189
  });
@@ -0,0 +1,127 @@
1
+ import { FormikErrors, useFormikContext } from 'formik';
2
+ import { useEffect, useState } from 'react';
3
+ import { Text, TypographyProps } from '../typography/typography.js';
4
+
5
+ export interface FormErrorProps extends TypographyProps {
6
+ /**
7
+ * Filter to a single field
8
+ */
9
+ fieldName?: string;
10
+ /**
11
+ * When to show an error, paired with fieldName.
12
+ */
13
+ condition?: 'touched' | 'always' | 'dirty';
14
+ /**
15
+ * Connect to an HTML input to also display native
16
+ * HTML validation errors.
17
+ */
18
+ inputId?: string;
19
+ }
20
+
21
+ export function FormError({
22
+ fieldName,
23
+ condition = 'touched',
24
+ inputId,
25
+ ...rest
26
+ }: FormErrorProps) {
27
+ const { errors, touched, dirty } = useFormikContext<any>();
28
+ const nativeError = useNativeError(inputId);
29
+
30
+ if (condition === 'dirty' && !dirty) {
31
+ return null;
32
+ }
33
+
34
+ if (fieldName) {
35
+ const error = nativeError || errors[fieldName];
36
+ if (error) {
37
+ if (condition === 'touched' && !touched[fieldName]) {
38
+ return null;
39
+ }
40
+ return (
41
+ <Text emphasis="ambient" color="attention" {...rest}>
42
+ <FormErrorFormatted error={error} />
43
+ </Text>
44
+ );
45
+ }
46
+ return null;
47
+ }
48
+
49
+ const errorMessages = Object.values(errors)
50
+ .flat()
51
+ .filter((e): e is string | FormikErrors<any> => !!e)
52
+ .concat(nativeError ? [nativeError] : []);
53
+
54
+ if (errorMessages.length === 0) {
55
+ return null;
56
+ }
57
+
58
+ return (
59
+ <Text emphasis="ambient" color="attention" {...rest}>
60
+ <FormErrorFormatted error={errorMessages} />
61
+ </Text>
62
+ );
63
+ }
64
+
65
+ function FormErrorFormatted({
66
+ error,
67
+ }: {
68
+ error?:
69
+ | string
70
+ | FormikErrors<any>
71
+ | string[]
72
+ | FormikErrors<any>[]
73
+ | (string | FormikErrors<any>)[];
74
+ }) {
75
+ if (typeof error === 'string') {
76
+ return <span>{error}</span>;
77
+ } else if (Array.isArray(error)) {
78
+ return (
79
+ <span>
80
+ {error.map((err, index) => (
81
+ <FormErrorFormatted key={index} error={err} />
82
+ ))}
83
+ </span>
84
+ );
85
+ } else if (typeof error === 'object' && error !== null) {
86
+ return (
87
+ <span>
88
+ {Object.entries(error).map(([, err], index) => (
89
+ <span key={index}>
90
+ <FormErrorFormatted error={err} />
91
+ {index < Object.entries(error).length - 1 ? ', ' : ''}
92
+ </span>
93
+ ))}
94
+ </span>
95
+ );
96
+ }
97
+ return null;
98
+ }
99
+
100
+ function useNativeError(inputId?: string) {
101
+ const [nativeError, setNativeError] = useState<string | null>(null);
102
+
103
+ useEffect(() => {
104
+ if (!inputId) return;
105
+
106
+ const input = document.getElementById(inputId) as HTMLInputElement | null;
107
+ if (!input) {
108
+ return;
109
+ }
110
+
111
+ function handleInput() {
112
+ if (input?.validity.valid) {
113
+ setNativeError(null);
114
+ } else {
115
+ setNativeError(input?.validationMessage ?? 'Validation error');
116
+ }
117
+ }
118
+
119
+ input.addEventListener('input', handleInput);
120
+
121
+ return () => {
122
+ input.removeEventListener('input', handleInput);
123
+ };
124
+ }, [inputId]);
125
+
126
+ return nativeError;
127
+ }
@@ -39,6 +39,11 @@ export const Default: Story = {
39
39
  plan: 'basic',
40
40
  emoji: '',
41
41
  }}
42
+ validate={(values) => {
43
+ if (!values.email.endsWith('.com')) {
44
+ return { email: 'Email must end with .com' };
45
+ }
46
+ }}
42
47
  {...args}
43
48
  >
44
49
  <TextField
@@ -51,6 +56,7 @@ export const Default: Story = {
51
56
  name="password"
52
57
  type="password"
53
58
  label="Password"
59
+ minLength={8}
54
60
  description="Make it a good one"
55
61
  />
56
62
  <NumberStepperField
@@ -52,6 +52,7 @@ export function NumberStepperField({
52
52
  )}
53
53
  />
54
54
  {description && <Field.Description>{description}</Field.Description>}
55
+ <Field.Error fieldName={name} />
55
56
  </Field>
56
57
  );
57
58
  }
@@ -40,6 +40,7 @@ export function SwitchField({
40
40
  />
41
41
  {label && <Field.Label>{label}</Field.Label>}
42
42
  {description && <Field.Description>{description}</Field.Description>}
43
+ <Field.Error fieldName={name} />
43
44
  </Field>
44
45
  );
45
46
  }
@@ -46,7 +46,7 @@ export const TextField = function TextField({
46
46
  description,
47
47
  ...rest
48
48
  }: TextFieldProps) {
49
- const [props] = useField({
49
+ const [props, meta] = useField({
50
50
  name,
51
51
  onChange,
52
52
  onFocus,
@@ -63,8 +63,16 @@ export const TextField = function TextField({
63
63
  }
64
64
  }, [autoFocusDelay]);
65
65
 
66
+ const showError = meta.touched && !!meta.error && meta.error.length > 0;
67
+
66
68
  return (
67
- <Field className={className} style={style} stretch ref={ref} id={id}>
69
+ <Field
70
+ className={clsx(showError && '@mode-attention', className)}
71
+ style={style}
72
+ stretch
73
+ ref={ref}
74
+ id={id}
75
+ >
68
76
  {label && <Field.Label>{label}</Field.Label>}
69
77
  <Field.Control
70
78
  render={
@@ -74,10 +82,12 @@ export const TextField = function TextField({
74
82
  autoFocus={autoFocus}
75
83
  className={clsx(cls.input, inputClassName)}
76
84
  ref={useMergedRef(innerInputRef, inputRef || emptyRef)}
85
+ aria-invalid={showError}
77
86
  />
78
87
  }
79
88
  />
80
89
  {description && <Field.Description>{description}</Field.Description>}
90
+ <Field.Error fieldName={name} />
81
91
  </Field>
82
92
  );
83
93
  };
@@ -110,7 +120,7 @@ export function TextAreaField({
110
120
  ref,
111
121
  ...rest
112
122
  }: TextAreaFieldProps) {
113
- const [props] = useField(name);
123
+ const [props, meta] = useField(name);
114
124
  const { submitForm } = useFormikContext();
115
125
  const onKeyDownInner = useCallback(
116
126
  (e: KeyboardEvent<HTMLInputElement>) => {
@@ -125,7 +135,13 @@ export function TextAreaField({
125
135
  const id = useIdOrGenerated(providedId);
126
136
 
127
137
  return (
128
- <Field stretch className={className} style={style} ref={ref} id={id}>
138
+ <Field
139
+ stretch
140
+ className={clsx(meta.error && '@mode-attention', className)}
141
+ style={style}
142
+ ref={ref}
143
+ id={id}
144
+ >
129
145
  {label && <Field.Label>{label}</Field.Label>}
130
146
  <Field.Control
131
147
  render={
@@ -139,6 +155,7 @@ export function TextAreaField({
139
155
  }
140
156
  />
141
157
  {description && <Field.Description>{description}</Field.Description>}
158
+ <Field.Error fieldName={name} />
142
159
  </Field>
143
160
  );
144
161
  }
@@ -53,6 +53,7 @@ function ToggleGroupFieldDefault({
53
53
  }
54
54
  />
55
55
  {description && <Field.Description>{description}</Field.Description>}
56
+ <Field.Error fieldName={name} />
56
57
  </Field>
57
58
  );
58
59
  }
@@ -57,6 +57,16 @@
57
57
  line-height: var(--m-prose-secondary-lineHeight);
58
58
  font-weight: var(--m-prose-secondary-weight);
59
59
 
60
+ &:has(input:invalid:not(:focus)),
61
+ &:has(textarea:invalid:not(:focus)),
62
+ &:has([contenteditable]:invalid:not(:focus)),
63
+ &:has(input[aria-invalid='true']:not(:focus)),
64
+ &:has(textarea[aria-invalid='true']:not(:focus)),
65
+ &:has([contenteditable][aria-invalid='true']:not(:focus)) {
66
+ @apply --mx-borderColor(var(--m-color-attention-heavy));
67
+ @apply --mx-bg(var(--m-color-attention-wash));
68
+ }
69
+
60
70
  &:has(input:disabled),
61
71
  &:has(textarea:disabled),
62
72
  &:has([contenteditable]:disabled) {
@@ -28,7 +28,6 @@ function changeThemeColor(color: string) {
28
28
  document.head.appendChild(metaThemeColor);
29
29
  }
30
30
  metaThemeColor?.setAttribute('content', color);
31
- console.log('set title bar color', color);
32
31
  }
33
32
 
34
33
  export function useTitleBarColor(