@simplybusiness/mobius 10.3.4 → 10.4.1

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 (159) hide show
  1. package/CHANGELOG.md +12 -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/Modal/Modal.js +6 -0
  37. package/dist/cjs/components/Modal/Modal.js.map +2 -2
  38. package/dist/cjs/components/Modal/index.js +6 -0
  39. package/dist/cjs/components/Modal/index.js.map +2 -2
  40. package/dist/cjs/components/Modal/types.js.map +1 -1
  41. package/dist/cjs/components/NumberField/NumberField.js +5 -4
  42. package/dist/cjs/components/NumberField/NumberField.js.map +2 -2
  43. package/dist/cjs/components/NumberField/index.js +5 -4
  44. package/dist/cjs/components/NumberField/index.js.map +2 -2
  45. package/dist/cjs/components/PasswordField/PasswordField.js +5 -4
  46. package/dist/cjs/components/PasswordField/PasswordField.js.map +2 -2
  47. package/dist/cjs/components/PasswordField/index.js +5 -4
  48. package/dist/cjs/components/PasswordField/index.js.map +2 -2
  49. package/dist/cjs/components/Radio/Radio.js +5 -4
  50. package/dist/cjs/components/Radio/Radio.js.map +2 -2
  51. package/dist/cjs/components/Radio/RadioGroup.js +5 -4
  52. package/dist/cjs/components/Radio/RadioGroup.js.map +2 -2
  53. package/dist/cjs/components/Radio/index.js +5 -4
  54. package/dist/cjs/components/Radio/index.js.map +2 -2
  55. package/dist/cjs/components/Select/Select.js +5 -4
  56. package/dist/cjs/components/Select/Select.js.map +2 -2
  57. package/dist/cjs/components/Select/index.js +5 -4
  58. package/dist/cjs/components/Select/index.js.map +2 -2
  59. package/dist/cjs/components/TextArea/TextArea.js +5 -4
  60. package/dist/cjs/components/TextArea/TextArea.js.map +2 -2
  61. package/dist/cjs/components/TextArea/index.js +5 -4
  62. package/dist/cjs/components/TextArea/index.js.map +2 -2
  63. package/dist/cjs/components/TextField/TextField.js +5 -4
  64. package/dist/cjs/components/TextField/TextField.js.map +2 -2
  65. package/dist/cjs/components/TextField/index.js +5 -4
  66. package/dist/cjs/components/TextField/index.js.map +2 -2
  67. package/dist/cjs/components/TextOrHTML/TextOrHTML.js +5 -4
  68. package/dist/cjs/components/TextOrHTML/TextOrHTML.js.map +2 -2
  69. package/dist/cjs/components/TextOrHTML/index.js +5 -4
  70. package/dist/cjs/components/TextOrHTML/index.js.map +2 -2
  71. package/dist/cjs/components/index.js +12 -5
  72. package/dist/cjs/components/index.js.map +2 -2
  73. package/dist/cjs/index.js +12 -5
  74. package/dist/cjs/index.js.map +2 -2
  75. package/dist/cjs/meta.json +114 -114
  76. package/dist/esm/{chunk-4WVJNNBK.js → chunk-2HUMNED2.js} +2 -2
  77. package/dist/esm/{chunk-N4WQ6522.js → chunk-2VEO5SSY.js} +2 -2
  78. package/dist/esm/{chunk-AFU7BFCD.js → chunk-576SEJGC.js} +3 -3
  79. package/dist/esm/{chunk-QPIA6BGW.js → chunk-6JCU4CGA.js} +2 -2
  80. package/dist/esm/{chunk-X6EPYQKX.js → chunk-F5ELD54X.js} +2 -2
  81. package/dist/esm/{chunk-ZN5TRIVZ.js → chunk-GV36OVX7.js} +2 -2
  82. package/dist/esm/{chunk-JNAQ76CR.js → chunk-HGNWNZ5E.js} +2 -2
  83. package/dist/esm/{chunk-ONDOONBM.js → chunk-HUSMC5GZ.js} +2 -2
  84. package/dist/esm/{chunk-UIIXVY6K.js → chunk-IQKS662C.js} +2 -2
  85. package/dist/esm/{chunk-KXLTGNKF.js → chunk-JJUTS5ET.js} +7 -1
  86. package/dist/esm/chunk-JJUTS5ET.js.map +7 -0
  87. package/dist/esm/{chunk-DYTHXKMX.js → chunk-KTJCAQT4.js} +6 -5
  88. package/dist/esm/chunk-KTJCAQT4.js.map +7 -0
  89. package/dist/esm/{chunk-5OFXPT4J.js → chunk-M62U4QGQ.js} +2 -2
  90. package/dist/esm/{chunk-UQVAEWY2.js → chunk-MZJT3USG.js} +2 -2
  91. package/dist/esm/{chunk-FKTDL7KO.js → chunk-OAG5T7NC.js} +2 -2
  92. package/dist/esm/{chunk-M2NDSQR5.js → chunk-P6YHEIFT.js} +2 -2
  93. package/dist/esm/{chunk-DZVBN6ZI.js → chunk-PEEQNAIN.js} +2 -2
  94. package/dist/esm/{chunk-P5VEI574.js → chunk-S4CU4XRB.js} +2 -2
  95. package/dist/esm/{chunk-4NBLO5WK.js → chunk-X4CMSAET.js} +2 -2
  96. package/dist/esm/{chunk-KQZ3MNK5.js → chunk-XNEQHHNV.js} +2 -2
  97. package/dist/esm/components/AddressLookup/AddressLookup.js +5 -5
  98. package/dist/esm/components/AddressLookup/index.js +5 -5
  99. package/dist/esm/components/Alert/Alert.js +2 -2
  100. package/dist/esm/components/Alert/index.js +2 -2
  101. package/dist/esm/components/Checkbox/Checkbox.js +3 -3
  102. package/dist/esm/components/Checkbox/CheckboxGroup.js +4 -4
  103. package/dist/esm/components/Checkbox/index.js +4 -4
  104. package/dist/esm/components/Combobox/Combobox.js +4 -4
  105. package/dist/esm/components/Combobox/index.js +4 -4
  106. package/dist/esm/components/DateField/DateField.js +4 -4
  107. package/dist/esm/components/DateField/index.js +4 -4
  108. package/dist/esm/components/ErrorMessage/ErrorMessage.js +2 -2
  109. package/dist/esm/components/ErrorMessage/index.js +2 -2
  110. package/dist/esm/components/ExpandableText/ExpandableText.js +2 -2
  111. package/dist/esm/components/ExpandableText/index.js +2 -2
  112. package/dist/esm/components/MaskedField/MaskedField.js +3 -3
  113. package/dist/esm/components/MaskedField/index.js +4 -4
  114. package/dist/esm/components/Modal/Modal.js +1 -1
  115. package/dist/esm/components/Modal/index.js +2 -2
  116. package/dist/esm/components/NumberField/NumberField.js +4 -4
  117. package/dist/esm/components/NumberField/index.js +4 -4
  118. package/dist/esm/components/PasswordField/PasswordField.js +4 -4
  119. package/dist/esm/components/PasswordField/index.js +4 -4
  120. package/dist/esm/components/Radio/Radio.js +3 -3
  121. package/dist/esm/components/Radio/RadioGroup.js +3 -3
  122. package/dist/esm/components/Radio/index.js +4 -4
  123. package/dist/esm/components/Select/Select.js +3 -3
  124. package/dist/esm/components/Select/index.js +3 -3
  125. package/dist/esm/components/TextArea/TextArea.js +3 -3
  126. package/dist/esm/components/TextArea/index.js +3 -3
  127. package/dist/esm/components/TextField/TextField.js +3 -3
  128. package/dist/esm/components/TextField/index.js +3 -3
  129. package/dist/esm/components/TextOrHTML/TextOrHTML.js +1 -1
  130. package/dist/esm/components/TextOrHTML/index.js +1 -1
  131. package/dist/esm/components/index.js +19 -19
  132. package/dist/esm/index.js +19 -19
  133. package/dist/esm/meta.json +208 -208
  134. package/dist/tsconfig.build.tsbuildinfo +1 -1
  135. package/dist/types/components/Modal/types.d.ts +1 -0
  136. package/package.json +1 -1
  137. package/src/components/Modal/Modal.tsx +6 -0
  138. package/src/components/Modal/types.ts +1 -0
  139. package/src/components/TextOrHTML/TextOrHTML.test.tsx +45 -8
  140. package/src/components/TextOrHTML/TextOrHTML.tsx +7 -4
  141. package/dist/esm/chunk-DYTHXKMX.js.map +0 -7
  142. package/dist/esm/chunk-KXLTGNKF.js.map +0 -7
  143. /package/dist/esm/{chunk-4WVJNNBK.js.map → chunk-2HUMNED2.js.map} +0 -0
  144. /package/dist/esm/{chunk-N4WQ6522.js.map → chunk-2VEO5SSY.js.map} +0 -0
  145. /package/dist/esm/{chunk-AFU7BFCD.js.map → chunk-576SEJGC.js.map} +0 -0
  146. /package/dist/esm/{chunk-QPIA6BGW.js.map → chunk-6JCU4CGA.js.map} +0 -0
  147. /package/dist/esm/{chunk-X6EPYQKX.js.map → chunk-F5ELD54X.js.map} +0 -0
  148. /package/dist/esm/{chunk-ZN5TRIVZ.js.map → chunk-GV36OVX7.js.map} +0 -0
  149. /package/dist/esm/{chunk-JNAQ76CR.js.map → chunk-HGNWNZ5E.js.map} +0 -0
  150. /package/dist/esm/{chunk-ONDOONBM.js.map → chunk-HUSMC5GZ.js.map} +0 -0
  151. /package/dist/esm/{chunk-UIIXVY6K.js.map → chunk-IQKS662C.js.map} +0 -0
  152. /package/dist/esm/{chunk-5OFXPT4J.js.map → chunk-M62U4QGQ.js.map} +0 -0
  153. /package/dist/esm/{chunk-UQVAEWY2.js.map → chunk-MZJT3USG.js.map} +0 -0
  154. /package/dist/esm/{chunk-FKTDL7KO.js.map → chunk-OAG5T7NC.js.map} +0 -0
  155. /package/dist/esm/{chunk-M2NDSQR5.js.map → chunk-P6YHEIFT.js.map} +0 -0
  156. /package/dist/esm/{chunk-DZVBN6ZI.js.map → chunk-PEEQNAIN.js.map} +0 -0
  157. /package/dist/esm/{chunk-P5VEI574.js.map → chunk-S4CU4XRB.js.map} +0 -0
  158. /package/dist/esm/{chunk-4NBLO5WK.js.map → chunk-X4CMSAET.js.map} +0 -0
  159. /package/dist/esm/{chunk-KQZ3MNK5.js.map → chunk-XNEQHHNV.js.map} +0 -0
