@simplybusiness/mobius 10.3.1 → 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 (119) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/components/AddressLookup/AddressLookup.js +1 -1
  3. package/dist/cjs/components/AddressLookup/AddressLookup.js.map +2 -2
  4. package/dist/cjs/components/AddressLookup/index.js +1 -1
  5. package/dist/cjs/components/AddressLookup/index.js.map +2 -2
  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 +1 -1
  11. package/dist/cjs/components/Checkbox/Checkbox.js.map +2 -2
  12. package/dist/cjs/components/Checkbox/CheckboxGroup.js +1 -1
  13. package/dist/cjs/components/Checkbox/CheckboxGroup.js.map +2 -2
  14. package/dist/cjs/components/Checkbox/index.js +1 -1
  15. package/dist/cjs/components/Checkbox/index.js.map +2 -2
  16. package/dist/cjs/components/Combobox/Combobox.js +1 -1
  17. package/dist/cjs/components/Combobox/Combobox.js.map +2 -2
  18. package/dist/cjs/components/Combobox/index.js +1 -1
  19. package/dist/cjs/components/Combobox/index.js.map +2 -2
  20. package/dist/cjs/components/DateField/DateField.js +1 -1
  21. package/dist/cjs/components/DateField/DateField.js.map +2 -2
  22. package/dist/cjs/components/DateField/index.js +1 -1
  23. package/dist/cjs/components/DateField/index.js.map +2 -2
  24. package/dist/cjs/components/ErrorMessage/ErrorMessage.js +1 -1
  25. package/dist/cjs/components/ErrorMessage/ErrorMessage.js.map +2 -2
  26. package/dist/cjs/components/ErrorMessage/index.js +1 -1
  27. package/dist/cjs/components/ErrorMessage/index.js.map +2 -2
  28. package/dist/cjs/components/ExpandableText/ExpandableText.js +1 -1
  29. package/dist/cjs/components/ExpandableText/ExpandableText.js.map +2 -2
  30. package/dist/cjs/components/ExpandableText/index.js +1 -1
  31. package/dist/cjs/components/ExpandableText/index.js.map +2 -2
  32. package/dist/cjs/components/MaskedField/MaskedField.js +1 -1
  33. package/dist/cjs/components/MaskedField/MaskedField.js.map +2 -2
  34. package/dist/cjs/components/MaskedField/index.js +1 -1
  35. package/dist/cjs/components/MaskedField/index.js.map +2 -2
  36. package/dist/cjs/components/NumberField/NumberField.js +1 -1
  37. package/dist/cjs/components/NumberField/NumberField.js.map +2 -2
  38. package/dist/cjs/components/NumberField/index.js +1 -1
  39. package/dist/cjs/components/NumberField/index.js.map +2 -2
  40. package/dist/cjs/components/PasswordField/PasswordField.js +1 -1
  41. package/dist/cjs/components/PasswordField/PasswordField.js.map +2 -2
  42. package/dist/cjs/components/PasswordField/ShowHideButton.js +1 -1
  43. package/dist/cjs/components/PasswordField/ShowHideButton.js.map +2 -2
  44. package/dist/cjs/components/PasswordField/index.js +1 -1
  45. package/dist/cjs/components/PasswordField/index.js.map +2 -2
  46. package/dist/cjs/components/Radio/Radio.js +1 -1
  47. package/dist/cjs/components/Radio/Radio.js.map +2 -2
  48. package/dist/cjs/components/Radio/RadioGroup.js +1 -1
  49. package/dist/cjs/components/Radio/RadioGroup.js.map +2 -2
  50. package/dist/cjs/components/Radio/index.js +1 -1
  51. package/dist/cjs/components/Radio/index.js.map +2 -2
  52. package/dist/cjs/components/Select/Select.js +1 -1
  53. package/dist/cjs/components/Select/Select.js.map +2 -2
  54. package/dist/cjs/components/Select/index.js +1 -1
  55. package/dist/cjs/components/Select/index.js.map +2 -2
  56. package/dist/cjs/components/TextArea/TextArea.js +1 -1
  57. package/dist/cjs/components/TextArea/TextArea.js.map +2 -2
  58. package/dist/cjs/components/TextArea/index.js +1 -1
  59. package/dist/cjs/components/TextArea/index.js.map +2 -2
  60. package/dist/cjs/components/TextField/TextField.js +1 -1
  61. package/dist/cjs/components/TextField/TextField.js.map +2 -2
  62. package/dist/cjs/components/TextField/index.js +1 -1
  63. package/dist/cjs/components/TextField/index.js.map +2 -2
  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 +1 -1
  69. package/dist/cjs/components/index.js.map +2 -2
  70. package/dist/cjs/index.js +1 -1
  71. package/dist/cjs/index.js.map +2 -2
  72. package/dist/cjs/meta.json +106 -106
  73. package/dist/esm/{chunk-HPUPB75I.js → chunk-DYTHXKMX.js} +2 -2
  74. package/dist/esm/chunk-DYTHXKMX.js.map +7 -0
  75. package/dist/esm/{chunk-NRU3WNV7.js → chunk-JNAQ76CR.js} +2 -2
  76. package/dist/esm/{chunk-M7LTJZQU.js → chunk-W2RQH4WS.js} +2 -2
  77. package/dist/esm/components/AddressLookup/AddressLookup.js +3 -3
  78. package/dist/esm/components/AddressLookup/index.js +3 -3
  79. package/dist/esm/components/Alert/Alert.js +2 -2
  80. package/dist/esm/components/Alert/index.js +2 -2
  81. package/dist/esm/components/Checkbox/Checkbox.js +3 -3
  82. package/dist/esm/components/Checkbox/CheckboxGroup.js +3 -3
  83. package/dist/esm/components/Checkbox/index.js +3 -3
  84. package/dist/esm/components/Combobox/Combobox.js +3 -3
  85. package/dist/esm/components/Combobox/index.js +3 -3
  86. package/dist/esm/components/DateField/DateField.js +3 -3
  87. package/dist/esm/components/DateField/index.js +3 -3
  88. package/dist/esm/components/ErrorMessage/ErrorMessage.js +3 -3
  89. package/dist/esm/components/ErrorMessage/index.js +3 -3
  90. package/dist/esm/components/ExpandableText/ExpandableText.js +3 -3
  91. package/dist/esm/components/ExpandableText/index.js +3 -3
  92. package/dist/esm/components/MaskedField/MaskedField.js +3 -3
  93. package/dist/esm/components/MaskedField/index.js +3 -3
  94. package/dist/esm/components/NumberField/NumberField.js +3 -3
  95. package/dist/esm/components/NumberField/index.js +3 -3
  96. package/dist/esm/components/PasswordField/PasswordField.js +3 -3
  97. package/dist/esm/components/PasswordField/ShowHideButton.js +3 -3
  98. package/dist/esm/components/PasswordField/index.js +3 -3
  99. package/dist/esm/components/Radio/Radio.js +3 -3
  100. package/dist/esm/components/Radio/RadioGroup.js +3 -3
  101. package/dist/esm/components/Radio/index.js +3 -3
  102. package/dist/esm/components/Select/Select.js +3 -3
  103. package/dist/esm/components/Select/index.js +3 -3
  104. package/dist/esm/components/TextArea/TextArea.js +3 -3
  105. package/dist/esm/components/TextArea/index.js +3 -3
  106. package/dist/esm/components/TextField/TextField.js +3 -3
  107. package/dist/esm/components/TextField/index.js +3 -3
  108. package/dist/esm/components/TextOrHTML/TextOrHTML.js +1 -1
  109. package/dist/esm/components/TextOrHTML/index.js +1 -1
  110. package/dist/esm/components/index.js +3 -3
  111. package/dist/esm/index.js +3 -3
  112. package/dist/esm/meta.json +111 -111
  113. package/dist/tsconfig.build.tsbuildinfo +1 -1
  114. package/package.json +1 -1
  115. package/src/components/TextOrHTML/TextOrHTML.test.tsx +18 -0
  116. package/src/components/TextOrHTML/TextOrHTML.tsx +2 -1
  117. package/dist/esm/chunk-HPUPB75I.js.map +0 -7
  118. /package/dist/esm/{chunk-NRU3WNV7.js.map → chunk-JNAQ76CR.js.map} +0 -0
  119. /package/dist/esm/{chunk-M7LTJZQU.js.map → chunk-W2RQH4WS.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.2",
5
5
  "description": "Core library of Mobius react components",
6
6
  "repository": {
7
7
  "type": "git",
@@ -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
- }