@simplybusiness/mobius 10.0.0 → 10.1.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 (112) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/components/AddressLookup/AddressLookup.js +9 -4
  3. package/dist/cjs/components/AddressLookup/AddressLookup.js.map +2 -2
  4. package/dist/cjs/components/AddressLookup/index.js +9 -4
  5. package/dist/cjs/components/AddressLookup/index.js.map +2 -2
  6. package/dist/cjs/components/Checkbox/Checkbox.js +9 -4
  7. package/dist/cjs/components/Checkbox/Checkbox.js.map +2 -2
  8. package/dist/cjs/components/Checkbox/CheckboxGroup.js +9 -4
  9. package/dist/cjs/components/Checkbox/CheckboxGroup.js.map +2 -2
  10. package/dist/cjs/components/Checkbox/index.js +9 -4
  11. package/dist/cjs/components/Checkbox/index.js.map +2 -2
  12. package/dist/cjs/components/Combobox/Combobox.js +9 -4
  13. package/dist/cjs/components/Combobox/Combobox.js.map +2 -2
  14. package/dist/cjs/components/Combobox/index.js +9 -4
  15. package/dist/cjs/components/Combobox/index.js.map +2 -2
  16. package/dist/cjs/components/DateField/DateField.js +9 -4
  17. package/dist/cjs/components/DateField/DateField.js.map +2 -2
  18. package/dist/cjs/components/DateField/index.js +9 -4
  19. package/dist/cjs/components/DateField/index.js.map +2 -2
  20. package/dist/cjs/components/ErrorMessage/ErrorMessage.js +9 -4
  21. package/dist/cjs/components/ErrorMessage/ErrorMessage.js.map +2 -2
  22. package/dist/cjs/components/ErrorMessage/index.js +9 -4
  23. package/dist/cjs/components/ErrorMessage/index.js.map +2 -2
  24. package/dist/cjs/components/ExpandableText/ExpandableText.js +9 -4
  25. package/dist/cjs/components/ExpandableText/ExpandableText.js.map +2 -2
  26. package/dist/cjs/components/ExpandableText/index.js +9 -4
  27. package/dist/cjs/components/ExpandableText/index.js.map +2 -2
  28. package/dist/cjs/components/MaskedField/MaskedField.js +9 -4
  29. package/dist/cjs/components/MaskedField/MaskedField.js.map +2 -2
  30. package/dist/cjs/components/MaskedField/index.js +9 -4
  31. package/dist/cjs/components/MaskedField/index.js.map +2 -2
  32. package/dist/cjs/components/NumberField/NumberField.js +9 -4
  33. package/dist/cjs/components/NumberField/NumberField.js.map +2 -2
  34. package/dist/cjs/components/NumberField/index.js +9 -4
  35. package/dist/cjs/components/NumberField/index.js.map +2 -2
  36. package/dist/cjs/components/PasswordField/PasswordField.js +9 -4
  37. package/dist/cjs/components/PasswordField/PasswordField.js.map +2 -2
  38. package/dist/cjs/components/PasswordField/ShowHideButton.js +9 -4
  39. package/dist/cjs/components/PasswordField/ShowHideButton.js.map +2 -2
  40. package/dist/cjs/components/PasswordField/index.js +9 -4
  41. package/dist/cjs/components/PasswordField/index.js.map +2 -2
  42. package/dist/cjs/components/Radio/Radio.js +9 -4
  43. package/dist/cjs/components/Radio/Radio.js.map +2 -2
  44. package/dist/cjs/components/Radio/RadioGroup.js +9 -4
  45. package/dist/cjs/components/Radio/RadioGroup.js.map +2 -2
  46. package/dist/cjs/components/Radio/index.js +9 -4
  47. package/dist/cjs/components/Radio/index.js.map +2 -2
  48. package/dist/cjs/components/Select/Select.js +9 -4
  49. package/dist/cjs/components/Select/Select.js.map +2 -2
  50. package/dist/cjs/components/Select/index.js +9 -4
  51. package/dist/cjs/components/Select/index.js.map +2 -2
  52. package/dist/cjs/components/TextArea/TextArea.js +9 -4
  53. package/dist/cjs/components/TextArea/TextArea.js.map +2 -2
  54. package/dist/cjs/components/TextArea/index.js +9 -4
  55. package/dist/cjs/components/TextArea/index.js.map +2 -2
  56. package/dist/cjs/components/TextField/TextField.js +9 -4
  57. package/dist/cjs/components/TextField/TextField.js.map +2 -2
  58. package/dist/cjs/components/TextField/index.js +9 -4
  59. package/dist/cjs/components/TextField/index.js.map +2 -2
  60. package/dist/cjs/components/TextOrHTML/TextOrHTML.js +8 -3
  61. package/dist/cjs/components/TextOrHTML/TextOrHTML.js.map +2 -2
  62. package/dist/cjs/components/TextOrHTML/index.js +8 -3
  63. package/dist/cjs/components/TextOrHTML/index.js.map +2 -2
  64. package/dist/cjs/components/index.js +9 -4
  65. package/dist/cjs/components/index.js.map +2 -2
  66. package/dist/cjs/index.js +9 -4
  67. package/dist/cjs/index.js.map +2 -2
  68. package/dist/cjs/meta.json +100 -100
  69. package/dist/esm/{chunk-ZU3XMAWQ.js → chunk-C4BILMFX.js} +2 -2
  70. package/dist/esm/{chunk-HHJ4Y5JQ.js → chunk-QRHDVVRK.js} +9 -4
  71. package/dist/esm/chunk-QRHDVVRK.js.map +7 -0
  72. package/dist/esm/components/AddressLookup/AddressLookup.js +2 -2
  73. package/dist/esm/components/AddressLookup/index.js +2 -2
  74. package/dist/esm/components/Checkbox/Checkbox.js +2 -2
  75. package/dist/esm/components/Checkbox/CheckboxGroup.js +2 -2
  76. package/dist/esm/components/Checkbox/index.js +2 -2
  77. package/dist/esm/components/Combobox/Combobox.js +2 -2
  78. package/dist/esm/components/Combobox/index.js +2 -2
  79. package/dist/esm/components/DateField/DateField.js +2 -2
  80. package/dist/esm/components/DateField/index.js +2 -2
  81. package/dist/esm/components/ErrorMessage/ErrorMessage.js +2 -2
  82. package/dist/esm/components/ErrorMessage/index.js +2 -2
  83. package/dist/esm/components/ExpandableText/ExpandableText.js +2 -2
  84. package/dist/esm/components/ExpandableText/index.js +2 -2
  85. package/dist/esm/components/MaskedField/MaskedField.js +2 -2
  86. package/dist/esm/components/MaskedField/index.js +2 -2
  87. package/dist/esm/components/NumberField/NumberField.js +2 -2
  88. package/dist/esm/components/NumberField/index.js +2 -2
  89. package/dist/esm/components/PasswordField/PasswordField.js +2 -2
  90. package/dist/esm/components/PasswordField/ShowHideButton.js +2 -2
  91. package/dist/esm/components/PasswordField/index.js +2 -2
  92. package/dist/esm/components/Radio/Radio.js +2 -2
  93. package/dist/esm/components/Radio/RadioGroup.js +2 -2
  94. package/dist/esm/components/Radio/index.js +2 -2
  95. package/dist/esm/components/Select/Select.js +2 -2
  96. package/dist/esm/components/Select/index.js +2 -2
  97. package/dist/esm/components/TextArea/TextArea.js +2 -2
  98. package/dist/esm/components/TextArea/index.js +2 -2
  99. package/dist/esm/components/TextField/TextField.js +2 -2
  100. package/dist/esm/components/TextField/index.js +2 -2
  101. package/dist/esm/components/TextOrHTML/TextOrHTML.js +1 -1
  102. package/dist/esm/components/TextOrHTML/index.js +1 -1
  103. package/dist/esm/components/index.js +2 -2
  104. package/dist/esm/index.js +2 -2
  105. package/dist/esm/meta.json +73 -73
  106. package/dist/tsconfig.build.tsbuildinfo +1 -1
  107. package/dist/types/components/TextOrHTML/TextOrHTML.d.ts +3 -1
  108. package/package.json +1 -1
  109. package/src/components/TextOrHTML/TextOrHTML.test.tsx +95 -0
  110. package/src/components/TextOrHTML/TextOrHTML.tsx +13 -3
  111. package/dist/esm/chunk-HHJ4Y5JQ.js.map +0 -7
  112. /package/dist/esm/{chunk-ZU3XMAWQ.js.map → chunk-C4BILMFX.js.map} +0 -0