@@ -68,7 +68,8 @@ Text.displayName = "Text";
68
68
 
69
69
  // src/components/TextOrHTML/TextOrHTML.tsx
70
70
  var import_jsx_runtime2 = require("react/jsx-runtime");
71
- var isBlockHTML = (text) => /^\s*<[a-z]/i.test(text);
71
+ var BLOCK_TAG = /<(div|p|ul|ol|li|h[1-6]|table|tr|td|th|blockquote|pre|hr|dl|dt|dd)[\s>/]/i;
72
+ var containsBlockHTML = (text) => BLOCK_TAG.test(text);
72
73
  var containsHTML = (text) => /<[a-z/]/i.test(text) || /&(?:#\d+|#x[\da-f]+|[a-z]\w*);/i.test(text);
73
74
  var buildTextClasses = (textProps, htmlClassName) => {
74
75
  const { variant, elementType, spacing, className } = textProps;
@@ -91,9 +92,9 @@ var TextOrHTML = ({
91
92
  autoDetect = false,
92
93
  ...textProps
93
94
  }) => {
94
- const textIsBlockHTML = autoDetect && isBlockHTML(text);
95
+ const hasBlockContent = autoDetect && containsBlockHTML(text);
95
96
  const dangerousHTML = (0, import_react.useMemo)(() => ({ __html: text }), [text]);
96
- if (autoDetect && !textIsBlockHTML) {
97
+ if (autoDetect && !hasBlockContent) {
97
98
  const { variant, spacing, elementType, className, ...domProps } = textProps;
98
99
  const Element = getElementType(variant, elementType);
99
100
  const classes = buildTextClasses(textProps, htmlClassName);
@@ -107,7 +108,7 @@ var TextOrHTML = ({
107
108
  }
108
109
  ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Element, { ref, ...domProps, className: classes, children: text });
109
110
  }
110
- const DangerousComponent = htmlElementType ?? (textIsBlockHTML ? "div" : "span");
111
+ const DangerousComponent = htmlElementType ?? (hasBlockContent ? "div" : "span");
111
112
  const dangerousElement = /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
112
113
  DangerousComponent,
113
114
  {
@@ -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 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", "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\nexport const getElementType = (\n variant: TextVariantType | undefined,\n elementType: ElementType | undefined,\n): ElementType => {\n // Explicit elementType always wins\n if (elementType) {\n return elementType;\n }\n // Infer element from variant\n if (variant && [\"h1\", \"h2\", \"h3\", \"h4\"].includes(variant)) {\n return variant as ElementType;\n }\n return \"p\";\n};\n\nconst Text = ({ ref, elementType, ...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 Element: ElementType = getElementType(variant, elementType);\n const variantType = variant || Element;\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 <Element ref={ref} {...otherProps} className={classes} />;\n};\n\nText.displayName = \"Text\";\nexport { Text };\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,iBAAuB;AAEvB,mBAAwB;;;ACDxB,oBAAuB;AAEvB,kBAAO;AAwDE;AA9BF,IAAM,iBAAiB,CAC5B,SACA,gBACgB;AAEhB,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,CAAC,MAAM,MAAM,MAAM,IAAI,EAAE,SAAS,OAAO,GAAG;AACzD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,IAAM,OAAO,CAAC,EAAE,KAAK,aAAa,GAAG,MAAM,MAAiB;AAE1D,QAAM,EAAE,SAAS,WAAW,SAAS,GAAG,WAAW,IAAI;AAGvD,QAAM,UAAuB,eAAe,SAAS,WAAW;AAChE,QAAM,cAAc,WAAW;AAC/B,QAAM,cAAU,cAAAC;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,WAAQ,KAAW,GAAG,YAAY,WAAW,SAAS;AAChE;AAEA,KAAK,cAAc;;;ADGb,IAAAC,sBAAA;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,aAAO,eAAAC;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,oBAAgB,sBAAQ,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,6CAAC,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,6CAAC,QAAK,KAAW,GAAG,WACjB,4BACH;AAAA,EAEJ;AAEA,SAAO;AACT;AAEA,WAAW,cAAc;",
4
+ "sourcesContent": ["export * from \"./TextOrHTML\";\n", "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\n// Block-level tags that cannot be nested inside <p>.\nconst BLOCK_TAG =\n /<(div|p|ul|ol|li|h[1-6]|table|tr|td|th|blockquote|pre|hr|dl|dt|dd)[\\s>/]/i;\nconst containsBlockHTML = (text: string) => BLOCK_TAG.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 hasBlockContent = autoDetect && containsBlockHTML(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 && !hasBlockContent) {\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 ?? (hasBlockContent ? \"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", "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\nexport const getElementType = (\n variant: TextVariantType | undefined,\n elementType: ElementType | undefined,\n): ElementType => {\n // Explicit elementType always wins\n if (elementType) {\n return elementType;\n }\n // Infer element from variant\n if (variant && [\"h1\", \"h2\", \"h3\", \"h4\"].includes(variant)) {\n return variant as ElementType;\n }\n return \"p\";\n};\n\nconst Text = ({ ref, elementType, ...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 Element: ElementType = getElementType(variant, elementType);\n const variantType = variant || Element;\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 <Element ref={ref} {...otherProps} className={classes} />;\n};\n\nText.displayName = \"Text\";\nexport { Text };\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,iBAAuB;AAEvB,mBAAwB;;;ACDxB,oBAAuB;AAEvB,kBAAO;AAwDE;AA9BF,IAAM,iBAAiB,CAC5B,SACA,gBACgB;AAEhB,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,CAAC,MAAM,MAAM,MAAM,IAAI,EAAE,SAAS,OAAO,GAAG;AACzD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,IAAM,OAAO,CAAC,EAAE,KAAK,aAAa,GAAG,MAAM,MAAiB;AAE1D,QAAM,EAAE,SAAS,WAAW,SAAS,GAAG,WAAW,IAAI;AAGvD,QAAM,UAAuB,eAAe,SAAS,WAAW;AAChE,QAAM,cAAc,WAAW;AAC/B,QAAM,cAAU,cAAAC;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,WAAQ,KAAW,GAAG,YAAY,WAAW,SAAS;AAChE;AAEA,KAAK,cAAc;;;ADMb,IAAAC,sBAAA;AA3DN,IAAM,YACJ;AACF,IAAM,oBAAoB,CAAC,SAAiB,UAAU,KAAK,IAAI;AAC/D,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,aAAO,eAAAC;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,kBAAkB,IAAI;AAI5D,QAAM,oBAAgB,sBAAQ,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,6CAAC,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,6CAAC,QAAK,KAAW,GAAG,WACjB,4BACH;AAAA,EAEJ;AAEA,SAAO;AACT;AAEA,WAAW,cAAc;",
6
6
  "names": ["import_dedupe", "classNames", "import_jsx_runtime", "classNames"]
7
7
  }
@@ -756,7 +756,7 @@ var init_Text = __esm({
756
756
  });
757
757
 
758
758
  // src/components/TextOrHTML/TextOrHTML.tsx
759
- var import_dedupe8, import_react9, import_jsx_runtime8, isBlockHTML, containsHTML, buildTextClasses, TextOrHTML;
759
+ var import_dedupe8, import_react9, import_jsx_runtime8, BLOCK_TAG, containsBlockHTML, containsHTML, buildTextClasses, TextOrHTML;
760
760
  var init_TextOrHTML = __esm({
761
761
  "src/components/TextOrHTML/TextOrHTML.tsx"() {
762
762
  "use strict";
@@ -764,7 +764,8 @@ var init_TextOrHTML = __esm({
764
764
  import_react9 = require("react");
765
765
  init_Text();
766
766
  import_jsx_runtime8 = require("react/jsx-runtime");
767
- isBlockHTML = (text) => /^\s*<[a-z]/i.test(text);
767
+ BLOCK_TAG = /<(div|p|ul|ol|li|h[1-6]|table|tr|td|th|blockquote|pre|hr|dl|dt|dd)[\s>/]/i;
768
+ containsBlockHTML = (text) => BLOCK_TAG.test(text);
768
769
  containsHTML = (text) => /<[a-z/]/i.test(text) || /&(?:#\d+|#x[\da-f]+|[a-z]\w*);/i.test(text);
769
770
  buildTextClasses = (textProps, htmlClassName) => {
770
771
  const { variant, elementType, spacing, className } = textProps;
@@ -787,9 +788,9 @@ var init_TextOrHTML = __esm({
787
788
  autoDetect = false,
788
789
  ...textProps
789
790
  }) => {
790
- const textIsBlockHTML = autoDetect && isBlockHTML(text);
791
+ const hasBlockContent = autoDetect && containsBlockHTML(text);
791
792
  const dangerousHTML = (0, import_react9.useMemo)(() => ({ __html: text }), [text]);
792
- if (autoDetect && !textIsBlockHTML) {
793
+ if (autoDetect && !hasBlockContent) {
793
794
  const { variant, spacing, elementType, className, ...domProps } = textProps;
794
795
  const Element = getElementType(variant, elementType);
795
796
  const classes = buildTextClasses(textProps, htmlClassName);
@@ -803,7 +804,7 @@ var init_TextOrHTML = __esm({
803
804
  }
804
805
  ) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Element, { ref, ...domProps, className: classes, children: text });
805
806
  }
806
- const DangerousComponent = htmlElementType ?? (textIsBlockHTML ? "div" : "span");
807
+ const DangerousComponent = htmlElementType ?? (hasBlockContent ? "div" : "span");
807
808
  const dangerousElement = /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
808
809
  DangerousComponent,
809
810
  {
@@ -3807,6 +3808,7 @@ var Modal = ({ ref, ...props }) => {
3807
3808
  const {
3808
3809
  isOpen,
3809
3810
  onClose,
3811
+ preventEscapeKey = false,
3810
3812
  onOpen,
3811
3813
  children,
3812
3814
  className,
@@ -3861,6 +3863,11 @@ var Modal = ({ ref, ...props }) => {
3861
3863
  {
3862
3864
  ref: mergeRefs([dialogRef, ref]),
3863
3865
  onCancel: close,
3866
+ onKeyDown: (event) => {
3867
+ if (preventEscapeKey && event.key === "Escape") {
3868
+ event.preventDefault();
3869
+ }
3870
+ },
3864
3871
  className: modalClasses,
3865
3872
  "aria-labelledby": titleId,
3866
3873
  ...rest,