@simplybusiness/mobius 10.3.0 → 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 (132) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/components/AddressLookup/AddressLookup.js +224 -198
  3. package/dist/cjs/components/AddressLookup/AddressLookup.js.map +3 -3
  4. package/dist/cjs/components/AddressLookup/index.js +224 -198
  5. package/dist/cjs/components/AddressLookup/index.js.map +3 -3
  6. package/dist/cjs/components/Alert/Alert.js +37 -11
  7. package/dist/cjs/components/Alert/Alert.js.map +3 -3
  8. package/dist/cjs/components/Alert/index.js +37 -11
  9. package/dist/cjs/components/Alert/index.js.map +3 -3
  10. package/dist/cjs/components/Checkbox/Checkbox.js +199 -173
  11. package/dist/cjs/components/Checkbox/Checkbox.js.map +3 -3
  12. package/dist/cjs/components/Checkbox/CheckboxGroup.js +199 -173
  13. package/dist/cjs/components/Checkbox/CheckboxGroup.js.map +3 -3
  14. package/dist/cjs/components/Checkbox/index.js +199 -173
  15. package/dist/cjs/components/Checkbox/index.js.map +3 -3
  16. package/dist/cjs/components/Combobox/Combobox.js +224 -198
  17. package/dist/cjs/components/Combobox/Combobox.js.map +3 -3
  18. package/dist/cjs/components/Combobox/index.js +224 -198
  19. package/dist/cjs/components/Combobox/index.js.map +3 -3
  20. package/dist/cjs/components/DateField/DateField.js +215 -189
  21. package/dist/cjs/components/DateField/DateField.js.map +3 -3
  22. package/dist/cjs/components/DateField/index.js +215 -189
  23. package/dist/cjs/components/DateField/index.js.map +3 -3
  24. package/dist/cjs/components/ErrorMessage/ErrorMessage.js +199 -173
  25. package/dist/cjs/components/ErrorMessage/ErrorMessage.js.map +3 -3
  26. package/dist/cjs/components/ErrorMessage/index.js +199 -173
  27. package/dist/cjs/components/ErrorMessage/index.js.map +3 -3
  28. package/dist/cjs/components/ExpandableText/ExpandableText.js +196 -170
  29. package/dist/cjs/components/ExpandableText/ExpandableText.js.map +3 -3
  30. package/dist/cjs/components/ExpandableText/index.js +196 -170
  31. package/dist/cjs/components/ExpandableText/index.js.map +3 -3
  32. package/dist/cjs/components/MaskedField/MaskedField.js +215 -189
  33. package/dist/cjs/components/MaskedField/MaskedField.js.map +3 -3
  34. package/dist/cjs/components/MaskedField/index.js +215 -189
  35. package/dist/cjs/components/MaskedField/index.js.map +3 -3
  36. package/dist/cjs/components/NumberField/NumberField.js +215 -189
  37. package/dist/cjs/components/NumberField/NumberField.js.map +3 -3
  38. package/dist/cjs/components/NumberField/index.js +215 -189
  39. package/dist/cjs/components/NumberField/index.js.map +3 -3
  40. package/dist/cjs/components/PasswordField/PasswordField.js +215 -189
  41. package/dist/cjs/components/PasswordField/PasswordField.js.map +3 -3
  42. package/dist/cjs/components/PasswordField/ShowHideButton.js +196 -170
  43. package/dist/cjs/components/PasswordField/ShowHideButton.js.map +3 -3
  44. package/dist/cjs/components/PasswordField/index.js +215 -189
  45. package/dist/cjs/components/PasswordField/index.js.map +3 -3
  46. package/dist/cjs/components/Radio/Radio.js +199 -173
  47. package/dist/cjs/components/Radio/Radio.js.map +3 -3
  48. package/dist/cjs/components/Radio/RadioGroup.js +199 -173
  49. package/dist/cjs/components/Radio/RadioGroup.js.map +3 -3
  50. package/dist/cjs/components/Radio/index.js +199 -173
  51. package/dist/cjs/components/Radio/index.js.map +3 -3
  52. package/dist/cjs/components/Select/Select.js +199 -173
  53. package/dist/cjs/components/Select/Select.js.map +3 -3
  54. package/dist/cjs/components/Select/index.js +199 -173
  55. package/dist/cjs/components/Select/index.js.map +3 -3
  56. package/dist/cjs/components/Text/Text.js +2 -1
  57. package/dist/cjs/components/Text/Text.js.map +2 -2
  58. package/dist/cjs/components/Text/index.js +2 -1
  59. package/dist/cjs/components/Text/index.js.map +2 -2
  60. package/dist/cjs/components/TextArea/TextArea.js +199 -173
  61. package/dist/cjs/components/TextArea/TextArea.js.map +3 -3
  62. package/dist/cjs/components/TextArea/index.js +199 -173
  63. package/dist/cjs/components/TextArea/index.js.map +3 -3
  64. package/dist/cjs/components/TextField/TextField.js +215 -189
  65. package/dist/cjs/components/TextField/TextField.js.map +3 -3
  66. package/dist/cjs/components/TextField/index.js +215 -189
  67. package/dist/cjs/components/TextField/index.js.map +3 -3
  68. package/dist/cjs/components/TextOrHTML/TextOrHTML.js +32 -6
  69. package/dist/cjs/components/TextOrHTML/TextOrHTML.js.map +3 -3
  70. package/dist/cjs/components/TextOrHTML/index.js +32 -6
  71. package/dist/cjs/components/TextOrHTML/index.js.map +3 -3
  72. package/dist/cjs/components/index.js +205 -178
  73. package/dist/cjs/components/index.js.map +3 -3
  74. package/dist/cjs/index.js +205 -178
  75. package/dist/cjs/index.js.map +3 -3
  76. package/dist/cjs/meta.json +299 -119
  77. package/dist/esm/{chunk-ZS5MFZHD.js → chunk-A66R42LG.js} +2 -1
  78. package/dist/esm/{chunk-ZS5MFZHD.js.map → chunk-A66R42LG.js.map} +2 -2
  79. package/dist/esm/chunk-DYTHXKMX.js +67 -0
  80. package/dist/esm/chunk-DYTHXKMX.js.map +7 -0
  81. package/dist/esm/{chunk-QWD72EVP.js → chunk-JNAQ76CR.js} +2 -2
  82. package/dist/esm/{chunk-I6EUIFUJ.js → chunk-W2RQH4WS.js} +2 -2
  83. package/dist/esm/components/AddressLookup/AddressLookup.js +4 -4
  84. package/dist/esm/components/AddressLookup/index.js +4 -4
  85. package/dist/esm/components/Alert/Alert.js +3 -3
  86. package/dist/esm/components/Alert/index.js +3 -3
  87. package/dist/esm/components/Checkbox/Checkbox.js +4 -4
  88. package/dist/esm/components/Checkbox/CheckboxGroup.js +4 -4
  89. package/dist/esm/components/Checkbox/index.js +4 -4
  90. package/dist/esm/components/Combobox/Combobox.js +4 -4
  91. package/dist/esm/components/Combobox/index.js +4 -4
  92. package/dist/esm/components/DateField/DateField.js +4 -4
  93. package/dist/esm/components/DateField/index.js +4 -4
  94. package/dist/esm/components/ErrorMessage/ErrorMessage.js +4 -4
  95. package/dist/esm/components/ErrorMessage/index.js +4 -4
  96. package/dist/esm/components/ExpandableText/ExpandableText.js +4 -4
  97. package/dist/esm/components/ExpandableText/index.js +4 -4
  98. package/dist/esm/components/MaskedField/MaskedField.js +4 -4
  99. package/dist/esm/components/MaskedField/index.js +4 -4
  100. package/dist/esm/components/NumberField/NumberField.js +4 -4
  101. package/dist/esm/components/NumberField/index.js +4 -4
  102. package/dist/esm/components/PasswordField/PasswordField.js +4 -4
  103. package/dist/esm/components/PasswordField/ShowHideButton.js +4 -4
  104. package/dist/esm/components/PasswordField/index.js +4 -4
  105. package/dist/esm/components/Radio/Radio.js +4 -4
  106. package/dist/esm/components/Radio/RadioGroup.js +4 -4
  107. package/dist/esm/components/Radio/index.js +4 -4
  108. package/dist/esm/components/Select/Select.js +4 -4
  109. package/dist/esm/components/Select/index.js +4 -4
  110. package/dist/esm/components/Text/Text.js +5 -3
  111. package/dist/esm/components/Text/index.js +5 -3
  112. package/dist/esm/components/TextArea/TextArea.js +4 -4
  113. package/dist/esm/components/TextArea/index.js +4 -4
  114. package/dist/esm/components/TextField/TextField.js +4 -4
  115. package/dist/esm/components/TextField/index.js +4 -4
  116. package/dist/esm/components/TextOrHTML/TextOrHTML.js +2 -2
  117. package/dist/esm/components/TextOrHTML/index.js +2 -2
  118. package/dist/esm/components/index.js +7 -5
  119. package/dist/esm/index.js +7 -5
  120. package/dist/esm/meta.json +176 -161
  121. package/dist/tsconfig.build.tsbuildinfo +1 -1
  122. package/dist/types/components/Text/Text.d.ts +1 -0
  123. package/package.json +1 -1
  124. package/src/components/Table/Table.test.tsx +2 -5
  125. package/src/components/Text/Text.test.tsx +3 -4
  126. package/src/components/Text/Text.tsx +1 -1
  127. package/src/components/TextOrHTML/TextOrHTML.test.tsx +54 -3
  128. package/src/components/TextOrHTML/TextOrHTML.tsx +46 -9
  129. package/dist/esm/chunk-VIDKIVA6.js +0 -40
  130. package/dist/esm/chunk-VIDKIVA6.js.map +0 -7
  131. /package/dist/esm/{chunk-QWD72EVP.js.map → chunk-JNAQ76CR.js.map} +0 -0
  132. /package/dist/esm/{chunk-I6EUIFUJ.js.map → chunk-W2RQH4WS.js.map} +0 -0
