@simplybusiness/mobius 10.3.1 → 10.3.3

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 (185) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/components/AddressLookup/AddressLookup.js +888 -5314
  3. package/dist/cjs/components/AddressLookup/AddressLookup.js.map +4 -4
  4. package/dist/cjs/components/AddressLookup/index.js +952 -5381
  5. package/dist/cjs/components/AddressLookup/index.js.map +4 -4
  6. package/dist/cjs/components/Alert/Alert.js +1 -1
  7. package/dist/cjs/components/Alert/Alert.js.map +2 -2
  8. package/dist/cjs/components/Alert/index.js +1 -1
  9. package/dist/cjs/components/Alert/index.js.map +2 -2
  10. package/dist/cjs/components/Checkbox/Checkbox.js +245 -5625
  11. package/dist/cjs/components/Checkbox/Checkbox.js.map +4 -4
  12. package/dist/cjs/components/Checkbox/CheckboxGroup.js +371 -5614
  13. package/dist/cjs/components/Checkbox/CheckboxGroup.js.map +4 -4
  14. package/dist/cjs/components/Checkbox/index.js +377 -5619
  15. package/dist/cjs/components/Checkbox/index.js.map +4 -4
  16. package/dist/cjs/components/Combobox/Combobox.js +829 -5344
  17. package/dist/cjs/components/Combobox/Combobox.js.map +4 -4
  18. package/dist/cjs/components/Combobox/index.js +813 -5327
  19. package/dist/cjs/components/Combobox/index.js.map +4 -4
  20. package/dist/cjs/components/DateField/DateField.js +379 -5505
  21. package/dist/cjs/components/DateField/DateField.js.map +4 -4
  22. package/dist/cjs/components/DateField/index.js +383 -5508
  23. package/dist/cjs/components/DateField/index.js.map +4 -4
  24. package/dist/cjs/components/ErrorMessage/ErrorMessage.js +120 -5643
  25. package/dist/cjs/components/ErrorMessage/ErrorMessage.js.map +4 -4
  26. package/dist/cjs/components/ErrorMessage/index.js +121 -5642
  27. package/dist/cjs/components/ErrorMessage/index.js.map +4 -4
  28. package/dist/cjs/components/ExpandableText/ExpandableText.js +511 -5604
  29. package/dist/cjs/components/ExpandableText/ExpandableText.js.map +4 -4
  30. package/dist/cjs/components/ExpandableText/index.js +512 -5604
  31. package/dist/cjs/components/ExpandableText/index.js.map +4 -4
  32. package/dist/cjs/components/MaskedField/MaskedField.js +394 -5511
  33. package/dist/cjs/components/MaskedField/MaskedField.js.map +4 -4
  34. package/dist/cjs/components/MaskedField/index.js +294 -5119
  35. package/dist/cjs/components/MaskedField/index.js.map +4 -4
  36. package/dist/cjs/components/NumberField/NumberField.js +357 -5523
  37. package/dist/cjs/components/NumberField/NumberField.js.map +4 -4
  38. package/dist/cjs/components/NumberField/index.js +358 -5523
  39. package/dist/cjs/components/NumberField/index.js.map +4 -4
  40. package/dist/cjs/components/PasswordField/PasswordField.js +330 -5511
  41. package/dist/cjs/components/PasswordField/PasswordField.js.map +4 -4
  42. package/dist/cjs/components/PasswordField/ShowHideButton.js +32 -5655
  43. package/dist/cjs/components/PasswordField/ShowHideButton.js.map +4 -4
  44. package/dist/cjs/components/PasswordField/index.js +332 -5512
  45. package/dist/cjs/components/PasswordField/index.js.map +4 -4
  46. package/dist/cjs/components/Radio/Radio.js +242 -5632
  47. package/dist/cjs/components/Radio/Radio.js.map +4 -4
  48. package/dist/cjs/components/Radio/RadioGroup.js +274 -5619
  49. package/dist/cjs/components/Radio/RadioGroup.js.map +4 -4
  50. package/dist/cjs/components/Radio/index.js +404 -5628
  51. package/dist/cjs/components/Radio/index.js.map +4 -4
  52. package/dist/cjs/components/Select/Select.js +233 -5588
  53. package/dist/cjs/components/Select/Select.js.map +4 -4
  54. package/dist/cjs/components/Select/index.js +234 -5588
  55. package/dist/cjs/components/Select/index.js.map +4 -4
  56. package/dist/cjs/components/TextArea/TextArea.js +229 -5531
  57. package/dist/cjs/components/TextArea/TextArea.js.map +4 -4
  58. package/dist/cjs/components/TextArea/index.js +230 -5531
  59. package/dist/cjs/components/TextArea/index.js.map +4 -4
  60. package/dist/cjs/components/TextField/TextField.js +265 -5522
  61. package/dist/cjs/components/TextField/TextField.js.map +4 -4
  62. package/dist/cjs/components/TextField/index.js +266 -5522
  63. package/dist/cjs/components/TextField/index.js.map +4 -4
  64. package/dist/cjs/components/TextOrHTML/TextOrHTML.js +1 -1
  65. package/dist/cjs/components/TextOrHTML/TextOrHTML.js.map +2 -2
  66. package/dist/cjs/components/TextOrHTML/index.js +1 -1
  67. package/dist/cjs/components/TextOrHTML/index.js.map +2 -2
  68. package/dist/cjs/components/index.js +4273 -5291
  69. package/dist/cjs/components/index.js.map +4 -4
  70. package/dist/cjs/index.js +4304 -5334
  71. package/dist/cjs/index.js.map +4 -4
  72. package/dist/cjs/meta.json +5692 -51487
  73. package/dist/esm/chunk-3O5DIIGS.js +1 -0
  74. package/dist/esm/chunk-3O5DIIGS.js.map +7 -0
  75. package/dist/esm/chunk-3PRSHEVX.js +1 -0
  76. package/dist/esm/chunk-3PRSHEVX.js.map +7 -0
  77. package/dist/esm/chunk-4NBLO5WK.js +54 -0
  78. package/dist/esm/chunk-4NBLO5WK.js.map +7 -0
  79. package/dist/esm/chunk-4WVJNNBK.js +157 -0
  80. package/dist/esm/chunk-4WVJNNBK.js.map +7 -0
  81. package/dist/esm/chunk-5L4G4VLM.js +1 -0
  82. package/dist/esm/chunk-5L4G4VLM.js.map +7 -0
  83. package/dist/esm/chunk-5OFXPT4J.js +135 -0
  84. package/dist/esm/chunk-5OFXPT4J.js.map +7 -0
  85. package/dist/esm/chunk-6O77SOOB.js +1 -0
  86. package/dist/esm/chunk-6O77SOOB.js.map +7 -0
  87. package/dist/esm/chunk-AFU7BFCD.js +151 -0
  88. package/dist/esm/chunk-AFU7BFCD.js.map +7 -0
  89. package/dist/esm/chunk-BGR2OTTR.js +1 -0
  90. package/dist/esm/chunk-BGR2OTTR.js.map +7 -0
  91. package/dist/esm/chunk-BIGO5EVC.js +1 -0
  92. package/dist/esm/chunk-BIGO5EVC.js.map +7 -0
  93. package/dist/esm/chunk-CUOVI2HT.js +1 -0
  94. package/dist/esm/chunk-CUOVI2HT.js.map +7 -0
  95. package/dist/esm/{chunk-HPUPB75I.js → chunk-DYTHXKMX.js} +2 -2
  96. package/dist/esm/chunk-DYTHXKMX.js.map +7 -0
  97. package/dist/esm/chunk-F4RQKLF7.js +1 -0
  98. package/dist/esm/chunk-F4RQKLF7.js.map +7 -0
  99. package/dist/esm/chunk-FKTDL7KO.js +355 -0
  100. package/dist/esm/chunk-FKTDL7KO.js.map +7 -0
  101. package/dist/esm/{chunk-NRU3WNV7.js → chunk-JNAQ76CR.js} +2 -2
  102. package/dist/esm/chunk-KQZ3MNK5.js +100 -0
  103. package/dist/esm/chunk-KQZ3MNK5.js.map +7 -0
  104. package/dist/esm/chunk-M2NDSQR5.js +106 -0
  105. package/dist/esm/chunk-M2NDSQR5.js.map +7 -0
  106. package/dist/esm/chunk-N4WQ6522.js +125 -0
  107. package/dist/esm/chunk-N4WQ6522.js.map +7 -0
  108. package/dist/esm/{chunk-CNOF66SV.js → chunk-NGNVAFBJ.js} +4 -4
  109. package/dist/esm/chunk-NOQ27VLY.js +1 -0
  110. package/dist/esm/chunk-NOQ27VLY.js.map +7 -0
  111. package/dist/esm/chunk-ONDOONBM.js +101 -0
  112. package/dist/esm/chunk-ONDOONBM.js.map +7 -0
  113. package/dist/esm/chunk-P34DI6BE.js +1 -0
  114. package/dist/esm/chunk-P34DI6BE.js.map +7 -0
  115. package/dist/esm/chunk-P5VEI574.js +97 -0
  116. package/dist/esm/chunk-P5VEI574.js.map +7 -0
  117. package/dist/esm/chunk-QPIA6BGW.js +64 -0
  118. package/dist/esm/chunk-QPIA6BGW.js.map +7 -0
  119. package/dist/esm/chunk-SZEFLEDA.js +1 -0
  120. package/dist/esm/chunk-SZEFLEDA.js.map +7 -0
  121. package/dist/esm/chunk-TXB4BOHB.js +1 -0
  122. package/dist/esm/chunk-TXB4BOHB.js.map +7 -0
  123. package/dist/esm/chunk-UIIXVY6K.js +123 -0
  124. package/dist/esm/chunk-UIIXVY6K.js.map +7 -0
  125. package/dist/esm/chunk-UQVAEWY2.js +44 -0
  126. package/dist/esm/chunk-UQVAEWY2.js.map +7 -0
  127. package/dist/esm/chunk-WC3D5GNN.js +29 -0
  128. package/dist/esm/chunk-WC3D5GNN.js.map +7 -0
  129. package/dist/esm/chunk-WNRO77YH.js +1 -0
  130. package/dist/esm/chunk-WNRO77YH.js.map +7 -0
  131. package/dist/esm/chunk-X6EPYQKX.js +96 -0
  132. package/dist/esm/chunk-X6EPYQKX.js.map +7 -0
  133. package/dist/esm/chunk-ZN5TRIVZ.js +41 -0
  134. package/dist/esm/chunk-ZN5TRIVZ.js.map +7 -0
  135. package/dist/esm/components/AddressLookup/AddressLookup.js +10 -107
  136. package/dist/esm/components/AddressLookup/index.js +11 -104
  137. package/dist/esm/components/Alert/Alert.js +2 -2
  138. package/dist/esm/components/Alert/index.js +2 -2
  139. package/dist/esm/components/Checkbox/Checkbox.js +4 -117
  140. package/dist/esm/components/Checkbox/CheckboxGroup.js +5 -115
  141. package/dist/esm/components/Checkbox/index.js +8 -115
  142. package/dist/esm/components/Combobox/Combobox.js +7 -108
  143. package/dist/esm/components/Combobox/index.js +9 -108
  144. package/dist/esm/components/DateField/DateField.js +7 -114
  145. package/dist/esm/components/DateField/index.js +8 -114
  146. package/dist/esm/components/ErrorMessage/ErrorMessage.js +2 -147
  147. package/dist/esm/components/ErrorMessage/index.js +3 -147
  148. package/dist/esm/components/ExpandableText/ExpandableText.js +2 -109
  149. package/dist/esm/components/ExpandableText/index.js +3 -109
  150. package/dist/esm/components/MaskedField/MaskedField.js +6 -115
  151. package/dist/esm/components/MaskedField/MaskedField.js.map +1 -1
  152. package/dist/esm/components/MaskedField/index.js +7 -115
  153. package/dist/esm/components/NumberField/NumberField.js +7 -115
  154. package/dist/esm/components/NumberField/index.js +8 -115
  155. package/dist/esm/components/PasswordField/PasswordField.js +8 -115
  156. package/dist/esm/components/PasswordField/ShowHideButton.js +1 -149
  157. package/dist/esm/components/PasswordField/index.js +9 -115
  158. package/dist/esm/components/Radio/Radio.js +4 -145
  159. package/dist/esm/components/Radio/RadioGroup.js +4 -115
  160. package/dist/esm/components/Radio/index.js +8 -116
  161. package/dist/esm/components/Select/Select.js +4 -115
  162. package/dist/esm/components/Select/index.js +5 -115
  163. package/dist/esm/components/Slider/Slider.js +2 -2
  164. package/dist/esm/components/Slider/index.js +2 -2
  165. package/dist/esm/components/TextArea/TextArea.js +4 -113
  166. package/dist/esm/components/TextArea/index.js +5 -113
  167. package/dist/esm/components/TextField/TextField.js +5 -115
  168. package/dist/esm/components/TextField/index.js +6 -115
  169. package/dist/esm/components/TextOrHTML/TextOrHTML.js +1 -1
  170. package/dist/esm/components/TextOrHTML/index.js +1 -1
  171. package/dist/esm/components/index.js +83 -46
  172. package/dist/esm/index.js +83 -41
  173. package/dist/esm/meta.json +6905 -19124
  174. package/dist/tsconfig.build.tsbuildinfo +1 -1
  175. package/package.json +1 -1
  176. package/src/components/ErrorMessage/ErrorMessage.tsx +1 -1
  177. package/src/components/ExpandableText/ExpandableText.tsx +3 -1
  178. package/src/components/PasswordField/ShowHideButton.tsx +1 -1
  179. package/src/components/TextOrHTML/TextOrHTML.test.tsx +18 -0
  180. package/src/components/TextOrHTML/TextOrHTML.tsx +2 -1
  181. package/dist/esm/chunk-HPUPB75I.js.map +0 -7
  182. package/dist/esm/chunk-M7LTJZQU.js +0 -1606
  183. package/dist/esm/chunk-M7LTJZQU.js.map +0 -7
  184. /package/dist/esm/{chunk-NRU3WNV7.js.map → chunk-JNAQ76CR.js.map} +0 -0
  185. /package/dist/esm/{chunk-CNOF66SV.js.map → chunk-NGNVAFBJ.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.3.1",
4
+ "version": "10.3.3",
5
5
  "description": "Core library of Mobius react components",
6
6
  "repository": {
7
7
  "type": "git",
@@ -1,7 +1,7 @@
1
1
  import { error } from "@simplybusiness/icons";
2
2
  import classNames from "classnames/dedupe";
3
- import { TextOrHTML } from "../..";
4
3
  import { Icon } from "../Icon";
4
+ import { TextOrHTML } from "../TextOrHTML";
5
5
  import "./ErrorMessage.css";
6
6
 
7
7
  export interface ErrorMessageProps {
@@ -4,8 +4,10 @@ import classNames from "classnames/dedupe";
4
4
  import type React from "react";
5
5
  import type { RefAttributes } from "react";
6
6
  import { useEffect, useId, useRef, useState } from "react";
7
- import { Accordion, TextOrHTML, useBreakpoint } from "../..";
7
+ import { useBreakpoint } from "../../hooks";
8
8
  import type { DOMProps } from "../../types";
9
+ import { Accordion } from "../Accordion";
10
+ import { TextOrHTML } from "../TextOrHTML";
9
11
  import type { AccordionProps } from "../Accordion/Accordion";
10
12
  import type { TextProps } from "../Text/Text";
11
13
  import "./ExpandableText.css";
@@ -1,5 +1,5 @@
1
1
  import { eye, eyeSlash } from "@simplybusiness/icons";
2
- import { Icon } from "../..";
2
+ import { Icon } from "../Icon";
3
3
 
4
4
  export interface ShowHideButtonProps {
5
5
  show?: boolean;
@@ -183,6 +183,24 @@ describe("TextOrHTML", () => {
183
183
  expect(element).toHaveTextContent("This is bold text");
184
184
  });
185
185
 
186
+ it("decodes HTML entities in text that contains no HTML tags with autoDetect", () => {
187
+ const entities = [
188
+ { text: "before & 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
+ }
202
+ });
203
+
186
204
  it("detects HTML with leading whitespace", () => {
187
205
  const { container } = render(
188
206
  <TextOrHTML text=" <div>Indented HTML</div>" autoDetect />,
@@ -7,7 +7,8 @@ import { Text, getElementType } from "../Text/Text";
7
7
  export type HTMLElementType = "span" | "div";
8
8
 
9
9
  const isBlockHTML = (text: string) => /^\s*<[a-z]/i.test(text);
10
- const containsHTML = (text: string) => /<[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
11
12
 
12
13
  const buildTextClasses = (
13
14
  textProps: Omit<TextProps, "children">,
@@ -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) => /<[a-z/]/i.test(text);\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;AA8DlB;AAxDN,IAAM,cAAc,CAAC,SAAiB,cAAc,KAAK,IAAI;AAC7D,IAAM,eAAe,CAAC,SAAiB,WAAW,KAAK,IAAI;AAE3D,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
- }