@simplybusiness/mobius 10.3.0 → 10.3.2

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 (132) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/components/AddressLookup/AddressLookup.js +224 -198
  3. package/dist/cjs/components/AddressLookup/AddressLookup.js.map +3 -3
  4. package/dist/cjs/components/AddressLookup/index.js +224 -198
  5. package/dist/cjs/components/AddressLookup/index.js.map +3 -3
  6. package/dist/cjs/components/Alert/Alert.js +37 -11
  7. package/dist/cjs/components/Alert/Alert.js.map +3 -3
  8. package/dist/cjs/components/Alert/index.js +37 -11
  9. package/dist/cjs/components/Alert/index.js.map +3 -3
  10. package/dist/cjs/components/Checkbox/Checkbox.js +199 -173
  11. package/dist/cjs/components/Checkbox/Checkbox.js.map +3 -3
  12. package/dist/cjs/components/Checkbox/CheckboxGroup.js +199 -173
  13. package/dist/cjs/components/Checkbox/CheckboxGroup.js.map +3 -3
  14. package/dist/cjs/components/Checkbox/index.js +199 -173
  15. package/dist/cjs/components/Checkbox/index.js.map +3 -3
  16. package/dist/cjs/components/Combobox/Combobox.js +224 -198
  17. package/dist/cjs/components/Combobox/Combobox.js.map +3 -3
  18. package/dist/cjs/components/Combobox/index.js +224 -198
  19. package/dist/cjs/components/Combobox/index.js.map +3 -3
  20. package/dist/cjs/components/DateField/DateField.js +215 -189
  21. package/dist/cjs/components/DateField/DateField.js.map +3 -3
  22. package/dist/cjs/components/DateField/index.js +215 -189
  23. package/dist/cjs/components/DateField/index.js.map +3 -3
  24. package/dist/cjs/components/ErrorMessage/ErrorMessage.js +199 -173
  25. package/dist/cjs/components/ErrorMessage/ErrorMessage.js.map +3 -3
  26. package/dist/cjs/components/ErrorMessage/index.js +199 -173
  27. package/dist/cjs/components/ErrorMessage/index.js.map +3 -3
  28. package/dist/cjs/components/ExpandableText/ExpandableText.js +196 -170
  29. package/dist/cjs/components/ExpandableText/ExpandableText.js.map +3 -3
  30. package/dist/cjs/components/ExpandableText/index.js +196 -170
  31. package/dist/cjs/components/ExpandableText/index.js.map +3 -3
  32. package/dist/cjs/components/MaskedField/MaskedField.js +215 -189
  33. package/dist/cjs/components/MaskedField/MaskedField.js.map +3 -3
  34. package/dist/cjs/components/MaskedField/index.js +215 -189
  35. package/dist/cjs/components/MaskedField/index.js.map +3 -3
  36. package/dist/cjs/components/NumberField/NumberField.js +215 -189
  37. package/dist/cjs/components/NumberField/NumberField.js.map +3 -3
  38. package/dist/cjs/components/NumberField/index.js +215 -189
  39. package/dist/cjs/components/NumberField/index.js.map +3 -3
  40. package/dist/cjs/components/PasswordField/PasswordField.js +215 -189
  41. package/dist/cjs/components/PasswordField/PasswordField.js.map +3 -3
  42. package/dist/cjs/components/PasswordField/ShowHideButton.js +196 -170
  43. package/dist/cjs/components/PasswordField/ShowHideButton.js.map +3 -3
  44. package/dist/cjs/components/PasswordField/index.js +215 -189
  45. package/dist/cjs/components/PasswordField/index.js.map +3 -3
  46. package/dist/cjs/components/Radio/Radio.js +199 -173
  47. package/dist/cjs/components/Radio/Radio.js.map +3 -3
  48. package/dist/cjs/components/Radio/RadioGroup.js +199 -173
  49. package/dist/cjs/components/Radio/RadioGroup.js.map +3 -3
  50. package/dist/cjs/components/Radio/index.js +199 -173
  51. package/dist/cjs/components/Radio/index.js.map +3 -3
  52. package/dist/cjs/components/Select/Select.js +199 -173
  53. package/dist/cjs/components/Select/Select.js.map +3 -3
  54. package/dist/cjs/components/Select/index.js +199 -173
  55. package/dist/cjs/components/Select/index.js.map +3 -3
  56. package/dist/cjs/components/Text/Text.js +2 -1
  57. package/dist/cjs/components/Text/Text.js.map +2 -2
  58. package/dist/cjs/components/Text/index.js +2 -1
  59. package/dist/cjs/components/Text/index.js.map +2 -2
  60. package/dist/cjs/components/TextArea/TextArea.js +199 -173
  61. package/dist/cjs/components/TextArea/TextArea.js.map +3 -3
  62. package/dist/cjs/components/TextArea/index.js +199 -173
  63. package/dist/cjs/components/TextArea/index.js.map +3 -3
  64. package/dist/cjs/components/TextField/TextField.js +215 -189
  65. package/dist/cjs/components/TextField/TextField.js.map +3 -3
  66. package/dist/cjs/components/TextField/index.js +215 -189
  67. package/dist/cjs/components/TextField/index.js.map +3 -3
  68. package/dist/cjs/components/TextOrHTML/TextOrHTML.js +32 -6
  69. package/dist/cjs/components/TextOrHTML/TextOrHTML.js.map +3 -3
  70. package/dist/cjs/components/TextOrHTML/index.js +32 -6
  71. package/dist/cjs/components/TextOrHTML/index.js.map +3 -3
  72. package/dist/cjs/components/index.js +205 -178
  73. package/dist/cjs/components/index.js.map +3 -3
  74. package/dist/cjs/index.js +205 -178
  75. package/dist/cjs/index.js.map +3 -3
  76. package/dist/cjs/meta.json +299 -119
  77. package/dist/esm/{chunk-ZS5MFZHD.js → chunk-A66R42LG.js} +2 -1
  78. package/dist/esm/{chunk-ZS5MFZHD.js.map → chunk-A66R42LG.js.map} +2 -2
  79. package/dist/esm/chunk-DYTHXKMX.js +67 -0
  80. package/dist/esm/chunk-DYTHXKMX.js.map +7 -0
  81. package/dist/esm/{chunk-QWD72EVP.js → chunk-JNAQ76CR.js} +2 -2
  82. package/dist/esm/{chunk-I6EUIFUJ.js → chunk-W2RQH4WS.js} +2 -2
  83. package/dist/esm/components/AddressLookup/AddressLookup.js +4 -4
  84. package/dist/esm/components/AddressLookup/index.js +4 -4
  85. package/dist/esm/components/Alert/Alert.js +3 -3
  86. package/dist/esm/components/Alert/index.js +3 -3
  87. package/dist/esm/components/Checkbox/Checkbox.js +4 -4
  88. package/dist/esm/components/Checkbox/CheckboxGroup.js +4 -4
  89. package/dist/esm/components/Checkbox/index.js +4 -4
  90. package/dist/esm/components/Combobox/Combobox.js +4 -4
  91. package/dist/esm/components/Combobox/index.js +4 -4
  92. package/dist/esm/components/DateField/DateField.js +4 -4
  93. package/dist/esm/components/DateField/index.js +4 -4
  94. package/dist/esm/components/ErrorMessage/ErrorMessage.js +4 -4
  95. package/dist/esm/components/ErrorMessage/index.js +4 -4
  96. package/dist/esm/components/ExpandableText/ExpandableText.js +4 -4
  97. package/dist/esm/components/ExpandableText/index.js +4 -4
  98. package/dist/esm/components/MaskedField/MaskedField.js +4 -4
  99. package/dist/esm/components/MaskedField/index.js +4 -4
  100. package/dist/esm/components/NumberField/NumberField.js +4 -4
  101. package/dist/esm/components/NumberField/index.js +4 -4
  102. package/dist/esm/components/PasswordField/PasswordField.js +4 -4
  103. package/dist/esm/components/PasswordField/ShowHideButton.js +4 -4
  104. package/dist/esm/components/PasswordField/index.js +4 -4
  105. package/dist/esm/components/Radio/Radio.js +4 -4
  106. package/dist/esm/components/Radio/RadioGroup.js +4 -4
  107. package/dist/esm/components/Radio/index.js +4 -4
  108. package/dist/esm/components/Select/Select.js +4 -4
  109. package/dist/esm/components/Select/index.js +4 -4
  110. package/dist/esm/components/Text/Text.js +5 -3
  111. package/dist/esm/components/Text/index.js +5 -3
  112. package/dist/esm/components/TextArea/TextArea.js +4 -4
  113. package/dist/esm/components/TextArea/index.js +4 -4
  114. package/dist/esm/components/TextField/TextField.js +4 -4
  115. package/dist/esm/components/TextField/index.js +4 -4
  116. package/dist/esm/components/TextOrHTML/TextOrHTML.js +2 -2
  117. package/dist/esm/components/TextOrHTML/index.js +2 -2
  118. package/dist/esm/components/index.js +7 -5
  119. package/dist/esm/index.js +7 -5
  120. package/dist/esm/meta.json +176 -161
  121. package/dist/tsconfig.build.tsbuildinfo +1 -1
  122. package/dist/types/components/Text/Text.d.ts +1 -0
  123. package/package.json +1 -1
  124. package/src/components/Table/Table.test.tsx +2 -5
  125. package/src/components/Text/Text.test.tsx +3 -4
  126. package/src/components/Text/Text.tsx +1 -1
  127. package/src/components/TextOrHTML/TextOrHTML.test.tsx +54 -3
  128. package/src/components/TextOrHTML/TextOrHTML.tsx +46 -9
  129. package/dist/esm/chunk-VIDKIVA6.js +0 -40
  130. package/dist/esm/chunk-VIDKIVA6.js.map +0 -7
  131. /package/dist/esm/{chunk-QWD72EVP.js.map → chunk-JNAQ76CR.js.map} +0 -0
  132. /package/dist/esm/{chunk-I6EUIFUJ.js.map → chunk-W2RQH4WS.js.map} +0 -0