@@ -34,7 +34,7 @@ __export(Alert_exports, {
34
34
  });
35
35
  module.exports = __toCommonJS(Alert_exports);
36
36
  var import_icons = require("@simplybusiness/icons");
37
- var import_dedupe3 = __toESM(require("classnames/dedupe"));
37
+ var import_dedupe4 = __toESM(require("classnames/dedupe"));
38
38
 
39
39
  // src/components/Icon/Icon.tsx
40
40
  var import_dedupe = __toESM(require("classnames/dedupe"));
@@ -94,6 +94,7 @@ function Icon({
94
94
  }
95
95
 
96
96
  // src/components/TextOrHTML/TextOrHTML.tsx
97
+ var import_dedupe3 = __toESM(require("classnames/dedupe"));
97
98
  var import_react = require("react");
98
99
 
99
100
  // src/components/Text/Text.tsx
@@ -126,7 +127,20 @@ Text.displayName = "Text";
126
127
 
127
128
  // src/components/TextOrHTML/TextOrHTML.tsx
128
129
  var import_jsx_runtime3 = require("react/jsx-runtime");
129
- var isHTML = (text) => /^\s*<[a-z]/i.test(text);
130
+ var isBlockHTML = (text) => /^\s*<[a-z]/i.test(text);
131
+ var containsHTML = (text) => /<[a-z/]/i.test(text) || /&(?:#\d+|#x[\da-f]+|[a-z]\w*);/i.test(text);
132
+ var buildTextClasses = (textProps, htmlClassName) => {
133
+ const { variant, elementType, spacing, className } = textProps;
134
+ const variantType = variant || getElementType(variant, elementType);
135
+ return (0, import_dedupe3.default)(
136
+ "mobius",
137
+ "mobius-text",
138
+ { [`--is-${variantType}`]: variantType },
139
+ { [`--has-line-height-${spacing}`]: spacing },
140
+ className,
141
+ htmlClassName
142
+ );
143
+ };
130
144
  var TextOrHTML = ({
131
145
  ref,
132
146
  text,
@@ -136,11 +150,23 @@ var TextOrHTML = ({
136
150
  autoDetect = false,
137
151
  ...textProps
138
152
  }) => {
139
- const textIsHTML = autoDetect && isHTML(text);
140
- const shouldWrapInText = autoDetect ? textWrapper || !textIsHTML : textWrapper;
141
- const resolvedElementType = htmlElementType ?? (textIsHTML ? "div" : "span");
142
- const DangerousComponent = resolvedElementType;
153
+ const textIsBlockHTML = autoDetect && isBlockHTML(text);
143
154
  const dangerousHTML = (0, import_react.useMemo)(() => ({ __html: text }), [text]);
155
+ if (autoDetect && !textIsBlockHTML) {
156
+ const { variant, spacing, elementType, className, ...domProps } = textProps;
157
+ const Element = getElementType(variant, elementType);
158
+ const classes = buildTextClasses(textProps, htmlClassName);
159
+ return containsHTML(text) ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
160
+ Element,
161
+ {
162
+ ref,
163
+ ...domProps,
164
+ className: classes,
165
+ dangerouslySetInnerHTML: dangerousHTML
166
+ }
167
+ ) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Element, { ref, ...domProps, className: classes, children: text });
168
+ }
169
+ const DangerousComponent = htmlElementType ?? (textIsBlockHTML ? "div" : "span");
144
170
  const dangerousElement = /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
145
171
  DangerousComponent,
146
172
  {
@@ -148,7 +174,7 @@ var TextOrHTML = ({
148
174
  dangerouslySetInnerHTML: dangerousHTML
149
175
  }
150
176
  );
151
- if (shouldWrapInText) {
177
+ if (textWrapper) {
152
178
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { ref, ...textProps, children: dangerousElement });
153
179
  }
154
180
  return dangerousElement;
@@ -173,7 +199,7 @@ var Alert = ({ ref, ...props }) => {
173
199
  if (!show) return null;
174
200
  const variant = variantProp && isAlertVariant(variantProp) ? variantProp : "info";
175
201
  const colorValue = variant === "success" ? `var(--color-valid)` : `var(--color-${variant})`;
176
- const classes = (0, import_dedupe3.default)(
202
+ const classes = (0, import_dedupe4.default)(
177
203
  "mobius",
178
204
  "mobius-alert",
179
205
  {
@@ -191,9 +217,9 @@ var Alert = ({ ref, ...props }) => {
191
217
  warning: import_icons.warning,
192
218
  error: import_icons.error
193
219
  };
194
- const headerClasses = (0, import_dedupe3.default)("mobius", "mobius-alert__header");
195
- const iconClasses = (0, import_dedupe3.default)("mobius", "mobius-alert__icon");
196
- const contentClasses = (0, import_dedupe3.default)("mobius", "mobius-alert__content");
220
+ const headerClasses = (0, import_dedupe4.default)("mobius", "mobius-alert__header");
221
+ const iconClasses = (0, import_dedupe4.default)("mobius", "mobius-alert__icon");
222
+ const contentClasses = (0, import_dedupe4.default)("mobius", "mobius-alert__content");
197
223
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Element, { ref, role: "alert", ...otherProps, className: classes, children: [
198
224
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: iconClasses, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { icon: icon[variant], color: colorValue }) }),
199
225
  /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/Alert/Alert.tsx", "../../../../src/components/Icon/Icon.tsx", "../../../../src/components/TextOrHTML/TextOrHTML.tsx", "../../../../src/components/Text/Text.tsx"],
4
- "sourcesContent": ["import { circleInfo, circleTick, error, warning } from \"@simplybusiness/icons\";\nimport classNames from \"classnames/dedupe\";\nimport type { ReactNode, RefAttributes } from \"react\";\nimport type { DOMProps } from \"../../types/dom\";\nimport { Icon } from \"../Icon\";\nimport { TextOrHTML } from \"../TextOrHTML\";\nimport \"./Alert.css\";\n\nexport type AlertElementType = HTMLDivElement;\n\nexport interface AlertProps extends DOMProps, RefAttributes<AlertElementType> {\n children?: ReactNode;\n /** Custom class name for setting specific CSS */\n className?: string;\n elementType?: React.ElementType;\n variant?: string;\n show?: boolean;\n header?: string;\n}\n\ntype AlertVariant = \"info\" | \"success\" | \"warning\" | \"error\";\n\nfunction isAlertVariant(value: string): value is AlertVariant {\n return (\n value === \"info\" ||\n value === \"success\" ||\n value === \"warning\" ||\n value === \"error\"\n );\n}\n\nconst Alert = ({ ref, ...props }: AlertProps) => {\n const {\n elementType: Element = \"div\",\n variant: variantProp,\n show = true,\n header,\n children,\n ...otherProps\n } = props;\n\n if (!show) return null;\n\n const variant: AlertVariant =\n variantProp && isAlertVariant(variantProp) ? variantProp : \"info\";\n\n const colorValue =\n variant === \"success\" ? `var(--color-valid)` : `var(--color-${variant})`;\n\n const classes = classNames(\n \"mobius\",\n \"mobius-alert\",\n {\n \"--info\": variant === \"info\",\n \"--success\": variant === \"success\",\n \"--warning\": variant === \"warning\",\n \"--error\": variant === \"error\",\n \"--has-header\": header,\n },\n otherProps.className,\n );\n const icon = {\n info: circleInfo,\n success: circleTick,\n warning,\n error,\n };\n\n const headerClasses = classNames(\"mobius\", \"mobius-alert__header\");\n const iconClasses = classNames(\"mobius\", \"mobius-alert__icon\");\n const contentClasses = classNames(\"mobius\", \"mobius-alert__content\");\n\n return (\n <Element ref={ref} role=\"alert\" {...otherProps} className={classes}>\n <span className={iconClasses}>\n <Icon icon={icon[variant]} color={colorValue} />\n </span>\n <div>\n {header && (\n <TextOrHTML\n autoDetect\n htmlElementType=\"span\"\n className={headerClasses}\n htmlClassName={headerClasses}\n text={header}\n />\n )}\n <div className={contentClasses}>{children}</div>\n </div>\n </Element>\n );\n};\n\nAlert.displayName = \"Alert\";\nexport { Alert };\n", "import classNames from \"classnames/dedupe\";\nimport type { IconProps } from \"./types\";\nimport \"./Icon.css\";\n\nconst ICON_PREFIX = \"mobius-icon\";\n\nconst capitaliseFirstLetter = (str: string) =>\n str.charAt(0).toUpperCase() + str.slice(1);\n\nexport function Icon({\n ref,\n icon,\n className,\n size = \"xs\",\n color,\n fixedWidth,\n spin,\n spinReverse,\n title,\n ...otherProps\n}: IconProps) {\n if (!icon) {\n throw new Error(\"Must specify icon object\");\n }\n\n const classes = classNames(\n \"mobius\",\n \"mobius-icon\",\n `svg-inline--${ICON_PREFIX}`,\n `--size-${size}`,\n className,\n {\n [`${ICON_PREFIX}-fw`]: fixedWidth,\n [`${ICON_PREFIX}-spin`]: spin || spinReverse,\n [`${ICON_PREFIX}-spin-reverse`]: spinReverse,\n },\n );\n\n const { iconName, width, height, svgPathData } = icon;\n const formattedIconName = iconName.split(\"-\").join(\" \");\n\n const defaultTitle = `${capitaliseFirstLetter(formattedIconName)} icon`;\n const titleText = title || defaultTitle;\n\n return (\n <svg\n ref={ref}\n focusable=\"false\"\n data-icon={iconName}\n className={classes}\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${width} ${height}`}\n style={{ color }}\n {...otherProps}\n >\n <title>{titleText}</title>\n <path fill=\"currentColor\" d={svgPathData} />\n </svg>\n );\n}\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): 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": "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",
6
- "names": ["import_dedupe", "classNames", "import_dedupe", "import_jsx_runtime", "classNames", "import_jsx_runtime", "import_jsx_runtime", "classNames"]
4
+ "sourcesContent": ["import { circleInfo, circleTick, error, warning } from \"@simplybusiness/icons\";\nimport classNames from \"classnames/dedupe\";\nimport type { ReactNode, RefAttributes } from \"react\";\nimport type { DOMProps } from \"../../types/dom\";\nimport { Icon } from \"../Icon\";\nimport { TextOrHTML } from \"../TextOrHTML\";\nimport \"./Alert.css\";\n\nexport type AlertElementType = HTMLDivElement;\n\nexport interface AlertProps extends DOMProps, RefAttributes<AlertElementType> {\n children?: ReactNode;\n /** Custom class name for setting specific CSS */\n className?: string;\n elementType?: React.ElementType;\n variant?: string;\n show?: boolean;\n header?: string;\n}\n\ntype AlertVariant = \"info\" | \"success\" | \"warning\" | \"error\";\n\nfunction isAlertVariant(value: string): value is AlertVariant {\n return (\n value === \"info\" ||\n value === \"success\" ||\n value === \"warning\" ||\n value === \"error\"\n );\n}\n\nconst Alert = ({ ref, ...props }: AlertProps) => {\n const {\n elementType: Element = \"div\",\n variant: variantProp,\n show = true,\n header,\n children,\n ...otherProps\n } = props;\n\n if (!show) return null;\n\n const variant: AlertVariant =\n variantProp && isAlertVariant(variantProp) ? variantProp : \"info\";\n\n const colorValue =\n variant === \"success\" ? `var(--color-valid)` : `var(--color-${variant})`;\n\n const classes = classNames(\n \"mobius\",\n \"mobius-alert\",\n {\n \"--info\": variant === \"info\",\n \"--success\": variant === \"success\",\n \"--warning\": variant === \"warning\",\n \"--error\": variant === \"error\",\n \"--has-header\": header,\n },\n otherProps.className,\n );\n const icon = {\n info: circleInfo,\n success: circleTick,\n warning,\n error,\n };\n\n const headerClasses = classNames(\"mobius\", \"mobius-alert__header\");\n const iconClasses = classNames(\"mobius\", \"mobius-alert__icon\");\n const contentClasses = classNames(\"mobius\", \"mobius-alert__content\");\n\n return (\n <Element ref={ref} role=\"alert\" {...otherProps} className={classes}>\n <span className={iconClasses}>\n <Icon icon={icon[variant]} color={colorValue} />\n </span>\n <div>\n {header && (\n <TextOrHTML\n autoDetect\n htmlElementType=\"span\"\n className={headerClasses}\n htmlClassName={headerClasses}\n text={header}\n />\n )}\n <div className={contentClasses}>{children}</div>\n </div>\n </Element>\n );\n};\n\nAlert.displayName = \"Alert\";\nexport { Alert };\n", "import classNames from \"classnames/dedupe\";\nimport type { IconProps } from \"./types\";\nimport \"./Icon.css\";\n\nconst ICON_PREFIX = \"mobius-icon\";\n\nconst capitaliseFirstLetter = (str: string) =>\n str.charAt(0).toUpperCase() + str.slice(1);\n\nexport function Icon({\n ref,\n icon,\n className,\n size = \"xs\",\n color,\n fixedWidth,\n spin,\n spinReverse,\n title,\n ...otherProps\n}: IconProps) {\n if (!icon) {\n throw new Error(\"Must specify icon object\");\n }\n\n const classes = classNames(\n \"mobius\",\n \"mobius-icon\",\n `svg-inline--${ICON_PREFIX}`,\n `--size-${size}`,\n className,\n {\n [`${ICON_PREFIX}-fw`]: fixedWidth,\n [`${ICON_PREFIX}-spin`]: spin || spinReverse,\n [`${ICON_PREFIX}-spin-reverse`]: spinReverse,\n },\n );\n\n const { iconName, width, height, svgPathData } = icon;\n const formattedIconName = iconName.split(\"-\").join(\" \");\n\n const defaultTitle = `${capitaliseFirstLetter(formattedIconName)} icon`;\n const titleText = title || defaultTitle;\n\n return (\n <svg\n ref={ref}\n focusable=\"false\"\n data-icon={iconName}\n className={classes}\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${width} ${height}`}\n style={{ color }}\n {...otherProps}\n >\n <title>{titleText}</title>\n <path fill=\"currentColor\" d={svgPathData} />\n </svg>\n );\n}\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": "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",
6
+ "names": ["import_dedupe", "classNames", "import_dedupe", "import_dedupe", "import_jsx_runtime", "classNames", "import_jsx_runtime", "classNames", "import_jsx_runtime", "classNames"]
7
7
  }
@@ -36,7 +36,7 @@ module.exports = __toCommonJS(Alert_exports);
36
36
 
37
37
  // src/components/Alert/Alert.tsx
38
38
  var import_icons = require("@simplybusiness/icons");
39
- var import_dedupe3 = __toESM(require("classnames/dedupe"));
39
+ var import_dedupe4 = __toESM(require("classnames/dedupe"));
40
40
 
41
41
  // src/components/Icon/Icon.tsx
42
42
  var import_dedupe = __toESM(require("classnames/dedupe"));
@@ -96,6 +96,7 @@ function Icon({
96
96
  }
97
97
 
98
98
  // src/components/TextOrHTML/TextOrHTML.tsx
99
+ var import_dedupe3 = __toESM(require("classnames/dedupe"));
99
100
  var import_react = require("react");
100
101
 
101
102
  // src/components/Text/Text.tsx
@@ -128,7 +129,20 @@ Text.displayName = "Text";
128
129
 
129
130
  // src/components/TextOrHTML/TextOrHTML.tsx
130
131
  var import_jsx_runtime3 = require("react/jsx-runtime");
131
- var isHTML = (text) => /^\s*<[a-z]/i.test(text);
132
+ var isBlockHTML = (text) => /^\s*<[a-z]/i.test(text);
133
+ var containsHTML = (text) => /<[a-z/]/i.test(text) || /&(?:#\d+|#x[\da-f]+|[a-z]\w*);/i.test(text);
134
+ var buildTextClasses = (textProps, htmlClassName) => {
135
+ const { variant, elementType, spacing, className } = textProps;
136
+ const variantType = variant || getElementType(variant, elementType);
137
+ return (0, import_dedupe3.default)(
138
+ "mobius",
139
+ "mobius-text",
140
+ { [`--is-${variantType}`]: variantType },
141
+ { [`--has-line-height-${spacing}`]: spacing },
142
+ className,
143
+ htmlClassName
144
+ );
145
+ };
132
146
  var TextOrHTML = ({
133
147
  ref,
134
148
  text,
@@ -138,11 +152,23 @@ var TextOrHTML = ({
138
152
  autoDetect = false,
139
153
  ...textProps
140
154
  }) => {
141
- const textIsHTML = autoDetect && isHTML(text);
142
- const shouldWrapInText = autoDetect ? textWrapper || !textIsHTML : textWrapper;
143
- const resolvedElementType = htmlElementType ?? (textIsHTML ? "div" : "span");
144
- const DangerousComponent = resolvedElementType;
155
+ const textIsBlockHTML = autoDetect && isBlockHTML(text);
145
156
  const dangerousHTML = (0, import_react.useMemo)(() => ({ __html: text }), [text]);
157
+ if (autoDetect && !textIsBlockHTML) {
158
+ const { variant, spacing, elementType, className, ...domProps } = textProps;
159
+ const Element = getElementType(variant, elementType);
160
+ const classes = buildTextClasses(textProps, htmlClassName);
161
+ return containsHTML(text) ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
162
+ Element,
163
+ {
164
+ ref,
165
+ ...domProps,
166
+ className: classes,
167
+ dangerouslySetInnerHTML: dangerousHTML
168
+ }
169
+ ) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Element, { ref, ...domProps, className: classes, children: text });
170
+ }
171
+ const DangerousComponent = htmlElementType ?? (textIsBlockHTML ? "div" : "span");
146
172
  const dangerousElement = /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
147
173
  DangerousComponent,
148
174
  {
@@ -150,7 +176,7 @@ var TextOrHTML = ({
150
176
  dangerouslySetInnerHTML: dangerousHTML
151
177
  }
152
178
  );
153
- if (shouldWrapInText) {
179
+ if (textWrapper) {
154
180
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { ref, ...textProps, children: dangerousElement });
155
181
  }
156
182
  return dangerousElement;
@@ -175,7 +201,7 @@ var Alert = ({ ref, ...props }) => {
175
201
  if (!show) return null;
176
202
  const variant = variantProp && isAlertVariant(variantProp) ? variantProp : "info";
177
203
  const colorValue = variant === "success" ? `var(--color-valid)` : `var(--color-${variant})`;
178
- const classes = (0, import_dedupe3.default)(
204
+ const classes = (0, import_dedupe4.default)(
179
205
  "mobius",
180
206
  "mobius-alert",
181
207
  {
@@ -193,9 +219,9 @@ var Alert = ({ ref, ...props }) => {
193
219
  warning: import_icons.warning,
194
220
  error: import_icons.error
195
221
  };
196
- const headerClasses = (0, import_dedupe3.default)("mobius", "mobius-alert__header");
197
- const iconClasses = (0, import_dedupe3.default)("mobius", "mobius-alert__icon");
198
- const contentClasses = (0, import_dedupe3.default)("mobius", "mobius-alert__content");
222
+ const headerClasses = (0, import_dedupe4.default)("mobius", "mobius-alert__header");
223
+ const iconClasses = (0, import_dedupe4.default)("mobius", "mobius-alert__icon");
224
+ const contentClasses = (0, import_dedupe4.default)("mobius", "mobius-alert__content");
199
225
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Element, { ref, role: "alert", ...otherProps, className: classes, children: [
200
226
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: iconClasses, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { icon: icon[variant], color: colorValue }) }),
201
227
  /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/Alert/index.tsx", "../../../../src/components/Alert/Alert.tsx", "../../../../src/components/Icon/Icon.tsx", "../../../../src/components/TextOrHTML/TextOrHTML.tsx", "../../../../src/components/Text/Text.tsx"],
4
- "sourcesContent": ["export * from \"./Alert\";\n", "import { circleInfo, circleTick, error, warning } from \"@simplybusiness/icons\";\nimport classNames from \"classnames/dedupe\";\nimport type { ReactNode, RefAttributes } from \"react\";\nimport type { DOMProps } from \"../../types/dom\";\nimport { Icon } from \"../Icon\";\nimport { TextOrHTML } from \"../TextOrHTML\";\nimport \"./Alert.css\";\n\nexport type AlertElementType = HTMLDivElement;\n\nexport interface AlertProps extends DOMProps, RefAttributes<AlertElementType> {\n children?: ReactNode;\n /** Custom class name for setting specific CSS */\n className?: string;\n elementType?: React.ElementType;\n variant?: string;\n show?: boolean;\n header?: string;\n}\n\ntype AlertVariant = \"info\" | \"success\" | \"warning\" | \"error\";\n\nfunction isAlertVariant(value: string): value is AlertVariant {\n return (\n value === \"info\" ||\n value === \"success\" ||\n value === \"warning\" ||\n value === \"error\"\n );\n}\n\nconst Alert = ({ ref, ...props }: AlertProps) => {\n const {\n elementType: Element = \"div\",\n variant: variantProp,\n show = true,\n header,\n children,\n ...otherProps\n } = props;\n\n if (!show) return null;\n\n const variant: AlertVariant =\n variantProp && isAlertVariant(variantProp) ? variantProp : \"info\";\n\n const colorValue =\n variant === \"success\" ? `var(--color-valid)` : `var(--color-${variant})`;\n\n const classes = classNames(\n \"mobius\",\n \"mobius-alert\",\n {\n \"--info\": variant === \"info\",\n \"--success\": variant === \"success\",\n \"--warning\": variant === \"warning\",\n \"--error\": variant === \"error\",\n \"--has-header\": header,\n },\n otherProps.className,\n );\n const icon = {\n info: circleInfo,\n success: circleTick,\n warning,\n error,\n };\n\n const headerClasses = classNames(\"mobius\", \"mobius-alert__header\");\n const iconClasses = classNames(\"mobius\", \"mobius-alert__icon\");\n const contentClasses = classNames(\"mobius\", \"mobius-alert__content\");\n\n return (\n <Element ref={ref} role=\"alert\" {...otherProps} className={classes}>\n <span className={iconClasses}>\n <Icon icon={icon[variant]} color={colorValue} />\n </span>\n <div>\n {header && (\n <TextOrHTML\n autoDetect\n htmlElementType=\"span\"\n className={headerClasses}\n htmlClassName={headerClasses}\n text={header}\n />\n )}\n <div className={contentClasses}>{children}</div>\n </div>\n </Element>\n );\n};\n\nAlert.displayName = \"Alert\";\nexport { Alert };\n", "import classNames from \"classnames/dedupe\";\nimport type { IconProps } from \"./types\";\nimport \"./Icon.css\";\n\nconst ICON_PREFIX = \"mobius-icon\";\n\nconst capitaliseFirstLetter = (str: string) =>\n str.charAt(0).toUpperCase() + str.slice(1);\n\nexport function Icon({\n ref,\n icon,\n className,\n size = \"xs\",\n color,\n fixedWidth,\n spin,\n spinReverse,\n title,\n ...otherProps\n}: IconProps) {\n if (!icon) {\n throw new Error(\"Must specify icon object\");\n }\n\n const classes = classNames(\n \"mobius\",\n \"mobius-icon\",\n `svg-inline--${ICON_PREFIX}`,\n `--size-${size}`,\n className,\n {\n [`${ICON_PREFIX}-fw`]: fixedWidth,\n [`${ICON_PREFIX}-spin`]: spin || spinReverse,\n [`${ICON_PREFIX}-spin-reverse`]: spinReverse,\n },\n );\n\n const { iconName, width, height, svgPathData } = icon;\n const formattedIconName = iconName.split(\"-\").join(\" \");\n\n const defaultTitle = `${capitaliseFirstLetter(formattedIconName)} icon`;\n const titleText = title || defaultTitle;\n\n return (\n <svg\n ref={ref}\n focusable=\"false\"\n data-icon={iconName}\n className={classes}\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${width} ${height}`}\n style={{ color }}\n {...otherProps}\n >\n <title>{titleText}</title>\n <path fill=\"currentColor\" d={svgPathData} />\n </svg>\n );\n}\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): 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": "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",
6
- "names": ["import_dedupe", "classNames", "import_dedupe", "import_jsx_runtime", "classNames", "import_jsx_runtime", "import_jsx_runtime", "classNames"]
4
+ "sourcesContent": ["export * from \"./Alert\";\n", "import { circleInfo, circleTick, error, warning } from \"@simplybusiness/icons\";\nimport classNames from \"classnames/dedupe\";\nimport type { ReactNode, RefAttributes } from \"react\";\nimport type { DOMProps } from \"../../types/dom\";\nimport { Icon } from \"../Icon\";\nimport { TextOrHTML } from \"../TextOrHTML\";\nimport \"./Alert.css\";\n\nexport type AlertElementType = HTMLDivElement;\n\nexport interface AlertProps extends DOMProps, RefAttributes<AlertElementType> {\n children?: ReactNode;\n /** Custom class name for setting specific CSS */\n className?: string;\n elementType?: React.ElementType;\n variant?: string;\n show?: boolean;\n header?: string;\n}\n\ntype AlertVariant = \"info\" | \"success\" | \"warning\" | \"error\";\n\nfunction isAlertVariant(value: string): value is AlertVariant {\n return (\n value === \"info\" ||\n value === \"success\" ||\n value === \"warning\" ||\n value === \"error\"\n );\n}\n\nconst Alert = ({ ref, ...props }: AlertProps) => {\n const {\n elementType: Element = \"div\",\n variant: variantProp,\n show = true,\n header,\n children,\n ...otherProps\n } = props;\n\n if (!show) return null;\n\n const variant: AlertVariant =\n variantProp && isAlertVariant(variantProp) ? variantProp : \"info\";\n\n const colorValue =\n variant === \"success\" ? `var(--color-valid)` : `var(--color-${variant})`;\n\n const classes = classNames(\n \"mobius\",\n \"mobius-alert\",\n {\n \"--info\": variant === \"info\",\n \"--success\": variant === \"success\",\n \"--warning\": variant === \"warning\",\n \"--error\": variant === \"error\",\n \"--has-header\": header,\n },\n otherProps.className,\n );\n const icon = {\n info: circleInfo,\n success: circleTick,\n warning,\n error,\n };\n\n const headerClasses = classNames(\"mobius\", \"mobius-alert__header\");\n const iconClasses = classNames(\"mobius\", \"mobius-alert__icon\");\n const contentClasses = classNames(\"mobius\", \"mobius-alert__content\");\n\n return (\n <Element ref={ref} role=\"alert\" {...otherProps} className={classes}>\n <span className={iconClasses}>\n <Icon icon={icon[variant]} color={colorValue} />\n </span>\n <div>\n {header && (\n <TextOrHTML\n autoDetect\n htmlElementType=\"span\"\n className={headerClasses}\n htmlClassName={headerClasses}\n text={header}\n />\n )}\n <div className={contentClasses}>{children}</div>\n </div>\n </Element>\n );\n};\n\nAlert.displayName = \"Alert\";\nexport { Alert };\n", "import classNames from \"classnames/dedupe\";\nimport type { IconProps } from \"./types\";\nimport \"./Icon.css\";\n\nconst ICON_PREFIX = \"mobius-icon\";\n\nconst capitaliseFirstLetter = (str: string) =>\n str.charAt(0).toUpperCase() + str.slice(1);\n\nexport function Icon({\n ref,\n icon,\n className,\n size = \"xs\",\n color,\n fixedWidth,\n spin,\n spinReverse,\n title,\n ...otherProps\n}: IconProps) {\n if (!icon) {\n throw new Error(\"Must specify icon object\");\n }\n\n const classes = classNames(\n \"mobius\",\n \"mobius-icon\",\n `svg-inline--${ICON_PREFIX}`,\n `--size-${size}`,\n className,\n {\n [`${ICON_PREFIX}-fw`]: fixedWidth,\n [`${ICON_PREFIX}-spin`]: spin || spinReverse,\n [`${ICON_PREFIX}-spin-reverse`]: spinReverse,\n },\n );\n\n const { iconName, width, height, svgPathData } = icon;\n const formattedIconName = iconName.split(\"-\").join(\" \");\n\n const defaultTitle = `${capitaliseFirstLetter(formattedIconName)} icon`;\n const titleText = title || defaultTitle;\n\n return (\n <svg\n ref={ref}\n focusable=\"false\"\n data-icon={iconName}\n className={classes}\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${width} ${height}`}\n style={{ color }}\n {...otherProps}\n >\n <title>{titleText}</title>\n <path fill=\"currentColor\" d={svgPathData} />\n </svg>\n );\n}\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": "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",
6
+ "names": ["import_dedupe", "classNames", "import_dedupe", "import_dedupe", "import_jsx_runtime", "classNames", "import_jsx_runtime", "classNames", "import_jsx_runtime", "classNames"]
7
7
  }