@simplybusiness/mobius 10.4.0 → 10.4.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 (144) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/components/AddressLookup/AddressLookup.js +5 -4
  3. package/dist/cjs/components/AddressLookup/AddressLookup.js.map +2 -2
  4. package/dist/cjs/components/AddressLookup/index.js +5 -4
  5. package/dist/cjs/components/AddressLookup/index.js.map +2 -2
  6. package/dist/cjs/components/Alert/Alert.js +5 -4
  7. package/dist/cjs/components/Alert/Alert.js.map +2 -2
  8. package/dist/cjs/components/Alert/index.js +5 -4
  9. package/dist/cjs/components/Alert/index.js.map +2 -2
  10. package/dist/cjs/components/Checkbox/Checkbox.js +5 -4
  11. package/dist/cjs/components/Checkbox/Checkbox.js.map +2 -2
  12. package/dist/cjs/components/Checkbox/CheckboxGroup.js +5 -4
  13. package/dist/cjs/components/Checkbox/CheckboxGroup.js.map +2 -2
  14. package/dist/cjs/components/Checkbox/index.js +5 -4
  15. package/dist/cjs/components/Checkbox/index.js.map +2 -2
  16. package/dist/cjs/components/Combobox/Combobox.js +5 -4
  17. package/dist/cjs/components/Combobox/Combobox.js.map +2 -2
  18. package/dist/cjs/components/Combobox/index.js +5 -4
  19. package/dist/cjs/components/Combobox/index.js.map +2 -2
  20. package/dist/cjs/components/DateField/DateField.js +5 -4
  21. package/dist/cjs/components/DateField/DateField.js.map +2 -2
  22. package/dist/cjs/components/DateField/index.js +5 -4
  23. package/dist/cjs/components/DateField/index.js.map +2 -2
  24. package/dist/cjs/components/ErrorMessage/ErrorMessage.js +5 -4
  25. package/dist/cjs/components/ErrorMessage/ErrorMessage.js.map +2 -2
  26. package/dist/cjs/components/ErrorMessage/index.js +5 -4
  27. package/dist/cjs/components/ErrorMessage/index.js.map +2 -2
  28. package/dist/cjs/components/ExpandableText/ExpandableText.js +5 -4
  29. package/dist/cjs/components/ExpandableText/ExpandableText.js.map +2 -2
  30. package/dist/cjs/components/ExpandableText/index.js +5 -4
  31. package/dist/cjs/components/ExpandableText/index.js.map +2 -2
  32. package/dist/cjs/components/MaskedField/MaskedField.js +5 -4
  33. package/dist/cjs/components/MaskedField/MaskedField.js.map +2 -2
  34. package/dist/cjs/components/MaskedField/index.js +6 -5
  35. package/dist/cjs/components/MaskedField/index.js.map +2 -2
  36. package/dist/cjs/components/NumberField/NumberField.js +5 -4
  37. package/dist/cjs/components/NumberField/NumberField.js.map +2 -2
  38. package/dist/cjs/components/NumberField/index.js +5 -4
  39. package/dist/cjs/components/NumberField/index.js.map +2 -2
  40. package/dist/cjs/components/PasswordField/PasswordField.js +5 -4
  41. package/dist/cjs/components/PasswordField/PasswordField.js.map +2 -2
  42. package/dist/cjs/components/PasswordField/index.js +5 -4
  43. package/dist/cjs/components/PasswordField/index.js.map +2 -2
  44. package/dist/cjs/components/Radio/Radio.js +5 -4
  45. package/dist/cjs/components/Radio/Radio.js.map +2 -2
  46. package/dist/cjs/components/Radio/RadioGroup.js +5 -4
  47. package/dist/cjs/components/Radio/RadioGroup.js.map +2 -2
  48. package/dist/cjs/components/Radio/index.js +5 -4
  49. package/dist/cjs/components/Radio/index.js.map +2 -2
  50. package/dist/cjs/components/Select/Select.js +5 -4
  51. package/dist/cjs/components/Select/Select.js.map +2 -2
  52. package/dist/cjs/components/Select/index.js +5 -4
  53. package/dist/cjs/components/Select/index.js.map +2 -2
  54. package/dist/cjs/components/TextArea/TextArea.js +5 -4
  55. package/dist/cjs/components/TextArea/TextArea.js.map +2 -2
  56. package/dist/cjs/components/TextArea/index.js +5 -4
  57. package/dist/cjs/components/TextArea/index.js.map +2 -2
  58. package/dist/cjs/components/TextField/TextField.js +5 -4
  59. package/dist/cjs/components/TextField/TextField.js.map +2 -2
  60. package/dist/cjs/components/TextField/index.js +5 -4
  61. package/dist/cjs/components/TextField/index.js.map +2 -2
  62. package/dist/cjs/components/TextOrHTML/TextOrHTML.js +5 -4
  63. package/dist/cjs/components/TextOrHTML/TextOrHTML.js.map +2 -2
  64. package/dist/cjs/components/TextOrHTML/index.js +5 -4
  65. package/dist/cjs/components/TextOrHTML/index.js.map +2 -2
  66. package/dist/cjs/components/index.js +6 -5
  67. package/dist/cjs/components/index.js.map +2 -2
  68. package/dist/cjs/index.js +6 -5
  69. package/dist/cjs/index.js.map +2 -2
  70. package/dist/cjs/meta.json +103 -103
  71. package/dist/esm/{chunk-4WVJNNBK.js → chunk-2HUMNED2.js} +2 -2
  72. package/dist/esm/{chunk-N4WQ6522.js → chunk-2VEO5SSY.js} +2 -2
  73. package/dist/esm/{chunk-AFU7BFCD.js → chunk-576SEJGC.js} +3 -3
  74. package/dist/esm/{chunk-QPIA6BGW.js → chunk-6JCU4CGA.js} +2 -2
  75. package/dist/esm/{chunk-X6EPYQKX.js → chunk-F5ELD54X.js} +2 -2
  76. package/dist/esm/{chunk-ZN5TRIVZ.js → chunk-GV36OVX7.js} +2 -2
  77. package/dist/esm/{chunk-JNAQ76CR.js → chunk-HGNWNZ5E.js} +2 -2
  78. package/dist/esm/{chunk-ONDOONBM.js → chunk-HUSMC5GZ.js} +2 -2
  79. package/dist/esm/{chunk-UIIXVY6K.js → chunk-IQKS662C.js} +2 -2
  80. package/dist/esm/{chunk-DYTHXKMX.js → chunk-KTJCAQT4.js} +6 -5
  81. package/dist/esm/chunk-KTJCAQT4.js.map +7 -0
  82. package/dist/esm/{chunk-5OFXPT4J.js → chunk-M62U4QGQ.js} +2 -2
  83. package/dist/esm/{chunk-UQVAEWY2.js → chunk-MZJT3USG.js} +2 -2
  84. package/dist/esm/{chunk-FKTDL7KO.js → chunk-OAG5T7NC.js} +2 -2
  85. package/dist/esm/{chunk-M2NDSQR5.js → chunk-P6YHEIFT.js} +2 -2
  86. package/dist/esm/{chunk-P5VEI574.js → chunk-S4CU4XRB.js} +2 -2
  87. package/dist/esm/{chunk-4NBLO5WK.js → chunk-X4CMSAET.js} +2 -2
  88. package/dist/esm/{chunk-KQZ3MNK5.js → chunk-XNEQHHNV.js} +2 -2
  89. package/dist/esm/components/AddressLookup/AddressLookup.js +5 -5
  90. package/dist/esm/components/AddressLookup/index.js +5 -5
  91. package/dist/esm/components/Alert/Alert.js +2 -2
  92. package/dist/esm/components/Alert/index.js +2 -2
  93. package/dist/esm/components/Checkbox/Checkbox.js +3 -3
  94. package/dist/esm/components/Checkbox/CheckboxGroup.js +4 -4
  95. package/dist/esm/components/Checkbox/index.js +4 -4
  96. package/dist/esm/components/Combobox/Combobox.js +4 -4
  97. package/dist/esm/components/Combobox/index.js +4 -4
  98. package/dist/esm/components/DateField/DateField.js +4 -4
  99. package/dist/esm/components/DateField/index.js +4 -4
  100. package/dist/esm/components/ErrorMessage/ErrorMessage.js +2 -2
  101. package/dist/esm/components/ErrorMessage/index.js +2 -2
  102. package/dist/esm/components/ExpandableText/ExpandableText.js +2 -2
  103. package/dist/esm/components/ExpandableText/index.js +2 -2
  104. package/dist/esm/components/MaskedField/MaskedField.js +3 -3
  105. package/dist/esm/components/MaskedField/index.js +4 -4
  106. package/dist/esm/components/NumberField/NumberField.js +4 -4
  107. package/dist/esm/components/NumberField/index.js +4 -4
  108. package/dist/esm/components/PasswordField/PasswordField.js +4 -4
  109. package/dist/esm/components/PasswordField/index.js +4 -4
  110. package/dist/esm/components/Radio/Radio.js +3 -3
  111. package/dist/esm/components/Radio/RadioGroup.js +3 -3
  112. package/dist/esm/components/Radio/index.js +4 -4
  113. package/dist/esm/components/Select/Select.js +3 -3
  114. package/dist/esm/components/Select/index.js +3 -3
  115. package/dist/esm/components/TextArea/TextArea.js +3 -3
  116. package/dist/esm/components/TextArea/index.js +3 -3
  117. package/dist/esm/components/TextField/TextField.js +3 -3
  118. package/dist/esm/components/TextField/index.js +3 -3
  119. package/dist/esm/components/TextOrHTML/TextOrHTML.js +1 -1
  120. package/dist/esm/components/TextOrHTML/index.js +1 -1
  121. package/dist/esm/components/index.js +17 -17
  122. package/dist/esm/index.js +17 -17
  123. package/dist/esm/meta.json +191 -191
  124. package/dist/tsconfig.build.tsbuildinfo +1 -1
  125. package/package.json +2 -2
  126. package/src/components/TextOrHTML/TextOrHTML.test.tsx +45 -8
  127. package/src/components/TextOrHTML/TextOrHTML.tsx +7 -4
  128. package/dist/esm/chunk-DYTHXKMX.js.map +0 -7
  129. /package/dist/esm/{chunk-4WVJNNBK.js.map → chunk-2HUMNED2.js.map} +0 -0
  130. /package/dist/esm/{chunk-N4WQ6522.js.map → chunk-2VEO5SSY.js.map} +0 -0
  131. /package/dist/esm/{chunk-AFU7BFCD.js.map → chunk-576SEJGC.js.map} +0 -0
  132. /package/dist/esm/{chunk-QPIA6BGW.js.map → chunk-6JCU4CGA.js.map} +0 -0
  133. /package/dist/esm/{chunk-X6EPYQKX.js.map → chunk-F5ELD54X.js.map} +0 -0
  134. /package/dist/esm/{chunk-ZN5TRIVZ.js.map → chunk-GV36OVX7.js.map} +0 -0
  135. /package/dist/esm/{chunk-JNAQ76CR.js.map → chunk-HGNWNZ5E.js.map} +0 -0
  136. /package/dist/esm/{chunk-ONDOONBM.js.map → chunk-HUSMC5GZ.js.map} +0 -0
  137. /package/dist/esm/{chunk-UIIXVY6K.js.map → chunk-IQKS662C.js.map} +0 -0
  138. /package/dist/esm/{chunk-5OFXPT4J.js.map → chunk-M62U4QGQ.js.map} +0 -0
  139. /package/dist/esm/{chunk-UQVAEWY2.js.map → chunk-MZJT3USG.js.map} +0 -0
  140. /package/dist/esm/{chunk-FKTDL7KO.js.map → chunk-OAG5T7NC.js.map} +0 -0
  141. /package/dist/esm/{chunk-M2NDSQR5.js.map → chunk-P6YHEIFT.js.map} +0 -0
  142. /package/dist/esm/{chunk-P5VEI574.js.map → chunk-S4CU4XRB.js.map} +0 -0
  143. /package/dist/esm/{chunk-4NBLO5WK.js.map → chunk-X4CMSAET.js.map} +0 -0
  144. /package/dist/esm/{chunk-KQZ3MNK5.js.map → chunk-XNEQHHNV.js.map} +0 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@simplybusiness/mobius",