@@ -16,6 +16,7 @@ export interface TextProps extends DOMProps, RefAttributes<TextElementType> {
16
16
  children: ReactNode;
17
17
  style?: React.CSSProperties;
18
18
  }
19
+ export declare const getElementType: (variant: TextVariantType | undefined, elementType: ElementType | undefined) => ElementType;
19
20
  declare const Text: {
20
21
  ({ ref, elementType, ...props }: TextProps): import("react/jsx-runtime").JSX.Element;
21
22
  displayName: string;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@simplybusiness/mobius",
3
3
  "license": "UNLICENSED",
4
- "version": "10.3.0",
4
+ "version": "10.3.2",
5
5
  "description": "Core library of Mobius react components",
6
6
  "repository": {
7
7
  "type": "git",
@@ -231,10 +231,7 @@ describe("Test for Table", () => {
231
231
  expect(screen.getByTestId("header-cell").nodeName).toBe("TH");
232
232
  });
233
233
 
234
- // Note: HeaderCell does not set a `scope` attribute. This is a potential a11y
235
- // improvement — <th> elements should ideally have scope="col" or scope="row"
236
- // to associate headers with their data cells.
237
- it("HeaderCell does not apply a scope attribute", () => {
234
+ it("HeaderCell applies scope='col' by default", () => {
238
235
  render(
239
236
  <Table>
240
237
  <Table.Head>
@@ -246,7 +243,7 @@ describe("Test for Table", () => {
246
243
  </Table.Head>
247
244
  </Table>,
248
245
  );
249
- expect(screen.getByTestId("header-cell")).not.toHaveAttribute("scope");
246
+ expect(screen.getByTestId("header-cell")).toHaveAttribute("scope", "col");
250
247
  });
251
248
  });
252
249
 
@@ -111,11 +111,10 @@ describe("Text", () => {
111
111
  expect(container.firstChild?.nodeName).toBe("SPAN");
112
112
  });
113
113
 
114
- it("renders <p> when variant is set but no elementType is provided", () => {
115
- // The component defaults elementType to "p" and always renders using that prop,
116
- // variant only affects CSS classes -- not the rendered element
114
+ it("infers element type from variant when no elementType is provided", () => {
115
+ // h1-h4 variants render as their corresponding heading elements
117
116
  const { container } = render(<Text variant="h1">Heading text</Text>);
118
- expect(container.firstChild?.nodeName).toBe("P");
117
+ expect(container.firstChild?.nodeName).toBe("H1");
119
118
  });
120
119
  });
121
120
 
@@ -27,7 +27,7 @@ export interface TextProps extends DOMProps, RefAttributes<TextElementType> {
27
27
  style?: React.CSSProperties;
28
28
  }
29
29
 
30
- const getElementType = (
30
+ export const getElementType = (
31
31
  variant: TextVariantType | undefined,
32
32
  elementType: ElementType | undefined,
33
33
  ): ElementType => {
@@ -138,16 +138,67 @@ describe("TextOrHTML", () => {
138
138
  expect(div?.innerHTML).toBe("<strong>Bold text</strong>");
139
139
  });
140
140
 
141
- it("detects plain text and wraps in a Text component with a span", () => {
141
+ it("detects plain text and renders directly in a Text component without nested span", () => {
142
142
  render(
143
143
  <TextOrHTML text="Just plain text" autoDetect data-testid="test" />,
144
144
  );
145
145
  const element = screen.getByTestId("test");
146
146
  expect(element).toHaveClass("mobius");
147
147
  expect(element).toHaveClass(CLASS_NAME);
148
+ expect(element).toHaveTextContent("Just plain text");
148
149
  // eslint-disable-next-line testing-library/no-node-access
149
- const span = element.querySelector("span");
150
- expect(span?.innerHTML).toBe("Just plain text");
150
+ expect(element.querySelector("span")).toBeNull();
151
+ });
152
+
153
+ it("applies htmlClassName to the Text element for plain text", () => {
154
+ render(
155
+ <TextOrHTML
156
+ text="Please enter your full name"
157
+ htmlClassName="mobius-question__secondary-text"
158
+ autoDetect
159
+ data-testid="test"
160
+ />,
161
+ );
162
+ const element = screen.getByTestId("test");
163
+ expect(element).toHaveClass("mobius-question__secondary-text");
164
+ expect(element).toHaveClass("mobius");
165
+ expect(element).toHaveClass(CLASS_NAME);
166
+ // eslint-disable-next-line testing-library/no-node-access
167
+ expect(element.querySelector("span")).toBeNull();
168
+ });
169
+
170
+ it("renders inline HTML in non-block text with autoDetect", () => {
171
+ render(
172
+ <TextOrHTML
173
+ text="This is <strong>bold</strong> text"
174
+ autoDetect
175
+ data-testid="test"
176
+ />,
177
+ );
178
+ const element = screen.getByTestId("test");
179
+ expect(element).toHaveClass("mobius");
180
+ expect(element.nodeName).toBe("P");
181
+ // eslint-disable-next-line testing-library/no-node-access
182
+ expect(element.querySelector("strong")).toBeInTheDocument();
183
+ expect(element).toHaveTextContent("This is bold text");
184
+ });
185
+
186
+ it("decodes HTML entities in text that contains no HTML tags with autoDetect", () => {
187
+ const entities = [
188
+ { text: "before &amp; after", expected: "before & after" },
189
+ { text: "before &lt; after", expected: "before < after" },
190
+ { text: "before &gt; after", expected: "before > after" },
191
+ { text: "before &#39; after", expected: "before ' after" },
192
+ { text: "before &quot; after", expected: 'before " after' },
193
+ ];
194
+
195
+ for (const { text, expected } of entities) {
196
+ const { unmount } = render(
197
+ <TextOrHTML text={text} autoDetect data-testid="test" />,
198
+ );
199
+ expect(screen.getByTestId("test")).toHaveTextContent(expected);
200
+ unmount();
201
+ }
151
202
  });
152
203
 
153
204
  it("detects HTML with leading whitespace", () => {
@@ -1,11 +1,30 @@
1
+ import classNames from "classnames/dedupe";
1
2
  import type { RefAttributes } from "react";
2
3
  import { useMemo } from "react";
3
4
  import type { TextElementType, TextProps } from "../Text/Text";
4
- import { Text } from "../Text/Text";
5
+ import { Text, getElementType } from "../Text/Text";
5
6
 
6
7
  export type HTMLElementType = "span" | "div";
7
8
 
8
- const isHTML = (text: string) => /^\s*<[a-z]/i.test(text);
9
+ const isBlockHTML = (text: string) => /^\s*<[a-z]/i.test(text);
10
+ const containsHTML = (text: string) =>
11
+ /<[a-z/]/i.test(text) || /&(?:#\d+|#x[\da-f]+|[a-z]\w*);/i.test(text); // tag or entity
12
+
13
+ const buildTextClasses = (
14
+ textProps: Omit<TextProps, "children">,
15
+ htmlClassName?: string,
16
+ ) => {
17
+ const { variant, elementType, spacing, className } = textProps;
18
+ const variantType = variant || getElementType(variant, elementType);
19
+ return classNames(
20
+ "mobius",
21
+ "mobius-text",
22
+ { [`--is-${variantType}`]: variantType },
23
+ { [`--has-line-height-${spacing}`]: spacing },
24
+ className,
25
+ htmlClassName,
26
+ );
27
+ };
9
28
 
10
29
  export interface TextOrHTMLProps
11
30
  extends Omit<TextProps, "children">, RefAttributes<TextElementType> {
@@ -30,17 +49,35 @@ const TextOrHTML = ({
30
49
  autoDetect = false,
31
50
  ...textProps
32
51
  }: TextOrHTMLProps) => {
33
- const textIsHTML = autoDetect && isHTML(text);
34
- const shouldWrapInText = autoDetect
35
- ? textWrapper || !textIsHTML
36
- : textWrapper;
37
- const resolvedElementType = htmlElementType ?? (textIsHTML ? "div" : "span");
38
- const DangerousComponent = resolvedElementType;
52
+ const textIsBlockHTML = autoDetect && isBlockHTML(text);
39
53
 
40
54
  // Memoize the dangerouslySetInnerHTML object to prevent unnecessary re-renders
41
55
  // See: https://github.com/facebook/react/issues/31660
42
56
  const dangerousHTML = useMemo(() => ({ __html: text }), [text]);
43
57
 
58
+ // Non-block text with autoDetect: render directly on a Text-equivalent element,
59
+ // avoiding unnecessary <span> nesting inside <p>.
60
+ if (autoDetect && !textIsBlockHTML) {
61
+ const { variant, spacing, elementType, className, ...domProps } = textProps;
62
+ const Element = getElementType(variant, elementType);
63
+ const classes = buildTextClasses(textProps, htmlClassName);
64
+
65
+ return containsHTML(text) ? (
66
+ <Element
67
+ ref={ref}
68
+ {...domProps}
69
+ className={classes}
70
+ dangerouslySetInnerHTML={dangerousHTML}
71
+ />
72
+ ) : (
73
+ <Element ref={ref} {...domProps} className={classes}>
74
+ {text}
75
+ </Element>
76
+ );
77
+ }
78
+
79
+ const DangerousComponent =
80
+ htmlElementType ?? (textIsBlockHTML ? "div" : "span");
44
81
  const dangerousElement = (
45
82
  <DangerousComponent
46
83
  className={htmlClassName}
@@ -48,7 +85,7 @@ const TextOrHTML = ({
48
85
  />
49
86
  );
50
87
 
51
- if (shouldWrapInText) {
88
+ if (textWrapper) {
52
89
  return (
53
90
  <Text ref={ref} {...textProps}>
54
91
  {dangerousElement}
@@ -1,40 +0,0 @@
1
- import {
2
- Text
3
- } from "./chunk-ZS5MFZHD.js";
4
-
5
- // src/components/TextOrHTML/TextOrHTML.tsx
6
- import { useMemo } from "react";
7
- import { jsx } from "react/jsx-runtime";
8
- var isHTML = (text) => /^\s*<[a-z]/i.test(text);
9
- var TextOrHTML = ({
10
- ref,
11
- text,
12
- htmlClassName,
13
- htmlElementType,
14
- textWrapper = false,
15
- autoDetect = false,
16
- ...textProps
17
- }) => {
18
- const textIsHTML = autoDetect && isHTML(text);
19
- const shouldWrapInText = autoDetect ? textWrapper || !textIsHTML : textWrapper;
20
- const resolvedElementType = htmlElementType ?? (textIsHTML ? "div" : "span");
21
- const DangerousComponent = resolvedElementType;
22
- const dangerousHTML = useMemo(() => ({ __html: text }), [text]);
23
- const dangerousElement = /* @__PURE__ */ jsx(
24
- DangerousComponent,
25
- {
26
- className: htmlClassName,
27
- dangerouslySetInnerHTML: dangerousHTML
28
- }
29
- );
30
- if (shouldWrapInText) {
31
- return /* @__PURE__ */ jsx(Text, { ref, ...textProps, children: dangerousElement });
32
- }
33
- return dangerousElement;
34
- };
35
- TextOrHTML.displayName = "TextOrHTML";
36
-
37
- export {
38
- TextOrHTML
39
- };
40
- //# sourceMappingURL=chunk-VIDKIVA6.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/components/TextOrHTML/TextOrHTML.tsx"],
4
- "sourcesContent": ["import type { RefAttributes } from \"react\";\nimport { useMemo } from \"react\";\nimport type { TextElementType, TextProps } from \"../Text/Text\";\nimport { Text } from \"../Text/Text\";\n\nexport type HTMLElementType = \"span\" | \"div\";\n\nconst isHTML = (text: string) => /^\\s*<[a-z]/i.test(text);\n\nexport interface TextOrHTMLProps\n extends Omit<TextProps, \"children\">, RefAttributes<TextElementType> {\n /** HTML string to be rendered with dangerouslySetInnerHTML */\n text: string;\n /** Custom class name for the dangerous HTML element */\n htmlClassName?: string;\n /** HTML element type for the dangerous HTML element */\n htmlElementType?: HTMLElementType;\n /** If true, wraps the dangerous HTML element inside a Text component */\n textWrapper?: boolean;\n /** If true, auto-detects whether text is HTML or plain text to determine wrapping and element type */\n autoDetect?: boolean;\n}\n\nconst TextOrHTML = ({\n ref,\n text,\n htmlClassName,\n htmlElementType,\n textWrapper = false,\n autoDetect = false,\n ...textProps\n}: TextOrHTMLProps) => {\n const textIsHTML = autoDetect && isHTML(text);\n const shouldWrapInText = autoDetect\n ? textWrapper || !textIsHTML\n : textWrapper;\n const resolvedElementType = htmlElementType ?? (textIsHTML ? \"div\" : \"span\");\n const DangerousComponent = resolvedElementType;\n\n // Memoize the dangerouslySetInnerHTML object to prevent unnecessary re-renders\n // See: https://github.com/facebook/react/issues/31660\n const dangerousHTML = useMemo(() => ({ __html: text }), [text]);\n\n const dangerousElement = (\n <DangerousComponent\n className={htmlClassName}\n dangerouslySetInnerHTML={dangerousHTML}\n />\n );\n\n if (shouldWrapInText) {\n return (\n <Text ref={ref} {...textProps}>\n {dangerousElement}\n </Text>\n );\n }\n\n return dangerousElement;\n};\n\nTextOrHTML.displayName = \"TextOrHTML\";\nexport { TextOrHTML };\n"],
5
- "mappings": ";;;;;AACA,SAAS,eAAe;AA2CpB;AArCJ,IAAM,SAAS,CAAC,SAAiB,cAAc,KAAK,IAAI;AAgBxD,IAAM,aAAa,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AAAA,EACb,GAAG;AACL,MAAuB;AACrB,QAAM,aAAa,cAAc,OAAO,IAAI;AAC5C,QAAM,mBAAmB,aACrB,eAAe,CAAC,aAChB;AACJ,QAAM,sBAAsB,oBAAoB,aAAa,QAAQ;AACrE,QAAM,qBAAqB;AAI3B,QAAM,gBAAgB,QAAQ,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC;AAE9D,QAAM,mBACJ;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,yBAAyB;AAAA;AAAA,EAC3B;AAGF,MAAI,kBAAkB;AACpB,WACE,oBAAC,QAAK,KAAW,GAAG,WACjB,4BACH;AAAA,EAEJ;AAEA,SAAO;AACT;AAEA,WAAW,cAAc;",
6
- "names": []
7
- }