fictoan-react 2.0.0-beta.12 → 2.0.0-beta.13

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.
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion-DCCt5GHU.js","sources":["../src/utils/classNames.ts","../src/components/Element/Element.tsx","../src/components/Element/Tags.tsx","../src/components/Badge/Badge.tsx","../src/hooks/UseClickOutside.ts","../src/components/Drawer/Drawer.tsx","../src/components/Button/Button.tsx","../src/components/ButtonGroup/ButtonGroup.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/components/Callout/Callout.tsx","../src/components/Card/Card.tsx","../src/components/CodeBlock/CodeBlock.tsx","../src/components/Divider/Divider.tsx","../src/utils/propSeparation.ts","../src/components/Form/InputLabel/InputLabel.tsx","../src/components/Typography/Text.tsx","../src/components/Form/FormItem/FormItem.tsx","../src/components/Form/Checkbox/Checkbox.tsx","../src/components/Form/Checkbox/Switch.tsx","../src/components/Form/Checkbox/CheckboxAndSwitchGroup.tsx","../src/components/Form/FileUpload/FileUpload.tsx","../src/components/Form/InputField/InputField.tsx","../src/components/Portion/Portion.tsx","../src/components/Form/RadioButton/RadioButton.tsx","../src/components/Form/RadioButton/RadioGroup.tsx","../src/components/Row/Row.tsx","../src/components/Form/Select/Select.tsx","../src/components/Form/TextArea/TextArea.tsx","../src/components/Form/Form/FormGenerator.tsx","../src/components/Form/Form/Form.tsx","../src/components/Form/FormItemGroup/FormItemGroup.tsx","../src/components/Form/ListBox/listBoxUtils.ts","../src/components/Form/ListBox/ListBox.tsx","../src/components/Form/PinInputField/PinInputField.tsx","../src/components/Form/RadioButton/RadioTabGroup.tsx","../src/components/Form/Range/Range.tsx","../src/components/Meter/Meter.tsx","../src/components/Modal/Modal.tsx","../src/components/Notification/NotificationsWrapper/NotificationsWrapper.tsx","../src/components/Notification/NotificationItem/NotificationItem.tsx","../src/components/Notification/NotificationsProvider/NotificationsProvider.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Pagination/usePagination.ts","../src/components/Pagination/Pagination.tsx","../src/components/ProgressBar/ProgressBar.tsx","../src/components/OptionCard/OptionCard.tsx","../src/components/Sidebar/SidebarWrapper/SidebarWrapper.tsx","../src/components/Sidebar/ContentWrapper/ContentWrapper.tsx","../src/components/Sidebar/SidebarHeader/SidebarHeader.tsx","../src/components/Sidebar/SidebarItem/SidebarItem.tsx","../src/components/Sidebar/SidebarFooter/SidebarFooter.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Table/Table.tsx","../src/components/Tabs/Tabs.tsx","../src/components/ThemeProvider/ThemeProvider.tsx","../src/components/Toast/ToastsWrapper/ToastsWrapper.tsx","../src/components/Toast/ToastItem/ToastItem.tsx","../src/components/Toast/ToastsProvider/ToastsProvider.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Typography/Heading.tsx","../src/components/Accordion/Accordion.tsx"],"sourcesContent":["export const createClassName = (classNames: any[]): string => {\n return classNames.filter((item) => !!item).join(\" \");\n};\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// UTILS ===============================================================================================================\nimport { createClassName } from \"$utils/classNames\";\n\n// OTHER ===============================================================================================================\nimport { ElementProps } from \"./constants\";\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Element = React.forwardRef(\n <K extends {}>(\n {\n as : Component = \"div\",\n role,\n ariaLabel,\n tabIndex,\n onKeyDown,\n ...props\n }: ElementProps<K> & {\n role ? : string;\n ariaLabel ? : string;\n tabIndex ? : number;\n onKeyDown ? : (event: React.KeyboardEvent) => void;\n }, ref: React.LegacyRef<HTMLElement>\n ) => {\n const {\n classNames = [],\n bgColor,\n bgColour,\n bgOpacity,\n borderColor,\n borderColour,\n borderOpacity,\n className,\n columns,\n fillColor,\n fillColour,\n gap,\n hideOnDesktop,\n hideOnMobile,\n hideOnTabletLandscape,\n hideOnTabletPortrait,\n horizontalMargin,\n horizontalPadding,\n horizontallyCenterThis,\n horizontallyCentreThis,\n isClickable,\n isFullHeight,\n isFullWidth,\n layoutAsFlexbox,\n layoutAsGrid,\n stackVertically,\n stackHorizontally,\n marginLeft,\n marginBottom,\n margin,\n marginRight,\n marginTop,\n opacity,\n paddingBottom,\n paddingLeft,\n padding,\n paddingRight,\n paddingTop,\n pushItemsToEnds,\n shadow,\n shape,\n showOnlyOnDesktop,\n showOnlyOnMobile,\n showOnlyOnTabletLandscape,\n showOnlyOnTabletPortrait,\n size,\n strokeColor,\n strokeColour,\n textColor,\n textColour,\n verticalMargin,\n verticalPadding,\n verticallyCenterItems,\n verticallyCentreItems,\n weight,\n style,\n ...minimalProps\n } = props;\n\n const {className : _, classNames : __, ...sanitizedProps} = props;\n\n // Build style object with opacity CSS custom properties\n const computedStyle = {\n ...style,\n ...(bgOpacity && { \"--bg-opacity\": Number(bgOpacity) / 100 }),\n ...(borderOpacity && { \"--border-opacity\": Number(borderOpacity) / 100 }),\n } as React.CSSProperties;\n\n return (\n <Component\n ref={ref}\n role={role}\n aria-label={ariaLabel}\n tabIndex={tabIndex}\n onKeyDown={onKeyDown}\n {...minimalProps}\n style={Object.keys(computedStyle).length > 0 ? computedStyle : undefined}\n className={createClassName(\n [\n className,\n bgColor && `bg-${bgColor}`,\n bgColour && `bg-${bgColour}`,\n borderColor && `border-${borderColor}`,\n borderColour && `border-${borderColour}`,\n fillColor && `fill-${fillColor}`,\n fillColour && `fill-${fillColour}`,\n hideOnDesktop && \"hide-on-desktop\",\n hideOnMobile && \"hide-on-mobile\",\n hideOnTabletLandscape && \"hide-on-tablet-landscape\",\n hideOnTabletPortrait && \"hide-on-tablet-portrait\",\n horizontalMargin && `margin-right-${horizontalMargin} margin-left-${horizontalMargin}`,\n horizontalPadding && `padding-right-${horizontalPadding} padding-left-${horizontalPadding}`,\n horizontallyCenterThis && \"horizontally-centre-this\",\n horizontallyCentreThis && \"horizontally-centre-this\",\n isClickable && \"is-clickable\",\n isFullHeight && \"full-height\",\n isFullWidth && \"full-width\",\n layoutAsFlexbox && \"layout-flexbox\",\n layoutAsGrid && \"layout-grid\",\n stackVertically && \"stack-vertically\",\n stackHorizontally && \"stack-horizontally\",\n gap && `gap-${gap}`,\n marginLeft && `margin-left-${marginLeft}`,\n marginBottom && `margin-bottom-${marginBottom}`,\n margin && `margin-all-${margin}`,\n marginRight && `margin-right-${marginRight}`,\n marginTop && `margin-top-${marginTop}`,\n opacity && `opacity-${opacity}`,\n paddingBottom && `padding-bottom-${paddingBottom}`,\n paddingLeft && `padding-left-${paddingLeft}`,\n padding && `padding-all-${padding}`,\n paddingRight && `padding-right-${paddingRight}`,\n paddingTop && `padding-top-${paddingTop}`,\n pushItemsToEnds && \"push-to-ends\",\n shadow && `shadow-${shadow}`,\n shape && `shape-${shape}`,\n showOnlyOnDesktop && \"show-only-on-desktop\",\n showOnlyOnMobile && \"show-only-on-mobile\",\n showOnlyOnTabletLandscape && \"show-only-on-tablet-landscape\",\n showOnlyOnTabletPortrait && \"show-only-on-tablet-portrait\",\n size && `size-${size}`,\n strokeColor && `stroke-${strokeColor}`,\n strokeColour && `stroke-${strokeColour}`,\n textColor && `text-${textColor}`,\n textColour && `text-${textColour}`,\n verticalMargin && `margin-top-${verticalMargin} margin-bottom-${verticalMargin}`,\n verticalPadding && `padding-top-${verticalPadding} padding-bottom-${verticalPadding}`,\n verticallyCenterItems && \"vertically-centre-items\",\n verticallyCentreItems && \"vertically-centre-items\",\n weight && `weight-${weight}`,\n ].concat(classNames),\n )}\n />\n );\n },\n) as <K extends {}>(props : ElementProps<K> & { ref? : React.LegacyRef<HTMLElement> }) => React.ReactElement;\n(Element as any).displayName = \"Element\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"./Element\";\nimport { ElementProps } from \"./constants\";\n\ninterface HyperlinkCustomProps {\n href : string;\n target ? : \"_blank\" | \"_self\" | \"_parent\" | \"_top\";\n rel ? : string;\n isExternal ? : boolean;\n}\n\n// Helper type for components that might have custom props\ntype CustomProps<T extends React.ElementType, P = {}> = ElementProps<{}> &\n React.HTMLAttributes<HTMLElement> & P;\n\nconst createComponentWithElement = <T extends React.ElementType, P = {}>(\n tagName : T,\n defaultProps? : Partial<P>,\n) => {\n return React.forwardRef<HTMLElement, CustomProps<T, P>>(\n (props, ref) => {\n // Merge default props with provided props\n const finalProps = {...defaultProps, ...props};\n\n // Handle external links for Hyperlink component\n if (tagName === \"a\" && \"external\" in finalProps) {\n const {external, ...restProps} = finalProps;\n if (external) {\n finalProps.target = \"_blank\";\n finalProps.rel = \"noopener noreferrer\";\n }\n }\n\n return <Element as={tagName} ref={ref} {...finalProps} />;\n },\n );\n};\n\nexport const Article = createComponentWithElement(\"article\");\nexport const Aside = createComponentWithElement(\"aside\");\nexport const Body = createComponentWithElement(\"body\");\nexport const Div = createComponentWithElement(\"div\");\nexport const Footer = createComponentWithElement(\"footer\");\nexport const Header = createComponentWithElement(\"header\");\nexport const Main = createComponentWithElement(\"main\");\nexport const Nav = createComponentWithElement(\"nav\");\nexport const Section = createComponentWithElement(\"section\");\nexport const Span = createComponentWithElement(\"span\");\nexport const Hyperlink = createComponentWithElement<\"a\", HyperlinkCustomProps>(\"a\", {\n rel : \"noopener noreferrer\", // Default props for Hyperlink\n});\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, ShapeTypes, SpacingTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./badge.css\";\n\nexport type BadgeActionIconType = \"cross\" | \"tick\" | \"plus\" | \"minus\";\n\nexport interface BadgeCustomProps {\n size ? : SpacingTypes;\n shape ? : ShapeTypes;\n actionIcon ? : BadgeActionIconType;\n onActionClick ? : (event : React.MouseEvent<HTMLButtonElement>) => void;\n actionAriaLabel ? : string;\n}\n\nexport type BadgeElementType = HTMLDivElement;\nexport type BadgeProps = Omit<CommonAndHTMLProps<BadgeElementType>, keyof BadgeCustomProps> & BadgeCustomProps;\n\n// ICONS ///////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst ActionIcons : Record<BadgeActionIconType, React.ReactNode> = {\n cross : (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n ),\n tick : (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M5 12l5 5L20 7\" />\n </svg>\n ),\n plus : (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n ),\n minus : (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M5 12h14\" />\n </svg>\n ),\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Badge = React.forwardRef(\n ({\n children,\n size = \"medium\",\n shape,\n actionIcon,\n onActionClick,\n actionAriaLabel,\n ...props\n } : BadgeProps, ref : React.Ref<BadgeElementType>) => {\n let classNames = [];\n\n if (size) {\n classNames.push(`size-${size}`);\n }\n\n if (shape) {\n classNames.push(`shape-${shape}`);\n }\n\n const handleActionClick = (e : React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n onActionClick?.(e);\n };\n\n const hasAction = Boolean(actionIcon);\n\n return (\n <Element<BadgeElementType>\n data-badge\n data-has-action={hasAction || undefined}\n ref={ref}\n classNames={classNames}\n role=\"status\"\n aria-label={(typeof children === \"string\" ? children : undefined)}\n {...props}\n >\n {children}\n\n {hasAction && (\n <button\n type=\"button\"\n className=\"badge-action-button\"\n onClick={handleActionClick}\n aria-label={actionAriaLabel}\n >\n {ActionIcons[actionIcon!]}\n </button>\n )}\n </Element>\n );\n },\n);\nBadge.displayName = \"Badge\";\n","import { RefObject, useCallback, useEffect } from \"react\";\n\nexport const useClickOutside = <T extends HTMLElement = HTMLElement>(\n ref : RefObject<T | null>, handler : (e : Event) => void) => {\n const memoizedHandler = useCallback(handler, [handler]);\n\n useEffect(() => {\n const listener = (event : Event) => {\n // Skip processing if ref doesn't exist or handler is a no-op function\n if (!ref.current || typeof memoizedHandler !== \"function\") {\n return;\n }\n\n // Only call handler if click is outside the referenced element\n if (!ref.current.contains(event.target as Node)) {\n memoizedHandler(event);\n }\n };\n\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n };\n }, [ref, memoizedHandler]);\n};\n","// REACT CORE ==========================================================================================================\nimport React, { useEffect, useRef } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, SpacingTypes } from \"../Element/constants\";\nimport { Div } from \"$tags\";\nimport { Element } from \"$element\";\n\n// HOOKS ===============================================================================================================\nimport { useClickOutside } from \"$hooks/UseClickOutside\";\n\n// STYLES ==============================================================================================================\nimport \"./drawer.css\";\n\nexport interface DrawerCustomProps {\n id : string;\n isOpen ? : boolean;\n onClose ? : () => void;\n position ? : \"top\" | \"right\" | \"bottom\" | \"left\";\n size ? : SpacingTypes;\n isDismissible ? : boolean;\n showOverlay ? : boolean;\n blurOverlay ? : boolean;\n closeOnClickOutside ? : boolean;\n label ? : string;\n description ? : string;\n zIndex ? : number;\n}\n\nexport type DrawerElementType = HTMLDivElement;\nexport type DrawerProps = Omit<CommonAndHTMLProps<DrawerElementType>, keyof DrawerCustomProps> & DrawerCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Drawer = React.forwardRef(\n (\n {\n id,\n children,\n isOpen = false,\n onClose,\n position = \"right\",\n size = \"medium\",\n padding = \"micro\",\n bgColor,\n bgColour,\n isDismissible = true,\n showOverlay = true,\n blurOverlay = false,\n closeOnClickOutside = true,\n zIndex,\n label,\n description,\n classNames = [],\n ...props\n } : DrawerProps,\n ref : React.Ref<DrawerElementType>,\n ) => {\n const drawerId = `${id}`;\n const descriptionId = description ? `${drawerId}-description` : undefined;\n const drawerRef = useRef<HTMLDivElement>(null);\n const effectiveRef = (ref || drawerRef) as React.RefObject<HTMLDivElement>;\n\n // Build class names\n const drawerClasses : string[] = [\n \"drawer\",\n position,\n size,\n ...(isOpen ? [ \"open\" ] : []),\n ...(showOverlay ? [ \"with-overlay\" ] : []),\n ...(blurOverlay ? [ \"blur-overlay\" ] : []),\n ...classNames,\n ];\n\n // Handle open/close state declaratively\n useEffect(() => {\n const drawer = effectiveRef.current;\n const overlay = document.querySelector(`[data-drawer-overlay-for=\"${drawerId}\"]`) as HTMLElement;\n\n if (isOpen) {\n // Show drawer\n drawer?.classList.add(\"open\");\n drawer?.classList.remove(\"closing\");\n drawer?.focus();\n\n // Show overlay\n if (overlay) {\n overlay.classList.add(\"visible\");\n }\n\n // Prevent body scroll\n document.body.style.overflow = \"hidden\";\n } else {\n // Hide drawer\n if (drawer?.classList.contains(\"open\")) {\n drawer.classList.add(\"closing\");\n drawer.classList.remove(\"open\");\n\n // Hide overlay\n if (overlay) {\n overlay.classList.remove(\"visible\");\n }\n\n // Restore body scroll\n document.body.style.overflow = \"\";\n }\n }\n\n // Cleanup on unmount\n return () => {\n document.body.style.overflow = \"\";\n };\n }, [ isOpen, drawerId, effectiveRef ]);\n\n // Handle Escape key\n useEffect(() => {\n const handleEscape = (e : KeyboardEvent) => {\n if (e.key === \"Escape\" && isDismissible && isOpen && onClose) {\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [ isDismissible, isOpen, onClose ]);\n\n // Handle click outside\n useClickOutside(effectiveRef, () => {\n if (closeOnClickOutside && isDismissible && isOpen && onClose) {\n onClose();\n }\n });\n\n // Handle animation end\n const handleAnimationEnd = (e : React.AnimationEvent) => {\n if (e.animationName.includes(\"slide-out\") || e.animationName.includes(\"fade-out\")) {\n e.currentTarget.classList.remove(\"closing\");\n }\n };\n\n return (\n <>\n {/* OVERLAY */}\n {showOverlay && (\n <Div\n className={`drawer-overlay ${blurOverlay ? \"blur\" : \"\"} ${isOpen ? \"visible\" : \"\"}`}\n data-drawer-overlay-for={id}\n aria-hidden=\"true\"\n onClick={closeOnClickOutside && isDismissible && onClose ? onClose : undefined}\n style={{zIndex : zIndex ?? 10000 - 1}}\n />\n )}\n\n {/* DRAWER */}\n <Element<DrawerElementType>\n as=\"div\"\n id={drawerId}\n data-drawer\n ref={effectiveRef}\n classNames={drawerClasses}\n onAnimationEnd={handleAnimationEnd}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={label || \"Drawer\"}\n aria-describedby={descriptionId}\n tabIndex={-1}\n style={{zIndex : zIndex ?? 10000}}\n {...props}\n >\n {/* DISMISS BUTTON */}\n {isDismissible && onClose && (\n <button\n className=\"drawer-dismiss-button\"\n onClick={onClose}\n aria-label=\"Close drawer\"\n tabIndex={0}\n >\n &times;\n </button>\n )}\n\n <Div\n className=\"drawer-content\"\n role=\"document\"\n padding={padding}\n bgColor={bgColor}\n bgColour={bgColour}\n >\n {/* SR-ONLY DESCRIPTION */}\n {description && (\n <div id={descriptionId} className=\"sr-only\">\n {description}\n </div>\n )}\n\n {children}\n </Div>\n </Element>\n </>\n );\n },\n);\nDrawer.displayName = \"Drawer\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, EmphasisTypes, ShapeTypes, SpacingTypes, ButtonVariantTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./Button.css\";\n\n// prettier-ignore\nexport interface ButtonCustomProps {\n kind ? : EmphasisTypes;\n variant ? : ButtonVariantTypes;\n size ? : SpacingTypes;\n shape ? : ShapeTypes;\n isLoading ? : boolean;\n label ? : string;\n}\n\nexport type ButtonElementType = HTMLButtonElement;\nexport type ButtonProps = Omit<CommonAndHTMLProps<ButtonElementType>, keyof ButtonCustomProps> & ButtonCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Button = React.forwardRef(\n ({size = \"medium\", shape, kind, variant, isLoading, label, ...props} : ButtonProps, ref : React.Ref<ButtonElementType>) => {\n let classNames = [];\n\n if (kind) {\n classNames.push(kind);\n }\n\n if (variant) {\n classNames.push(variant);\n }\n\n if (size) {\n classNames.push(`size-${size}`);\n }\n\n if (shape) {\n classNames.push(`shape-${shape}`);\n }\n\n if (isLoading) {\n classNames.push(\"is-loading\");\n }\n\n return (\n <Element<ButtonElementType>\n as=\"button\"\n data-button\n ref={ref}\n classNames={classNames}\n aria-label={label}\n aria-disabled={props.disabled || isLoading}\n aria-busy={isLoading}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, SpacingTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./button-group.css\";\n\n// prettier-ignore\nexport interface ButtonGroupCustomProps {\n isJoint ? : boolean;\n spacing ? : SpacingTypes;\n equaliseWidth ? : boolean;\n}\n\nexport type ButtonGroupElementType = HTMLDivElement;\nexport type ButtonGroupProps = Omit<CommonAndHTMLProps<ButtonGroupElementType>, keyof ButtonGroupCustomProps> &\n ButtonGroupCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const ButtonGroup = React.forwardRef(\n (\n {isJoint = true, spacing, equaliseWidth, children, ...props} : ButtonGroupProps,\n ref : React.Ref<ButtonGroupElementType>,\n ) => {\n let classNames : string[] = [];\n\n if (isJoint) {\n classNames.push(\"is-joint\");\n }\n\n if (spacing && !isJoint) {\n classNames.push(`spacing-${spacing}`);\n }\n\n if (equaliseWidth) {\n classNames.push(\"equal-width\");\n }\n\n return (\n <Element<ButtonGroupElementType>\n as=\"div\"\n data-button-group\n ref={ref}\n role=\"group\"\n classNames={classNames}\n {...props}\n >\n {children}\n </Element>\n );\n },\n);\n\nButtonGroup.displayName = \"ButtonGroup\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, SpacingTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./breadcrumbs.css\";\n\n// OTHER ===============================================================================================================\nimport { Text } from \"$/components\";\n\nexport type BreadcrumbsElementType = HTMLDivElement;\n\nexport interface BreadcrumbsProps extends CommonAndHTMLProps<BreadcrumbsElementType> {\n children : React.ReactNode;\n separator ? : string;\n spacing ? : SpacingTypes;\n}\n\nexport type BreadcrumbItemElementType = HTMLLIElement;\n\nexport interface BreadcrumbItemProps extends CommonAndHTMLProps<BreadcrumbItemElementType> {\n children : React.ReactNode;\n current ? : boolean;\n}\n\ninterface SeparatorProps {\n separator : string;\n}\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst BreadcrumbItem = React.forwardRef<HTMLLIElement, BreadcrumbItemProps>(\n ({children, current, ...props}, ref) => {\n return (\n <Element\n as=\"li\"\n data-breadcrumb-item\n ref={ref}\n {...props}\n aria-current={current ? \"page\" : undefined}\n className={current ? \"current\" : undefined}\n role=\"listitem\"\n >\n <span className=\"breadcrumb-content\">\n {children}\n </span>\n </Element>\n );\n },\n);\n\nconst Separator : React.FC<SeparatorProps> = ({separator}) => (\n <Text\n className=\"breadcrumb-separator\"\n aria-hidden=\"true\"\n role=\"presentation\"\n margin=\"none\"\n >\n {separator}\n </Text>\n);\n\nexport const Breadcrumbs = React.forwardRef<HTMLDivElement, BreadcrumbsProps>(\n ({children, separator = \"/\", spacing = \"micro\", ...props}, ref) => {\n let classNames = [];\n\n if (spacing) {\n classNames.push(`spacing-${spacing}`);\n }\n\n const childrenArray = React.Children.toArray(children).filter(Boolean);\n\n const processedChildren = childrenArray.reduce<React.ReactNode[]>((acc, child, index) => {\n if (!React.isValidElement(child)) return acc;\n\n const isLast = index === childrenArray.length - 1;\n\n let breadcrumbItem : React.ReactNode;\n if (child.type === BreadcrumbItem) {\n const typedChild = child as React.ReactElement<BreadcrumbItemProps>;\n breadcrumbItem = React.cloneElement(typedChild, {\n current : isLast,\n });\n } else {\n breadcrumbItem = (\n <BreadcrumbItem key={`item-${index}`} current={isLast}>\n {child}\n </BreadcrumbItem>\n );\n }\n\n acc.push(breadcrumbItem);\n\n if (!isLast) {\n acc.push(\n <Separator key={`sep-${index}`} separator={separator} />,\n );\n }\n\n return acc;\n }, []);\n\n return (\n <nav aria-label=\"Breadcrumb\" ref={ref} {...props}>\n <Element\n as=\"ul\"\n data-breadcrumbs-wrapper\n role=\"list\"\n classNames={classNames}\n >\n {processedChildren}\n </Element>\n </nav>\n );\n },\n);\nBreadcrumbs.displayName = \"Breadcrumbs\";\n","// REACT CORE ==========================================================================================================\nimport React, { ReactNode } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./callout.css\";\n\n// prettier-ignore\nexport interface CalloutCustomProps {\n kind : \"info\" | \"success\" | \"warning\" | \"error\";\n children : ReactNode;\n title ? : string;\n}\n\nexport type CalloutElementType = HTMLDivElement;\nexport type CalloutProps = Omit<CommonAndHTMLProps<CalloutElementType>, keyof CalloutCustomProps> & CalloutCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Callout = React.forwardRef(\n ({kind, children, title, ...props} : CalloutProps, ref : React.Ref<CalloutElementType>) => {\n const roleMap = {\n info : \"status\",\n success : \"status\",\n warning : \"alert\",\n error : \"alert\",\n };\n\n return (\n <Element<CalloutElementType>\n as=\"div\"\n data-callout\n ref={ref}\n className={kind}\n role={roleMap[kind]}\n aria-live={kind === \"error\" || kind === \"warning\" ? \"assertive\" : \"polite\"}\n aria-label={title}\n {...props}\n >\n {children}\n </Element>\n );\n },\n);\nCallout.displayName = \"Callout\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./card.css\";\n\nexport type CardElementType = HTMLDivElement;\n\nexport interface CardCustomProps {\n heading ? : string;\n}\n\nexport type CardProps = CommonAndHTMLProps<CardElementType> & CardCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Card = React.forwardRef((\n {shape, heading, children, ...props} : CardProps, ref : React.Ref<CardElementType>) => {\n let classNames = [];\n\n if (shape) {\n classNames.push(`shape-${shape}`);\n }\n\n return (\n <Element<CardElementType>\n as=\"div\"\n data-card\n ref={ref}\n classNames={classNames}\n role=\"region\"\n aria-label={heading}\n tabIndex={0}\n {...props}\n >\n {children}\n </Element>\n );\n});\nCard.displayName = \"Card\";\n","// REACT CORE ==========================================================================================================\nimport React, { useState, useEffect, useRef, useCallback } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./CodeBlock.css\";\n\n// OTHER ===============================================================================================================\nimport { Badge } from \"$/components\";\nimport { Button } from \"$/components\";\n\ninterface PrismType {\n languages : { [key : string] : any };\n highlight : (\n code : string,\n grammar : any,\n language : string\n ) => string;\n}\n\nexport interface CodeBlockCustomProps {\n source ? : object | string;\n language ? : string;\n showCopyButton ? : boolean;\n showLineNumbers ? : boolean;\n description ? : string;\n withSyntaxHighlighting ? : boolean;\n makeEditable ? : boolean;\n onChange ? : (content : string) => void;\n}\n\nexport type CodeBlockElementType = HTMLPreElement;\nexport type CodeBlockProps = Omit<CommonAndHTMLProps<CodeBlockElementType>,\n keyof CodeBlockCustomProps> & CodeBlockCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const CodeBlock = React.forwardRef((\n {\n children,\n source,\n language = \"json\",\n showCopyButton,\n showLineNumbers,\n description,\n withSyntaxHighlighting = false,\n makeEditable = false,\n onChange,\n shadow,\n ...props\n } : CodeBlockProps,\n ref : React.Ref<CodeBlockElementType>,\n) => {\n const [ isCodeCopied, setIsCodeCopied ] = useState(false);\n const [ prismModule, setPrismModule ] = useState<PrismType | null>(null);\n const [ isLoading, setIsLoading ] = useState(withSyntaxHighlighting);\n const [ codeElement, setCodeElement ] = useState<HTMLElement | null>(null);\n\n const preRef = useRef<HTMLPreElement>(null);\n\n // Determine the code content from either children or source prop\n let initialCode = typeof children === \"string\"\n ? children\n : React.Children.toArray(children).join(\"\");\n\n if (!children) {\n initialCode = typeof source === \"object\"\n ? JSON.stringify(source, null, 2)\n : source ?? \"\";\n }\n\n // Dynamically load Prism and language support when syntax highlighting is enabled\n useEffect(() => {\n if (!withSyntaxHighlighting) return;\n\n const loadPrismWithLanguage = async () => {\n setIsLoading(true);\n try {\n // Load Prism core FIRST and ensure it's globally available\n const prism = await import(\"prismjs\");\n const Prism = prism.default;\n\n // Ensure Prism is available globally for language plugins\n if (typeof window !== \"undefined\" && !(window as any).Prism) {\n (window as any).Prism = Prism;\n }\n\n // NOW load the language module - it needs Prism to be global\n if (language !== \"plain\" && !Prism.languages[language]) {\n try {\n await import(`prismjs/components/prism-${language}`);\n } catch (langError) {\n console.warn(`Language \"${language}\" not available, falling back to plain text`);\n }\n }\n\n setPrismModule(Prism);\n } catch (error : any) {\n // Check if it's a \"module not found\" error (prismjs not installed)\n if (error?.code === \"ERR_MODULE_NOT_FOUND\" || error?.message?.includes(\"Cannot find module\")) {\n console.warn(\n \"PrismJS is not installed. To enable syntax highlighting, run: npm install prismjs\",\n );\n } else {\n console.warn(`Failed to load syntax highlighting for ${language}:`, error);\n }\n } finally {\n setIsLoading(false);\n }\n };\n\n loadPrismWithLanguage();\n }, [ withSyntaxHighlighting, language ]);\n\n // Get the current cursor position in the editable content\n const getCursorPosition = useCallback(() => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return null;\n\n const range = selection.getRangeAt(0);\n const currentNode = range.startContainer;\n const cursorOffset = range.startOffset;\n\n // Calculate absolute cursor position by walking the DOM tree\n let absoluteOffset = cursorOffset;\n if (currentNode && currentNode !== codeElement && codeElement) {\n const treeWalker = document.createTreeWalker(\n codeElement,\n NodeFilter.SHOW_TEXT,\n null,\n );\n let node;\n while ((node = treeWalker.nextNode())) {\n if (node === currentNode) break;\n absoluteOffset += node.textContent?.length || 0;\n }\n }\n\n return absoluteOffset;\n }, [ codeElement ]);\n\n // Apply syntax highlighting while preserving cursor position in editable mode\n const highlightCode = useCallback((content : string) => {\n if (!codeElement || !withSyntaxHighlighting || !prismModule) return;\n\n try {\n // Store cursor position before modifying content\n const cursorPosition = makeEditable ? getCursorPosition() : null;\n\n // Apply Prism highlighting\n const highlighted = prismModule.highlight(\n content,\n prismModule.languages[language] || prismModule.languages.plain,\n language,\n );\n codeElement.innerHTML = highlighted;\n\n // Restore cursor position for editable content\n if (makeEditable && cursorPosition !== null) {\n const selection = window.getSelection();\n const newRange = document.createRange();\n const treeWalker = document.createTreeWalker(\n codeElement,\n NodeFilter.SHOW_TEXT,\n null,\n );\n\n // Walk through text nodes to find correct cursor position\n let currentOffset = 0;\n let node;\n while ((node = treeWalker.nextNode())) {\n const length = node.textContent?.length || 0;\n if (currentOffset + length >= cursorPosition) {\n newRange.setStart(node, cursorPosition - currentOffset);\n newRange.setEnd(node, cursorPosition - currentOffset);\n selection?.removeAllRanges();\n selection?.addRange(newRange);\n break;\n }\n currentOffset += length;\n }\n }\n } catch (error) {\n console.warn(\"Error highlighting code:\", error);\n if (codeElement) {\n codeElement.textContent = content;\n }\n }\n }, [ language, withSyntaxHighlighting, makeEditable, prismModule, getCursorPosition, codeElement ]);\n\n // Handle content changes in editable mode\n const handleInput = useCallback((event : Event) => {\n if (!codeElement) return;\n\n const content = codeElement.textContent || \"\";\n onChange?.(content);\n\n // Defer highlighting to next frame to ensure content is updated\n requestAnimationFrame(() => {\n highlightCode(content);\n });\n }, [ highlightCode, onChange, codeElement ]);\n\n // Setup input handler for editable content\n useEffect(() => {\n const element = codeElement;\n if (!element || !makeEditable) return;\n\n element.addEventListener(\"input\", handleInput);\n return () => {\n element.removeEventListener(\"input\", handleInput);\n };\n }, [ makeEditable, handleInput, codeElement ]);\n\n // Initial highlighting when component loads\n useEffect(() => {\n if (!codeElement || !prismModule) return;\n highlightCode(initialCode);\n }, [ highlightCode, initialCode, prismModule, codeElement ]);\n\n const copyToClipboard = async () => {\n try {\n const textToCopy = codeElement ? codeElement.textContent || \"\" : initialCode;\n await navigator.clipboard.writeText(textToCopy);\n setIsCodeCopied(true);\n setTimeout(() => setIsCodeCopied(false), 3000);\n } catch (err) {\n console.error(\"Could not copy text: \", err);\n }\n };\n\n // Keyboard shortcuts for copy button ------------------------------------------------------------------------------\n const handleKeyDown = async (e : React.KeyboardEvent) => {\n if ((e.key === \"Enter\" || e.key === \" \") && e.target === preRef.current) {\n e.preventDefault();\n await copyToClipboard();\n }\n };\n\n let classNames = [];\n\n if (showLineNumbers) {\n classNames.push(\"show-line-numbers\");\n }\n\n // Split code into lines for line numbers --------------------------------------------------------------------------\n const lines = initialCode.split(/\\r\\n|\\r|\\n/gm);\n\n return (\n <Element<CodeBlockElementType>\n data-code-block\n as=\"div\"\n classNames={classNames}\n role=\"region\"\n aria-label={description || `Code block in ${language}`}\n {...props}\n >\n {/* Copy Button or Copied Badge */}\n {showCopyButton ? (\n isCodeCopied ? (\n <Badge\n className=\"code-block-copied-badge\"\n size=\"tiny\"\n shape=\"rounded\"\n aria-live=\"polite\"\n >\n Copied!\n </Badge>\n ) : (\n <Button\n type=\"button\"\n className=\"code-block-copy-button\"\n size=\"tiny\"\n shape=\"rounded\"\n onClick={copyToClipboard}\n onKeyDown={handleKeyDown}\n aria-label=\"Copy code to clipboard\"\n >\n Copy\n </Button>\n )\n ) : null}\n\n {/* MAIN CODE DISPLAY ////////////////////////////////////////////////////////////////////////////////// */}\n <pre\n ref={preRef}\n className={`language-${language}${shadow ? ` shadow-${shadow}` : \"\"}`}\n tabIndex={0}\n aria-label={`Code in ${language}`}\n >\n {/* Line Numbers */}\n {showLineNumbers &&\n Array.from(Array(lines.length).keys()).map((index) => (\n <span\n key={index}\n className=\"line-numbers\"\n aria-hidden=\"true\"\n >\n {index + 1}\n </span>\n ))}\n\n {/* Code Content */}\n <code\n ref={setCodeElement}\n contentEditable={makeEditable}\n suppressContentEditableWarning={true}\n spellCheck=\"false\"\n className={`language-${language} ${isLoading ? \"is-loading\" : \"\"}`}\n >\n {initialCode}\n </code>\n </pre>\n </Element>\n );\n});\nCodeBlock.displayName = \"CodeBlock\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./divider.css\";\n\n// prettier-ignore\nexport interface DividerCustomProps {\n kind ? : \"primary\" | \"secondary\" | \"tertiary\";\n height ? : string;\n label ? : string;\n}\n\nexport type DividerElementType = HTMLHRElement;\nexport type DividerProps = Omit<CommonAndHTMLProps<DividerElementType>, keyof DividerCustomProps> & DividerCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Divider = React.forwardRef(\n (\n {kind, height, label, ...props} : DividerProps, ref : React.Ref<DividerElementType>) => {\n let classNames = [];\n\n if (kind) {\n classNames.push(kind);\n }\n\n return (\n <Element<DividerElementType>\n as=\"hr\"\n data-hrule\n ref={ref}\n classNames={classNames}\n role=\"separator\"\n aria-orientation=\"horizontal\"\n aria-label={label}\n {...props}\n style={{height : height}}\n />\n );\n },\n);\nDivider.displayName = \"Divider\";\n","// LOCAL COMPONENTS ====================================================================================================\nimport { CommonProps, SpacingTypes } from \"$components/Element/constants\";\n\nexport interface PropSeparationResult<T extends Record<string, any>> {\n fictoanProps : {\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n };\n htmlProps : Omit<T, \"size\"> & {\n size ? : number;\n };\n}\n\n/**\n * Separates Fictoan-specific props from HTML props to prevent conflicts.\n *\n * The main conflict is with the 'size' prop:\n * - Fictoan uses size as a string for CSS classes (e.g., \"small\", \"medium\", \"large\")\n * - HTML form elements use size as a number for visual width\n *\n * @param props - The props object to separate\n * @returns Object with fictoanProps and htmlProps\n */\nexport const separateFictoanFromHTMLProps = <T extends Record<string, any>>(\n props : T,\n) : PropSeparationResult<T> => {\n const {size, ...htmlProps} = props;\n\n // Check if size is a valid FormItem size (excluding nano and huge)\n const isValidFormItemSize = typeof size === \"string\" && [\n \"none\", \"micro\", \"tiny\", \"small\", \"medium\", \"large\",\n ].includes(size);\n\n return {\n fictoanProps : {\n size : isValidFormItemSize ? size as Exclude<SpacingTypes, \"nano\" | \"huge\"> : undefined,\n },\n htmlProps : typeof size === \"number\" ? {...htmlProps, size} : htmlProps,\n };\n};\n\n// List of CommonProps keys that should be applied to wrapper elements (like FormItem)\n// rather than to inner input elements\nconst WRAPPER_PROP_KEYS: (keyof CommonProps)[] = [\n // Colours\n \"bgColor\",\n \"bgColour\",\n \"bgOpacity\",\n \"textColor\",\n \"textColour\",\n \"borderColor\",\n \"borderColour\",\n \"borderOpacity\",\n \"fillColor\",\n \"fillColour\",\n \"strokeColor\",\n \"strokeColour\",\n // Visual\n \"shadow\",\n \"shape\",\n \"opacity\",\n // Layout\n \"layoutAsFlexbox\",\n \"stackVertically\",\n \"stackHorizontally\",\n \"layoutAsGrid\",\n \"columns\",\n \"gap\",\n // Margin\n \"margin\",\n \"horizontalMargin\",\n \"verticalMargin\",\n \"marginTop\",\n \"marginRight\",\n \"marginBottom\",\n \"marginLeft\",\n // Padding\n \"padding\",\n \"horizontalPadding\",\n \"verticalPadding\",\n \"paddingTop\",\n \"paddingRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n // Alignment\n \"horizontallyCentreThis\",\n \"horizontallyCenterThis\",\n \"verticallyCentreItems\",\n \"verticallyCenterItems\",\n \"pushItemsToEnds\",\n // Sizing\n \"isFullWidth\",\n \"isFullHeight\",\n // Responsive visibility\n \"hideOnMobile\",\n \"showOnlyOnMobile\",\n \"hideOnTabletPortrait\",\n \"showOnlyOnTabletPortrait\",\n \"hideOnTabletLandscape\",\n \"showOnlyOnTabletLandscape\",\n \"hideOnDesktop\",\n \"showOnlyOnDesktop\",\n // Typography\n \"weight\",\n // Custom classes\n \"classNames\",\n];\n\nexport interface WrapperInputSeparationResult<T extends Record<string, any>> {\n wrapperProps : Partial<CommonProps>;\n inputProps : Omit<T, keyof CommonProps>;\n}\n\n/**\n * Separates wrapper-level props (margin, padding, layout, etc.) from input-specific props.\n *\n * Form components like TextArea and InputField wrap their input in a FormItem.\n * Layout/spacing props should be applied to FormItem (the wrapper), not the inner input.\n *\n * @param props - The props object to separate\n * @returns Object with wrapperProps (for FormItem) and inputProps (for the input element)\n *\n * @example\n * const { wrapperProps, inputProps } = separateWrapperProps(props);\n * return (\n * <FormItem {...wrapperProps}>\n * <Element as=\"textarea\" {...inputProps} />\n * </FormItem>\n * );\n */\nexport const separateWrapperProps = <T extends Record<string, any>>(\n props: T,\n): WrapperInputSeparationResult<T> => {\n const wrapperProps: Partial<CommonProps> = {};\n const inputProps: Record<string, any> = {};\n\n for (const key of Object.keys(props)) {\n if (WRAPPER_PROP_KEYS.includes(key as keyof CommonProps)) {\n (wrapperProps as any)[key] = props[key];\n } else {\n inputProps[key] = props[key];\n }\n }\n\n return {\n wrapperProps,\n inputProps: inputProps as Omit<T, keyof CommonProps>,\n };\n};","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\n// prettier-ignore\nexport interface InputLabelCustomProps {\n label ? : string;\n htmlFor ? : string;\n hideLabel ? : boolean;\n}\n\nexport type InputLabelElementType = HTMLLabelElement;\nexport type InputLabelProps = Omit<CommonAndHTMLProps<InputLabelElementType>, keyof InputLabelCustomProps> &\n InputLabelCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const InputLabel = React.forwardRef(\n (\n {\n label,\n hideLabel,\n htmlFor,\n ...props\n }: InputLabelProps,\n ref: React.Ref<InputLabelElementType>\n ) => {\n let classNames = [];\n\n if (hideLabel) {\n classNames.push(\"visually-hidden\");\n }\n\n return (\n <Element<InputLabelElementType>\n as=\"label\"\n ref={ref}\n htmlFor={htmlFor}\n classNames={classNames}\n {...props}\n >\n {label}\n </Element>\n );\n }\n);\nInputLabel.displayName = \"InputLabel\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, SpacingTypes, WeightTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// prettier-ignore\nexport interface TextCustomProps {\n fontStyle ? : \"sans-serif\" | \"serif\" | \"monospace\";\n weight ? : WeightTypes;\n size ? : SpacingTypes;\n align ? : \"left\" | \"centre\" | \"center\" | \"right\";\n isSubtext ? : boolean;\n}\n\nexport type TextElementType = HTMLParagraphElement;\nexport type TextProps = Omit<CommonAndHTMLProps<TextElementType>, keyof TextCustomProps> & TextCustomProps;\n\nexport const Text = React.forwardRef(\n (\n {weight, size, fontStyle = \"sans-serif\", align, isSubtext, ...props} : TextProps,\n ref : React.Ref<TextElementType>,\n ) => {\n let classNames = [];\n\n if (weight) {\n classNames.push(`weight-${weight}`);\n }\n\n if (size) {\n classNames.push(`text-${size}`);\n }\n\n if (fontStyle) {\n classNames.push(`font-${fontStyle}`);\n }\n\n if (isSubtext) {\n classNames.push(\"sub-text\");\n }\n\n if (align) {\n classNames.push(`text-${align}`);\n }\n\n return <Element<TextElementType> as=\"p\" ref={ref} classNames={classNames} {...props} />;\n },\n);\nText.displayName = \"Text\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, SpacingTypes } from \"../../Element/constants\";\nimport { Div } from \"$tags\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./form-item.css\";\n\n// OTHER ===============================================================================================================\nimport { InputLabel } from \"../InputLabel/InputLabel\";\nimport { Text } from \"../../Typography/Text\";\n\n// TYPES ///////////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport type FormItemElementType = HTMLDivElement;\n\nexport interface FormItemProps extends CommonAndHTMLProps<FormItemElementType> {\n // Label\n label ? : string;\n customLabel ? : React.ReactNode;\n htmlFor ? : string;\n // Info section\n helpText ? : string | React.ReactNode;\n errorText ? : string;\n // Validation\n validationState ? : \"valid\" | \"invalid\" | null;\n // Form semantics\n required ? : boolean;\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n // Layout\n labelFirst ? : boolean;\n}\n\n// VALIDATION ICON /////////////////////////////////////////////////////////////////////////////////////////////////////\nconst ValidationIcon = ({state} : { state : \"valid\" | \"invalid\" }) => {\n if (state === \"valid\") {\n return (\n <svg\n data-validation-icon=\"valid\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n >\n <polyline\n points=\"3.5 12.5 8.5 17.5 20.5 5.5\"\n fill=\"none\"\n stroke=\"#0ec05c\"\n strokeMiterlimit=\"10\"\n strokeWidth=\"2\"\n />\n </svg>\n );\n }\n\n return (\n <svg\n data-validation-icon=\"invalid\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n >\n <line\n x1=\"6.5\"\n y1=\"17.5\"\n x2=\"18.5\"\n y2=\"5.5\"\n fill=\"none\"\n stroke=\"#ef4343\"\n strokeMiterlimit=\"10\"\n strokeWidth=\"2\"\n />\n <line\n x1=\"6.5\"\n y1=\"5.5\"\n x2=\"18.5\"\n y2=\"17.5\"\n fill=\"none\"\n stroke=\"#ef4343\"\n strokeMiterlimit=\"10\"\n strokeWidth=\"2\"\n />\n </svg>\n );\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const FormItem = React.forwardRef(\n (\n {\n label,\n customLabel,\n htmlFor,\n helpText,\n errorText,\n validationState,\n required,\n size,\n labelFirst,\n children,\n ...props\n } : FormItemProps,\n ref : React.Ref<FormItemElementType>,\n ) => {\n const hasLabel = label || customLabel;\n const hasInfoSection = helpText || errorText;\n\n return (\n <Element<FormItemElementType>\n as=\"div\"\n data-form-item\n ref={ref}\n role=\"group\"\n required={required}\n className={[ size ? `size-${size}` : \"\", labelFirst ? \"label-first\" : \"\" ].filter(Boolean)\n .join(\" \") || undefined}\n {...props}\n >\n {/* LABEL ////////////////////////////////////////////////////////////////////////////////////// */}\n {hasLabel && (\n <Div data-label-wrapper data-has-validation={validationState ? \"true\" : undefined}>\n {customLabel || (label && <InputLabel label={label} htmlFor={htmlFor} />)}\n {validationState && <ValidationIcon state={validationState} />}\n </Div>\n )}\n\n {/* INPUT ////////////////////////////////////////////////////////////////////////////////////// */}\n <Div data-input-wrapper>\n {children}\n </Div>\n\n {/* INFO SECTION /////////////////////////////////////////////////////////////////////////////// */}\n {hasInfoSection && (\n <Div className=\"info-section vertically-center-items\">\n {helpText && (\n <Text className=\"help-text\">\n {helpText}\n </Text>\n )}\n {errorText && (\n <Text className=\"error-text\">\n {errorText}\n </Text>\n )}\n </Div>\n )}\n </Element>\n );\n },\n);\nFormItem.displayName = \"FormItem\";\n","// REACT CORE ==========================================================================================================\nimport React, { useMemo } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonProps, SpacingTypes } from \"../../Element/constants\";\nimport { Element } from \"$element\";\n\n// UTILS ===============================================================================================================\nimport { separateWrapperProps } from \"$utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./checkbox.css\";\n\n// OTHER ===============================================================================================================\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { InputLabelCustomProps } from \"../InputLabel/InputLabel\";\n\nexport type CheckboxElementType = HTMLInputElement;\nexport type CheckboxProps = InputLabelCustomProps & CommonProps & {\n id ? : string;\n name ? : string;\n checked ? : boolean;\n defaultChecked ? : boolean;\n disabled ? : boolean;\n required ? : boolean;\n onChange ? : (checked : boolean) => void;\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n helpText ? : string;\n errorText ? : string;\n labelFirst ? : boolean;\n};\n\n// TODO: Fix required indicator that clashes with tick because both use the same `label::after` setup.\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Checkbox = React.forwardRef(\n (\n {\n id,\n name,\n label,\n hideLabel,\n helpText,\n errorText,\n onChange,\n checked,\n defaultChecked,\n disabled,\n required,\n size = \"medium\",\n labelFirst,\n ...props\n } : CheckboxProps,\n ref : React.Ref<CheckboxElementType>,\n ) => {\n const derivedName = useMemo(() => name || id, [ name, id ]);\n\n const handleChange = (e : React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.checked);\n };\n\n // Separate wrapper-level props (margin, padding, etc.) from input-specific props\n const { wrapperProps, inputProps } = separateWrapperProps(props);\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n size={size}\n labelFirst={labelFirst}\n {...wrapperProps}\n >\n <Element<CheckboxElementType>\n as=\"input\"\n type=\"checkbox\"\n ref={ref}\n id={id}\n name={derivedName}\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled}\n required={required}\n onChange={handleChange}\n {...inputProps}\n />\n <Element\n as={labelFirst ? \"label\" : \"div\"}\n htmlFor={labelFirst ? id : undefined}\n data-checkbox\n className={`size-${size}`}\n />\n </FormItem>\n );\n },\n);\nCheckbox.displayName = \"Checkbox\";\n","// REACT CORE ==========================================================================================================\nimport React, { useMemo } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Element } from \"$element\";\nimport { SpacingTypes } from \"../../Element/constants\";\n\n// UTILS ===============================================================================================================\nimport { separateWrapperProps } from \"$utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./switch.css\";\n\n// OTHER ===============================================================================================================\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { InputLabelCustomProps } from \"../InputLabel/InputLabel\";\n\nexport type SwitchElementType = HTMLInputElement;\nexport type SwitchProps = InputLabelCustomProps & {\n id ? : string;\n name ? : string;\n checked ? : boolean;\n defaultChecked ? : boolean;\n disabled ? : boolean;\n required ? : boolean;\n onChange ? : (checked : boolean) => void;\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n helpText ? : string;\n errorText ? : string;\n labelFirst ? : boolean;\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Switch = React.forwardRef(\n (\n {\n id,\n name,\n label,\n hideLabel,\n helpText,\n errorText,\n onChange,\n checked,\n defaultChecked,\n disabled,\n required,\n size = \"medium\",\n labelFirst,\n ...props\n } : SwitchProps,\n ref : React.Ref<SwitchElementType>,\n ) => {\n const derivedName = useMemo(() => name || id, [ name, id ]);\n\n const handleChange = (e : React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.checked);\n };\n\n // Separate wrapper-level props (margin, padding, etc.) from input-specific props\n const {wrapperProps, inputProps} = separateWrapperProps(props);\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n size={size}\n labelFirst={labelFirst}\n {...wrapperProps}\n >\n <Element<SwitchElementType>\n as=\"input\"\n type=\"checkbox\"\n ref={ref}\n id={id}\n name={derivedName}\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled}\n required={required}\n onChange={handleChange}\n {...inputProps}\n />\n <Element\n as={labelFirst ? \"label\" : \"div\"}\n htmlFor={labelFirst ? id : undefined}\n data-switch\n className={`size-${size}`}\n />\n </FormItem>\n );\n },\n);\nSwitch.displayName = \"Switch\";\n","// REACT CORE ==========================================================================================================\nimport React, { useMemo } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Element } from \"$element\";\nimport { SpacingTypes } from \"../../Element/constants\";\n\n// STYLES ==============================================================================================================\nimport \"./checkbox-and-switch-group.css\";\n\n// OTHER ===============================================================================================================\nimport { Checkbox, } from \"./Checkbox\";\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { InputLabelCustomProps } from \"../InputLabel/InputLabel\";\nimport { Switch } from \"./Switch\";\n\n// COMMON GROUP OPTIONS ////////////////////////////////////////////////////////////////////////////////////////////////\ninterface BaseGroupOptionProps {\n id : string;\n label : string;\n value : string;\n disabled ? : boolean;\n}\n\n// Props specific to the group functionality\ninterface GroupCustomProps {\n id ? : string;\n name : string;\n options : BaseGroupOptionProps[];\n value ? : string[];\n defaultValue ? : string[];\n onChange ? : (values : string[]) => void;\n align ? : \"horizontal\" | \"vertical\";\n equaliseWidth ? : boolean;\n equalizeWidth ? : boolean;\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n columns ? : number;\n labelFirst ? : boolean;\n}\n\n// Combined props for the group component\nexport type InputGroupProps = InputLabelCustomProps & GroupCustomProps & {\n helpText ? : string;\n errorText ? : string;\n required ? : boolean;\n disabled ? : boolean;\n};\n\n// CHECKBOX GROUP //////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const CheckboxGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(\n (\n {\n id,\n name,\n label,\n helpText,\n errorText,\n options,\n value,\n defaultValue,\n onChange,\n align,\n equaliseWidth,\n equalizeWidth,\n required,\n disabled,\n size,\n columns,\n labelFirst,\n ...props\n },\n ref,\n ) => {\n const derivedName = useMemo(() => name || id, [ name, id ]);\n\n const [ selectedValues, setSelectedValues ] = React.useState<string[]>(\n value || defaultValue || [],\n );\n\n React.useEffect(() => {\n if (value !== undefined) {\n setSelectedValues(value);\n }\n }, [ value ]);\n\n const handleChange = (optionValue : string, checked : boolean) => {\n let newValues : string[];\n\n if (checked) {\n newValues = [ ...selectedValues, optionValue ];\n } else {\n newValues = selectedValues.filter(v => v !== optionValue);\n }\n\n // Update internal state if uncontrolled\n if (value === undefined) {\n setSelectedValues(newValues);\n }\n\n onChange?.(newValues);\n };\n\n let classNames : string[] = [];\n\n if (align) {\n classNames.push(`align-${align}`);\n }\n\n if (equaliseWidth || equalizeWidth) {\n classNames.push(`equalise-width`);\n }\n\n if (columns) {\n classNames.push(`with-columns`);\n }\n\n if (labelFirst) {\n classNames.push(`label-first`);\n }\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n >\n <Element\n as=\"div\"\n data-checkbox-group\n ref={ref}\n classNames={classNames}\n role=\"group\"\n aria-label={label}\n style={columns ? {gridTemplateColumns : `repeat(${columns}, 1fr)`} : undefined}\n {...props}\n >\n {options.map((option, index) => {\n const {id : optionId, value : optionValue, label : optionLabel, ...optionProps} = option;\n const finalId = optionId || `${id}-option-${index}`;\n const isChecked = selectedValues.includes(optionValue);\n\n return (\n <Checkbox\n key={finalId}\n id={finalId}\n name={derivedName}\n label={optionLabel}\n checked={isChecked}\n disabled={disabled || option.disabled}\n size={size}\n labelFirst={labelFirst}\n onChange={(checked : boolean) => handleChange(optionValue, checked)}\n {...optionProps}\n />\n );\n })}\n </Element>\n </FormItem>\n );\n },\n);\nCheckboxGroup.displayName = \"CheckboxGroup\";\n\n// SWITCH GROUP ////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const SwitchGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(\n (\n {\n id,\n name,\n label,\n helpText,\n errorText,\n options,\n value,\n defaultValue,\n onChange,\n align,\n equaliseWidth,\n equalizeWidth,\n required,\n disabled,\n size,\n columns,\n labelFirst,\n ...props\n },\n ref,\n ) => {\n const derivedName = useMemo(() => name || id, [ name, id ]);\n\n const [ selectedValues, setSelectedValues ] = React.useState<string[]>(\n value || defaultValue || [],\n );\n\n React.useEffect(() => {\n if (value !== undefined) {\n setSelectedValues(value);\n }\n }, [ value ]);\n\n const handleChange = (optionValue : string, checked : boolean) => {\n let newValues : string[];\n\n if (checked) {\n newValues = [ ...selectedValues, optionValue ];\n } else {\n newValues = selectedValues.filter(v => v !== optionValue);\n }\n\n // Update internal state if uncontrolled\n if (value === undefined) {\n setSelectedValues(newValues);\n }\n\n onChange?.(newValues);\n };\n\n let classNames : string[] = [];\n\n if (align) {\n classNames.push(`align-${align}`);\n }\n\n if (equaliseWidth || equalizeWidth) {\n classNames.push(`equalise-width`);\n }\n\n if (columns) {\n classNames.push(`with-columns`);\n }\n\n if (labelFirst) {\n classNames.push(`label-first`);\n }\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n >\n <Element\n as=\"div\"\n data-switch-group\n ref={ref}\n classNames={classNames}\n role=\"group\"\n aria-label={label}\n style={columns ? {gridTemplateColumns : `repeat(${columns}, 1fr)`} : undefined}\n {...props}\n >\n {options.map((option, index) => {\n const {id : optionId, value : optionValue, label : optionLabel, ...optionProps} = option;\n const finalId = optionId || `${id}-option-${index}`;\n const isChecked = selectedValues.includes(optionValue);\n\n return (\n <Switch\n key={finalId}\n id={finalId}\n name={derivedName}\n label={optionLabel}\n checked={isChecked}\n disabled={disabled || option.disabled}\n size={size}\n labelFirst={labelFirst}\n onChange={(checked : boolean) => handleChange(optionValue, checked)}\n {...optionProps}\n />\n );\n })}\n </Element>\n </FormItem>\n );\n },\n);\nSwitchGroup.displayName = \"SwitchGroup\";\n","// REACT CORE ==========================================================================================================\nimport React, { useRef, useState } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { ColourPropTypes, CommonProps, SpacingTypes } from \"$components/Element/constants\";\nimport { Div } from \"../../Element/Tags\";\n\n// UTILS ===============================================================================================================\nimport { separateWrapperProps } from \"$utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./file-upload.css\";\n\n// OTHER ===============================================================================================================\nimport { Badge } from \"../../Badge/Badge\";\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { InputLabelCustomProps } from \"../InputLabel/InputLabel\";\nimport { Text } from \"../../Typography/Text\";\n\nexport type FileUploadElementType = HTMLInputElement;\nexport type FileUploadProps = InputLabelCustomProps & CommonProps & {\n id ? : string;\n name ? : string;\n accept ? : string;\n allowMultipleFiles ? : boolean;\n capture ? : \"user\" | \"environment\";\n height ? : string;\n onChange ? : (files : File[]) => void;\n instructionMainText ? : string;\n instructionSubText ? : string;\n badgeBgColour ? : ColourPropTypes;\n badgeBgColor ? : ColourPropTypes;\n badgeTextColour ? : ColourPropTypes;\n badgeTextColor ? : ColourPropTypes;\n helpText ? : string;\n errorText ? : string;\n required ? : boolean;\n disabled ? : boolean;\n invalid ? : boolean;\n className ? : string;\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n \"aria-label\"? : string;\n \"aria-invalid\"? : boolean;\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const FileUpload = React.forwardRef(\n (\n {\n \"aria-label\" : ariaLabel,\n \"aria-invalid\" : ariaInvalid,\n label,\n helpText,\n errorText,\n required,\n accept,\n allowMultipleFiles = false,\n capture,\n height = \"120px\",\n onChange,\n className = \"\",\n instructionMainText = \"Drag and drop or click to upload\",\n instructionSubText = \"You can add multiple files\",\n invalid,\n id,\n name,\n badgeBgColour,\n badgeTextColour,\n size,\n ...props\n } : FileUploadProps,\n ref : React.Ref<FileUploadElementType>,\n ) => {\n const [ files, setFiles ] = useState<File[]>([]);\n const [ isDragging, setIsDragging ] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleDragOver = (e : React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(true);\n };\n\n const handleDragLeave = (e : React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n };\n\n const handleDrop = (e : React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n\n const droppedFiles = Array.from(e.dataTransfer.files);\n handleFiles(droppedFiles);\n };\n\n const handleFiles = (newFiles : File[]) => {\n if (!allowMultipleFiles) {\n const fileToAdd = newFiles[0];\n setFiles([ fileToAdd ]);\n onChange?.([ fileToAdd ]);\n } else {\n setFiles(prevFiles => [ ...prevFiles, ...newFiles ]);\n onChange?.([ ...files, ...newFiles ]);\n }\n };\n\n const handleFileInput = (e : React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files) {\n const selectedFiles = Array.from(e.target.files);\n handleFiles(selectedFiles);\n }\n };\n\n const removeFile = (indexToRemove : number) => {\n const updatedFiles = files.filter((_, index) => index !== indexToRemove);\n setFiles(updatedFiles);\n onChange?.(updatedFiles);\n };\n\n const openFileDialog = () => {\n fileInputRef.current?.click();\n };\n\n // Separate wrapper-level props (margin, padding, etc.) from component-specific props\n const { wrapperProps } = separateWrapperProps(props);\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n size={size}\n {...wrapperProps}\n >\n <Div\n data-file-upload-area\n ref={ref as React.Ref<HTMLDivElement>}\n className={[\n \"file-upload-wrapper\",\n isDragging ? \"dragging\" : \"\",\n className,\n ].filter(Boolean).join(\" \")}\n aria-label={ariaLabel || label}\n aria-invalid={ariaInvalid || invalid || undefined}\n aria-required={required}\n >\n <Div\n className=\"file-upload-area\"\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={openFileDialog}\n style={{height}}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n id={id}\n name={name}\n onChange={handleFileInput}\n multiple={allowMultipleFiles}\n accept={accept}\n capture={capture}\n className=\"file-input\"\n />\n\n {instructionMainText &&\n <Div className=\"file-upload-content\">\n <Text>{instructionMainText}</Text>\n {instructionSubText && (\n <Text isSubtext>{instructionSubText}</Text>\n )}\n </Div>\n }\n </Div>\n\n {files.length > 0 && (\n <Div className=\"uploaded-files\">\n {files.map((file, index) => (\n <Badge\n key={`${file.name}-${index}`}\n size=\"small\"\n shape=\"rounded\"\n actionIcon=\"cross\"\n onActionClick={() => removeFile(index)}\n actionAriaLabel={`Remove ${file.name}`}\n bgColour={badgeBgColour}\n textColour={badgeTextColour}\n >\n {file.name}\n </Badge>\n ))}\n </Div>\n )}\n </Div>\n </FormItem>\n );\n },\n);\nFileUpload.displayName = \"FileUpload\";\n","// REACT CORE ==========================================================================================================\nimport React, { useEffect, useRef, useState } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Div } from \"$tags\";\nimport { Element } from \"$element\";\nimport { SpacingTypes, CommonProps } from \"../../Element/constants\";\n\n// STYLES ==============================================================================================================\nimport \"./input-field.css\";\n\n// OTHER ===============================================================================================================\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { InputLabelCustomProps } from \"../InputLabel/InputLabel\";\nimport { separateWrapperProps } from \"../../../utils/propSeparation\";\n\nexport type ValueChangeHandler<T = string> = (value: T) => void;\nexport type InputFocusHandler = (e: React.FocusEvent<HTMLInputElement>) => void;\nexport interface InputCommonProps {\n label ? : string;\n helpText ? : string | React.ReactNode;\n errorText ? : string;\n validateThis ? : boolean;\n valid ? : boolean;\n invalid ? : boolean;\n validationState ? : \"valid\" | \"invalid\" | null;\n required ? : boolean;\n disabled ? : boolean;\n}\n\nexport interface InputSideElementProps {\n innerIconLeft ? : React.ReactNode;\n innerIconRight ? : React.ReactNode;\n innerTextLeft ? : string;\n innerTextRight ? : string;\n}\n\nexport type InputFieldElementType = HTMLInputElement;\n\nexport type InputFieldProps =\n Omit<React.InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"onBlur\" | \"onFocus\" | \"size\"> &\n InputLabelCustomProps &\n InputCommonProps &\n InputSideElementProps &\n CommonProps & {\n type ? : \"text\" | \"password\" | \"email\" | \"number\" | \"tel\" | \"url\" | \"search\" | \"file\";\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n onFocus ? : InputFocusHandler;\n onBlur ? : InputFocusHandler;\n onChange ? : ValueChangeHandler<string>;\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const InputField = React.forwardRef(\n (\n {\n // FormItem props\n label,\n hideLabel,\n helpText,\n errorText,\n size,\n required,\n // Side elements\n innerIconLeft,\n innerIconRight,\n innerTextLeft,\n innerTextRight,\n // Validation\n validateThis,\n valid,\n invalid,\n validationState: externalValidationState,\n // Handlers\n onChange,\n onBlur,\n onFocus,\n // Aria\n \"aria-label\": ariaLabel,\n \"aria-invalid\": ariaInvalid,\n // Input props\n id,\n name,\n value,\n defaultValue,\n type = \"text\",\n placeholder,\n autoComplete,\n maxLength,\n minLength,\n pattern,\n readOnly,\n disabled,\n className,\n ...props\n }: InputFieldProps,\n ref: React.Ref<InputFieldElementType>\n ) => {\n const leftElementRef = useRef<HTMLDivElement>(null);\n const rightElementRef = useRef<HTMLDivElement>(null);\n const internalInputRef = useRef<HTMLInputElement>(null);\n\n const [touched, setTouched] = useState(false);\n const [internalValidationState, setInternalValidationState] = useState<\"valid\" | \"invalid\" | null>(null);\n\n // Use external validation state if provided, otherwise use internal\n const validationState = externalValidationState ?? (validateThis ? internalValidationState : null);\n\n // Merge refs\n const mergeRefs = React.useCallback(\n (el: HTMLInputElement | null) => {\n (internalInputRef as React.MutableRefObject<HTMLInputElement | null>).current = el;\n if (typeof ref === \"function\") {\n ref(el);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = el;\n }\n },\n [ref]\n );\n\n const updateValidationState = () => {\n const input = internalInputRef.current;\n if (!input || input.value === \"\") {\n setInternalValidationState(null);\n return;\n }\n setInternalValidationState(input.validity.valid ? \"valid\" : \"invalid\");\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.value);\n if (touched && validateThis) {\n updateValidationState();\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true);\n if (validateThis) {\n updateValidationState();\n }\n onBlur?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n onFocus?.(e);\n };\n\n // Side element width calculation\n useEffect(() => {\n const updateWidth = (el: HTMLDivElement | null, pos: \"left\" | \"right\") => {\n if (!el) return;\n const formItem = el.closest(\"[data-form-item]\") as HTMLElement;\n formItem?.style.setProperty(\n `--side-element-${pos}-width`,\n `${el.getBoundingClientRect().width}px`\n );\n };\n\n if (innerTextLeft || innerIconLeft) {\n updateWidth(leftElementRef.current, \"left\");\n }\n if (innerTextRight || innerIconRight) {\n updateWidth(rightElementRef.current, \"right\");\n }\n }, [innerTextLeft, innerTextRight, innerIconLeft, innerIconRight]);\n\n const renderSideElement = (\n content: React.ReactNode,\n position: \"left\" | \"right\",\n elRef: React.RefObject<HTMLDivElement | null>\n ) => {\n if (!content) return null;\n\n const isText = typeof content === \"string\";\n const contentProps = React.isValidElement(content) ? (content.props as Record<string, unknown>) : {};\n const isInteractive =\n !isText &&\n React.isValidElement(content) &&\n (contentProps.onClick ||\n contentProps.onKeyDown ||\n content.type === \"button\" ||\n content.type === \"a\");\n\n return (\n <Div\n ref={elRef}\n data-input-side-element\n className={`${position} ${isText ? \"is-text\" : \"is-icon\"} ${isInteractive ? \"is-interactive\" : \"\"}`}\n aria-hidden=\"true\"\n >\n {content}\n </Div>\n );\n };\n\n const hasLeftElement = Boolean(innerIconLeft || innerTextLeft);\n const hasRightElement = Boolean(innerIconRight || innerTextRight);\n\n // Separate wrapper-level props (margin, padding, etc.) from input-specific props\n const { wrapperProps, inputProps } = separateWrapperProps(props);\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n validationState={validationState}\n required={required}\n size={size}\n {...wrapperProps}\n >\n <Element<InputFieldElementType>\n as=\"input\"\n ref={mergeRefs}\n data-input-field\n id={id}\n name={name}\n type={type}\n value={value}\n defaultValue={defaultValue}\n placeholder={placeholder || \" \"}\n autoComplete={autoComplete}\n maxLength={maxLength}\n minLength={minLength}\n pattern={pattern}\n readOnly={readOnly}\n disabled={disabled}\n required={required}\n className={[\n className,\n hasLeftElement && \"with-left-element\",\n hasRightElement && \"with-right-element\",\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-label={ariaLabel || label}\n aria-invalid={ariaInvalid || invalid}\n aria-required={required}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={handleFocus}\n {...inputProps}\n />\n {(hasLeftElement || hasRightElement) && (\n <Div data-input-helper aria-hidden=\"true\">\n {renderSideElement(innerIconLeft || innerTextLeft, \"left\", leftElementRef)}\n {renderSideElement(innerIconRight || innerTextRight, \"right\", rightElementRef)}\n </Div>\n )}\n </FormItem>\n );\n }\n);\nInputField.displayName = \"InputField\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./portion.css\";\n\n// OTHER ===============================================================================================================\nimport { SpanTypes } from \"./types\";\n\n// prettier-ignore\nexport interface PortionCustomProps {\n desktopSpan ? : SpanTypes;\n tabletLandscapeSpan ? : SpanTypes;\n tabletPortraitSpan ? : SpanTypes;\n mobileSpan ? : SpanTypes;\n isHorizontal ? : boolean;\n role ? : string;\n}\n\nexport type PortionElementType = HTMLDivElement;\nexport type PortionProps = Omit<CommonAndHTMLProps<PortionElementType>, keyof PortionCustomProps> & PortionCustomProps;\n\n// COMPONENT //////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Portion = React.forwardRef(\n (\n {\n desktopSpan,\n mobileSpan,\n tabletLandscapeSpan,\n tabletPortraitSpan,\n isHorizontal,\n role,\n ...props\n }: PortionProps,\n ref: React.Ref<PortionElementType>\n ) => {\n // CLASS NAMES -------------------------------------------------------------------------------------------------\n let classNames = [];\n\n if (desktopSpan || tabletLandscapeSpan || tabletPortraitSpan || mobileSpan) {\n if (desktopSpan) {\n classNames.push(`${desktopSpan}`);\n }\n\n if (tabletLandscapeSpan) {\n classNames.push(`${tabletLandscapeSpan}-on-tablet-landscape`);\n }\n\n if (tabletPortraitSpan) {\n classNames.push(`${tabletPortraitSpan}-on-tablet-portrait`);\n }\n\n if (mobileSpan) {\n classNames.push(`${mobileSpan}-on-mobile`);\n }\n } else {\n classNames.push(\"whole\");\n }\n\n if (isHorizontal) {\n classNames.push(\"horizontal\");\n }\n\n // RENDER ---------------------------------------------------------------------------------------------------\n return (\n <Element<PortionElementType>\n as=\"div\"\n data-portion\n ref={ref}\n classNames={classNames}\n role={role}\n {...props}\n />\n );\n }\n);\nPortion.displayName = \"Portion\";\n","// REACT CORE ==========================================================================================================\nimport React, { useMemo } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Element } from \"$element\";\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { separateWrapperProps } from \"../../../utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./radio-button.css\";\n\n// OTHER ===============================================================================================================\nimport { RadioButtonProps, RadioButtonElementType } from \"./constants\";\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const RadioButton = React.forwardRef(\n (\n {\n id,\n name,\n value,\n label,\n helpText,\n errorText,\n onChange,\n checked,\n disabled,\n required,\n labelFirst,\n ...props\n }: RadioButtonProps,\n ref: React.Ref<RadioButtonElementType>\n ) => {\n const derivedName = useMemo(() => name || id, [name, id]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked && onChange) {\n onChange(value);\n }\n };\n\n // Separate wrapper-level props (margin, padding, etc.) from input-specific props\n const { wrapperProps, inputProps } = separateWrapperProps(props);\n\n return (\n <Element<RadioButtonElementType>\n as=\"div\"\n data-radio-button\n ref={ref}\n role=\"radio\"\n aria-checked={checked}\n aria-disabled={disabled}\n className={labelFirst ? \"label-first\" : undefined}\n {...wrapperProps}\n >\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n labelFirst={labelFirst}\n >\n <Element\n as=\"input\"\n type=\"radio\"\n id={id}\n name={derivedName}\n value={value}\n checked={checked}\n disabled={disabled}\n required={required}\n onChange={handleChange}\n {...inputProps}\n />\n <Element\n as={labelFirst ? \"label\" : \"div\"}\n htmlFor={labelFirst ? id : undefined}\n data-radio\n />\n </FormItem>\n </Element>\n );\n }\n);\nRadioButton.displayName = \"RadioButton\";\n","// REACT CORE ==========================================================================================================\nimport React, { useMemo } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Div } from \"../../Element/Tags\";\nimport { Element } from \"$element\";\nimport { FormItem } from \"../FormItem/FormItem\";\n\n// STYLES ==============================================================================================================\nimport \"./radio-group.css\";\n\n// TYPES ===============================================================================================================\nimport { RadioGroupProps } from \"./constants\";\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const RadioGroup = React.forwardRef(\n (\n {\n id,\n name,\n label,\n helpText,\n errorText,\n options,\n value,\n defaultValue,\n onChange,\n align,\n equaliseWidth,\n equalizeWidth,\n required,\n disabled,\n size,\n columns,\n labelFirst,\n ...props\n }: RadioGroupProps,\n ref: React.Ref<HTMLDivElement>\n ) => {\n const derivedName = useMemo(() => name || id, [name, id]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.value);\n };\n\n let classNames: string[] = [];\n\n if (align) {\n classNames.push(`align-${align}`);\n }\n\n if (equaliseWidth || equalizeWidth) {\n classNames.push(`equalise-width`);\n }\n\n if (columns) {\n classNames.push(`with-columns`);\n }\n\n if (labelFirst) {\n classNames.push(`label-first`);\n }\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n size={size}\n >\n <Element\n as=\"div\"\n data-radio-group\n ref={ref}\n classNames={classNames}\n role=\"radiogroup\"\n aria-label={label}\n style={columns ? { gridTemplateColumns: `repeat(${columns}, 1fr)` } : undefined}\n {...props}\n >\n {options.map((option, index) => {\n const { id: optionId, value: optionValue, label: optionLabel, ...optionProps } = option;\n const finalId = optionId || `${id}-option-${index}`;\n const isChecked = value ? value === optionValue : defaultValue === optionValue;\n\n return (\n <Div\n key={finalId}\n data-radio-button\n role=\"radio\"\n aria-checked={isChecked}\n className={labelFirst ? \"label-first\" : undefined}\n >\n <input\n type=\"radio\"\n id={finalId}\n name={derivedName}\n value={optionValue}\n checked={isChecked}\n disabled={disabled}\n onChange={handleChange}\n {...optionProps}\n />\n <label htmlFor={finalId}>{optionLabel}</label>\n {labelFirst ? (\n <label htmlFor={finalId} data-radio />\n ) : (\n <Div data-radio />\n )}\n </Div>\n );\n })}\n </Element>\n </FormItem>\n );\n }\n);\nRadioGroup.displayName = \"RadioGroup\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, SpacingTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./row.css\";\n\ninterface RowCustomProps {\n layout ? : \"grid\" | \"flexbox\";\n gutters ? : SpacingTypes;\n retainLayoutOnTabletLandscape ? : boolean;\n retainLayoutOnTabletPortrait ? : boolean;\n retainLayoutOnMobile ? : boolean;\n retainLayoutAlways ? : boolean;\n allowUltraWide ? : boolean;\n groupLabel ? : string;\n}\n\nexport type RowElementType = HTMLDivElement;\nexport type RowProps = Omit<CommonAndHTMLProps<RowElementType>, keyof RowCustomProps> & RowCustomProps;\n\n// TODO: Fix fixed gutter widths\n\n// COMPONENT //////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Row = React.forwardRef(\n (\n {\n layout = \"grid\",\n gutters = \"medium\",\n retainLayoutOnTabletLandscape,\n retainLayoutOnTabletPortrait,\n retainLayoutOnMobile,\n retainLayoutAlways,\n allowUltraWide,\n groupLabel,\n ...props\n } : RowProps,\n ref : React.Ref<RowElementType>,\n ) => {\n // CLASS NAMES -------------------------------------------------------------------------------------------------\n let classNames = [];\n\n if (layout) {\n classNames.push(`layout-${layout}`);\n }\n\n if (gutters) {\n classNames.push(gutters === \"none\" ? \"no-gutters\" : `${gutters}-gutters`);\n }\n\n // Add medium gutters by default for grid layouts only, remove them for flexbox layouts\n //\n // if (conditionalGutters) {\n // }\n\n // if (equaliseChildren || equalizeChildren) {\n // classNames.push(\"equalise-children\");\n // }\n\n if (retainLayoutOnTabletLandscape) {\n classNames.push(\"retain-layout-on-tablet-landscape\");\n }\n\n if (retainLayoutOnTabletPortrait) {\n classNames.push(\"retain-layout-on-tablet-portrait\");\n }\n\n if (retainLayoutOnMobile) {\n classNames.push(\"retain-layout-on-mobile\");\n }\n\n if (retainLayoutAlways) {\n classNames.push(\n \"retain-layout-on-tablet-landscape retain-layout-on-tablet-portrait retain-layout-on-mobile\",\n );\n }\n\n if (allowUltraWide) {\n classNames.push(\"allow-ultra-wide\");\n }\n\n // RENDER -----------------------------------------------------------------------------------------------------\n return (\n <Element<RowElementType>\n as=\"div\"\n data-row\n ref={ref}\n classNames={[ classNames.join(\" \") ]}\n marginBottom=\"tiny\"\n role=\"grid\"\n aria-label={groupLabel}\n {...props}\n />\n );\n },\n);\nRow.displayName = \"Row\";\n","// REACT CORE ==========================================================================================================\nimport React, { useMemo } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Div } from \"$tags\";\nimport { Element } from \"$element\";\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { separateWrapperProps } from \"../../../utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./select.css\";\n\n// OTHER ===============================================================================================================\nimport { OptionProps, OptGroupProps, SelectProps, OptionElementType, SelectElementType } from \"./constants\";\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Select = React.forwardRef(\n (\n {\n // FormItem props\n label,\n helpText,\n errorText,\n required,\n size,\n // Select props\n id,\n name,\n options,\n onChange,\n disabled,\n className,\n ...props\n }: SelectProps,\n ref: React.Ref<SelectElementType>\n ) => {\n const derivedName = useMemo(() => name || id, [name, id]);\n\n const renderOption = (option: OptionProps) => (\n <Element<OptionElementType>\n as=\"option\"\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n {option.label}\n </Element>\n );\n\n const renderOptGroup = (group: OptGroupProps) => (\n <Element<HTMLOptGroupElement>\n as=\"optgroup\"\n key={group.label}\n label={group.label}\n >\n {group.options.map(renderOption)}\n </Element>\n );\n\n const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n onChange?.(e.target.value);\n };\n\n // Separate wrapper-level props (margin, padding, etc.) from input-specific props\n const { wrapperProps, inputProps } = separateWrapperProps(props);\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n size={size}\n {...wrapperProps}\n >\n <Div data-select className={className} disabled={disabled}>\n <Element<SelectElementType>\n as=\"select\"\n ref={ref}\n id={id}\n name={derivedName}\n disabled={disabled}\n required={required}\n onChange={handleChange}\n {...inputProps}\n >\n {options.map((option) =>\n \"options\" in option ? renderOptGroup(option) : renderOption(option)\n )}\n </Element>\n </Div>\n </FormItem>\n );\n }\n);\nSelect.displayName = \"Select\";\n","// REACT CORE ==========================================================================================================\nimport React, { useRef } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, SpacingTypes } from \"../../Element/constants\";\nimport { Element } from \"$element\";\n\n// UTILS ===============================================================================================================\nimport { separateWrapperProps } from \"../../../utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./textarea.css\";\n\n// OTHER ===============================================================================================================\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { InputLabelCustomProps } from \"../InputLabel/InputLabel\";\n\n// TODO Add minimumWordLength prop\n\n// Common input types\nexport interface InputCommonProps {\n label ? : string;\n helpText ? : string | React.ReactNode;\n errorText ? : string;\n validateThis ? : boolean;\n valid ? : boolean;\n invalid ? : boolean;\n required ? : boolean;\n disabled ? : boolean;\n}\n\nexport type TextareaElementType = HTMLTextAreaElement;\nexport type TextareaProps =\n Omit<CommonAndHTMLProps<TextareaElementType>, \"onChange\" | \"size\"> &\n InputLabelCustomProps &\n Omit<InputCommonProps, \"validationState\"> & {\n id ? : string;\n name ? : string;\n onChange ? : (value : string) => void;\n value ? : string;\n rows ? : number;\n cols ? : number;\n minLength ? : number;\n maxLength ? : number;\n placeholder ? : string;\n readOnly ? : boolean;\n required ? : boolean;\n disabled ? : boolean;\n autoComplete ? : string;\n characterLimit ? : number;\n wordLimit ? : number;\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n};\n\n// Helper functions to determine limit states\nconst getLimitState = (current : number, limit : number) : \"normal\" | \"warning\" | \"exceeded\" => {\n if (current > limit) return \"exceeded\";\n if (current >= limit * 0.9) return \"warning\";\n return \"normal\";\n};\n\nconst pluralise = (count : number, singular : string, plural : string) : string => {\n return Math.abs(count) === 1 ? singular : plural;\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const TextArea = React.forwardRef(\n (\n {\n // FormItem props\n label,\n hideLabel,\n helpText,\n errorText,\n size,\n required,\n // TextArea-specific\n onChange,\n value = \"\",\n characterLimit,\n wordLimit,\n // Input props\n id,\n name,\n rows,\n cols,\n minLength,\n maxLength,\n placeholder,\n readOnly,\n disabled,\n autoComplete,\n // Validation (unused but destructured to not pass to DOM)\n validateThis,\n valid,\n invalid,\n ...props\n } : TextareaProps,\n ref : React.Ref<TextareaElementType>,\n ) => {\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n\n const handleChange = (e : React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(e.target.value);\n };\n\n const constructHelpText = () : React.ReactNode => {\n const limitsMessages : React.ReactNode[] = [];\n\n if (characterLimit) {\n const currentChars = value.length;\n const limitState = getLimitState(currentChars, characterLimit);\n const excessChars = Math.max(0, currentChars - characterLimit);\n const remaining = characterLimit - currentChars;\n\n limitsMessages.push(\n <span key=\"char-limit\" className={`limit-${limitState}`}>\n {excessChars > 0\n ? `${excessChars} ${pluralise(excessChars, \"char\", \"chars\")} over limit`\n : `${remaining} ${pluralise(remaining, \"char\", \"chars\")} left`}\n </span>,\n );\n }\n\n if (wordLimit) {\n const currentWords = value.trim().split(/\\s+/).filter(Boolean).length;\n const limitState = getLimitState(currentWords, wordLimit);\n const excessWords = Math.max(0, currentWords - wordLimit);\n const remaining = wordLimit - currentWords;\n\n limitsMessages.push(\n <span key=\"word-limit\" className={`limit-${limitState}`}>\n {excessWords > 0\n ? `${excessWords} ${pluralise(excessWords, \"word\", \"words\")} over limit`\n : `${remaining} ${pluralise(remaining, \"word\", \"words\")} left`}\n </span>,\n );\n }\n\n if (!limitsMessages.length && !helpText) return undefined;\n\n return (\n <>\n {helpText}\n {helpText && limitsMessages.length > 0 && <span className=\"separator\"> • </span>}\n {limitsMessages.map((msg, i) => (\n <React.Fragment key={i}>\n {i > 0 && <span className=\"separator\"> • </span>}\n {msg}\n </React.Fragment>\n ))}\n </>\n );\n };\n\n const setRefs = (element : HTMLTextAreaElement | null) => {\n textareaRef.current = element;\n if (typeof ref === \"function\") {\n ref(element);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current = element;\n }\n };\n\n // Separate wrapper-level props (margin, padding, etc.) from input-specific props\n const {wrapperProps, inputProps} = separateWrapperProps(props);\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={constructHelpText()}\n errorText={errorText}\n required={required}\n size={size}\n {...wrapperProps}\n >\n <Element<TextareaElementType>\n as=\"textarea\"\n ref={setRefs}\n data-textarea\n id={id}\n name={name}\n value={value}\n rows={rows}\n cols={cols}\n minLength={minLength}\n maxLength={maxLength}\n placeholder={placeholder}\n readOnly={readOnly}\n disabled={disabled}\n required={required}\n autoComplete={autoComplete}\n onChange={handleChange}\n {...inputProps}\n />\n </FormItem>\n );\n },\n);\nTextArea.displayName = \"TextArea\";\n","// REACT CORE ==========================================================================================================\nimport React, { ElementType, ReactNode } from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { ElementProps, SpacingTypes } from \"../../Element/constants\";\n\n// INPUT ===============================================================================================================\n// Common props shared by form inputs\nexport interface InputCommonProps {\n label?: string;\n helpText?: string;\n errorText?: string;\n required?: boolean;\n disabled?: boolean;\n}\n\n// OTHER ===============================================================================================================\nimport { Checkbox } from \"../Checkbox/Checkbox\";\nimport { Element } from \"$element\";\nimport { FileUpload } from \"../FileUpload/FileUpload\";\nimport { InputField } from \"../InputField/InputField\";\nimport { InputLabel, InputLabelCustomProps } from \"../InputLabel/InputLabel\";\nimport { PortionProps, Portion } from \"../../Portion/Portion\";\nimport { RadioButton } from \"../RadioButton/RadioButton\";\nimport { RadioGroup } from \"../RadioButton/RadioGroup\";\nimport { RadioGroupOptionProps } from \"../RadioButton/constants\";\nimport { Row } from \"../../Row/Row\";\nimport { Select } from \"../Select/Select\";\nimport { Switch } from \"../Checkbox/Switch\";\nimport { TextArea } from \"../TextArea/TextArea\";\n\n// Types\nexport type FormFieldsType = ElementProps<HTMLInputElement> &\n ElementProps<HTMLSelectElement> &\n ElementProps<HTMLTextAreaElement> &\n InputLabelCustomProps &\n InputCommonProps;\n\nexport type FormFieldsConfigBase = PortionProps & FormFieldsType;\n\ninterface FormFieldOptionsType extends RadioGroupOptionProps {\n id : string;\n label : string;\n value : string;\n}\n\nexport interface FormFieldsConfig extends FormFieldsConfigBase {\n as : ElementType;\n options ? : FormFieldOptionsType[];\n name : string;\n // Making name required for field identification\n}\n\n// Supported Form elements for \"as\" prop in config\nconst FormElements: Record<string, ElementType> = {\n Checkbox,\n Switch,\n InputField,\n FileUpload,\n InputLabel,\n RadioButton,\n RadioGroup,\n Select,\n TextArea,\n Empty: \"div\",\n};\n\nconst getFormItem = (\n formField: Omit<FormFieldsConfig, \"mobileSpan\" | \"tabletLandscapeSpan\" | \"isHorizontal\" | \"desktopSpan\" | \"tabletPortraitSpan\">,\n onFieldChange: (fieldName: string, value: any) => void\n): React.ReactNode => {\n const { as: elementName, name, ...formFieldProps } = formField;\n\n // Create an onChange handler specific to this field\n const handleChange = (value: any) => {\n onFieldChange(name, value);\n };\n\n const ElementComponent = FormElements[elementName as keyof typeof FormElements] || InputField;\n\n return (\n <Element\n as={ElementComponent}\n {...formFieldProps}\n name={name}\n isFullWidth\n onChange={handleChange}\n />\n );\n};\n\nexport const generateFormThroughConfig = (\n fields: FormFieldsConfig[],\n onFieldChange: (fieldName: string, value: any) => void,\n spacing: SpacingTypes | undefined,\n): React.ReactNode => {\n const formChildren: ReactNode[] = fields.map((field, index) => {\n const {\n desktopSpan,\n tabletLandscapeSpan,\n tabletPortraitSpan,\n mobileSpan,\n isHorizontal,\n ...formField\n } = field;\n\n const portionProps = {\n desktopSpan,\n tabletLandscapeSpan,\n tabletPortraitSpan,\n mobileSpan,\n isHorizontal,\n };\n\n return (\n <Portion {...portionProps} key={`${field.name}-${index}`}>\n {getFormItem(formField, onFieldChange)}\n </Portion>\n );\n });\n\n return <Row gutters={spacing}>{formChildren}</Row>;\n};\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps, SpacingTypes } from \"../../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./form.css\";\n\n// OTHER ===============================================================================================================\nimport { Callout } from \"$/components\";\nimport { FormFieldsConfig, generateFormThroughConfig } from \"./FormGenerator\";\n\n// prettier-ignore\nexport interface FormCustomProps {\n spacing ? : SpacingTypes;\n fields ? : FormFieldsConfig[];\n onFieldsChange ? : (values: Record<string, any>) => void;\n errorText ? : string;\n}\n\nexport type FormElementType = HTMLFormElement;\nexport type FormProps = Omit<CommonAndHTMLProps<FormElementType>, keyof FormCustomProps> &\n FormCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Form = React.forwardRef(\n (\n { spacing = \"small\", fields, onFieldsChange, children, errorText, ...props }: FormProps,\n ref: React.Ref<FormElementType>\n ) => {\n let classNames = [];\n\n if (spacing) {\n classNames.push(`spacing-${spacing}`);\n }\n\n // Handle form field changes to provide direct values\n const handleFieldChange = (fieldName: string, value: any) => {\n if (onFieldsChange) {\n onFieldsChange({\n [fieldName]: value\n });\n }\n };\n\n // Generate form fields if config is provided\n const formContent = fields?.length ? generateFormThroughConfig(fields, handleFieldChange, spacing) : children;\n\n return (\n <Element<FormElementType>\n as=\"form\"\n data-form\n ref={ref}\n classNames={classNames}\n {...props}\n >\n {formContent}\n {errorText && <Callout kind=\"error\">{errorText}</Callout>}\n </Element>\n );\n }\n);\nForm.displayName = \"Form\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\n\n// STYLES ==============================================================================================================\nimport \"./form-item-group.css\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\n// prettier-ignore\nexport interface FormItemGroupCustomProps {\n isJoint ? : boolean;\n equalWidthForChildren ? : React.ReactNode;\n retainLayout ? : boolean;\n legend ? : string;\n}\n\nexport type FormItemGroupElementType = HTMLDivElement;\nexport type FormItemGroupProps = Omit<CommonAndHTMLProps<FormItemGroupElementType>, keyof FormItemGroupCustomProps> &\n FormItemGroupCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const FormItemGroup = React.forwardRef(\n (\n {\n isJoint,\n equalWidthForChildren,\n retainLayout,\n children,\n legend,\n id,\n ...props\n }: FormItemGroupProps,\n ref: React.Ref<FormItemGroupElementType>\n ) => {\n const groupId = id || `form-group-${Math.random().toString(36).substring(2, 9)}`;\n let classNames = [];\n\n if (isJoint) {\n classNames.push(\"is-joint\");\n }\n\n if (equalWidthForChildren) {\n classNames.push(\"equal-width-for-children\");\n }\n\n if (retainLayout) {\n classNames.push(\"retain-layout\");\n }\n\n return (\n <Element<FormItemGroupElementType>\n as=\"div\"\n data-form-item-group\n ref={ref}\n id={groupId}\n role=\"group\"\n aria-label={legend}\n classNames={classNames}\n {...props}\n >\n {children}\n </Element>\n );\n }\n);\nFormItemGroup.displayName = \"FormItemGroup\";\n","import { OptionForListBoxProps } from \"./constants\";\n\nexport const levenshteinDistance = (a: string, b: string): number => {\n const matrix = [];\n\n const aLength = a.length;\n const bLength = b.length;\n\n // Early exit if one of the strings is empty\n if (aLength === 0) return bLength;\n if (bLength === 0) return aLength;\n\n // Initialize the first row and column of the matrix\n for (let i = 0; i <= bLength; i++) {\n matrix[i] = [ i ];\n }\n for (let j = 0; j <= aLength; j++) {\n matrix[0][j] = j;\n }\n\n // Fill in the rest of the matrix\n for (let i = 1; i <= bLength; i++) {\n for (let j = 1; j <= aLength; j++) {\n if (b[i - 1] === a[j - 1]) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j] + 1, // Deletion\n matrix[i][j - 1] + 1, // Insertion\n matrix[i - 1][j - 1] + 1, // Substitution\n );\n }\n }\n }\n\n return matrix[bLength][aLength];\n};\n\nexport const isSubsequence = (search: string, target: string): boolean => {\n let searchIndex = 0;\n let targetIndex = 0;\n\n while (searchIndex < search.length && targetIndex < target.length) {\n if (search[searchIndex] === target[targetIndex]) {\n searchIndex++;\n }\n targetIndex++;\n }\n\n return searchIndex === search.length;\n};\n\nexport const generateAcronym = (label: string): string => {\n return label\n .split(/[\\s\\-_]+/)\n .map(word => word.slice(0, 2)) // Take first two letters\n .join(\"\")\n .toLowerCase();\n};\n\n// Handle partial matches and common typos =============================================================================\nexport const searchOptions = (options: OptionForListBoxProps[], searchTerm: string) => {\n if (!searchTerm) return options;\n\n const normalizedSearch = searchTerm.toLowerCase().trim();\n\n const maxDistance = Math.floor(normalizedSearch.length / 2);\n\n const matchedOptions = options\n .map(option => {\n const normalizedLabel = option.label.toLowerCase();\n\n const distance = levenshteinDistance(normalizedSearch, normalizedLabel);\n\n const words = normalizedLabel.split(/[\\s\\-_]+/);\n const searchWords = normalizedSearch.split(/[\\s\\-_]+/);\n\n const isPartialMatch =\n normalizedLabel.includes(normalizedSearch) ||\n searchWords.every(searchWord =>\n words.some(word => word.startsWith(searchWord)),\n );\n\n const acronym = generateAcronym(normalizedLabel);\n\n const isAcronymMatch = isSubsequence(normalizedSearch, acronym);\n\n return {\n option,\n distance,\n isPartialMatch,\n isAcronymMatch,\n };\n })\n .filter(({ distance, isPartialMatch, isAcronymMatch }) =>\n isPartialMatch || isAcronymMatch || distance <= maxDistance,\n )\n .sort((a, b) => {\n if (a.isPartialMatch && !b.isPartialMatch) return -1;\n if (!a.isPartialMatch && b.isPartialMatch) return 1;\n\n if (a.isAcronymMatch && !b.isAcronymMatch) return -1;\n if (!a.isAcronymMatch && b.isAcronymMatch) return 1;\n\n return a.distance - b.distance;\n })\n .map(({ option }) => option);\n\n return matchedOptions;\n};\n","// REACT CORE ==========================================================================================================\nimport React, { useState, useRef, useEffect, MutableRefObject, KeyboardEvent } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Div } from \"$tags\";\nimport { Element } from \"$element\";\n\n// HOOKS ===============================================================================================================\nimport { useClickOutside } from \"$hooks/UseClickOutside\";\n\n// UTILS ===============================================================================================================\nimport { separateWrapperProps } from \"$utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./list-box.css\";\n\n// OTHER ===============================================================================================================\nimport { Badge } from \"../../Badge/Badge\";\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { InputField } from \"../InputField/InputField\";\nimport { ListBoxProps, OptionForListBoxProps, ListBoxElementType, ListBoxCustomProps } from \"./constants\";\nimport { Text } from \"../../Typography/Text\";\nimport { searchOptions } from \"./listBoxUtils\";\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const ListBox = React.forwardRef<ListBoxElementType, ListBoxProps>(\n (\n {\n options = [],\n label,\n helpText,\n errorText,\n placeholder = \"Select an option\",\n id,\n defaultValue,\n onChange,\n disabled,\n selectionLimit,\n allowMultiSelect = false,\n allowCustomEntries = false,\n isLoading,\n value,\n isFullWidth,\n className,\n required,\n size,\n ...props\n },\n ref\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchValue, setSearchValue] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(-1);\n const [selectedOption, setSelectedOption] = useState<OptionForListBoxProps | null>(null);\n const [selectedOptions, setSelectedOptions] = useState<OptionForListBoxProps[]>([]);\n const [openUpward, setOpenUpward] = useState(false);\n\n useEffect(() => {\n if (defaultValue && onChange) {\n onChange(defaultValue);\n }\n }, []);\n\n // Create a memoized version of the combined options\n const allOptions = React.useMemo(() => {\n return [...options];\n }, [options]);\n\n const dropdownRef = useRef<HTMLSelectElement>(null) as MutableRefObject<HTMLSelectElement>;\n const searchInputRef = useRef<HTMLInputElement>(null);\n const dropdownMenuRef = useRef<HTMLDivElement>(null);\n\n const listboxId = id || `listbox-${Math.random().toString(36).substring(2, 9)}`;\n const filteredOptions = searchOptions(allOptions, searchValue);\n\n const handleSelectOption = (option: OptionForListBoxProps) => {\n if (option.disabled) return;\n\n let newSelectedOptions: OptionForListBoxProps[];\n if (allowMultiSelect) {\n const isSelected = selectedOptions.some(opt => opt.value === option.value);\n if (isSelected) {\n newSelectedOptions = selectedOptions.filter(opt => opt.value !== option.value);\n } else {\n if (selectionLimit && selectedOptions.length >= selectionLimit) {\n return;\n }\n newSelectedOptions = [...selectedOptions, option];\n }\n setSelectedOptions(newSelectedOptions);\n onChange?.(newSelectedOptions.map(opt => opt.value));\n } else {\n newSelectedOptions = [option];\n setSelectedOption(option);\n setSelectedOptions(newSelectedOptions);\n onChange?.(option.value);\n setIsOpen(false);\n }\n\n setSearchValue(\"\");\n setActiveIndex(-1);\n };\n\n const handleSearchChange = (value: string) => {\n setSearchValue(value);\n };\n\n const handleCustomEntry = () => {\n if (!searchValue.trim() || !allowCustomEntries) return;\n\n const customValue = searchValue.trim();\n const customOption: OptionForListBoxProps = {\n value: customValue,\n label: customValue,\n };\n\n // If this option doesn't exist yet\n if (!allOptions.some(opt => opt.value === customValue)) {\n handleSelectOption(customOption);\n }\n };\n\n const handleDeleteOption = (valueToRemove: string) => {\n if (allowMultiSelect) {\n // Filter out the option to remove\n const newSelectedOptions = selectedOptions.filter(opt => opt.value !== valueToRemove);\n\n // Update local state\n setSelectedOptions(newSelectedOptions);\n\n // Notify parent\n onChange?.(newSelectedOptions.map(opt => opt.value));\n } else {\n // For single-select mode, just clear everything\n setSelectedOption(null);\n setSelectedOptions([]);\n onChange?.(\"\");\n }\n };\n\n const handleClearAll = () => {\n // Reset local state for both single and multi-select\n setSelectedOption(null);\n setSelectedOptions([]);\n\n // Notify parent with empty data\n onChange?.(allowMultiSelect ? [] : \"\");\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setActiveIndex(0);\n } else {\n setActiveIndex(prev =>\n prev < filteredOptions.length - 1 ? prev + 1 : prev\n );\n }\n break;\n\n case \"ArrowUp\":\n event.preventDefault();\n setActiveIndex(prev => prev > 0 ? prev - 1 : prev);\n break;\n\n case \"Enter\":\n event.preventDefault();\n if (allowCustomEntries && searchValue.trim()) {\n const exactMatch = filteredOptions.find(opt =>\n opt.label.toLowerCase() === searchValue.trim().toLowerCase()\n );\n if (exactMatch) {\n handleSelectOption(exactMatch);\n } else {\n handleCustomEntry();\n }\n } else if (activeIndex >= 0 && filteredOptions[activeIndex]) {\n handleSelectOption(filteredOptions[activeIndex]);\n }\n break;\n\n case \"Escape\":\n event.preventDefault();\n setIsOpen(false);\n setActiveIndex(-1);\n break;\n\n case \" \": // Space key\n if (!isOpen) {\n event.preventDefault();\n setIsOpen(true);\n setActiveIndex(0);\n }\n break;\n\n case \"Home\":\n if (isOpen) {\n event.preventDefault();\n setActiveIndex(0);\n }\n break;\n\n case \"End\":\n if (isOpen) {\n event.preventDefault();\n setActiveIndex(filteredOptions.length - 1);\n }\n break;\n }\n };\n\n useClickOutside(dropdownRef, () => {\n setIsOpen(false);\n setActiveIndex(-1);\n });\n\n useEffect(() => {\n if (isOpen && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isOpen]);\n\n // Determine if dropdown should open upward based on available viewport space\n useEffect(() => {\n if (isOpen && dropdownRef.current) {\n const wrapperRect = dropdownRef.current.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n // Estimate dropdown height (max-height is 240px for options + search + padding)\n const estimatedDropdownHeight = 300;\n const spaceBelow = viewportHeight - wrapperRect.bottom;\n const spaceAbove = wrapperRect.top;\n\n // Open upward if not enough space below but enough space above\n setOpenUpward(spaceBelow < estimatedDropdownHeight && spaceAbove > spaceBelow);\n } else {\n setOpenUpward(false);\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (activeIndex >= 0) {\n const activeOption = document.querySelector(`[data-index=\"${activeIndex}\"]`);\n activeOption?.scrollIntoView({ block: \"nearest\" });\n }\n }, [activeIndex]);\n\n // Separate wrapper-level props (margin, padding, etc.) from input-specific props\n const { wrapperProps, inputProps } = separateWrapperProps(props);\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n isFullWidth={isFullWidth}\n size={size}\n {...wrapperProps}\n >\n {/* PARENT */}\n <Element\n as=\"div\"\n data-list-box\n classNames={[\"list-box-wrapper\", disabled ? \"disabled\" : \"\", className || \"\"]}\n ref={dropdownRef}\n isFullWidth={isFullWidth}\n {...inputProps}\n >\n <Div\n className=\"list-box-input-wrapper\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={`${listboxId}-listbox`}\n aria-owns={`${listboxId}-listbox`}\n tabIndex={disabled ? -1 : 0}\n >\n {allowMultiSelect ? (\n <>\n {selectedOptions.length > 0 ? (\n <Div className=\"options-wrapper\">\n <Div className=\"options-list\">\n {selectedOptions.map(option => (\n <Badge\n key={option.value}\n actionIcon=\"cross\"\n onActionClick={() => handleDeleteOption(option.value)}\n actionAriaLabel={`Remove ${option.label}`}\n size=\"small\"\n shape=\"rounded\"\n >\n <Text>{option.label}</Text>\n </Badge>\n ))}\n </Div>\n {selectionLimit && selectedOptions.length >= selectionLimit && (\n <Text className=\"options-limit-warning\" textColour=\"red\" size=\"tiny\">\n You can choose only {selectionLimit} option{selectionLimit === 1 ? \"\" : \"s\"}\n </Text>\n )}\n </Div>\n ) : (\n <span className=\"placeholder\">{placeholder}</span>\n )}\n\n {/* Clear button for multi-select */}\n {selectedOptions.length > 0 && (\n <Div\n className=\"icon-wrapper clear-all\"\n title=\"Clear all options\"\n onClick={() => handleClearAll()}\n >\n <svg viewBox=\"0 0 24 24\">\n <line x1=\"5\" y1=\"5\" x2=\"19\" y2=\"19\" />\n <line x1=\"5\" y1=\"19\" x2=\"19\" y2=\"5\" />\n </svg>\n </Div>\n )}\n </>\n ) : (\n selectedOptions[0]\n ? <Text className=\"selected-option\">{selectedOptions[0].label}</Text>\n : <span className=\"placeholder\">{placeholder}</span>\n )}\n\n <Div className=\"icon-wrapper chevrons\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <polyline points=\"6 9 12 4 18 9\"></polyline>\n <polyline points=\"6 15 12 20 18 15\"></polyline>\n </svg>\n </Div>\n </Div>\n\n {/* DROPDOWN */}\n {isOpen && !disabled && (\n <Div\n ref={dropdownMenuRef}\n className={`list-box-dropdown${openUpward ? \" opens-upward\" : \"\"}`}\n >\n <Div className=\"list-box-search-wrapper\">\n <InputField\n type=\"text\"\n ref={searchInputRef}\n className=\"list-box-search\"\n placeholder={allowCustomEntries ? \"Type to search or add new\" : \"Search\"}\n value={searchValue}\n onChange={handleSearchChange}\n onKeyDown={handleKeyDown}\n aria-controls={`${listboxId}-listbox`}\n aria-label=\"Search options\"\n isFullWidth\n />\n {allowCustomEntries && searchValue.trim() && !selectedOptions.some(opt =>\n opt.label.toLowerCase() === searchValue.trim().toLowerCase()) && (\n <kbd\n className=\"list-box-enter-key\"\n aria-label=\"Press Enter to add custom option\"\n >\n ↵\n </kbd>\n )}\n </Div>\n\n {/* OPTIONS */}\n <Element\n as=\"ul\"\n id={`${listboxId}-listbox`}\n className=\"list-box-options\"\n role=\"listbox\"\n aria-multiselectable={allowMultiSelect}\n aria-busy={isLoading}\n tabIndex={-1}\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <li\n key={option.value}\n id={`${listboxId}-option-${option.value}`}\n className={`list-box-option ${option.disabled ? \"disabled\" : \"\"} ${activeIndex === index ? \"active\" : \"\"}`}\n role=\"option\"\n aria-selected={selectedOptions.some(opt => opt.value === option.value)}\n aria-disabled={option.disabled}\n onClick={() => handleSelectOption(option)}\n data-index={index}\n tabIndex={-1}\n >\n {option.customLabel || option.label}\n </li>\n ))\n ) : (\n <li\n className=\"list-box-option disabled\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {allowCustomEntries\n ? \"Type and press Enter to add new option\"\n : \"No matches found\"\n }\n </li>\n )}\n </Element>\n </Div>\n )}\n </Element>\n </FormItem>\n );\n }\n);\nListBox.displayName = \"ListBox\";\n","// FRAMEWORK ===========================================================================================================\nimport React, { createRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from \"react\";\n\n// FICTOAN =============================================================================================================\nimport { InputField } from \"../InputField/InputField\";\nimport { Div } from \"../../Element/Tags\";\n\n// STYLES ==============================================================================================================\nimport \"./pin-input-field.css\";\n\n// TYPES ===============================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\n\ninterface PinInputFieldHandle extends HTMLDivElement {\n reset: () => void;\n}\n\n// prettier-ignore\ntype PinInputFieldCustomProps = {\n numberOfFields : number;\n onChange ? : (value: string) => void;\n type ? : \"alphanumeric\" | \"number\";\n mask ? : boolean;\n isOTP ? : boolean;\n autoFocus ? : boolean;\n pasteFromClipboard ? : \"enabled\" | \"disabled\";\n focusFirstInputOnReset ? : boolean;\n isFullWidth ? : boolean;\n ariaLabel ? : string;\n};\n\nexport type PinInputFieldElementType = HTMLDivElement & { reset: () => void };\nexport type PinInputFieldProps = Omit<CommonAndHTMLProps<PinInputFieldElementType>, keyof PinInputFieldCustomProps> &\n PinInputFieldCustomProps;\n\n// UTILITIES ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nfunction validate(value: string, type: \"alphanumeric\" | \"number\") {\n const NUMERIC_REGEX = /^[0-9]+$/;\n const ALPHA_NUMERIC_REGEX = /^[a-zA-Z0-9]+$/i;\n const regex = type === \"alphanumeric\" ? ALPHA_NUMERIC_REGEX : NUMERIC_REGEX;\n return regex.test(value);\n}\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const PinInputField = React.forwardRef(\n (\n {\n numberOfFields: length,\n onChange,\n type = \"number\",\n mask = false,\n isOTP = false,\n autoFocus = false,\n pasteFromClipboard = \"enabled\",\n focusFirstInputOnReset = true,\n isFullWidth,\n ariaLabel,\n ...props\n }: PinInputFieldProps,\n ref: React.Ref<PinInputFieldElementType>\n ) => {\n // REFS =====================================================================================================\n const pinInputFieldRef = useRef<PinInputFieldElementType>(null);\n const [inputRefs, setInputRefs] = useState<React.RefObject<HTMLInputElement>[]>([]);\n\n // STATES ===================================================================================================\n const [values, setValues] = useState<string[]>([]);\n const [moveFocus, setMoveFocus] = useState<boolean>(true);\n const [focusedIndex, setFocusedIndex] = useState<number>(-1);\n\n // CONSTANTS ================================================================================================\n const inputGroupId = props.id || `pin-input-${Math.random().toString(36).substring(2, 9)}`;\n const inputDescription = ariaLabel || 'Enter verification code';\n\n // HANDLERS =================================================================================================\n const focus = useCallback(\n (index: number) => {\n const ref = inputRefs[index];\n ref?.current?.focus();\n },\n [inputRefs]\n );\n\n const focusNext = useCallback(\n (index: number) => {\n if (!moveFocus) return;\n const next = index + 1 < length ? index + 1 : null;\n if (next) {\n focus(next);\n }\n },\n [focus, length, moveFocus]\n );\n\n const handleResetPinInput = useCallback(() => {\n setValues(Array(length).fill(\"\"));\n onChange?.(\"\"); // Clear the complete value\n if (focusFirstInputOnReset) {\n focus(0);\n setFocusedIndex(0);\n }\n }, [length, onChange, focus, focusFirstInputOnReset]);\n\n // VALUE HANDLING ==============================================================================================\n const setValue = useCallback(\n (value: string, index: number) => {\n const nextValues = [...values];\n nextValues[index] = value;\n setValues(nextValues);\n\n // Emit complete PIN value\n onChange?.(nextValues.join(\"\"));\n\n const isComplete =\n value !== \"\" &&\n nextValues.length === length &&\n nextValues.every((inputValue) => inputValue != null && inputValue !== \"\") &&\n index === length - 1;\n\n if (!isComplete) {\n setMoveFocus(true);\n focusNext(index);\n }\n },\n [focusNext, length, onChange, values]\n );\n\n // Updated input handler to work with both string values and events\n const handleInputChange = useCallback((inputValue: string | React.FormEvent<HTMLInputElement>, inputFieldIndex: number) => {\n // Extract value whether we get a string or an event\n const value = typeof inputValue === \"string\" ? inputValue : (inputValue.target as HTMLInputElement).value;\n const currentValue = values[inputFieldIndex];\n\n if (value === \"\") {\n setValue(\"\", inputFieldIndex);\n return;\n }\n\n // Rest of the logic remains the same\n if (value.length > 1 && inputFieldIndex < length - 1) {\n if (validate(value, type)) {\n let nextValue: string[] = [];\n const chars = value.split(\"\");\n\n if (currentValue === \"\") {\n nextValue = chars.filter((_, j) => inputFieldIndex + j < length);\n } else {\n const isAppending = inputRefs[inputFieldIndex].current?.selectionEnd === value.length;\n if (isAppending) {\n nextValue = chars.filter((_, j) => j > 0 && inputFieldIndex + j - 1 < length);\n } else {\n nextValue = chars.filter((_, j) => j < value.length - 1 && inputFieldIndex + j < length);\n }\n }\n\n const newValues = values.map((v, j) =>\n j >= inputFieldIndex && j < inputFieldIndex + nextValue.length\n ? nextValue[j - inputFieldIndex]\n : v\n );\n\n setValues(newValues);\n onChange?.(newValues.join(\"\"));\n\n const nextFocusIndex = Math.min(inputFieldIndex + nextValue.length, length - 1);\n focus(nextFocusIndex);\n }\n } else {\n let nextValue = value;\n if (currentValue?.length > 0) {\n nextValue = value.charAt(value.length - 1);\n }\n if (validate(nextValue, type)) {\n setValue(nextValue, inputFieldIndex);\n }\n }\n }, [length, onChange, setValue, type, values, focus, inputRefs]);\n\n const handleKeyDown = useCallback((event: React.KeyboardEvent<HTMLInputElement>, i: number) => {\n if (event.key === \"Backspace\") {\n if ((event.target as HTMLInputElement).value === \"\") {\n if (i > 0) {\n const newIndex = i - 1;\n setValue(\"\", newIndex);\n focus(newIndex);\n setMoveFocus(true);\n }\n } else {\n setMoveFocus(false);\n }\n } else if (event.key === \"Escape\") {\n inputRefs[i].current?.blur();\n handleBlur();\n } else if (event.key === \"ArrowRight\") {\n if (i < length - 1) {\n focus(i + 1);\n }\n } else if (event.key === \"ArrowLeft\") {\n if (i > 0) {\n focus(i - 1);\n }\n }\n }, [focus, setValue, inputRefs, length]);\n\n // EVENT HANDLERS ==============================================================================================\n // Updated focus handler to work with event type\n const handleFocus = useCallback((e: React.FocusEvent<HTMLInputElement> | undefined, i: number) => {\n setFocusedIndex(i);\n }, []);\n\n // When moving around the InputElements using tab key, browsers automatically select\n // the value (if it exists) in the InputElement - which we want to disable. Additionally,\n // when an existing value is selected/highlighted and pasted over, there is no way to\n // clearly distinguish between the other 2 scenarios of pasting by keeping the cursor before\n // and after the existing value. Specific example: If the existing value is 5, the event\n // when highlighting and pasting '567' is the same as placing the cursor before the existing\n // value and pasting '67'. By disabling this, we eliminate one of these cases.\n // Is this a hack? Yes. Is there a better way? IDK. Does it matter? Not unless there is a\n // valid reason for users to need selecting a single InputElement within a PinInput.\n const handleSelect = useCallback((e: React.SyntheticEvent<HTMLInputElement, Event>) => {\n const target = e.target as HTMLInputElement;\n setTimeout(() => {\n target.setSelectionRange(target.value.length, target.value.length);\n }, 0);\n }, []);\n\n const handleBlur = useCallback(() => {\n setFocusedIndex(-1);\n }, []);\n\n // EFFECTS =====================================================================================================\n useEffect(() => {\n setInputRefs((inputRefs) => {\n const refs = Array(length)\n .fill(0)\n .map((_, i) => {\n const ref = inputRefs[i] || createRef();\n if (autoFocus && i === 0) {\n ref.current?.focus();\n }\n return ref;\n });\n return refs;\n });\n }, [length, autoFocus]);\n\n useImperativeHandle(\n ref,\n () => ({\n ...(pinInputFieldRef.current as HTMLDivElement),\n reset: handleResetPinInput\n }) as PinInputFieldHandle,\n [handleResetPinInput]\n );\n\n // RENDER ==================================================================================================\n let classNames: string[] = [];\n\n if (isFullWidth) {\n classNames.push(\"full-width\");\n }\n\n return (\n <Div\n data-pin-input-field\n ref={pinInputFieldRef}\n classNames={isFullWidth ? [\"full-width\"] : []}\n role=\"group\"\n aria-label={inputDescription}\n aria-required={props.required}\n {...props}\n >\n {Array.from({ length }, (_, i) => (\n <InputField\n key={i}\n id={`${inputGroupId}-${i}`}\n ref={inputRefs[i]}\n type={mask ? \"password\" : type === \"number\" ? \"tel\" : \"text\"}\n inputMode={type === \"number\" ? \"numeric\" : \"text\"}\n onChange={(value: string | React.FormEvent<HTMLInputElement>) => handleInputChange(value, i)}\n onKeyDown={(e) => handleKeyDown(e, i)}\n onFocus={(e) => handleFocus(e as React.FocusEvent<HTMLInputElement>, i)}\n onSelect={handleSelect}\n onBlur={handleBlur}\n placeholder={focusedIndex !== i ? \"\\u2981\" : undefined}\n autoComplete={isOTP ? \"one-time-code\" : \"off\"}\n value={values[i] || \"\"}\n autoFocus={autoFocus && i === 0}\n onCopy={(e) => pasteFromClipboard === \"disabled\" && e.preventDefault()}\n onPaste={(e) => pasteFromClipboard === \"disabled\" && e.preventDefault()}\n aria-label={`Digit ${i + 1} of ${length}`}\n aria-required={props.required}\n />\n ))}\n </Div>\n );\n }\n);\nPinInputField.displayName = \"PinInputField\";\n","// REACT CORE ==========================================================================================================\nimport React, { useMemo, useRef, useEffect, useState, useCallback } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Div } from \"$tags\";\nimport { Element } from \"$element\";\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { SpacingTypes } from \"../../Element/constants\";\nimport { separateWrapperProps } from \"../../../utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./radio-tab-group.css\";\n\n// OTHER ===============================================================================================================\nimport { RadioTabGroupProps, RadioButtonElementType } from \"./constants\";\n\ninterface IndicatorPosition {\n width: number;\n transform: string;\n}\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const RadioTabGroup = React.forwardRef<HTMLDivElement, RadioTabGroupProps>(\n (\n {\n id,\n name,\n label,\n helpText,\n errorText,\n options,\n defaultValue,\n value,\n required,\n onChange,\n size = \"medium\",\n bgColour,\n disabled,\n ...props\n },\n ref\n ) => {\n const derivedName = useMemo(() => name || id, [name, id]);\n const optionsWrapperRef = useRef<HTMLDivElement>(null);\n\n const [indicatorPos, setIndicatorPos] = useState<IndicatorPosition>({\n width: 0,\n transform: \"translateX(0)\",\n });\n const [needsScroll, setNeedsScroll] = useState(false);\n const [scrollPosition, setScrollPosition] = useState(0);\n const [maxScroll, setMaxScroll] = useState(0);\n\n const labelsRef = useRef<(HTMLLabelElement | null)[]>([]);\n\n const measureWidths = useCallback(() => {\n if (!optionsWrapperRef.current) return;\n\n const wrapper = optionsWrapperRef.current;\n const inputWrapper = wrapper.closest(\"[data-input-wrapper]\");\n\n if (wrapper && inputWrapper) {\n const totalContentWidth = wrapper.scrollWidth;\n const availableWidth = inputWrapper.clientWidth;\n const needsToScroll = totalContentWidth > availableWidth;\n\n setNeedsScroll(needsToScroll);\n setMaxScroll(needsToScroll ? totalContentWidth - availableWidth : 0);\n }\n }, []);\n\n useEffect(() => {\n const wrapper = optionsWrapperRef.current;\n if (!wrapper) return;\n\n // Initial measurement\n measureWidths();\n\n // Set up observer for size changes\n const observer = new ResizeObserver(() => {\n measureWidths();\n });\n\n observer.observe(wrapper);\n if (wrapper.closest(\"[data-input-wrapper]\")) {\n observer.observe(wrapper.closest(\"[data-input-wrapper]\") as Element);\n }\n\n return () => observer.disconnect();\n }, [measureWidths]);\n\n // Update indicator position based on selected radio\n useEffect(() => {\n const selectedIndex = options.findIndex(option => option.value === value);\n if (selectedIndex >= 0) {\n const updateIndicator = () => {\n const label = labelsRef.current[selectedIndex];\n if (label) {\n const width = label.offsetWidth;\n let transform = \"translateX(0)\";\n\n if (selectedIndex > 0) {\n const offset = labelsRef.current\n .slice(0, selectedIndex)\n .reduce((acc, label) => acc + (label?.offsetWidth || 0), 0);\n transform = `translateX(${offset}px)`;\n }\n\n setIndicatorPos({ width, transform });\n }\n };\n\n // Wait for fonts to load before measuring to get correct widths\n if (document.fonts && document.fonts.ready) {\n document.fonts.ready.then(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(updateIndicator);\n });\n });\n } else {\n const timeoutId = setTimeout(updateIndicator, 100);\n return () => clearTimeout(timeoutId);\n }\n }\n }, [value, options]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.value);\n };\n\n // Separate wrapper-level props (margin, padding, etc.) from component-specific props\n const { wrapperProps, inputProps } = separateWrapperProps(props);\n\n const handleScroll = useCallback((direction: \"left\" | \"right\") => {\n const wrapper = optionsWrapperRef.current;\n if (!wrapper) return;\n\n const visibleWidth = wrapper.clientWidth;\n const scrollAmount = visibleWidth * 0.8;\n\n let newPosition = direction === \"right\"\n ? Math.min(scrollPosition + scrollAmount, maxScroll)\n : Math.max(scrollPosition - scrollAmount, 0);\n\n setScrollPosition(newPosition);\n\n requestAnimationFrame(() => {\n wrapper.style.transform = `translateX(-${newPosition}px)`;\n });\n }, [scrollPosition, maxScroll]);\n\n const canScrollLeft = scrollPosition > 0;\n const canScrollRight = scrollPosition < maxScroll;\n\n const classNames: string[] = [];\n if (size) {\n classNames.push(`size-${size}`);\n }\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n size={size}\n {...wrapperProps}\n >\n <Element\n as=\"div\"\n data-radio-tab-group\n ref={ref}\n classNames={classNames}\n name={derivedName}\n {...inputProps}\n >\n {/* LEFT SCROLL BUTTON */}\n {needsScroll && canScrollLeft && (\n <Div\n className=\"scroll-button left\"\n onClick={() => handleScroll(\"left\")}\n >\n <svg viewBox=\"0 0 24 24\">\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </Div>\n )}\n\n {/* RADIO OPTIONS */}\n <Div className=\"rtg-options-container\">\n <Div\n className=\"rtg-options-wrapper\"\n ref={optionsWrapperRef}\n >\n {/* INDICATOR */}\n <Div\n className=\"indicator\"\n style={{\n width: `${indicatorPos.width}px`,\n transform: indicatorPos.transform,\n }}\n />\n\n {options.map((option, index) => {\n const { id: optionId, ...optionProps } = option;\n const finalId = optionId || `${id}-option-${index}`;\n\n return (\n <React.Fragment key={finalId}>\n <input\n type=\"radio\"\n {...optionProps}\n id={finalId}\n name={derivedName}\n checked={value === option.value}\n disabled={disabled || option.disabled}\n onChange={handleChange}\n />\n <label\n ref={el => { labelsRef.current[index] = el; }}\n htmlFor={finalId}\n >\n {option.label}\n </label>\n </React.Fragment>\n );\n })}\n </Div>\n\n {/* RIGHT SCROLL BUTTON */}\n {needsScroll && canScrollRight && (\n <Div\n className=\"scroll-button right\"\n onClick={() => handleScroll(\"right\")}\n >\n <svg viewBox=\"0 0 24 24\">\n <polyline points=\"9 6 15 12 9 18\" />\n </svg>\n </Div>\n )}\n </Div>\n </Element>\n </FormItem>\n );\n }\n);\nRadioTabGroup.displayName = \"RadioTabGroup\";\n","// REACT CORE ==========================================================================================================\nimport React, { useCallback, useRef, useState, useEffect } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, CommonProps, SpacingTypes } from \"../../Element/constants\";\nimport { Div } from \"../../Element/Tags\";\n\n// UTILS ===============================================================================================================\nimport { separateWrapperProps } from \"../../../utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./range.css\";\n\n// OTHER ===============================================================================================================\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { InputLabel } from \"../InputLabel/InputLabel\";\nimport { Text } from \"../../Typography/Text\";\n\n// Single-thumb range\nexport interface SingleRangeCustomProps {\n min ? : number;\n max ? : number;\n step ? : number;\n suffix ? : string;\n value ? : number;\n onChange ? : (value : number) => void;\n}\n\n// Dual-thumb range\nexport interface DualRangeCustomProps {\n min ? : number;\n max ? : number;\n step ? : number;\n suffix ? : string;\n value ? : [ number, number ];\n onChange ? : (value : [ number, number ]) => void;\n minLabel ? : string;\n maxLabel ? : string;\n}\n\nexport type RangeElementType = HTMLInputElement;\n\n// Separate prop types for each mode\nexport type SingleRangeProps = Omit<CommonAndHTMLProps<RangeElementType>, \"onChange\" | \"value\" | \"size\"> &\n SingleRangeCustomProps &\n CommonProps & {\n label ? : string;\n helpText ? : string;\n errorText ? : string;\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n};\n\nexport type DualRangeProps = Omit<CommonAndHTMLProps<RangeElementType>, \"onChange\" | \"value\" | \"size\"> &\n DualRangeCustomProps &\n CommonProps & {\n label ? : string;\n helpText ? : string;\n errorText ? : string;\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n};\n\nexport type RangeProps = SingleRangeProps | DualRangeProps;\n\n// Type guard to check if props are for dual-thumb mode\nfunction isDualRangeProps(props : RangeProps) : props is DualRangeProps {\n return Array.isArray(props.value);\n}\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Range = React.forwardRef<RangeElementType, RangeProps>(\n (props, ref) => {\n if (isDualRangeProps(props)) {\n return <DualThumbRange {...props} forwardedRef={ref} />;\n }\n return <SingleThumbRange {...props} forwardedRef={ref} />;\n },\n);\nRange.displayName = \"Range\";\n\n// SINGLE THUMB COMPONENT //////////////////////////////////////////////////////////////////////////////////////////////\ninterface SingleThumbRangeInternalProps extends SingleRangeProps {\n forwardedRef ? : React.Ref<RangeElementType>;\n}\n\nconst SingleThumbRange : React.FC<SingleThumbRangeInternalProps> = ({\n label,\n helpText,\n errorText,\n value = 0,\n suffix,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n id,\n disabled,\n size,\n ...props\n}) => {\n // Separate wrapper-level props (margin, padding, etc.) from component-specific props\n const {wrapperProps} = separateWrapperProps(props);\n\n const thumbRef = useRef<HTMLButtonElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const [ isDragging, setIsDragging ] = useState(false);\n const [ isActive, setIsActive ] = useState(false);\n\n // Clamp value to valid range\n const clampedValue = Math.max(min, Math.min(max, value));\n\n // Convert value to percentage position\n const getPercent = useCallback((val : number) => {\n if (max <= min) return 0;\n const clamped = Math.max(min, Math.min(max, val));\n return ((clamped - min) / (max - min)) * 100;\n }, [ min, max ]);\n\n // Convert mouse/touch position to value\n const getValueFromPosition = useCallback((clientX : number) => {\n if (!trackRef.current) return min;\n\n const rect = trackRef.current.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const rawValue = min + percent * (max - min);\n\n // Snap to step\n const steppedValue = Math.round(rawValue / step) * step;\n return Math.max(min, Math.min(max, steppedValue));\n }, [ min, max, step ]);\n\n // Handle drag\n const handleDrag = useCallback((clientX : number) => {\n const newValue = getValueFromPosition(clientX);\n onChange?.(newValue);\n }, [ getValueFromPosition, onChange ]);\n\n // Mouse events\n const handleMouseDown = useCallback((e : React.MouseEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsDragging(true);\n setIsActive(true);\n handleDrag(e.clientX);\n }, [ disabled, handleDrag ]);\n\n useEffect(() => {\n if (!isDragging) return;\n\n const handleMouseMove = (e : MouseEvent) => {\n handleDrag(e.clientX);\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [ isDragging, handleDrag ]);\n\n // Touch events\n const handleTouchStart = useCallback((e : React.TouchEvent) => {\n if (disabled) return;\n setIsDragging(true);\n setIsActive(true);\n handleDrag(e.touches[0].clientX);\n }, [ disabled, handleDrag ]);\n\n useEffect(() => {\n if (!isDragging) return;\n\n const handleTouchMove = (e : TouchEvent) => {\n e.preventDefault();\n handleDrag(e.touches[0].clientX);\n };\n\n const handleTouchEnd = () => {\n setIsDragging(false);\n };\n\n document.addEventListener(\"touchmove\", handleTouchMove, {passive : false});\n document.addEventListener(\"touchend\", handleTouchEnd);\n\n return () => {\n document.removeEventListener(\"touchmove\", handleTouchMove);\n document.removeEventListener(\"touchend\", handleTouchEnd);\n };\n }, [ isDragging, handleDrag ]);\n\n // Keyboard navigation\n const handleKeyDown = useCallback((e : React.KeyboardEvent) => {\n if (disabled) return;\n\n let newValue = clampedValue;\n\n switch (e.key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n e.preventDefault();\n newValue = Math.min(clampedValue + step, max);\n break;\n case \"ArrowLeft\":\n case \"ArrowDown\":\n e.preventDefault();\n newValue = Math.max(clampedValue - step, min);\n break;\n case \"Home\":\n e.preventDefault();\n newValue = min;\n break;\n case \"End\":\n e.preventDefault();\n newValue = max;\n break;\n case \"PageUp\":\n e.preventDefault();\n newValue = Math.min(clampedValue + step * 10, max);\n break;\n case \"PageDown\":\n e.preventDefault();\n newValue = Math.max(clampedValue - step * 10, min);\n break;\n default:\n return;\n }\n\n onChange?.(newValue);\n }, [ disabled, clampedValue, min, max, step, onChange ]);\n\n const percent = getPercent(clampedValue);\n\n return (\n <FormItem\n customLabel={label && (\n <Div data-range-meta>\n <InputLabel\n className=\"range-label\"\n label={label}\n htmlFor={id}\n />\n <Text className=\"range-value\">\n {clampedValue}{suffix && suffix}\n </Text>\n </Div>\n )}\n helpText={helpText}\n errorText={errorText}\n size={size}\n {...wrapperProps}\n >\n <Div\n ref={trackRef}\n data-range-single\n className={disabled ? \"disabled\" : \"\"}\n role=\"group\"\n aria-labelledby={label ? `${id}-label` : undefined}\n >\n {/* Track background */}\n <Div className=\"range-track\" aria-hidden=\"true\" />\n\n {/* Filled track from start to thumb */}\n <Div\n className=\"range-track-fill\"\n style={{\n left : \"0%\",\n right : `${100 - percent}%`,\n }}\n aria-hidden=\"true\"\n />\n\n {/* Thumb */}\n <button\n ref={thumbRef}\n id={id}\n type=\"button\"\n className=\"range-thumb\"\n style={{left : `${percent}%`}}\n disabled={disabled}\n onMouseDown={handleMouseDown}\n onTouchStart={handleTouchStart}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsActive(true)}\n onBlur={() => setIsActive(false)}\n data-active={isActive || isDragging}\n role=\"slider\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={clampedValue}\n aria-valuetext={`${clampedValue}${suffix ? ` ${suffix}` : \"\"}`}\n aria-orientation=\"horizontal\"\n />\n </Div>\n </FormItem>\n );\n};\n\nSingleThumbRange.displayName = \"SingleThumbRange\";\n\n// DUAL THUMB COMPONENT ////////////////////////////////////////////////////////////////////////////////////////////////\ninterface DualThumbRangeInternalProps extends DualRangeProps {\n forwardedRef ? : React.Ref<RangeElementType>;\n}\n\nconst DualThumbRange : React.FC<DualThumbRangeInternalProps> = ({\n label,\n helpText,\n errorText,\n value = [ 0, 100 ],\n suffix,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n minLabel = \"Minimum value\",\n maxLabel = \"Maximum value\",\n id,\n disabled,\n size,\n ...props\n}) => {\n // Separate wrapper-level props (margin, padding, etc.) from component-specific props\n const {wrapperProps} = separateWrapperProps(props);\n\n const [ rawMinValue, rawMaxValue ] = value;\n // Clamp values to valid range\n const minValue = Math.max(min, Math.min(max, rawMinValue));\n const maxValue = Math.max(min, Math.min(max, rawMaxValue));\n\n const minThumbRef = useRef<HTMLButtonElement>(null);\n const maxThumbRef = useRef<HTMLButtonElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const [ isDragging, setIsDragging ] = useState<\"min\" | \"max\" | null>(null);\n const [ activeThumb, setActiveThumb ] = useState<\"min\" | \"max\" | null>(null);\n\n // Convert value to percentage position\n const getPercent = useCallback((val : number) => {\n if (max <= min) return 0;\n const clamped = Math.max(min, Math.min(max, val));\n return ((clamped - min) / (max - min)) * 100;\n }, [ min, max ]);\n\n // Convert mouse/touch position to value\n const getValueFromPosition = useCallback((clientX : number) => {\n if (!trackRef.current) return min;\n\n const rect = trackRef.current.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const rawValue = min + percent * (max - min);\n\n // Snap to step\n const steppedValue = Math.round(rawValue / step) * step;\n return Math.max(min, Math.min(max, steppedValue));\n }, [ min, max, step ]);\n\n // Handle drag for either thumb\n const handleDrag = useCallback((clientX : number, thumb : \"min\" | \"max\") => {\n const newValue = getValueFromPosition(clientX);\n\n if (thumb === \"min\") {\n const clampedMin = Math.min(newValue, maxValue - step);\n onChange?.([ clampedMin, maxValue ]);\n } else {\n const clampedMax = Math.max(newValue, minValue + step);\n onChange?.([ minValue, clampedMax ]);\n }\n }, [ getValueFromPosition, minValue, maxValue, step, onChange ]);\n\n // Mouse events\n const handleMouseDown = useCallback((thumb : \"min\" | \"max\") => (e : React.MouseEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsDragging(thumb);\n setActiveThumb(thumb);\n handleDrag(e.clientX, thumb);\n }, [ disabled, handleDrag ]);\n\n useEffect(() => {\n if (!isDragging) return;\n\n const handleMouseMove = (e : MouseEvent) => {\n handleDrag(e.clientX, isDragging);\n };\n\n const handleMouseUp = () => {\n setIsDragging(null);\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [ isDragging, handleDrag ]);\n\n // Touch events\n const handleTouchStart = useCallback((thumb : \"min\" | \"max\") => (e : React.TouchEvent) => {\n if (disabled) return;\n setIsDragging(thumb);\n setActiveThumb(thumb);\n handleDrag(e.touches[0].clientX, thumb);\n }, [ disabled, handleDrag ]);\n\n useEffect(() => {\n if (!isDragging) return;\n\n const handleTouchMove = (e : TouchEvent) => {\n e.preventDefault();\n handleDrag(e.touches[0].clientX, isDragging);\n };\n\n const handleTouchEnd = () => {\n setIsDragging(null);\n };\n\n document.addEventListener(\"touchmove\", handleTouchMove, {passive : false});\n document.addEventListener(\"touchend\", handleTouchEnd);\n\n return () => {\n document.removeEventListener(\"touchmove\", handleTouchMove);\n document.removeEventListener(\"touchend\", handleTouchEnd);\n };\n }, [ isDragging, handleDrag ]);\n\n // Keyboard navigation\n const handleKeyDown = useCallback((thumb : \"min\" | \"max\") => (e : React.KeyboardEvent) => {\n if (disabled) return;\n\n const currentValue = thumb === \"min\" ? minValue : maxValue;\n let newValue = currentValue;\n\n switch (e.key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n e.preventDefault();\n newValue = Math.min(currentValue + step, max);\n break;\n case \"ArrowLeft\":\n case \"ArrowDown\":\n e.preventDefault();\n newValue = Math.max(currentValue - step, min);\n break;\n case \"Home\":\n e.preventDefault();\n newValue = thumb === \"min\" ? min : minValue + step;\n break;\n case \"End\":\n e.preventDefault();\n newValue = thumb === \"max\" ? max : maxValue - step;\n break;\n case \"PageUp\":\n e.preventDefault();\n newValue = Math.min(currentValue + step * 10, max);\n break;\n case \"PageDown\":\n e.preventDefault();\n newValue = Math.max(currentValue - step * 10, min);\n break;\n default:\n return;\n }\n\n if (thumb === \"min\") {\n const clampedMin = Math.min(newValue, maxValue - step);\n onChange?.([ clampedMin, maxValue ]);\n } else {\n const clampedMax = Math.max(newValue, minValue + step);\n onChange?.([ minValue, clampedMax ]);\n }\n }, [ disabled, minValue, maxValue, min, max, step, onChange ]);\n\n const minPercent = getPercent(minValue);\n const maxPercent = getPercent(maxValue);\n\n return (\n <FormItem\n customLabel={label && (\n <Div data-range-meta>\n <InputLabel\n className=\"range-label\"\n label={label}\n htmlFor={id}\n />\n <Text className=\"range-value\">\n {minValue}&ndash;{maxValue}{suffix && suffix}\n </Text>\n </Div>\n )}\n helpText={helpText}\n errorText={errorText}\n size={size}\n {...wrapperProps}\n >\n <Div\n ref={trackRef}\n data-range-dual\n className={disabled ? \"disabled\" : \"\"}\n role=\"group\"\n aria-labelledby={label ? `${id}-label` : undefined}\n >\n {/* Track background */}\n <Div className=\"range-track\" aria-hidden=\"true\" />\n\n {/* Filled track between thumbs */}\n <Div\n className=\"range-track-fill\"\n style={{\n left : `${minPercent}%`,\n right : `${100 - maxPercent}%`,\n }}\n aria-hidden=\"true\"\n />\n\n {/* Min thumb */}\n <button\n ref={minThumbRef}\n id={`${id}-min`}\n type=\"button\"\n className=\"range-thumb range-thumb-min\"\n style={{left : `${minPercent}%`}}\n disabled={disabled}\n onMouseDown={handleMouseDown(\"min\")}\n onTouchStart={handleTouchStart(\"min\")}\n onKeyDown={handleKeyDown(\"min\")}\n onFocus={() => setActiveThumb(\"min\")}\n onBlur={() => setActiveThumb(null)}\n data-active={activeThumb === \"min\" || isDragging === \"min\"}\n role=\"slider\"\n aria-label={minLabel}\n aria-valuemin={min}\n aria-valuemax={maxValue - step}\n aria-valuenow={minValue}\n aria-valuetext={`${minValue}${suffix ? ` ${suffix}` : \"\"}`}\n aria-orientation=\"horizontal\"\n />\n\n {/* Max thumb */}\n <button\n ref={maxThumbRef}\n id={`${id}-max`}\n type=\"button\"\n className=\"range-thumb range-thumb-max\"\n style={{left : `${maxPercent}%`}}\n disabled={disabled}\n onMouseDown={handleMouseDown(\"max\")}\n onTouchStart={handleTouchStart(\"max\")}\n onKeyDown={handleKeyDown(\"max\")}\n onFocus={() => setActiveThumb(\"max\")}\n onBlur={() => setActiveThumb(null)}\n data-active={activeThumb === \"max\" || isDragging === \"max\"}\n role=\"slider\"\n aria-label={maxLabel}\n aria-valuemin={minValue + step}\n aria-valuemax={max}\n aria-valuenow={maxValue}\n aria-valuetext={`${maxValue}${suffix ? ` ${suffix}` : \"\"}`}\n aria-orientation=\"horizontal\"\n />\n </Div>\n </FormItem>\n );\n};\n\nDualThumbRange.displayName = \"DualThumbRange\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, CommonProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./meter.css\";\n\n// OTHER ===============================================================================================================\nimport { Text } from \"../Typography/Text\";\nimport { separateWrapperProps } from \"../../utils/propSeparation\";\n\nexport interface MeterLabelCustomProps {\n suffix ? : string;\n}\n\n// prettier-ignore\nexport interface MeterCustomProps {\n min : number;\n max : number;\n low : number;\n high : number;\n value : number;\n optimum ? : number;\n showOptimumMarker ? : boolean;\n suffix ? : string;\n height ? : string;\n label ? : string;\n ariaLabel ? : string;\n description ? : string;\n}\n\nexport type MeterElementType = HTMLMeterElement;\nexport type MeterProps = MeterCustomProps & CommonProps;\nexport type MeterMetaProps = Omit<CommonAndHTMLProps<HTMLDivElement>, keyof MeterLabelCustomProps> &\n MeterLabelCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Meter = React.forwardRef(\n ({\n label,\n value,\n height,\n suffix,\n showOptimumMarker,\n ariaLabel,\n description,\n min,\n max,\n low,\n high,\n optimum,\n ...props\n } : MeterProps, ref : React.Ref<MeterElementType>) => {\n const optimumPositionPercent = optimum ? (\n (optimum - min) / (max - min)\n ) * 100 : 0;\n\n const getValueDescription = () => {\n const percentage = (\n (value - min) / (max - min)\n ) * 100;\n let status : string;\n\n if (value <= low) {\n status = \"Low\";\n } else if (value >= high) {\n status = \"High\";\n } else {\n status = \"Normal\";\n }\n\n return `Current value is ${value}${suffix || \"\"} (${percentage.toFixed(1)}%). Status: ${status}`;\n };\n\n // Separate wrapper-level props (margin, padding, etc.) from meter-specific props\n const { wrapperProps, inputProps } = separateWrapperProps(props);\n\n return (\n <Element<HTMLDivElement>\n as=\"div\"\n role=\"region\"\n aria-label={ariaLabel || \"Meter indicator\"}\n {...wrapperProps}\n >\n {label && (\n <Element<HTMLDivElement>\n as=\"div\"\n data-meter-meta\n id={`meter-label-${label.toLowerCase().replace(/\\s+/g, \"-\")}`}\n >\n <Text>{label}</Text>\n <Text>\n {value}\n {suffix && suffix}\n </Text>\n </Element>\n )}\n\n <div\n className=\"meter-wrapper\"\n role=\"presentation\"\n >\n <Element<MeterElementType>\n as=\"meter\"\n data-meter\n ref={ref}\n value={value}\n min={min}\n max={max}\n low={low}\n high={high}\n optimum={optimum}\n {...inputProps}\n style={{ height }}\n aria-label={label || ariaLabel || \"Progress meter\"}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-valuetext={getValueDescription()}\n aria-describedby={description ? `meter-description-${label?.toLowerCase()\n .replace(/\\s+/g, \"-\")}` : undefined}\n />\n\n {showOptimumMarker && optimum && (\n <div\n className=\"optimum-marker\"\n style={{ left : `calc(${optimumPositionPercent}% - var(--meter-border-width))` }}\n title={`Optimum: ${optimum}`}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n )}\n </div>\n\n {description && (\n <div\n id={`meter-description-${label?.toLowerCase().replace(/\\s+/g, \"-\")}`}\n className=\"sr-only\"\n >\n {description}\n </div>\n )}\n </Element>\n );\n },\n);\nMeter.displayName = \"Meter\";","// REACT CORE ==========================================================================================================\nimport React, { useEffect } from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./modal.css\";\n\n// OTHER ===============================================================================================================\nimport { Text } from \"$/components\";\n\nexport type ModalElementType = HTMLDivElement;\n\nexport interface ModalCustomProps {\n id : string;\n isOpen ? : boolean;\n onClose ? : () => void;\n isDismissible ? : boolean;\n showBackdrop ? : boolean;\n blurBackdrop ? : boolean;\n label ? : string;\n description ? : string;\n}\n\nexport type ModalProps = Omit<CommonAndHTMLProps<ModalElementType>, keyof ModalCustomProps> & ModalCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Modal = React.forwardRef(\n (\n {\n id,\n children,\n classNames = [],\n isOpen = false,\n onClose,\n isDismissible = true,\n showBackdrop,\n blurBackdrop,\n label,\n description,\n ...props\n }: ModalProps, ref: React.Ref<ModalElementType>,\n ) => {\n const modalId = `${id}`;\n const descriptionId = description ? `${modalId}-description` : undefined;\n\n if (showBackdrop) {\n classNames.push(\"show-backdrop\");\n }\n\n if (blurBackdrop) {\n classNames.push(\"blur-backdrop\");\n }\n\n // Handle open/close state declaratively\n useEffect(() => {\n const modal = document.querySelector(`#${modalId}[data-modal]`);\n if (!modal || !(modal instanceof HTMLElement)) return;\n\n if (isOpen) {\n // Show modal\n modal.showPopover();\n\n // Focus first focusable element\n const focusableElements = modal.querySelectorAll(\n \"button, [href], input, select, textarea, [tabindex]:not([tabindex=\\\"-1\\\"])\",\n );\n if (focusableElements.length) {\n (focusableElements[0] as HTMLElement).focus();\n }\n } else {\n // Hide modal\n if (modal.matches(\":popover-open\")) {\n modal.hidePopover();\n }\n }\n }, [isOpen, modalId]);\n\n // Listen for popover toggle events to sync React state when closed externally\n // (e.g., clicking outside with popover=\"auto\", or pressing Escape)\n useEffect(() => {\n const modal = document.querySelector(`#${modalId}[data-modal]`);\n if (!modal || !(modal instanceof HTMLElement)) return;\n\n const handleToggle = (e: Event) => {\n const toggleEvent = e as ToggleEvent;\n // If popover was closed externally and React still thinks it's open, sync state\n if (toggleEvent.newState === \"closed\" && isOpen && onClose) {\n onClose();\n }\n };\n\n modal.addEventListener(\"toggle\", handleToggle);\n return () => modal.removeEventListener(\"toggle\", handleToggle);\n }, [modalId, isOpen, onClose]);\n\n return (\n <Element<ModalElementType>\n as=\"dialog\"\n id={modalId}\n data-modal\n // @ts-ignore\n popover={isDismissible ? \"auto\" : \"manual\"}\n ref={ref}\n classNames={classNames}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={label || \"Modal dialog\"}\n aria-describedby={descriptionId}\n {...props}\n >\n {isDismissible && onClose && (\n <Text\n className=\"dismiss-button\"\n onClick={onClose}\n aria-label=\"Close modal\"\n tabIndex={0}\n >\n &times;\n </Text>\n )}\n {description && (\n <div id={descriptionId} className=\"sr-only\">\n {description}\n </div>\n )}\n <div role=\"document\">\n {children}\n </div>\n </Element>\n );\n },\n);\nModal.displayName = \"Modal\";\n\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\n\n// STYLES ==============================================================================================================\nimport \"./notifications-wrapper.css\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\n// prettier-ignore\nexport interface NotificationsWrapperCustomProps {\n position ? : \"left\" | \"right\";\n anchor ? : \"top\" | \"bottom\";\n order ? : \"new-on-top\" | \"new-on-bottom\";\n kind ? : \"list\" | \"stack\";\n label ? : string;\n}\n\nexport type NotificationsWrapperElementType = HTMLDivElement;\nexport type NotificationsWrapperProps = CommonAndHTMLProps<NotificationsWrapperElementType> &\n NotificationsWrapperCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const NotificationsWrapper = React.forwardRef(\n (\n {\n position = \"right\",\n anchor = \"top\",\n order = \"new-on-top\",\n kind = \"list\",\n children,\n label,\n ...props\n }: NotificationsWrapperProps,\n ref: React.Ref<NotificationsWrapperElementType>\n ) => {\n let classNames = [];\n if (position) classNames.push(position);\n if (anchor) classNames.push(anchor);\n if (order) classNames.push(order);\n if (kind) classNames.push(kind);\n\n const childrenCount = React.Children.count(children);\n if (childrenCount === 0) return null;\n\n return (\n <Element<NotificationsWrapperElementType>\n as=\"section\"\n data-notifications-wrapper\n ref={ref}\n classNames={classNames}\n aria-label={label || \"Notifications\"}\n aria-relevant=\"additions removals\"\n role=\"log\"\n {...props}\n >\n {children}\n </Element>\n );\n }\n);\nNotificationsWrapper.displayName = \"NotificationsWrapper\";\n","// REACT CORE ==========================================================================================================\nimport React, { useState, useEffect } from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { Div } from \"../../Element/Tags\";\n\n// STYLES ==============================================================================================================\nimport \"./notification-item.css\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\n// TYPES ===============================================================================================================\nexport type NotificationKind = \"generic\" | \"info\" | \"warning\" | \"error\" | \"success\";\n\nexport interface NotificationItemProps {\n id : string;\n kind ? : NotificationKind;\n duration ? : number;\n isDismissible ? : boolean;\n onClose : () => void;\n children : React.ReactNode;\n}\n\nexport type NotificationItemElementType = HTMLDivElement;\n\n// Map notification types to ARIA roles\nconst roleMap: Record<NotificationKind, string> = {\n generic : \"status\",\n info : \"status\",\n warning : \"alert\",\n error : \"alert\",\n success : \"status\",\n};\n\n// COMPONENT ===========================================================================================================\nexport const NotificationItem = ({\n id,\n kind = \"generic\",\n duration = 4,\n isDismissible = true,\n onClose,\n children,\n}: NotificationItemProps) => {\n const [isExiting, setIsExiting] = useState(false);\n\n useEffect(() => {\n if (duration === 0) return; // No auto-dismiss\n\n const timer = setTimeout(() => {\n setIsExiting(true);\n }, duration * 1000);\n\n return () => clearTimeout(timer);\n }, [duration]);\n\n // Fallback: if transition doesn't fire, remove after animation duration\n useEffect(() => {\n if (!isExiting) return;\n\n const fallbackTimer = setTimeout(() => {\n onClose();\n }, 500); // slightly longer than the 0.4s transition\n\n return () => clearTimeout(fallbackTimer);\n }, [isExiting, onClose]);\n\n const handleDismissClick = (event: React.MouseEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsExiting(true);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setIsExiting(true);\n }\n };\n\n const handleTransitionEnd = () => {\n if (isExiting) {\n onClose();\n }\n };\n\n const classNames: string[] = [kind];\n if (isDismissible) classNames.push(\"dismissible\");\n if (isExiting) classNames.push(\"dismissed\");\n\n return (\n <Element<NotificationItemElementType>\n as=\"div\"\n data-notification-item\n id={id}\n classNames={classNames}\n onTransitionEnd={handleTransitionEnd}\n role={roleMap[kind]}\n aria-live={kind === \"error\" || kind === \"warning\" ? \"assertive\" : \"polite\"}\n aria-atomic=\"true\"\n >\n <div className=\"notification-content\">\n {children}\n </div>\n\n {isDismissible && (\n <Div\n className=\"dismiss-button\"\n onClick={handleDismissClick}\n onKeyDown={handleKeyDown}\n aria-label=\"Dismiss notification\"\n tabIndex={0}\n >\n <span className=\"sr-only\">Close notification</span>\n </Div>\n )}\n </Element>\n );\n};\nNotificationItem.displayName = \"NotificationItem\";\n","// REACT CORE ==========================================================================================================\nimport React, { createContext, useContext, useState, useCallback, ReactNode } from \"react\";\n\n// INTERNAL ============================================================================================================\nimport { NotificationsWrapper } from \"../NotificationsWrapper/NotificationsWrapper\";\nimport { NotificationItem, NotificationKind } from \"../NotificationItem/NotificationItem\";\n\n// TYPES ===============================================================================================================\nexport interface NotificationOptions {\n content : ReactNode | ((helpers: { close: () => void }) => ReactNode);\n kind ? : NotificationKind;\n duration ? : number; // seconds, 0 = no auto-dismiss\n isDismissible ? : boolean;\n}\n\ninterface InternalNotification {\n id : string;\n content : ReactNode | ((helpers: { close: () => void }) => ReactNode);\n kind : NotificationKind;\n duration : number;\n isDismissible : boolean;\n}\n\n// prettier-ignore\nexport interface NotificationsProviderProps {\n children : ReactNode;\n position ? : \"left\" | \"right\";\n anchor ? : \"top\" | \"bottom\";\n order ? : \"new-on-top\" | \"new-on-bottom\";\n kind ? : \"list\" | \"stack\";\n}\n\n// NOTIFY FUNCTION TYPE ================================================================================================\nexport interface NotifyFunction {\n (message: string): void;\n (content: ReactNode): void;\n (options: NotificationOptions): void;\n success : (message: string | ReactNode) => void;\n error : (message: string | ReactNode) => void;\n warning : (message: string | ReactNode) => void;\n info : (message: string | ReactNode) => void;\n}\n\ninterface NotificationsContextValue {\n notify: NotifyFunction;\n}\n\n// CONTEXT =============================================================================================================\nconst NotificationsContext = createContext<NotificationsContextValue | null>(null);\n\n// PROVIDER ============================================================================================================\nexport const NotificationsProvider = ({\n children,\n position = \"right\",\n anchor = \"top\",\n order = \"new-on-top\",\n kind = \"list\",\n}: NotificationsProviderProps) => {\n const [notifications, setNotifications] = useState<InternalNotification[]>([]);\n\n // Remove a notification by ID\n const removeNotification = useCallback((id: string) => {\n setNotifications(prev => prev.filter(n => n.id !== id));\n }, []);\n\n // Add a notification\n const addNotification = useCallback((\n content: ReactNode | ((helpers: { close: () => void }) => ReactNode),\n kind: NotificationKind = \"generic\",\n duration: number = 4,\n isDismissible: boolean = true\n ) => {\n const id = `notification-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n\n setNotifications(prev => [...prev, {\n id,\n content,\n kind,\n duration,\n isDismissible,\n }]);\n\n return id;\n }, []);\n\n // Main notify function\n const baseNotify = useCallback((\n messageOrOptions: string | ReactNode | NotificationOptions\n ) => {\n // String message\n if (typeof messageOrOptions === \"string\") {\n addNotification(messageOrOptions);\n return;\n }\n\n // Options object (has 'content' property)\n if (\n messageOrOptions !== null &&\n typeof messageOrOptions === \"object\" &&\n \"content\" in messageOrOptions\n ) {\n const opts = messageOrOptions as NotificationOptions;\n addNotification(\n opts.content,\n opts.kind ?? \"generic\",\n opts.duration ?? 4,\n opts.isDismissible ?? true\n );\n return;\n }\n\n // ReactNode\n addNotification(messageOrOptions as ReactNode);\n }, [addNotification]);\n\n // Create the notify function with shorthand methods\n const notify = useCallback(() => {\n const fn = baseNotify as NotifyFunction;\n\n fn.success = (message: string | ReactNode) => {\n addNotification(message, \"success\");\n };\n\n fn.error = (message: string | ReactNode) => {\n addNotification(message, \"error\");\n };\n\n fn.warning = (message: string | ReactNode) => {\n addNotification(message, \"warning\");\n };\n\n fn.info = (message: string | ReactNode) => {\n addNotification(message, \"info\");\n };\n\n return fn;\n }, [baseNotify, addNotification])();\n\n return (\n <NotificationsContext.Provider value={{ notify }}>\n {children}\n\n <NotificationsWrapper\n position={position}\n anchor={anchor}\n order={order}\n kind={kind}\n >\n {notifications.map(({ id, content, kind, duration, isDismissible }) => (\n <NotificationItem\n key={id}\n id={id}\n kind={kind}\n duration={duration}\n isDismissible={isDismissible}\n onClose={() => removeNotification(id)}\n >\n {typeof content === \"function\"\n ? content({ close: () => removeNotification(id) })\n : content\n }\n </NotificationItem>\n ))}\n </NotificationsWrapper>\n </NotificationsContext.Provider>\n );\n};\nNotificationsProvider.displayName = \"NotificationsProvider\";\n\n// HOOK ================================================================================================================\nexport const useNotifications = (): NotifyFunction => {\n const context = useContext(NotificationsContext);\n\n if (!context) {\n throw new Error(\"useNotifications must be used within a NotificationsProvider\");\n }\n\n return context.notify;\n};\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./spinner.css\";\n\n// prettier-ignore\nexport interface SpinnerCustomProps {\n size ? : \"tiny\" | \"small\" | \"medium\" | \"large\" | \"huge\";\n loadingText ? : string;\n // Custom loading message for screen readers\n}\n\nexport type SpinnerElementType = HTMLDivElement;\nexport type SpinnerProps = Omit<CommonAndHTMLProps<SpinnerElementType>, keyof SpinnerCustomProps> & SpinnerCustomProps;\n\n// COMPONENT //////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Spinner = React.forwardRef((\n {\n size = \"medium\",\n loadingText = \"Loading...\",\n ...props\n }: SpinnerProps,\n ref: React.Ref<SpinnerElementType>,\n ) => {\n let classNames = [];\n\n if (size) {\n classNames.push(`size-${size}`);\n }\n\n return (\n <Element<SpinnerElementType>\n as=\"div\"\n data-spinner\n ref={ref}\n classNames={classNames}\n role=\"status\"\n aria-busy=\"true\"\n aria-live=\"polite\"\n aria-label={loadingText}\n {...props}\n />\n );\n },\n);\nSpinner.displayName = \"Spinner\";\n","const range = (start: number, end: number) => {\n const length = end - start + 1;\n return Array.from({ length }, (_, i) => start + i);\n};\n\ninterface UsePaginationProps {\n totalItems : number;\n currentPage : number;\n itemsToShowEachSide : number;\n}\n\ninterface UsePaginationResult {\n items: (number | string)[];\n totalPages: number;\n rangeStart: number;\n rangeEnd: number;\n hasPrevPage: boolean;\n hasNextPage: boolean;\n}\n\nexport const usePagination = (\n {\n totalItems,\n currentPage,\n itemsToShowEachSide,\n }: UsePaginationProps): UsePaginationResult => {\n const totalPages = totalItems; // Each item gets its own page\n\n const items = (() => {\n const totalNumbers = itemsToShowEachSide * 2 + 1;\n let pageNumbers: (number | string)[] = [];\n\n if (totalPages <= totalNumbers) {\n // If we have fewer pages than the desired display count, show all pages\n pageNumbers = range(1, totalPages);\n } else {\n const leftSideNumbers = Math.min(currentPage - 1, itemsToShowEachSide);\n const rightSideNumbers = Math.min(totalPages - currentPage, itemsToShowEachSide);\n\n // Always show first page\n pageNumbers.push(1);\n\n // Add ellipsis after first page if needed\n if (currentPage - itemsToShowEachSide > 2) {\n pageNumbers.push(\"...\");\n }\n\n // Add pages around current page\n const rangeStart = Math.max(2, currentPage - leftSideNumbers);\n const rangeEnd = Math.min(totalPages - 1, currentPage + rightSideNumbers);\n pageNumbers.push(...range(rangeStart, rangeEnd));\n\n // Add ellipsis before last page if needed\n if (totalPages - currentPage > itemsToShowEachSide + 1) {\n pageNumbers.push(\"...\");\n }\n\n // Always show last page if we're not already at it\n if (rangeEnd < totalPages) {\n pageNumbers.push(totalPages);\n }\n }\n\n return pageNumbers;\n })();\n\n return {\n items,\n totalPages,\n rangeStart: currentPage,\n rangeEnd: currentPage,\n hasPrevPage: currentPage > 1,\n hasNextPage: currentPage < totalPages,\n };\n};\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Div } from \"../Element/Tags\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./pagination.css\";\n\n// OTHER ===============================================================================================================\nimport { Button } from \"../Button/Button\";\nimport { PaginationProps, PaginationElementType, RenderItemProps } from \"./constants\";\nimport { Spinner } from \"../Spinner/Spinner\";\nimport { Text } from \"../Typography/Text\";\nimport { usePagination } from \"./usePagination\";\n\nconst defaultRenderItem = (\n {\n type,\n page,\n selected,\n disabled,\n onClick,\n key,\n ...props\n }: RenderItemProps) => {\n if (type === \"ellipsis\") {\n return (\n <Text className=\"pagination-ellipsis\">...</Text>\n );\n }\n\n const paginationItemProps = {\n type : \"button\",\n className : `pagination-item ${selected ? \"selected\" : \"\"} ${disabled ? \"disabled\" : \"\"}`,\n onClick,\n disabled,\n ...props,\n };\n\n let content;\n switch (type) {\n case \"first\":\n content = content = (\n <svg viewBox=\"0 0 24 24\">\n <line x1=\"5\" y1=\"18\" x2=\"5\" y2=\"6\" />\n <polyline points=\"14 18 9 12 14 6\" />\n <line x1=\"10\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n break;\n case \"previous\":\n content = (\n <svg viewBox=\"0 0 24 24\">\n <polyline points=\"12 18 7 12 12 6\" />\n <line x1=\"8\" y1=\"12\" x2=\"17\" y2=\"12\" />\n </svg>\n );\n break;\n case \"next\":\n content = content = (\n <svg viewBox=\"0 0 24 24\">\n <polyline points=\"12 6 17 12 12 18\" />\n <line x1=\"16\" y1=\"12\" x2=\"7\" y2=\"12\" />\n </svg>\n );\n break;\n case \"last\":\n content = content = (\n <svg viewBox=\"0 0 24 24\">\n <polyline points=\"10 6 15 12 10 18\" />\n <line x1=\"19\" y1=\"6\" x2=\"19\" y2=\"18\" />\n <line x1=\"14\" y1=\"12\" x2=\"5\" y2=\"12\" />\n </svg>\n );\n break;\n default:\n content = page;\n }\n\n return (\n <Button\n kind=\"custom\"\n {...paginationItemProps}\n >\n {content}\n </Button>\n );\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Pagination = React.forwardRef(\n (\n {\n totalItems,\n currentPage,\n onPageChange,\n itemsToShowEachSide = 1,\n kind = \"plain\",\n showGoToFirstItemButton = true,\n showGoToLastItemButton = true,\n showPreviousButton = true,\n showNextButton = true,\n showGoToInput = false,\n disabled = false,\n hideDisabledButtons = false,\n renderItem = defaultRenderItem,\n isLoading = false,\n loadingText,\n emptyText,\n itemDisplayText = \"Page\",\n ...props\n }: PaginationProps, ref: React.Ref<PaginationElementType>) => {\n const {\n items,\n totalPages,\n rangeStart,\n rangeEnd,\n hasPrevPage,\n hasNextPage,\n } = usePagination({\n totalItems,\n currentPage,\n itemsToShowEachSide,\n });\n\n const [ goToPage, setGoToPage ] = React.useState(\"\");\n\n const handlePageInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setGoToPage(e.target.value);\n };\n\n const handlePageInputKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n const page = parseInt(goToPage);\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n onPageChange(page);\n setGoToPage(\"\");\n }\n }\n };\n\n if (totalItems === 0) {\n return <Text className=\"pagination-empty\">{emptyText || \"No items to display\"}</Text>;\n }\n\n let classNames = [ \"pagination\" ];\n\n if (kind) {\n classNames.push(kind);\n }\n\n if (disabled) {\n classNames.push(\"disabled\");\n }\n\n if (isLoading) {\n classNames.push(\"loading\");\n }\n\n return (\n <Element<PaginationElementType>\n as=\"nav\"\n data-pagination\n ref={ref}\n classNames={classNames}\n role=\"navigation\"\n aria-label=\"pagination\"\n {...props}\n >\n <Div className=\"pagination-controls\">\n {/* GO TO FIRST ITEM */}\n {showGoToFirstItemButton && (!hideDisabledButtons || hasPrevPage) && renderItem({\n type : \"first\",\n disabled : !hasPrevPage || disabled,\n selected : false,\n onClick : () => onPageChange(1),\n })}\n\n {/* GO TO PREVIOUS ITEM */}\n {showPreviousButton && (!hideDisabledButtons || hasPrevPage) && renderItem({\n type : \"previous\",\n disabled : !hasPrevPage || disabled,\n selected : false,\n onClick : () => onPageChange(currentPage - 1),\n })}\n\n {/* SHOW PAGE ITEM OR ELLIPSIS */}\n {items.map((item, index) => {\n const itemProps: RenderItemProps = item === \"...\"\n ? {\n key : `ellipsis-${index}`,\n type : \"ellipsis\",\n selected : false,\n disabled : true,\n }\n : {\n key : item.toString(),\n type : \"page\",\n page : item as number,\n selected : item === currentPage,\n disabled : disabled,\n \"aria-current\" : item === currentPage ? \"page\" : undefined,\n onClick : () => onPageChange(item as number),\n };\n\n return renderItem(itemProps);\n })}\n\n {/* GO TO NEXT ITEM */}\n {showNextButton && (!hideDisabledButtons || hasNextPage) && renderItem({\n type : \"next\",\n disabled : !hasNextPage || disabled,\n selected : false,\n onClick : () => onPageChange(currentPage + 1),\n })}\n\n {/* GO TO LAST ITEM */}\n {showGoToLastItemButton && (!hideDisabledButtons || hasNextPage) && renderItem({\n type : \"last\",\n disabled : !hasNextPage || disabled,\n selected : false,\n onClick : () => onPageChange(totalPages),\n })}\n\n {isLoading && (\n <Div className=\"pagination-loading\">\n <Spinner />\n {loadingText && <Text size=\"small\">{loadingText}</Text>}\n </Div>\n )}\n </Div>\n\n <Div className=\"pagination-info\">\n <Text size=\"tiny\">\n {itemDisplayText} {rangeStart} of {totalItems}\n </Text>\n\n {showGoToInput && (\n <Div className=\"pagination-go-to\">\n <input\n type=\"number\"\n min={1}\n max={totalPages}\n value={goToPage}\n onChange={handlePageInputChange}\n onKeyDown={handlePageInputKeyPress}\n placeholder={`Go to ${itemDisplayText}`}\n aria-label={`Go to ${itemDisplayText}`}\n disabled={disabled}\n />\n </Div>\n )}\n </Div>\n </Element>\n );\n },\n);\nPagination.displayName = \"Pagination\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, ColourPropTypes, ShapeTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./progress-bar.css\";\n\n// OTHER ===============================================================================================================\nimport { Text } from \"../Typography/Text\";\n\nexport interface ProgressBarLabelCustomProps {\n suffix ? : string;\n}\n\nexport interface ProgressBarCustomProps {\n label ? : string;\n value ? : number;\n suffix ? : string;\n height ? : string;\n max ? : number;\n shape ? : ShapeTypes;\n bgColor ? : ColourPropTypes;\n bgColour ? : ColourPropTypes;\n fillColor ? : ColourPropTypes;\n fillColour ? : ColourPropTypes;\n}\n\nexport type ProgressBarElementType = HTMLProgressElement;\nexport type ProgressBarProps = Omit<CommonAndHTMLProps<ProgressBarElementType>, keyof ProgressBarCustomProps> &\n ProgressBarCustomProps;\nexport type ProgressBarMetaProps = Omit<CommonAndHTMLProps<HTMLDivElement>, keyof ProgressBarLabelCustomProps> &\n ProgressBarLabelCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const ProgressBar = React.forwardRef(\n (\n {\n label,\n value,\n height,\n max = 100,\n shape,\n bgColor,\n bgColour,\n fillColor,\n fillColour,\n ...props\n } : ProgressBarProps, ref : React.Ref<ProgressBarElementType>) => {\n const validValue = Math.max(0, Math.min(max, Number(value) || 0));\n const progressText = `${validValue}${props.suffix || \"\"}`;\n\n // Use UK spelling as primary, fall back to US spelling\n const backgroundColour = bgColour || bgColor;\n const progressFillColour = fillColour || fillColor;\n\n // Build CSS custom properties for styling\n const progressBarStyles : React.CSSProperties = {\n height,\n ...(backgroundColour && {\"--progress-bar-bg\" : `var(--${backgroundColour})`}),\n ...(progressFillColour && {\"--progress-bar-fill\" : `var(--${progressFillColour})`}),\n };\n\n return (\n <>\n {label && (\n <Element<HTMLDivElement>\n as=\"div\"\n data-progress-bar-meta\n aria-hidden=\"true\"\n >\n <Text>{label}</Text>\n <Text>\n {progressText}\n </Text>\n </Element>\n )}\n\n <Element<ProgressBarElementType>\n as=\"progress\"\n data-progress-bar\n ref={ref}\n value={validValue}\n max={max}\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={validValue}\n aria-valuetext={`${label ? `${label}: ` : \"\"}${progressText}`}\n shape={shape}\n {...props}\n style={progressBarStyles}\n />\n </>\n );\n },\n);\nProgressBar.displayName = \"ProgressBar\";","// FRAMEWORK ===========================================================================================================\nimport React, { createContext, useContext, useState, ReactNode, useCallback, useRef, useEffect } from \"react\";\n\n// FICTOAN =============================================================================================================\nimport { Element } from \"$element\";\nimport { Div } from \"$tags\";\nimport { Card, CardElementType, CardProps } from \"../Card/Card\";\n\n// STYLES ==============================================================================================================\nimport \"./option-card.css\";\n\n// TYPES ===============================================================================================================\nexport type TickPosition =\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\"\n | \"centre-left\"\n | \"center-left\"\n | \"centre-right\"\n | \"center-right\"\n | \"centre-top\"\n | \"center-top\"\n | \"center-bottom\"\n | \"centre-bottom\"\n | \"centre\"\n | \"center\";\n\nexport interface OptionCardsProviderProps {\n children : ReactNode;\n allowMultipleSelections ? : boolean;\n showTickIcon ? : boolean;\n tickPosition ? : TickPosition;\n onSelectionChange ? : (selectedIds: Set<string>) => void;\n selectionLimit ? : number;\n defaultSelectedIds ? : Set<string>; // Uncontrolled mode - initial selection\n selectedIds ? : Set<string>; // Controlled mode - external state\n}\n\nexport interface OptionCardProps extends CardProps {\n id : string;\n children : ReactNode;\n disabled ? : boolean;\n}\n\nexport interface OptionCardsGroupRef {\n selectAll : () => void;\n selectNone : () => void;\n selectInverse : () => void;\n}\n\ninterface OptionCardsContextType {\n isSelected : (id: string) => boolean;\n toggleSelection : (id: string) => void;\n showTickIcon ? : boolean;\n tickPosition ? : TickPosition;\n selectAll ? : () => void;\n selectNone ? : () => void;\n selectInverse ? : () => void;\n registerOption : (id: string, disabled: boolean) => void;\n unregisterOption : (id: string) => void;\n}\n\nconst OptionCardsContext = createContext<OptionCardsContextType>({\n isSelected : () => false,\n toggleSelection : () => {},\n showTickIcon : false,\n tickPosition : \"top-right\",\n selectAll : () => {},\n selectNone : () => {},\n selectInverse : () => {},\n registerOption : () => {},\n unregisterOption : () => {},\n});\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const OptionCardsGroup = React.forwardRef<OptionCardsGroupRef, OptionCardsProviderProps>(\n (\n {\n children,\n allowMultipleSelections = false,\n showTickIcon,\n onSelectionChange,\n tickPosition = \"top-right\",\n selectionLimit,\n defaultSelectedIds,\n selectedIds: selectedIdsProp,\n ...props\n },\n ref\n ) => {\n // Determine if controlled or uncontrolled mode\n const isControlled = selectedIdsProp !== undefined;\n\n // Internal state for uncontrolled mode only\n const [internalSelectedIds, setInternalSelectedIds] = useState<Set<string>>(\n defaultSelectedIds ? new Set(defaultSelectedIds) : new Set()\n );\n const availableOptionsRef = useRef<Map<string, boolean>>(new Map()); // id -> disabled\n\n // Use controlled value if provided, otherwise use internal state\n const selectedIds = isControlled ? selectedIdsProp : internalSelectedIds;\n\n // Wrapper to update selection - in controlled mode, just call onSelectionChange\n const updateSelectedIds = useCallback((newIds: Set<string>) => {\n if (!isControlled) {\n setInternalSelectedIds(newIds);\n }\n onSelectionChange?.(newIds);\n }, [isControlled, onSelectionChange]);\n\n const registerOption = useCallback((id: string, disabled: boolean) => {\n availableOptionsRef.current.set(id, disabled);\n }, []);\n\n const unregisterOption = useCallback((id: string) => {\n availableOptionsRef.current.delete(id);\n }, []);\n\n // Click to toggle an option ===================================================================================\n const toggleSelection = useCallback((id: string) => {\n const newSelectedIds = new Set(selectedIds);\n if (allowMultipleSelections) {\n if (newSelectedIds.has(id)) {\n newSelectedIds.delete(id);\n } else {\n if (selectionLimit && newSelectedIds.size >= selectionLimit) {\n return;\n }\n newSelectedIds.add(id);\n }\n } else {\n if (newSelectedIds.has(id) && selectedIds.size === 1) {\n newSelectedIds.clear();\n } else {\n newSelectedIds.clear();\n newSelectedIds.add(id);\n }\n }\n updateSelectedIds(newSelectedIds);\n }, [selectedIds, allowMultipleSelections, selectionLimit, updateSelectedIds]);\n\n // Select all available options ================================================================================\n const selectAll = useCallback(() => {\n if (!allowMultipleSelections) return;\n\n // Get all enabled options\n const enabledOptions = Array.from(availableOptionsRef.current.entries())\n .filter(([_, disabled]) => !disabled)\n .map(([id]) => id);\n\n // Respect selection limit if set\n const optionsToSelect = selectionLimit\n ? enabledOptions.slice(0, selectionLimit)\n : enabledOptions;\n\n updateSelectedIds(new Set(optionsToSelect));\n }, [allowMultipleSelections, selectionLimit, updateSelectedIds]);\n\n // De-select all options =======================================================================================\n const selectNone = useCallback(() => {\n updateSelectedIds(new Set());\n }, [updateSelectedIds]);\n\n // Invert selection ============================================================================================\n const selectInverse = useCallback(() => {\n if (!allowMultipleSelections) return;\n\n // Get all enabled options\n const enabledOptions = Array.from(availableOptionsRef.current.entries())\n .filter(([_, disabled]) => !disabled)\n .map(([id]) => id);\n\n // Select options that are not currently selected\n const invertedSelection = enabledOptions.filter(id => !selectedIds.has(id));\n\n // Respect selection limit if set\n const optionsToSelect = selectionLimit\n ? invertedSelection.slice(0, selectionLimit)\n : invertedSelection;\n\n updateSelectedIds(new Set(optionsToSelect));\n }, [selectedIds, allowMultipleSelections, selectionLimit, updateSelectedIds]);\n\n const isSelected = useCallback((id: string) => {\n return selectedIds.has(id);\n }, [selectedIds]);\n\n // Expose methods via ref\n React.useImperativeHandle(ref, () => ({\n selectAll,\n selectNone,\n selectInverse,\n }), [selectAll, selectNone, selectInverse]);\n\n const contextValue = {\n isSelected,\n toggleSelection,\n showTickIcon,\n tickPosition,\n selectAll,\n selectNone,\n selectInverse,\n registerOption,\n unregisterOption,\n };\n\n return (\n <OptionCardsContext.Provider value={contextValue}>\n <Div data-option-cards-group className={`tick-${tickPosition}`}>\n {children}\n </Div>\n </OptionCardsContext.Provider>\n );\n }\n);\nOptionCardsGroup.displayName = \"OptionCardsGroup\";\n\nexport const useOptionCard = (id: string) => {\n const context = useContext(OptionCardsContext);\n return {\n isSelected : context.isSelected(id),\n toggleSelection : () => context.toggleSelection(id),\n showTickIcon : context.showTickIcon,\n };\n};\n\nexport const useOptionCardsGroup = () => {\n const { selectAll, selectNone, selectInverse } = useContext(OptionCardsContext);\n return { selectAll, selectNone, selectInverse };\n};\n\nexport const OptionCard: React.FC<OptionCardProps> = ({ id, children, disabled = false, ...props }) => {\n const { isSelected, toggleSelection, showTickIcon, registerOption, unregisterOption } = useContext(OptionCardsContext);\n const [showDeselect, setShowDeselect] = useState(false);\n const [isInitialHover, setIsInitialHover] = useState(true);\n\n // Register/unregister this option\n React.useEffect(() => {\n registerOption(id, disabled);\n return () => unregisterOption(id);\n }, [id, disabled, registerOption, unregisterOption]);\n\n let classNames = [];\n\n if (isSelected(id)) {\n classNames.push(\"selected\");\n }\n\n if (disabled) {\n classNames.push(\"disabled\");\n }\n\n if (showDeselect) {\n classNames.push(\"show-deselect\");\n }\n\n const handleMouseEnter = () => {\n if (isSelected(id) && !isInitialHover) {\n setShowDeselect(true);\n }\n };\n\n const handleMouseLeave = () => {\n setShowDeselect(false);\n setIsInitialHover(false);\n };\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (!disabled) {\n setIsInitialHover(true);\n setShowDeselect(false);\n toggleSelection(id);\n props.onClick?.(e);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === \"Enter\" || e.key === \" \") && !disabled) {\n e.preventDefault();\n setIsInitialHover(true);\n setShowDeselect(false);\n toggleSelection(id);\n }\n };\n\n return (\n <Element<CardElementType>\n as={Card}\n data-option-card\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n aria-selected={isSelected(id)}\n classNames={classNames}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n {showTickIcon && (\n <>\n <svg viewBox=\"0 0 24 24\" className=\"tick-icon\">\n <circle cx=\"12\" cy=\"12\" r=\"11\" />\n <path d=\"M8 13 L11 15 L16 9\" />\n </svg>\n\n <svg viewBox=\"0 0 24 24\" className=\"deselect-icon\">\n <circle cx=\"12\" cy=\"12\" r=\"11\" />\n <path d=\"M8 8 L16 16 M16 8 L8 16\" />\n </svg>\n </>\n )}\n {children}\n </Element>\n );\n};\n","// REACT CORE ==========================================================================================================\nimport React, { useRef, useImperativeHandle } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\nimport { Element } from \"$element\";\n\n// HOOKS ===============================================================================================================\nimport { useClickOutside } from \"../../../hooks/UseClickOutside\";\n\n// STYLES ==============================================================================================================\nimport \"./sidebar-wrapper.css\";\n\n// prettier-ignore\nexport interface SidebarWrapperCustomProps {\n collapsed ? : boolean;\n closeOnClickOutside ? : () => void;\n showMobileSidebar ? : boolean;\n}\n\nexport type SidebarWrapperElementType = HTMLDivElement;\nexport type SidebarWrapperNewProps = Omit<CommonAndHTMLProps<SidebarWrapperElementType>,\n keyof SidebarWrapperCustomProps> & SidebarWrapperCustomProps;\n\nexport const SidebarWrapper = React.forwardRef(\n (\n {\n collapsed,\n closeOnClickOutside,\n showMobileSidebar,\n ...props\n } : SidebarWrapperNewProps, forwardedRef : React.Ref<SidebarWrapperElementType>) => {\n\n const internalRef = useRef<HTMLDivElement>(null);\n\n // @ts-ignore\n useImperativeHandle(forwardedRef, () => internalRef.current);\n\n useClickOutside(internalRef, () => {\n if (typeof closeOnClickOutside === \"function\") {\n closeOnClickOutside();\n }\n });\n\n let classNames = [];\n\n if (collapsed) {\n classNames.push(\"collapsed\");\n }\n\n if (showMobileSidebar) {\n classNames.push(\"show-sidebar\");\n }\n\n return (\n <Element<SidebarWrapperElementType>\n as=\"aside\"\n data-sidebar-wrapper\n ref={internalRef}\n classNames={classNames}\n {...props}\n />\n );\n },\n);\nSidebarWrapper.displayName = \"SidebarWrapper\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\n\n// STYLES ==============================================================================================================\nimport \"./content-wrapper.css\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\nexport type ContentWrapperElementType = HTMLDivElement;\ninterface ContentWrapperCustomProps {\n label ? : string;\n // For aria-label\n}\nexport type ContentWrapperProps = CommonAndHTMLProps<ContentWrapperElementType> & ContentWrapperCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const ContentWrapper = React.forwardRef(\n (\n { label, ...props }: ContentWrapperProps, ref: React.Ref<ContentWrapperElementType>) => {\n\n return (\n <Element<ContentWrapperElementType>\n as=\"main\"\n data-content-wrapper\n ref={ref}\n role=\"main\"\n aria-label={label || \"Main content\"}\n {...props}\n />\n );\n }\n);\nContentWrapper.displayName = \"ContentWrapper\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\n\n// STYLES ==============================================================================================================\nimport \"./sidebar-header.css\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\n// prettier-ignore\nexport interface SidebarHeaderCustomProps {\n isSticky ? : boolean;\n}\n\nexport type SidebarHeaderElementType = HTMLDivElement;\nexport type SidebarHeaderNewProps = Omit<CommonAndHTMLProps<SidebarHeaderElementType>, keyof SidebarHeaderCustomProps>\n & SidebarHeaderCustomProps;\n\nexport const SidebarHeader = React.forwardRef(\n ({ isSticky, ...props }: SidebarHeaderNewProps, ref: React.Ref<SidebarHeaderElementType>) => {\n let classNames = [];\n\n if (isSticky) {\n classNames.push(\"is-sticky\");\n }\n\n return (\n <Element<SidebarHeaderElementType>\n as=\"header\"\n data-sidebar-header\n ref={ref}\n classNames={classNames}\n {...props}\n />\n );\n }\n);\nSidebarHeader.displayName = \"SidebarHeader\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\nimport { Div } from \"$tags\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./sidebar-item.css\";\n\ntype BaseItemProps = {\n hasAlert ? : boolean;\n}\n\ntype IconProps =\n | {\n hasEmptyIcon : boolean;\n hasNoIcon ? : never;\n } // If hasEmptyIcon is set, hasNoIcon can't be set\n | {\n hasEmptyIcon ? : never;\n hasNoIcon : boolean;\n } // If hasNoIcon is set, hasEmptyIcon can't be set\n | {\n hasEmptyIcon ? : never;\n hasNoIcon ? : never;\n } // Neither is set\n\nexport type SidebarItemCustomProps = BaseItemProps & IconProps;\n\nexport type SidebarItemElementType = HTMLDivElement;\nexport type SidebarItemNewProps = Omit<CommonAndHTMLProps<SidebarItemElementType>, keyof SidebarItemCustomProps> &\n SidebarItemCustomProps;\n\nexport const SidebarItem = React.forwardRef(\n (\n {hasAlert, hasEmptyIcon, hasNoIcon, children, ...props} : SidebarItemNewProps,\n ref : React.Ref<SidebarItemElementType>) => {\n let classNames = [];\n\n if (hasAlert) {\n classNames.push(\"has-alert\");\n }\n\n if (hasEmptyIcon) {\n classNames.push(\"has-empty-icon\");\n } else if (hasNoIcon) {\n classNames.push(\"has-no-icon\");\n }\n\n return (\n <Element<SidebarItemElementType>\n as=\"div\"\n data-sidebar-item\n ref={ref}\n classNames={classNames}\n {...props}\n >\n {hasEmptyIcon && <Div className=\"empty-icon-wrapper\" />}\n {children}\n </Element>\n );\n },\n);\nSidebarItem.displayName = \"SidebarItem\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\n\n// STYLES ==============================================================================================================\nimport \"./sidebar-footer.css\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\n// prettier-ignore\nexport interface SidebarFooterCustomProps {\n isSticky ? : boolean;\n}\n\nexport type SidebarFooterElementType = HTMLDivElement;\nexport type SidebarFooterNewProps = Omit<CommonAndHTMLProps<SidebarFooterElementType>, keyof SidebarFooterCustomProps>\n & SidebarFooterCustomProps;\n\nexport const SidebarFooter = React.forwardRef(\n ({ isSticky, ...props }: SidebarFooterNewProps, ref: React.Ref<SidebarFooterElementType>) => {\n let classNames = [];\n\n if (isSticky) {\n classNames.push(\"is-sticky\");\n }\n\n return (\n <Element<SidebarFooterElementType>\n as=\"footer\"\n data-sidebar-footer\n ref={ref}\n classNames={classNames}\n {...props}\n />\n );\n });\nSidebarFooter.displayName = \"SidebarFooter\";\n","// REACT CORE ==========================================================================================================\nimport React, { createContext, useContext } from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps, ShapeTypes, SpacingTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./skeleton.css\";\n\n// Common skeleton props shared between Skeleton and SkeletonGroup\ninterface CommonSkeletonProps {\n effect ? : \"pulse\" | \"wave\" | \"none\";\n animate ? : boolean;\n loadingLabel ? : string;\n // Accessible label for loading state\n}\n\n// Context to share common properties\nconst SkeletonContext = createContext<CommonSkeletonProps>({\n effect : \"wave\",\n animate : true,\n});\n\n// Props specific to individual Skeleton elements\ninterface SkeletonCustomProps extends CommonSkeletonProps {\n variant ? : \"line\" | \"circle\" | \"block\";\n width ? : string | number;\n height ? : string | number;\n shape ? : ShapeTypes;\n}\n\n// Props specific to SkeletonGroup\ninterface SkeletonGroupCustomProps extends CommonSkeletonProps {\n repeat ? : number;\n direction ? : \"vertical\" | \"horizontal\";\n spacing ? : SpacingTypes;\n}\n\nexport type SkeletonElementType = HTMLDivElement;\nexport type SkeletonProps =\n Omit<CommonAndHTMLProps<SkeletonElementType>, keyof SkeletonCustomProps>\n & SkeletonCustomProps;\nexport type SkeletonGroupProps =\n Omit<CommonAndHTMLProps<SkeletonElementType>, keyof SkeletonGroupCustomProps>\n & SkeletonGroupCustomProps;\n\n// COMPONENTS //////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Skeleton = React.forwardRef((\n {\n variant = \"line\",\n width,\n height,\n shape,\n effect: localEffect,\n loadingLabel,\n ...props\n }: SkeletonProps, ref: React.Ref<SkeletonElementType>) => {\n // Get shared properties from group context\n const groupContext = useContext(SkeletonContext);\n\n const effectiveEffect = localEffect || groupContext.effect;\n const effectiveLabel = loadingLabel || groupContext.loadingLabel || \"Loading...\";\n\n let classNames = [];\n\n if (variant) {\n classNames.push(`variant-${variant}`);\n }\n\n if (shape) {\n classNames.push(`shape-${shape}`);\n }\n\n if (effectiveEffect) {\n classNames.push(`effect-${effectiveEffect}`);\n }\n\n // Handle circle variant dimensions\n const computedWidth = width || \"100%\";\n const computedHeight = variant === \"circle\"\n ? (typeof width === \"number\" ? `${width}px` : width) || height || \"100%\"\n : height;\n\n const style = {\n width: computedWidth,\n height: computedHeight,\n aspectRatio: variant === \"circle\" ? \"1 / 1\" : \"auto\",\n ...props.style,\n };\n\n return (\n <Element\n as=\"div\"\n data-skeleton\n ref={ref}\n classNames={classNames}\n style={style}\n role=\"progressbar\"\n aria-busy=\"true\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuetext={effectiveLabel}\n aria-label={effectiveLabel}\n {...props}\n />\n );\n});\nSkeleton.displayName = \"Skeleton\";\n\nexport const SkeletonGroup = React.forwardRef((\n {\n effect = \"wave\",\n spacing = \"small\",\n animate = true,\n repeat = 1,\n direction = \"vertical\",\n children,\n classNames = [],\n loadingLabel = \"Loading content...\",\n ...props\n }: SkeletonGroupProps, ref: React.Ref<SkeletonElementType>) => {\n\n const groupClassNames = [\n `direction-${direction}`,\n effect && `effect-${effect}`,\n ...classNames,\n ];\n\n if (spacing) {\n groupClassNames.push(`spacing-${spacing}`);\n }\n\n return (\n <SkeletonContext.Provider value={{ effect, animate, loadingLabel }}>\n <Element\n as=\"div\"\n ref={ref}\n data-skeleton-group\n classNames={groupClassNames}\n role=\"alert\"\n aria-busy=\"true\"\n aria-label={loadingLabel}\n {...props}\n >\n {Array(repeat).fill(children).map((child, index) => (\n React.cloneElement(child as React.ReactElement, {\n key: index\n })\n ))}\n </Element>\n </SkeletonContext.Provider>\n );\n});\nSkeletonGroup.displayName = \"SkeletonGroup\";\n","// FRAMEWORK ===========================================================================================================\nimport React from \"react\";\n\n// FICTOAN =============================================================================================================\nimport { Element } from \"../Element\";\n\n// STYLES ==============================================================================================================\nimport \"./table.css\";\n\n// TYPES ===============================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\n\n// prettier-ignore\nexport interface TableCustomProps {\n bordersFor ? : \"rows\" | \"columns\" | \"both\";\n alignText ? : \"left\" | \"right\" | \"centre\" | \"center\";\n isStriped ? : boolean;\n highlightRowOnHover ? : boolean;\n isFullWidth ? : boolean;\n caption ? : string; // Accessible table caption\n summary ? : string; // Description of table structure for complex tables\n hasColSpan ? : boolean; // Indicates if table has colspan/rowspan for screen readers\n}\n\nexport type TableElementType = HTMLTableElement;\nexport type TableProps = Omit<CommonAndHTMLProps<TableElementType>, keyof TableCustomProps> & TableCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Table = React.forwardRef(\n (\n {\n bordersFor,\n isStriped,\n highlightRowOnHover,\n isFullWidth,\n alignText,\n caption,\n summary,\n hasColSpan,\n children,\n ...props\n }: TableProps,\n ref: React.Ref<TableElementType>\n ) => {\n let classNames = [];\n\n if (bordersFor) {\n classNames.push(`bordered-${bordersFor}`);\n }\n\n if (isStriped) {\n classNames.push(\"striped\");\n }\n\n if (highlightRowOnHover) {\n classNames.push(\"hoverable\");\n }\n\n if (isFullWidth) {\n classNames.push(\"full-width\");\n }\n\n if (alignText) {\n classNames.push(`align-text-${alignText}`);\n }\n\n // Get row count if children exist\n const rowCount = React.Children.count(children);\n\n // Get column count from first row if possible\n const getColumnCount = () => {\n if (!children || !React.isValidElement(children)) return undefined;\n\n const firstRow = React.Children.toArray(children)[0];\n if (React.isValidElement(firstRow)) {\n const rowProps = firstRow.props as { children?: React.ReactNode };\n if (rowProps.children) {\n return React.Children.count(rowProps.children);\n }\n }\n return undefined;\n };\n\n return (\n <Element<TableElementType>\n as=\"table\"\n classNames={classNames}\n ref={ref}\n role=\"table\"\n aria-rowcount={rowCount || undefined}\n aria-colcount={hasColSpan ? undefined : getColumnCount()}\n summary={summary}\n {...props}\n >\n {caption && <caption>{caption}</caption>}\n {children}\n </Element>\n );\n }\n);\nTable.displayName = \"Table\";\n","// REACT CORE ==========================================================================================================\nimport React, { useEffect, useCallback, useRef } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Div, Nav } from \"../Element/Tags\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./tabs.css\";\n\n// OTHER ===============================================================================================================\nimport { Divider } from \"../Divider/Divider\";\nimport { Text } from \"../Typography/Text\";\n\ninterface TabType {\n key : string;\n label : React.ReactNode;\n content : React.ReactNode;\n hasAlert ? : boolean;\n}\n\n// prettier-ignore\nexport interface TabsCustomProps {\n tabs : TabType[];\n additionalNavContentWrapper ? : React.ReactNode;\n defaultActiveTab ? : React.ReactNode;\n align ? : \"left\" | \"centre\" | \"center\" | \"right\";\n isFullWidth ? : boolean;\n}\n\nexport type TabsElementType = HTMLDivElement;\nexport type TabsProps = Omit<CommonAndHTMLProps<TabsElementType>, keyof TabsCustomProps> & TabsCustomProps;\n\nexport const Tabs = React.forwardRef(\n (\n {tabs, additionalNavContentWrapper, defaultActiveTab, align = \"left\", isFullWidth, ...props} : TabsProps,\n ref : React.Ref<TabsElementType>) => {\n const index = tabs.findIndex((tab) => tab.key === defaultActiveTab);\n const defaultTabIndex = index > -1 ? index : 0;\n const [ activeTab, setActiveTab ] = React.useState<TabType | undefined>(\n tabs.length > 0 ? tabs[defaultTabIndex] : undefined,\n );\n const [ isExiting, setIsExiting ] = React.useState<boolean>(false);\n\n // Refs for keyboard navigation to focus the tab buttons\n const tabButtonRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n // V2's performant animation logic\n const handleTabChange = useCallback((tab : TabType) => {\n if (activeTab?.key !== tab.key) {\n setIsExiting(true);\n setTimeout(() => {\n setActiveTab(tab);\n setIsExiting(false);\n }, 150); // Animation duration\n }\n }, [ activeTab?.key ]);\n\n useEffect(() => {\n if (tabs.length > 0) {\n // If the current active tab still exists in the new tabs array, keep it.\n // This preserves the active state if the content of a tab changes.\n const currentTabStillExists = tabs.find(tab => tab.key === activeTab?.key);\n if (!currentTabStillExists) {\n // Otherwise, default to the designated default tab or the first one.\n setActiveTab(tabs[defaultTabIndex]);\n }\n } else {\n setActiveTab(undefined);\n }\n }, [ tabs, defaultTabIndex, activeTab?.key ]);\n\n\n const handleKeyDown = useCallback((event : React.KeyboardEvent, currentIndex : number) => {\n let nextIndex = currentIndex;\n\n if (event.key === \"ArrowRight\") {\n nextIndex = (currentIndex + 1) % tabs.length;\n } else if (event.key === \"ArrowLeft\") {\n nextIndex = (currentIndex - 1 + tabs.length) % tabs.length;\n } else if (event.key === \"Home\") {\n nextIndex = 0;\n } else if (event.key === \"End\") {\n nextIndex = tabs.length - 1;\n } else {\n // Exit if it's not a navigation key\n return;\n }\n\n event.preventDefault();\n const nextTab = tabs[nextIndex];\n if (nextTab) {\n handleTabChange(nextTab);\n tabButtonRefs.current[nextIndex]?.focus();\n }\n\n }, [ tabs, handleTabChange ]);\n\n if (!activeTab) {\n return null; // Render nothing if there are no tabs or no active tab\n }\n\n return (\n <Element<TabsElementType>\n as=\"div\"\n data-tabs\n ref={ref}\n data-align={align}\n data-full-width={isFullWidth}\n {...props}\n >\n <Nav data-tabs-nav role=\"tablist\" aria-label=\"Tab Navigation\">\n <ul className=\"tab-labels-list\">\n {tabs.map((tab, i) => (\n <li key={tab.key}>\n <Element<HTMLButtonElement>\n as=\"button\"\n // @ts-ignore\n ref={(el) => (tabButtonRefs.current[i] = el)}\n id={`tab-${tab.key}`}\n role=\"tab\"\n aria-selected={activeTab.key === tab.key}\n aria-controls={`tab-panel-${tab.key}`}\n tabIndex={activeTab.key === tab.key ? 0 : -1} // Roaming tabindex\n data-tab-label\n data-active={activeTab.key === tab.key}\n data-alert={tab.hasAlert}\n onClick={() => handleTabChange(tab)}\n onKeyDown={(e) => handleKeyDown(e, i)}\n className={`tab-button ${activeTab.key === tab.key ? \"is-active\" : \"\"}`}\n marginBottom=\"nano\"\n >\n <Text\n className={`tab-label ${activeTab.key === tab.key ? \"is-active\" : \"\"} ${tab.hasAlert ? \"has-alert\" : \"\"}`}\n >\n {tab.label}\n </Text>\n </Element>\n </li>\n ))}\n {additionalNavContentWrapper}\n </ul>\n </Nav>\n\n <Divider kind=\"tertiary\" marginTop=\"none\" marginBottom=\"micro\" />\n\n {tabs.map((tab) => (\n <Div\n key={tab.key}\n id={`tab-panel-${tab.key}`}\n role=\"tabpanel\"\n aria-labelledby={`tab-${tab.key}`}\n tabIndex={activeTab.key === tab.key ? 0 : -1}\n data-tab-content\n data-active={activeTab.key === tab.key}\n data-exiting={activeTab.key === tab.key && isExiting}\n hidden={activeTab.key !== tab.key}\n >\n {tab.content}\n </Div>\n ))}\n </Element>\n );\n },\n);\nTabs.displayName = \"Tabs\";","// REACT CORE ==========================================================================================================\nimport React, { useCallback, useEffect, useState } from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\nconst getStorageKey = (): string => {\n if (typeof window !== 'undefined') {\n const hostname = window.location.hostname;\n const port = window.location.port;\n \n // Create identifier from hostname and port\n let identifier = hostname.replace(/\\./g, '-');\n if (port) {\n identifier += `-${port}`;\n }\n \n return `${identifier}-theme`;\n }\n \n return \"fictoan-theme\";\n};\n\n// Create a tuple type for the theme context\ntype ThemeContextType = [string, React.Dispatch<React.SetStateAction<string>>];\n\nconst defaultContext: ThemeContextType = [\"\", (_) => {}];\nconst ThemeContext = React.createContext<ThemeContextType | undefined>(undefined);\n\nexport const useTheme = (): ThemeContextType => {\n const context = React.useContext(ThemeContext);\n if (context === undefined) {\n return defaultContext;\n }\n return context;\n};\n\nexport type ThemeProviderElementType = HTMLDivElement;\nexport interface ThemeProviderProps extends CommonAndHTMLProps<ThemeProviderElementType> {\n themeList : string[];\n currentTheme : string;\n}\n\nconst getTheme = (key: string, fallback?: string) => {\n let theme;\n try {\n theme = localStorage.getItem(key) || undefined;\n } catch (e) {\n // Unsupported\n }\n return theme || fallback;\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const ThemeProvider = React.forwardRef(\n ({ currentTheme, themeList, children, ...props }: ThemeProviderProps, ref: React.Ref<ThemeProviderElementType>) => {\n const [shouldRender, setShouldRender] = useState<boolean>(false);\n const [themeState, setThemeState] = useState<string>(() =>\n getTheme(getStorageKey()) || currentTheme);\n\n const setTheme = useCallback(\n (value: React.SetStateAction<string>) => {\n // Handle both direct values and updater functions\n const newTheme = typeof value === \"function\"\n ? value(themeState)\n : value;\n\n if (!themeList.includes(newTheme)) {\n // Fall back to first available theme\n const fallbackTheme = themeList[0];\n setThemeState(fallbackTheme);\n document.documentElement.className = \"\";\n document.documentElement.classList.add(fallbackTheme);\n try {\n localStorage.setItem(getStorageKey(), fallbackTheme);\n } catch (e) {\n // Unsupported\n }\n return;\n }\n\n setThemeState(newTheme);\n document.documentElement.className = \"\";\n document.documentElement.classList.add(newTheme);\n if (!shouldRender) {\n setShouldRender(true);\n }\n try {\n localStorage.setItem(getStorageKey(), newTheme);\n } catch (e) {\n // Unsupported\n }\n },\n [themeState, themeList]\n );\n\n useEffect(() => {\n const theme = getTheme(getStorageKey());\n setTheme(theme || currentTheme);\n }, [currentTheme, setTheme]);\n\n return (\n <ThemeContext.Provider value={[themeState, setTheme]}>\n <Element<ThemeProviderElementType> as=\"div\" data-theme-provider ref={ref} {...props}>\n {shouldRender && children}\n </Element>\n </ThemeContext.Provider>\n );\n }\n);\nThemeProvider.displayName = \"ThemeProvider\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\n\n// STYLES ==============================================================================================================\nimport \"./toasts-wrapper.css\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\n// prettier-ignore\nexport interface ToastsWrapperCustomProps {\n anchor ? : \"top\" | \"bottom\";\n}\n\nexport type ToastsWrapperElementType = HTMLDivElement;\nexport type ToastsWrapperProps = CommonAndHTMLProps<ToastsWrapperElementType> &\n ToastsWrapperCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const ToastsWrapper = React.forwardRef(\n (\n {\n anchor = \"top\",\n children,\n ...props\n }: ToastsWrapperProps,\n ref: React.Ref<ToastsWrapperElementType>\n ) => {\n const childrenCount = React.Children.count(children);\n if (childrenCount === 0) return null;\n\n return (\n <Element<ToastsWrapperElementType>\n as=\"section\"\n data-toasts-wrapper\n ref={ref}\n classNames={[anchor]}\n aria-label=\"Toasts\"\n aria-relevant=\"additions removals\"\n role=\"log\"\n {...props}\n >\n {children}\n </Element>\n );\n }\n);\nToastsWrapper.displayName = \"ToastsWrapper\";\n","// REACT CORE ==========================================================================================================\nimport React, { useState, useEffect } from \"react\";\n\n// STYLES ==============================================================================================================\nimport \"./toast-item.css\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\n// TYPES ===============================================================================================================\nexport interface ToastItemProps {\n id : string;\n duration ? : number;\n onClose : () => void;\n children : React.ReactNode;\n}\n\nexport type ToastItemElementType = HTMLDivElement;\n\n// COMPONENT ===========================================================================================================\nexport const ToastItem = ({\n id,\n duration = 4,\n onClose,\n children,\n}: ToastItemProps) => {\n const [isExiting, setIsExiting] = useState(false);\n\n useEffect(() => {\n if (duration === 0) return;\n\n const timer = setTimeout(() => {\n setIsExiting(true);\n }, duration * 1000);\n\n return () => clearTimeout(timer);\n }, [duration]);\n\n // Fallback: if transition doesn't fire, remove after animation duration\n useEffect(() => {\n if (!isExiting) return;\n\n const fallbackTimer = setTimeout(() => {\n onClose();\n }, 500);\n\n return () => clearTimeout(fallbackTimer);\n }, [isExiting, onClose]);\n\n const handleTransitionEnd = () => {\n if (isExiting) {\n onClose();\n }\n };\n\n return (\n <Element<ToastItemElementType>\n as=\"div\"\n data-toast-item\n id={id}\n classNames={isExiting ? [\"dismissed\"] : []}\n onTransitionEnd={handleTransitionEnd}\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n shadow=\"soft\"\n >\n {children}\n </Element>\n );\n};\nToastItem.displayName = \"ToastItem\";\n","// REACT CORE ==========================================================================================================\nimport React, { createContext, useContext, useState, useCallback, ReactNode } from \"react\";\n\n// INTERNAL ============================================================================================================\nimport { ToastsWrapper } from \"../ToastsWrapper/ToastsWrapper\";\nimport { ToastItem } from \"../ToastItem/ToastItem\";\n\n// TYPES ===============================================================================================================\ninterface InternalToast {\n id : string;\n message : string;\n duration : number;\n}\n\n// prettier-ignore\nexport interface ToastsProviderProps {\n children : ReactNode;\n anchor ? : \"top\" | \"bottom\";\n}\n\n// TOAST FUNCTION TYPE =================================================================================================\nexport type ToastFunction = (message: string, duration?: number) => void;\n\ninterface ToastsContextValue {\n toast: ToastFunction;\n}\n\n// CONTEXT =============================================================================================================\nconst ToastsContext = createContext<ToastsContextValue | null>(null);\n\n// PROVIDER ============================================================================================================\nexport const ToastsProvider = ({\n children,\n anchor = \"top\",\n}: ToastsProviderProps) => {\n const [toasts, setToasts] = useState<InternalToast[]>([]);\n\n // Remove a toast by ID\n const removeToast = useCallback((id: string) => {\n setToasts(prev => prev.filter(t => t.id !== id));\n }, []);\n\n // Main toast function\n const toast: ToastFunction = useCallback((message: string, duration: number = 4) => {\n const id = `toast-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n\n setToasts(prev => [...prev, {\n id,\n message,\n duration,\n }]);\n }, []);\n\n return (\n <ToastsContext.Provider value={{ toast }}>\n {children}\n\n <ToastsWrapper anchor={anchor}>\n {toasts.map(({ id, message, duration }) => (\n <ToastItem\n key={id}\n id={id}\n duration={duration}\n onClose={() => removeToast(id)}\n >\n {message}\n </ToastItem>\n ))}\n </ToastsWrapper>\n </ToastsContext.Provider>\n );\n};\nToastsProvider.displayName = \"ToastsProvider\";\n\n// HOOK ================================================================================================================\nexport const useToasts = (): ToastFunction => {\n const context = useContext(ToastsContext);\n\n if (!context) {\n throw new Error(\"useToasts must be used within a ToastsProvider\");\n }\n\n return context.toast;\n};\n","// REACT CORE ==========================================================================================================\nimport React, { useEffect, useRef, ReactNode } from \"react\";\nimport { createRoot, Root } from \"react-dom/client\";\n\n// STYLES ==============================================================================================================\nimport \"./tooltip.css\";\n\n// TYPES ===============================================================================================================\ntype Position = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype ShowOn = \"click\" | \"hover\";\n\ninterface TooltipConfig {\n content : ReactNode;\n position : Position;\n showOn : ShowOn;\n zIndex : number;\n}\n\nexport interface TooltipProps {\n children : ReactNode;\n isTooltipFor : string;\n showOn ? : ShowOn;\n position ? : Position;\n zIndex ? : number;\n}\n\n// CONSTANTS ===========================================================================================================\nconst TOOLTIP_OFFSET = 8;\nconst SCREEN_PADDING = 16;\n\n// MODULE-LEVEL SINGLETON ==============================================================================================\nlet singletonContainer : HTMLDivElement | null = null;\nlet singletonRoot : Root | null = null;\nlet isInitialized = false;\nlet activeTargetId : string | null = null;\nlet activeTarget : HTMLElement | null = null;\n\nconst registry = new Map<string, TooltipConfig>();\n\n// POSITIONING =========================================================================================================\nconst calculatePosition = (\n tooltipElement: HTMLElement,\n targetElement: HTMLElement,\n position: Position,\n) => {\n const tooltipRect = tooltipElement.getBoundingClientRect();\n const targetRect = targetElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n\n let top: number;\n let left: number;\n\n switch (position) {\n case \"top\":\n top = targetRect.top - tooltipRect.height - TOOLTIP_OFFSET;\n left = targetRect.left + (targetRect.width - tooltipRect.width) / 2;\n if (top < SCREEN_PADDING) {\n top = targetRect.bottom + TOOLTIP_OFFSET;\n }\n break;\n case \"bottom\":\n top = targetRect.bottom + TOOLTIP_OFFSET;\n left = targetRect.left + (targetRect.width - tooltipRect.width) / 2;\n if (top + tooltipRect.height > viewportHeight - SCREEN_PADDING) {\n top = targetRect.top - tooltipRect.height - TOOLTIP_OFFSET;\n }\n break;\n case \"left\":\n top = targetRect.top + (targetRect.height - tooltipRect.height) / 2;\n left = targetRect.left - tooltipRect.width - TOOLTIP_OFFSET;\n if (left < SCREEN_PADDING) {\n left = targetRect.right + TOOLTIP_OFFSET;\n }\n break;\n case \"right\":\n top = targetRect.top + (targetRect.height - tooltipRect.height) / 2;\n left = targetRect.right + TOOLTIP_OFFSET;\n if (left + tooltipRect.width > viewportWidth - SCREEN_PADDING) {\n left = targetRect.left - tooltipRect.width - TOOLTIP_OFFSET;\n }\n break;\n default:\n top = targetRect.top - tooltipRect.height - TOOLTIP_OFFSET;\n left = targetRect.left + (targetRect.width - tooltipRect.width) / 2;\n }\n\n // Ensure tooltip stays within viewport bounds\n if (left < SCREEN_PADDING) {\n left = SCREEN_PADDING;\n } else if (left + tooltipRect.width > viewportWidth - SCREEN_PADDING) {\n left = viewportWidth - tooltipRect.width - SCREEN_PADDING;\n }\n\n if (top < SCREEN_PADDING) {\n top = SCREEN_PADDING;\n } else if (top + tooltipRect.height > viewportHeight - SCREEN_PADDING) {\n top = viewportHeight - tooltipRect.height - SCREEN_PADDING;\n }\n\n return { top, left };\n};\n\n// TOOLTIP CONTENT COMPONENT ===========================================================================================\ninterface TooltipContentProps {\n content : ReactNode;\n isVisible : boolean;\n position : { top: number; left: number };\n zIndex : number;\n}\n\nconst TooltipContent = ({ content, isVisible, position, zIndex }: TooltipContentProps) => (\n <div\n data-tooltip\n className={isVisible ? \"visible\" : \"\"}\n role=\"tooltip\"\n style={{\n position : \"fixed\",\n zIndex : zIndex,\n top : `${position.top}px`,\n left : `${position.left}px`,\n }}\n >\n {content}\n </div>\n);\n\n// RENDER FUNCTIONS ====================================================================================================\nconst renderTooltip = (config: TooltipConfig | null, target: HTMLElement | null) => {\n if (!singletonRoot || !singletonContainer) return;\n\n if (!config || !target) {\n singletonRoot.render(\n <TooltipContent content={null} isVisible={false} position={{ top: -9999, left: -9999 }} zIndex={100000} />\n );\n return;\n }\n\n // First render hidden to measure\n singletonRoot.render(\n <TooltipContent content={config.content} isVisible={false} position={{ top: -9999, left: -9999 }} zIndex={config.zIndex} />\n );\n\n // Calculate position after render\n requestAnimationFrame(() => {\n if (!singletonContainer || !target) return;\n const tooltipEl = singletonContainer.firstElementChild as HTMLElement;\n if (!tooltipEl) return;\n\n const { top, left } = calculatePosition(tooltipEl, target, config.position);\n singletonRoot?.render(\n <TooltipContent content={config.content} isVisible={true} position={{ top, left }} zIndex={config.zIndex} />\n );\n });\n};\n\nconst updatePosition = () => {\n if (!activeTargetId || !activeTarget) return;\n const config = registry.get(activeTargetId);\n if (config) {\n renderTooltip(config, activeTarget);\n }\n};\n\nconst showTooltip = (targetId: string, target: HTMLElement) => {\n const config = registry.get(targetId);\n if (!config) return;\n\n activeTargetId = targetId;\n activeTarget = target;\n renderTooltip(config, target);\n};\n\nconst hideTooltip = (targetId?: string) => {\n if (targetId && activeTargetId !== targetId) return;\n activeTargetId = null;\n activeTarget = null;\n renderTooltip(null, null);\n};\n\n// EVENT HANDLERS ======================================================================================================\nconst handleMouseOver = (e: MouseEvent) => {\n const target = (e.target as HTMLElement).closest(\"[id]\") as HTMLElement;\n if (!target?.id) return;\n\n const config = registry.get(target.id);\n if (config?.showOn === \"hover\") {\n showTooltip(target.id, target);\n }\n};\n\nconst handleMouseOut = (e: MouseEvent) => {\n const target = (e.target as HTMLElement).closest(\"[id]\") as HTMLElement;\n if (!target?.id) return;\n\n const config = registry.get(target.id);\n if (config?.showOn === \"hover\") {\n hideTooltip(target.id);\n }\n};\n\nconst handleClick = (e: MouseEvent) => {\n // Check if click is inside the tooltip itself\n if (singletonContainer?.contains(e.target as Node)) {\n return;\n }\n\n const target = (e.target as HTMLElement).closest(\"[id]\") as HTMLElement;\n\n // Check if click is on a registered click-trigger element\n if (target?.id) {\n const config = registry.get(target.id);\n if (config?.showOn === \"click\") {\n if (activeTargetId === target.id) {\n hideTooltip();\n } else {\n showTooltip(target.id, target);\n }\n return;\n }\n }\n\n // Click outside - hide any active click tooltip\n if (activeTargetId) {\n const activeConfig = registry.get(activeTargetId);\n if (activeConfig?.showOn === \"click\") {\n hideTooltip();\n }\n }\n};\n\n// INITIALIZATION ======================================================================================================\nconst initializeSingleton = () => {\n if (typeof document === \"undefined\") return;\n\n // Check if container still exists in DOM (might be removed after navigation)\n const existingContainer = document.getElementById(\"fictoan-tooltip-singleton\");\n if (existingContainer && isInitialized) {\n singletonContainer = existingContainer as HTMLDivElement;\n return;\n }\n\n // Reset if container was removed or never created\n isInitialized = false;\n singletonContainer = null;\n singletonRoot = null;\n\n // Create container\n singletonContainer = document.createElement(\"div\");\n singletonContainer.id = \"fictoan-tooltip-singleton\";\n document.body.appendChild(singletonContainer);\n\n // Create React root\n singletonRoot = createRoot(singletonContainer);\n\n // Initial render (hidden)\n singletonRoot.render(\n <TooltipContent content={null} isVisible={false} position={{ top: -9999, left: -9999 }} zIndex={100000} />\n );\n\n // Set up event delegation\n document.addEventListener(\"mouseover\", handleMouseOver);\n document.addEventListener(\"mouseout\", handleMouseOut);\n document.addEventListener(\"click\", handleClick);\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n\n isInitialized = true;\n};\n\n// COMPONENT ===========================================================================================================\nexport const Tooltip = ({\n children,\n isTooltipFor,\n showOn = \"hover\",\n position = \"top\",\n zIndex = 100000,\n}: TooltipProps) => {\n const configRef = useRef<TooltipConfig>({ content: children, position, showOn, zIndex });\n\n // Update ref when props change\n configRef.current = { content: children, position, showOn, zIndex };\n\n useEffect(() => {\n // Initialize singleton on first mount\n initializeSingleton();\n\n // Register this tooltip\n registry.set(isTooltipFor, configRef.current);\n\n // If this tooltip is currently active, update its content\n if (activeTargetId === isTooltipFor && activeTarget) {\n renderTooltip(configRef.current, activeTarget);\n }\n\n return () => {\n registry.delete(isTooltipFor);\n // Hide if this was the active tooltip\n if (activeTargetId === isTooltipFor) {\n hideTooltip();\n }\n };\n }, [isTooltipFor]);\n\n // Update registry when content/position/showOn/zIndex changes\n useEffect(() => {\n registry.set(isTooltipFor, configRef.current);\n\n // If this tooltip is currently active, update it\n if (activeTargetId === isTooltipFor && activeTarget) {\n renderTooltip(configRef.current, activeTarget);\n }\n }, [children, position, showOn, zIndex, isTooltipFor]);\n\n // Renders nothing - the singleton renders the actual tooltip\n return null;\n};\n","// FRAMEWORK ===========================================================================================================\nimport React from \"react\";\n\n// FICTOAN =============================================================================================================\nimport { Element } from \"../Element\";\n\n// TYPES ===============================================================================================================\nimport { CommonAndHTMLProps, WeightTypes } from \"../Element/constants\";\n\n// prettier-ignore\ninterface HeadingBaseProps {\n as ? : \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n fontStyle ? : \"sans-serif\" | \"serif\" | \"monospace\";\n weight ? : WeightTypes;\n align ? : \"left\" | \"centre\" | \"center\" | \"right\";\n}\n\nexport type HeadingElementType = HTMLHeadingElement;\nexport type HeadingProps = Omit<CommonAndHTMLProps<HeadingElementType>, keyof HeadingBaseProps> & HeadingBaseProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst Heading = React.forwardRef(\n ({ fontStyle = \"sans-serif\", weight, align, ...props }: HeadingProps, ref: React.Ref<HeadingElementType>) => {\n let classNames = [];\n\n if (weight) {\n classNames.push(`weight-${weight}`);\n }\n\n if (fontStyle) {\n classNames.push(`font-${fontStyle}`);\n }\n\n if (align) {\n classNames.push(`text-${align}`);\n }\n\n return <Element<HeadingElementType> ref={ref} classNames={classNames} {...props} />;\n }\n);\n\nexport const Heading1 = React.forwardRef((props: HeadingProps, ref: React.Ref<HeadingElementType>) => (\n <Heading as=\"h1\" ref={ref} {...props} />\n));\nHeading1.displayName = \"Heading1\";\n\nexport const Heading2 = React.forwardRef((props: HeadingProps, ref: React.Ref<HeadingElementType>) => (\n <Heading as=\"h2\" ref={ref} {...props} />\n));\nHeading2.displayName = \"Heading2\";\n\nexport const Heading3 = React.forwardRef((props: HeadingProps, ref: React.Ref<HeadingElementType>) => (\n <Heading as=\"h3\" ref={ref} {...props} />\n));\nHeading3.displayName = \"Heading3\";\n\nexport const Heading4 = React.forwardRef((props: HeadingProps, ref: React.Ref<HeadingElementType>) => (\n <Heading as=\"h4\" ref={ref} {...props} />\n));\nHeading4.displayName = \"Heading4\";\n\nexport const Heading5 = React.forwardRef((props: HeadingProps, ref: React.Ref<HeadingElementType>) => (\n <Heading as=\"h5\" ref={ref} {...props} />\n));\nHeading5.displayName = \"Heading5\";\n\nexport const Heading6 = React.forwardRef((props: HeadingProps, ref: React.Ref<HeadingElementType>) => (\n <Heading as=\"h6\" ref={ref} {...props} />\n));\nHeading6.displayName = \"Heading6\";\n","// REACT CORE ==========================================================================================================\nimport React, { ReactNode } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./accordion.css\";\n\n// OTHER ===============================================================================================================\nimport { Text } from \"$/components\";\n\nexport interface AccordionCustomProps {\n isOpen ? : boolean;\n summary : ReactNode;\n children : ReactNode;\n}\n\nexport type AccordionElementType = HTMLDetailsElement;\nexport type AccordionProps =\n Omit<CommonAndHTMLProps<AccordionElementType>, keyof AccordionCustomProps>\n & AccordionCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Accordion = React.forwardRef(\n ({summary, children, isOpen = false, ...props} : AccordionProps, ref : React.Ref<AccordionElementType>) => {\n\n return (\n <Element\n as=\"details\"\n data-expandable-content\n ref={ref}\n {...props}\n open={isOpen}\n role=\"region\"\n aria-labelledby=\"accordion-summary\"\n >\n <summary\n role=\"button\"\n tabIndex={0}\n aria-controls=\"accordion-content\"\n aria-expanded={isOpen}\n >\n {typeof summary === \"string\" ? <Text margin=\"none\">{summary}</Text> : summary}\n </summary>\n {children}\n </Element>\n );\n },\n);\nAccordion.displayName = \"Accordion\";\n"],"names":["createClassName","classNames","item","Element","React","Component","role","ariaLabel","tabIndex","onKeyDown","props","ref","bgColor","bgColour","bgOpacity","borderColor","borderColour","borderOpacity","className","columns","fillColor","fillColour","gap","hideOnDesktop","hideOnMobile","hideOnTabletLandscape","hideOnTabletPortrait","horizontalMargin","horizontalPadding","horizontallyCenterThis","horizontallyCentreThis","isClickable","isFullHeight","isFullWidth","layoutAsFlexbox","layoutAsGrid","stackVertically","stackHorizontally","marginLeft","marginBottom","margin","marginRight","marginTop","opacity","paddingBottom","paddingLeft","padding","paddingRight","paddingTop","pushItemsToEnds","shadow","shape","showOnlyOnDesktop","showOnlyOnMobile","showOnlyOnTabletLandscape","showOnlyOnTabletPortrait","size","strokeColor","strokeColour","textColor","textColour","verticalMargin","verticalPadding","verticallyCenterItems","verticallyCentreItems","weight","style","minimalProps","_","__","sanitizedProps","computedStyle","jsx","createComponentWithElement","tagName","defaultProps","finalProps","external","Article","Aside","Body","Div","Footer","Header","Main","Nav","Section","Span","Hyperlink","ActionIcons","Badge","children","actionIcon","onActionClick","actionAriaLabel","handleActionClick","e","hasAction","jsxs","useClickOutside","handler","memoizedHandler","useCallback","useEffect","listener","event","Drawer","id","isOpen","onClose","position","isDismissible","showOverlay","blurOverlay","closeOnClickOutside","zIndex","label","description","drawerId","descriptionId","drawerRef","useRef","effectiveRef","drawerClasses","drawer","overlay","handleEscape","Fragment","Button","kind","variant","isLoading","ButtonGroup","isJoint","spacing","equaliseWidth","BreadcrumbItem","current","Separator","separator","Text","Breadcrumbs","childrenArray","processedChildren","acc","child","index","isLast","breadcrumbItem","typedChild","Callout","title","Card","heading","CodeBlock","source","language","showCopyButton","showLineNumbers","withSyntaxHighlighting","makeEditable","onChange","isCodeCopied","setIsCodeCopied","useState","prismModule","setPrismModule","setIsLoading","codeElement","setCodeElement","preRef","initialCode","Prism","error","_a","getCursorPosition","selection","range","currentNode","absoluteOffset","treeWalker","node","highlightCode","content","cursorPosition","highlighted","newRange","currentOffset","length","handleInput","element","copyToClipboard","textToCopy","err","handleKeyDown","lines","Divider","height","WRAPPER_PROP_KEYS","separateWrapperProps","wrapperProps","inputProps","key","InputLabel","hideLabel","htmlFor","fontStyle","align","isSubtext","ValidationIcon","state","FormItem","customLabel","helpText","errorText","validationState","required","labelFirst","hasLabel","hasInfoSection","Checkbox","name","checked","defaultChecked","disabled","derivedName","useMemo","handleChange","Switch","CheckboxGroup","options","value","defaultValue","equalizeWidth","selectedValues","setSelectedValues","optionValue","newValues","v","option","optionId","optionLabel","optionProps","finalId","isChecked","SwitchGroup","FileUpload","ariaInvalid","accept","allowMultipleFiles","capture","instructionMainText","instructionSubText","invalid","badgeBgColour","badgeTextColour","files","setFiles","isDragging","setIsDragging","fileInputRef","handleDragOver","handleDragLeave","handleDrop","droppedFiles","handleFiles","newFiles","prevFiles","fileToAdd","handleFileInput","selectedFiles","removeFile","indexToRemove","updatedFiles","openFileDialog","file","InputField","innerIconLeft","innerIconRight","innerTextLeft","innerTextRight","validateThis","valid","externalValidationState","onBlur","onFocus","type","placeholder","autoComplete","maxLength","minLength","pattern","readOnly","leftElementRef","rightElementRef","internalInputRef","touched","setTouched","internalValidationState","setInternalValidationState","mergeRefs","el","updateValidationState","input","handleBlur","handleFocus","updateWidth","pos","formItem","renderSideElement","elRef","isText","contentProps","isInteractive","hasLeftElement","hasRightElement","Portion","desktopSpan","mobileSpan","tabletLandscapeSpan","tabletPortraitSpan","isHorizontal","RadioButton","RadioGroup","Row","layout","gutters","retainLayoutOnTabletLandscape","retainLayoutOnTabletPortrait","retainLayoutOnMobile","retainLayoutAlways","allowUltraWide","groupLabel","Select","renderOption","renderOptGroup","group","getLimitState","limit","pluralise","count","singular","plural","TextArea","characterLimit","wordLimit","rows","cols","textareaRef","constructHelpText","limitsMessages","currentChars","limitState","excessChars","remaining","currentWords","excessWords","msg","i","setRefs","FormElements","getFormItem","formField","onFieldChange","elementName","formFieldProps","ElementComponent","generateFormThroughConfig","fields","formChildren","field","createElement","Form","onFieldsChange","handleFieldChange","fieldName","formContent","FormItemGroup","equalWidthForChildren","retainLayout","legend","groupId","levenshteinDistance","a","b","matrix","aLength","bLength","j","isSubsequence","search","target","searchIndex","targetIndex","generateAcronym","word","searchOptions","searchTerm","normalizedSearch","maxDistance","normalizedLabel","distance","words","searchWords","isPartialMatch","searchWord","acronym","isAcronymMatch","ListBox","selectionLimit","allowMultiSelect","allowCustomEntries","setIsOpen","searchValue","setSearchValue","activeIndex","setActiveIndex","selectedOption","setSelectedOption","selectedOptions","setSelectedOptions","openUpward","setOpenUpward","allOptions","dropdownRef","searchInputRef","dropdownMenuRef","listboxId","filteredOptions","handleSelectOption","newSelectedOptions","opt","handleSearchChange","handleCustomEntry","customValue","customOption","handleDeleteOption","valueToRemove","handleClearAll","prev","exactMatch","wrapperRect","viewportHeight","estimatedDropdownHeight","spaceBelow","spaceAbove","activeOption","validate","PinInputField","mask","isOTP","autoFocus","pasteFromClipboard","focusFirstInputOnReset","pinInputFieldRef","inputRefs","setInputRefs","values","setValues","moveFocus","setMoveFocus","focusedIndex","setFocusedIndex","inputGroupId","inputDescription","focus","focusNext","next","handleResetPinInput","setValue","nextValues","inputValue","handleInputChange","inputFieldIndex","currentValue","nextValue","chars","nextFocusIndex","newIndex","handleSelect","createRef","useImperativeHandle","RadioTabGroup","optionsWrapperRef","indicatorPos","setIndicatorPos","needsScroll","setNeedsScroll","scrollPosition","setScrollPosition","maxScroll","setMaxScroll","labelsRef","measureWidths","wrapper","inputWrapper","totalContentWidth","availableWidth","needsToScroll","observer","selectedIndex","updateIndicator","width","transform","timeoutId","handleScroll","direction","scrollAmount","newPosition","canScrollLeft","canScrollRight","isDualRangeProps","Range","DualThumbRange","SingleThumbRange","suffix","min","max","step","thumbRef","trackRef","isActive","setIsActive","clampedValue","getPercent","val","getValueFromPosition","clientX","rect","percent","rawValue","steppedValue","handleDrag","newValue","handleMouseDown","handleMouseMove","handleMouseUp","handleTouchStart","handleTouchMove","handleTouchEnd","minLabel","maxLabel","rawMinValue","rawMaxValue","minValue","maxValue","minThumbRef","maxThumbRef","activeThumb","setActiveThumb","thumb","clampedMin","clampedMax","minPercent","maxPercent","Meter","showOptimumMarker","low","high","optimum","optimumPositionPercent","getValueDescription","percentage","status","Modal","showBackdrop","blurBackdrop","modalId","modal","focusableElements","handleToggle","NotificationsWrapper","anchor","order","roleMap","NotificationItem","duration","isExiting","setIsExiting","timer","fallbackTimer","handleDismissClick","handleTransitionEnd","NotificationsContext","createContext","NotificationsProvider","notifications","setNotifications","removeNotification","n","addNotification","baseNotify","messageOrOptions","opts","notify","fn","message","useNotifications","context","useContext","Spinner","loadingText","start","end","usePagination","totalItems","currentPage","itemsToShowEachSide","totalPages","totalNumbers","pageNumbers","leftSideNumbers","rightSideNumbers","rangeStart","rangeEnd","defaultRenderItem","page","selected","onClick","paginationItemProps","Pagination","onPageChange","showGoToFirstItemButton","showGoToLastItemButton","showPreviousButton","showNextButton","showGoToInput","hideDisabledButtons","renderItem","emptyText","itemDisplayText","items","hasPrevPage","hasNextPage","goToPage","setGoToPage","handlePageInputChange","handlePageInputKeyPress","itemProps","ProgressBar","validValue","progressText","backgroundColour","progressFillColour","progressBarStyles","OptionCardsContext","OptionCardsGroup","allowMultipleSelections","showTickIcon","onSelectionChange","tickPosition","defaultSelectedIds","selectedIdsProp","isControlled","internalSelectedIds","setInternalSelectedIds","availableOptionsRef","selectedIds","updateSelectedIds","newIds","registerOption","unregisterOption","toggleSelection","newSelectedIds","selectAll","enabledOptions","optionsToSelect","selectNone","selectInverse","invertedSelection","isSelected","contextValue","useOptionCard","useOptionCardsGroup","OptionCard","showDeselect","setShowDeselect","isInitialHover","setIsInitialHover","handleMouseEnter","handleMouseLeave","handleClick","SidebarWrapper","collapsed","showMobileSidebar","forwardedRef","internalRef","ContentWrapper","SidebarHeader","isSticky","SidebarItem","hasAlert","hasEmptyIcon","hasNoIcon","SidebarFooter","SkeletonContext","Skeleton","localEffect","loadingLabel","groupContext","effectiveEffect","effectiveLabel","computedWidth","computedHeight","SkeletonGroup","effect","animate","repeat","groupClassNames","Table","bordersFor","isStriped","highlightRowOnHover","alignText","caption","summary","hasColSpan","rowCount","firstRow","rowProps","Tabs","tabs","additionalNavContentWrapper","defaultActiveTab","tab","defaultTabIndex","activeTab","setActiveTab","tabButtonRefs","handleTabChange","currentIndex","nextIndex","nextTab","getStorageKey","hostname","port","identifier","defaultContext","ThemeContext","useTheme","getTheme","fallback","theme","ThemeProvider","currentTheme","themeList","shouldRender","setShouldRender","themeState","setThemeState","setTheme","newTheme","fallbackTheme","ToastsWrapper","ToastItem","ToastsContext","ToastsProvider","toasts","setToasts","removeToast","t","toast","useToasts","TOOLTIP_OFFSET","SCREEN_PADDING","singletonContainer","singletonRoot","isInitialized","activeTargetId","activeTarget","registry","calculatePosition","tooltipElement","targetElement","tooltipRect","targetRect","viewportWidth","top","left","TooltipContent","isVisible","renderTooltip","config","tooltipEl","updatePosition","showTooltip","targetId","hideTooltip","handleMouseOver","handleMouseOut","activeConfig","initializeSingleton","existingContainer","createRoot","Tooltip","isTooltipFor","showOn","configRef","Heading","Heading1","Heading2","Heading3","Heading4","Heading5","Heading6","Accordion"],"mappings":"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"}
1
+ {"version":3,"file":"Accordion-DCCt5GHU.js","sources":["../src/utils/classNames.ts","../src/components/Element/Element.tsx","../src/components/Element/Tags.tsx","../src/components/Badge/Badge.tsx","../src/hooks/UseClickOutside.ts","../src/components/Drawer/Drawer.tsx","../src/components/Button/Button.tsx","../src/components/ButtonGroup/ButtonGroup.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/components/Callout/Callout.tsx","../src/components/Card/Card.tsx","../src/components/CodeBlock/CodeBlock.tsx","../src/components/Divider/Divider.tsx","../src/utils/propSeparation.ts","../src/components/Form/InputLabel/InputLabel.tsx","../src/components/Typography/Text.tsx","../src/components/Form/FormItem/FormItem.tsx","../src/components/Form/Checkbox/Checkbox.tsx","../src/components/Form/Checkbox/Switch.tsx","../src/components/Form/Checkbox/CheckboxAndSwitchGroup.tsx","../src/components/Form/FileUpload/FileUpload.tsx","../src/components/Form/InputField/InputField.tsx","../src/components/Portion/Portion.tsx","../src/components/Form/RadioButton/RadioButton.tsx","../src/components/Form/RadioButton/RadioGroup.tsx","../src/components/Row/Row.tsx","../src/components/Form/Select/Select.tsx","../src/components/Form/TextArea/TextArea.tsx","../src/components/Form/Form/FormGenerator.tsx","../src/components/Form/Form/Form.tsx","../src/components/Form/FormItemGroup/FormItemGroup.tsx","../src/components/Form/ListBox/listBoxUtils.ts","../src/components/Form/ListBox/ListBox.tsx","../src/components/Form/PinInputField/PinInputField.tsx","../src/components/Form/RadioButton/RadioTabGroup.tsx","../src/components/Form/Range/Range.tsx","../src/components/Meter/Meter.tsx","../src/components/Modal/Modal.tsx","../src/components/Notification/NotificationsWrapper/NotificationsWrapper.tsx","../src/components/Notification/NotificationItem/NotificationItem.tsx","../src/components/Notification/NotificationsProvider/NotificationsProvider.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Pagination/usePagination.ts","../src/components/Pagination/Pagination.tsx","../src/components/ProgressBar/ProgressBar.tsx","../src/components/OptionCard/OptionCard.tsx","../src/components/Sidebar/SidebarWrapper/SidebarWrapper.tsx","../src/components/Sidebar/ContentWrapper/ContentWrapper.tsx","../src/components/Sidebar/SidebarHeader/SidebarHeader.tsx","../src/components/Sidebar/SidebarItem/SidebarItem.tsx","../src/components/Sidebar/SidebarFooter/SidebarFooter.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Table/Table.tsx","../src/components/Tabs/Tabs.tsx","../src/components/ThemeProvider/ThemeProvider.tsx","../src/components/Toast/ToastsWrapper/ToastsWrapper.tsx","../src/components/Toast/ToastItem/ToastItem.tsx","../src/components/Toast/ToastsProvider/ToastsProvider.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Typography/Heading.tsx","../src/components/Accordion/Accordion.tsx"],"sourcesContent":["export const createClassName = (classNames: any[]): string => {\n return classNames.filter((item) => !!item).join(\" \");\n};\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// UTILS ===============================================================================================================\nimport { createClassName } from \"$utils/classNames\";\n\n// OTHER ===============================================================================================================\nimport { ElementProps } from \"./constants\";\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Element = React.forwardRef(\n <K extends {}>(\n {\n as : Component = \"div\",\n role,\n ariaLabel,\n tabIndex,\n onKeyDown,\n ...props\n }: ElementProps<K> & {\n role ? : string;\n ariaLabel ? : string;\n tabIndex ? : number;\n onKeyDown ? : (event: React.KeyboardEvent) => void;\n }, ref: React.LegacyRef<HTMLElement>\n ) => {\n const {\n classNames = [],\n bgColor,\n bgColour,\n bgOpacity,\n borderColor,\n borderColour,\n borderOpacity,\n className,\n columns,\n fillColor,\n fillColour,\n gap,\n hideOnDesktop,\n hideOnMobile,\n hideOnTabletLandscape,\n hideOnTabletPortrait,\n horizontalMargin,\n horizontalPadding,\n horizontallyCenterThis,\n horizontallyCentreThis,\n isClickable,\n isFullHeight,\n isFullWidth,\n layoutAsFlexbox,\n layoutAsGrid,\n stackVertically,\n stackHorizontally,\n marginLeft,\n marginBottom,\n margin,\n marginRight,\n marginTop,\n opacity,\n paddingBottom,\n paddingLeft,\n padding,\n paddingRight,\n paddingTop,\n pushItemsToEnds,\n shadow,\n shape,\n showOnlyOnDesktop,\n showOnlyOnMobile,\n showOnlyOnTabletLandscape,\n showOnlyOnTabletPortrait,\n size,\n strokeColor,\n strokeColour,\n textColor,\n textColour,\n verticalMargin,\n verticalPadding,\n verticallyCenterItems,\n verticallyCentreItems,\n weight,\n style,\n ...minimalProps\n } = props;\n\n const {className : _, classNames : __, ...sanitizedProps} = props;\n\n // Build style object with opacity CSS custom properties\n const computedStyle = {\n ...style,\n ...(bgOpacity && { \"--bg-opacity\": Number(bgOpacity) / 100 }),\n ...(borderOpacity && { \"--border-opacity\": Number(borderOpacity) / 100 }),\n } as React.CSSProperties;\n\n return (\n <Component\n ref={ref}\n role={role}\n aria-label={ariaLabel}\n tabIndex={tabIndex}\n onKeyDown={onKeyDown}\n {...minimalProps}\n style={Object.keys(computedStyle).length > 0 ? computedStyle : undefined}\n className={createClassName(\n [\n className,\n bgColor && `bg-${bgColor}`,\n bgColour && `bg-${bgColour}`,\n borderColor && `border-${borderColor}`,\n borderColour && `border-${borderColour}`,\n fillColor && `fill-${fillColor}`,\n fillColour && `fill-${fillColour}`,\n hideOnDesktop && \"hide-on-desktop\",\n hideOnMobile && \"hide-on-mobile\",\n hideOnTabletLandscape && \"hide-on-tablet-landscape\",\n hideOnTabletPortrait && \"hide-on-tablet-portrait\",\n horizontalMargin && `margin-right-${horizontalMargin} margin-left-${horizontalMargin}`,\n horizontalPadding && `padding-right-${horizontalPadding} padding-left-${horizontalPadding}`,\n horizontallyCenterThis && \"horizontally-centre-this\",\n horizontallyCentreThis && \"horizontally-centre-this\",\n isClickable && \"is-clickable\",\n isFullHeight && \"full-height\",\n isFullWidth && \"full-width\",\n layoutAsFlexbox && \"layout-flexbox\",\n layoutAsGrid && \"layout-grid\",\n stackVertically && \"stack-vertically\",\n stackHorizontally && \"stack-horizontally\",\n gap && `gap-${gap}`,\n marginLeft && `margin-left-${marginLeft}`,\n marginBottom && `margin-bottom-${marginBottom}`,\n margin && `margin-all-${margin}`,\n marginRight && `margin-right-${marginRight}`,\n marginTop && `margin-top-${marginTop}`,\n opacity && `opacity-${opacity}`,\n paddingBottom && `padding-bottom-${paddingBottom}`,\n paddingLeft && `padding-left-${paddingLeft}`,\n padding && `padding-all-${padding}`,\n paddingRight && `padding-right-${paddingRight}`,\n paddingTop && `padding-top-${paddingTop}`,\n pushItemsToEnds && \"push-to-ends\",\n shadow && `shadow-${shadow}`,\n shape && `shape-${shape}`,\n showOnlyOnDesktop && \"show-only-on-desktop\",\n showOnlyOnMobile && \"show-only-on-mobile\",\n showOnlyOnTabletLandscape && \"show-only-on-tablet-landscape\",\n showOnlyOnTabletPortrait && \"show-only-on-tablet-portrait\",\n size && `size-${size}`,\n strokeColor && `stroke-${strokeColor}`,\n strokeColour && `stroke-${strokeColour}`,\n textColor && `text-${textColor}`,\n textColour && `text-${textColour}`,\n verticalMargin && `margin-top-${verticalMargin} margin-bottom-${verticalMargin}`,\n verticalPadding && `padding-top-${verticalPadding} padding-bottom-${verticalPadding}`,\n verticallyCenterItems && \"vertically-centre-items\",\n verticallyCentreItems && \"vertically-centre-items\",\n weight && `weight-${weight}`,\n ].concat(classNames),\n )}\n />\n );\n },\n) as <K extends {}>(props : ElementProps<K> & { ref? : React.LegacyRef<HTMLElement> }) => React.ReactElement;\n(Element as any).displayName = \"Element\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"./Element\";\nimport { ElementProps } from \"./constants\";\n\ninterface HyperlinkCustomProps {\n href : string;\n target ? : \"_blank\" | \"_self\" | \"_parent\" | \"_top\";\n rel ? : string;\n isExternal ? : boolean;\n}\n\n// Helper type for components that might have custom props\ntype CustomProps<T extends React.ElementType, P = {}> = ElementProps<{}> &\n React.HTMLAttributes<HTMLElement> & P;\n\nconst createComponentWithElement = <T extends React.ElementType, P = {}>(\n tagName : T,\n defaultProps? : Partial<P>,\n) => {\n return React.forwardRef<HTMLElement, CustomProps<T, P>>(\n (props, ref) => {\n // Merge default props with provided props\n const finalProps = {...defaultProps, ...props};\n\n // Handle external links for Hyperlink component\n if (tagName === \"a\" && \"external\" in finalProps) {\n const {external, ...restProps} = finalProps;\n if (external) {\n finalProps.target = \"_blank\";\n finalProps.rel = \"noopener noreferrer\";\n }\n }\n\n return <Element as={tagName} ref={ref} {...finalProps} />;\n },\n );\n};\n\nexport const Article = createComponentWithElement(\"article\");\nexport const Aside = createComponentWithElement(\"aside\");\nexport const Body = createComponentWithElement(\"body\");\nexport const Div = createComponentWithElement(\"div\");\nexport const Footer = createComponentWithElement(\"footer\");\nexport const Header = createComponentWithElement(\"header\");\nexport const Main = createComponentWithElement(\"main\");\nexport const Nav = createComponentWithElement(\"nav\");\nexport const Section = createComponentWithElement(\"section\");\nexport const Span = createComponentWithElement(\"span\");\nexport const Hyperlink = createComponentWithElement<\"a\", HyperlinkCustomProps>(\"a\", {\n rel : \"noopener noreferrer\", // Default props for Hyperlink\n});\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, ShapeTypes, SpacingTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./badge.css\";\n\nexport type BadgeActionIconType = \"cross\" | \"tick\" | \"plus\" | \"minus\";\n\nexport interface BadgeCustomProps {\n size ? : SpacingTypes;\n shape ? : ShapeTypes;\n actionIcon ? : BadgeActionIconType;\n onActionClick ? : (event : React.MouseEvent<HTMLButtonElement>) => void;\n actionAriaLabel ? : string;\n}\n\nexport type BadgeElementType = HTMLDivElement;\nexport type BadgeProps = Omit<CommonAndHTMLProps<BadgeElementType>, keyof BadgeCustomProps> & BadgeCustomProps;\n\n// ICONS ///////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst ActionIcons : Record<BadgeActionIconType, React.ReactNode> = {\n cross : (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n ),\n tick : (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M5 12l5 5L20 7\" />\n </svg>\n ),\n plus : (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n ),\n minus : (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M5 12h14\" />\n </svg>\n ),\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Badge = React.forwardRef(\n ({\n children,\n size = \"medium\",\n shape,\n actionIcon,\n onActionClick,\n actionAriaLabel,\n ...props\n } : BadgeProps, ref : React.Ref<BadgeElementType>) => {\n let classNames = [];\n\n if (size) {\n classNames.push(`size-${size}`);\n }\n\n if (shape) {\n classNames.push(`shape-${shape}`);\n }\n\n const handleActionClick = (e : React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n onActionClick?.(e);\n };\n\n const hasAction = Boolean(actionIcon);\n\n return (\n <Element<BadgeElementType>\n data-badge\n data-has-action={hasAction || undefined}\n ref={ref}\n classNames={classNames}\n role=\"status\"\n aria-label={(typeof children === \"string\" ? children : undefined)}\n {...props}\n >\n {children}\n\n {hasAction && (\n <button\n type=\"button\"\n className=\"badge-action-button\"\n onClick={handleActionClick}\n aria-label={actionAriaLabel}\n >\n {ActionIcons[actionIcon!]}\n </button>\n )}\n </Element>\n );\n },\n);\nBadge.displayName = \"Badge\";\n","import { RefObject, useCallback, useEffect } from \"react\";\n\nexport const useClickOutside = <T extends HTMLElement = HTMLElement>(\n ref : RefObject<T | null>, handler : (e : Event) => void) => {\n const memoizedHandler = useCallback(handler, [handler]);\n\n useEffect(() => {\n const listener = (event : Event) => {\n // Skip processing if ref doesn't exist or handler is a no-op function\n if (!ref.current || typeof memoizedHandler !== \"function\") {\n return;\n }\n\n // Only call handler if click is outside the referenced element\n if (!ref.current.contains(event.target as Node)) {\n memoizedHandler(event);\n }\n };\n\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n };\n }, [ref, memoizedHandler]);\n};\n","// REACT CORE ==========================================================================================================\nimport React, { useEffect, useRef } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, SpacingTypes } from \"../Element/constants\";\nimport { Div } from \"$tags\";\nimport { Element } from \"$element\";\n\n// HOOKS ===============================================================================================================\nimport { useClickOutside } from \"$hooks/UseClickOutside\";\n\n// STYLES ==============================================================================================================\nimport \"./drawer.css\";\n\nexport interface DrawerCustomProps {\n id : string;\n isOpen ? : boolean;\n onClose ? : () => void;\n position ? : \"top\" | \"right\" | \"bottom\" | \"left\";\n size ? : SpacingTypes;\n isDismissible ? : boolean;\n showOverlay ? : boolean;\n blurOverlay ? : boolean;\n closeOnClickOutside ? : boolean;\n label ? : string;\n description ? : string;\n zIndex ? : number;\n}\n\nexport type DrawerElementType = HTMLDivElement;\nexport type DrawerProps = Omit<CommonAndHTMLProps<DrawerElementType>, keyof DrawerCustomProps> & DrawerCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Drawer = React.forwardRef(\n (\n {\n id,\n children,\n isOpen = false,\n onClose,\n position = \"right\",\n size = \"medium\",\n padding = \"micro\",\n bgColor,\n bgColour,\n isDismissible = true,\n showOverlay = true,\n blurOverlay = false,\n closeOnClickOutside = true,\n zIndex,\n label,\n description,\n classNames = [],\n ...props\n } : DrawerProps,\n ref : React.Ref<DrawerElementType>,\n ) => {\n const drawerId = `${id}`;\n const descriptionId = description ? `${drawerId}-description` : undefined;\n const drawerRef = useRef<HTMLDivElement>(null);\n const effectiveRef = (ref || drawerRef) as React.RefObject<HTMLDivElement>;\n\n // Build class names\n const drawerClasses : string[] = [\n \"drawer\",\n position,\n size,\n ...(isOpen ? [ \"open\" ] : []),\n ...(showOverlay ? [ \"with-overlay\" ] : []),\n ...(blurOverlay ? [ \"blur-overlay\" ] : []),\n ...classNames,\n ];\n\n // Handle open/close state declaratively\n useEffect(() => {\n const drawer = effectiveRef.current;\n const overlay = document.querySelector(`[data-drawer-overlay-for=\"${drawerId}\"]`) as HTMLElement;\n\n if (isOpen) {\n // Show drawer\n drawer?.classList.add(\"open\");\n drawer?.classList.remove(\"closing\");\n drawer?.focus();\n\n // Show overlay\n if (overlay) {\n overlay.classList.add(\"visible\");\n }\n\n // Prevent body scroll\n document.body.style.overflow = \"hidden\";\n } else {\n // Hide drawer\n if (drawer?.classList.contains(\"open\")) {\n drawer.classList.add(\"closing\");\n drawer.classList.remove(\"open\");\n\n // Hide overlay\n if (overlay) {\n overlay.classList.remove(\"visible\");\n }\n\n // Restore body scroll\n document.body.style.overflow = \"\";\n }\n }\n\n // Cleanup on unmount\n return () => {\n document.body.style.overflow = \"\";\n };\n }, [ isOpen, drawerId, effectiveRef ]);\n\n // Handle Escape key\n useEffect(() => {\n const handleEscape = (e : KeyboardEvent) => {\n if (e.key === \"Escape\" && isDismissible && isOpen && onClose) {\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [ isDismissible, isOpen, onClose ]);\n\n // Handle click outside\n useClickOutside(effectiveRef, () => {\n if (closeOnClickOutside && isDismissible && isOpen && onClose) {\n onClose();\n }\n });\n\n // Handle animation end\n const handleAnimationEnd = (e : React.AnimationEvent) => {\n if (e.animationName.includes(\"slide-out\") || e.animationName.includes(\"fade-out\")) {\n e.currentTarget.classList.remove(\"closing\");\n }\n };\n\n return (\n <>\n {/* OVERLAY */}\n {showOverlay && (\n <Div\n className={`drawer-overlay ${blurOverlay ? \"blur\" : \"\"} ${isOpen ? \"visible\" : \"\"}`}\n data-drawer-overlay-for={id}\n aria-hidden=\"true\"\n onClick={closeOnClickOutside && isDismissible && onClose ? onClose : undefined}\n style={{zIndex : zIndex ?? 10000 - 1}}\n />\n )}\n\n {/* DRAWER */}\n <Element<DrawerElementType>\n as=\"div\"\n id={drawerId}\n data-drawer\n ref={effectiveRef}\n classNames={drawerClasses}\n onAnimationEnd={handleAnimationEnd}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={label || \"Drawer\"}\n aria-describedby={descriptionId}\n tabIndex={-1}\n style={{zIndex : zIndex ?? 10000}}\n {...props}\n >\n {/* DISMISS BUTTON */}\n {isDismissible && onClose && (\n <button\n className=\"drawer-dismiss-button\"\n onClick={onClose}\n aria-label=\"Close drawer\"\n tabIndex={0}\n >\n &times;\n </button>\n )}\n\n <Div\n className=\"drawer-content\"\n role=\"document\"\n padding={padding}\n bgColor={bgColor}\n bgColour={bgColour}\n >\n {/* SR-ONLY DESCRIPTION */}\n {description && (\n <div id={descriptionId} className=\"sr-only\">\n {description}\n </div>\n )}\n\n {children}\n </Div>\n </Element>\n </>\n );\n },\n);\nDrawer.displayName = \"Drawer\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, EmphasisTypes, ShapeTypes, SpacingTypes, ButtonVariantTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./Button.css\";\n\n// prettier-ignore\nexport interface ButtonCustomProps {\n kind ? : EmphasisTypes;\n variant ? : ButtonVariantTypes;\n size ? : SpacingTypes;\n shape ? : ShapeTypes;\n isLoading ? : boolean;\n label ? : string;\n}\n\nexport type ButtonElementType = HTMLButtonElement;\nexport type ButtonProps = Omit<CommonAndHTMLProps<ButtonElementType>, keyof ButtonCustomProps> & ButtonCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Button = React.forwardRef(\n ({size = \"medium\", shape, kind, variant, isLoading, label, ...props} : ButtonProps, ref : React.Ref<ButtonElementType>) => {\n let classNames = [];\n\n if (kind) {\n classNames.push(kind);\n }\n\n if (variant) {\n classNames.push(variant);\n }\n\n if (size) {\n classNames.push(`size-${size}`);\n }\n\n if (shape) {\n classNames.push(`shape-${shape}`);\n }\n\n if (isLoading) {\n classNames.push(\"is-loading\");\n }\n\n return (\n <Element<ButtonElementType>\n as=\"button\"\n data-button\n ref={ref}\n classNames={classNames}\n aria-label={label}\n aria-disabled={props.disabled || isLoading}\n aria-busy={isLoading}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, SpacingTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./button-group.css\";\n\n// prettier-ignore\nexport interface ButtonGroupCustomProps {\n isJoint ? : boolean;\n spacing ? : SpacingTypes;\n equaliseWidth ? : boolean;\n}\n\nexport type ButtonGroupElementType = HTMLDivElement;\nexport type ButtonGroupProps = Omit<CommonAndHTMLProps<ButtonGroupElementType>, keyof ButtonGroupCustomProps> &\n ButtonGroupCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const ButtonGroup = React.forwardRef(\n (\n {isJoint = true, spacing, equaliseWidth, children, ...props} : ButtonGroupProps,\n ref : React.Ref<ButtonGroupElementType>,\n ) => {\n let classNames : string[] = [];\n\n if (isJoint) {\n classNames.push(\"is-joint\");\n }\n\n if (spacing && !isJoint) {\n classNames.push(`spacing-${spacing}`);\n }\n\n if (equaliseWidth) {\n classNames.push(\"equal-width\");\n }\n\n return (\n <Element<ButtonGroupElementType>\n as=\"div\"\n data-button-group\n ref={ref}\n role=\"group\"\n classNames={classNames}\n {...props}\n >\n {children}\n </Element>\n );\n },\n);\n\nButtonGroup.displayName = \"ButtonGroup\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, SpacingTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./breadcrumbs.css\";\n\n// OTHER ===============================================================================================================\nimport { Text } from \"$/components\";\n\nexport type BreadcrumbsElementType = HTMLDivElement;\n\nexport interface BreadcrumbsProps extends CommonAndHTMLProps<BreadcrumbsElementType> {\n children : React.ReactNode;\n separator ? : string;\n spacing ? : SpacingTypes;\n}\n\nexport type BreadcrumbItemElementType = HTMLLIElement;\n\nexport interface BreadcrumbItemProps extends CommonAndHTMLProps<BreadcrumbItemElementType> {\n children : React.ReactNode;\n current ? : boolean;\n}\n\ninterface SeparatorProps {\n separator : string;\n}\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst BreadcrumbItem = React.forwardRef<HTMLLIElement, BreadcrumbItemProps>(\n ({children, current, ...props}, ref) => {\n return (\n <Element\n as=\"li\"\n data-breadcrumb-item\n ref={ref}\n {...props}\n aria-current={current ? \"page\" : undefined}\n className={current ? \"current\" : undefined}\n role=\"listitem\"\n >\n <span className=\"breadcrumb-content\">\n {children}\n </span>\n </Element>\n );\n },\n);\n\nconst Separator : React.FC<SeparatorProps> = ({separator}) => (\n <Text\n className=\"breadcrumb-separator\"\n aria-hidden=\"true\"\n role=\"presentation\"\n margin=\"none\"\n >\n {separator}\n </Text>\n);\n\nexport const Breadcrumbs = React.forwardRef<HTMLDivElement, BreadcrumbsProps>(\n ({children, separator = \"/\", spacing = \"micro\", ...props}, ref) => {\n let classNames = [];\n\n if (spacing) {\n classNames.push(`spacing-${spacing}`);\n }\n\n const childrenArray = React.Children.toArray(children).filter(Boolean);\n\n const processedChildren = childrenArray.reduce<React.ReactNode[]>((acc, child, index) => {\n if (!React.isValidElement(child)) return acc;\n\n const isLast = index === childrenArray.length - 1;\n\n let breadcrumbItem : React.ReactNode;\n if (child.type === BreadcrumbItem) {\n const typedChild = child as React.ReactElement<BreadcrumbItemProps>;\n breadcrumbItem = React.cloneElement(typedChild, {\n current : isLast,\n });\n } else {\n breadcrumbItem = (\n <BreadcrumbItem key={`item-${index}`} current={isLast}>\n {child}\n </BreadcrumbItem>\n );\n }\n\n acc.push(breadcrumbItem);\n\n if (!isLast) {\n acc.push(\n <Separator key={`sep-${index}`} separator={separator} />,\n );\n }\n\n return acc;\n }, []);\n\n return (\n <nav aria-label=\"Breadcrumb\" ref={ref} {...props}>\n <Element\n as=\"ul\"\n data-breadcrumbs-wrapper\n role=\"list\"\n classNames={classNames}\n >\n {processedChildren}\n </Element>\n </nav>\n );\n },\n);\nBreadcrumbs.displayName = \"Breadcrumbs\";\n","// REACT CORE ==========================================================================================================\nimport React, { ReactNode } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./callout.css\";\n\n// prettier-ignore\nexport interface CalloutCustomProps {\n kind : \"info\" | \"success\" | \"warning\" | \"error\";\n children : ReactNode;\n title ? : string;\n}\n\nexport type CalloutElementType = HTMLDivElement;\nexport type CalloutProps = Omit<CommonAndHTMLProps<CalloutElementType>, keyof CalloutCustomProps> & CalloutCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Callout = React.forwardRef(\n ({kind, children, title, ...props} : CalloutProps, ref : React.Ref<CalloutElementType>) => {\n const roleMap = {\n info : \"status\",\n success : \"status\",\n warning : \"alert\",\n error : \"alert\",\n };\n\n return (\n <Element<CalloutElementType>\n as=\"div\"\n data-callout\n ref={ref}\n className={kind}\n role={roleMap[kind]}\n aria-live={kind === \"error\" || kind === \"warning\" ? \"assertive\" : \"polite\"}\n aria-label={title}\n {...props}\n >\n {children}\n </Element>\n );\n },\n);\nCallout.displayName = \"Callout\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./card.css\";\n\nexport type CardElementType = HTMLDivElement;\n\nexport interface CardCustomProps {\n heading ? : string;\n}\n\nexport type CardProps = CommonAndHTMLProps<CardElementType> & CardCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Card = React.forwardRef((\n {shape, heading, children, ...props} : CardProps, ref : React.Ref<CardElementType>) => {\n let classNames = [];\n\n if (shape) {\n classNames.push(`shape-${shape}`);\n }\n\n return (\n <Element<CardElementType>\n as=\"div\"\n data-card\n ref={ref}\n classNames={classNames}\n role=\"region\"\n aria-label={heading}\n tabIndex={0}\n {...props}\n >\n {children}\n </Element>\n );\n});\nCard.displayName = \"Card\";\n","// REACT CORE ==========================================================================================================\nimport React, { useState, useEffect, useRef, useCallback } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./CodeBlock.css\";\n\n// OTHER ===============================================================================================================\nimport { Badge } from \"$/components\";\nimport { Button } from \"$/components\";\n\ninterface PrismType {\n languages : { [key : string] : any };\n highlight : (\n code : string,\n grammar : any,\n language : string\n ) => string;\n}\n\nexport interface CodeBlockCustomProps {\n source ? : object | string;\n language ? : string;\n showCopyButton ? : boolean;\n showLineNumbers ? : boolean;\n description ? : string;\n withSyntaxHighlighting ? : boolean;\n makeEditable ? : boolean;\n onChange ? : (content : string) => void;\n}\n\nexport type CodeBlockElementType = HTMLPreElement;\nexport type CodeBlockProps = Omit<CommonAndHTMLProps<CodeBlockElementType>,\n keyof CodeBlockCustomProps> & CodeBlockCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const CodeBlock = React.forwardRef((\n {\n children,\n source,\n language = \"json\",\n showCopyButton,\n showLineNumbers,\n description,\n withSyntaxHighlighting = false,\n makeEditable = false,\n onChange,\n shadow,\n ...props\n } : CodeBlockProps,\n ref : React.Ref<CodeBlockElementType>,\n) => {\n const [ isCodeCopied, setIsCodeCopied ] = useState(false);\n const [ prismModule, setPrismModule ] = useState<PrismType | null>(null);\n const [ isLoading, setIsLoading ] = useState(withSyntaxHighlighting);\n const [ codeElement, setCodeElement ] = useState<HTMLElement | null>(null);\n\n const preRef = useRef<HTMLPreElement>(null);\n\n // Determine the code content from either children or source prop\n let initialCode = typeof children === \"string\"\n ? children\n : React.Children.toArray(children).join(\"\");\n\n if (!children) {\n initialCode = typeof source === \"object\"\n ? JSON.stringify(source, null, 2)\n : source ?? \"\";\n }\n\n // Dynamically load Prism and language support when syntax highlighting is enabled\n useEffect(() => {\n if (!withSyntaxHighlighting) return;\n\n const loadPrismWithLanguage = async () => {\n setIsLoading(true);\n try {\n // Load Prism core FIRST and ensure it's globally available\n const prism = await import(\"prismjs\");\n const Prism = prism.default;\n\n // Ensure Prism is available globally for language plugins\n if (typeof window !== \"undefined\" && !(window as any).Prism) {\n (window as any).Prism = Prism;\n }\n\n // NOW load the language module - it needs Prism to be global\n if (language !== \"plain\" && !Prism.languages[language]) {\n try {\n await import(`prismjs/components/prism-${language}`);\n } catch (langError) {\n console.warn(`Language \"${language}\" not available, falling back to plain text`);\n }\n }\n\n setPrismModule(Prism);\n } catch (error : any) {\n // Check if it's a \"module not found\" error (prismjs not installed)\n if (error?.code === \"ERR_MODULE_NOT_FOUND\" || error?.message?.includes(\"Cannot find module\")) {\n console.warn(\n \"PrismJS is not installed. To enable syntax highlighting, run: npm install prismjs\",\n );\n } else {\n console.warn(`Failed to load syntax highlighting for ${language}:`, error);\n }\n } finally {\n setIsLoading(false);\n }\n };\n\n loadPrismWithLanguage();\n }, [ withSyntaxHighlighting, language ]);\n\n // Get the current cursor position in the editable content\n const getCursorPosition = useCallback(() => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return null;\n\n const range = selection.getRangeAt(0);\n const currentNode = range.startContainer;\n const cursorOffset = range.startOffset;\n\n // Calculate absolute cursor position by walking the DOM tree\n let absoluteOffset = cursorOffset;\n if (currentNode && currentNode !== codeElement && codeElement) {\n const treeWalker = document.createTreeWalker(\n codeElement,\n NodeFilter.SHOW_TEXT,\n null,\n );\n let node;\n while ((node = treeWalker.nextNode())) {\n if (node === currentNode) break;\n absoluteOffset += node.textContent?.length || 0;\n }\n }\n\n return absoluteOffset;\n }, [ codeElement ]);\n\n // Apply syntax highlighting while preserving cursor position in editable mode\n const highlightCode = useCallback((content : string) => {\n if (!codeElement || !withSyntaxHighlighting || !prismModule) return;\n\n try {\n // Store cursor position before modifying content\n const cursorPosition = makeEditable ? getCursorPosition() : null;\n\n // Apply Prism highlighting\n const highlighted = prismModule.highlight(\n content,\n prismModule.languages[language] || prismModule.languages.plain,\n language,\n );\n codeElement.innerHTML = highlighted;\n\n // Restore cursor position for editable content\n if (makeEditable && cursorPosition !== null) {\n const selection = window.getSelection();\n const newRange = document.createRange();\n const treeWalker = document.createTreeWalker(\n codeElement,\n NodeFilter.SHOW_TEXT,\n null,\n );\n\n // Walk through text nodes to find correct cursor position\n let currentOffset = 0;\n let node;\n while ((node = treeWalker.nextNode())) {\n const length = node.textContent?.length || 0;\n if (currentOffset + length >= cursorPosition) {\n newRange.setStart(node, cursorPosition - currentOffset);\n newRange.setEnd(node, cursorPosition - currentOffset);\n selection?.removeAllRanges();\n selection?.addRange(newRange);\n break;\n }\n currentOffset += length;\n }\n }\n } catch (error) {\n console.warn(\"Error highlighting code:\", error);\n if (codeElement) {\n codeElement.textContent = content;\n }\n }\n }, [ language, withSyntaxHighlighting, makeEditable, prismModule, getCursorPosition, codeElement ]);\n\n // Handle content changes in editable mode\n const handleInput = useCallback((event : Event) => {\n if (!codeElement) return;\n\n const content = codeElement.textContent || \"\";\n onChange?.(content);\n\n // Defer highlighting to next frame to ensure content is updated\n requestAnimationFrame(() => {\n highlightCode(content);\n });\n }, [ highlightCode, onChange, codeElement ]);\n\n // Setup input handler for editable content\n useEffect(() => {\n const element = codeElement;\n if (!element || !makeEditable) return;\n\n element.addEventListener(\"input\", handleInput);\n return () => {\n element.removeEventListener(\"input\", handleInput);\n };\n }, [ makeEditable, handleInput, codeElement ]);\n\n // Initial highlighting when component loads\n useEffect(() => {\n if (!codeElement || !prismModule) return;\n highlightCode(initialCode);\n }, [ highlightCode, initialCode, prismModule, codeElement ]);\n\n const copyToClipboard = async () => {\n try {\n const textToCopy = codeElement ? codeElement.textContent || \"\" : initialCode;\n await navigator.clipboard.writeText(textToCopy);\n setIsCodeCopied(true);\n setTimeout(() => setIsCodeCopied(false), 3000);\n } catch (err) {\n console.error(\"Could not copy text: \", err);\n }\n };\n\n // Keyboard shortcuts for copy button ------------------------------------------------------------------------------\n const handleKeyDown = async (e : React.KeyboardEvent) => {\n if ((e.key === \"Enter\" || e.key === \" \") && e.target === preRef.current) {\n e.preventDefault();\n await copyToClipboard();\n }\n };\n\n let classNames = [];\n\n if (showLineNumbers) {\n classNames.push(\"show-line-numbers\");\n }\n\n // Split code into lines for line numbers --------------------------------------------------------------------------\n const lines = initialCode.split(/\\r\\n|\\r|\\n/gm);\n\n return (\n <Element<CodeBlockElementType>\n data-code-block\n as=\"div\"\n classNames={classNames}\n role=\"region\"\n aria-label={description || `Code block in ${language}`}\n {...props}\n >\n {/* Copy Button or Copied Badge */}\n {showCopyButton ? (\n isCodeCopied ? (\n <Badge\n className=\"code-block-copied-badge\"\n size=\"tiny\"\n shape=\"rounded\"\n aria-live=\"polite\"\n >\n Copied!\n </Badge>\n ) : (\n <Button\n type=\"button\"\n className=\"code-block-copy-button\"\n size=\"tiny\"\n shape=\"rounded\"\n onClick={copyToClipboard}\n onKeyDown={handleKeyDown}\n aria-label=\"Copy code to clipboard\"\n >\n Copy\n </Button>\n )\n ) : null}\n\n {/* MAIN CODE DISPLAY ////////////////////////////////////////////////////////////////////////////////// */}\n <pre\n ref={preRef}\n className={`language-${language}${shadow ? ` shadow-${shadow}` : \"\"}`}\n tabIndex={0}\n aria-label={`Code in ${language}`}\n >\n {/* Line Numbers */}\n {showLineNumbers &&\n Array.from(Array(lines.length).keys()).map((index) => (\n <span\n key={index}\n className=\"line-numbers\"\n aria-hidden=\"true\"\n >\n {index + 1}\n </span>\n ))}\n\n {/* Code Content */}\n <code\n ref={setCodeElement}\n contentEditable={makeEditable}\n suppressContentEditableWarning={true}\n spellCheck=\"false\"\n className={`language-${language} ${isLoading ? \"is-loading\" : \"\"}`}\n >\n {initialCode}\n </code>\n </pre>\n </Element>\n );\n});\nCodeBlock.displayName = \"CodeBlock\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./divider.css\";\n\n// prettier-ignore\nexport interface DividerCustomProps {\n kind ? : \"primary\" | \"secondary\" | \"tertiary\";\n height ? : string;\n label ? : string;\n}\n\nexport type DividerElementType = HTMLHRElement;\nexport type DividerProps = Omit<CommonAndHTMLProps<DividerElementType>, keyof DividerCustomProps> & DividerCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Divider = React.forwardRef(\n (\n {kind, height, label, ...props} : DividerProps, ref : React.Ref<DividerElementType>) => {\n let classNames = [];\n\n if (kind) {\n classNames.push(kind);\n }\n\n return (\n <Element<DividerElementType>\n as=\"hr\"\n data-hrule\n ref={ref}\n classNames={classNames}\n role=\"separator\"\n aria-orientation=\"horizontal\"\n aria-label={label}\n {...props}\n style={{height : height}}\n />\n );\n },\n);\nDivider.displayName = \"Divider\";\n","// LOCAL COMPONENTS ====================================================================================================\nimport { CommonProps, SpacingTypes } from \"$components/Element/constants\";\n\nexport interface PropSeparationResult<T extends Record<string, any>> {\n fictoanProps : {\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n };\n htmlProps : Omit<T, \"size\"> & {\n size ? : number;\n };\n}\n\n/**\n * Separates Fictoan-specific props from HTML props to prevent conflicts.\n *\n * The main conflict is with the 'size' prop:\n * - Fictoan uses size as a string for CSS classes (e.g., \"small\", \"medium\", \"large\")\n * - HTML form elements use size as a number for visual width\n *\n * @param props - The props object to separate\n * @returns Object with fictoanProps and htmlProps\n */\nexport const separateFictoanFromHTMLProps = <T extends Record<string, any>>(\n props : T,\n) : PropSeparationResult<T> => {\n const {size, ...htmlProps} = props;\n\n // Check if size is a valid FormItem size (excluding nano and huge)\n const isValidFormItemSize = typeof size === \"string\" && [\n \"none\", \"micro\", \"tiny\", \"small\", \"medium\", \"large\",\n ].includes(size);\n\n return {\n fictoanProps : {\n size : isValidFormItemSize ? size as Exclude<SpacingTypes, \"nano\" | \"huge\"> : undefined,\n },\n htmlProps : typeof size === \"number\" ? {...htmlProps, size} : htmlProps,\n };\n};\n\n// List of CommonProps keys that should be applied to wrapper elements (like FormItem)\n// rather than to inner input elements\nconst WRAPPER_PROP_KEYS: (keyof CommonProps)[] = [\n // Colours\n \"bgColor\",\n \"bgColour\",\n \"bgOpacity\",\n \"textColor\",\n \"textColour\",\n \"borderColor\",\n \"borderColour\",\n \"borderOpacity\",\n \"fillColor\",\n \"fillColour\",\n \"strokeColor\",\n \"strokeColour\",\n // Visual\n \"shadow\",\n \"shape\",\n \"opacity\",\n // Layout\n \"layoutAsFlexbox\",\n \"stackVertically\",\n \"stackHorizontally\",\n \"layoutAsGrid\",\n \"columns\",\n \"gap\",\n // Margin\n \"margin\",\n \"horizontalMargin\",\n \"verticalMargin\",\n \"marginTop\",\n \"marginRight\",\n \"marginBottom\",\n \"marginLeft\",\n // Padding\n \"padding\",\n \"horizontalPadding\",\n \"verticalPadding\",\n \"paddingTop\",\n \"paddingRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n // Alignment\n \"horizontallyCentreThis\",\n \"horizontallyCenterThis\",\n \"verticallyCentreItems\",\n \"verticallyCenterItems\",\n \"pushItemsToEnds\",\n // Sizing\n \"isFullWidth\",\n \"isFullHeight\",\n // Responsive visibility\n \"hideOnMobile\",\n \"showOnlyOnMobile\",\n \"hideOnTabletPortrait\",\n \"showOnlyOnTabletPortrait\",\n \"hideOnTabletLandscape\",\n \"showOnlyOnTabletLandscape\",\n \"hideOnDesktop\",\n \"showOnlyOnDesktop\",\n // Typography\n \"weight\",\n // Custom classes\n \"classNames\",\n];\n\nexport interface WrapperInputSeparationResult<T extends Record<string, any>> {\n wrapperProps : Partial<CommonProps>;\n inputProps : Omit<T, keyof CommonProps>;\n}\n\n/**\n * Separates wrapper-level props (margin, padding, layout, etc.) from input-specific props.\n *\n * Form components like TextArea and InputField wrap their input in a FormItem.\n * Layout/spacing props should be applied to FormItem (the wrapper), not the inner input.\n *\n * @param props - The props object to separate\n * @returns Object with wrapperProps (for FormItem) and inputProps (for the input element)\n *\n * @example\n * const { wrapperProps, inputProps } = separateWrapperProps(props);\n * return (\n * <FormItem {...wrapperProps}>\n * <Element as=\"textarea\" {...inputProps} />\n * </FormItem>\n * );\n */\nexport const separateWrapperProps = <T extends Record<string, any>>(\n props: T,\n): WrapperInputSeparationResult<T> => {\n const wrapperProps: Partial<CommonProps> = {};\n const inputProps: Record<string, any> = {};\n\n for (const key of Object.keys(props)) {\n if (WRAPPER_PROP_KEYS.includes(key as keyof CommonProps)) {\n (wrapperProps as any)[key] = props[key];\n } else {\n inputProps[key] = props[key];\n }\n }\n\n return {\n wrapperProps,\n inputProps: inputProps as Omit<T, keyof CommonProps>,\n };\n};","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\n// prettier-ignore\nexport interface InputLabelCustomProps {\n label ? : string;\n htmlFor ? : string;\n hideLabel ? : boolean;\n}\n\nexport type InputLabelElementType = HTMLLabelElement;\nexport type InputLabelProps = Omit<CommonAndHTMLProps<InputLabelElementType>, keyof InputLabelCustomProps> &\n InputLabelCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const InputLabel = React.forwardRef(\n (\n {\n label,\n hideLabel,\n htmlFor,\n ...props\n }: InputLabelProps,\n ref: React.Ref<InputLabelElementType>\n ) => {\n let classNames = [];\n\n if (hideLabel) {\n classNames.push(\"visually-hidden\");\n }\n\n return (\n <Element<InputLabelElementType>\n as=\"label\"\n ref={ref}\n htmlFor={htmlFor}\n classNames={classNames}\n {...props}\n >\n {label}\n </Element>\n );\n }\n);\nInputLabel.displayName = \"InputLabel\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, SpacingTypes, WeightTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// prettier-ignore\nexport interface TextCustomProps {\n fontStyle ? : \"sans-serif\" | \"serif\" | \"monospace\";\n weight ? : WeightTypes;\n size ? : SpacingTypes;\n align ? : \"left\" | \"centre\" | \"center\" | \"right\";\n isSubtext ? : boolean;\n}\n\nexport type TextElementType = HTMLParagraphElement;\nexport type TextProps = Omit<CommonAndHTMLProps<TextElementType>, keyof TextCustomProps> & TextCustomProps;\n\nexport const Text = React.forwardRef(\n (\n {weight, size, fontStyle = \"sans-serif\", align, isSubtext, ...props} : TextProps,\n ref : React.Ref<TextElementType>,\n ) => {\n let classNames = [];\n\n if (weight) {\n classNames.push(`weight-${weight}`);\n }\n\n if (size) {\n classNames.push(`text-${size}`);\n }\n\n if (fontStyle) {\n classNames.push(`font-${fontStyle}`);\n }\n\n if (isSubtext) {\n classNames.push(\"sub-text\");\n }\n\n if (align) {\n classNames.push(`text-${align}`);\n }\n\n return <Element<TextElementType> as=\"p\" ref={ref} classNames={classNames} {...props} />;\n },\n);\nText.displayName = \"Text\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, SpacingTypes } from \"../../Element/constants\";\nimport { Div } from \"$tags\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./form-item.css\";\n\n// OTHER ===============================================================================================================\nimport { InputLabel } from \"../InputLabel/InputLabel\";\nimport { Text } from \"../../Typography/Text\";\n\n// TYPES ///////////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport type FormItemElementType = HTMLDivElement;\n\nexport interface FormItemProps extends CommonAndHTMLProps<FormItemElementType> {\n // Label\n label ? : string;\n customLabel ? : React.ReactNode;\n htmlFor ? : string;\n // Info section\n helpText ? : string | React.ReactNode;\n errorText ? : string;\n // Validation\n validationState ? : \"valid\" | \"invalid\" | null;\n // Form semantics\n required ? : boolean;\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n // Layout\n labelFirst ? : boolean;\n}\n\n// VALIDATION ICON /////////////////////////////////////////////////////////////////////////////////////////////////////\nconst ValidationIcon = ({state} : { state : \"valid\" | \"invalid\" }) => {\n if (state === \"valid\") {\n return (\n <svg\n data-validation-icon=\"valid\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n >\n <polyline\n points=\"3.5 12.5 8.5 17.5 20.5 5.5\"\n fill=\"none\"\n stroke=\"#0ec05c\"\n strokeMiterlimit=\"10\"\n strokeWidth=\"2\"\n />\n </svg>\n );\n }\n\n return (\n <svg\n data-validation-icon=\"invalid\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n >\n <line\n x1=\"6.5\"\n y1=\"17.5\"\n x2=\"18.5\"\n y2=\"5.5\"\n fill=\"none\"\n stroke=\"#ef4343\"\n strokeMiterlimit=\"10\"\n strokeWidth=\"2\"\n />\n <line\n x1=\"6.5\"\n y1=\"5.5\"\n x2=\"18.5\"\n y2=\"17.5\"\n fill=\"none\"\n stroke=\"#ef4343\"\n strokeMiterlimit=\"10\"\n strokeWidth=\"2\"\n />\n </svg>\n );\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const FormItem = React.forwardRef(\n (\n {\n label,\n customLabel,\n htmlFor,\n helpText,\n errorText,\n validationState,\n required,\n size,\n labelFirst,\n children,\n ...props\n } : FormItemProps,\n ref : React.Ref<FormItemElementType>,\n ) => {\n const hasLabel = label || customLabel;\n const hasInfoSection = helpText || errorText;\n\n return (\n <Element<FormItemElementType>\n as=\"div\"\n data-form-item\n ref={ref}\n role=\"group\"\n required={required}\n className={[ size ? `size-${size}` : \"\", labelFirst ? \"label-first\" : \"\" ].filter(Boolean)\n .join(\" \") || undefined}\n {...props}\n >\n {/* LABEL ////////////////////////////////////////////////////////////////////////////////////// */}\n {hasLabel && (\n <Div data-label-wrapper data-has-validation={validationState ? \"true\" : undefined}>\n {customLabel || (label && <InputLabel label={label} htmlFor={htmlFor} />)}\n {validationState && <ValidationIcon state={validationState} />}\n </Div>\n )}\n\n {/* INPUT ////////////////////////////////////////////////////////////////////////////////////// */}\n <Div data-input-wrapper>\n {children}\n </Div>\n\n {/* INFO SECTION /////////////////////////////////////////////////////////////////////////////// */}\n {hasInfoSection && (\n <Div className=\"info-section vertically-center-items\">\n {helpText && (\n <Text className=\"help-text\">\n {helpText}\n </Text>\n )}\n {errorText && (\n <Text className=\"error-text\">\n {errorText}\n </Text>\n )}\n </Div>\n )}\n </Element>\n );\n },\n);\nFormItem.displayName = \"FormItem\";\n","// REACT CORE ==========================================================================================================\nimport React, { useMemo } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonProps, SpacingTypes } from \"../../Element/constants\";\nimport { Element } from \"$element\";\n\n// UTILS ===============================================================================================================\nimport { separateWrapperProps } from \"$utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./checkbox.css\";\n\n// OTHER ===============================================================================================================\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { InputLabelCustomProps } from \"../InputLabel/InputLabel\";\n\nexport type CheckboxElementType = HTMLInputElement;\nexport type CheckboxProps = InputLabelCustomProps & CommonProps & {\n id ? : string;\n name ? : string;\n checked ? : boolean;\n defaultChecked ? : boolean;\n disabled ? : boolean;\n required ? : boolean;\n onChange ? : (checked : boolean) => void;\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n helpText ? : string;\n errorText ? : string;\n labelFirst ? : boolean;\n};\n\n// TODO: Fix required indicator that clashes with tick because both use the same `label::after` setup.\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Checkbox = React.forwardRef(\n (\n {\n id,\n name,\n label,\n hideLabel,\n helpText,\n errorText,\n onChange,\n checked,\n defaultChecked,\n disabled,\n required,\n size = \"medium\",\n labelFirst,\n ...props\n } : CheckboxProps,\n ref : React.Ref<CheckboxElementType>,\n ) => {\n const derivedName = useMemo(() => name || id, [ name, id ]);\n\n const handleChange = (e : React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.checked);\n };\n\n // Separate wrapper-level props (margin, padding, etc.) from input-specific props\n const { wrapperProps, inputProps } = separateWrapperProps(props);\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n size={size}\n labelFirst={labelFirst}\n {...wrapperProps}\n >\n <Element<CheckboxElementType>\n as=\"input\"\n type=\"checkbox\"\n ref={ref}\n id={id}\n name={derivedName}\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled}\n required={required}\n onChange={handleChange}\n {...inputProps}\n />\n <Element\n as={labelFirst ? \"label\" : \"div\"}\n htmlFor={labelFirst ? id : undefined}\n data-checkbox\n className={`size-${size}`}\n />\n </FormItem>\n );\n },\n);\nCheckbox.displayName = \"Checkbox\";\n","// REACT CORE ==========================================================================================================\nimport React, { useMemo } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Element } from \"$element\";\nimport { SpacingTypes } from \"../../Element/constants\";\n\n// UTILS ===============================================================================================================\nimport { separateWrapperProps } from \"$utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./switch.css\";\n\n// OTHER ===============================================================================================================\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { InputLabelCustomProps } from \"../InputLabel/InputLabel\";\n\nexport type SwitchElementType = HTMLInputElement;\nexport type SwitchProps = InputLabelCustomProps & {\n id ? : string;\n name ? : string;\n checked ? : boolean;\n defaultChecked ? : boolean;\n disabled ? : boolean;\n required ? : boolean;\n onChange ? : (checked : boolean) => void;\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n helpText ? : string;\n errorText ? : string;\n labelFirst ? : boolean;\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Switch = React.forwardRef(\n (\n {\n id,\n name,\n label,\n hideLabel,\n helpText,\n errorText,\n onChange,\n checked,\n defaultChecked,\n disabled,\n required,\n size = \"medium\",\n labelFirst,\n ...props\n } : SwitchProps,\n ref : React.Ref<SwitchElementType>,\n ) => {\n const derivedName = useMemo(() => name || id, [ name, id ]);\n\n const handleChange = (e : React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.checked);\n };\n\n // Separate wrapper-level props (margin, padding, etc.) from input-specific props\n const {wrapperProps, inputProps} = separateWrapperProps(props);\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n size={size}\n labelFirst={labelFirst}\n {...wrapperProps}\n >\n <Element<SwitchElementType>\n as=\"input\"\n type=\"checkbox\"\n ref={ref}\n id={id}\n name={derivedName}\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled}\n required={required}\n onChange={handleChange}\n {...inputProps}\n />\n <Element\n as={labelFirst ? \"label\" : \"div\"}\n htmlFor={labelFirst ? id : undefined}\n data-switch\n className={`size-${size}`}\n />\n </FormItem>\n );\n },\n);\nSwitch.displayName = \"Switch\";\n","// REACT CORE ==========================================================================================================\nimport React, { useMemo } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Element } from \"$element\";\nimport { SpacingTypes } from \"../../Element/constants\";\n\n// STYLES ==============================================================================================================\nimport \"./checkbox-and-switch-group.css\";\n\n// OTHER ===============================================================================================================\nimport { Checkbox, } from \"./Checkbox\";\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { InputLabelCustomProps } from \"../InputLabel/InputLabel\";\nimport { Switch } from \"./Switch\";\n\n// COMMON GROUP OPTIONS ////////////////////////////////////////////////////////////////////////////////////////////////\ninterface BaseGroupOptionProps {\n id : string;\n label : string;\n value : string;\n disabled ? : boolean;\n}\n\n// Props specific to the group functionality\ninterface GroupCustomProps {\n id ? : string;\n name : string;\n options : BaseGroupOptionProps[];\n value ? : string[];\n defaultValue ? : string[];\n onChange ? : (values : string[]) => void;\n align ? : \"horizontal\" | \"vertical\";\n equaliseWidth ? : boolean;\n equalizeWidth ? : boolean;\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n columns ? : number;\n labelFirst ? : boolean;\n}\n\n// Combined props for the group component\nexport type InputGroupProps = InputLabelCustomProps & GroupCustomProps & {\n helpText ? : string;\n errorText ? : string;\n required ? : boolean;\n disabled ? : boolean;\n};\n\n// CHECKBOX GROUP //////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const CheckboxGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(\n (\n {\n id,\n name,\n label,\n helpText,\n errorText,\n options,\n value,\n defaultValue,\n onChange,\n align,\n equaliseWidth,\n equalizeWidth,\n required,\n disabled,\n size,\n columns,\n labelFirst,\n ...props\n },\n ref,\n ) => {\n const derivedName = useMemo(() => name || id, [ name, id ]);\n\n const [ selectedValues, setSelectedValues ] = React.useState<string[]>(\n value || defaultValue || [],\n );\n\n React.useEffect(() => {\n if (value !== undefined) {\n setSelectedValues(value);\n }\n }, [ value ]);\n\n const handleChange = (optionValue : string, checked : boolean) => {\n let newValues : string[];\n\n if (checked) {\n newValues = [ ...selectedValues, optionValue ];\n } else {\n newValues = selectedValues.filter(v => v !== optionValue);\n }\n\n // Update internal state if uncontrolled\n if (value === undefined) {\n setSelectedValues(newValues);\n }\n\n onChange?.(newValues);\n };\n\n let classNames : string[] = [];\n\n if (align) {\n classNames.push(`align-${align}`);\n }\n\n if (equaliseWidth || equalizeWidth) {\n classNames.push(`equalise-width`);\n }\n\n if (columns) {\n classNames.push(`with-columns`);\n }\n\n if (labelFirst) {\n classNames.push(`label-first`);\n }\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n >\n <Element\n as=\"div\"\n data-checkbox-group\n ref={ref}\n classNames={classNames}\n role=\"group\"\n aria-label={label}\n style={columns ? {gridTemplateColumns : `repeat(${columns}, 1fr)`} : undefined}\n {...props}\n >\n {options.map((option, index) => {\n const {id : optionId, value : optionValue, label : optionLabel, ...optionProps} = option;\n const finalId = optionId || `${id}-option-${index}`;\n const isChecked = selectedValues.includes(optionValue);\n\n return (\n <Checkbox\n key={finalId}\n id={finalId}\n name={derivedName}\n label={optionLabel}\n checked={isChecked}\n disabled={disabled || option.disabled}\n size={size}\n labelFirst={labelFirst}\n onChange={(checked : boolean) => handleChange(optionValue, checked)}\n {...optionProps}\n />\n );\n })}\n </Element>\n </FormItem>\n );\n },\n);\nCheckboxGroup.displayName = \"CheckboxGroup\";\n\n// SWITCH GROUP ////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const SwitchGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(\n (\n {\n id,\n name,\n label,\n helpText,\n errorText,\n options,\n value,\n defaultValue,\n onChange,\n align,\n equaliseWidth,\n equalizeWidth,\n required,\n disabled,\n size,\n columns,\n labelFirst,\n ...props\n },\n ref,\n ) => {\n const derivedName = useMemo(() => name || id, [ name, id ]);\n\n const [ selectedValues, setSelectedValues ] = React.useState<string[]>(\n value || defaultValue || [],\n );\n\n React.useEffect(() => {\n if (value !== undefined) {\n setSelectedValues(value);\n }\n }, [ value ]);\n\n const handleChange = (optionValue : string, checked : boolean) => {\n let newValues : string[];\n\n if (checked) {\n newValues = [ ...selectedValues, optionValue ];\n } else {\n newValues = selectedValues.filter(v => v !== optionValue);\n }\n\n // Update internal state if uncontrolled\n if (value === undefined) {\n setSelectedValues(newValues);\n }\n\n onChange?.(newValues);\n };\n\n let classNames : string[] = [];\n\n if (align) {\n classNames.push(`align-${align}`);\n }\n\n if (equaliseWidth || equalizeWidth) {\n classNames.push(`equalise-width`);\n }\n\n if (columns) {\n classNames.push(`with-columns`);\n }\n\n if (labelFirst) {\n classNames.push(`label-first`);\n }\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n >\n <Element\n as=\"div\"\n data-switch-group\n ref={ref}\n classNames={classNames}\n role=\"group\"\n aria-label={label}\n style={columns ? {gridTemplateColumns : `repeat(${columns}, 1fr)`} : undefined}\n {...props}\n >\n {options.map((option, index) => {\n const {id : optionId, value : optionValue, label : optionLabel, ...optionProps} = option;\n const finalId = optionId || `${id}-option-${index}`;\n const isChecked = selectedValues.includes(optionValue);\n\n return (\n <Switch\n key={finalId}\n id={finalId}\n name={derivedName}\n label={optionLabel}\n checked={isChecked}\n disabled={disabled || option.disabled}\n size={size}\n labelFirst={labelFirst}\n onChange={(checked : boolean) => handleChange(optionValue, checked)}\n {...optionProps}\n />\n );\n })}\n </Element>\n </FormItem>\n );\n },\n);\nSwitchGroup.displayName = \"SwitchGroup\";\n","// REACT CORE ==========================================================================================================\nimport React, { useRef, useState } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { ColourPropTypes, CommonProps, SpacingTypes } from \"$components/Element/constants\";\nimport { Div } from \"../../Element/Tags\";\n\n// UTILS ===============================================================================================================\nimport { separateWrapperProps } from \"$utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./file-upload.css\";\n\n// OTHER ===============================================================================================================\nimport { Badge } from \"../../Badge/Badge\";\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { InputLabelCustomProps } from \"../InputLabel/InputLabel\";\nimport { Text } from \"../../Typography/Text\";\n\nexport type FileUploadElementType = HTMLInputElement;\nexport type FileUploadProps = InputLabelCustomProps & CommonProps & {\n id ? : string;\n name ? : string;\n accept ? : string;\n allowMultipleFiles ? : boolean;\n capture ? : \"user\" | \"environment\";\n height ? : string;\n onChange ? : (files : File[]) => void;\n instructionMainText ? : string;\n instructionSubText ? : string;\n badgeBgColour ? : ColourPropTypes;\n badgeBgColor ? : ColourPropTypes;\n badgeTextColour ? : ColourPropTypes;\n badgeTextColor ? : ColourPropTypes;\n helpText ? : string;\n errorText ? : string;\n required ? : boolean;\n disabled ? : boolean;\n invalid ? : boolean;\n className ? : string;\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n \"aria-label\"? : string;\n \"aria-invalid\"? : boolean;\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const FileUpload = React.forwardRef(\n (\n {\n \"aria-label\" : ariaLabel,\n \"aria-invalid\" : ariaInvalid,\n label,\n helpText,\n errorText,\n required,\n accept,\n allowMultipleFiles = false,\n capture,\n height = \"120px\",\n onChange,\n className = \"\",\n instructionMainText = \"Drag and drop or click to upload\",\n instructionSubText = \"You can add multiple files\",\n invalid,\n id,\n name,\n badgeBgColour,\n badgeTextColour,\n size,\n ...props\n } : FileUploadProps,\n ref : React.Ref<FileUploadElementType>,\n ) => {\n const [ files, setFiles ] = useState<File[]>([]);\n const [ isDragging, setIsDragging ] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleDragOver = (e : React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(true);\n };\n\n const handleDragLeave = (e : React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n };\n\n const handleDrop = (e : React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n\n const droppedFiles = Array.from(e.dataTransfer.files);\n handleFiles(droppedFiles);\n };\n\n const handleFiles = (newFiles : File[]) => {\n if (!allowMultipleFiles) {\n const fileToAdd = newFiles[0];\n setFiles([ fileToAdd ]);\n onChange?.([ fileToAdd ]);\n } else {\n setFiles(prevFiles => [ ...prevFiles, ...newFiles ]);\n onChange?.([ ...files, ...newFiles ]);\n }\n };\n\n const handleFileInput = (e : React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files) {\n const selectedFiles = Array.from(e.target.files);\n handleFiles(selectedFiles);\n }\n };\n\n const removeFile = (indexToRemove : number) => {\n const updatedFiles = files.filter((_, index) => index !== indexToRemove);\n setFiles(updatedFiles);\n onChange?.(updatedFiles);\n };\n\n const openFileDialog = () => {\n fileInputRef.current?.click();\n };\n\n // Separate wrapper-level props (margin, padding, etc.) from component-specific props\n const { wrapperProps } = separateWrapperProps(props);\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n size={size}\n {...wrapperProps}\n >\n <Div\n data-file-upload-area\n ref={ref as React.Ref<HTMLDivElement>}\n className={[\n \"file-upload-wrapper\",\n isDragging ? \"dragging\" : \"\",\n className,\n ].filter(Boolean).join(\" \")}\n aria-label={ariaLabel || label}\n aria-invalid={ariaInvalid || invalid || undefined}\n aria-required={required}\n >\n <Div\n className=\"file-upload-area\"\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={openFileDialog}\n style={{height}}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n id={id}\n name={name}\n onChange={handleFileInput}\n multiple={allowMultipleFiles}\n accept={accept}\n capture={capture}\n className=\"file-input\"\n />\n\n {instructionMainText &&\n <Div className=\"file-upload-content\">\n <Text>{instructionMainText}</Text>\n {instructionSubText && (\n <Text isSubtext>{instructionSubText}</Text>\n )}\n </Div>\n }\n </Div>\n\n {files.length > 0 && (\n <Div className=\"uploaded-files\">\n {files.map((file, index) => (\n <Badge\n key={`${file.name}-${index}`}\n size=\"small\"\n shape=\"rounded\"\n actionIcon=\"cross\"\n onActionClick={() => removeFile(index)}\n actionAriaLabel={`Remove ${file.name}`}\n bgColour={badgeBgColour}\n textColour={badgeTextColour}\n >\n {file.name}\n </Badge>\n ))}\n </Div>\n )}\n </Div>\n </FormItem>\n );\n },\n);\nFileUpload.displayName = \"FileUpload\";\n","// REACT CORE ==========================================================================================================\nimport React, { useEffect, useRef, useState } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Div } from \"$tags\";\nimport { Element } from \"$element\";\nimport { SpacingTypes, CommonProps } from \"../../Element/constants\";\n\n// STYLES ==============================================================================================================\nimport \"./input-field.css\";\n\n// OTHER ===============================================================================================================\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { InputLabelCustomProps } from \"../InputLabel/InputLabel\";\nimport { separateWrapperProps } from \"../../../utils/propSeparation\";\n\nexport type ValueChangeHandler<T = string> = (value: T) => void;\nexport type InputFocusHandler = (e: React.FocusEvent<HTMLInputElement>) => void;\nexport interface InputCommonProps {\n label ? : string;\n helpText ? : string | React.ReactNode;\n errorText ? : string;\n validateThis ? : boolean;\n valid ? : boolean;\n invalid ? : boolean;\n validationState ? : \"valid\" | \"invalid\" | null;\n required ? : boolean;\n disabled ? : boolean;\n}\n\nexport interface InputSideElementProps {\n innerIconLeft ? : React.ReactNode;\n innerIconRight ? : React.ReactNode;\n innerTextLeft ? : string;\n innerTextRight ? : string;\n}\n\nexport type InputFieldElementType = HTMLInputElement;\n\nexport type InputFieldProps =\n Omit<React.InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"onBlur\" | \"onFocus\" | \"size\"> &\n InputLabelCustomProps &\n InputCommonProps &\n InputSideElementProps &\n CommonProps & {\n type ? : \"text\" | \"password\" | \"email\" | \"number\" | \"tel\" | \"url\" | \"search\" | \"file\";\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n onFocus ? : InputFocusHandler;\n onBlur ? : InputFocusHandler;\n onChange ? : ValueChangeHandler<string>;\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const InputField = React.forwardRef(\n (\n {\n // FormItem props\n label,\n hideLabel,\n helpText,\n errorText,\n size,\n required,\n // Side elements\n innerIconLeft,\n innerIconRight,\n innerTextLeft,\n innerTextRight,\n // Validation\n validateThis,\n valid,\n invalid,\n validationState: externalValidationState,\n // Handlers\n onChange,\n onBlur,\n onFocus,\n // Aria\n \"aria-label\": ariaLabel,\n \"aria-invalid\": ariaInvalid,\n // Input props\n id,\n name,\n value,\n defaultValue,\n type = \"text\",\n placeholder,\n autoComplete,\n maxLength,\n minLength,\n pattern,\n readOnly,\n disabled,\n className,\n ...props\n }: InputFieldProps,\n ref: React.Ref<InputFieldElementType>\n ) => {\n const leftElementRef = useRef<HTMLDivElement>(null);\n const rightElementRef = useRef<HTMLDivElement>(null);\n const internalInputRef = useRef<HTMLInputElement>(null);\n\n const [touched, setTouched] = useState(false);\n const [internalValidationState, setInternalValidationState] = useState<\"valid\" | \"invalid\" | null>(null);\n\n // Use external validation state if provided, otherwise use internal\n const validationState = externalValidationState ?? (validateThis ? internalValidationState : null);\n\n // Merge refs\n const mergeRefs = React.useCallback(\n (el: HTMLInputElement | null) => {\n (internalInputRef as React.MutableRefObject<HTMLInputElement | null>).current = el;\n if (typeof ref === \"function\") {\n ref(el);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = el;\n }\n },\n [ref]\n );\n\n const updateValidationState = () => {\n const input = internalInputRef.current;\n if (!input || input.value === \"\") {\n setInternalValidationState(null);\n return;\n }\n setInternalValidationState(input.validity.valid ? \"valid\" : \"invalid\");\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.value);\n if (touched && validateThis) {\n updateValidationState();\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true);\n if (validateThis) {\n updateValidationState();\n }\n onBlur?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n onFocus?.(e);\n };\n\n // Side element width calculation\n useEffect(() => {\n const updateWidth = (el: HTMLDivElement | null, pos: \"left\" | \"right\") => {\n if (!el) return;\n const formItem = el.closest(\"[data-form-item]\") as HTMLElement;\n formItem?.style.setProperty(\n `--side-element-${pos}-width`,\n `${el.getBoundingClientRect().width}px`\n );\n };\n\n if (innerTextLeft || innerIconLeft) {\n updateWidth(leftElementRef.current, \"left\");\n }\n if (innerTextRight || innerIconRight) {\n updateWidth(rightElementRef.current, \"right\");\n }\n }, [innerTextLeft, innerTextRight, innerIconLeft, innerIconRight]);\n\n const renderSideElement = (\n content: React.ReactNode,\n position: \"left\" | \"right\",\n elRef: React.RefObject<HTMLDivElement | null>\n ) => {\n if (!content) return null;\n\n const isText = typeof content === \"string\";\n const contentProps = React.isValidElement(content) ? (content.props as Record<string, unknown>) : {};\n const isInteractive =\n !isText &&\n React.isValidElement(content) &&\n (contentProps.onClick ||\n contentProps.onKeyDown ||\n content.type === \"button\" ||\n content.type === \"a\");\n\n return (\n <Div\n ref={elRef}\n data-input-side-element\n className={`${position} ${isText ? \"is-text\" : \"is-icon\"} ${isInteractive ? \"is-interactive\" : \"\"}`}\n aria-hidden=\"true\"\n >\n {content}\n </Div>\n );\n };\n\n const hasLeftElement = Boolean(innerIconLeft || innerTextLeft);\n const hasRightElement = Boolean(innerIconRight || innerTextRight);\n\n // Separate wrapper-level props (margin, padding, etc.) from input-specific props\n const { wrapperProps, inputProps } = separateWrapperProps(props);\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n validationState={validationState}\n required={required}\n size={size}\n {...wrapperProps}\n >\n <Element<InputFieldElementType>\n as=\"input\"\n ref={mergeRefs}\n data-input-field\n id={id}\n name={name}\n type={type}\n value={value}\n defaultValue={defaultValue}\n placeholder={placeholder || \" \"}\n autoComplete={autoComplete}\n maxLength={maxLength}\n minLength={minLength}\n pattern={pattern}\n readOnly={readOnly}\n disabled={disabled}\n required={required}\n className={[\n className,\n hasLeftElement && \"with-left-element\",\n hasRightElement && \"with-right-element\",\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-label={ariaLabel || label}\n aria-invalid={ariaInvalid || invalid}\n aria-required={required}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={handleFocus}\n {...inputProps}\n />\n {(hasLeftElement || hasRightElement) && (\n <Div data-input-helper aria-hidden=\"true\">\n {renderSideElement(innerIconLeft || innerTextLeft, \"left\", leftElementRef)}\n {renderSideElement(innerIconRight || innerTextRight, \"right\", rightElementRef)}\n </Div>\n )}\n </FormItem>\n );\n }\n);\nInputField.displayName = \"InputField\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./portion.css\";\n\n// OTHER ===============================================================================================================\nimport { SpanTypes } from \"./types\";\n\n// prettier-ignore\nexport interface PortionCustomProps {\n desktopSpan ? : SpanTypes;\n tabletLandscapeSpan ? : SpanTypes;\n tabletPortraitSpan ? : SpanTypes;\n mobileSpan ? : SpanTypes;\n isHorizontal ? : boolean;\n role ? : string;\n}\n\nexport type PortionElementType = HTMLDivElement;\nexport type PortionProps = Omit<CommonAndHTMLProps<PortionElementType>, keyof PortionCustomProps> & PortionCustomProps;\n\n// COMPONENT //////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Portion = React.forwardRef(\n (\n {\n desktopSpan,\n mobileSpan,\n tabletLandscapeSpan,\n tabletPortraitSpan,\n isHorizontal,\n role,\n ...props\n }: PortionProps,\n ref: React.Ref<PortionElementType>\n ) => {\n // CLASS NAMES -------------------------------------------------------------------------------------------------\n let classNames = [];\n\n if (desktopSpan || tabletLandscapeSpan || tabletPortraitSpan || mobileSpan) {\n if (desktopSpan) {\n classNames.push(`${desktopSpan}`);\n }\n\n if (tabletLandscapeSpan) {\n classNames.push(`${tabletLandscapeSpan}-on-tablet-landscape`);\n }\n\n if (tabletPortraitSpan) {\n classNames.push(`${tabletPortraitSpan}-on-tablet-portrait`);\n }\n\n if (mobileSpan) {\n classNames.push(`${mobileSpan}-on-mobile`);\n }\n } else {\n classNames.push(\"whole\");\n }\n\n if (isHorizontal) {\n classNames.push(\"horizontal\");\n }\n\n // RENDER ---------------------------------------------------------------------------------------------------\n return (\n <Element<PortionElementType>\n as=\"div\"\n data-portion\n ref={ref}\n classNames={classNames}\n role={role}\n {...props}\n />\n );\n }\n);\nPortion.displayName = \"Portion\";\n","// REACT CORE ==========================================================================================================\nimport React, { useMemo } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Element } from \"$element\";\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { separateWrapperProps } from \"../../../utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./radio-button.css\";\n\n// OTHER ===============================================================================================================\nimport { RadioButtonProps, RadioButtonElementType } from \"./constants\";\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const RadioButton = React.forwardRef(\n (\n {\n id,\n name,\n value,\n label,\n helpText,\n errorText,\n onChange,\n checked,\n disabled,\n required,\n labelFirst,\n ...props\n }: RadioButtonProps,\n ref: React.Ref<RadioButtonElementType>\n ) => {\n const derivedName = useMemo(() => name || id, [name, id]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked && onChange) {\n onChange(value);\n }\n };\n\n // Separate wrapper-level props (margin, padding, etc.) from input-specific props\n const { wrapperProps, inputProps } = separateWrapperProps(props);\n\n return (\n <Element<RadioButtonElementType>\n as=\"div\"\n data-radio-button\n ref={ref}\n role=\"radio\"\n aria-checked={checked}\n aria-disabled={disabled}\n className={labelFirst ? \"label-first\" : undefined}\n {...wrapperProps}\n >\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n labelFirst={labelFirst}\n >\n <Element\n as=\"input\"\n type=\"radio\"\n id={id}\n name={derivedName}\n value={value}\n checked={checked}\n disabled={disabled}\n required={required}\n onChange={handleChange}\n {...inputProps}\n />\n <Element\n as={labelFirst ? \"label\" : \"div\"}\n htmlFor={labelFirst ? id : undefined}\n data-radio\n />\n </FormItem>\n </Element>\n );\n }\n);\nRadioButton.displayName = \"RadioButton\";\n","// REACT CORE ==========================================================================================================\nimport React, { useMemo } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Div } from \"../../Element/Tags\";\nimport { Element } from \"$element\";\nimport { FormItem } from \"../FormItem/FormItem\";\n\n// STYLES ==============================================================================================================\nimport \"./radio-group.css\";\n\n// TYPES ===============================================================================================================\nimport { RadioGroupProps } from \"./constants\";\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const RadioGroup = React.forwardRef(\n (\n {\n id,\n name,\n label,\n helpText,\n errorText,\n options,\n value,\n defaultValue,\n onChange,\n align,\n equaliseWidth,\n equalizeWidth,\n required,\n disabled,\n size,\n columns,\n labelFirst,\n ...props\n }: RadioGroupProps,\n ref: React.Ref<HTMLDivElement>\n ) => {\n const derivedName = useMemo(() => name || id, [name, id]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.value);\n };\n\n let classNames: string[] = [];\n\n if (align) {\n classNames.push(`align-${align}`);\n }\n\n if (equaliseWidth || equalizeWidth) {\n classNames.push(`equalise-width`);\n }\n\n if (columns) {\n classNames.push(`with-columns`);\n }\n\n if (labelFirst) {\n classNames.push(`label-first`);\n }\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n size={size}\n >\n <Element\n as=\"div\"\n data-radio-group\n ref={ref}\n classNames={classNames}\n role=\"radiogroup\"\n aria-label={label}\n style={columns ? { gridTemplateColumns: `repeat(${columns}, 1fr)` } : undefined}\n {...props}\n >\n {options.map((option, index) => {\n const { id: optionId, value: optionValue, label: optionLabel, ...optionProps } = option;\n const finalId = optionId || `${id}-option-${index}`;\n const isChecked = value ? value === optionValue : defaultValue === optionValue;\n\n return (\n <Div\n key={finalId}\n data-radio-button\n role=\"radio\"\n aria-checked={isChecked}\n className={labelFirst ? \"label-first\" : undefined}\n >\n <input\n type=\"radio\"\n id={finalId}\n name={derivedName}\n value={optionValue}\n checked={isChecked}\n disabled={disabled}\n onChange={handleChange}\n {...optionProps}\n />\n <label htmlFor={finalId}>{optionLabel}</label>\n {labelFirst ? (\n <label htmlFor={finalId} data-radio />\n ) : (\n <Div data-radio />\n )}\n </Div>\n );\n })}\n </Element>\n </FormItem>\n );\n }\n);\nRadioGroup.displayName = \"RadioGroup\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, SpacingTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./row.css\";\n\ninterface RowCustomProps {\n layout ? : \"grid\" | \"flexbox\";\n gutters ? : SpacingTypes;\n retainLayoutOnTabletLandscape ? : boolean;\n retainLayoutOnTabletPortrait ? : boolean;\n retainLayoutOnMobile ? : boolean;\n retainLayoutAlways ? : boolean;\n allowUltraWide ? : boolean;\n groupLabel ? : string;\n}\n\nexport type RowElementType = HTMLDivElement;\nexport type RowProps = Omit<CommonAndHTMLProps<RowElementType>, keyof RowCustomProps> & RowCustomProps;\n\n// TODO: Fix fixed gutter widths\n\n// COMPONENT //////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Row = React.forwardRef(\n (\n {\n layout = \"grid\",\n gutters = \"medium\",\n retainLayoutOnTabletLandscape,\n retainLayoutOnTabletPortrait,\n retainLayoutOnMobile,\n retainLayoutAlways,\n allowUltraWide,\n groupLabel,\n ...props\n } : RowProps,\n ref : React.Ref<RowElementType>,\n ) => {\n // CLASS NAMES -------------------------------------------------------------------------------------------------\n let classNames = [];\n\n if (layout) {\n classNames.push(`layout-${layout}`);\n }\n\n if (gutters) {\n classNames.push(gutters === \"none\" ? \"no-gutters\" : `${gutters}-gutters`);\n }\n\n // Add medium gutters by default for grid layouts only, remove them for flexbox layouts\n //\n // if (conditionalGutters) {\n // }\n\n // if (equaliseChildren || equalizeChildren) {\n // classNames.push(\"equalise-children\");\n // }\n\n if (retainLayoutOnTabletLandscape) {\n classNames.push(\"retain-layout-on-tablet-landscape\");\n }\n\n if (retainLayoutOnTabletPortrait) {\n classNames.push(\"retain-layout-on-tablet-portrait\");\n }\n\n if (retainLayoutOnMobile) {\n classNames.push(\"retain-layout-on-mobile\");\n }\n\n if (retainLayoutAlways) {\n classNames.push(\n \"retain-layout-on-tablet-landscape retain-layout-on-tablet-portrait retain-layout-on-mobile\",\n );\n }\n\n if (allowUltraWide) {\n classNames.push(\"allow-ultra-wide\");\n }\n\n // RENDER -----------------------------------------------------------------------------------------------------\n return (\n <Element<RowElementType>\n as=\"div\"\n data-row\n ref={ref}\n classNames={[ classNames.join(\" \") ]}\n marginBottom=\"tiny\"\n role=\"grid\"\n aria-label={groupLabel}\n {...props}\n />\n );\n },\n);\nRow.displayName = \"Row\";\n","// REACT CORE ==========================================================================================================\nimport React, { useMemo } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Div } from \"$tags\";\nimport { Element } from \"$element\";\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { separateWrapperProps } from \"../../../utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./select.css\";\n\n// OTHER ===============================================================================================================\nimport { OptionProps, OptGroupProps, SelectProps, OptionElementType, SelectElementType } from \"./constants\";\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Select = React.forwardRef(\n (\n {\n // FormItem props\n label,\n helpText,\n errorText,\n required,\n size,\n // Select props\n id,\n name,\n options,\n onChange,\n disabled,\n className,\n ...props\n }: SelectProps,\n ref: React.Ref<SelectElementType>\n ) => {\n const derivedName = useMemo(() => name || id, [name, id]);\n\n const renderOption = (option: OptionProps) => (\n <Element<OptionElementType>\n as=\"option\"\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n {option.label}\n </Element>\n );\n\n const renderOptGroup = (group: OptGroupProps) => (\n <Element<HTMLOptGroupElement>\n as=\"optgroup\"\n key={group.label}\n label={group.label}\n >\n {group.options.map(renderOption)}\n </Element>\n );\n\n const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n onChange?.(e.target.value);\n };\n\n // Separate wrapper-level props (margin, padding, etc.) from input-specific props\n const { wrapperProps, inputProps } = separateWrapperProps(props);\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n size={size}\n {...wrapperProps}\n >\n <Div data-select className={className} disabled={disabled}>\n <Element<SelectElementType>\n as=\"select\"\n ref={ref}\n id={id}\n name={derivedName}\n disabled={disabled}\n required={required}\n onChange={handleChange}\n {...inputProps}\n >\n {options.map((option) =>\n \"options\" in option ? renderOptGroup(option) : renderOption(option)\n )}\n </Element>\n </Div>\n </FormItem>\n );\n }\n);\nSelect.displayName = \"Select\";\n","// REACT CORE ==========================================================================================================\nimport React, { useRef } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, SpacingTypes } from \"../../Element/constants\";\nimport { Element } from \"$element\";\n\n// UTILS ===============================================================================================================\nimport { separateWrapperProps } from \"../../../utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./textarea.css\";\n\n// OTHER ===============================================================================================================\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { InputLabelCustomProps } from \"../InputLabel/InputLabel\";\n\n// TODO Add minimumWordLength prop\n\n// Common input types\nexport interface InputCommonProps {\n label ? : string;\n helpText ? : string | React.ReactNode;\n errorText ? : string;\n validateThis ? : boolean;\n valid ? : boolean;\n invalid ? : boolean;\n required ? : boolean;\n disabled ? : boolean;\n}\n\nexport type TextareaElementType = HTMLTextAreaElement;\nexport type TextareaProps =\n Omit<CommonAndHTMLProps<TextareaElementType>, \"onChange\" | \"size\"> &\n InputLabelCustomProps &\n Omit<InputCommonProps, \"validationState\"> & {\n id ? : string;\n name ? : string;\n onChange ? : (value : string) => void;\n value ? : string;\n rows ? : number;\n cols ? : number;\n minLength ? : number;\n maxLength ? : number;\n placeholder ? : string;\n readOnly ? : boolean;\n required ? : boolean;\n disabled ? : boolean;\n autoComplete ? : string;\n characterLimit ? : number;\n wordLimit ? : number;\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n};\n\n// Helper functions to determine limit states\nconst getLimitState = (current : number, limit : number) : \"normal\" | \"warning\" | \"exceeded\" => {\n if (current > limit) return \"exceeded\";\n if (current >= limit * 0.9) return \"warning\";\n return \"normal\";\n};\n\nconst pluralise = (count : number, singular : string, plural : string) : string => {\n return Math.abs(count) === 1 ? singular : plural;\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const TextArea = React.forwardRef(\n (\n {\n // FormItem props\n label,\n hideLabel,\n helpText,\n errorText,\n size,\n required,\n // TextArea-specific\n onChange,\n value = \"\",\n characterLimit,\n wordLimit,\n // Input props\n id,\n name,\n rows,\n cols,\n minLength,\n maxLength,\n placeholder,\n readOnly,\n disabled,\n autoComplete,\n // Validation (unused but destructured to not pass to DOM)\n validateThis,\n valid,\n invalid,\n ...props\n } : TextareaProps,\n ref : React.Ref<TextareaElementType>,\n ) => {\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n\n const handleChange = (e : React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(e.target.value);\n };\n\n const constructHelpText = () : React.ReactNode => {\n const limitsMessages : React.ReactNode[] = [];\n\n if (characterLimit) {\n const currentChars = value.length;\n const limitState = getLimitState(currentChars, characterLimit);\n const excessChars = Math.max(0, currentChars - characterLimit);\n const remaining = characterLimit - currentChars;\n\n limitsMessages.push(\n <span key=\"char-limit\" className={`limit-${limitState}`}>\n {excessChars > 0\n ? `${excessChars} ${pluralise(excessChars, \"char\", \"chars\")} over limit`\n : `${remaining} ${pluralise(remaining, \"char\", \"chars\")} left`}\n </span>,\n );\n }\n\n if (wordLimit) {\n const currentWords = value.trim().split(/\\s+/).filter(Boolean).length;\n const limitState = getLimitState(currentWords, wordLimit);\n const excessWords = Math.max(0, currentWords - wordLimit);\n const remaining = wordLimit - currentWords;\n\n limitsMessages.push(\n <span key=\"word-limit\" className={`limit-${limitState}`}>\n {excessWords > 0\n ? `${excessWords} ${pluralise(excessWords, \"word\", \"words\")} over limit`\n : `${remaining} ${pluralise(remaining, \"word\", \"words\")} left`}\n </span>,\n );\n }\n\n if (!limitsMessages.length && !helpText) return undefined;\n\n return (\n <>\n {helpText}\n {helpText && limitsMessages.length > 0 && <span className=\"separator\"> • </span>}\n {limitsMessages.map((msg, i) => (\n <React.Fragment key={i}>\n {i > 0 && <span className=\"separator\"> • </span>}\n {msg}\n </React.Fragment>\n ))}\n </>\n );\n };\n\n const setRefs = (element : HTMLTextAreaElement | null) => {\n textareaRef.current = element;\n if (typeof ref === \"function\") {\n ref(element);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current = element;\n }\n };\n\n // Separate wrapper-level props (margin, padding, etc.) from input-specific props\n const {wrapperProps, inputProps} = separateWrapperProps(props);\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={constructHelpText()}\n errorText={errorText}\n required={required}\n size={size}\n {...wrapperProps}\n >\n <Element<TextareaElementType>\n as=\"textarea\"\n ref={setRefs}\n data-textarea\n id={id}\n name={name}\n value={value}\n rows={rows}\n cols={cols}\n minLength={minLength}\n maxLength={maxLength}\n placeholder={placeholder}\n readOnly={readOnly}\n disabled={disabled}\n required={required}\n autoComplete={autoComplete}\n onChange={handleChange}\n {...inputProps}\n />\n </FormItem>\n );\n },\n);\nTextArea.displayName = \"TextArea\";\n","// REACT CORE ==========================================================================================================\nimport React, { ElementType, ReactNode } from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { ElementProps, SpacingTypes } from \"../../Element/constants\";\n\n// INPUT ===============================================================================================================\n// Common props shared by form inputs\nexport interface InputCommonProps {\n label?: string;\n helpText?: string;\n errorText?: string;\n required?: boolean;\n disabled?: boolean;\n}\n\n// OTHER ===============================================================================================================\nimport { Checkbox } from \"../Checkbox/Checkbox\";\nimport { Element } from \"$element\";\nimport { FileUpload } from \"../FileUpload/FileUpload\";\nimport { InputField } from \"../InputField/InputField\";\nimport { InputLabel, InputLabelCustomProps } from \"../InputLabel/InputLabel\";\nimport { PortionProps, Portion } from \"../../Portion/Portion\";\nimport { RadioButton } from \"../RadioButton/RadioButton\";\nimport { RadioGroup } from \"../RadioButton/RadioGroup\";\nimport { RadioGroupOptionProps } from \"../RadioButton/constants\";\nimport { Row } from \"../../Row/Row\";\nimport { Select } from \"../Select/Select\";\nimport { Switch } from \"../Checkbox/Switch\";\nimport { TextArea } from \"../TextArea/TextArea\";\n\n// Types\nexport type FormFieldsType = ElementProps<HTMLInputElement> &\n ElementProps<HTMLSelectElement> &\n ElementProps<HTMLTextAreaElement> &\n InputLabelCustomProps &\n InputCommonProps;\n\nexport type FormFieldsConfigBase = PortionProps & FormFieldsType;\n\ninterface FormFieldOptionsType extends RadioGroupOptionProps {\n id : string;\n label : string;\n value : string;\n}\n\nexport interface FormFieldsConfig extends FormFieldsConfigBase {\n as : ElementType;\n options ? : FormFieldOptionsType[];\n name : string;\n // Making name required for field identification\n}\n\n// Supported Form elements for \"as\" prop in config\nconst FormElements: Record<string, ElementType> = {\n Checkbox,\n Switch,\n InputField,\n FileUpload,\n InputLabel,\n RadioButton,\n RadioGroup,\n Select,\n TextArea,\n Empty: \"div\",\n};\n\nconst getFormItem = (\n formField: Omit<FormFieldsConfig, \"mobileSpan\" | \"tabletLandscapeSpan\" | \"isHorizontal\" | \"desktopSpan\" | \"tabletPortraitSpan\">,\n onFieldChange: (fieldName: string, value: any) => void\n): React.ReactNode => {\n const { as: elementName, name, ...formFieldProps } = formField;\n\n // Create an onChange handler specific to this field\n const handleChange = (value: any) => {\n onFieldChange(name, value);\n };\n\n const ElementComponent = FormElements[elementName as keyof typeof FormElements] || InputField;\n\n return (\n <Element\n as={ElementComponent}\n {...formFieldProps}\n name={name}\n isFullWidth\n onChange={handleChange}\n />\n );\n};\n\nexport const generateFormThroughConfig = (\n fields: FormFieldsConfig[],\n onFieldChange: (fieldName: string, value: any) => void,\n spacing: SpacingTypes | undefined,\n): React.ReactNode => {\n const formChildren: ReactNode[] = fields.map((field, index) => {\n const {\n desktopSpan,\n tabletLandscapeSpan,\n tabletPortraitSpan,\n mobileSpan,\n isHorizontal,\n ...formField\n } = field;\n\n const portionProps = {\n desktopSpan,\n tabletLandscapeSpan,\n tabletPortraitSpan,\n mobileSpan,\n isHorizontal,\n };\n\n return (\n <Portion {...portionProps} key={`${field.name}-${index}`}>\n {getFormItem(formField, onFieldChange)}\n </Portion>\n );\n });\n\n return <Row gutters={spacing}>{formChildren}</Row>;\n};\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps, SpacingTypes } from \"../../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./form.css\";\n\n// OTHER ===============================================================================================================\nimport { Callout } from \"$/components\";\nimport { FormFieldsConfig, generateFormThroughConfig } from \"./FormGenerator\";\n\n// prettier-ignore\nexport interface FormCustomProps {\n spacing ? : SpacingTypes;\n fields ? : FormFieldsConfig[];\n onFieldsChange ? : (values: Record<string, any>) => void;\n errorText ? : string;\n}\n\nexport type FormElementType = HTMLFormElement;\nexport type FormProps = Omit<CommonAndHTMLProps<FormElementType>, keyof FormCustomProps> &\n FormCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Form = React.forwardRef(\n (\n { spacing = \"small\", fields, onFieldsChange, children, errorText, ...props }: FormProps,\n ref: React.Ref<FormElementType>\n ) => {\n let classNames = [];\n\n if (spacing) {\n classNames.push(`spacing-${spacing}`);\n }\n\n // Handle form field changes to provide direct values\n const handleFieldChange = (fieldName: string, value: any) => {\n if (onFieldsChange) {\n onFieldsChange({\n [fieldName]: value\n });\n }\n };\n\n // Generate form fields if config is provided\n const formContent = fields?.length ? generateFormThroughConfig(fields, handleFieldChange, spacing) : children;\n\n return (\n <Element<FormElementType>\n as=\"form\"\n data-form\n ref={ref}\n classNames={classNames}\n {...props}\n >\n {formContent}\n {errorText && <Callout kind=\"error\">{errorText}</Callout>}\n </Element>\n );\n }\n);\nForm.displayName = \"Form\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\n\n// STYLES ==============================================================================================================\nimport \"./form-item-group.css\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\n// prettier-ignore\nexport interface FormItemGroupCustomProps {\n isJoint ? : boolean;\n equalWidthForChildren ? : React.ReactNode;\n retainLayout ? : boolean;\n legend ? : string;\n}\n\nexport type FormItemGroupElementType = HTMLDivElement;\nexport type FormItemGroupProps = Omit<CommonAndHTMLProps<FormItemGroupElementType>, keyof FormItemGroupCustomProps> &\n FormItemGroupCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const FormItemGroup = React.forwardRef(\n (\n {\n isJoint,\n equalWidthForChildren,\n retainLayout,\n children,\n legend,\n id,\n ...props\n }: FormItemGroupProps,\n ref: React.Ref<FormItemGroupElementType>\n ) => {\n const groupId = id || `form-group-${Math.random().toString(36).substring(2, 9)}`;\n let classNames = [];\n\n if (isJoint) {\n classNames.push(\"is-joint\");\n }\n\n if (equalWidthForChildren) {\n classNames.push(\"equal-width-for-children\");\n }\n\n if (retainLayout) {\n classNames.push(\"retain-layout\");\n }\n\n return (\n <Element<FormItemGroupElementType>\n as=\"div\"\n data-form-item-group\n ref={ref}\n id={groupId}\n role=\"group\"\n aria-label={legend}\n classNames={classNames}\n {...props}\n >\n {children}\n </Element>\n );\n }\n);\nFormItemGroup.displayName = \"FormItemGroup\";\n","import { OptionForListBoxProps } from \"./constants\";\n\nexport const levenshteinDistance = (a: string, b: string): number => {\n const matrix = [];\n\n const aLength = a.length;\n const bLength = b.length;\n\n // Early exit if one of the strings is empty\n if (aLength === 0) return bLength;\n if (bLength === 0) return aLength;\n\n // Initialize the first row and column of the matrix\n for (let i = 0; i <= bLength; i++) {\n matrix[i] = [ i ];\n }\n for (let j = 0; j <= aLength; j++) {\n matrix[0][j] = j;\n }\n\n // Fill in the rest of the matrix\n for (let i = 1; i <= bLength; i++) {\n for (let j = 1; j <= aLength; j++) {\n if (b[i - 1] === a[j - 1]) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j] + 1, // Deletion\n matrix[i][j - 1] + 1, // Insertion\n matrix[i - 1][j - 1] + 1, // Substitution\n );\n }\n }\n }\n\n return matrix[bLength][aLength];\n};\n\nexport const isSubsequence = (search: string, target: string): boolean => {\n let searchIndex = 0;\n let targetIndex = 0;\n\n while (searchIndex < search.length && targetIndex < target.length) {\n if (search[searchIndex] === target[targetIndex]) {\n searchIndex++;\n }\n targetIndex++;\n }\n\n return searchIndex === search.length;\n};\n\nexport const generateAcronym = (label: string): string => {\n return label\n .split(/[\\s\\-_]+/)\n .map(word => word.slice(0, 2)) // Take first two letters\n .join(\"\")\n .toLowerCase();\n};\n\n// Handle partial matches and common typos =============================================================================\nexport const searchOptions = (options: OptionForListBoxProps[], searchTerm: string) => {\n if (!searchTerm) return options;\n\n const normalizedSearch = searchTerm.toLowerCase().trim();\n\n const maxDistance = Math.floor(normalizedSearch.length / 2);\n\n const matchedOptions = options\n .map(option => {\n const normalizedLabel = option.label.toLowerCase();\n\n const distance = levenshteinDistance(normalizedSearch, normalizedLabel);\n\n const words = normalizedLabel.split(/[\\s\\-_]+/);\n const searchWords = normalizedSearch.split(/[\\s\\-_]+/);\n\n const isPartialMatch =\n normalizedLabel.includes(normalizedSearch) ||\n searchWords.every(searchWord =>\n words.some(word => word.startsWith(searchWord)),\n );\n\n const acronym = generateAcronym(normalizedLabel);\n\n const isAcronymMatch = isSubsequence(normalizedSearch, acronym);\n\n return {\n option,\n distance,\n isPartialMatch,\n isAcronymMatch,\n };\n })\n .filter(({ distance, isPartialMatch, isAcronymMatch }) =>\n isPartialMatch || isAcronymMatch || distance <= maxDistance,\n )\n .sort((a, b) => {\n if (a.isPartialMatch && !b.isPartialMatch) return -1;\n if (!a.isPartialMatch && b.isPartialMatch) return 1;\n\n if (a.isAcronymMatch && !b.isAcronymMatch) return -1;\n if (!a.isAcronymMatch && b.isAcronymMatch) return 1;\n\n return a.distance - b.distance;\n })\n .map(({ option }) => option);\n\n return matchedOptions;\n};\n","// REACT CORE ==========================================================================================================\nimport React, { useState, useRef, useEffect, MutableRefObject, KeyboardEvent } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Div } from \"$tags\";\nimport { Element } from \"$element\";\n\n// HOOKS ===============================================================================================================\nimport { useClickOutside } from \"$hooks/UseClickOutside\";\n\n// UTILS ===============================================================================================================\nimport { separateWrapperProps } from \"$utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./list-box.css\";\n\n// OTHER ===============================================================================================================\nimport { Badge } from \"../../Badge/Badge\";\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { InputField } from \"../InputField/InputField\";\nimport { ListBoxProps, OptionForListBoxProps, ListBoxElementType, ListBoxCustomProps } from \"./constants\";\nimport { Text } from \"../../Typography/Text\";\nimport { searchOptions } from \"./listBoxUtils\";\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const ListBox = React.forwardRef<ListBoxElementType, ListBoxProps>(\n (\n {\n options = [],\n label,\n helpText,\n errorText,\n placeholder = \"Select an option\",\n id,\n defaultValue,\n onChange,\n disabled,\n selectionLimit,\n allowMultiSelect = false,\n allowCustomEntries = false,\n isLoading,\n value,\n isFullWidth,\n className,\n required,\n size,\n ...props\n },\n ref\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchValue, setSearchValue] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(-1);\n const [selectedOption, setSelectedOption] = useState<OptionForListBoxProps | null>(null);\n const [selectedOptions, setSelectedOptions] = useState<OptionForListBoxProps[]>([]);\n const [openUpward, setOpenUpward] = useState(false);\n\n useEffect(() => {\n if (defaultValue && onChange) {\n onChange(defaultValue);\n }\n }, []);\n\n // Create a memoized version of the combined options\n const allOptions = React.useMemo(() => {\n return [...options];\n }, [options]);\n\n const dropdownRef = useRef<HTMLSelectElement>(null) as MutableRefObject<HTMLSelectElement>;\n const searchInputRef = useRef<HTMLInputElement>(null);\n const dropdownMenuRef = useRef<HTMLDivElement>(null);\n\n const listboxId = id || `listbox-${Math.random().toString(36).substring(2, 9)}`;\n const filteredOptions = searchOptions(allOptions, searchValue);\n\n const handleSelectOption = (option: OptionForListBoxProps) => {\n if (option.disabled) return;\n\n let newSelectedOptions: OptionForListBoxProps[];\n if (allowMultiSelect) {\n const isSelected = selectedOptions.some(opt => opt.value === option.value);\n if (isSelected) {\n newSelectedOptions = selectedOptions.filter(opt => opt.value !== option.value);\n } else {\n if (selectionLimit && selectedOptions.length >= selectionLimit) {\n return;\n }\n newSelectedOptions = [...selectedOptions, option];\n }\n setSelectedOptions(newSelectedOptions);\n onChange?.(newSelectedOptions.map(opt => opt.value));\n } else {\n newSelectedOptions = [option];\n setSelectedOption(option);\n setSelectedOptions(newSelectedOptions);\n onChange?.(option.value);\n setIsOpen(false);\n }\n\n setSearchValue(\"\");\n setActiveIndex(-1);\n };\n\n const handleSearchChange = (value: string) => {\n setSearchValue(value);\n };\n\n const handleCustomEntry = () => {\n if (!searchValue.trim() || !allowCustomEntries) return;\n\n const customValue = searchValue.trim();\n const customOption: OptionForListBoxProps = {\n value: customValue,\n label: customValue,\n };\n\n // If this option doesn't exist yet\n if (!allOptions.some(opt => opt.value === customValue)) {\n handleSelectOption(customOption);\n }\n };\n\n const handleDeleteOption = (valueToRemove: string) => {\n if (allowMultiSelect) {\n // Filter out the option to remove\n const newSelectedOptions = selectedOptions.filter(opt => opt.value !== valueToRemove);\n\n // Update local state\n setSelectedOptions(newSelectedOptions);\n\n // Notify parent\n onChange?.(newSelectedOptions.map(opt => opt.value));\n } else {\n // For single-select mode, just clear everything\n setSelectedOption(null);\n setSelectedOptions([]);\n onChange?.(\"\");\n }\n };\n\n const handleClearAll = () => {\n // Reset local state for both single and multi-select\n setSelectedOption(null);\n setSelectedOptions([]);\n\n // Notify parent with empty data\n onChange?.(allowMultiSelect ? [] : \"\");\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setActiveIndex(0);\n } else {\n setActiveIndex(prev =>\n prev < filteredOptions.length - 1 ? prev + 1 : prev\n );\n }\n break;\n\n case \"ArrowUp\":\n event.preventDefault();\n setActiveIndex(prev => prev > 0 ? prev - 1 : prev);\n break;\n\n case \"Enter\":\n event.preventDefault();\n if (allowCustomEntries && searchValue.trim()) {\n const exactMatch = filteredOptions.find(opt =>\n opt.label.toLowerCase() === searchValue.trim().toLowerCase()\n );\n if (exactMatch) {\n handleSelectOption(exactMatch);\n } else {\n handleCustomEntry();\n }\n } else if (activeIndex >= 0 && filteredOptions[activeIndex]) {\n handleSelectOption(filteredOptions[activeIndex]);\n }\n break;\n\n case \"Escape\":\n event.preventDefault();\n setIsOpen(false);\n setActiveIndex(-1);\n break;\n\n case \" \": // Space key\n if (!isOpen) {\n event.preventDefault();\n setIsOpen(true);\n setActiveIndex(0);\n }\n break;\n\n case \"Home\":\n if (isOpen) {\n event.preventDefault();\n setActiveIndex(0);\n }\n break;\n\n case \"End\":\n if (isOpen) {\n event.preventDefault();\n setActiveIndex(filteredOptions.length - 1);\n }\n break;\n }\n };\n\n useClickOutside(dropdownRef, () => {\n setIsOpen(false);\n setActiveIndex(-1);\n });\n\n useEffect(() => {\n if (isOpen && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isOpen]);\n\n // Determine if dropdown should open upward based on available viewport space\n useEffect(() => {\n if (isOpen && dropdownRef.current) {\n const wrapperRect = dropdownRef.current.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n // Estimate dropdown height (max-height is 240px for options + search + padding)\n const estimatedDropdownHeight = 300;\n const spaceBelow = viewportHeight - wrapperRect.bottom;\n const spaceAbove = wrapperRect.top;\n\n // Open upward if not enough space below but enough space above\n setOpenUpward(spaceBelow < estimatedDropdownHeight && spaceAbove > spaceBelow);\n } else {\n setOpenUpward(false);\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (activeIndex >= 0) {\n const activeOption = document.querySelector(`[data-index=\"${activeIndex}\"]`);\n activeOption?.scrollIntoView({ block: \"nearest\" });\n }\n }, [activeIndex]);\n\n // Separate wrapper-level props (margin, padding, etc.) from input-specific props\n const { wrapperProps, inputProps } = separateWrapperProps(props);\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n isFullWidth={isFullWidth}\n size={size}\n {...wrapperProps}\n >\n {/* PARENT */}\n <Element\n as=\"div\"\n data-list-box\n classNames={[\"list-box-wrapper\", disabled ? \"disabled\" : \"\", className || \"\"]}\n ref={dropdownRef}\n isFullWidth={isFullWidth}\n {...inputProps}\n >\n <Div\n className=\"list-box-input-wrapper\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={`${listboxId}-listbox`}\n aria-owns={`${listboxId}-listbox`}\n tabIndex={disabled ? -1 : 0}\n >\n {allowMultiSelect ? (\n <>\n {selectedOptions.length > 0 ? (\n <Div className=\"options-wrapper\">\n <Div className=\"options-list\">\n {selectedOptions.map(option => (\n <Badge\n key={option.value}\n actionIcon=\"cross\"\n onActionClick={() => handleDeleteOption(option.value)}\n actionAriaLabel={`Remove ${option.label}`}\n size=\"small\"\n shape=\"rounded\"\n >\n <Text>{option.label}</Text>\n </Badge>\n ))}\n </Div>\n {selectionLimit && selectedOptions.length >= selectionLimit && (\n <Text className=\"options-limit-warning\" textColour=\"red\" size=\"tiny\">\n You can choose only {selectionLimit} option{selectionLimit === 1 ? \"\" : \"s\"}\n </Text>\n )}\n </Div>\n ) : (\n <span className=\"placeholder\">{placeholder}</span>\n )}\n\n {/* Clear button for multi-select */}\n {selectedOptions.length > 0 && (\n <Div\n className=\"icon-wrapper clear-all\"\n title=\"Clear all options\"\n onClick={() => handleClearAll()}\n >\n <svg viewBox=\"0 0 24 24\">\n <line x1=\"5\" y1=\"5\" x2=\"19\" y2=\"19\" />\n <line x1=\"5\" y1=\"19\" x2=\"19\" y2=\"5\" />\n </svg>\n </Div>\n )}\n </>\n ) : (\n selectedOptions[0]\n ? <Text className=\"selected-option\">{selectedOptions[0].label}</Text>\n : <span className=\"placeholder\">{placeholder}</span>\n )}\n\n <Div className=\"icon-wrapper chevrons\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <polyline points=\"6 9 12 4 18 9\"></polyline>\n <polyline points=\"6 15 12 20 18 15\"></polyline>\n </svg>\n </Div>\n </Div>\n\n {/* DROPDOWN */}\n {isOpen && !disabled && (\n <Div\n ref={dropdownMenuRef}\n className={`list-box-dropdown${openUpward ? \" opens-upward\" : \"\"}`}\n >\n <Div className=\"list-box-search-wrapper\">\n <InputField\n type=\"text\"\n ref={searchInputRef}\n className=\"list-box-search\"\n placeholder={allowCustomEntries ? \"Type to search or add new\" : \"Search\"}\n value={searchValue}\n onChange={handleSearchChange}\n onKeyDown={handleKeyDown}\n aria-controls={`${listboxId}-listbox`}\n aria-label=\"Search options\"\n isFullWidth\n />\n {allowCustomEntries && searchValue.trim() && !selectedOptions.some(opt =>\n opt.label.toLowerCase() === searchValue.trim().toLowerCase()) && (\n <kbd\n className=\"list-box-enter-key\"\n aria-label=\"Press Enter to add custom option\"\n >\n ↵\n </kbd>\n )}\n </Div>\n\n {/* OPTIONS */}\n <Element\n as=\"ul\"\n id={`${listboxId}-listbox`}\n className=\"list-box-options\"\n role=\"listbox\"\n aria-multiselectable={allowMultiSelect}\n aria-busy={isLoading}\n tabIndex={-1}\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <li\n key={option.value}\n id={`${listboxId}-option-${option.value}`}\n className={`list-box-option ${option.disabled ? \"disabled\" : \"\"} ${activeIndex === index ? \"active\" : \"\"}`}\n role=\"option\"\n aria-selected={selectedOptions.some(opt => opt.value === option.value)}\n aria-disabled={option.disabled}\n onClick={() => handleSelectOption(option)}\n data-index={index}\n tabIndex={-1}\n >\n {option.customLabel || option.label}\n </li>\n ))\n ) : (\n <li\n className=\"list-box-option disabled\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {allowCustomEntries\n ? \"Type and press Enter to add new option\"\n : \"No matches found\"\n }\n </li>\n )}\n </Element>\n </Div>\n )}\n </Element>\n </FormItem>\n );\n }\n);\nListBox.displayName = \"ListBox\";\n","// FRAMEWORK ===========================================================================================================\nimport React, { createRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from \"react\";\n\n// FICTOAN =============================================================================================================\nimport { InputField } from \"../InputField/InputField\";\nimport { Div } from \"../../Element/Tags\";\n\n// STYLES ==============================================================================================================\nimport \"./pin-input-field.css\";\n\n// TYPES ===============================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\n\ninterface PinInputFieldHandle extends HTMLDivElement {\n reset: () => void;\n}\n\n// prettier-ignore\ntype PinInputFieldCustomProps = {\n numberOfFields : number;\n onChange ? : (value: string) => void;\n type ? : \"alphanumeric\" | \"number\";\n mask ? : boolean;\n isOTP ? : boolean;\n autoFocus ? : boolean;\n pasteFromClipboard ? : \"enabled\" | \"disabled\";\n focusFirstInputOnReset ? : boolean;\n isFullWidth ? : boolean;\n ariaLabel ? : string;\n};\n\nexport type PinInputFieldElementType = HTMLDivElement & { reset: () => void };\nexport type PinInputFieldProps = Omit<CommonAndHTMLProps<PinInputFieldElementType>, keyof PinInputFieldCustomProps> &\n PinInputFieldCustomProps;\n\n// UTILITIES ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nfunction validate(value: string, type: \"alphanumeric\" | \"number\") {\n const NUMERIC_REGEX = /^[0-9]+$/;\n const ALPHA_NUMERIC_REGEX = /^[a-zA-Z0-9]+$/i;\n const regex = type === \"alphanumeric\" ? ALPHA_NUMERIC_REGEX : NUMERIC_REGEX;\n return regex.test(value);\n}\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const PinInputField = React.forwardRef(\n (\n {\n numberOfFields: length,\n onChange,\n type = \"number\",\n mask = false,\n isOTP = false,\n autoFocus = false,\n pasteFromClipboard = \"enabled\",\n focusFirstInputOnReset = true,\n isFullWidth,\n ariaLabel,\n ...props\n }: PinInputFieldProps,\n ref: React.Ref<PinInputFieldElementType>\n ) => {\n // REFS =====================================================================================================\n const pinInputFieldRef = useRef<PinInputFieldElementType>(null);\n const [inputRefs, setInputRefs] = useState<React.RefObject<HTMLInputElement>[]>([]);\n\n // STATES ===================================================================================================\n const [values, setValues] = useState<string[]>([]);\n const [moveFocus, setMoveFocus] = useState<boolean>(true);\n const [focusedIndex, setFocusedIndex] = useState<number>(-1);\n\n // CONSTANTS ================================================================================================\n const inputGroupId = props.id || `pin-input-${Math.random().toString(36).substring(2, 9)}`;\n const inputDescription = ariaLabel || 'Enter verification code';\n\n // HANDLERS =================================================================================================\n const focus = useCallback(\n (index: number) => {\n const ref = inputRefs[index];\n ref?.current?.focus();\n },\n [inputRefs]\n );\n\n const focusNext = useCallback(\n (index: number) => {\n if (!moveFocus) return;\n const next = index + 1 < length ? index + 1 : null;\n if (next) {\n focus(next);\n }\n },\n [focus, length, moveFocus]\n );\n\n const handleResetPinInput = useCallback(() => {\n setValues(Array(length).fill(\"\"));\n onChange?.(\"\"); // Clear the complete value\n if (focusFirstInputOnReset) {\n focus(0);\n setFocusedIndex(0);\n }\n }, [length, onChange, focus, focusFirstInputOnReset]);\n\n // VALUE HANDLING ==============================================================================================\n const setValue = useCallback(\n (value: string, index: number) => {\n const nextValues = [...values];\n nextValues[index] = value;\n setValues(nextValues);\n\n // Emit complete PIN value\n onChange?.(nextValues.join(\"\"));\n\n const isComplete =\n value !== \"\" &&\n nextValues.length === length &&\n nextValues.every((inputValue) => inputValue != null && inputValue !== \"\") &&\n index === length - 1;\n\n if (!isComplete) {\n setMoveFocus(true);\n focusNext(index);\n }\n },\n [focusNext, length, onChange, values]\n );\n\n // Updated input handler to work with both string values and events\n const handleInputChange = useCallback((inputValue: string | React.FormEvent<HTMLInputElement>, inputFieldIndex: number) => {\n // Extract value whether we get a string or an event\n const value = typeof inputValue === \"string\" ? inputValue : (inputValue.target as HTMLInputElement).value;\n const currentValue = values[inputFieldIndex];\n\n if (value === \"\") {\n setValue(\"\", inputFieldIndex);\n return;\n }\n\n // Rest of the logic remains the same\n if (value.length > 1 && inputFieldIndex < length - 1) {\n if (validate(value, type)) {\n let nextValue: string[] = [];\n const chars = value.split(\"\");\n\n if (currentValue === \"\") {\n nextValue = chars.filter((_, j) => inputFieldIndex + j < length);\n } else {\n const isAppending = inputRefs[inputFieldIndex].current?.selectionEnd === value.length;\n if (isAppending) {\n nextValue = chars.filter((_, j) => j > 0 && inputFieldIndex + j - 1 < length);\n } else {\n nextValue = chars.filter((_, j) => j < value.length - 1 && inputFieldIndex + j < length);\n }\n }\n\n const newValues = values.map((v, j) =>\n j >= inputFieldIndex && j < inputFieldIndex + nextValue.length\n ? nextValue[j - inputFieldIndex]\n : v\n );\n\n setValues(newValues);\n onChange?.(newValues.join(\"\"));\n\n const nextFocusIndex = Math.min(inputFieldIndex + nextValue.length, length - 1);\n focus(nextFocusIndex);\n }\n } else {\n let nextValue = value;\n if (currentValue?.length > 0) {\n nextValue = value.charAt(value.length - 1);\n }\n if (validate(nextValue, type)) {\n setValue(nextValue, inputFieldIndex);\n }\n }\n }, [length, onChange, setValue, type, values, focus, inputRefs]);\n\n const handleKeyDown = useCallback((event: React.KeyboardEvent<HTMLInputElement>, i: number) => {\n if (event.key === \"Backspace\") {\n if ((event.target as HTMLInputElement).value === \"\") {\n if (i > 0) {\n const newIndex = i - 1;\n setValue(\"\", newIndex);\n focus(newIndex);\n setMoveFocus(true);\n }\n } else {\n setMoveFocus(false);\n }\n } else if (event.key === \"Escape\") {\n inputRefs[i].current?.blur();\n handleBlur();\n } else if (event.key === \"ArrowRight\") {\n if (i < length - 1) {\n focus(i + 1);\n }\n } else if (event.key === \"ArrowLeft\") {\n if (i > 0) {\n focus(i - 1);\n }\n }\n }, [focus, setValue, inputRefs, length]);\n\n // EVENT HANDLERS ==============================================================================================\n // Updated focus handler to work with event type\n const handleFocus = useCallback((e: React.FocusEvent<HTMLInputElement> | undefined, i: number) => {\n setFocusedIndex(i);\n }, []);\n\n // When moving around the InputElements using tab key, browsers automatically select\n // the value (if it exists) in the InputElement - which we want to disable. Additionally,\n // when an existing value is selected/highlighted and pasted over, there is no way to\n // clearly distinguish between the other 2 scenarios of pasting by keeping the cursor before\n // and after the existing value. Specific example: If the existing value is 5, the event\n // when highlighting and pasting '567' is the same as placing the cursor before the existing\n // value and pasting '67'. By disabling this, we eliminate one of these cases.\n // Is this a hack? Yes. Is there a better way? IDK. Does it matter? Not unless there is a\n // valid reason for users to need selecting a single InputElement within a PinInput.\n const handleSelect = useCallback((e: React.SyntheticEvent<HTMLInputElement, Event>) => {\n const target = e.target as HTMLInputElement;\n setTimeout(() => {\n target.setSelectionRange(target.value.length, target.value.length);\n }, 0);\n }, []);\n\n const handleBlur = useCallback(() => {\n setFocusedIndex(-1);\n }, []);\n\n // EFFECTS =====================================================================================================\n useEffect(() => {\n setInputRefs((inputRefs) => {\n const refs = Array(length)\n .fill(0)\n .map((_, i) => {\n const ref = inputRefs[i] || createRef();\n if (autoFocus && i === 0) {\n ref.current?.focus();\n }\n return ref;\n });\n return refs;\n });\n }, [length, autoFocus]);\n\n useImperativeHandle(\n ref,\n () => ({\n ...(pinInputFieldRef.current as HTMLDivElement),\n reset: handleResetPinInput\n }) as PinInputFieldHandle,\n [handleResetPinInput]\n );\n\n // RENDER ==================================================================================================\n let classNames: string[] = [];\n\n if (isFullWidth) {\n classNames.push(\"full-width\");\n }\n\n return (\n <Div\n data-pin-input-field\n ref={pinInputFieldRef}\n classNames={isFullWidth ? [\"full-width\"] : []}\n role=\"group\"\n aria-label={inputDescription}\n aria-required={props.required}\n {...props}\n >\n {Array.from({ length }, (_, i) => (\n <InputField\n key={i}\n id={`${inputGroupId}-${i}`}\n ref={inputRefs[i]}\n type={mask ? \"password\" : type === \"number\" ? \"tel\" : \"text\"}\n inputMode={type === \"number\" ? \"numeric\" : \"text\"}\n onChange={(value: string | React.FormEvent<HTMLInputElement>) => handleInputChange(value, i)}\n onKeyDown={(e) => handleKeyDown(e, i)}\n onFocus={(e) => handleFocus(e as React.FocusEvent<HTMLInputElement>, i)}\n onSelect={handleSelect}\n onBlur={handleBlur}\n placeholder={focusedIndex !== i ? \"\\u2981\" : undefined}\n autoComplete={isOTP ? \"one-time-code\" : \"off\"}\n value={values[i] || \"\"}\n autoFocus={autoFocus && i === 0}\n onCopy={(e) => pasteFromClipboard === \"disabled\" && e.preventDefault()}\n onPaste={(e) => pasteFromClipboard === \"disabled\" && e.preventDefault()}\n aria-label={`Digit ${i + 1} of ${length}`}\n aria-required={props.required}\n />\n ))}\n </Div>\n );\n }\n);\nPinInputField.displayName = \"PinInputField\";\n","// REACT CORE ==========================================================================================================\nimport React, { useMemo, useRef, useEffect, useState, useCallback } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Div } from \"$tags\";\nimport { Element } from \"$element\";\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { SpacingTypes } from \"../../Element/constants\";\nimport { separateWrapperProps } from \"../../../utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./radio-tab-group.css\";\n\n// OTHER ===============================================================================================================\nimport { RadioTabGroupProps, RadioButtonElementType } from \"./constants\";\n\ninterface IndicatorPosition {\n width: number;\n transform: string;\n}\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const RadioTabGroup = React.forwardRef<HTMLDivElement, RadioTabGroupProps>(\n (\n {\n id,\n name,\n label,\n helpText,\n errorText,\n options,\n defaultValue,\n value,\n required,\n onChange,\n size = \"medium\",\n bgColour,\n disabled,\n ...props\n },\n ref\n ) => {\n const derivedName = useMemo(() => name || id, [name, id]);\n const optionsWrapperRef = useRef<HTMLDivElement>(null);\n\n const [indicatorPos, setIndicatorPos] = useState<IndicatorPosition>({\n width: 0,\n transform: \"translateX(0)\",\n });\n const [needsScroll, setNeedsScroll] = useState(false);\n const [scrollPosition, setScrollPosition] = useState(0);\n const [maxScroll, setMaxScroll] = useState(0);\n\n const labelsRef = useRef<(HTMLLabelElement | null)[]>([]);\n\n const measureWidths = useCallback(() => {\n if (!optionsWrapperRef.current) return;\n\n const wrapper = optionsWrapperRef.current;\n const inputWrapper = wrapper.closest(\"[data-input-wrapper]\");\n\n if (wrapper && inputWrapper) {\n const totalContentWidth = wrapper.scrollWidth;\n const availableWidth = inputWrapper.clientWidth;\n const needsToScroll = totalContentWidth > availableWidth;\n\n setNeedsScroll(needsToScroll);\n setMaxScroll(needsToScroll ? totalContentWidth - availableWidth : 0);\n }\n }, []);\n\n useEffect(() => {\n const wrapper = optionsWrapperRef.current;\n if (!wrapper) return;\n\n // Initial measurement\n measureWidths();\n\n // Set up observer for size changes\n const observer = new ResizeObserver(() => {\n measureWidths();\n });\n\n observer.observe(wrapper);\n if (wrapper.closest(\"[data-input-wrapper]\")) {\n observer.observe(wrapper.closest(\"[data-input-wrapper]\") as Element);\n }\n\n return () => observer.disconnect();\n }, [measureWidths]);\n\n // Update indicator position based on selected radio\n useEffect(() => {\n const selectedIndex = options.findIndex(option => option.value === value);\n if (selectedIndex >= 0) {\n const updateIndicator = () => {\n const label = labelsRef.current[selectedIndex];\n if (label) {\n const width = label.offsetWidth;\n let transform = \"translateX(0)\";\n\n if (selectedIndex > 0) {\n const offset = labelsRef.current\n .slice(0, selectedIndex)\n .reduce((acc, label) => acc + (label?.offsetWidth || 0), 0);\n transform = `translateX(${offset}px)`;\n }\n\n setIndicatorPos({ width, transform });\n }\n };\n\n // Wait for fonts to load before measuring to get correct widths\n if (document.fonts && document.fonts.ready) {\n document.fonts.ready.then(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(updateIndicator);\n });\n });\n } else {\n const timeoutId = setTimeout(updateIndicator, 100);\n return () => clearTimeout(timeoutId);\n }\n }\n }, [value, options]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.value);\n };\n\n // Separate wrapper-level props (margin, padding, etc.) from component-specific props\n const { wrapperProps, inputProps } = separateWrapperProps(props);\n\n const handleScroll = useCallback((direction: \"left\" | \"right\") => {\n const wrapper = optionsWrapperRef.current;\n if (!wrapper) return;\n\n const visibleWidth = wrapper.clientWidth;\n const scrollAmount = visibleWidth * 0.8;\n\n let newPosition = direction === \"right\"\n ? Math.min(scrollPosition + scrollAmount, maxScroll)\n : Math.max(scrollPosition - scrollAmount, 0);\n\n setScrollPosition(newPosition);\n\n requestAnimationFrame(() => {\n wrapper.style.transform = `translateX(-${newPosition}px)`;\n });\n }, [scrollPosition, maxScroll]);\n\n const canScrollLeft = scrollPosition > 0;\n const canScrollRight = scrollPosition < maxScroll;\n\n const classNames: string[] = [];\n if (size) {\n classNames.push(`size-${size}`);\n }\n\n return (\n <FormItem\n label={label}\n htmlFor={id}\n helpText={helpText}\n errorText={errorText}\n required={required}\n size={size}\n {...wrapperProps}\n >\n <Element\n as=\"div\"\n data-radio-tab-group\n ref={ref}\n classNames={classNames}\n name={derivedName}\n {...inputProps}\n >\n {/* LEFT SCROLL BUTTON */}\n {needsScroll && canScrollLeft && (\n <Div\n className=\"scroll-button left\"\n onClick={() => handleScroll(\"left\")}\n >\n <svg viewBox=\"0 0 24 24\">\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </Div>\n )}\n\n {/* RADIO OPTIONS */}\n <Div className=\"rtg-options-container\">\n <Div\n className=\"rtg-options-wrapper\"\n ref={optionsWrapperRef}\n >\n {/* INDICATOR */}\n <Div\n className=\"indicator\"\n style={{\n width: `${indicatorPos.width}px`,\n transform: indicatorPos.transform,\n }}\n />\n\n {options.map((option, index) => {\n const { id: optionId, ...optionProps } = option;\n const finalId = optionId || `${id}-option-${index}`;\n\n return (\n <React.Fragment key={finalId}>\n <input\n type=\"radio\"\n {...optionProps}\n id={finalId}\n name={derivedName}\n checked={value === option.value}\n disabled={disabled || option.disabled}\n onChange={handleChange}\n />\n <label\n ref={el => { labelsRef.current[index] = el; }}\n htmlFor={finalId}\n >\n {option.label}\n </label>\n </React.Fragment>\n );\n })}\n </Div>\n\n {/* RIGHT SCROLL BUTTON */}\n {needsScroll && canScrollRight && (\n <Div\n className=\"scroll-button right\"\n onClick={() => handleScroll(\"right\")}\n >\n <svg viewBox=\"0 0 24 24\">\n <polyline points=\"9 6 15 12 9 18\" />\n </svg>\n </Div>\n )}\n </Div>\n </Element>\n </FormItem>\n );\n }\n);\nRadioTabGroup.displayName = \"RadioTabGroup\";\n","// REACT CORE ==========================================================================================================\nimport React, { useCallback, useRef, useState, useEffect } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, CommonProps, SpacingTypes } from \"../../Element/constants\";\nimport { Div } from \"../../Element/Tags\";\n\n// UTILS ===============================================================================================================\nimport { separateWrapperProps } from \"../../../utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./range.css\";\n\n// OTHER ===============================================================================================================\nimport { FormItem } from \"../FormItem/FormItem\";\nimport { InputLabel } from \"../InputLabel/InputLabel\";\nimport { Text } from \"../../Typography/Text\";\n\n// Single-thumb range\nexport interface SingleRangeCustomProps {\n min ? : number;\n max ? : number;\n step ? : number;\n suffix ? : string;\n value ? : number;\n onChange ? : (value : number) => void;\n}\n\n// Dual-thumb range\nexport interface DualRangeCustomProps {\n min ? : number;\n max ? : number;\n step ? : number;\n suffix ? : string;\n value ? : [ number, number ];\n onChange ? : (value : [ number, number ]) => void;\n minLabel ? : string;\n maxLabel ? : string;\n}\n\nexport type RangeElementType = HTMLInputElement;\n\n// Separate prop types for each mode\nexport type SingleRangeProps = Omit<CommonAndHTMLProps<RangeElementType>, \"onChange\" | \"value\" | \"size\"> &\n SingleRangeCustomProps &\n CommonProps & {\n label ? : string;\n helpText ? : string;\n errorText ? : string;\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n};\n\nexport type DualRangeProps = Omit<CommonAndHTMLProps<RangeElementType>, \"onChange\" | \"value\" | \"size\"> &\n DualRangeCustomProps &\n CommonProps & {\n label ? : string;\n helpText ? : string;\n errorText ? : string;\n size ? : Exclude<SpacingTypes, \"nano\" | \"huge\">;\n};\n\nexport type RangeProps = SingleRangeProps | DualRangeProps;\n\n// Type guard to check if props are for dual-thumb mode\nfunction isDualRangeProps(props : RangeProps) : props is DualRangeProps {\n return Array.isArray(props.value);\n}\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Range = React.forwardRef<RangeElementType, RangeProps>(\n (props, ref) => {\n if (isDualRangeProps(props)) {\n return <DualThumbRange {...props} forwardedRef={ref} />;\n }\n return <SingleThumbRange {...props} forwardedRef={ref} />;\n },\n);\nRange.displayName = \"Range\";\n\n// SINGLE THUMB COMPONENT //////////////////////////////////////////////////////////////////////////////////////////////\ninterface SingleThumbRangeInternalProps extends SingleRangeProps {\n forwardedRef ? : React.Ref<RangeElementType>;\n}\n\nconst SingleThumbRange : React.FC<SingleThumbRangeInternalProps> = ({\n label,\n helpText,\n errorText,\n value = 0,\n suffix,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n id,\n disabled,\n size,\n ...props\n}) => {\n // Separate wrapper-level props (margin, padding, etc.) from component-specific props\n const {wrapperProps} = separateWrapperProps(props);\n\n const thumbRef = useRef<HTMLButtonElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const [ isDragging, setIsDragging ] = useState(false);\n const [ isActive, setIsActive ] = useState(false);\n\n // Clamp value to valid range\n const clampedValue = Math.max(min, Math.min(max, value));\n\n // Convert value to percentage position\n const getPercent = useCallback((val : number) => {\n if (max <= min) return 0;\n const clamped = Math.max(min, Math.min(max, val));\n return ((clamped - min) / (max - min)) * 100;\n }, [ min, max ]);\n\n // Convert mouse/touch position to value\n const getValueFromPosition = useCallback((clientX : number) => {\n if (!trackRef.current) return min;\n\n const rect = trackRef.current.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const rawValue = min + percent * (max - min);\n\n // Snap to step\n const steppedValue = Math.round(rawValue / step) * step;\n return Math.max(min, Math.min(max, steppedValue));\n }, [ min, max, step ]);\n\n // Handle drag\n const handleDrag = useCallback((clientX : number) => {\n const newValue = getValueFromPosition(clientX);\n onChange?.(newValue);\n }, [ getValueFromPosition, onChange ]);\n\n // Mouse events\n const handleMouseDown = useCallback((e : React.MouseEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsDragging(true);\n setIsActive(true);\n handleDrag(e.clientX);\n }, [ disabled, handleDrag ]);\n\n useEffect(() => {\n if (!isDragging) return;\n\n const handleMouseMove = (e : MouseEvent) => {\n handleDrag(e.clientX);\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [ isDragging, handleDrag ]);\n\n // Touch events\n const handleTouchStart = useCallback((e : React.TouchEvent) => {\n if (disabled) return;\n setIsDragging(true);\n setIsActive(true);\n handleDrag(e.touches[0].clientX);\n }, [ disabled, handleDrag ]);\n\n useEffect(() => {\n if (!isDragging) return;\n\n const handleTouchMove = (e : TouchEvent) => {\n e.preventDefault();\n handleDrag(e.touches[0].clientX);\n };\n\n const handleTouchEnd = () => {\n setIsDragging(false);\n };\n\n document.addEventListener(\"touchmove\", handleTouchMove, {passive : false});\n document.addEventListener(\"touchend\", handleTouchEnd);\n\n return () => {\n document.removeEventListener(\"touchmove\", handleTouchMove);\n document.removeEventListener(\"touchend\", handleTouchEnd);\n };\n }, [ isDragging, handleDrag ]);\n\n // Keyboard navigation\n const handleKeyDown = useCallback((e : React.KeyboardEvent) => {\n if (disabled) return;\n\n let newValue = clampedValue;\n\n switch (e.key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n e.preventDefault();\n newValue = Math.min(clampedValue + step, max);\n break;\n case \"ArrowLeft\":\n case \"ArrowDown\":\n e.preventDefault();\n newValue = Math.max(clampedValue - step, min);\n break;\n case \"Home\":\n e.preventDefault();\n newValue = min;\n break;\n case \"End\":\n e.preventDefault();\n newValue = max;\n break;\n case \"PageUp\":\n e.preventDefault();\n newValue = Math.min(clampedValue + step * 10, max);\n break;\n case \"PageDown\":\n e.preventDefault();\n newValue = Math.max(clampedValue - step * 10, min);\n break;\n default:\n return;\n }\n\n onChange?.(newValue);\n }, [ disabled, clampedValue, min, max, step, onChange ]);\n\n const percent = getPercent(clampedValue);\n\n return (\n <FormItem\n customLabel={label && (\n <Div data-range-meta>\n <InputLabel\n className=\"range-label\"\n label={label}\n htmlFor={id}\n />\n <Text className=\"range-value\">\n {clampedValue}{suffix && suffix}\n </Text>\n </Div>\n )}\n helpText={helpText}\n errorText={errorText}\n size={size}\n {...wrapperProps}\n >\n <Div\n ref={trackRef}\n data-range-single\n className={disabled ? \"disabled\" : \"\"}\n role=\"group\"\n aria-labelledby={label ? `${id}-label` : undefined}\n >\n {/* Track background */}\n <Div className=\"range-track\" aria-hidden=\"true\" />\n\n {/* Filled track from start to thumb */}\n <Div\n className=\"range-track-fill\"\n style={{\n left : \"0%\",\n right : `${100 - percent}%`,\n }}\n aria-hidden=\"true\"\n />\n\n {/* Thumb */}\n <button\n ref={thumbRef}\n id={id}\n type=\"button\"\n className=\"range-thumb\"\n style={{left : `${percent}%`}}\n disabled={disabled}\n onMouseDown={handleMouseDown}\n onTouchStart={handleTouchStart}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsActive(true)}\n onBlur={() => setIsActive(false)}\n data-active={isActive || isDragging}\n role=\"slider\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={clampedValue}\n aria-valuetext={`${clampedValue}${suffix ? ` ${suffix}` : \"\"}`}\n aria-orientation=\"horizontal\"\n />\n </Div>\n </FormItem>\n );\n};\n\nSingleThumbRange.displayName = \"SingleThumbRange\";\n\n// DUAL THUMB COMPONENT ////////////////////////////////////////////////////////////////////////////////////////////////\ninterface DualThumbRangeInternalProps extends DualRangeProps {\n forwardedRef ? : React.Ref<RangeElementType>;\n}\n\nconst DualThumbRange : React.FC<DualThumbRangeInternalProps> = ({\n label,\n helpText,\n errorText,\n value = [ 0, 100 ],\n suffix,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n minLabel = \"Minimum value\",\n maxLabel = \"Maximum value\",\n id,\n disabled,\n size,\n ...props\n}) => {\n // Separate wrapper-level props (margin, padding, etc.) from component-specific props\n const {wrapperProps} = separateWrapperProps(props);\n\n const [ rawMinValue, rawMaxValue ] = value;\n // Clamp values to valid range\n const minValue = Math.max(min, Math.min(max, rawMinValue));\n const maxValue = Math.max(min, Math.min(max, rawMaxValue));\n\n const minThumbRef = useRef<HTMLButtonElement>(null);\n const maxThumbRef = useRef<HTMLButtonElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const [ isDragging, setIsDragging ] = useState<\"min\" | \"max\" | null>(null);\n const [ activeThumb, setActiveThumb ] = useState<\"min\" | \"max\" | null>(null);\n\n // Convert value to percentage position\n const getPercent = useCallback((val : number) => {\n if (max <= min) return 0;\n const clamped = Math.max(min, Math.min(max, val));\n return ((clamped - min) / (max - min)) * 100;\n }, [ min, max ]);\n\n // Convert mouse/touch position to value\n const getValueFromPosition = useCallback((clientX : number) => {\n if (!trackRef.current) return min;\n\n const rect = trackRef.current.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const rawValue = min + percent * (max - min);\n\n // Snap to step\n const steppedValue = Math.round(rawValue / step) * step;\n return Math.max(min, Math.min(max, steppedValue));\n }, [ min, max, step ]);\n\n // Handle drag for either thumb\n const handleDrag = useCallback((clientX : number, thumb : \"min\" | \"max\") => {\n const newValue = getValueFromPosition(clientX);\n\n if (thumb === \"min\") {\n const clampedMin = Math.min(newValue, maxValue - step);\n onChange?.([ clampedMin, maxValue ]);\n } else {\n const clampedMax = Math.max(newValue, minValue + step);\n onChange?.([ minValue, clampedMax ]);\n }\n }, [ getValueFromPosition, minValue, maxValue, step, onChange ]);\n\n // Mouse events\n const handleMouseDown = useCallback((thumb : \"min\" | \"max\") => (e : React.MouseEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsDragging(thumb);\n setActiveThumb(thumb);\n handleDrag(e.clientX, thumb);\n }, [ disabled, handleDrag ]);\n\n useEffect(() => {\n if (!isDragging) return;\n\n const handleMouseMove = (e : MouseEvent) => {\n handleDrag(e.clientX, isDragging);\n };\n\n const handleMouseUp = () => {\n setIsDragging(null);\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [ isDragging, handleDrag ]);\n\n // Touch events\n const handleTouchStart = useCallback((thumb : \"min\" | \"max\") => (e : React.TouchEvent) => {\n if (disabled) return;\n setIsDragging(thumb);\n setActiveThumb(thumb);\n handleDrag(e.touches[0].clientX, thumb);\n }, [ disabled, handleDrag ]);\n\n useEffect(() => {\n if (!isDragging) return;\n\n const handleTouchMove = (e : TouchEvent) => {\n e.preventDefault();\n handleDrag(e.touches[0].clientX, isDragging);\n };\n\n const handleTouchEnd = () => {\n setIsDragging(null);\n };\n\n document.addEventListener(\"touchmove\", handleTouchMove, {passive : false});\n document.addEventListener(\"touchend\", handleTouchEnd);\n\n return () => {\n document.removeEventListener(\"touchmove\", handleTouchMove);\n document.removeEventListener(\"touchend\", handleTouchEnd);\n };\n }, [ isDragging, handleDrag ]);\n\n // Keyboard navigation\n const handleKeyDown = useCallback((thumb : \"min\" | \"max\") => (e : React.KeyboardEvent) => {\n if (disabled) return;\n\n const currentValue = thumb === \"min\" ? minValue : maxValue;\n let newValue = currentValue;\n\n switch (e.key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n e.preventDefault();\n newValue = Math.min(currentValue + step, max);\n break;\n case \"ArrowLeft\":\n case \"ArrowDown\":\n e.preventDefault();\n newValue = Math.max(currentValue - step, min);\n break;\n case \"Home\":\n e.preventDefault();\n newValue = thumb === \"min\" ? min : minValue + step;\n break;\n case \"End\":\n e.preventDefault();\n newValue = thumb === \"max\" ? max : maxValue - step;\n break;\n case \"PageUp\":\n e.preventDefault();\n newValue = Math.min(currentValue + step * 10, max);\n break;\n case \"PageDown\":\n e.preventDefault();\n newValue = Math.max(currentValue - step * 10, min);\n break;\n default:\n return;\n }\n\n if (thumb === \"min\") {\n const clampedMin = Math.min(newValue, maxValue - step);\n onChange?.([ clampedMin, maxValue ]);\n } else {\n const clampedMax = Math.max(newValue, minValue + step);\n onChange?.([ minValue, clampedMax ]);\n }\n }, [ disabled, minValue, maxValue, min, max, step, onChange ]);\n\n const minPercent = getPercent(minValue);\n const maxPercent = getPercent(maxValue);\n\n return (\n <FormItem\n customLabel={label && (\n <Div data-range-meta>\n <InputLabel\n className=\"range-label\"\n label={label}\n htmlFor={id}\n />\n <Text className=\"range-value\">\n {minValue}&ndash;{maxValue}{suffix && suffix}\n </Text>\n </Div>\n )}\n helpText={helpText}\n errorText={errorText}\n size={size}\n {...wrapperProps}\n >\n <Div\n ref={trackRef}\n data-range-dual\n className={disabled ? \"disabled\" : \"\"}\n role=\"group\"\n aria-labelledby={label ? `${id}-label` : undefined}\n >\n {/* Track background */}\n <Div className=\"range-track\" aria-hidden=\"true\" />\n\n {/* Filled track between thumbs */}\n <Div\n className=\"range-track-fill\"\n style={{\n left : `${minPercent}%`,\n right : `${100 - maxPercent}%`,\n }}\n aria-hidden=\"true\"\n />\n\n {/* Min thumb */}\n <button\n ref={minThumbRef}\n id={`${id}-min`}\n type=\"button\"\n className=\"range-thumb range-thumb-min\"\n style={{left : `${minPercent}%`}}\n disabled={disabled}\n onMouseDown={handleMouseDown(\"min\")}\n onTouchStart={handleTouchStart(\"min\")}\n onKeyDown={handleKeyDown(\"min\")}\n onFocus={() => setActiveThumb(\"min\")}\n onBlur={() => setActiveThumb(null)}\n data-active={activeThumb === \"min\" || isDragging === \"min\"}\n role=\"slider\"\n aria-label={minLabel}\n aria-valuemin={min}\n aria-valuemax={maxValue - step}\n aria-valuenow={minValue}\n aria-valuetext={`${minValue}${suffix ? ` ${suffix}` : \"\"}`}\n aria-orientation=\"horizontal\"\n />\n\n {/* Max thumb */}\n <button\n ref={maxThumbRef}\n id={`${id}-max`}\n type=\"button\"\n className=\"range-thumb range-thumb-max\"\n style={{left : `${maxPercent}%`}}\n disabled={disabled}\n onMouseDown={handleMouseDown(\"max\")}\n onTouchStart={handleTouchStart(\"max\")}\n onKeyDown={handleKeyDown(\"max\")}\n onFocus={() => setActiveThumb(\"max\")}\n onBlur={() => setActiveThumb(null)}\n data-active={activeThumb === \"max\" || isDragging === \"max\"}\n role=\"slider\"\n aria-label={maxLabel}\n aria-valuemin={minValue + step}\n aria-valuemax={max}\n aria-valuenow={maxValue}\n aria-valuetext={`${maxValue}${suffix ? ` ${suffix}` : \"\"}`}\n aria-orientation=\"horizontal\"\n />\n </Div>\n </FormItem>\n );\n};\n\nDualThumbRange.displayName = \"DualThumbRange\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, CommonProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// UTILS ===============================================================================================================\nimport { separateWrapperProps } from \"../../utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./meter.css\";\n\n// OTHER ===============================================================================================================\nimport { Text } from \"../Typography/Text\";\n\nexport interface MeterLabelCustomProps {\n suffix ? : string;\n}\n\nexport interface MeterCustomProps {\n min : number;\n max : number;\n low : number;\n high : number;\n value : number;\n optimum ? : number;\n showOptimumMarker ? : boolean;\n suffix ? : string;\n height ? : string;\n label ? : string;\n ariaLabel ? : string;\n description ? : string;\n}\n\nexport type MeterElementType = HTMLMeterElement;\nexport type MeterProps = MeterCustomProps & CommonProps;\nexport type MeterMetaProps = Omit<CommonAndHTMLProps<HTMLDivElement>, keyof MeterLabelCustomProps> &\n MeterLabelCustomProps;\n\n// TODO: Add size for label\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Meter = React.forwardRef(\n ({\n label,\n value,\n height,\n suffix,\n showOptimumMarker,\n ariaLabel,\n description,\n min,\n max,\n low,\n high,\n optimum,\n ...props\n } : MeterProps, ref : React.Ref<MeterElementType>) => {\n const optimumPositionPercent = optimum ? (\n (optimum - min) / (max - min)\n ) * 100 : 0;\n\n const getValueDescription = () => {\n const percentage = (\n (value - min) / (max - min)\n ) * 100;\n let status : string;\n\n if (value <= low) {\n status = \"Low\";\n } else if (value >= high) {\n status = \"High\";\n } else {\n status = \"Normal\";\n }\n\n return `Current value is ${value}${suffix || \"\"} (${percentage.toFixed(1)}%). Status: ${status}`;\n };\n\n // Separate wrapper-level props (margin, padding, etc.) from meter-specific props\n const {wrapperProps, inputProps} = separateWrapperProps(props);\n\n return (\n <Element<HTMLDivElement>\n as=\"div\"\n role=\"region\"\n aria-label={ariaLabel || \"Meter indicator\"}\n {...wrapperProps}\n >\n {label && (\n <Element<HTMLDivElement>\n as=\"div\"\n data-meter-meta\n id={`meter-label-${label.toLowerCase().replace(/\\s+/g, \"-\")}`}\n >\n <Text>{label}</Text>\n <Text>\n {value}\n {suffix && suffix}\n </Text>\n </Element>\n )}\n\n <div\n className=\"meter-wrapper\"\n role=\"presentation\"\n >\n <Element<MeterElementType>\n as=\"meter\"\n data-meter\n ref={ref}\n value={value}\n min={min}\n max={max}\n low={low}\n high={high}\n optimum={optimum}\n {...inputProps}\n style={{height}}\n aria-label={label || ariaLabel || \"Progress meter\"}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-valuetext={getValueDescription()}\n aria-describedby={description ? `meter-description-${label?.toLowerCase()\n .replace(/\\s+/g, \"-\")}` : undefined}\n />\n\n {showOptimumMarker && optimum && (\n <div\n className=\"optimum-marker\"\n style={{left : `calc(${optimumPositionPercent}% - var(--meter-border-width))`}}\n title={`Optimum: ${optimum}`}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n )}\n </div>\n\n {description && (\n <div\n id={`meter-description-${label?.toLowerCase().replace(/\\s+/g, \"-\")}`}\n className=\"sr-only\"\n >\n {description}\n </div>\n )}\n </Element>\n );\n },\n);\nMeter.displayName = \"Meter\";","// REACT CORE ==========================================================================================================\nimport React, { useEffect } from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./modal.css\";\n\n// OTHER ===============================================================================================================\nimport { Text } from \"$/components\";\n\nexport type ModalElementType = HTMLDivElement;\n\nexport interface ModalCustomProps {\n id : string;\n isOpen ? : boolean;\n onClose ? : () => void;\n isDismissible ? : boolean;\n showBackdrop ? : boolean;\n blurBackdrop ? : boolean;\n label ? : string;\n description ? : string;\n}\n\nexport type ModalProps = Omit<CommonAndHTMLProps<ModalElementType>, keyof ModalCustomProps> & ModalCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Modal = React.forwardRef(\n (\n {\n id,\n children,\n classNames = [],\n isOpen = false,\n onClose,\n isDismissible = true,\n showBackdrop,\n blurBackdrop,\n label,\n description,\n ...props\n }: ModalProps, ref: React.Ref<ModalElementType>,\n ) => {\n const modalId = `${id}`;\n const descriptionId = description ? `${modalId}-description` : undefined;\n\n if (showBackdrop) {\n classNames.push(\"show-backdrop\");\n }\n\n if (blurBackdrop) {\n classNames.push(\"blur-backdrop\");\n }\n\n // Handle open/close state declaratively\n useEffect(() => {\n const modal = document.querySelector(`#${modalId}[data-modal]`);\n if (!modal || !(modal instanceof HTMLElement)) return;\n\n if (isOpen) {\n // Show modal\n modal.showPopover();\n\n // Focus first focusable element\n const focusableElements = modal.querySelectorAll(\n \"button, [href], input, select, textarea, [tabindex]:not([tabindex=\\\"-1\\\"])\",\n );\n if (focusableElements.length) {\n (focusableElements[0] as HTMLElement).focus();\n }\n } else {\n // Hide modal\n if (modal.matches(\":popover-open\")) {\n modal.hidePopover();\n }\n }\n }, [isOpen, modalId]);\n\n // Listen for popover toggle events to sync React state when closed externally\n // (e.g., clicking outside with popover=\"auto\", or pressing Escape)\n useEffect(() => {\n const modal = document.querySelector(`#${modalId}[data-modal]`);\n if (!modal || !(modal instanceof HTMLElement)) return;\n\n const handleToggle = (e: Event) => {\n const toggleEvent = e as ToggleEvent;\n // If popover was closed externally and React still thinks it's open, sync state\n if (toggleEvent.newState === \"closed\" && isOpen && onClose) {\n onClose();\n }\n };\n\n modal.addEventListener(\"toggle\", handleToggle);\n return () => modal.removeEventListener(\"toggle\", handleToggle);\n }, [modalId, isOpen, onClose]);\n\n return (\n <Element<ModalElementType>\n as=\"dialog\"\n id={modalId}\n data-modal\n // @ts-ignore\n popover={isDismissible ? \"auto\" : \"manual\"}\n ref={ref}\n classNames={classNames}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={label || \"Modal dialog\"}\n aria-describedby={descriptionId}\n {...props}\n >\n {isDismissible && onClose && (\n <Text\n className=\"dismiss-button\"\n onClick={onClose}\n aria-label=\"Close modal\"\n tabIndex={0}\n >\n &times;\n </Text>\n )}\n {description && (\n <div id={descriptionId} className=\"sr-only\">\n {description}\n </div>\n )}\n <div role=\"document\">\n {children}\n </div>\n </Element>\n );\n },\n);\nModal.displayName = \"Modal\";\n\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\n\n// STYLES ==============================================================================================================\nimport \"./notifications-wrapper.css\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\n// prettier-ignore\nexport interface NotificationsWrapperCustomProps {\n position ? : \"left\" | \"right\";\n anchor ? : \"top\" | \"bottom\";\n order ? : \"new-on-top\" | \"new-on-bottom\";\n kind ? : \"list\" | \"stack\";\n label ? : string;\n}\n\nexport type NotificationsWrapperElementType = HTMLDivElement;\nexport type NotificationsWrapperProps = CommonAndHTMLProps<NotificationsWrapperElementType> &\n NotificationsWrapperCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const NotificationsWrapper = React.forwardRef(\n (\n {\n position = \"right\",\n anchor = \"top\",\n order = \"new-on-top\",\n kind = \"list\",\n children,\n label,\n ...props\n }: NotificationsWrapperProps,\n ref: React.Ref<NotificationsWrapperElementType>\n ) => {\n let classNames = [];\n if (position) classNames.push(position);\n if (anchor) classNames.push(anchor);\n if (order) classNames.push(order);\n if (kind) classNames.push(kind);\n\n const childrenCount = React.Children.count(children);\n if (childrenCount === 0) return null;\n\n return (\n <Element<NotificationsWrapperElementType>\n as=\"section\"\n data-notifications-wrapper\n ref={ref}\n classNames={classNames}\n aria-label={label || \"Notifications\"}\n aria-relevant=\"additions removals\"\n role=\"log\"\n {...props}\n >\n {children}\n </Element>\n );\n }\n);\nNotificationsWrapper.displayName = \"NotificationsWrapper\";\n","// REACT CORE ==========================================================================================================\nimport React, { useState, useEffect } from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { Div } from \"../../Element/Tags\";\n\n// STYLES ==============================================================================================================\nimport \"./notification-item.css\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\n// TYPES ===============================================================================================================\nexport type NotificationKind = \"generic\" | \"info\" | \"warning\" | \"error\" | \"success\";\n\nexport interface NotificationItemProps {\n id : string;\n kind ? : NotificationKind;\n duration ? : number;\n isDismissible ? : boolean;\n onClose : () => void;\n children : React.ReactNode;\n}\n\nexport type NotificationItemElementType = HTMLDivElement;\n\n// Map notification types to ARIA roles\nconst roleMap: Record<NotificationKind, string> = {\n generic : \"status\",\n info : \"status\",\n warning : \"alert\",\n error : \"alert\",\n success : \"status\",\n};\n\n// COMPONENT ===========================================================================================================\nexport const NotificationItem = ({\n id,\n kind = \"generic\",\n duration = 4,\n isDismissible = true,\n onClose,\n children,\n}: NotificationItemProps) => {\n const [isExiting, setIsExiting] = useState(false);\n\n useEffect(() => {\n if (duration === 0) return; // No auto-dismiss\n\n const timer = setTimeout(() => {\n setIsExiting(true);\n }, duration * 1000);\n\n return () => clearTimeout(timer);\n }, [duration]);\n\n // Fallback: if transition doesn't fire, remove after animation duration\n useEffect(() => {\n if (!isExiting) return;\n\n const fallbackTimer = setTimeout(() => {\n onClose();\n }, 500); // slightly longer than the 0.4s transition\n\n return () => clearTimeout(fallbackTimer);\n }, [isExiting, onClose]);\n\n const handleDismissClick = (event: React.MouseEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsExiting(true);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setIsExiting(true);\n }\n };\n\n const handleTransitionEnd = () => {\n if (isExiting) {\n onClose();\n }\n };\n\n const classNames: string[] = [kind];\n if (isDismissible) classNames.push(\"dismissible\");\n if (isExiting) classNames.push(\"dismissed\");\n\n return (\n <Element<NotificationItemElementType>\n as=\"div\"\n data-notification-item\n id={id}\n classNames={classNames}\n onTransitionEnd={handleTransitionEnd}\n role={roleMap[kind]}\n aria-live={kind === \"error\" || kind === \"warning\" ? \"assertive\" : \"polite\"}\n aria-atomic=\"true\"\n >\n <div className=\"notification-content\">\n {children}\n </div>\n\n {isDismissible && (\n <Div\n className=\"dismiss-button\"\n onClick={handleDismissClick}\n onKeyDown={handleKeyDown}\n aria-label=\"Dismiss notification\"\n tabIndex={0}\n >\n <span className=\"sr-only\">Close notification</span>\n </Div>\n )}\n </Element>\n );\n};\nNotificationItem.displayName = \"NotificationItem\";\n","// REACT CORE ==========================================================================================================\nimport React, { createContext, useContext, useState, useCallback, ReactNode } from \"react\";\n\n// INTERNAL ============================================================================================================\nimport { NotificationsWrapper } from \"../NotificationsWrapper/NotificationsWrapper\";\nimport { NotificationItem, NotificationKind } from \"../NotificationItem/NotificationItem\";\n\n// TYPES ===============================================================================================================\nexport interface NotificationOptions {\n content : ReactNode | ((helpers: { close: () => void }) => ReactNode);\n kind ? : NotificationKind;\n duration ? : number; // seconds, 0 = no auto-dismiss\n isDismissible ? : boolean;\n}\n\ninterface InternalNotification {\n id : string;\n content : ReactNode | ((helpers: { close: () => void }) => ReactNode);\n kind : NotificationKind;\n duration : number;\n isDismissible : boolean;\n}\n\n// prettier-ignore\nexport interface NotificationsProviderProps {\n children : ReactNode;\n position ? : \"left\" | \"right\";\n anchor ? : \"top\" | \"bottom\";\n order ? : \"new-on-top\" | \"new-on-bottom\";\n kind ? : \"list\" | \"stack\";\n}\n\n// NOTIFY FUNCTION TYPE ================================================================================================\nexport interface NotifyFunction {\n (message: string): void;\n (content: ReactNode): void;\n (options: NotificationOptions): void;\n success : (message: string | ReactNode) => void;\n error : (message: string | ReactNode) => void;\n warning : (message: string | ReactNode) => void;\n info : (message: string | ReactNode) => void;\n}\n\ninterface NotificationsContextValue {\n notify: NotifyFunction;\n}\n\n// CONTEXT =============================================================================================================\nconst NotificationsContext = createContext<NotificationsContextValue | null>(null);\n\n// PROVIDER ============================================================================================================\nexport const NotificationsProvider = ({\n children,\n position = \"right\",\n anchor = \"top\",\n order = \"new-on-top\",\n kind = \"list\",\n}: NotificationsProviderProps) => {\n const [notifications, setNotifications] = useState<InternalNotification[]>([]);\n\n // Remove a notification by ID\n const removeNotification = useCallback((id: string) => {\n setNotifications(prev => prev.filter(n => n.id !== id));\n }, []);\n\n // Add a notification\n const addNotification = useCallback((\n content: ReactNode | ((helpers: { close: () => void }) => ReactNode),\n kind: NotificationKind = \"generic\",\n duration: number = 4,\n isDismissible: boolean = true\n ) => {\n const id = `notification-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n\n setNotifications(prev => [...prev, {\n id,\n content,\n kind,\n duration,\n isDismissible,\n }]);\n\n return id;\n }, []);\n\n // Main notify function\n const baseNotify = useCallback((\n messageOrOptions: string | ReactNode | NotificationOptions\n ) => {\n // String message\n if (typeof messageOrOptions === \"string\") {\n addNotification(messageOrOptions);\n return;\n }\n\n // Options object (has 'content' property)\n if (\n messageOrOptions !== null &&\n typeof messageOrOptions === \"object\" &&\n \"content\" in messageOrOptions\n ) {\n const opts = messageOrOptions as NotificationOptions;\n addNotification(\n opts.content,\n opts.kind ?? \"generic\",\n opts.duration ?? 4,\n opts.isDismissible ?? true\n );\n return;\n }\n\n // ReactNode\n addNotification(messageOrOptions as ReactNode);\n }, [addNotification]);\n\n // Create the notify function with shorthand methods\n const notify = useCallback(() => {\n const fn = baseNotify as NotifyFunction;\n\n fn.success = (message: string | ReactNode) => {\n addNotification(message, \"success\");\n };\n\n fn.error = (message: string | ReactNode) => {\n addNotification(message, \"error\");\n };\n\n fn.warning = (message: string | ReactNode) => {\n addNotification(message, \"warning\");\n };\n\n fn.info = (message: string | ReactNode) => {\n addNotification(message, \"info\");\n };\n\n return fn;\n }, [baseNotify, addNotification])();\n\n return (\n <NotificationsContext.Provider value={{ notify }}>\n {children}\n\n <NotificationsWrapper\n position={position}\n anchor={anchor}\n order={order}\n kind={kind}\n >\n {notifications.map(({ id, content, kind, duration, isDismissible }) => (\n <NotificationItem\n key={id}\n id={id}\n kind={kind}\n duration={duration}\n isDismissible={isDismissible}\n onClose={() => removeNotification(id)}\n >\n {typeof content === \"function\"\n ? content({ close: () => removeNotification(id) })\n : content\n }\n </NotificationItem>\n ))}\n </NotificationsWrapper>\n </NotificationsContext.Provider>\n );\n};\nNotificationsProvider.displayName = \"NotificationsProvider\";\n\n// HOOK ================================================================================================================\nexport const useNotifications = (): NotifyFunction => {\n const context = useContext(NotificationsContext);\n\n if (!context) {\n throw new Error(\"useNotifications must be used within a NotificationsProvider\");\n }\n\n return context.notify;\n};\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./spinner.css\";\n\n// prettier-ignore\nexport interface SpinnerCustomProps {\n size ? : \"tiny\" | \"small\" | \"medium\" | \"large\" | \"huge\";\n loadingText ? : string;\n // Custom loading message for screen readers\n}\n\nexport type SpinnerElementType = HTMLDivElement;\nexport type SpinnerProps = Omit<CommonAndHTMLProps<SpinnerElementType>, keyof SpinnerCustomProps> & SpinnerCustomProps;\n\n// COMPONENT //////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Spinner = React.forwardRef((\n {\n size = \"medium\",\n loadingText = \"Loading...\",\n ...props\n }: SpinnerProps,\n ref: React.Ref<SpinnerElementType>,\n ) => {\n let classNames = [];\n\n if (size) {\n classNames.push(`size-${size}`);\n }\n\n return (\n <Element<SpinnerElementType>\n as=\"div\"\n data-spinner\n ref={ref}\n classNames={classNames}\n role=\"status\"\n aria-busy=\"true\"\n aria-live=\"polite\"\n aria-label={loadingText}\n {...props}\n />\n );\n },\n);\nSpinner.displayName = \"Spinner\";\n","const range = (start: number, end: number) => {\n const length = end - start + 1;\n return Array.from({ length }, (_, i) => start + i);\n};\n\ninterface UsePaginationProps {\n totalItems : number;\n currentPage : number;\n itemsToShowEachSide : number;\n}\n\ninterface UsePaginationResult {\n items: (number | string)[];\n totalPages: number;\n rangeStart: number;\n rangeEnd: number;\n hasPrevPage: boolean;\n hasNextPage: boolean;\n}\n\nexport const usePagination = (\n {\n totalItems,\n currentPage,\n itemsToShowEachSide,\n }: UsePaginationProps): UsePaginationResult => {\n const totalPages = totalItems; // Each item gets its own page\n\n const items = (() => {\n const totalNumbers = itemsToShowEachSide * 2 + 1;\n let pageNumbers: (number | string)[] = [];\n\n if (totalPages <= totalNumbers) {\n // If we have fewer pages than the desired display count, show all pages\n pageNumbers = range(1, totalPages);\n } else {\n const leftSideNumbers = Math.min(currentPage - 1, itemsToShowEachSide);\n const rightSideNumbers = Math.min(totalPages - currentPage, itemsToShowEachSide);\n\n // Always show first page\n pageNumbers.push(1);\n\n // Add ellipsis after first page if needed\n if (currentPage - itemsToShowEachSide > 2) {\n pageNumbers.push(\"...\");\n }\n\n // Add pages around current page\n const rangeStart = Math.max(2, currentPage - leftSideNumbers);\n const rangeEnd = Math.min(totalPages - 1, currentPage + rightSideNumbers);\n pageNumbers.push(...range(rangeStart, rangeEnd));\n\n // Add ellipsis before last page if needed\n if (totalPages - currentPage > itemsToShowEachSide + 1) {\n pageNumbers.push(\"...\");\n }\n\n // Always show last page if we're not already at it\n if (rangeEnd < totalPages) {\n pageNumbers.push(totalPages);\n }\n }\n\n return pageNumbers;\n })();\n\n return {\n items,\n totalPages,\n rangeStart: currentPage,\n rangeEnd: currentPage,\n hasPrevPage: currentPage > 1,\n hasNextPage: currentPage < totalPages,\n };\n};\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Div } from \"../Element/Tags\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./pagination.css\";\n\n// OTHER ===============================================================================================================\nimport { Button } from \"../Button/Button\";\nimport { PaginationProps, PaginationElementType, RenderItemProps } from \"./constants\";\nimport { Spinner } from \"../Spinner/Spinner\";\nimport { Text } from \"../Typography/Text\";\nimport { usePagination } from \"./usePagination\";\n\nconst defaultRenderItem = (\n {\n type,\n page,\n selected,\n disabled,\n onClick,\n key,\n ...props\n }: RenderItemProps) => {\n if (type === \"ellipsis\") {\n return (\n <Text className=\"pagination-ellipsis\">...</Text>\n );\n }\n\n const paginationItemProps = {\n type : \"button\",\n className : `pagination-item ${selected ? \"selected\" : \"\"} ${disabled ? \"disabled\" : \"\"}`,\n onClick,\n disabled,\n ...props,\n };\n\n let content;\n switch (type) {\n case \"first\":\n content = content = (\n <svg viewBox=\"0 0 24 24\">\n <line x1=\"5\" y1=\"18\" x2=\"5\" y2=\"6\" />\n <polyline points=\"14 18 9 12 14 6\" />\n <line x1=\"10\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n break;\n case \"previous\":\n content = (\n <svg viewBox=\"0 0 24 24\">\n <polyline points=\"12 18 7 12 12 6\" />\n <line x1=\"8\" y1=\"12\" x2=\"17\" y2=\"12\" />\n </svg>\n );\n break;\n case \"next\":\n content = content = (\n <svg viewBox=\"0 0 24 24\">\n <polyline points=\"12 6 17 12 12 18\" />\n <line x1=\"16\" y1=\"12\" x2=\"7\" y2=\"12\" />\n </svg>\n );\n break;\n case \"last\":\n content = content = (\n <svg viewBox=\"0 0 24 24\">\n <polyline points=\"10 6 15 12 10 18\" />\n <line x1=\"19\" y1=\"6\" x2=\"19\" y2=\"18\" />\n <line x1=\"14\" y1=\"12\" x2=\"5\" y2=\"12\" />\n </svg>\n );\n break;\n default:\n content = page;\n }\n\n return (\n <Button\n kind=\"custom\"\n {...paginationItemProps}\n >\n {content}\n </Button>\n );\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Pagination = React.forwardRef(\n (\n {\n totalItems,\n currentPage,\n onPageChange,\n itemsToShowEachSide = 1,\n kind = \"plain\",\n showGoToFirstItemButton = true,\n showGoToLastItemButton = true,\n showPreviousButton = true,\n showNextButton = true,\n showGoToInput = false,\n disabled = false,\n hideDisabledButtons = false,\n renderItem = defaultRenderItem,\n isLoading = false,\n loadingText,\n emptyText,\n itemDisplayText = \"Page\",\n ...props\n }: PaginationProps, ref: React.Ref<PaginationElementType>) => {\n const {\n items,\n totalPages,\n rangeStart,\n rangeEnd,\n hasPrevPage,\n hasNextPage,\n } = usePagination({\n totalItems,\n currentPage,\n itemsToShowEachSide,\n });\n\n const [ goToPage, setGoToPage ] = React.useState(\"\");\n\n const handlePageInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setGoToPage(e.target.value);\n };\n\n const handlePageInputKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n const page = parseInt(goToPage);\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n onPageChange(page);\n setGoToPage(\"\");\n }\n }\n };\n\n if (totalItems === 0) {\n return <Text className=\"pagination-empty\">{emptyText || \"No items to display\"}</Text>;\n }\n\n let classNames = [ \"pagination\" ];\n\n if (kind) {\n classNames.push(kind);\n }\n\n if (disabled) {\n classNames.push(\"disabled\");\n }\n\n if (isLoading) {\n classNames.push(\"loading\");\n }\n\n return (\n <Element<PaginationElementType>\n as=\"nav\"\n data-pagination\n ref={ref}\n classNames={classNames}\n role=\"navigation\"\n aria-label=\"pagination\"\n {...props}\n >\n <Div className=\"pagination-controls\">\n {/* GO TO FIRST ITEM */}\n {showGoToFirstItemButton && (!hideDisabledButtons || hasPrevPage) && renderItem({\n type : \"first\",\n disabled : !hasPrevPage || disabled,\n selected : false,\n onClick : () => onPageChange(1),\n })}\n\n {/* GO TO PREVIOUS ITEM */}\n {showPreviousButton && (!hideDisabledButtons || hasPrevPage) && renderItem({\n type : \"previous\",\n disabled : !hasPrevPage || disabled,\n selected : false,\n onClick : () => onPageChange(currentPage - 1),\n })}\n\n {/* SHOW PAGE ITEM OR ELLIPSIS */}\n {items.map((item, index) => {\n const itemProps: RenderItemProps = item === \"...\"\n ? {\n key : `ellipsis-${index}`,\n type : \"ellipsis\",\n selected : false,\n disabled : true,\n }\n : {\n key : item.toString(),\n type : \"page\",\n page : item as number,\n selected : item === currentPage,\n disabled : disabled,\n \"aria-current\" : item === currentPage ? \"page\" : undefined,\n onClick : () => onPageChange(item as number),\n };\n\n return renderItem(itemProps);\n })}\n\n {/* GO TO NEXT ITEM */}\n {showNextButton && (!hideDisabledButtons || hasNextPage) && renderItem({\n type : \"next\",\n disabled : !hasNextPage || disabled,\n selected : false,\n onClick : () => onPageChange(currentPage + 1),\n })}\n\n {/* GO TO LAST ITEM */}\n {showGoToLastItemButton && (!hideDisabledButtons || hasNextPage) && renderItem({\n type : \"last\",\n disabled : !hasNextPage || disabled,\n selected : false,\n onClick : () => onPageChange(totalPages),\n })}\n\n {isLoading && (\n <Div className=\"pagination-loading\">\n <Spinner />\n {loadingText && <Text size=\"small\">{loadingText}</Text>}\n </Div>\n )}\n </Div>\n\n <Div className=\"pagination-info\">\n <Text size=\"tiny\">\n {itemDisplayText} {rangeStart} of {totalItems}\n </Text>\n\n {showGoToInput && (\n <Div className=\"pagination-go-to\">\n <input\n type=\"number\"\n min={1}\n max={totalPages}\n value={goToPage}\n onChange={handlePageInputChange}\n onKeyDown={handlePageInputKeyPress}\n placeholder={`Go to ${itemDisplayText}`}\n aria-label={`Go to ${itemDisplayText}`}\n disabled={disabled}\n />\n </Div>\n )}\n </Div>\n </Element>\n );\n },\n);\nPagination.displayName = \"Pagination\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, ColourPropTypes, ShapeTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./progress-bar.css\";\n\n// OTHER ===============================================================================================================\nimport { Text } from \"../Typography/Text\";\n\nexport interface ProgressBarLabelCustomProps {\n suffix ? : string;\n}\n\nexport interface ProgressBarCustomProps {\n label ? : string;\n value ? : number;\n suffix ? : string;\n height ? : string;\n max ? : number;\n shape ? : ShapeTypes;\n bgColor ? : ColourPropTypes;\n bgColour ? : ColourPropTypes;\n fillColor ? : ColourPropTypes;\n fillColour ? : ColourPropTypes;\n}\n\nexport type ProgressBarElementType = HTMLProgressElement;\nexport type ProgressBarProps = Omit<CommonAndHTMLProps<ProgressBarElementType>, keyof ProgressBarCustomProps> &\n ProgressBarCustomProps;\nexport type ProgressBarMetaProps = Omit<CommonAndHTMLProps<HTMLDivElement>, keyof ProgressBarLabelCustomProps> &\n ProgressBarLabelCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const ProgressBar = React.forwardRef(\n (\n {\n label,\n value,\n height,\n max = 100,\n shape,\n bgColor,\n bgColour,\n fillColor,\n fillColour,\n ...props\n } : ProgressBarProps, ref : React.Ref<ProgressBarElementType>) => {\n const validValue = Math.max(0, Math.min(max, Number(value) || 0));\n const progressText = `${validValue}${props.suffix || \"\"}`;\n\n // Use UK spelling as primary, fall back to US spelling\n const backgroundColour = bgColour || bgColor;\n const progressFillColour = fillColour || fillColor;\n\n // Build CSS custom properties for styling\n const progressBarStyles : React.CSSProperties = {\n height,\n ...(backgroundColour && {\"--progress-bar-bg\" : `var(--${backgroundColour})`}),\n ...(progressFillColour && {\"--progress-bar-fill\" : `var(--${progressFillColour})`}),\n };\n\n return (\n <>\n {label && (\n <Element<HTMLDivElement>\n as=\"div\"\n data-progress-bar-meta\n aria-hidden=\"true\"\n >\n <Text>{label}</Text>\n <Text>\n {progressText}\n </Text>\n </Element>\n )}\n\n <Element<ProgressBarElementType>\n as=\"progress\"\n data-progress-bar\n ref={ref}\n value={validValue}\n max={max}\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={validValue}\n aria-valuetext={`${label ? `${label}: ` : \"\"}${progressText}`}\n shape={shape}\n {...props}\n style={progressBarStyles}\n />\n </>\n );\n },\n);\nProgressBar.displayName = \"ProgressBar\";","// FRAMEWORK ===========================================================================================================\nimport React, { createContext, useContext, useState, ReactNode, useCallback, useRef, useEffect } from \"react\";\n\n// FICTOAN =============================================================================================================\nimport { Element } from \"$element\";\nimport { Div } from \"$tags\";\nimport { Card, CardElementType, CardProps } from \"../Card/Card\";\n\n// STYLES ==============================================================================================================\nimport \"./option-card.css\";\n\n// TYPES ===============================================================================================================\nexport type TickPosition =\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\"\n | \"centre-left\"\n | \"center-left\"\n | \"centre-right\"\n | \"center-right\"\n | \"centre-top\"\n | \"center-top\"\n | \"center-bottom\"\n | \"centre-bottom\"\n | \"centre\"\n | \"center\";\n\nexport interface OptionCardsProviderProps {\n children : ReactNode;\n allowMultipleSelections ? : boolean;\n showTickIcon ? : boolean;\n tickPosition ? : TickPosition;\n onSelectionChange ? : (selectedIds: Set<string>) => void;\n selectionLimit ? : number;\n defaultSelectedIds ? : Set<string>; // Uncontrolled mode - initial selection\n selectedIds ? : Set<string>; // Controlled mode - external state\n}\n\nexport interface OptionCardProps extends CardProps {\n id : string;\n children : ReactNode;\n disabled ? : boolean;\n}\n\nexport interface OptionCardsGroupRef {\n selectAll : () => void;\n selectNone : () => void;\n selectInverse : () => void;\n}\n\ninterface OptionCardsContextType {\n isSelected : (id: string) => boolean;\n toggleSelection : (id: string) => void;\n showTickIcon ? : boolean;\n tickPosition ? : TickPosition;\n selectAll ? : () => void;\n selectNone ? : () => void;\n selectInverse ? : () => void;\n registerOption : (id: string, disabled: boolean) => void;\n unregisterOption : (id: string) => void;\n}\n\nconst OptionCardsContext = createContext<OptionCardsContextType>({\n isSelected : () => false,\n toggleSelection : () => {},\n showTickIcon : false,\n tickPosition : \"top-right\",\n selectAll : () => {},\n selectNone : () => {},\n selectInverse : () => {},\n registerOption : () => {},\n unregisterOption : () => {},\n});\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const OptionCardsGroup = React.forwardRef<OptionCardsGroupRef, OptionCardsProviderProps>(\n (\n {\n children,\n allowMultipleSelections = false,\n showTickIcon,\n onSelectionChange,\n tickPosition = \"top-right\",\n selectionLimit,\n defaultSelectedIds,\n selectedIds: selectedIdsProp,\n ...props\n },\n ref\n ) => {\n // Determine if controlled or uncontrolled mode\n const isControlled = selectedIdsProp !== undefined;\n\n // Internal state for uncontrolled mode only\n const [internalSelectedIds, setInternalSelectedIds] = useState<Set<string>>(\n defaultSelectedIds ? new Set(defaultSelectedIds) : new Set()\n );\n const availableOptionsRef = useRef<Map<string, boolean>>(new Map()); // id -> disabled\n\n // Use controlled value if provided, otherwise use internal state\n const selectedIds = isControlled ? selectedIdsProp : internalSelectedIds;\n\n // Wrapper to update selection - in controlled mode, just call onSelectionChange\n const updateSelectedIds = useCallback((newIds: Set<string>) => {\n if (!isControlled) {\n setInternalSelectedIds(newIds);\n }\n onSelectionChange?.(newIds);\n }, [isControlled, onSelectionChange]);\n\n const registerOption = useCallback((id: string, disabled: boolean) => {\n availableOptionsRef.current.set(id, disabled);\n }, []);\n\n const unregisterOption = useCallback((id: string) => {\n availableOptionsRef.current.delete(id);\n }, []);\n\n // Click to toggle an option ===================================================================================\n const toggleSelection = useCallback((id: string) => {\n const newSelectedIds = new Set(selectedIds);\n if (allowMultipleSelections) {\n if (newSelectedIds.has(id)) {\n newSelectedIds.delete(id);\n } else {\n if (selectionLimit && newSelectedIds.size >= selectionLimit) {\n return;\n }\n newSelectedIds.add(id);\n }\n } else {\n if (newSelectedIds.has(id) && selectedIds.size === 1) {\n newSelectedIds.clear();\n } else {\n newSelectedIds.clear();\n newSelectedIds.add(id);\n }\n }\n updateSelectedIds(newSelectedIds);\n }, [selectedIds, allowMultipleSelections, selectionLimit, updateSelectedIds]);\n\n // Select all available options ================================================================================\n const selectAll = useCallback(() => {\n if (!allowMultipleSelections) return;\n\n // Get all enabled options\n const enabledOptions = Array.from(availableOptionsRef.current.entries())\n .filter(([_, disabled]) => !disabled)\n .map(([id]) => id);\n\n // Respect selection limit if set\n const optionsToSelect = selectionLimit\n ? enabledOptions.slice(0, selectionLimit)\n : enabledOptions;\n\n updateSelectedIds(new Set(optionsToSelect));\n }, [allowMultipleSelections, selectionLimit, updateSelectedIds]);\n\n // De-select all options =======================================================================================\n const selectNone = useCallback(() => {\n updateSelectedIds(new Set());\n }, [updateSelectedIds]);\n\n // Invert selection ============================================================================================\n const selectInverse = useCallback(() => {\n if (!allowMultipleSelections) return;\n\n // Get all enabled options\n const enabledOptions = Array.from(availableOptionsRef.current.entries())\n .filter(([_, disabled]) => !disabled)\n .map(([id]) => id);\n\n // Select options that are not currently selected\n const invertedSelection = enabledOptions.filter(id => !selectedIds.has(id));\n\n // Respect selection limit if set\n const optionsToSelect = selectionLimit\n ? invertedSelection.slice(0, selectionLimit)\n : invertedSelection;\n\n updateSelectedIds(new Set(optionsToSelect));\n }, [selectedIds, allowMultipleSelections, selectionLimit, updateSelectedIds]);\n\n const isSelected = useCallback((id: string) => {\n return selectedIds.has(id);\n }, [selectedIds]);\n\n // Expose methods via ref\n React.useImperativeHandle(ref, () => ({\n selectAll,\n selectNone,\n selectInverse,\n }), [selectAll, selectNone, selectInverse]);\n\n const contextValue = {\n isSelected,\n toggleSelection,\n showTickIcon,\n tickPosition,\n selectAll,\n selectNone,\n selectInverse,\n registerOption,\n unregisterOption,\n };\n\n return (\n <OptionCardsContext.Provider value={contextValue}>\n <Div data-option-cards-group className={`tick-${tickPosition}`}>\n {children}\n </Div>\n </OptionCardsContext.Provider>\n );\n }\n);\nOptionCardsGroup.displayName = \"OptionCardsGroup\";\n\nexport const useOptionCard = (id: string) => {\n const context = useContext(OptionCardsContext);\n return {\n isSelected : context.isSelected(id),\n toggleSelection : () => context.toggleSelection(id),\n showTickIcon : context.showTickIcon,\n };\n};\n\nexport const useOptionCardsGroup = () => {\n const { selectAll, selectNone, selectInverse } = useContext(OptionCardsContext);\n return { selectAll, selectNone, selectInverse };\n};\n\nexport const OptionCard: React.FC<OptionCardProps> = ({ id, children, disabled = false, ...props }) => {\n const { isSelected, toggleSelection, showTickIcon, registerOption, unregisterOption } = useContext(OptionCardsContext);\n const [showDeselect, setShowDeselect] = useState(false);\n const [isInitialHover, setIsInitialHover] = useState(true);\n\n // Register/unregister this option\n React.useEffect(() => {\n registerOption(id, disabled);\n return () => unregisterOption(id);\n }, [id, disabled, registerOption, unregisterOption]);\n\n let classNames = [];\n\n if (isSelected(id)) {\n classNames.push(\"selected\");\n }\n\n if (disabled) {\n classNames.push(\"disabled\");\n }\n\n if (showDeselect) {\n classNames.push(\"show-deselect\");\n }\n\n const handleMouseEnter = () => {\n if (isSelected(id) && !isInitialHover) {\n setShowDeselect(true);\n }\n };\n\n const handleMouseLeave = () => {\n setShowDeselect(false);\n setIsInitialHover(false);\n };\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (!disabled) {\n setIsInitialHover(true);\n setShowDeselect(false);\n toggleSelection(id);\n props.onClick?.(e);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === \"Enter\" || e.key === \" \") && !disabled) {\n e.preventDefault();\n setIsInitialHover(true);\n setShowDeselect(false);\n toggleSelection(id);\n }\n };\n\n return (\n <Element<CardElementType>\n as={Card}\n data-option-card\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n aria-selected={isSelected(id)}\n classNames={classNames}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n {showTickIcon && (\n <>\n <svg viewBox=\"0 0 24 24\" className=\"tick-icon\">\n <circle cx=\"12\" cy=\"12\" r=\"11\" />\n <path d=\"M8 13 L11 15 L16 9\" />\n </svg>\n\n <svg viewBox=\"0 0 24 24\" className=\"deselect-icon\">\n <circle cx=\"12\" cy=\"12\" r=\"11\" />\n <path d=\"M8 8 L16 16 M16 8 L8 16\" />\n </svg>\n </>\n )}\n {children}\n </Element>\n );\n};\n","// REACT CORE ==========================================================================================================\nimport React, { useRef, useImperativeHandle } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\nimport { Element } from \"$element\";\n\n// HOOKS ===============================================================================================================\nimport { useClickOutside } from \"../../../hooks/UseClickOutside\";\n\n// STYLES ==============================================================================================================\nimport \"./sidebar-wrapper.css\";\n\n// prettier-ignore\nexport interface SidebarWrapperCustomProps {\n collapsed ? : boolean;\n closeOnClickOutside ? : () => void;\n showMobileSidebar ? : boolean;\n}\n\nexport type SidebarWrapperElementType = HTMLDivElement;\nexport type SidebarWrapperNewProps = Omit<CommonAndHTMLProps<SidebarWrapperElementType>,\n keyof SidebarWrapperCustomProps> & SidebarWrapperCustomProps;\n\nexport const SidebarWrapper = React.forwardRef(\n (\n {\n collapsed,\n closeOnClickOutside,\n showMobileSidebar,\n ...props\n } : SidebarWrapperNewProps, forwardedRef : React.Ref<SidebarWrapperElementType>) => {\n\n const internalRef = useRef<HTMLDivElement>(null);\n\n // @ts-ignore\n useImperativeHandle(forwardedRef, () => internalRef.current);\n\n useClickOutside(internalRef, () => {\n if (typeof closeOnClickOutside === \"function\") {\n closeOnClickOutside();\n }\n });\n\n let classNames = [];\n\n if (collapsed) {\n classNames.push(\"collapsed\");\n }\n\n if (showMobileSidebar) {\n classNames.push(\"show-sidebar\");\n }\n\n return (\n <Element<SidebarWrapperElementType>\n as=\"aside\"\n data-sidebar-wrapper\n ref={internalRef}\n classNames={classNames}\n {...props}\n />\n );\n },\n);\nSidebarWrapper.displayName = \"SidebarWrapper\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\n\n// STYLES ==============================================================================================================\nimport \"./content-wrapper.css\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\nexport type ContentWrapperElementType = HTMLDivElement;\ninterface ContentWrapperCustomProps {\n label ? : string;\n // For aria-label\n}\nexport type ContentWrapperProps = CommonAndHTMLProps<ContentWrapperElementType> & ContentWrapperCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const ContentWrapper = React.forwardRef(\n (\n { label, ...props }: ContentWrapperProps, ref: React.Ref<ContentWrapperElementType>) => {\n\n return (\n <Element<ContentWrapperElementType>\n as=\"main\"\n data-content-wrapper\n ref={ref}\n role=\"main\"\n aria-label={label || \"Main content\"}\n {...props}\n />\n );\n }\n);\nContentWrapper.displayName = \"ContentWrapper\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\n\n// STYLES ==============================================================================================================\nimport \"./sidebar-header.css\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\n// prettier-ignore\nexport interface SidebarHeaderCustomProps {\n isSticky ? : boolean;\n}\n\nexport type SidebarHeaderElementType = HTMLDivElement;\nexport type SidebarHeaderNewProps = Omit<CommonAndHTMLProps<SidebarHeaderElementType>, keyof SidebarHeaderCustomProps>\n & SidebarHeaderCustomProps;\n\nexport const SidebarHeader = React.forwardRef(\n ({ isSticky, ...props }: SidebarHeaderNewProps, ref: React.Ref<SidebarHeaderElementType>) => {\n let classNames = [];\n\n if (isSticky) {\n classNames.push(\"is-sticky\");\n }\n\n return (\n <Element<SidebarHeaderElementType>\n as=\"header\"\n data-sidebar-header\n ref={ref}\n classNames={classNames}\n {...props}\n />\n );\n }\n);\nSidebarHeader.displayName = \"SidebarHeader\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\nimport { Div } from \"$tags\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./sidebar-item.css\";\n\ntype BaseItemProps = {\n hasAlert ? : boolean;\n}\n\ntype IconProps =\n | {\n hasEmptyIcon : boolean;\n hasNoIcon ? : never;\n } // If hasEmptyIcon is set, hasNoIcon can't be set\n | {\n hasEmptyIcon ? : never;\n hasNoIcon : boolean;\n } // If hasNoIcon is set, hasEmptyIcon can't be set\n | {\n hasEmptyIcon ? : never;\n hasNoIcon ? : never;\n } // Neither is set\n\nexport type SidebarItemCustomProps = BaseItemProps & IconProps;\n\nexport type SidebarItemElementType = HTMLDivElement;\nexport type SidebarItemNewProps = Omit<CommonAndHTMLProps<SidebarItemElementType>, keyof SidebarItemCustomProps> &\n SidebarItemCustomProps;\n\nexport const SidebarItem = React.forwardRef(\n (\n {hasAlert, hasEmptyIcon, hasNoIcon, children, ...props} : SidebarItemNewProps,\n ref : React.Ref<SidebarItemElementType>) => {\n let classNames = [];\n\n if (hasAlert) {\n classNames.push(\"has-alert\");\n }\n\n if (hasEmptyIcon) {\n classNames.push(\"has-empty-icon\");\n } else if (hasNoIcon) {\n classNames.push(\"has-no-icon\");\n }\n\n return (\n <Element<SidebarItemElementType>\n as=\"div\"\n data-sidebar-item\n ref={ref}\n classNames={classNames}\n {...props}\n >\n {hasEmptyIcon && <Div className=\"empty-icon-wrapper\" />}\n {children}\n </Element>\n );\n },\n);\nSidebarItem.displayName = \"SidebarItem\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\n\n// STYLES ==============================================================================================================\nimport \"./sidebar-footer.css\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\n// prettier-ignore\nexport interface SidebarFooterCustomProps {\n isSticky ? : boolean;\n}\n\nexport type SidebarFooterElementType = HTMLDivElement;\nexport type SidebarFooterNewProps = Omit<CommonAndHTMLProps<SidebarFooterElementType>, keyof SidebarFooterCustomProps>\n & SidebarFooterCustomProps;\n\nexport const SidebarFooter = React.forwardRef(\n ({ isSticky, ...props }: SidebarFooterNewProps, ref: React.Ref<SidebarFooterElementType>) => {\n let classNames = [];\n\n if (isSticky) {\n classNames.push(\"is-sticky\");\n }\n\n return (\n <Element<SidebarFooterElementType>\n as=\"footer\"\n data-sidebar-footer\n ref={ref}\n classNames={classNames}\n {...props}\n />\n );\n });\nSidebarFooter.displayName = \"SidebarFooter\";\n","// REACT CORE ==========================================================================================================\nimport React, { createContext, useContext } from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps, ShapeTypes, SpacingTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./skeleton.css\";\n\n// Common skeleton props shared between Skeleton and SkeletonGroup\ninterface CommonSkeletonProps {\n effect ? : \"pulse\" | \"wave\" | \"none\";\n animate ? : boolean;\n loadingLabel ? : string;\n // Accessible label for loading state\n}\n\n// Context to share common properties\nconst SkeletonContext = createContext<CommonSkeletonProps>({\n effect : \"wave\",\n animate : true,\n});\n\n// Props specific to individual Skeleton elements\ninterface SkeletonCustomProps extends CommonSkeletonProps {\n variant ? : \"line\" | \"circle\" | \"block\";\n width ? : string | number;\n height ? : string | number;\n shape ? : ShapeTypes;\n}\n\n// Props specific to SkeletonGroup\ninterface SkeletonGroupCustomProps extends CommonSkeletonProps {\n repeat ? : number;\n direction ? : \"vertical\" | \"horizontal\";\n spacing ? : SpacingTypes;\n}\n\nexport type SkeletonElementType = HTMLDivElement;\nexport type SkeletonProps =\n Omit<CommonAndHTMLProps<SkeletonElementType>, keyof SkeletonCustomProps>\n & SkeletonCustomProps;\nexport type SkeletonGroupProps =\n Omit<CommonAndHTMLProps<SkeletonElementType>, keyof SkeletonGroupCustomProps>\n & SkeletonGroupCustomProps;\n\n// COMPONENTS //////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Skeleton = React.forwardRef((\n {\n variant = \"line\",\n width,\n height,\n shape,\n effect: localEffect,\n loadingLabel,\n ...props\n }: SkeletonProps, ref: React.Ref<SkeletonElementType>) => {\n // Get shared properties from group context\n const groupContext = useContext(SkeletonContext);\n\n const effectiveEffect = localEffect || groupContext.effect;\n const effectiveLabel = loadingLabel || groupContext.loadingLabel || \"Loading...\";\n\n let classNames = [];\n\n if (variant) {\n classNames.push(`variant-${variant}`);\n }\n\n if (shape) {\n classNames.push(`shape-${shape}`);\n }\n\n if (effectiveEffect) {\n classNames.push(`effect-${effectiveEffect}`);\n }\n\n // Handle circle variant dimensions\n const computedWidth = width || \"100%\";\n const computedHeight = variant === \"circle\"\n ? (typeof width === \"number\" ? `${width}px` : width) || height || \"100%\"\n : height;\n\n const style = {\n width: computedWidth,\n height: computedHeight,\n aspectRatio: variant === \"circle\" ? \"1 / 1\" : \"auto\",\n ...props.style,\n };\n\n return (\n <Element\n as=\"div\"\n data-skeleton\n ref={ref}\n classNames={classNames}\n style={style}\n role=\"progressbar\"\n aria-busy=\"true\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuetext={effectiveLabel}\n aria-label={effectiveLabel}\n {...props}\n />\n );\n});\nSkeleton.displayName = \"Skeleton\";\n\nexport const SkeletonGroup = React.forwardRef((\n {\n effect = \"wave\",\n spacing = \"small\",\n animate = true,\n repeat = 1,\n direction = \"vertical\",\n children,\n classNames = [],\n loadingLabel = \"Loading content...\",\n ...props\n }: SkeletonGroupProps, ref: React.Ref<SkeletonElementType>) => {\n\n const groupClassNames = [\n `direction-${direction}`,\n effect && `effect-${effect}`,\n ...classNames,\n ];\n\n if (spacing) {\n groupClassNames.push(`spacing-${spacing}`);\n }\n\n return (\n <SkeletonContext.Provider value={{ effect, animate, loadingLabel }}>\n <Element\n as=\"div\"\n ref={ref}\n data-skeleton-group\n classNames={groupClassNames}\n role=\"alert\"\n aria-busy=\"true\"\n aria-label={loadingLabel}\n {...props}\n >\n {Array(repeat).fill(children).map((child, index) => (\n React.cloneElement(child as React.ReactElement, {\n key: index\n })\n ))}\n </Element>\n </SkeletonContext.Provider>\n );\n});\nSkeletonGroup.displayName = \"SkeletonGroup\";\n","// FRAMEWORK ===========================================================================================================\nimport React from \"react\";\n\n// FICTOAN =============================================================================================================\nimport { Element } from \"../Element\";\n\n// STYLES ==============================================================================================================\nimport \"./table.css\";\n\n// TYPES ===============================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\n\n// prettier-ignore\nexport interface TableCustomProps {\n bordersFor ? : \"rows\" | \"columns\" | \"both\";\n alignText ? : \"left\" | \"right\" | \"centre\" | \"center\";\n isStriped ? : boolean;\n highlightRowOnHover ? : boolean;\n isFullWidth ? : boolean;\n caption ? : string; // Accessible table caption\n summary ? : string; // Description of table structure for complex tables\n hasColSpan ? : boolean; // Indicates if table has colspan/rowspan for screen readers\n}\n\nexport type TableElementType = HTMLTableElement;\nexport type TableProps = Omit<CommonAndHTMLProps<TableElementType>, keyof TableCustomProps> & TableCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Table = React.forwardRef(\n (\n {\n bordersFor,\n isStriped,\n highlightRowOnHover,\n isFullWidth,\n alignText,\n caption,\n summary,\n hasColSpan,\n children,\n ...props\n }: TableProps,\n ref: React.Ref<TableElementType>\n ) => {\n let classNames = [];\n\n if (bordersFor) {\n classNames.push(`bordered-${bordersFor}`);\n }\n\n if (isStriped) {\n classNames.push(\"striped\");\n }\n\n if (highlightRowOnHover) {\n classNames.push(\"hoverable\");\n }\n\n if (isFullWidth) {\n classNames.push(\"full-width\");\n }\n\n if (alignText) {\n classNames.push(`align-text-${alignText}`);\n }\n\n // Get row count if children exist\n const rowCount = React.Children.count(children);\n\n // Get column count from first row if possible\n const getColumnCount = () => {\n if (!children || !React.isValidElement(children)) return undefined;\n\n const firstRow = React.Children.toArray(children)[0];\n if (React.isValidElement(firstRow)) {\n const rowProps = firstRow.props as { children?: React.ReactNode };\n if (rowProps.children) {\n return React.Children.count(rowProps.children);\n }\n }\n return undefined;\n };\n\n return (\n <Element<TableElementType>\n as=\"table\"\n classNames={classNames}\n ref={ref}\n role=\"table\"\n aria-rowcount={rowCount || undefined}\n aria-colcount={hasColSpan ? undefined : getColumnCount()}\n summary={summary}\n {...props}\n >\n {caption && <caption>{caption}</caption>}\n {children}\n </Element>\n );\n }\n);\nTable.displayName = \"Table\";\n","// REACT CORE ==========================================================================================================\nimport React, { useEffect, useCallback, useRef } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Div, Nav } from \"../Element/Tags\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./tabs.css\";\n\n// OTHER ===============================================================================================================\nimport { Divider } from \"../Divider/Divider\";\nimport { Text } from \"../Typography/Text\";\n\ninterface TabType {\n key : string;\n label : React.ReactNode;\n content : React.ReactNode;\n hasAlert ? : boolean;\n}\n\n// prettier-ignore\nexport interface TabsCustomProps {\n tabs : TabType[];\n additionalNavContentWrapper ? : React.ReactNode;\n defaultActiveTab ? : React.ReactNode;\n align ? : \"left\" | \"centre\" | \"center\" | \"right\";\n isFullWidth ? : boolean;\n}\n\nexport type TabsElementType = HTMLDivElement;\nexport type TabsProps = Omit<CommonAndHTMLProps<TabsElementType>, keyof TabsCustomProps> & TabsCustomProps;\n\nexport const Tabs = React.forwardRef(\n (\n {tabs, additionalNavContentWrapper, defaultActiveTab, align = \"left\", isFullWidth, ...props} : TabsProps,\n ref : React.Ref<TabsElementType>) => {\n const index = tabs.findIndex((tab) => tab.key === defaultActiveTab);\n const defaultTabIndex = index > -1 ? index : 0;\n const [ activeTab, setActiveTab ] = React.useState<TabType | undefined>(\n tabs.length > 0 ? tabs[defaultTabIndex] : undefined,\n );\n const [ isExiting, setIsExiting ] = React.useState<boolean>(false);\n\n // Refs for keyboard navigation to focus the tab buttons\n const tabButtonRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n // V2's performant animation logic\n const handleTabChange = useCallback((tab : TabType) => {\n if (activeTab?.key !== tab.key) {\n setIsExiting(true);\n setTimeout(() => {\n setActiveTab(tab);\n setIsExiting(false);\n }, 150); // Animation duration\n }\n }, [ activeTab?.key ]);\n\n useEffect(() => {\n if (tabs.length > 0) {\n // If the current active tab still exists in the new tabs array, keep it.\n // This preserves the active state if the content of a tab changes.\n const currentTabStillExists = tabs.find(tab => tab.key === activeTab?.key);\n if (!currentTabStillExists) {\n // Otherwise, default to the designated default tab or the first one.\n setActiveTab(tabs[defaultTabIndex]);\n }\n } else {\n setActiveTab(undefined);\n }\n }, [ tabs, defaultTabIndex, activeTab?.key ]);\n\n\n const handleKeyDown = useCallback((event : React.KeyboardEvent, currentIndex : number) => {\n let nextIndex = currentIndex;\n\n if (event.key === \"ArrowRight\") {\n nextIndex = (currentIndex + 1) % tabs.length;\n } else if (event.key === \"ArrowLeft\") {\n nextIndex = (currentIndex - 1 + tabs.length) % tabs.length;\n } else if (event.key === \"Home\") {\n nextIndex = 0;\n } else if (event.key === \"End\") {\n nextIndex = tabs.length - 1;\n } else {\n // Exit if it's not a navigation key\n return;\n }\n\n event.preventDefault();\n const nextTab = tabs[nextIndex];\n if (nextTab) {\n handleTabChange(nextTab);\n tabButtonRefs.current[nextIndex]?.focus();\n }\n\n }, [ tabs, handleTabChange ]);\n\n if (!activeTab) {\n return null; // Render nothing if there are no tabs or no active tab\n }\n\n return (\n <Element<TabsElementType>\n as=\"div\"\n data-tabs\n ref={ref}\n data-align={align}\n data-full-width={isFullWidth}\n {...props}\n >\n <Nav data-tabs-nav role=\"tablist\" aria-label=\"Tab Navigation\">\n <ul className=\"tab-labels-list\">\n {tabs.map((tab, i) => (\n <li key={tab.key}>\n <Element<HTMLButtonElement>\n as=\"button\"\n // @ts-ignore\n ref={(el) => (tabButtonRefs.current[i] = el)}\n id={`tab-${tab.key}`}\n role=\"tab\"\n aria-selected={activeTab.key === tab.key}\n aria-controls={`tab-panel-${tab.key}`}\n tabIndex={activeTab.key === tab.key ? 0 : -1} // Roaming tabindex\n data-tab-label\n data-active={activeTab.key === tab.key}\n data-alert={tab.hasAlert}\n onClick={() => handleTabChange(tab)}\n onKeyDown={(e) => handleKeyDown(e, i)}\n className={`tab-button ${activeTab.key === tab.key ? \"is-active\" : \"\"}`}\n marginBottom=\"nano\"\n >\n <Text\n className={`tab-label ${activeTab.key === tab.key ? \"is-active\" : \"\"} ${tab.hasAlert ? \"has-alert\" : \"\"}`}\n >\n {tab.label}\n </Text>\n </Element>\n </li>\n ))}\n {additionalNavContentWrapper}\n </ul>\n </Nav>\n\n <Divider kind=\"tertiary\" marginTop=\"none\" marginBottom=\"micro\" />\n\n {tabs.map((tab) => (\n <Div\n key={tab.key}\n id={`tab-panel-${tab.key}`}\n role=\"tabpanel\"\n aria-labelledby={`tab-${tab.key}`}\n tabIndex={activeTab.key === tab.key ? 0 : -1}\n data-tab-content\n data-active={activeTab.key === tab.key}\n data-exiting={activeTab.key === tab.key && isExiting}\n hidden={activeTab.key !== tab.key}\n >\n {tab.content}\n </Div>\n ))}\n </Element>\n );\n },\n);\nTabs.displayName = \"Tabs\";","// REACT CORE ==========================================================================================================\nimport React, { useCallback, useEffect, useState } from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\nconst getStorageKey = (): string => {\n if (typeof window !== 'undefined') {\n const hostname = window.location.hostname;\n const port = window.location.port;\n \n // Create identifier from hostname and port\n let identifier = hostname.replace(/\\./g, '-');\n if (port) {\n identifier += `-${port}`;\n }\n \n return `${identifier}-theme`;\n }\n \n return \"fictoan-theme\";\n};\n\n// Create a tuple type for the theme context\ntype ThemeContextType = [string, React.Dispatch<React.SetStateAction<string>>];\n\nconst defaultContext: ThemeContextType = [\"\", (_) => {}];\nconst ThemeContext = React.createContext<ThemeContextType | undefined>(undefined);\n\nexport const useTheme = (): ThemeContextType => {\n const context = React.useContext(ThemeContext);\n if (context === undefined) {\n return defaultContext;\n }\n return context;\n};\n\nexport type ThemeProviderElementType = HTMLDivElement;\nexport interface ThemeProviderProps extends CommonAndHTMLProps<ThemeProviderElementType> {\n themeList : string[];\n currentTheme : string;\n}\n\nconst getTheme = (key: string, fallback?: string) => {\n let theme;\n try {\n theme = localStorage.getItem(key) || undefined;\n } catch (e) {\n // Unsupported\n }\n return theme || fallback;\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const ThemeProvider = React.forwardRef(\n ({ currentTheme, themeList, children, ...props }: ThemeProviderProps, ref: React.Ref<ThemeProviderElementType>) => {\n const [shouldRender, setShouldRender] = useState<boolean>(false);\n const [themeState, setThemeState] = useState<string>(() =>\n getTheme(getStorageKey()) || currentTheme);\n\n const setTheme = useCallback(\n (value: React.SetStateAction<string>) => {\n // Handle both direct values and updater functions\n const newTheme = typeof value === \"function\"\n ? value(themeState)\n : value;\n\n if (!themeList.includes(newTheme)) {\n // Fall back to first available theme\n const fallbackTheme = themeList[0];\n setThemeState(fallbackTheme);\n document.documentElement.className = \"\";\n document.documentElement.classList.add(fallbackTheme);\n try {\n localStorage.setItem(getStorageKey(), fallbackTheme);\n } catch (e) {\n // Unsupported\n }\n return;\n }\n\n setThemeState(newTheme);\n document.documentElement.className = \"\";\n document.documentElement.classList.add(newTheme);\n if (!shouldRender) {\n setShouldRender(true);\n }\n try {\n localStorage.setItem(getStorageKey(), newTheme);\n } catch (e) {\n // Unsupported\n }\n },\n [themeState, themeList]\n );\n\n useEffect(() => {\n const theme = getTheme(getStorageKey());\n setTheme(theme || currentTheme);\n }, [currentTheme, setTheme]);\n\n return (\n <ThemeContext.Provider value={[themeState, setTheme]}>\n <Element<ThemeProviderElementType> as=\"div\" data-theme-provider ref={ref} {...props}>\n {shouldRender && children}\n </Element>\n </ThemeContext.Provider>\n );\n }\n);\nThemeProvider.displayName = \"ThemeProvider\";\n","// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\n\n// STYLES ==============================================================================================================\nimport \"./toasts-wrapper.css\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\n// prettier-ignore\nexport interface ToastsWrapperCustomProps {\n anchor ? : \"top\" | \"bottom\";\n}\n\nexport type ToastsWrapperElementType = HTMLDivElement;\nexport type ToastsWrapperProps = CommonAndHTMLProps<ToastsWrapperElementType> &\n ToastsWrapperCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const ToastsWrapper = React.forwardRef(\n (\n {\n anchor = \"top\",\n children,\n ...props\n }: ToastsWrapperProps,\n ref: React.Ref<ToastsWrapperElementType>\n ) => {\n const childrenCount = React.Children.count(children);\n if (childrenCount === 0) return null;\n\n return (\n <Element<ToastsWrapperElementType>\n as=\"section\"\n data-toasts-wrapper\n ref={ref}\n classNames={[anchor]}\n aria-label=\"Toasts\"\n aria-relevant=\"additions removals\"\n role=\"log\"\n {...props}\n >\n {children}\n </Element>\n );\n }\n);\nToastsWrapper.displayName = \"ToastsWrapper\";\n","// REACT CORE ==========================================================================================================\nimport React, { useState, useEffect } from \"react\";\n\n// STYLES ==============================================================================================================\nimport \"./toast-item.css\";\n\n// OTHER ===============================================================================================================\nimport { Element } from \"$element\";\n\n// TYPES ===============================================================================================================\nexport interface ToastItemProps {\n id : string;\n duration ? : number;\n onClose : () => void;\n children : React.ReactNode;\n}\n\nexport type ToastItemElementType = HTMLDivElement;\n\n// COMPONENT ===========================================================================================================\nexport const ToastItem = ({\n id,\n duration = 4,\n onClose,\n children,\n}: ToastItemProps) => {\n const [isExiting, setIsExiting] = useState(false);\n\n useEffect(() => {\n if (duration === 0) return;\n\n const timer = setTimeout(() => {\n setIsExiting(true);\n }, duration * 1000);\n\n return () => clearTimeout(timer);\n }, [duration]);\n\n // Fallback: if transition doesn't fire, remove after animation duration\n useEffect(() => {\n if (!isExiting) return;\n\n const fallbackTimer = setTimeout(() => {\n onClose();\n }, 500);\n\n return () => clearTimeout(fallbackTimer);\n }, [isExiting, onClose]);\n\n const handleTransitionEnd = () => {\n if (isExiting) {\n onClose();\n }\n };\n\n return (\n <Element<ToastItemElementType>\n as=\"div\"\n data-toast-item\n id={id}\n classNames={isExiting ? [\"dismissed\"] : []}\n onTransitionEnd={handleTransitionEnd}\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n shadow=\"soft\"\n >\n {children}\n </Element>\n );\n};\nToastItem.displayName = \"ToastItem\";\n","// REACT CORE ==========================================================================================================\nimport React, { createContext, useContext, useState, useCallback, ReactNode } from \"react\";\n\n// INTERNAL ============================================================================================================\nimport { ToastsWrapper } from \"../ToastsWrapper/ToastsWrapper\";\nimport { ToastItem } from \"../ToastItem/ToastItem\";\n\n// TYPES ===============================================================================================================\ninterface InternalToast {\n id : string;\n message : string;\n duration : number;\n}\n\n// prettier-ignore\nexport interface ToastsProviderProps {\n children : ReactNode;\n anchor ? : \"top\" | \"bottom\";\n}\n\n// TOAST FUNCTION TYPE =================================================================================================\nexport type ToastFunction = (message: string, duration?: number) => void;\n\ninterface ToastsContextValue {\n toast: ToastFunction;\n}\n\n// CONTEXT =============================================================================================================\nconst ToastsContext = createContext<ToastsContextValue | null>(null);\n\n// PROVIDER ============================================================================================================\nexport const ToastsProvider = ({\n children,\n anchor = \"top\",\n}: ToastsProviderProps) => {\n const [toasts, setToasts] = useState<InternalToast[]>([]);\n\n // Remove a toast by ID\n const removeToast = useCallback((id: string) => {\n setToasts(prev => prev.filter(t => t.id !== id));\n }, []);\n\n // Main toast function\n const toast: ToastFunction = useCallback((message: string, duration: number = 4) => {\n const id = `toast-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n\n setToasts(prev => [...prev, {\n id,\n message,\n duration,\n }]);\n }, []);\n\n return (\n <ToastsContext.Provider value={{ toast }}>\n {children}\n\n <ToastsWrapper anchor={anchor}>\n {toasts.map(({ id, message, duration }) => (\n <ToastItem\n key={id}\n id={id}\n duration={duration}\n onClose={() => removeToast(id)}\n >\n {message}\n </ToastItem>\n ))}\n </ToastsWrapper>\n </ToastsContext.Provider>\n );\n};\nToastsProvider.displayName = \"ToastsProvider\";\n\n// HOOK ================================================================================================================\nexport const useToasts = (): ToastFunction => {\n const context = useContext(ToastsContext);\n\n if (!context) {\n throw new Error(\"useToasts must be used within a ToastsProvider\");\n }\n\n return context.toast;\n};\n","// REACT CORE ==========================================================================================================\nimport React, { useEffect, useRef, ReactNode } from \"react\";\nimport { createRoot, Root } from \"react-dom/client\";\n\n// STYLES ==============================================================================================================\nimport \"./tooltip.css\";\n\n// TYPES ===============================================================================================================\ntype Position = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype ShowOn = \"click\" | \"hover\";\n\ninterface TooltipConfig {\n content : ReactNode;\n position : Position;\n showOn : ShowOn;\n zIndex : number;\n}\n\nexport interface TooltipProps {\n children : ReactNode;\n isTooltipFor : string;\n showOn ? : ShowOn;\n position ? : Position;\n zIndex ? : number;\n}\n\n// CONSTANTS ===========================================================================================================\nconst TOOLTIP_OFFSET = 8;\nconst SCREEN_PADDING = 16;\n\n// MODULE-LEVEL SINGLETON ==============================================================================================\nlet singletonContainer : HTMLDivElement | null = null;\nlet singletonRoot : Root | null = null;\nlet isInitialized = false;\nlet activeTargetId : string | null = null;\nlet activeTarget : HTMLElement | null = null;\n\nconst registry = new Map<string, TooltipConfig>();\n\n// POSITIONING =========================================================================================================\nconst calculatePosition = (\n tooltipElement: HTMLElement,\n targetElement: HTMLElement,\n position: Position,\n) => {\n const tooltipRect = tooltipElement.getBoundingClientRect();\n const targetRect = targetElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n\n let top: number;\n let left: number;\n\n switch (position) {\n case \"top\":\n top = targetRect.top - tooltipRect.height - TOOLTIP_OFFSET;\n left = targetRect.left + (targetRect.width - tooltipRect.width) / 2;\n if (top < SCREEN_PADDING) {\n top = targetRect.bottom + TOOLTIP_OFFSET;\n }\n break;\n case \"bottom\":\n top = targetRect.bottom + TOOLTIP_OFFSET;\n left = targetRect.left + (targetRect.width - tooltipRect.width) / 2;\n if (top + tooltipRect.height > viewportHeight - SCREEN_PADDING) {\n top = targetRect.top - tooltipRect.height - TOOLTIP_OFFSET;\n }\n break;\n case \"left\":\n top = targetRect.top + (targetRect.height - tooltipRect.height) / 2;\n left = targetRect.left - tooltipRect.width - TOOLTIP_OFFSET;\n if (left < SCREEN_PADDING) {\n left = targetRect.right + TOOLTIP_OFFSET;\n }\n break;\n case \"right\":\n top = targetRect.top + (targetRect.height - tooltipRect.height) / 2;\n left = targetRect.right + TOOLTIP_OFFSET;\n if (left + tooltipRect.width > viewportWidth - SCREEN_PADDING) {\n left = targetRect.left - tooltipRect.width - TOOLTIP_OFFSET;\n }\n break;\n default:\n top = targetRect.top - tooltipRect.height - TOOLTIP_OFFSET;\n left = targetRect.left + (targetRect.width - tooltipRect.width) / 2;\n }\n\n // Ensure tooltip stays within viewport bounds\n if (left < SCREEN_PADDING) {\n left = SCREEN_PADDING;\n } else if (left + tooltipRect.width > viewportWidth - SCREEN_PADDING) {\n left = viewportWidth - tooltipRect.width - SCREEN_PADDING;\n }\n\n if (top < SCREEN_PADDING) {\n top = SCREEN_PADDING;\n } else if (top + tooltipRect.height > viewportHeight - SCREEN_PADDING) {\n top = viewportHeight - tooltipRect.height - SCREEN_PADDING;\n }\n\n return { top, left };\n};\n\n// TOOLTIP CONTENT COMPONENT ===========================================================================================\ninterface TooltipContentProps {\n content : ReactNode;\n isVisible : boolean;\n position : { top: number; left: number };\n zIndex : number;\n}\n\nconst TooltipContent = ({ content, isVisible, position, zIndex }: TooltipContentProps) => (\n <div\n data-tooltip\n className={isVisible ? \"visible\" : \"\"}\n role=\"tooltip\"\n style={{\n position : \"fixed\",\n zIndex : zIndex,\n top : `${position.top}px`,\n left : `${position.left}px`,\n }}\n >\n {content}\n </div>\n);\n\n// RENDER FUNCTIONS ====================================================================================================\nconst renderTooltip = (config: TooltipConfig | null, target: HTMLElement | null) => {\n if (!singletonRoot || !singletonContainer) return;\n\n if (!config || !target) {\n singletonRoot.render(\n <TooltipContent content={null} isVisible={false} position={{ top: -9999, left: -9999 }} zIndex={100000} />\n );\n return;\n }\n\n // First render hidden to measure\n singletonRoot.render(\n <TooltipContent content={config.content} isVisible={false} position={{ top: -9999, left: -9999 }} zIndex={config.zIndex} />\n );\n\n // Calculate position after render\n requestAnimationFrame(() => {\n if (!singletonContainer || !target) return;\n const tooltipEl = singletonContainer.firstElementChild as HTMLElement;\n if (!tooltipEl) return;\n\n const { top, left } = calculatePosition(tooltipEl, target, config.position);\n singletonRoot?.render(\n <TooltipContent content={config.content} isVisible={true} position={{ top, left }} zIndex={config.zIndex} />\n );\n });\n};\n\nconst updatePosition = () => {\n if (!activeTargetId || !activeTarget) return;\n const config = registry.get(activeTargetId);\n if (config) {\n renderTooltip(config, activeTarget);\n }\n};\n\nconst showTooltip = (targetId: string, target: HTMLElement) => {\n const config = registry.get(targetId);\n if (!config) return;\n\n activeTargetId = targetId;\n activeTarget = target;\n renderTooltip(config, target);\n};\n\nconst hideTooltip = (targetId?: string) => {\n if (targetId && activeTargetId !== targetId) return;\n activeTargetId = null;\n activeTarget = null;\n renderTooltip(null, null);\n};\n\n// EVENT HANDLERS ======================================================================================================\nconst handleMouseOver = (e: MouseEvent) => {\n const target = (e.target as HTMLElement).closest(\"[id]\") as HTMLElement;\n if (!target?.id) return;\n\n const config = registry.get(target.id);\n if (config?.showOn === \"hover\") {\n showTooltip(target.id, target);\n }\n};\n\nconst handleMouseOut = (e: MouseEvent) => {\n const target = (e.target as HTMLElement).closest(\"[id]\") as HTMLElement;\n if (!target?.id) return;\n\n const config = registry.get(target.id);\n if (config?.showOn === \"hover\") {\n hideTooltip(target.id);\n }\n};\n\nconst handleClick = (e: MouseEvent) => {\n // Check if click is inside the tooltip itself\n if (singletonContainer?.contains(e.target as Node)) {\n return;\n }\n\n const target = (e.target as HTMLElement).closest(\"[id]\") as HTMLElement;\n\n // Check if click is on a registered click-trigger element\n if (target?.id) {\n const config = registry.get(target.id);\n if (config?.showOn === \"click\") {\n if (activeTargetId === target.id) {\n hideTooltip();\n } else {\n showTooltip(target.id, target);\n }\n return;\n }\n }\n\n // Click outside - hide any active click tooltip\n if (activeTargetId) {\n const activeConfig = registry.get(activeTargetId);\n if (activeConfig?.showOn === \"click\") {\n hideTooltip();\n }\n }\n};\n\n// INITIALIZATION ======================================================================================================\nconst initializeSingleton = () => {\n if (typeof document === \"undefined\") return;\n\n // Check if container still exists in DOM (might be removed after navigation)\n const existingContainer = document.getElementById(\"fictoan-tooltip-singleton\");\n if (existingContainer && isInitialized) {\n singletonContainer = existingContainer as HTMLDivElement;\n return;\n }\n\n // Reset if container was removed or never created\n isInitialized = false;\n singletonContainer = null;\n singletonRoot = null;\n\n // Create container\n singletonContainer = document.createElement(\"div\");\n singletonContainer.id = \"fictoan-tooltip-singleton\";\n document.body.appendChild(singletonContainer);\n\n // Create React root\n singletonRoot = createRoot(singletonContainer);\n\n // Initial render (hidden)\n singletonRoot.render(\n <TooltipContent content={null} isVisible={false} position={{ top: -9999, left: -9999 }} zIndex={100000} />\n );\n\n // Set up event delegation\n document.addEventListener(\"mouseover\", handleMouseOver);\n document.addEventListener(\"mouseout\", handleMouseOut);\n document.addEventListener(\"click\", handleClick);\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n\n isInitialized = true;\n};\n\n// COMPONENT ===========================================================================================================\nexport const Tooltip = ({\n children,\n isTooltipFor,\n showOn = \"hover\",\n position = \"top\",\n zIndex = 100000,\n}: TooltipProps) => {\n const configRef = useRef<TooltipConfig>({ content: children, position, showOn, zIndex });\n\n // Update ref when props change\n configRef.current = { content: children, position, showOn, zIndex };\n\n useEffect(() => {\n // Initialize singleton on first mount\n initializeSingleton();\n\n // Register this tooltip\n registry.set(isTooltipFor, configRef.current);\n\n // If this tooltip is currently active, update its content\n if (activeTargetId === isTooltipFor && activeTarget) {\n renderTooltip(configRef.current, activeTarget);\n }\n\n return () => {\n registry.delete(isTooltipFor);\n // Hide if this was the active tooltip\n if (activeTargetId === isTooltipFor) {\n hideTooltip();\n }\n };\n }, [isTooltipFor]);\n\n // Update registry when content/position/showOn/zIndex changes\n useEffect(() => {\n registry.set(isTooltipFor, configRef.current);\n\n // If this tooltip is currently active, update it\n if (activeTargetId === isTooltipFor && activeTarget) {\n renderTooltip(configRef.current, activeTarget);\n }\n }, [children, position, showOn, zIndex, isTooltipFor]);\n\n // Renders nothing - the singleton renders the actual tooltip\n return null;\n};\n","// FRAMEWORK ===========================================================================================================\nimport React from \"react\";\n\n// FICTOAN =============================================================================================================\nimport { Element } from \"../Element\";\n\n// TYPES ===============================================================================================================\nimport { CommonAndHTMLProps, WeightTypes } from \"../Element/constants\";\n\n// prettier-ignore\ninterface HeadingBaseProps {\n as ? : \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n fontStyle ? : \"sans-serif\" | \"serif\" | \"monospace\";\n weight ? : WeightTypes;\n align ? : \"left\" | \"centre\" | \"center\" | \"right\";\n}\n\nexport type HeadingElementType = HTMLHeadingElement;\nexport type HeadingProps = Omit<CommonAndHTMLProps<HeadingElementType>, keyof HeadingBaseProps> & HeadingBaseProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst Heading = React.forwardRef(\n ({ fontStyle = \"sans-serif\", weight, align, ...props }: HeadingProps, ref: React.Ref<HeadingElementType>) => {\n let classNames = [];\n\n if (weight) {\n classNames.push(`weight-${weight}`);\n }\n\n if (fontStyle) {\n classNames.push(`font-${fontStyle}`);\n }\n\n if (align) {\n classNames.push(`text-${align}`);\n }\n\n return <Element<HeadingElementType> ref={ref} classNames={classNames} {...props} />;\n }\n);\n\nexport const Heading1 = React.forwardRef((props: HeadingProps, ref: React.Ref<HeadingElementType>) => (\n <Heading as=\"h1\" ref={ref} {...props} />\n));\nHeading1.displayName = \"Heading1\";\n\nexport const Heading2 = React.forwardRef((props: HeadingProps, ref: React.Ref<HeadingElementType>) => (\n <Heading as=\"h2\" ref={ref} {...props} />\n));\nHeading2.displayName = \"Heading2\";\n\nexport const Heading3 = React.forwardRef((props: HeadingProps, ref: React.Ref<HeadingElementType>) => (\n <Heading as=\"h3\" ref={ref} {...props} />\n));\nHeading3.displayName = \"Heading3\";\n\nexport const Heading4 = React.forwardRef((props: HeadingProps, ref: React.Ref<HeadingElementType>) => (\n <Heading as=\"h4\" ref={ref} {...props} />\n));\nHeading4.displayName = \"Heading4\";\n\nexport const Heading5 = React.forwardRef((props: HeadingProps, ref: React.Ref<HeadingElementType>) => (\n <Heading as=\"h5\" ref={ref} {...props} />\n));\nHeading5.displayName = \"Heading5\";\n\nexport const Heading6 = React.forwardRef((props: HeadingProps, ref: React.Ref<HeadingElementType>) => (\n <Heading as=\"h6\" ref={ref} {...props} />\n));\nHeading6.displayName = \"Heading6\";\n","// REACT CORE ==========================================================================================================\nimport React, { ReactNode } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./accordion.css\";\n\n// OTHER ===============================================================================================================\nimport { Text } from \"$/components\";\n\nexport interface AccordionCustomProps {\n isOpen ? : boolean;\n summary : ReactNode;\n children : ReactNode;\n}\n\nexport type AccordionElementType = HTMLDetailsElement;\nexport type AccordionProps =\n Omit<CommonAndHTMLProps<AccordionElementType>, keyof AccordionCustomProps>\n & AccordionCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Accordion = React.forwardRef(\n ({summary, children, isOpen = false, ...props} : AccordionProps, ref : React.Ref<AccordionElementType>) => {\n\n return (\n <Element\n as=\"details\"\n data-expandable-content\n ref={ref}\n {...props}\n open={isOpen}\n role=\"region\"\n aria-labelledby=\"accordion-summary\"\n >\n <summary\n role=\"button\"\n tabIndex={0}\n aria-controls=\"accordion-content\"\n aria-expanded={isOpen}\n >\n {typeof summary === \"string\" ? <Text margin=\"none\">{summary}</Text> : summary}\n </summary>\n {children}\n </Element>\n );\n },\n);\nAccordion.displayName = \"Accordion\";\n"],"names":["createClassName","classNames","item","Element","React","Component","role","ariaLabel","tabIndex","onKeyDown","props","ref","bgColor","bgColour","bgOpacity","borderColor","borderColour","borderOpacity","className","columns","fillColor","fillColour","gap","hideOnDesktop","hideOnMobile","hideOnTabletLandscape","hideOnTabletPortrait","horizontalMargin","horizontalPadding","horizontallyCenterThis","horizontallyCentreThis","isClickable","isFullHeight","isFullWidth","layoutAsFlexbox","layoutAsGrid","stackVertically","stackHorizontally","marginLeft","marginBottom","margin","marginRight","marginTop","opacity","paddingBottom","paddingLeft","padding","paddingRight","paddingTop","pushItemsToEnds","shadow","shape","showOnlyOnDesktop","showOnlyOnMobile","showOnlyOnTabletLandscape","showOnlyOnTabletPortrait","size","strokeColor","strokeColour","textColor","textColour","verticalMargin","verticalPadding","verticallyCenterItems","verticallyCentreItems","weight","style","minimalProps","_","__","sanitizedProps","computedStyle","jsx","createComponentWithElement","tagName","defaultProps","finalProps","external","Article","Aside","Body","Div","Footer","Header","Main","Nav","Section","Span","Hyperlink","ActionIcons","Badge","children","actionIcon","onActionClick","actionAriaLabel","handleActionClick","e","hasAction","jsxs","useClickOutside","handler","memoizedHandler","useCallback","useEffect","listener","event","Drawer","id","isOpen","onClose","position","isDismissible","showOverlay","blurOverlay","closeOnClickOutside","zIndex","label","description","drawerId","descriptionId","drawerRef","useRef","effectiveRef","drawerClasses","drawer","overlay","handleEscape","Fragment","Button","kind","variant","isLoading","ButtonGroup","isJoint","spacing","equaliseWidth","BreadcrumbItem","current","Separator","separator","Text","Breadcrumbs","childrenArray","processedChildren","acc","child","index","isLast","breadcrumbItem","typedChild","Callout","title","Card","heading","CodeBlock","source","language","showCopyButton","showLineNumbers","withSyntaxHighlighting","makeEditable","onChange","isCodeCopied","setIsCodeCopied","useState","prismModule","setPrismModule","setIsLoading","codeElement","setCodeElement","preRef","initialCode","Prism","error","_a","getCursorPosition","selection","range","currentNode","absoluteOffset","treeWalker","node","highlightCode","content","cursorPosition","highlighted","newRange","currentOffset","length","handleInput","element","copyToClipboard","textToCopy","err","handleKeyDown","lines","Divider","height","WRAPPER_PROP_KEYS","separateWrapperProps","wrapperProps","inputProps","key","InputLabel","hideLabel","htmlFor","fontStyle","align","isSubtext","ValidationIcon","state","FormItem","customLabel","helpText","errorText","validationState","required","labelFirst","hasLabel","hasInfoSection","Checkbox","name","checked","defaultChecked","disabled","derivedName","useMemo","handleChange","Switch","CheckboxGroup","options","value","defaultValue","equalizeWidth","selectedValues","setSelectedValues","optionValue","newValues","v","option","optionId","optionLabel","optionProps","finalId","isChecked","SwitchGroup","FileUpload","ariaInvalid","accept","allowMultipleFiles","capture","instructionMainText","instructionSubText","invalid","badgeBgColour","badgeTextColour","files","setFiles","isDragging","setIsDragging","fileInputRef","handleDragOver","handleDragLeave","handleDrop","droppedFiles","handleFiles","newFiles","prevFiles","fileToAdd","handleFileInput","selectedFiles","removeFile","indexToRemove","updatedFiles","openFileDialog","file","InputField","innerIconLeft","innerIconRight","innerTextLeft","innerTextRight","validateThis","valid","externalValidationState","onBlur","onFocus","type","placeholder","autoComplete","maxLength","minLength","pattern","readOnly","leftElementRef","rightElementRef","internalInputRef","touched","setTouched","internalValidationState","setInternalValidationState","mergeRefs","el","updateValidationState","input","handleBlur","handleFocus","updateWidth","pos","formItem","renderSideElement","elRef","isText","contentProps","isInteractive","hasLeftElement","hasRightElement","Portion","desktopSpan","mobileSpan","tabletLandscapeSpan","tabletPortraitSpan","isHorizontal","RadioButton","RadioGroup","Row","layout","gutters","retainLayoutOnTabletLandscape","retainLayoutOnTabletPortrait","retainLayoutOnMobile","retainLayoutAlways","allowUltraWide","groupLabel","Select","renderOption","renderOptGroup","group","getLimitState","limit","pluralise","count","singular","plural","TextArea","characterLimit","wordLimit","rows","cols","textareaRef","constructHelpText","limitsMessages","currentChars","limitState","excessChars","remaining","currentWords","excessWords","msg","i","setRefs","FormElements","getFormItem","formField","onFieldChange","elementName","formFieldProps","ElementComponent","generateFormThroughConfig","fields","formChildren","field","createElement","Form","onFieldsChange","handleFieldChange","fieldName","formContent","FormItemGroup","equalWidthForChildren","retainLayout","legend","groupId","levenshteinDistance","a","b","matrix","aLength","bLength","j","isSubsequence","search","target","searchIndex","targetIndex","generateAcronym","word","searchOptions","searchTerm","normalizedSearch","maxDistance","normalizedLabel","distance","words","searchWords","isPartialMatch","searchWord","acronym","isAcronymMatch","ListBox","selectionLimit","allowMultiSelect","allowCustomEntries","setIsOpen","searchValue","setSearchValue","activeIndex","setActiveIndex","selectedOption","setSelectedOption","selectedOptions","setSelectedOptions","openUpward","setOpenUpward","allOptions","dropdownRef","searchInputRef","dropdownMenuRef","listboxId","filteredOptions","handleSelectOption","newSelectedOptions","opt","handleSearchChange","handleCustomEntry","customValue","customOption","handleDeleteOption","valueToRemove","handleClearAll","prev","exactMatch","wrapperRect","viewportHeight","estimatedDropdownHeight","spaceBelow","spaceAbove","activeOption","validate","PinInputField","mask","isOTP","autoFocus","pasteFromClipboard","focusFirstInputOnReset","pinInputFieldRef","inputRefs","setInputRefs","values","setValues","moveFocus","setMoveFocus","focusedIndex","setFocusedIndex","inputGroupId","inputDescription","focus","focusNext","next","handleResetPinInput","setValue","nextValues","inputValue","handleInputChange","inputFieldIndex","currentValue","nextValue","chars","nextFocusIndex","newIndex","handleSelect","createRef","useImperativeHandle","RadioTabGroup","optionsWrapperRef","indicatorPos","setIndicatorPos","needsScroll","setNeedsScroll","scrollPosition","setScrollPosition","maxScroll","setMaxScroll","labelsRef","measureWidths","wrapper","inputWrapper","totalContentWidth","availableWidth","needsToScroll","observer","selectedIndex","updateIndicator","width","transform","timeoutId","handleScroll","direction","scrollAmount","newPosition","canScrollLeft","canScrollRight","isDualRangeProps","Range","DualThumbRange","SingleThumbRange","suffix","min","max","step","thumbRef","trackRef","isActive","setIsActive","clampedValue","getPercent","val","getValueFromPosition","clientX","rect","percent","rawValue","steppedValue","handleDrag","newValue","handleMouseDown","handleMouseMove","handleMouseUp","handleTouchStart","handleTouchMove","handleTouchEnd","minLabel","maxLabel","rawMinValue","rawMaxValue","minValue","maxValue","minThumbRef","maxThumbRef","activeThumb","setActiveThumb","thumb","clampedMin","clampedMax","minPercent","maxPercent","Meter","showOptimumMarker","low","high","optimum","optimumPositionPercent","getValueDescription","percentage","status","Modal","showBackdrop","blurBackdrop","modalId","modal","focusableElements","handleToggle","NotificationsWrapper","anchor","order","roleMap","NotificationItem","duration","isExiting","setIsExiting","timer","fallbackTimer","handleDismissClick","handleTransitionEnd","NotificationsContext","createContext","NotificationsProvider","notifications","setNotifications","removeNotification","n","addNotification","baseNotify","messageOrOptions","opts","notify","fn","message","useNotifications","context","useContext","Spinner","loadingText","start","end","usePagination","totalItems","currentPage","itemsToShowEachSide","totalPages","totalNumbers","pageNumbers","leftSideNumbers","rightSideNumbers","rangeStart","rangeEnd","defaultRenderItem","page","selected","onClick","paginationItemProps","Pagination","onPageChange","showGoToFirstItemButton","showGoToLastItemButton","showPreviousButton","showNextButton","showGoToInput","hideDisabledButtons","renderItem","emptyText","itemDisplayText","items","hasPrevPage","hasNextPage","goToPage","setGoToPage","handlePageInputChange","handlePageInputKeyPress","itemProps","ProgressBar","validValue","progressText","backgroundColour","progressFillColour","progressBarStyles","OptionCardsContext","OptionCardsGroup","allowMultipleSelections","showTickIcon","onSelectionChange","tickPosition","defaultSelectedIds","selectedIdsProp","isControlled","internalSelectedIds","setInternalSelectedIds","availableOptionsRef","selectedIds","updateSelectedIds","newIds","registerOption","unregisterOption","toggleSelection","newSelectedIds","selectAll","enabledOptions","optionsToSelect","selectNone","selectInverse","invertedSelection","isSelected","contextValue","useOptionCard","useOptionCardsGroup","OptionCard","showDeselect","setShowDeselect","isInitialHover","setIsInitialHover","handleMouseEnter","handleMouseLeave","handleClick","SidebarWrapper","collapsed","showMobileSidebar","forwardedRef","internalRef","ContentWrapper","SidebarHeader","isSticky","SidebarItem","hasAlert","hasEmptyIcon","hasNoIcon","SidebarFooter","SkeletonContext","Skeleton","localEffect","loadingLabel","groupContext","effectiveEffect","effectiveLabel","computedWidth","computedHeight","SkeletonGroup","effect","animate","repeat","groupClassNames","Table","bordersFor","isStriped","highlightRowOnHover","alignText","caption","summary","hasColSpan","rowCount","firstRow","rowProps","Tabs","tabs","additionalNavContentWrapper","defaultActiveTab","tab","defaultTabIndex","activeTab","setActiveTab","tabButtonRefs","handleTabChange","currentIndex","nextIndex","nextTab","getStorageKey","hostname","port","identifier","defaultContext","ThemeContext","useTheme","getTheme","fallback","theme","ThemeProvider","currentTheme","themeList","shouldRender","setShouldRender","themeState","setThemeState","setTheme","newTheme","fallbackTheme","ToastsWrapper","ToastItem","ToastsContext","ToastsProvider","toasts","setToasts","removeToast","t","toast","useToasts","TOOLTIP_OFFSET","SCREEN_PADDING","singletonContainer","singletonRoot","isInitialized","activeTargetId","activeTarget","registry","calculatePosition","tooltipElement","targetElement","tooltipRect","targetRect","viewportWidth","top","left","TooltipContent","isVisible","renderTooltip","config","tooltipEl","updatePosition","showTooltip","targetId","hideTooltip","handleMouseOver","handleMouseOut","activeConfig","initializeSingleton","existingContainer","createRoot","Tooltip","isTooltipFor","showOn","configRef","Heading","Heading1","Heading2","Heading3","Heading4","Heading5","Heading6","Accordion"],"mappings":";;;;AAAO,MAAMA,KAAkB,CAACC,MACrBA,EAAW,OAAO,CAACC,MAAS,CAAC,CAACA,CAAI,EAAE,KAAK,GAAG,GCS1CC,IAAUC,EAAM;AAAA,EACzB,CACI;AAAA,IACI,IAAKC,IAAY;AAAA,IACjB,MAAAC;AAAA,IACA,WAAAC;AAAA,IACA,UAAAC;AAAA,IACA,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAMJC,MACF;AACD,UAAM;AAAA,MACF,YAAAV,IAAa,CAAA;AAAA,MACb,SAAAW;AAAA,MACA,UAAAC;AAAA,MACA,WAAAC;AAAA,MACA,aAAAC;AAAA,MACA,cAAAC;AAAA,MACA,eAAAC;AAAA,MACA,WAAAC;AAAA,MACA,SAAAC;AAAA,MACA,WAAAC;AAAA,MACA,YAAAC;AAAA,MACA,KAAAC;AAAA,MACA,eAAAC;AAAA,MACA,cAAAC;AAAA,MACA,uBAAAC;AAAA,MACA,sBAAAC;AAAA,MACA,kBAAAC;AAAA,MACA,mBAAAC;AAAA,MACA,wBAAAC;AAAA,MACA,wBAAAC;AAAA,MACA,aAAAC;AAAA,MACA,cAAAC;AAAA,MACA,aAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,cAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,mBAAAC;AAAA,MACA,YAAAC;AAAA,MACA,cAAAC;AAAA,MACA,QAAAC;AAAA,MACA,aAAAC;AAAA,MACA,WAAAC;AAAA,MACA,SAAAC;AAAA,MACA,eAAAC;AAAA,MACA,aAAAC;AAAA,MACA,SAAAC;AAAA,MACA,cAAAC;AAAA,MACA,YAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,QAAAC;AAAA,MACA,OAAAC;AAAA,MACA,mBAAAC;AAAA,MACA,kBAAAC;AAAA,MACA,2BAAAC;AAAA,MACA,0BAAAC;AAAA,MACA,MAAAC;AAAA,MACA,aAAAC;AAAA,MACA,cAAAC;AAAA,MACA,WAAAC;AAAA,MACA,YAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,uBAAAC;AAAA,MACA,uBAAAC;AAAA,MACA,QAAAC;AAAA,MACA,OAAAC;AAAA,MACA,GAAGC;AAAA,IAAA,IACHzD,GAEE,EAAC,WAAY0D,IAAG,YAAaC,IAAI,GAAGC,OAAkB5D,GAGtD6D,KAAgB;AAAA,MAClB,GAAGL;AAAA,MACH,GAAIpD,KAAa,EAAE,gBAAgB,OAAOA,CAAS,IAAI,IAAA;AAAA,MACvD,GAAIG,KAAiB,EAAE,oBAAoB,OAAOA,CAAa,IAAI,IAAA;AAAA,IAAI;AAG3E,WACI,gBAAAuD;AAAA,MAACnE;AAAA,MAAA;AAAA,QACG,KAAAM;AAAA,QACA,MAAAL;AAAA,QACA,cAAYC;AAAA,QACZ,UAAAC;AAAA,QACA,WAAAC;AAAA,QACC,GAAG0D;AAAA,QACJ,OAAO,OAAO,KAAKI,EAAa,EAAE,SAAS,IAAIA,KAAgB;AAAA,QAC/D,WAAWvE;AAAA,UACP;AAAA,YACIkB;AAAA,YACAN,KAAW,MAAMA,CAAO;AAAA,YACxBC,KAAY,MAAMA,CAAQ;AAAA,YAC1BE,KAAe,UAAUA,CAAW;AAAA,YACpCC,KAAgB,UAAUA,CAAY;AAAA,YACtCI,KAAa,QAAQA,CAAS;AAAA,YAC9BC,KAAc,QAAQA,CAAU;AAAA,YAChCE,KAAiB;AAAA,YACjBC,KAAgB;AAAA,YAChBC,KAAyB;AAAA,YACzBC,KAAwB;AAAA,YACxBC,KAAoB,gBAAgBA,CAAgB,gBAAgBA,CAAgB;AAAA,YACpFC,KAAqB,iBAAiBA,CAAiB,iBAAiBA,CAAiB;AAAA,YACzFC,KAA0B;AAAA,YAC1BC,KAA0B;AAAA,YAC1BC,KAAe;AAAA,YACfC,KAAgB;AAAA,YAChBC,KAAe;AAAA,YACfC,KAAmB;AAAA,YACnBC,KAAgB;AAAA,YAChBC,KAAmB;AAAA,YACnBC,KAAqB;AAAA,YACrBf,KAAO,OAAOA,CAAG;AAAA,YACjBgB,KAAc,eAAeA,CAAU;AAAA,YACvCC,KAAgB,iBAAiBA,CAAY;AAAA,YAC7CC,KAAU,cAAcA,CAAM;AAAA,YAC9BC,KAAe,gBAAgBA,CAAW;AAAA,YAC1CC,KAAa,cAAcA,CAAS;AAAA,YACpCC,KAAW,WAAWA,CAAO;AAAA,YAC7BC,MAAiB,kBAAkBA,EAAa;AAAA,YAChDC,MAAe,gBAAgBA,EAAW;AAAA,YAC1CC,MAAW,eAAeA,EAAO;AAAA,YACjCC,MAAgB,iBAAiBA,EAAY;AAAA,YAC7CC,MAAc,eAAeA,EAAU;AAAA,YACvCC,MAAmB;AAAA,YACnBC,KAAU,UAAUA,CAAM;AAAA,YAC1BC,KAAS,SAASA,CAAK;AAAA,YACvBC,KAAqB;AAAA,YACrBC,MAAoB;AAAA,YACpBC,MAA6B;AAAA,YAC7BC,MAA4B;AAAA,YAC5BC,KAAQ,QAAQA,CAAI;AAAA,YACpBC,MAAe,UAAUA,EAAW;AAAA,YACpCC,MAAgB,UAAUA,EAAY;AAAA,YACtCC,MAAa,QAAQA,EAAS;AAAA,YAC9BC,MAAc,QAAQA,EAAU;AAAA,YAChCC,MAAkB,cAAcA,EAAc,kBAAkBA,EAAc;AAAA,YAC9EC,MAAmB,eAAeA,EAAe,mBAAmBA,EAAe;AAAA,YACnFC,MAAyB;AAAA,YACzBC,MAAyB;AAAA,YACzBC,MAAU,UAAUA,EAAM;AAAA,UAAA,EAC5B,OAAOhE,CAAU;AAAA,QAAA;AAAA,MACvB;AAAA,IAAA;AAAA,EAGZ;AACJ;AACCE,EAAgB,cAAc;ACjJ/B,MAAMsE,KAA6B,CAC/BC,GACAC,MAEOvE,EAAM;AAAA,EACT,CAACM,GAAOC,MAAQ;AAEZ,UAAMiE,IAAa,EAAC,GAAGD,GAAc,GAAGjE,EAAA;AAGxC,QAAIgE,MAAY,OAAO,cAAcE,GAAY;AAC7C,YAAM,EAAC,UAAAC,EAAsB,IAAID;AACjC,MAAIC,MACAD,EAAW,SAAS,UACpBA,EAAW,MAAM;AAAA,IAEzB;AAEA,6BAAQzE,GAAA,EAAQ,IAAIuE,GAAS,KAAA/D,GAAW,GAAGiE,GAAY;AAAA,EAC3D;AAAA,GAIKE,KAAUL,GAA2B,SAAS,GAC9CM,KAAQN,GAA2B,OAAO,GAC1CO,KAAOP,GAA2B,MAAM,GACxCQ,IAAMR,GAA2B,KAAK,GACtCS,KAAST,GAA2B,QAAQ,GAC5CU,KAASV,GAA2B,QAAQ,GAC5CW,KAAOX,GAA2B,MAAM,GACxCY,KAAMZ,GAA2B,KAAK,GACtCa,KAAUb,GAA2B,SAAS,GAC9Cc,KAAOd,GAA2B,MAAM,GACxCe,KAAYf,GAAsD,KAAK;AAAA,EAChF,KAAM;AAAA;AACV,CAAC,GC7BKgB,KAA6D;AAAA,EAC/D,OACI,gBAAAjB,EAAC,OAAA,EAAI,SAAQ,aAAY,eAAY,QACjC,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,uBAAA,CAAuB,EAAA,CACnC;AAAA,EAEJ,MACI,gBAAAA,EAAC,OAAA,EAAI,SAAQ,aAAY,eAAY,QACjC,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,iBAAA,CAAiB,EAAA,CAC7B;AAAA,EAEJ,MACI,gBAAAA,EAAC,OAAA,EAAI,SAAQ,aAAY,eAAY,QACjC,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,mBAAA,CAAmB,EAAA,CAC/B;AAAA,EAEJ,OACI,gBAAAA,EAAC,OAAA,EAAI,SAAQ,aAAY,eAAY,QACjC,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,WAAA,CAAW,EAAA,CACvB;AAER,GAGakB,KAAQtF,EAAM;AAAA,EACvB,CAAC;AAAA,IACG,UAAAuF;AAAA,IACA,MAAAnC,IAAO;AAAA,IACP,OAAAL;AAAA,IACA,YAAAyC;AAAA,IACA,eAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,GAAGpF;AAAA,EAAA,GACSC,MAAsC;AAClD,QAAIV,IAAa,CAAA;AAEjB,IAAIuD,KACAvD,EAAW,KAAK,QAAQuD,CAAI,EAAE,GAG9BL,KACAlD,EAAW,KAAK,SAASkD,CAAK,EAAE;AAGpC,UAAM4C,IAAoB,CAACC,MAA4C;AACnE,MAAAA,EAAE,gBAAA,GACFH,KAAA,QAAAA,EAAgBG;AAAA,IACpB,GAEMC,IAAY,EAAQL;AAE1B,WACI,gBAAAM;AAAA,MAAC/F;AAAA,MAAA;AAAA,QACG,cAAU;AAAA,QACV,mBAAiB8F,KAAa;AAAA,QAC9B,KAAAtF;AAAA,QACA,YAAAV;AAAA,QACA,MAAK;AAAA,QACL,cAAa,OAAO0F,KAAa,WAAWA,IAAW;AAAA,QACtD,GAAGjF;AAAA,QAEH,UAAA;AAAA,UAAAiF;AAAA,UAEAM,KACG,gBAAAzB;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAASuB;AAAA,cACT,cAAYD;AAAA,cAEX,aAAYF,CAAW;AAAA,YAAA;AAAA,UAAA;AAAA,QAC5B;AAAA,MAAA;AAAA,IAAA;AAAA,EAIhB;AACJ;AACAF,GAAM,cAAc;ACnGb,MAAMS,KAAkB,CAC3BxF,GAA2ByF,MAAkC;AAC7D,QAAMC,IAAkBC,EAAYF,GAAS,CAACA,CAAO,CAAC;AAEtD,EAAAG,EAAU,MAAM;AACZ,UAAMC,IAAW,CAACC,MAAkB;AAEhC,MAAI,CAAC9F,EAAI,WAAW,OAAO0F,KAAoB,cAK1C1F,EAAI,QAAQ,SAAS8F,EAAM,MAAc,KAC1CJ,EAAgBI,CAAK;AAAA,IAE7B;AAEA,oBAAS,iBAAiB,aAAaD,CAAQ,GAC/C,SAAS,iBAAiB,cAAcA,CAAQ,GAEzC,MAAM;AACT,eAAS,oBAAoB,aAAaA,CAAQ,GAClD,SAAS,oBAAoB,cAAcA,CAAQ;AAAA,IACvD;AAAA,EACJ,GAAG,CAAC7F,GAAK0F,CAAe,CAAC;AAC7B,GCMaK,KAAStG,EAAM;AAAA,EACxB,CACI;AAAA,IACI,IAAAuG;AAAA,IACA,UAAAhB;AAAA,IACA,QAAAiB,IAAS;AAAA,IACT,SAAAC;AAAA,IACA,UAAAC,IAAW;AAAA,IACX,MAAAtD,IAAO;AAAA,IACP,SAAAV,IAAU;AAAA,IACV,SAAAlC;AAAA,IACA,UAAAC;AAAA,IACA,eAAAkG,IAAgB;AAAA,IAChB,aAAAC,IAAc;AAAA,IACd,aAAAC,IAAc;AAAA,IACd,qBAAAC,IAAsB;AAAA,IACtB,QAAAC;AAAA,IACA,OAAAC;AAAA,IACA,aAAAC;AAAA,IACA,YAAApH,IAAa,CAAA;AAAA,IACb,GAAGS;AAAA,EAAA,GAEPC,MACC;AACD,UAAM2G,IAAW,GAAGX,CAAE,IAChBY,IAAgBF,IAAc,GAAGC,CAAQ,iBAAiB,QAC1DE,IAAYC,EAAuB,IAAI,GACvCC,IAAgB/G,KAAO6G,GAGvBG,IAA2B;AAAA,MAC7B;AAAA,MACAb;AAAA,MACAtD;AAAA,MACA,GAAIoD,IAAS,CAAE,MAAO,IAAI,CAAA;AAAA,MAC1B,GAAII,IAAc,CAAE,cAAe,IAAI,CAAA;AAAA,MACvC,GAAIC,IAAc,CAAE,cAAe,IAAI,CAAA;AAAA,MACvC,GAAGhH;AAAA,IAAA;AAIP,WAAAsG,EAAU,MAAM;AACZ,YAAMqB,IAASF,EAAa,SACtBG,IAAU,SAAS,cAAc,6BAA6BP,CAAQ,IAAI;AAEhF,aAAIV,KAEAgB,KAAA,QAAAA,EAAQ,UAAU,IAAI,SACtBA,KAAA,QAAAA,EAAQ,UAAU,OAAO,YACzBA,KAAA,QAAAA,EAAQ,SAGJC,KACAA,EAAQ,UAAU,IAAI,SAAS,GAInC,SAAS,KAAK,MAAM,WAAW,YAG3BD,KAAA,QAAAA,EAAQ,UAAU,SAAS,YAC3BA,EAAO,UAAU,IAAI,SAAS,GAC9BA,EAAO,UAAU,OAAO,MAAM,GAG1BC,KACAA,EAAQ,UAAU,OAAO,SAAS,GAItC,SAAS,KAAK,MAAM,WAAW,KAKhC,MAAM;AACT,iBAAS,KAAK,MAAM,WAAW;AAAA,MACnC;AAAA,IACJ,GAAG,CAAEjB,GAAQU,GAAUI,CAAa,CAAC,GAGrCnB,EAAU,MAAM;AACZ,YAAMuB,IAAe,CAAC9B,MAAsB;AACxC,QAAIA,EAAE,QAAQ,YAAYe,KAAiBH,KAAUC,KACjDA,EAAA;AAAA,MAER;AAEA,sBAAS,iBAAiB,WAAWiB,CAAY,GAC1C,MAAM,SAAS,oBAAoB,WAAWA,CAAY;AAAA,IACrE,GAAG,CAAEf,GAAeH,GAAQC,CAAQ,CAAC,GAGrCV,GAAgBuB,GAAc,MAAM;AAChC,MAAIR,KAAuBH,KAAiBH,KAAUC,KAClDA,EAAA;AAAA,IAER,CAAC,GAUG,gBAAAX,EAAA6B,IAAA,EAEK,UAAA;AAAA,MAAAf,KACG,gBAAAxC;AAAA,QAACS;AAAA,QAAA;AAAA,UACG,WAAW,kBAAkBgC,IAAc,SAAS,EAAE,IAAIL,IAAS,YAAY,EAAE;AAAA,UACjF,2BAAyBD;AAAA,UACzB,eAAY;AAAA,UACZ,SAASO,KAAuBH,KAAiBF,IAAUA,IAAU;AAAA,UACrE,OAAO,EAAC,QAASM,KAAU,KAAQ;AAAA,QAAC;AAAA,MAAA;AAAA,MAK5C,gBAAAjB;AAAA,QAAC/F;AAAA,QAAA;AAAA,UACG,IAAG;AAAA,UACH,IAAImH;AAAA,UACJ,eAAW;AAAA,UACX,KAAKI;AAAA,UACL,YAAYC;AAAA,UACZ,gBA1Be,CAAC3B,MAA6B;AACrD,aAAIA,EAAE,cAAc,SAAS,WAAW,KAAKA,EAAE,cAAc,SAAS,UAAU,MAC5EA,EAAE,cAAc,UAAU,OAAO,SAAS;AAAA,UAElD;AAAA,UAuBY,MAAK;AAAA,UACL,cAAW;AAAA,UACX,cAAYoB,KAAS;AAAA,UACrB,oBAAkBG;AAAA,UAClB,UAAU;AAAA,UACV,OAAO,EAAC,QAASJ,KAAU,IAAA;AAAA,UAC1B,GAAGzG;AAAA,UAGH,UAAA;AAAA,YAAAqG,KAAiBF,KACd,gBAAArC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,WAAU;AAAA,gBACV,SAASqC;AAAA,gBACT,cAAW;AAAA,gBACX,UAAU;AAAA,gBACb,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAKL,gBAAAX;AAAA,cAACjB;AAAA,cAAA;AAAA,gBACG,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,SAAAnC;AAAA,gBACA,SAAAlC;AAAA,gBACA,UAAAC;AAAA,gBAGC,UAAA;AAAA,kBAAAwG,uBACI,OAAA,EAAI,IAAIE,GAAe,WAAU,WAC7B,UAAAF,GACL;AAAA,kBAGH1B;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACL;AAAA,QAAA;AAAA,MAAA;AAAA,IACJ,GACJ;AAAA,EAER;AACJ;AACAe,GAAO,cAAc;ACjLd,MAAMsB,KAAS5H,EAAM;AAAA,EACxB,CAAC,EAAC,MAAAoD,IAAO,UAAU,OAAAL,GAAO,MAAA8E,GAAM,SAAAC,GAAS,WAAAC,GAAW,OAAAf,GAAO,GAAG1G,EAAA,GAAsBC,MAAuC;AACvH,QAAIV,IAAa,CAAA;AAEjB,WAAIgI,KACAhI,EAAW,KAAKgI,CAAI,GAGpBC,KACAjI,EAAW,KAAKiI,CAAO,GAGvB1E,KACAvD,EAAW,KAAK,QAAQuD,CAAI,EAAE,GAG9BL,KACAlD,EAAW,KAAK,SAASkD,CAAK,EAAE,GAGhCgF,KACAlI,EAAW,KAAK,YAAY,GAI5B,gBAAAuE;AAAA,MAACrE;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,eAAW;AAAA,QACX,KAAAQ;AAAA,QACA,YAAAV;AAAA,QACA,cAAYmH;AAAA,QACZ,iBAAe1G,EAAM,YAAYyH;AAAA,QACjC,aAAWA;AAAA,QACV,GAAGzH;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhB;AACJ;AACAsH,GAAO,cAAc;ACxCd,MAAMI,KAAchI,EAAM;AAAA,EAC7B,CACI,EAAC,SAAAiI,IAAU,IAAM,SAAAC,GAAS,eAAAC,GAAe,UAAA5C,GAAU,GAAGjF,EAAA,GACtDC,MACC;AACD,QAAIV,IAAwB,CAAA;AAE5B,WAAIoI,KACApI,EAAW,KAAK,UAAU,GAG1BqI,KAAW,CAACD,KACZpI,EAAW,KAAK,WAAWqI,CAAO,EAAE,GAGpCC,KACAtI,EAAW,KAAK,aAAa,GAI7B,gBAAAuE;AAAA,MAACrE;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,qBAAiB;AAAA,QACjB,KAAAQ;AAAA,QACA,MAAK;AAAA,QACL,YAAAV;AAAA,QACC,GAAGS;AAAA,QAEH,UAAAiF;AAAA,MAAA;AAAA,IAAA;AAAA,EAGb;AACJ;AAEAyC,GAAY,cAAc;ACvB1B,MAAMI,KAAiBpI,EAAM;AAAA,EACzB,CAAC,EAAC,UAAAuF,GAAU,SAAA8C,GAAS,GAAG/H,EAAA,GAAQC,MAExB,gBAAA6D;AAAA,IAACrE;AAAA,IAAA;AAAA,MACG,IAAG;AAAA,MACH,wBAAoB;AAAA,MACpB,KAAAQ;AAAA,MACC,GAAGD;AAAA,MACJ,gBAAc+H,IAAU,SAAS;AAAA,MACjC,WAAWA,IAAU,YAAY;AAAA,MACjC,MAAK;AAAA,MAEL,UAAA,gBAAAjE,EAAC,QAAA,EAAK,WAAU,sBACX,UAAAmB,EAAA,CACL;AAAA,IAAA;AAAA,EAAA;AAIhB,GAEM+C,KAAuC,CAAC,EAAC,WAAAC,EAAA,MAC3C,gBAAAnE;AAAA,EAACoE;AAAA,EAAA;AAAA,IACG,WAAU;AAAA,IACV,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,QAAO;AAAA,IAEN,UAAAD;AAAA,EAAA;AACL,GAGSE,KAAczI,EAAM;AAAA,EAC7B,CAAC,EAAC,UAAAuF,GAAU,WAAAgD,IAAY,KAAK,SAAAL,IAAU,SAAS,GAAG5H,EAAA,GAAQC,MAAQ;AAC/D,QAAIV,IAAa,CAAA;AAEjB,IAAIqI,KACArI,EAAW,KAAK,WAAWqI,CAAO,EAAE;AAGxC,UAAMQ,IAAgB1I,EAAM,SAAS,QAAQuF,CAAQ,EAAE,OAAO,OAAO,GAE/DoD,IAAoBD,EAAc,OAA0B,CAACE,GAAKC,GAAOC,MAAU;AACrF,UAAI,CAAC9I,EAAM,eAAe6I,CAAK,EAAG,QAAOD;AAEzC,YAAMG,IAASD,MAAUJ,EAAc,SAAS;AAEhD,UAAIM;AACJ,UAAIH,EAAM,SAAST,IAAgB;AAC/B,cAAMa,IAAaJ;AACnB,QAAAG,IAAiBhJ,EAAM,aAAaiJ,GAAY;AAAA,UAC5C,SAAUF;AAAA,QAAA,CACb;AAAA,MACL;AACI,QAAAC,sBACKZ,IAAA,EAAqC,SAASW,GAC1C,UAAAF,KADgB,QAAQC,CAAK,EAElC;AAIR,aAAAF,EAAI,KAAKI,CAAc,GAElBD,KACDH,EAAI;AAAA,QACA,gBAAAxE,EAACkE,IAAA,EAA+B,WAAAC,EAAA,GAAhB,OAAOO,CAAK,EAA0B;AAAA,MAAA,GAIvDF;AAAA,IACX,GAAG,CAAA,CAAE;AAEL,6BACK,OAAA,EAAI,cAAW,cAAa,KAAArI,GAAW,GAAGD,GACvC,UAAA,gBAAA8D;AAAA,MAACrE;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,4BAAwB;AAAA,QACxB,MAAK;AAAA,QACL,YAAAF;AAAA,QAEC,UAAA8I;AAAA,MAAA;AAAA,IAAA,GAET;AAAA,EAER;AACJ;AACAF,GAAY,cAAc;ACjGnB,MAAMS,KAAUlJ,EAAM;AAAA,EACzB,CAAC,EAAC,MAAA6H,GAAM,UAAAtC,GAAU,OAAA4D,GAAO,GAAG7I,EAAA,GAAuBC,MAS3C,gBAAA6D;AAAA,IAACrE;AAAA,IAAA;AAAA,MACG,IAAG;AAAA,MACH,gBAAY;AAAA,MACZ,KAAAQ;AAAA,MACA,WAAWsH;AAAA,MACX,MAbQ;AAAA,QACZ,MAAU;AAAA,QACV,SAAU;AAAA,QACV,SAAU;AAAA,QACV,OAAU;AAAA,MAAA,EASQA,CAAI;AAAA,MAClB,aAAWA,MAAS,WAAWA,MAAS,YAAY,cAAc;AAAA,MAClE,cAAYsB;AAAA,MACX,GAAG7I;AAAA,MAEH,UAAAiF;AAAA,IAAA;AAAA,EAAA;AAIjB;AACA2D,GAAQ,cAAc;AC3Bf,MAAME,KAAOpJ,EAAM,WAAW,CACjC,EAAC,OAAA+C,GAAO,SAAAsG,GAAS,UAAA9D,GAAU,GAAGjF,EAAA,GAAoBC,MAAqC;AACvF,MAAIV,IAAa,CAAA;AAEjB,SAAIkD,KACAlD,EAAW,KAAK,SAASkD,CAAK,EAAE,GAIhC,gBAAAqB;AAAA,IAACrE;AAAA,IAAA;AAAA,MACG,IAAG;AAAA,MACH,aAAS;AAAA,MACT,KAAAQ;AAAA,MACA,YAAAV;AAAA,MACA,MAAK;AAAA,MACL,cAAYwJ;AAAA,MACZ,UAAU;AAAA,MACT,GAAG/I;AAAA,MAEH,UAAAiF;AAAA,IAAA;AAAA,EAAA;AAGb,CAAC;AACD6D,GAAK,cAAc;ACHZ,MAAME,KAAYtJ,EAAM,WAAW,CACtC;AAAA,EACI,UAAAuF;AAAA,EACA,QAAAgE;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,gBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,aAAAzC;AAAA,EACA,wBAAA0C,IAAyB;AAAA,EACzB,cAAAC,IAAe;AAAA,EACf,UAAAC;AAAA,EACA,QAAA/G;AAAA,EACA,GAAGxC;AACP,GACAC,MACC;AACD,QAAM,CAAEuJ,GAAcC,CAAgB,IAAIC,EAAS,EAAK,GAClD,CAAEC,GAAaC,CAAe,IAAIF,EAA2B,IAAI,GACjE,CAAEjC,GAAWoC,CAAa,IAAIH,EAASL,CAAsB,GAC7D,CAAES,GAAaC,CAAe,IAAIL,EAA6B,IAAI,GAEnEM,IAASjD,EAAuB,IAAI;AAG1C,MAAIkD,IAAc,OAAOhF,KAAa,WAChCA,IACAvF,EAAM,SAAS,QAAQuF,CAAQ,EAAE,KAAK,EAAE;AAE9C,EAAKA,MACDgF,IAAc,OAAOhB,KAAW,WAC1B,KAAK,UAAUA,GAAQ,MAAM,CAAC,IAC9BA,KAAU,KAIpBpD,EAAU,MAAM;AACZ,QAAI,CAACwD,EAAwB;AAsC7B,KApC8B,YAAY;;AACtC,MAAAQ,EAAa,EAAI;AACjB,UAAI;AAGA,cAAMK,KADQ,MAAM,OAAO,SAAS,GAChB;AAQpB,YALI,OAAO,SAAW,OAAe,CAAE,OAAe,UACjD,OAAe,QAAQA,IAIxBhB,MAAa,WAAW,CAACgB,EAAM,UAAUhB,CAAQ;AACjD,cAAI;AACA,kBAAM,OAAO,4BAA4BA,CAAQ;AAAA,UACrD,QAAoB;AAChB,oBAAQ,KAAK,aAAaA,CAAQ,6CAA6C;AAAA,UACnF;AAGJ,QAAAU,EAAeM,CAAK;AAAA,MACxB,SAASC,GAAa;AAElB,SAAIA,KAAA,gBAAAA,EAAO,UAAS,2BAA0BC,IAAAD,KAAA,gBAAAA,EAAO,YAAP,QAAAC,EAAgB,SAAS,wBACnE,QAAQ;AAAA,UACJ;AAAA,QAAA,IAGJ,QAAQ,KAAK,0CAA0ClB,CAAQ,KAAKiB,CAAK;AAAA,MAEjF,UAAA;AACI,QAAAN,EAAa,EAAK;AAAA,MACtB;AAAA,IACJ,GAEA;AAAA,EACJ,GAAG,CAAER,GAAwBH,CAAS,CAAC;AAGvC,QAAMmB,IAAoBzE,EAAY,MAAM;;AACxC,UAAM0E,IAAY,OAAO,aAAA;AACzB,QAAI,CAACA,KAAaA,EAAU,eAAe,EAAG,QAAO;AAErD,UAAMC,IAAQD,EAAU,WAAW,CAAC,GAC9BE,IAAcD,EAAM;AAI1B,QAAIE,IAHiBF,EAAM;AAI3B,QAAIC,KAAeA,MAAgBV,KAAeA,GAAa;AAC3D,YAAMY,IAAa,SAAS;AAAA,QACxBZ;AAAA,QACA,WAAW;AAAA,QACX;AAAA,MAAA;AAEJ,UAAIa;AACJ,cAAQA,IAAOD,EAAW,eAClBC,MAASH;AACb,QAAAC,OAAkBL,IAAAO,EAAK,gBAAL,gBAAAP,EAAkB,WAAU;AAAA,IAEtD;AAEA,WAAOK;AAAA,EACX,GAAG,CAAEX,CAAY,CAAC,GAGZc,IAAgBhF,EAAY,CAACiF,MAAqB;;AACpD,QAAI,GAACf,KAAe,CAACT,KAA0B,CAACM;AAEhD,UAAI;AAEA,cAAMmB,IAAiBxB,IAAee,EAAA,IAAsB,MAGtDU,IAAcpB,EAAY;AAAA,UAC5BkB;AAAA,UACAlB,EAAY,UAAUT,CAAQ,KAAKS,EAAY,UAAU;AAAA,UACzDT;AAAA,QAAA;AAKJ,YAHAY,EAAY,YAAYiB,GAGpBzB,KAAgBwB,MAAmB,MAAM;AACzC,gBAAMR,IAAY,OAAO,aAAA,GACnBU,IAAW,SAAS,YAAA,GACpBN,IAAa,SAAS;AAAA,YACxBZ;AAAA,YACA,WAAW;AAAA,YACX;AAAA,UAAA;AAIJ,cAAImB,IAAgB,GAChBN;AACJ,iBAAQA,IAAOD,EAAW,cAAa;AACnC,kBAAMQ,MAASd,IAAAO,EAAK,gBAAL,gBAAAP,EAAkB,WAAU;AAC3C,gBAAIa,IAAgBC,KAAUJ,GAAgB;AAC1C,cAAAE,EAAS,SAASL,GAAMG,IAAiBG,CAAa,GACtDD,EAAS,OAAOL,GAAMG,IAAiBG,CAAa,GACpDX,KAAA,QAAAA,EAAW,mBACXA,KAAA,QAAAA,EAAW,SAASU;AACpB;AAAA,YACJ;AACA,YAAAC,KAAiBC;AAAA,UACrB;AAAA,QACJ;AAAA,MACJ,SAASf,GAAO;AACZ,gBAAQ,KAAK,4BAA4BA,CAAK,GAC1CL,MACAA,EAAY,cAAce;AAAA,MAElC;AAAA,EACJ,GAAG,CAAE3B,GAAUG,GAAwBC,GAAcK,GAAaU,GAAmBP,CAAY,CAAC,GAG5FqB,IAAcvF,EAAY,CAACG,MAAkB;AAC/C,QAAI,CAAC+D,EAAa;AAElB,UAAMe,IAAUf,EAAY,eAAe;AAC3C,IAAAP,KAAA,QAAAA,EAAWsB,IAGX,sBAAsB,MAAM;AACxB,MAAAD,EAAcC,CAAO;AAAA,IACzB,CAAC;AAAA,EACL,GAAG,CAAED,GAAerB,GAAUO,CAAY,CAAC;AAG3C,EAAAjE,EAAU,MAAM;AACZ,UAAMuF,IAAUtB;AAChB,QAAI,GAACsB,KAAW,CAAC9B;AAEjB,aAAA8B,EAAQ,iBAAiB,SAASD,CAAW,GACtC,MAAM;AACT,QAAAC,EAAQ,oBAAoB,SAASD,CAAW;AAAA,MACpD;AAAA,EACJ,GAAG,CAAE7B,GAAc6B,GAAarB,CAAY,CAAC,GAG7CjE,EAAU,MAAM;AACZ,IAAI,CAACiE,KAAe,CAACH,KACrBiB,EAAcX,CAAW;AAAA,EAC7B,GAAG,CAAEW,GAAeX,GAAaN,GAAaG,CAAY,CAAC;AAE3D,QAAMuB,IAAkB,YAAY;AAChC,QAAI;AACA,YAAMC,IAAaxB,IAAcA,EAAY,eAAe,KAAKG;AACjE,YAAM,UAAU,UAAU,UAAUqB,CAAU,GAC9C7B,EAAgB,EAAI,GACpB,WAAW,MAAMA,EAAgB,EAAK,GAAG,GAAI;AAAA,IACjD,SAAS8B,GAAK;AACV,cAAQ,MAAM,yBAAyBA,CAAG;AAAA,IAC9C;AAAA,EACJ,GAGMC,IAAgB,OAAOlG,MAA4B;AACrD,KAAKA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,QAAQA,EAAE,WAAW0E,EAAO,YAC5D1E,EAAE,eAAA,GACF,MAAM+F,EAAA;AAAA,EAEd;AAEA,MAAI9L,IAAa,CAAA;AAEjB,EAAI6J,KACA7J,EAAW,KAAK,mBAAmB;AAIvC,QAAMkM,IAAQxB,EAAY,MAAM,cAAc;AAE9C,SACI,gBAAAzE;AAAA,IAAC/F;AAAA,IAAA;AAAA,MACG,mBAAe;AAAA,MACf,IAAG;AAAA,MACH,YAAAF;AAAA,MACA,MAAK;AAAA,MACL,cAAYoH,KAAe,iBAAiBuC,CAAQ;AAAA,MACnD,GAAGlJ;AAAA,MAGH,UAAA;AAAA,QAAAmJ,IACGK,IACI,gBAAA1F;AAAA,UAACkB;AAAA,UAAA;AAAA,YACG,WAAU;AAAA,YACV,MAAK;AAAA,YACL,OAAM;AAAA,YACN,aAAU;AAAA,YACb,UAAA;AAAA,UAAA;AAAA,QAAA,IAID,gBAAAlB;AAAA,UAACwD;AAAA,UAAA;AAAA,YACG,MAAK;AAAA,YACL,WAAU;AAAA,YACV,MAAK;AAAA,YACL,OAAM;AAAA,YACN,SAAS+D;AAAA,YACT,WAAWG;AAAA,YACX,cAAW;AAAA,YACd,UAAA;AAAA,UAAA;AAAA,QAAA,IAIL;AAAA,QAGJ,gBAAAhG;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,KAAKwE;AAAA,YACL,WAAW,YAAYd,CAAQ,GAAG1G,IAAS,WAAWA,CAAM,KAAK,EAAE;AAAA,YACnE,UAAU;AAAA,YACV,cAAY,WAAW0G,CAAQ;AAAA,YAG9B,UAAA;AAAA,cAAAE,KACG,MAAM,KAAK,MAAMqC,EAAM,MAAM,EAAE,MAAM,EAAE,IAAI,CAACjD,MACxC,gBAAA1E;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEG,WAAU;AAAA,kBACV,eAAY;AAAA,kBAEX,UAAA0E,IAAQ;AAAA,gBAAA;AAAA,gBAJJA;AAAA,cAAA,CAMZ;AAAA,cAGL,gBAAA1E;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACG,KAAKiG;AAAA,kBACL,iBAAiBT;AAAA,kBACjB,gCAAgC;AAAA,kBAChC,YAAW;AAAA,kBACX,WAAW,YAAYJ,CAAQ,IAAIzB,IAAY,eAAe,EAAE;AAAA,kBAE/D,UAAAwC;AAAA,gBAAA;AAAA,cAAA;AAAA,YACL;AAAA,UAAA;AAAA,QAAA;AAAA,MACJ;AAAA,IAAA;AAAA,EAAA;AAGZ,CAAC;AACDjB,GAAU,cAAc;ACzSjB,MAAM0C,KAAUhM,EAAM;AAAA,EACzB,CACI,EAAC,MAAA6H,GAAM,QAAAoE,GAAQ,OAAAjF,GAAO,GAAG1G,EAAA,GAAuBC,MAAwC;AACxF,QAAIV,IAAa,CAAA;AAEjB,WAAIgI,KACAhI,EAAW,KAAKgI,CAAI,GAIpB,gBAAAzD;AAAA,MAACrE;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,cAAU;AAAA,QACV,KAAAQ;AAAA,QACA,YAAAV;AAAA,QACA,MAAK;AAAA,QACL,oBAAiB;AAAA,QACjB,cAAYmH;AAAA,QACX,GAAG1G;AAAA,QACJ,OAAO,EAAC,QAAA2L,EAAA;AAAA,MAAe;AAAA,IAAA;AAAA,EAGnC;AACJ;AACAD,GAAQ,cAAc;ACHtB,MAAME,KAA2C;AAAA;AAAA,EAE7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AACJ,GAwBaC,KAAuB,CAChC7L,MACkC;AAClC,QAAM8L,IAAqC,CAAA,GACrCC,IAAkC,CAAA;AAExC,aAAWC,KAAO,OAAO,KAAKhM,CAAK;AAC/B,IAAI4L,GAAkB,SAASI,CAAwB,IAClDF,EAAqBE,CAAG,IAAIhM,EAAMgM,CAAG,IAEtCD,EAAWC,CAAG,IAAIhM,EAAMgM,CAAG;AAInC,SAAO;AAAA,IACH,cAAAF;AAAA,IACA,YAAAC;AAAA,EAAA;AAER,GC9HaE,KAAavM,EAAM;AAAA,EAC5B,CACI;AAAA,IACI,OAAAgH;AAAA,IACA,WAAAwF;AAAA,IACA,SAAAC;AAAA,IACA,GAAGnM;AAAA,EAAA,GAEPC,MACC;AACD,QAAIV,IAAa,CAAA;AAEjB,WAAI2M,KACA3M,EAAW,KAAK,iBAAiB,GAIjC,gBAAAuE;AAAA,MAACrE;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,KAAAQ;AAAA,QACA,SAAAkM;AAAA,QACA,YAAA5M;AAAA,QACC,GAAGS;AAAA,QAEH,UAAA0G;AAAA,MAAA;AAAA,IAAA;AAAA,EAGb;AACJ;AACAuF,GAAW,cAAc;AC/BlB,MAAM/D,IAAOxI,EAAM;AAAA,EACtB,CACI,EAAC,QAAA6D,GAAQ,MAAAT,GAAM,WAAAsJ,IAAY,cAAc,OAAAC,GAAO,WAAAC,GAAW,GAAGtM,EAAA,GAC9DC,MACC;AACD,QAAIV,IAAa,CAAA;AAEjB,WAAIgE,KACAhE,EAAW,KAAK,UAAUgE,CAAM,EAAE,GAGlCT,KACAvD,EAAW,KAAK,QAAQuD,CAAI,EAAE,GAG9BsJ,KACA7M,EAAW,KAAK,QAAQ6M,CAAS,EAAE,GAGnCE,KACA/M,EAAW,KAAK,UAAU,GAG1B8M,KACA9M,EAAW,KAAK,QAAQ8M,CAAK,EAAE,qBAG3B5M,GAAA,EAAyB,IAAG,KAAI,KAAAQ,GAAU,YAAAV,GAAyB,GAAGS,GAAO;AAAA,EACzF;AACJ;AACAkI,EAAK,cAAc;ACbnB,MAAMqE,KAAiB,CAAC,EAAC,OAAAC,QACjBA,MAAU,UAEN,gBAAA1I;AAAA,EAAC;AAAA,EAAA;AAAA,IACG,wBAAqB;AAAA,IACrB,OAAM;AAAA,IACN,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,QAAO;AAAA,IAEP,UAAA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,QAAO;AAAA,QACP,MAAK;AAAA,QACL,QAAO;AAAA,QACP,kBAAiB;AAAA,QACjB,aAAY;AAAA,MAAA;AAAA,IAAA;AAAA,EAChB;AAAA,IAMR,gBAAA0B;AAAA,EAAC;AAAA,EAAA;AAAA,IACG,wBAAqB;AAAA,IACrB,OAAM;AAAA,IACN,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,QAAO;AAAA,IAEP,UAAA;AAAA,MAAA,gBAAA1B;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,IAAG;AAAA,UACH,IAAG;AAAA,UACH,IAAG;AAAA,UACH,IAAG;AAAA,UACH,MAAK;AAAA,UACL,QAAO;AAAA,UACP,kBAAiB;AAAA,UACjB,aAAY;AAAA,QAAA;AAAA,MAAA;AAAA,MAEhB,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,IAAG;AAAA,UACH,IAAG;AAAA,UACH,IAAG;AAAA,UACH,IAAG;AAAA,UACH,MAAK;AAAA,UACL,QAAO;AAAA,UACP,kBAAiB;AAAA,UACjB,aAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IAChB;AAAA,EAAA;AAAA,GAMC2I,KAAW/M,EAAM;AAAA,EAC1B,CACI;AAAA,IACI,OAAAgH;AAAA,IACA,aAAAgG;AAAA,IACA,SAAAP;AAAA,IACA,UAAAQ;AAAA,IACA,WAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,UAAAC;AAAA,IACA,MAAAhK;AAAA,IACA,YAAAiK;AAAA,IACA,UAAA9H;AAAA,IACA,GAAGjF;AAAA,EAAA,GAEPC,MACC;AACD,UAAM+M,IAAWtG,KAASgG,GACpBO,IAAiBN,KAAYC;AAEnC,WACI,gBAAApH;AAAA,MAAC/F;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,kBAAc;AAAA,QACd,KAAAQ;AAAA,QACA,MAAK;AAAA,QACL,UAAA6M;AAAA,QACA,WAAW,CAAEhK,IAAO,QAAQA,CAAI,KAAK,IAAIiK,IAAa,gBAAgB,EAAG,EAAE,OAAO,OAAO,EACpF,KAAK,GAAG,KAAK;AAAA,QACjB,GAAG/M;AAAA,QAGH,UAAA;AAAA,UAAAgN,uBACIzI,GAAA,EAAI,sBAAkB,IAAC,uBAAqBsI,IAAkB,SAAS,QACnE,UAAA;AAAA,YAAAH,KAAgBhG,KAAS,gBAAA5C,EAACmI,IAAA,EAAW,OAAAvF,GAAc,SAAAyF,GAAkB;AAAA,YACrEU,KAAmB,gBAAA/I,EAACyI,IAAA,EAAe,OAAOM,EAAA,CAAiB;AAAA,UAAA,GAChE;AAAA,UAIJ,gBAAA/I,EAACS,GAAA,EAAI,sBAAkB,IAClB,UAAAU,EAAA,CACL;AAAA,UAGCgI,KACG,gBAAAzH,EAACjB,GAAA,EAAI,WAAU,wCACV,UAAA;AAAA,YAAAoI,KACG,gBAAA7I,EAACoE,GAAA,EAAK,WAAU,aACX,UAAAyE,GACL;AAAA,YAEHC,KACG,gBAAA9I,EAACoE,GAAA,EAAK,WAAU,cACX,UAAA0E,EAAA,CACL;AAAA,UAAA,EAAA,CAER;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIhB;AACJ;AACAH,GAAS,cAAc;ACtHhB,MAAMS,KAAWxN,EAAM;AAAA,EAC1B,CACI;AAAA,IACI,IAAAuG;AAAA,IACA,MAAAkH;AAAA,IACA,OAAAzG;AAAA,IACA,WAAAwF;AAAA,IACA,UAAAS;AAAA,IACA,WAAAC;AAAA,IACA,UAAArD;AAAA,IACA,SAAA6D;AAAA,IACA,gBAAAC;AAAA,IACA,UAAAC;AAAA,IACA,UAAAR;AAAA,IACA,MAAAhK,IAAO;AAAA,IACP,YAAAiK;AAAA,IACA,GAAG/M;AAAA,EAAA,GAEPC,MACC;AACD,UAAMsN,IAAcC,GAAQ,MAAML,KAAQlH,GAAI,CAAEkH,GAAMlH,CAAG,CAAC,GAEpDwH,IAAe,CAACnI,MAA4C;AAC9D,MAAAiE,KAAA,QAAAA,EAAWjE,EAAE,OAAO;AAAA,IACxB,GAGM,EAAE,cAAAwG,GAAc,YAAAC,MAAeF,GAAqB7L,CAAK;AAE/D,WACI,gBAAAwF;AAAA,MAACiH;AAAA,MAAA;AAAA,QACG,OAAA/F;AAAA,QACA,SAAST;AAAA,QACT,UAAA0G;AAAA,QACA,WAAAC;AAAA,QACA,UAAAE;AAAA,QACA,MAAAhK;AAAA,QACA,YAAAiK;AAAA,QACC,GAAGjB;AAAA,QAEJ,UAAA;AAAA,UAAA,gBAAAhI;AAAA,YAACrE;AAAA,YAAA;AAAA,cACG,IAAG;AAAA,cACH,MAAK;AAAA,cACL,KAAAQ;AAAA,cACA,IAAAgG;AAAA,cACA,MAAMsH;AAAA,cACN,SAAAH;AAAA,cACA,gBAAAC;AAAA,cACA,UAAAC;AAAA,cACA,UAAAR;AAAA,cACA,UAAUW;AAAA,cACT,GAAG1B;AAAA,YAAA;AAAA,UAAA;AAAA,UAER,gBAAAjI;AAAA,YAACrE;AAAA,YAAA;AAAA,cACG,IAAIsN,IAAa,UAAU;AAAA,cAC3B,SAASA,IAAa9G,IAAK;AAAA,cAC3B,iBAAa;AAAA,cACb,WAAW,QAAQnD,CAAI;AAAA,YAAA;AAAA,UAAA;AAAA,QAC3B;AAAA,MAAA;AAAA,IAAA;AAAA,EAGZ;AACJ;AACAoK,GAAS,cAAc;ACjEhB,MAAMQ,KAAShO,EAAM;AAAA,EACxB,CACI;AAAA,IACI,IAAAuG;AAAA,IACA,MAAAkH;AAAA,IACA,OAAAzG;AAAA,IACA,WAAAwF;AAAA,IACA,UAAAS;AAAA,IACA,WAAAC;AAAA,IACA,UAAArD;AAAA,IACA,SAAA6D;AAAA,IACA,gBAAAC;AAAA,IACA,UAAAC;AAAA,IACA,UAAAR;AAAA,IACA,MAAAhK,IAAO;AAAA,IACP,YAAAiK;AAAA,IACA,GAAG/M;AAAA,EAAA,GAEPC,MACC;AACD,UAAMsN,IAAcC,GAAQ,MAAML,KAAQlH,GAAI,CAAEkH,GAAMlH,CAAG,CAAC,GAEpDwH,IAAe,CAACnI,MAA4C;AAC9D,MAAAiE,KAAA,QAAAA,EAAWjE,EAAE,OAAO;AAAA,IACxB,GAGM,EAAC,cAAAwG,GAAc,YAAAC,MAAcF,GAAqB7L,CAAK;AAE7D,WACI,gBAAAwF;AAAA,MAACiH;AAAA,MAAA;AAAA,QACG,OAAA/F;AAAA,QACA,SAAST;AAAA,QACT,UAAA0G;AAAA,QACA,WAAAC;AAAA,QACA,UAAAE;AAAA,QACA,MAAAhK;AAAA,QACA,YAAAiK;AAAA,QACC,GAAGjB;AAAA,QAEJ,UAAA;AAAA,UAAA,gBAAAhI;AAAA,YAACrE;AAAA,YAAA;AAAA,cACG,IAAG;AAAA,cACH,MAAK;AAAA,cACL,KAAAQ;AAAA,cACA,IAAAgG;AAAA,cACA,MAAMsH;AAAA,cACN,SAAAH;AAAA,cACA,gBAAAC;AAAA,cACA,UAAAC;AAAA,cACA,UAAAR;AAAA,cACA,UAAUW;AAAA,cACT,GAAG1B;AAAA,YAAA;AAAA,UAAA;AAAA,UAER,gBAAAjI;AAAA,YAACrE;AAAA,YAAA;AAAA,cACG,IAAIsN,IAAa,UAAU;AAAA,cAC3B,SAASA,IAAa9G,IAAK;AAAA,cAC3B,eAAW;AAAA,cACX,WAAW,QAAQnD,CAAI;AAAA,YAAA;AAAA,UAAA;AAAA,QAC3B;AAAA,MAAA;AAAA,IAAA;AAAA,EAGZ;AACJ;AACA4K,GAAO,cAAc;AC/Cd,MAAMC,KAAgBjO,EAAM;AAAA,EAC/B,CACI;AAAA,IACI,IAAAuG;AAAA,IACA,MAAAkH;AAAA,IACA,OAAAzG;AAAA,IACA,UAAAiG;AAAA,IACA,WAAAC;AAAA,IACA,SAAAgB;AAAA,IACA,OAAAC;AAAA,IACA,cAAAC;AAAA,IACA,UAAAvE;AAAA,IACA,OAAA8C;AAAA,IACA,eAAAxE;AAAA,IACA,eAAAkG;AAAA,IACA,UAAAjB;AAAA,IACA,UAAAQ;AAAA,IACA,MAAAxK;AAAA,IACA,SAAArC;AAAA,IACA,YAAAsM;AAAA,IACA,GAAG/M;AAAA,EAAA,GAEPC,MACC;AACD,UAAMsN,IAAcC,GAAQ,MAAML,KAAQlH,GAAI,CAAEkH,GAAMlH,CAAG,CAAC,GAEpD,CAAE+H,GAAgBC,CAAkB,IAAIvO,EAAM;AAAA,MAChDmO,KAASC,KAAgB,CAAA;AAAA,IAAC;AAG9B,IAAApO,EAAM,UAAU,MAAM;AAClB,MAAImO,MAAU,UACVI,EAAkBJ,CAAK;AAAA,IAE/B,GAAG,CAAEA,CAAM,CAAC;AAEZ,UAAMJ,IAAe,CAACS,GAAsBd,MAAsB;AAC9D,UAAIe;AAEJ,MAAIf,IACAe,IAAY,CAAE,GAAGH,GAAgBE,CAAY,IAE7CC,IAAYH,EAAe,OAAO,CAAAI,MAAKA,MAAMF,CAAW,GAIxDL,MAAU,UACVI,EAAkBE,CAAS,GAG/B5E,KAAA,QAAAA,EAAW4E;AAAA,IACf;AAEA,QAAI5O,IAAwB,CAAA;AAE5B,WAAI8M,KACA9M,EAAW,KAAK,SAAS8M,CAAK,EAAE,IAGhCxE,KAAiBkG,MACjBxO,EAAW,KAAK,gBAAgB,GAGhCkB,KACAlB,EAAW,KAAK,cAAc,GAG9BwN,KACAxN,EAAW,KAAK,aAAa,GAI7B,gBAAAuE;AAAA,MAAC2I;AAAA,MAAA;AAAA,QACG,OAAA/F;AAAA,QACA,SAAST;AAAA,QACT,UAAA0G;AAAA,QACA,WAAAC;AAAA,QACA,UAAAE;AAAA,QAEA,UAAA,gBAAAhJ;AAAA,UAACrE;AAAA,UAAA;AAAA,YACG,IAAG;AAAA,YACH,uBAAmB;AAAA,YACnB,KAAAQ;AAAA,YACA,YAAAV;AAAA,YACA,MAAK;AAAA,YACL,cAAYmH;AAAA,YACZ,OAAOjG,IAAU,EAAC,qBAAsB,UAAUA,CAAO,aAAY;AAAA,YACpE,GAAGT;AAAA,YAEH,UAAA4N,EAAQ,IAAI,CAACS,GAAQ7F,MAAU;AAC5B,oBAAM,EAAC,IAAK8F,GAAU,OAAQJ,GAAa,OAAQK,GAAa,GAAGC,EAAA,IAAeH,GAC5EI,IAAUH,KAAY,GAAGrI,CAAE,WAAWuC,CAAK,IAC3CkG,IAAYV,EAAe,SAASE,CAAW;AAErD,qBACI,gBAAApK;AAAA,gBAACoJ;AAAA,gBAAA;AAAA,kBAEG,IAAIuB;AAAA,kBACJ,MAAMlB;AAAA,kBACN,OAAOgB;AAAA,kBACP,SAASG;AAAA,kBACT,UAAUpB,KAAYe,EAAO;AAAA,kBAC7B,MAAAvL;AAAA,kBACA,YAAAiK;AAAA,kBACA,UAAU,CAACK,MAAsBK,EAAaS,GAAad,CAAO;AAAA,kBACjE,GAAGoB;AAAA,gBAAA;AAAA,gBATCC;AAAA,cAAA;AAAA,YAYjB,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MACL;AAAA,IAAA;AAAA,EAGZ;AACJ;AACAd,GAAc,cAAc;AAGrB,MAAMgB,KAAcjP,EAAM;AAAA,EAC7B,CACI;AAAA,IACI,IAAAuG;AAAA,IACA,MAAAkH;AAAA,IACA,OAAAzG;AAAA,IACA,UAAAiG;AAAA,IACA,WAAAC;AAAA,IACA,SAAAgB;AAAA,IACA,OAAAC;AAAA,IACA,cAAAC;AAAA,IACA,UAAAvE;AAAA,IACA,OAAA8C;AAAA,IACA,eAAAxE;AAAA,IACA,eAAAkG;AAAA,IACA,UAAAjB;AAAA,IACA,UAAAQ;AAAA,IACA,MAAAxK;AAAA,IACA,SAAArC;AAAA,IACA,YAAAsM;AAAA,IACA,GAAG/M;AAAA,EAAA,GAEPC,MACC;AACD,UAAMsN,IAAcC,GAAQ,MAAML,KAAQlH,GAAI,CAAEkH,GAAMlH,CAAG,CAAC,GAEpD,CAAE+H,GAAgBC,CAAkB,IAAIvO,EAAM;AAAA,MAChDmO,KAASC,KAAgB,CAAA;AAAA,IAAC;AAG9B,IAAApO,EAAM,UAAU,MAAM;AAClB,MAAImO,MAAU,UACVI,EAAkBJ,CAAK;AAAA,IAE/B,GAAG,CAAEA,CAAM,CAAC;AAEZ,UAAMJ,IAAe,CAACS,GAAsBd,MAAsB;AAC9D,UAAIe;AAEJ,MAAIf,IACAe,IAAY,CAAE,GAAGH,GAAgBE,CAAY,IAE7CC,IAAYH,EAAe,OAAO,CAAAI,MAAKA,MAAMF,CAAW,GAIxDL,MAAU,UACVI,EAAkBE,CAAS,GAG/B5E,KAAA,QAAAA,EAAW4E;AAAA,IACf;AAEA,QAAI5O,IAAwB,CAAA;AAE5B,WAAI8M,KACA9M,EAAW,KAAK,SAAS8M,CAAK,EAAE,IAGhCxE,KAAiBkG,MACjBxO,EAAW,KAAK,gBAAgB,GAGhCkB,KACAlB,EAAW,KAAK,cAAc,GAG9BwN,KACAxN,EAAW,KAAK,aAAa,GAI7B,gBAAAuE;AAAA,MAAC2I;AAAA,MAAA;AAAA,QACG,OAAA/F;AAAA,QACA,SAAST;AAAA,QACT,UAAA0G;AAAA,QACA,WAAAC;AAAA,QACA,UAAAE;AAAA,QAEA,UAAA,gBAAAhJ;AAAA,UAACrE;AAAA,UAAA;AAAA,YACG,IAAG;AAAA,YACH,qBAAiB;AAAA,YACjB,KAAAQ;AAAA,YACA,YAAAV;AAAA,YACA,MAAK;AAAA,YACL,cAAYmH;AAAA,YACZ,OAAOjG,IAAU,EAAC,qBAAsB,UAAUA,CAAO,aAAY;AAAA,YACpE,GAAGT;AAAA,YAEH,UAAA4N,EAAQ,IAAI,CAACS,GAAQ7F,MAAU;AAC5B,oBAAM,EAAC,IAAK8F,GAAU,OAAQJ,GAAa,OAAQK,GAAa,GAAGC,EAAA,IAAeH,GAC5EI,IAAUH,KAAY,GAAGrI,CAAE,WAAWuC,CAAK,IAC3CkG,IAAYV,EAAe,SAASE,CAAW;AAErD,qBACI,gBAAApK;AAAA,gBAAC4J;AAAA,gBAAA;AAAA,kBAEG,IAAIe;AAAA,kBACJ,MAAMlB;AAAA,kBACN,OAAOgB;AAAA,kBACP,SAASG;AAAA,kBACT,UAAUpB,KAAYe,EAAO;AAAA,kBAC7B,MAAAvL;AAAA,kBACA,YAAAiK;AAAA,kBACA,UAAU,CAACK,MAAsBK,EAAaS,GAAad,CAAO;AAAA,kBACjE,GAAGoB;AAAA,gBAAA;AAAA,gBATCC;AAAA,cAAA;AAAA,YAYjB,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MACL;AAAA,IAAA;AAAA,EAGZ;AACJ;AACAE,GAAY,cAAc;AC1OnB,MAAMC,KAAalP,EAAM;AAAA,EAC5B,CACI;AAAA,IACI,cAAiBG;AAAA,IACjB,gBAAiBgP;AAAA,IACjB,OAAAnI;AAAA,IACA,UAAAiG;AAAA,IACA,WAAAC;AAAA,IACA,UAAAE;AAAA,IACA,QAAAgC;AAAA,IACA,oBAAAC,IAAqB;AAAA,IACrB,SAAAC;AAAA,IACA,QAAArD,IAAS;AAAA,IACT,UAAApC;AAAA,IACA,WAAA/I,IAAY;AAAA,IACZ,qBAAAyO,IAAsB;AAAA,IACtB,oBAAAC,IAAqB;AAAA,IACrB,SAAAC;AAAA,IACA,IAAAlJ;AAAA,IACA,MAAAkH;AAAA,IACA,eAAAiC;AAAA,IACA,iBAAAC;AAAA,IACA,MAAAvM;AAAA,IACA,GAAG9C;AAAA,EAAA,GAEPC,MACC;AACD,UAAM,CAAEqP,GAAOC,CAAS,IAAI7F,EAAiB,CAAA,CAAE,GACzC,CAAE8F,GAAYC,CAAc,IAAI/F,EAAS,EAAK,GAC9CgG,IAAe3I,EAAyB,IAAI,GAE5C4I,IAAiB,CAACrK,MAAwB;AAC5C,MAAAA,EAAE,eAAA,GACFA,EAAE,gBAAA,GACFmK,EAAc,EAAI;AAAA,IACtB,GAEMG,IAAkB,CAACtK,MAAwB;AAC7C,MAAAA,EAAE,eAAA,GACFA,EAAE,gBAAA,GACFmK,EAAc,EAAK;AAAA,IACvB,GAEMI,IAAa,CAACvK,MAAwB;AACxC,MAAAA,EAAE,eAAA,GACFA,EAAE,gBAAA,GACFmK,EAAc,EAAK;AAEnB,YAAMK,IAAe,MAAM,KAAKxK,EAAE,aAAa,KAAK;AACpD,MAAAyK,EAAYD,CAAY;AAAA,IAC5B,GAEMC,IAAc,CAACC,MAAsB;AACvC,UAAKjB;AAKD,QAAAQ,EAAS,OAAa,CAAE,GAAGU,GAAW,GAAGD,CAAS,CAAC,GACnDzG,KAAA,QAAAA,EAAW,CAAE,GAAG+F,GAAO,GAAGU,CAAS;AAAA,WANd;AACrB,cAAME,IAAYF,EAAS,CAAC;AAC5B,QAAAT,EAAS,CAAEW,CAAU,CAAC,GACtB3G,KAAA,QAAAA,EAAW,CAAE2G,CAAU;AAAA,MAC3B;AAAA,IAIJ,GAEMC,IAAkB,CAAC7K,MAA4C;AACjE,UAAIA,EAAE,OAAO,OAAO;AAChB,cAAM8K,IAAgB,MAAM,KAAK9K,EAAE,OAAO,KAAK;AAC/C,QAAAyK,EAAYK,CAAa;AAAA,MAC7B;AAAA,IACJ,GAEMC,IAAa,CAACC,MAA2B;AAC3C,YAAMC,IAAejB,EAAM,OAAO,CAAC5L,GAAG8E,MAAUA,MAAU8H,CAAa;AACvE,MAAAf,EAASgB,CAAY,GACrBhH,KAAA,QAAAA,EAAWgH;AAAA,IACf,GAEMC,IAAiB,MAAM;;AACzB,OAAApG,IAAAsF,EAAa,YAAb,QAAAtF,EAAsB;AAAA,IAC1B,GAGM,EAAE,cAAA0B,EAAA,IAAiBD,GAAqB7L,CAAK;AAEnD,WACI,gBAAA8D;AAAA,MAAC2I;AAAA,MAAA;AAAA,QACG,OAAA/F;AAAA,QACA,SAAST;AAAA,QACT,UAAA0G;AAAA,QACA,WAAAC;AAAA,QACA,UAAAE;AAAA,QACA,MAAAhK;AAAA,QACC,GAAGgJ;AAAA,QAEJ,UAAA,gBAAAtG;AAAA,UAACjB;AAAA,UAAA;AAAA,YACG,yBAAqB;AAAA,YACrB,KAAAtE;AAAA,YACA,WAAW;AAAA,cACP;AAAA,cACAuP,IAAa,aAAa;AAAA,cAC1BhP;AAAA,YAAA,EACF,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,YAC1B,cAAYX,KAAa6G;AAAA,YACzB,gBAAcmI,KAAeM,KAAW;AAAA,YACxC,iBAAerC;AAAA,YAEf,UAAA;AAAA,cAAA,gBAAAtH;AAAA,gBAACjB;AAAA,gBAAA;AAAA,kBACG,WAAU;AAAA,kBACV,YAAYoL;AAAA,kBACZ,aAAaC;AAAA,kBACb,QAAQC;AAAA,kBACR,SAASW;AAAA,kBACT,OAAO,EAAC,QAAA7E,EAAA;AAAA,kBAER,UAAA;AAAA,oBAAA,gBAAA7H;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACG,KAAK4L;AAAA,wBACL,MAAK;AAAA,wBACL,IAAAzJ;AAAA,wBACA,MAAAkH;AAAA,wBACA,UAAUgD;AAAA,wBACV,UAAUpB;AAAA,wBACV,QAAAD;AAAA,wBACA,SAAAE;AAAA,wBACA,WAAU;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAGbC,KACG,gBAAAzJ,EAACjB,GAAA,EAAI,WAAU,uBACX,UAAA;AAAA,sBAAA,gBAAAT,EAACoE,KAAM,UAAA+G,EAAA,CAAoB;AAAA,sBAC1BC,KACG,gBAAApL,EAACoE,GAAA,EAAK,WAAS,IAAE,UAAAgH,EAAA,CAAmB;AAAA,oBAAA,EAAA,CAE5C;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAIPI,EAAM,SAAS,KACZ,gBAAAxL,EAACS,GAAA,EAAI,WAAU,kBACV,UAAA+K,EAAM,IAAI,CAACmB,GAAMjI,MACd,gBAAA1E;AAAA,gBAACkB;AAAA,gBAAA;AAAA,kBAEG,MAAK;AAAA,kBACL,OAAM;AAAA,kBACN,YAAW;AAAA,kBACX,eAAe,MAAMqL,EAAW7H,CAAK;AAAA,kBACrC,iBAAiB,UAAUiI,EAAK,IAAI;AAAA,kBACpC,UAAUrB;AAAA,kBACV,YAAYC;AAAA,kBAEX,UAAAoB,EAAK;AAAA,gBAAA;AAAA,gBATD,GAAGA,EAAK,IAAI,IAAIjI,CAAK;AAAA,cAAA,CAWjC,EAAA,CACL;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAER;AAAA,IAAA;AAAA,EAGZ;AACJ;AACAoG,GAAW,cAAc;ACvJlB,MAAM8B,KAAahR,EAAM;AAAA,EAC5B,CACI;AAAA;AAAA,IAEI,OAAAgH;AAAA,IACA,WAAAwF;AAAA,IACA,UAAAS;AAAA,IACA,WAAAC;AAAA,IACA,MAAA9J;AAAA,IACA,UAAAgK;AAAA;AAAA,IAEA,eAAA6D;AAAA,IACA,gBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,gBAAAC;AAAA;AAAA,IAEA,cAAAC;AAAA,IACA,OAAAC;AAAA,IACA,SAAA7B;AAAA,IACA,iBAAiB8B;AAAA;AAAA,IAEjB,UAAA1H;AAAA,IACA,QAAA2H;AAAA,IACA,SAAAC;AAAA;AAAA,IAEA,cAActR;AAAA,IACd,gBAAgBgP;AAAA;AAAA,IAEhB,IAAA5I;AAAA,IACA,MAAAkH;AAAA,IACA,OAAAU;AAAA,IACA,cAAAC;AAAA,IACA,MAAAsD,IAAO;AAAA,IACP,aAAAC;AAAA,IACA,cAAAC;AAAA,IACA,WAAAC;AAAA,IACA,WAAAC;AAAA,IACA,SAAAC;AAAA,IACA,UAAAC;AAAA,IACA,UAAApE;AAAA,IACA,WAAA9M;AAAA,IACA,GAAGR;AAAA,EAAA,GAEPC,MACC;AACD,UAAM0R,IAAiB5K,EAAuB,IAAI,GAC5C6K,IAAkB7K,EAAuB,IAAI,GAC7C8K,IAAmB9K,EAAyB,IAAI,GAEhD,CAAC+K,GAASC,CAAU,IAAIrI,EAAS,EAAK,GACtC,CAACsI,GAAyBC,EAA0B,IAAIvI,EAAqC,IAAI,GAGjGmD,KAAkBoE,MAA4BF,IAAeiB,IAA0B,OAGvFE,KAAYxS,EAAM;AAAA,MACpB,CAACyS,MAAgC;AAC5B,QAAAN,EAAqE,UAAUM,GAC5E,OAAOlS,KAAQ,aACfA,EAAIkS,CAAE,IACClS,MACNA,EAAwD,UAAUkS;AAAA,MAE3E;AAAA,MACA,CAAClS,CAAG;AAAA,IAAA,GAGFmS,KAAwB,MAAM;AAChC,YAAMC,IAAQR,EAAiB;AAC/B,UAAI,CAACQ,KAASA,EAAM,UAAU,IAAI;AAC9B,QAAAJ,GAA2B,IAAI;AAC/B;AAAA,MACJ;AACA,MAAAA,GAA2BI,EAAM,SAAS,QAAQ,UAAU,SAAS;AAAA,IACzE,GAEM5E,KAAe,CAACnI,MAA2C;AAC7D,MAAAiE,KAAA,QAAAA,EAAWjE,EAAE,OAAO,QAChBwM,KAAWf,KACXqB,GAAA;AAAA,IAER,GAEME,KAAa,CAAChN,MAA0C;AAC1D,MAAAyM,EAAW,EAAI,GACXhB,KACAqB,GAAA,GAEJlB,KAAA,QAAAA,EAAS5L;AAAA,IACb,GAEMiN,IAAc,CAACjN,MAA0C;AAC3D,MAAA6L,KAAA,QAAAA,EAAU7L;AAAA,IACd;AAGA,IAAAO,EAAU,MAAM;AACZ,YAAM2M,IAAc,CAACL,IAA2BM,OAA0B;AACtE,YAAI,CAACN,GAAI;AACT,cAAMO,KAAWP,GAAG,QAAQ,kBAAkB;AAC9C,QAAAO,MAAA,QAAAA,GAAU,MAAM;AAAA,UACZ,kBAAkBD,EAAG;AAAA,UACrB,GAAGN,GAAG,sBAAA,EAAwB,KAAK;AAAA;AAAA,MAE3C;AAEA,OAAItB,KAAiBF,MACjB6B,EAAYb,EAAe,SAAS,MAAM,IAE1Cb,KAAkBF,MAClB4B,EAAYZ,EAAgB,SAAS,OAAO;AAAA,IAEpD,GAAG,CAACf,GAAeC,GAAgBH,GAAeC,CAAc,CAAC;AAEjE,UAAM+B,IAAoB,CACtB9H,GACAzE,IACAwM,OACC;AACD,UAAI,CAAC/H,EAAS,QAAO;AAErB,YAAMgI,KAAS,OAAOhI,KAAY,UAC5BiI,KAAepT,EAAM,eAAemL,CAAO,IAAKA,EAAQ,QAAoC,CAAA,GAC5FkI,KACF,CAACF,MACDnT,EAAM,eAAemL,CAAO,MAC3BiI,GAAa,WACVA,GAAa,aACbjI,EAAQ,SAAS,YACjBA,EAAQ,SAAS;AAEzB,aACI,gBAAA/G;AAAA,QAACS;AAAA,QAAA;AAAA,UACG,KAAKqO;AAAA,UACL,2BAAuB;AAAA,UACvB,WAAW,GAAGxM,EAAQ,IAAIyM,KAAS,YAAY,SAAS,IAAIE,KAAgB,mBAAmB,EAAE;AAAA,UACjG,eAAY;AAAA,UAEX,UAAAlI;AAAA,QAAA;AAAA,MAAA;AAAA,IAGb,GAEMmI,IAAiB,GAAQrC,KAAiBE,IAC1CoC,KAAkB,GAAQrC,KAAkBE,IAG5C,EAAE,cAAAhF,IAAc,YAAAC,OAAeF,GAAqB7L,CAAK;AAE/D,WACI,gBAAAwF;AAAA,MAACiH;AAAA,MAAA;AAAA,QACG,OAAA/F;AAAA,QACA,SAAST;AAAA,QACT,UAAA0G;AAAA,QACA,WAAAC;AAAA,QACA,iBAAAC;AAAA,QACA,UAAAC;AAAA,QACA,MAAAhK;AAAA,QACC,GAAGgJ;AAAA,QAEJ,UAAA;AAAA,UAAA,gBAAAhI;AAAA,YAACrE;AAAA,YAAA;AAAA,cACG,IAAG;AAAA,cACH,KAAKyS;AAAA,cACL,oBAAgB;AAAA,cAChB,IAAAjM;AAAA,cACA,MAAAkH;AAAA,cACA,MAAAiE;AAAA,cACA,OAAAvD;AAAA,cACA,cAAAC;AAAA,cACA,aAAauD,KAAe;AAAA,cAC5B,cAAAC;AAAA,cACA,WAAAC;AAAA,cACA,WAAAC;AAAA,cACA,SAAAC;AAAA,cACA,UAAAC;AAAA,cACA,UAAApE;AAAA,cACA,UAAAR;AAAA,cACA,WAAW;AAAA,gBACPtM;AAAA,gBACAwS,KAAkB;AAAA,gBAClBC,MAAmB;AAAA,cAAA,EAElB,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,cACb,cAAYpT,KAAa6G;AAAA,cACzB,gBAAcmI,KAAeM;AAAA,cAC7B,iBAAerC;AAAA,cACf,UAAUW;AAAA,cACV,QAAQ6E;AAAA,cACR,SAASC;AAAA,cACR,GAAGxG;AAAA,YAAA;AAAA,UAAA;AAAA,WAENiH,KAAkBC,OAChB,gBAAAzN,EAACjB,KAAI,qBAAiB,IAAC,eAAY,QAC9B,UAAA;AAAA,YAAAoO,EAAkBhC,KAAiBE,GAAe,QAAQc,CAAc;AAAA,YACxEgB,EAAkB/B,KAAkBE,GAAgB,SAASc,CAAe;AAAA,UAAA,EAAA,CACjF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIhB;AACJ;AACAlB,GAAW,cAAc;ACrOlB,MAAMwC,KAAUxT,EAAM;AAAA,EACzB,CACI;AAAA,IACI,aAAAyT;AAAA,IACA,YAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,MAAA3T;AAAA,IACA,GAAGI;AAAA,EAAA,GAEPC,MACC;AAED,QAAIV,IAAa,CAAA;AAEjB,WAAI4T,KAAeE,KAAuBC,KAAsBF,KACxDD,KACA5T,EAAW,KAAK,GAAG4T,CAAW,EAAE,GAGhCE,KACA9T,EAAW,KAAK,GAAG8T,CAAmB,sBAAsB,GAG5DC,KACA/T,EAAW,KAAK,GAAG+T,CAAkB,qBAAqB,GAG1DF,KACA7T,EAAW,KAAK,GAAG6T,CAAU,YAAY,KAG7C7T,EAAW,KAAK,OAAO,GAGvBgU,KACAhU,EAAW,KAAK,YAAY,GAK5B,gBAAAuE;AAAA,MAACrE;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,gBAAY;AAAA,QACZ,KAAAQ;AAAA,QACA,YAAAV;AAAA,QACA,MAAAK;AAAA,QACC,GAAGI;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhB;AACJ;AACAkT,GAAQ,cAAc;ACjEf,MAAMM,KAAc9T,EAAM;AAAA,EAC7B,CACI;AAAA,IACI,IAAAuG;AAAA,IACA,MAAAkH;AAAA,IACA,OAAAU;AAAA,IACA,OAAAnH;AAAA,IACA,UAAAiG;AAAA,IACA,WAAAC;AAAA,IACA,UAAArD;AAAA,IACA,SAAA6D;AAAA,IACA,UAAAE;AAAA,IACA,UAAAR;AAAA,IACA,YAAAC;AAAA,IACA,GAAG/M;AAAA,EAAA,GAEPC,MACC;AACD,UAAMsN,IAAcC,GAAQ,MAAML,KAAQlH,GAAI,CAACkH,GAAMlH,CAAE,CAAC,GAElDwH,IAAe,CAACnI,MAA2C;AAC7D,MAAIA,EAAE,OAAO,WAAWiE,KACpBA,EAASsE,CAAK;AAAA,IAEtB,GAGM,EAAE,cAAA/B,GAAc,YAAAC,MAAeF,GAAqB7L,CAAK;AAE/D,WACI,gBAAA8D;AAAA,MAACrE;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,qBAAiB;AAAA,QACjB,KAAAQ;AAAA,QACA,MAAK;AAAA,QACL,gBAAcmN;AAAA,QACd,iBAAeE;AAAA,QACf,WAAWP,IAAa,gBAAgB;AAAA,QACvC,GAAGjB;AAAA,QAEJ,UAAA,gBAAAtG;AAAA,UAACiH;AAAA,UAAA;AAAA,YACG,OAAA/F;AAAA,YACA,SAAST;AAAA,YACT,UAAA0G;AAAA,YACA,WAAAC;AAAA,YACA,UAAAE;AAAA,YACA,YAAAC;AAAA,YAEA,UAAA;AAAA,cAAA,gBAAAjJ;AAAA,gBAACrE;AAAA,gBAAA;AAAA,kBACG,IAAG;AAAA,kBACH,MAAK;AAAA,kBACL,IAAAwG;AAAA,kBACA,MAAMsH;AAAA,kBACN,OAAAM;AAAA,kBACA,SAAAT;AAAA,kBACA,UAAAE;AAAA,kBACA,UAAAR;AAAA,kBACA,UAAUW;AAAA,kBACT,GAAG1B;AAAA,gBAAA;AAAA,cAAA;AAAA,cAER,gBAAAjI;AAAA,gBAACrE;AAAA,gBAAA;AAAA,kBACG,IAAIsN,IAAa,UAAU;AAAA,kBAC3B,SAASA,IAAa9G,IAAK;AAAA,kBAC3B,cAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,YACd;AAAA,UAAA;AAAA,QAAA;AAAA,MACJ;AAAA,IAAA;AAAA,EAGZ;AACJ;AACAuN,GAAY,cAAc;ACtEnB,MAAMC,KAAa/T,EAAM;AAAA,EAC5B,CACI;AAAA,IACI,IAAAuG;AAAA,IACA,MAAAkH;AAAA,IACA,OAAAzG;AAAA,IACA,UAAAiG;AAAA,IACA,WAAAC;AAAA,IACA,SAAAgB;AAAA,IACA,OAAAC;AAAA,IACA,cAAAC;AAAA,IACA,UAAAvE;AAAA,IACA,OAAA8C;AAAA,IACA,eAAAxE;AAAA,IACA,eAAAkG;AAAA,IACA,UAAAjB;AAAA,IACA,UAAAQ;AAAA,IACA,MAAAxK;AAAA,IACA,SAAArC;AAAA,IACA,YAAAsM;AAAA,IACA,GAAG/M;AAAA,EAAA,GAEPC,MACC;AACD,UAAMsN,IAAcC,GAAQ,MAAML,KAAQlH,GAAI,CAACkH,GAAMlH,CAAE,CAAC,GAElDwH,IAAe,CAACnI,MAA2C;AAC7D,MAAAiE,KAAA,QAAAA,EAAWjE,EAAE,OAAO;AAAA,IACxB;AAEA,QAAI/F,IAAuB,CAAA;AAE3B,WAAI8M,KACA9M,EAAW,KAAK,SAAS8M,CAAK,EAAE,IAGhCxE,KAAiBkG,MACjBxO,EAAW,KAAK,gBAAgB,GAGhCkB,KACAlB,EAAW,KAAK,cAAc,GAG9BwN,KACAxN,EAAW,KAAK,aAAa,GAI7B,gBAAAuE;AAAA,MAAC2I;AAAA,MAAA;AAAA,QACG,OAAA/F;AAAA,QACA,SAAST;AAAA,QACT,UAAA0G;AAAA,QACA,WAAAC;AAAA,QACA,UAAAE;AAAA,QACA,MAAAhK;AAAA,QAEA,UAAA,gBAAAgB;AAAA,UAACrE;AAAA,UAAA;AAAA,YACG,IAAG;AAAA,YACH,oBAAgB;AAAA,YAChB,KAAAQ;AAAA,YACA,YAAAV;AAAA,YACA,MAAK;AAAA,YACL,cAAYmH;AAAA,YACZ,OAAOjG,IAAU,EAAE,qBAAqB,UAAUA,CAAO,aAAa;AAAA,YACrE,GAAGT;AAAA,YAEH,UAAA4N,EAAQ,IAAI,CAACS,GAAQ7F,MAAU;AAC5B,oBAAM,EAAE,IAAI8F,GAAU,OAAOJ,GAAa,OAAOK,GAAa,GAAGC,EAAA,IAAgBH,GAC3EI,IAAUH,KAAY,GAAGrI,CAAE,WAAWuC,CAAK,IAC3CkG,IAAYb,IAAQA,MAAUK,IAAcJ,MAAiBI;AAEnE,qBACI,gBAAA1I;AAAA,gBAACjB;AAAA,gBAAA;AAAA,kBAEG,qBAAiB;AAAA,kBACjB,MAAK;AAAA,kBACL,gBAAcmK;AAAA,kBACd,WAAW3B,IAAa,gBAAgB;AAAA,kBAExC,UAAA;AAAA,oBAAA,gBAAAjJ;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACG,MAAK;AAAA,wBACL,IAAI2K;AAAA,wBACJ,MAAMlB;AAAA,wBACN,OAAOW;AAAA,wBACP,SAASQ;AAAA,wBACT,UAAApB;AAAA,wBACA,UAAUG;AAAA,wBACT,GAAGe;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAER,gBAAA1K,EAAC,SAAA,EAAM,SAAS2K,GAAU,UAAAF,GAAY;AAAA,oBACrCxB,IACG,gBAAAjJ,EAAC,SAAA,EAAM,SAAS2K,GAAS,cAAU,GAAA,CAAC,IAEpC,gBAAA3K,EAACS,GAAA,EAAI,cAAU,GAAA,CAAC;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBApBfkK;AAAA,cAAA;AAAA,YAwBjB,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MACL;AAAA,IAAA;AAAA,EAGZ;AACJ;AACAgF,GAAW,cAAc;AC5FlB,MAAMC,KAAMhU,EAAM;AAAA,EACrB,CACI;AAAA,IACI,QAAAiU,IAAS;AAAA,IACT,SAAAC,IAAU;AAAA,IACV,+BAAAC;AAAA,IACA,8BAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,GAAGlU;AAAA,EAAA,GAEPC,MACC;AAED,QAAIV,IAAa,CAAA;AAEjB,WAAIoU,KACApU,EAAW,KAAK,UAAUoU,CAAM,EAAE,GAGlCC,KACArU,EAAW,KAAKqU,MAAY,SAAS,eAAe,GAAGA,CAAO,UAAU,GAYxEC,KACAtU,EAAW,KAAK,mCAAmC,GAGnDuU,KACAvU,EAAW,KAAK,kCAAkC,GAGlDwU,KACAxU,EAAW,KAAK,yBAAyB,GAGzCyU,KACAzU,EAAW;AAAA,MACP;AAAA,IAAA,GAIJ0U,KACA1U,EAAW,KAAK,kBAAkB,GAKlC,gBAAAuE;AAAA,MAACrE;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,YAAQ;AAAA,QACR,KAAAQ;AAAA,QACA,YAAY,CAAEV,EAAW,KAAK,GAAG,CAAE;AAAA,QACnC,cAAa;AAAA,QACb,MAAK;AAAA,QACL,cAAY2U;AAAA,QACX,GAAGlU;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhB;AACJ;AACA0T,GAAI,cAAc;ACnFX,MAAMS,KAASzU,EAAM;AAAA,EACxB,CACI;AAAA;AAAA,IAEI,OAAAgH;AAAA,IACA,UAAAiG;AAAA,IACA,WAAAC;AAAA,IACA,UAAAE;AAAA,IACA,MAAAhK;AAAA;AAAA,IAEA,IAAAmD;AAAA,IACA,MAAAkH;AAAA,IACA,SAAAS;AAAA,IACA,UAAArE;AAAA,IACA,UAAA+D;AAAA,IACA,WAAA9M;AAAA,IACA,GAAGR;AAAA,EAAA,GAEPC,MACC;AACD,UAAMsN,IAAcC,GAAQ,MAAML,KAAQlH,GAAI,CAACkH,GAAMlH,CAAE,CAAC,GAElDmO,IAAe,CAAC/F,MAClB,gBAAAvK;AAAA,MAACrE;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QAEH,OAAO4O,EAAO;AAAA,QACd,UAAUA,EAAO;AAAA,QAEhB,UAAAA,EAAO;AAAA,MAAA;AAAA,MAJHA,EAAO;AAAA,IAAA,GAQdgG,IAAiB,CAACC,MACpB,gBAAAxQ;AAAA,MAACrE;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QAEH,OAAO6U,EAAM;AAAA,QAEZ,UAAAA,EAAM,QAAQ,IAAIF,CAAY;AAAA,MAAA;AAAA,MAH1BE,EAAM;AAAA,IAAA,GAOb7G,IAAe,CAACnI,MAA4C;AAC9D,MAAAiE,KAAA,QAAAA,EAAWjE,EAAE,OAAO;AAAA,IACxB,GAGM,EAAE,cAAAwG,GAAc,YAAAC,MAAeF,GAAqB7L,CAAK;AAE/D,WACI,gBAAA8D;AAAA,MAAC2I;AAAA,MAAA;AAAA,QACG,OAAA/F;AAAA,QACA,SAAST;AAAA,QACT,UAAA0G;AAAA,QACA,WAAAC;AAAA,QACA,UAAAE;AAAA,QACA,MAAAhK;AAAA,QACC,GAAGgJ;AAAA,QAEJ,UAAA,gBAAAhI,EAACS,GAAA,EAAI,eAAW,IAAC,WAAA/D,GAAsB,UAAA8M,GACnC,UAAA,gBAAAxJ;AAAA,UAACrE;AAAA,UAAA;AAAA,YACG,IAAG;AAAA,YACH,KAAAQ;AAAA,YACA,IAAAgG;AAAA,YACA,MAAMsH;AAAA,YACN,UAAAD;AAAA,YACA,UAAAR;AAAA,YACA,UAAUW;AAAA,YACT,GAAG1B;AAAA,YAEH,UAAA6B,EAAQ;AAAA,cAAI,CAACS,MACV,aAAaA,IAASgG,EAAehG,CAAM,IAAI+F,EAAa/F,CAAM;AAAA,YAAA;AAAA,UACtE;AAAA,QAAA,EACJ,CACJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAGZ;AACJ;AACA8F,GAAO,cAAc;ACzCrB,MAAMI,KAAgB,CAACxM,GAAkByM,MACjCzM,IAAUyM,IAAc,aACxBzM,KAAWyM,IAAQ,MAAY,YAC5B,UAGLC,KAAY,CAACC,GAAgBC,GAAmBC,MAC3C,KAAK,IAAIF,CAAK,MAAM,IAAIC,IAAWC,GAIjCC,KAAWnV,EAAM;AAAA,EAC1B,CACI;AAAA;AAAA,IAEI,OAAAgH;AAAA,IACA,WAAAwF;AAAA,IACA,UAAAS;AAAA,IACA,WAAAC;AAAA,IACA,MAAA9J;AAAA,IACA,UAAAgK;AAAA;AAAA,IAEA,UAAAvD;AAAA,IACA,OAAAsE,IAAQ;AAAA,IACR,gBAAAiH;AAAA,IACA,WAAAC;AAAA;AAAA,IAEA,IAAA9O;AAAA,IACA,MAAAkH;AAAA,IACA,MAAA6H;AAAA,IACA,MAAAC;AAAA,IACA,WAAAzD;AAAA,IACA,WAAAD;AAAA,IACA,aAAAF;AAAA,IACA,UAAAK;AAAA,IACA,UAAApE;AAAA,IACA,cAAAgE;AAAA;AAAA,IAEA,cAAAP;AAAA,IACA,OAAAC;AAAA,IACA,SAAA7B;AAAA,IACA,GAAGnP;AAAA,EAAA,GAEPC,MACC;AACD,UAAMiV,IAAcnO,EAAmC,IAAI,GAErD0G,IAAe,CAACnI,MAA+C;AACjE,MAAAiE,KAAA,QAAAA,EAAWjE,EAAE,OAAO;AAAA,IACxB,GAEM6P,IAAoB,MAAwB;AAC9C,YAAMC,IAAqC,CAAA;AAE3C,UAAIN,GAAgB;AAChB,cAAMO,IAAexH,EAAM,QACrByH,IAAaf,GAAcc,GAAcP,CAAc,GACvDS,IAAc,KAAK,IAAI,GAAGF,IAAeP,CAAc,GACvDU,IAAYV,IAAiBO;AAEnC,QAAAD,EAAe;AAAA,UACX,gBAAAtR,EAAC,QAAA,EAAsB,WAAW,SAASwR,CAAU,IAChD,UAAAC,IAAc,IACT,GAAGA,CAAW,IAAId,GAAUc,GAAa,QAAQ,OAAO,CAAC,gBACzD,GAAGC,CAAS,IAAIf,GAAUe,GAAW,QAAQ,OAAO,CAAC,QAAA,GAHrD,YAIV;AAAA,QAAA;AAAA,MAER;AAEA,UAAIT,GAAW;AACX,cAAMU,IAAe5H,EAAM,OAAO,MAAM,KAAK,EAAE,OAAO,OAAO,EAAE,QACzDyH,IAAaf,GAAckB,GAAcV,CAAS,GAClDW,IAAc,KAAK,IAAI,GAAGD,IAAeV,CAAS,GAClDS,IAAYT,IAAYU;AAE9B,QAAAL,EAAe;AAAA,UACX,gBAAAtR,EAAC,QAAA,EAAsB,WAAW,SAASwR,CAAU,IAChD,UAAAI,IAAc,IACT,GAAGA,CAAW,IAAIjB,GAAUiB,GAAa,QAAQ,OAAO,CAAC,gBACzD,GAAGF,CAAS,IAAIf,GAAUe,GAAW,QAAQ,OAAO,CAAC,QAAA,GAHrD,YAIV;AAAA,QAAA;AAAA,MAER;AAEA,UAAI,GAACJ,EAAe,UAAU,CAACzI;AAE/B,eACI,gBAAAnH,EAAA6B,IAAA,EACK,UAAA;AAAA,UAAAsF;AAAA,UACAA,KAAYyI,EAAe,SAAS,uBAAM,QAAA,EAAK,WAAU,aAAY,UAAA,MAAA,CAAG;AAAA,UACxEA,EAAe,IAAI,CAACO,GAAKC,MACtB,gBAAApQ,EAAC9F,EAAM,UAAN,EACI,UAAA;AAAA,YAAAkW,IAAI,KAAK,gBAAA9R,EAAC,QAAA,EAAK,WAAU,aAAY,UAAA,OAAG;AAAA,YACxC6R;AAAA,UAAA,EAAA,GAFgBC,CAGrB,CACH;AAAA,QAAA,GACL;AAAA,IAER,GAEMC,IAAU,CAACzK,MAAyC;AACtD,MAAA8J,EAAY,UAAU9J,GAClB,OAAOnL,KAAQ,aACfA,EAAImL,CAAO,IACJnL,MACNA,EAA2D,UAAUmL;AAAA,IAE9E,GAGM,EAAC,cAAAU,GAAc,YAAAC,MAAcF,GAAqB7L,CAAK;AAE7D,WACI,gBAAA8D;AAAA,MAAC2I;AAAA,MAAA;AAAA,QACG,OAAA/F;AAAA,QACA,SAAST;AAAA,QACT,UAAUkP,EAAA;AAAA,QACV,WAAAvI;AAAA,QACA,UAAAE;AAAA,QACA,MAAAhK;AAAA,QACC,GAAGgJ;AAAA,QAEJ,UAAA,gBAAAhI;AAAA,UAACrE;AAAA,UAAA;AAAA,YACG,IAAG;AAAA,YACH,KAAKoW;AAAA,YACL,iBAAa;AAAA,YACb,IAAA5P;AAAA,YACA,MAAAkH;AAAA,YACA,OAAAU;AAAA,YACA,MAAAmH;AAAA,YACA,MAAAC;AAAA,YACA,WAAAzD;AAAA,YACA,WAAAD;AAAA,YACA,aAAAF;AAAA,YACA,UAAAK;AAAA,YACA,UAAApE;AAAA,YACA,UAAAR;AAAA,YACA,cAAAwE;AAAA,YACA,UAAU7D;AAAA,YACT,GAAG1B;AAAA,UAAA;AAAA,QAAA;AAAA,MACR;AAAA,IAAA;AAAA,EAGZ;AACJ;AACA8I,GAAS,cAAc;AClJvB,MAAMiB,KAA4C;AAAA,EAC9C,UAAA5I;AAAA,EACA,QAAAQ;AAAA,EACA,YAAAgD;AAAA,EACA,YAAA9B;AAAA,EACA,YAAA3C;AAAA,EACA,aAAAuH;AAAA,EACA,YAAAC;AAAA,EACA,QAAAU;AAAA,EACA,UAAAU;AAAA,EACA,OAAO;AACX,GAEMkB,KAAc,CAChBC,GACAC,MACkB;AAClB,QAAM,EAAE,IAAIC,GAAa,MAAA/I,GAAM,GAAGgJ,MAAmBH,GAG/CvI,IAAe,CAACI,MAAe;AACjC,IAAAoI,EAAc9I,GAAMU,CAAK;AAAA,EAC7B,GAEMuI,IAAmBN,GAAaI,CAAwC,KAAKxF;AAEnF,SACI,gBAAA5M;AAAA,IAACrE;AAAA,IAAA;AAAA,MACG,IAAI2W;AAAA,MACH,GAAGD;AAAA,MACJ,MAAAhJ;AAAA,MACA,aAAW;AAAA,MACX,UAAUM;AAAA,IAAA;AAAA,EAAA;AAGtB,GAEa4I,KAA4B,CACrCC,GACAL,GACArO,MACkB;AAClB,QAAM2O,IAA4BD,EAAO,IAAI,CAACE,GAAOhO,MAAU;AAC3D,UAAM;AAAA,MACI,aAAA2K;AAAA,MACA,qBAAAE;AAAA,MACA,oBAAAC;AAAA,MACA,YAAAF;AAAA,MACA,cAAAG;AAAA,MACA,GAAGyC;AAAA,IAAA,IACHQ;AAUV,WACI,gBAAAC,GAACvD,IAAA,EAAS,GATO;AAAA,MACjB,aAAAC;AAAA,MACA,qBAAAE;AAAA,MACA,oBAAAC;AAAA,MACA,YAAAF;AAAA,MACA,cAAAG;AAAA,IAAA,GAI2B,KAAK,GAAGiD,EAAM,IAAI,IAAIhO,CAAK,GAAA,GACjDuN,GAAYC,GAAWC,CAAa,CACzC;AAAA,EAER,CAAC;AAED,SAAO,gBAAAnS,EAAC4P,IAAA,EAAI,SAAS9L,GAAU,UAAA2O,GAAa;AAChD,GC/FaG,KAAOhX,EAAM;AAAA,EACtB,CACI,EAAE,SAAAkI,IAAU,SAAS,QAAA0O,GAAQ,gBAAAK,GAAgB,UAAA1R,GAAU,WAAA2H,GAAW,GAAG5M,EAAA,GACrEC,MACC;AACD,QAAIV,IAAa,CAAA;AAEjB,IAAIqI,KACArI,EAAW,KAAK,WAAWqI,CAAO,EAAE;AAIxC,UAAMgP,IAAoB,CAACC,GAAmBhJ,MAAe;AACzD,MAAI8I,KACAA,EAAe;AAAA,QACX,CAACE,CAAS,GAAGhJ;AAAA,MAAA,CAChB;AAAA,IAET,GAGMiJ,IAAcR,KAAA,QAAAA,EAAQ,SAASD,GAA0BC,GAAQM,GAAmBhP,CAAO,IAAI3C;AAErG,WACI,gBAAAO;AAAA,MAAC/F;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,aAAS;AAAA,QACT,KAAAQ;AAAA,QACA,YAAAV;AAAA,QACC,GAAGS;AAAA,QAEH,UAAA;AAAA,UAAA8W;AAAA,UACAlK,KAAa,gBAAA9I,EAAC8E,IAAA,EAAQ,MAAK,SAAS,UAAAgE,EAAA,CAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3D;AACJ;AACA8J,GAAK,cAAc;ACvCZ,MAAMK,KAAgBrX,EAAM;AAAA,EAC/B,CACI;AAAA,IACI,SAAAiI;AAAA,IACA,uBAAAqP;AAAA,IACA,cAAAC;AAAA,IACA,UAAAhS;AAAA,IACA,QAAAiS;AAAA,IACA,IAAAjR;AAAA,IACA,GAAGjG;AAAA,EAAA,GAEPC,MACC;AACD,UAAMkX,IAAUlR,KAAM,cAAc,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAC9E,QAAI1G,IAAa,CAAA;AAEjB,WAAIoI,KACApI,EAAW,KAAK,UAAU,GAG1ByX,KACAzX,EAAW,KAAK,0BAA0B,GAG1C0X,KACA1X,EAAW,KAAK,eAAe,GAI/B,gBAAAuE;AAAA,MAACrE;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,wBAAoB;AAAA,QACpB,KAAAQ;AAAA,QACA,IAAIkX;AAAA,QACJ,MAAK;AAAA,QACL,cAAYD;AAAA,QACZ,YAAA3X;AAAA,QACC,GAAGS;AAAA,QAEH,UAAAiF;AAAA,MAAA;AAAA,IAAA;AAAA,EAGb;AACJ;AACA8R,GAAc,cAAc;ACnErB,MAAMK,KAAsB,CAACC,GAAWC,MAAsB;AACjE,QAAMC,IAAS,CAAA,GAETC,IAAUH,EAAE,QACZI,IAAUH,EAAE;AAGlB,MAAIE,MAAY,EAAG,QAAOC;AAC1B,MAAIA,MAAY,EAAG,QAAOD;AAG1B,WAAS5B,IAAI,GAAGA,KAAK6B,GAAS7B;AAC1B,IAAA2B,EAAO3B,CAAC,IAAI,CAAEA,CAAE;AAEpB,WAAS8B,IAAI,GAAGA,KAAKF,GAASE;AAC1B,IAAAH,EAAO,CAAC,EAAEG,CAAC,IAAIA;AAInB,WAAS9B,IAAI,GAAGA,KAAK6B,GAAS7B;AAC1B,aAAS8B,IAAI,GAAGA,KAAKF,GAASE;AAC1B,MAAIJ,EAAE1B,IAAI,CAAC,MAAMyB,EAAEK,IAAI,CAAC,IACpBH,EAAO3B,CAAC,EAAE8B,CAAC,IAAIH,EAAO3B,IAAI,CAAC,EAAE8B,IAAI,CAAC,IAElCH,EAAO3B,CAAC,EAAE8B,CAAC,IAAI,KAAK;AAAA,QAChBH,EAAO3B,IAAI,CAAC,EAAE8B,CAAC,IAAI;AAAA;AAAA,QACnBH,EAAO3B,CAAC,EAAE8B,IAAI,CAAC,IAAI;AAAA;AAAA,QACnBH,EAAO3B,IAAI,CAAC,EAAE8B,IAAI,CAAC,IAAI;AAAA;AAAA,MAAA;AAMvC,SAAOH,EAAOE,CAAO,EAAED,CAAO;AAClC,GAEaG,KAAgB,CAACC,GAAgBC,MAA4B;AACtE,MAAIC,IAAc,GACdC,IAAc;AAElB,SAAOD,IAAcF,EAAO,UAAUG,IAAcF,EAAO;AACvD,IAAID,EAAOE,CAAW,MAAMD,EAAOE,CAAW,KAC1CD,KAEJC;AAGJ,SAAOD,MAAgBF,EAAO;AAClC,GAEaI,KAAkB,CAACtR,MACrBA,EACF,MAAM,UAAU,EAChB,IAAI,CAAAuR,MAAQA,EAAK,MAAM,GAAG,CAAC,CAAC,EAC5B,KAAK,EAAE,EACP,YAAA,GAIIC,KAAgB,CAACtK,GAAkCuK,MAAuB;AACnF,MAAI,CAACA,EAAY,QAAOvK;AAExB,QAAMwK,IAAmBD,EAAW,YAAA,EAAc,KAAA,GAE5CE,IAAc,KAAK,MAAMD,EAAiB,SAAS,CAAC;AA0C1D,SAxCuBxK,EAClB,IAAI,CAAAS,MAAU;AACX,UAAMiK,IAAkBjK,EAAO,MAAM,YAAA,GAE/BkK,IAAWnB,GAAoBgB,GAAkBE,CAAe,GAEhEE,IAAcF,EAAgB,MAAM,UAAU,GAC9CG,IAAcL,EAAiB,MAAM,UAAU,GAE/CM,IACIJ,EAAgB,SAASF,CAAgB,KACzCK,EAAY;AAAA,MAAM,OACdD,EAAM,KAAK,OAAQP,EAAK,WAAWU,CAAU,CAAC;AAAA,IAAA,GAGtDC,IAAUZ,GAAgBM,CAAe,GAEzCO,IAAiBlB,GAAcS,GAAkBQ,CAAO;AAE9D,WAAO;AAAA,MACH,QAAAvK;AAAA,MACA,UAAAkK;AAAA,MACA,gBAAAG;AAAA,MACA,gBAAAG;AAAA,IAAA;AAAA,EAER,CAAC,EACA;AAAA,IAAO,CAAC,EAAE,UAAAN,GAAU,gBAAAG,GAAgB,gBAAAG,QACjCH,KAAkBG,KAAkBN,KAAYF;AAAA,EAAA,EAEnD,KAAK,CAAChB,GAAGC,MACFD,EAAE,kBAAkB,CAACC,EAAE,iBAAuB,KAC9C,CAACD,EAAE,kBAAkBC,EAAE,iBAAuB,IAE9CD,EAAE,kBAAkB,CAACC,EAAE,iBAAuB,KAC9C,CAACD,EAAE,kBAAkBC,EAAE,iBAAuB,IAE3CD,EAAE,WAAWC,EAAE,QACzB,EACA,IAAI,CAAC,EAAE,QAAAjJ,EAAA,MAAaA,CAAM;AAGnC,GCpFayK,KAAUpZ,EAAM;AAAA,EACzB,CACI;AAAA,IACI,SAAAkO,IAAU,CAAA;AAAA,IACV,OAAAlH;AAAA,IACA,UAAAiG;AAAA,IACA,WAAAC;AAAA,IACA,aAAAyE,IAAc;AAAA,IACd,IAAApL;AAAA,IACA,cAAA6H;AAAA,IACA,UAAAvE;AAAA,IACA,UAAA+D;AAAA,IACA,gBAAAyL;AAAA,IACA,kBAAAC,IAAmB;AAAA,IACnB,oBAAAC,IAAqB;AAAA,IACrB,WAAAxR;AAAA,IACA,OAAAoG;AAAA,IACA,aAAAtM;AAAA,IACA,WAAAf;AAAA,IACA,UAAAsM;AAAA,IACA,MAAAhK;AAAA,IACA,GAAG9C;AAAA,EAAA,GAEPC,MACC;AACD,UAAM,CAACiG,GAAQgT,CAAS,IAAIxP,EAAS,EAAK,GACpC,CAACyP,GAAaC,CAAc,IAAI1P,EAAS,EAAE,GAC3C,CAAC2P,GAAaC,CAAc,IAAI5P,EAAS,EAAE,GAC3C,CAAC6P,GAAgBC,CAAiB,IAAI9P,EAAuC,IAAI,GACjF,CAAC+P,GAAiBC,CAAkB,IAAIhQ,EAAkC,CAAA,CAAE,GAC5E,CAACiQ,GAAYC,CAAa,IAAIlQ,EAAS,EAAK;AAElD,IAAA7D,EAAU,MAAM;AACZ,MAAIiI,KAAgBvE,KAChBA,EAASuE,CAAY;AAAA,IAE7B,GAAG,CAAA,CAAE;AAGL,UAAM+L,IAAana,EAAM,QAAQ,MACtB,CAAC,GAAGkO,CAAO,GACnB,CAACA,CAAO,CAAC,GAENkM,IAAc/S,EAA0B,IAAI,GAC5CgT,IAAiBhT,EAAyB,IAAI,GAC9CiT,IAAkBjT,EAAuB,IAAI,GAE7CkT,IAAYhU,KAAM,WAAW,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC,IACvEiU,IAAkBhC,GAAc2B,GAAYV,CAAW,GAEvDgB,IAAqB,CAAC9L,MAAkC;AAC1D,UAAIA,EAAO,SAAU;AAErB,UAAI+L;AACJ,UAAIpB,GAAkB;AAElB,YADmBS,EAAgB,KAAK,QAAOY,GAAI,UAAUhM,EAAO,KAAK;AAErE,UAAA+L,IAAqBX,EAAgB,OAAO,CAAAY,OAAOA,GAAI,UAAUhM,EAAO,KAAK;AAAA,aAC1E;AACH,cAAI0K,KAAkBU,EAAgB,UAAUV;AAC5C;AAEJ,UAAAqB,IAAqB,CAAC,GAAGX,GAAiBpL,CAAM;AAAA,QACpD;AACA,QAAAqL,EAAmBU,CAAkB,GACrC7Q,KAAA,QAAAA,EAAW6Q,EAAmB,IAAI,CAAAC,OAAOA,GAAI,KAAK;AAAA,MACtD;AACI,QAAAD,IAAqB,CAAC/L,CAAM,GAC5BmL,EAAkBnL,CAAM,GACxBqL,EAAmBU,CAAkB,GACrC7Q,KAAA,QAAAA,EAAW8E,EAAO,QAClB6K,EAAU,EAAK;AAGnB,MAAAE,EAAe,EAAE,GACjBE,EAAe,EAAE;AAAA,IACrB,GAEMgB,IAAqB,CAACzM,MAAkB;AAC1C,MAAAuL,EAAevL,CAAK;AAAA,IACxB,GAEM0M,KAAoB,MAAM;AAC5B,UAAI,CAACpB,EAAY,KAAA,KAAU,CAACF,EAAoB;AAEhD,YAAMuB,IAAcrB,EAAY,KAAA,GAC1BsB,IAAsC;AAAA,QACxC,OAAOD;AAAA,QACP,OAAOA;AAAA,MAAA;AAIX,MAAKX,EAAW,KAAK,OAAOQ,EAAI,UAAUG,CAAW,KACjDL,EAAmBM,CAAY;AAAA,IAEvC,GAEMC,KAAqB,CAACC,MAA0B;AAClD,UAAI3B,GAAkB;AAElB,cAAMoB,IAAqBX,EAAgB,OAAO,CAAAY,MAAOA,EAAI,UAAUM,CAAa;AAGpF,QAAAjB,EAAmBU,CAAkB,GAGrC7Q,KAAA,QAAAA,EAAW6Q,EAAmB,IAAI,CAAAC,MAAOA,EAAI,KAAK;AAAA,MACtD;AAEI,QAAAb,EAAkB,IAAI,GACtBE,EAAmB,CAAA,CAAE,GACrBnQ,KAAA,QAAAA,EAAW;AAAA,IAEnB,GAEMqR,KAAiB,MAAM;AAEzB,MAAApB,EAAkB,IAAI,GACtBE,EAAmB,CAAA,CAAE,GAGrBnQ,KAAA,QAAAA,EAAWyP,IAAmB,CAAA,IAAK;AAAA,IACvC,GAEMxN,KAAgB,CAACzF,MAAyB;AAC5C,cAAQA,EAAM,KAAA;AAAA,QACV,KAAK;AACD,UAAAA,EAAM,eAAA,GACDG,IAIDoT;AAAA,YAAe,OACXuB,IAAOX,EAAgB,SAAS,IAAIW,IAAO,IAAIA;AAAA,UAAA,KAJnD3B,EAAU,EAAI,GACdI,EAAe,CAAC;AAMpB;AAAA,QAEJ,KAAK;AACD,UAAAvT,EAAM,eAAA,GACNuT,EAAe,CAAAuB,MAAQA,IAAO,IAAIA,IAAO,IAAIA,CAAI;AACjD;AAAA,QAEJ,KAAK;AAED,cADA9U,EAAM,eAAA,GACFkT,KAAsBE,EAAY,QAAQ;AAC1C,kBAAM2B,IAAaZ,EAAgB;AAAA,cAAK,CAAAG,MACpCA,EAAI,MAAM,YAAA,MAAkBlB,EAAY,KAAA,EAAO,YAAA;AAAA,YAAY;AAE/D,YAAI2B,IACAX,EAAmBW,CAAU,IAE7BP,GAAA;AAAA,UAER,MAAA,CAAWlB,KAAe,KAAKa,EAAgBb,CAAW,KACtDc,EAAmBD,EAAgBb,CAAW,CAAC;AAEnD;AAAA,QAEJ,KAAK;AACD,UAAAtT,EAAM,eAAA,GACNmT,EAAU,EAAK,GACfI,EAAe,EAAE;AACjB;AAAA,QAEJ,KAAK;AACD,UAAKpT,MACDH,EAAM,eAAA,GACNmT,EAAU,EAAI,GACdI,EAAe,CAAC;AAEpB;AAAA,QAEJ,KAAK;AACD,UAAIpT,MACAH,EAAM,eAAA,GACNuT,EAAe,CAAC;AAEpB;AAAA,QAEJ,KAAK;AACD,UAAIpT,MACAH,EAAM,eAAA,GACNuT,EAAeY,EAAgB,SAAS,CAAC;AAE7C;AAAA,MAAA;AAAA,IAEZ;AAEA,IAAAzU,GAAgBqU,GAAa,MAAM;AAC/B,MAAAZ,EAAU,EAAK,GACfI,EAAe,EAAE;AAAA,IACrB,CAAC,GAEDzT,EAAU,MAAM;AACZ,MAAIK,KAAU6T,EAAe,WACzBA,EAAe,QAAQ,MAAA;AAAA,IAE/B,GAAG,CAAC7T,CAAM,CAAC,GAGXL,EAAU,MAAM;AACZ,UAAIK,KAAU4T,EAAY,SAAS;AAC/B,cAAMiB,IAAcjB,EAAY,QAAQ,sBAAA,GAClCkB,IAAiB,OAAO,aAExBC,IAA0B,KAC1BC,KAAaF,IAAiBD,EAAY,QAC1CI,KAAaJ,EAAY;AAG/B,QAAAnB,EAAcsB,KAAaD,KAA2BE,KAAaD,EAAU;AAAA,MACjF;AACI,QAAAtB,EAAc,EAAK;AAAA,IAE3B,GAAG,CAAC1T,CAAM,CAAC,GAEXL,EAAU,MAAM;AACZ,UAAIwT,KAAe,GAAG;AAClB,cAAM+B,IAAe,SAAS,cAAc,gBAAgB/B,CAAW,IAAI;AAC3E,QAAA+B,KAAA,QAAAA,EAAc,eAAe,EAAE,OAAO,UAAA;AAAA,MAC1C;AAAA,IACJ,GAAG,CAAC/B,CAAW,CAAC;AAGhB,UAAM,EAAE,cAAAvN,IAAc,YAAAC,OAAeF,GAAqB7L,CAAK;AAE/D,WACI,gBAAA8D;AAAA,MAAC2I;AAAA,MAAA;AAAA,QACG,OAAA/F;AAAA,QACA,SAAST;AAAA,QACT,UAAA0G;AAAA,QACA,WAAAC;AAAA,QACA,UAAAE;AAAA,QACA,aAAAvL;AAAA,QACA,MAAAuB;AAAA,QACC,GAAGgJ;AAAA,QAGJ,UAAA,gBAAAtG;AAAA,UAAC/F;AAAA,UAAA;AAAA,YACG,IAAG;AAAA,YACH,iBAAa;AAAA,YACb,YAAY,CAAC,oBAAoB6N,IAAW,aAAa,IAAI9M,KAAa,EAAE;AAAA,YAC5E,KAAKsZ;AAAA,YACL,aAAAvY;AAAA,YACC,GAAGwK;AAAA,YAEJ,UAAA;AAAA,cAAA,gBAAAvG;AAAA,gBAACjB;AAAA,gBAAA;AAAA,kBACG,WAAU;AAAA,kBACV,SAAS,MAAM,CAAC+I,KAAY4L,EAAU,CAAChT,CAAM;AAAA,kBAC7C,MAAK;AAAA,kBACL,iBAAc;AAAA,kBACd,iBAAeA;AAAA,kBACf,iBAAe,GAAG+T,CAAS;AAAA,kBAC3B,aAAW,GAAGA,CAAS;AAAA,kBACvB,UAAU3M,IAAW,KAAK;AAAA,kBAEzB,UAAA;AAAA,oBAAA0L,IACG,gBAAAxT,EAAA6B,IAAA,EACK,UAAA;AAAA,sBAAAoS,EAAgB,SAAS,IACtB,gBAAAjU,EAACjB,GAAA,EAAI,WAAU,mBACX,UAAA;AAAA,wBAAA,gBAAAT,EAACS,GAAA,EAAI,WAAU,gBACV,UAAAkV,EAAgB,IAAI,CAAApL,MACjB,gBAAAvK;AAAA,0BAACkB;AAAA,0BAAA;AAAA,4BAEG,YAAW;AAAA,4BACX,eAAe,MAAM0V,GAAmBrM,EAAO,KAAK;AAAA,4BACpD,iBAAiB,UAAUA,EAAO,KAAK;AAAA,4BACvC,MAAK;AAAA,4BACL,OAAM;AAAA,4BAEN,UAAA,gBAAAvK,EAACoE,GAAA,EAAM,UAAAmG,EAAO,MAAA,CAAM;AAAA,0BAAA;AAAA,0BAPfA,EAAO;AAAA,wBAAA,CASnB,GACL;AAAA,wBACC0K,KAAkBU,EAAgB,UAAUV,KACzC,gBAAAvT,EAAC0C,GAAA,EAAK,WAAU,yBAAwB,YAAW,OAAM,MAAK,QAAO,UAAA;AAAA,0BAAA;AAAA,0BAC5C6Q;AAAA,0BAAe;AAAA,0BAAQA,MAAmB,IAAI,KAAK;AAAA,wBAAA,EAAA,CAC5E;AAAA,sBAAA,GAER,IAEA,gBAAAjV,EAAC,QAAA,EAAK,WAAU,eAAe,UAAAuN,GAAY;AAAA,sBAI9CoI,EAAgB,SAAS,KACtB,gBAAA3V;AAAA,wBAACS;AAAA,wBAAA;AAAA,0BACG,WAAU;AAAA,0BACV,OAAM;AAAA,0BACN,SAAS,MAAMqW,GAAA;AAAA,0BAEf,UAAA,gBAAApV,EAAC,OAAA,EAAI,SAAQ,aACT,UAAA;AAAA,4BAAA,gBAAA1B,EAAC,QAAA,EAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,4BACpC,gBAAAA,EAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,IAAA,CAAI;AAAA,0BAAA,EAAA,CACxC;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBACJ,GAER,IAEA2V,EAAgB,CAAC,IACX,gBAAA3V,EAACoE,KAAK,WAAU,mBAAmB,UAAAuR,EAAgB,CAAC,EAAE,OAAM,sBAC3D,QAAA,EAAK,WAAU,eAAe,UAAApI,GAAY;AAAA,oBAGrD,gBAAAvN,EAACS,KAAI,WAAU,yBACX,4BAAC,OAAA,EAAI,SAAQ,aAAY,eAAY,QACjC,UAAA;AAAA,sBAAA,gBAAAT,EAAC,YAAA,EAAS,QAAO,gBAAA,CAAgB;AAAA,sBACjC,gBAAAA,EAAC,YAAA,EAAS,QAAO,mBAAA,CAAmB;AAAA,oBAAA,EAAA,CACxC,EAAA,CACJ;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAIHoC,KAAU,CAACoH,KACR,gBAAA9H;AAAA,gBAACjB;AAAA,gBAAA;AAAA,kBACG,KAAKyV;AAAA,kBACL,WAAW,oBAAoBL,IAAa,kBAAkB,EAAE;AAAA,kBAEhE,UAAA;AAAA,oBAAA,gBAAAnU,EAACjB,GAAA,EAAI,WAAU,2BACX,UAAA;AAAA,sBAAA,gBAAAT;AAAA,wBAAC4M;AAAA,wBAAA;AAAA,0BACG,MAAK;AAAA,0BACL,KAAKqJ;AAAA,0BACL,WAAU;AAAA,0BACV,aAAad,IAAqB,8BAA8B;AAAA,0BAChE,OAAOE;AAAA,0BACP,UAAUmB;AAAA,0BACV,WAAW9O;AAAA,0BACX,iBAAe,GAAGyO,CAAS;AAAA,0BAC3B,cAAW;AAAA,0BACX,aAAW;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAEdhB,KAAsBE,EAAY,KAAA,KAAU,CAACM,EAAgB,KAAK,CAAAY,MAC/DA,EAAI,MAAM,kBAAkBlB,EAAY,OAAO,YAAA,CAAa,KAC5D,gBAAArV;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACG,WAAU;AAAA,0BACV,cAAW;AAAA,0BACd,UAAA;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAED,GAER;AAAA,oBAGA,gBAAAA;AAAA,sBAACrE;AAAA,sBAAA;AAAA,wBACG,IAAG;AAAA,wBACH,IAAI,GAAGwa,CAAS;AAAA,wBAChB,WAAU;AAAA,wBACV,MAAK;AAAA,wBACL,wBAAsBjB;AAAA,wBACtB,aAAWvR;AAAA,wBACX,UAAU;AAAA,wBAET,YAAgB,SAAS,IACtByS,EAAgB,IAAI,CAAC7L,GAAQ7F,MACzB,gBAAA1E;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BAEG,IAAI,GAAGmW,CAAS,WAAW5L,EAAO,KAAK;AAAA,4BACvC,WAAW,mBAAmBA,EAAO,WAAW,aAAa,EAAE,IAAIgL,MAAgB7Q,IAAQ,WAAW,EAAE;AAAA,4BACxG,MAAK;AAAA,4BACL,iBAAeiR,EAAgB,KAAK,OAAOY,EAAI,UAAUhM,EAAO,KAAK;AAAA,4BACrE,iBAAeA,EAAO;AAAA,4BACtB,SAAS,MAAM8L,EAAmB9L,CAAM;AAAA,4BACxC,cAAY7F;AAAA,4BACZ,UAAU;AAAA,4BAET,UAAA6F,EAAO,eAAeA,EAAO;AAAA,0BAAA;AAAA,0BAVzBA,EAAO;AAAA,wBAAA,CAYnB,IAED,gBAAAvK;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACG,WAAU;AAAA,4BACV,MAAK;AAAA,4BACL,aAAU;AAAA,4BAET,cACK,2CACA;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBAEV;AAAA,oBAAA;AAAA,kBAER;AAAA,gBAAA;AAAA,cAAA;AAAA,YACJ;AAAA,UAAA;AAAA,QAAA;AAAA,MAER;AAAA,IAAA;AAAA,EAGZ;AACJ;AACAgV,GAAQ,cAAc;AC1XtB,SAASuC,GAASxN,GAAeuD,GAAiC;AAI9D,UADcA,MAAS,iBADK,oBADN,YAGT,KAAKvD,CAAK;AAC3B;AAGO,MAAMyN,KAAgB5b,EAAM;AAAA,EAC/B,CACI;AAAA,IACI,gBAAgBwL;AAAA,IAChB,UAAA3B;AAAA,IACA,MAAA6H,IAAO;AAAA,IACP,MAAAmK,IAAO;AAAA,IACP,OAAAC,IAAQ;AAAA,IACR,WAAAC,IAAY;AAAA,IACZ,oBAAAC,IAAqB;AAAA,IACrB,wBAAAC,IAAyB;AAAA,IACzB,aAAApa;AAAA,IACA,WAAA1B;AAAA,IACA,GAAGG;AAAA,EAAA,GAEPC,MACC;AAED,UAAM2b,IAAmB7U,EAAiC,IAAI,GACxD,CAAC8U,GAAWC,CAAY,IAAIpS,EAA8C,CAAA,CAAE,GAG5E,CAACqS,GAAQC,CAAS,IAAItS,EAAmB,CAAA,CAAE,GAC3C,CAACuS,GAAWC,CAAY,IAAIxS,EAAkB,EAAI,GAClD,CAACyS,GAAcC,CAAe,IAAI1S,EAAiB,EAAE,GAGrD2S,IAAerc,EAAM,MAAM,aAAa,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC,IAClFsc,IAAmBzc,KAAa,2BAGhC0c,IAAQ3W;AAAA,MACV,CAAC4C,MAAkB;;AACf,cAAMvI,IAAM4b,EAAUrT,CAAK;AAC3BvI,SAAAA,IAAAA,KAAAA,gBAAAA,EAAK,YAALA,QAAAA,EAAc;AAAA,MAClB;AAAA,MACA,CAAC4b,CAAS;AAAA,IAAA,GAGRW,IAAY5W;AAAA,MACd,CAAC4C,MAAkB;AACf,YAAI,CAACyT,EAAW;AAChB,cAAMQ,IAAOjU,IAAQ,IAAI0C,IAAS1C,IAAQ,IAAI;AAC9C,QAAIiU,KACAF,EAAME,CAAI;AAAA,MAElB;AAAA,MACA,CAACF,GAAOrR,GAAQ+Q,CAAS;AAAA,IAAA,GAGvBS,IAAsB9W,EAAY,MAAM;AAC1C,MAAAoW,EAAU,MAAM9Q,CAAM,EAAE,KAAK,EAAE,CAAC,GAChC3B,KAAA,QAAAA,EAAW,KACPoS,MACAY,EAAM,CAAC,GACPH,EAAgB,CAAC;AAAA,IAEzB,GAAG,CAAClR,GAAQ3B,GAAUgT,GAAOZ,CAAsB,CAAC,GAG9CgB,IAAW/W;AAAA,MACb,CAACiI,GAAerF,MAAkB;AAC9B,cAAMoU,IAAa,CAAC,GAAGb,CAAM;AAC7B,QAAAa,EAAWpU,CAAK,IAAIqF,GACpBmO,EAAUY,CAAU,GAGpBrT,KAAA,QAAAA,EAAWqT,EAAW,KAAK,EAAE,IAGnB/O,MAAU,MACV+O,EAAW,WAAW1R,KACtB0R,EAAW,MAAM,CAACC,MAAeA,KAAc,QAAQA,MAAe,EAAE,KACxErU,MAAU0C,IAAS,MAGzBgR,EAAa,EAAI,GACjBM,EAAUhU,CAAK;AAAA,MAEvB;AAAA,MACA,CAACgU,GAAWtR,GAAQ3B,GAAUwS,CAAM;AAAA,IAAA,GAIlCe,IAAoBlX,EAAY,CAACiX,GAAwDE,MAA4B;;AAEvH,YAAMlP,IAAQ,OAAOgP,KAAe,WAAWA,IAAcA,EAAW,OAA4B,OAC9FG,IAAejB,EAAOgB,CAAe;AAE3C,UAAIlP,MAAU,IAAI;AACd,QAAA8O,EAAS,IAAII,CAAe;AAC5B;AAAA,MACJ;AAGA,UAAIlP,EAAM,SAAS,KAAKkP,IAAkB7R,IAAS;AAC/C,YAAImQ,GAASxN,GAAOuD,CAAI,GAAG;AACvB,cAAI6L,IAAsB,CAAA;AAC1B,gBAAMC,IAAQrP,EAAM,MAAM,EAAE;AAE5B,UAAImP,MAAiB,KACjBC,IAAYC,EAAM,OAAO,CAACxZ,IAAGgU,OAAMqF,IAAkBrF,KAAIxM,CAAM,MAE3Cd,IAAAyR,EAAUkB,CAAe,EAAE,YAA3B,gBAAA3S,EAAoC,kBAAiByD,EAAM,SAE3EoP,IAAYC,EAAM,OAAO,CAACxZ,IAAGgU,OAAMA,KAAI,KAAKqF,IAAkBrF,KAAI,IAAIxM,CAAM,IAE5E+R,IAAYC,EAAM,OAAO,CAACxZ,IAAGgU,OAAMA,KAAI7J,EAAM,SAAS,KAAKkP,IAAkBrF,KAAIxM,CAAM;AAI/F,gBAAMiD,IAAY4N,EAAO;AAAA,YAAI,CAAC3N,IAAGsJ,OAC7BA,MAAKqF,KAAmBrF,KAAIqF,IAAkBE,EAAU,SAClDA,EAAUvF,KAAIqF,CAAe,IAC7B3O;AAAA,UAAA;AAGV,UAAA4N,EAAU7N,CAAS,GACnB5E,KAAA,QAAAA,EAAW4E,EAAU,KAAK,EAAE;AAE5B,gBAAMgP,KAAiB,KAAK,IAAIJ,IAAkBE,EAAU,QAAQ/R,IAAS,CAAC;AAC9E,UAAAqR,EAAMY,EAAc;AAAA,QACxB;AAAA,aACG;AACH,YAAIF,IAAYpP;AAChB,SAAImP,KAAA,gBAAAA,EAAc,UAAS,MACvBC,IAAYpP,EAAM,OAAOA,EAAM,SAAS,CAAC,IAEzCwN,GAAS4B,GAAW7L,CAAI,KACxBuL,EAASM,GAAWF,CAAe;AAAA,MAE3C;AAAA,IACJ,GAAG,CAAC7R,GAAQ3B,GAAUoT,GAAUvL,GAAM2K,GAAQQ,GAAOV,CAAS,CAAC,GAEzDrQ,IAAgB5F,EAAY,CAACG,GAA8C6P,MAAc;;AAC3F,UAAI7P,EAAM,QAAQ;AACd,YAAKA,EAAM,OAA4B,UAAU;AAC7C,cAAI6P,IAAI,GAAG;AACP,kBAAMwH,IAAWxH,IAAI;AACrB,YAAA+G,EAAS,IAAIS,CAAQ,GACrBb,EAAMa,CAAQ,GACdlB,EAAa,EAAI;AAAA,UACrB;AAAA;AAEA,UAAAA,EAAa,EAAK;AAAA,UAE1B,CAAWnW,EAAM,QAAQ,aACrBqE,IAAAyR,EAAUjG,CAAC,EAAE,YAAb,QAAAxL,EAAsB,QACtBkI,EAAA,KACOvM,EAAM,QAAQ,eACjB6P,IAAI1K,IAAS,KACbqR,EAAM3G,IAAI,CAAC,IAER7P,EAAM,QAAQ,eACjB6P,IAAI,KACJ2G,EAAM3G,IAAI,CAAC;AAAA,IAGvB,GAAG,CAAC2G,GAAOI,GAAUd,GAAW3Q,CAAM,CAAC,GAIjCqH,IAAc3M,EAAY,CAACN,GAAmDsQ,MAAc;AAC9F,MAAAwG,EAAgBxG,CAAC;AAAA,IACrB,GAAG,CAAA,CAAE,GAWCyH,IAAezX,EAAY,CAACN,MAAqD;AACnF,YAAMuS,IAASvS,EAAE;AACjB,iBAAW,MAAM;AACb,QAAAuS,EAAO,kBAAkBA,EAAO,MAAM,QAAQA,EAAO,MAAM,MAAM;AAAA,MACrE,GAAG,CAAC;AAAA,IACR,GAAG,CAAA,CAAE,GAECvF,IAAa1M,EAAY,MAAM;AACjC,MAAAwW,EAAgB,EAAE;AAAA,IACtB,GAAG,CAAA,CAAE;AAGL,WAAAvW,EAAU,MAAM;AACZ,MAAAiW,EAAa,CAACD,MACG,MAAM3Q,CAAM,EACpB,KAAK,CAAC,EACN,IAAI,CAACxH,GAAGkS,MAAM;;AACX,cAAM3V,IAAM4b,EAAUjG,CAAC,KAAK0H,GAAA;AAC5B,eAAI7B,KAAa7F,MAAM,OACnB3V,IAAAA,EAAI,YAAJA,QAAAA,EAAa,UAEVA;AAAAA,MACX,CAAC,CAER;AAAA,IACL,GAAG,CAACiL,GAAQuQ,CAAS,CAAC,GAEtB8B;AAAA,MACItd;AAAA,MACA,OAAO;AAAA,QACH,GAAI2b,EAAiB;AAAA,QACrB,OAAOc;AAAA,MAAA;AAAA,MAEX,CAACA,CAAmB;AAAA,IAAA,GAWpB,gBAAA5Y;AAAA,MAACS;AAAA,MAAA;AAAA,QACG,wBAAoB;AAAA,QACpB,KAAKqX;AAAA,QACL,YAAYra,IAAc,CAAC,YAAY,IAAI,CAAA;AAAA,QAC3C,MAAK;AAAA,QACL,cAAY+a;AAAA,QACZ,iBAAetc,EAAM;AAAA,QACpB,GAAGA;AAAA,QAEH,gBAAM,KAAK,EAAE,QAAAkL,KAAU,CAACxH,GAAGkS,MACxB,gBAAA9R;AAAA,UAAC4M;AAAA,UAAA;AAAA,YAEG,IAAI,GAAG2L,CAAY,IAAIzG,CAAC;AAAA,YACxB,KAAKiG,EAAUjG,CAAC;AAAA,YAChB,MAAM2F,IAAO,aAAanK,MAAS,WAAW,QAAQ;AAAA,YACtD,WAAWA,MAAS,WAAW,YAAY;AAAA,YAC3C,UAAU,CAACvD,MAAsDiP,EAAkBjP,GAAO+H,CAAC;AAAA,YAC3F,WAAW,CAACtQ,MAAMkG,EAAclG,GAAGsQ,CAAC;AAAA,YACpC,SAAS,CAACtQ,MAAMiN,EAAYjN,GAAyCsQ,CAAC;AAAA,YACtE,UAAUyH;AAAA,YACV,QAAQ/K;AAAA,YACR,aAAa6J,MAAiBvG,IAAI,MAAW;AAAA,YAC7C,cAAc4F,IAAQ,kBAAkB;AAAA,YACxC,OAAOO,EAAOnG,CAAC,KAAK;AAAA,YACpB,WAAW6F,KAAa7F,MAAM;AAAA,YAC9B,QAAQ,CAACtQ,MAAMoW,MAAuB,cAAcpW,EAAE,eAAA;AAAA,YACtD,SAAS,CAACA,MAAMoW,MAAuB,cAAcpW,EAAE,eAAA;AAAA,YACvD,cAAY,SAASsQ,IAAI,CAAC,OAAO1K,CAAM;AAAA,YACvC,iBAAelL,EAAM;AAAA,UAAA;AAAA,UAjBhB4V;AAAA,QAAA,CAmBZ;AAAA,MAAA;AAAA,IAAA;AAAA,EAGb;AACJ;AACA0F,GAAc,cAAc;ACpRrB,MAAMkC,KAAgB9d,EAAM;AAAA,EAC/B,CACI;AAAA,IACI,IAAAuG;AAAA,IACA,MAAAkH;AAAA,IACA,OAAAzG;AAAA,IACA,UAAAiG;AAAA,IACA,WAAAC;AAAA,IACA,SAAAgB;AAAA,IACA,cAAAE;AAAA,IACA,OAAAD;AAAA,IACA,UAAAf;AAAA,IACA,UAAAvD;AAAA,IACA,MAAAzG,IAAO;AAAA,IACP,UAAA3C;AAAA,IACA,UAAAmN;AAAA,IACA,GAAGtN;AAAA,EAAA,GAEPC,MACC;AACD,UAAMsN,IAAcC,GAAQ,MAAML,KAAQlH,GAAI,CAACkH,GAAMlH,CAAE,CAAC,GAClDwX,IAAoB1W,EAAuB,IAAI,GAE/C,CAAC2W,GAAcC,CAAe,IAAIjU,EAA4B;AAAA,MAChE,OAAO;AAAA,MACP,WAAW;AAAA,IAAA,CACd,GACK,CAACkU,GAAaC,CAAc,IAAInU,EAAS,EAAK,GAC9C,CAACoU,GAAgBC,CAAiB,IAAIrU,EAAS,CAAC,GAChD,CAACsU,GAAWC,CAAY,IAAIvU,EAAS,CAAC,GAEtCwU,IAAYnX,EAAoC,EAAE,GAElDoX,IAAgBvY,EAAY,MAAM;AACpC,UAAI,CAAC6X,EAAkB,QAAS;AAEhC,YAAMW,IAAUX,EAAkB,SAC5BY,IAAeD,EAAQ,QAAQ,sBAAsB;AAE3D,UAAIA,KAAWC,GAAc;AACzB,cAAMC,IAAoBF,EAAQ,aAC5BG,IAAiBF,EAAa,aAC9BG,IAAgBF,IAAoBC;AAE1C,QAAAV,EAAeW,CAAa,GAC5BP,EAAaO,IAAgBF,IAAoBC,IAAiB,CAAC;AAAA,MACvE;AAAA,IACJ,GAAG,CAAA,CAAE;AAEL,IAAA1Y,EAAU,MAAM;AACZ,YAAMuY,IAAUX,EAAkB;AAClC,UAAI,CAACW,EAAS;AAGd,MAAAD,EAAA;AAGA,YAAMM,IAAW,IAAI,eAAe,MAAM;AACtC,QAAAN,EAAA;AAAA,MACJ,CAAC;AAED,aAAAM,EAAS,QAAQL,CAAO,GACpBA,EAAQ,QAAQ,sBAAsB,KACtCK,EAAS,QAAQL,EAAQ,QAAQ,sBAAsB,CAAY,GAGhE,MAAMK,EAAS,WAAA;AAAA,IAC1B,GAAG,CAACN,CAAa,CAAC,GAGlBtY,EAAU,MAAM;AACZ,YAAM6Y,IAAgB9Q,EAAQ,UAAU,CAAAS,MAAUA,EAAO,UAAUR,CAAK;AACxE,UAAI6Q,KAAiB,GAAG;AACpB,cAAMC,IAAkB,MAAM;AAC1B,gBAAMjY,IAAQwX,EAAU,QAAQQ,CAAa;AAC7C,cAAIhY,GAAO;AACP,kBAAMkY,IAAQlY,EAAM;AACpB,gBAAImY,IAAY;AAEhB,YAAIH,IAAgB,MAIhBG,IAAY,cAHGX,EAAU,QACpB,MAAM,GAAGQ,CAAa,EACtB,OAAO,CAACpW,IAAK5B,OAAU4B,OAAO5B,MAAAA,gBAAAA,GAAO,gBAAe,IAAI,CAAC,CAC9B,QAGpCiX,EAAgB,EAAE,OAAAiB,GAAO,WAAAC,GAAW;AAAA,UACxC;AAAA,QACJ;AAGA,YAAI,SAAS,SAAS,SAAS,MAAM;AACjC,mBAAS,MAAM,MAAM,KAAK,MAAM;AAC5B,kCAAsB,MAAM;AACxB,oCAAsBF,CAAe;AAAA,YACzC,CAAC;AAAA,UACL,CAAC;AAAA,aACE;AACH,gBAAMG,IAAY,WAAWH,GAAiB,GAAG;AACjD,iBAAO,MAAM,aAAaG,CAAS;AAAA,QACvC;AAAA,MACJ;AAAA,IACJ,GAAG,CAACjR,GAAOD,CAAO,CAAC;AAEnB,UAAMH,IAAe,CAACnI,MAA2C;AAC7D,MAAAiE,KAAA,QAAAA,EAAWjE,EAAE,OAAO;AAAA,IACxB,GAGM,EAAE,cAAAwG,GAAc,YAAAC,MAAeF,GAAqB7L,CAAK,GAEzD+e,IAAenZ,EAAY,CAACoZ,MAAgC;AAC9D,YAAMZ,IAAUX,EAAkB;AAClC,UAAI,CAACW,EAAS;AAGd,YAAMa,IADeb,EAAQ,cACO;AAEpC,UAAIc,IAAcF,MAAc,UAC1B,KAAK,IAAIlB,IAAiBmB,GAAcjB,CAAS,IACjD,KAAK,IAAIF,IAAiBmB,GAAc,CAAC;AAE/C,MAAAlB,EAAkBmB,CAAW,GAE7B,sBAAsB,MAAM;AACxB,QAAAd,EAAQ,MAAM,YAAY,eAAec,CAAW;AAAA,MACxD,CAAC;AAAA,IACL,GAAG,CAACpB,GAAgBE,CAAS,CAAC,GAExBmB,IAAgBrB,IAAiB,GACjCsB,IAAiBtB,IAAiBE,GAElCze,IAAuB,CAAA;AAC7B,WAAIuD,KACAvD,EAAW,KAAK,QAAQuD,CAAI,EAAE,GAI9B,gBAAAgB;AAAA,MAAC2I;AAAA,MAAA;AAAA,QACG,OAAA/F;AAAA,QACA,SAAST;AAAA,QACT,UAAA0G;AAAA,QACA,WAAAC;AAAA,QACA,UAAAE;AAAA,QACA,MAAAhK;AAAA,QACC,GAAGgJ;AAAA,QAEJ,UAAA,gBAAAtG;AAAA,UAAC/F;AAAA,UAAA;AAAA,YACG,IAAG;AAAA,YACH,wBAAoB;AAAA,YACpB,KAAAQ;AAAA,YACA,YAAAV;AAAA,YACA,MAAMgO;AAAA,YACL,GAAGxB;AAAA,YAGH,UAAA;AAAA,cAAA6R,KAAeuB,KACZ,gBAAArb;AAAA,gBAACS;AAAA,gBAAA;AAAA,kBACG,WAAU;AAAA,kBACV,SAAS,MAAMwa,EAAa,MAAM;AAAA,kBAElC,UAAA,gBAAAjb,EAAC,SAAI,SAAQ,aACT,4BAAC,YAAA,EAAS,QAAO,mBAAkB,EAAA,CACvC;AAAA,gBAAA;AAAA,cAAA;AAAA,cAKR,gBAAA0B,EAACjB,GAAA,EAAI,WAAU,yBACX,UAAA;AAAA,gBAAA,gBAAAiB;AAAA,kBAACjB;AAAA,kBAAA;AAAA,oBACG,WAAU;AAAA,oBACV,KAAKkZ;AAAA,oBAGL,UAAA;AAAA,sBAAA,gBAAA3Z;AAAA,wBAACS;AAAA,wBAAA;AAAA,0BACG,WAAU;AAAA,0BACV,OAAO;AAAA,4BACH,OAAO,GAAGmZ,EAAa,KAAK;AAAA,4BAC5B,WAAWA,EAAa;AAAA,0BAAA;AAAA,wBAC5B;AAAA,sBAAA;AAAA,sBAGH9P,EAAQ,IAAI,CAACS,GAAQ7F,MAAU;AAC5B,8BAAM,EAAE,IAAI8F,GAAU,GAAGE,MAAgBH,GACnCI,IAAUH,KAAY,GAAGrI,CAAE,WAAWuC,CAAK;AAEjD,+BACI,gBAAAhD,EAAC9F,EAAM,UAAN,EACG,UAAA;AAAA,0BAAA,gBAAAoE;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACG,MAAK;AAAA,8BACJ,GAAG0K;AAAA,8BACJ,IAAIC;AAAA,8BACJ,MAAMlB;AAAA,8BACN,SAASM,MAAUQ,EAAO;AAAA,8BAC1B,UAAUf,KAAYe,EAAO;AAAA,8BAC7B,UAAUZ;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BAEd,gBAAA3J;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACG,KAAK,CAAAqO,MAAM;AAAE,gCAAA+L,EAAU,QAAQ1V,CAAK,IAAI2J;AAAA,8BAAI;AAAA,8BAC5C,SAAS1D;AAAA,8BAER,UAAAJ,EAAO;AAAA,4BAAA;AAAA,0BAAA;AAAA,wBACZ,EAAA,GAfiBI,CAgBrB;AAAA,sBAER,CAAC;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAIJmP,KAAewB,KACZ,gBAAAtb;AAAA,kBAACS;AAAA,kBAAA;AAAA,oBACG,WAAU;AAAA,oBACV,SAAS,MAAMwa,EAAa,OAAO;AAAA,oBAEnC,UAAA,gBAAAjb,EAAC,SAAI,SAAQ,aACT,4BAAC,YAAA,EAAS,QAAO,kBAAiB,EAAA,CACtC;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACJ,EAAA,CAER;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACJ;AAAA,IAAA;AAAA,EAGZ;AACJ;AACA0Z,GAAc,cAAc;ACvL5B,SAAS6B,GAAiBrf,GAA8C;AACpE,SAAO,MAAM,QAAQA,EAAM,KAAK;AACpC;AAGO,MAAMsf,KAAQ5f,EAAM;AAAA,EACvB,CAACM,GAAOC,MACAof,GAAiBrf,CAAK,IACf,gBAAA8D,EAACyb,IAAA,EAAgB,GAAGvf,GAAO,cAAcC,GAAK,IAElD,gBAAA6D,EAAC0b,IAAA,EAAkB,GAAGxf,GAAO,cAAcC,GAAK;AAE/D;AACAqf,GAAM,cAAc;AAOpB,MAAME,KAA6D,CAAC;AAAA,EAChE,OAAA9Y;AAAA,EACA,UAAAiG;AAAA,EACA,WAAAC;AAAA,EACA,OAAAiB,IAAQ;AAAA,EACR,QAAA4R;AAAA,EACA,UAAAlW;AAAA,EACA,KAAAmW,IAAM;AAAA,EACN,KAAAC,IAAM;AAAA,EACN,MAAAC,IAAO;AAAA,EACP,IAAA3Z;AAAA,EACA,UAAAqH;AAAA,EACA,MAAAxK;AAAA,EACA,GAAG9C;AACP,MAAM;AAEF,QAAM,EAAC,cAAA8L,EAAA,IAAgBD,GAAqB7L,CAAK,GAE3C6f,IAAW9Y,EAA0B,IAAI,GACzC+Y,IAAW/Y,EAAuB,IAAI,GACtC,CAAEyI,GAAYC,CAAc,IAAI/F,EAAS,EAAK,GAC9C,CAAEqW,GAAUC,CAAY,IAAItW,EAAS,EAAK,GAG1CuW,IAAe,KAAK,IAAIP,GAAK,KAAK,IAAIC,GAAK9R,CAAK,CAAC,GAGjDqS,IAAata,EAAY,CAACua,MACxBR,KAAOD,IAAY,KACP,KAAK,IAAIA,GAAK,KAAK,IAAIC,GAAKQ,CAAG,CAAC,IAC7BT,MAAQC,IAAMD,KAAQ,KAC1C,CAAEA,GAAKC,CAAI,CAAC,GAGTS,IAAuBxa,EAAY,CAACya,MAAqB;AAC3D,QAAI,CAACP,EAAS,QAAS,QAAOJ;AAE9B,UAAMY,IAAOR,EAAS,QAAQ,sBAAA,GACxBS,IAAU,KAAK,IAAI,GAAG,KAAK,IAAI,IAAIF,IAAUC,EAAK,QAAQA,EAAK,KAAK,CAAC,GACrEE,IAAWd,IAAMa,KAAWZ,IAAMD,IAGlCe,IAAe,KAAK,MAAMD,IAAWZ,CAAI,IAAIA;AACnD,WAAO,KAAK,IAAIF,GAAK,KAAK,IAAIC,GAAKc,CAAY,CAAC;AAAA,EACpD,GAAG,CAAEf,GAAKC,GAAKC,CAAK,CAAC,GAGfc,IAAa9a,EAAY,CAACya,MAAqB;AACjD,UAAMM,IAAWP,EAAqBC,CAAO;AAC7C,IAAA9W,KAAA,QAAAA,EAAWoX;AAAA,EACf,GAAG,CAAEP,GAAsB7W,CAAS,CAAC,GAG/BqX,IAAkBhb,EAAY,CAACN,MAAyB;AAC1D,IAAIgI,MACJhI,EAAE,eAAA,GACFmK,EAAc,EAAI,GAClBuQ,EAAY,EAAI,GAChBU,EAAWpb,EAAE,OAAO;AAAA,EACxB,GAAG,CAAEgI,GAAUoT,CAAW,CAAC;AAE3B,EAAA7a,EAAU,MAAM;AACZ,QAAI,CAAC2J,EAAY;AAEjB,UAAMqR,IAAkB,CAACvb,MAAmB;AACxC,MAAAob,EAAWpb,EAAE,OAAO;AAAA,IACxB,GAEMwb,IAAgB,MAAM;AACxB,MAAArR,EAAc,EAAK;AAAA,IACvB;AAEA,oBAAS,iBAAiB,aAAaoR,CAAe,GACtD,SAAS,iBAAiB,WAAWC,CAAa,GAE3C,MAAM;AACT,eAAS,oBAAoB,aAAaD,CAAe,GACzD,SAAS,oBAAoB,WAAWC,CAAa;AAAA,IACzD;AAAA,EACJ,GAAG,CAAEtR,GAAYkR,CAAW,CAAC;AAG7B,QAAMK,IAAmBnb,EAAY,CAACN,MAAyB;AAC3D,IAAIgI,MACJmC,EAAc,EAAI,GAClBuQ,EAAY,EAAI,GAChBU,EAAWpb,EAAE,QAAQ,CAAC,EAAE,OAAO;AAAA,EACnC,GAAG,CAAEgI,GAAUoT,CAAW,CAAC;AAE3B,EAAA7a,EAAU,MAAM;AACZ,QAAI,CAAC2J,EAAY;AAEjB,UAAMwR,IAAkB,CAAC1b,MAAmB;AACxC,MAAAA,EAAE,eAAA,GACFob,EAAWpb,EAAE,QAAQ,CAAC,EAAE,OAAO;AAAA,IACnC,GAEM2b,IAAiB,MAAM;AACzB,MAAAxR,EAAc,EAAK;AAAA,IACvB;AAEA,oBAAS,iBAAiB,aAAauR,GAAiB,EAAC,SAAU,IAAM,GACzE,SAAS,iBAAiB,YAAYC,CAAc,GAE7C,MAAM;AACT,eAAS,oBAAoB,aAAaD,CAAe,GACzD,SAAS,oBAAoB,YAAYC,CAAc;AAAA,IAC3D;AAAA,EACJ,GAAG,CAAEzR,GAAYkR,CAAW,CAAC;AAG7B,QAAMlV,IAAgB5F,EAAY,CAACN,MAA4B;AAC3D,QAAIgI,EAAU;AAEd,QAAIqT,IAAWV;AAEf,YAAQ3a,EAAE,KAAA;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AACD,QAAAA,EAAE,eAAA,GACFqb,IAAW,KAAK,IAAIV,IAAeL,GAAMD,CAAG;AAC5C;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AACD,QAAAra,EAAE,eAAA,GACFqb,IAAW,KAAK,IAAIV,IAAeL,GAAMF,CAAG;AAC5C;AAAA,MACJ,KAAK;AACD,QAAApa,EAAE,eAAA,GACFqb,IAAWjB;AACX;AAAA,MACJ,KAAK;AACD,QAAApa,EAAE,eAAA,GACFqb,IAAWhB;AACX;AAAA,MACJ,KAAK;AACD,QAAAra,EAAE,eAAA,GACFqb,IAAW,KAAK,IAAIV,IAAeL,IAAO,IAAID,CAAG;AACjD;AAAA,MACJ,KAAK;AACD,QAAAra,EAAE,eAAA,GACFqb,IAAW,KAAK,IAAIV,IAAeL,IAAO,IAAIF,CAAG;AACjD;AAAA,MACJ;AACI;AAAA,IAAA;AAGR,IAAAnW,KAAA,QAAAA,EAAWoX;AAAA,EACf,GAAG,CAAErT,GAAU2S,GAAcP,GAAKC,GAAKC,GAAMrW,CAAS,CAAC,GAEjDgX,IAAUL,EAAWD,CAAY;AAEvC,SACI,gBAAAnc;AAAA,IAAC2I;AAAA,IAAA;AAAA,MACG,aAAa/F,KACT,gBAAAlB,EAACjB,GAAA,EAAI,mBAAe,IAChB,UAAA;AAAA,QAAA,gBAAAT;AAAA,UAACmI;AAAA,UAAA;AAAA,YACG,WAAU;AAAA,YACV,OAAAvF;AAAA,YACA,SAAST;AAAA,UAAA;AAAA,QAAA;AAAA,QAEb,gBAAAT,EAAC0C,GAAA,EAAK,WAAU,eACX,UAAA;AAAA,UAAA+X;AAAA,UAAcR,KAAUA;AAAA,QAAA,EAAA,CAC7B;AAAA,MAAA,GACJ;AAAA,MAEJ,UAAA9S;AAAA,MACA,WAAAC;AAAA,MACA,MAAA9J;AAAA,MACC,GAAGgJ;AAAA,MAEJ,UAAA,gBAAAtG;AAAA,QAACjB;AAAA,QAAA;AAAA,UACG,KAAKub;AAAA,UACL,qBAAiB;AAAA,UACjB,WAAWxS,IAAW,aAAa;AAAA,UACnC,MAAK;AAAA,UACL,mBAAiB5G,IAAQ,GAAGT,CAAE,WAAW;AAAA,UAGzC,UAAA;AAAA,YAAA,gBAAAnC,EAACS,GAAA,EAAI,WAAU,eAAc,eAAY,QAAO;AAAA,YAGhD,gBAAAT;AAAA,cAACS;AAAA,cAAA;AAAA,gBACG,WAAU;AAAA,gBACV,OAAO;AAAA,kBACH,MAAQ;AAAA,kBACR,OAAQ,GAAG,MAAMgc,CAAO;AAAA,gBAAA;AAAA,gBAE5B,eAAY;AAAA,cAAA;AAAA,YAAA;AAAA,YAIhB,gBAAAzc;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,KAAK+b;AAAA,gBACL,IAAA5Z;AAAA,gBACA,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,OAAO,EAAC,MAAO,GAAGsa,CAAO,IAAA;AAAA,gBACzB,UAAAjT;AAAA,gBACA,aAAasT;AAAA,gBACb,cAAcG;AAAA,gBACd,WAAWvV;AAAA,gBACX,SAAS,MAAMwU,EAAY,EAAI;AAAA,gBAC/B,QAAQ,MAAMA,EAAY,EAAK;AAAA,gBAC/B,eAAaD,KAAYvQ;AAAA,gBACzB,MAAK;AAAA,gBACL,iBAAekQ;AAAA,gBACf,iBAAeC;AAAA,gBACf,iBAAeM;AAAA,gBACf,kBAAgB,GAAGA,CAAY,GAAGR,IAAS,IAAIA,CAAM,KAAK,EAAE;AAAA,gBAC5D,oBAAiB;AAAA,cAAA;AAAA,YAAA;AAAA,UACrB;AAAA,QAAA;AAAA,MAAA;AAAA,IACJ;AAAA,EAAA;AAGZ;AAEAD,GAAiB,cAAc;AAO/B,MAAMD,KAAyD,CAAC;AAAA,EAC5D,OAAA7Y;AAAA,EACA,UAAAiG;AAAA,EACA,WAAAC;AAAA,EACA,OAAAiB,IAAQ,CAAE,GAAG,GAAI;AAAA,EACjB,QAAA4R;AAAA,EACA,UAAAlW;AAAA,EACA,KAAAmW,IAAM;AAAA,EACN,KAAAC,IAAM;AAAA,EACN,MAAAC,IAAO;AAAA,EACP,UAAAsB,IAAW;AAAA,EACX,UAAAC,IAAW;AAAA,EACX,IAAAlb;AAAA,EACA,UAAAqH;AAAA,EACA,MAAAxK;AAAA,EACA,GAAG9C;AACP,MAAM;AAEF,QAAM,EAAC,cAAA8L,EAAA,IAAgBD,GAAqB7L,CAAK,GAE3C,CAAEohB,GAAaC,CAAY,IAAIxT,GAE/ByT,IAAW,KAAK,IAAI5B,GAAK,KAAK,IAAIC,GAAKyB,CAAW,CAAC,GACnDG,IAAW,KAAK,IAAI7B,GAAK,KAAK,IAAIC,GAAK0B,CAAW,CAAC,GAEnDG,IAAcza,EAA0B,IAAI,GAC5C0a,IAAc1a,EAA0B,IAAI,GAC5C+Y,IAAW/Y,EAAuB,IAAI,GACtC,CAAEyI,GAAYC,CAAc,IAAI/F,EAA+B,IAAI,GACnE,CAAEgY,GAAaC,CAAe,IAAIjY,EAA+B,IAAI,GAGrEwW,IAAata,EAAY,CAACua,MACxBR,KAAOD,IAAY,KACP,KAAK,IAAIA,GAAK,KAAK,IAAIC,GAAKQ,CAAG,CAAC,IAC7BT,MAAQC,IAAMD,KAAQ,KAC1C,CAAEA,GAAKC,CAAI,CAAC,GAGTS,IAAuBxa,EAAY,CAACya,MAAqB;AAC3D,QAAI,CAACP,EAAS,QAAS,QAAOJ;AAE9B,UAAMY,IAAOR,EAAS,QAAQ,sBAAA,GACxBS,IAAU,KAAK,IAAI,GAAG,KAAK,IAAI,IAAIF,IAAUC,EAAK,QAAQA,EAAK,KAAK,CAAC,GACrEE,IAAWd,IAAMa,KAAWZ,IAAMD,IAGlCe,IAAe,KAAK,MAAMD,IAAWZ,CAAI,IAAIA;AACnD,WAAO,KAAK,IAAIF,GAAK,KAAK,IAAIC,GAAKc,CAAY,CAAC;AAAA,EACpD,GAAG,CAAEf,GAAKC,GAAKC,CAAK,CAAC,GAGfc,IAAa9a,EAAY,CAACya,GAAkBuB,MAA0B;AACxE,UAAMjB,IAAWP,EAAqBC,CAAO;AAE7C,QAAIuB,MAAU,OAAO;AACjB,YAAMC,IAAa,KAAK,IAAIlB,GAAUY,IAAW3B,CAAI;AACrD,MAAArW,KAAA,QAAAA,EAAW,CAAEsY,GAAYN,CAAS;AAAA,IACtC,OAAO;AACH,YAAMO,IAAa,KAAK,IAAInB,GAAUW,IAAW1B,CAAI;AACrD,MAAArW,KAAA,QAAAA,EAAW,CAAE+X,GAAUQ,CAAW;AAAA,IACtC;AAAA,EACJ,GAAG,CAAE1B,GAAsBkB,GAAUC,GAAU3B,GAAMrW,CAAS,CAAC,GAGzDqX,IAAkBhb,EAAY,CAACgc,MAA0B,CAACtc,MAAyB;AACrF,IAAIgI,MACJhI,EAAE,eAAA,GACFmK,EAAcmS,CAAK,GACnBD,EAAeC,CAAK,GACpBlB,EAAWpb,EAAE,SAASsc,CAAK;AAAA,EAC/B,GAAG,CAAEtU,GAAUoT,CAAW,CAAC;AAE3B,EAAA7a,EAAU,MAAM;AACZ,QAAI,CAAC2J,EAAY;AAEjB,UAAMqR,IAAkB,CAACvb,MAAmB;AACxC,MAAAob,EAAWpb,EAAE,SAASkK,CAAU;AAAA,IACpC,GAEMsR,IAAgB,MAAM;AACxB,MAAArR,EAAc,IAAI;AAAA,IACtB;AAEA,oBAAS,iBAAiB,aAAaoR,CAAe,GACtD,SAAS,iBAAiB,WAAWC,CAAa,GAE3C,MAAM;AACT,eAAS,oBAAoB,aAAaD,CAAe,GACzD,SAAS,oBAAoB,WAAWC,CAAa;AAAA,IACzD;AAAA,EACJ,GAAG,CAAEtR,GAAYkR,CAAW,CAAC;AAG7B,QAAMK,IAAmBnb,EAAY,CAACgc,MAA0B,CAACtc,MAAyB;AACtF,IAAIgI,MACJmC,EAAcmS,CAAK,GACnBD,EAAeC,CAAK,GACpBlB,EAAWpb,EAAE,QAAQ,CAAC,EAAE,SAASsc,CAAK;AAAA,EAC1C,GAAG,CAAEtU,GAAUoT,CAAW,CAAC;AAE3B,EAAA7a,EAAU,MAAM;AACZ,QAAI,CAAC2J,EAAY;AAEjB,UAAMwR,IAAkB,CAAC1b,MAAmB;AACxC,MAAAA,EAAE,eAAA,GACFob,EAAWpb,EAAE,QAAQ,CAAC,EAAE,SAASkK,CAAU;AAAA,IAC/C,GAEMyR,IAAiB,MAAM;AACzB,MAAAxR,EAAc,IAAI;AAAA,IACtB;AAEA,oBAAS,iBAAiB,aAAauR,GAAiB,EAAC,SAAU,IAAM,GACzE,SAAS,iBAAiB,YAAYC,CAAc,GAE7C,MAAM;AACT,eAAS,oBAAoB,aAAaD,CAAe,GACzD,SAAS,oBAAoB,YAAYC,CAAc;AAAA,IAC3D;AAAA,EACJ,GAAG,CAAEzR,GAAYkR,CAAW,CAAC;AAG7B,QAAMlV,IAAgB5F,EAAY,CAACgc,MAA0B,CAACtc,MAA4B;AACtF,QAAIgI,EAAU;AAEd,UAAM0P,IAAe4E,MAAU,QAAQN,IAAWC;AAClD,QAAIZ,IAAW3D;AAEf,YAAQ1X,EAAE,KAAA;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AACD,QAAAA,EAAE,eAAA,GACFqb,IAAW,KAAK,IAAI3D,IAAe4C,GAAMD,CAAG;AAC5C;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AACD,QAAAra,EAAE,eAAA,GACFqb,IAAW,KAAK,IAAI3D,IAAe4C,GAAMF,CAAG;AAC5C;AAAA,MACJ,KAAK;AACD,QAAApa,EAAE,eAAA,GACFqb,IAAWiB,MAAU,QAAQlC,IAAM4B,IAAW1B;AAC9C;AAAA,MACJ,KAAK;AACD,QAAAta,EAAE,eAAA,GACFqb,IAAWiB,MAAU,QAAQjC,IAAM4B,IAAW3B;AAC9C;AAAA,MACJ,KAAK;AACD,QAAAta,EAAE,eAAA,GACFqb,IAAW,KAAK,IAAI3D,IAAe4C,IAAO,IAAID,CAAG;AACjD;AAAA,MACJ,KAAK;AACD,QAAAra,EAAE,eAAA,GACFqb,IAAW,KAAK,IAAI3D,IAAe4C,IAAO,IAAIF,CAAG;AACjD;AAAA,MACJ;AACI;AAAA,IAAA;AAGR,QAAIkC,MAAU,OAAO;AACjB,YAAMC,IAAa,KAAK,IAAIlB,GAAUY,IAAW3B,CAAI;AACrD,MAAArW,KAAA,QAAAA,EAAW,CAAEsY,GAAYN,CAAS;AAAA,IACtC,OAAO;AACH,YAAMO,IAAa,KAAK,IAAInB,GAAUW,IAAW1B,CAAI;AACrD,MAAArW,KAAA,QAAAA,EAAW,CAAE+X,GAAUQ,CAAW;AAAA,IACtC;AAAA,EACJ,GAAG,CAAExU,GAAUgU,GAAUC,GAAU7B,GAAKC,GAAKC,GAAMrW,CAAS,CAAC,GAEvDwY,IAAa7B,EAAWoB,CAAQ,GAChCU,IAAa9B,EAAWqB,CAAQ;AAEtC,SACI,gBAAAzd;AAAA,IAAC2I;AAAA,IAAA;AAAA,MACG,aAAa/F,KACT,gBAAAlB,EAACjB,GAAA,EAAI,mBAAe,IAChB,UAAA;AAAA,QAAA,gBAAAT;AAAA,UAACmI;AAAA,UAAA;AAAA,YACG,WAAU;AAAA,YACV,OAAAvF;AAAA,YACA,SAAST;AAAA,UAAA;AAAA,QAAA;AAAA,QAEb,gBAAAT,EAAC0C,GAAA,EAAK,WAAU,eACX,UAAA;AAAA,UAAAoZ;AAAA,UAAS;AAAA,UAAQC;AAAA,UAAU9B,KAAUA;AAAA,QAAA,EAAA,CAC1C;AAAA,MAAA,GACJ;AAAA,MAEJ,UAAA9S;AAAA,MACA,WAAAC;AAAA,MACA,MAAA9J;AAAA,MACC,GAAGgJ;AAAA,MAEJ,UAAA,gBAAAtG;AAAA,QAACjB;AAAA,QAAA;AAAA,UACG,KAAKub;AAAA,UACL,mBAAe;AAAA,UACf,WAAWxS,IAAW,aAAa;AAAA,UACnC,MAAK;AAAA,UACL,mBAAiB5G,IAAQ,GAAGT,CAAE,WAAW;AAAA,UAGzC,UAAA;AAAA,YAAA,gBAAAnC,EAACS,GAAA,EAAI,WAAU,eAAc,eAAY,QAAO;AAAA,YAGhD,gBAAAT;AAAA,cAACS;AAAA,cAAA;AAAA,gBACG,WAAU;AAAA,gBACV,OAAO;AAAA,kBACH,MAAQ,GAAGwd,CAAU;AAAA,kBACrB,OAAQ,GAAG,MAAMC,CAAU;AAAA,gBAAA;AAAA,gBAE/B,eAAY;AAAA,cAAA;AAAA,YAAA;AAAA,YAIhB,gBAAAle;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,KAAK0d;AAAA,gBACL,IAAI,GAAGvb,CAAE;AAAA,gBACT,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,OAAO,EAAC,MAAO,GAAG8b,CAAU,IAAA;AAAA,gBAC5B,UAAAzU;AAAA,gBACA,aAAasT,EAAgB,KAAK;AAAA,gBAClC,cAAcG,EAAiB,KAAK;AAAA,gBACpC,WAAWvV,EAAc,KAAK;AAAA,gBAC9B,SAAS,MAAMmW,EAAe,KAAK;AAAA,gBACnC,QAAQ,MAAMA,EAAe,IAAI;AAAA,gBACjC,eAAaD,MAAgB,SAASlS,MAAe;AAAA,gBACrD,MAAK;AAAA,gBACL,cAAY0R;AAAA,gBACZ,iBAAexB;AAAA,gBACf,iBAAe6B,IAAW3B;AAAA,gBAC1B,iBAAe0B;AAAA,gBACf,kBAAgB,GAAGA,CAAQ,GAAG7B,IAAS,IAAIA,CAAM,KAAK,EAAE;AAAA,gBACxD,oBAAiB;AAAA,cAAA;AAAA,YAAA;AAAA,YAIrB,gBAAA3b;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,KAAK2d;AAAA,gBACL,IAAI,GAAGxb,CAAE;AAAA,gBACT,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,OAAO,EAAC,MAAO,GAAG+b,CAAU,IAAA;AAAA,gBAC5B,UAAA1U;AAAA,gBACA,aAAasT,EAAgB,KAAK;AAAA,gBAClC,cAAcG,EAAiB,KAAK;AAAA,gBACpC,WAAWvV,EAAc,KAAK;AAAA,gBAC9B,SAAS,MAAMmW,EAAe,KAAK;AAAA,gBACnC,QAAQ,MAAMA,EAAe,IAAI;AAAA,gBACjC,eAAaD,MAAgB,SAASlS,MAAe;AAAA,gBACrD,MAAK;AAAA,gBACL,cAAY2R;AAAA,gBACZ,iBAAeG,IAAW1B;AAAA,gBAC1B,iBAAeD;AAAA,gBACf,iBAAe4B;AAAA,gBACf,kBAAgB,GAAGA,CAAQ,GAAG9B,IAAS,IAAIA,CAAM,KAAK,EAAE;AAAA,gBACxD,oBAAiB;AAAA,cAAA;AAAA,YAAA;AAAA,UACrB;AAAA,QAAA;AAAA,MAAA;AAAA,IACJ;AAAA,EAAA;AAGZ;AAEAF,GAAe,cAAc;AC/gBtB,MAAM0C,KAAQviB,EAAM;AAAA,EACvB,CAAC;AAAA,IACG,OAAAgH;AAAA,IACA,OAAAmH;AAAA,IACA,QAAAlC;AAAA,IACA,QAAA8T;AAAA,IACA,mBAAAyC;AAAA,IACA,WAAAriB;AAAA,IACA,aAAA8G;AAAA,IACA,KAAA+Y;AAAA,IACA,KAAAC;AAAA,IACA,KAAAwC;AAAA,IACA,MAAAC;AAAA,IACA,SAAAC;AAAA,IACA,GAAGriB;AAAA,EAAA,GACSC,MAAsC;AAClD,UAAMqiB,IAAyBD,KAC1BA,IAAU3C,MAAQC,IAAMD,KACzB,MAAM,GAEJ6C,IAAsB,MAAM;AAC9B,YAAMC,KACD3U,IAAQ6R,MAAQC,IAAMD,KACvB;AACJ,UAAI+C;AAEJ,aAAI5U,KAASsU,IACTM,IAAS,QACF5U,KAASuU,IAChBK,IAAS,SAETA,IAAS,UAGN,oBAAoB5U,CAAK,GAAG4R,KAAU,EAAE,KAAK+C,EAAW,QAAQ,CAAC,CAAC,eAAeC,CAAM;AAAA,IAClG,GAGM,EAAC,cAAA3W,GAAc,YAAAC,MAAcF,GAAqB7L,CAAK;AAE7D,WACI,gBAAAwF;AAAA,MAAC/F;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,MAAK;AAAA,QACL,cAAYI,KAAa;AAAA,QACxB,GAAGiM;AAAA,QAEH,UAAA;AAAA,UAAApF,KACG,gBAAAlB;AAAA,YAAC/F;AAAA,YAAA;AAAA,cACG,IAAG;AAAA,cACH,mBAAe;AAAA,cACf,IAAI,eAAeiH,EAAM,YAAA,EAAc,QAAQ,QAAQ,GAAG,CAAC;AAAA,cAE3D,UAAA;AAAA,gBAAA,gBAAA5C,EAACoE,KAAM,UAAAxB,EAAA,CAAM;AAAA,kCACZwB,GAAA,EACI,UAAA;AAAA,kBAAA2F;AAAA,kBACA4R,KAAUA;AAAA,gBAAA,EAAA,CACf;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAIR,gBAAAja;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,WAAU;AAAA,cACV,MAAK;AAAA,cAEL,UAAA;AAAA,gBAAA,gBAAA1B;AAAA,kBAACrE;AAAA,kBAAA;AAAA,oBACG,IAAG;AAAA,oBACH,cAAU;AAAA,oBACV,KAAAQ;AAAA,oBACA,OAAA4N;AAAA,oBACA,KAAA6R;AAAA,oBACA,KAAAC;AAAA,oBACA,KAAAwC;AAAA,oBACA,MAAAC;AAAA,oBACA,SAAAC;AAAA,oBACC,GAAGtW;AAAA,oBACJ,OAAO,EAAC,QAAAJ,EAAA;AAAA,oBACR,cAAYjF,KAAS7G,KAAa;AAAA,oBAClC,iBAAe6f;AAAA,oBACf,iBAAeC;AAAA,oBACf,iBAAe9R;AAAA,oBACf,kBAAgB0U,EAAA;AAAA,oBAChB,oBAAkB5b,IAAc,qBAAqBD,KAAA,gBAAAA,EAAO,cACvD,QAAQ,QAAQ,IAAI,KAAK;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGjCwb,KAAqBG,KAClB,gBAAAve;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACG,WAAU;AAAA,oBACV,OAAO,EAAC,MAAO,QAAQwe,CAAsB,iCAAA;AAAA,oBAC7C,OAAO,YAAYD,CAAO;AAAA,oBAC1B,MAAK;AAAA,oBACL,eAAY;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAChB;AAAA,YAAA;AAAA,UAAA;AAAA,UAIP1b,KACG,gBAAA7C;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,IAAI,qBAAqB4C,KAAA,gBAAAA,EAAO,cAAc,QAAQ,QAAQ,IAAI;AAAA,cAClE,WAAU;AAAA,cAET,UAAAC;AAAA,YAAA;AAAA,UAAA;AAAA,QACL;AAAA,MAAA;AAAA,IAAA;AAAA,EAIhB;AACJ;AACAsb,GAAM,cAAc;AC1Hb,MAAMS,KAAQhjB,EAAM;AAAA,EACvB,CACI;AAAA,IACI,IAAAuG;AAAA,IACA,UAAAhB;AAAA,IACA,YAAA1F,IAAa,CAAA;AAAA,IACb,QAAA2G,IAAS;AAAA,IACT,SAAAC;AAAA,IACA,eAAAE,IAAgB;AAAA,IAChB,cAAAsc;AAAA,IACA,cAAAC;AAAA,IACA,OAAAlc;AAAA,IACA,aAAAC;AAAA,IACA,GAAG3G;AAAA,EAAA,GACQC,MACd;AACD,UAAM4iB,IAAgB,GAAG5c,CAAE,IACrBY,IAAgBF,IAAc,GAAGkc,CAAO,iBAAiB;AAE/D,WAAIF,KACApjB,EAAW,KAAK,eAAe,GAG/BqjB,KACArjB,EAAW,KAAK,eAAe,GAInCsG,EAAU,MAAM;AACZ,YAAMid,IAAQ,SAAS,cAAc,IAAID,CAAO,cAAc;AAC9D,UAAI,GAACC,KAAS,EAAEA,aAAiB;AAEjC,YAAI5c,GAAQ;AAER,UAAA4c,EAAM,YAAA;AAGN,gBAAMC,IAAoBD,EAAM;AAAA,YAC5B;AAAA,UAAA;AAEJ,UAAIC,EAAkB,UACjBA,EAAkB,CAAC,EAAkB,MAAA;AAAA,QAE9C;AAEI,UAAID,EAAM,QAAQ,eAAe,KAC7BA,EAAM,YAAA;AAAA,IAGlB,GAAG,CAAC5c,GAAQ2c,CAAO,CAAC,GAIpBhd,EAAU,MAAM;AACZ,YAAMid,IAAQ,SAAS,cAAc,IAAID,CAAO,cAAc;AAC9D,UAAI,CAACC,KAAS,EAAEA,aAAiB,aAAc;AAE/C,YAAME,IAAe,CAAC1d,MAAa;AAG/B,QAFoBA,EAEJ,aAAa,YAAYY,KAAUC,KAC/CA,EAAA;AAAA,MAER;AAEA,aAAA2c,EAAM,iBAAiB,UAAUE,CAAY,GACtC,MAAMF,EAAM,oBAAoB,UAAUE,CAAY;AAAA,IACjE,GAAG,CAACH,GAAS3c,GAAQC,CAAO,CAAC,GAGzB,gBAAAX;AAAA,MAAC/F;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,IAAIojB;AAAA,QACJ,cAAU;AAAA,QAEV,SAASxc,IAAgB,SAAS;AAAA,QAClC,KAAApG;AAAA,QACA,YAAAV;AAAA,QACA,MAAK;AAAA,QACL,cAAW;AAAA,QACX,cAAYmH,KAAS;AAAA,QACrB,oBAAkBG;AAAA,QACjB,GAAG7G;AAAA,QAEH,UAAA;AAAA,UAAAqG,KAAiBF,KACd,gBAAArC;AAAA,YAACoE;AAAA,YAAA;AAAA,cACG,WAAU;AAAA,cACV,SAAS/B;AAAA,cACT,cAAW;AAAA,cACX,UAAU;AAAA,cACb,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAIJQ,KACG,gBAAA7C,EAAC,OAAA,EAAI,IAAI+C,GAAe,WAAU,WAC7B,UAAAF,GACL;AAAA,UAEJ,gBAAA7C,EAAC,OAAA,EAAI,MAAK,YACL,UAAAmB,EAAA,CACL;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGZ;AACJ;AACAyd,GAAM,cAAc;AC7Gb,MAAMO,KAAuBvjB,EAAM;AAAA,EACtC,CACI;AAAA,IACI,UAAA0G,IAAW;AAAA,IACX,QAAA8c,IAAS;AAAA,IACT,OAAAC,IAAQ;AAAA,IACR,MAAA5b,IAAO;AAAA,IACP,UAAAtC;AAAA,IACA,OAAAyB;AAAA,IACA,GAAG1G;AAAA,EAAA,GAEPC,MACC;AACD,QAAIV,IAAa,CAAA;AAOjB,WANI6G,KAAU7G,EAAW,KAAK6G,CAAQ,GAClC8c,KAAQ3jB,EAAW,KAAK2jB,CAAM,GAC9BC,KAAO5jB,EAAW,KAAK4jB,CAAK,GAC5B5b,KAAMhI,EAAW,KAAKgI,CAAI,GAER7H,EAAM,SAAS,MAAMuF,CAAQ,MAC7B,IAAU,OAG5B,gBAAAnB;AAAA,MAACrE;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,8BAA0B;AAAA,QAC1B,KAAAQ;AAAA,QACA,YAAAV;AAAA,QACA,cAAYmH,KAAS;AAAA,QACrB,iBAAc;AAAA,QACd,MAAK;AAAA,QACJ,GAAG1G;AAAA,QAEH,UAAAiF;AAAA,MAAA;AAAA,IAAA;AAAA,EAGb;AACJ;AACAge,GAAqB,cAAc;ACrCnC,MAAMG,KAA4C;AAAA,EAC9C,SAAU;AAAA,EACV,MAAU;AAAA,EACV,SAAU;AAAA,EACV,OAAU;AAAA,EACV,SAAU;AACd,GAGaC,KAAmB,CAAC;AAAA,EAC7B,IAAApd;AAAA,EACA,MAAAsB,IAAO;AAAA,EACP,UAAA+b,IAAW;AAAA,EACX,eAAAjd,IAAgB;AAAA,EAChB,SAAAF;AAAA,EACA,UAAAlB;AACJ,MAA6B;AACzB,QAAM,CAACse,GAAWC,CAAY,IAAI9Z,EAAS,EAAK;AAEhD,EAAA7D,EAAU,MAAM;AACZ,QAAIyd,MAAa,EAAG;AAEpB,UAAMG,IAAQ,WAAW,MAAM;AAC3B,MAAAD,EAAa,EAAI;AAAA,IACrB,GAAGF,IAAW,GAAI;AAElB,WAAO,MAAM,aAAaG,CAAK;AAAA,EACnC,GAAG,CAACH,CAAQ,CAAC,GAGbzd,EAAU,MAAM;AACZ,QAAI,CAAC0d,EAAW;AAEhB,UAAMG,IAAgB,WAAW,MAAM;AACnC,MAAAvd,EAAA;AAAA,IACJ,GAAG,GAAG;AAEN,WAAO,MAAM,aAAaud,CAAa;AAAA,EAC3C,GAAG,CAACH,GAAWpd,CAAO,CAAC;AAEvB,QAAMwd,IAAqB,CAAC5d,MAA4C;AACpE,IAAAA,EAAM,eAAA,GACNyd,EAAa,EAAI;AAAA,EACrB,GAEMhY,IAAgB,CAACzF,MAA+B;AAClD,KAAIA,EAAM,QAAQ,WAAWA,EAAM,QAAQ,SACvCA,EAAM,eAAA,GACNyd,EAAa,EAAI;AAAA,EAEzB,GAEMI,IAAsB,MAAM;AAC9B,IAAIL,KACApd,EAAA;AAAA,EAER,GAEM5G,IAAuB,CAACgI,CAAI;AAClC,SAAIlB,KAAe9G,EAAW,KAAK,aAAa,GAC5CgkB,KAAWhkB,EAAW,KAAK,WAAW,GAGtC,gBAAAiG;AAAA,IAAC/F;AAAA,IAAA;AAAA,MACG,IAAG;AAAA,MACH,0BAAsB;AAAA,MACtB,IAAAwG;AAAA,MACA,YAAA1G;AAAA,MACA,iBAAiBqkB;AAAA,MACjB,MAAMR,GAAQ7b,CAAI;AAAA,MAClB,aAAWA,MAAS,WAAWA,MAAS,YAAY,cAAc;AAAA,MAClE,eAAY;AAAA,MAEZ,UAAA;AAAA,QAAA,gBAAAzD,EAAC,OAAA,EAAI,WAAU,wBACV,UAAAmB,EAAA,CACL;AAAA,QAECoB,KACG,gBAAAvC;AAAA,UAACS;AAAA,UAAA;AAAA,YACG,WAAU;AAAA,YACV,SAASof;AAAA,YACT,WAAWnY;AAAA,YACX,cAAW;AAAA,YACX,UAAU;AAAA,YAEV,UAAA,gBAAA1H,EAAC,QAAA,EAAK,WAAU,WAAU,UAAA,qBAAA,CAAkB;AAAA,UAAA;AAAA,QAAA;AAAA,MAChD;AAAA,IAAA;AAAA,EAAA;AAIhB;AACAuf,GAAiB,cAAc;ACtE/B,MAAMQ,KAAuBC,GAAgD,IAAI,GAGpEC,KAAwB,CAAC;AAAA,EAClC,UAAA9e;AAAA,EACA,UAAAmB,IAAW;AAAA,EACX,QAAA8c,IAAS;AAAA,EACT,OAAAC,IAAQ;AAAA,EACR,MAAA5b,IAAO;AACX,MAAkC;AAC9B,QAAM,CAACyc,GAAeC,CAAgB,IAAIva,EAAiC,CAAA,CAAE,GAGvEwa,IAAqBte,EAAY,CAACK,MAAe;AACnD,IAAAge,EAAiB,OAAQpJ,EAAK,OAAO,OAAKsJ,EAAE,OAAOle,CAAE,CAAC;AAAA,EAC1D,GAAG,CAAA,CAAE,GAGCme,IAAkBxe,EAAY,CAChCiF,GACAtD,IAAyB,WACzB+b,IAAmB,GACnBjd,IAAyB,OACxB;AACD,UAAMJ,IAAK,gBAAgB,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAEnF,WAAAge,EAAiB,CAAApJ,MAAQ,CAAC,GAAGA,GAAM;AAAA,MAC/B,IAAA5U;AAAA,MACA,SAAA4E;AAAA,MACA,MAAAtD;AAAAA,MACA,UAAA+b;AAAA,MACA,eAAAjd;AAAA,IAAA,CACH,CAAC,GAEKJ;AAAA,EACX,GAAG,CAAA,CAAE,GAGCoe,IAAaze,EAAY,CAC3B0e,MACC;AAED,QAAI,OAAOA,KAAqB,UAAU;AACtC,MAAAF,EAAgBE,CAAgB;AAChC;AAAA,IACJ;AAGA,QACIA,MAAqB,QACrB,OAAOA,KAAqB,YAC5B,aAAaA,GACf;AACE,YAAMC,IAAOD;AACb,MAAAF;AAAA,QACIG,EAAK;AAAA,QACLA,EAAK,QAAQ;AAAA,QACbA,EAAK,YAAY;AAAA,QACjBA,EAAK,iBAAiB;AAAA,MAAA;AAE1B;AAAA,IACJ;AAGA,IAAAH,EAAgBE,CAA6B;AAAA,EACjD,GAAG,CAACF,CAAe,CAAC,GAGdI,IAAS5e,EAAY,MAAM;AAC7B,UAAM6e,IAAKJ;AAEX,WAAAI,EAAG,UAAU,CAACC,MAAgC;AAC1C,MAAAN,EAAgBM,GAAS,SAAS;AAAA,IACtC,GAEAD,EAAG,QAAQ,CAACC,MAAgC;AACxC,MAAAN,EAAgBM,GAAS,OAAO;AAAA,IACpC,GAEAD,EAAG,UAAU,CAACC,MAAgC;AAC1C,MAAAN,EAAgBM,GAAS,SAAS;AAAA,IACtC,GAEAD,EAAG,OAAO,CAACC,MAAgC;AACvC,MAAAN,EAAgBM,GAAS,MAAM;AAAA,IACnC,GAEOD;AAAA,EACX,GAAG,CAACJ,GAAYD,CAAe,CAAC,EAAA;AAEhC,2BACKP,GAAqB,UAArB,EAA8B,OAAO,EAAE,QAAAW,KACnC,UAAA;AAAA,IAAAvf;AAAA,IAED,gBAAAnB;AAAA,MAACmf;AAAA,MAAA;AAAA,QACG,UAAA7c;AAAA,QACA,QAAA8c;AAAA,QACA,OAAAC;AAAA,QACA,MAAA5b;AAAA,QAEC,UAAAyc,EAAc,IAAI,CAAC,EAAE,IAAA/d,GAAI,SAAA4E,GAAS,MAAAtD,GAAM,UAAA+b,GAAU,eAAAjd,EAAA,MAC/C,gBAAAvC;AAAA,UAACuf;AAAA,UAAA;AAAA,YAEG,IAAApd;AAAA,YACA,MAAMsB;AAAAA,YACN,UAAA+b;AAAA,YACA,eAAAjd;AAAA,YACA,SAAS,MAAM6d,EAAmBje,CAAE;AAAA,YAEnC,UAAA,OAAO4E,KAAY,aACdA,EAAQ,EAAE,OAAO,MAAMqZ,EAAmBje,CAAE,EAAA,CAAG,IAC/C4E;AAAA,UAAA;AAAA,UATD5E;AAAA,QAAA,CAYZ;AAAA,MAAA;AAAA,IAAA;AAAA,EACL,GACJ;AAER;AACA8d,GAAsB,cAAc;AAG7B,MAAMY,KAAmB,MAAsB;AAClD,QAAMC,IAAUC,GAAWhB,EAAoB;AAE/C,MAAI,CAACe;AACD,UAAM,IAAI,MAAM,8DAA8D;AAGlF,SAAOA,EAAQ;AACnB,GC7JaE,KAAUplB,EAAM;AAAA,EAAW,CAChC;AAAA,IACI,MAAAoD,IAAO;AAAA,IACP,aAAAiiB,IAAc;AAAA,IACd,GAAG/kB;AAAA,EAAA,GAEPC,MACC;AACD,QAAIV,IAAa,CAAA;AAEjB,WAAIuD,KACAvD,EAAW,KAAK,QAAQuD,CAAI,EAAE,GAI9B,gBAAAgB;AAAA,MAACrE;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,gBAAY;AAAA,QACZ,KAAAQ;AAAA,QACA,YAAAV;AAAA,QACA,MAAK;AAAA,QACL,aAAU;AAAA,QACV,aAAU;AAAA,QACV,cAAYwlB;AAAA,QACX,GAAG/kB;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhB;AACJ;AACA8kB,GAAQ,cAAc;AClDtB,MAAMva,KAAQ,CAACya,GAAeC,MAAgB;AAC1C,QAAM/Z,IAAS+Z,IAAMD,IAAQ;AAC7B,SAAO,MAAM,KAAK,EAAE,QAAA9Z,EAAA,GAAU,CAACxH,GAAGkS,MAAMoP,IAAQpP,CAAC;AACrD,GAiBasP,KAAgB,CACzB;AAAA,EACI,YAAAC;AAAA,EACA,aAAAC;AAAA,EACA,qBAAAC;AACJ,MAA+C;AAC/C,QAAMC,IAAaH;AAwCnB,SAAO;AAAA,IACH,QAvCW,MAAM;AACjB,YAAMI,IAAeF,IAAsB,IAAI;AAC/C,UAAIG,IAAmC,CAAA;AAEvC,UAAIF,KAAcC;AAEd,QAAAC,IAAcjb,GAAM,GAAG+a,CAAU;AAAA,WAC9B;AACH,cAAMG,IAAkB,KAAK,IAAIL,IAAc,GAAGC,CAAmB,GAC/DK,IAAmB,KAAK,IAAIJ,IAAaF,GAAaC,CAAmB;AAG/E,QAAAG,EAAY,KAAK,CAAC,GAGdJ,IAAcC,IAAsB,KACpCG,EAAY,KAAK,KAAK;AAI1B,cAAMG,IAAa,KAAK,IAAI,GAAGP,IAAcK,CAAe,GACtDG,IAAW,KAAK,IAAIN,IAAa,GAAGF,IAAcM,CAAgB;AACxE,QAAAF,EAAY,KAAK,GAAGjb,GAAMob,GAAYC,CAAQ,CAAC,GAG3CN,IAAaF,IAAcC,IAAsB,KACjDG,EAAY,KAAK,KAAK,GAItBI,IAAWN,KACXE,EAAY,KAAKF,CAAU;AAAA,MAEnC;AAEA,aAAOE;AAAA,IACX,GAAA;AAAA,IAII,YAAAF;AAAA,IACA,YAAYF;AAAA,IACZ,UAAUA;AAAA,IACV,aAAaA,IAAc;AAAA,IAC3B,aAAaA,IAAcE;AAAA,EAAA;AAEnC,GCzDMO,KAAoB,CACtB;AAAA,EACI,MAAAzU;AAAA,EACA,MAAA0U;AAAA,EACA,UAAAC;AAAA,EACA,UAAAzY;AAAA,EACA,SAAA0Y;AAAA,EACA,KAAAha;AAAA,EACA,GAAGhM;AACP,MAAuB;AACvB,MAAIoR,MAAS;AACT,WACI,gBAAAtN,EAACoE,GAAA,EAAK,WAAU,uBAAsB,UAAA,OAAG;AAIjD,QAAM+d,IAAsB;AAAA,IACxB,MAAY;AAAA,IACZ,WAAY,mBAAmBF,IAAW,aAAa,EAAE,IAAIzY,IAAW,aAAa,EAAE;AAAA,IACvF,SAAA0Y;AAAA,IACA,UAAA1Y;AAAA,IACA,GAAGtN;AAAA,EAAA;AAGP,MAAI6K;AACJ,UAAQuG,GAAA;AAAA,IACJ,KAAK;AACD,MAAAvG,IAAUA,IACN,gBAAArF,EAAC,OAAA,EAAI,SAAQ,aACT,UAAA;AAAA,QAAA,gBAAA1B,EAAC,QAAA,EAAK,IAAG,KAAI,IAAG,MAAK,IAAG,KAAI,IAAG,IAAA,CAAI;AAAA,QACnC,gBAAAA,EAAC,YAAA,EAAS,QAAO,kBAAA,CAAkB;AAAA,QACnC,gBAAAA,EAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,MAAA,GAC1C;AAEJ;AAAA,IACJ,KAAK;AACD,MAAA+G,IACI,gBAAArF,EAAC,OAAA,EAAI,SAAQ,aACT,UAAA;AAAA,QAAA,gBAAA1B,EAAC,YAAA,EAAS,QAAO,kBAAA,CAAkB;AAAA,QACnC,gBAAAA,EAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,MAAA,GACzC;AAEJ;AAAA,IACJ,KAAK;AACD,MAAA+G,IAAUA,IACN,gBAAArF,EAAC,OAAA,EAAI,SAAQ,aACT,UAAA;AAAA,QAAA,gBAAA1B,EAAC,YAAA,EAAS,QAAO,mBAAA,CAAmB;AAAA,QACpC,gBAAAA,EAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAA,CAAK;AAAA,MAAA,GACzC;AAEJ;AAAA,IACJ,KAAK;AACD,MAAA+G,IAAUA,IACN,gBAAArF,EAAC,OAAA,EAAI,SAAQ,aACT,UAAA;AAAA,QAAA,gBAAA1B,EAAC,YAAA,EAAS,QAAO,mBAAA,CAAmB;AAAA,QACpC,gBAAAA,EAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,QACrC,gBAAAA,EAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAA,CAAK;AAAA,MAAA,GACzC;AAEJ;AAAA,IACJ;AACI,MAAA+G,IAAUib;AAAA,EAAA;AAGlB,SACI,gBAAAhiB;AAAA,IAACwD;AAAA,IAAA;AAAA,MACG,MAAK;AAAA,MACJ,GAAG2e;AAAA,MAEH,UAAApb;AAAA,IAAA;AAAA,EAAA;AAGb,GAGaqb,KAAaxmB,EAAM;AAAA,EAC5B,CACI;AAAA,IACI,YAAAylB;AAAA,IACA,aAAAC;AAAA,IACA,cAAAe;AAAA,IACA,qBAAAd,IAAsB;AAAA,IACtB,MAAA9d,IAAO;AAAA,IACP,yBAAA6e,IAA0B;AAAA,IAC1B,wBAAAC,IAAyB;AAAA,IACzB,oBAAAC,IAAqB;AAAA,IACrB,gBAAAC,IAAiB;AAAA,IACjB,eAAAC,IAAgB;AAAA,IAChB,UAAAlZ,IAAW;AAAA,IACX,qBAAAmZ,IAAsB;AAAA,IACtB,YAAAC,IAAab;AAAA,IACb,WAAApe,IAAY;AAAA,IACZ,aAAAsd;AAAA,IACA,WAAA4B;AAAA,IACA,iBAAAC,IAAkB;AAAA,IAClB,GAAG5mB;AAAA,EAAA,GACaC,MAA0C;AAC9D,UAAM;AAAA,MACI,OAAA4mB;AAAA,MACA,YAAAvB;AAAA,MACA,YAAAK;AAAA,MAEA,aAAAmB;AAAA,MACA,aAAAC;AAAA,IAAA,IACA7B,GAAc;AAAA,MACpB,YAAAC;AAAA,MACA,aAAAC;AAAA,MACA,qBAAAC;AAAA,IAAA,CACH,GAEK,CAAE2B,GAAUC,CAAY,IAAIvnB,EAAM,SAAS,EAAE,GAE7CwnB,IAAwB,CAAC5hB,MAA2C;AACtE,MAAA2hB,EAAY3hB,EAAE,OAAO,KAAK;AAAA,IAC9B,GAEM6hB,IAA0B,CAAC7hB,MAA6C;AAC1E,UAAIA,EAAE,QAAQ,SAAS;AACnB,cAAMwgB,IAAO,SAASkB,CAAQ;AAC9B,QAAI,CAAC,MAAMlB,CAAI,KAAKA,KAAQ,KAAKA,KAAQR,MACrCa,EAAaL,CAAI,GACjBmB,EAAY,EAAE;AAAA,MAEtB;AAAA,IACJ;AAEA,QAAI9B,MAAe;AACf,aAAO,gBAAArhB,EAACoE,GAAA,EAAK,WAAU,oBAAoB,eAAa,uBAAsB;AAGlF,QAAI3I,IAAa,CAAE,YAAa;AAEhC,WAAIgI,KACAhI,EAAW,KAAKgI,CAAI,GAGpB+F,KACA/N,EAAW,KAAK,UAAU,GAG1BkI,KACAlI,EAAW,KAAK,SAAS,GAIzB,gBAAAiG;AAAA,MAAC/F;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,mBAAe;AAAA,QACf,KAAAQ;AAAA,QACA,YAAAV;AAAA,QACA,MAAK;AAAA,QACL,cAAW;AAAA,QACV,GAAGS;AAAA,QAEJ,UAAA;AAAA,UAAA,gBAAAwF,EAACjB,GAAA,EAAI,WAAU,uBAEV,UAAA;AAAA,YAAA6hB,MAA4B,CAACK,KAAuBK,MAAgBJ,EAAW;AAAA,cAC5E,MAAW;AAAA,cACX,UAAW,CAACI,KAAexZ;AAAA,cAC3B,UAAW;AAAA,cACX,SAAW,MAAM6Y,EAAa,CAAC;AAAA,YAAA,CAClC;AAAA,YAGAG,MAAuB,CAACG,KAAuBK,MAAgBJ,EAAW;AAAA,cACvE,MAAW;AAAA,cACX,UAAW,CAACI,KAAexZ;AAAA,cAC3B,UAAW;AAAA,cACX,SAAW,MAAM6Y,EAAaf,IAAc,CAAC;AAAA,YAAA,CAChD;AAAA,YAGAyB,EAAM,IAAI,CAACrnB,GAAMgJ,MAAU;AACxB,oBAAM4e,IAA6B5nB,MAAS,QACtC;AAAA,gBACE,KAAW,YAAYgJ,CAAK;AAAA,gBAC5B,MAAW;AAAA,gBACX,UAAW;AAAA,gBACX,UAAW;AAAA,cAAA,IAEb;AAAA,gBACE,KAAiBhJ,EAAK,SAAA;AAAA,gBACtB,MAAiB;AAAA,gBACjB,MAAiBA;AAAA,gBACjB,UAAiBA,MAAS4lB;AAAA,gBAC1B,UAAA9X;AAAA,gBACA,gBAAiB9N,MAAS4lB,IAAc,SAAS;AAAA,gBACjD,SAAiB,MAAMe,EAAa3mB,CAAc;AAAA,cAAA;AAG1D,qBAAOknB,EAAWU,CAAS;AAAA,YAC/B,CAAC;AAAA,YAGAb,MAAmB,CAACE,KAAuBM,MAAgBL,EAAW;AAAA,cACnE,MAAW;AAAA,cACX,UAAW,CAACK,KAAezZ;AAAA,cAC3B,UAAW;AAAA,cACX,SAAW,MAAM6Y,EAAaf,IAAc,CAAC;AAAA,YAAA,CAChD;AAAA,YAGAiB,MAA2B,CAACI,KAAuBM,MAAgBL,EAAW;AAAA,cAC3E,MAAW;AAAA,cACX,UAAW,CAACK,KAAezZ;AAAA,cAC3B,UAAW;AAAA,cACX,SAAW,MAAM6Y,EAAab,CAAU;AAAA,YAAA,CAC3C;AAAA,YAEA7d,KACG,gBAAAjC,EAACjB,GAAA,EAAI,WAAU,sBACX,UAAA;AAAA,cAAA,gBAAAT,EAACghB,IAAA,EAAQ;AAAA,cACRC,KAAe,gBAAAjhB,EAACoE,GAAA,EAAK,MAAK,SAAS,UAAA6c,EAAA,CAAY;AAAA,YAAA,EAAA,CACpD;AAAA,UAAA,GAER;AAAA,UAEA,gBAAAvf,EAACjB,GAAA,EAAI,WAAU,mBACX,UAAA;AAAA,YAAA,gBAAAiB,EAAC0C,GAAA,EAAK,MAAK,QACN,UAAA;AAAA,cAAA0e;AAAA,cAAgB;AAAA,cAAEjB;AAAA,cAAW;AAAA,cAAKR;AAAA,YAAA,GACvC;AAAA,YAECqB,KACG,gBAAA1iB,EAACS,GAAA,EAAI,WAAU,oBACX,UAAA,gBAAAT;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,MAAK;AAAA,gBACL,KAAK;AAAA,gBACL,KAAKwhB;AAAA,gBACL,OAAO0B;AAAA,gBACP,UAAUE;AAAA,gBACV,WAAWC;AAAA,gBACX,aAAa,SAASP,CAAe;AAAA,gBACrC,cAAY,SAASA,CAAe;AAAA,gBACpC,UAAAtZ;AAAA,cAAA;AAAA,YAAA,EACJ,CACJ;AAAA,UAAA,EAAA,CAER;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGZ;AACJ;AACA4Y,GAAW,cAAc;AC9NlB,MAAMmB,KAAc3nB,EAAM;AAAA,EAC7B,CACI;AAAA,IACI,OAAAgH;AAAA,IACA,OAAAmH;AAAA,IACA,QAAAlC;AAAA,IACA,KAAAgU,IAAM;AAAA,IACN,OAAAld;AAAA,IACA,SAAAvC;AAAA,IACA,UAAAC;AAAA,IACA,WAAAO;AAAA,IACA,YAAAC;AAAA,IACA,GAAGX;AAAA,EAAA,GACeC,MAA4C;AAClE,UAAMqnB,IAAa,KAAK,IAAI,GAAG,KAAK,IAAI3H,GAAK,OAAO9R,CAAK,KAAK,CAAC,CAAC,GAC1D0Z,IAAe,GAAGD,CAAU,GAAGtnB,EAAM,UAAU,EAAE,IAGjDwnB,IAAmBrnB,KAAYD,GAC/BunB,IAAqB9mB,KAAcD,GAGnCgnB,IAA0C;AAAA,MAC5C,QAAA/b;AAAA,MACA,GAAI6b,KAAoB,EAAC,qBAAsB,SAASA,CAAgB,IAAA;AAAA,MACxE,GAAIC,KAAsB,EAAC,uBAAwB,SAASA,CAAkB,IAAA;AAAA,IAAG;AAGrF,WACI,gBAAAjiB,EAAA6B,IAAA,EACK,UAAA;AAAA,MAAAX,KACG,gBAAAlB;AAAA,QAAC/F;AAAA,QAAA;AAAA,UACG,IAAG;AAAA,UACH,0BAAsB;AAAA,UACtB,eAAY;AAAA,UAEZ,UAAA;AAAA,YAAA,gBAAAqE,EAACoE,KAAM,UAAAxB,EAAA,CAAM;AAAA,YACb,gBAAA5C,EAACoE,KACI,UAAAqf,EAAA,CACL;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAIR,gBAAAzjB;AAAA,QAACrE;AAAA,QAAA;AAAA,UACG,IAAG;AAAA,UACH,qBAAiB;AAAA,UACjB,KAAAQ;AAAA,UACA,OAAOqnB;AAAA,UACP,KAAA3H;AAAA,UACA,cAAYjZ;AAAA,UACZ,iBAAe;AAAA,UACf,iBAAeiZ;AAAA,UACf,iBAAe2H;AAAA,UACf,kBAAgB,GAAG5gB,IAAQ,GAAGA,CAAK,OAAO,EAAE,GAAG6gB,CAAY;AAAA,UAC3D,OAAA9kB;AAAA,UACC,GAAGzC;AAAA,UACJ,OAAO0nB;AAAA,QAAA;AAAA,MAAA;AAAA,IACX,GACJ;AAAA,EAER;AACJ;AACAL,GAAY,cAAc;ACpC1B,MAAMM,KAAqB7D,GAAsC;AAAA,EAC7D,YAAmB,MAAM;AAAA,EACzB,iBAAmB,MAAM;AAAA,EAAC;AAAA,EAC1B,cAAmB;AAAA,EACnB,cAAmB;AAAA,EACnB,WAAmB,MAAM;AAAA,EAAC;AAAA,EAC1B,YAAmB,MAAM;AAAA,EAAC;AAAA,EAC1B,eAAmB,MAAM;AAAA,EAAC;AAAA,EAC1B,gBAAmB,MAAM;AAAA,EAAC;AAAA,EAC1B,kBAAmB,MAAM;AAAA,EAAC;AAC9B,CAAC,GAGY8D,KAAmBloB,EAAM;AAAA,EAClC,CACI;AAAA,IACI,UAAAuF;AAAA,IACA,yBAAA4iB,IAA0B;AAAA,IAC1B,cAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,cAAAC,IAAe;AAAA,IACf,gBAAAjP;AAAA,IACA,oBAAAkP;AAAA,IACA,aAAaC;AAAA,IACb,GAAGloB;AAAA,EAAA,GAEPC,MACC;AAED,UAAMkoB,IAAeD,MAAoB,QAGnC,CAACE,GAAqBC,CAAsB,IAAI3e;AAAA,MAClDue,IAAqB,IAAI,IAAIA,CAAkB,wBAAQ,IAAA;AAAA,IAAI,GAEzDK,IAAsBvhB,EAA6B,oBAAI,KAAK,GAG5DwhB,IAAcJ,IAAeD,IAAkBE,GAG/CI,IAAoB5iB,EAAY,CAAC6iB,MAAwB;AAC3D,MAAKN,KACDE,EAAuBI,CAAM,GAEjCV,KAAA,QAAAA,EAAoBU;AAAA,IACxB,GAAG,CAACN,GAAcJ,CAAiB,CAAC,GAE9BW,IAAiB9iB,EAAY,CAACK,GAAYqH,MAAsB;AAClE,MAAAgb,EAAoB,QAAQ,IAAIriB,GAAIqH,CAAQ;AAAA,IAChD,GAAG,CAAA,CAAE,GAECqb,IAAmB/iB,EAAY,CAACK,MAAe;AACjD,MAAAqiB,EAAoB,QAAQ,OAAOriB,CAAE;AAAA,IACzC,GAAG,CAAA,CAAE,GAGC2iB,IAAkBhjB,EAAY,CAACK,MAAe;AAChD,YAAM4iB,IAAiB,IAAI,IAAIN,CAAW;AAC1C,UAAIV;AACA,YAAIgB,EAAe,IAAI5iB,CAAE;AACrB,UAAA4iB,EAAe,OAAO5iB,CAAE;AAAA,aACrB;AACH,cAAI8S,KAAkB8P,EAAe,QAAQ9P;AACzC;AAEJ,UAAA8P,EAAe,IAAI5iB,CAAE;AAAA,QACzB;AAAA;AAEA,QAAI4iB,EAAe,IAAI5iB,CAAE,KAAKsiB,EAAY,SAAS,IAC/CM,EAAe,MAAA,KAEfA,EAAe,MAAA,GACfA,EAAe,IAAI5iB,CAAE;AAG7B,MAAAuiB,EAAkBK,CAAc;AAAA,IACpC,GAAG,CAACN,GAAaV,GAAyB9O,GAAgByP,CAAiB,CAAC,GAGtEM,IAAYljB,EAAY,MAAM;AAChC,UAAI,CAACiiB,EAAyB;AAG9B,YAAMkB,IAAiB,MAAM,KAAKT,EAAoB,QAAQ,QAAA,CAAS,EAClE,OAAO,CAAC,CAAC5kB,GAAG4J,CAAQ,MAAM,CAACA,CAAQ,EACnC,IAAI,CAAC,CAACrH,CAAE,MAAMA,CAAE,GAGf+iB,IAAkBjQ,IAClBgQ,EAAe,MAAM,GAAGhQ,CAAc,IACtCgQ;AAEN,MAAAP,EAAkB,IAAI,IAAIQ,CAAe,CAAC;AAAA,IAC9C,GAAG,CAACnB,GAAyB9O,GAAgByP,CAAiB,CAAC,GAGzDS,IAAarjB,EAAY,MAAM;AACjC,MAAA4iB,EAAkB,oBAAI,KAAK;AAAA,IAC/B,GAAG,CAACA,CAAiB,CAAC,GAGhBU,IAAgBtjB,EAAY,MAAM;AACpC,UAAI,CAACiiB,EAAyB;AAQ9B,YAAMsB,IALiB,MAAM,KAAKb,EAAoB,QAAQ,QAAA,CAAS,EAClE,OAAO,CAAC,CAAC,GAAGhb,CAAQ,MAAM,CAACA,CAAQ,EACnC,IAAI,CAAC,CAACrH,CAAE,MAAMA,CAAE,EAGoB,OAAO,CAAAA,MAAM,CAACsiB,EAAY,IAAItiB,CAAE,CAAC,GAGpE+iB,IAAkBjQ,IAClBoQ,EAAkB,MAAM,GAAGpQ,CAAc,IACzCoQ;AAEN,MAAAX,EAAkB,IAAI,IAAIQ,CAAe,CAAC;AAAA,IAC9C,GAAG,CAACT,GAAaV,GAAyB9O,GAAgByP,CAAiB,CAAC,GAEtEY,IAAaxjB,EAAY,CAACK,MACrBsiB,EAAY,IAAItiB,CAAE,GAC1B,CAACsiB,CAAW,CAAC;AAGhB,IAAA7oB,EAAM,oBAAoBO,GAAK,OAAO;AAAA,MAClC,WAAA6oB;AAAA,MACA,YAAAG;AAAA,MACA,eAAAC;AAAA,IAAA,IACA,CAACJ,GAAWG,GAAYC,CAAa,CAAC;AAE1C,UAAMG,IAAe;AAAA,MACjB,YAAAD;AAAA,MACA,iBAAAR;AAAA,MACA,cAAAd;AAAA,MACA,cAAAE;AAAA,MACA,WAAAc;AAAA,MACA,YAAAG;AAAA,MACA,eAAAC;AAAA,MACA,gBAAAR;AAAA,MACA,kBAAAC;AAAA,IAAA;AAGJ,WACI,gBAAA7kB,EAAC6jB,GAAmB,UAAnB,EAA4B,OAAO0B,GAChC,UAAA,gBAAAvlB,EAACS,GAAA,EAAI,2BAAuB,IAAC,WAAW,QAAQyjB,CAAY,IACvD,UAAA/iB,GACL,GACJ;AAAA,EAER;AACJ;AACA2iB,GAAiB,cAAc;AAExB,MAAM0B,KAAgB,CAACrjB,MAAe;AACzC,QAAM2e,IAAUC,GAAW8C,EAAkB;AAC7C,SAAO;AAAA,IACH,YAAkB/C,EAAQ,WAAW3e,CAAE;AAAA,IACvC,iBAAkB,MAAM2e,EAAQ,gBAAgB3e,CAAE;AAAA,IAClD,cAAkB2e,EAAQ;AAAA,EAAA;AAElC,GAEa2E,KAAsB,MAAM;AACrC,QAAM,EAAE,WAAAT,GAAW,YAAAG,GAAY,eAAAC,EAAA,IAAkBrE,GAAW8C,EAAkB;AAC9E,SAAO,EAAE,WAAAmB,GAAW,YAAAG,GAAY,eAAAC,EAAA;AACpC,GAEaM,KAAwC,CAAC,EAAE,IAAAvjB,GAAI,UAAAhB,GAAU,UAAAqI,IAAW,IAAO,GAAGtN,QAAY;AACnG,QAAM,EAAE,YAAAopB,GAAY,iBAAAR,GAAiB,cAAAd,GAAc,gBAAAY,GAAgB,kBAAAC,EAAA,IAAqB9D,GAAW8C,EAAkB,GAC/G,CAAC8B,GAAcC,CAAe,IAAIhgB,EAAS,EAAK,GAChD,CAACigB,GAAgBC,CAAiB,IAAIlgB,EAAS,EAAI;AAGzD,EAAAhK,EAAM,UAAU,OACZgpB,EAAeziB,GAAIqH,CAAQ,GACpB,MAAMqb,EAAiB1iB,CAAE,IACjC,CAACA,GAAIqH,GAAUob,GAAgBC,CAAgB,CAAC;AAEnD,MAAIppB,IAAa,CAAA;AAEjB,EAAI6pB,EAAWnjB,CAAE,KACb1G,EAAW,KAAK,UAAU,GAG1B+N,KACA/N,EAAW,KAAK,UAAU,GAG1BkqB,KACAlqB,EAAW,KAAK,eAAe;AAGnC,QAAMsqB,IAAmB,MAAM;AAC3B,IAAIT,EAAWnjB,CAAE,KAAK,CAAC0jB,KACnBD,EAAgB,EAAI;AAAA,EAE5B,GAEMI,IAAmB,MAAM;AAC3B,IAAAJ,EAAgB,EAAK,GACrBE,EAAkB,EAAK;AAAA,EAC3B,GAEMG,IAAc,CAACzkB,MAAoD;;AACrE,IAAKgI,MACDsc,EAAkB,EAAI,GACtBF,EAAgB,EAAK,GACrBd,EAAgB3iB,CAAE,IAClBmE,IAAApK,EAAM,YAAN,QAAAoK,EAAA,KAAApK,GAAgBsF;AAAA,EAExB,GAEMkG,IAAgB,CAAClG,MAA2B;AAC9C,KAAKA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,QAAQ,CAACgI,MACzChI,EAAE,eAAA,GACFskB,EAAkB,EAAI,GACtBF,EAAgB,EAAK,GACrBd,EAAgB3iB,CAAE;AAAA,EAE1B;AAEA,SACI,gBAAAT;AAAA,IAAC/F;AAAA,IAAA;AAAA,MACG,IAAIqJ;AAAA,MACJ,oBAAgB;AAAA,MAChB,MAAK;AAAA,MACL,UAAUwE,IAAW,KAAK;AAAA,MAC1B,iBAAeA;AAAA,MACf,iBAAe8b,EAAWnjB,CAAE;AAAA,MAC5B,YAAA1G;AAAA,MACA,SAASwqB;AAAA,MACT,WAAWve;AAAA,MACX,cAAcqe;AAAA,MACd,cAAcC;AAAA,MACb,GAAG9pB;AAAA,MAEH,UAAA;AAAA,QAAA8nB,KACG,gBAAAtiB,EAAA6B,IAAA,EACI,UAAA;AAAA,UAAA,gBAAA7B,EAAC,OAAA,EAAI,SAAQ,aAAY,WAAU,aAC/B,UAAA;AAAA,YAAA,gBAAA1B,EAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,YAC/B,gBAAAA,EAAC,QAAA,EAAK,GAAE,qBAAA,CAAqB;AAAA,UAAA,GACjC;AAAA,UAEA,gBAAA0B,EAAC,OAAA,EAAI,SAAQ,aAAY,WAAU,iBAC/B,UAAA;AAAA,YAAA,gBAAA1B,EAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,YAC/B,gBAAAA,EAAC,QAAA,EAAK,GAAE,0BAAA,CAA0B;AAAA,UAAA,EAAA,CACtC;AAAA,QAAA,GACJ;AAAA,QAEHmB;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGb,GCrSa+kB,KAAiBtqB,EAAM;AAAA,EAChC,CACI;AAAA,IACI,WAAAuqB;AAAA,IACA,qBAAAzjB;AAAA,IACA,mBAAA0jB;AAAA,IACA,GAAGlqB;AAAA,EAAA,GACqBmqB,MAAwD;AAEpF,UAAMC,IAAcrjB,EAAuB,IAAI;AAG/C,IAAAwW,GAAoB4M,GAAc,MAAMC,EAAY,OAAO,GAE3D3kB,GAAgB2kB,GAAa,MAAM;AAC/B,MAAI,OAAO5jB,KAAwB,cAC/BA,EAAA;AAAA,IAER,CAAC;AAED,QAAIjH,IAAa,CAAA;AAEjB,WAAI0qB,KACA1qB,EAAW,KAAK,WAAW,GAG3B2qB,KACA3qB,EAAW,KAAK,cAAc,GAI9B,gBAAAuE;AAAA,MAACrE;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,wBAAoB;AAAA,QACpB,KAAK2qB;AAAA,QACL,YAAA7qB;AAAA,QACC,GAAGS;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhB;AACJ;AACAgqB,GAAe,cAAc;AC7CtB,MAAMK,KAAiB3qB,EAAM;AAAA,EAChC,CACI,EAAE,OAAAgH,GAAO,GAAG1G,EAAA,GAA8BC,MAGtC,gBAAA6D;AAAA,IAACrE;AAAA,IAAA;AAAA,MACG,IAAG;AAAA,MACH,wBAAoB;AAAA,MACpB,KAAAQ;AAAA,MACA,MAAK;AAAA,MACL,cAAYyG,KAAS;AAAA,MACpB,GAAG1G;AAAA,IAAA;AAAA,EAAA;AAIpB;AACAqqB,GAAe,cAAc;ACftB,MAAMC,KAAgB5qB,EAAM;AAAA,EAC/B,CAAC,EAAE,UAAA6qB,GAAU,GAAGvqB,EAAA,GAAgCC,MAA6C;AACzF,QAAIV,IAAa,CAAA;AAEjB,WAAIgrB,KACAhrB,EAAW,KAAK,WAAW,GAI3B,gBAAAuE;AAAA,MAACrE;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,uBAAmB;AAAA,QACnB,KAAAQ;AAAA,QACA,YAAAV;AAAA,QACC,GAAGS;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhB;AACJ;AACAsqB,GAAc,cAAc;ACLrB,MAAME,KAAc9qB,EAAM;AAAA,EAC7B,CACI,EAAC,UAAA+qB,GAAU,cAAAC,GAAc,WAAAC,GAAW,UAAA1lB,GAAU,GAAGjF,EAAA,GACjDC,MAA4C;AAC5C,QAAIV,IAAa,CAAA;AAEjB,WAAIkrB,KACAlrB,EAAW,KAAK,WAAW,GAG3BmrB,IACAnrB,EAAW,KAAK,gBAAgB,IACzBorB,KACPprB,EAAW,KAAK,aAAa,GAI7B,gBAAAiG;AAAA,MAAC/F;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,qBAAiB;AAAA,QACjB,KAAAQ;AAAA,QACA,YAAAV;AAAA,QACC,GAAGS;AAAA,QAEH,UAAA;AAAA,UAAA0qB,KAAgB,gBAAA5mB,EAACS,GAAA,EAAI,WAAU,qBAAA,CAAqB;AAAA,UACpDU;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGb;AACJ;AACAulB,GAAY,cAAc;AC5CnB,MAAMI,KAAgBlrB,EAAM;AAAA,EAC/B,CAAC,EAAE,UAAA6qB,GAAU,GAAGvqB,EAAA,GAAgCC,MAA6C;AACzF,QAAIV,IAAa,CAAA;AAEjB,WAAIgrB,KACAhrB,EAAW,KAAK,WAAW,GAI3B,gBAAAuE;AAAA,MAACrE;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,uBAAmB;AAAA,QACnB,KAAAQ;AAAA,QACA,YAAAV;AAAA,QACC,GAAGS;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhB;AAAC;AACL4qB,GAAc,cAAc;ACpB5B,MAAMC,KAAkB/G,GAAmC;AAAA,EACvD,QAAY;AAAA,EACZ,SAAY;AAChB,CAAC,GA0BYgH,KAAWprB,EAAM,WAAW,CACrC;AAAA,EACI,SAAA8H,IAAU;AAAA,EACV,OAAAoX;AAAA,EACA,QAAAjT;AAAA,EACA,OAAAlJ;AAAA,EACA,QAAQsoB;AAAA,EACR,cAAAC;AAAA,EACA,GAAGhrB;AACP,GAAkBC,MAAwC;AAE1D,QAAMgrB,IAAepG,GAAWgG,EAAe,GAEzCK,IAAkBH,KAAeE,EAAa,QAC9CE,IAAiBH,KAAgBC,EAAa,gBAAgB;AAEpE,MAAI1rB,IAAa,CAAA;AAEjB,EAAIiI,KACAjI,EAAW,KAAK,WAAWiI,CAAO,EAAE,GAGpC/E,KACAlD,EAAW,KAAK,SAASkD,CAAK,EAAE,GAGhCyoB,KACA3rB,EAAW,KAAK,UAAU2rB,CAAe,EAAE;AAI/C,QAAME,IAAgBxM,KAAS,QACzByM,IAAiB7jB,MAAY,YAC5B,OAAOoX,KAAU,WAAW,GAAGA,CAAK,OAAOA,MAAUjT,KAAU,SAChEA,GAEAnI,IAAQ;AAAA,IACV,OAAO4nB;AAAA,IACP,QAAQC;AAAA,IACR,aAAa7jB,MAAY,WAAW,UAAU;AAAA,IAC9C,GAAGxH,EAAM;AAAA,EAAA;AAGb,SACI,gBAAA8D;AAAA,IAACrE;AAAA,IAAA;AAAA,MACG,IAAG;AAAA,MACH,iBAAa;AAAA,MACb,KAAAQ;AAAA,MACA,YAAAV;AAAA,MACA,OAAAiE;AAAA,MACA,MAAK;AAAA,MACL,aAAU;AAAA,MACV,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,kBAAgB2nB;AAAA,MAChB,cAAYA;AAAA,MACX,GAAGnrB;AAAA,IAAA;AAAA,EAAA;AAGhB,CAAC;AACD8qB,GAAS,cAAc;AAEhB,MAAMQ,KAAgB5rB,EAAM,WAAW,CAC1C;AAAA,EACI,QAAA6rB,IAAS;AAAA,EACT,SAAA3jB,IAAU;AAAA,EACV,SAAA4jB,IAAU;AAAA,EACV,QAAAC,IAAS;AAAA,EACT,WAAAzM,IAAY;AAAA,EACZ,UAAA/Z;AAAA,EACA,YAAA1F,IAAa,CAAA;AAAA,EACb,cAAAyrB,IAAe;AAAA,EACf,GAAGhrB;AACP,GAAuBC,MAAwC;AAE/D,QAAMyrB,IAAkB;AAAA,IACpB,aAAa1M,CAAS;AAAA,IACtBuM,KAAU,UAAUA,CAAM;AAAA,IAC1B,GAAGhsB;AAAA,EAAA;AAGP,SAAIqI,KACA8jB,EAAgB,KAAK,WAAW9jB,CAAO,EAAE,GAIzC,gBAAA9D,EAAC+mB,GAAgB,UAAhB,EAAyB,OAAO,EAAE,QAAAU,GAAQ,SAAAC,GAAS,cAAAR,KAChD,UAAA,gBAAAlnB;AAAA,IAACrE;AAAA,IAAA;AAAA,MACG,IAAG;AAAA,MACH,KAAAQ;AAAA,MACA,uBAAmB;AAAA,MACnB,YAAYyrB;AAAA,MACZ,MAAK;AAAA,MACL,aAAU;AAAA,MACV,cAAYV;AAAA,MACX,GAAGhrB;AAAA,MAEH,UAAA,MAAMyrB,CAAM,EAAE,KAAKxmB,CAAQ,EAAE,IAAI,CAACsD,GAAOC,MACtC9I,EAAM,aAAa6I,GAA6B;AAAA,QAC5C,KAAKC;AAAA,MAAA,CACR,CACJ;AAAA,IAAA;AAAA,EAAA,GAET;AAER,CAAC;AACD8iB,GAAc,cAAc;AC9HrB,MAAMK,KAAQjsB,EAAM;AAAA,EACvB,CACI;AAAA,IACI,YAAAksB;AAAA,IACA,WAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,aAAAvqB;AAAA,IACA,WAAAwqB;AAAA,IACA,SAAAC;AAAA,IACA,SAAAC;AAAA,IACA,YAAAC;AAAA,IACA,UAAAjnB;AAAA,IACA,GAAGjF;AAAA,EAAA,GAEPC,MACC;AACD,QAAIV,IAAa,CAAA;AAEjB,IAAIqsB,KACArsB,EAAW,KAAK,YAAYqsB,CAAU,EAAE,GAGxCC,KACAtsB,EAAW,KAAK,SAAS,GAGzBusB,KACAvsB,EAAW,KAAK,WAAW,GAG3BgC,KACAhC,EAAW,KAAK,YAAY,GAG5BwsB,KACAxsB,EAAW,KAAK,cAAcwsB,CAAS,EAAE;AAI7C,UAAMI,IAAWzsB,EAAM,SAAS,MAAMuF,CAAQ;AAgB9C,WACI,gBAAAO;AAAA,MAAC/F;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,YAAAF;AAAA,QACA,KAAAU;AAAA,QACA,MAAK;AAAA,QACL,iBAAeksB,KAAY;AAAA,QAC3B,iBAAeD,IAAa,UApBb,MAAM;AACzB,cAAI,CAACjnB,KAAY,CAACvF,EAAM,eAAeuF,CAAQ,EAAG;AAElD,gBAAMmnB,IAAW1sB,EAAM,SAAS,QAAQuF,CAAQ,EAAE,CAAC;AACnD,cAAIvF,EAAM,eAAe0sB,CAAQ,GAAG;AAChC,kBAAMC,IAAWD,EAAS;AAC1B,gBAAIC,EAAS;AACT,qBAAO3sB,EAAM,SAAS,MAAM2sB,EAAS,QAAQ;AAAA,UAErD;AAAA,QAEJ,GASgD;AAAA,QACxC,SAAAJ;AAAA,QACC,GAAGjsB;AAAA,QAEH,UAAA;AAAA,UAAAgsB,KAAW,gBAAAloB,EAAC,aAAS,UAAAkoB,EAAA,CAAQ;AAAA,UAC7B/mB;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGb;AACJ;AACA0mB,GAAM,cAAc;AClEb,MAAMW,KAAO5sB,EAAM;AAAA,EACtB,CACI,EAAC,MAAA6sB,GAAM,6BAAAC,GAA6B,kBAAAC,GAAkB,OAAApgB,IAAQ,QAAQ,aAAA9K,GAAa,GAAGvB,EAAA,GACtFC,MAAqC;AACrC,UAAMuI,IAAQ+jB,EAAK,UAAU,CAACG,MAAQA,EAAI,QAAQD,CAAgB,GAC5DE,IAAkBnkB,IAAQ,KAAKA,IAAQ,GACvC,CAAEokB,GAAWC,CAAa,IAAIntB,EAAM;AAAA,MACtC6sB,EAAK,SAAS,IAAIA,EAAKI,CAAe,IAAI;AAAA,IAAA,GAExC,CAAEpJ,GAAWC,CAAa,IAAI9jB,EAAM,SAAkB,EAAK,GAG3DotB,IAAgB/lB,EAAqC,EAAE,GAGvDgmB,IAAkBnnB,EAAY,CAAC8mB,MAAkB;AACnD,OAAIE,KAAA,gBAAAA,EAAW,SAAQF,EAAI,QACvBlJ,EAAa,EAAI,GACjB,WAAW,MAAM;AACb,QAAAqJ,EAAaH,CAAG,GAChBlJ,EAAa,EAAK;AAAA,MACtB,GAAG,GAAG;AAAA,IAEd,GAAG,CAAEoJ,KAAA,gBAAAA,EAAW,GAAI,CAAC;AAErB,IAAA/mB,EAAU,MAAM;AACZ,MAAI0mB,EAAK,SAAS,IAGgBA,EAAK,KAAK,OAAOG,EAAI,SAAQE,KAAA,gBAAAA,EAAW,IAAG,KAGrEC,EAAaN,EAAKI,CAAe,CAAC,IAGtCE,EAAa,MAAS;AAAA,IAE9B,GAAG,CAAEN,GAAMI,GAAiBC,KAAA,gBAAAA,EAAW,GAAI,CAAC;AAG5C,UAAMphB,IAAgB5F,EAAY,CAACG,GAA6BinB,MAA0B;;AACtF,UAAIC,IAAYD;AAEhB,UAAIjnB,EAAM,QAAQ;AACd,QAAAknB,KAAaD,IAAe,KAAKT,EAAK;AAAA,eAC/BxmB,EAAM,QAAQ;AACrB,QAAAknB,KAAaD,IAAe,IAAIT,EAAK,UAAUA,EAAK;AAAA,eAC7CxmB,EAAM,QAAQ;AACrB,QAAAknB,IAAY;AAAA,eACLlnB,EAAM,QAAQ;AACrB,QAAAknB,IAAYV,EAAK,SAAS;AAAA;AAG1B;AAGJ,MAAAxmB,EAAM,eAAA;AACN,YAAMmnB,IAAUX,EAAKU,CAAS;AAC9B,MAAIC,MACAH,EAAgBG,CAAO,IACvB9iB,IAAA0iB,EAAc,QAAQG,CAAS,MAA/B,QAAA7iB,EAAkC;AAAA,IAG1C,GAAG,CAAEmiB,GAAMQ,CAAgB,CAAC;AAE5B,WAAKH,IAKD,gBAAApnB;AAAA,MAAC/F;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,aAAS;AAAA,QACT,KAAAQ;AAAA,QACA,cAAYoM;AAAA,QACZ,mBAAiB9K;AAAA,QAChB,GAAGvB;AAAA,QAEJ,UAAA;AAAA,UAAA,gBAAA8D,EAACa,IAAA,EAAI,iBAAa,IAAC,MAAK,WAAU,cAAW,kBACzC,UAAA,gBAAAa,EAAC,MAAA,EAAG,WAAU,mBACT,UAAA;AAAA,YAAA+mB,EAAK,IAAI,CAACG,GAAK9W,wBACX,MAAA,EACG,UAAA,gBAAA9R;AAAA,cAACrE;AAAA,cAAA;AAAA,gBACG,IAAG;AAAA,gBAEH,KAAK,CAAC0S,MAAQ2a,EAAc,QAAQlX,CAAC,IAAIzD;AAAA,gBACzC,IAAI,OAAOua,EAAI,GAAG;AAAA,gBAClB,MAAK;AAAA,gBACL,iBAAeE,EAAU,QAAQF,EAAI;AAAA,gBACrC,iBAAe,aAAaA,EAAI,GAAG;AAAA,gBACnC,UAAUE,EAAU,QAAQF,EAAI,MAAM,IAAI;AAAA,gBAC1C,kBAAc;AAAA,gBACd,eAAaE,EAAU,QAAQF,EAAI;AAAA,gBACnC,cAAYA,EAAI;AAAA,gBAChB,SAAS,MAAMK,EAAgBL,CAAG;AAAA,gBAClC,WAAW,CAACpnB,MAAMkG,EAAclG,GAAGsQ,CAAC;AAAA,gBACpC,WAAW,cAAcgX,EAAU,QAAQF,EAAI,MAAM,cAAc,EAAE;AAAA,gBACrE,cAAa;AAAA,gBAEb,UAAA,gBAAA5oB;AAAA,kBAACoE;AAAA,kBAAA;AAAA,oBACG,WAAW,aAAa0kB,EAAU,QAAQF,EAAI,MAAM,cAAc,EAAE,IAAIA,EAAI,WAAW,cAAc,EAAE;AAAA,oBAEtG,UAAAA,EAAI;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACT;AAAA,YAAA,KAtBCA,EAAI,GAwBb,CACH;AAAA,YACAF;AAAA,UAAA,EAAA,CACL,EAAA,CACJ;AAAA,4BAEC9gB,IAAA,EAAQ,MAAK,YAAW,WAAU,QAAO,cAAa,SAAQ;AAAA,UAE9D6gB,EAAK,IAAI,CAACG,MACP,gBAAA5oB;AAAA,YAACS;AAAA,YAAA;AAAA,cAEG,IAAI,aAAamoB,EAAI,GAAG;AAAA,cACxB,MAAK;AAAA,cACL,mBAAiB,OAAOA,EAAI,GAAG;AAAA,cAC/B,UAAUE,EAAU,QAAQF,EAAI,MAAM,IAAI;AAAA,cAC1C,oBAAgB;AAAA,cAChB,eAAaE,EAAU,QAAQF,EAAI;AAAA,cACnC,gBAAcE,EAAU,QAAQF,EAAI,OAAOnJ;AAAA,cAC3C,QAAQqJ,EAAU,QAAQF,EAAI;AAAA,cAE7B,UAAAA,EAAI;AAAA,YAAA;AAAA,YAVAA,EAAI;AAAA,UAAA,CAYhB;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,IA7DE;AAAA,EAgEf;AACJ;AACAJ,GAAK,cAAc;AC/JnB,MAAMa,KAAgB,MAAc;AAChC,MAAI,OAAO,SAAW,KAAa;AAC/B,UAAMC,IAAW,OAAO,SAAS,UAC3BC,IAAO,OAAO,SAAS;AAG7B,QAAIC,IAAaF,EAAS,QAAQ,OAAO,GAAG;AAC5C,WAAIC,MACAC,KAAc,IAAID,CAAI,KAGnB,GAAGC,CAAU;AAAA,EACxB;AAEA,SAAO;AACX,GAKMC,KAAmC,CAAC,IAAI,CAAC7pB,MAAM;AAAC,CAAC,GACjD8pB,KAAe9tB,EAAM,cAA4C,MAAS,GAEnE+tB,KAAW,MAAwB;AAC5C,QAAM7I,IAAUllB,EAAM,WAAW8tB,EAAY;AAC7C,SAAI5I,MAAY,SACL2I,KAEJ3I;AACX,GAQM8I,KAAW,CAAC1hB,GAAa2hB,MAAsB;AACjD,MAAIC;AACJ,MAAI;AACA,IAAAA,IAAQ,aAAa,QAAQ5hB,CAAG,KAAK;AAAA,EACzC,QAAY;AAAA,EAEZ;AACA,SAAO4hB,KAASD;AACpB,GAGaE,KAAgBnuB,EAAM;AAAA,EAC/B,CAAC,EAAE,cAAAouB,GAAc,WAAAC,GAAW,UAAA9oB,GAAU,GAAGjF,EAAA,GAA6BC,MAA6C;AAC/G,UAAM,CAAC+tB,GAAcC,CAAe,IAAIvkB,EAAkB,EAAK,GACzD,CAACwkB,GAAYC,CAAa,IAAIzkB,EAAiB,MACjDgkB,GAASP,IAAe,KAAKW,CAAY,GAEvCM,IAAWxoB;AAAA,MACb,CAACiI,MAAwC;AAErC,cAAMwgB,IAAW,OAAOxgB,KAAU,aAC5BA,EAAMqgB,CAAU,IAChBrgB;AAEN,YAAI,CAACkgB,EAAU,SAASM,CAAQ,GAAG;AAE/B,gBAAMC,IAAgBP,EAAU,CAAC;AACjC,UAAAI,EAAcG,CAAa,GAC3B,SAAS,gBAAgB,YAAY,IACrC,SAAS,gBAAgB,UAAU,IAAIA,CAAa;AACpD,cAAI;AACA,yBAAa,QAAQnB,GAAA,GAAiBmB,CAAa;AAAA,UACvD,QAAY;AAAA,UAEZ;AACA;AAAA,QACJ;AAEA,QAAAH,EAAcE,CAAQ,GACtB,SAAS,gBAAgB,YAAY,IACrC,SAAS,gBAAgB,UAAU,IAAIA,CAAQ,GAC1CL,KACDC,EAAgB,EAAI;AAExB,YAAI;AACA,uBAAa,QAAQd,GAAA,GAAiBkB,CAAQ;AAAA,QAClD,QAAY;AAAA,QAEZ;AAAA,MACJ;AAAA,MACA,CAACH,GAAYH,CAAS;AAAA,IAAA;AAG1B,WAAAloB,EAAU,MAAM;AACZ,YAAM+nB,IAAQF,GAASP,IAAe;AACtC,MAAAiB,EAASR,KAASE,CAAY;AAAA,IAClC,GAAG,CAACA,GAAcM,CAAQ,CAAC,GAGvB,gBAAAtqB,EAAC0pB,GAAa,UAAb,EAAsB,OAAO,CAACU,GAAYE,CAAQ,GAC/C,UAAA,gBAAAtqB,EAACrE,KAAkC,IAAG,OAAM,uBAAmB,IAAC,KAAAQ,GAAW,GAAGD,GACzE,UAAAguB,KAAgB/oB,GACrB,GACJ;AAAA,EAER;AACJ;AACA4oB,GAAc,cAAc;ACzFrB,MAAMU,KAAgB7uB,EAAM;AAAA,EAC/B,CACI;AAAA,IACI,QAAAwjB,IAAS;AAAA,IACT,UAAAje;AAAA,IACA,GAAGjF;AAAA,EAAA,GAEPC,MAEsBP,EAAM,SAAS,MAAMuF,CAAQ,MAC7B,IAAU,OAG5B,gBAAAnB;AAAA,IAACrE;AAAA,IAAA;AAAA,MACG,IAAG;AAAA,MACH,uBAAmB;AAAA,MACnB,KAAAQ;AAAA,MACA,YAAY,CAACijB,CAAM;AAAA,MACnB,cAAW;AAAA,MACX,iBAAc;AAAA,MACd,MAAK;AAAA,MACJ,GAAGljB;AAAA,MAEH,UAAAiF;AAAA,IAAA;AAAA,EAAA;AAIjB;AACAspB,GAAc,cAAc;AC9BrB,MAAMC,KAAY,CAAC;AAAA,EACtB,IAAAvoB;AAAA,EACA,UAAAqd,IAAW;AAAA,EACX,SAAAnd;AAAA,EACA,UAAAlB;AACJ,MAAsB;AAClB,QAAM,CAACse,GAAWC,CAAY,IAAI9Z,EAAS,EAAK;AAEhD,SAAA7D,EAAU,MAAM;AACZ,QAAIyd,MAAa,EAAG;AAEpB,UAAMG,IAAQ,WAAW,MAAM;AAC3B,MAAAD,EAAa,EAAI;AAAA,IACrB,GAAGF,IAAW,GAAI;AAElB,WAAO,MAAM,aAAaG,CAAK;AAAA,EACnC,GAAG,CAACH,CAAQ,CAAC,GAGbzd,EAAU,MAAM;AACZ,QAAI,CAAC0d,EAAW;AAEhB,UAAMG,IAAgB,WAAW,MAAM;AACnC,MAAAvd,EAAA;AAAA,IACJ,GAAG,GAAG;AAEN,WAAO,MAAM,aAAaud,CAAa;AAAA,EAC3C,GAAG,CAACH,GAAWpd,CAAO,CAAC,GASnB,gBAAArC;AAAA,IAACrE;AAAA,IAAA;AAAA,MACG,IAAG;AAAA,MACH,mBAAe;AAAA,MACf,IAAAwG;AAAA,MACA,YAAYsd,IAAY,CAAC,WAAW,IAAI,CAAA;AAAA,MACxC,iBAZoB,MAAM;AAC9B,QAAIA,KACApd,EAAA;AAAA,MAER;AAAA,MASQ,MAAK;AAAA,MACL,aAAU;AAAA,MACV,eAAY;AAAA,MACZ,QAAO;AAAA,MAEN,UAAAlB;AAAA,IAAA;AAAA,EAAA;AAGb;AACAupB,GAAU,cAAc;AC3CxB,MAAMC,KAAgB3K,GAAyC,IAAI,GAGtD4K,KAAiB,CAAC;AAAA,EAC3B,UAAAzpB;AAAA,EACA,QAAAie,IAAS;AACb,MAA2B;AACvB,QAAM,CAACyL,GAAQC,CAAS,IAAIllB,EAA0B,CAAA,CAAE,GAGlDmlB,IAAcjpB,EAAY,CAACK,MAAe;AAC5C,IAAA2oB,EAAU,OAAQ/T,EAAK,OAAO,OAAKiU,EAAE,OAAO7oB,CAAE,CAAC;AAAA,EACnD,GAAG,CAAA,CAAE,GAGC8oB,IAAuBnpB,EAAY,CAAC8e,GAAiBpB,IAAmB,MAAM;AAChF,UAAMrd,IAAK,SAAS,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAE5E,IAAA2oB,EAAU,CAAA/T,MAAQ,CAAC,GAAGA,GAAM;AAAA,MACxB,IAAA5U;AAAA,MACA,SAAAye;AAAA,MACA,UAAApB;AAAA,IAAA,CACH,CAAC;AAAA,EACN,GAAG,CAAA,CAAE;AAEL,2BACKmL,GAAc,UAAd,EAAuB,OAAO,EAAE,OAAAM,KAC5B,UAAA;AAAA,IAAA9pB;AAAA,IAED,gBAAAnB,EAACyqB,IAAA,EAAc,QAAArL,GACV,UAAAyL,EAAO,IAAI,CAAC,EAAE,IAAA1oB,GAAI,SAAAye,GAAS,UAAApB,EAAA,MACxB,gBAAAxf;AAAA,MAAC0qB;AAAA,MAAA;AAAA,QAEG,IAAAvoB;AAAA,QACA,UAAAqd;AAAA,QACA,SAAS,MAAMuL,EAAY5oB,CAAE;AAAA,QAE5B,UAAAye;AAAA,MAAA;AAAA,MALIze;AAAA,IAAA,CAOZ,EAAA,CACL;AAAA,EAAA,GACJ;AAER;AACAyoB,GAAe,cAAc;AAGtB,MAAMM,KAAY,MAAqB;AAC1C,QAAMpK,IAAUC,GAAW4J,EAAa;AAExC,MAAI,CAAC7J;AACD,UAAM,IAAI,MAAM,gDAAgD;AAGpE,SAAOA,EAAQ;AACnB,GCxDMqK,KAAiB,GACjBC,KAAiB;AAGvB,IAAIC,KAA6C,MAC7CC,KAAmC,MACnCC,KAAqB,IACrBC,KAAqC,MACrCC,KAA0C;AAE9C,MAAMC,yBAAe,IAAA,GAGfC,KAAoB,CACtBC,GACAC,GACAvpB,MACC;AACD,QAAMwpB,IAAiBF,EAAe,sBAAA,GAChCG,IAAiBF,EAAc,sBAAA,GAC/B3U,IAAiB,OAAO,aACxB8U,IAAiB,OAAO;AAE9B,MAAIC,GACAC;AAEJ,UAAQ5pB,GAAA;AAAA,IACJ,KAAK;AACD,MAAA2pB,IAAOF,EAAW,MAAMD,EAAY,SAASX,IAC7Ce,IAAOH,EAAW,QAAQA,EAAW,QAAQD,EAAY,SAAS,GAC9DG,IAAMb,OACNa,IAAMF,EAAW,SAASZ;AAE9B;AAAA,IACJ,KAAK;AACD,MAAAc,IAAOF,EAAW,SAASZ,IAC3Be,IAAOH,EAAW,QAAQA,EAAW,QAAQD,EAAY,SAAS,GAC9DG,IAAMH,EAAY,SAAS5U,IAAiBkU,OAC5Ca,IAAMF,EAAW,MAAMD,EAAY,SAASX;AAEhD;AAAA,IACJ,KAAK;AACD,MAAAc,IAAOF,EAAW,OAAOA,EAAW,SAASD,EAAY,UAAU,GACnEI,IAAOH,EAAW,OAAOD,EAAY,QAAQX,IACzCe,IAAOd,OACPc,IAAOH,EAAW,QAAQZ;AAE9B;AAAA,IACJ,KAAK;AACD,MAAAc,IAAOF,EAAW,OAAOA,EAAW,SAASD,EAAY,UAAU,GACnEI,IAAOH,EAAW,QAAQZ,IACtBe,IAAOJ,EAAY,QAAQE,IAAgBZ,OAC3Cc,IAAOH,EAAW,OAAOD,EAAY,QAAQX;AAEjD;AAAA,IACJ;AACI,MAAAc,IAAOF,EAAW,MAAMD,EAAY,SAASX,IAC7Ce,IAAOH,EAAW,QAAQA,EAAW,QAAQD,EAAY,SAAS;AAAA,EAAA;AAI1E,SAAII,IAAOd,KACPc,IAAOd,KACAc,IAAOJ,EAAY,QAAQE,IAAgBZ,OAClDc,IAAOF,IAAgBF,EAAY,QAAQV,KAG3Ca,IAAMb,KACNa,IAAMb,KACCa,IAAMH,EAAY,SAAS5U,IAAiBkU,OACnDa,IAAM/U,IAAiB4U,EAAY,SAASV,KAGzC,EAAE,KAAAa,GAAK,MAAAC,EAAA;AAClB,GAUMC,KAAiB,CAAC,EAAE,SAAAplB,GAAS,WAAAqlB,GAAW,UAAA9pB,GAAU,QAAAK,QACpD,gBAAA3C;AAAA,EAAC;AAAA,EAAA;AAAA,IACG,gBAAY;AAAA,IACZ,WAAWosB,IAAY,YAAY;AAAA,IACnC,MAAK;AAAA,IACL,OAAO;AAAA,MACH,UAAW;AAAA,MACX,QAAAzpB;AAAA,MACA,KAAW,GAAGL,EAAS,GAAG;AAAA,MAC1B,MAAW,GAAGA,EAAS,IAAI;AAAA,IAAA;AAAA,IAG9B,UAAAyE;AAAA,EAAA;AACL,GAIEslB,KAAgB,CAACC,GAA8BvY,MAA+B;AAChF,MAAI,GAACuX,MAAiB,CAACD,KAEvB;AAAA,QAAI,CAACiB,KAAU,CAACvY,GAAQ;AACpB,MAAAuX,GAAc;AAAA,QACV,gBAAAtrB,EAACmsB,IAAA,EAAe,SAAS,MAAM,WAAW,IAAO,UAAU,EAAE,KAAK,OAAO,MAAM,MAAA,GAAS,QAAQ,IAAA,CAAQ;AAAA,MAAA;AAE5G;AAAA,IACJ;AAGA,IAAAb,GAAc;AAAA,wBACTa,IAAA,EAAe,SAASG,EAAO,SAAS,WAAW,IAAO,UAAU,EAAE,KAAK,OAAO,MAAM,MAAA,GAAS,QAAQA,EAAO,OAAA,CAAQ;AAAA,IAAA,GAI7H,sBAAsB,MAAM;AACxB,UAAI,CAACjB,MAAsB,CAACtX,EAAQ;AACpC,YAAMwY,IAAYlB,GAAmB;AACrC,UAAI,CAACkB,EAAW;AAEhB,YAAM,EAAE,KAAAN,GAAK,MAAAC,MAASP,GAAkBY,GAAWxY,GAAQuY,EAAO,QAAQ;AAC1E,MAAAhB,MAAA,QAAAA,GAAe;AAAA,QACX,gBAAAtrB,EAACmsB,IAAA,EAAe,SAASG,EAAO,SAAS,WAAW,IAAM,UAAU,EAAE,KAAAL,GAAK,MAAAC,EAAA,GAAQ,QAAQI,EAAO,OAAA,CAAQ;AAAA;AAAA,IAElH,CAAC;AAAA;AACL,GAEME,KAAiB,MAAM;AACzB,MAAI,CAAChB,MAAkB,CAACC,GAAc;AACtC,QAAMa,IAASZ,GAAS,IAAIF,EAAc;AAC1C,EAAIc,KACAD,GAAcC,GAAQb,EAAY;AAE1C,GAEMgB,KAAc,CAACC,GAAkB3Y,MAAwB;AAC3D,QAAMuY,IAASZ,GAAS,IAAIgB,CAAQ;AACpC,EAAKJ,MAELd,KAAiBkB,GACjBjB,KAAe1X,GACfsY,GAAcC,GAAQvY,CAAM;AAChC,GAEM4Y,KAAc,CAACD,MAAsB;AACvC,EAAIA,KAAYlB,OAAmBkB,MACnClB,KAAiB,MACjBC,KAAe,MACfY,GAAc,MAAM,IAAI;AAC5B,GAGMO,KAAkB,CAAC,MAAkB;AACvC,QAAM7Y,IAAU,EAAE,OAAuB,QAAQ,MAAM;AACvD,MAAI,EAACA,KAAA,QAAAA,EAAQ,IAAI;AAEjB,QAAMuY,IAASZ,GAAS,IAAI3X,EAAO,EAAE;AACrC,GAAIuY,KAAA,gBAAAA,EAAQ,YAAW,WACnBG,GAAY1Y,EAAO,IAAIA,CAAM;AAErC,GAEM8Y,KAAiB,CAAC,MAAkB;AACtC,QAAM9Y,IAAU,EAAE,OAAuB,QAAQ,MAAM;AACvD,MAAI,EAACA,KAAA,QAAAA,EAAQ,IAAI;AAEjB,QAAMuY,IAASZ,GAAS,IAAI3X,EAAO,EAAE;AACrC,GAAIuY,KAAA,gBAAAA,EAAQ,YAAW,WACnBK,GAAY5Y,EAAO,EAAE;AAE7B,GAEMkS,KAAc,CAAC,MAAkB;AAEnC,MAAIoF,MAAA,QAAAA,GAAoB,SAAS,EAAE;AAC/B;AAGJ,QAAMtX,IAAU,EAAE,OAAuB,QAAQ,MAAM;AAGvD,MAAIA,KAAA,QAAAA,EAAQ,IAAI;AACZ,UAAMuY,IAASZ,GAAS,IAAI3X,EAAO,EAAE;AACrC,SAAIuY,KAAA,gBAAAA,EAAQ,YAAW,SAAS;AAC5B,MAAId,OAAmBzX,EAAO,KAC1B4Y,GAAA,IAEAF,GAAY1Y,EAAO,IAAIA,CAAM;AAEjC;AAAA,IACJ;AAAA,EACJ;AAGA,MAAIyX,IAAgB;AAChB,UAAMsB,IAAepB,GAAS,IAAIF,EAAc;AAChD,KAAIsB,KAAA,gBAAAA,EAAc,YAAW,WACzBH,GAAA;AAAA,EAER;AACJ,GAGMI,KAAsB,MAAM;AAC9B,MAAI,OAAO,WAAa,IAAa;AAGrC,QAAMC,IAAoB,SAAS,eAAe,2BAA2B;AAC7E,MAAIA,KAAqBzB,IAAe;AACpC,IAAAF,KAAqB2B;AACrB;AAAA,EACJ;AAGA,EAAAzB,KAAgB,IAChBF,KAAqB,MACrBC,KAAgB,MAGhBD,KAAqB,SAAS,cAAc,KAAK,GACjDA,GAAmB,KAAK,6BACxB,SAAS,KAAK,YAAYA,EAAkB,GAG5CC,KAAgB2B,GAAW5B,EAAkB,GAG7CC,GAAc;AAAA,IACV,gBAAAtrB,EAACmsB,IAAA,EAAe,SAAS,MAAM,WAAW,IAAO,UAAU,EAAE,KAAK,OAAO,MAAM,MAAA,GAAS,QAAQ,IAAA,CAAQ;AAAA,EAAA,GAI5G,SAAS,iBAAiB,aAAaS,EAAe,GACtD,SAAS,iBAAiB,YAAYC,EAAc,GACpD,SAAS,iBAAiB,SAAS5G,EAAW,GAC9C,OAAO,iBAAiB,UAAUuG,IAAgB,EAAI,GACtD,OAAO,iBAAiB,UAAUA,EAAc,GAEhDjB,KAAgB;AACpB,GAGa2B,KAAU,CAAC;AAAA,EACpB,UAAA/rB;AAAA,EACA,cAAAgsB;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,UAAA9qB,IAAW;AAAA,EACX,QAAAK,IAAS;AACb,MAAoB;AAChB,QAAM0qB,IAAYpqB,EAAsB,EAAE,SAAS9B,GAAU,UAAAmB,GAAU,QAAA8qB,GAAQ,QAAAzqB,GAAQ;AAGvF,SAAA0qB,EAAU,UAAU,EAAE,SAASlsB,GAAU,UAAAmB,GAAU,QAAA8qB,GAAQ,QAAAzqB,EAAA,GAE3DZ,EAAU,OAENgrB,GAAA,GAGArB,GAAS,IAAIyB,GAAcE,EAAU,OAAO,GAGxC7B,OAAmB2B,KAAgB1B,MACnCY,GAAcgB,EAAU,SAAS5B,EAAY,GAG1C,MAAM;AACT,IAAAC,GAAS,OAAOyB,CAAY,GAExB3B,OAAmB2B,KACnBR,GAAA;AAAA,EAER,IACD,CAACQ,CAAY,CAAC,GAGjBprB,EAAU,MAAM;AACZ,IAAA2pB,GAAS,IAAIyB,GAAcE,EAAU,OAAO,GAGxC7B,OAAmB2B,KAAgB1B,MACnCY,GAAcgB,EAAU,SAAS5B,EAAY;AAAA,EAErD,GAAG,CAACtqB,GAAUmB,GAAU8qB,GAAQzqB,GAAQwqB,CAAY,CAAC,GAG9C;AACX,GCvSMG,KAAU1xB,EAAM;AAAA,EAClB,CAAC,EAAE,WAAA0M,IAAY,cAAc,QAAA7I,GAAQ,OAAA8I,GAAO,GAAGrM,EAAA,GAAuBC,MAAuC;AACzG,QAAIV,IAAa,CAAA;AAEjB,WAAIgE,KACAhE,EAAW,KAAK,UAAUgE,CAAM,EAAE,GAGlC6I,KACA7M,EAAW,KAAK,QAAQ6M,CAAS,EAAE,GAGnCC,KACA9M,EAAW,KAAK,QAAQ8M,CAAK,EAAE,GAG5B,gBAAAvI,EAACrE,GAAA,EAA4B,KAAAQ,GAAU,YAAAV,GAAyB,GAAGS,GAAO;AAAA,EACrF;AACJ,GAEaqxB,KAAW3xB,EAAM,WAAW,CAACM,GAAqBC,MAC3D,gBAAA6D,EAACstB,IAAA,EAAQ,IAAG,MAAK,KAAAnxB,GAAW,GAAGD,GAAO,CACzC;AACDqxB,GAAS,cAAc;AAEhB,MAAMC,KAAW5xB,EAAM,WAAW,CAACM,GAAqBC,MAC3D,gBAAA6D,EAACstB,IAAA,EAAQ,IAAG,MAAK,KAAAnxB,GAAW,GAAGD,GAAO,CACzC;AACDsxB,GAAS,cAAc;AAEhB,MAAMC,KAAW7xB,EAAM,WAAW,CAACM,GAAqBC,MAC3D,gBAAA6D,EAACstB,IAAA,EAAQ,IAAG,MAAK,KAAAnxB,GAAW,GAAGD,GAAO,CACzC;AACDuxB,GAAS,cAAc;AAEhB,MAAMC,KAAW9xB,EAAM,WAAW,CAACM,GAAqBC,MAC3D,gBAAA6D,EAACstB,IAAA,EAAQ,IAAG,MAAK,KAAAnxB,GAAW,GAAGD,GAAO,CACzC;AACDwxB,GAAS,cAAc;AAEhB,MAAMC,KAAW/xB,EAAM,WAAW,CAACM,GAAqBC,MAC3D,gBAAA6D,EAACstB,IAAA,EAAQ,IAAG,MAAK,KAAAnxB,GAAW,GAAGD,GAAO,CACzC;AACDyxB,GAAS,cAAc;AAEhB,MAAMC,KAAWhyB,EAAM,WAAW,CAACM,GAAqBC,MAC3D,gBAAA6D,EAACstB,IAAA,EAAQ,IAAG,MAAK,KAAAnxB,GAAW,GAAGD,GAAO,CACzC;AACD0xB,GAAS,cAAc;AC5ChB,MAAMC,KAAYjyB,EAAM;AAAA,EAC3B,CAAC,EAAC,SAAAusB,GAAS,UAAAhnB,GAAU,QAAAiB,IAAS,IAAO,GAAGlG,EAAA,GAAyBC,MAGzD,gBAAAuF;AAAA,IAAC/F;AAAA,IAAA;AAAA,MACG,IAAG;AAAA,MACH,2BAAuB;AAAA,MACvB,KAAAQ;AAAA,MACC,GAAGD;AAAA,MACJ,MAAMkG;AAAA,MACN,MAAK;AAAA,MACL,mBAAgB;AAAA,MAEhB,UAAA;AAAA,QAAA,gBAAApC;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,MAAK;AAAA,YACL,UAAU;AAAA,YACV,iBAAc;AAAA,YACd,iBAAeoC;AAAA,YAEd,UAAA,OAAO+lB,KAAY,WAAW,gBAAAnoB,EAACoE,KAAK,QAAO,QAAQ,aAAQ,IAAU+jB;AAAA,UAAA;AAAA,QAAA;AAAA,QAEzEhnB;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIjB;AACA0sB,GAAU,cAAc;"}