@postenbring/hedwig-react 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/dist/accordion/accordion-content.d.ts.map +1 -1
  2. package/dist/accordion/accordion-content.js +0 -1
  3. package/dist/accordion/accordion-content.js.map +1 -1
  4. package/dist/accordion/accordion-content.mjs +1 -1
  5. package/dist/accordion/accordion.js +0 -1
  6. package/dist/accordion/accordion.js.map +1 -1
  7. package/dist/accordion/accordion.mjs +2 -2
  8. package/dist/accordion/index.js +0 -1
  9. package/dist/accordion/index.js.map +1 -1
  10. package/dist/accordion/index.mjs +2 -2
  11. package/dist/{chunk-JZXZYEPG.mjs → chunk-5FWY7FIX.mjs} +1 -2
  12. package/dist/chunk-5FWY7FIX.mjs.map +1 -0
  13. package/dist/{chunk-ROQH67YP.mjs → chunk-6DWIJEHQ.mjs} +2 -2
  14. package/dist/{chunk-6BXKRPR3.mjs → chunk-AXEAIXG7.mjs} +2 -2
  15. package/dist/{chunk-QRGGURVO.mjs → chunk-BO3EWZGA.mjs} +6 -4
  16. package/dist/chunk-BO3EWZGA.mjs.map +1 -0
  17. package/dist/{chunk-TWUAXAMR.mjs → chunk-BYFBK3J7.mjs} +1 -1
  18. package/dist/chunk-BYFBK3J7.mjs.map +1 -0
  19. package/dist/chunk-CKAL5ZJZ.mjs +45 -0
  20. package/dist/chunk-CKAL5ZJZ.mjs.map +1 -0
  21. package/dist/{chunk-CXX4SXJG.mjs → chunk-CKG2XRMX.mjs} +2 -2
  22. package/dist/{chunk-YS7HBWOI.mjs → chunk-E6OOFTRQ.mjs} +2 -2
  23. package/dist/{chunk-6SVLMQUW.mjs → chunk-FUIKSOJF.mjs} +4 -4
  24. package/dist/{chunk-WUPLEZEY.mjs → chunk-GVO57ZWU.mjs} +2 -2
  25. package/dist/{chunk-UL2V2Z5B.mjs → chunk-HEDGKRGC.mjs} +3 -3
  26. package/dist/chunk-IJSEJZ3W.mjs +1 -0
  27. package/dist/{chunk-S3QSGJX2.mjs → chunk-ITLZQ47H.mjs} +2 -2
  28. package/dist/{chunk-NIYDN3Y3.mjs → chunk-JEAGKB4V.mjs} +2 -2
  29. package/dist/chunk-KPPLVGZ3.mjs +1 -0
  30. package/dist/chunk-KPPLVGZ3.mjs.map +1 -0
  31. package/dist/{chunk-CC5QWW52.mjs → chunk-LHIG6RW7.mjs} +2 -2
  32. package/dist/chunk-LHIG6RW7.mjs.map +1 -0
  33. package/dist/{chunk-YQMTDQSQ.mjs → chunk-TC5PD4TA.mjs} +4 -4
  34. package/dist/chunk-VU2GCAM4.mjs +81 -0
  35. package/dist/chunk-VU2GCAM4.mjs.map +1 -0
  36. package/dist/{chunk-5UGT7L7R.mjs → chunk-XZ43OSZ5.mjs} +5 -3
  37. package/dist/chunk-XZ43OSZ5.mjs.map +1 -0
  38. package/dist/{chunk-JQGB77SS.mjs → chunk-Z2ZPTZ6F.mjs} +5 -3
  39. package/dist/chunk-Z2ZPTZ6F.mjs.map +1 -0
  40. package/dist/footer/footer.js +0 -1
  41. package/dist/footer/footer.js.map +1 -1
  42. package/dist/footer/footer.mjs +3 -3
  43. package/dist/footer/index.js +0 -1
  44. package/dist/footer/index.js.map +1 -1
  45. package/dist/footer/index.mjs +3 -3
  46. package/dist/form/checkbox/checkbox.d.ts +2 -0
  47. package/dist/form/checkbox/checkbox.d.ts.map +1 -1
  48. package/dist/form/checkbox/checkbox.js +7 -3
  49. package/dist/form/checkbox/checkbox.js.map +1 -1
  50. package/dist/form/checkbox/checkbox.mjs +3 -3
  51. package/dist/form/checkbox/index.js +7 -3
  52. package/dist/form/checkbox/index.js.map +1 -1
  53. package/dist/form/checkbox/index.mjs +3 -3
  54. package/dist/form/date-picker/date-picker.js +4 -2
  55. package/dist/form/date-picker/date-picker.js.map +1 -1
  56. package/dist/form/date-picker/date-picker.mjs +3 -3
  57. package/dist/form/date-picker/index.js +4 -2
  58. package/dist/form/date-picker/index.js.map +1 -1
  59. package/dist/form/date-picker/index.mjs +3 -3
  60. package/dist/form/error-message/error-message.js +1 -1
  61. package/dist/form/error-message/error-message.js.map +1 -1
  62. package/dist/form/error-message/error-message.mjs +1 -1
  63. package/dist/form/error-message/index.js +1 -1
  64. package/dist/form/error-message/index.js.map +1 -1
  65. package/dist/form/error-message/index.mjs +1 -1
  66. package/dist/form/error-summary/error-summary.d.ts +65 -0
  67. package/dist/form/error-summary/error-summary.d.ts.map +1 -0
  68. package/dist/form/error-summary/error-summary.js +379 -0
  69. package/dist/form/error-summary/error-summary.js.map +1 -0
  70. package/dist/form/error-summary/error-summary.mjs +26 -0
  71. package/dist/form/error-summary/error-summary.mjs.map +1 -0
  72. package/dist/form/error-summary/focus.d.ts +9 -0
  73. package/dist/form/error-summary/focus.d.ts.map +1 -0
  74. package/dist/form/error-summary/focus.js +69 -0
  75. package/dist/form/error-summary/focus.js.map +1 -0
  76. package/dist/form/error-summary/focus.mjs +8 -0
  77. package/dist/form/error-summary/focus.mjs.map +1 -0
  78. package/dist/form/error-summary/index.d.ts +3 -0
  79. package/dist/form/error-summary/index.d.ts.map +1 -0
  80. package/dist/form/error-summary/index.js +375 -0
  81. package/dist/form/error-summary/index.js.map +1 -0
  82. package/dist/form/error-summary/index.mjs +21 -0
  83. package/dist/form/error-summary/index.mjs.map +1 -0
  84. package/dist/form/fieldset/fieldset.d.ts +2 -0
  85. package/dist/form/fieldset/fieldset.d.ts.map +1 -1
  86. package/dist/form/fieldset/fieldset.js +4 -2
  87. package/dist/form/fieldset/fieldset.js.map +1 -1
  88. package/dist/form/fieldset/fieldset.mjs +2 -2
  89. package/dist/form/fieldset/index.js +4 -2
  90. package/dist/form/fieldset/index.js.map +1 -1
  91. package/dist/form/fieldset/index.mjs +2 -2
  92. package/dist/form/index.d.ts +1 -0
  93. package/dist/form/index.d.ts.map +1 -1
  94. package/dist/form/index.js +333 -39
  95. package/dist/form/index.js.map +1 -1
  96. package/dist/form/index.mjs +30 -14
  97. package/dist/form/input/index.js +4 -2
  98. package/dist/form/input/index.js.map +1 -1
  99. package/dist/form/input/index.mjs +3 -3
  100. package/dist/form/input/input.js +4 -2
  101. package/dist/form/input/input.js.map +1 -1
  102. package/dist/form/input/input.mjs +3 -3
  103. package/dist/form/input-group/index.js +4 -2
  104. package/dist/form/input-group/index.js.map +1 -1
  105. package/dist/form/input-group/index.mjs +2 -2
  106. package/dist/form/input-group/input-group.d.ts +2 -0
  107. package/dist/form/input-group/input-group.d.ts.map +1 -1
  108. package/dist/form/input-group/input-group.js +4 -2
  109. package/dist/form/input-group/input-group.js.map +1 -1
  110. package/dist/form/input-group/input-group.mjs +2 -2
  111. package/dist/form/radio-button/index.js +4 -2
  112. package/dist/form/radio-button/index.js.map +1 -1
  113. package/dist/form/radio-button/index.mjs +4 -4
  114. package/dist/form/radio-button/radio-button.js +4 -2
  115. package/dist/form/radio-button/radio-button.js.map +1 -1
  116. package/dist/form/radio-button/radio-button.mjs +4 -4
  117. package/dist/form/radio-button/radio-group.js +4 -2
  118. package/dist/form/radio-button/radio-group.js.map +1 -1
  119. package/dist/form/radio-button/radio-group.mjs +3 -3
  120. package/dist/form/select/index.js +4 -2
  121. package/dist/form/select/index.js.map +1 -1
  122. package/dist/form/select/index.mjs +3 -3
  123. package/dist/form/select/select.js +4 -2
  124. package/dist/form/select/select.js.map +1 -1
  125. package/dist/form/select/select.mjs +3 -3
  126. package/dist/form/textarea/index.js +4 -2
  127. package/dist/form/textarea/index.js.map +1 -1
  128. package/dist/form/textarea/index.mjs +3 -3
  129. package/dist/form/textarea/textarea.js +4 -2
  130. package/dist/form/textarea/textarea.js.map +1 -1
  131. package/dist/form/textarea/textarea.mjs +3 -3
  132. package/dist/index.js +573 -474
  133. package/dist/index.js.map +1 -1
  134. package/dist/index.mjs +54 -48
  135. package/dist/layout/grid/grid.mjs +2 -2
  136. package/dist/layout/grid/index.mjs +2 -2
  137. package/dist/layout/index.mjs +6 -6
  138. package/dist/layout/stack/index.mjs +2 -2
  139. package/dist/layout/stack/stack.mjs +2 -2
  140. package/dist/message/index.js.map +1 -1
  141. package/dist/message/index.mjs +1 -1
  142. package/dist/message/message.d.ts +2 -2
  143. package/dist/message/message.d.ts.map +1 -1
  144. package/dist/message/message.js.map +1 -1
  145. package/dist/message/message.mjs +1 -1
  146. package/package.json +5 -5
  147. package/src/accordion/accordion-content.tsx +0 -1
  148. package/src/form/checkbox/checkbox.tsx +6 -2
  149. package/src/form/error-message/error-message.tsx +1 -1
  150. package/src/form/error-summary/error-summary.stories.tsx +29 -0
  151. package/src/form/error-summary/error-summary.tsx +151 -0
  152. package/src/form/error-summary/focus.ts +66 -0
  153. package/src/form/error-summary/index.tsx +2 -0
  154. package/src/form/fieldset/fieldset.tsx +6 -2
  155. package/src/form/index.tsx +1 -0
  156. package/src/form/input-group/input-group.tsx +6 -2
  157. package/src/message/message.tsx +2 -2
  158. package/dist/chunk-5UGT7L7R.mjs.map +0 -1
  159. package/dist/chunk-CC5QWW52.mjs.map +0 -1
  160. package/dist/chunk-JQGB77SS.mjs.map +0 -1
  161. package/dist/chunk-JZXZYEPG.mjs.map +0 -1
  162. package/dist/chunk-QRGGURVO.mjs.map +0 -1
  163. package/dist/chunk-TWUAXAMR.mjs.map +0 -1
  164. package/dist/chunk-XFKD6EEJ.mjs +0 -1
  165. /package/dist/{chunk-ROQH67YP.mjs.map → chunk-6DWIJEHQ.mjs.map} +0 -0
  166. /package/dist/{chunk-6BXKRPR3.mjs.map → chunk-AXEAIXG7.mjs.map} +0 -0
  167. /package/dist/{chunk-CXX4SXJG.mjs.map → chunk-CKG2XRMX.mjs.map} +0 -0
  168. /package/dist/{chunk-YS7HBWOI.mjs.map → chunk-E6OOFTRQ.mjs.map} +0 -0
  169. /package/dist/{chunk-6SVLMQUW.mjs.map → chunk-FUIKSOJF.mjs.map} +0 -0
  170. /package/dist/{chunk-WUPLEZEY.mjs.map → chunk-GVO57ZWU.mjs.map} +0 -0
  171. /package/dist/{chunk-UL2V2Z5B.mjs.map → chunk-HEDGKRGC.mjs.map} +0 -0
  172. /package/dist/{chunk-XFKD6EEJ.mjs.map → chunk-IJSEJZ3W.mjs.map} +0 -0
  173. /package/dist/{chunk-S3QSGJX2.mjs.map → chunk-ITLZQ47H.mjs.map} +0 -0
  174. /package/dist/{chunk-NIYDN3Y3.mjs.map → chunk-JEAGKB4V.mjs.map} +0 -0
  175. /package/dist/{chunk-YQMTDQSQ.mjs.map → chunk-TC5PD4TA.mjs.map} +0 -0
