@simplybusiness/mobius 10.4.0 → 10.4.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 (144) hide show
  1. package/CHANGELOG.md +13 -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/NumberField/NumberField.js +5 -4
  37. package/dist/cjs/components/NumberField/NumberField.js.map +2 -2
  38. package/dist/cjs/components/NumberField/index.js +5 -4
  39. package/dist/cjs/components/NumberField/index.js.map +2 -2
  40. package/dist/cjs/components/PasswordField/PasswordField.js +5 -4
  41. package/dist/cjs/components/PasswordField/PasswordField.js.map +2 -2
  42. package/dist/cjs/components/PasswordField/index.js +5 -4
  43. package/dist/cjs/components/PasswordField/index.js.map +2 -2
  44. package/dist/cjs/components/Radio/Radio.js +5 -4
  45. package/dist/cjs/components/Radio/Radio.js.map +2 -2
  46. package/dist/cjs/components/Radio/RadioGroup.js +5 -4
  47. package/dist/cjs/components/Radio/RadioGroup.js.map +2 -2
  48. package/dist/cjs/components/Radio/index.js +5 -4
  49. package/dist/cjs/components/Radio/index.js.map +2 -2
  50. package/dist/cjs/components/Select/Select.js +5 -4
  51. package/dist/cjs/components/Select/Select.js.map +2 -2
  52. package/dist/cjs/components/Select/index.js +5 -4
  53. package/dist/cjs/components/Select/index.js.map +2 -2
  54. package/dist/cjs/components/TextArea/TextArea.js +5 -4
  55. package/dist/cjs/components/TextArea/TextArea.js.map +2 -2
  56. package/dist/cjs/components/TextArea/index.js +5 -4
  57. package/dist/cjs/components/TextArea/index.js.map +2 -2
  58. package/dist/cjs/components/TextField/TextField.js +5 -4
  59. package/dist/cjs/components/TextField/TextField.js.map +2 -2
  60. package/dist/cjs/components/TextField/index.js +5 -4
  61. package/dist/cjs/components/TextField/index.js.map +2 -2
  62. package/dist/cjs/components/TextOrHTML/TextOrHTML.js +5 -4
  63. package/dist/cjs/components/TextOrHTML/TextOrHTML.js.map +2 -2
  64. package/dist/cjs/components/TextOrHTML/index.js +5 -4
  65. package/dist/cjs/components/TextOrHTML/index.js.map +2 -2
  66. package/dist/cjs/components/index.js +6 -5
  67. package/dist/cjs/components/index.js.map +2 -2
  68. package/dist/cjs/index.js +6 -5
  69. package/dist/cjs/index.js.map +2 -2
  70. package/dist/cjs/meta.json +103 -103
  71. package/dist/esm/{chunk-4WVJNNBK.js → chunk-2HUMNED2.js} +2 -2
  72. package/dist/esm/{chunk-N4WQ6522.js → chunk-2VEO5SSY.js} +2 -2
  73. package/dist/esm/{chunk-AFU7BFCD.js → chunk-576SEJGC.js} +3 -3
  74. package/dist/esm/{chunk-QPIA6BGW.js → chunk-6JCU4CGA.js} +2 -2
  75. package/dist/esm/{chunk-X6EPYQKX.js → chunk-F5ELD54X.js} +2 -2
  76. package/dist/esm/{chunk-ZN5TRIVZ.js → chunk-GV36OVX7.js} +2 -2
  77. package/dist/esm/{chunk-JNAQ76CR.js → chunk-HGNWNZ5E.js} +2 -2
  78. package/dist/esm/{chunk-ONDOONBM.js → chunk-HUSMC5GZ.js} +2 -2
  79. package/dist/esm/{chunk-UIIXVY6K.js → chunk-IQKS662C.js} +2 -2
  80. package/dist/esm/{chunk-DYTHXKMX.js → chunk-KTJCAQT4.js} +6 -5
  81. package/dist/esm/chunk-KTJCAQT4.js.map +7 -0
  82. package/dist/esm/{chunk-5OFXPT4J.js → chunk-M62U4QGQ.js} +2 -2
  83. package/dist/esm/{chunk-UQVAEWY2.js → chunk-MZJT3USG.js} +2 -2
  84. package/dist/esm/{chunk-FKTDL7KO.js → chunk-OAG5T7NC.js} +2 -2
  85. package/dist/esm/{chunk-M2NDSQR5.js → chunk-P6YHEIFT.js} +2 -2
  86. package/dist/esm/{chunk-P5VEI574.js → chunk-S4CU4XRB.js} +2 -2
  87. package/dist/esm/{chunk-4NBLO5WK.js → chunk-X4CMSAET.js} +2 -2
  88. package/dist/esm/{chunk-KQZ3MNK5.js → chunk-XNEQHHNV.js} +2 -2
  89. package/dist/esm/components/AddressLookup/AddressLookup.js +5 -5
  90. package/dist/esm/components/AddressLookup/index.js +5 -5
  91. package/dist/esm/components/Alert/Alert.js +2 -2
  92. package/dist/esm/components/Alert/index.js +2 -2
  93. package/dist/esm/components/Checkbox/Checkbox.js +3 -3
  94. package/dist/esm/components/Checkbox/CheckboxGroup.js +4 -4
  95. package/dist/esm/components/Checkbox/index.js +4 -4
  96. package/dist/esm/components/Combobox/Combobox.js +4 -4
  97. package/dist/esm/components/Combobox/index.js +4 -4
  98. package/dist/esm/components/DateField/DateField.js +4 -4
  99. package/dist/esm/components/DateField/index.js +4 -4
  100. package/dist/esm/components/ErrorMessage/ErrorMessage.js +2 -2
  101. package/dist/esm/components/ErrorMessage/index.js +2 -2
  102. package/dist/esm/components/ExpandableText/ExpandableText.js +2 -2
  103. package/dist/esm/components/ExpandableText/index.js +2 -2
  104. package/dist/esm/components/MaskedField/MaskedField.js +3 -3
  105. package/dist/esm/components/MaskedField/index.js +4 -4
  106. package/dist/esm/components/NumberField/NumberField.js +4 -4
  107. package/dist/esm/components/NumberField/index.js +4 -4
  108. package/dist/esm/components/PasswordField/PasswordField.js +4 -4
  109. package/dist/esm/components/PasswordField/index.js +4 -4
  110. package/dist/esm/components/Radio/Radio.js +3 -3
  111. package/dist/esm/components/Radio/RadioGroup.js +3 -3
  112. package/dist/esm/components/Radio/index.js +4 -4
  113. package/dist/esm/components/Select/Select.js +3 -3
  114. package/dist/esm/components/Select/index.js +3 -3
  115. package/dist/esm/components/TextArea/TextArea.js +3 -3
  116. package/dist/esm/components/TextArea/index.js +3 -3
  117. package/dist/esm/components/TextField/TextField.js +3 -3
  118. package/dist/esm/components/TextField/index.js +3 -3
  119. package/dist/esm/components/TextOrHTML/TextOrHTML.js +1 -1
  120. package/dist/esm/components/TextOrHTML/index.js +1 -1
  121. package/dist/esm/components/index.js +17 -17
  122. package/dist/esm/index.js +17 -17
  123. package/dist/esm/meta.json +191 -191
  124. package/dist/tsconfig.build.tsbuildinfo +1 -1
  125. package/package.json +2 -2
  126. package/src/components/TextOrHTML/TextOrHTML.test.tsx +45 -8
  127. package/src/components/TextOrHTML/TextOrHTML.tsx +7 -4
  128. package/dist/esm/chunk-DYTHXKMX.js.map +0 -7
  129. /package/dist/esm/{chunk-4WVJNNBK.js.map → chunk-2HUMNED2.js.map} +0 -0
  130. /package/dist/esm/{chunk-N4WQ6522.js.map → chunk-2VEO5SSY.js.map} +0 -0
  131. /package/dist/esm/{chunk-AFU7BFCD.js.map → chunk-576SEJGC.js.map} +0 -0
  132. /package/dist/esm/{chunk-QPIA6BGW.js.map → chunk-6JCU4CGA.js.map} +0 -0
  133. /package/dist/esm/{chunk-X6EPYQKX.js.map → chunk-F5ELD54X.js.map} +0 -0
  134. /package/dist/esm/{chunk-ZN5TRIVZ.js.map → chunk-GV36OVX7.js.map} +0 -0
  135. /package/dist/esm/{chunk-JNAQ76CR.js.map → chunk-HGNWNZ5E.js.map} +0 -0
  136. /package/dist/esm/{chunk-ONDOONBM.js.map → chunk-HUSMC5GZ.js.map} +0 -0
  137. /package/dist/esm/{chunk-UIIXVY6K.js.map → chunk-IQKS662C.js.map} +0 -0
  138. /package/dist/esm/{chunk-5OFXPT4J.js.map → chunk-M62U4QGQ.js.map} +0 -0
  139. /package/dist/esm/{chunk-UQVAEWY2.js.map → chunk-MZJT3USG.js.map} +0 -0
  140. /package/dist/esm/{chunk-FKTDL7KO.js.map → chunk-OAG5T7NC.js.map} +0 -0
  141. /package/dist/esm/{chunk-M2NDSQR5.js.map → chunk-P6YHEIFT.js.map} +0 -0
  142. /package/dist/esm/{chunk-P5VEI574.js.map → chunk-S4CU4XRB.js.map} +0 -0
  143. /package/dist/esm/{chunk-4NBLO5WK.js.map → chunk-X4CMSAET.js.map} +0 -0
  144. /package/dist/esm/{chunk-KQZ3MNK5.js.map → chunk-XNEQHHNV.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/ExpandableText/ExpandableText.tsx", "../../../../src/hooks/useBreakpoint/useBreakpoint.tsx", "../../../../src/utils/filterUndefinedProps.ts", "../../../../src/utils/getSpacingValue.ts", "../../../../src/components/Accordion/Accordion.tsx", "../../../../src/components/Accordion/AccordionLink.tsx", "../../../../src/components/Flex/Flex.tsx", "../../../../src/components/Flex/propUtils.ts", "../../../../src/components/Icon/Icon.tsx", "../../../../src/components/TextOrHTML/TextOrHTML.tsx", "../../../../src/components/Text/Text.tsx"],
4
- "sourcesContent": ["\"use client\";\n\nimport classNames from \"classnames/dedupe\";\nimport type React from \"react\";\nimport type { RefAttributes } from \"react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { useBreakpoint } from \"../../hooks\";\nimport type { DOMProps } from \"../../types\";\nimport { Accordion } from \"../Accordion\";\nimport { TextOrHTML } from \"../TextOrHTML\";\nimport type { AccordionProps } from \"../Accordion/Accordion\";\nimport type { TextProps } from \"../Text/Text\";\nimport \"./ExpandableText.css\";\n\nexport type ExpandableTextElementType = HTMLDivElement;\n\nexport interface ExpandableTextProps\n extends DOMProps, RefAttributes<ExpandableTextElementType> {\n /** The text content to display (can be plain text or HTML) */\n text: string;\n /** Maximum number of lines to show when collapsed */\n maxLines?: number;\n /** Breakpoint at which collapsing should be applied. If not provided, collapsing is always applied */\n breakpoint?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** Text for the expand trigger */\n showText?: string;\n /** Text for the collapse trigger */\n hideText?: string;\n /** Custom class name for the container */\n className?: string;\n /** Props to pass to the Text component */\n textProps?: Partial<TextProps>;\n /** Props to pass to the Accordion component */\n accordionProps?: Partial<AccordionProps>;\n /** Callback when expansion state changes */\n onToggle?: (expanded: boolean) => void;\n}\n\nexport const ExpandableText = ({ ref, ...props }: ExpandableTextProps) => {\n const {\n text,\n maxLines = 3,\n breakpoint,\n showText = \"Read more\",\n hideText = \"Read less\",\n className,\n textProps = {},\n accordionProps = {},\n onToggle,\n ...otherProps\n } = props;\n\n const [isExpanded, setIsExpanded] = useState(false);\n const [isCollapsed, setIsCollapsed] = useState(false);\n const textRef = useRef<HTMLDivElement>(null);\n const { down } = useBreakpoint();\n\n // Generate unique ID for accessibility\n const baseId = useId();\n const expandButtonId = `expandable-text-expand-${baseId}`;\n\n // Determine if content should be collapsible based on breakpoint\n const shouldCollapse = breakpoint ? down(breakpoint) : true;\n\n useEffect(() => {\n if (!shouldCollapse || !textRef.current) {\n setIsCollapsed(false);\n return;\n }\n\n // Check if text is actually collapsed by comparing scroll height with client height\n const element = textRef.current;\n const isOverflowing = element.scrollHeight > element.clientHeight;\n setIsCollapsed(isOverflowing);\n }, [text, shouldCollapse, maxLines]);\n\n // If breakpoint is specified and we're above it, show full text without collapsible UI\n if (breakpoint && !shouldCollapse) {\n return (\n <div ref={ref} className={className} {...otherProps}>\n <TextOrHTML text={text} textWrapper {...textProps} />\n </div>\n );\n }\n\n const handleAccordionChange = (expanded: boolean) => {\n setIsExpanded(expanded);\n onToggle?.(expanded);\n };\n\n const classes = classNames(\"mobius-expandable-text\", className);\n const textContainerClasses = classNames(\"mobius-expandable-text__content\", {\n \"mobius-expandable-text__content--collapsed\": !isExpanded,\n });\n\n // CSS custom property for dynamic line clamping\n const textContainerStyle = {\n \"--line-clamp\": maxLines,\n } as React.CSSProperties;\n\n return (\n <div\n ref={ref}\n className={classes}\n data-testid=\"expandable-text\"\n {...otherProps}\n >\n <div\n ref={textRef}\n className={textContainerClasses}\n style={textContainerStyle}\n data-testid=\"expandable-text-content\"\n aria-describedby={isCollapsed ? expandButtonId : undefined}\n >\n <TextOrHTML elementType=\"span\" textWrapper text={text} {...textProps} />\n </div>\n {isCollapsed && (\n <Accordion\n showText={showText}\n hideText={hideText}\n headerPosition=\"bottom\"\n onChange={handleAccordionChange}\n onClick={(e?: React.MouseEvent) => {\n e?.stopPropagation();\n }}\n id={expandButtonId}\n {...accordionProps}\n />\n )}\n </div>\n );\n};\n\nExpandableText.displayName = \"ExpandableText\";\n", "\"use client\";\n\nimport {\n useDebouncedValue,\n useIsClient,\n useWindowEvent,\n} from \"@simplybusiness/mobius-hooks\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport type { SizeType } from \"../../types\";\n\nexport type Breakpoint = {\n size: SizeType;\n value: number;\n};\nexport type BreakpointsType = Breakpoint[];\nexport type UseBreakpointType = {\n breakpoint: Breakpoint;\n up: (size: SizeType) => boolean | undefined;\n down: (size: SizeType) => boolean | undefined;\n};\n\n// Hard code breakpoints for SB designs\nexport const DEFAULT_BREAKPOINTS = [\n { size: \"xs\", value: 320 },\n { size: \"sm\", value: 480 },\n { size: \"md\", value: 670 },\n { size: \"lg\", value: 960 },\n { size: \"xl\", value: 1200 },\n { size: \"xxl\", value: 1320 },\n] as BreakpointsType;\n\nconst PASSIVE: AddEventListenerOptions = { passive: true };\n\nconst getBreakpoint = (breakpoints: BreakpointsType, windowWidth: number) => {\n // When breakpoint size and windowWidth are a match\n // The addition of 1px ensures the right breakpoint\n const closest = breakpoints.findIndex(\n breakpoint => breakpoint.value >= windowWidth + 1,\n );\n const smallest = breakpoints[0];\n const largest = breakpoints[breakpoints.length - 1];\n const match = breakpoints[closest - 1];\n\n if (closest === 0) return smallest;\n if (closest === -1) return largest;\n\n return match;\n};\n\nconst useBreakpoint = (\n customBreakpoints?: BreakpointsType,\n): UseBreakpointType => {\n const isClientSide = useIsClient();\n const breakpoints = customBreakpoints || DEFAULT_BREAKPOINTS;\n const defaultBreakpoint = breakpoints[0];\n\n const [windowWidth, setWindowWidth] = useState<number>(\n typeof globalThis?.window !== \"undefined\"\n ? window.innerWidth\n : defaultBreakpoint.value,\n );\n\n useWindowEvent(\"resize\", () => setWindowWidth(window.innerWidth), PASSIVE);\n\n const debouncedWidth = useDebouncedValue(windowWidth, 200);\n\n // Gate on isClientSide so up()/down() also return default-based values\n // during SSR and hydration, matching the server render.\n const currentBreakpoint = useMemo(\n () =>\n !isClientSide || breakpoints.length === 0\n ? defaultBreakpoint\n : getBreakpoint(breakpoints, debouncedWidth),\n [isClientSide, breakpoints, defaultBreakpoint, debouncedWidth],\n );\n\n const up = useCallback(\n (size: SizeType) => {\n const sizeIndex = breakpoints.findIndex(item => item.size === size);\n if (sizeIndex === -1) {\n return false;\n }\n const currentIndex = breakpoints.findIndex(\n item => item.size === currentBreakpoint.size,\n );\n\n return currentIndex >= sizeIndex;\n },\n [currentBreakpoint, breakpoints],\n );\n\n const down = useCallback(\n (size: SizeType) => {\n const sizeIndex = breakpoints.findIndex(item => item.size === size);\n if (sizeIndex === -1) {\n return true;\n }\n const currentIndex = breakpoints.findIndex(\n item => item.size === currentBreakpoint.size,\n );\n\n return currentIndex <= sizeIndex;\n },\n [currentBreakpoint, breakpoints],\n );\n\n return {\n breakpoint: currentBreakpoint,\n up,\n down,\n };\n};\n\nexport { useBreakpoint };\n", "export const filterUndefinedProps = (props: Record<string, unknown>) => {\n const filteredProps: Record<string, unknown> = {};\n Object.keys(props).forEach(key => {\n if (props[key] !== undefined) {\n filteredProps[key] = props[key];\n }\n });\n return filteredProps;\n};\n", "import type { SpacingType } from \"../types\";\n\nexport const getSpacingValue = (\n padding: SpacingType | undefined,\n): string | undefined => {\n if (typeof padding === \"string\") {\n return `var(--size-${padding})`;\n }\n\n if (typeof padding === \"number\") {\n return `${padding}px`;\n }\n\n return undefined;\n};\n", "\"use client\";\n\nimport classNames from \"classnames/dedupe\";\nimport type { ReactNode, RefAttributes } from \"react\";\nimport { useEffect, useState, useId } from \"react\";\nimport { usePrefersReducedMotion } from \"@simplybusiness/mobius-hooks\";\nimport type { DOMProps } from \"../../types\";\n\nimport type {\n AccordionElementType,\n AccordionLinkElementType,\n} from \"./AccordionLink\";\nimport { AccordionLink } from \"./AccordionLink\";\nimport \"./Accordion.css\";\n\nexport interface AccordionProps\n extends DOMProps, RefAttributes<AccordionElementType> {\n /** Custom class name for setting specific CSS */\n className?: string;\n /** Link text to show accordion content */\n showText?: string | ReactNode;\n /** Link text to hide accordion content */\n hideText?: string | ReactNode;\n /** Whether header is above or below content */\n headerPosition?: \"top\" | \"bottom\";\n /** Whether to expand the accordion initially */\n startOpen?: boolean | undefined;\n /** Semantic heading for title link (default is span) */\n linkElementType?: AccordionLinkElementType;\n /** Callback that fires when the accordion link is clicked (fires before toggle) */\n onClick?: (e?: React.MouseEvent) => void;\n /** Callback that fires each time the accordion is opened */\n onOpen?: () => void;\n /** Callback that fires each time the accordion is closed */\n onClose?: () => void;\n /** Callback that fires each time the accordion state changes */\n onChange?: (state: boolean) => void;\n children?: ReactNode;\n headerChildren?: ReactNode;\n}\n\nexport const Accordion = ({ ref, ...props }: AccordionProps) => {\n const {\n showText = \"See more\",\n hideText = \"See less\",\n headerPosition = \"top\",\n startOpen = false,\n linkElementType,\n onClick,\n onOpen,\n onClose,\n onChange = () => {},\n headerChildren,\n ...rest\n } = props;\n\n const [accordionState, setAccordionState] = useState({\n open: startOpen,\n withAnimation: false,\n });\n const prefersReducedMotion = usePrefersReducedMotion();\n\n const containerClasses = classNames(\n \"mobius\",\n \"mobius-accordion\",\n props.className,\n {\n \"--should-animate\": accordionState.withAnimation && !prefersReducedMotion,\n \"--is-open\": accordionState.open,\n },\n );\n const contentContainerClasses = classNames(\n \"mobius-accordion__content-container\",\n {\n \"--is-open\": accordionState.open,\n },\n );\n const contentClasses = classNames(\"mobius-accordion__content\", {\n \"--is-open\": accordionState.open,\n });\n\n const linkText = accordionState.open ? hideText : showText;\n\n const handleChange = () => {\n // Fire events\n if (!accordionState.open && onOpen) {\n onOpen();\n }\n if (accordionState.open && onClose) {\n onClose();\n }\n if (onChange) {\n onChange(!accordionState.open);\n }\n setAccordionState({\n open: !accordionState.open,\n withAnimation: true,\n });\n };\n\n useEffect(() => {\n setAccordionState({\n open: startOpen,\n withAnimation: true,\n });\n }, [startOpen]);\n\n // Generate unique IDs for accessibility\n const baseId = useId();\n const accordionId = `accordion-header-${baseId}`;\n const contentId = `accordion-panel-${baseId}`;\n\n return (\n <div ref={ref} {...rest} className={containerClasses}>\n {headerPosition === \"top\" && (\n <AccordionLink\n text={linkText}\n elementType={linkElementType}\n toggle={handleChange}\n onClick={onClick}\n ariaExpanded={accordionState.open}\n headerChildren={headerChildren}\n accordionId={accordionId}\n contentId={contentId}\n />\n )}\n <div\n id={contentId}\n className={contentContainerClasses}\n aria-hidden={!accordionState.open}\n aria-labelledby={accordionId}\n role=\"region\"\n >\n <div className={contentClasses}>{props.children}</div>\n </div>\n {headerPosition === \"bottom\" && (\n <AccordionLink\n text={linkText}\n toggle={handleChange}\n onClick={onClick}\n ariaExpanded={accordionState.open}\n headerChildren={headerChildren}\n accordionId={accordionId}\n contentId={contentId}\n />\n )}\n </div>\n );\n};\n\nAccordion.displayName = \"Accordion\";\n", "import type { KeyboardEvent, ReactNode } from \"react\";\nimport type { DOMProps } from \"../../types\";\nimport classNames from \"classnames/dedupe\";\nimport { Flex } from \"../Flex\";\nimport { Icon } from \"../Icon\";\nimport { chevronDown } from \"@simplybusiness/icons\";\n\nexport type AccordionLinkElementType =\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"h5\"\n | \"h6\"\n | \"span\";\nexport type AccordionElementType = HTMLDivElement;\n\nexport interface AccordionLinkProps extends DOMProps {\n text: string | ReactNode;\n elementType?: AccordionLinkElementType;\n onClick?: (e?: React.MouseEvent) => void;\n toggle: () => void;\n headerChildren?: ReactNode;\n ariaExpanded: boolean | undefined;\n accordionId: string;\n contentId: string;\n}\n\nexport const AccordionLink = ({\n text,\n elementType: LinkElement = \"span\",\n toggle,\n onClick,\n headerChildren,\n ariaExpanded,\n accordionId,\n contentId,\n}: AccordionLinkProps) => {\n const linkClasses = classNames(\"mobius-accordion__link\", {\n \"--is-open\": ariaExpanded,\n });\n const iconClasses = classNames(\"mobius-accordion__link-icon\", {\n \"--is-open\": ariaExpanded,\n });\n const handleOnClick = (e?: React.MouseEvent): void => {\n if (onClick) {\n onClick(e);\n }\n toggle();\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \" \" || e.key === \"Enter\") {\n toggle();\n }\n };\n\n if (headerChildren) {\n return (\n <Flex\n justifyContent=\"space-between\"\n alignItems=\"center\"\n className=\"mobius-accordion__header\"\n >\n <div\n id={accordionId}\n className={linkClasses}\n onClick={handleOnClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-expanded={!!ariaExpanded}\n aria-controls={contentId}\n >\n <LinkElement className=\"mobius-accordion__link-text\">\n {text}\n </LinkElement>\n <Icon icon={chevronDown} className={iconClasses} />\n </div>\n {headerChildren}\n </Flex>\n );\n }\n\n return (\n <div\n id={accordionId}\n className={linkClasses}\n onClick={handleOnClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-expanded={!!ariaExpanded}\n aria-controls={contentId}\n >\n <LinkElement className=\"mobius-accordion__link-text\">{text}</LinkElement>\n <Icon icon={chevronDown} className={iconClasses} />\n </div>\n );\n};\n", "import classNames from \"classnames/dedupe\";\nimport type { FlexProps } from \"./types\";\nimport { buildFlexStyles, splitProps } from \"./propUtils\";\nimport \"./Flex.css\";\n\nconst Flex = ({ ref, ...props }: FlexProps) => {\n const {\n elementType: Element = \"div\",\n style,\n className,\n ...otherProps\n } = props;\n const classes = classNames(\"mobius\", \"mobius-flex\", className);\n\n const [styleProps, restProps] = splitProps(otherProps);\n const flexStyles = buildFlexStyles(styleProps);\n\n return (\n <Element\n ref={ref}\n style={{\n ...flexStyles,\n ...style,\n }}\n className={classes}\n {...restProps}\n />\n );\n};\n\nFlex.displayName = \"Flex\";\nexport { Flex };\n", "import { getSpacingValue } from \"../../utils\";\nimport { filterUndefinedProps } from \"../../utils/filterUndefinedProps\";\nimport type { FlexNonStyleProps, FlexProps, FlexStyleProps } from \"./types\";\n\nexport const buildFlexStyles = (props: FlexStyleProps) => {\n const {\n flexDirection,\n flexWrap,\n flexGrow,\n flex,\n justifyContent,\n alignItems,\n alignContent,\n gap,\n rowGap,\n columnGap,\n } = props;\n\n const styleProps = {\n flexDirection,\n flexWrap,\n flexGrow,\n flex,\n justifyContent,\n alignItems,\n alignContent,\n gap: getSpacingValue(gap),\n columnGap: getSpacingValue(columnGap),\n rowGap: getSpacingValue(rowGap),\n };\n\n return filterUndefinedProps(styleProps);\n};\n\nexport const splitProps = (\n props: FlexProps,\n): [FlexStyleProps, FlexNonStyleProps] => {\n const {\n flexDirection,\n flexWrap,\n flexGrow,\n flex,\n justifyContent,\n alignItems,\n alignContent,\n gap,\n rowGap,\n columnGap,\n ...otherProps\n } = props;\n\n return [\n {\n flexDirection,\n flexWrap,\n flexGrow,\n flex,\n justifyContent,\n alignItems,\n alignContent,\n gap,\n rowGap,\n columnGap,\n },\n otherProps,\n ];\n};\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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",
4
+ "sourcesContent": ["\"use client\";\n\nimport classNames from \"classnames/dedupe\";\nimport type React from \"react\";\nimport type { RefAttributes } from \"react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { useBreakpoint } from \"../../hooks\";\nimport type { DOMProps } from \"../../types\";\nimport { Accordion } from \"../Accordion\";\nimport { TextOrHTML } from \"../TextOrHTML\";\nimport type { AccordionProps } from \"../Accordion/Accordion\";\nimport type { TextProps } from \"../Text/Text\";\nimport \"./ExpandableText.css\";\n\nexport type ExpandableTextElementType = HTMLDivElement;\n\nexport interface ExpandableTextProps\n extends DOMProps, RefAttributes<ExpandableTextElementType> {\n /** The text content to display (can be plain text or HTML) */\n text: string;\n /** Maximum number of lines to show when collapsed */\n maxLines?: number;\n /** Breakpoint at which collapsing should be applied. If not provided, collapsing is always applied */\n breakpoint?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** Text for the expand trigger */\n showText?: string;\n /** Text for the collapse trigger */\n hideText?: string;\n /** Custom class name for the container */\n className?: string;\n /** Props to pass to the Text component */\n textProps?: Partial<TextProps>;\n /** Props to pass to the Accordion component */\n accordionProps?: Partial<AccordionProps>;\n /** Callback when expansion state changes */\n onToggle?: (expanded: boolean) => void;\n}\n\nexport const ExpandableText = ({ ref, ...props }: ExpandableTextProps) => {\n const {\n text,\n maxLines = 3,\n breakpoint,\n showText = \"Read more\",\n hideText = \"Read less\",\n className,\n textProps = {},\n accordionProps = {},\n onToggle,\n ...otherProps\n } = props;\n\n const [isExpanded, setIsExpanded] = useState(false);\n const [isCollapsed, setIsCollapsed] = useState(false);\n const textRef = useRef<HTMLDivElement>(null);\n const { down } = useBreakpoint();\n\n // Generate unique ID for accessibility\n const baseId = useId();\n const expandButtonId = `expandable-text-expand-${baseId}`;\n\n // Determine if content should be collapsible based on breakpoint\n const shouldCollapse = breakpoint ? down(breakpoint) : true;\n\n useEffect(() => {\n if (!shouldCollapse || !textRef.current) {\n setIsCollapsed(false);\n return;\n }\n\n // Check if text is actually collapsed by comparing scroll height with client height\n const element = textRef.current;\n const isOverflowing = element.scrollHeight > element.clientHeight;\n setIsCollapsed(isOverflowing);\n }, [text, shouldCollapse, maxLines]);\n\n // If breakpoint is specified and we're above it, show full text without collapsible UI\n if (breakpoint && !shouldCollapse) {\n return (\n <div ref={ref} className={className} {...otherProps}>\n <TextOrHTML text={text} textWrapper {...textProps} />\n </div>\n );\n }\n\n const handleAccordionChange = (expanded: boolean) => {\n setIsExpanded(expanded);\n onToggle?.(expanded);\n };\n\n const classes = classNames(\"mobius-expandable-text\", className);\n const textContainerClasses = classNames(\"mobius-expandable-text__content\", {\n \"mobius-expandable-text__content--collapsed\": !isExpanded,\n });\n\n // CSS custom property for dynamic line clamping\n const textContainerStyle = {\n \"--line-clamp\": maxLines,\n } as React.CSSProperties;\n\n return (\n <div\n ref={ref}\n className={classes}\n data-testid=\"expandable-text\"\n {...otherProps}\n >\n <div\n ref={textRef}\n className={textContainerClasses}\n style={textContainerStyle}\n data-testid=\"expandable-text-content\"\n aria-describedby={isCollapsed ? expandButtonId : undefined}\n >\n <TextOrHTML elementType=\"span\" textWrapper text={text} {...textProps} />\n </div>\n {isCollapsed && (\n <Accordion\n showText={showText}\n hideText={hideText}\n headerPosition=\"bottom\"\n onChange={handleAccordionChange}\n onClick={(e?: React.MouseEvent) => {\n e?.stopPropagation();\n }}\n id={expandButtonId}\n {...accordionProps}\n />\n )}\n </div>\n );\n};\n\nExpandableText.displayName = \"ExpandableText\";\n", "\"use client\";\n\nimport {\n useDebouncedValue,\n useIsClient,\n useWindowEvent,\n} from \"@simplybusiness/mobius-hooks\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport type { SizeType } from \"../../types\";\n\nexport type Breakpoint = {\n size: SizeType;\n value: number;\n};\nexport type BreakpointsType = Breakpoint[];\nexport type UseBreakpointType = {\n breakpoint: Breakpoint;\n up: (size: SizeType) => boolean | undefined;\n down: (size: SizeType) => boolean | undefined;\n};\n\n// Hard code breakpoints for SB designs\nexport const DEFAULT_BREAKPOINTS = [\n { size: \"xs\", value: 320 },\n { size: \"sm\", value: 480 },\n { size: \"md\", value: 670 },\n { size: \"lg\", value: 960 },\n { size: \"xl\", value: 1200 },\n { size: \"xxl\", value: 1320 },\n] as BreakpointsType;\n\nconst PASSIVE: AddEventListenerOptions = { passive: true };\n\nconst getBreakpoint = (breakpoints: BreakpointsType, windowWidth: number) => {\n // When breakpoint size and windowWidth are a match\n // The addition of 1px ensures the right breakpoint\n const closest = breakpoints.findIndex(\n breakpoint => breakpoint.value >= windowWidth + 1,\n );\n const smallest = breakpoints[0];\n const largest = breakpoints[breakpoints.length - 1];\n const match = breakpoints[closest - 1];\n\n if (closest === 0) return smallest;\n if (closest === -1) return largest;\n\n return match;\n};\n\nconst useBreakpoint = (\n customBreakpoints?: BreakpointsType,\n): UseBreakpointType => {\n const isClientSide = useIsClient();\n const breakpoints = customBreakpoints || DEFAULT_BREAKPOINTS;\n const defaultBreakpoint = breakpoints[0];\n\n const [windowWidth, setWindowWidth] = useState<number>(\n typeof globalThis?.window !== \"undefined\"\n ? window.innerWidth\n : defaultBreakpoint.value,\n );\n\n useWindowEvent(\"resize\", () => setWindowWidth(window.innerWidth), PASSIVE);\n\n const debouncedWidth = useDebouncedValue(windowWidth, 200);\n\n // Gate on isClientSide so up()/down() also return default-based values\n // during SSR and hydration, matching the server render.\n const currentBreakpoint = useMemo(\n () =>\n !isClientSide || breakpoints.length === 0\n ? defaultBreakpoint\n : getBreakpoint(breakpoints, debouncedWidth),\n [isClientSide, breakpoints, defaultBreakpoint, debouncedWidth],\n );\n\n const up = useCallback(\n (size: SizeType) => {\n const sizeIndex = breakpoints.findIndex(item => item.size === size);\n if (sizeIndex === -1) {\n return false;\n }\n const currentIndex = breakpoints.findIndex(\n item => item.size === currentBreakpoint.size,\n );\n\n return currentIndex >= sizeIndex;\n },\n [currentBreakpoint, breakpoints],\n );\n\n const down = useCallback(\n (size: SizeType) => {\n const sizeIndex = breakpoints.findIndex(item => item.size === size);\n if (sizeIndex === -1) {\n return true;\n }\n const currentIndex = breakpoints.findIndex(\n item => item.size === currentBreakpoint.size,\n );\n\n return currentIndex <= sizeIndex;\n },\n [currentBreakpoint, breakpoints],\n );\n\n return {\n breakpoint: currentBreakpoint,\n up,\n down,\n };\n};\n\nexport { useBreakpoint };\n", "export const filterUndefinedProps = (props: Record<string, unknown>) => {\n const filteredProps: Record<string, unknown> = {};\n Object.keys(props).forEach(key => {\n if (props[key] !== undefined) {\n filteredProps[key] = props[key];\n }\n });\n return filteredProps;\n};\n", "import type { SpacingType } from \"../types\";\n\nexport const getSpacingValue = (\n padding: SpacingType | undefined,\n): string | undefined => {\n if (typeof padding === \"string\") {\n return `var(--size-${padding})`;\n }\n\n if (typeof padding === \"number\") {\n return `${padding}px`;\n }\n\n return undefined;\n};\n", "\"use client\";\n\nimport classNames from \"classnames/dedupe\";\nimport type { ReactNode, RefAttributes } from \"react\";\nimport { useEffect, useState, useId } from \"react\";\nimport { usePrefersReducedMotion } from \"@simplybusiness/mobius-hooks\";\nimport type { DOMProps } from \"../../types\";\n\nimport type {\n AccordionElementType,\n AccordionLinkElementType,\n} from \"./AccordionLink\";\nimport { AccordionLink } from \"./AccordionLink\";\nimport \"./Accordion.css\";\n\nexport interface AccordionProps\n extends DOMProps, RefAttributes<AccordionElementType> {\n /** Custom class name for setting specific CSS */\n className?: string;\n /** Link text to show accordion content */\n showText?: string | ReactNode;\n /** Link text to hide accordion content */\n hideText?: string | ReactNode;\n /** Whether header is above or below content */\n headerPosition?: \"top\" | \"bottom\";\n /** Whether to expand the accordion initially */\n startOpen?: boolean | undefined;\n /** Semantic heading for title link (default is span) */\n linkElementType?: AccordionLinkElementType;\n /** Callback that fires when the accordion link is clicked (fires before toggle) */\n onClick?: (e?: React.MouseEvent) => void;\n /** Callback that fires each time the accordion is opened */\n onOpen?: () => void;\n /** Callback that fires each time the accordion is closed */\n onClose?: () => void;\n /** Callback that fires each time the accordion state changes */\n onChange?: (state: boolean) => void;\n children?: ReactNode;\n headerChildren?: ReactNode;\n}\n\nexport const Accordion = ({ ref, ...props }: AccordionProps) => {\n const {\n showText = \"See more\",\n hideText = \"See less\",\n headerPosition = \"top\",\n startOpen = false,\n linkElementType,\n onClick,\n onOpen,\n onClose,\n onChange = () => {},\n headerChildren,\n ...rest\n } = props;\n\n const [accordionState, setAccordionState] = useState({\n open: startOpen,\n withAnimation: false,\n });\n const prefersReducedMotion = usePrefersReducedMotion();\n\n const containerClasses = classNames(\n \"mobius\",\n \"mobius-accordion\",\n props.className,\n {\n \"--should-animate\": accordionState.withAnimation && !prefersReducedMotion,\n \"--is-open\": accordionState.open,\n },\n );\n const contentContainerClasses = classNames(\n \"mobius-accordion__content-container\",\n {\n \"--is-open\": accordionState.open,\n },\n );\n const contentClasses = classNames(\"mobius-accordion__content\", {\n \"--is-open\": accordionState.open,\n });\n\n const linkText = accordionState.open ? hideText : showText;\n\n const handleChange = () => {\n // Fire events\n if (!accordionState.open && onOpen) {\n onOpen();\n }\n if (accordionState.open && onClose) {\n onClose();\n }\n if (onChange) {\n onChange(!accordionState.open);\n }\n setAccordionState({\n open: !accordionState.open,\n withAnimation: true,\n });\n };\n\n useEffect(() => {\n setAccordionState({\n open: startOpen,\n withAnimation: true,\n });\n }, [startOpen]);\n\n // Generate unique IDs for accessibility\n const baseId = useId();\n const accordionId = `accordion-header-${baseId}`;\n const contentId = `accordion-panel-${baseId}`;\n\n return (\n <div ref={ref} {...rest} className={containerClasses}>\n {headerPosition === \"top\" && (\n <AccordionLink\n text={linkText}\n elementType={linkElementType}\n toggle={handleChange}\n onClick={onClick}\n ariaExpanded={accordionState.open}\n headerChildren={headerChildren}\n accordionId={accordionId}\n contentId={contentId}\n />\n )}\n <div\n id={contentId}\n className={contentContainerClasses}\n aria-hidden={!accordionState.open}\n aria-labelledby={accordionId}\n role=\"region\"\n >\n <div className={contentClasses}>{props.children}</div>\n </div>\n {headerPosition === \"bottom\" && (\n <AccordionLink\n text={linkText}\n toggle={handleChange}\n onClick={onClick}\n ariaExpanded={accordionState.open}\n headerChildren={headerChildren}\n accordionId={accordionId}\n contentId={contentId}\n />\n )}\n </div>\n );\n};\n\nAccordion.displayName = \"Accordion\";\n", "import type { KeyboardEvent, ReactNode } from \"react\";\nimport type { DOMProps } from \"../../types\";\nimport classNames from \"classnames/dedupe\";\nimport { Flex } from \"../Flex\";\nimport { Icon } from \"../Icon\";\nimport { chevronDown } from \"@simplybusiness/icons\";\n\nexport type AccordionLinkElementType =\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"h5\"\n | \"h6\"\n | \"span\";\nexport type AccordionElementType = HTMLDivElement;\n\nexport interface AccordionLinkProps extends DOMProps {\n text: string | ReactNode;\n elementType?: AccordionLinkElementType;\n onClick?: (e?: React.MouseEvent) => void;\n toggle: () => void;\n headerChildren?: ReactNode;\n ariaExpanded: boolean | undefined;\n accordionId: string;\n contentId: string;\n}\n\nexport const AccordionLink = ({\n text,\n elementType: LinkElement = \"span\",\n toggle,\n onClick,\n headerChildren,\n ariaExpanded,\n accordionId,\n contentId,\n}: AccordionLinkProps) => {\n const linkClasses = classNames(\"mobius-accordion__link\", {\n \"--is-open\": ariaExpanded,\n });\n const iconClasses = classNames(\"mobius-accordion__link-icon\", {\n \"--is-open\": ariaExpanded,\n });\n const handleOnClick = (e?: React.MouseEvent): void => {\n if (onClick) {\n onClick(e);\n }\n toggle();\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \" \" || e.key === \"Enter\") {\n toggle();\n }\n };\n\n if (headerChildren) {\n return (\n <Flex\n justifyContent=\"space-between\"\n alignItems=\"center\"\n className=\"mobius-accordion__header\"\n >\n <div\n id={accordionId}\n className={linkClasses}\n onClick={handleOnClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-expanded={!!ariaExpanded}\n aria-controls={contentId}\n >\n <LinkElement className=\"mobius-accordion__link-text\">\n {text}\n </LinkElement>\n <Icon icon={chevronDown} className={iconClasses} />\n </div>\n {headerChildren}\n </Flex>\n );\n }\n\n return (\n <div\n id={accordionId}\n className={linkClasses}\n onClick={handleOnClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-expanded={!!ariaExpanded}\n aria-controls={contentId}\n >\n <LinkElement className=\"mobius-accordion__link-text\">{text}</LinkElement>\n <Icon icon={chevronDown} className={iconClasses} />\n </div>\n );\n};\n", "import classNames from \"classnames/dedupe\";\nimport type { FlexProps } from \"./types\";\nimport { buildFlexStyles, splitProps } from \"./propUtils\";\nimport \"./Flex.css\";\n\nconst Flex = ({ ref, ...props }: FlexProps) => {\n const {\n elementType: Element = \"div\",\n style,\n className,\n ...otherProps\n } = props;\n const classes = classNames(\"mobius\", \"mobius-flex\", className);\n\n const [styleProps, restProps] = splitProps(otherProps);\n const flexStyles = buildFlexStyles(styleProps);\n\n return (\n <Element\n ref={ref}\n style={{\n ...flexStyles,\n ...style,\n }}\n className={classes}\n {...restProps}\n />\n );\n};\n\nFlex.displayName = \"Flex\";\nexport { Flex };\n", "import { getSpacingValue } from \"../../utils\";\nimport { filterUndefinedProps } from \"../../utils/filterUndefinedProps\";\nimport type { FlexNonStyleProps, FlexProps, FlexStyleProps } from \"./types\";\n\nexport const buildFlexStyles = (props: FlexStyleProps) => {\n const {\n flexDirection,\n flexWrap,\n flexGrow,\n flex,\n justifyContent,\n alignItems,\n alignContent,\n gap,\n rowGap,\n columnGap,\n } = props;\n\n const styleProps = {\n flexDirection,\n flexWrap,\n flexGrow,\n flex,\n justifyContent,\n alignItems,\n alignContent,\n gap: getSpacingValue(gap),\n columnGap: getSpacingValue(columnGap),\n rowGap: getSpacingValue(rowGap),\n };\n\n return filterUndefinedProps(styleProps);\n};\n\nexport const splitProps = (\n props: FlexProps,\n): [FlexStyleProps, FlexNonStyleProps] => {\n const {\n flexDirection,\n flexWrap,\n flexGrow,\n flex,\n justifyContent,\n alignItems,\n alignContent,\n gap,\n rowGap,\n columnGap,\n ...otherProps\n } = props;\n\n return [\n {\n flexDirection,\n flexWrap,\n flexGrow,\n flex,\n justifyContent,\n alignItems,\n alignContent,\n gap,\n rowGap,\n columnGap,\n },\n otherProps,\n ];\n};\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\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": "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",
6
6
  "names": ["import_dedupe", "import_react", "import_dedupe", "import_react", "import_mobius_hooks", "import_dedupe", "classNames", "import_dedupe", "import_jsx_runtime", "classNames", "import_jsx_runtime", "classNames", "import_jsx_runtime", "classNames", "import_dedupe", "import_react", "import_dedupe", "import_jsx_runtime", "classNames", "import_jsx_runtime", "classNames", "import_jsx_runtime", "classNames"]
7
7
  }
@@ -504,7 +504,8 @@ Text.displayName = "Text";
504
504
 
505
505
  // src/components/TextOrHTML/TextOrHTML.tsx
506
506
  var import_jsx_runtime6 = require("react/jsx-runtime");
507
- var isBlockHTML = (text) => /^\s*<[a-z]/i.test(text);
507
+ var BLOCK_TAG = /<(div|p|ul|ol|li|h[1-6]|table|tr|td|th|blockquote|pre|hr|dl|dt|dd)[\s>/]/i;
508
+ var containsBlockHTML = (text) => BLOCK_TAG.test(text);
508
509
  var containsHTML = (text) => /<[a-z/]/i.test(text) || /&(?:#\d+|#x[\da-f]+|[a-z]\w*);/i.test(text);
509
510
  var buildTextClasses = (textProps, htmlClassName) => {
510
511
  const { variant, elementType, spacing, className } = textProps;
@@ -527,9 +528,9 @@ var TextOrHTML = ({
527
528
  autoDetect = false,
528
529
  ...textProps
529
530
  }) => {
530
- const textIsBlockHTML = autoDetect && isBlockHTML(text);
531
+ const hasBlockContent = autoDetect && containsBlockHTML(text);
531
532
  const dangerousHTML = (0, import_react3.useMemo)(() => ({ __html: text }), [text]);
532
- if (autoDetect && !textIsBlockHTML) {
533
+ if (autoDetect && !hasBlockContent) {
533
534
  const { variant, spacing, elementType, className, ...domProps } = textProps;
534
535
  const Element = getElementType(variant, elementType);
535
536
  const classes = buildTextClasses(textProps, htmlClassName);
@@ -543,7 +544,7 @@ var TextOrHTML = ({
543
544
  }
544
545
  ) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Element, { ref, ...domProps, className: classes, children: text });
545
546
  }
546
- const DangerousComponent = htmlElementType ?? (textIsBlockHTML ? "div" : "span");
547
+ const DangerousComponent = htmlElementType ?? (hasBlockContent ? "div" : "span");
547
548
  const dangerousElement = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
548
549
  DangerousComponent,
549
550
  {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/ExpandableText/index.tsx", "../../../../src/components/ExpandableText/ExpandableText.tsx", "../../../../src/hooks/useBreakpoint/useBreakpoint.tsx", "../../../../src/utils/filterUndefinedProps.ts", "../../../../src/utils/getSpacingValue.ts", "../../../../src/components/Accordion/Accordion.tsx", "../../../../src/components/Accordion/AccordionLink.tsx", "../../../../src/components/Flex/Flex.tsx", "../../../../src/components/Flex/propUtils.ts", "../../../../src/components/Icon/Icon.tsx", "../../../../src/components/TextOrHTML/TextOrHTML.tsx", "../../../../src/components/Text/Text.tsx"],
4
- "sourcesContent": ["export * from \"./ExpandableText\";\n", "\"use client\";\n\nimport classNames from \"classnames/dedupe\";\nimport type React from \"react\";\nimport type { RefAttributes } from \"react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { useBreakpoint } from \"../../hooks\";\nimport type { DOMProps } from \"../../types\";\nimport { Accordion } from \"../Accordion\";\nimport { TextOrHTML } from \"../TextOrHTML\";\nimport type { AccordionProps } from \"../Accordion/Accordion\";\nimport type { TextProps } from \"../Text/Text\";\nimport \"./ExpandableText.css\";\n\nexport type ExpandableTextElementType = HTMLDivElement;\n\nexport interface ExpandableTextProps\n extends DOMProps, RefAttributes<ExpandableTextElementType> {\n /** The text content to display (can be plain text or HTML) */\n text: string;\n /** Maximum number of lines to show when collapsed */\n maxLines?: number;\n /** Breakpoint at which collapsing should be applied. If not provided, collapsing is always applied */\n breakpoint?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** Text for the expand trigger */\n showText?: string;\n /** Text for the collapse trigger */\n hideText?: string;\n /** Custom class name for the container */\n className?: string;\n /** Props to pass to the Text component */\n textProps?: Partial<TextProps>;\n /** Props to pass to the Accordion component */\n accordionProps?: Partial<AccordionProps>;\n /** Callback when expansion state changes */\n onToggle?: (expanded: boolean) => void;\n}\n\nexport const ExpandableText = ({ ref, ...props }: ExpandableTextProps) => {\n const {\n text,\n maxLines = 3,\n breakpoint,\n showText = \"Read more\",\n hideText = \"Read less\",\n className,\n textProps = {},\n accordionProps = {},\n onToggle,\n ...otherProps\n } = props;\n\n const [isExpanded, setIsExpanded] = useState(false);\n const [isCollapsed, setIsCollapsed] = useState(false);\n const textRef = useRef<HTMLDivElement>(null);\n const { down } = useBreakpoint();\n\n // Generate unique ID for accessibility\n const baseId = useId();\n const expandButtonId = `expandable-text-expand-${baseId}`;\n\n // Determine if content should be collapsible based on breakpoint\n const shouldCollapse = breakpoint ? down(breakpoint) : true;\n\n useEffect(() => {\n if (!shouldCollapse || !textRef.current) {\n setIsCollapsed(false);\n return;\n }\n\n // Check if text is actually collapsed by comparing scroll height with client height\n const element = textRef.current;\n const isOverflowing = element.scrollHeight > element.clientHeight;\n setIsCollapsed(isOverflowing);\n }, [text, shouldCollapse, maxLines]);\n\n // If breakpoint is specified and we're above it, show full text without collapsible UI\n if (breakpoint && !shouldCollapse) {\n return (\n <div ref={ref} className={className} {...otherProps}>\n <TextOrHTML text={text} textWrapper {...textProps} />\n </div>\n );\n }\n\n const handleAccordionChange = (expanded: boolean) => {\n setIsExpanded(expanded);\n onToggle?.(expanded);\n };\n\n const classes = classNames(\"mobius-expandable-text\", className);\n const textContainerClasses = classNames(\"mobius-expandable-text__content\", {\n \"mobius-expandable-text__content--collapsed\": !isExpanded,\n });\n\n // CSS custom property for dynamic line clamping\n const textContainerStyle = {\n \"--line-clamp\": maxLines,\n } as React.CSSProperties;\n\n return (\n <div\n ref={ref}\n className={classes}\n data-testid=\"expandable-text\"\n {...otherProps}\n >\n <div\n ref={textRef}\n className={textContainerClasses}\n style={textContainerStyle}\n data-testid=\"expandable-text-content\"\n aria-describedby={isCollapsed ? expandButtonId : undefined}\n >\n <TextOrHTML elementType=\"span\" textWrapper text={text} {...textProps} />\n </div>\n {isCollapsed && (\n <Accordion\n showText={showText}\n hideText={hideText}\n headerPosition=\"bottom\"\n onChange={handleAccordionChange}\n onClick={(e?: React.MouseEvent) => {\n e?.stopPropagation();\n }}\n id={expandButtonId}\n {...accordionProps}\n />\n )}\n </div>\n );\n};\n\nExpandableText.displayName = \"ExpandableText\";\n", "\"use client\";\n\nimport {\n useDebouncedValue,\n useIsClient,\n useWindowEvent,\n} from \"@simplybusiness/mobius-hooks\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport type { SizeType } from \"../../types\";\n\nexport type Breakpoint = {\n size: SizeType;\n value: number;\n};\nexport type BreakpointsType = Breakpoint[];\nexport type UseBreakpointType = {\n breakpoint: Breakpoint;\n up: (size: SizeType) => boolean | undefined;\n down: (size: SizeType) => boolean | undefined;\n};\n\n// Hard code breakpoints for SB designs\nexport const DEFAULT_BREAKPOINTS = [\n { size: \"xs\", value: 320 },\n { size: \"sm\", value: 480 },\n { size: \"md\", value: 670 },\n { size: \"lg\", value: 960 },\n { size: \"xl\", value: 1200 },\n { size: \"xxl\", value: 1320 },\n] as BreakpointsType;\n\nconst PASSIVE: AddEventListenerOptions = { passive: true };\n\nconst getBreakpoint = (breakpoints: BreakpointsType, windowWidth: number) => {\n // When breakpoint size and windowWidth are a match\n // The addition of 1px ensures the right breakpoint\n const closest = breakpoints.findIndex(\n breakpoint => breakpoint.value >= windowWidth + 1,\n );\n const smallest = breakpoints[0];\n const largest = breakpoints[breakpoints.length - 1];\n const match = breakpoints[closest - 1];\n\n if (closest === 0) return smallest;\n if (closest === -1) return largest;\n\n return match;\n};\n\nconst useBreakpoint = (\n customBreakpoints?: BreakpointsType,\n): UseBreakpointType => {\n const isClientSide = useIsClient();\n const breakpoints = customBreakpoints || DEFAULT_BREAKPOINTS;\n const defaultBreakpoint = breakpoints[0];\n\n const [windowWidth, setWindowWidth] = useState<number>(\n typeof globalThis?.window !== \"undefined\"\n ? window.innerWidth\n : defaultBreakpoint.value,\n );\n\n useWindowEvent(\"resize\", () => setWindowWidth(window.innerWidth), PASSIVE);\n\n const debouncedWidth = useDebouncedValue(windowWidth, 200);\n\n // Gate on isClientSide so up()/down() also return default-based values\n // during SSR and hydration, matching the server render.\n const currentBreakpoint = useMemo(\n () =>\n !isClientSide || breakpoints.length === 0\n ? defaultBreakpoint\n : getBreakpoint(breakpoints, debouncedWidth),\n [isClientSide, breakpoints, defaultBreakpoint, debouncedWidth],\n );\n\n const up = useCallback(\n (size: SizeType) => {\n const sizeIndex = breakpoints.findIndex(item => item.size === size);\n if (sizeIndex === -1) {\n return false;\n }\n const currentIndex = breakpoints.findIndex(\n item => item.size === currentBreakpoint.size,\n );\n\n return currentIndex >= sizeIndex;\n },\n [currentBreakpoint, breakpoints],\n );\n\n const down = useCallback(\n (size: SizeType) => {\n const sizeIndex = breakpoints.findIndex(item => item.size === size);\n if (sizeIndex === -1) {\n return true;\n }\n const currentIndex = breakpoints.findIndex(\n item => item.size === currentBreakpoint.size,\n );\n\n return currentIndex <= sizeIndex;\n },\n [currentBreakpoint, breakpoints],\n );\n\n return {\n breakpoint: currentBreakpoint,\n up,\n down,\n };\n};\n\nexport { useBreakpoint };\n", "export const filterUndefinedProps = (props: Record<string, unknown>) => {\n const filteredProps: Record<string, unknown> = {};\n Object.keys(props).forEach(key => {\n if (props[key] !== undefined) {\n filteredProps[key] = props[key];\n }\n });\n return filteredProps;\n};\n", "import type { SpacingType } from \"../types\";\n\nexport const getSpacingValue = (\n padding: SpacingType | undefined,\n): string | undefined => {\n if (typeof padding === \"string\") {\n return `var(--size-${padding})`;\n }\n\n if (typeof padding === \"number\") {\n return `${padding}px`;\n }\n\n return undefined;\n};\n", "\"use client\";\n\nimport classNames from \"classnames/dedupe\";\nimport type { ReactNode, RefAttributes } from \"react\";\nimport { useEffect, useState, useId } from \"react\";\nimport { usePrefersReducedMotion } from \"@simplybusiness/mobius-hooks\";\nimport type { DOMProps } from \"../../types\";\n\nimport type {\n AccordionElementType,\n AccordionLinkElementType,\n} from \"./AccordionLink\";\nimport { AccordionLink } from \"./AccordionLink\";\nimport \"./Accordion.css\";\n\nexport interface AccordionProps\n extends DOMProps, RefAttributes<AccordionElementType> {\n /** Custom class name for setting specific CSS */\n className?: string;\n /** Link text to show accordion content */\n showText?: string | ReactNode;\n /** Link text to hide accordion content */\n hideText?: string | ReactNode;\n /** Whether header is above or below content */\n headerPosition?: \"top\" | \"bottom\";\n /** Whether to expand the accordion initially */\n startOpen?: boolean | undefined;\n /** Semantic heading for title link (default is span) */\n linkElementType?: AccordionLinkElementType;\n /** Callback that fires when the accordion link is clicked (fires before toggle) */\n onClick?: (e?: React.MouseEvent) => void;\n /** Callback that fires each time the accordion is opened */\n onOpen?: () => void;\n /** Callback that fires each time the accordion is closed */\n onClose?: () => void;\n /** Callback that fires each time the accordion state changes */\n onChange?: (state: boolean) => void;\n children?: ReactNode;\n headerChildren?: ReactNode;\n}\n\nexport const Accordion = ({ ref, ...props }: AccordionProps) => {\n const {\n showText = \"See more\",\n hideText = \"See less\",\n headerPosition = \"top\",\n startOpen = false,\n linkElementType,\n onClick,\n onOpen,\n onClose,\n onChange = () => {},\n headerChildren,\n ...rest\n } = props;\n\n const [accordionState, setAccordionState] = useState({\n open: startOpen,\n withAnimation: false,\n });\n const prefersReducedMotion = usePrefersReducedMotion();\n\n const containerClasses = classNames(\n \"mobius\",\n \"mobius-accordion\",\n props.className,\n {\n \"--should-animate\": accordionState.withAnimation && !prefersReducedMotion,\n \"--is-open\": accordionState.open,\n },\n );\n const contentContainerClasses = classNames(\n \"mobius-accordion__content-container\",\n {\n \"--is-open\": accordionState.open,\n },\n );\n const contentClasses = classNames(\"mobius-accordion__content\", {\n \"--is-open\": accordionState.open,\n });\n\n const linkText = accordionState.open ? hideText : showText;\n\n const handleChange = () => {\n // Fire events\n if (!accordionState.open && onOpen) {\n onOpen();\n }\n if (accordionState.open && onClose) {\n onClose();\n }\n if (onChange) {\n onChange(!accordionState.open);\n }\n setAccordionState({\n open: !accordionState.open,\n withAnimation: true,\n });\n };\n\n useEffect(() => {\n setAccordionState({\n open: startOpen,\n withAnimation: true,\n });\n }, [startOpen]);\n\n // Generate unique IDs for accessibility\n const baseId = useId();\n const accordionId = `accordion-header-${baseId}`;\n const contentId = `accordion-panel-${baseId}`;\n\n return (\n <div ref={ref} {...rest} className={containerClasses}>\n {headerPosition === \"top\" && (\n <AccordionLink\n text={linkText}\n elementType={linkElementType}\n toggle={handleChange}\n onClick={onClick}\n ariaExpanded={accordionState.open}\n headerChildren={headerChildren}\n accordionId={accordionId}\n contentId={contentId}\n />\n )}\n <div\n id={contentId}\n className={contentContainerClasses}\n aria-hidden={!accordionState.open}\n aria-labelledby={accordionId}\n role=\"region\"\n >\n <div className={contentClasses}>{props.children}</div>\n </div>\n {headerPosition === \"bottom\" && (\n <AccordionLink\n text={linkText}\n toggle={handleChange}\n onClick={onClick}\n ariaExpanded={accordionState.open}\n headerChildren={headerChildren}\n accordionId={accordionId}\n contentId={contentId}\n />\n )}\n </div>\n );\n};\n\nAccordion.displayName = \"Accordion\";\n", "import type { KeyboardEvent, ReactNode } from \"react\";\nimport type { DOMProps } from \"../../types\";\nimport classNames from \"classnames/dedupe\";\nimport { Flex } from \"../Flex\";\nimport { Icon } from \"../Icon\";\nimport { chevronDown } from \"@simplybusiness/icons\";\n\nexport type AccordionLinkElementType =\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"h5\"\n | \"h6\"\n | \"span\";\nexport type AccordionElementType = HTMLDivElement;\n\nexport interface AccordionLinkProps extends DOMProps {\n text: string | ReactNode;\n elementType?: AccordionLinkElementType;\n onClick?: (e?: React.MouseEvent) => void;\n toggle: () => void;\n headerChildren?: ReactNode;\n ariaExpanded: boolean | undefined;\n accordionId: string;\n contentId: string;\n}\n\nexport const AccordionLink = ({\n text,\n elementType: LinkElement = \"span\",\n toggle,\n onClick,\n headerChildren,\n ariaExpanded,\n accordionId,\n contentId,\n}: AccordionLinkProps) => {\n const linkClasses = classNames(\"mobius-accordion__link\", {\n \"--is-open\": ariaExpanded,\n });\n const iconClasses = classNames(\"mobius-accordion__link-icon\", {\n \"--is-open\": ariaExpanded,\n });\n const handleOnClick = (e?: React.MouseEvent): void => {\n if (onClick) {\n onClick(e);\n }\n toggle();\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \" \" || e.key === \"Enter\") {\n toggle();\n }\n };\n\n if (headerChildren) {\n return (\n <Flex\n justifyContent=\"space-between\"\n alignItems=\"center\"\n className=\"mobius-accordion__header\"\n >\n <div\n id={accordionId}\n className={linkClasses}\n onClick={handleOnClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-expanded={!!ariaExpanded}\n aria-controls={contentId}\n >\n <LinkElement className=\"mobius-accordion__link-text\">\n {text}\n </LinkElement>\n <Icon icon={chevronDown} className={iconClasses} />\n </div>\n {headerChildren}\n </Flex>\n );\n }\n\n return (\n <div\n id={accordionId}\n className={linkClasses}\n onClick={handleOnClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-expanded={!!ariaExpanded}\n aria-controls={contentId}\n >\n <LinkElement className=\"mobius-accordion__link-text\">{text}</LinkElement>\n <Icon icon={chevronDown} className={iconClasses} />\n </div>\n );\n};\n", "import classNames from \"classnames/dedupe\";\nimport type { FlexProps } from \"./types\";\nimport { buildFlexStyles, splitProps } from \"./propUtils\";\nimport \"./Flex.css\";\n\nconst Flex = ({ ref, ...props }: FlexProps) => {\n const {\n elementType: Element = \"div\",\n style,\n className,\n ...otherProps\n } = props;\n const classes = classNames(\"mobius\", \"mobius-flex\", className);\n\n const [styleProps, restProps] = splitProps(otherProps);\n const flexStyles = buildFlexStyles(styleProps);\n\n return (\n <Element\n ref={ref}\n style={{\n ...flexStyles,\n ...style,\n }}\n className={classes}\n {...restProps}\n />\n );\n};\n\nFlex.displayName = \"Flex\";\nexport { Flex };\n", "import { getSpacingValue } from \"../../utils\";\nimport { filterUndefinedProps } from \"../../utils/filterUndefinedProps\";\nimport type { FlexNonStyleProps, FlexProps, FlexStyleProps } from \"./types\";\n\nexport const buildFlexStyles = (props: FlexStyleProps) => {\n const {\n flexDirection,\n flexWrap,\n flexGrow,\n flex,\n justifyContent,\n alignItems,\n alignContent,\n gap,\n rowGap,\n columnGap,\n } = props;\n\n const styleProps = {\n flexDirection,\n flexWrap,\n flexGrow,\n flex,\n justifyContent,\n alignItems,\n alignContent,\n gap: getSpacingValue(gap),\n columnGap: getSpacingValue(columnGap),\n rowGap: getSpacingValue(rowGap),\n };\n\n return filterUndefinedProps(styleProps);\n};\n\nexport const splitProps = (\n props: FlexProps,\n): [FlexStyleProps, FlexNonStyleProps] => {\n const {\n flexDirection,\n flexWrap,\n flexGrow,\n flex,\n justifyContent,\n alignItems,\n alignContent,\n gap,\n rowGap,\n columnGap,\n ...otherProps\n } = props;\n\n return [\n {\n flexDirection,\n flexWrap,\n flexGrow,\n flex,\n justifyContent,\n alignItems,\n alignContent,\n gap,\n rowGap,\n columnGap,\n },\n otherProps,\n ];\n};\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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",
4
+ "sourcesContent": ["export * from \"./ExpandableText\";\n", "\"use client\";\n\nimport classNames from \"classnames/dedupe\";\nimport type React from \"react\";\nimport type { RefAttributes } from \"react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { useBreakpoint } from \"../../hooks\";\nimport type { DOMProps } from \"../../types\";\nimport { Accordion } from \"../Accordion\";\nimport { TextOrHTML } from \"../TextOrHTML\";\nimport type { AccordionProps } from \"../Accordion/Accordion\";\nimport type { TextProps } from \"../Text/Text\";\nimport \"./ExpandableText.css\";\n\nexport type ExpandableTextElementType = HTMLDivElement;\n\nexport interface ExpandableTextProps\n extends DOMProps, RefAttributes<ExpandableTextElementType> {\n /** The text content to display (can be plain text or HTML) */\n text: string;\n /** Maximum number of lines to show when collapsed */\n maxLines?: number;\n /** Breakpoint at which collapsing should be applied. If not provided, collapsing is always applied */\n breakpoint?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** Text for the expand trigger */\n showText?: string;\n /** Text for the collapse trigger */\n hideText?: string;\n /** Custom class name for the container */\n className?: string;\n /** Props to pass to the Text component */\n textProps?: Partial<TextProps>;\n /** Props to pass to the Accordion component */\n accordionProps?: Partial<AccordionProps>;\n /** Callback when expansion state changes */\n onToggle?: (expanded: boolean) => void;\n}\n\nexport const ExpandableText = ({ ref, ...props }: ExpandableTextProps) => {\n const {\n text,\n maxLines = 3,\n breakpoint,\n showText = \"Read more\",\n hideText = \"Read less\",\n className,\n textProps = {},\n accordionProps = {},\n onToggle,\n ...otherProps\n } = props;\n\n const [isExpanded, setIsExpanded] = useState(false);\n const [isCollapsed, setIsCollapsed] = useState(false);\n const textRef = useRef<HTMLDivElement>(null);\n const { down } = useBreakpoint();\n\n // Generate unique ID for accessibility\n const baseId = useId();\n const expandButtonId = `expandable-text-expand-${baseId}`;\n\n // Determine if content should be collapsible based on breakpoint\n const shouldCollapse = breakpoint ? down(breakpoint) : true;\n\n useEffect(() => {\n if (!shouldCollapse || !textRef.current) {\n setIsCollapsed(false);\n return;\n }\n\n // Check if text is actually collapsed by comparing scroll height with client height\n const element = textRef.current;\n const isOverflowing = element.scrollHeight > element.clientHeight;\n setIsCollapsed(isOverflowing);\n }, [text, shouldCollapse, maxLines]);\n\n // If breakpoint is specified and we're above it, show full text without collapsible UI\n if (breakpoint && !shouldCollapse) {\n return (\n <div ref={ref} className={className} {...otherProps}>\n <TextOrHTML text={text} textWrapper {...textProps} />\n </div>\n );\n }\n\n const handleAccordionChange = (expanded: boolean) => {\n setIsExpanded(expanded);\n onToggle?.(expanded);\n };\n\n const classes = classNames(\"mobius-expandable-text\", className);\n const textContainerClasses = classNames(\"mobius-expandable-text__content\", {\n \"mobius-expandable-text__content--collapsed\": !isExpanded,\n });\n\n // CSS custom property for dynamic line clamping\n const textContainerStyle = {\n \"--line-clamp\": maxLines,\n } as React.CSSProperties;\n\n return (\n <div\n ref={ref}\n className={classes}\n data-testid=\"expandable-text\"\n {...otherProps}\n >\n <div\n ref={textRef}\n className={textContainerClasses}\n style={textContainerStyle}\n data-testid=\"expandable-text-content\"\n aria-describedby={isCollapsed ? expandButtonId : undefined}\n >\n <TextOrHTML elementType=\"span\" textWrapper text={text} {...textProps} />\n </div>\n {isCollapsed && (\n <Accordion\n showText={showText}\n hideText={hideText}\n headerPosition=\"bottom\"\n onChange={handleAccordionChange}\n onClick={(e?: React.MouseEvent) => {\n e?.stopPropagation();\n }}\n id={expandButtonId}\n {...accordionProps}\n />\n )}\n </div>\n );\n};\n\nExpandableText.displayName = \"ExpandableText\";\n", "\"use client\";\n\nimport {\n useDebouncedValue,\n useIsClient,\n useWindowEvent,\n} from \"@simplybusiness/mobius-hooks\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport type { SizeType } from \"../../types\";\n\nexport type Breakpoint = {\n size: SizeType;\n value: number;\n};\nexport type BreakpointsType = Breakpoint[];\nexport type UseBreakpointType = {\n breakpoint: Breakpoint;\n up: (size: SizeType) => boolean | undefined;\n down: (size: SizeType) => boolean | undefined;\n};\n\n// Hard code breakpoints for SB designs\nexport const DEFAULT_BREAKPOINTS = [\n { size: \"xs\", value: 320 },\n { size: \"sm\", value: 480 },\n { size: \"md\", value: 670 },\n { size: \"lg\", value: 960 },\n { size: \"xl\", value: 1200 },\n { size: \"xxl\", value: 1320 },\n] as BreakpointsType;\n\nconst PASSIVE: AddEventListenerOptions = { passive: true };\n\nconst getBreakpoint = (breakpoints: BreakpointsType, windowWidth: number) => {\n // When breakpoint size and windowWidth are a match\n // The addition of 1px ensures the right breakpoint\n const closest = breakpoints.findIndex(\n breakpoint => breakpoint.value >= windowWidth + 1,\n );\n const smallest = breakpoints[0];\n const largest = breakpoints[breakpoints.length - 1];\n const match = breakpoints[closest - 1];\n\n if (closest === 0) return smallest;\n if (closest === -1) return largest;\n\n return match;\n};\n\nconst useBreakpoint = (\n customBreakpoints?: BreakpointsType,\n): UseBreakpointType => {\n const isClientSide = useIsClient();\n const breakpoints = customBreakpoints || DEFAULT_BREAKPOINTS;\n const defaultBreakpoint = breakpoints[0];\n\n const [windowWidth, setWindowWidth] = useState<number>(\n typeof globalThis?.window !== \"undefined\"\n ? window.innerWidth\n : defaultBreakpoint.value,\n );\n\n useWindowEvent(\"resize\", () => setWindowWidth(window.innerWidth), PASSIVE);\n\n const debouncedWidth = useDebouncedValue(windowWidth, 200);\n\n // Gate on isClientSide so up()/down() also return default-based values\n // during SSR and hydration, matching the server render.\n const currentBreakpoint = useMemo(\n () =>\n !isClientSide || breakpoints.length === 0\n ? defaultBreakpoint\n : getBreakpoint(breakpoints, debouncedWidth),\n [isClientSide, breakpoints, defaultBreakpoint, debouncedWidth],\n );\n\n const up = useCallback(\n (size: SizeType) => {\n const sizeIndex = breakpoints.findIndex(item => item.size === size);\n if (sizeIndex === -1) {\n return false;\n }\n const currentIndex = breakpoints.findIndex(\n item => item.size === currentBreakpoint.size,\n );\n\n return currentIndex >= sizeIndex;\n },\n [currentBreakpoint, breakpoints],\n );\n\n const down = useCallback(\n (size: SizeType) => {\n const sizeIndex = breakpoints.findIndex(item => item.size === size);\n if (sizeIndex === -1) {\n return true;\n }\n const currentIndex = breakpoints.findIndex(\n item => item.size === currentBreakpoint.size,\n );\n\n return currentIndex <= sizeIndex;\n },\n [currentBreakpoint, breakpoints],\n );\n\n return {\n breakpoint: currentBreakpoint,\n up,\n down,\n };\n};\n\nexport { useBreakpoint };\n", "export const filterUndefinedProps = (props: Record<string, unknown>) => {\n const filteredProps: Record<string, unknown> = {};\n Object.keys(props).forEach(key => {\n if (props[key] !== undefined) {\n filteredProps[key] = props[key];\n }\n });\n return filteredProps;\n};\n", "import type { SpacingType } from \"../types\";\n\nexport const getSpacingValue = (\n padding: SpacingType | undefined,\n): string | undefined => {\n if (typeof padding === \"string\") {\n return `var(--size-${padding})`;\n }\n\n if (typeof padding === \"number\") {\n return `${padding}px`;\n }\n\n return undefined;\n};\n", "\"use client\";\n\nimport classNames from \"classnames/dedupe\";\nimport type { ReactNode, RefAttributes } from \"react\";\nimport { useEffect, useState, useId } from \"react\";\nimport { usePrefersReducedMotion } from \"@simplybusiness/mobius-hooks\";\nimport type { DOMProps } from \"../../types\";\n\nimport type {\n AccordionElementType,\n AccordionLinkElementType,\n} from \"./AccordionLink\";\nimport { AccordionLink } from \"./AccordionLink\";\nimport \"./Accordion.css\";\n\nexport interface AccordionProps\n extends DOMProps, RefAttributes<AccordionElementType> {\n /** Custom class name for setting specific CSS */\n className?: string;\n /** Link text to show accordion content */\n showText?: string | ReactNode;\n /** Link text to hide accordion content */\n hideText?: string | ReactNode;\n /** Whether header is above or below content */\n headerPosition?: \"top\" | \"bottom\";\n /** Whether to expand the accordion initially */\n startOpen?: boolean | undefined;\n /** Semantic heading for title link (default is span) */\n linkElementType?: AccordionLinkElementType;\n /** Callback that fires when the accordion link is clicked (fires before toggle) */\n onClick?: (e?: React.MouseEvent) => void;\n /** Callback that fires each time the accordion is opened */\n onOpen?: () => void;\n /** Callback that fires each time the accordion is closed */\n onClose?: () => void;\n /** Callback that fires each time the accordion state changes */\n onChange?: (state: boolean) => void;\n children?: ReactNode;\n headerChildren?: ReactNode;\n}\n\nexport const Accordion = ({ ref, ...props }: AccordionProps) => {\n const {\n showText = \"See more\",\n hideText = \"See less\",\n headerPosition = \"top\",\n startOpen = false,\n linkElementType,\n onClick,\n onOpen,\n onClose,\n onChange = () => {},\n headerChildren,\n ...rest\n } = props;\n\n const [accordionState, setAccordionState] = useState({\n open: startOpen,\n withAnimation: false,\n });\n const prefersReducedMotion = usePrefersReducedMotion();\n\n const containerClasses = classNames(\n \"mobius\",\n \"mobius-accordion\",\n props.className,\n {\n \"--should-animate\": accordionState.withAnimation && !prefersReducedMotion,\n \"--is-open\": accordionState.open,\n },\n );\n const contentContainerClasses = classNames(\n \"mobius-accordion__content-container\",\n {\n \"--is-open\": accordionState.open,\n },\n );\n const contentClasses = classNames(\"mobius-accordion__content\", {\n \"--is-open\": accordionState.open,\n });\n\n const linkText = accordionState.open ? hideText : showText;\n\n const handleChange = () => {\n // Fire events\n if (!accordionState.open && onOpen) {\n onOpen();\n }\n if (accordionState.open && onClose) {\n onClose();\n }\n if (onChange) {\n onChange(!accordionState.open);\n }\n setAccordionState({\n open: !accordionState.open,\n withAnimation: true,\n });\n };\n\n useEffect(() => {\n setAccordionState({\n open: startOpen,\n withAnimation: true,\n });\n }, [startOpen]);\n\n // Generate unique IDs for accessibility\n const baseId = useId();\n const accordionId = `accordion-header-${baseId}`;\n const contentId = `accordion-panel-${baseId}`;\n\n return (\n <div ref={ref} {...rest} className={containerClasses}>\n {headerPosition === \"top\" && (\n <AccordionLink\n text={linkText}\n elementType={linkElementType}\n toggle={handleChange}\n onClick={onClick}\n ariaExpanded={accordionState.open}\n headerChildren={headerChildren}\n accordionId={accordionId}\n contentId={contentId}\n />\n )}\n <div\n id={contentId}\n className={contentContainerClasses}\n aria-hidden={!accordionState.open}\n aria-labelledby={accordionId}\n role=\"region\"\n >\n <div className={contentClasses}>{props.children}</div>\n </div>\n {headerPosition === \"bottom\" && (\n <AccordionLink\n text={linkText}\n toggle={handleChange}\n onClick={onClick}\n ariaExpanded={accordionState.open}\n headerChildren={headerChildren}\n accordionId={accordionId}\n contentId={contentId}\n />\n )}\n </div>\n );\n};\n\nAccordion.displayName = \"Accordion\";\n", "import type { KeyboardEvent, ReactNode } from \"react\";\nimport type { DOMProps } from \"../../types\";\nimport classNames from \"classnames/dedupe\";\nimport { Flex } from \"../Flex\";\nimport { Icon } from \"../Icon\";\nimport { chevronDown } from \"@simplybusiness/icons\";\n\nexport type AccordionLinkElementType =\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"h5\"\n | \"h6\"\n | \"span\";\nexport type AccordionElementType = HTMLDivElement;\n\nexport interface AccordionLinkProps extends DOMProps {\n text: string | ReactNode;\n elementType?: AccordionLinkElementType;\n onClick?: (e?: React.MouseEvent) => void;\n toggle: () => void;\n headerChildren?: ReactNode;\n ariaExpanded: boolean | undefined;\n accordionId: string;\n contentId: string;\n}\n\nexport const AccordionLink = ({\n text,\n elementType: LinkElement = \"span\",\n toggle,\n onClick,\n headerChildren,\n ariaExpanded,\n accordionId,\n contentId,\n}: AccordionLinkProps) => {\n const linkClasses = classNames(\"mobius-accordion__link\", {\n \"--is-open\": ariaExpanded,\n });\n const iconClasses = classNames(\"mobius-accordion__link-icon\", {\n \"--is-open\": ariaExpanded,\n });\n const handleOnClick = (e?: React.MouseEvent): void => {\n if (onClick) {\n onClick(e);\n }\n toggle();\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \" \" || e.key === \"Enter\") {\n toggle();\n }\n };\n\n if (headerChildren) {\n return (\n <Flex\n justifyContent=\"space-between\"\n alignItems=\"center\"\n className=\"mobius-accordion__header\"\n >\n <div\n id={accordionId}\n className={linkClasses}\n onClick={handleOnClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-expanded={!!ariaExpanded}\n aria-controls={contentId}\n >\n <LinkElement className=\"mobius-accordion__link-text\">\n {text}\n </LinkElement>\n <Icon icon={chevronDown} className={iconClasses} />\n </div>\n {headerChildren}\n </Flex>\n );\n }\n\n return (\n <div\n id={accordionId}\n className={linkClasses}\n onClick={handleOnClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-expanded={!!ariaExpanded}\n aria-controls={contentId}\n >\n <LinkElement className=\"mobius-accordion__link-text\">{text}</LinkElement>\n <Icon icon={chevronDown} className={iconClasses} />\n </div>\n );\n};\n", "import classNames from \"classnames/dedupe\";\nimport type { FlexProps } from \"./types\";\nimport { buildFlexStyles, splitProps } from \"./propUtils\";\nimport \"./Flex.css\";\n\nconst Flex = ({ ref, ...props }: FlexProps) => {\n const {\n elementType: Element = \"div\",\n style,\n className,\n ...otherProps\n } = props;\n const classes = classNames(\"mobius\", \"mobius-flex\", className);\n\n const [styleProps, restProps] = splitProps(otherProps);\n const flexStyles = buildFlexStyles(styleProps);\n\n return (\n <Element\n ref={ref}\n style={{\n ...flexStyles,\n ...style,\n }}\n className={classes}\n {...restProps}\n />\n );\n};\n\nFlex.displayName = \"Flex\";\nexport { Flex };\n", "import { getSpacingValue } from \"../../utils\";\nimport { filterUndefinedProps } from \"../../utils/filterUndefinedProps\";\nimport type { FlexNonStyleProps, FlexProps, FlexStyleProps } from \"./types\";\n\nexport const buildFlexStyles = (props: FlexStyleProps) => {\n const {\n flexDirection,\n flexWrap,\n flexGrow,\n flex,\n justifyContent,\n alignItems,\n alignContent,\n gap,\n rowGap,\n columnGap,\n } = props;\n\n const styleProps = {\n flexDirection,\n flexWrap,\n flexGrow,\n flex,\n justifyContent,\n alignItems,\n alignContent,\n gap: getSpacingValue(gap),\n columnGap: getSpacingValue(columnGap),\n rowGap: getSpacingValue(rowGap),\n };\n\n return filterUndefinedProps(styleProps);\n};\n\nexport const splitProps = (\n props: FlexProps,\n): [FlexStyleProps, FlexNonStyleProps] => {\n const {\n flexDirection,\n flexWrap,\n flexGrow,\n flex,\n justifyContent,\n alignItems,\n alignContent,\n gap,\n rowGap,\n columnGap,\n ...otherProps\n } = props;\n\n return [\n {\n flexDirection,\n flexWrap,\n flexGrow,\n flex,\n justifyContent,\n alignItems,\n alignContent,\n gap,\n rowGap,\n columnGap,\n },\n otherProps,\n ];\n};\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\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": "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",
6
6
  "names": ["import_dedupe", "import_react", "import_dedupe", "import_react", "import_mobius_hooks", "import_dedupe", "classNames", "import_dedupe", "import_jsx_runtime", "classNames", "import_jsx_runtime", "classNames", "import_jsx_runtime", "classNames", "import_dedupe", "import_react", "import_dedupe", "import_jsx_runtime", "classNames", "import_jsx_runtime", "classNames", "import_jsx_runtime", "classNames"]
7
7
  }
@@ -254,7 +254,8 @@ Text.displayName = "Text";
254
254
 
255
255
  // src/components/TextOrHTML/TextOrHTML.tsx
256
256
  var import_jsx_runtime3 = require("react/jsx-runtime");
257
- var isBlockHTML = (text) => /^\s*<[a-z]/i.test(text);
257
+ var BLOCK_TAG = /<(div|p|ul|ol|li|h[1-6]|table|tr|td|th|blockquote|pre|hr|dl|dt|dd)[\s>/]/i;
258
+ var containsBlockHTML = (text) => BLOCK_TAG.test(text);
258
259
  var containsHTML = (text) => /<[a-z/]/i.test(text) || /&(?:#\d+|#x[\da-f]+|[a-z]\w*);/i.test(text);
259
260
  var buildTextClasses = (textProps, htmlClassName) => {
260
261
  const { variant, elementType, spacing, className } = textProps;
@@ -277,9 +278,9 @@ var TextOrHTML = ({
277
278
  autoDetect = false,
278
279
  ...textProps
279
280
  }) => {
280
- const textIsBlockHTML = autoDetect && isBlockHTML(text);
281
+ const hasBlockContent = autoDetect && containsBlockHTML(text);
281
282
  const dangerousHTML = (0, import_react3.useMemo)(() => ({ __html: text }), [text]);
282
- if (autoDetect && !textIsBlockHTML) {
283
+ if (autoDetect && !hasBlockContent) {
283
284
  const { variant, spacing, elementType, className, ...domProps } = textProps;
284
285
  const Element = getElementType(variant, elementType);
285
286
  const classes = buildTextClasses(textProps, htmlClassName);
@@ -293,7 +294,7 @@ var TextOrHTML = ({
293
294
  }
294
295
  ) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Element, { ref, ...domProps, className: classes, children: text });
295
296
  }
296
- const DangerousComponent = htmlElementType ?? (textIsBlockHTML ? "div" : "span");
297
+ const DangerousComponent = htmlElementType ?? (hasBlockContent ? "div" : "span");
297
298
  const dangerousElement = /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
298
299
  DangerousComponent,
299
300
  {