3
3
  "license": "UNLICENSED",
4
- "version": "10.4.0",
4
+ "version": "10.4.2",
5
5
  "description": "Core library of Mobius react components",
6
6
  "repository": {
7
7
  "type": "git",
@@ -99,7 +99,7 @@
99
99
  "@floating-ui/react": "^0.27.19",
100
100
  "@loadable/component": "^5.16.7",
101
101
  "@simplybusiness/icons": "^5.1.0",
102
- "@simplybusiness/mobius-hooks": "^0.1.1",
102
+ "@simplybusiness/mobius-hooks": "^0.2.0",
103
103
  "classnames": "^2.5.1",
104
104
  "dialog-polyfill": "^0.5.6",
105
105
  "react-accessible-dropdown-menu-hook": "^4.0.1",
@@ -128,14 +128,14 @@ describe("TextOrHTML", () => {
128
128
  });
129
129
 
130
130
  describe("autoDetect prop", () => {
131
- it("detects HTML content and renders as a div without Text wrapper", () => {
131
+ it("detects inline HTML content and renders in a Text-equivalent element", () => {
132
132
  const { container } = render(
133
133
  <TextOrHTML text="<strong>Bold text</strong>" autoDetect />,
134
134
  );
135
- expect(container.firstChild?.nodeName).toBe("DIV");
136
- // eslint-disable-next-line testing-library/no-container, testing-library/no-node-access
137
- const div = container.querySelector("div");
138
- expect(div?.innerHTML).toBe("<strong>Bold text</strong>");
135
+ expect(container.firstChild?.nodeName).toBe("P");
136
+ expect((container.firstChild as HTMLElement)?.innerHTML).toBe(
137
+ "<strong>Bold text</strong>",
138
+ );
139
139
  });
140
140
 
141
141
  it("detects plain text and renders directly in a Text component without nested span", () => {
@@ -225,7 +225,7 @@ describe("TextOrHTML", () => {
225
225
  const { container } = render(
226
226
  <TextOrHTML
227
227
  htmlElementType="span"
228
- text="<strong>HTML</strong>"
228
+ text="<div>Block HTML</div>"
229
229
  autoDetect
230
230
  />,
231
231
  );
@@ -235,7 +235,7 @@ describe("TextOrHTML", () => {
235
235
  it("wraps HTML in Text when both autoDetect and textWrapper are true", () => {
236
236
  render(
237
237
  <TextOrHTML
238
- text="<strong>Bold</strong>"
238
+ text="<div>Block</div>"
239
239
  htmlElementType="span"
240
240
  autoDetect
241
241
  textWrapper
@@ -246,7 +246,7 @@ describe("TextOrHTML", () => {
246
246
  expect(element).toHaveClass(CLASS_NAME);
247
247
  // eslint-disable-next-line testing-library/no-node-access
248
248
  const span = element.querySelector("span");
249
- expect(span?.innerHTML).toBe("<strong>Bold</strong>");
249
+ expect(span?.innerHTML).toBe("<div>Block</div>");
250
250
  });
251
251
 
252
252
  it("passes className to Text wrapper when autoDetect wraps plain text", () => {
@@ -271,6 +271,43 @@ describe("TextOrHTML", () => {
271
271
  // eslint-disable-next-line testing-library/no-container, testing-library/no-node-access
272
272
  expect(container.querySelector(`.${CLASS_NAME}`)).toBeNull();
273
273
  });
274
+
275
+ it("detects block-level tags appearing after leading prose", () => {
276
+ const { container } = render(
277
+ <TextOrHTML
278
+ text="Estimate the total: <ul><li>Item one</li><li>Item two</li></ul>"
279
+ autoDetect
280
+ />,
281
+ );
282
+ expect(container.firstChild?.nodeName).toBe("DIV");
283
+ });
284
+
285
+ it("detects block-level tags appearing after leading prose with <br>", () => {
286
+ const { container } = render(
287
+ <TextOrHTML
288
+ text="Estimate the total amount: <br> <ul> <li> Yourself </li> </ul>"
289
+ autoDetect
290
+ />,
291
+ );
292
+ expect(container.firstChild?.nodeName).toBe("DIV");
293
+ });
294
+
295
+ it("treats text with only <br> as inline, not block", () => {
296
+ const { container } = render(
297
+ <TextOrHTML text="Line one <br> Line two" autoDetect />,
298
+ );
299
+ expect(container.firstChild?.nodeName).toBe("P");
300
+ });
301
+
302
+ it("treats text with only inline tags as inline", () => {
303
+ const { container } = render(
304
+ <TextOrHTML
305
+ text="This has <em>emphasis</em> and <strong>bold</strong>"
306
+ autoDetect
307
+ />,
308
+ );
309
+ expect(container.firstChild?.nodeName).toBe("P");
310
+ });
274
311
  });
275
312
 
276
313
  // See: https://github.com/facebook/react/issues/31660
@@ -6,7 +6,10 @@ import { Text, getElementType } from "../Text/Text";
6
6
 
7
7
  export type HTMLElementType = "span" | "div";
8
8
 
9
- const isBlockHTML = (text: string) => /^\s*<[a-z]/i.test(text);
9
+ // Block-level tags that cannot be nested inside <p>.
10
+ const BLOCK_TAG =
11
+ /<(div|p|ul|ol|li|h[1-6]|table|tr|td|th|blockquote|pre|hr|dl|dt|dd)[\s>/]/i;
12
+ const containsBlockHTML = (text: string) => BLOCK_TAG.test(text);
10
13
  const containsHTML = (text: string) =>
11
14
  /<[a-z/]/i.test(text) || /&(?:#\d+|#x[\da-f]+|[a-z]\w*);/i.test(text); // tag or entity
12
15
 
@@ -49,7 +52,7 @@ const TextOrHTML = ({
49
52
  autoDetect = false,
50
53
  ...textProps
51
54
  }: TextOrHTMLProps) => {
52
- const textIsBlockHTML = autoDetect && isBlockHTML(text);
55
+ const hasBlockContent = autoDetect && containsBlockHTML(text);
53
56
 
54
57
  // Memoize the dangerouslySetInnerHTML object to prevent unnecessary re-renders
55
58
  // See: https://github.com/facebook/react/issues/31660
@@ -57,7 +60,7 @@ const TextOrHTML = ({
57
60
 
58
61
  // Non-block text with autoDetect: render directly on a Text-equivalent element,
59
62
  // avoiding unnecessary <span> nesting inside <p>.
60
- if (autoDetect && !textIsBlockHTML) {
63
+ if (autoDetect && !hasBlockContent) {
61
64
  const { variant, spacing, elementType, className, ...domProps } = textProps;
62
65
  const Element = getElementType(variant, elementType);
63
66
  const classes = buildTextClasses(textProps, htmlClassName);
@@ -77,7 +80,7 @@ const TextOrHTML = ({
77
80
  }
78
81
 
79
82
  const DangerousComponent =
80
- htmlElementType ?? (textIsBlockHTML ? "div" : "span");
83
+ htmlElementType ?? (hasBlockContent ? "div" : "span");
81
84
  const dangerousElement = (
82
85
  <DangerousComponent
83
86
  className={htmlClassName}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/components/TextOrHTML/TextOrHTML.tsx"],
4
- "sourcesContent": ["import classNames from \"classnames/dedupe\";\nimport type { RefAttributes } from \"react\";\nimport { useMemo } from \"react\";\nimport type { TextElementType, TextProps } from \"../Text/Text\";\nimport { Text, getElementType } from \"../Text/Text\";\n\nexport type HTMLElementType = \"span\" | \"div\";\n\nconst isBlockHTML = (text: string) => /^\\s*<[a-z]/i.test(text);\nconst containsHTML = (text: string) =>\n /<[a-z/]/i.test(text) || /&(?:#\\d+|#x[\\da-f]+|[a-z]\\w*);/i.test(text); // tag or entity\n\nconst buildTextClasses = (\n textProps: Omit<TextProps, \"children\">,\n htmlClassName?: string,\n) => {\n const { variant, elementType, spacing, className } = textProps;\n const variantType = variant || getElementType(variant, elementType);\n return classNames(\n \"mobius\",\n \"mobius-text\",\n { [`--is-${variantType}`]: variantType },\n { [`--has-line-height-${spacing}`]: spacing },\n className,\n htmlClassName,\n );\n};\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 textIsBlockHTML = autoDetect && isBlockHTML(text);\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 // Non-block text with autoDetect: render directly on a Text-equivalent element,\n // avoiding unnecessary <span> nesting inside <p>.\n if (autoDetect && !textIsBlockHTML) {\n const { variant, spacing, elementType, className, ...domProps } = textProps;\n const Element = getElementType(variant, elementType);\n const classes = buildTextClasses(textProps, htmlClassName);\n\n return containsHTML(text) ? (\n <Element\n ref={ref}\n {...domProps}\n className={classes}\n dangerouslySetInnerHTML={dangerousHTML}\n />\n ) : (\n <Element ref={ref} {...domProps} className={classes}>\n {text}\n </Element>\n );\n }\n\n const DangerousComponent =\n htmlElementType ?? (textIsBlockHTML ? \"div\" : \"span\");\n const dangerousElement = (\n <DangerousComponent\n className={htmlClassName}\n dangerouslySetInnerHTML={dangerousHTML}\n />\n );\n\n if (textWrapper) {\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": ";;;;;;AAAA,OAAO,gBAAgB;AAEvB,SAAS,eAAe;AA+DlB;AAzDN,IAAM,cAAc,CAAC,SAAiB,cAAc,KAAK,IAAI;AAC7D,IAAM,eAAe,CAAC,SACpB,WAAW,KAAK,IAAI,KAAK,kCAAkC,KAAK,IAAI;AAEtE,IAAM,mBAAmB,CACvB,WACA,kBACG;AACH,QAAM,EAAE,SAAS,aAAa,SAAS,UAAU,IAAI;AACrD,QAAM,cAAc,WAAW,eAAe,SAAS,WAAW;AAClE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,CAAC,QAAQ,WAAW,EAAE,GAAG,YAAY;AAAA,IACvC,EAAE,CAAC,qBAAqB,OAAO,EAAE,GAAG,QAAQ;AAAA,IAC5C;AAAA,IACA;AAAA,EACF;AACF;AAgBA,IAAM,aAAa,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AAAA,EACb,GAAG;AACL,MAAuB;AACrB,QAAM,kBAAkB,cAAc,YAAY,IAAI;AAItD,QAAM,gBAAgB,QAAQ,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC;AAI9D,MAAI,cAAc,CAAC,iBAAiB;AAClC,UAAM,EAAE,SAAS,SAAS,aAAa,WAAW,GAAG,SAAS,IAAI;AAClE,UAAM,UAAU,eAAe,SAAS,WAAW;AACnD,UAAM,UAAU,iBAAiB,WAAW,aAAa;AAEzD,WAAO,aAAa,IAAI,IACtB;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACC,GAAG;AAAA,QACJ,WAAW;AAAA,QACX,yBAAyB;AAAA;AAAA,IAC3B,IAEA,oBAAC,WAAQ,KAAW,GAAG,UAAU,WAAW,SACzC,gBACH;AAAA,EAEJ;AAEA,QAAM,qBACJ,oBAAoB,kBAAkB,QAAQ;AAChD,QAAM,mBACJ;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,yBAAyB;AAAA;AAAA,EAC3B;AAGF,MAAI,aAAa;AACf,WACE,oBAAC,QAAK,KAAW,GAAG,WACjB,4BACH;AAAA,EAEJ;AAEA,SAAO;AACT;AAEA,WAAW,cAAc;",
6
- "names": []
7
- }