@@ -0,0 +1,151 @@
1
+ import { forwardRef, useEffect, useRef } from "react";
2
+ import { Message, type MessageProps, type MessageTitleProps } from "../../message";
3
+ import { UnorderedList, type ListProps } from "../../list";
4
+ import { Link } from "../../link";
5
+ import { useMergeRefs } from "../../utils";
6
+ import { focusWithLegendOrLabelInViewport } from "./focus";
7
+
8
+ interface ErrorSummaryHeadingPropsAutoFocus {
9
+ /**
10
+ * The heading will be focused when the component mounts
11
+ *
12
+ * On following errornous form submissions you should manually focus the heading
13
+ * e.g. by passing a ref and calling `ref.current.focus()`
14
+ *
15
+ * @default true
16
+ */
17
+ autoFocus?: boolean;
18
+ }
19
+
20
+ interface ErrorSummaryHeadingPropsAs {
21
+ /**
22
+ * A heading level must be selected, or optionally opting out for a different element
23
+ *
24
+ * Use {@link ErrorSummaryHeadingPropsAsChild.asChild} if you need more control of the rendered element.
25
+ */
26
+ as: "h2" | "h3" | "h4" | "h5" | "h6" | "span" | "div" | "label" | "p";
27
+ asChild?: never;
28
+ }
29
+
30
+ interface ErrorSummaryHeadingPropsAsChild {
31
+ /**
32
+ * Change the default rendered element for the one passed as a child, merging their props and behavior.
33
+ */
34
+ asChild: true;
35
+ as?: never;
36
+ }
37
+
38
+ export type ErrorSummaryHeadingProps = MessageTitleProps &
39
+ ErrorSummaryHeadingPropsAutoFocus &
40
+ (ErrorSummaryHeadingPropsAs | ErrorSummaryHeadingPropsAsChild);
41
+
42
+ export const ErrorSummaryHeading = forwardRef<
43
+ HTMLParagraphElement,
44
+ ErrorSummaryHeadingProps & (ErrorSummaryHeadingPropsAs | ErrorSummaryHeadingPropsAsChild)
45
+ >(({ children, as: Tag, autoFocus = true, ...rest }, ref) => {
46
+ const focusRef = useRef<HTMLElement>(null);
47
+ const mergedRef = useMergeRefs([focusRef, ref]);
48
+
49
+ useEffect(() => {
50
+ /**
51
+ * Hack: Safari 18 on mac at the time of writing
52
+ * does not correctly focus it with VoiceOver without the timeout
53
+ */
54
+ setTimeout(() => {
55
+ if (focusRef.current && autoFocus) {
56
+ focusRef.current.focus();
57
+ }
58
+ });
59
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- Only on initial render
60
+ }, []);
61
+
62
+ return (
63
+ <Message.Title ref={mergedRef} tabIndex={-1} asChild {...rest}>
64
+ {Tag ? <Tag>{children}</Tag> : children}
65
+ </Message.Title>
66
+ );
67
+ });
68
+ ErrorSummaryHeading.displayName = "ErrorSummary.Heading";
69
+
70
+ export interface ErrorSummaryListProps extends ListProps {
71
+ /**
72
+ * Sets the size of the items (font)
73
+ *
74
+ * @default "small"
75
+ */
76
+ size?: ListProps["size"];
77
+ }
78
+ export const ErrorSummaryList = forwardRef<HTMLUListElement, ErrorSummaryListProps>(
79
+ ({ children, style: _style, size = "small", ...rest }, ref) => {
80
+ const style = {
81
+ // Match the link `solid` style, which black underline
82
+ "--_hds-list-marker-color": "var(--hds-ui-colors-black)",
83
+ ..._style,
84
+ };
85
+ return (
86
+ <Message.Description asChild>
87
+ <UnorderedList size={size} ref={ref} style={style} {...rest}>
88
+ {children}
89
+ </UnorderedList>
90
+ </Message.Description>
91
+ );
92
+ },
93
+ );
94
+ ErrorSummaryList.displayName = "ErrorSummary.List";
95
+
96
+ export interface ErrorSummaryItemProps extends React.HTMLAttributes<HTMLLIElement> {
97
+ /**
98
+ * A hash link to the element that the error message refers to
99
+ *
100
+ * Must start with "#" as it's passed to the `href` attribute of an anchor element
101
+ *
102
+ * @example "#email"
103
+ */
104
+ href: `#${string}`;
105
+
106
+ /**
107
+ * Extra props to pass to the link element
108
+ */
109
+ linkProps?: React.AnchorHTMLAttributes<HTMLAnchorElement>;
110
+ }
111
+ export const ErrorSummaryItem = forwardRef<HTMLLIElement, ErrorSummaryItemProps>(
112
+ ({ children, href, linkProps, ...rest }, ref) => {
113
+ function onClick(e: React.MouseEvent<HTMLAnchorElement>) {
114
+ linkProps?.onClick?.(e);
115
+ if (focusWithLegendOrLabelInViewport(href.replace("#", ""))) {
116
+ e.preventDefault();
117
+ }
118
+ }
119
+
120
+ return (
121
+ <li ref={ref} {...rest}>
122
+ <Link size="small" href={href} variant="solid" {...linkProps} onClick={onClick}>
123
+ {children}
124
+ </Link>
125
+ </li>
126
+ );
127
+ },
128
+ );
129
+ ErrorSummaryItem.displayName = "ErrorSummary.Item";
130
+
131
+ export type ErrorSummaryProps = Omit<MessageProps, "variant" | "icon" | "iconClassName">;
132
+
133
+ export const ErrorSummary = forwardRef<HTMLDivElement, ErrorSummaryProps>(
134
+ ({ children, ...rest }, ref) => {
135
+ return (
136
+ <Message variant="warning" ref={ref} {...rest}>
137
+ {children}
138
+ </Message>
139
+ );
140
+ },
141
+ ) as ErrorSummaryType;
142
+ ErrorSummary.displayName = "ErrorSummary";
143
+
144
+ type ErrorSummaryType = ReturnType<typeof forwardRef<HTMLDivElement, ErrorSummaryProps>> & {
145
+ Heading: typeof ErrorSummaryHeading;
146
+ List: typeof ErrorSummaryList;
147
+ Item: typeof ErrorSummaryItem;
148
+ };
149
+ ErrorSummary.Heading = ErrorSummaryHeading;
150
+ ErrorSummary.List = ErrorSummaryList;
151
+ ErrorSummary.Item = ErrorSummaryItem;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Focus a form field while showing the associated legend or label in the viewport.
3
+ *
4
+ * Gives the user a better context of what field they are focusing on.
5
+ *
6
+ * Copied from https://github.com/alphagov/govuk-frontend/blob/cbf4ef1e329711be5b78a92bda6ba84a7db9ca40/packages/govuk-frontend/src/govuk/components/error-summary/error-summary.mjs#L60-L108
7
+ */
8
+ export function focusWithLegendOrLabelInViewport(id: string) {
9
+ const input = document.getElementById(id);
10
+ if (!input) {
11
+ return false;
12
+ }
13
+
14
+ const legendOrLabel = maybeLegendForInput(input) ?? labelForInput(input);
15
+ if (!legendOrLabel) {
16
+ return false;
17
+ }
18
+
19
+ legendOrLabel.scrollIntoView();
20
+ input.focus({ preventScroll: true });
21
+
22
+ return true;
23
+ }
24
+
25
+ function maybeLegendForInput(input: HTMLElement) {
26
+ const fieldset = input.closest("fieldset");
27
+ if (!fieldset) {
28
+ return null;
29
+ }
30
+
31
+ const legend = fieldset.querySelector("legend");
32
+ if (!legend) {
33
+ return null;
34
+ }
35
+
36
+ // If the input type is radio or checkbox, always use the legend if
37
+ // there is one.
38
+ if (input instanceof HTMLInputElement && (input.type === "checkbox" || input.type === "radio")) {
39
+ return legend;
40
+ }
41
+
42
+ // For other input types, only scroll to the fieldset’s legend (instead
43
+ // of the label associated with the input) if the input would end up in
44
+ // the top half of the screen.
45
+ //
46
+ // This should avoid situations where the input either ends up off the
47
+ // screen, or obscured by a software keyboard.
48
+ const legendTop = legend.getBoundingClientRect().top;
49
+ const inputRect = input.getBoundingClientRect();
50
+
51
+ // If the browser doesn't support Element.getBoundingClientRect().height
52
+ // or window.innerHeight (like IE8), bail and just link to the label.
53
+ if (inputRect.height && window.innerHeight) {
54
+ const inputBottom = inputRect.top + inputRect.height;
55
+
56
+ if (inputBottom - legendTop < window.innerHeight / 2) {
57
+ return legend;
58
+ }
59
+ }
60
+ }
61
+
62
+ function labelForInput(input: HTMLElement) {
63
+ return (
64
+ document.querySelector(`label[for='${input.getAttribute("id")}']`) ?? input.closest("label")
65
+ );
66
+ }
@@ -0,0 +1,2 @@
1
+ export { ErrorSummary } from "./error-summary";
2
+ export type * from "./error-summary";
@@ -1,7 +1,7 @@
1
1
  import { useId, forwardRef, createContext, useContext } from "react";