@@ -62,15 +62,20 @@ Text.displayName = "Text";
62
62
 
63
63
  // src/components/TextOrHTML/TextOrHTML.tsx
64
64
  var import_jsx_runtime2 = require("react/jsx-runtime");
65
+ var isHTML = (text) => /^\s*<[a-z]/i.test(text);
65
66
  var TextOrHTML = ({
66
67
  ref,
67
68
  text,
68
69
  htmlClassName,
69
- htmlElementType = "span",
70
+ htmlElementType,
70
71
  textWrapper = false,
72
+ autoDetect = false,
71
73
  ...textProps
72
74
  }) => {
73
- const DangerousComponent = htmlElementType;
75
+ const textIsHTML = autoDetect && isHTML(text);
76
+ const shouldWrapInText = autoDetect ? textWrapper || !textIsHTML : textWrapper;
77
+ const resolvedElementType = htmlElementType ?? (textIsHTML ? "div" : "span");
78
+ const DangerousComponent = resolvedElementType;
74
79
  const dangerousHTML = (0, import_react.useMemo)(() => ({ __html: text }), [text]);
75
80
  const dangerousElement = /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
76
81
  DangerousComponent,
@@ -79,7 +84,7 @@ var TextOrHTML = ({
79
84
  dangerouslySetInnerHTML: dangerousHTML
80
85
  }
81
86
  );
82
- if (textWrapper) {
87
+ if (shouldWrapInText) {
83
88
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { ref, ...textProps, children: dangerousElement });
84
89
  }
85
90
  return dangerousElement;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/TextOrHTML/TextOrHTML.tsx", "../../../../src/components/Text/Text.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\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}\n\nconst TextOrHTML = ({\n ref,\n text,\n htmlClassName,\n htmlElementType = \"span\",\n textWrapper = false,\n ...textProps\n}: TextOrHTMLProps) => {\n const DangerousComponent = htmlElementType;\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 (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", "import type { ReactNode, RefAttributes } from \"react\";\nimport classNames from \"classnames/dedupe\";\nimport type { DOMProps } from \"../../types/dom\";\nimport \"./Text.css\";\n\nexport type TextElementType = HTMLHeadingElement | HTMLParagraphElement;\nexport type TextVariantType =\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"body\"\n | \"small\"\n | \"legal\"\n | \"title\";\nexport type ElementType = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"p\" | \"span\";\nexport interface TextProps extends DOMProps, RefAttributes<TextElementType> {\n /** HTML element for the text */\n elementType?: ElementType;\n /** Specify font size override */\n variant?: TextVariantType;\n /** Specify compact line height override */\n spacing?: \"loose\" | \"tight\";\n /** Custom class name for setting specific CSS */\n className?: string;\n children: ReactNode;\n style?: React.CSSProperties;\n}\n\nconst getElementType = (\n variant: TextVariantType | undefined,\n elementType: ElementType | undefined,\n) => {\n if (variant) {\n return [\"h1\", \"h2\", \"h3\", \"h4\"].includes(variant) ? variant : \"p\";\n }\n return elementType || \"p\";\n};\n\nconst Text = ({ ref, elementType: Component = \"p\", ...props }: TextProps) => {\n // Remove non-DOM props from element\n const { variant, className, spacing, ...otherProps } = props;\n\n // If a variant is supplied, set the class name and element type\n const elementType = getElementType(variant, Component);\n const variantType = variant || elementType;\n const classes = classNames(\n \"mobius\",\n \"mobius-text\",\n { [`--is-${variantType}`]: variantType },\n { [`--has-line-height-${spacing}`]: spacing },\n className,\n );\n\n return <Component ref={ref} {...otherProps} className={classes} />;\n};\n\nText.displayName = \"Text\";\nexport { Text };\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAwB;;;ACAxB,oBAAuB;AAEvB,kBAAO;AAmDE;AAzBT,IAAM,iBAAiB,CACrB,SACA,gBACG;AACH,MAAI,SAAS;AACX,WAAO,CAAC,MAAM,MAAM,MAAM,IAAI,EAAE,SAAS,OAAO,IAAI,UAAU;AAAA,EAChE;AACA,SAAO,eAAe;AACxB;AAEA,IAAM,OAAO,CAAC,EAAE,KAAK,aAAa,YAAY,KAAK,GAAG,MAAM,MAAiB;AAE3E,QAAM,EAAE,SAAS,WAAW,SAAS,GAAG,WAAW,IAAI;AAGvD,QAAM,cAAc,eAAe,SAAS,SAAS;AACrD,QAAM,cAAc,WAAW;AAC/B,QAAM,cAAU,cAAAA;AAAA,IACd;AAAA,IACA;AAAA,IACA,EAAE,CAAC,QAAQ,WAAW,EAAE,GAAG,YAAY;AAAA,IACvC,EAAE,CAAC,qBAAqB,OAAO,EAAE,GAAG,QAAQ;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO,4CAAC,aAAU,KAAW,GAAG,YAAY,WAAW,SAAS;AAClE;AAEA,KAAK,cAAc;;;ADvBf,IAAAC,sBAAA;AAfJ,IAAM,aAAa,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,GAAG;AACL,MAAuB;AACrB,QAAM,qBAAqB;AAI3B,QAAM,oBAAgB,sBAAQ,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,aAAa;AACf,WACE,6CAAC,QAAK,KAAW,GAAG,WACjB,4BACH;AAAA,EAEJ;AAEA,SAAO;AACT;AAEA,WAAW,cAAc;",
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", "import type { ReactNode, RefAttributes } from \"react\";\nimport classNames from \"classnames/dedupe\";\nimport type { DOMProps } from \"../../types/dom\";\nimport \"./Text.css\";\n\nexport type TextElementType = HTMLHeadingElement | HTMLParagraphElement;\nexport type TextVariantType =\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"body\"\n | \"small\"\n | \"legal\"\n | \"title\";\nexport type ElementType = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"p\" | \"span\";\nexport interface TextProps extends DOMProps, RefAttributes<TextElementType> {\n /** HTML element for the text */\n elementType?: ElementType;\n /** Specify font size override */\n variant?: TextVariantType;\n /** Specify compact line height override */\n spacing?: \"loose\" | \"tight\";\n /** Custom class name for setting specific CSS */\n className?: string;\n children: ReactNode;\n style?: React.CSSProperties;\n}\n\nconst getElementType = (\n variant: TextVariantType | undefined,\n elementType: ElementType | undefined,\n) => {\n if (variant) {\n return [\"h1\", \"h2\", \"h3\", \"h4\"].includes(variant) ? variant : \"p\";\n }\n return elementType || \"p\";\n};\n\nconst Text = ({ ref, elementType: Component = \"p\", ...props }: TextProps) => {\n // Remove non-DOM props from element\n const { variant, className, spacing, ...otherProps } = props;\n\n // If a variant is supplied, set the class name and element type\n const elementType = getElementType(variant, Component);\n const variantType = variant || elementType;\n const classes = classNames(\n \"mobius\",\n \"mobius-text\",\n { [`--is-${variantType}`]: variantType },\n { [`--has-line-height-${spacing}`]: spacing },\n className,\n );\n\n return <Component ref={ref} {...otherProps} className={classes} />;\n};\n\nText.displayName = \"Text\";\nexport { Text };\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAwB;;;ACAxB,oBAAuB;AAEvB,kBAAO;AAmDE;AAzBT,IAAM,iBAAiB,CACrB,SACA,gBACG;AACH,MAAI,SAAS;AACX,WAAO,CAAC,MAAM,MAAM,MAAM,IAAI,EAAE,SAAS,OAAO,IAAI,UAAU;AAAA,EAChE;AACA,SAAO,eAAe;AACxB;AAEA,IAAM,OAAO,CAAC,EAAE,KAAK,aAAa,YAAY,KAAK,GAAG,MAAM,MAAiB;AAE3E,QAAM,EAAE,SAAS,WAAW,SAAS,GAAG,WAAW,IAAI;AAGvD,QAAM,cAAc,eAAe,SAAS,SAAS;AACrD,QAAM,cAAc,WAAW;AAC/B,QAAM,cAAU,cAAAA;AAAA,IACd;AAAA,IACA;AAAA,IACA,EAAE,CAAC,QAAQ,WAAW,EAAE,GAAG,YAAY;AAAA,IACvC,EAAE,CAAC,qBAAqB,OAAO,EAAE,GAAG,QAAQ;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO,4CAAC,aAAU,KAAW,GAAG,YAAY,WAAW,SAAS;AAClE;AAEA,KAAK,cAAc;;;ADbf,IAAAC,sBAAA;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,oBAAgB,sBAAQ,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,6CAAC,QAAK,KAAW,GAAG,WACjB,4BACH;AAAA,EAEJ;AAEA,SAAO;AACT;AAEA,WAAW,cAAc;",
6
6
  "names": ["classNames", "import_jsx_runtime"]
7
7
  }
@@ -64,15 +64,20 @@ Text.displayName = "Text";
64
64
 
65
65
  // src/components/TextOrHTML/TextOrHTML.tsx
66
66
  var import_jsx_runtime2 = require("react/jsx-runtime");
67
+ var isHTML = (text) => /^\s*<[a-z]/i.test(text);
67
68
  var TextOrHTML = ({
68
69
  ref,
69
70
  text,
70
71
  htmlClassName,
71
- htmlElementType = "span",
72
+ htmlElementType,
72
73
  textWrapper = false,
74
+ autoDetect = false,
73
75
  ...textProps
74
76
  }) => {
75
- const DangerousComponent = htmlElementType;
77
+ const textIsHTML = autoDetect && isHTML(text);
78
+ const shouldWrapInText = autoDetect ? textWrapper || !textIsHTML : textWrapper;
79
+ const resolvedElementType = htmlElementType ?? (textIsHTML ? "div" : "span");
80
+ const DangerousComponent = resolvedElementType;
76
81
  const dangerousHTML = (0, import_react.useMemo)(() => ({ __html: text }), [text]);
77
82
  const dangerousElement = /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
78
83
  DangerousComponent,
@@ -81,7 +86,7 @@ var TextOrHTML = ({
81
86
  dangerouslySetInnerHTML: dangerousHTML
82
87
  }
83
88
  );
84
- if (textWrapper) {
89
+ if (shouldWrapInText) {
85
90
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { ref, ...textProps, children: dangerousElement });
86
91
  }
87
92
  return dangerousElement;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/TextOrHTML/index.tsx", "../../../../src/components/TextOrHTML/TextOrHTML.tsx", "../../../../src/components/Text/Text.tsx"],
4
- "sourcesContent": ["export * from \"./TextOrHTML\";\n", "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\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}\n\nconst TextOrHTML = ({\n ref,\n text,\n htmlClassName,\n htmlElementType = \"span\",\n textWrapper = false,\n ...textProps\n}: TextOrHTMLProps) => {\n const DangerousComponent = htmlElementType;\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 (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", "import type { ReactNode, RefAttributes } from \"react\";\nimport classNames from \"classnames/dedupe\";\nimport type { DOMProps } from \"../../types/dom\";\nimport \"./Text.css\";\n\nexport type TextElementType = HTMLHeadingElement | HTMLParagraphElement;\nexport type TextVariantType =\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"body\"\n | \"small\"\n | \"legal\"\n | \"title\";\nexport type ElementType = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"p\" | \"span\";\nexport interface TextProps extends DOMProps, RefAttributes<TextElementType> {\n /** HTML element for the text */\n elementType?: ElementType;\n /** Specify font size override */\n variant?: TextVariantType;\n /** Specify compact line height override */\n spacing?: \"loose\" | \"tight\";\n /** Custom class name for setting specific CSS */\n className?: string;\n children: ReactNode;\n style?: React.CSSProperties;\n}\n\nconst getElementType = (\n variant: TextVariantType | undefined,\n elementType: ElementType | undefined,\n) => {\n if (variant) {\n return [\"h1\", \"h2\", \"h3\", \"h4\"].includes(variant) ? variant : \"p\";\n }\n return elementType || \"p\";\n};\n\nconst Text = ({ ref, elementType: Component = \"p\", ...props }: TextProps) => {\n // Remove non-DOM props from element\n const { variant, className, spacing, ...otherProps } = props;\n\n // If a variant is supplied, set the class name and element type\n const elementType = getElementType(variant, Component);\n const variantType = variant || elementType;\n const classes = classNames(\n \"mobius\",\n \"mobius-text\",\n { [`--is-${variantType}`]: variantType },\n { [`--has-line-height-${spacing}`]: spacing },\n className,\n );\n\n return <Component ref={ref} {...otherProps} className={classes} />;\n};\n\nText.displayName = \"Text\";\nexport { Text };\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,mBAAwB;;;ACAxB,oBAAuB;AAEvB,kBAAO;AAmDE;AAzBT,IAAM,iBAAiB,CACrB,SACA,gBACG;AACH,MAAI,SAAS;AACX,WAAO,CAAC,MAAM,MAAM,MAAM,IAAI,EAAE,SAAS,OAAO,IAAI,UAAU;AAAA,EAChE;AACA,SAAO,eAAe;AACxB;AAEA,IAAM,OAAO,CAAC,EAAE,KAAK,aAAa,YAAY,KAAK,GAAG,MAAM,MAAiB;AAE3E,QAAM,EAAE,SAAS,WAAW,SAAS,GAAG,WAAW,IAAI;AAGvD,QAAM,cAAc,eAAe,SAAS,SAAS;AACrD,QAAM,cAAc,WAAW;AAC/B,QAAM,cAAU,cAAAA;AAAA,IACd;AAAA,IACA;AAAA,IACA,EAAE,CAAC,QAAQ,WAAW,EAAE,GAAG,YAAY;AAAA,IACvC,EAAE,CAAC,qBAAqB,OAAO,EAAE,GAAG,QAAQ;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO,4CAAC,aAAU,KAAW,GAAG,YAAY,WAAW,SAAS;AAClE;AAEA,KAAK,cAAc;;;ADvBf,IAAAC,sBAAA;AAfJ,IAAM,aAAa,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,GAAG;AACL,MAAuB;AACrB,QAAM,qBAAqB;AAI3B,QAAM,oBAAgB,sBAAQ,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,aAAa;AACf,WACE,6CAAC,QAAK,KAAW,GAAG,WACjB,4BACH;AAAA,EAEJ;AAEA,SAAO;AACT;AAEA,WAAW,cAAc;",
4
+ "sourcesContent": ["export * from \"./TextOrHTML\";\n", "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", "import type { ReactNode, RefAttributes } from \"react\";\nimport classNames from \"classnames/dedupe\";\nimport type { DOMProps } from \"../../types/dom\";\nimport \"./Text.css\";\n\nexport type TextElementType = HTMLHeadingElement | HTMLParagraphElement;\nexport type TextVariantType =\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"body\"\n | \"small\"\n | \"legal\"\n | \"title\";\nexport type ElementType = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"p\" | \"span\";\nexport interface TextProps extends DOMProps, RefAttributes<TextElementType> {\n /** HTML element for the text */\n elementType?: ElementType;\n /** Specify font size override */\n variant?: TextVariantType;\n /** Specify compact line height override */\n spacing?: \"loose\" | \"tight\";\n /** Custom class name for setting specific CSS */\n className?: string;\n children: ReactNode;\n style?: React.CSSProperties;\n}\n\nconst getElementType = (\n variant: TextVariantType | undefined,\n elementType: ElementType | undefined,\n) => {\n if (variant) {\n return [\"h1\", \"h2\", \"h3\", \"h4\"].includes(variant) ? variant : \"p\";\n }\n return elementType || \"p\";\n};\n\nconst Text = ({ ref, elementType: Component = \"p\", ...props }: TextProps) => {\n // Remove non-DOM props from element\n const { variant, className, spacing, ...otherProps } = props;\n\n // If a variant is supplied, set the class name and element type\n const elementType = getElementType(variant, Component);\n const variantType = variant || elementType;\n const classes = classNames(\n \"mobius\",\n \"mobius-text\",\n { [`--is-${variantType}`]: variantType },\n { [`--has-line-height-${spacing}`]: spacing },\n className,\n );\n\n return <Component ref={ref} {...otherProps} className={classes} />;\n};\n\nText.displayName = \"Text\";\nexport { Text };\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,mBAAwB;;;ACAxB,oBAAuB;AAEvB,kBAAO;AAmDE;AAzBT,IAAM,iBAAiB,CACrB,SACA,gBACG;AACH,MAAI,SAAS;AACX,WAAO,CAAC,MAAM,MAAM,MAAM,IAAI,EAAE,SAAS,OAAO,IAAI,UAAU;AAAA,EAChE;AACA,SAAO,eAAe;AACxB;AAEA,IAAM,OAAO,CAAC,EAAE,KAAK,aAAa,YAAY,KAAK,GAAG,MAAM,MAAiB;AAE3E,QAAM,EAAE,SAAS,WAAW,SAAS,GAAG,WAAW,IAAI;AAGvD,QAAM,cAAc,eAAe,SAAS,SAAS;AACrD,QAAM,cAAc,WAAW;AAC/B,QAAM,cAAU,cAAAA;AAAA,IACd;AAAA,IACA;AAAA,IACA,EAAE,CAAC,QAAQ,WAAW,EAAE,GAAG,YAAY;AAAA,IACvC,EAAE,CAAC,qBAAqB,OAAO,EAAE,GAAG,QAAQ;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO,4CAAC,aAAU,KAAW,GAAG,YAAY,WAAW,SAAS;AAClE;AAEA,KAAK,cAAc;;;ADbf,IAAAC,sBAAA;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,oBAAgB,sBAAQ,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,6CAAC,QAAK,KAAW,GAAG,WACjB,4BACH;AAAA,EAEJ;AAEA,SAAO;AACT;AAEA,WAAW,cAAc;",
6
6
  "names": ["classNames", "import_jsx_runtime"]
7
7
  }
@@ -5515,22 +5515,27 @@ var init_TextArea2 = __esm({
5515
5515
  });
5516
5516
 
5517
5517
  // src/components/TextOrHTML/TextOrHTML.tsx
5518
- var import_react43, import_jsx_runtime69, TextOrHTML;
5518
+ var import_react43, import_jsx_runtime69, isHTML, TextOrHTML;
5519
5519
  var init_TextOrHTML = __esm({
5520
5520
  "src/components/TextOrHTML/TextOrHTML.tsx"() {
5521
5521
  "use strict";
5522
5522
  import_react43 = require("react");
5523
5523
  init_Text();
5524
5524
  import_jsx_runtime69 = require("react/jsx-runtime");
5525
+ isHTML = (text) => /^\s*<[a-z]/i.test(text);
5525
5526
  TextOrHTML = ({
5526
5527
  ref,
5527
5528
  text,
5528
5529
  htmlClassName,
5529
- htmlElementType = "span",
5530
+ htmlElementType,
5530
5531
  textWrapper = false,
5532
+ autoDetect = false,
5531
5533
  ...textProps
5532
5534
  }) => {
5533
- const DangerousComponent = htmlElementType;
5535
+ const textIsHTML = autoDetect && isHTML(text);
5536
+ const shouldWrapInText = autoDetect ? textWrapper || !textIsHTML : textWrapper;
5537
+ const resolvedElementType = htmlElementType ?? (textIsHTML ? "div" : "span");
5538
+ const DangerousComponent = resolvedElementType;
5534
5539
  const dangerousHTML = (0, import_react43.useMemo)(() => ({ __html: text }), [text]);
5535
5540
  const dangerousElement = /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
5536
5541
  DangerousComponent,
@@ -5539,7 +5544,7 @@ var init_TextOrHTML = __esm({
5539
5544
  dangerouslySetInnerHTML: dangerousHTML
5540
5545
  }
5541
5546
  );
5542
- if (textWrapper) {
5547
+ if (shouldWrapInText) {
5543
5548
  return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Text, { ref, ...textProps, children: dangerousElement });
5544
5549
  }
5545
5550
  return dangerousElement;