@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.
- package/CHANGELOG.md +13 -0
- package/dist/cjs/components/AddressLookup/AddressLookup.js +5 -4
- package/dist/cjs/components/AddressLookup/AddressLookup.js.map +2 -2
- package/dist/cjs/components/AddressLookup/index.js +5 -4
- package/dist/cjs/components/AddressLookup/index.js.map +2 -2
- package/dist/cjs/components/Alert/Alert.js +5 -4
- package/dist/cjs/components/Alert/Alert.js.map +2 -2
- package/dist/cjs/components/Alert/index.js +5 -4
- package/dist/cjs/components/Alert/index.js.map +2 -2
- package/dist/cjs/components/Checkbox/Checkbox.js +5 -4
- package/dist/cjs/components/Checkbox/Checkbox.js.map +2 -2
- package/dist/cjs/components/Checkbox/CheckboxGroup.js +5 -4
- package/dist/cjs/components/Checkbox/CheckboxGroup.js.map +2 -2
- package/dist/cjs/components/Checkbox/index.js +5 -4
- package/dist/cjs/components/Checkbox/index.js.map +2 -2
- package/dist/cjs/components/Combobox/Combobox.js +5 -4
- package/dist/cjs/components/Combobox/Combobox.js.map +2 -2
- package/dist/cjs/components/Combobox/index.js +5 -4
- package/dist/cjs/components/Combobox/index.js.map +2 -2
- package/dist/cjs/components/DateField/DateField.js +5 -4
- package/dist/cjs/components/DateField/DateField.js.map +2 -2
- package/dist/cjs/components/DateField/index.js +5 -4
- package/dist/cjs/components/DateField/index.js.map +2 -2
- package/dist/cjs/components/ErrorMessage/ErrorMessage.js +5 -4
- package/dist/cjs/components/ErrorMessage/ErrorMessage.js.map +2 -2
- package/dist/cjs/components/ErrorMessage/index.js +5 -4
- package/dist/cjs/components/ErrorMessage/index.js.map +2 -2
- package/dist/cjs/components/ExpandableText/ExpandableText.js +5 -4
- package/dist/cjs/components/ExpandableText/ExpandableText.js.map +2 -2
- package/dist/cjs/components/ExpandableText/index.js +5 -4
- package/dist/cjs/components/ExpandableText/index.js.map +2 -2
- package/dist/cjs/components/MaskedField/MaskedField.js +5 -4
- package/dist/cjs/components/MaskedField/MaskedField.js.map +2 -2
- package/dist/cjs/components/MaskedField/index.js +6 -5
- package/dist/cjs/components/MaskedField/index.js.map +2 -2
- package/dist/cjs/components/NumberField/NumberField.js +5 -4
- package/dist/cjs/components/NumberField/NumberField.js.map +2 -2
- package/dist/cjs/components/NumberField/index.js +5 -4
- package/dist/cjs/components/NumberField/index.js.map +2 -2
- package/dist/cjs/components/PasswordField/PasswordField.js +5 -4
- package/dist/cjs/components/PasswordField/PasswordField.js.map +2 -2
- package/dist/cjs/components/PasswordField/index.js +5 -4
- package/dist/cjs/components/PasswordField/index.js.map +2 -2
- package/dist/cjs/components/Radio/Radio.js +5 -4
- package/dist/cjs/components/Radio/Radio.js.map +2 -2
- package/dist/cjs/components/Radio/RadioGroup.js +5 -4
- package/dist/cjs/components/Radio/RadioGroup.js.map +2 -2
- package/dist/cjs/components/Radio/index.js +5 -4
- package/dist/cjs/components/Radio/index.js.map +2 -2
- package/dist/cjs/components/Select/Select.js +5 -4
- package/dist/cjs/components/Select/Select.js.map +2 -2
- package/dist/cjs/components/Select/index.js +5 -4
- package/dist/cjs/components/Select/index.js.map +2 -2
- package/dist/cjs/components/TextArea/TextArea.js +5 -4
- package/dist/cjs/components/TextArea/TextArea.js.map +2 -2
- package/dist/cjs/components/TextArea/index.js +5 -4
- package/dist/cjs/components/TextArea/index.js.map +2 -2
- package/dist/cjs/components/TextField/TextField.js +5 -4
- package/dist/cjs/components/TextField/TextField.js.map +2 -2
- package/dist/cjs/components/TextField/index.js +5 -4
- package/dist/cjs/components/TextField/index.js.map +2 -2
- package/dist/cjs/components/TextOrHTML/TextOrHTML.js +5 -4
- package/dist/cjs/components/TextOrHTML/TextOrHTML.js.map +2 -2
- package/dist/cjs/components/TextOrHTML/index.js +5 -4
- package/dist/cjs/components/TextOrHTML/index.js.map +2 -2
- package/dist/cjs/components/index.js +6 -5
- package/dist/cjs/components/index.js.map +2 -2
- package/dist/cjs/index.js +6 -5
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/meta.json +103 -103
- package/dist/esm/{chunk-4WVJNNBK.js → chunk-2HUMNED2.js} +2 -2
- package/dist/esm/{chunk-N4WQ6522.js → chunk-2VEO5SSY.js} +2 -2
- package/dist/esm/{chunk-AFU7BFCD.js → chunk-576SEJGC.js} +3 -3
- package/dist/esm/{chunk-QPIA6BGW.js → chunk-6JCU4CGA.js} +2 -2
- package/dist/esm/{chunk-X6EPYQKX.js → chunk-F5ELD54X.js} +2 -2
- package/dist/esm/{chunk-ZN5TRIVZ.js → chunk-GV36OVX7.js} +2 -2
- package/dist/esm/{chunk-JNAQ76CR.js → chunk-HGNWNZ5E.js} +2 -2
- package/dist/esm/{chunk-ONDOONBM.js → chunk-HUSMC5GZ.js} +2 -2
- package/dist/esm/{chunk-UIIXVY6K.js → chunk-IQKS662C.js} +2 -2
- package/dist/esm/{chunk-DYTHXKMX.js → chunk-KTJCAQT4.js} +6 -5
- package/dist/esm/chunk-KTJCAQT4.js.map +7 -0
- package/dist/esm/{chunk-5OFXPT4J.js → chunk-M62U4QGQ.js} +2 -2
- package/dist/esm/{chunk-UQVAEWY2.js → chunk-MZJT3USG.js} +2 -2
- package/dist/esm/{chunk-FKTDL7KO.js → chunk-OAG5T7NC.js} +2 -2
- package/dist/esm/{chunk-M2NDSQR5.js → chunk-P6YHEIFT.js} +2 -2
- package/dist/esm/{chunk-P5VEI574.js → chunk-S4CU4XRB.js} +2 -2
- package/dist/esm/{chunk-4NBLO5WK.js → chunk-X4CMSAET.js} +2 -2
- package/dist/esm/{chunk-KQZ3MNK5.js → chunk-XNEQHHNV.js} +2 -2
- package/dist/esm/components/AddressLookup/AddressLookup.js +5 -5
- package/dist/esm/components/AddressLookup/index.js +5 -5
- package/dist/esm/components/Alert/Alert.js +2 -2
- package/dist/esm/components/Alert/index.js +2 -2
- package/dist/esm/components/Checkbox/Checkbox.js +3 -3
- package/dist/esm/components/Checkbox/CheckboxGroup.js +4 -4
- package/dist/esm/components/Checkbox/index.js +4 -4
- package/dist/esm/components/Combobox/Combobox.js +4 -4
- package/dist/esm/components/Combobox/index.js +4 -4
- package/dist/esm/components/DateField/DateField.js +4 -4
- package/dist/esm/components/DateField/index.js +4 -4
- package/dist/esm/components/ErrorMessage/ErrorMessage.js +2 -2
- package/dist/esm/components/ErrorMessage/index.js +2 -2
- package/dist/esm/components/ExpandableText/ExpandableText.js +2 -2
- package/dist/esm/components/ExpandableText/index.js +2 -2
- package/dist/esm/components/MaskedField/MaskedField.js +3 -3
- package/dist/esm/components/MaskedField/index.js +4 -4
- package/dist/esm/components/NumberField/NumberField.js +4 -4
- package/dist/esm/components/NumberField/index.js +4 -4
- package/dist/esm/components/PasswordField/PasswordField.js +4 -4
- package/dist/esm/components/PasswordField/index.js +4 -4
- package/dist/esm/components/Radio/Radio.js +3 -3
- package/dist/esm/components/Radio/RadioGroup.js +3 -3
- package/dist/esm/components/Radio/index.js +4 -4
- package/dist/esm/components/Select/Select.js +3 -3
- package/dist/esm/components/Select/index.js +3 -3
- package/dist/esm/components/TextArea/TextArea.js +3 -3
- package/dist/esm/components/TextArea/index.js +3 -3
- package/dist/esm/components/TextField/TextField.js +3 -3
- package/dist/esm/components/TextField/index.js +3 -3
- package/dist/esm/components/TextOrHTML/TextOrHTML.js +1 -1
- package/dist/esm/components/TextOrHTML/index.js +1 -1
- package/dist/esm/components/index.js +17 -17
- package/dist/esm/index.js +17 -17
- package/dist/esm/meta.json +191 -191
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/components/TextOrHTML/TextOrHTML.test.tsx +45 -8
- package/src/components/TextOrHTML/TextOrHTML.tsx +7 -4
- package/dist/esm/chunk-DYTHXKMX.js.map +0 -7
- /package/dist/esm/{chunk-4WVJNNBK.js.map → chunk-2HUMNED2.js.map} +0 -0
- /package/dist/esm/{chunk-N4WQ6522.js.map → chunk-2VEO5SSY.js.map} +0 -0
- /package/dist/esm/{chunk-AFU7BFCD.js.map → chunk-576SEJGC.js.map} +0 -0
- /package/dist/esm/{chunk-QPIA6BGW.js.map → chunk-6JCU4CGA.js.map} +0 -0
- /package/dist/esm/{chunk-X6EPYQKX.js.map → chunk-F5ELD54X.js.map} +0 -0
- /package/dist/esm/{chunk-ZN5TRIVZ.js.map → chunk-GV36OVX7.js.map} +0 -0
- /package/dist/esm/{chunk-JNAQ76CR.js.map → chunk-HGNWNZ5E.js.map} +0 -0
- /package/dist/esm/{chunk-ONDOONBM.js.map → chunk-HUSMC5GZ.js.map} +0 -0
- /package/dist/esm/{chunk-UIIXVY6K.js.map → chunk-IQKS662C.js.map} +0 -0
- /package/dist/esm/{chunk-5OFXPT4J.js.map → chunk-M62U4QGQ.js.map} +0 -0
- /package/dist/esm/{chunk-UQVAEWY2.js.map → chunk-MZJT3USG.js.map} +0 -0
- /package/dist/esm/{chunk-FKTDL7KO.js.map → chunk-OAG5T7NC.js.map} +0 -0
- /package/dist/esm/{chunk-M2NDSQR5.js.map → chunk-P6YHEIFT.js.map} +0 -0
- /package/dist/esm/{chunk-P5VEI574.js.map → chunk-S4CU4XRB.js.map} +0 -0
- /package/dist/esm/{chunk-4NBLO5WK.js.map → chunk-X4CMSAET.js.map} +0 -0
- /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
|
|
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
|
|
531
|
+
const hasBlockContent = autoDetect && containsBlockHTML(text);
|
|
531
532
|
const dangerousHTML = (0, import_react3.useMemo)(() => ({ __html: text }), [text]);
|
|
532
|
-
if (autoDetect && !
|
|
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 ?? (
|
|
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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,IAAAA,iBAAuB;AAGvB,IAAAC,gBAAmD;;;ACHnD,0BAIO;AACP,mBAA+C;AAexC,IAAM,sBAAsB;AAAA,EACjC,EAAE,MAAM,MAAM,OAAO,IAAI;AAAA,EACzB,EAAE,MAAM,MAAM,OAAO,IAAI;AAAA,EACzB,EAAE,MAAM,MAAM,OAAO,IAAI;AAAA,EACzB,EAAE,MAAM,MAAM,OAAO,IAAI;AAAA,EACzB,EAAE,MAAM,MAAM,OAAO,KAAK;AAAA,EAC1B,EAAE,MAAM,OAAO,OAAO,KAAK;AAC7B;AAEA,IAAM,UAAmC,EAAE,SAAS,KAAK;AAEzD,IAAM,gBAAgB,CAAC,aAA8B,gBAAwB;AAG3E,QAAM,UAAU,YAAY;AAAA,IAC1B,gBAAc,WAAW,SAAS,cAAc;AAAA,EAClD;AACA,QAAM,WAAW,YAAY,CAAC;AAC9B,QAAM,UAAU,YAAY,YAAY,SAAS,CAAC;AAClD,QAAM,QAAQ,YAAY,UAAU,CAAC;AAErC,MAAI,YAAY,EAAG,QAAO;AAC1B,MAAI,YAAY,GAAI,QAAO;AAE3B,SAAO;AACT;AAEA,IAAM,gBAAgB,CACpB,sBACsB;AACtB,QAAM,mBAAe,iCAAY;AACjC,QAAM,cAAc,qBAAqB;AACzC,QAAM,oBAAoB,YAAY,CAAC;AAEvC,QAAM,CAAC,aAAa,cAAc,QAAI;AAAA,IACpC,OAAO,YAAY,WAAW,cAC1B,OAAO,aACP,kBAAkB;AAAA,EACxB;AAEA,0CAAe,UAAU,MAAM,eAAe,OAAO,UAAU,GAAG,OAAO;AAEzE,QAAM,qBAAiB,uCAAkB,aAAa,GAAG;AAIzD,QAAM,wBAAoB;AAAA,IACxB,MACE,CAAC,gBAAgB,YAAY,WAAW,IACpC,oBACA,cAAc,aAAa,cAAc;AAAA,IAC/C,CAAC,cAAc,aAAa,mBAAmB,cAAc;AAAA,EAC/D;AAEA,QAAM,SAAK;AAAA,IACT,CAAC,SAAmB;AAClB,YAAM,YAAY,YAAY,UAAU,UAAQ,KAAK,SAAS,IAAI;AAClE,UAAI,cAAc,IAAI;AACpB,eAAO;AAAA,MACT;AACA,YAAM,eAAe,YAAY;AAAA,QAC/B,UAAQ,KAAK,SAAS,kBAAkB;AAAA,MAC1C;AAEA,aAAO,gBAAgB;AAAA,IACzB;AAAA,IACA,CAAC,mBAAmB,WAAW;AAAA,EACjC;AAEA,QAAM,WAAO;AAAA,IACX,CAAC,SAAmB;AAClB,YAAM,YAAY,YAAY,UAAU,UAAQ,KAAK,SAAS,IAAI;AAClE,UAAI,cAAc,IAAI;AACpB,eAAO;AAAA,MACT;AACA,YAAM,eAAe,YAAY;AAAA,QAC/B,UAAQ,KAAK,SAAS,kBAAkB;AAAA,MAC1C;AAEA,aAAO,gBAAgB;AAAA,IACzB;AAAA,IACA,CAAC,mBAAmB,WAAW;AAAA,EACjC;AAEA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AACF;;;AC/GO,IAAM,uBAAuB,CAAC,UAAmC;AACtE,QAAM,gBAAyC,CAAC;AAChD,SAAO,KAAK,KAAK,EAAE,QAAQ,SAAO;AAChC,QAAI,MAAM,GAAG,MAAM,QAAW;AAC5B,oBAAc,GAAG,IAAI,MAAM,GAAG;AAAA,IAChC;AAAA,EACF,CAAC;AACD,SAAO;AACT;;;ACNO,IAAM,kBAAkB,CAC7B,YACuB;AACvB,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,cAAc,OAAO;AAAA,EAC9B;AAEA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,GAAG,OAAO;AAAA,EACnB;AAEA,SAAO;AACT;;;ACZA,IAAAC,iBAAuB;AAEvB,IAAAC,gBAA2C;AAC3C,IAAAC,uBAAwC;;;ACHxC,IAAAC,iBAAuB;;;ACFvB,oBAAuB;;;ACIhB,IAAM,kBAAkB,CAAC,UAA0B;AACxD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,gBAAgB,GAAG;AAAA,IACxB,WAAW,gBAAgB,SAAS;AAAA,IACpC,QAAQ,gBAAgB,MAAM;AAAA,EAChC;AAEA,SAAO,qBAAqB,UAAU;AACxC;AAEO,IAAM,aAAa,CACxB,UACwC;AACxC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;;;AD/DA,kBAAO;AAeH;AAbJ,IAAM,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,MAAiB;AAC7C,QAAM;AAAA,IACJ,aAAa,UAAU;AAAA,IACvB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,cAAU,cAAAC,SAAW,UAAU,eAAe,SAAS;AAE7D,QAAM,CAAC,YAAY,SAAS,IAAI,WAAW,UAAU;AACrD,QAAM,aAAa,gBAAgB,UAAU;AAE7C,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,MACA,WAAW;AAAA,MACV,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,KAAK,cAAc;;;AE9BnB,IAAAC,iBAAuB;AAEvB,kBAAO;AA2CH,IAAAC,sBAAA;AAzCJ,IAAM,cAAc;AAEpB,IAAM,wBAAwB,CAAC,QAC7B,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAEpC,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAc;AACZ,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,QAAM,cAAU,eAAAC;AAAA,IACd;AAAA,IACA;AAAA,IACA,eAAe,WAAW;AAAA,IAC1B,UAAU,IAAI;AAAA,IACd;AAAA,IACA;AAAA,MACE,CAAC,GAAG,WAAW,KAAK,GAAG;AAAA,MACvB,CAAC,GAAG,WAAW,OAAO,GAAG,QAAQ;AAAA,MACjC,CAAC,GAAG,WAAW,eAAe,GAAG;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,EAAE,UAAU,OAAO,QAAQ,YAAY,IAAI;AACjD,QAAM,oBAAoB,SAAS,MAAM,GAAG,EAAE,KAAK,GAAG;AAEtD,QAAM,eAAe,GAAG,sBAAsB,iBAAiB,CAAC;AAChE,QAAM,YAAY,SAAS;AAE3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAU;AAAA,MACV,aAAW;AAAA,MACX,WAAW;AAAA,MACX,MAAK;AAAA,MACL,OAAM;AAAA,MACN,SAAS,OAAO,KAAK,IAAI,MAAM;AAAA,MAC/B,OAAO,EAAE,MAAM;AAAA,MACd,GAAG;AAAA,MAEJ;AAAA,qDAAC,WAAO,qBAAU;AAAA,QAClB,6CAAC,UAAK,MAAK,gBAAe,GAAG,aAAa;AAAA;AAAA;AAAA,EAC5C;AAEJ;;;AHvDA,mBAA4B;AA2DpB,IAAAC,sBAAA;AApCD,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA,aAAa,cAAc;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA0B;AACxB,QAAM,kBAAc,eAAAC,SAAW,0BAA0B;AAAA,IACvD,aAAa;AAAA,EACf,CAAC;AACD,QAAM,kBAAc,eAAAA,SAAW,+BAA+B;AAAA,IAC5D,aAAa;AAAA,EACf,CAAC;AACD,QAAM,gBAAgB,CAAC,MAA+B;AACpD,QAAI,SAAS;AACX,cAAQ,CAAC;AAAA,IACX;AACA,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,CAAC,MAAqB;AAC1C,QAAI,EAAE,QAAQ,OAAO,EAAE,QAAQ,SAAS;AACtC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,gBAAgB;AAClB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,YAAW;AAAA,QACX,WAAU;AAAA,QAEV;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ,WAAW;AAAA,cACX,SAAS;AAAA,cACT,WAAW;AAAA,cACX,MAAK;AAAA,cACL,UAAU;AAAA,cACV,iBAAe,CAAC,CAAC;AAAA,cACjB,iBAAe;AAAA,cAEf;AAAA,6DAAC,eAAY,WAAU,+BACpB,gBACH;AAAA,gBACA,6CAAC,QAAK,MAAM,0BAAa,WAAW,aAAa;AAAA;AAAA;AAAA,UACnD;AAAA,UACC;AAAA;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,MACJ,WAAW;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,MAAK;AAAA,MACL,UAAU;AAAA,MACV,iBAAe,CAAC,CAAC;AAAA,MACjB,iBAAe;AAAA,MAEf;AAAA,qDAAC,eAAY,WAAU,+BAA+B,gBAAK;AAAA,QAC3D,6CAAC,QAAK,MAAM,0BAAa,WAAW,aAAa;AAAA;AAAA;AAAA,EACnD;AAEJ;;;ADtFA,uBAAO;AAoGH,IAAAC,sBAAA;AAxEG,IAAM,YAAY,CAAC,EAAE,KAAK,GAAG,MAAM,MAAsB;AAC9D,QAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,MAAM;AAAA,IAAC;AAAA,IAClB;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,wBAAS;AAAA,IACnD,MAAM;AAAA,IACN,eAAe;AAAA,EACjB,CAAC;AACD,QAAM,2BAAuB,8CAAwB;AAErD,QAAM,uBAAmB,eAAAC;AAAA,IACvB;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,MACE,oBAAoB,eAAe,iBAAiB,CAAC;AAAA,MACrD,aAAa,eAAe;AAAA,IAC9B;AAAA,EACF;AACA,QAAM,8BAA0B,eAAAA;AAAA,IAC9B;AAAA,IACA;AAAA,MACE,aAAa,eAAe;AAAA,IAC9B;AAAA,EACF;AACA,QAAM,qBAAiB,eAAAA,SAAW,6BAA6B;AAAA,IAC7D,aAAa,eAAe;AAAA,EAC9B,CAAC;AAED,QAAM,WAAW,eAAe,OAAO,WAAW;AAElD,QAAM,eAAe,MAAM;AAEzB,QAAI,CAAC,eAAe,QAAQ,QAAQ;AAClC,aAAO;AAAA,IACT;AACA,QAAI,eAAe,QAAQ,SAAS;AAClC,cAAQ;AAAA,IACV;AACA,QAAI,UAAU;AACZ,eAAS,CAAC,eAAe,IAAI;AAAA,IAC/B;AACA,sBAAkB;AAAA,MAChB,MAAM,CAAC,eAAe;AAAA,MACtB,eAAe;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,+BAAU,MAAM;AACd,sBAAkB;AAAA,MAChB,MAAM;AAAA,MACN,eAAe;AAAA,IACjB,CAAC;AAAA,EACH,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,aAAS,qBAAM;AACrB,QAAM,cAAc,oBAAoB,MAAM;AAC9C,QAAM,YAAY,mBAAmB,MAAM;AAE3C,SACE,8CAAC,SAAI,KAAW,GAAG,MAAM,WAAW,kBACjC;AAAA,uBAAmB,SAClB;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,aAAa;AAAA,QACb,QAAQ;AAAA,QACR;AAAA,QACA,cAAc,eAAe;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,eAAa,CAAC,eAAe;AAAA,QAC7B,mBAAiB;AAAA,QACjB,MAAK;AAAA,QAEL,uDAAC,SAAI,WAAW,gBAAiB,gBAAM,UAAS;AAAA;AAAA,IAClD;AAAA,IACC,mBAAmB,YAClB;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA,cAAc,eAAe;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;AAEA,UAAU,cAAc;;;AKtJxB,IAAAC,iBAAuB;AAEvB,IAAAC,gBAAwB;;;ACDxB,IAAAC,iBAAuB;AAEvB,kBAAO;AAwDE,IAAAC,sBAAA;AA9BF,IAAM,iBAAiB,CAC5B,SACA,gBACgB;AAEhB,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,CAAC,MAAM,MAAM,MAAM,IAAI,EAAE,SAAS,OAAO,GAAG;AACzD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,IAAM,OAAO,CAAC,EAAE,KAAK,aAAa,GAAG,MAAM,MAAiB;AAE1D,QAAM,EAAE,SAAS,WAAW,SAAS,GAAG,WAAW,IAAI;AAGvD,QAAM,UAAuB,eAAe,SAAS,WAAW;AAChE,QAAM,cAAc,WAAW;AAC/B,QAAM,cAAU,eAAAC;AAAA,IACd;AAAA,IACA;AAAA,IACA,EAAE,CAAC,QAAQ,WAAW,EAAE,GAAG,YAAY;AAAA,IACvC,EAAE,CAAC,qBAAqB,OAAO,EAAE,GAAG,QAAQ;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO,6CAAC,WAAQ,KAAW,GAAG,YAAY,WAAW,SAAS;AAChE;AAEA,KAAK,cAAc;;;ADMb,IAAAC,sBAAA;AA3DN,IAAM,YACJ;AACF,IAAM,oBAAoB,CAAC,SAAiB,UAAU,KAAK,IAAI;AAC/D,IAAM,eAAe,CAAC,SACpB,WAAW,KAAK,IAAI,KAAK,kCAAkC,KAAK,IAAI;AAEtE,IAAM,mBAAmB,CACvB,WACA,kBACG;AACH,QAAM,EAAE,SAAS,aAAa,SAAS,UAAU,IAAI;AACrD,QAAM,cAAc,WAAW,eAAe,SAAS,WAAW;AAClE,aAAO,eAAAC;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,CAAC,QAAQ,WAAW,EAAE,GAAG,YAAY;AAAA,IACvC,EAAE,CAAC,qBAAqB,OAAO,EAAE,GAAG,QAAQ;AAAA,IAC5C;AAAA,IACA;AAAA,EACF;AACF;AAgBA,IAAM,aAAa,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AAAA,EACb,GAAG;AACL,MAAuB;AACrB,QAAM,kBAAkB,cAAc,kBAAkB,IAAI;AAI5D,QAAM,oBAAgB,uBAAQ,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC;AAI9D,MAAI,cAAc,CAAC,iBAAiB;AAClC,UAAM,EAAE,SAAS,SAAS,aAAa,WAAW,GAAG,SAAS,IAAI;AAClE,UAAM,UAAU,eAAe,SAAS,WAAW;AACnD,UAAM,UAAU,iBAAiB,WAAW,aAAa;AAEzD,WAAO,aAAa,IAAI,IACtB;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACC,GAAG;AAAA,QACJ,WAAW;AAAA,QACX,yBAAyB;AAAA;AAAA,IAC3B,IAEA,6CAAC,WAAQ,KAAW,GAAG,UAAU,WAAW,SACzC,gBACH;AAAA,EAEJ;AAEA,QAAM,qBACJ,oBAAoB,kBAAkB,QAAQ;AAChD,QAAM,mBACJ;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,yBAAyB;AAAA;AAAA,EAC3B;AAGF,MAAI,aAAa;AACf,WACE,6CAAC,QAAK,KAAW,GAAG,WACjB,4BACH;AAAA,EAEJ;AAEA,SAAO;AACT;AAEA,WAAW,cAAc;;;ATzFzB,4BAAO;AAoEC,IAAAC,sBAAA;AA1CD,IAAM,iBAAiB,CAAC,EAAE,KAAK,GAAG,MAAM,MAA2B;AACxE,QAAM;AAAA,IACJ;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,IACA,YAAY,CAAC;AAAA,IACb,iBAAiB,CAAC;AAAA,IAClB;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,KAAK;AAClD,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AACpD,QAAM,cAAU,sBAAuB,IAAI;AAC3C,QAAM,EAAE,KAAK,IAAI,cAAc;AAG/B,QAAM,aAAS,qBAAM;AACrB,QAAM,iBAAiB,0BAA0B,MAAM;AAGvD,QAAM,iBAAiB,aAAa,KAAK,UAAU,IAAI;AAEvD,+BAAU,MAAM;AACd,QAAI,CAAC,kBAAkB,CAAC,QAAQ,SAAS;AACvC,qBAAe,KAAK;AACpB;AAAA,IACF;AAGA,UAAM,UAAU,QAAQ;AACxB,UAAM,gBAAgB,QAAQ,eAAe,QAAQ;AACrD,mBAAe,aAAa;AAAA,EAC9B,GAAG,CAAC,MAAM,gBAAgB,QAAQ,CAAC;AAGnC,MAAI,cAAc,CAAC,gBAAgB;AACjC,WACE,6CAAC,SAAI,KAAU,WAAuB,GAAG,YACvC,uDAAC,cAAW,MAAY,aAAW,MAAE,GAAG,WAAW,GACrD;AAAA,EAEJ;AAEA,QAAM,wBAAwB,CAAC,aAAsB;AACnD,kBAAc,QAAQ;AACtB,eAAW,QAAQ;AAAA,EACrB;AAEA,QAAM,cAAU,eAAAC,SAAW,0BAA0B,SAAS;AAC9D,QAAM,2BAAuB,eAAAA,SAAW,mCAAmC;AAAA,IACzE,8CAA8C,CAAC;AAAA,EACjD,CAAC;AAGD,QAAM,qBAAqB;AAAA,IACzB,gBAAgB;AAAA,EAClB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,MACX,eAAY;AAAA,MACX,GAAG;AAAA,MAEJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAW;AAAA,YACX,OAAO;AAAA,YACP,eAAY;AAAA,YACZ,oBAAkB,cAAc,iBAAiB;AAAA,YAEjD,uDAAC,cAAW,aAAY,QAAO,aAAW,MAAC,MAAa,GAAG,WAAW;AAAA;AAAA,QACxE;AAAA,QACC,eACC;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,gBAAe;AAAA,YACf,UAAU;AAAA,YACV,SAAS,CAAC,MAAyB;AACjC,iBAAG,gBAAgB;AAAA,YACrB;AAAA,YACA,IAAI;AAAA,YACH,GAAG;AAAA;AAAA,QACN;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,eAAe,cAAc;",
|
|
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
|
|
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
|
|
281
|
+
const hasBlockContent = autoDetect && containsBlockHTML(text);
|
|
281
282
|
const dangerousHTML = (0, import_react3.useMemo)(() => ({ __html: text }), [text]);
|
|
282
|
-
if (autoDetect && !
|
|
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 ?? (
|
|
297
|
+
const DangerousComponent = htmlElementType ?? (hasBlockContent ? "div" : "span");
|
|
297
298
|
const dangerousElement = /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
298
299
|
DangerousComponent,
|
|
299
300
|
{
|