2
2
  import type { FieldsetHTMLAttributes, HTMLAttributes, ReactNode, CSSProperties } from "react";
3
3
  import { clsx } from "@postenbring/hedwig-css/typed-classname";
4
- import { ErrorMessage } from "../error-message";
4
+ import { ErrorMessage, type ErrorMessageProps } from "../error-message";
5
5
 
6
6
  export interface FieldsetProps extends FieldsetHTMLAttributes<HTMLFieldSetElement> {
7
7
  className?: string;
@@ -16,6 +16,7 @@ export interface FieldsetProps extends FieldsetHTMLAttributes<HTMLFieldSetElemen
16
16
  legendProps?: HTMLAttributes<HTMLElement> & { size: "default" | "large" };
17
17
  legend: ReactNode;
18
18
  children: ReactNode;
19
+ errorMessageProps?: Partial<ErrorMessageProps>;
19
20
  }
20
21
 
21
22
  const FieldsetContext = createContext<{ hasError: boolean }>({ hasError: false });
@@ -27,6 +28,7 @@ export const Fieldset = forwardRef<HTMLFieldSetElement, FieldsetProps>(function
27
28
  className,
28
29
  style,
29
30
  errorMessage,
31
+ errorMessageProps,
30
32
  legendProps: { size: legendSize = "default", className: legendClassName, ...legendProps } = {},
31
33
  legend,
32
34
  children,
@@ -58,7 +60,9 @@ export const Fieldset = forwardRef<HTMLFieldSetElement, FieldsetProps>(function
58
60
  <FieldsetContext.Provider value={{ hasError: Boolean(errorMessage) }}>
59
61
  {children}
60
62
  </FieldsetContext.Provider>
61
- <ErrorMessage id={errorMessageId}>{errorMessage}</ErrorMessage>
63
+ <ErrorMessage id={errorMessageId} {...errorMessageProps}>
64
+ {errorMessage}
65
+ </ErrorMessage>
62
66
  </fieldset>
63
67
  );
64
68
  });
@@ -1,6 +1,7 @@
1
1
  export * from "./checkbox";
2
2
  export * from "./date-picker";
3
3
  export * from "./error-message";
4
+ export * from "./error-summary";
4
5
  export * from "./fieldset";
5
6
  export * from "./input";
6
7
  export * from "./radio-button";
@@ -1,7 +1,7 @@
1
1
  import { useId, forwardRef, Children, isValidElement, cloneElement } from "react";
2
2
  import type { LabelHTMLAttributes, ReactNode, CSSProperties } from "react";
3
3
  import { clsx } from "@postenbring/hedwig-css/typed-classname";
4
- import { ErrorMessage } from "../error-message";
4
+ import { ErrorMessage, type ErrorMessageProps } from "../error-message";
5
5
 
6
6
  interface InputProps {
7
7
  "aria-describedby"?: string;
@@ -16,6 +16,7 @@ export interface InputGroupProps {
16
16
  style?: CSSProperties;
17
17
  variant?: "default" | "white";
18
18
  errorMessage?: ReactNode;
19
+ errorMessageProps?: Partial<ErrorMessageProps>;
19
20
  labelProps?: LabelHTMLAttributes<HTMLLabelElement>;
20
21
  label: ReactNode;
21
22
  disabled?: boolean;
@@ -35,6 +36,7 @@ export const InputGroup = forwardRef<HTMLDivElement, InputGroupProps>(function I
35
36
  style,
36
37
  variant = "default",
37
38
  errorMessage,
39
+ errorMessageProps,
38
40
  labelProps: { className: labelClassName, ...labelProps } = {},
39
41
  label,
40
42
  disabled,
@@ -100,7 +102,9 @@ export const InputGroup = forwardRef<HTMLDivElement, InputGroupProps>(function I
100
102
  >
101
103
  {renderInput()}
102
104
  </div>
103
- <ErrorMessage id={errorMessageId}>{errorMessage}</ErrorMessage>
105
+ <ErrorMessage id={errorMessageId} {...errorMessageProps}>
106
+ {errorMessage}
107
+ </ErrorMessage>
104
108
  </div>
105
109
  );
106
110
  });
@@ -3,7 +3,7 @@ import { clsx } from "@postenbring/hedwig-css/typed-classname";
3
3
  import { Slot } from "@radix-ui/react-slot";
4
4
  import { Box, type BoxProps } from "../box/box";
5
5
 
6
- interface MessageTitleProps extends React.HTMLAttributes<HTMLParagraphElement> {
6
+ export interface MessageTitleProps extends React.HTMLAttributes<HTMLParagraphElement> {
7
7
  /**
8
8
  * Change the default rendered element for the one passed as a child, merging their props and behavior.
9
9
  *
@@ -25,7 +25,7 @@ export const MessageTitle = forwardRef<HTMLParagraphElement, MessageTitleProps>(
25
25
  );
26
26
  MessageTitle.displayName = "Message.Title";
27
27
 
28
- interface MessageDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {
28
+ export interface MessageDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {
29
29
  /**
30
30
  * Change the default rendered element for the one passed as a child, merging their props and behavior.
31
31
  *
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/form/input-group/input-group.tsx"],"sourcesContent":["import { useId, forwardRef, Children, isValidElement, cloneElement } from \"react\";\nimport type { LabelHTMLAttributes, ReactNode, CSSProperties } from \"react\";\nimport { clsx } from \"@postenbring/hedwig-css/typed-classname\";\nimport { ErrorMessage } from \"../error-message\";\n\ninterface InputProps {\n \"aria-describedby\"?: string;\n \"aria-invalid\"?: boolean;\n id?: string;\n className?: string;\n}\n\nexport interface InputGroupProps {\n id?: string;\n className?: string;\n style?: CSSProperties;\n variant?: \"default\" | \"white\";\n errorMessage?: ReactNode;\n labelProps?: LabelHTMLAttributes<HTMLLabelElement>;\n label: ReactNode;\n disabled?: boolean;\n readOnly?: boolean;\n /**\n * `children` must be either a single input element or a render function.\n *\n * If you use a render function, make sure you spread the input props to the appropriate element.\n */\n children: Exclude<ReactNode, Iterable<ReactNode>> | ((inputProps: InputProps) => ReactNode);\n}\n\nexport const InputGroup = forwardRef<HTMLDivElement, InputGroupProps>(function InputGroup(\n {\n id,\n className,\n style,\n variant = \"default\",\n errorMessage,\n labelProps: { className: labelClassName, ...labelProps } = {},\n label,\n disabled,\n readOnly,\n children,\n ...rest\n },\n ref,\n) {\n const errorMessageId = useId();\n const inputId = useId();\n\n const renderInput = () => {\n const inputProps: InputProps = {\n \"aria-describedby\": errorMessage ? errorMessageId : undefined,\n \"aria-invalid\": errorMessage ? true : undefined,\n id: id ?? inputId,\n className: clsx(\"hds-input-group__input\"),\n };\n\n if (typeof children === \"function\") {\n return children(inputProps);\n }\n\n const input: ReactNode = Children.toArray(children)[0];\n\n if (!isValidElement<InputProps>(input)) {\n return;\n }\n\n return cloneElement<InputProps>(input, {\n ...inputProps,\n ...input.props,\n className: `${inputProps.className} ${input.props.className ?? \"\"}`,\n });\n };\n\n return (\n <div\n className={clsx(\n \"hds-input-group\",\n {\n [`hds-input-group--${variant}`]: variant,\n \"hds-input-group--error\": errorMessage,\n },\n className as undefined,\n )}\n ref={ref}\n style={style}\n {...rest}\n >\n <label\n className={clsx(\"hds-input-group__label\", labelClassName as undefined)}\n {...labelProps}\n htmlFor={id ?? inputId}\n >\n {label}\n </label>\n <div\n className={clsx(\"hds-input-group__input-wrapper\")}\n data-disabled={disabled}\n data-readonly={readOnly}\n >\n {renderInput()}\n </div>\n <ErrorMessage id={errorMessageId}>{errorMessage}</ErrorMessage>\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;AAAA,SAAS,OAAO,YAAY,UAAU,gBAAgB,oBAAoB;AAE1E,SAAS,YAAY;AAyEjB,SAaE,KAbF;AA7CG,IAAM,aAAa,WAA4C,SAASA,YAC7E,IAaA,KACA;AAdA,eAMc;AAAA,IALZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,YAAY,KAA+C,CAAC;AAAA,EArChE,IA+BE,IAMc,SAAE,aAAW,eArC7B,IAqCgB,IAAgC,uBAAhC,IAAgC,CAA9B,eANhB,SAOE;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAzCJ,IA+BE,IAWK,iBAXL,IAWK;AAAA,IAVH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAKF,QAAM,iBAAiB,MAAM;AAC7B,QAAM,UAAU,MAAM;AAEtB,QAAM,cAAc,MAAM;AAjD5B,QAAAC;AAkDI,UAAM,aAAyB;AAAA,MAC7B,oBAAoB,eAAe,iBAAiB;AAAA,MACpD,gBAAgB,eAAe,OAAO;AAAA,MACtC,IAAI,kBAAM;AAAA,MACV,WAAW,KAAK,wBAAwB;AAAA,IAC1C;AAEA,QAAI,OAAO,aAAa,YAAY;AAClC,aAAO,SAAS,UAAU;AAAA,IAC5B;AAEA,UAAM,QAAmB,SAAS,QAAQ,QAAQ,EAAE,CAAC;AAErD,QAAI,CAAC,eAA2B,KAAK,GAAG;AACtC;AAAA,IACF;AAEA,WAAO,aAAyB,OAAO,gDAClC,aACA,MAAM,QAF4B;AAAA,MAGrC,WAAW,GAAG,WAAW,SAAS,KAAIA,MAAA,MAAM,MAAM,cAAZ,OAAAA,MAAyB,EAAE;AAAA,IACnE,EAAC;AAAA,EACH;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,UACE,CAAC,oBAAoB,OAAO,EAAE,GAAG;AAAA,UACjC,0BAA0B;AAAA,QAC5B;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,OACI,OAXL;AAAA,MAaC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,KAAK,0BAA0B,cAA2B;AAAA,aACjE,aAFL;AAAA,YAGC,SAAS,kBAAM;AAAA,YAEd;AAAA;AAAA,QACH;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,KAAK,gCAAgC;AAAA,YAChD,iBAAe;AAAA,YACf,iBAAe;AAAA,YAEd,sBAAY;AAAA;AAAA,QACf;AAAA,QACA,oBAAC,gBAAa,IAAI,gBAAiB,wBAAa;AAAA;AAAA;AAAA,EAClD;AAEJ,CAAC;","names":["InputGroup","_a"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/form/error-message/error-message.tsx"],"sourcesContent":["import { clsx } from \"@postenbring/hedwig-css/typed-classname\";\nimport { forwardRef, type ReactNode } from \"react\";\n\nexport interface ErrorMessageProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n id: string;\n className?: string;\n}\n\nexport const ErrorMessage = forwardRef<HTMLDivElement, ErrorMessageProps>(\n ({ children, id, className, ...rest }, ref) => {\n return (\n <div\n aria-live=\"assertive\"\n className={clsx(\"hds-error-message\", className as undefined)}\n id={id}\n ref={ref}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\nErrorMessage.displayName = \"ErrorMessage\";\n"],"mappings":";;;;;;;AAAA,SAAS,YAAY;AACrB,SAAS,kBAAkC;AAWrC;AAHC,IAAM,eAAe;AAAA,EAC1B,CAAC,IAAsC,QAAQ;AAA9C,iBAAE,YAAU,IAAI,UAVnB,IAUG,IAA8B,iBAA9B,IAA8B,CAA5B,YAAU,MAAI;AACf,WACE;AAAA,MAAC;AAAA;AAAA,QACC,aAAU;AAAA,QACV,WAAW,KAAK,qBAAqB,SAAsB;AAAA,QAC3D;AAAA,QACA;AAAA,SACI,OALL;AAAA,QAOE;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AACA,aAAa,cAAc;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/form/fieldset/fieldset.tsx"],"sourcesContent":["import { useId, forwardRef, createContext, useContext } from \"react\";\nimport type { FieldsetHTMLAttributes, HTMLAttributes, ReactNode, CSSProperties } from \"react\";\nimport { clsx } from \"@postenbring/hedwig-css/typed-classname\";\nimport { ErrorMessage } from \"../error-message\";\n\nexport interface FieldsetProps extends FieldsetHTMLAttributes<HTMLFieldSetElement> {\n className?: string;\n style?: CSSProperties;\n /**\n * Providing an errorMessage will also give contained Checkboxes or Radio buttons\n * error styling and aria to indicate invalid state.\n *\n * For Radio buttons you are even better off using RadioGroup.\n */\n errorMessage?: ReactNode;\n legendProps?: HTMLAttributes<HTMLElement> & { size: \"default\" | \"large\" };\n legend: ReactNode;\n children: ReactNode;\n}\n\nconst FieldsetContext = createContext<{ hasError: boolean }>({ hasError: false });\n\nexport const useFieldsetContext = () => useContext(FieldsetContext);\n\nexport const Fieldset = forwardRef<HTMLFieldSetElement, FieldsetProps>(function Fieldset(\n {\n className,\n style,\n errorMessage,\n legendProps: { size: legendSize = \"default\", className: legendClassName, ...legendProps } = {},\n legend,\n children,\n ...rest\n },\n ref,\n) {\n const errorMessageId = useId();\n\n return (\n <fieldset\n aria-describedby={errorMessage ? errorMessageId : undefined}\n aria-invalid={errorMessage ? true : undefined}\n className={clsx(\"hds-fieldset\", className as undefined)}\n ref={ref}\n style={style}\n {...rest}\n >\n <legend\n className={clsx(\n \"hds-fieldset__legend\",\n { [`hds-fieldset__legend--${legendSize}`]: legendSize },\n legendClassName as undefined,\n )}\n {...legendProps}\n >\n {legend}\n </legend>\n <FieldsetContext.Provider value={{ hasError: Boolean(errorMessage) }}>\n {children}\n </FieldsetContext.Provider>\n <ErrorMessage id={errorMessageId}>{errorMessage}</ErrorMessage>\n </fieldset>\n );\n});\n"],"mappings":";;;;;;;;;;AAAA,SAAS,OAAO,YAAY,eAAe,kBAAkB;AAE7D,SAAS,YAAY;AAqCjB,SAQE,KARF;AAnBJ,IAAM,kBAAkB,cAAqC,EAAE,UAAU,MAAM,CAAC;AAEzE,IAAM,qBAAqB,MAAM,WAAW,eAAe;AAE3D,IAAM,WAAW,WAA+C,SAASA,UAC9E,IASA,KACA;AAVA,eAIe;AAAA,IAHb;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,KAA+E,CAAC;AAAA,EA7BjG,IAyBE,IAIe,SAAE,QAAM,aAAa,WAAW,WAAW,gBA7B5D,IA6BiB,IAA+D,wBAA/D,IAA+D,CAA7D,QAA8B,eAJ/C,SAKE;AAAA;AAAA,IACA;AAAA,EA/BJ,IAyBE,IAOK,iBAPL,IAOK;AAAA,IANH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAKF,QAAM,iBAAiB,MAAM;AAE7B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,oBAAkB,eAAe,iBAAiB;AAAA,MAClD,gBAAc,eAAe,OAAO;AAAA,MACpC,WAAW,KAAK,gBAAgB,SAAsB;AAAA,MACtD;AAAA,MACA;AAAA,OACI,OANL;AAAA,MAQC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,EAAE,CAAC,yBAAyB,UAAU,EAAE,GAAG,WAAW;AAAA,cACtD;AAAA,YACF;AAAA,aACI,cANL;AAAA,YAQE;AAAA;AAAA,QACH;AAAA,QACA,oBAAC,gBAAgB,UAAhB,EAAyB,OAAO,EAAE,UAAU,QAAQ,YAAY,EAAE,GAChE,UACH;AAAA,QACA,oBAAC,gBAAa,IAAI,gBAAiB,wBAAa;AAAA;AAAA;AAAA,EAClD;AAEJ,CAAC;","names":["Fieldset"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/accordion/accordion-content.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { forwardRef, useContext } from \"react\";\nimport { clsx } from \"@postenbring/hedwig-css/typed-classname\";\nimport { AccordionItemContext } from \"./context\";\n\nexport interface AccordionContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nexport const AccordionContent = forwardRef<HTMLDivElement, AccordionContentProps>(\n ({ children, className, ...rest }, ref) => {\n const context = useContext(AccordionItemContext);\n if (context === null) {\n return null;\n }\n return (\n <div\n id={context.contentId}\n aria-hidden={!context.open}\n data-state={context.open ? \"open\" : \"closed\"}\n {...{ inert: context.open ? undefined : \"true\" }}\n className={clsx(\"hds-accordion-item-content\", className as undefined)}\n ref={ref}\n {...rest}\n >\n <div className={clsx(\"hds-accordion-item-content-inner\")}>{children}</div>\n </div>\n );\n },\n);\n\nAccordionContent.displayName = \"Accordion.Content\";\n"],"mappings":";;;;;;;;;;AACA,SAAS,YAAY,kBAAkB;AACvC,SAAS,YAAY;AAuBb;AAhBD,IAAM,mBAAmB;AAAA,EAC9B,CAAC,IAAkC,QAAQ;AAA1C,iBAAE,YAAU,UAVf,IAUG,IAA0B,iBAA1B,IAA0B,CAAxB,YAAU;AACX,UAAM,UAAU,WAAW,oBAAoB;AAC/C,QAAI,YAAY,MAAM;AACpB,aAAO;AAAA,IACT;AACA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,IAAI,QAAQ;AAAA,QACZ,eAAa,CAAC,QAAQ;AAAA,QACtB,cAAY,QAAQ,OAAO,SAAS;AAAA,SAChC,EAAE,OAAO,QAAQ,OAAO,SAAY,OAAO,IAJhD;AAAA,QAKC,WAAW,KAAK,8BAA8B,SAAsB;AAAA,QACpE;AAAA,UACI,OAPL;AAAA,QASC,8BAAC,SAAI,WAAW,KAAK,kCAAkC,GAAI,UAAS;AAAA;AAAA,IACtE;AAAA,EAEJ;AACF;AAEA,iBAAiB,cAAc;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/form/checkbox/checkbox.tsx"],"sourcesContent":["import { forwardRef, useId, type InputHTMLAttributes, type ReactNode } from \"react\";\nimport { clsx } from \"@postenbring/hedwig-css/typed-classname\";\nimport { ErrorMessage } from \"../error-message\";\nimport { useFieldsetContext } from \"../fieldset\";\n\nexport type CheckboxProps = Omit<InputHTMLAttributes<HTMLInputElement>, \"defaultValue\"> & {\n children: ReactNode;\n variant?: \"plain\" | \"bounding-box\";\n title?: string;\n} & (\n | {\n /**\n * Set to `true` to add error styling. The component will take care of aria to indicate invalid state.\n *\n * Normally you don't need this, as you should wrap your Checkboxes in the Fieldset component.\n * When providing an errorMessage to Fieldset, all contained Checkboxes will get correct hasError state.\n *\n * You can use this when your checkbox is part of a non-HDS fieldset which shows an error message.\n */\n hasError?: boolean;\n errorMessage?: never;\n }\n | {\n hasError?: never;\n /**\n * Set an error message to add error styling, and display the error message.\n * The component will take care of aria to connect the error message to the checkbox.\n *\n * Use this when your checkbox is standalone (not part of a fieldset).\n */\n errorMessage?: ReactNode;\n }\n );\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n variant = \"plain\",\n hasError: hasErrorProp,\n errorMessage,\n title,\n children,\n className,\n ...rest\n },\n ref,\n ) => {\n const errorMessageId = useId();\n const { hasError: hasFieldsetError } = useFieldsetContext();\n const hasError = !!errorMessage || hasFieldsetError || hasErrorProp;\n\n return (\n <div className={clsx(\"hds-checkbox-wrapper\")}>\n <div\n className={clsx(\n \"hds-checkbox\",\n {\n [`hds-checkbox--${variant}`]: variant === \"bounding-box\",\n \"hds-checkbox--error\": hasError,\n },\n className as undefined,\n )}\n >\n <label>\n <input\n {...rest}\n aria-invalid={hasError ? true : undefined}\n aria-describedby={errorMessage ? errorMessageId : undefined}\n ref={ref}\n type=\"checkbox\"\n />\n <span aria-hidden className=\"hds-checkbox__checkmark\" />\n {title ? <p className=\"hds-checkbox__title\">{title}</p> : children}\n </label>\n {title ? children : null}\n </div>\n <ErrorMessage id={errorMessageId}>{errorMessage}</ErrorMessage>\n </div>\n );\n },\n);\nCheckbox.displayName = \"Checkbox\";\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,YAAY,aAAuD;AAC5E,SAAS,YAAY;AA8DX,SACE,KADF;AA7BH,IAAM,WAAW;AAAA,EACtB,CACE,IASA,QACG;AAVH,iBACE;AAAA,gBAAU;AAAA,MACV,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IA1CN,IAoCI,IAOK,iBAPL,IAOK;AAAA,MANH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAKF,UAAM,iBAAiB,MAAM;AAC7B,UAAM,EAAE,UAAU,iBAAiB,IAAI,mBAAmB;AAC1D,UAAM,WAAW,CAAC,CAAC,gBAAgB,oBAAoB;AAEvD,WACE,qBAAC,SAAI,WAAW,KAAK,sBAAsB,GACzC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,cACE,CAAC,iBAAiB,OAAO,EAAE,GAAG,YAAY;AAAA,cAC1C,uBAAuB;AAAA,YACzB;AAAA,YACA;AAAA,UACF;AAAA,UAEA;AAAA,iCAAC,WACC;AAAA;AAAA,gBAAC;AAAA,iDACK,OADL;AAAA,kBAEC,gBAAc,WAAW,OAAO;AAAA,kBAChC,oBAAkB,eAAe,iBAAiB;AAAA,kBAClD;AAAA,kBACA,MAAK;AAAA;AAAA,cACP;AAAA,cACA,oBAAC,UAAK,eAAW,MAAC,WAAU,2BAA0B;AAAA,cACrD,QAAQ,oBAAC,OAAE,WAAU,uBAAuB,iBAAM,IAAO;AAAA,eAC5D;AAAA,YACC,QAAQ,WAAW;AAAA;AAAA;AAAA,MACtB;AAAA,MACA,oBAAC,gBAAa,IAAI,gBAAiB,wBAAa;AAAA,OAClD;AAAA,EAEJ;AACF;AACA,SAAS,cAAc;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/message/message.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport { clsx } from \"@postenbring/hedwig-css/typed-classname\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { Box, type BoxProps } from \"../box/box\";\n\ninterface MessageTitleProps extends React.HTMLAttributes<HTMLParagraphElement> {\n /**\n * Change the default rendered element for the one passed as a child, merging their props and behavior.\n *\n * @default false\n */\n asChild?: boolean;\n}\nexport const MessageTitle = forwardRef<HTMLParagraphElement, MessageTitleProps>(\n ({ asChild, className, ...rest }, ref) => {\n const Component = asChild ? Slot : \"div\";\n return (\n <Component\n className={clsx(\"hds-message__title\", className as undefined)}\n ref={ref}\n {...rest}\n />\n );\n },\n);\nMessageTitle.displayName = \"Message.Title\";\n\ninterface MessageDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {\n /**\n * Change the default rendered element for the one passed as a child, merging their props and behavior.\n *\n * @default false\n */\n asChild?: boolean;\n}\nexport const MessageDescription = forwardRef<HTMLParagraphElement, MessageDescriptionProps>(\n ({ asChild, className, ...rest }, ref) => {\n const Component = asChild ? Slot : \"div\";\n return (\n <Component\n className={clsx(\"hds-message__description\", className as undefined)}\n ref={ref}\n {...rest}\n />\n );\n },\n);\nMessageDescription.displayName = \"Message.Description\";\n\nexport type MessageProps = (\n | {\n variant?: \"success\" | \"attention\" | \"warning\" | \"info\";\n icon?: never;\n iconClassName?: never;\n }\n | {\n variant: \"neutral\";\n icon?: React.ReactNode;\n iconClassName?: string;\n }\n) &\n Omit<BoxProps, \"variant\" | \"asChild\">;\n\nexport const Message = forwardRef<HTMLDivElement, MessageProps>(\n ({ children, className, variant = \"success\", icon, iconClassName, ...rest }, ref) => {\n return (\n <Box\n className={clsx(`hds-message`, `hds-message--${variant}`, className as undefined)}\n ref={ref}\n {...rest}\n >\n {variant === \"neutral\" && (\n <div className={clsx(\"hds-message--neutral__icon\", iconClassName as undefined)}>\n {icon}\n </div>\n )}\n {children}\n </Box>\n );\n },\n) as MessageType;\nMessage.displayName = \"Message\";\n\ntype MessageType = ReturnType<typeof forwardRef<HTMLDivElement, MessageProps>> & {\n Title: typeof MessageTitle;\n Description: typeof MessageDescription;\n};\nMessage.Title = MessageTitle;\nMessage.Description = MessageDescription;\n"],"mappings":";;;;;;;;;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AACrB,SAAS,YAAY;AAef,cAiDA,YAjDA;AAJC,IAAM,eAAe;AAAA,EAC1B,CAAC,IAAiC,QAAQ;AAAzC,iBAAE,WAAS,UAdd,IAcG,IAAyB,iBAAzB,IAAyB,CAAvB,WAAS;AACV,UAAM,YAAY,UAAU,OAAO;AACnC,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,KAAK,sBAAsB,SAAsB;AAAA,QAC5D;AAAA,SACI;AAAA,IACN;AAAA,EAEJ;AACF;AACA,aAAa,cAAc;AAUpB,IAAM,qBAAqB;AAAA,EAChC,CAAC,IAAiC,QAAQ;AAAzC,iBAAE,WAAS,UApCd,IAoCG,IAAyB,iBAAzB,IAAyB,CAAvB,WAAS;AACV,UAAM,YAAY,UAAU,OAAO;AACnC,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,KAAK,4BAA4B,SAAsB;AAAA,QAClE;AAAA,SACI;AAAA,IACN;AAAA,EAEJ;AACF;AACA,mBAAmB,cAAc;AAgB1B,IAAM,UAAU;AAAA,EACrB,CAAC,IAA4E,QAAQ;AAApF,iBAAE,YAAU,WAAW,UAAU,WAAW,MAAM,cAhErD,IAgEG,IAAoE,iBAApE,IAAoE,CAAlE,YAAU,aAAW,WAAqB,QAAM;AACjD,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,KAAK,eAAe,gBAAgB,OAAO,IAAI,SAAsB;AAAA,QAChF;AAAA,SACI,OAHL;AAAA,QAKE;AAAA,sBAAY,aACX,oBAAC,SAAI,WAAW,KAAK,8BAA8B,aAA0B,GAC1E,gBACH;AAAA,UAED;AAAA;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AACA,QAAQ,cAAc;AAMtB,QAAQ,QAAQ;AAChB,QAAQ,cAAc;","names":[]}
@@ -1 +0,0 @@
1
- //# sourceMappingURL=chunk-XFKD6EEJ.mjs.map