@tetrascience-npm/tetrascience-react-ui 0.4.0-beta.8.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -4
- package/dist/athena.d.ts +167 -0
- package/dist/databricks.d.ts +129 -0
- package/dist/exceptions-DN25pCDi.cjs +2 -0
- package/dist/exceptions-DN25pCDi.cjs.map +1 -0
- package/dist/exceptions-jCQ6h5C8.js +33 -0
- package/dist/exceptions-jCQ6h5C8.js.map +1 -0
- package/dist/index.cjs +2021 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +2165 -1733
- package/dist/index.js +9461 -2
- package/dist/index.js.map +1 -0
- package/dist/logo.png +0 -0
- package/dist/providers/athena.cjs +2 -0
- package/dist/providers/athena.cjs.map +1 -0
- package/dist/providers/athena.d.ts +7 -77
- package/dist/providers/athena.js +160 -0
- package/dist/providers/athena.js.map +1 -0
- package/dist/providers/databricks.cjs +2 -0
- package/dist/providers/databricks.cjs.map +1 -0
- package/dist/providers/databricks.d.ts +7 -41
- package/dist/providers/databricks.js +85 -0
- package/dist/providers/databricks.js.map +1 -0
- package/dist/providers/snowflake.cjs +2 -0
- package/dist/providers/snowflake.cjs.map +1 -0
- package/dist/providers/snowflake.d.ts +7 -38
- package/dist/providers/snowflake.js +122 -0
- package/dist/providers/snowflake.js.map +1 -0
- package/dist/server.cjs +2 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.ts +537 -522
- package/dist/server.js +266 -0
- package/dist/server.js.map +1 -0
- package/dist/{providers/types-Ck4uFaGp.d.ts → snowflake.d.ts} +125 -82
- package/dist/vite.svg +1 -0
- package/package.json +32 -52
- package/dist/cjs/index.js +0 -2001
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/providers/athena.js +0 -2
- package/dist/cjs/providers/athena.js.map +0 -1
- package/dist/cjs/providers/databricks.js +0 -2
- package/dist/cjs/providers/databricks.js.map +0 -1
- package/dist/cjs/providers/exceptions-CYktpdqW.js +0 -2
- package/dist/cjs/providers/exceptions-CYktpdqW.js.map +0 -1
- package/dist/cjs/providers/snowflake.js +0 -2
- package/dist/cjs/providers/snowflake.js.map +0 -1
- package/dist/cjs/server.js +0 -2
- package/dist/cjs/server.js.map +0 -1
- package/dist/esm/index.js +0 -2001
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/providers/athena.js +0 -2
- package/dist/esm/providers/athena.js.map +0 -1
- package/dist/esm/providers/databricks.js +0 -2
- package/dist/esm/providers/databricks.js.map +0 -1
- package/dist/esm/providers/exceptions-C3uFWZB2.js +0 -2
- package/dist/esm/providers/exceptions-C3uFWZB2.js.map +0 -1
- package/dist/esm/providers/snowflake.js +0 -2
- package/dist/esm/providers/snowflake.js.map +0 -1
- package/dist/esm/server.js +0 -2
- package/dist/esm/server.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/components/atoms/Badge/Badge.tsx","../src/components/atoms/Button/Button.tsx","../src/components/atoms/ButtonControl/ButtonControl.tsx","../src/components/atoms/Card/Card.tsx","../src/assets/icon/Bars3BottomLeft.tsx","../src/assets/icon/Building.tsx","../src/assets/icon/BulkCheck.tsx","../src/assets/icon/Check.tsx","../src/assets/icon/CheckCircle.tsx","../src/assets/icon/CheckSquare.tsx","../src/assets/icon/ChevronDown.tsx","../src/assets/icon/Close.tsx","../src/assets/icon/Code.tsx","../src/assets/icon/Computer.tsx","../src/assets/icon/Copy.tsx","../src/assets/icon/Cube.tsx","../src/assets/icon/Database.tsx","../src/assets/icon/ExclamationCircle.tsx","../src/assets/icon/ExclamationTriangle.tsx","../src/assets/icon/Gear.tsx","../src/assets/icon/Globe.tsx","../src/assets/icon/Hashtag.tsx","../src/assets/icon/Home.tsx","../src/assets/icon/Inbox.tsx","../src/assets/icon/InformationCircle.tsx","../src/assets/icon/InformationCircleMicro.tsx","../src/assets/icon/Lamp.tsx","../src/assets/icon/LockOpen.tsx","../src/assets/icon/Minus.tsx","../src/assets/icon/PaperPlane.tsx","../src/assets/icon/Pencil.tsx","../src/assets/icon/PieChart.tsx","../src/assets/icon/Pipeline.tsx","../src/assets/icon/Plus.tsx","../src/assets/icon/Profile.tsx","../src/assets/icon/QuestionCircle.tsx","../src/assets/icon/RocketLaunch.tsx","../src/assets/icon/Search.tsx","../src/assets/icon/SearchDocument.tsx","../src/assets/icon/SearchSQL.tsx","../src/assets/icon/Sitemap.tsx","../src/assets/icon/TetraScienceIcon.tsx","../src/assets/icon/Text.tsx","../src/assets/icon/Trash.tsx","../src/assets/icon/ViewfinderCircle.tsx","../src/components/atoms/Icon/Icon.tsx","../src/components/atoms/Checkbox/Checkbox.tsx","../src/components/atoms/Tooltip/Tooltip.tsx","../src/components/atoms/CodeEditor/CodeEditor.tsx","../src/components/atoms/Dropdown/Dropdown.tsx","../src/components/atoms/ErrorAlert/ErrorAlert.tsx","../src/components/atoms/Input/Input.tsx","../src/components/atoms/Label/Label.tsx","../node_modules/react-syntax-highlighter/dist/esm/styles/prism/nord.js","../src/components/atoms/MarkdownDisplay/MarkdownDisplay.tsx","../src/components/atoms/MenuItem/MenuItem.tsx","../src/components/atoms/Modal/Modal.tsx","../src/components/atoms/PopConfirm/PopConfirm.tsx","../src/components/atoms/SupportiveText/SupportiveText.tsx","../src/components/atoms/Tab/Tab.tsx","../src/components/atoms/TableCell/TableCell.tsx","../src/components/atoms/TableHeaderCell/TableHeaderCell.tsx","../src/components/atoms/Textarea/Textarea.tsx","../src/components/atoms/Toast/Toast.tsx","../src/components/atoms/Toggle/Toggle.tsx","../src/components/atoms/TDPLink/tdpUrl.ts","../src/components/atoms/TDPLink/TDPLink.tsx","../src/components/molecules/AppHeader/AppHeader.tsx","../src/components/molecules/AssistantModal/AssistantModal.tsx","../src/components/molecules/ButtonControlGroup/ButtonControlGroup.tsx","../src/components/molecules/CardSidebar/CardSidebar.tsx","../src/components/molecules/CodeScriptEditorButton/CodeScriptEditorButton.tsx","../src/components/molecules/FormField/FormField.tsx","../src/components/molecules/LaunchContent/LaunchContent.tsx","../src/components/molecules/Menu/Menu.tsx","../src/components/molecules/Navbar/Navbar.tsx","../src/components/molecules/ProtocolConfiguration/ProtocolConfiguration.tsx","../src/components/molecules/ProtocolYamlCard/ProtocolYamlCard.tsx","../src/components/molecules/PythonEditorModal/PythonEditorModal.tsx","../src/components/molecules/SelectField/SelectField.tsx","../src/components/molecules/Sidebar/Sidebar.tsx","../src/components/molecules/Table/Table.tsx","../src/components/molecules/TabGroup/TabGroup.tsx","../src/components/molecules/ToastManager/ToastManager.tsx","../src/components/organisms/AppLayout/AppLayout.tsx","../src/utils/colors.ts","../src/components/organisms/AreaGraph/AreaGraph.tsx","../src/components/organisms/BarGraph/BarGraph.tsx","../src/components/organisms/Boxplot/Boxplot.tsx","../src/components/organisms/Chromatogram/Chromatogram.tsx","../src/components/organisms/ChromatogramChart/constants.ts","../src/components/organisms/ChromatogramChart/annotations.ts","../src/components/organisms/ChromatogramChart/boundaryMarkers.ts","../src/components/organisms/ChromatogramChart/peakDetection.ts","../src/components/organisms/ChromatogramChart/dataProcessing.ts","../src/components/organisms/ChromatogramChart/ChromatogramChart.tsx","../src/components/organisms/DotPlot/DotPlot.tsx","../src/components/organisms/PlateMap/types.ts","../src/components/organisms/PlateMap/constants.ts","../src/components/organisms/PlateMap/utils.ts","../src/components/organisms/PlateMap/PlateMap.tsx","../src/components/organisms/Heatmap/Heatmap.tsx","../src/components/organisms/Histogram/Histogram.tsx","../src/components/organisms/InteractiveScatter/constants.ts","../src/components/organisms/InteractiveScatter/utils.ts","../src/components/organisms/InteractiveScatter/InteractiveScatter.tsx","../src/components/organisms/LineGraph/LineGraph.tsx","../src/components/organisms/Main/Main.tsx","../src/components/organisms/PieChart/PieChart.tsx","../src/components/organisms/ScatterGraph/ScatterGraph.tsx","../src/components/organisms/TdpSearch/components/DefaultFilters.tsx","../src/components/organisms/TdpSearch/components/DefaultResults.tsx","../src/components/organisms/TdpSearch/components/DefaultSearchBar.tsx","../src/components/organisms/TdpSearch/constants.ts","../src/components/organisms/TdpSearch/utils.ts","../src/components/organisms/TdpSearch/hooks/useSearch.ts","../src/components/organisms/TdpSearch/hooks/useTdpCredentials.ts","../src/components/organisms/TdpSearch/TdpSearch.tsx","../src/theme/types.ts","../src/theme/ThemeProvider.tsx"],"sourcesContent":["import React from \"react\";\nimport styled, { css } from \"styled-components\";\n\nexport type BadgeSize = \"small\" | \"medium\";\nexport type BadgeVariant = \"default\" | \"primary\";\n\nexport interface BadgeProps {\n children: React.ReactNode;\n size?: BadgeSize;\n variant?: BadgeVariant;\n disabled?: boolean;\n iconLeft?: React.ReactNode;\n iconRight?: React.ReactNode;\n className?: string;\n}\n\nconst sizeStyles = {\n small: css`\n height: 22px;\n `,\n medium: css`\n height: 26px;\n `,\n};\n\nconst variantStyles = {\n default: css`\n color: var(--black);\n background-color: var(--white);\n border: 1px solid var(--grey-300);\n `,\n primary: css`\n color: var(--blue-600);\n background-color: var(--blue-50);\n border: 1px solid var(--blue-600);\n `,\n};\n\nconst StyledBadge = styled.span<{\n $size: BadgeSize;\n $variant: BadgeVariant;\n $disabled: boolean;\n}>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n font-family: \"Inter\", sans-serif;\n font-size: 13px;\n font-style: normal;\n font-weight: 400;\n line-height: 18px;\n white-space: nowrap;\n padding: 2px 8px;\n border-radius: 6px;\n user-select: none;\n\n ${({ $size }) => sizeStyles[$size]}\n ${({ $variant }) => variantStyles[$variant]}\n \n ${({ $disabled }) =>\n $disabled &&\n css`\n cursor: not-allowed;\n background-color: var(--white);\n border-color: var(--grey-300);\n color: var(--grey-300);\n `}\n\t\t\n\tsvg {\n width: 16px;\n height: 16px;\n }\n`;\n\nexport const Badge: React.FC<BadgeProps> = ({\n children,\n size = \"medium\",\n variant = \"default\",\n disabled = false,\n iconLeft,\n iconRight,\n className,\n}) => {\n return (\n <StyledBadge\n $size={size}\n $variant={variant}\n $disabled={disabled}\n className={className}\n >\n {iconLeft && iconLeft}\n {children}\n {iconRight && iconRight}\n </StyledBadge>\n );\n};\n\nexport default Badge;\n","import React from \"react\";\nimport styled, { css } from \"styled-components\";\n\nexport type ButtonSize = \"small\" | \"medium\";\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"tertiary\";\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n children: React.ReactNode;\n variant?: ButtonVariant;\n size?: ButtonSize;\n loading?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n noPadding?: boolean;\n fullWidth?: boolean;\n ref?: React.Ref<HTMLButtonElement>;\n}\n\nconst heightStyles = {\n small: css`\n height: 34px;\n `,\n medium: css`\n height: 38px;\n `,\n};\n\nconst variantStyles = {\n primary: css`\n color: var(--white-900);\n background-color: var(--theme-primary, var(--blue-900));\n border: 1px solid var(--theme-primary, var(--blue-900));\n\n &:hover:not(:disabled) {\n background-color: var(--theme-primaryHover, var(--blue-800));\n border-color: var(--theme-primaryHover, var(--blue-800));\n }\n\n &:focus:not(:disabled) {\n background-color: var(--theme-primaryHover, var(--blue-800));\n }\n\n &:active:not(:disabled) {\n background-color: var(--theme-primaryActive, var(--blue-800));\n border-color: var(--theme-primaryActive, var(--blue-800));\n }\n `,\n secondary: css`\n color: var(--blue-600);\n background-color: var(--white-900);\n border: 1px solid var(--blue-600);\n\n &:hover:not(:disabled) {\n background-color: var(--blue-100);\n border-color: var(--blue-600);\n }\n\n &:focus:not(:disabled) {\n background-color: var(--blue-100);\n }\n\n &:active:not(:disabled) {\n border-color: var(--blue-600);\n background-color: var(--blue-100);\n }\n `,\n tertiary: css`\n color: var(--black-900);\n background-color: var(--white-900);\n border: 1px solid var(--grey-300);\n\n &:hover:not(:disabled) {\n background-color: var(--grey-100);\n border: 1px solid var(--grey-300);\n }\n\n &:focus:not(:disabled) {\n background-color: var(--grey-100);\n }\n\n &:active:not(:disabled) {\n background-color: var(--grey-100);\n }\n `,\n};\n\nconst getPadding = (size: ButtonSize, noPadding?: boolean) => {\n if (noPadding) return \"0\";\n\n switch (size) {\n case \"small\":\n return \"7px 10px\";\n case \"medium\":\n default:\n return \"9px 12px\";\n }\n};\n\ninterface StyledButtonProps {\n $noPadding?: boolean;\n $fullWidth?: boolean;\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\nconst StyledButton = styled.button<StyledButtonProps>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n border-radius: var(--theme-radius-medium, 8px);\n font-family: \"Inter\", sans-serif;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n font-size: 14px;\n min-height: 20px;\n width: ${(props) => (props.$fullWidth ? \"100%\" : \"auto\")};\n padding: ${(props) => getPadding(props.size || \"medium\", props.$noPadding)};\n user-select: none;\n\n ${(props) => heightStyles[props.size || \"medium\"]}\n ${(props) => variantStyles[props.variant || \"primary\"]}\n\n\t&:disabled {\n cursor: not-allowed;\n user-select: none;\n pointer-events: none;\n background-color: var(--grey-300);\n border-color: var(--grey-300);\n color: var(--white-900);\n }\n\n &:focus {\n outline: none;\n box-shadow: 0px 0px 0px 1px var(--white-900),\n 0px 0px 0px 3px var(--blue-600);\n }\n`;\n\nexport const Button = ({\n children,\n variant = \"primary\",\n size = \"medium\",\n loading = false,\n leftIcon,\n rightIcon,\n noPadding = false,\n fullWidth = false,\n disabled,\n ref,\n ...rest\n}: ButtonProps) => {\n return (\n <StyledButton\n ref={ref}\n variant={variant}\n size={size}\n $noPadding={noPadding}\n $fullWidth={fullWidth}\n disabled={disabled || loading}\n {...rest}\n >\n {leftIcon}\n {children}\n {rightIcon}\n </StyledButton>\n );\n};\n\nexport default Button;\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nexport interface ButtonControlProps {\n icon?: React.ReactNode;\n selected?: boolean;\n disabled?: boolean;\n onClick?: () => void;\n}\n\nconst ButtonContainer = styled.button<{\n selected?: boolean;\n disabled?: boolean;\n}>`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n background-color: ${(props) =>\n props.selected ? \"var(--grey-100)\" : \"var(--white-900)\"};\n border: none;\n border-radius: 0;\n cursor: ${(props) => (props.disabled ? \"not-allowed\" : \"pointer\")};\n outline: none;\n transition: all 0.2s ease;\n padding: 0;\n\n &:hover:not(:disabled) {\n background-color: var(--grey-100);\n }\n\n &:active:not(:disabled) {\n background-color: var(--grey-100);\n outline: none;\n }\n\n &:focus,\n &:focus-visible {\n outline-color: var(--blue-600) !important;\n }\n\n &:disabled {\n opacity: 0.5;\n background-color: var(--grey-50);\n border-color: var(--grey-200);\n }\n\n svg {\n width: 20px;\n height: 20px;\n color: ${(props) =>\n props.disabled ? \"var(--grey-400)\" : \"var(--blue-900)\"};\n }\n`;\n\nexport const ButtonControl: React.FC<ButtonControlProps> = ({\n icon,\n selected = false,\n disabled = false,\n onClick,\n}) => {\n return (\n <ButtonContainer\n selected={selected}\n disabled={disabled}\n onClick={disabled ? undefined : onClick}\n >\n {icon}\n </ButtonContainer>\n );\n};\n\nexport default ButtonControl;\n","import React from \"react\";\nimport styled, { css } from \"styled-components\";\n\nexport type CardSize = \"small\" | \"medium\" | \"large\";\nexport type CardVariant = \"default\" | \"outlined\" | \"elevated\";\n\nexport interface CardProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n children: React.ReactNode;\n title?: React.ReactNode;\n size?: CardSize;\n variant?: CardVariant;\n className?: string;\n fullWidth?: boolean;\n ref?: React.Ref<HTMLDivElement>;\n}\n\nconst sizeStyles = {\n small: css`\n padding: 12px;\n `,\n medium: css`\n padding: 16px;\n `,\n large: css`\n padding: 20px;\n `,\n};\n\nconst variantStyles = {\n default: css`\n background-color: var(--theme-cardBackground, var(--white-900));\n border: 1px solid var(--theme-cardBorder, var(--grey-200));\n `,\n outlined: css`\n background-color: var(--theme-cardBackground, var(--white-900));\n border: 1px solid var(--theme-cardBorder, var(--grey-200));\n `,\n elevated: css`\n background-color: var(--theme-cardBackground, var(--white-900));\n border: 1px solid var(--theme-cardBorder, var(--grey-200));\n box-shadow: 0px 2px 4px var(--black-100);\n `,\n};\n\nconst CardContainer = styled.div<{\n $size: CardSize;\n $variant: CardVariant;\n $fullWidth?: boolean;\n}>`\n border-radius: var(--theme-radius-large, 16px);\n width: ${(props) => (props.$fullWidth ? \"100%\" : \"auto\")};\n ${(props) => variantStyles[props.$variant]}\n transition: all 0.2s ease;\n`;\n\nconst CardTitle = styled.div<{\n $size: CardSize;\n}>`\n font-family: \"Inter\", sans-serif;\n font-size: 14px;\n font-style: normal;\n font-weight: 600;\n line-height: 20px;\n background-color: var(--grey-50);\n border-top-left-radius: var(--theme-radius-large, 16px);\n border-top-right-radius: var(--theme-radius-large, 16px);\n ${(props) => sizeStyles[props.$size]}\n`;\n\nconst CardContent = styled.div<{\n $size: CardSize;\n}>`\n ${(props) => sizeStyles[props.$size]}\n`;\n\nexport const Card = ({\n children,\n title,\n size = \"medium\",\n variant = \"default\",\n className,\n fullWidth = false,\n ref,\n ...rest\n}: CardProps) => {\n return (\n <CardContainer\n ref={ref}\n $size={size}\n $variant={variant}\n $fullWidth={fullWidth}\n className={className}\n {...rest}\n >\n {title && <CardTitle $size={size}>{title}</CardTitle>}\n <CardContent $size={size}>{children}</CardContent>\n </CardContainer>\n );\n};\n\nexport default Card;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Bars3BottomLeft: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 4.75C2 4.33579 2.33579 4 2.75 4H17.25C17.6642 4 18 4.33579 18 4.75C18 5.16421 17.6642 5.5 17.25 5.5H2.75C2.33579 5.5 2 5.16421 2 4.75ZM2 15.25C2 14.8358 2.33579 14.5 2.75 14.5H10.25C10.6642 14.5 11 14.8358 11 15.25C11 15.6642 10.6642 16 10.25 16H2.75C2.33579 16 2 15.6642 2 15.25Z\"\n fill={fill}\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 10C2 9.58579 2.33579 9.25 2.75 9.25H17.25C17.6642 9.25 18 9.58579 18 10C18 10.4142 17.6642 10.75 17.25 10.75H2.75C2.33579 10.75 2 10.4142 2 10Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Bars3BottomLeft;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Building: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4 16.5V3.5H3.75C3.55109 3.5 3.36032 3.42098 3.21967 3.28033C3.07902 3.13968 3 2.94891 3 2.75C3 2.55109 3.07902 2.36032 3.21967 2.21967C3.36032 2.07902 3.55109 2 3.75 2H16.25C16.4489 2 16.6397 2.07902 16.7803 2.21967C16.921 2.36032 17 2.55109 17 2.75C17 2.94891 16.921 3.13968 16.7803 3.28033C16.6397 3.42098 16.4489 3.5 16.25 3.5H16V16.5H16.25C16.4489 16.5 16.6397 16.579 16.7803 16.7197C16.921 16.8603 17 17.0511 17 17.25C17 17.4489 16.921 17.6397 16.7803 17.7803C16.6397 17.921 16.4489 18 16.25 18H12.75C12.5511 18 12.3603 17.921 12.2197 17.7803C12.079 17.6397 12 17.4489 12 17.25V14.75C12 14.5511 11.921 14.3603 11.7803 14.2197C11.6397 14.079 11.4489 14 11.25 14H8.75C8.55109 14 8.36032 14.079 8.21967 14.2197C8.07902 14.3603 8 14.5511 8 14.75V17.25C8 17.4489 7.92098 17.6397 7.78033 17.7803C7.63968 17.921 7.44891 18 7.25 18H3.75C3.55109 18 3.36032 17.921 3.21967 17.7803C3.07902 17.6397 3 17.4489 3 17.25C3 17.0511 3.07902 16.8603 3.21967 16.7197C3.36032 16.579 3.55109 16.5 3.75 16.5H4ZM7 5.5C7 5.36739 7.05268 5.24021 7.14645 5.14645C7.24021 5.05268 7.36739 5 7.5 5H8.5C8.63261 5 8.75979 5.05268 8.85355 5.14645C8.94732 5.24021 9 5.36739 9 5.5V6.5C9 6.63261 8.94732 6.75979 8.85355 6.85355C8.75979 6.94732 8.63261 7 8.5 7H7.5C7.36739 7 7.24021 6.94732 7.14645 6.85355C7.05268 6.75979 7 6.63261 7 6.5V5.5ZM7.5 9C7.36739 9 7.24021 9.05268 7.14645 9.14645C7.05268 9.24021 7 9.36739 7 9.5V10.5C7 10.6326 7.05268 10.7598 7.14645 10.8536C7.24021 10.9473 7.36739 11 7.5 11H8.5C8.63261 11 8.75979 10.9473 8.85355 10.8536C8.94732 10.7598 9 10.6326 9 10.5V9.5C9 9.36739 8.94732 9.24021 8.85355 9.14645C8.75979 9.05268 8.63261 9 8.5 9H7.5ZM11 5.5C11 5.36739 11.0527 5.24021 11.1464 5.14645C11.2402 5.05268 11.3674 5 11.5 5H12.5C12.6326 5 12.7598 5.05268 12.8536 5.14645C12.9473 5.24021 13 5.36739 13 5.5V6.5C13 6.63261 12.9473 6.75979 12.8536 6.85355C12.7598 6.94732 12.6326 7 12.5 7H11.5C11.3674 7 11.2402 6.94732 11.1464 6.85355C11.0527 6.75979 11 6.63261 11 6.5V5.5ZM11.5 9C11.3674 9 11.2402 9.05268 11.1464 9.14645C11.0527 9.24021 11 9.36739 11 9.5V10.5C11 10.6326 11.0527 10.7598 11.1464 10.8536C11.2402 10.9473 11.3674 11 11.5 11H12.5C12.6326 11 12.7598 10.9473 12.8536 10.8536C12.9473 10.7598 13 10.6326 13 10.5V9.5C13 9.36739 12.9473 9.24021 12.8536 9.14645C12.7598 9.05268 12.6326 9 12.5 9H11.5Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Building;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst BulkCheck: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M17.997 5.25C17.9972 4.69436 17.7917 4.15832 17.4202 3.74512C17.0488 3.33191 16.5375 3.07077 15.985 3.012C15.9262 2.45948 15.6651 1.94825 15.2519 1.57677C14.8387 1.20529 14.3026 0.999846 13.747 1H12.247C11.6914 0.999846 11.1553 1.20529 10.7421 1.57677C10.3289 1.94825 10.0678 2.45948 10.009 3.012C9.134 3.104 8.409 3.698 8.125 4.5H10.997C11.66 4.5 12.2959 4.76339 12.7648 5.23223C13.2336 5.70107 13.497 6.33696 13.497 7V14H15.747C16.3437 14 16.916 13.7629 17.338 13.341C17.7599 12.919 17.997 12.3467 17.997 11.75V5.25ZM12.247 2.5C12.0481 2.5 11.8573 2.57902 11.7167 2.71967C11.576 2.86032 11.497 3.05109 11.497 3.25V3.5H14.497V3.25C14.497 3.05109 14.418 2.86032 14.2773 2.71967C14.1367 2.57902 13.9459 2.5 13.747 2.5H12.247Z\"\n fill={fill}\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3 6C2.73478 6 2.48043 6.10536 2.29289 6.29289C2.10536 6.48043 2 6.73478 2 7V17C2 17.2652 2.10536 17.5196 2.29289 17.7071C2.48043 17.8946 2.73478 18 3 18H11C11.2652 18 11.5196 17.8946 11.7071 17.7071C11.8946 17.5196 12 17.2652 12 17V7C12 6.73478 11.8946 6.48043 11.7071 6.29289C11.5196 6.10536 11.2652 6 11 6H3ZM9.874 10.166C9.92992 10.0841 9.96904 9.99189 9.98909 9.89475C10.0091 9.79761 10.0097 9.69746 9.99081 9.6001C9.97189 9.50273 9.93385 9.41009 9.87889 9.32752C9.82392 9.24496 9.75313 9.17412 9.6706 9.1191C9.58807 9.06408 9.49545 9.02598 9.3981 9.007C9.30075 8.98802 9.2006 8.98854 9.10345 9.00852C9.0063 9.02851 8.91407 9.06757 8.83212 9.12344C8.75017 9.1793 8.68011 9.25087 8.626 9.334L6.133 13.073L5.28 12.22C5.13783 12.0875 4.94978 12.0154 4.75548 12.0188C4.56118 12.0223 4.37579 12.101 4.23838 12.2384C4.10097 12.3758 4.02225 12.5612 4.01883 12.7555C4.0154 12.9498 4.08752 13.1378 4.22 13.28L5.72 14.78C5.79844 14.8584 5.8933 14.9184 5.99773 14.9558C6.10217 14.9931 6.21359 15.0068 6.32396 14.9959C6.43434 14.985 6.54092 14.9498 6.63603 14.8927C6.73114 14.8357 6.81242 14.7582 6.874 14.666L9.874 10.166Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default BulkCheck;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Check: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M16.7045 4.15347C17.034 4.4045 17.0976 4.87509 16.8466 5.20457L8.84657 15.7046C8.71541 15.8767 8.51627 15.9838 8.30033 15.9983C8.08439 16.0129 7.87271 15.9334 7.71967 15.7804L3.21967 11.2804C2.92678 10.9875 2.92678 10.5126 3.21967 10.2197C3.51256 9.92682 3.98744 9.92682 4.28033 10.2197L8.17351 14.1129L15.6534 4.29551C15.9045 3.96603 16.3751 3.90243 16.7045 4.15347Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Check;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst CheckCircle: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10 18C14.4183 18 18 14.4183 18 10C18 5.58172 14.4183 2 10 2C5.58172 2 2 5.58172 2 10C2 14.4183 5.58172 18 10 18ZM13.8566 8.19113C14.1002 7.85614 14.0261 7.38708 13.6911 7.14345C13.3561 6.89982 12.8871 6.97388 12.6434 7.30887L9.15969 12.099L7.28033 10.2197C6.98744 9.92678 6.51256 9.92678 6.21967 10.2197C5.92678 10.5126 5.92678 10.9874 6.21967 11.2803L8.71967 13.7803C8.87477 13.9354 9.08999 14.0149 9.30867 13.9977C9.52734 13.9805 9.72754 13.8685 9.85655 13.6911L13.8566 8.19113Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default CheckCircle;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst CheckSquare: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"16\",\n height = \"16\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M11.2016 1.59961H4.80156C3.03676 1.59961 1.60156 3.03481 1.60156 4.79961V11.1996C1.60156 12.9644 3.03676 14.3996 4.80156 14.3996H11.2016C12.9664 14.3996 14.4016 12.9644 14.4016 11.1996V4.79961C14.4016 3.03481 12.9664 1.59961 11.2016 1.59961Z\"\n fill={fill}\n />\n <path\n d=\"M7.63305 10.8968L11.4331 6.09685C11.7075 5.75045 11.6491 5.24725 11.3027 4.97285C10.9555 4.69925 10.4531 4.75845 10.1787 5.10405L6.96665 9.16085L5.80025 7.86485C5.50425 7.53685 4.99945 7.50965 4.67065 7.80565C4.34265 8.10085 4.31625 8.60645 4.61145 8.93525L6.41145 10.9352C6.56265 11.104 6.77945 11.2 7.00585 11.2H7.03065C7.26665 11.1928 7.48665 11.0816 7.63305 10.8968Z\"\n fill=\"white\"\n />\n </svg>\n );\n};\n\nexport default CheckSquare;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst ChevronDown: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M5.21967 8.21967C5.51256 7.92678 5.98744 7.92678 6.28033 8.21967L10 11.9393L13.7197 8.21967C14.0126 7.92678 14.4874 7.92678 14.7803 8.21967C15.0732 8.51256 15.0732 8.98744 14.7803 9.28033L10.5303 13.5303C10.3897 13.671 10.1989 13.75 10 13.75C9.80109 13.75 9.61032 13.671 9.46967 13.5303L5.21967 9.28033C4.92678 8.98744 4.92678 8.51256 5.21967 8.21967Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default ChevronDown;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Close: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M3.75 3.75L16.25 16.25M16.25 3.75L3.75 16.25\"\n stroke={fill}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default Close;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Code: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.25 2C3.65326 2 3.08097 2.23705 2.65901 2.65901C2.23705 3.08097 2 3.65326 2 4.25V15.75C2 16.3467 2.23705 16.919 2.65901 17.341C3.08097 17.7629 3.65326 18 4.25 18H15.75C16.3467 18 16.919 17.7629 17.341 17.341C17.7629 16.919 18 16.3467 18 15.75V4.25C18 3.65326 17.7629 3.08097 17.341 2.65901C16.919 2.23705 16.3467 2 15.75 2H4.25ZM8.28 8.28C8.41248 8.13783 8.4846 7.94978 8.48118 7.75548C8.47775 7.56118 8.39903 7.37579 8.26162 7.23838C8.12421 7.10097 7.93882 7.02225 7.74452 7.01883C7.55022 7.0154 7.36217 7.08752 7.22 7.22L4.97 9.47C4.82955 9.61063 4.75066 9.80125 4.75066 10C4.75066 10.1988 4.82955 10.3894 4.97 10.53L7.22 12.78C7.36217 12.9125 7.55022 12.9846 7.74452 12.9812C7.93882 12.9777 8.12421 12.899 8.26162 12.7616C8.39903 12.6242 8.47775 12.4388 8.48118 12.2445C8.4846 12.0502 8.41248 11.8622 8.28 11.72L6.56 10L8.28 8.28ZM12.78 7.22C12.7113 7.14631 12.6285 7.08721 12.5365 7.04622C12.4445 7.00523 12.3452 6.98319 12.2445 6.98141C12.1438 6.97963 12.0438 6.99816 11.9504 7.03588C11.857 7.0736 11.7722 7.12974 11.701 7.20096C11.6297 7.27218 11.5736 7.35701 11.5359 7.4504C11.4982 7.54379 11.4796 7.64382 11.4814 7.74452C11.4832 7.84523 11.5052 7.94454 11.5462 8.03654C11.5872 8.12854 11.6463 8.21134 11.72 8.28L13.44 10L11.72 11.72C11.6463 11.7887 11.5872 11.8715 11.5462 11.9635C11.5052 12.0555 11.4832 12.1548 11.4814 12.2555C11.4796 12.3562 11.4982 12.4562 11.5359 12.5496C11.5736 12.643 11.6297 12.7278 11.701 12.799C11.7722 12.8703 11.857 12.9264 11.9504 12.9641C12.0438 13.0018 12.1438 13.0204 12.2445 13.0186C12.3452 13.0168 12.4445 12.9948 12.5365 12.9538C12.6285 12.9128 12.7113 12.8537 12.78 12.78L15.03 10.53C15.1705 10.3894 15.2493 10.1988 15.2493 10C15.2493 9.80125 15.1705 9.61063 15.03 9.47L12.78 7.22Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Code;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Computer: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 4.25C2 3.65326 2.23705 3.08097 2.65901 2.65901C3.08097 2.23705 3.65326 2 4.25 2H15.75C16.3467 2 16.919 2.23705 17.341 2.65901C17.7629 3.08097 18 3.65326 18 4.25V12.75C18 13.3467 17.7629 13.919 17.341 14.341C16.919 14.7629 16.3467 15 15.75 15H12.645C12.8403 15.6543 13.2226 16.2372 13.745 16.677C13.8625 16.7762 13.9467 16.9092 13.9861 17.0579C14.0255 17.2065 14.0182 17.3637 13.9653 17.5081C13.9123 17.6526 13.8163 17.7772 13.6901 17.8652C13.564 17.9532 13.4138 18.0002 13.26 18H6.74C6.58628 18 6.43627 17.9528 6.31027 17.8647C6.18427 17.7767 6.08838 17.652 6.03557 17.5077C5.98275 17.3633 5.97557 17.2062 6.015 17.0576C6.05443 16.9091 6.13856 16.7762 6.256 16.677C6.77799 16.2371 7.15999 15.6542 7.355 15H4.25C3.65326 15 3.08097 14.7629 2.65901 14.341C2.23705 13.919 2 13.3467 2 12.75V4.25ZM3.5 4.25C3.5 4.05109 3.57902 3.86032 3.71967 3.71967C3.86032 3.57902 4.05109 3.5 4.25 3.5H15.75C15.9489 3.5 16.1397 3.57902 16.2803 3.71967C16.421 3.86032 16.5 4.05109 16.5 4.25V11.75C16.5 11.9489 16.421 12.1397 16.2803 12.2803C16.1397 12.421 15.9489 12.5 15.75 12.5H4.25C4.05109 12.5 3.86032 12.421 3.71967 12.2803C3.57902 12.1397 3.5 11.9489 3.5 11.75V4.25Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Computer;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Copy: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M2 4.25C2 3.00736 3.00736 2 4.25 2H10.75C11.9926 2 13 3.00736 13 4.25V5.5H9.25C7.17893 5.5 5.5 7.17893 5.5 9.25V13H4.25C3.00736 13 2 11.9926 2 10.75V4.25Z\"\n fill={fill}\n />\n <path\n d=\"M9.25 7C8.00736 7 7 8.00736 7 9.25V15.75C7 16.9926 8.00736 18 9.25 18H15.75C16.9926 18 18 16.9926 18 15.75V9.25C18 8.00736 16.9926 7 15.75 7H9.25Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Copy;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Cube: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M10.362 1.093C10.2511 1.0319 10.1266 0.999851 10 0.999851C9.87341 0.999851 9.74887 1.0319 9.638 1.093L2.523 5.018L10 9.143L17.477 5.018L10.362 1.093ZM18 6.443L10.75 10.443V18.693L17.612 14.907C17.7295 14.8422 17.8275 14.7471 17.8958 14.6315C17.964 14.516 18 14.3842 18 14.25V6.443ZM9.25 18.693V10.443L2 6.443V14.25C1.99997 14.3842 2.03596 14.516 2.10421 14.6315C2.17245 14.7471 2.27046 14.8422 2.388 14.907L9.25 18.693Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Cube;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Database: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10 1C13.866 1 17 2.79 17 5C17 7.21 13.866 9 10 9C6.134 9 3 7.21 3 5C3 2.79 6.134 1 10 1ZM15.694 9.13C16.158 8.866 16.604 8.547 17 8.178V10C17 12.21 13.866 14 10 14C6.134 14 3 12.21 3 10V8.178C3.396 8.548 3.842 8.866 4.306 9.131C5.838 10.006 7.854 10.5 10 10.5C12.146 10.5 14.162 10.006 15.694 9.13ZM3 13.179V15C3 17.21 6.134 19 10 19C13.866 19 17 17.21 17 15V13.178C16.604 13.548 16.158 13.866 15.694 14.131C14.162 15.006 12.146 15.5 10 15.5C7.854 15.5 5.838 15.006 4.306 14.13C3.83547 13.8644 3.39722 13.5453 3 13.179Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Database;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst ExclamationCircle: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M18 10C18 14.4183 14.4183 18 10 18C5.58172 18 2 14.4183 2 10C2 5.58172 5.58172 2 10 2C14.4183 2 18 5.58172 18 10ZM10 5C10.4142 5 10.75 5.33579 10.75 5.75V10.25C10.75 10.6642 10.4142 11 10 11C9.58579 11 9.25 10.6642 9.25 10.25V5.75C9.25 5.33579 9.58579 5 10 5ZM10 15C10.5523 15 11 14.5523 11 14C11 13.4477 10.5523 13 10 13C9.44771 13 9 13.4477 9 14C9 14.5523 9.44771 15 10 15Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default ExclamationCircle;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst ExclamationTriangle: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8.4845 2.49499C9.15808 1.32833 10.842 1.32833 11.5156 2.495L17.7943 13.37C18.4678 14.5367 17.6259 15.995 16.2787 15.995H3.72136C2.37421 15.995 1.53224 14.5367 2.20582 13.37L8.4845 2.49499ZM10 5C10.4142 5 10.75 5.33579 10.75 5.75V9.25C10.75 9.66421 10.4142 10 10 10C9.58579 10 9.25 9.66421 9.25 9.25L9.25 5.75C9.25 5.33579 9.58579 5 10 5ZM10 14C10.5523 14 11 13.5523 11 13C11 12.4477 10.5523 12 10 12C9.44772 12 9 12.4477 9 13C9 13.5523 9.44772 14 10 14Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default ExclamationTriangle;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Gear: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.84288 1.804C7.88817 1.57739 8.01055 1.37346 8.18921 1.22689C8.36787 1.08031 8.59178 1.00014 8.82288 1H11.1829C11.414 1.00014 11.6379 1.08031 11.8165 1.22689C11.9952 1.37346 12.1176 1.57739 12.1629 1.804L12.4939 3.456C13.1923 3.72219 13.8436 4.09863 14.4229 4.571L16.0209 4.031C16.2398 3.95702 16.4775 3.96112 16.6937 4.04261C16.9099 4.1241 17.0913 4.27795 17.2069 4.478L18.3869 6.522C18.5025 6.72209 18.5453 6.95607 18.5079 7.18413C18.4706 7.4122 18.3553 7.62029 18.1819 7.773L16.9149 8.886C17.033 9.62397 17.033 10.376 16.9149 11.114L18.1819 12.227C18.3553 12.3795 18.4705 12.5874 18.5081 12.8152C18.5456 13.0431 18.5031 13.2769 18.3879 13.477L17.2079 15.522C17.0922 15.7223 16.9107 15.8763 16.6943 15.9578C16.4779 16.0393 16.2399 16.0432 16.0209 15.969L14.4229 15.429C13.8436 15.9014 13.1923 16.2778 12.4939 16.544L12.1639 18.196C12.1186 18.4226 11.9962 18.6265 11.8175 18.7731C11.6389 18.9197 11.415 18.9999 11.1839 19H8.82288C8.59178 18.9999 8.36787 18.9197 8.18921 18.7731C8.01055 18.6265 7.88817 18.4226 7.84288 18.196L7.51188 16.544C6.81342 16.2778 6.16215 15.9014 5.58288 15.429L3.98488 15.969C3.76598 16.043 3.52823 16.0389 3.31202 15.9574C3.09581 15.8759 2.91449 15.7221 2.79888 15.522L1.61888 13.478C1.50322 13.2779 1.46045 13.0439 1.49782 12.8159C1.53519 12.5878 1.65041 12.3797 1.82388 12.227L3.09088 11.113C2.97289 10.3754 2.97289 9.62364 3.09088 8.886L1.82388 7.773C1.65049 7.62047 1.53524 7.41264 1.49769 7.18478C1.46014 6.95693 1.5026 6.7231 1.61788 6.523L2.79788 4.478C2.91352 4.27773 3.09501 4.12373 3.31144 4.04223C3.52787 3.96073 3.76585 3.95676 3.98488 4.031L5.58288 4.571C6.16245 4.09852 6.81406 3.72207 7.51288 3.456L7.84288 1.804ZM10.0029 13C10.7985 13 11.5616 12.6839 12.1242 12.1213C12.6868 11.5587 13.0029 10.7956 13.0029 10C13.0029 9.20435 12.6868 8.44129 12.1242 7.87868C11.5616 7.31607 10.7985 7 10.0029 7C9.20723 7 8.44416 7.31607 7.88156 7.87868C7.31895 8.44129 7.00288 9.20435 7.00288 10C7.00288 10.7956 7.31895 11.5587 7.88156 12.1213C8.44416 12.6839 9.20723 13 10.0029 13Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Gear;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Globe: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M18 10C18 14.4183 14.4183 18 10 18C5.58172 18 2 14.4183 2 10C2 5.58172 5.58172 2 10 2C14.4183 2 18 5.58172 18 10ZM16.4969 10.2041C16.389 13.6995 13.5216 16.5 10 16.5C6.41015 16.5 3.5 13.5899 3.5 10C3.5 7.12656 5.36451 4.68861 7.94969 3.82998L6.92671 5.62019C6.60171 6.18894 6.69759 6.90485 7.16078 7.36805C7.6029 7.81017 8.27833 7.91977 8.83757 7.64015L9.0123 7.55279C9.08173 7.51807 9.15829 7.5 9.23591 7.5H9.38181C9.5712 7.5 9.74433 7.607 9.82902 7.77639C9.8994 7.91716 9.8994 8.08284 9.82902 8.22361L9.80123 8.27919C9.73357 8.41452 9.59525 8.5 9.44395 8.5H8.9418C8.18614 8.5 7.48048 8.87766 7.06131 9.50641L7.01751 9.57212C6.65828 10.111 6.56795 10.7855 6.77274 11.3998C6.98201 12.0276 7.47787 12.5197 8.10338 12.7282C8.33997 12.8071 8.49984 13.0292 8.49984 13.2749V14.3246C8.49984 14.9738 9.02608 15.5 9.67523 15.5C10.0323 15.5 10.37 15.3377 10.5931 15.0589L12.2044 13.0446C12.3957 12.8056 12.4998 12.5086 12.4998 12.2025C12.4998 11.8866 12.6279 11.5791 12.8531 11.3539C13.3088 10.8982 13.3864 10.1784 13.0257 9.63738L12.5617 8.94145C12.5214 8.88091 12.4998 8.80979 12.4998 8.73703C12.4998 8.43336 12.8465 8.26002 13.0895 8.44222L13.4322 8.69925C13.748 8.93609 14.1704 8.97373 14.523 8.79746C14.7488 8.68456 15.0216 8.72887 15.1996 8.90689L16.4969 10.2041Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Globe;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Hashtag: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M13.3516 2.00712C13.7619 2.06371 14.0488 2.44249 13.9922 2.85282L13.5576 6.00028H16.6973C17.1115 6.00028 17.4473 6.33607 17.4473 6.75028C17.4473 7.16448 17.1115 7.50028 16.6973 7.50028H13.3516L12.6611 12.5003H15.8008C16.215 12.5003 16.5508 12.8361 16.5508 13.2503C16.5508 13.6645 16.215 14.0003 15.8008 14.0003H12.4551L11.9922 17.3528C11.9356 17.7631 11.5568 18.05 11.1465 17.9934C10.7362 17.9368 10.4493 17.558 10.5059 17.1477L10.9404 14.0003H7.95508L7.49219 17.3528C7.43556 17.7631 7.05679 18.05 6.64648 17.9934C6.23622 17.9368 5.94927 17.558 6.00586 17.1477L6.44043 14.0003H3.30078C2.88658 14.0003 2.5508 13.6645 2.55078 13.2503C2.55078 12.8361 2.88657 12.5003 3.30078 12.5003H6.64648L7.33691 7.50028H4.19727C3.78309 7.50024 3.44728 7.16446 3.44727 6.75028C3.44727 6.33609 3.78308 6.00032 4.19727 6.00028H7.54297L8.00586 2.64774C8.06245 2.23743 8.44125 1.95055 8.85156 2.00712C9.26189 2.06371 9.54878 2.44249 9.49219 2.85282L9.05762 6.00028H12.043L12.5059 2.64774C12.5625 2.23743 12.9413 1.95055 13.3516 2.00712ZM8.85156 7.50028L8.16113 12.5003H11.1465L11.8369 7.50028H8.85156Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Hashtag;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Home: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.29292 2.29289C9.68345 1.90237 10.3166 1.90237 10.7071 2.29289L17.7071 9.29289C17.9931 9.57889 18.0787 10.009 17.9239 10.3827C17.7691 10.7564 17.4045 11 17 11H16V17C16 17.5523 15.5523 18 15 18H13C12.4477 18 12 17.5523 12 17V14C12 13.4477 11.5523 13 11 13H9.00003C8.44774 13 8.00003 13.4477 8.00003 14V17C8.00003 17.5523 7.55231 18 7.00003 18H5.00003C4.44774 18 4.00003 17.5523 4.00003 17V11H3.00003C2.59557 11 2.23093 10.7564 2.07615 10.3827C1.92137 10.009 2.00692 9.57889 2.29292 9.29289L9.29292 2.29289Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Home;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Inbox: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 40 40\"\n fill=\"none\"\n >\n <path\n d=\"M3.75 22.5H10.1824C11.6028 22.5 12.9013 23.3025 13.5365 24.5729L13.9635 25.4271C14.5987 26.6975 15.8972 27.5 17.3176 27.5H22.6824C24.1028 27.5 25.4013 26.6975 26.0365 25.4271L26.4635 24.5729C27.0987 23.3025 28.3972 22.5 29.8176 22.5H36.25M3.75 23.0639V30C3.75 32.0711 5.42893 33.75 7.5 33.75H32.5C34.5711 33.75 36.25 32.0711 36.25 30V23.0639C36.25 22.6901 36.1941 22.3183 36.0842 21.9611L32.0645 8.89718C31.5804 7.32371 30.1266 6.25 28.4803 6.25H11.5197C9.87339 6.25 8.41963 7.32371 7.93548 8.89718L3.91583 21.9611C3.80589 22.3183 3.75 22.6901 3.75 23.0639Z\"\n stroke={fill}\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default Inbox;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst InformationCircle: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M10 2C14.4183 2 18 5.58172 18 10C18 14.4183 14.4183 18 10 18C5.58172 18 2 14.4183 2 10C2 5.58172 5.58172 2 10 2ZM9 9C8.58579 9 8.25 9.33579 8.25 9.75C8.25 10.1642 8.58579 10.5 9 10.5H9.25293C9.41287 10.5 9.53176 10.6486 9.49707 10.8047L9.03809 12.8701C8.79522 13.963 9.62751 15 10.7471 15H11C11.4142 15 11.75 14.6642 11.75 14.25C11.75 13.8358 11.4142 13.5 11 13.5H10.7471C10.5871 13.5 10.4682 13.3514 10.5029 13.1953L10.9619 11.1299C11.2048 10.037 10.3725 9 9.25293 9H9ZM10 5C9.44771 5 9 5.44772 9 6C9 6.55228 9.44771 7 10 7C10.5523 7 11 6.55228 11 6C11 5.44772 10.5523 5 10 5Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default InformationCircle;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst InformationCircleMicro: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"16\",\n height = \"16\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M15 8C15 11.866 11.866 15 8 15C4.13401 15 1 11.866 1 8C1 4.13401 4.13401 1 8 1C11.866 1 15 4.13401 15 8ZM9 5C9 5.55228 8.55228 6 8 6C7.44772 6 7 5.55228 7 5C7 4.44772 7.44772 4 8 4C8.55228 4 9 4.44772 9 5ZM6.75 8C6.33579 8 6 8.33579 6 8.75C6 9.16421 6.33579 9.5 6.75 9.5H7.5V11.25C7.5 11.6642 7.83579 12 8.25 12C8.66421 12 9 11.6642 9 11.25V8.75C9 8.33579 8.66421 8 8.25 8H6.75Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default InformationCircleMicro;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Lamp: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M10.0001 1C8.76409 0.99999 7.55829 1.38167 6.54746 2.09287C5.53662 2.80407 4.77008 3.81008 4.35262 4.9734C3.93516 6.13672 3.88714 7.40058 4.21512 8.59222C4.54311 9.78387 5.2311 10.8451 6.18505 11.631C7.23705 12.5 8.00005 13.443 8.00005 14.456V15.1C7.99995 15.268 8.05628 15.4312 8.16 15.5634C8.26372 15.6956 8.40883 15.7891 8.57205 15.829C9.51025 16.0582 10.4899 16.0582 11.4281 15.829C11.5913 15.7891 11.7364 15.6956 11.8401 15.5634C11.9438 15.4312 12.0001 15.268 12.0001 15.1V14.456C12.0001 13.443 12.7621 12.499 13.8151 11.631C14.769 10.8451 15.457 9.78387 15.785 8.59222C16.113 7.40058 16.0649 6.13672 15.6475 4.9734C15.23 3.81008 14.4635 2.80407 13.4526 2.09287C12.4418 1.38167 11.236 0.99999 10.0001 1ZM8.86305 17.414C8.76568 17.3992 8.66633 17.4036 8.57069 17.4272C8.47505 17.4508 8.38498 17.4929 8.30563 17.5513C8.14538 17.6691 8.03852 17.8458 8.00855 18.0425C7.97858 18.2392 8.02796 18.4397 8.14583 18.5999C8.2637 18.7602 8.44039 18.867 8.63705 18.897C9.54052 19.0344 10.4596 19.0344 11.3631 18.897C11.5597 18.867 11.7364 18.7602 11.8543 18.5999C11.9721 18.4397 12.0215 18.2392 11.9916 18.0425C11.9616 17.8458 11.8547 17.6691 11.6945 17.5513C11.5342 17.4334 11.3337 17.384 11.1371 17.414C10.3834 17.5288 9.61671 17.5288 8.86305 17.414Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Lamp;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst LockOpen: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"16\",\n height = \"16\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M11.5 1C9.567 1 8 2.567 8 4.5V7H2.5C1.67157 7 1 7.67157 1 8.5V13.5C1 14.3284 1.67157 15 2.5 15H9.5C10.3284 15 11 14.3284 11 13.5V8.5C11 7.67157 10.3284 7 9.5 7V4.5C9.5 3.39543 10.3954 2.5 11.5 2.5C12.6046 2.5 13.5 3.39543 13.5 4.5V6.25C13.5 6.66421 13.8358 7 14.25 7C14.6642 7 15 6.66421 15 6.25V4.5C15 2.567 13.433 1 11.5 1Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default LockOpen;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Minus: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"16\",\n height = \"16\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3.75 7.25C3.33579 7.25 3 7.58579 3 8C3 8.41421 3.33579 8.75 3.75 8.75L12.25 8.75C12.6642 8.75 13 8.41421 13 8C13 7.58579 12.6642 7.25 12.25 7.25H3.75Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Minus;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst PaperPlaneIcon: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.10526 2.28868C2.85362 2.25302 2.60104 2.34722 2.43421 2.53895C2.26738 2.73068 2.209 2.99386 2.27911 3.23815L3.69276 8.16402C3.87733 8.80713 4.4655 9.25024 5.13456 9.25024H11.25C11.6642 9.25024 12 9.58603 12 10.0002C12 10.4145 11.6642 10.7502 11.25 10.7502H5.13457C4.4655 10.7502 3.87733 11.1934 3.69277 11.8365L2.27911 16.7624C2.209 17.0067 2.26738 17.2698 2.43421 17.4616C2.60104 17.6533 2.85362 17.7475 3.10526 17.7118C8.94303 16.8844 14.221 14.319 18.3983 10.5576C18.5563 10.4154 18.6465 10.2128 18.6465 10.0003C18.6465 9.7877 18.5563 9.58513 18.3983 9.4429C14.221 5.68154 8.94303 3.1161 3.10526 2.28868Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default PaperPlaneIcon;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Pencil: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M2.69533 14.7623L1.43355 17.9168C1.27028 18.3249 1.67532 18.73 2.08348 18.5667L5.23795 17.3049C5.74091 17.1037 6.19777 16.8025 6.58081 16.4194L17.5 5.50072C18.3284 4.67229 18.3284 3.32914 17.5 2.50072C16.6716 1.67229 15.3284 1.67229 14.5 2.50071L3.58081 13.4194C3.19777 13.8025 2.89652 14.2593 2.69533 14.7623Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Pencil;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst PieChart: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M12 8.99908C11.7348 8.99908 11.4804 8.89372 11.2929 8.70618C11.1054 8.51865 11 8.26429 11 7.99908V2.99908C11 2.44708 11.45 1.99208 11.997 2.06908C13.4939 2.28487 14.8808 2.97941 15.9502 4.04884C17.0197 5.11828 17.7142 6.50515 17.93 8.00208C18.008 8.54908 17.552 8.99908 17 8.99908H12Z\"\n fill={fill}\n />\n <path\n d=\"M8.003 4.07083C8.55 3.99483 9 4.44982 9 5.00082V10.0008C9 10.266 9.10536 10.5204 9.29289 10.7079C9.48043 10.8955 9.73478 11.0008 10 11.0008H15C15.552 11.0008 16.008 11.4508 15.93 11.9978C15.6769 13.7491 14.77 15.3396 13.3918 16.4494C12.0135 17.5591 10.2662 18.1058 8.5012 17.9795C6.73622 17.8532 5.08455 17.0632 3.87841 15.7685C2.67226 14.4737 2.00113 12.7703 2 11.0008C2.00009 9.31693 2.60701 7.68946 3.70953 6.41668C4.81205 5.1439 6.33633 4.31107 8.003 4.07083Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default PieChart;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Pipeline: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8.157 2.17646C7.78976 2.02451 7.37724 2.02451 7.01 2.17646L2.926 3.86646C2.65219 3.97987 2.41812 4.17185 2.25331 4.41817C2.08851 4.66448 2.00036 4.9541 2 5.25046V16.1275C1.99997 16.3742 2.06079 16.617 2.17705 16.8346C2.29332 17.0522 2.46146 17.2377 2.66656 17.3748C2.87167 17.5118 3.10741 17.5962 3.35291 17.6204C3.59841 17.6446 3.84609 17.6079 4.074 17.5135L7.584 16.0615L11.844 17.8235C12.2109 17.9751 12.6231 17.9751 12.99 17.8235L17.073 16.1335C17.3468 16.0203 17.581 15.8285 17.746 15.5824C17.911 15.3363 17.9994 15.0468 18 14.7505V3.87246C18 3.6259 17.9391 3.38315 17.8229 3.1657C17.7067 2.94824 17.5387 2.76278 17.3337 2.62574C17.1287 2.4887 16.8932 2.4043 16.6478 2.38001C16.4024 2.35571 16.1549 2.39228 15.927 2.48646L12.417 3.93846L8.157 2.17646ZM7.58 5.00046C7.77891 5.00046 7.96968 5.07948 8.11033 5.22013C8.25098 5.36079 8.33 5.55155 8.33 5.75046V12.2505C8.33 12.4494 8.25098 12.6401 8.11033 12.7808C7.96968 12.9214 7.77891 13.0005 7.58 13.0005C7.38109 13.0005 7.19032 12.9214 7.04967 12.7808C6.90902 12.6401 6.83 12.4494 6.83 12.2505V5.75046C6.83 5.55155 6.90902 5.36079 7.04967 5.22013C7.19032 5.07948 7.38109 5.00046 7.58 5.00046ZM13.17 7.75046C13.17 7.55155 13.091 7.36079 12.9503 7.22013C12.8097 7.07948 12.6189 7.00046 12.42 7.00046C12.2211 7.00046 12.0303 7.07948 11.8897 7.22013C11.749 7.36079 11.67 7.55155 11.67 7.75046V14.2505C11.67 14.4494 11.749 14.6401 11.8897 14.7808C12.0303 14.9214 12.2211 15.0005 12.42 15.0005C12.6189 15.0005 12.8097 14.9214 12.9503 14.7808C13.091 14.6401 13.17 14.4494 13.17 14.2505V7.75046Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Pipeline;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Plus: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"16\",\n height = \"16\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M8.75 3.75C8.75 3.33579 8.41421 3 8 3C7.58579 3 7.25 3.33579 7.25 3.75V7.25H3.75C3.33579 7.25 3 7.58579 3 8C3 8.41421 3.33579 8.75 3.75 8.75L7.25 8.75V12.25C7.25 12.6642 7.58579 13 8 13C8.41421 13 8.75 12.6642 8.75 12.25V8.75L12.25 8.75C12.6642 8.75 13 8.41421 13 8C13 7.58579 12.6642 7.25 12.25 7.25H8.75V3.75Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Plus;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Profile: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M10.0036 8C10.7993 8 11.5623 7.68393 12.1249 7.12132C12.6875 6.55871 13.0036 5.79565 13.0036 5C13.0036 4.20435 12.6875 3.44129 12.1249 2.87868C11.5623 2.31607 10.7993 2 10.0036 2C9.20797 2 8.44491 2.31607 7.8823 2.87868C7.31969 3.44129 7.00362 4.20435 7.00362 5C7.00362 5.79565 7.31969 6.55871 7.8823 7.12132C8.44491 7.68393 9.20797 8 10.0036 8ZM3.46862 14.493C3.37578 14.7411 3.36554 15.0126 3.43941 15.267C3.51329 15.5214 3.66733 15.7452 3.87862 15.905C5.62995 17.266 7.7856 18.0034 10.0036 18C12.3136 18 14.4416 17.216 16.1346 15.9C16.5646 15.567 16.7386 14.997 16.5426 14.49C16.0349 13.168 15.1382 12.0311 13.9709 11.2292C12.8037 10.4274 11.4207 9.99829 10.0046 9.99861C8.58845 9.99894 7.20569 10.4287 6.03881 11.231C4.87193 12.0334 3.97578 13.1708 3.46862 14.493Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Profile;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst QuestionCircle: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"16\",\n height = \"16\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M15 8C15 11.866 11.866 15 8 15C4.13401 15 1 11.866 1 8C1 4.13401 4.13401 1 8 1C11.866 1 15 4.13401 15 8ZM9 11.5C9 12.0523 8.55228 12.5 8 12.5C7.44772 12.5 7 12.0523 7 11.5C7 10.9477 7.44772 10.5 8 10.5C8.55228 10.5 9 10.9477 9 11.5ZM7.29303 5.29289C7.68355 4.90237 8.31671 4.90237 8.70724 5.29289C9.09776 5.68342 9.09776 6.31658 8.70724 6.70711C8.58354 6.83081 8.43743 6.91429 8.2827 6.95959C7.82404 7.09387 7.25013 7.52576 7.25013 8.25V8.50022C7.25013 8.91444 7.58592 9.25022 8.00013 9.25022C8.41435 9.25022 8.75013 8.91444 8.75013 8.50022V8.38522C9.12313 8.26818 9.47391 8.06176 9.7679 7.76777C10.7442 6.79146 10.7442 5.20854 9.7679 4.23223C8.79159 3.25592 7.20868 3.25592 6.23237 4.23223C5.93947 4.52513 5.93947 5 6.23237 5.29289C6.52526 5.58579 7.00013 5.58579 7.29303 5.29289Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default QuestionCircle;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst RocketLaunch: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.60597 12.9691C4.85946 13.2967 4.79938 13.7678 4.47179 14.0213C3.87925 14.4798 3.5 15.1954 3.5 16C3.5 16.1569 3.51437 16.31 3.54177 16.4582C3.68996 16.4856 3.84307 16.5 4 16.5C4.80458 16.5 5.52023 16.1208 5.97873 15.5282C6.23222 15.2006 6.70328 15.1405 7.03087 15.394C7.35846 15.6475 7.41854 16.1186 7.16505 16.4462C6.4347 17.39 5.2884 18 4 18C3.54003 18 3.09667 17.9221 2.6834 17.778C2.46722 17.7027 2.29728 17.5328 2.22195 17.3166C2.07794 16.9033 2 16.46 2 16C2 14.7116 2.60997 13.5653 3.55383 12.835C3.88142 12.5815 4.35248 12.6415 4.60597 12.9691Z\"\n fill={fill}\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M5.75236 12C6.40714 12.8376 7.16237 13.5929 8 14.2476V18.25C8 18.6642 8.33579 19 8.75 19C11.5114 19 13.75 16.7614 13.75 14C13.75 13.5097 13.6792 13.035 13.5471 12.5861C16.8467 10.2297 19 6.36651 19 2C19 1.91234 18.9991 1.82486 18.9974 1.73759C18.9894 1.33502 18.665 1.01058 18.2624 1.0026C18.1751 1.00087 18.0877 1 18 1C13.6335 1 9.77032 3.15331 7.41387 6.45291C6.96496 6.32078 6.49028 6.25 6 6.25C3.23858 6.25 1 8.48858 1 11.25C1 11.6642 1.33579 12 1.75 12H5.75236ZM13 9C14.1046 9 15 8.10457 15 7C15 5.89543 14.1046 5 13 5C11.8954 5 11 5.89543 11 7C11 8.10457 11.8954 9 13 9Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default RocketLaunch;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Search: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 16C12.866 16 16 12.866 16 9C16 5.13401 12.866 2 9 2C5.13401 2 2 5.13401 2 9C2 12.866 5.13401 16 9 16Z\"\n stroke={fill}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M18 18L14 14\"\n stroke={fill}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default Search;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst SearchDocument: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M8 10C8 9.60218 8.15804 9.22064 8.43934 8.93934C8.72064 8.65804 9.10218 8.5 9.5 8.5C9.89782 8.5 10.2794 8.65804 10.5607 8.93934C10.842 9.22064 11 9.60218 11 10C11 10.3978 10.842 10.7794 10.5607 11.0607C10.2794 11.342 9.89782 11.5 9.5 11.5C9.10218 11.5 8.72064 11.342 8.43934 11.0607C8.15804 10.7794 8 10.3978 8 10Z\"\n fill={fill}\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.5 2C4.10218 2 3.72064 2.15804 3.43934 2.43934C3.15804 2.72065 3 3.10218 3 3.5V16.5C3 16.8978 3.15804 17.2794 3.43934 17.5607C3.72064 17.842 4.10218 18 4.5 18H15.5C15.8978 18 16.2794 17.842 16.5607 17.5607C16.842 17.2794 17 16.8978 17 16.5V7.621C16.9997 7.22331 16.8414 6.84204 16.56 6.561L12.44 2.439C12.3005 2.29961 12.1349 2.1891 11.9527 2.11377C11.7705 2.03844 11.5752 1.99978 11.378 2H4.5ZM9.5 7C9.03881 7.00024 8.58388 7.10681 8.17056 7.31143C7.75725 7.51605 7.39667 7.8132 7.11685 8.17981C6.83703 8.54641 6.64551 8.9726 6.55715 9.42525C6.46879 9.8779 6.48598 10.3448 6.60739 10.7897C6.7288 11.2347 6.95116 11.6456 7.25718 11.9906C7.5632 12.3357 7.94466 12.6055 8.3719 12.7792C8.79915 12.9528 9.26068 13.0257 9.72064 12.992C10.1806 12.9583 10.6266 12.819 11.024 12.585L12.22 13.78C12.2887 13.8537 12.3715 13.9128 12.4635 13.9538C12.5555 13.9948 12.6548 14.0168 12.7555 14.0186C12.8562 14.0204 12.9562 14.0018 13.0496 13.9641C13.143 13.9264 13.2278 13.8703 13.299 13.799C13.3703 13.7278 13.4264 13.643 13.4641 13.5496C13.5018 13.4562 13.5204 13.3562 13.5186 13.2555C13.5168 13.1548 13.4948 13.0555 13.4538 12.9635C13.4128 12.8715 13.3537 12.7887 13.28 12.72L12.085 11.524C12.3538 11.0683 12.4972 10.5496 12.5009 10.0206C12.5045 9.49158 12.3682 8.97099 12.1057 8.51165C11.8432 8.0523 11.464 7.67053 11.0063 7.40506C10.5487 7.13958 10.029 6.99984 9.5 7Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default SearchDocument;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst SearchSQL: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M6.5 9C6.5 8.33696 6.76339 7.70107 7.23223 7.23223C7.70107 6.76339 8.33696 6.5 9 6.5C9.66304 6.5 10.2989 6.76339 10.7678 7.23223C11.2366 7.70107 11.5 8.33696 11.5 9C11.5 9.66304 11.2366 10.2989 10.7678 10.7678C10.2989 11.2366 9.66304 11.5 9 11.5C8.33696 11.5 7.70107 11.2366 7.23223 10.7678C6.76339 10.2989 6.5 9.66304 6.5 9Z\"\n fill={fill}\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10 18C12.1217 18 14.1566 17.1571 15.6569 15.6569C17.1571 14.1566 18 12.1217 18 10C18 7.87827 17.1571 5.84344 15.6569 4.34315C14.1566 2.84285 12.1217 2 10 2C7.87827 2 5.84344 2.84285 4.34315 4.34315C2.84285 5.84344 2 7.87827 2 10C2 12.1217 2.84285 14.1566 4.34315 15.6569C5.84344 17.1571 7.87827 18 10 18ZM9 5C8.37415 5.0001 7.75705 5.14706 7.19833 5.42906C6.63961 5.71106 6.15485 6.12023 5.78304 6.62367C5.41124 7.12711 5.16275 7.71077 5.05756 8.32773C4.95238 8.94468 4.99343 9.5777 5.17741 10.1759C5.3614 10.7741 5.68319 11.3208 6.1169 11.772C6.55061 12.2232 7.08415 12.5663 7.67462 12.7738C8.26508 12.9813 8.89599 13.0473 9.51661 12.9666C10.1372 12.8859 10.7303 12.6606 11.248 12.309L12.72 13.78C12.7887 13.8537 12.8715 13.9128 12.9635 13.9538C13.0555 13.9948 13.1548 14.0168 13.2555 14.0186C13.3562 14.0204 13.4562 14.0018 13.5496 13.9641C13.643 13.9264 13.7278 13.8703 13.799 13.799C13.8703 13.7278 13.9264 13.643 13.9641 13.5496C14.0018 13.4562 14.0204 13.3562 14.0186 13.2555C14.0168 13.1548 13.9948 13.0555 13.9538 12.9635C13.9128 12.8715 13.8537 12.7887 13.78 12.72L12.309 11.248C12.7176 10.6467 12.9546 9.94532 12.9944 9.21939C13.0343 8.49346 12.8756 7.77039 12.5353 7.1279C12.195 6.48542 11.6861 5.94782 11.0632 5.5729C10.4403 5.19798 9.72702 4.99992 9 5Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default SearchSQL;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Sitemap: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 14 16\"\n fill=\"none\"\n >\n <path\n d=\"M7 5V8\"\n stroke={fill}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3 11V9C3 8.4477 3.4477 8 4 8H10C10.5523 8 11 8.4477 11 9V11\"\n stroke={fill}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7 5C8.10457 5 9 4.10457 9 3C9 1.89543 8.10457 1 7 1C5.89543 1 5 1.89543 5 3C5 4.10457 5.89543 5 7 5Z\"\n stroke={fill}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3 15C4.10457 15 5 14.1046 5 13C5 11.8954 4.10457 11 3 11C1.89543 11 1 11.8954 1 13C1 14.1046 1.89543 15 3 15Z\"\n stroke={fill}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M11 15C12.1046 15 13 14.1046 13 13C13 11.8954 12.1046 11 11 11C9.89543 11 9 11.8954 9 13C9 14.1046 9.89543 15 11 15Z\"\n stroke={fill}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default Sitemap;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst TetraScienceIcon: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"21\",\n height = \"21\",\n}) => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M22.392 10.5705C21.693 5.4495 17.313 1.5 12 1.5C6.201 1.5 1.5 6.201 1.5 12C1.5 14.064 2.1045 15.9825 3.132 17.6055L1.5 22.5L6.3945 20.868C7.6395 21.657 9.06 22.188 10.584 22.3965\"\n stroke={fill}\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M17.625 12.75L18.75 16.5L22.5 17.625L18.75 18.75L17.625 22.5L16.5 18.75L12.75 17.625L16.5 16.5L17.625 12.75Z\"\n fill={fill}\n stroke={fill}\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default TetraScienceIcon;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Text: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n >\n <path\n d=\"M13 1H1\"\n stroke={fill}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7 13V1\"\n stroke={fill}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default Text;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst Trash: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"20\",\n height = \"20\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M11.2502 1C12.769 1 14.0002 2.23122 14.0002 3.75V4.19238C14.7954 4.26939 15.5841 4.3694 16.3655 4.49121C16.7747 4.555 17.0551 4.93847 16.9914 5.34766C16.9276 5.75685 16.5442 6.0373 16.135 5.97363C16.0856 5.96593 16.036 5.95771 15.9865 5.9502L15.1448 16.4697C15.0302 17.8987 13.8371 19 12.4035 19H7.5969C6.16331 19 4.97024 17.8987 4.85569 16.4697L4.01389 5.9502C3.96456 5.9577 3.91473 5.96595 3.86545 5.97363C3.45635 6.03717 3.07279 5.75678 3.00901 5.34766C2.94536 4.93848 3.2258 4.555 3.63499 4.49121C4.41637 4.3694 5.205 4.2694 6.00022 4.19238V3.75C6.00022 2.23122 7.23144 1 8.75022 1H11.2502ZM7.80002 7.00098C7.41217 7.01665 7.10455 7.32382 7.08127 7.70312V7.78027L7.38108 15.2803C7.39779 15.694 7.74659 16.0156 8.16038 15.999C8.57421 15.9824 8.89666 15.6336 8.8801 15.2197L8.57932 7.71973L8.57249 7.64355C8.51897 7.26722 8.18803 6.98546 7.80002 7.00098ZM12.2004 7.00098C11.7866 6.98443 11.4378 7.30599 11.4211 7.71973L11.1213 15.2197C11.1048 15.6335 11.4263 15.9823 11.8401 15.999C12.2538 16.0156 12.6026 15.694 12.6194 15.2803L12.9201 7.78027C12.9367 7.36644 12.6142 7.01761 12.2004 7.00098ZM8.75022 2.5C8.05986 2.5 7.50022 3.05964 7.50022 3.75V4.0752C8.32725 4.02543 9.16083 4 10.0002 4C10.8396 4 11.6732 4.02544 12.5002 4.0752V3.75C12.5002 3.05964 11.9406 2.5 11.2502 2.5H8.75022Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default Trash;\n","import React from \"react\";\n\nimport type { IconProps } from \"@atoms/Icon\";\n\nconst ViewfinderCircle: React.FC<IconProps> = ({\n fill = \"currentColor\",\n width = \"16\",\n height = \"16\",\n}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3.75 2C2.7835 2 2 2.7835 2 3.75V5.25C2 5.66421 2.33579 6 2.75 6C3.16421 6 3.5 5.66421 3.5 5.25V3.75C3.5 3.61193 3.61193 3.5 3.75 3.5H5.25C5.66421 3.5 6 3.16421 6 2.75C6 2.33579 5.66421 2 5.25 2H3.75Z\"\n fill={fill}\n />\n <path\n d=\"M10.75 2C10.3358 2 10 2.33579 10 2.75C10 3.16421 10.3358 3.5 10.75 3.5H12.25C12.3881 3.5 12.5 3.61193 12.5 3.75V5.25C12.5 5.66421 12.8358 6 13.25 6C13.6642 6 14 5.66421 14 5.25V3.75C14 2.7835 13.2165 2 12.25 2H10.75Z\"\n fill={fill}\n />\n <path\n d=\"M3.5 10.75C3.5 10.3358 3.16421 10 2.75 10C2.33579 10 2 10.3358 2 10.75V12.25C2 13.2165 2.7835 14 3.75 14H5.25C5.66421 14 6 13.6642 6 13.25C6 12.8358 5.66421 12.5 5.25 12.5H3.75C3.61193 12.5 3.5 12.3881 3.5 12.25V10.75Z\"\n fill={fill}\n />\n <path\n d=\"M14 10.75C14 10.3358 13.6642 10 13.25 10C12.8358 10 12.5 10.3358 12.5 10.75V12.25C12.5 12.3881 12.3881 12.5 12.25 12.5H10.75C10.3358 12.5 10 12.8358 10 13.25C10 13.6642 10.3358 14 10.75 14H12.25C13.2165 14 14 13.2165 14 12.25V10.75Z\"\n fill={fill}\n />\n <path\n d=\"M8 10C9.10457 10 10 9.10457 10 8C10 6.89543 9.10457 6 8 6C6.89543 6 6 6.89543 6 8C6 9.10457 6.89543 10 8 10Z\"\n fill={fill}\n />\n </svg>\n );\n};\n\nexport default ViewfinderCircle;\n","import Bars3BottomLeft from \"@assets/icon/Bars3BottomLeft\";\nimport Building from \"@assets/icon/Building\";\nimport BulkCheck from \"@assets/icon/BulkCheck\";\nimport Check from \"@assets/icon/Check\";\nimport CheckCircle from \"@assets/icon/CheckCircle\";\nimport CheckSquare from \"@assets/icon/CheckSquare\";\nimport ChevronDown from \"@assets/icon/ChevronDown\";\nimport Close from \"@assets/icon/Close\";\nimport Code from \"@assets/icon/Code\";\nimport Computer from \"@assets/icon/Computer\";\nimport Copy from \"@assets/icon/Copy\";\nimport Cube from \"@assets/icon/Cube\";\nimport Database from \"@assets/icon/Database\";\nimport ExclamationCircle from \"@assets/icon/ExclamationCircle\";\nimport ExclamationTriangle from \"@assets/icon/ExclamationTriangle\";\nimport Gear from \"@assets/icon/Gear\";\nimport Globe from \"@assets/icon/Globe\";\nimport Hashtag from \"@assets/icon/Hashtag\";\nimport Home from \"@assets/icon/Home\";\nimport Inbox from \"@assets/icon/Inbox\";\nimport InformationCircle from \"@assets/icon/InformationCircle\";\nimport InformationCircleMicro from \"@assets/icon/InformationCircleMicro\";\nimport Lamp from \"@assets/icon/Lamp\";\nimport LockOpen from \"@assets/icon/LockOpen\";\nimport Minus from \"@assets/icon/Minus\";\nimport PaperPlaneIcon from \"@assets/icon/PaperPlane\";\nimport Pencil from \"@assets/icon/Pencil\";\nimport PieChart from \"@assets/icon/PieChart\";\nimport Pipeline from \"@assets/icon/Pipeline\";\nimport Plus from \"@assets/icon/Plus\";\nimport Profile from \"@assets/icon/Profile\";\nimport QuestionCircle from \"@assets/icon/QuestionCircle\";\nimport RocketLaunch from \"@assets/icon/RocketLaunch\";\nimport Search from \"@assets/icon/Search\";\nimport SearchDocument from \"@assets/icon/SearchDocument\";\nimport SearchSQL from \"@assets/icon/SearchSQL\";\nimport Sitemap from \"@assets/icon/Sitemap\";\nimport TetraScienceIcon from \"@assets/icon/TetraScienceIcon\";\nimport Text from \"@assets/icon/Text\";\nimport Trash from \"@assets/icon/Trash\";\nimport ViewfinderCircle from \"@assets/icon/ViewfinderCircle\";\n\nimport type { ReactElement } from \"react\";\n\nexport interface IconsProps {\n fill?: string;\n width?: string;\n height?: string;\n name: IconName;\n}\n\nexport interface IconProps {\n fill?: string;\n width?: string;\n height?: string;\n}\n\nexport enum IconName {\n BARS_3_BOTTOM_LEFT = \"bars-3-bottom-left\",\n BUILDING = \"building\",\n BULK_CHECK = \"bulk-check\",\n CHECK = \"check\",\n CHECK_CIRCLE = \"check-circle\",\n CHECK_SQUARE = \"check-square\",\n CHEVRON_DOWN = \"chevron-down\",\n CLOSE = \"close\",\n CODE = \"code\",\n COMPUTER = \"computer\",\n COPY = \"copy\",\n CUBE = \"cube\",\n DATABASE = \"database\",\n EXCLAMATION_CIRCLE = \"exclamation-circle\",\n EXCLAMATION_TRIANGLE = \"exclamation-triangle\",\n GEAR = \"gear\",\n GLobe = \"globe\",\n HASHTAG = \"hashtag\",\n HOME = \"home\",\n INBOX = \"inbox\",\n INFORMATION_CIRCLE = \"information-circle\",\n INFORMATION_CIRCLE_MICRO = \"information-circle-micro\",\n LAMP = \"lamp\",\n LOCK_OPEN = \"lock-open\",\n MINUS = \"minus\",\n PAPER_PLANE = \"paper-plane\",\n PENCIL = \"pencil\",\n PIE_CHART = \"pie-chart\",\n PIPELINE = \"pipeline\",\n PLUS = \"plus\",\n PROFILE = \"profile\",\n QUESTION_CIRCLE = \"question-circle\",\n ROCKET_LAUNCH = \"rocket-launch\",\n SEARCH = \"search\",\n SEARCH_DOCUMENT = \"search-document\",\n SEARCH_SQL = \"search-sql\",\n SITEMAP = \"sitemap\",\n TETRASCIENCE_ICON = \"tetrascience-icon\",\n TEXT = \"text\",\n TRASH = \"trash\",\n VIEWFINDER_CIRCLE = \"viewfinder-circle\",\n}\n\nconst Icon = (props: IconsProps) => {\n let svg: ReactElement | null = null;\n const { name } = props;\n\n switch (name) {\n case IconName.BARS_3_BOTTOM_LEFT:\n svg = <Bars3BottomLeft {...props} />;\n break;\n case IconName.BUILDING:\n svg = <Building {...props} />;\n break;\n case IconName.BULK_CHECK:\n svg = <BulkCheck {...props} />;\n break;\n case IconName.CHECK:\n svg = <Check {...props} />;\n break;\n case IconName.CHECK_CIRCLE:\n svg = <CheckCircle {...props} />;\n break;\n case IconName.CHECK_SQUARE:\n svg = <CheckSquare {...props} />;\n break;\n case IconName.CHEVRON_DOWN:\n svg = <ChevronDown {...props} />;\n break;\n case IconName.CLOSE:\n svg = <Close {...props} />;\n break;\n case IconName.CODE:\n svg = <Code {...props} />;\n break;\n case IconName.COMPUTER:\n svg = <Computer {...props} />;\n break;\n case IconName.COPY:\n svg = <Copy {...props} />;\n break;\n case IconName.CUBE:\n svg = <Cube {...props} />;\n break;\n case IconName.DATABASE:\n svg = <Database {...props} />;\n break;\n case IconName.EXCLAMATION_CIRCLE:\n svg = <ExclamationCircle {...props} />;\n break;\n case IconName.EXCLAMATION_TRIANGLE:\n svg = <ExclamationTriangle {...props} />;\n break;\n case IconName.GEAR:\n svg = <Gear {...props} />;\n break;\n case IconName.GLobe:\n svg = <Globe {...props} />;\n break;\n case IconName.HASHTAG:\n svg = <Hashtag {...props} />;\n break;\n case IconName.HOME:\n svg = <Home {...props} />;\n break;\n case IconName.INBOX:\n svg = <Inbox {...props} />;\n break;\n case IconName.INFORMATION_CIRCLE:\n svg = <InformationCircle {...props} />;\n break;\n case IconName.INFORMATION_CIRCLE_MICRO:\n svg = <InformationCircleMicro {...props} />;\n break;\n case IconName.LAMP:\n svg = <Lamp {...props} />;\n break;\n case IconName.LOCK_OPEN:\n svg = <LockOpen {...props} />;\n break;\n case IconName.MINUS:\n svg = <Minus {...props} />;\n break;\n case IconName.PAPER_PLANE:\n svg = <PaperPlaneIcon {...props} />;\n break;\n case IconName.PENCIL:\n svg = <Pencil {...props} />;\n break;\n case IconName.PIE_CHART:\n svg = <PieChart {...props} />;\n break;\n case IconName.PIPELINE:\n svg = <Pipeline {...props} />;\n break;\n case IconName.PLUS:\n svg = <Plus {...props} />;\n break;\n case IconName.PROFILE:\n svg = <Profile {...props} />;\n break;\n case IconName.QUESTION_CIRCLE:\n svg = <QuestionCircle {...props} />;\n break;\n case IconName.ROCKET_LAUNCH:\n svg = <RocketLaunch {...props} />;\n break;\n case IconName.SEARCH:\n svg = <Search {...props} />;\n break;\n case IconName.SEARCH_DOCUMENT:\n svg = <SearchDocument {...props} />;\n break;\n case IconName.SEARCH_SQL:\n svg = <SearchSQL {...props} />;\n break;\n case IconName.SITEMAP:\n svg = <Sitemap {...props} />;\n break;\n case IconName.TETRASCIENCE_ICON:\n svg = <TetraScienceIcon {...props} />;\n break;\n case IconName.TEXT:\n svg = <Text {...props} />;\n break;\n case IconName.TRASH:\n svg = <Trash {...props} />;\n break;\n case IconName.VIEWFINDER_CIRCLE:\n svg = <ViewfinderCircle {...props} />;\n break;\n\n default:\n throw `[Icon] name \"${name}\" does not exist`;\n }\n return <div style={{ display: \"inline-flex\" }}>{svg}</div>;\n};\n\nexport default Icon;\n","import { Icon, IconName } from \"@atoms/Icon\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nimport type { ChangeEvent } from \"react\";\n\nexport interface CheckboxProps {\n checked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n className?: string;\n onClick?: (e: React.MouseEvent) => void;\n label?: React.ReactNode;\n noPadding?: boolean;\n ref?: React.Ref<HTMLInputElement>;\n}\n\nconst CheckboxContainer = styled.label<{\n disabled?: boolean;\n $noPadding?: boolean;\n}>`\n display: inline-flex;\n align-items: center;\n cursor: ${(props) => (props.disabled ? \"not-allowed\" : \"pointer\")};\n opacity: ${(props) => (props.disabled ? 0.6 : 1)};\n padding: ${(props) => (props.$noPadding ? \"0\" : \"12px 16px\")};\n width: 100%;\n`;\n\nconst HiddenCheckbox = styled.input.attrs({ type: \"checkbox\" })`\n position: absolute;\n opacity: 0;\n height: 0;\n width: 0;\n`;\n\nconst StyledCheckbox = styled.div<{ checked?: boolean; disabled?: boolean }>`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n background: ${(props) =>\n props.checked ? \"var(--blue-600)\" : \"var(--white-900)\"};\n border: 1px solid\n ${(props) => (props.checked ? \"var(--blue-600)\" : \"var(--grey-300)\")};\n border-radius: 3px;\n transition: all 0.2s;\n\n ${(props) =>\n !props.disabled &&\n `\n\t\t&:hover {\n\t\t\tborder-color: var(--blue-600);\n\t\t}\n\t`}\n`;\n\nconst CheckIcon = () => (\n <Icon name={IconName.CHECK_SQUARE} fill=\"var(--blue-600)\" />\n);\n\nconst StyledLabel = styled.span`\n margin-left: 10px;\n font-family: \"Inter\", sans-serif;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n`;\n\nexport const Checkbox = ({\n checked = false,\n onChange,\n disabled = false,\n className,\n onClick,\n label,\n noPadding = false,\n ref,\n}: CheckboxProps) => {\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n if (!disabled && onChange) {\n onChange(e.target.checked);\n }\n };\n\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n onClick(e);\n }\n };\n\n return (\n <CheckboxContainer\n className={className}\n disabled={disabled}\n $noPadding={noPadding}\n onClick={handleClick}\n >\n <HiddenCheckbox\n ref={ref}\n checked={checked}\n onChange={handleChange}\n disabled={disabled}\n />\n <StyledCheckbox checked={checked} disabled={disabled}>\n {checked && <CheckIcon />}\n </StyledCheckbox>\n {label && <StyledLabel>{label}</StyledLabel>}\n </CheckboxContainer>\n );\n};\n\nexport default Checkbox;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport styled, { css } from \"styled-components\";\n\nimport type { ReactNode} from \"react\";\n\nexport type TooltipPlacement = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface TooltipProps {\n content: ReactNode;\n children: ReactNode;\n placement?: TooltipPlacement;\n className?: string;\n delay?: number;\n}\n\ninterface TooltipContentProps {\n placement: TooltipPlacement;\n $isVisible: boolean;\n}\n\nconst TooltipContainer = styled.div`\n position: relative;\n display: inline-flex;\n width: fit-content;\n`;\n\nconst TooltipContent = styled.div<TooltipContentProps>`\n position: absolute;\n background-color: var(--black);\n color: var(--white);\n padding: 8px 12px;\n border-radius: 6px;\n font-family: \"Inter\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n line-height: 18px;\n max-width: 250px;\n min-width: min-content;\n width: max-content;\n z-index: 1000;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.2s, visibility 0.2s;\n white-space: normal;\n word-wrap: break-word;\n box-sizing: border-box;\n text-align: left;\n\n ${(props) =>\n props.$isVisible &&\n css`\n opacity: 1;\n visibility: visible;\n `}\n\n ${(props) => {\n switch (props.placement) {\n case \"top\":\n return css`\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%) translateY(-8px);\n\n &::after {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 50%;\n margin-left: -6px;\n border-width: 6px;\n border-style: solid;\n border-color: var(--black) transparent transparent transparent;\n }\n `;\n case \"right\":\n return css`\n top: 50%;\n left: 100%;\n transform: translateY(-50%) translateX(8px);\n\n &::after {\n content: \"\";\n position: absolute;\n top: 50%;\n right: 100%;\n margin-top: -6px;\n border-width: 6px;\n border-style: solid;\n border-color: transparent var(--black) transparent transparent;\n }\n `;\n case \"bottom\":\n return css`\n top: 100%;\n left: 50%;\n transform: translateX(-50%) translateY(8px);\n\n &::after {\n content: \"\";\n position: absolute;\n bottom: 100%;\n left: 50%;\n margin-left: -6px;\n border-width: 6px;\n border-style: solid;\n border-color: transparent transparent var(--black) transparent;\n }\n `;\n case \"left\":\n return css`\n top: 50%;\n right: 100%;\n transform: translateY(-50%) translateX(-8px);\n\n &::after {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 100%;\n margin-top: -6px;\n border-width: 6px;\n border-style: solid;\n border-color: transparent transparent transparent var(--black);\n }\n `;\n default:\n return \"\";\n }\n }}\n`;\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n content,\n children,\n placement = \"top\",\n className,\n delay = 100,\n}) => {\n const [isVisible, setIsVisible] = useState(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const handleMouseEnter = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n timeoutRef.current = setTimeout(() => {\n setIsVisible(true);\n }, delay);\n };\n\n const handleMouseLeave = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n setIsVisible(false);\n };\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n return (\n <TooltipContainer\n className={className}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {children}\n <TooltipContent placement={placement} $isVisible={isVisible}>\n {content}\n </TooltipContent>\n </TooltipContainer>\n );\n};\n\nexport default Tooltip;\n","import { Button } from \"@atoms/Button\";\nimport { Icon, IconName } from \"@atoms/Icon\";\nimport { Tooltip } from \"@atoms/Tooltip\";\nimport MonacoEditor from \"@monaco-editor/react\";\n// @ts-expect-error - This is a workaround to avoid the error when importing the themes\nimport themes from \"monaco-themes/themes/themelist\";\nimport React, { useCallback, useState } from \"react\";\nimport styled from \"styled-components\";\n\nimport type { Monaco, OnChange } from \"@monaco-editor/react\";\nimport type { editor } from \"monaco-editor\";\n\n// Use import.meta.glob only if available (Vite), otherwise use empty object (webpack/Next.js)\nconst themeModules = typeof import.meta.glob === 'function'\n ? import.meta.glob(\"/node_modules/monaco-themes/themes/*.json\")\n : {};\n\nexport interface CodeEditorProps {\n value: string;\n onChange: OnChange;\n language?: string;\n theme?: \"light\" | \"dark\";\n height?: string | number;\n width?: string | number;\n options?: Record<string, unknown>;\n label?: string;\n onCopy?: (code: string) => void;\n onLaunch?: (code: string) => void;\n disabled?: boolean;\n}\n\n// Theme mapping\nconst THEME_MAP = {\n light: \"github-light\",\n dark: \"dracula\",\n};\n\nconst EditorContainer = styled.div<{ $themeMode?: string; disabled?: boolean }>`\n border-radius: 16px;\n overflow: hidden;\n background-color: ${(props) =>\n props.$themeMode === \"dark\" ? \"var(--grey-800)\" : \"var(--grey-50)\"};\n position: relative;\n border: 1px solid var(--grey-200);\n opacity: ${(props) => (props.disabled ? 0.6 : 1)};\n cursor: ${(props) => (props.disabled ? \"not-allowed\" : \"default\")};\n`;\n\nconst EditorActions = styled.div`\n margin-left: auto;\n display: flex;\n gap: 8px;\n padding: 8px 16px;\n position: absolute;\n top: 0;\n right: 0;\n z-index: 1;\n`;\n\nconst ButtonWrapper = styled.div`\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst StyledButton = styled(Button)`\n width: 100%;\n height: 100%;\n`;\n\nconst CodeEditor: React.FC<CodeEditorProps> = ({\n value,\n onChange,\n language = \"python\",\n theme = \"dark\",\n height = 400,\n width = \"100%\",\n options = {},\n onCopy,\n onLaunch,\n disabled = false,\n}) => {\n const [copyState, setCopyState] = useState<\"Copy\" | \"Copied\">(\"Copy\");\n const [launchState, setLaunchState] = useState<\"Launch\" | \"Launched\">(\n \"Launch\"\n );\n\n /** Feedback reset delay in milliseconds */\n const FEEDBACK_RESET_DELAY_MS = 1000;\n\n const handleCopy = useCallback(\n (code: string) => {\n if (onCopy && !disabled) {\n onCopy(code);\n setCopyState(\"Copied\");\n setTimeout(() => {\n setCopyState(\"Copy\");\n }, FEEDBACK_RESET_DELAY_MS);\n }\n },\n [onCopy, disabled]\n );\n\n const handleLaunch = useCallback(\n (code: string) => {\n if (onLaunch && !disabled) {\n onLaunch(code);\n setLaunchState(\"Launched\");\n setTimeout(() => {\n setLaunchState(\"Launch\");\n }, FEEDBACK_RESET_DELAY_MS);\n }\n },\n [onLaunch, disabled]\n );\n\n const handleEditorWillMount = async (monaco: Monaco) => {\n const monacoTheme = THEME_MAP[theme];\n\n try {\n const themeFile = themes[monacoTheme];\n\n if (themeFile) {\n const themeModule =\n themeModules[`/node_modules/monaco-themes/themes/${themeFile}.json`];\n if (themeModule) {\n const themeData = (\n (await themeModule()) as { default: editor.IStandaloneThemeData }\n ).default;\n monaco.editor.defineTheme(monacoTheme, themeData);\n }\n }\n monaco.editor.setTheme(monacoTheme);\n } catch (error) {\n console.error(\"Error loading theme:\", error);\n monaco.editor.setTheme(\"vs-dark\");\n }\n };\n\n const defaultOptions = {\n minimap: { enabled: false },\n scrollBeyondLastLine: false,\n lineNumbers: \"on\" as editor.LineNumbersType,\n padding: { top: 12, bottom: 12, left: 20, right: 20 },\n scrollbar: {\n vertical: \"hidden\" as const,\n verticalScrollbarSize: 0,\n },\n readOnly: disabled,\n ...options,\n };\n\n return (\n <EditorContainer $themeMode={theme} disabled={disabled}>\n <EditorActions>\n {onCopy && (\n <Tooltip content={copyState} placement=\"bottom\">\n <ButtonWrapper>\n <StyledButton\n variant=\"tertiary\"\n size=\"small\"\n leftIcon={<Icon name={IconName.COPY} />}\n noPadding\n fullWidth\n onClick={() => handleCopy(value)}\n disabled={disabled}\n >\n {null}\n </StyledButton>\n </ButtonWrapper>\n </Tooltip>\n )}\n {onLaunch && (\n <Tooltip content={launchState} placement=\"bottom\">\n <ButtonWrapper>\n <StyledButton\n variant=\"tertiary\"\n size=\"small\"\n leftIcon={<Icon name={IconName.ROCKET_LAUNCH} />}\n noPadding\n fullWidth\n onClick={() => handleLaunch(value)}\n disabled={disabled}\n >\n {null}\n </StyledButton>\n </ButtonWrapper>\n </Tooltip>\n )}\n </EditorActions>\n\n <MonacoEditor\n value={value}\n onChange={onChange}\n language={language}\n theme={THEME_MAP[theme]}\n height={height}\n width={width}\n options={defaultOptions}\n beforeMount={handleEditorWillMount}\n />\n </EditorContainer>\n );\n};\n\nexport default CodeEditor;\n","import { Icon, IconName } from \"@atoms/Icon\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport styled from \"styled-components\";\n\nexport type DropdownSize = \"xsmall\" | \"small\";\n\nexport interface DropdownOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface DropdownProps {\n options: DropdownOption[];\n value?: string;\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n size?: DropdownSize;\n onChange?: (value: string) => void;\n onOpen?: () => void;\n onClose?: () => void;\n width?: string;\n menuWidth?: string;\n}\n\nconst DropdownContainer = styled.div<{ width?: string }>`\n position: relative;\n width: ${(props) => props.width || \"100%\"};\n`;\n\nconst DropdownButton = styled.button<{\n open: boolean;\n $error?: boolean;\n disabled?: boolean;\n size: DropdownSize;\n}>`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: ${(props) => (props.size === \"xsmall\" ? \"34px\" : \"38px\")};\n padding: 0 12px;\n background-color: ${(props) =>\n props.disabled ? \"var(--grey-100)\" : \"var(--white-900)\"};\n border: 1px solid\n ${(props) => {\n if (props.$error) return \"var(--red-error)\";\n if (props.disabled) return \"var(--grey-200)\";\n if (props.open) return \"var(--blue-600)\";\n return \"var(--grey-300)\";\n }};\n border-radius: 6px;\n outline: none;\n cursor: ${(props) => (props.disabled ? \"not-allowed\" : \"pointer\")};\n user-select: ${(props) => (props.disabled ? \"none\" : \"auto\")};\n transition: all 0.2s ease;\n font-family: \"Inter\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n text-align: left;\n color: ${(props) => {\n if (props.disabled) return \"var(--grey-400)\";\n if (props.open) return \"var(--black-900)\";\n return \"var(--grey-400)\";\n }};\n\n &:hover:not(:disabled) {\n border-color: ${(props) =>\n props.$error ? \"var(--red-error)\" : \"var(--blue-600)\"};\n color: var(--black-900) !important;\n }\n\n &:disabled {\n color: var(--grey-400) !important;\n border-color: var(--grey-300);\n }\n\n &:active:not(:disabled) {\n color: var(--black-900) !important;\n }\n\n &:focus {\n outline: none;\n box-shadow: ${(props) =>\n props.$error\n ? \"0px 0px 0px 3px var(--red-bg)\"\n : \"0px 0px 0px 1px var(--white-900), 0px 0px 0px 3px var(--blue-600)\"};\n border-color: ${(props) =>\n props.$error ? \"var(--red-error)\" : \"var(--blue-600)\"};\n }\n`;\n\nconst ChevronIcon = styled.div<{ open: boolean }>`\n width: 20px;\n height: 20px;\n transform: ${(props) => (props.open ? \"rotate(180deg)\" : \"rotate(0deg)\")};\n transition: transform 0.2s ease;\n color: var(--grey-600);\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst ButtonText = styled.div`\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n flex: 1;\n text-align: left;\n display: block;\n max-width: calc(100% - 24px);\n\n .dropdown-menu-item {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n }\n`;\n\nconst DropdownMenu = styled.ul<{ menuWidth?: string }>`\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n width: ${(props) => props.menuWidth || \"calc(100% - 2px)\"};\n max-height: 200px;\n overflow-y: auto;\n background-color: var(--white-900);\n border: 1px solid var(--grey-200);\n border-radius: 6px;\n box-shadow: 0px 4px 8px var(--black-100);\n z-index: 10;\n padding: 4px 0;\n margin: 0;\n list-style: none;\n`;\n\nconst NoDataContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 16px;\n color: var(--grey-400);\n`;\n\nconst NoDataText = styled.p`\n margin: 8px 0 0 0;\n font-family: \"Inter\", sans-serif;\n font-size: 14px;\n line-height: 20px;\n text-align: center;\n`;\n\nconst DropdownItem = styled.li<{ selected: boolean; disabled?: boolean }>`\n padding: 8px 12px;\n cursor: ${(props) => (props.disabled ? \"not-allowed\" : \"pointer\")};\n background-color: ${(props) =>\n props.selected ? \"var(--blue-50)\" : \"transparent\"};\n color: ${(props) => {\n if (props.disabled) return \"var(--grey-400)\";\n if (props.selected) return \"var(--blue-900)\";\n return \"var(--blue-900)\";\n }};\n font-family: \"Inter\", sans-serif;\n font-size: 14px;\n line-height: 20px;\n transition: background-color 0.2s ease;\n outline: none;\n\n &:hover:not(:disabled) {\n background-color: ${(props) =>\n props.selected ? \"var(--blue-50)\" : \"var(--grey-50)\"};\n }\n\n &:focus-visible {\n background-color: var(--blue-50);\n outline: 2px solid var(--blue-600);\n outline-offset: -2px;\n }\n`;\n\nexport const Dropdown: React.FC<DropdownProps> = ({\n options = [],\n value,\n placeholder = \"Select an option\",\n disabled = false,\n error = false,\n size = \"small\",\n onChange,\n onOpen,\n onClose,\n width,\n menuWidth,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [selectedValue, setSelectedValue] = useState(value || \"\");\n const dropdownRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<(HTMLLIElement | null)[]>([]);\n\n useEffect(() => {\n if (value !== undefined) {\n setSelectedValue(value);\n }\n }, [value]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n && isOpen) {\n setIsOpen(false);\n onClose?.();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isOpen, onClose]);\n\n useEffect(() => {\n if (isOpen) {\n itemRefs.current = itemRefs.current.slice(0, options.length);\n }\n }, [isOpen, options.length]);\n\n useEffect(() => {\n if (isOpen && itemRefs.current.length > 0) {\n const selectedIndex = options.findIndex(\n (option) => option.value === selectedValue\n );\n const indexToFocus = selectedIndex >= 0 ? selectedIndex : 0;\n\n setTimeout(() => {\n if (itemRefs.current[indexToFocus]) {\n itemRefs.current[indexToFocus]?.focus();\n }\n }, 10);\n }\n }, [isOpen, options, selectedValue]);\n\n const handleToggle = () => {\n if (!disabled) {\n const newState = !isOpen;\n setIsOpen(newState);\n if (newState) {\n onOpen?.();\n } else {\n onClose?.();\n }\n }\n };\n\n const handleSelect = (option: DropdownOption) => {\n if (!option.disabled) {\n setSelectedValue(option.value);\n setIsOpen(false);\n onChange?.(option.value);\n onClose?.();\n }\n };\n\n /**\n * Finds the next enabled option index after the given index.\n * Returns -1 if no enabled option is found.\n */\n const findNextEnabledIndex = (currentIndex: number): number => {\n for (let i = currentIndex + 1; i < options.length; i++) {\n if (!options[i].disabled) {\n return i;\n }\n }\n return -1;\n };\n\n /**\n * Finds the previous enabled option index before the given index.\n * Returns -1 if no enabled option is found.\n */\n const findPrevEnabledIndex = (currentIndex: number): number => {\n for (let i = currentIndex - 1; i >= 0; i--) {\n if (!options[i].disabled) {\n return i;\n }\n }\n return -1;\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, index: number) => {\n const option = options[index];\n\n switch (e.key) {\n case \"Enter\":\n case \" \":\n e.preventDefault();\n if (!option.disabled) {\n handleSelect(option);\n }\n break;\n case \"ArrowDown\": {\n e.preventDefault();\n const nextIndex = findNextEnabledIndex(index);\n if (nextIndex !== -1) {\n itemRefs.current[nextIndex]?.focus();\n }\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n const prevIndex = findPrevEnabledIndex(index);\n if (prevIndex !== -1) {\n itemRefs.current[prevIndex]?.focus();\n }\n break;\n }\n case \"Escape\":\n e.preventDefault();\n setIsOpen(false);\n onClose?.();\n break;\n case \"Tab\":\n setIsOpen(false);\n onClose?.();\n break;\n default:\n break;\n }\n };\n\n const handleButtonKeyDown = (e: React.KeyboardEvent) => {\n if (!disabled) {\n switch (e.key) {\n case \"Enter\":\n case \" \":\n case \"ArrowDown\":\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n onOpen?.();\n }\n break;\n case \"Escape\":\n e.preventDefault();\n if (isOpen) {\n setIsOpen(false);\n onClose?.();\n }\n break;\n default:\n break;\n }\n }\n };\n\n const selectedOption = options.find(\n (option) => option.value === selectedValue\n );\n const displayText = selectedOption ? selectedOption.label : placeholder;\n\n return (\n <DropdownContainer ref={dropdownRef} width={width}>\n <DropdownButton\n type=\"button\"\n onClick={handleToggle}\n onKeyDown={handleButtonKeyDown}\n open={isOpen}\n disabled={disabled}\n $error={error}\n size={size}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-label={placeholder}\n >\n <ButtonText>{displayText}</ButtonText>\n <ChevronIcon open={isOpen}>\n <Icon name={IconName.CHEVRON_DOWN} fill=\"var(--grey-600)\" />\n </ChevronIcon>\n </DropdownButton>\n {isOpen && (\n <DropdownMenu\n role=\"listbox\"\n aria-labelledby=\"dropdown-button\"\n menuWidth={menuWidth}\n >\n {options.length > 0 ? (\n options.map((option, index) => (\n <DropdownItem\n key={option.value}\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n selected={option.value === selectedValue}\n disabled={option.disabled}\n onClick={() => handleSelect(option)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n tabIndex={option.disabled ? -1 : 0}\n role=\"option\"\n aria-selected={option.value === selectedValue}\n aria-disabled={option.disabled}\n >\n {option.label}\n </DropdownItem>\n ))\n ) : (\n <NoDataContainer>\n <Icon\n name={IconName.INBOX}\n fill=\"var(--grey-400)\"\n width=\"24px\"\n height=\"24px\"\n />\n <NoDataText>No Data</NoDataText>\n </NoDataContainer>\n )}\n </DropdownMenu>\n )}\n </DropdownContainer>\n );\n};\n\nexport default Dropdown;\n","import React, { useState } from \"react\";\nimport styled from \"styled-components\";\n\nimport type { AxiosError } from \"axios\";\n\ninterface ErrorObject {\n isAxiosError?: boolean;\n message?: string;\n error?: string;\n detail?: string;\n}\n\n// Styled components to replace Ant Design components\nconst AlertContainer = styled.div<{\n type: \"error\" | \"warning\" | \"info\" | \"success\";\n}>`\n width: 100%;\n padding: 15px;\n border-radius: 4px;\n margin-bottom: 16px;\n background-color: #fff2f0;\n border: 1px solid #ffccc7;\n display: flex;\n flex-direction: column;\n gap: 8px;\n box-sizing: border-box;\n`;\n\nconst AlertHeader = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;\n\nconst IconContainer = styled.div`\n color: #ff4d4f;\n font-size: 18px;\n margin-right: 12px;\n display: flex;\n align-items: center;\n`;\n\nconst CloseButton = styled.button`\n background: none;\n border: none;\n font-size: 16px;\n cursor: pointer;\n color: rgba(0, 0, 0, 0.45);\n padding: 0;\n line-height: 1;\n &:hover {\n color: rgba(0, 0, 0, 0.75);\n }\n`;\n\nconst TitleContainer = styled.div`\n font-weight: 500;\n font-size: 16px;\n display: flex;\n align-items: center;\n flex-grow: 1;\n`;\n\nconst StyledSpace = styled.div`\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 100%;\n`;\n\nconst Paragraph = styled.p`\n margin: 0;\n padding: 0;\n line-height: 1.5;\n`;\n\nconst Text = styled.span<{ $strong?: boolean; $type?: \"secondary\" | \"primary\" }>`\n font-weight: ${(props) => (props.$strong ? \"600\" : \"400\")};\n color: ${(props) =>\n props.$type === \"secondary\" ? \"rgba(0, 0, 0, 0.45)\" : \"inherit\"};\n`;\n\nconst SecondaryText = styled(Text).attrs({ $type: \"secondary\" })``;\n\nconst CollapseContainer = styled.div`\n margin-left: -15px;\n margin-right: -15px;\n margin-bottom: -5px;\n`;\n\nconst CollapseHeader = styled.div<{ $isActive: boolean }>`\n padding: 12px 16px;\n cursor: pointer;\n display: flex;\n align-items: center;\n user-select: none;\n\n &:hover {\n background-color: rgba(0, 0, 0, 0.02);\n }\n\n &::after {\n content: \"${(props) => (props.$isActive ? \"▼\" : \"▶\")}\";\n font-size: 12px;\n margin-left: 8px;\n }\n`;\n\nconst CollapseContent = styled.div<{ $isVisible: boolean }>`\n padding: ${(props) => (props.$isVisible ? \"0 16px 12px\" : \"0 16px\")};\n max-height: ${(props) => (props.$isVisible ? \"300px\" : \"0\")};\n overflow: hidden;\n transition: max-height 0.3s ease;\n`;\n\nconst PreContainer = styled.pre`\n white-space: pre-wrap;\n word-break: break-all;\n max-height: 300px;\n overflow-y: auto;\n background: #f5f5f5;\n padding: 10px;\n border-radius: 4px;\n margin: 0;\n`;\n\n// Helper function to check if an error is an AxiosError (more robust than instanceof)\n// You might already have axios installed and can use axios.isAxiosError directly.\n// If so, you can replace this function with: import axios from 'axios'; const isAxiosError = axios.isAxiosError;\n// This implementation avoids a direct dependency on the axios runtime in this component if preferred.\nfunction isAxiosError(error: unknown): error is AxiosError {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"isAxiosError\" in error &&\n (error as ErrorObject).isAxiosError === true\n );\n}\n\n/** Parsed error result used for rendering */\ninterface ParsedError {\n message: React.ReactNode;\n description: React.ReactNode | null;\n details: string | null;\n errorType: string;\n}\n\n/** Parses Axios error response data to extract description and details */\nfunction parseAxiosResponseData(\n responseData: unknown\n): { description: React.ReactNode; details: string | null } {\n if (typeof responseData === \"string\") {\n return { description: responseData, details: null };\n }\n if (responseData && typeof responseData === \"object\") {\n const detail =\n (responseData as ErrorObject).detail ||\n (responseData as ErrorObject).message ||\n (responseData as ErrorObject).error;\n if (typeof detail === \"string\") {\n return { description: detail, details: null };\n }\n return {\n description: \"Check details for response data.\",\n details: JSON.stringify(responseData, null, 2),\n };\n }\n return { description: null, details: null };\n}\n\n/** Parses an Axios error into a ParsedError object */\nfunction parseAxiosError(error: AxiosError): ParsedError {\n let errorType = \"Network/API Error\";\n let message: React.ReactNode = error.message;\n let description: React.ReactNode | null = null;\n let details: string | null = null;\n\n if (error.response) {\n const { status, statusText, data: responseData } = error.response;\n message = `API Error: ${status} ${statusText}`;\n const parsed = parseAxiosResponseData(responseData);\n description = parsed.description ?? `Request failed with status code ${status}.`;\n details = `URL: ${error.config?.method?.toUpperCase()} ${error.config?.url}\\nStatus: ${status} ${statusText}\\nResponse Data:\\n${parsed.details ?? JSON.stringify(responseData, null, 2)}`;\n } else if (error.request) {\n errorType = \"Network Error\";\n message = \"Network Error: Could not reach the server.\";\n description = \"Please check your internet connection or contact support if the problem persists.\";\n details = `URL: ${error.config?.method?.toUpperCase()} ${error.config?.url}\\nError Message: ${error.message}`;\n } else {\n message = `Request Setup Error: ${error.message}`;\n }\n\n if (error.code) {\n errorType += ` (Code: ${error.code})`;\n }\n\n return { message, description, details, errorType };\n}\n\n/** Parses a standard Error object into a ParsedError object */\nfunction parseStandardError(error: Error): ParsedError {\n return {\n message: error.message,\n description: null,\n details: error.stack ?? \"No stack trace available.\",\n errorType: error.name || \"Error\",\n };\n}\n\n/** Parses an object error into a ParsedError object */\nfunction parseObjectError(error: object): ParsedError {\n const message =\n (error as ErrorObject).message ||\n (error as ErrorObject).error ||\n \"An object was thrown as an error.\";\n let details: string | null;\n try {\n details = JSON.stringify(error, null, 2);\n } catch {\n details = \"Could not stringify the error object.\";\n }\n return { message, description: null, details, errorType: \"Object Error\" };\n}\n\n/** Parses any error type into a structured ParsedError object */\nfunction parseError(error: unknown): ParsedError {\n if (isAxiosError(error)) {\n return parseAxiosError(error);\n }\n if (error instanceof Error) {\n return parseStandardError(error);\n }\n if (typeof error === \"string\") {\n return { message: error, description: null, details: null, errorType: \"Message\" };\n }\n if (typeof error === \"object\" && error !== null) {\n return parseObjectError(error);\n }\n return {\n message: \"An unexpected error occurred.\",\n description: null,\n details: null,\n errorType: \"Unknown Error\",\n };\n}\n\nexport interface ErrorAlertProps {\n /** The error object to display. Can be Error, AxiosError, string, or any other type. */\n error: unknown;\n /** Optional title for the error alert. Defaults to 'An Error Occurred'. */\n title?: React.ReactNode;\n /** Optional callback function when the alert is closed. */\n onClose?: () => void;\n /** Set to true to show technical details expanded by default. Defaults to false. */\n showDetailsDefault?: boolean;\n /** Custom message to show when error is null/undefined (optional, component renders nothing by default) */\n noErrorContent?: React.ReactNode;\n}\n\n// Simple Collapse component implementation\nconst Collapse = ({\n children,\n header,\n defaultExpanded = false,\n}: {\n children: React.ReactNode;\n header: React.ReactNode;\n defaultExpanded?: boolean;\n}) => {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n\n return (\n <div>\n <CollapseHeader\n $isActive={isExpanded}\n onClick={() => setIsExpanded(!isExpanded)}\n >\n {header}\n </CollapseHeader>\n <CollapseContent $isVisible={isExpanded}>{children}</CollapseContent>\n </div>\n );\n};\n\nconst ErrorAlert: React.FC<ErrorAlertProps> = ({\n error,\n title = \"An Error Occurred\",\n onClose,\n showDetailsDefault = false,\n}) => {\n // If no error is provided, render nothing\n if (!error) {\n return <></>;\n }\n\n const { message, description, details, errorType } = parseError(error);\n\n return (\n <AlertContainer type=\"error\">\n <AlertHeader>\n <TitleContainer>\n <IconContainer>⚠️</IconContainer>\n {title}\n </TitleContainer>\n {onClose && <CloseButton onClick={onClose}>✕</CloseButton>}\n </AlertHeader>\n <StyledSpace>\n <Paragraph>\n <Text $strong>{errorType}:</Text> {message}\n </Paragraph>\n {description && (\n <Paragraph>\n <SecondaryText>{description}</SecondaryText>\n </Paragraph>\n )}\n {details && (\n <CollapseContainer>\n <Collapse header=\"Details\" defaultExpanded={showDetailsDefault}>\n <PreContainer>{details}</PreContainer>\n </Collapse>\n </CollapseContainer>\n )}\n </StyledSpace>\n </AlertContainer>\n );\n};\n\nexport default ErrorAlert;\n","import React from \"react\";\nimport styled, { css } from \"styled-components\";\n\nexport type InputSize = \"xsmall\" | \"small\";\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n size?: InputSize;\n iconLeft?: React.ReactNode;\n iconRight?: React.ReactNode;\n error?: boolean;\n disabled?: boolean;\n ref?: React.Ref<HTMLInputElement>;\n}\n\ninterface StyleProps {\n $hasIconLeft?: boolean;\n $hasIconRight?: boolean;\n size: InputSize;\n}\n\nconst sizeStyles = {\n xsmall: css<StyleProps>`\n height: 32px;\n padding: ${(props) =>\n props.$hasIconLeft && props.$hasIconRight\n ? \"0 32px 0 32px\"\n : props.$hasIconLeft\n ? \"0 10px 0 32px\"\n : props.$hasIconRight\n ? \"0 32px 0 10px\"\n : \"0 10px\"};\n `,\n small: css<StyleProps>`\n height: 36px;\n padding: ${(props) =>\n props.$hasIconLeft && props.$hasIconRight\n ? \"0 38px 0 38px\"\n : props.$hasIconLeft\n ? \"0 12px 0 38px\"\n : props.$hasIconRight\n ? \"0 38px 0 12px\"\n : \"0 12px\"};\n `,\n};\n\nconst InputContainer = styled.div<{\n size: InputSize;\n disabled?: boolean;\n $error?: boolean;\n}>`\n position: relative;\n display: inline-flex;\n align-items: center;\n width: 100%;\n gap: 8px;\n`;\n\ninterface StyledInputProps extends StyleProps {\n $error?: boolean;\n}\n\nconst StyledInput = styled.input<StyledInputProps>`\n width: 100%;\n border-radius: 6px;\n font-family: \"Inter\", sans-serif;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n border: 1px solid\n ${(props) =>\n props.$error\n ? \"var(--red-error)\"\n : props.disabled\n ? \"var(--grey-300)\"\n : \"var(--grey-300)\"};\n background-color: ${(props) =>\n props.disabled ? \"var(--grey-200)\" : \"var(--white-900)\"};\n color: ${(props) =>\n props.disabled ? \"var(--grey-400)\" : \"var(--black-900)\"};\n transition: all 0.2s;\n\n ${(props) => sizeStyles[props.size || \"small\"]}\n\n &:hover:not(:disabled):not(:focus) {\n border-color: ${(props) =>\n props.$error ? \"var(--red-error)\" : \"var(--blue-600)\"};\n }\n\n &:focus {\n outline: none;\n box-shadow: 0px 0px 0px 1px var(--white-900),\n 0px 0px 0px 3px var(--blue-600);\n border-color: ${(props) =>\n props.$error ? \"var(--red-error)\" : \"var(--blue-600)\"};\n }\n\n &:active {\n outline: none;\n box-shadow: 0px 0px 0px 2px var(--blue-200);\n border-color: ${(props) =>\n props.$error ? \"var(--red-error)\" : \"var(--blue-600)\"};\n }\n\n &:disabled {\n cursor: not-allowed;\n user-select: none;\n pointer-events: none;\n }\n\n &::placeholder {\n color: var(--grey-400);\n }\n`;\n\nconst IconWrapper = styled.div<{ position: \"left\" | \"right\"; size: InputSize }>`\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n color: var(--grey-400);\n ${(props) => (props.position === \"left\" ? \"left: 10px;\" : \"right: 10px;\")}\n ${(props) =>\n props.size === \"xsmall\"\n ? \"width: 16px; height: 16px;\"\n : \"width: 20px; height: 20px;\"}\n`;\n\nexport const Input = ({\n size = \"small\",\n iconLeft,\n iconRight,\n error = false,\n disabled = false,\n ref,\n ...rest\n}: InputProps) => {\n return (\n <InputContainer size={size} disabled={disabled} $error={error}>\n {iconLeft && (\n <IconWrapper position=\"left\" size={size}>\n {iconLeft}\n </IconWrapper>\n )}\n <StyledInput\n ref={ref}\n size={size}\n $hasIconLeft={!!iconLeft}\n $hasIconRight={!!iconRight}\n $error={error}\n disabled={disabled}\n {...rest}\n />\n {iconRight && (\n <IconWrapper position=\"right\" size={size}>\n {iconRight}\n </IconWrapper>\n )}\n </InputContainer>\n );\n};\n\nexport default Input;\n","import { Icon , IconName } from \"@atoms/Icon\";\nimport { Tooltip } from \"@atoms/Tooltip\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nexport interface LabelProps {\n children: React.ReactNode;\n infoText?: string;\n className?: string;\n}\n\nconst LabelContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: 4px;\n`;\n\nconst LabelHeader = styled.div`\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--grey-600);\n text-overflow: ellipsis;\n font-family: \"Inter\", sans-serif;\n font-size: 13px;\n font-style: normal;\n font-weight: 400;\n line-height: 18px;\n`;\n\nconst InfoIcon = () => (\n <Icon name={IconName.INFORMATION_CIRCLE_MICRO} fill=\"var(--grey-600)\" />\n);\n\nconst InfoIconWrapper = styled.span`\n display: inline-flex;\n cursor: help;\n`;\n\nexport const Label: React.FC<LabelProps> = ({\n children,\n infoText,\n className,\n}) => {\n return (\n <LabelContainer className={className}>\n <LabelHeader>\n {children}\n {infoText && (\n <Tooltip content={infoText} placement=\"bottom\">\n <InfoIconWrapper>\n <InfoIcon />\n </InfoIconWrapper>\n </Tooltip>\n )}\n </LabelHeader>\n </LabelContainer>\n );\n};\n\nexport default Label;\n","export default {\n \"code[class*=\\\"language-\\\"]\": {\n \"color\": \"#f8f8f2\",\n \"background\": \"none\",\n \"fontFamily\": \"\\\"Fira Code\\\", Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n \"textAlign\": \"left\",\n \"whiteSpace\": \"pre\",\n \"wordSpacing\": \"normal\",\n \"wordBreak\": \"normal\",\n \"wordWrap\": \"normal\",\n \"lineHeight\": \"1.5\",\n \"MozTabSize\": \"4\",\n \"OTabSize\": \"4\",\n \"tabSize\": \"4\",\n \"WebkitHyphens\": \"none\",\n \"MozHyphens\": \"none\",\n \"msHyphens\": \"none\",\n \"hyphens\": \"none\"\n },\n \"pre[class*=\\\"language-\\\"]\": {\n \"color\": \"#f8f8f2\",\n \"background\": \"#2E3440\",\n \"fontFamily\": \"\\\"Fira Code\\\", Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n \"textAlign\": \"left\",\n \"whiteSpace\": \"pre\",\n \"wordSpacing\": \"normal\",\n \"wordBreak\": \"normal\",\n \"wordWrap\": \"normal\",\n \"lineHeight\": \"1.5\",\n \"MozTabSize\": \"4\",\n \"OTabSize\": \"4\",\n \"tabSize\": \"4\",\n \"WebkitHyphens\": \"none\",\n \"MozHyphens\": \"none\",\n \"msHyphens\": \"none\",\n \"hyphens\": \"none\",\n \"padding\": \"1em\",\n \"margin\": \".5em 0\",\n \"overflow\": \"auto\",\n \"borderRadius\": \"0.3em\"\n },\n \":not(pre) > code[class*=\\\"language-\\\"]\": {\n \"background\": \"#2E3440\",\n \"padding\": \".1em\",\n \"borderRadius\": \".3em\",\n \"whiteSpace\": \"normal\"\n },\n \"comment\": {\n \"color\": \"#636f88\"\n },\n \"prolog\": {\n \"color\": \"#636f88\"\n },\n \"doctype\": {\n \"color\": \"#636f88\"\n },\n \"cdata\": {\n \"color\": \"#636f88\"\n },\n \"punctuation\": {\n \"color\": \"#81A1C1\"\n },\n \".namespace\": {\n \"Opacity\": \".7\"\n },\n \"property\": {\n \"color\": \"#81A1C1\"\n },\n \"tag\": {\n \"color\": \"#81A1C1\"\n },\n \"constant\": {\n \"color\": \"#81A1C1\"\n },\n \"symbol\": {\n \"color\": \"#81A1C1\"\n },\n \"deleted\": {\n \"color\": \"#81A1C1\"\n },\n \"number\": {\n \"color\": \"#B48EAD\"\n },\n \"boolean\": {\n \"color\": \"#81A1C1\"\n },\n \"selector\": {\n \"color\": \"#A3BE8C\"\n },\n \"attr-name\": {\n \"color\": \"#A3BE8C\"\n },\n \"string\": {\n \"color\": \"#A3BE8C\"\n },\n \"char\": {\n \"color\": \"#A3BE8C\"\n },\n \"builtin\": {\n \"color\": \"#A3BE8C\"\n },\n \"inserted\": {\n \"color\": \"#A3BE8C\"\n },\n \"operator\": {\n \"color\": \"#81A1C1\"\n },\n \"entity\": {\n \"color\": \"#81A1C1\",\n \"cursor\": \"help\"\n },\n \"url\": {\n \"color\": \"#81A1C1\"\n },\n \".language-css .token.string\": {\n \"color\": \"#81A1C1\"\n },\n \".style .token.string\": {\n \"color\": \"#81A1C1\"\n },\n \"variable\": {\n \"color\": \"#81A1C1\"\n },\n \"atrule\": {\n \"color\": \"#88C0D0\"\n },\n \"attr-value\": {\n \"color\": \"#88C0D0\"\n },\n \"function\": {\n \"color\": \"#88C0D0\"\n },\n \"class-name\": {\n \"color\": \"#88C0D0\"\n },\n \"keyword\": {\n \"color\": \"#81A1C1\"\n },\n \"regex\": {\n \"color\": \"#EBCB8B\"\n },\n \"important\": {\n \"color\": \"#EBCB8B\",\n \"fontWeight\": \"bold\"\n },\n \"bold\": {\n \"fontWeight\": \"bold\"\n },\n \"italic\": {\n \"fontStyle\": \"italic\"\n }\n};","import { Button } from \"@atoms/Button\";\nimport { Icon, IconName } from \"@atoms/Icon\";\nimport React, { useState } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport { Prism as SyntaxHighlighter } from \"react-syntax-highlighter\";\nimport { nord } from \"react-syntax-highlighter/dist/esm/styles/prism\";\nimport rehypeRaw from \"rehype-raw\";\nimport remarkGfm from \"remark-gfm\";\nimport styled from \"styled-components\";\n\nimport type { HTMLAttributes, ClassAttributes } from \"react\";\nimport type { ExtraProps } from \"react-markdown\";\nimport type { SyntaxHighlighterProps } from \"react-syntax-highlighter\";\n\n/** Copy feedback reset delay in milliseconds */\nconst COPY_FEEDBACK_DELAY_MS = 2000;\n\n// Type for code component props from react-markdown\ntype CodeComponentProps = ClassAttributes<HTMLElement> &\n HTMLAttributes<HTMLElement> &\n ExtraProps & {\n inline?: boolean;\n };\n\nconst CodeText = styled.code`\n background-color: rgba(0, 0, 0, 0.05);\n border-radius: 3px;\n font-family: \"Courier New\", Courier, monospace;\n padding: 0.2em 0.4em;\n font-size: 85%;\n`;\n\n// Export CodeProps as an alias for backwards compatibility\nexport type CodeProps = CodeComponentProps;\n\nexport type MarkdownDisplayProps = {\n markdown: string;\n codeRenderer?: (props: CodeComponentProps) => React.ReactElement;\n};\n\nexport const BasicCodeRenderer = ({\n inline,\n className,\n children,\n ...props\n}: CodeComponentProps) => {\n const match = /language-(\\w+)/.exec(className || \"\");\n const language = match ? match[1] : undefined;\n const codeString = String(children).replace(/\\n$/, \"\");\n const [isCopied, setIsCopied] = useState(false);\n\n // Custom notification implementation without Ant Design\n const showMessage = (msg: string) => {\n console.log(msg);\n // In a real implementation, you would add a custom toast/notification here\n };\n\n // --- Async Function to Handle Copying ---\n const handleCopy = async () => {\n // Check if clipboard API is available\n if (!navigator.clipboard) {\n console.error(\"Clipboard API not available.\");\n showMessage(\"Clipboard access not available or denied.\");\n return;\n }\n try {\n // Write the code string to the clipboard\n await navigator.clipboard.writeText(codeString);\n // Update state to show feedback\n setIsCopied(true);\n showMessage(\"Code copied to clipboard!\");\n // Reset the \"Copied!\" state after delay\n setTimeout(() => setIsCopied(false), COPY_FEEDBACK_DELAY_MS);\n } catch (err) {\n // Log error and show error message\n console.error(\"Failed to copy code: \", err);\n // Reset state even on error\n setIsCopied(false);\n }\n };\n\n return !inline && match ? (\n <div className=\"code-block-container\">\n <div className=\"copy-button-wrapper\">\n <Button\n size=\"small\"\n leftIcon={<Icon name={IconName.COPY} />}\n onClick={handleCopy}\n aria-label=\"Copy code to clipboard\"\n >\n {isCopied ? \"Copied!\" : \"Copy\"}\n </Button>\n </div>\n\n {/* Using type assertion to avoid TypeScript errors */}\n {React.createElement(\n SyntaxHighlighter as unknown as React.ComponentType<SyntaxHighlighterProps>,\n {\n style: nord,\n language,\n PreTag: \"div\",\n children: codeString,\n }\n )}\n </div>\n ) : (\n <CodeText {...props}>{children}</CodeText>\n );\n};\n\nconst MarkdownDisplay = ({ markdown, codeRenderer }: MarkdownDisplayProps) => {\n return (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw]}\n components={{\n code: codeRenderer || BasicCodeRenderer, // Use the custom code renderer or the default one\n }}\n >\n {markdown}\n </ReactMarkdown>\n );\n};\n\nexport default MarkdownDisplay;\n","import { Checkbox } from \"@atoms/Checkbox\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nexport interface MenuItemProps {\n label: string;\n checked?: boolean;\n showCheckbox?: boolean;\n onClick?: () => void;\n onCheckChange?: (checked: boolean) => void;\n active?: boolean;\n className?: string;\n ref?: React.Ref<HTMLDivElement>;\n}\n\nconst StyledMenuItem = styled.div<{ $active?: boolean; $showCheckbox?: boolean }>`\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 14px;\n gap: 10px;\n color: ${(props) => (props.$active ? \"var(--blue-900)\" : \"var(--grey-600)\")};\n cursor: pointer;\n transition: all 0.2s;\n user-select: none;\n border-bottom: 1px solid var(--grey-200);\n background-color: ${(props) =>\n props.$active ? \"var(--grey-100)\" : \"var(--white-900)\"};\n padding: ${(props) => (props.$showCheckbox ? \"0\" : \"12px 16px\")};\n\n &:hover {\n background-color: ${(props) =>\n props.$active ? \"var(--grey-100)\" : \"var(--grey-50)\"};\n }\n\n &:last-child {\n border-bottom: none;\n }\n`;\n\nconst ItemContent = styled.div`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n`;\n\nconst CheckboxContainer = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1;\n width: 100%;\n`;\n\nexport const MenuItem = ({\n label,\n checked = false,\n showCheckbox = false,\n onClick,\n onCheckChange,\n active = false,\n className,\n ref,\n}: MenuItemProps) => {\n const handleClick = () => {\n console.log(\"MenuItem clicked!\");\n if (onClick) {\n onClick();\n }\n };\n\n const handleCheckboxChange = (isChecked: boolean) => {\n console.log(\"Checkbox changed:\", isChecked);\n if (onCheckChange) {\n onCheckChange(isChecked);\n }\n };\n\n // This stops the event from propagating to the parent (StyledMenuItem)\n const handleCheckboxClick = (e: React.MouseEvent) => {\n console.log(\"Checkbox clicked!\");\n e.stopPropagation();\n };\n\n return (\n <StyledMenuItem\n ref={ref}\n $active={active}\n $showCheckbox={showCheckbox}\n className={className}\n onClick={handleClick}\n role=\"button\"\n tabIndex={0}\n >\n {!showCheckbox && <ItemContent>{label}</ItemContent>}\n {showCheckbox && (\n <CheckboxContainer onClick={handleCheckboxClick}>\n <Checkbox\n checked={checked}\n onChange={handleCheckboxChange}\n onClick={handleCheckboxClick}\n label={label}\n />\n </CheckboxContainer>\n )}\n </StyledMenuItem>\n );\n};\n\nexport default MenuItem;\n","import { Button } from \"@atoms/Button\";\nimport { Icon, IconName } from \"@atoms/Icon\";\nimport { useEffect, useRef, useState } from \"react\";\nimport styled, { createGlobalStyle, keyframes } from \"styled-components\";\n\nimport type { ReactNode} from \"react\";\n\n/** Animation duration for modal fade in/out in milliseconds */\nconst ANIMATION_DURATION_MS = 300;\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n onCloseLabel?: string;\n onConfirm: () => void;\n onConfirmLabel?: string;\n children: ReactNode;\n width?: string;\n className?: string;\n hideActions?: boolean;\n title?: string;\n}\n\n// Global style for body when modal is open\nconst GlobalStyle = createGlobalStyle`\n\tbody.stop-scrolling {\n\t\toverflow: hidden;\n\t}\n`;\n\n// Keyframes\nconst modalFadeIn = keyframes`\n\tfrom {\n\t\topacity: 0;\n\t}\n\tto {\n\t\topacity: 1;\n\t}\n`;\n\nconst modalFadeOut = keyframes`\n\tfrom {\n\t\topacity: 1;\n\t}\n\tto {\n\t\topacity: 0;\n\t}\n`;\n\nconst backdropFadeIn = keyframes`\n\tfrom {\n\t\topacity: 0;\n\t}\n\tto {\n\t\topacity: 1;\n\t}\n`;\n\nconst backdropFadeOut = keyframes`\n\tfrom {\n\t\topacity: 1;\n\t}\n\tto {\n\t\topacity: 0;\n\t}\n`;\n\n// Styled Components\nconst ModalRoot = styled.div<{ $isFadeOut: boolean }>`\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 10000;\n animation: ${(props) => (props.$isFadeOut ? modalFadeOut : modalFadeIn)} 0.3s\n ease forwards;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst Backdrop = styled.button<{ $isFadeOut: boolean }>`\n background-color: var(--black-500);\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n backdrop-filter: blur(2px);\n box-shadow: none;\n border: none;\n height: 100%;\n animation: ${(props) => (props.$isFadeOut ? backdropFadeOut : backdropFadeIn)}\n 0.3s ease forwards;\n`;\n\nconst ModalContainer = styled.div<{ $isFadeOut: boolean; width?: string }>`\n position: relative;\n background: var(--theme-background, var(--white-900));\n border-radius: var(--theme-radius-large, 16px);\n width: ${(props) => props.width || \"480px\"};\n max-width: 90vw;\n padding: 0;\n box-shadow: 0px 4px 12px 0px var(--black-100),\n 0px 2px 4px -2px var(--black-100);\n z-index: 1;\n transform: ${(props) => (props.$isFadeOut ? \"scale(0.95)\" : \"scale(1)\")};\n opacity: ${(props) => (props.$isFadeOut ? 0 : 1)};\n transition: transform 0.3s ease-out, opacity 0.3s ease-out;\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n\n @media (max-width: 767px) {\n width: calc(100% - 40px) !important;\n }\n`;\n\nconst HeaderWrapper = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding: 12px 24px;\n border-bottom: 1px solid var(--grey-100);\n`;\n\nconst ModalTitle = styled.h3`\n margin: 0;\n font-family: \"Inter\", sans-serif;\n font-size: 18px;\n font-style: normal;\n font-weight: 500;\n line-height: 28px;\n color: var(--black-900);\n`;\n\nconst CloseButton = styled.button<{ $absolute?: boolean }>`\n background: none;\n border: none;\n cursor: pointer;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--black-900);\n width: 24px;\n height: 24px;\n ${(props) =>\n props.$absolute &&\n `\n position: absolute;\n top: 16px;\n right: 16px;\n `}\n\n &:hover {\n color: var(--black-900);\n }\n\n svg {\n width: 20px;\n height: 20px;\n }\n`;\n\nconst Actions = styled.div`\n padding: 12px;\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n\n @media (max-width: 767px) {\n justify-content: center !important;\n\n .button {\n display: flex !important;\n width: 100%;\n }\n }\n`;\n\nconst ModalContent = styled.div`\n color: var(--grey-500);\n font-family: \"Inter\", sans-serif;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n margin: 0 24px;\n overflow-y: auto;\n flex: 1;\n max-height: calc(90vh - 140px); /* Account for header and footer */\n`;\n\nconst Modal = ({\n isOpen,\n onClose,\n onCloseLabel,\n onConfirm,\n onConfirmLabel,\n children,\n width = \"400px\",\n className = \"\",\n hideActions = false,\n title,\n}: ModalProps) => {\n const [isVisible, setIsVisible] = useState(false);\n const [isFadeOut, setIsFadeOut] = useState(false);\n const animationTimeout = useRef<NodeJS.Timeout | null>(null);\n\n // Handle opening and closing animations\n useEffect(() => {\n if (isOpen) {\n setIsVisible(true);\n setIsFadeOut(false);\n } else {\n // If it's already closed, nothing to do\n if (!isVisible) return;\n\n // Start fade out animation\n setIsFadeOut(true);\n\n // Wait for animation to complete before hiding\n animationTimeout.current = setTimeout(() => {\n setIsVisible(false);\n }, ANIMATION_DURATION_MS);\n }\n\n // Cleanup on unmount\n return () => {\n if (animationTimeout.current) {\n clearTimeout(animationTimeout.current);\n }\n };\n }, [isOpen, isVisible]);\n\n // Handle body scrolling\n useEffect(() => {\n if (isVisible) {\n if (typeof document !== \"undefined\") {\n document.body.classList.add(\"stop-scrolling\");\n }\n } else {\n if (typeof document !== \"undefined\") {\n document.body.classList.remove(\"stop-scrolling\");\n }\n }\n\n // Cleanup function to remove the class when the component unmounts\n return () => {\n if (typeof document !== \"undefined\") {\n document.body.classList.remove(\"stop-scrolling\");\n }\n };\n }, [isVisible]);\n\n // Handle the close button click\n const handleClose = () => {\n setIsFadeOut(true);\n\n // Wait for animation to complete before calling onClose\n animationTimeout.current = setTimeout(() => {\n onClose();\n }, ANIMATION_DURATION_MS);\n };\n\n return (\n isVisible && (\n <>\n <GlobalStyle />\n <ModalRoot $isFadeOut={isFadeOut} className={className}>\n <Backdrop $isFadeOut={isFadeOut} onClick={handleClose} />\n\n <ModalContainer $isFadeOut={isFadeOut} width={width}>\n {title && (\n <HeaderWrapper>\n <ModalTitle>{title}</ModalTitle>\n <CloseButton onClick={handleClose}>\n <Icon name={IconName.CLOSE} />\n </CloseButton>\n </HeaderWrapper>\n )}\n\n {!title && (\n <CloseButton $absolute onClick={handleClose}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </CloseButton>\n )}\n\n <ModalContent>{children}</ModalContent>\n\n {!hideActions && (\n <Actions>\n <Button\n variant=\"tertiary\"\n onClick={handleClose}\n className=\"button\"\n size=\"medium\"\n fullWidth\n >\n {onCloseLabel || \"Cancel\"}\n </Button>\n <Button\n variant=\"primary\"\n onClick={onConfirm}\n className=\"button\"\n size=\"medium\"\n fullWidth\n >\n {onConfirmLabel || \"Confirm\"}\n </Button>\n </Actions>\n )}\n </ModalContainer>\n </ModalRoot>\n </>\n )\n );\n};\n\nexport default Modal;\n","import { Button } from \"@atoms/Button\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport styled, { css } from \"styled-components\";\n\nimport type { ReactNode} from \"react\";\n\nexport type PopConfirmPlacement =\n | \"top\"\n | \"left\"\n | \"right\"\n | \"bottom\"\n | \"topLeft\"\n | \"topRight\"\n | \"bottomLeft\"\n | \"bottomRight\"\n | \"leftTop\"\n | \"leftBottom\"\n | \"rightTop\"\n | \"rightBottom\";\n\nexport interface PopConfirmProps {\n title?: ReactNode;\n description?: ReactNode;\n onConfirm?: (e?: React.MouseEvent<HTMLElement>) => void;\n onCancel?: (e?: React.MouseEvent<HTMLElement>) => void;\n okText?: string;\n cancelText?: string;\n placement?: PopConfirmPlacement;\n children: ReactNode;\n className?: string;\n okButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>;\n cancelButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\ninterface PopoverContainerProps {\n placement: PopConfirmPlacement;\n $isVisible: boolean;\n}\n\nconst PopoverContainer = styled.div<PopoverContainerProps>`\n position: absolute;\n background-color: var(--white-900);\n border-radius: 8px;\n box-shadow: 0 3px 6px -4px var(--black-200), 0 6px 16px 0 var(--black-100),\n 0 9px 28px 8px var(--black-50);\n z-index: 1000;\n max-width: 450px;\n min-width: 400px;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.2s, visibility 0.2s;\n user-select: none;\n padding: 0;\n font-family: \"Inter\", sans-serif;\n\n ${(props) =>\n props.$isVisible &&\n css`\n opacity: 1;\n visibility: visible;\n `}\n\n ${(props) => {\n switch (props.placement) {\n case \"top\":\n return css`\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%) translateY(-15px);\n\n &::after {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 50%;\n margin-left: -6px;\n border-width: 6px;\n border-style: solid;\n border-color: var(--white-900) transparent transparent transparent;\n }\n `;\n case \"topLeft\":\n return css`\n bottom: 100%;\n left: 0;\n transform: translateY(-15px);\n\n &::after {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 12px;\n border-width: 6px;\n border-style: solid;\n border-color: var(--white-900) transparent transparent transparent;\n }\n `;\n case \"topRight\":\n return css`\n bottom: 100%;\n right: 0;\n transform: translateY(-15px);\n\n &::after {\n content: \"\";\n position: absolute;\n top: 100%;\n right: 12px;\n border-width: 6px;\n border-style: solid;\n border-color: var(--white-900) transparent transparent transparent;\n }\n `;\n case \"left\":\n return css`\n top: 50%;\n right: 100%;\n transform: translateY(-50%) translateX(-15px);\n\n &::after {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 100%;\n margin-top: -6px;\n border-width: 6px;\n border-style: solid;\n border-color: transparent transparent transparent var(--white-900);\n }\n `;\n case \"leftTop\":\n return css`\n top: 0;\n right: 100%;\n transform: translateX(-15px);\n\n &::after {\n content: \"\";\n position: absolute;\n top: 12px;\n left: 100%;\n border-width: 6px;\n border-style: solid;\n border-color: transparent transparent transparent var(--white-900);\n }\n `;\n case \"leftBottom\":\n return css`\n bottom: 0;\n right: 100%;\n transform: translateX(-15px);\n\n &::after {\n content: \"\";\n position: absolute;\n bottom: 12px;\n left: 100%;\n border-width: 6px;\n border-style: solid;\n border-color: transparent transparent transparent var(--white-900);\n }\n `;\n case \"right\":\n return css`\n top: 50%;\n left: 100%;\n transform: translateY(-50%) translateX(15px);\n\n &::after {\n content: \"\";\n position: absolute;\n top: 50%;\n right: 100%;\n margin-top: -6px;\n border-width: 6px;\n border-style: solid;\n border-color: transparent var(--white-900) transparent transparent;\n }\n `;\n case \"rightTop\":\n return css`\n top: 0;\n left: 100%;\n transform: translateX(15px);\n\n &::after {\n content: \"\";\n position: absolute;\n top: 12px;\n right: 100%;\n border-width: 6px;\n border-style: solid;\n border-color: transparent var(--white-900) transparent transparent;\n }\n `;\n case \"rightBottom\":\n return css`\n bottom: 0;\n left: 100%;\n transform: translateX(15px);\n\n &::after {\n content: \"\";\n position: absolute;\n bottom: 12px;\n right: 100%;\n border-width: 6px;\n border-style: solid;\n border-color: transparent var(--white-900) transparent transparent;\n }\n `;\n case \"bottom\":\n return css`\n top: 100%;\n left: 50%;\n transform: translateX(-50%) translateY(15px);\n\n &::after {\n content: \"\";\n position: absolute;\n bottom: 100%;\n left: 50%;\n margin-left: -6px;\n border-width: 6px;\n border-style: solid;\n border-color: transparent transparent var(--white-900) transparent;\n }\n `;\n case \"bottomLeft\":\n return css`\n top: 100%;\n left: 0;\n transform: translateY(15px);\n\n &::after {\n content: \"\";\n position: absolute;\n bottom: 100%;\n left: 12px;\n border-width: 6px;\n border-style: solid;\n border-color: transparent transparent var(--white-900) transparent;\n }\n `;\n case \"bottomRight\":\n return css`\n top: 100%;\n right: 0;\n transform: translateY(15px);\n\n &::after {\n content: \"\";\n position: absolute;\n bottom: 100%;\n right: 12px;\n border-width: 6px;\n border-style: solid;\n border-color: transparent transparent var(--white-900) transparent;\n }\n `;\n default:\n return \"\";\n }\n }}\n`;\n\nconst PopoverTitle = styled.div`\n padding: 12px 16px;\n color: var(--black-800);\n font-weight: 600;\n font-size: 14px;\n border-bottom: 1px solid var(--grey-100);\n`;\n\nconst PopoverContent = styled.div`\n padding: 12px 16px;\n color: var(--grey-600);\n font-size: 14px;\n`;\n\nconst ButtonsContainer = styled.div`\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 16px 12px;\n`;\n\nconst PopConfirmWrapper = styled.div`\n position: relative;\n display: inline-block;\n`;\n\nexport const PopConfirm: React.FC<PopConfirmProps> = ({\n title,\n description,\n onConfirm,\n onCancel,\n okText = \"OK\",\n cancelText = \"Cancel\",\n placement = \"top\",\n children,\n className,\n okButtonProps,\n cancelButtonProps,\n ...rest\n}) => {\n const [isVisible, setIsVisible] = useState(false);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n // Handle clicking outside to close the popconfirm\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n wrapperRef.current &&\n !wrapperRef.current.contains(event.target as Node)\n ) {\n setIsVisible(false);\n }\n };\n\n if (isVisible) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isVisible]);\n\n const handleConfirm = (e: React.MouseEvent<HTMLElement>) => {\n setIsVisible(false);\n onConfirm?.(e);\n };\n\n const handleCancel = (e: React.MouseEvent<HTMLElement>) => {\n setIsVisible(false);\n onCancel?.(e);\n };\n\n const handleToggle = () => {\n setIsVisible(!isVisible);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleToggle();\n }\n };\n\n return (\n <PopConfirmWrapper ref={wrapperRef} className={className} {...rest}>\n <div\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n >\n {children}\n </div>\n <PopoverContainer placement={placement} $isVisible={isVisible}>\n {title && <PopoverTitle>{title}</PopoverTitle>}\n {description && <PopoverContent>{description}</PopoverContent>}\n <ButtonsContainer>\n <Button\n variant=\"tertiary\"\n size=\"small\"\n onClick={handleCancel}\n {...cancelButtonProps}\n >\n {cancelText}\n </Button>\n <Button\n variant=\"primary\"\n size=\"small\"\n onClick={handleConfirm}\n {...okButtonProps}\n >\n {okText}\n </Button>\n </ButtonsContainer>\n </PopoverContainer>\n </PopConfirmWrapper>\n );\n};\n\nPopConfirm.displayName = \"PopConfirm\";\n\nexport default PopConfirm;\n","import { Icon, IconName } from \"@atoms/Icon\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nexport interface SupportiveTextProps {\n children: React.ReactNode;\n showCheck?: boolean;\n className?: string;\n}\n\nconst Container = styled.div`\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--grey-600);\n text-overflow: ellipsis;\n font-family: \"Inter\", sans-serif;\n font-size: 13px;\n font-style: normal;\n font-weight: 400;\n line-height: 18px;\n`;\n\nconst CheckIcon = () => (\n <Icon name={IconName.CHECK_CIRCLE} fill=\"var(--grey-600)\" />\n);\n\nexport const SupportiveText: React.FC<SupportiveTextProps> = ({\n children,\n showCheck = false,\n className,\n}) => {\n return (\n <Container className={className}>\n {showCheck && <CheckIcon />}\n {children}\n </Container>\n );\n};\n\nexport default SupportiveText;\n","import React from \"react\";\nimport styled, { css } from \"styled-components\";\n\nexport type TabSize = \"small\" | \"medium\";\n\nexport interface TabProps {\n label: string;\n active?: boolean;\n disabled?: boolean;\n size?: TabSize;\n onClick?: () => void;\n}\n\nconst sizeStyles = {\n small: css`\n font-family: \"Inter\", sans-serif;\n font-size: 14px;\n font-style: normal;\n font-weight: 600;\n line-height: 20px;\n `,\n medium: css`\n font-family: \"Inter\", sans-serif;\n font-size: 16px;\n font-style: normal;\n font-weight: 500;\n line-height: 24px;\n `,\n};\n\nconst TabContainer = styled.button<{\n $active?: boolean;\n disabled?: boolean;\n size: TabSize;\n}>`\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 12px 16px;\n background: transparent;\n border: none;\n outline: none;\n cursor: ${(props) => (props.disabled ? \"not-allowed\" : \"pointer\")};\n ${(props) => sizeStyles[props.size]}\n color: ${(props) => {\n if (props.disabled) return \"var(--grey-400)\";\n return props.$active ? \"var(--blue-900)\" : \"var(--grey-500)\";\n }};\n transition: all 0.2s ease;\n\n &:hover:not(:disabled) {\n color: var(--blue-900);\n }\n\n &:after {\n content: \"\";\n position: absolute;\n width: 100%;\n height: 3px;\n background-color: ${(props) =>\n props.disabled ? \"var(--grey-400)\" : \"var(--blue-900)\"};\n bottom: 0;\n left: 0;\n opacity: ${(props) => (props.$active ? 1 : 0)};\n transition: opacity 0.2s ease;\n }\n\n &:focus {\n outline: none;\n box-shadow: none;\n }\n`;\n\nexport const Tab: React.FC<TabProps> = ({\n label,\n active = false,\n disabled = false,\n size = \"medium\",\n onClick,\n}) => {\n return (\n <TabContainer\n $active={active}\n disabled={disabled}\n size={size}\n onClick={onClick}\n >\n {label}\n </TabContainer>\n );\n};\n\nexport default Tab;\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nexport interface TableCellProps\n extends React.TdHTMLAttributes<HTMLTableCellElement> {\n children?: React.ReactNode;\n align?: \"left\" | \"center\" | \"right\";\n width?: string;\n className?: string;\n ref?: React.Ref<HTMLTableCellElement>;\n}\n\nconst StyledTableCell = styled.td<TableCellProps>`\n background-color: var(--white-900);\n border-right: 1px solid var(--grey-200);\n border-bottom: 1px solid var(--grey-200);\n padding: 10px 12px;\n font-family: \"Inter\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: var(--grey-900);\n opacity: 0.8;\n text-align: ${(props) => props.align || \"left\"};\n width: ${(props) => props.width || \"auto\"};\n white-space: nowrap;\n box-sizing: border-box;\n\n &:last-child {\n border-right: 1px solid var(--grey-200);\n }\n`;\n\nexport const TableCell = ({\n children,\n align = \"left\",\n width,\n className,\n ref,\n ...props\n}: TableCellProps) => {\n return (\n <StyledTableCell\n ref={ref}\n align={align}\n width={width}\n className={className}\n {...props}\n >\n {children}\n </StyledTableCell>\n );\n};\n\nexport default TableCell;\n","import { Dropdown } from \"@atoms/Dropdown\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nimport type { DropdownOption } from \"@atoms/Dropdown\";\n\nexport interface TableHeaderCellProps\n extends React.ThHTMLAttributes<HTMLTableCellElement> {\n children?: React.ReactNode;\n sortable?: boolean;\n sortDirection?: \"asc\" | \"desc\" | null;\n onSort?: () => void;\n filterable?: boolean;\n filterOptions?: DropdownOption[];\n filterValue?: string;\n onFilterChange?: (value: string) => void;\n width?: string;\n className?: string;\n ref?: React.Ref<HTMLTableCellElement>;\n}\n\nconst StyledTableHeaderCell = styled.th<{ width?: string }>`\n background-color: var(--grey-50);\n border-right: 1px solid var(--grey-200);\n border-bottom: 1px solid var(--grey-200);\n padding: 8px 12px;\n height: 35px;\n box-sizing: border-box;\n width: ${(props) => props.width || \"auto\"};\n\n &:last-child {\n border-right: 1px solid var(--grey-200);\n }\n`;\n\nconst HeaderContent = styled.div<{ $clickable?: boolean }>`\n display: flex;\n align-items: center;\n gap: 4px;\n cursor: ${(props) => (props.$clickable ? \"pointer\" : \"default\")};\n user-select: none;\n`;\n\nconst HeaderText = styled.span`\n font-family: \"Inter\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 13px;\n font-weight: 600;\n line-height: 18px;\n color: var(--grey-900);\n white-space: nowrap;\n flex-shrink: 0;\n`;\n\nconst SortIcon = styled.svg`\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n`;\n\nconst DropdownContainer = styled.div`\n padding: 10px 4px;\n height: 35px;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n\n & > div {\n height: 32px;\n }\n\n li {\n text-align: left;\n }\n`;\n\nexport const TableHeaderCell = ({\n children,\n sortable = false,\n sortDirection = null,\n onSort,\n filterable = false,\n filterOptions = [],\n filterValue,\n onFilterChange,\n width,\n className,\n ref,\n ...props\n}: TableHeaderCellProps) => {\n const handleSort = () => {\n if (sortable && onSort) {\n onSort();\n }\n };\n\n // If filterable, render dropdown instead of text\n if (filterable) {\n return (\n <StyledTableHeaderCell\n ref={ref}\n width={width}\n className={className}\n {...props}\n >\n <DropdownContainer>\n <Dropdown\n options={filterOptions}\n value={filterValue}\n onChange={onFilterChange}\n placeholder=\"Placeholder\"\n size=\"small\"\n width=\"100%\"\n />\n </DropdownContainer>\n </StyledTableHeaderCell>\n );\n }\n\n // Otherwise render normal header with optional sort\n return (\n <StyledTableHeaderCell\n ref={ref}\n width={width}\n className={className}\n {...props}\n >\n <HeaderContent $clickable={sortable} onClick={handleSort}>\n <HeaderText>{children}</HeaderText>\n {sortable && (\n <SortIcon\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8 3.33337L10.6667 6.00004H5.33333L8 3.33337Z\"\n fill={sortDirection === \"asc\" ? \"var(--grey-900)\" : \"var(--grey-400)\"}\n />\n <path\n d=\"M8 12.6667L5.33333 10H10.6667L8 12.6667Z\"\n fill={sortDirection === \"desc\" ? \"var(--grey-900)\" : \"var(--grey-400)\"}\n />\n </SortIcon>\n )}\n </HeaderContent>\n </StyledTableHeaderCell>\n );\n};\n\nexport default TableHeaderCell;\n","import React from \"react\";\nimport styled, { css } from \"styled-components\";\n\nexport type TextareaSize = \"xsmall\" | \"small\";\n\nexport interface TextareaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, \"size\"> {\n size?: TextareaSize;\n error?: boolean;\n disabled?: boolean;\n fullWidth?: boolean;\n rows?: number;\n ref?: React.Ref<HTMLTextAreaElement>;\n}\n\ninterface StyleProps {\n size: TextareaSize;\n rows?: number;\n}\n\nconst sizeStyles = {\n xsmall: css<StyleProps>`\n min-height: ${(props) => (props.rows ? \"auto\" : \"80px\")};\n padding: 10px;\n `,\n small: css<StyleProps>`\n min-height: ${(props) => (props.rows ? \"auto\" : \"100px\")};\n padding: 12px;\n `,\n};\n\nconst TextareaContainer = styled.div<{\n $fullWidth?: boolean;\n}>`\n position: relative;\n display: inline-flex;\n align-items: center;\n width: ${(props) => (props.$fullWidth ? \"100%\" : \"auto\")};\n gap: 8px;\n`;\n\ninterface StyledTextareaProps extends StyleProps {\n $error?: boolean;\n}\n\nconst StyledTextarea = styled.textarea<StyledTextareaProps>`\n width: 100%;\n border-radius: 6px;\n font-family: \"Inter\", sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n border: 1px solid\n ${(props) =>\n props.$error\n ? \"var(--red-error)\"\n : props.disabled\n ? \"var(--grey-300)\"\n : \"var(--grey-300)\"};\n background-color: ${(props) =>\n props.disabled ? \"var(--grey-200)\" : \"var(--white-900)\"};\n color: ${(props) =>\n props.disabled ? \"var(--grey-400)\" : \"var(--black-900)\"};\n transition: all 0.2s;\n resize: vertical;\n font-size: 14px;\n\n ${(props) => sizeStyles[props.size || \"small\"]}\n\n &:hover:not(:disabled):not(:focus) {\n border-color: ${(props) =>\n props.$error ? \"var(--red-error)\" : \"var(--blue-600)\"};\n }\n\n &:focus {\n outline: none;\n box-shadow: 0px 0px 0px 1px var(--white-900),\n 0px 0px 0px 3px var(--blue-600);\n border-color: ${(props) =>\n props.$error ? \"var(--red-error)\" : \"var(--blue-600)\"};\n }\n\n &:active {\n outline: none;\n box-shadow: 0px 0px 0px 2px var(--blue-200);\n border-color: ${(props) =>\n props.$error ? \"var(--red-error)\" : \"var(--blue-600)\"};\n }\n\n &:disabled {\n cursor: not-allowed;\n user-select: none;\n pointer-events: none;\n }\n\n &::placeholder {\n color: var(--grey-400);\n }\n`;\n\nexport const Textarea = ({\n size = \"small\",\n error = false,\n disabled = false,\n fullWidth = false,\n rows,\n ref,\n ...rest\n}: TextareaProps) => {\n return (\n <TextareaContainer $fullWidth={fullWidth}>\n <StyledTextarea\n ref={ref}\n size={size}\n $error={error}\n disabled={disabled}\n rows={rows}\n {...rest}\n />\n </TextareaContainer>\n );\n};\n\nexport default Textarea;\n","import { Icon, IconName } from \"@atoms/Icon\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nimport type { ReactNode } from \"react\";\n\nexport type ToastType = \"info\" | \"success\" | \"warning\" | \"danger\" | \"default\";\n\nexport interface ToastProps {\n type?: ToastType;\n heading: string;\n description?: string;\n className?: string;\n}\n\ninterface ToastContainerProps {\n type: ToastType;\n}\n\nconst typeStyles = {\n info: {\n backgroundColor: \"var(--blue-100)\",\n borderColor: \"var(--blue-600)\",\n iconColor: \"var(--blue-600)\",\n },\n success: {\n backgroundColor: \"var(--green-bg)\",\n borderColor: \"var(--green-success)\",\n iconColor: \"var(--green-success)\",\n },\n warning: {\n backgroundColor: \"var(--orange-bg)\",\n borderColor: \"var(--orange-caution)\",\n iconColor: \"var(--orange-caution)\",\n },\n danger: {\n backgroundColor: \"var(--red-bg)\",\n borderColor: \"var(--red-error)\",\n iconColor: \"var(--red-error)\",\n },\n default: {\n backgroundColor: \"var(--white-900)\",\n borderColor: \"var(--grey-300)\",\n iconColor: \"var(--grey-600)\",\n },\n};\n\nconst ToastContainer = styled.div<ToastContainerProps>`\n display: flex;\n padding: 8px;\n gap: 8px;\n align-items: flex-start;\n border-radius: 8px;\n background-color: ${(props) => typeStyles[props.type].backgroundColor};\n border: 1px solid ${(props) => typeStyles[props.type].borderColor};\n width: 100%;\n box-sizing: border-box;\n`;\n\nconst ContentContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n`;\n\nconst Heading = styled.h3`\n margin: 0;\n color: var(--black-900);\n font-family: \"Inter\", sans-serif;\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 24px;\n`;\n\nconst Description = styled.p`\n margin: 0;\n color: var(--grey-500);\n text-overflow: ellipsis;\n font-family: \"Inter\", sans-serif;\n font-size: 13px;\n font-style: normal;\n font-weight: 400;\n line-height: 18px;\n`;\n\nconst InfoIcon = ({ color }: { color: string }) => (\n <Icon name={IconName.INFORMATION_CIRCLE} fill={color} />\n);\n\nconst SuccessIcon = ({ color }: { color: string }) => (\n <Icon name={IconName.CHECK_CIRCLE} fill={color} />\n);\n\nconst WarningIcon = ({ color }: { color: string }) => (\n <Icon name={IconName.EXCLAMATION_TRIANGLE} fill={color} />\n);\n\nconst ErrorIcon = ({ color }: { color: string }) => (\n <Icon name={IconName.EXCLAMATION_CIRCLE} fill={color} />\n);\n\nconst NeutralIcon = ({ color }: { color: string }) => (\n <Icon name={IconName.EXCLAMATION_TRIANGLE} fill={color} />\n);\n\nconst getIcon = (type: ToastType, color: string): ReactNode => {\n switch (type) {\n case \"info\":\n return <InfoIcon color={color} />;\n case \"success\":\n return <SuccessIcon color={color} />;\n case \"warning\":\n return <WarningIcon color={color} />;\n case \"danger\":\n return <ErrorIcon color={color} />;\n default:\n return <NeutralIcon color={color} />;\n }\n};\n\nexport const Toast: React.FC<ToastProps> = ({\n type = \"default\",\n heading,\n description,\n className,\n}) => {\n return (\n <ToastContainer type={type} className={className}>\n {getIcon(type, typeStyles[type].iconColor)}\n <ContentContainer>\n <Heading>{heading}</Heading>\n {description && <Description>{description}</Description>}\n </ContentContainer>\n </ToastContainer>\n );\n};\n\nexport default Toast;\n","import React, { useState } from \"react\";\nimport styled from \"styled-components\";\n\nexport interface ToggleProps {\n checked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n label?: string;\n className?: string;\n}\n\nconst ToggleContainer = styled.div<{ disabled?: boolean }>`\n display: flex;\n align-items: center;\n gap: 8px;\n opacity: ${({ disabled }) => (disabled ? 0.6 : 1)};\n cursor: ${({ disabled }) => (disabled ? \"not-allowed\" : \"pointer\")};\n`;\n\nconst ToggleSwitch = styled.div<{ checked: boolean; disabled?: boolean }>`\n position: relative;\n width: 32px;\n height: 20px;\n background-color: ${({ checked }) =>\n checked ? \"var(--blue-600)\" : \"var(--grey-500)\"};\n border-radius: 100px;\n border: 2px solid var(--black-200);\n transition: all 0.2s ease;\n cursor: ${({ disabled }) => (disabled ? \"not-allowed\" : \"pointer\")};\n box-sizing: border-box;\n`;\n\nconst ToggleKnob = styled.div<{ checked: boolean }>`\n position: absolute;\n top: 0px;\n left: ${({ checked }) => (checked ? \"12px\" : \"0px\")};\n width: 16px;\n height: 16px;\n background-color: var(--white-900);\n border-radius: 50%;\n box-shadow: 0 1px 3px var(--black-300);\n transition: all 0.2s ease;\n`;\n\nconst LabelText = styled.span`\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 24px;\n user-select: none;\n pointer-events: none;\n color: var(--grey-500);\n`;\n\nexport const Toggle: React.FC<ToggleProps> = ({\n checked = false,\n onChange,\n disabled = false,\n label,\n className,\n}) => {\n const [isChecked, setIsChecked] = useState(checked);\n\n const handleToggle = () => {\n if (disabled) return;\n\n const newState = !isChecked;\n setIsChecked(newState);\n onChange?.(newState);\n };\n\n return (\n <ToggleContainer\n disabled={disabled}\n className={className}\n onClick={handleToggle}\n >\n <ToggleSwitch checked={isChecked} disabled={disabled}>\n <ToggleKnob checked={isChecked} />\n </ToggleSwitch>\n {label && <LabelText>{label}</LabelText>}\n </ToggleContainer>\n );\n};\n\nexport default Toggle;\n","/**\n * TDP Navigation Utilities\n *\n * Pure utility functions for constructing and navigating to TDP URLs.\n * These work independently of React and can be used in any context.\n *\n * Data apps run inside iframes within TDP. These utilities help resolve\n * the TDP base URL from the iframe context and construct navigation URLs.\n */\n\n/**\n * Known TDP route prefixes. When found in a referrer URL's pathname,\n * everything from the prefix onward is stripped to derive the TDP base URL.\n */\nconst TDP_ROUTE_PREFIXES = [\n '/data-workspace',\n '/data-apps',\n '/pipelines',\n '/pipeline-edit/',\n '/pipeline-details/',\n '/pipeline-processing/',\n '/file/',\n '/file-details/',\n '/files',\n '/search',\n '/search-classic',\n '/artifacts/',\n '/admin',\n '/settings',\n '/agent-studio',\n];\n\n/**\n * Extract the TDP base URL from `document.referrer`.\n *\n * In production, data apps run inside iframes within TDP. The browser\n * provides `document.referrer` containing the parent TDP page URL.\n * This function strips the known route path to get the base URL\n * (origin + org slug path prefix).\n *\n * @example\n * // referrer: \"https://tetrascience-uat.com/my-org/data-workspace/abc\"\n * getTdpBaseUrlFromReferrer() // \"https://tetrascience-uat.com/my-org\"\n *\n * @returns The TDP base URL, or null if detection fails\n */\nexport function getTdpBaseUrlFromReferrer(): string | null {\n if (typeof document === 'undefined' || !document.referrer) {\n return null;\n }\n\n try {\n const referrerUrl = new URL(document.referrer);\n const pathname = referrerUrl.pathname;\n\n for (const prefix of TDP_ROUTE_PREFIXES) {\n const prefixIndex = pathname.indexOf(prefix);\n if (prefixIndex !== -1) {\n const basePath = pathname.slice(0, prefixIndex).replace(/\\/$/u, '');\n return `${referrerUrl.origin}${basePath}`;\n }\n }\n\n // No known route matched — return origin (handles TDP root pages)\n return referrerUrl.origin;\n } catch {\n return null;\n }\n}\n\n/**\n * Construct a full TDP URL by joining a base URL with a path.\n *\n * @example\n * buildTdpUrl(\"https://tetrascience.com/my-org\", \"/file/abc-123\")\n * // \"https://tetrascience.com/my-org/file/abc-123\"\n *\n * @param baseUrl - The TDP base URL (origin + optional org prefix)\n * @param path - The TDP page path (e.g., \"/file/abc-123\")\n * @returns The full TDP URL, or null if construction fails\n */\nexport function buildTdpUrl(baseUrl: string, path: string): string | null {\n try {\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(baseUrl);\n url.pathname = `${url.pathname.replace(/\\/$/u, '')}${normalizedPath}`;\n return url.href;\n } catch {\n return null;\n }\n}\n\nexport interface TdpNavigationOptions {\n /** Open in a new tab instead of navigating the parent TDP frame. Default: false */\n newTab?: boolean;\n}\n\n/**\n * Navigate to a TDP URL.\n *\n * - `{ newTab: true }` opens the URL in a new browser tab.\n * - Default: sends a `postMessage` to the parent TDP frame (same-tab navigation\n * when inside an iframe), or navigates the current window (standalone).\n *\n * @param url - Full TDP URL to navigate to\n * @param options - Navigation options\n */\nexport function navigateToTdpUrl(url: string, options: TdpNavigationOptions = {}): void {\n if (options.newTab) {\n window.open(url, '_blank', 'noopener,noreferrer');\n return;\n }\n\n // In a cross-origin iframe (TDP), use postMessage to navigate the parent frame.\n // Same-origin iframes (e.g., Storybook) fall through to direct navigation.\n if (window.parent !== window) {\n try {\n // Accessing window.parent.location.href throws SecurityError if cross-origin\n void window.parent.location.href;\n } catch {\n // Cross-origin iframe — use postMessage to navigate the parent TDP frame\n try {\n const tdpUrl = new URL(url);\n const relativePath = `${tdpUrl.pathname}${tdpUrl.search}${tdpUrl.hash}`;\n window.parent.postMessage({ type: 'navigate', path: relativePath }, '*');\n return;\n } catch {\n // Fall through to direct navigation\n }\n }\n }\n\n // Fallback: direct navigation (local dev or non-iframe)\n window.location.href = url;\n}\n\n/**\n * Convenience helpers for constructing common TDP page paths.\n * Returns path strings for use with `getTdpUrl()` or `buildTdpUrl()`.\n *\n * @example\n * const { getTdpUrl } = useTdpNavigation();\n * const url = getTdpUrl(tdpPaths.fileDetails(\"abc-123\"));\n */\nexport const tdpPaths = {\n fileDetails: (fileId: string) => `/file/${fileId}`,\n pipelineEdit: (pipelineId: string) => `/pipeline-edit/${pipelineId}`,\n pipelineDetails: (pipelineId: string) => `/pipeline-details/${pipelineId}`,\n search: (query?: string) => (query ? `/search?q=${encodeURIComponent(query)}` : '/search'),\n dataWorkspace: () => '/data-workspace',\n dataApps: () => '/data-apps',\n artifact: (type: string, namespace: string, slug: string) => `/artifacts/${type}/${namespace}/${slug}`,\n};\n","import React, { createContext, useContext, useMemo } from 'react';\nimport styled from 'styled-components';\n\nimport { buildTdpUrl, getTdpBaseUrlFromReferrer, navigateToTdpUrl } from './tdpUrl';\n\nimport type { TdpNavigationOptions } from './tdpUrl';\n\nexport interface TdpNavigationContextValue {\n /** The resolved TDP base URL (origin + org path prefix), or null if not resolved */\n tdpBaseUrl: string | null;\n /** Construct a full TDP URL from a path. Returns null if base URL is not resolved. */\n getTdpUrl: (path: string) => string | null;\n /** Navigate to a TDP page. */\n navigateToTdp: (path: string, options?: TdpNavigationOptions) => void;\n}\n\nexport const TdpNavigationContext = createContext<TdpNavigationContextValue | null>(null);\n\n/**\n * Access TDP navigation helpers from the nearest TdpNavigationProvider.\n *\n * @throws Error if used outside a TdpNavigationProvider\n *\n * @example\n * ```tsx\n * const { getTdpUrl, navigateToTdp } = useTdpNavigationContext();\n * ```\n */\nexport function useTdpNavigationContext(): TdpNavigationContextValue {\n const context = useContext(TdpNavigationContext);\n if (!context) {\n throw new Error(\n 'useTdpNavigationContext must be used within a TdpNavigationProvider. ' +\n 'Wrap your app with <TdpNavigationProvider> or use the standalone useTdpNavigation() hook instead.',\n );\n }\n return context;\n}\n\n/** Props for the TdpNavigationProvider component */\nexport interface TdpNavigationProviderProps {\n /**\n * Explicit TDP base URL override. Skips auto-detection when provided.\n */\n tdpBaseUrl?: string;\n children: React.ReactNode;\n}\n\n/**\n * Provider that resolves the TDP base URL and exposes navigation helpers.\n *\n * Resolution order:\n * 1. Explicit `tdpBaseUrl` prop (if provided)\n * 2. `document.referrer` parsing (production iframe)\n *\n * @example\n * ```tsx\n * <TdpNavigationProvider tdpBaseUrl=\"https://tetrascience.com/my-org\">\n * <App />\n * </TdpNavigationProvider>\n * ```\n */\nexport const TdpNavigationProvider: React.FC<TdpNavigationProviderProps> = ({\n tdpBaseUrl: explicitBaseUrl,\n children,\n}) => {\n const tdpBaseUrl = useMemo(() => {\n if (explicitBaseUrl) {\n return explicitBaseUrl.replace(/\\/$/u, '');\n }\n return getTdpBaseUrlFromReferrer();\n }, [explicitBaseUrl]);\n\n const contextValue = useMemo<TdpNavigationContextValue>(\n () => ({\n tdpBaseUrl,\n getTdpUrl: (path: string) => {\n if (!tdpBaseUrl) return null;\n return buildTdpUrl(tdpBaseUrl, path);\n },\n navigateToTdp: (path: string, options?: TdpNavigationOptions) => {\n if (!tdpBaseUrl) {\n console.warn('[TdpNavigation] Cannot navigate: TDP base URL not resolved');\n return;\n }\n const url = buildTdpUrl(tdpBaseUrl, path);\n if (url) {\n navigateToTdpUrl(url, options);\n }\n },\n }),\n [tdpBaseUrl],\n );\n\n return <TdpNavigationContext.Provider value={contextValue}>{children}</TdpNavigationContext.Provider>;\n};\n\nexport interface UseTdpNavigationOptions {\n /** Explicit TDP base URL override */\n tdpBaseUrl?: string;\n}\n\nexport interface UseTdpNavigationReturn {\n /** The resolved TDP base URL, or null */\n tdpBaseUrl: string | null;\n /** Construct a full TDP URL from a path */\n getTdpUrl: (path: string) => string | null;\n /** Navigate to a TDP page */\n navigateToTdp: (path: string, options?: TdpNavigationOptions) => void;\n}\n\n/**\n * Standalone hook for TDP navigation (no provider required).\n *\n * For simple use cases where you don't need a TdpNavigationProvider.\n * If multiple components need navigation, prefer the provider approach.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { getTdpUrl, navigateToTdp } = useTdpNavigation({\n * tdpBaseUrl: \"https://tetrascience.com/my-org\",\n * });\n *\n * return (\n * <a href={getTdpUrl(\"/file/abc\") ?? \"#\"} target=\"_blank\" rel=\"noopener noreferrer\">\n * View File\n * </a>\n * );\n * }\n * ```\n */\nexport function useTdpNavigation(options: UseTdpNavigationOptions = {}): UseTdpNavigationReturn {\n const { tdpBaseUrl: explicitBaseUrl } = options;\n\n const tdpBaseUrl = useMemo(() => {\n if (explicitBaseUrl) return explicitBaseUrl.replace(/\\/$/u, '');\n return getTdpBaseUrlFromReferrer();\n }, [explicitBaseUrl]);\n\n return useMemo(\n () => ({\n tdpBaseUrl,\n getTdpUrl: (path: string) => (tdpBaseUrl ? buildTdpUrl(tdpBaseUrl, path) : null),\n navigateToTdp: (path: string, opts?: TdpNavigationOptions) => {\n if (!tdpBaseUrl) {\n console.warn('[useTdpNavigation] Cannot navigate: TDP base URL not resolved');\n return;\n }\n const url = buildTdpUrl(tdpBaseUrl, path);\n if (url) navigateToTdpUrl(url, opts);\n },\n }),\n [tdpBaseUrl],\n );\n}\n\n/** Props for the TDPLink component */\nexport interface TDPLinkProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {\n /** TDP page path (e.g., \"/file/abc-123\" or use tdpPaths helpers) */\n path: string;\n /** Navigation behavior. Default: { newTab: true } */\n navigationOptions?: TdpNavigationOptions;\n children: React.ReactNode;\n ref?: React.Ref<HTMLAnchorElement>;\n}\n\nconst StyledLink = styled.a`\n color: var(--theme-primary, var(--blue-600));\n text-decoration: none;\n cursor: pointer;\n\n &:hover {\n text-decoration: underline;\n }\n\n &:focus-visible {\n outline: 2px solid var(--blue-600);\n outline-offset: 2px;\n border-radius: 2px;\n }\n`;\n\n/**\n * A link component that navigates to TDP pages.\n *\n * Renders a standard `<a>` tag with the correct href for right-click\n * \"Open in new tab\" support, accessibility, and SEO.\n *\n * Must be used inside a `<TdpNavigationProvider>`.\n *\n * @example\n * ```tsx\n * import { TDPLink, tdpPaths } from '@tetrascience-npm/tetrascience-react-ui';\n *\n * <TDPLink path={tdpPaths.fileDetails(\"abc-123\")}>\n * View File Details\n * </TDPLink>\n *\n * <TDPLink path=\"/search?q=test\" navigationOptions={{ newTab: false }}>\n * Search in TDP (same tab)\n * </TDPLink>\n * ```\n */\nexport const TDPLink: React.FC<TDPLinkProps> = ({\n path,\n navigationOptions = { newTab: true },\n children,\n onClick,\n ...rest\n}) => {\n const { getTdpUrl, navigateToTdp } = useTdpNavigationContext();\n const href = getTdpUrl(path);\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n // Let modifier-key clicks through for native \"open in new tab\" behavior\n if (e.metaKey || e.ctrlKey || e.shiftKey) {\n return;\n }\n\n e.preventDefault();\n onClick?.(e);\n navigateToTdp(path, navigationOptions);\n };\n\n return (\n <StyledLink\n href={href ?? '#'}\n target={navigationOptions.newTab ? '_blank' : undefined}\n rel={navigationOptions.newTab ? 'noopener noreferrer' : undefined}\n onClick={handleClick}\n {...rest}\n >\n {children}\n </StyledLink>\n );\n};\n","import { Button } from \"@atoms/Button\";\nimport { Icon, IconName } from \"@atoms/Icon\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\ninterface UserProfileProps {\n name: string;\n avatar?: string;\n}\n\nexport interface AppHeaderProps {\n hostname: string;\n userProfile: UserProfileProps;\n onHomeClick?: () => void;\n onSettingsClick?: () => void;\n onUserProfileClick?: () => void;\n}\n\nconst HeaderContainer = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: auto;\n width: 100%;\n padding: 16px 28px;\n box-sizing: border-box;\n border-bottom: 1px solid var(--grey-200);\n background-color: var(--white-900);\n`;\n\nconst HostnameText = styled.div`\n color: var(--black-900);\n font-family: \"Inter\", sans-serif;\n font-size: 18px;\n font-style: normal;\n font-weight: 500;\n line-height: 28px;\n`;\n\nconst ActionsContainer = styled.div`\n display: flex;\n align-items: center;\n gap: 12px;\n`;\n\nconst UserProfileContainer = styled.div`\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n border-radius: 4px;\n\n &:hover {\n background-color: var(--grey-100);\n }\n`;\n\nconst Avatar = styled.div<{ src?: string }>`\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background-color: var(--blue-100);\n background-image: ${(props) => (props.src ? `url(${props.src})` : \"none\")};\n background-size: cover;\n background-position: center;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--blue-600);\n font-weight: 500;\n font-size: 14px;\n font-family: \"Inter\", sans-serif;\n`;\n\nconst UserName = styled.div`\n font-family: \"Inter\", sans-serif;\n color: var(--grey-400);\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 24px;\n`;\n\nconst IconButtonStyle = styled(Button)`\n width: 32px;\n height: 32px;\n padding: 0;\n min-height: 0;\n border-radius: 4px;\n`;\n\nconst Separator = styled.div`\n height: 20px;\n width: 1px;\n background-color: var(--grey-200);\n margin: 0;\n`;\n\nconst AppHeader: React.FC<AppHeaderProps> = ({\n hostname,\n userProfile,\n onHomeClick,\n onSettingsClick,\n onUserProfileClick,\n}) => {\n // Get initials for avatar placeholder if no image is provided\n const getInitials = (name: string) => {\n return name\n .split(\" \")\n .map((part) => part.charAt(0))\n .join(\"\")\n .toUpperCase()\n .substring(0, 2);\n };\n\n return (\n <HeaderContainer>\n <HostnameText>{hostname}</HostnameText>\n\n <ActionsContainer>\n <IconButtonStyle\n variant=\"tertiary\"\n size=\"small\"\n onClick={onHomeClick}\n aria-label=\"Home\"\n >\n <Icon\n name={IconName.HOME}\n width=\"20\"\n height=\"20\"\n fill=\"var(--grey-600)\"\n />\n </IconButtonStyle>\n\n <IconButtonStyle\n variant=\"tertiary\"\n size=\"small\"\n onClick={onSettingsClick}\n aria-label=\"Settings\"\n >\n <Icon\n name={IconName.GEAR}\n width=\"20\"\n height=\"20\"\n fill=\"var(--grey-600)\"\n />\n </IconButtonStyle>\n\n <Separator />\n\n <UserProfileContainer onClick={onUserProfileClick}>\n <Avatar src={userProfile.avatar}>\n {!userProfile.avatar && getInitials(userProfile.name)}\n </Avatar>\n <UserName>{userProfile.name}</UserName>\n </UserProfileContainer>\n </ActionsContainer>\n </HeaderContainer>\n );\n};\n\nexport default AppHeader;\n","import { Button } from \"@atoms/Button\";\nimport { CodeEditor } from \"@atoms/CodeEditor\";\nimport { Icon, IconName } from \"@atoms/Icon\";\nimport { Input } from \"@atoms/Input\";\nimport React, { useState } from \"react\";\nimport styled from \"styled-components\";\n\nexport interface AssistantModalProps {\n open: boolean;\n title: string;\n prompt: string;\n initialCode?: string;\n userQuery?: string;\n onUserQueryChange?: (value: string) => void;\n onCopy: (code: string) => void;\n onLaunch: (code: string) => void;\n onSend: (input: string) => void;\n onCancel: () => void;\n}\n\nconst ModalOverlay = styled.div`\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: var(--black-100);\n z-index: 1300;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst ModalContainer = styled.div`\n background: var(--white-900);\n border-radius: 20px;\n box-shadow: 0 2px 16px var(--black-100);\n min-width: 600px;\n max-width: 90vw;\n min-height: 500px;\n padding: 0;\n display: flex;\n flex-direction: column;\n`;\n\nconst ModalHeader = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px 0 24px;\n`;\n\nconst TitleWrapper = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nconst Title = styled.span`\n font-weight: 600;\n font-size: 20px;\n`;\n\nconst CloseButton = styled.button`\n background: none;\n border: none;\n font-size: 20px;\n cursor: pointer;\n`;\n\nconst PromptText = styled.div`\n padding: 24px;\n\n color: var(--black-900);\n font-family: \"Inter\", sans-serif;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n`;\n\nconst QueryContainer = styled.div`\n margin: 0 24px;\n background: var(--blue-900);\n color: var(--white-900);\n border-radius: 12px;\n padding: 0;\n font-size: 16px;\n font-weight: 500;\n word-break: break-word;\n box-shadow: 0 1px 4px var(--black-50);\n`;\n\nconst QueryTextarea = styled.textarea`\n width: 100%;\n min-height: 48px;\n background: transparent;\n color: var(--white-900);\n border: none;\n outline: none;\n resize: vertical;\n font-family: \"Inter\", sans-serif;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n padding: 16px 20px;\n border-radius: 12px;\n box-sizing: border-box;\n`;\n\nconst EditorContainer = styled.div`\n padding: 24px;\n padding-bottom: 0;\n flex: 1;\n`;\n\nconst EditorWrapper = styled.div`\n border-radius: 20px;\n overflow: hidden;\n background: var(--blue-900);\n min-height: 200px;\n position: relative;\n`;\n\nconst InputContainer = styled.div`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 24px;\n padding-top: 16px;\n background: var(--white-900);\n border-bottom-left-radius: 20px;\n border-bottom-right-radius: 20px;\n`;\n\nconst SendButton = styled(Button)`\n min-width: 100px;\n display: flex;\n align-items: center;\n gap: 6px;\n`;\n\nconst AssistantModal: React.FC<AssistantModalProps> = ({\n open,\n title,\n prompt,\n initialCode = \"\",\n userQuery = \"\",\n onUserQueryChange,\n onCopy,\n onLaunch,\n onSend,\n onCancel,\n}) => {\n const [code, setCode] = useState<string>(initialCode);\n const [input, setInput] = useState<string>(\"\");\n const [localUserQuery, setLocalUserQuery] = useState<string>(userQuery);\n\n React.useEffect(() => {\n setLocalUserQuery(userQuery);\n }, [userQuery]);\n\n if (!open) return null;\n\n return (\n <ModalOverlay>\n <ModalContainer>\n <ModalHeader>\n <TitleWrapper>\n <Icon name={IconName.TETRASCIENCE_ICON} fill=\"var(--blue-600)\" />\n <Title>{title}</Title>\n </TitleWrapper>\n <CloseButton onClick={onCancel}>\n <Icon\n name={IconName.CLOSE}\n width=\"20\"\n height=\"20\"\n fill=\"var(--black-900)\"\n />\n </CloseButton>\n </ModalHeader>\n <PromptText>{prompt}</PromptText>\n <QueryContainer>\n <QueryTextarea\n value={localUserQuery}\n onChange={(e) => {\n setLocalUserQuery(e.target.value);\n if (onUserQueryChange) onUserQueryChange(e.target.value);\n }}\n rows={2}\n placeholder=\"Type your question here...\"\n />\n </QueryContainer>\n <EditorContainer>\n <EditorWrapper>\n <CodeEditor\n value={code}\n onChange={(v) => setCode(v ?? \"\")}\n language=\"python\"\n theme=\"dark\"\n height={200}\n onCopy={onCopy}\n onLaunch={onLaunch}\n />\n </EditorWrapper>\n </EditorContainer>\n <InputContainer>\n <Input\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder=\"Ask us anything related to your work...\"\n size=\"small\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\") onSend(input);\n }}\n />\n <SendButton variant=\"primary\" onClick={() => onSend(input)}>\n <Icon name={IconName.PAPER_PLANE} />\n Send\n </SendButton>\n </InputContainer>\n </ModalContainer>\n </ModalOverlay>\n );\n};\n\nexport default AssistantModal;\n","import { ButtonControl } from \"@atoms/ButtonControl\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nimport type { ButtonControlProps } from \"@atoms/ButtonControl\";\n\nexport interface ButtonControlItem extends ButtonControlProps {\n id: string;\n}\n\nexport interface ButtonControlGroupProps {\n controls: ButtonControlItem[];\n selectedId?: string;\n onChange?: (id: string) => void;\n vertical?: boolean;\n disabled?: boolean;\n}\n\nconst GroupContainer = styled.div<{ $vertical?: boolean }>`\n display: flex;\n flex-direction: ${(props) => (props.$vertical ? \"column\" : \"row\")};\n border-radius: 6px;\n overflow: hidden;\n border: 1px solid var(--grey-200);\n\n & > *:not(:last-child) {\n ${(props) =>\n props.$vertical\n ? \"border-bottom: 1px solid var(--grey-200);\"\n : \"border-right: 1px solid var(--grey-200);\"}\n }\n\n ${(props) =>\n props.$vertical &&\n `\n width: 40px;\n `}\n`;\n\nconst ButtonWrapper = styled.div<{ $vertical?: boolean }>`\n &:first-child {\n button {\n ${(props) =>\n props.$vertical\n ? \"border-top-right-radius: 6px;border-top-left-radius: 6px;\"\n : \"border-top-left-radius: 6px;border-bottom-left-radius: 6px;\"}\n }\n }\n\n &:last-child {\n button {\n ${(props) =>\n props.$vertical\n ? \"border-bottom-right-radius: 6px;border-bottom-left-radius: 6px;\"\n : \"border-top-right-radius: 6px;border-bottom-right-radius: 6px;\"}\n }\n }\n`;\n\nexport const ButtonControlGroup: React.FC<ButtonControlGroupProps> = ({\n controls,\n selectedId,\n onChange,\n vertical = true,\n disabled = false,\n}) => {\n const handleClick = (id: string) => {\n if (disabled) return;\n onChange?.(id);\n };\n\n return (\n <GroupContainer $vertical={vertical}>\n {controls.map((control) => (\n <ButtonWrapper key={control.id} $vertical={vertical}>\n <ButtonControl\n icon={control.icon}\n selected={selectedId === control.id}\n disabled={disabled || control.disabled}\n onClick={() => handleClick(control.id)}\n />\n </ButtonWrapper>\n ))}\n </GroupContainer>\n );\n};\n\nexport default ButtonControlGroup;\n","import { Button } from \"@atoms/Button\";\nimport React from \"react\";\nimport styled, { css } from \"styled-components\";\n\nexport type CardSidebarStatus = \"default\" | \"active\" | \"hover\" | \"disabled\";\n\nexport interface CardSidebarProps {\n title: string;\n description?: string;\n buttonText?: string;\n linkText?: string;\n status?: CardSidebarStatus;\n onButtonClick?: () => void;\n onLinkClick?: () => void;\n className?: string;\n ref?: React.Ref<HTMLDivElement>;\n}\n\ninterface CardContainerProps {\n status: CardSidebarStatus;\n}\n\nconst getBackgroundColor = (status: CardSidebarStatus) => {\n switch (status) {\n case \"active\":\n return \"var(--blue-100)\";\n case \"hover\":\n return \"var(--grey-100)\";\n case \"disabled\":\n return \"transparent\";\n default:\n return \"transparent\";\n }\n};\n\nconst getTitleColor = (status: CardSidebarStatus) => {\n switch (status) {\n case \"disabled\":\n return \"var(--grey-400)\";\n default:\n return \"var(--black-900)\";\n }\n};\n\nconst getDescriptionColor = (status: CardSidebarStatus) => {\n switch (status) {\n case \"disabled\":\n return \"var(--grey-400)\";\n default:\n return \"var(--grey-400)\";\n }\n};\n\nconst getLinkColor = (status: CardSidebarStatus) => {\n switch (status) {\n case \"disabled\":\n return \"var(--grey-400)\";\n default:\n return \"var(--blue-600)\";\n }\n};\n\nconst CardContainer = styled.div<CardContainerProps>`\n padding: 20px 16px;\n border-radius: 8px;\n background-color: ${(props) => getBackgroundColor(props.status)};\n cursor: ${(props) =>\n props.status === \"disabled\" ? \"not-allowed\" : \"pointer\"};\n transition: background-color 0.2s ease;\n\n ${(props) =>\n props.status === \"default\" &&\n css`\n &:hover {\n background-color: var(--grey-100);\n }\n `}\n`;\n\nconst Title = styled.h3<{ status: CardSidebarStatus }>`\n margin: 0 0 4px 0;\n font-family: \"Inter\", sans-serif;\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n color: ${(props) => getTitleColor(props.status)};\n`;\n\nconst Description = styled.p<{ status: CardSidebarStatus }>`\n margin: 0 0 16px 0;\n font-family: \"Inter\", sans-serif;\n font-size: 13px;\n font-style: normal;\n font-weight: 400;\n line-height: 18px;\n line-height: 20px;\n color: ${(props) => getDescriptionColor(props.status)};\n`;\n\nconst ActionContainer = styled.div`\n display: flex;\n align-items: center;\n gap: 16px;\n`;\n\nconst StyledButton = styled(Button)`\n flex-shrink: 0;\n`;\n\nconst Link = styled.a<{ status: CardSidebarStatus }>`\n font-family: \"Inter\", sans-serif;\n font-size: 13px;\n font-style: normal;\n font-weight: 500;\n line-height: 18px;\n color: ${(props) => getLinkColor(props.status)};\n text-decoration: none;\n cursor: ${(props) =>\n props.status === \"disabled\" ? \"not-allowed\" : \"pointer\"};\n\n &:hover {\n text-decoration: ${(props) =>\n props.status === \"disabled\" ? \"none\" : \"underline\"};\n }\n`;\n\nexport const CardSidebar = ({\n title,\n description,\n buttonText,\n linkText,\n status = \"default\",\n onButtonClick,\n onLinkClick,\n className,\n ref,\n}: CardSidebarProps) => {\n const handleButtonClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (status !== \"disabled\" && onButtonClick) {\n onButtonClick();\n }\n };\n\n const handleLinkClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (status !== \"disabled\" && onLinkClick) {\n onLinkClick();\n }\n };\n\n return (\n <CardContainer ref={ref} status={status} className={className}>\n <Title status={status}>{title}</Title>\n {description && (\n <Description status={status}>{description}</Description>\n )}\n <ActionContainer>\n {buttonText && (\n <StyledButton\n variant=\"secondary\"\n size=\"small\"\n disabled={status === \"disabled\"}\n onClick={handleButtonClick}\n leftIcon={\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n x=\"3\"\n y=\"3\"\n width=\"10\"\n height=\"10\"\n rx=\"2\"\n fill=\"currentColor\"\n />\n </svg>\n }\n >\n {buttonText}\n </StyledButton>\n )}\n {linkText && (\n <Link\n status={status}\n onClick={handleLinkClick}\n href={status === \"disabled\" ? undefined : \"#\"}\n >\n {linkText}\n </Link>\n )}\n </ActionContainer>\n </CardContainer>\n );\n};\n\nexport default CardSidebar;\n","import { Button } from \"@atoms/Button\";\nimport { CodeEditor } from \"@atoms/CodeEditor\";\nimport { IconName , Icon } from \"@atoms/Icon\";\nimport { Modal } from \"@atoms/Modal\";\nimport { useCallback, useState } from \"react\";\nimport styled from \"styled-components\";\n\nconst ButtonContainer = styled.div`\n display: flex;\n align-items: center;\n flex-direction: row;\n gap: 16px;\n flex-wrap: wrap;\n width: 100%;\n`;\n\nconst EditorContainer = styled.div`\n margin: 16px 0;\n`;\n\nconst StatusText = styled.span`\n font-size: 12px;\n color: var(--grey-400);\n`;\n\n/** Wrapper to set button height via CSS */\nconst EditCodeButtonWrapper = styled.div`\n & > button {\n height: 38px;\n }\n`;\n\nexport interface CodeScriptEditorButtonProps {\n initialCode?: string;\n onCodeSave?: (newCode: string) => void;\n language?: string;\n buttonText?: string;\n modalTitle?: string;\n buttonProps?: React.ComponentProps<typeof Button>;\n modalProps?: Omit<\n React.ComponentProps<typeof Modal>,\n \"isOpen\" | \"onConfirm\" | \"onClose\"\n >; // Update modal props\n disabled?: boolean;\n isEditMode?: boolean;\n}\n\n/**\n * Renders an 'Edit code' button that opens a modal with a Monaco code editor.\n */\nexport const CodeScriptEditorButton = ({\n initialCode = \"\",\n onCodeSave,\n language = \"python\",\n buttonText = \"Edit Code\",\n modalTitle = \"Edit Code\",\n buttonProps,\n modalProps,\n disabled = false,\n}: CodeScriptEditorButtonProps) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [currentCode, setCurrentCode] = useState<string>(initialCode);\n\n const lineCount = currentCode ? currentCode.split(\"\\n\").length : 0;\n const charCount = currentCode.length;\n\n const handleOpenModal = useCallback(() => {\n setCurrentCode(initialCode);\n setIsModalOpen(true);\n }, [initialCode]); // Depend on initialCode\n\n const handleSave = useCallback(() => {\n if (onCodeSave) {\n onCodeSave(currentCode);\n }\n setIsModalOpen(false);\n }, [onCodeSave, currentCode]);\n\n const handleCancel = useCallback(() => {\n setIsModalOpen(false);\n }, []);\n\n const handleCodeChange = useCallback((value: string | undefined) => {\n setCurrentCode(value || \"\");\n }, []);\n\n return (\n <>\n <ButtonContainer>\n <EditCodeButtonWrapper>\n <Button\n leftIcon={<Icon name={IconName.PENCIL} />}\n onClick={handleOpenModal}\n size=\"small\"\n variant=\"tertiary\"\n {...buttonProps}\n disabled={disabled}\n >\n {buttonText}\n </Button>\n </EditCodeButtonWrapper>\n <StatusText title={`${lineCount} lines, ${charCount} characters`}>\n {lineCount} lines / {charCount} chars\n </StatusText>\n </ButtonContainer>\n\n <Modal\n isOpen={isModalOpen}\n onClose={handleCancel}\n onConfirm={handleSave}\n onCloseLabel=\"Cancel\"\n onConfirmLabel=\"Save Code\"\n title={modalTitle}\n width=\"80%\"\n {...modalProps}\n >\n <EditorContainer>\n <CodeEditor\n height=\"400px\"\n language={language}\n value={currentCode}\n onChange={handleCodeChange}\n options={{\n minimap: { enabled: false },\n }}\n />\n </EditorContainer>\n </Modal>\n </>\n );\n};\n\nexport default CodeScriptEditorButton;\n","import { Input } from \"@atoms/Input\";\nimport { Label } from \"@atoms/Label\";\nimport { SupportiveText } from \"@atoms/SupportiveText\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nimport type { InputProps } from \"@atoms/Input\";\n\nexport interface FormFieldProps extends Omit<InputProps, \"className\"> {\n label: string;\n infoText?: string;\n supportiveText?: string;\n showSupportiveCheck?: boolean;\n className?: string;\n ref?: React.Ref<HTMLInputElement>;\n}\n\nconst FormFieldContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: 6px;\n width: 100%;\n`;\n\nconst StyledLabel = styled(Label)`\n margin-bottom: 2px;\n`;\n\nexport const FormField = ({\n label,\n infoText,\n supportiveText,\n showSupportiveCheck = false,\n className,\n ref,\n ...inputProps\n}: FormFieldProps) => {\n return (\n <FormFieldContainer className={className}>\n <StyledLabel infoText={infoText}>{label}</StyledLabel>\n <Input ref={ref} {...inputProps} />\n {supportiveText && (\n <SupportiveText showCheck={showSupportiveCheck}>\n {supportiveText}\n </SupportiveText>\n )}\n </FormFieldContainer>\n );\n};\n\nexport default FormField;\n","import { Button } from \"@atoms/Button\";\nimport { CodeEditor } from \"@atoms/CodeEditor\";\nimport { Dropdown } from \"@atoms/Dropdown\";\nimport { Toast } from \"@atoms/Toast\";\nimport { Toggle } from \"@atoms/Toggle\";\nimport React, { useState } from \"react\";\nimport styled from \"styled-components\";\n\n/** Toast display duration in milliseconds */\nconst TOAST_DISPLAY_MS = 5000;\n/** Deploy simulation delay in milliseconds */\nconst DEPLOY_DELAY_MS = 3000;\n\nexport interface LaunchContentProps {\n initialCode?: string;\n onDeploy?: () => void;\n versions?: string[];\n currentVersion?: string;\n onVersionChange?: (version: string) => void;\n}\n\nconst Container = styled.div``;\n\nconst Header = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n background-color: var(--grey-100);\n`;\n\nconst Title = styled.h1`\n color: var(--black-900);\n font-family: \"Inter\", sans-serif;\n font-size: 18px;\n font-style: normal;\n font-weight: 600;\n line-height: 28px;\n margin: 0;\n`;\n\nconst Controls = styled.div`\n display: flex;\n align-items: center;\n gap: 16px;\n`;\n\nconst VersionContainer = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst Separator = styled.div`\n width: 1px;\n height: 20px;\n background-color: var(--grey-200);\n`;\n\nconst defaultInitialCode = `protocolSchema: v3\nname: v3\ndescription: No description\nconfig: {}\nsteps: []`;\n\nconst ToastWrapper = styled.div`\n position: relative;\n width: 100%;\n max-width: 100%;\n margin-bottom: 16px;\n`;\n\nconst LaunchContent: React.FC<LaunchContentProps> = ({\n initialCode = defaultInitialCode,\n onDeploy,\n versions = [\"v0.0.7\", \"v0.0.6\", \"v0.0.5\"],\n currentVersion = \"v0.0.7\",\n onVersionChange = () => {},\n}) => {\n const [code, setCode] = useState(initialCode);\n const [overwriteMode, setOverwriteMode] = useState(true);\n const [isDeploying, setIsDeploying] = useState(false);\n const [infoToast, setInfoToast] = useState(false);\n const [successToast, setSuccessToast] = useState(false);\n const [errorToast, setErrorToast] = useState(false);\n\n const handleCodeChange = (value: string | undefined) => {\n if (value !== undefined) {\n setCode(value);\n }\n };\n\n const handleCopy = (code: string) => {\n navigator.clipboard.writeText(code);\n };\n\n const handleLaunch = (code: string) => {\n console.log(\"Launching code:\", code);\n };\n\n const handleDeploy = () => {\n setIsDeploying(true);\n setInfoToast(true);\n setSuccessToast(false);\n setErrorToast(false);\n\n setTimeout(() => {\n setInfoToast(false);\n\n const isSuccess = Math.random() > 0.3;\n\n if (isSuccess) {\n setSuccessToast(true);\n setErrorToast(false);\n } else {\n setSuccessToast(false);\n setErrorToast(true);\n }\n\n setIsDeploying(false);\n\n if (onDeploy) onDeploy();\n\n setTimeout(() => {\n setSuccessToast(false);\n setErrorToast(false);\n }, TOAST_DISPLAY_MS);\n }, DEPLOY_DELAY_MS);\n };\n\n return (\n <Container>\n <Header>\n <Title>Launch</Title>\n <Controls>\n <Toggle\n checked={overwriteMode}\n onChange={setOverwriteMode}\n label=\"Overwrite Mode\"\n disabled={isDeploying}\n />\n\n <Separator />\n <VersionContainer>\n <Dropdown\n options={versions.map((v) => ({ label: v, value: v }))}\n value={currentVersion}\n onChange={(value) => onVersionChange(value as string)}\n width=\"150px\"\n size=\"small\"\n disabled={isDeploying}\n />\n </VersionContainer>\n\n <Button\n variant=\"primary\"\n size=\"medium\"\n onClick={handleDeploy}\n disabled={isDeploying}\n >\n Deploy\n </Button>\n </Controls>\n </Header>\n\n {infoToast && (\n <ToastWrapper>\n <Toast\n type=\"info\"\n heading=\"Building Protocol: Status=IN_PROGRESS, Phase=FINALIZING\"\n />\n </ToastWrapper>\n )}\n\n {successToast && (\n <ToastWrapper>\n <Toast\n type=\"success\"\n heading={`Pipeline visual-pipeline-builder-protocol-${currentVersion}-pipeline deployed successfully! Deployment complete`}\n />\n </ToastWrapper>\n )}\n\n {errorToast && (\n <ToastWrapper>\n <Toast\n type=\"danger\"\n heading={`Failed to deploy pipeline visual-pipeline-builder-protocol-${currentVersion}-pipeline. Please try again.`}\n />\n </ToastWrapper>\n )}\n\n <CodeEditor\n value={code}\n onChange={handleCodeChange}\n language=\"yaml\"\n theme=\"light\"\n width=\"100%\"\n onCopy={handleCopy}\n onLaunch={handleLaunch}\n disabled={!overwriteMode}\n />\n </Container>\n );\n};\n\nexport default LaunchContent;\n","import { MenuItem } from \"@atoms/MenuItem\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nimport type { MenuItemProps } from \"@atoms/MenuItem\";\n\nexport interface MenuItemData\n extends Omit<MenuItemProps, \"onClick\" | \"onCheckChange\"> {\n id: string;\n}\n\nexport interface MenuProps {\n title?: string;\n items: MenuItemData[];\n onItemClick?: (itemId: string) => void;\n onItemCheckChange?: (itemId: string, checked: boolean) => void;\n activeItemId?: string | null;\n className?: string;\n}\n\nconst MenuContainer = styled.div`\n width: 100%;\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0px 4px 12px 0px var(--black-100),\n 0px 2px 4px -2px var(--black-100);\n background-color: var(--white-900);\n border: 1px solid var(--grey-200);\n`;\n\nconst MenuTitle = styled.div`\n padding: 8px 16px;\n font-family: \"Inter\", sans-serif;\n font-size: 12px;\n font-style: normal;\n font-weight: 500;\n line-height: 16px;\n color: var(--grey-600);\n border-bottom: 1px solid var(--grey-200);\n`;\n\nconst MenuItems = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nexport const Menu: React.FC<MenuProps> = ({\n title,\n items,\n onItemClick,\n onItemCheckChange,\n activeItemId = null,\n className,\n}) => {\n const handleItemClick = (itemId: string) => {\n if (onItemClick) {\n onItemClick(itemId);\n }\n };\n\n const handleItemCheckChange = (itemId: string, checked: boolean) => {\n if (onItemCheckChange) {\n onItemCheckChange(itemId, checked);\n }\n };\n\n return (\n <MenuContainer className={className}>\n {title && <MenuTitle>{title}</MenuTitle>}\n <MenuItems>\n {items.map((item) => (\n <MenuItem\n key={item.id}\n label={item.label}\n checked={item.checked}\n showCheckbox={item.showCheckbox}\n active={activeItemId === item.id || item.active}\n onClick={() => handleItemClick(item.id)}\n onCheckChange={(checked) => handleItemCheckChange(item.id, checked)}\n />\n ))}\n </MenuItems>\n </MenuContainer>\n );\n};\n\nexport default Menu;\n","import { Icon, IconName } from \"@atoms/Icon\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\n// Types\ninterface OrganizationInfo {\n name: string;\n subtext?: string;\n logo?: React.ReactNode;\n}\n\nexport interface NavbarProps {\n organization: OrganizationInfo;\n}\n\n// Styled components\nconst NavbarContainer = styled.div`\n display: flex;\n align-items: center;\n background-color: var(--blue-900);\n height: 80px;\n width: 100%;\n padding: 12px 24px 12px 128px;\n box-sizing: border-box;\n color: var(--white-900);\n gap: 40px;\n`;\n\nconst Section = styled.div`\n display: flex;\n align-items: center;\n height: 100%;\n`;\n\nconst SectionTitle = styled.div`\n text-transform: uppercase;\n margin-bottom: 2px;\n color: var(--white-900);\n font-size: 10px;\n font-style: normal;\n font-weight: 500;\n line-height: 16px;\n letter-spacing: 0.2px;\n font-family: \"Inter\", sans-serif;\n`;\n\nconst OrganizationName = styled.div`\n font-size: 14px;\n font-style: normal;\n font-weight: 500;\n line-height: 22px;\n font-family: \"Inter\", sans-serif;\n`;\n\nconst OrganizationSubtext = styled.div`\n color: var(--grey-400);\n font-size: 12px;\n font-style: italic;\n font-weight: 500;\n line-height: 16px;\n font-family: \"Inter\", sans-serif;\n`;\n\nconst OrganizationContent = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nconst LogoContainer = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst ProjectSelector = styled.div`\n display: flex;\n align-items: center;\n padding: 6px 0;\n border-radius: 4px;\n gap: 8px;\n`;\n\nconst ProjectName = styled.div`\n font-family: \"Inter\", sans-serif;\n color: var(--grey-400);\n font-size: 14px;\n font-style: normal;\n font-weight: 500;\n line-height: 22px;\n`;\n\nconst IconWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst FirstColumn = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n width: 320px;\n`;\n\n// Default logo component\nconst DefaultLogo = () => (\n <div\n style={{\n borderRadius: \"4px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Icon\n name={IconName.BUILDING}\n fill=\"var(--white-900)\"\n width=\"20\"\n height=\"20\"\n />\n </div>\n);\n\n// Default project icon\nconst DefaultProjectIcon = () => (\n <Icon name={IconName.LAMP} fill=\"var(--white-900)\" width=\"20\" height=\"20\" />\n);\n\nconst Navbar: React.FC<NavbarProps> = ({ organization }) => {\n return (\n <NavbarContainer>\n <Section>\n <OrganizationContent>\n <SectionTitle>ORGANIZATION</SectionTitle>\n <FirstColumn>\n <LogoContainer>\n {organization.logo || <DefaultLogo />}\n </LogoContainer>\n <div>\n <OrganizationName>{organization.name}</OrganizationName>\n {organization.subtext && (\n <OrganizationSubtext>\n {organization.subtext}\n </OrganizationSubtext>\n )}\n </div>\n </FirstColumn>\n </OrganizationContent>\n </Section>\n\n <Section>\n <OrganizationContent>\n <SectionTitle>PROJECT</SectionTitle>\n <ProjectSelector>\n <IconWrapper>{<DefaultProjectIcon />}</IconWrapper>\n <ProjectName>{\"Not Selected\"}</ProjectName>\n </ProjectSelector>\n </OrganizationContent>\n </Section>\n </NavbarContainer>\n );\n};\n\nexport default Navbar;\n","import { Button } from \"@atoms/Button\";\nimport { Icon, IconName } from \"@atoms/Icon\";\nimport { Toggle } from \"@atoms/Toggle\";\nimport React, { useState } from \"react\";\nimport styled from \"styled-components\";\n\nexport interface ProtocolConfigurationProps {\n className?: string;\n}\n\nconst ProtocolConfigHeader = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--grey-100);\n padding: 0 0 24px;\n border-top-left-radius: 24px;\n border-top-right-radius: 24px;\n`;\n\nconst ProtocolConfigTitle = styled.h2`\n color: var(--blue-900);\n font-family: \"Inter\", sans-serif;\n font-size: 20px;\n font-weight: 600;\n line-height: 28px;\n margin: 0;\n`;\n\nconst EditModeWrapper = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--grey-600);\n font-size: 15px;\n font-weight: 500;\n`;\n\nconst ConfigurationContainer = styled.div`\n background-color: var(--white-900);\n border-radius: 24px;\n border: 1px solid var(--grey-200);\n width: 100%;\n`;\n\nconst ConfigurationHeader = styled.div`\n display: flex;\n align-items: center;\n border-bottom: 1px solid var(--grey-200);\n padding-bottom: 16px;\n padding: 12px 24px;\n`;\n\nconst ConfigurationTitle = styled.h3`\n color: var(--blue-900);\n font-family: \"Inter\", sans-serif;\n font-size: 20px;\n font-weight: 600;\n line-height: 28px;\n margin: 0;\n`;\n\nconst ConfigurationContent = styled.div`\n padding: 20px 24px 36px 24px;\n`;\n\nconst EmptyStateContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 16px;\n`;\n\nconst EmptyStateText = styled.div`\n color: var(--grey-400);\n font-size: 14px;\n font-weight: 500;\n`;\n\nconst ProtocolConfiguration: React.FC<ProtocolConfigurationProps> = ({\n className,\n}) => {\n const [isEditMode, setIsEditMode] = useState(false);\n\n return (\n <div className={className}>\n <ProtocolConfigHeader>\n <ProtocolConfigTitle>Protocol Configuration</ProtocolConfigTitle>\n <EditModeWrapper>\n <Toggle\n label=\"Edit Mode\"\n checked={isEditMode}\n onChange={() => setIsEditMode((prev) => !prev)}\n />\n </EditModeWrapper>\n </ProtocolConfigHeader>\n <ConfigurationContainer>\n <ConfigurationHeader>\n <ConfigurationTitle>Configuration</ConfigurationTitle>\n </ConfigurationHeader>\n <ConfigurationContent>\n {isEditMode ? (\n <Button\n variant=\"secondary\"\n size=\"medium\"\n leftIcon={\n <Icon\n name={IconName.PLUS}\n width=\"20\"\n height=\"20\"\n fill=\"var(--blue-600)\"\n />\n }\n >\n Add Input\n </Button>\n ) : (\n <EmptyStateContainer>\n <EmptyStateText>\n No values, Use the 'edit' button to add values\n </EmptyStateText>\n </EmptyStateContainer>\n )}\n </ConfigurationContent>\n </ConfigurationContainer>\n </div>\n );\n};\n\nexport default ProtocolConfiguration;\n","import { Button } from \"@atoms/Button\";\nimport { CodeEditor } from \"@atoms/CodeEditor\";\nimport { Dropdown } from \"@atoms/Dropdown\";\nimport { Toggle } from \"@atoms/Toggle\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nimport type { DropdownOption } from \"@atoms/Dropdown\";\n\nexport interface ProtocolYamlCardProps {\n title: string;\n newVersionMode: boolean;\n onToggleNewVersionMode: (checked: boolean) => void;\n versionOptions: DropdownOption[];\n selectedVersion: string;\n onVersionChange: (value: string) => void;\n onDeploy: () => void;\n yaml: string;\n onYamlChange: (value: string) => void;\n}\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n padding: 0;\n gap: 16px;\n width: 928px;\n background: transparent;\n`;\n\nconst Header = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n width: 928px;\n height: 36px;\n`;\n\nconst Title = styled.span`\n font-family: \"Inter\", sans-serif;\n font-weight: 600;\n font-size: 18px;\n line-height: 28px;\n color: var(--black-900);\n`;\n\nconst Controls = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 16px;\n justify-content: flex-end;\n`;\n\nconst Divider = styled.div`\n width: 1px;\n height: 20px;\n background: var(--grey-200);\n`;\n\nconst EditorContainer = styled.div`\n width: 100%;\n`;\n\nconst StyledToggle = styled(Toggle)`\n min-width: 176px;\n`;\n\nconst StyledDropdown = styled(Dropdown)``;\n\nconst ProtocolYamlCard: React.FC<ProtocolYamlCardProps> = ({\n title,\n newVersionMode,\n onToggleNewVersionMode,\n versionOptions,\n selectedVersion,\n onVersionChange,\n onDeploy,\n yaml,\n onYamlChange,\n}) => {\n return (\n <Container>\n <Header>\n <Title>{title}</Title>\n <Controls>\n <StyledToggle\n checked={newVersionMode}\n onChange={onToggleNewVersionMode}\n label=\"New Version Mode\"\n />\n <Divider />\n <StyledDropdown\n options={versionOptions}\n value={selectedVersion}\n onChange={onVersionChange}\n size=\"small\"\n width=\"120px\"\n />\n <Button variant=\"primary\" size=\"medium\" onClick={onDeploy}>\n Deploy\n </Button>\n </Controls>\n </Header>\n <EditorContainer>\n <CodeEditor\n value={yaml}\n onChange={(v) => onYamlChange(v ?? \"\")}\n language=\"yaml\"\n theme=\"light\"\n onCopy={() => {}}\n onLaunch={() => {}}\n />\n </EditorContainer>\n </Container>\n );\n};\n\nexport default ProtocolYamlCard;\n","import { CodeEditor } from \"@atoms/CodeEditor\";\nimport { Modal } from \"@atoms/Modal\";\nimport React, { useState } from \"react\";\nimport styled from \"styled-components\";\n\nexport interface PythonEditorModalProps {\n open: boolean;\n initialValue?: string;\n title?: string;\n onSave: (value: string) => void;\n onCancel: () => void;\n}\n\nconst EditorWrapper = styled.div`\n padding: 12px 0;\n flex: 1;\n`;\n\nconst PythonEditorModal: React.FC<PythonEditorModalProps> = ({\n open,\n initialValue = \"\",\n title = \"\",\n onSave,\n onCancel,\n}) => {\n const [code, setCode] = useState<string>(initialValue);\n\n const handleConfirm = () => {\n onSave(code);\n };\n\n return (\n <Modal\n isOpen={open}\n onClose={onCancel}\n onCloseLabel=\"Cancel\"\n onConfirm={handleConfirm}\n onConfirmLabel=\"Save Code\"\n title={title}\n width=\"600px\"\n >\n <EditorWrapper>\n <CodeEditor\n value={code}\n onChange={(v) => setCode(v ?? \"\")}\n language=\"python\"\n height={300}\n theme=\"dark\"\n onCopy={() => {}}\n onLaunch={() => {}}\n />\n </EditorWrapper>\n </Modal>\n );\n};\n\nexport default PythonEditorModal;\n","import { Dropdown } from \"@atoms/Dropdown\";\nimport { Label } from \"@atoms/Label\";\nimport { SupportiveText } from \"@atoms/SupportiveText\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nimport type { DropdownProps } from \"@atoms/Dropdown\";\n\nexport interface SelectFieldProps extends Omit<DropdownProps, \"className\"> {\n label: string;\n infoText?: string;\n supportiveText?: string;\n showSupportiveCheck?: boolean;\n className?: string;\n ref?: React.Ref<HTMLDivElement>;\n}\n\nconst SelectFieldContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: 6px;\n width: 100%;\n`;\n\nconst StyledLabel = styled(Label)`\n margin-bottom: 2px;\n`;\n\nexport const SelectField = ({\n label,\n infoText,\n supportiveText,\n showSupportiveCheck = false,\n className,\n ref,\n ...dropdownProps\n}: SelectFieldProps) => {\n return (\n <SelectFieldContainer className={className} ref={ref}>\n <StyledLabel infoText={infoText}>{label}</StyledLabel>\n <Dropdown {...dropdownProps} />\n {supportiveText && (\n <SupportiveText showCheck={showSupportiveCheck}>\n {supportiveText}\n </SupportiveText>\n )}\n </SelectFieldContainer>\n );\n};\n\nexport default SelectField;\n","import { Icon } from \"@atoms/Icon\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nimport type { IconName } from \"@atoms/Icon\";\n\ninterface SidebarItemProps {\n icon: IconName;\n label: string;\n active?: boolean;\n onClick?: () => void;\n}\n\nexport interface SidebarProps {\n items: SidebarItemProps[];\n activeItem?: string;\n onItemClick?: (label: string) => void;\n}\n\nconst SidebarContainer = styled.div`\n width: 104px;\n height: 100%;\n background-color: var(--blue-900);\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 0;\n`;\n\nconst SidebarItemContainer = styled.div<{ $active?: boolean }>`\n width: 100%;\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n padding: 12px 0;\n cursor: pointer;\n transition: background-color 0.2s ease;\n background-color: ${(props) =>\n props.$active ? \"var(--white-100)\" : \"transparent\"};\n\n &:hover {\n background-color: var(--white-50);\n }\n`;\n\nconst IconWrapper = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n margin-bottom: 10px;\n color: var(--white-900);\n`;\n\nconst Label = styled.div`\n color: var(--white-900);\n text-align: center;\n font-family: \"Inter\", sans-serif;\n font-size: 12px;\n font-style: normal;\n font-weight: 500;\n line-height: 16px;\n text-align: center;\n padding: 0 8px;\n`;\n\nconst SidebarItem: React.FC<SidebarItemProps> = ({\n icon,\n label,\n active,\n onClick,\n}) => {\n return (\n <SidebarItemContainer $active={active} onClick={onClick}>\n <IconWrapper>\n <Icon name={icon} fill=\"var(--white-900)\" width=\"20\" height=\"20\" />\n </IconWrapper>\n <Label>{label}</Label>\n </SidebarItemContainer>\n );\n};\n\nconst Sidebar: React.FC<SidebarProps> = ({\n items,\n activeItem,\n onItemClick,\n}) => {\n const handleItemClick = (label: string) => {\n if (onItemClick) {\n onItemClick(label);\n }\n };\n\n return (\n <SidebarContainer>\n {items.map((item) => (\n <SidebarItem\n key={item.label}\n icon={item.icon}\n label={item.label}\n active={activeItem === item.label}\n onClick={() => handleItemClick(item.label)}\n />\n ))}\n </SidebarContainer>\n );\n};\n\nexport default Sidebar;\n","import { Checkbox } from \"@atoms/Checkbox\";\nimport { TableCell } from \"@atoms/TableCell\";\nimport { TableHeaderCell } from \"@atoms/TableHeaderCell\";\nimport React, { useState, useMemo, useEffect } from \"react\";\nimport styled from \"styled-components\";\n\nimport type { DropdownOption } from \"@atoms/Dropdown\";\n\nexport interface TableColumn<T = any> {\n key: string;\n header: string;\n sortable?: boolean;\n filterable?: boolean;\n filterOptions?: DropdownOption[];\n width?: string;\n align?: \"left\" | \"center\" | \"right\";\n render?: (value: any, row: T, index: number) => React.ReactNode;\n}\n\nexport interface TableProps<T = any> {\n columns: TableColumn<T>[];\n data: T[];\n pageSize?: number;\n rowKey?: keyof T | ((row: T) => string | number);\n selectable?: boolean;\n onRowSelect?: (selectedRows: T[]) => void;\n // Controlled mode props (optional)\n sortKey?: string;\n sortDirection?: \"asc\" | \"desc\";\n onSort?: (key: string, direction: \"asc\" | \"desc\") => void;\n currentPage?: number;\n onPageChange?: (page: number) => void;\n totalItems?: number; // For server-side pagination\n selectedRows?: T[];\n className?: string;\n}\n\nconst TableContainer = styled.div`\n width: 100%;\n border: 1px solid var(--grey-200);\n border-radius: 8px;\n overflow: visible;\n background-color: var(--white-900);\n`;\n\nconst StyledTable = styled.table`\n width: 100%;\n border-collapse: collapse;\n border-spacing: 0;\n`;\n\nconst TableBody = styled.tbody``;\n\nconst TableRow = styled.tr<{ $selectable?: boolean }>`\n cursor: ${(props) => (props.$selectable ? \"pointer\" : \"default\")};\n\n &:hover {\n background-color: ${(props) =>\n props.$selectable ? \"var(--grey-50)\" : \"transparent\"};\n }\n`;\n\nconst CheckboxCell = styled(TableCell)`\n width: 40px;\n padding: 10px 12px;\n`;\n\nconst CheckboxHeaderCell = styled(TableHeaderCell)`\n width: 40px;\n padding: 8px 12px;\n`;\n\nconst PaginationContainer = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16px;\n padding: 10px 12px;\n height: 40px;\n background-color: var(--grey-50);\n border-top: 1px solid var(--grey-200);\n`;\n\nconst PaginationButton = styled.button<{ disabled?: boolean }>`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: 1px solid var(--grey-300);\n border-radius: 6px;\n background-color: var(--white-900);\n cursor: ${(props) => (props.disabled ? \"not-allowed\" : \"pointer\")};\n opacity: ${(props) => (props.disabled ? 0.5 : 1)};\n\n &:hover:not(:disabled) {\n background-color: var(--grey-50);\n }\n\n svg {\n width: 20px;\n height: 20px;\n }\n`;\n\nconst PageNumbers = styled.div`\n display: flex;\n align-items: center;\n gap: 0;\n`;\n\nconst PageNumber = styled.button<{ $active?: boolean }>`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: 6px;\n background-color: ${(props) =>\n props.$active ? \"var(--grey-100)\" : \"transparent\"};\n font-family: \"Inter\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 13px;\n font-weight: 500;\n line-height: 18px;\n color: var(--grey-600);\n cursor: pointer;\n\n &:hover:not(:disabled) {\n background-color: var(--grey-100);\n }\n`;\n\nexport function Table<T extends Record<string, any>>({\n columns,\n data,\n pageSize = 10,\n rowKey,\n selectable = false,\n onRowSelect,\n sortKey: controlledSortKey,\n sortDirection: controlledSortDirection,\n onSort: controlledOnSort,\n currentPage: controlledCurrentPage,\n onPageChange: controlledOnPageChange,\n totalItems,\n selectedRows: controlledSelectedRows,\n className,\n}: TableProps<T>) {\n // Internal state for uncontrolled mode\n const [internalSortKey, setInternalSortKey] = useState<string | null>(null);\n const [internalSortDirection, setInternalSortDirection] = useState<\n \"asc\" | \"desc\" | null\n >(null);\n const [internalCurrentPage, setInternalCurrentPage] = useState(1);\n const [internalSelectedRows, setInternalSelectedRows] = useState<T[]>([]);\n const [columnFilters, setColumnFilters] = useState<Record<string, string>>(\n {}\n );\n\n // Determine if controlled or uncontrolled\n const isControlledSort = controlledSortKey !== undefined;\n const isControlledPage = controlledCurrentPage !== undefined;\n const isControlledSelection = controlledSelectedRows !== undefined;\n\n const sortKey = isControlledSort ? controlledSortKey : internalSortKey;\n const sortDirection = isControlledSort\n ? controlledSortDirection\n : internalSortDirection;\n const currentPage = isControlledPage\n ? controlledCurrentPage\n : internalCurrentPage;\n const selectedRows = isControlledSelection\n ? controlledSelectedRows\n : internalSelectedRows;\n\n // Filter data based on column filters\n const filteredData = useMemo(() => {\n let result = [...data];\n\n Object.entries(columnFilters).forEach(([key, value]) => {\n if (value) {\n result = result.filter((row) => {\n const cellValue = row[key];\n return cellValue?.toString() === value;\n });\n }\n });\n\n return result;\n }, [data, columnFilters]);\n\n // Sort data\n const sortedData = useMemo(() => {\n if (!sortKey || !sortDirection) return filteredData;\n\n return [...filteredData].sort((a, b) => {\n const aValue = a[sortKey];\n const bValue = b[sortKey];\n\n if (aValue === bValue) return 0;\n\n let comparison = 0;\n comparison = typeof aValue === \"number\" && typeof bValue === \"number\" ? aValue - bValue : String(aValue).localeCompare(String(bValue));\n\n return sortDirection === \"asc\" ? comparison : -comparison;\n });\n }, [filteredData, sortKey, sortDirection]);\n\n // Calculate pagination\n const totalPages =\n pageSize === -1 ? 1 : Math.ceil((totalItems || sortedData.length) / pageSize);\n const paginatedData = useMemo(() => {\n // If totalItems is provided, we're in server-side pagination mode\n // and data is already paginated, so just return it\n if (totalItems !== undefined) return sortedData;\n \n // Otherwise, do client-side pagination\n if (pageSize === -1) return sortedData;\n const start = (currentPage - 1) * pageSize;\n return sortedData.slice(start, start + pageSize);\n }, [sortedData, currentPage, pageSize, totalItems]);\n\n // Reset to first page when filters or sort changes\n useEffect(() => {\n if (!isControlledPage) {\n setInternalCurrentPage(1);\n }\n }, [columnFilters, sortKey, sortDirection, isControlledPage]);\n\n const handleSort = (key: string) => {\n if (isControlledSort && controlledOnSort) {\n const newDirection =\n sortKey === key\n ? sortDirection === \"asc\"\n ? \"desc\"\n : \"asc\"\n : \"asc\";\n controlledOnSort(key, newDirection);\n } else {\n if (sortKey === key) {\n if (sortDirection === \"asc\") {\n setInternalSortDirection(\"desc\");\n } else {\n setInternalSortKey(null);\n setInternalSortDirection(null);\n }\n } else {\n setInternalSortKey(key);\n setInternalSortDirection(\"asc\");\n }\n }\n };\n\n const handlePageChange = (page: number) => {\n if (isControlledPage && controlledOnPageChange) {\n controlledOnPageChange(page);\n } else {\n setInternalCurrentPage(page);\n }\n };\n\n const handleSelectAll = (checked: boolean) => {\n const newSelection = checked ? [...sortedData] : [];\n if (isControlledSelection && onRowSelect) {\n onRowSelect(newSelection);\n } else {\n setInternalSelectedRows(newSelection);\n onRowSelect?.(newSelection);\n }\n };\n\n const getRowKey = (row: T, index: number): string | number => {\n if (!rowKey) return index;\n if (typeof rowKey === \"function\") return rowKey(row);\n return row[rowKey] as string | number;\n };\n\n const handleRowSelect = (row: T, checked: boolean) => {\n const newSelection: T[] = checked ? [...selectedRows, row] : selectedRows.filter((r) => r !== row);\n\n if (isControlledSelection && onRowSelect) {\n onRowSelect(newSelection);\n } else {\n setInternalSelectedRows(newSelection);\n onRowSelect?.(newSelection);\n }\n };\n\n const isRowSelected = (row: T) => {\n return selectedRows.some((r) => getRowKey(r, 0) === getRowKey(row, 0));\n };\n\n const allCurrentPageSelected =\n sortedData.length > 0 &&\n sortedData.every((row) => isRowSelected(row));\n\n const handleFilterChange = (columnKey: string, value: string) => {\n setColumnFilters((prev) => ({\n ...prev,\n [columnKey]: value,\n }));\n };\n\n const getPageNumbers = () => {\n const pages: (number | string)[] = [];\n const maxVisible = 5;\n\n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n\n if (currentPage > 3) {\n pages.push(\"...\");\n }\n\n const start = Math.max(2, currentPage - 1);\n const end = Math.min(totalPages - 1, currentPage + 1);\n\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n\n if (currentPage < totalPages - 2) {\n pages.push(\"...\");\n }\n\n pages.push(totalPages);\n }\n\n return pages;\n };\n\n return (\n <TableContainer className={className}>\n <StyledTable>\n <thead>\n <tr>\n {selectable && (\n <CheckboxHeaderCell>\n <Checkbox\n checked={allCurrentPageSelected}\n onChange={handleSelectAll}\n noPadding\n />\n </CheckboxHeaderCell>\n )}\n {columns.map((column) => (\n <TableHeaderCell\n key={column.key}\n width={column.width}\n sortable={column.sortable}\n sortDirection={\n sortKey === column.key ? sortDirection || null : null\n }\n onSort={column.sortable ? () => handleSort(column.key) : undefined}\n filterable={column.filterable}\n filterOptions={column.filterOptions}\n filterValue={columnFilters[column.key] || \"\"}\n onFilterChange={\n column.filterable\n ? (value) => handleFilterChange(column.key, value)\n : undefined\n }\n >\n {column.header}\n </TableHeaderCell>\n ))}\n </tr>\n </thead>\n <TableBody>\n {paginatedData.map((row, rowIndex) => (\n <TableRow\n key={getRowKey(row, rowIndex)}\n $selectable={selectable}\n onClick={\n selectable\n ? () => handleRowSelect(row, !isRowSelected(row))\n : undefined\n }\n >\n {selectable && (\n <CheckboxCell>\n <Checkbox\n checked={isRowSelected(row)}\n onChange={(checked) => handleRowSelect(row, checked)}\n noPadding\n onClick={(e) => e.stopPropagation()}\n />\n </CheckboxCell>\n )}\n {columns.map((column) => {\n const value = row[column.key];\n const content = column.render\n ? column.render(value, row, rowIndex)\n : value;\n\n return (\n <TableCell key={column.key} align={column.align}>\n {content}\n </TableCell>\n );\n })}\n </TableRow>\n ))}\n </TableBody>\n </StyledTable>\n\n {pageSize !== -1 && totalPages > 1 && (\n <PaginationContainer>\n <PaginationButton\n disabled={currentPage === 1}\n onClick={() => handlePageChange(currentPage - 1)}\n aria-label=\"Previous page\"\n >\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12.5 15L7.5 10L12.5 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </PaginationButton>\n\n <PageNumbers>\n {getPageNumbers().map((page, index) => (\n <PageNumber\n key={index}\n $active={page === currentPage}\n onClick={typeof page === \"number\" ? () => handlePageChange(page) : undefined}\n disabled={typeof page !== \"number\"}\n >\n {page}\n </PageNumber>\n ))}\n </PageNumbers>\n\n <PaginationButton\n disabled={currentPage === totalPages}\n onClick={() => handlePageChange(currentPage + 1)}\n aria-label=\"Next page\"\n >\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7.5 15L12.5 10L7.5 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </PaginationButton>\n </PaginationContainer>\n )}\n </TableContainer>\n );\n}\n\nTable.displayName = \"Table\";\n\nexport default Table;\n","import { Tab } from \"@atoms/Tab\";\nimport React, { useState } from \"react\";\nimport styled from \"styled-components\";\n\nimport type { TabProps, TabSize } from \"@atoms/Tab\";\n\nexport interface TabItem extends Omit<TabProps, \"active\" | \"onClick\"> {\n id: string;\n}\n\nexport interface TabGroupProps {\n tabs: TabItem[];\n activeTab?: string;\n onChange?: (tabId: string) => void;\n disabled?: boolean;\n size?: TabSize;\n}\n\nconst TabGroupContainer = styled.div`\n display: flex;\n align-items: center;\n border-bottom: 1px solid var(--grey-200);\n overflow-x: auto;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n -ms-overflow-style: none;\n scrollbar-width: none;\n`;\n\nexport const TabGroup: React.FC<TabGroupProps> = ({\n tabs,\n activeTab,\n onChange,\n disabled = false,\n size = \"medium\",\n}) => {\n const [selectedTab, setSelectedTab] = useState<string>(\n activeTab || (tabs.length > 0 ? tabs[0].id : \"\")\n );\n\n const handleTabClick = (tabId: string) => {\n if (disabled) return;\n\n setSelectedTab(tabId);\n onChange?.(tabId);\n };\n\n return (\n <TabGroupContainer>\n {tabs.map((tab) => (\n <Tab\n key={tab.id}\n label={tab.label}\n active={activeTab ? activeTab === tab.id : selectedTab === tab.id}\n disabled={disabled || tab.disabled}\n size={tab.size || size}\n onClick={() => handleTabClick(tab.id)}\n />\n ))}\n </TabGroupContainer>\n );\n};\n\nexport default TabGroup;\n","import { Toast } from \"@atoms/Toast\";\nimport React, { createContext, useContext, useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport styled from \"styled-components\";\n\nimport type { ToastProps, ToastType } from \"@atoms/Toast\";\n\ndeclare module \"styled-components\" {\n interface DefaultTheme {\n position: ToastPosition;\n }\n}\n\nexport type ToastPosition = \"top\" | \"bottom\";\n\nexport interface ToastItem extends Omit<ToastProps, \"className\"> {\n id: string;\n duration?: number;\n}\n\nexport interface ToastContainerProps {\n position: ToastPosition;\n}\n\nconst ToastContainer = styled.div<ToastContainerProps>`\n position: fixed;\n ${(props) => (props.position === \"top\" ? \"top: 16px;\" : \"bottom: 16px;\")}\n left: 50%;\n transform: translateX(-50%);\n z-index: 9999;\n width: 100%;\n max-width: 500px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n pointer-events: none;\n`;\n\nconst ToastWrapper = styled.div`\n opacity: 0;\n transform: translateY(\n ${(props) => (props.theme.position === \"top\" ? \"-10px\" : \"10px\")}\n );\n animation: ${(props) =>\n props.theme.position === \"top\" ? \"slideDownFade\" : \"slideUpFade\"}\n 0.3s forwards;\n pointer-events: auto;\n\n @keyframes slideDownFade {\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n @keyframes slideUpFade {\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n`;\n\ntype ToastContextType = {\n toasts: ToastItem[];\n addToast: (toast: Omit<ToastItem, \"id\">) => string;\n removeToast: (id: string) => void;\n};\n\nconst ToastContext = createContext<ToastContextType | undefined>(undefined);\n\nlet toasts: ToastItem[] = [];\nlet counter = 0;\nlet listeners: ((toasts: ToastItem[]) => void)[] = [];\n\nconst notifyListeners = () => {\n listeners.forEach((listener) => listener(toasts));\n};\n\nconst addToast = (\n heading: string,\n description?: string,\n type: ToastType = \"default\",\n duration: number = 5000\n): string => {\n const id = `toast-${counter++}`;\n const newToast: ToastItem = {\n id,\n heading,\n description,\n type,\n duration,\n };\n\n toasts = [...toasts, newToast];\n notifyListeners();\n\n if (duration > 0) {\n setTimeout(() => removeToast(id), duration);\n }\n\n return id;\n};\n\nconst removeToast = (id: string): void => {\n toasts = toasts.filter((toast) => toast.id !== id);\n notifyListeners();\n};\n\nconst subscribeToToasts = (\n callback: (toasts: ToastItem[]) => void\n): (() => void) => {\n listeners.push(callback);\n callback(toasts);\n\n return () => {\n listeners = listeners.filter((listener) => listener !== callback);\n };\n};\n\nexport const toast = {\n show: (\n heading: string,\n description?: string,\n type: ToastType = \"default\",\n duration: number = 5000\n ): string => {\n return addToast(heading, description, type, duration);\n },\n\n info: (heading: string, description?: string, duration?: number): string => {\n return addToast(heading, description, \"info\", duration);\n },\n\n success: (\n heading: string,\n description?: string,\n duration?: number\n ): string => {\n return addToast(heading, description, \"success\", duration);\n },\n\n warning: (\n heading: string,\n description?: string,\n duration?: number\n ): string => {\n return addToast(heading, description, \"warning\", duration);\n },\n\n danger: (\n heading: string,\n description?: string,\n duration?: number\n ): string => {\n return addToast(heading, description, \"danger\", duration);\n },\n\n default: (\n heading: string,\n description?: string,\n duration?: number\n ): string => {\n return addToast(heading, description, \"default\", duration);\n },\n\n dismiss: (id: string): void => {\n removeToast(id);\n },\n};\n\nexport const useToasts = () => {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error(\"useToasts must be used within a ToastProvider\");\n }\n return context;\n};\n\nexport interface ToastManagerProps {\n position?: ToastPosition;\n}\n\nexport const ToastManager: React.FC<ToastManagerProps> = ({\n position = \"top\",\n}) => {\n const [currentToasts, setCurrentToasts] = useState<ToastItem[]>([]);\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n const unsubscribe = subscribeToToasts(setCurrentToasts);\n return () => {\n unsubscribe();\n setIsMounted(false);\n };\n }, []);\n\n if (!isMounted) return null;\n\n return createPortal(\n <ToastContainer position={position}>\n {currentToasts.map((toast) => (\n <ToastWrapper key={toast.id} theme={{ position }}>\n <Toast\n type={toast.type}\n heading={toast.heading}\n description={toast.description}\n />\n </ToastWrapper>\n ))}\n </ToastContainer>,\n document.body\n );\n};\n\nexport default ToastManager;\n","import \"./AppLayout.scss\";\nimport { IconName } from \"@atoms/Icon\";\nimport { AppHeader } from \"@molecules/AppHeader\";\nimport { Navbar } from \"@molecules/Navbar\";\nimport { Sidebar } from \"@molecules/Sidebar\";\nimport React, { useState } from \"react\";\n\ninterface AppLayoutProps {\n userProfile: {\n name: string;\n avatar?: string;\n };\n hostname: string;\n organization: {\n name: string;\n subtext?: string;\n logo?: React.ReactNode;\n };\n children?: React.ReactNode;\n}\n\nconst AppLayout: React.FC<AppLayoutProps> = ({\n userProfile,\n hostname,\n organization,\n children,\n}) => {\n // Define sidebar items\n const sidebarItems = [\n { icon: IconName.SEARCH_DOCUMENT, label: \"Search\" },\n { icon: IconName.SEARCH_SQL, label: \"SQL Search\" },\n { icon: IconName.LAMP, label: \"Projects\" },\n { icon: IconName.PIPELINE, label: \"Pipelines\" },\n { icon: IconName.COMPUTER, label: \"Data & AI Workspace\" },\n { icon: IconName.CUBE, label: \"Artifacts\" },\n { icon: IconName.DATABASE, label: \"Data Sources\" },\n { icon: IconName.PIE_CHART, label: \"Health Monitoring\" },\n { icon: IconName.BULK_CHECK, label: \"Bulk Actions\" },\n { icon: IconName.CODE, label: \"Attribute Management\" },\n { icon: IconName.GEAR, label: \"Administration\" },\n ];\n\n // State hooks\n const [activeItem, setActiveItem] = useState(\"Pipelines\");\n\n // Handlers\n const handleSidebarItemClick = (label: string) => {\n setActiveItem(label);\n };\n\n const handleHomeClick = () => {\n console.log(\"Home clicked\");\n };\n\n const handleSettingsClick = () => {\n console.log(\"Settings clicked\");\n };\n\n const handleUserProfileClick = () => {\n console.log(\"User profile clicked\");\n };\n\n return (\n <div className=\"app-layout\">\n <Navbar organization={organization} />\n\n <div className=\"content-container\">\n <Sidebar\n items={sidebarItems}\n activeItem={activeItem}\n onItemClick={handleSidebarItemClick}\n />\n\n <div className=\"main-content\">\n <AppHeader\n hostname={hostname}\n userProfile={userProfile}\n onHomeClick={handleHomeClick}\n onSettingsClick={handleSettingsClick}\n onUserProfileClick={handleUserProfileClick}\n />\n\n <div className=\"main-layout\">{children}</div>\n </div>\n </div>\n </div>\n );\n};\n\nexport { AppLayout };\nexport type { AppLayoutProps };\n","/**\n * Centralized color system for TetraScience UI\n * This utility provides access to CSS variables defined in colors.css\n * while maintaining TypeScript support and IntelliSense\n */\n\n/**\n * Get a CSS variable value with optional fallback\n * @param cssVar - The CSS variable name (without --)\n * @param fallback - Optional fallback value\n * @returns The CSS variable value or fallback\n */\nconst getCSSVar = (cssVar: string, fallback?: string): string => {\n if (typeof window !== \"undefined\") {\n const value = getComputedStyle(document.documentElement)\n .getPropertyValue(\"--\" + cssVar)\n .trim();\n return value || fallback || \"\";\n }\n const fallbackSuffix = fallback ? \", \" + fallback : \"\";\n return \"var(--\" + cssVar + fallbackSuffix + \")\";\n};\n\n/**\n * Centralized color tokens that map to CSS variables\n * This provides TypeScript support while leveraging CSS custom properties\n */\nexport const COLORS = {\n // Black scale\n BLACK_50: getCSSVar(\"black-50\", \"rgba(26, 26, 26, 0.05)\"),\n BLACK_100: getCSSVar(\"black-100\", \"rgba(26, 26, 26, 0.1)\"),\n BLACK_200: getCSSVar(\"black-200\", \"rgba(26, 26, 26, 0.2)\"),\n BLACK_300: getCSSVar(\"black-300\", \"rgba(26, 26, 26, 0.3)\"),\n BLACK_400: getCSSVar(\"black-400\", \"rgba(26, 26, 26, 0.4)\"),\n BLACK_500: getCSSVar(\"black-500\", \"rgba(26, 26, 26, 0.5)\"),\n BLACK_600: getCSSVar(\"black-600\", \"rgba(26, 26, 26, 0.6)\"),\n BLACK_700: getCSSVar(\"black-700\", \"rgba(26, 26, 26, 0.7)\"),\n BLACK_800: getCSSVar(\"black-800\", \"rgba(26, 26, 26, 0.8)\"),\n BLACK_900: getCSSVar(\"black-900\", \"rgba(26, 26, 26, 1)\"),\n\n // Legacy aliases for backwards compatibility\n BLACK: getCSSVar(\"black-900\", \"#1a1a1a\"),\n BLACK_OPACITY_20: \"rgba(26, 26, 26, 0.2)\", // Custom opacity not in CSS vars\n\n // White scale\n WHITE_50: getCSSVar(\"white-50\", \"rgba(255, 255, 255, 0.05)\"),\n WHITE_100: getCSSVar(\"white-100\", \"rgba(255, 255, 255, 0.1)\"),\n WHITE_200: getCSSVar(\"white-200\", \"rgba(255, 255, 255, 0.2)\"),\n WHITE_300: getCSSVar(\"white-300\", \"rgba(255, 255, 255, 0.3)\"),\n WHITE_400: getCSSVar(\"white-400\", \"rgba(255, 255, 255, 0.4)\"),\n WHITE_500: getCSSVar(\"white-500\", \"rgba(255, 255, 255, 0.5)\"),\n WHITE_600: getCSSVar(\"white-600\", \"rgba(255, 255, 255, 0.6)\"),\n WHITE_700: getCSSVar(\"white-700\", \"rgba(255, 255, 255, 0.7)\"),\n WHITE_800: getCSSVar(\"white-800\", \"rgba(255, 255, 255, 0.8)\"),\n WHITE_900: getCSSVar(\"white-900\", \"rgba(255, 255, 255, 1)\"),\n\n // Legacy alias\n WHITE: getCSSVar(\"white-900\", \"#ffffff\"),\n\n // Blue scale\n BLUE_50: getCSSVar(\"blue-50\", \"rgba(240, 249, 255, 1)\"),\n BLUE_100: getCSSVar(\"blue-100\", \"rgba(225, 243, 254, 1)\"),\n BLUE_200: getCSSVar(\"blue-200\", \"rgba(185, 229, 252, 1)\"),\n BLUE_300: getCSSVar(\"blue-300\", \"rgba(125, 211, 251, 1)\"),\n BLUE_400: getCSSVar(\"blue-400\", \"rgba(58, 190, 247, 1)\"),\n BLUE_500: getCSSVar(\"blue-500\", \"rgba(27, 173, 240, 1)\"),\n BLUE_600: getCSSVar(\"blue-600\", \"rgba(64, 114, 210, 1)\"),\n BLUE_700: getCSSVar(\"blue-700\", \"rgba(3, 105, 159, 1)\"),\n BLUE_800: getCSSVar(\"blue-800\", \"rgba(5, 69, 103, 1)\"),\n BLUE_900: getCSSVar(\"blue-900\", \"rgba(4, 38, 63, 1)\"),\n\n // Legacy alias\n BLUE: getCSSVar(\"graph-primary-blue\", \"#2D9CDB\"),\n\n // Grey scale\n GREY_50: getCSSVar(\"grey-50\", \"rgba(248, 250, 252, 1)\"),\n GREY_100: getCSSVar(\"grey-100\", \"rgba(241, 245, 249, 1)\"),\n GREY_200: getCSSVar(\"grey-200\", \"rgba(225, 231, 239, 1)\"),\n GREY_300: getCSSVar(\"grey-300\", \"rgba(200, 214, 229, 1)\"),\n GREY_400: getCSSVar(\"grey-400\", \"rgba(158, 172, 192, 1)\"),\n GREY_500: getCSSVar(\"grey-500\", \"rgba(100, 116, 139, 1)\"),\n GREY_600: getCSSVar(\"grey-600\", \"rgba(72, 86, 106, 1)\"),\n GREY_700: getCSSVar(\"grey-700\", \"rgba(51, 65, 86, 1)\"),\n GREY_800: getCSSVar(\"grey-800\", \"rgba(29, 40, 57, 1)\"),\n GREY_900: getCSSVar(\"grey-900\", \"rgba(20, 30, 53, 1)\"),\n\n // Legacy alias\n GREY: getCSSVar(\"grey-400\", \"#CCCCCC\"),\n\n // Graph primary colors\n ORANGE: getCSSVar(\"graph-primary-orange\", \"#FFA62E\"),\n RED: getCSSVar(\"graph-primary-red\", \"#FF5C64\"),\n GREEN: getCSSVar(\"graph-primary-green\", \"#A5C34E\"),\n YELLOW: getCSSVar(\"graph-primary-yellow\", \"#FBED53\"),\n PURPLE: getCSSVar(\"graph-primary-purple\", \"#7A51AB\"),\n\n // Semantic colors\n GREEN_BG: getCSSVar(\"green-bg\", \"rgba(234, 254, 229, 1)\"),\n GREEN_SUCCESS: getCSSVar(\"green-success\", \"rgba(8, 173, 55, 1)\"),\n ORANGE_BG: getCSSVar(\"orange-bg\", \"rgba(254, 250, 229, 1)\"),\n ORANGE_CAUTION: getCSSVar(\"orange-caution\", \"rgba(249, 173, 20, 1)\"),\n RED_BG: getCSSVar(\"red-bg\", \"rgba(254, 234, 229, 1)\"),\n RED_ERROR: getCSSVar(\"red-error\", \"rgba(216, 35, 44, 1)\"),\n\n // Graph secondary colors\n GRAPH_SECONDARY_BROWN: getCSSVar(\"graph-secondary-brown\", \"#AD7942\"),\n GRAPH_SECONDARY_PINK: getCSSVar(\"graph-secondary-pink\", \"#FB90B4\"),\n GRAPH_SECONDARY_TEAL: getCSSVar(\"graph-secondary-teal\", \"#3CCABA\"),\n GRAPH_SECONDARY_DARK_BLUE: getCSSVar(\"graph-secondary-dark-blue\", \"#4072D2\"),\n GRAPH_SECONDARY_BLACK: getCSSVar(\"graph-secondary-black\", \"#424E62\"),\n GRAPH_SECONDARY_GREY: getCSSVar(\"graph-secondary-grey\", \"#B4B4B4\"),\n} as const;\n\n/**\n * Chart color palette for consistent graph styling\n * Uses the primary graph colors from the design system\n */\nexport const CHART_COLORS = [\n COLORS.ORANGE,\n COLORS.RED,\n COLORS.GREEN,\n COLORS.BLUE,\n COLORS.YELLOW,\n COLORS.PURPLE,\n COLORS.GRAPH_SECONDARY_BROWN,\n COLORS.GRAPH_SECONDARY_PINK,\n COLORS.GRAPH_SECONDARY_TEAL,\n COLORS.GRAPH_SECONDARY_DARK_BLUE,\n COLORS.GRAPH_SECONDARY_BLACK,\n COLORS.GRAPH_SECONDARY_GREY,\n] as const;\n\nexport type ColorToken = keyof typeof COLORS;\n","import { COLORS } from \"@utils/colors\";\nimport Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\nimport \"./AreaGraph.scss\";\n\ninterface AreaDataSeries {\n x: number[];\n y: number[];\n name: string;\n color: string;\n fill?: \"tozeroy\" | \"tonexty\" | \"toself\";\n}\n\ntype AreaGraphVariant = \"normal\" | \"stacked\";\n\ninterface AreaGraphProps {\n dataSeries: AreaDataSeries[];\n width?: number;\n height?: number;\n xRange?: [number, number];\n yRange?: [number, number];\n variant?: AreaGraphVariant;\n xTitle?: string;\n yTitle?: string;\n title?: string;\n}\n\nconst AreaGraph: React.FC<AreaGraphProps> = ({\n dataSeries,\n width = 1000,\n height = 600,\n xRange,\n yRange,\n variant = \"normal\",\n xTitle = \"Columns\",\n yTitle = \"Rows\",\n title = \"Area Graph\",\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n\n const { xMin, xMax, yMin, yMax } = useMemo(() => {\n let minX = Number.MAX_VALUE;\n let maxX = Number.MIN_VALUE;\n let minY = Number.MAX_VALUE;\n let maxY = Number.MIN_VALUE;\n\n dataSeries.forEach((series) => {\n series.x.forEach((x) => {\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n });\n series.y.forEach((y) => {\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n const xPadding = (maxX - minX) * 0.1;\n const yPadding = (maxY - minY) * 0.1;\n\n return {\n xMin: minX - xPadding,\n xMax: maxX + xPadding,\n yMin: variant === \"stacked\" ? 0 : minY - yPadding,\n yMax: maxY + yPadding,\n };\n }, [dataSeries, variant]);\n\n const effectiveXRange = useMemo(\n () => xRange || [xMin, xMax],\n [xRange, xMin, xMax],\n );\n const effectiveYRange = useMemo(\n () => yRange || [yMin, yMax],\n [yRange, yMin, yMax],\n );\n\n const xTicks = useMemo(() => {\n const range = effectiveXRange[1] - effectiveXRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveXRange[0] / step) * step;\n while (current <= effectiveXRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveXRange]);\n\n const yTicks = useMemo(() => {\n const range = effectiveYRange[1] - effectiveYRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveYRange[0] / step) * step;\n while (current <= effectiveYRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveYRange]);\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: COLORS.GREY_200,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: COLORS.BLACK_900,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n linecolor: COLORS.BLACK_900,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [],\n );\n\n const titleOptions = useMemo(\n () => ({\n text: title,\n x: 0.5,\n y: 0.95,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n font: {\n size: 32,\n weight: 600,\n family: \"Inter, sans-serif\",\n color: COLORS.BLACK_900,\n lineheight: 1.2,\n standoff: 30,\n },\n }),\n [title],\n );\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n let data;\n\n if (variant === \"stacked\") {\n // For stacked mode, we need to calculate cumulative values\n const cumulativeY = new Array(dataSeries[0]?.x.length || 0).fill(0);\n\n data = dataSeries.map((series, index) => {\n // Calculate cumulative values for this series\n const stackedY = series.y.map((value, i) => {\n const result = cumulativeY[i] + value;\n cumulativeY[i] = result;\n return result;\n });\n\n return {\n x: series.x,\n y: stackedY,\n type: \"scatter\" as const,\n mode: \"lines\" as const,\n name: series.name,\n fill: index === 0 ? (\"tozeroy\" as const) : (\"tonexty\" as const),\n fillcolor: series.color,\n line: {\n color: series.color,\n width: 2,\n },\n };\n });\n } else {\n // Normal mode - each area fills independently from zero\n data = dataSeries.map((series) => ({\n x: series.x,\n y: series.y,\n type: \"scatter\" as const,\n mode: \"lines\" as const,\n name: series.name,\n fill: series.fill || (\"tozeroy\" as const),\n fillcolor: series.color,\n line: {\n color: series.color,\n width: 2,\n },\n }));\n }\n\n const layout = {\n width,\n height: height,\n title: titleOptions,\n margin: { l: 80, r: 40, b: 80, t: 80, pad: 0 },\n paper_bgcolor: COLORS.WHITE,\n plot_bgcolor: COLORS.WHITE,\n font: {\n family: \"Inter, sans-serif\",\n },\n dragmode: false as const,\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: COLORS.BLACK_600,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 15,\n },\n gridcolor: COLORS.GREY_200,\n range: xRange,\n autorange: !xRange,\n tickmode: \"array\" as const,\n tickvals: xTicks,\n showgrid: true,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: COLORS.BLACK_600,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 15,\n },\n gridcolor: COLORS.GREY_200,\n range: yRange,\n autorange: !yRange,\n tickmode: \"array\" as const,\n tickvals: yTicks,\n showgrid: true,\n ...tickOptions,\n },\n legend: {\n x: 0.5,\n y: -0.2,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n orientation: \"h\" as const,\n font: {\n size: 13,\n color: COLORS.BLUE_900,\n family: \"Inter, sans-serif\",\n weight: 500,\n lineheight: 18,\n },\n },\n showlegend: true,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, data, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n // Cleanup function\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [dataSeries, width, height, xRange, yRange, effectiveXRange, effectiveYRange, variant, xTitle, yTitle, titleOptions, tickOptions, xTicks, yTicks]);\n\n return (\n <div className=\"area-graph-container\">\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n </div>\n );\n};\n\nexport { AreaGraph };\nexport type { AreaDataSeries, AreaGraphVariant, AreaGraphProps };\n","import { COLORS } from \"@utils/colors\";\nimport Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\nimport \"./BarGraph.scss\";\n\ninterface BarDataSeries {\n x: number[];\n y: number[];\n name: string;\n color: string;\n error_y?: {\n type: \"data\";\n array: number[];\n visible: boolean;\n };\n}\n\ntype BarGraphVariant = \"group\" | \"stack\" | \"overlay\";\n\ninterface BarGraphProps {\n dataSeries: BarDataSeries[];\n width?: number;\n height?: number;\n xRange?: [number, number];\n yRange?: [number, number];\n variant?: BarGraphVariant;\n xTitle?: string;\n yTitle?: string;\n title?: string;\n barWidth?: number;\n}\n\nconst BarGraph: React.FC<BarGraphProps> = ({\n dataSeries,\n width = 1000,\n height = 600,\n xRange,\n yRange,\n variant = \"group\",\n xTitle = \"Columns\",\n yTitle = \"Rows\",\n title = \"Bar Graph\",\n barWidth = 24,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n\n const { yMin, yMax } = useMemo(() => {\n let minX = Number.MAX_VALUE;\n let maxX = Number.MIN_VALUE;\n let minY = Number.MAX_VALUE;\n let maxY = Number.MIN_VALUE;\n\n dataSeries.forEach((series) => {\n series.x.forEach((x) => {\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n });\n series.y.forEach((y) => {\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n const xPadding = (maxX - minX) * 0.1;\n const yPadding = (maxY - minY) * 0.1;\n\n return {\n xMin: minX - xPadding,\n xMax: maxX + xPadding,\n yMin: variant === \"stack\" ? 0 : minY - yPadding,\n yMax: maxY + yPadding,\n };\n }, [dataSeries, variant]);\n\n const effectiveYRange = useMemo(\n () => yRange || [yMin, yMax],\n [yRange, yMin, yMax],\n );\n\n const xTicks = useMemo(\n () => [...new Set(dataSeries.flatMap((s) => s.x))],\n [dataSeries],\n );\n\n const yTicks = useMemo(() => {\n const range = effectiveYRange[1] - effectiveYRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveYRange[0] / step) * step;\n while (current <= effectiveYRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveYRange]);\n\n const barMode = useMemo((): \"group\" | \"stack\" | \"overlay\" => {\n switch (variant) {\n case \"stack\":\n return \"stack\";\n case \"overlay\":\n return \"overlay\";\n case \"group\":\n default:\n return \"group\";\n }\n }, [variant]);\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: COLORS.GREY_200,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: COLORS.BLACK_900,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n linecolor: COLORS.BLACK_900,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [],\n );\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n const data = dataSeries.map((series) => ({\n x: series.x,\n y: series.y,\n type: \"bar\" as const,\n name: series.name,\n marker: {\n color: series.color,\n },\n width: barWidth,\n error_y: series.error_y,\n }));\n\n const layout = {\n title: {\n text: title,\n font: {\n size: 32,\n family: \"Inter, sans-serif\",\n color: COLORS.BLACK_900,\n },\n },\n width,\n height,\n margin: { l: 80, r: 30, b: 80, t: 60, pad: 0 },\n paper_bgcolor: COLORS.WHITE,\n plot_bgcolor: COLORS.WHITE,\n font: {\n family: \"Inter, sans-serif\",\n },\n barmode: barMode,\n bargap: 0.15,\n dragmode: false as const,\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: COLORS.BLACK_600,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 32,\n },\n gridcolor: COLORS.GREY_200,\n range: xRange,\n autorange: !xRange,\n tickmode: \"array\" as const,\n tickvals: xTicks,\n showgrid: true,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: COLORS.BLACK_600,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 30,\n },\n gridcolor: COLORS.GREY_200,\n range: yRange,\n autorange: !yRange,\n tickmode: \"array\" as const,\n tickvals: yTicks,\n showgrid: true,\n ...tickOptions,\n },\n legend: {\n x: 0.5,\n y: -0.2,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n orientation: \"h\" as const,\n font: {\n size: 16,\n color: COLORS.BLUE_900,\n family: \"Inter, sans-serif\",\n weight: 500,\n },\n },\n showlegend: dataSeries.length > 1,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, data, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n // Cleanup function\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [dataSeries, width, height, xRange, yRange, xTitle, yTitle, title, barWidth, barMode, tickOptions, xTicks, yTicks]);\n\n return (\n <div className=\"bar-graph-container\">\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n </div>\n );\n};\n\nexport { BarGraph };\nexport type { BarDataSeries, BarGraphVariant, BarGraphProps };\n","import { COLORS } from \"@utils/colors\";\nimport Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\nimport \"./Boxplot.scss\";\n\n/** Default point position offset from the box edge */\nconst DEFAULT_POINT_POSITION = -1.8;\n\ninterface BoxDataSeries {\n y: number[];\n name: string;\n color: string;\n x?: string[] | number[];\n boxpoints?: \"all\" | \"outliers\" | \"suspectedoutliers\" | false;\n jitter?: number;\n pointpos?: number;\n}\n\ninterface BoxplotProps {\n dataSeries: BoxDataSeries[];\n width?: number;\n height?: number;\n xRange?: [number, number];\n yRange?: [number, number];\n xTitle?: string;\n yTitle?: string;\n title?: string;\n showPoints?: boolean;\n}\n\nconst Boxplot: React.FC<BoxplotProps> = ({\n dataSeries,\n width = 1000,\n height = 600,\n xRange,\n yRange,\n xTitle = \"Columns\",\n yTitle = \"Rows\",\n title = \"Boxplot\",\n showPoints = false,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n\n const { yMin, yMax } = useMemo(() => {\n let minY = Number.MAX_VALUE;\n let maxY = Number.MIN_VALUE;\n\n dataSeries.forEach((series) => {\n series.y.forEach((y) => {\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n const yPadding = (maxY - minY) * 0.1;\n\n return {\n yMin: minY - yPadding,\n yMax: maxY + yPadding,\n };\n }, [dataSeries]);\n\n const effectiveYRange = useMemo(\n () => yRange || [yMin, yMax],\n [yRange, yMin, yMax],\n );\n\n const yTicks = useMemo(() => {\n const range = effectiveYRange[1] - effectiveYRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveYRange[0] / step) * step;\n while (current <= effectiveYRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveYRange]);\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: COLORS.GREY_200,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: COLORS.BLACK_900,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n linecolor: COLORS.BLACK_900,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [],\n );\n\n const titleOptions = useMemo(\n () => ({\n text: title,\n x: 0.5,\n y: 0.95,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n font: {\n size: 32,\n weight: 600,\n family: \"Inter, sans-serif\",\n color: COLORS.BLACK_900,\n lineheight: 1.2,\n standoff: 30,\n },\n }),\n [title],\n );\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n const data = dataSeries.map((series) => ({\n y: series.y,\n x: series.x,\n type: \"box\" as const,\n name: series.name,\n marker: {\n color: series.color,\n },\n line: {\n color: series.color,\n },\n fillcolor: series.color + \"40\", // Add transparency\n boxpoints: showPoints ? series.boxpoints || \"outliers\" : (false as const),\n jitter: series.jitter || 0.3,\n pointpos: series.pointpos || DEFAULT_POINT_POSITION,\n }));\n\n const layout = {\n width,\n height: height,\n title: titleOptions,\n margin: { l: 80, r: 40, b: 80, t: 80, pad: 0 },\n paper_bgcolor: COLORS.WHITE,\n plot_bgcolor: COLORS.WHITE,\n font: {\n family: \"Inter, sans-serif\",\n },\n dragmode: false as const,\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: COLORS.BLACK_600,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 15,\n },\n gridcolor: COLORS.GREY_200,\n range: xRange,\n autorange: !xRange,\n showgrid: true,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: COLORS.BLACK_600,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 15,\n },\n gridcolor: COLORS.GREY_200,\n range: yRange,\n autorange: !yRange,\n tickmode: \"array\" as const,\n tickvals: yTicks,\n showgrid: true,\n ...tickOptions,\n },\n legend: {\n x: 0.5,\n y: -0.2,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n orientation: \"h\" as const,\n font: {\n size: 13,\n color: COLORS.BLUE_900,\n family: \"Inter, sans-serif\",\n weight: 500,\n lineheight: 18,\n },\n },\n showlegend: true,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, data, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n // Cleanup function\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [dataSeries, width, height, xRange, yRange, effectiveYRange, xTitle, yTitle, showPoints, titleOptions, tickOptions, yTicks]);\n\n return (\n <div className=\"boxplot-container\">\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n </div>\n );\n};\n\nexport { Boxplot };\nexport type { BoxDataSeries, BoxplotProps };\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\nimport \"./Chromatogram.scss\";\n\n/** Height offset for the plot area in pixels */\nconst PLOT_HEIGHT_OFFSET = 75;\n/** Scale factor for y-axis range to add padding above max value */\nconst Y_AXIS_PADDING_FACTOR = 1.05;\n\ninterface PeakData {\n position: number;\n base?: string;\n peakA: number;\n peakT: number;\n peakG: number;\n peakC: number;\n}\n\ninterface ChromatogramProps {\n data?: PeakData[];\n width?: number;\n height?: number;\n positionInterval?: number;\n colorA?: string;\n colorT?: string;\n colorG?: string;\n colorC?: string;\n}\n\nconst determineBase = (item: PeakData): string => {\n const peakValues = {\n A: item.peakA,\n T: item.peakT,\n G: item.peakG,\n C: item.peakC,\n };\n\n const values = Object.values(peakValues);\n const allEqual = values.every((val) => val === values[0]);\n\n if (allEqual) {\n return \"\";\n }\n\n let highestBase = \"\";\n let highestValue = 0;\n\n Object.entries(peakValues).forEach(([base, value]) => {\n if (value > highestValue) {\n highestBase = base;\n highestValue = value;\n }\n });\n\n return highestBase;\n};\n\nconst Chromatogram: React.FC<ChromatogramProps> = ({\n data = [],\n width = 900,\n height = 600,\n positionInterval = 10,\n colorA = \"#2D9CDB\",\n colorT = \"#A1C63C\",\n colorG = \"#FF5C64\",\n colorC = \"#FFA62E\",\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n\n const positions = useMemo(() => data.map((item) => item.position), [data]);\n const sequence = useMemo(() => data.map((item) => determineBase(item)), [data]);\n const peakA = useMemo(() => data.map((item) => item.peakA), [data]);\n const peakT = useMemo(() => data.map((item) => item.peakT), [data]);\n const peakG = useMemo(() => data.map((item) => item.peakG), [data]);\n const peakC = useMemo(() => data.map((item) => item.peakC), [data]);\n\n const aTrace = useMemo(\n () => ({\n x: positions,\n y: peakA,\n type: \"scatter\" as const,\n mode: \"lines\" as const,\n name: \"A\",\n line: { color: colorA, width: 2, shape: \"spline\" as const },\n }),\n [positions, peakA, colorA],\n );\n\n const tTrace = useMemo(\n () => ({\n x: positions,\n y: peakT,\n type: \"scatter\" as const,\n mode: \"lines\" as const,\n name: \"T\",\n line: { color: colorT, width: 2, shape: \"spline\" as const },\n }),\n [positions, peakT, colorT],\n );\n\n const gTrace = useMemo(\n () => ({\n x: positions,\n y: peakG,\n type: \"scatter\" as const,\n mode: \"lines\" as const,\n name: \"G\",\n line: { color: colorG, width: 2, shape: \"spline\" as const },\n }),\n [positions, peakG, colorG],\n );\n\n const cTrace = useMemo(\n () => ({\n x: positions,\n y: peakC,\n type: \"scatter\" as const,\n mode: \"lines\" as const,\n name: \"C\",\n line: { color: colorC, width: 2, shape: \"spline\" as const },\n }),\n [positions, peakC, colorC],\n );\n\n const maxValue = useMemo(\n () => Math.max(...peakA, ...peakT, ...peakG, ...peakC),\n [peakA, peakT, peakG, peakC],\n );\n\n useEffect(() => {\n if (!plotRef.current || data.length === 0) return;\n\n const plotData = [aTrace, tTrace, gTrace, cTrace];\n\n const layout: Partial<Plotly.Layout> = {\n width: width,\n height: height - PLOT_HEIGHT_OFFSET,\n margin: { l: 0, r: 0, b: 20, t: 10, pad: 0 },\n paper_bgcolor: \"var(--white-900)\",\n plot_bgcolor: \"var(--white-900)\",\n font: {\n family: \"Inter, sans-serif\",\n },\n showlegend: false,\n xaxis: {\n showgrid: false,\n zeroline: false,\n showticklabels: false,\n showline: false,\n range: [Math.min(...positions), Math.max(...positions)],\n fixedrange: true,\n },\n yaxis: {\n showgrid: false,\n zeroline: false,\n showticklabels: false,\n showline: false,\n range: [0, maxValue * Y_AXIS_PADDING_FACTOR],\n fixedrange: true,\n },\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n fillFrame: true,\n };\n\n Plotly.newPlot(plotRef.current, plotData, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [data, width, height, aTrace, tTrace, gTrace, cTrace, maxValue, positions]);\n\n if (data.length === 0) {\n return <div className=\"chart-container\">No data available</div>;\n }\n\n const renderSequence = () => {\n const renderSequenceLetters = () => {\n const minPosition = Math.min(...positions);\n const maxPosition = Math.max(...positions);\n const chartWidth = width;\n\n return (\n <div className=\"sequence-letters-container\">\n {sequence.map((base, index) => {\n const position = positions[index];\n const color =\n base === \"A\"\n ? colorA\n : base === \"T\"\n ? colorT\n : base === \"G\"\n ? colorG\n : base === \"C\"\n ? colorC\n : \"var(--black-900)\";\n\n const percentage =\n (position - minPosition) / (maxPosition - minPosition);\n const leftPosition = percentage * chartWidth;\n\n return (\n <span\n key={`base-${index}`}\n className=\"sequence-letter\"\n style={{\n left: `${leftPosition}px`,\n color,\n }}\n >\n {base}\n </span>\n );\n })}\n </div>\n );\n };\n\n const renderPositionNumbers = () => {\n const minPosition = Math.min(...positions);\n const maxPosition = Math.max(...positions);\n const chartWidth = width;\n\n const startPos =\n Math.ceil(minPosition / positionInterval) * positionInterval;\n\n const regularPositionLabels: Array<{ position: number; label: string }> =\n [];\n\n for (let pos = startPos; pos <= maxPosition; pos += positionInterval) {\n regularPositionLabels.push({\n position: pos,\n label: pos.toString(),\n });\n }\n\n return (\n <div className=\"position-numbers-container\">\n {regularPositionLabels.map((label) => {\n const percentage =\n (label.position - minPosition) / (maxPosition - minPosition);\n const leftPosition = percentage * chartWidth;\n\n return (\n <span\n key={`pos-${label.position}`}\n className=\"position-number\"\n style={{\n left: `${leftPosition}px`,\n }}\n >\n {label.label}\n </span>\n );\n })}\n </div>\n );\n };\n\n return (\n <div className=\"sequence-header\">\n {renderSequenceLetters()}\n {renderPositionNumbers()}\n </div>\n );\n };\n\n return (\n <div className=\"chromatogram-container\" style={{ width, height }}>\n {renderSequence()}\n <div className=\"chromatogram-chart\">\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n </div>\n </div>\n );\n};\n\nexport { Chromatogram };\nexport type { PeakData, ChromatogramProps };\n","/**\n * Constants for ChromatogramChart component\n */\n\n/**\n * Layout constants for chart margins and spacing\n */\nexport const CHROMATOGRAM_LAYOUT = {\n /** Left margin in pixels */\n MARGIN_LEFT: 70,\n /** Right margin in pixels */\n MARGIN_RIGHT: 30,\n /** Bottom margin in pixels */\n MARGIN_BOTTOM: 60,\n /** Top margin with title in pixels */\n MARGIN_TOP_WITH_TITLE: 50,\n /** Top margin without title in pixels */\n MARGIN_TOP_NO_TITLE: 30,\n /** Padding around plot area */\n MARGIN_PAD: 5,\n} as const;\n\n/**\n * Annotation constants for peak labels and markers\n */\nexport const CHROMATOGRAM_ANNOTATION = {\n /** Default vertical offset for annotation arrows (negative = above point) */\n DEFAULT_ARROW_OFFSET_Y: -30,\n /** Font size for user-defined annotations */\n USER_ANNOTATION_FONT_SIZE: 11,\n /** Font size for auto-detected peak annotations */\n AUTO_ANNOTATION_FONT_SIZE: 10,\n} as const;\n\n","/**\n * Annotation utilities for ChromatogramChart\n */\n\nimport { COLORS, CHART_COLORS } from \"../../../utils/colors\";\n\nimport { CHROMATOGRAM_ANNOTATION } from \"./constants\";\n\nimport type { PeakAnnotation, PeakWithMeta } from \"./types\";\nimport type Plotly from \"plotly.js-dist\";\n\n/**\n * Annotation slot positions for peak labels\n */\nexport const ANNOTATION_SLOTS = {\n default: { ax: 0, ay: -35 },\n overlap: [\n { ax: 50, ay: -35 }, // Right, level 1\n { ax: -60, ay: -35 }, // Left, level 1\n { ax: 70, ay: -55 }, // Right, level 2\n { ax: -80, ay: -55 }, // Left, level 2\n { ax: 50, ay: -75 }, // Right, level 3\n { ax: -60, ay: -75 }, // Left, level 3\n ],\n};\n\n/**\n * Group overlapping peaks by retention time (x) proximity\n */\nexport function groupOverlappingPeaks(\n peaksWithMeta: PeakWithMeta[],\n overlapThreshold: number\n): PeakWithMeta[][] {\n const sorted = [...peaksWithMeta].sort((a, b) => a.peak.x - b.peak.x);\n\n const groups: PeakWithMeta[][] = [];\n let currentGroup: PeakWithMeta[] = [];\n\n for (const current of sorted) {\n if (currentGroup.length === 0) {\n currentGroup.push(current);\n continue;\n }\n\n const lastInGroup = currentGroup[currentGroup.length - 1];\n const timeDiff = Math.abs(current.peak.x - lastInGroup.peak.x);\n\n if (timeDiff < overlapThreshold) {\n currentGroup.push(current);\n } else {\n groups.push(currentGroup);\n currentGroup = [current];\n }\n }\n\n if (currentGroup.length > 0) {\n groups.push(currentGroup);\n }\n\n return groups;\n}\n\n/**\n * Create a Plotly annotation for a peak.\n * seriesIndex of -1 indicates a user-defined annotation (uses grey/black styling).\n */\nexport function createPeakAnnotation(\n peak: PeakAnnotation,\n seriesIndex: number,\n slot: { ax: number; ay: number }\n): Partial<Plotly.Annotations> {\n const isUserDefined = seriesIndex === -1;\n const color = isUserDefined\n ? COLORS.GREY_500\n : CHART_COLORS[seriesIndex % CHART_COLORS.length];\n const textColor = isUserDefined ? COLORS.BLACK_900 : color;\n\n // Use provided text or auto-generate from computed area\n const text = peak.text ?? (peak._computed?.area === undefined ? \"\" : `Area: ${peak._computed.area.toFixed(2)}`);\n\n // For user-defined annotations, respect their ax/ay if provided\n const ax = isUserDefined && peak.ax !== undefined ? peak.ax : slot.ax;\n const ay = isUserDefined && peak.ay !== undefined ? peak.ay : slot.ay;\n\n return {\n x: peak.x,\n y: peak.y,\n text,\n showarrow: true,\n arrowhead: 2,\n arrowsize: 1,\n arrowwidth: 1,\n arrowcolor: color,\n ax,\n ay,\n font: {\n size: isUserDefined\n ? CHROMATOGRAM_ANNOTATION.USER_ANNOTATION_FONT_SIZE\n : CHROMATOGRAM_ANNOTATION.AUTO_ANNOTATION_FONT_SIZE,\n color: textColor,\n family: \"Inter, sans-serif\",\n },\n bgcolor: COLORS.WHITE,\n borderpad: 2,\n bordercolor: isUserDefined ? undefined : color,\n borderwidth: isUserDefined ? 0 : 1,\n };\n}\n\n/**\n * Create annotations for a group of peaks, handling overlap positioning\n */\nexport function createGroupAnnotations(\n group: PeakWithMeta[]\n): Partial<Plotly.Annotations>[] {\n if (group.length === 1) {\n const { peak, seriesIndex } = group[0];\n return [createPeakAnnotation(peak, seriesIndex, ANNOTATION_SLOTS.default)];\n }\n\n // Sort by intensity (y, lowest first) so lower peaks get closer annotations\n const sortedGroup = [...group].sort((a, b) => a.peak.y - b.peak.y);\n\n return sortedGroup.map(({ peak, seriesIndex }, slotIndex) => {\n const slot =\n ANNOTATION_SLOTS.overlap[slotIndex % ANNOTATION_SLOTS.overlap.length];\n return createPeakAnnotation(peak, seriesIndex, slot);\n });\n}\n\n","/**\n * Boundary marker utilities for ChromatogramChart\n */\n\nimport { CHART_COLORS } from \"../../../utils/colors\";\n\nimport type { PeakAnnotation, BoundaryMarkerType } from \"./types\";\nimport type Plotly from \"plotly.js-dist\";\n\n/** Base Y position for start boundary markers (below the x-axis) */\nconst BOUNDARY_MARKER_START_Y = -5;\n/** Y position for end boundary markers (below start markers) */\nconst BOUNDARY_MARKER_END_Y = -12;\n/** Y offset between series to prevent overlap */\nconst BOUNDARY_MARKER_SERIES_OFFSET = -16;\n\n/**\n * Create a marker trace for a boundary point.\n * Markers are placed on the x-axis below 0, staggered by series index.\n */\nfunction createMarkerTrace(\n xPos: number,\n yPos: number,\n markerType: BoundaryMarkerType,\n color: string\n): Plotly.Data[] {\n if (markerType === \"none\") {\n return [];\n }\n\n return [\n {\n x: [xPos],\n y: [yPos],\n type: \"scatter\" as const,\n mode: \"markers\" as const,\n marker: {\n symbol: markerType === \"diamond\" ? (\"diamond\" as const) : (\"triangle-up\" as const),\n size: 8,\n color,\n },\n showlegend: false,\n hoverinfo: \"skip\" as const,\n },\n ];\n}\n\n/**\n * Create boundary marker traces for peaks.\n * Uses per-peak startMarker/endMarker settings with defaults:\n * - startMarker: \"triangle\" (default)\n * - endMarker: \"diamond\" (default)\n */\nexport function createBoundaryMarkerTraces(\n allPeaks: {\n peaks: PeakAnnotation[];\n seriesIndex: number;\n x: number[];\n y: number[];\n }[]\n): Plotly.Data[] {\n const traces: Plotly.Data[] = [];\n\n for (const { peaks, seriesIndex, x } of allPeaks) {\n const color = CHART_COLORS[seriesIndex % CHART_COLORS.length];\n // Separate y positions for start vs end markers to prevent overlap when peaks are adjacent\n // Also stagger by series index to prevent overlap between different traces\n const startMarkerY = BOUNDARY_MARKER_START_Y + seriesIndex * BOUNDARY_MARKER_SERIES_OFFSET;\n const endMarkerY = BOUNDARY_MARKER_END_Y + seriesIndex * BOUNDARY_MARKER_SERIES_OFFSET;\n\n for (const peak of peaks) {\n const startIdx = peak._computed?.startIndex ?? 0;\n const endIdx = peak._computed?.endIndex ?? 0;\n const startX = x[startIdx];\n const endX = x[endIdx];\n\n // Get marker types with defaults: triangle at start, diamond at end\n const startMarkerType = peak.startMarker ?? \"triangle\";\n const endMarkerType = peak.endMarker ?? \"diamond\";\n\n // Create start boundary marker (upper row, staggered by series)\n traces.push(...createMarkerTrace(startX, startMarkerY, startMarkerType, color));\n\n // Create end boundary marker (lower row, staggered by series)\n traces.push(...createMarkerTrace(endX, endMarkerY, endMarkerType, color));\n }\n }\n\n return traces;\n}\n\n","/**\n * Peak detection algorithms for ChromatogramChart\n */\n\nimport type { PeakAnnotation, PeakDetectionOptions } from \"./types\";\n\n/**\n * Calculate prominence of a peak (how much it stands out from neighbors)\n */\nexport function calculateProminence(\n y: number[],\n peakIndex: number,\n searchWindow: number\n): number {\n let leftMin = y[peakIndex];\n let rightMin = y[peakIndex];\n\n for (let j = peakIndex - 1; j >= Math.max(0, peakIndex - searchWindow); j--) {\n leftMin = Math.min(leftMin, y[j]);\n }\n for (\n let j = peakIndex + 1;\n j < Math.min(y.length, peakIndex + searchWindow);\n j++\n ) {\n rightMin = Math.min(rightMin, y[j]);\n }\n\n return y[peakIndex] - Math.max(leftMin, rightMin);\n}\n\n/**\n * Find peak boundary indices by walking outward from peak\n */\nexport function findPeakBoundaries(\n y: number[],\n peakIndex: number\n): { startIndex: number; endIndex: number } {\n let startIndex = peakIndex;\n let endIndex = peakIndex;\n\n // Walk left to find start\n for (let j = peakIndex - 1; j >= 0; j--) {\n if (y[j] <= y[j + 1]) {\n startIndex = j;\n } else {\n break;\n }\n }\n\n // Walk right to find end\n for (let j = peakIndex + 1; j < y.length; j++) {\n if (y[j] <= y[j - 1]) {\n endIndex = j;\n } else {\n break;\n }\n }\n\n return { startIndex, endIndex };\n}\n\n/**\n * Calculate peak area using trapezoidal integration\n */\nexport function calculatePeakArea(\n x: number[],\n y: number[],\n startIndex: number,\n endIndex: number\n): number {\n const baselineY = Math.min(y[startIndex], y[endIndex]);\n let area = 0;\n\n for (let j = startIndex; j < endIndex; j++) {\n const h = x[j + 1] - x[j];\n const y1 = y[j] - baselineY;\n const y2 = y[j + 1] - baselineY;\n area += ((y1 + y2) * h) / 2;\n }\n\n return area;\n}\n\n/**\n * Calculate width at half maximum of a peak\n */\nexport function calculateWidthAtHalfMax(\n x: number[],\n y: number[],\n peakIndex: number,\n startIndex: number,\n endIndex: number\n): number {\n const baselineY = Math.min(y[startIndex], y[endIndex]);\n const halfMax = (y[peakIndex] + baselineY) / 2;\n let leftHalf = peakIndex;\n let rightHalf = peakIndex;\n\n for (let j = peakIndex; j >= startIndex; j--) {\n if (y[j] < halfMax) {\n leftHalf = j;\n break;\n }\n }\n for (let j = peakIndex; j <= endIndex; j++) {\n if (y[j] < halfMax) {\n rightHalf = j;\n break;\n }\n }\n\n return x[rightHalf] - x[leftHalf];\n}\n\n/**\n * Filter peaks by minimum distance, keeping more intense peaks\n */\nexport function filterPeaksByDistance(\n peaks: PeakAnnotation[],\n minDistance: number\n): PeakAnnotation[] {\n const filtered: PeakAnnotation[] = [];\n\n for (const peak of peaks) {\n const tooClose = filtered.some(\n (p) => Math.abs((p._computed?.index ?? 0) - (peak._computed?.index ?? 0)) < minDistance\n );\n if (!tooClose) {\n filtered.push(peak);\n } else if (\n filtered.length > 0 &&\n peak.y > filtered[filtered.length - 1].y\n ) {\n filtered.pop();\n filtered.push(peak);\n }\n }\n\n return filtered.sort((a, b) => a.x - b.x);\n}\n\n/**\n * Detect peaks in signal data using derivative analysis.\n *\n * Default parameters are tuned for typical HPLC chromatograms:\n * - minHeight (0.05 = 5%): Filters noise while detecting small peaks\n * - minDistance (5 points): Prevents detecting noise as multiple peaks\n * - prominence (0.02 = 2%): Ensures peaks stand out from baseline/shoulders\n */\nexport function detectPeaks(\n x: number[],\n y: number[],\n options: PeakDetectionOptions = {}\n): PeakAnnotation[] {\n const {\n minHeight = 0.05,\n minDistance = 5,\n prominence = 0.02,\n relativeThreshold = true,\n } = options;\n\n if (y.length < 3) return [];\n\n const maxY = Math.max(...y);\n const threshold = relativeThreshold ? minHeight * maxY : minHeight;\n const prominenceThreshold = relativeThreshold ? prominence * maxY : prominence;\n const searchWindow = minDistance * 3;\n\n const peaks: PeakAnnotation[] = [];\n\n // Find local maxima\n for (let i = 1; i < y.length - 1; i++) {\n const isLocalMax =\n y[i] > y[i - 1] && y[i] > y[i + 1] && y[i] >= threshold;\n if (!isLocalMax) continue;\n\n const peakProminence = calculateProminence(y, i, searchWindow);\n if (peakProminence < prominenceThreshold) continue;\n\n const { startIndex, endIndex } = findPeakBoundaries(y, i);\n const area = calculatePeakArea(x, y, startIndex, endIndex);\n const widthAtHalfMax = calculateWidthAtHalfMax(\n x,\n y,\n i,\n startIndex,\n endIndex\n );\n\n peaks.push({\n x: x[i],\n y: y[i],\n _computed: {\n area,\n index: i,\n startIndex,\n endIndex,\n widthAtHalfMax,\n },\n });\n }\n\n return filterPeaksByDistance(peaks, minDistance);\n}\n\n","/**\n * Data processing utilities for ChromatogramChart\n */\n\nimport { calculatePeakArea } from \"./peakDetection\";\n\nimport type { BaselineCorrectionMethod, PeakAnnotation } from \"./types\";\n\n/**\n * Data structure for peaks with their associated series data\n */\nexport type PeakDataWithSeries = {\n peaks: PeakAnnotation[];\n seriesIndex: number;\n x: number[];\n y: number[];\n};\n\n/**\n * Find the closest index in an array for a given target value.\n * Uses binary search for efficiency.\n */\nexport function findClosestIndex(arr: number[], target: number): number {\n if (arr.length === 0) return 0;\n if (arr.length === 1) return 0;\n\n let left = 0;\n let right = arr.length - 1;\n\n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n if (arr[mid] < target) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n\n // Check if left-1 is closer\n if (left > 0 && Math.abs(arr[left - 1] - target) < Math.abs(arr[left] - target)) {\n return left - 1;\n }\n return left;\n}\n\n/**\n * Process user annotations to convert startX/endX to startIndex/endIndex\n * and compute area if boundaries are provided.\n */\nexport function processUserAnnotations(\n annotations: PeakAnnotation[],\n xArray: number[],\n yArray: number[]\n): PeakAnnotation[] {\n return annotations.map((ann) => {\n // If startX/endX are provided, convert to indices\n if (ann.startX !== undefined && ann.endX !== undefined) {\n const startIndex = findClosestIndex(xArray, ann.startX);\n const endIndex = findClosestIndex(xArray, ann.endX);\n const index = findClosestIndex(xArray, ann.x);\n\n // Calculate area if not provided\n const area = ann._computed?.area ?? calculatePeakArea(xArray, yArray, startIndex, endIndex);\n\n return {\n ...ann,\n _computed: {\n ...ann._computed,\n index,\n startIndex,\n endIndex,\n area,\n },\n };\n }\n return ann;\n });\n}\n\n/**\n * Collect peaks with boundary information from both auto-detected peaks and user-provided annotations.\n * User-provided annotations with startIndex/endIndex or startX/endX are included for boundary marker rendering.\n */\nexport function collectPeaksWithBoundaryData(\n allDetectedPeaks: { peaks: PeakAnnotation[]; seriesIndex: number }[],\n annotations: PeakAnnotation[],\n processedSeries: { x: number[]; y: number[] }[]\n): PeakDataWithSeries[] {\n const peaksWithData: PeakDataWithSeries[] = [];\n\n // Add auto-detected peaks\n allDetectedPeaks.forEach(({ peaks, seriesIndex }) => {\n peaksWithData.push({\n peaks,\n seriesIndex,\n x: processedSeries[seriesIndex].x,\n y: processedSeries[seriesIndex].y,\n });\n });\n\n // Add user-provided annotations that have boundary info (_computed.startIndex and _computed.endIndex)\n // Note: annotations with startX/endX should already be processed to have _computed fields\n const annotationsWithBoundaries = annotations.filter(\n (ann) => ann._computed?.startIndex !== undefined && ann._computed?.endIndex !== undefined\n );\n if (annotationsWithBoundaries.length > 0 && processedSeries.length > 0) {\n peaksWithData.push({\n peaks: annotationsWithBoundaries,\n seriesIndex: 0, // User annotations apply to first series by default\n x: processedSeries[0].x,\n y: processedSeries[0].y,\n });\n }\n\n return peaksWithData;\n}\n\n/**\n * Build the extra content for Plotly hovertemplate from series metadata.\n * Displays all metadata fields as key: value pairs.\n */\nexport function buildHoverExtraContent(\n seriesName: string,\n metadata?: Record<string, unknown>\n): string {\n if (!metadata) return seriesName;\n\n const metaLines: string[] = [];\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== undefined && value !== null && value !== \"\") {\n // Format the key as Title Case (e.g., \"sampleName\" -> \"Sample Name\")\n const formattedKey = key\n .replace(/([A-Z])/g, \" $1\")\n .replace(/^./, (s) => s.toUpperCase())\n .trim();\n metaLines.push(`${formattedKey}: ${String(value)}`);\n }\n }\n\n if (metaLines.length > 0) {\n return `${seriesName}<br>${metaLines.join(\"<br>\")}`;\n }\n return seriesName;\n}\n\n/**\n * Validate and sanitize series data.\n * - Ensures x and y arrays have the same length (truncates to shorter)\n * - Replaces NaN and Infinity values with 0\n */\nexport function validateSeriesData(\n x: number[],\n y: number[]\n): { x: number[]; y: number[] } {\n // Ensure arrays have same length\n const length = Math.min(x.length, y.length);\n const validX = x.slice(0, length);\n const validY = y.slice(0, length);\n\n // Sanitize NaN and Infinity values\n const sanitizedY = validY.map((val) => (Number.isFinite(val) ? val : 0));\n const sanitizedX = validX.map((val) => (Number.isFinite(val) ? val : 0));\n\n return { x: sanitizedX, y: sanitizedY };\n}\n\n/**\n * Apply baseline correction to signal data\n */\nexport function applyBaselineCorrection(\n y: number[],\n method: BaselineCorrectionMethod,\n windowSize: number = 50\n): number[] {\n if (method === \"none\" || y.length === 0) return y;\n\n if (method === \"linear\") {\n // Linear baseline from first to last point\n // Handle single-point case to avoid division by zero\n if (y.length === 1) {\n return [0]; // Single point baseline-corrected to zero\n }\n const slope = (y[y.length - 1] - y[0]) / (y.length - 1);\n return y.map((val, i) => val - (y[0] + slope * i));\n }\n\n if (method === \"rolling\") {\n // Rolling minimum baseline\n const baseline: number[] = [];\n const halfWindow = Math.floor(windowSize / 2);\n\n for (let i = 0; i < y.length; i++) {\n const start = Math.max(0, i - halfWindow);\n const end = Math.min(y.length, i + halfWindow + 1);\n const windowSlice = y.slice(start, end);\n baseline.push(Math.min(...windowSlice));\n }\n\n return y.map((val, i) => val - baseline[i]);\n }\n\n return y;\n}\n\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useMemo, useRef } from \"react\";\n\nimport { COLORS, CHART_COLORS } from \"../../../utils/colors\";\n\nimport {\n groupOverlappingPeaks,\n createGroupAnnotations,\n} from \"./annotations\";\nimport { createBoundaryMarkerTraces } from \"./boundaryMarkers\";\nimport { CHROMATOGRAM_LAYOUT } from \"./constants\";\nimport {\n validateSeriesData,\n applyBaselineCorrection,\n buildHoverExtraContent,\n collectPeaksWithBoundaryData,\n processUserAnnotations,\n} from \"./dataProcessing\";\nimport { detectPeaks } from \"./peakDetection\";\n\nimport type {\n ChromatogramSeries,\n PeakAnnotation,\n BaselineCorrectionMethod,\n BoundaryMarkerStyle,\n BoundaryMarkerType,\n PeakDetectionOptions,\n ChromatogramChartProps,\n PeakWithMeta,\n} from \"./types\";\nimport \"./ChromatogramChart.scss\";\n\n// Re-export types for external use\nexport type {\n ChromatogramSeries,\n PeakAnnotation,\n BaselineCorrectionMethod,\n BoundaryMarkerStyle,\n BoundaryMarkerType,\n PeakDetectionOptions,\n ChromatogramChartProps,\n};\n\n\nconst ChromatogramChart: React.FC<ChromatogramChartProps> = ({\n series,\n width = 900,\n height = 500,\n title,\n xAxisTitle = \"Retention Time (min)\",\n yAxisTitle = \"Signal (mAU)\",\n annotations = [],\n xRange,\n yRange,\n showLegend = true,\n showGridX = true,\n showGridY = true,\n showMarkers = false,\n markerSize = 4,\n showCrosshairs = false,\n baselineCorrection = \"none\",\n baselineWindowSize = 50,\n peakDetectionOptions,\n showPeakAreas = false,\n boundaryMarkers = \"none\",\n annotationOverlapThreshold = 0.4,\n showExportButton = true,\n}) => {\n // Derive peak detection state from options\n const enablePeakDetection = peakDetectionOptions !== undefined;\n const plotRef = useRef<HTMLDivElement>(null);\n\n // Memoize processed series with baseline correction\n const processedSeries = useMemo(() => {\n return series.map((s) => {\n const validated = validateSeriesData(s.x, s.y);\n return {\n ...s,\n x: validated.x,\n y: applyBaselineCorrection(validated.y, baselineCorrection, baselineWindowSize),\n };\n });\n }, [series, baselineCorrection, baselineWindowSize]);\n\n // Process user annotations to convert startX/endX to indices and compute areas\n const processedAnnotations = useMemo(() => {\n if (annotations.length === 0 || processedSeries.length === 0) {\n return annotations;\n }\n // Use first series data for index lookup (user annotations apply to first series)\n const { x, y } = processedSeries[0];\n return processUserAnnotations(annotations, x, y);\n }, [annotations, processedSeries]);\n\n // Memoize peak detection results\n const allDetectedPeaks = useMemo(() => {\n const peaks: { peaks: PeakAnnotation[]; seriesIndex: number }[] = [];\n if (enablePeakDetection && peakDetectionOptions) {\n processedSeries.forEach((s, index) => {\n const detected = detectPeaks(s.x, s.y, peakDetectionOptions);\n if (detected.length > 0) {\n peaks.push({ peaks: detected, seriesIndex: index });\n }\n });\n }\n return peaks;\n }, [processedSeries, enablePeakDetection, peakDetectionOptions]);\n\n useEffect(() => {\n const currentRef = plotRef.current;\n if (!currentRef || series.length === 0) return;\n\n // Build trace data with auto-assigned colors\n const plotData: Plotly.Data[] = processedSeries.map((s, index) => {\n const traceColor = s.color || CHART_COLORS[index % CHART_COLORS.length];\n const extraContent = buildHoverExtraContent(s.name, s.metadata);\n\n const trace: Plotly.Data = {\n x: s.x,\n y: s.y,\n type: \"scatter\" as const,\n mode: showMarkers ? \"lines+markers\" as const : \"lines\" as const,\n name: s.name,\n line: {\n color: traceColor,\n width: 1.5,\n },\n hovertemplate: `%{x:.2f} ${xAxisTitle}<br>%{y:.2f} ${yAxisTitle}<extra>${extraContent}</extra>`,\n };\n if (showMarkers) {\n trace.marker = {\n size: markerSize,\n color: traceColor,\n };\n }\n return trace;\n });\n\n // Add peak boundary markers if enabled\n if (boundaryMarkers !== \"none\") {\n const peaksWithData = collectPeaksWithBoundaryData(allDetectedPeaks, processedAnnotations, processedSeries);\n if (peaksWithData.length > 0) {\n const boundaryTraces = createBoundaryMarkerTraces(peaksWithData);\n plotData.push(...boundaryTraces);\n }\n }\n\n // Collect all peaks for unified staggering logic\n const allPeaksWithMeta: PeakWithMeta[] = [];\n\n // Add user-defined annotations (seriesIndex -1 indicates user-defined)\n processedAnnotations.forEach((ann) => {\n allPeaksWithMeta.push({ peak: ann, seriesIndex: -1 });\n });\n\n // Add auto-detected peaks if enabled\n if (showPeakAreas && enablePeakDetection) {\n allDetectedPeaks.forEach(({ peaks, seriesIndex }) => {\n peaks.forEach((peak) => {\n allPeaksWithMeta.push({ peak, seriesIndex });\n });\n });\n }\n\n // Group all overlapping peaks and create annotations with staggering\n const groups = groupOverlappingPeaks(allPeaksWithMeta, annotationOverlapThreshold);\n const plotlyAnnotations: Partial<Plotly.Annotations>[] = [];\n\n for (const group of groups) {\n plotlyAnnotations.push(...createGroupAnnotations(group));\n }\n\n const layout: Partial<Plotly.Layout> = {\n title: title\n ? {\n text: title,\n font: {\n size: 20,\n family: \"Inter, sans-serif\",\n color: COLORS.BLACK_900,\n },\n }\n : undefined,\n width,\n height,\n margin: {\n l: CHROMATOGRAM_LAYOUT.MARGIN_LEFT,\n r: CHROMATOGRAM_LAYOUT.MARGIN_RIGHT,\n b: CHROMATOGRAM_LAYOUT.MARGIN_BOTTOM,\n t: title ? CHROMATOGRAM_LAYOUT.MARGIN_TOP_WITH_TITLE : CHROMATOGRAM_LAYOUT.MARGIN_TOP_NO_TITLE,\n pad: CHROMATOGRAM_LAYOUT.MARGIN_PAD,\n },\n paper_bgcolor: COLORS.WHITE,\n plot_bgcolor: COLORS.WHITE,\n font: { family: \"Inter, sans-serif\" },\n hovermode: showCrosshairs ? \"x\" as const : \"x unified\" as const,\n dragmode: \"zoom\" as const,\n xaxis: {\n title: {\n text: xAxisTitle,\n font: { size: 14, color: COLORS.BLACK_600, family: \"Inter, sans-serif\" },\n standoff: 15,\n },\n showgrid: showGridX,\n gridcolor: COLORS.GREY_200,\n linecolor: COLORS.BLACK_900,\n linewidth: 1,\n range: xRange,\n autorange: !xRange,\n zeroline: false,\n tickfont: { size: 12, color: COLORS.BLACK_900, family: \"Inter, sans-serif\" },\n showspikes: showCrosshairs,\n spikemode: \"across\" as const,\n spikesnap: \"cursor\" as const,\n spikecolor: COLORS.GREY_500,\n spikethickness: 1,\n spikedash: \"dot\" as const,\n },\n yaxis: {\n title: {\n text: yAxisTitle,\n font: { size: 14, color: COLORS.BLACK_600, family: \"Inter, sans-serif\" },\n standoff: 10,\n },\n showgrid: showGridY,\n gridcolor: COLORS.GREY_200,\n linecolor: COLORS.BLACK_900,\n linewidth: 1,\n range: yRange,\n autorange: !yRange,\n zeroline: false,\n tickfont: { size: 12, color: COLORS.BLACK_900, family: \"Inter, sans-serif\" },\n showspikes: showCrosshairs,\n spikemode: \"across\" as const,\n spikesnap: \"cursor\" as const,\n spikecolor: COLORS.GREY_500,\n spikethickness: 1,\n spikedash: \"dot\" as const,\n },\n legend: {\n x: 0.5,\n y: -0.15,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n orientation: \"h\" as const,\n font: { size: 12, color: COLORS.BLACK_900, family: \"Inter, sans-serif\" },\n },\n showlegend: showLegend && series.length > 1,\n annotations: plotlyAnnotations,\n };\n\n const config: Partial<Plotly.Config> = {\n responsive: true,\n displayModeBar: true,\n displaylogo: false,\n modeBarButtonsToRemove: [\n \"lasso2d\",\n \"select2d\",\n ...(showExportButton ? [] : [\"toImage\"] as Plotly.ModeBarDefaultButtons[]),\n ] as Plotly.ModeBarDefaultButtons[],\n ...(showExportButton && {\n toImageButtonOptions: {\n format: \"png\",\n filename: \"chromatogram\",\n width: width,\n height: height,\n },\n }),\n };\n\n Plotly.newPlot(currentRef, plotData, layout, config);\n\n return () => {\n if (currentRef) {\n Plotly.purge(currentRef);\n }\n };\n }, [\n processedSeries, allDetectedPeaks, series.length, width, height, title, xAxisTitle, yAxisTitle,\n processedAnnotations, xRange, yRange, showLegend, showGridX, showGridY, showMarkers, markerSize,\n showCrosshairs, enablePeakDetection, peakDetectionOptions, showPeakAreas, boundaryMarkers,\n annotationOverlapThreshold, showExportButton,\n ]);\n\n return (\n <div className=\"chromatogram-chart-container\">\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n </div>\n );\n};\n\nexport { ChromatogramChart };\n\n","import { COLORS } from \"@utils/colors\";\nimport Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\nimport \"./DotPlot.scss\";\n\ntype MarkerSymbol =\n | \"circle\"\n | \"square\"\n | \"diamond\"\n | \"triangle-up\"\n | \"triangle-down\"\n | \"star\";\n\ninterface DotPlotDataSeries {\n x: number[];\n y: number[];\n name: string;\n color?: string;\n symbol?: MarkerSymbol;\n size?: number;\n}\n\ntype DotPlotVariant = \"default\" | \"stacked\";\n\ntype DotPlotProps = {\n dataSeries: DotPlotDataSeries | DotPlotDataSeries[];\n width?: number;\n height?: number;\n title?: string;\n xTitle?: string;\n yTitle?: string;\n variant?: DotPlotVariant;\n markerSize?: number;\n};\n\nconst DotPlot: React.FC<DotPlotProps> = ({\n dataSeries,\n width = 1000,\n height = 600,\n title = \"Dot Plot\",\n xTitle = \"Columns\",\n yTitle = \"Rows\",\n variant = \"default\",\n markerSize = 8,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const seriesArray = useMemo(\n () => (Array.isArray(dataSeries) ? dataSeries : [dataSeries]),\n [dataSeries],\n );\n\n const defaultColors = useMemo(\n () => [\n COLORS.ORANGE,\n COLORS.RED,\n COLORS.GREEN,\n COLORS.BLUE,\n COLORS.YELLOW,\n COLORS.PURPLE,\n ],\n [],\n );\n\n const defaultSymbols: MarkerSymbol[] = useMemo(\n () => [\n \"circle\",\n \"square\",\n \"diamond\",\n \"triangle-up\",\n \"triangle-down\",\n \"star\",\n ],\n [],\n );\n\n const seriesWithColors = useMemo(() => {\n return seriesArray.map((series, index) => {\n if (variant === \"default\") {\n // Default variant: all circles, use first color or series color\n return {\n ...series,\n color: series.color || defaultColors[0],\n symbol: \"circle\" as MarkerSymbol,\n size: series.size || markerSize,\n };\n } else {\n // Stacked variant: different symbols and colors for each series\n return {\n ...series,\n color: series.color || defaultColors[index % defaultColors.length],\n symbol:\n series.symbol || defaultSymbols[index % defaultSymbols.length],\n size: series.size || markerSize,\n };\n }\n });\n }, [seriesArray, variant, markerSize, defaultColors, defaultSymbols]);\n\n const gridColor = COLORS.GREY_200;\n\n const plotData = useMemo(\n () =>\n seriesWithColors.map((series) => ({\n type: \"scatter\" as const,\n x: series.x,\n y: series.y,\n mode: \"markers\" as const,\n name: series.name,\n marker: {\n color: series.color,\n size: series.size,\n symbol: series.symbol,\n line: {\n color: COLORS.WHITE,\n width: 1,\n },\n },\n hovertemplate: `${xTitle}: %{x}<br>${yTitle}: %{y}<extra>${series.name}</extra>`,\n })),\n [seriesWithColors, xTitle, yTitle],\n );\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: COLORS.GREY_200,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: COLORS.BLACK_900,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n linecolor: COLORS.BLACK_900,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [],\n );\n\n const titleOptions = useMemo(\n () => ({\n text: title,\n x: 0.5,\n y: 0.95,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n font: {\n size: 32,\n weight: 600,\n family: \"Inter, sans-serif\",\n color: COLORS.BLACK_900,\n lineheight: 1.2,\n standoff: 30,\n },\n }),\n [title],\n );\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n const layout = {\n width,\n height,\n font: {\n family: \"Inter, sans-serif\",\n },\n title: titleOptions,\n margin: { l: 80, r: 40, b: 80, t: 80, pad: 0 },\n showlegend: true,\n legend: {\n x: 0.5,\n y: -0.2,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n orientation: \"h\" as const,\n font: {\n size: 13,\n color: COLORS.BLUE_900,\n family: \"Inter, sans-serif\",\n weight: 500,\n lineheight: 18,\n },\n },\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: COLORS.BLACK_600,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 15,\n },\n gridcolor: gridColor,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: COLORS.BLACK_600,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 15,\n },\n gridcolor: gridColor,\n ...tickOptions,\n },\n paper_bgcolor: COLORS.WHITE,\n plot_bgcolor: COLORS.WHITE,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, plotData, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [width, height, xTitle, yTitle, plotData, titleOptions, tickOptions, gridColor]);\n\n return (\n <div className=\"dotplot-container\" style={{ width: width }}>\n <div\n ref={plotRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n margin: \"0\",\n }}\n />\n </div>\n );\n};\n\nexport { DotPlot };\nexport type { DotPlotDataSeries, DotPlotProps, DotPlotVariant, MarkerSymbol };\n","/**\n * Plate format string constants for standard microplate configurations.\n */\nexport const PLATE_FORMAT_96 = \"96\" as const;\nexport const PLATE_FORMAT_384 = \"384\" as const;\nexport const PLATE_FORMAT_1536 = \"1536\" as const;\nexport const PLATE_FORMAT_CUSTOM = \"custom\" as const;\n\n/**\n * Plate format presets for standard microplate configurations.\n * - `\"96\"`: 8 rows × 12 columns (wells A1-H12)\n * - `\"384\"`: 16 rows × 24 columns (wells A1-P24)\n * - `\"1536\"`: 32 rows × 48 columns (wells A1-AF48)\n * - `\"custom\"`: User-defined dimensions via `rows` and `columns` props\n */\nexport type PlateFormat =\n | typeof PLATE_FORMAT_96\n | typeof PLATE_FORMAT_384\n | typeof PLATE_FORMAT_1536\n | typeof PLATE_FORMAT_CUSTOM;\n\n/**\n * Visualization mode for the plate map.\n * - `\"heatmap\"`: Displays quantitative values as a continuous color gradient.\n * Use for OD readings, fluorescence intensity, or other numeric measurements.\n * - `\"categorical\"`: Displays well types with discrete colors.\n * Use for showing sample types, control positions, or experimental conditions.\n */\nexport type VisualizationMode = \"heatmap\" | \"categorical\";\n\n/**\n * Well type for categorical visualization.\n * Common types include:\n * - `\"sample\"`: Test samples (blue by default)\n * - `\"control\"`: Positive/negative controls (red by default)\n * - `\"empty\"`: Unused wells (light gray by default)\n *\n * Custom types can be added and colored via the `categoryColors` prop.\n */\nexport type WellType = \"sample\" | \"control\" | \"empty\" | string;\n\n/**\n * Color scale definition for the heatmap visualization mode.\n *\n * Can be:\n * - A named Plotly colorscale (e.g., \"Viridis\", \"Blues\", \"Hot\")\n * - An array of [position, color] tuples where position is 0-1\n *\n * @example\n * // Named colorscale\n * colorScale=\"Viridis\"\n *\n * @example\n * // Custom gradient\n * colorScale={[\n * [0, \"#313695\"], // Dark blue at min\n * [0.5, \"#ffffbf\"], // Yellow at midpoint\n * [1, \"#a50026\"], // Dark red at max\n * ]}\n */\nexport type ColorScale = string | Array<[number, string]>;\n\n/**\n * Position for the legend display.\n * - `\"right\"`: Legend appears to the right of the plate (default)\n * - `\"bottom\"`: Legend appears below the plate\n * - `\"left\"`: Legend appears to the left of the plate\n * - `\"top\"`: Legend appears above the plate\n */\nexport type LegendPosition = \"right\" | \"bottom\" | \"left\" | \"top\";\n\n/**\n * Well data for individual wells.\n *\n * @example\n * // Well with a single numeric value\n * { wellId: \"A1\", values: { \"Fluorescence\": 1500 } }\n *\n * @example\n * // Well with multiple values (creates multiple layers)\n * { wellId: \"A1\", values: { \"Raw\": 1500, \"Normalized\": 0.85, \"Status\": \"positive\" } }\n *\n * @example\n * // Well with tooltip-only data\n * { wellId: \"A1\", values: { \"Value\": 500 }, tooltipData: { compound: \"Drug A\", concentration: \"10µM\" } }\n */\nexport interface WellData {\n /**\n * Well identifier in standard microplate notation.\n * - Single letter + number for 96/384-well: \"A1\", \"H12\", \"P24\"\n * - Double letter + number for 1536-well: \"A1\", \"AA1\", \"AF48\"\n * Case-insensitive (\"a1\" and \"A1\" are equivalent).\n */\n wellId: string;\n /**\n * Named values for the well. Each key can become a visualization layer.\n *\n * - Numeric values: Displayed using heatmap visualization\n * - String values: Displayed using categorical visualization\n * - null: Empty/no data for that property\n *\n * All values are shown in the tooltip regardless of which layer is active.\n *\n * @example\n * // Well with multiple measurement values (numeric)\n * { wellId: \"A1\", values: { \"Raw\": 1500, \"Normalized\": 0.85, \"Z-Score\": 1.2 } }\n *\n * @example\n * // Well with categorical values (string)\n * { wellId: \"A1\", values: { \"Status\": \"positive\", \"QC\": \"pass\" } }\n *\n * @example\n * // Mixed numeric and categorical\n * { wellId: \"A1\", values: { \"Fluorescence\": 1500, \"Status\": \"positive\" } }\n */\n values?: Record<string, string | number | null>;\n /**\n * Optional data for tooltip display only (not visualized as layers).\n * Keys become labels, values are displayed.\n *\n * @example\n * { tooltipData: { sampleId: \"S001\", compound: \"Drug A\", concentration: \"10µM\" } }\n */\n tooltipData?: Record<string, unknown>;\n}\n\n/**\n * Configuration for auto-generated layers when using WellData with `values`.\n *\n * When wells have multiple values (via the `values` property), layers are\n * auto-generated from the unique keys. Use LayerConfig to customize the\n * display name, visualization mode, and color scale for each layer.\n *\n * @example\n * // Configure layers for wells with { values: { \"Raw\": 100, \"Normalized\": 0.5 } }\n * const layerConfigs: LayerConfig[] = [\n * { id: \"Raw\", name: \"Raw Data\", colorScale: \"Blues\" },\n * { id: \"Normalized\", name: \"Normalized Values\", valueMin: 0, valueMax: 1 },\n * ];\n */\nexport interface LayerConfig {\n /** Layer ID (must match a key in WellData.values) */\n id: string;\n /** Display name for the layer (defaults to id if not provided) */\n name?: string;\n /** Visualization mode for this layer */\n visualizationMode?: VisualizationMode;\n /** Color scale for this layer (for heatmap mode) */\n colorScale?: ColorScale;\n /** Minimum value for color scaling */\n valueMin?: number;\n /** Maximum value for color scaling */\n valueMax?: number;\n /** Value unit suffix for tooltips and colorbar (e.g., \"RFU\", \"%\"). A space is automatically added before the unit. */\n valueUnit?: string;\n /**\n * Custom colors for categorical visualization mode.\n * Keys are category values (strings from `values`), values are hex colors.\n * Merged with DEFAULT_CATEGORY_COLORS.\n */\n categoryColors?: Record<string, string>;\n}\n\n/**\n * Configuration for legend styling and positioning.\n *\n * @example\n * // Legend on the bottom with custom styling\n * legendConfig={{\n * position: \"bottom\",\n * fontSize: 14,\n * itemSpacing: 12,\n * swatchSize: 20,\n * }}\n */\nexport interface LegendConfig {\n /**\n * Position of the legend relative to the plate.\n * @default \"right\"\n */\n position?: LegendPosition;\n /**\n * Font size for legend labels in pixels.\n * @default 12\n */\n fontSize?: number;\n /**\n * Spacing between legend items in pixels.\n * @default 4\n */\n itemSpacing?: number;\n /**\n * Size of the color swatch in pixels.\n * @default 16\n */\n swatchSize?: number;\n /**\n * Title to display above the legend.\n */\n title?: string;\n}\n\n/**\n * A region to highlight on the plate (e.g., controls, sample areas, empty wells)\n */\nexport interface PlateRegion {\n /** Unique identifier for the region */\n id: string;\n /** Display name for the region (shown in legend) */\n name: string;\n /**\n * Wells included in this region using range notation.\n * Format: \"StartWell:EndWell\" (e.g., \"A1:B6\" for a rectangular block from A1 to B6)\n */\n wells: string;\n /** Border color for the region highlight */\n borderColor?: string;\n /** Border width in pixels (default: 2) */\n borderWidth?: number;\n /** Optional fill color with transparency (e.g., \"rgba(255, 0, 0, 0.1)\") */\n fillColor?: string;\n}\n\n/**\n * Props for PlateMap component\n */\nexport interface PlateMapProps {\n /**\n * Well data array as WellData objects with wellId and values.\n *\n * If wells have multiple values (via `values` property), layers are\n * auto-generated for each unique key, enabling layer toggling.\n */\n data?: WellData[];\n\n /**\n * Configuration for auto-generated layers when using WellData with `values`.\n * Use this to customize display names, colors, and ranges for each layer.\n * Only used when `data` contains wells with `values` property.\n */\n layerConfigs?: LayerConfig[];\n\n /**\n * Initial layer ID to display when the component mounts.\n * If not provided, defaults to the first layer.\n */\n initialLayerId?: string;\n\n /**\n * Optional callback notified when the active layer changes.\n * This is purely informational - the component manages layer state internally.\n * Use this for logging, analytics, or syncing with external state.\n */\n onLayerChange?: (layerId: string) => void;\n\n /** Plate format preset (default: \"96\") */\n plateFormat?: PlateFormat;\n\n /** Number of rows for custom format (default: 8 for 96-well, 16 for 384-well) */\n rows?: number;\n\n /** Number of columns for custom format (default: 12 for 96-well, 24 for 384-well) */\n columns?: number;\n\n /**\n * Visualization mode (default: \"heatmap\")\n * - \"heatmap\": Display quantitative values with color gradient\n * - \"categorical\": Display well types with discrete colors\n */\n visualizationMode?: VisualizationMode;\n\n /**\n * Custom colors for categorical visualization mode.\n * Keys are well types, values are hex colors.\n * Merged with DEFAULT_CATEGORY_COLORS.\n */\n categoryColors?: Record<string, string>;\n\n /**\n * Regions to highlight on the plate (e.g., controls, sample areas, empty wells).\n * Each region can specify wells and styling for visual distinction.\n */\n regions?: PlateRegion[];\n\n /** Chart title */\n title?: string;\n\n /** X-axis title (e.g., \"Columns\") */\n xTitle?: string;\n\n /** Y-axis title (e.g., \"Rows\") */\n yTitle?: string;\n\n /** Custom x-axis labels (overrides auto-generated column numbers) */\n xLabels?: string[] | number[];\n\n /** Custom y-axis labels (overrides auto-generated row letters) */\n yLabels?: string[] | number[];\n\n /** Color scale for the heatmap (only used in heatmap mode) */\n colorScale?: ColorScale;\n\n /** Minimum value for color scale (auto-calculated if not provided) */\n valueMin?: number;\n\n /** Maximum value for color scale (auto-calculated if not provided) */\n valueMax?: number;\n\n /** Color for empty/null wells (default: \"#f0f0f0\") */\n emptyWellColor?: string;\n\n /** Show color bar legend for heatmap mode (default: true) */\n showColorBar?: boolean;\n\n /** Show categorical legend for categorical mode (default: true) */\n showLegend?: boolean;\n\n /**\n * Configuration for legend positioning and styling.\n * Applies to both heatmap colorbar and categorical legend.\n *\n * @example\n * // Position legend at bottom with larger text\n * legendConfig={{ position: \"bottom\", fontSize: 14 }}\n */\n legendConfig?: LegendConfig;\n\n /** Chart width in pixels (default: 800) */\n width?: number;\n\n /** Chart height in pixels (default: 500) */\n height?: number;\n\n /** Number of decimal places for values (default: 0) */\n precision?: number;\n\n /**\n * Marker shape for wells (default: \"circle\")\n * - \"circle\": Round markers, ideal for plate-based data\n * - \"square\": Square markers, ideal for generic heatmaps\n */\n markerShape?: \"circle\" | \"square\";\n\n /**\n * Callback when a well/cell is clicked.\n * @param wellData - The full well data object including wellId, values, and tooltipData\n */\n onWellClick?: (wellData: WellData) => void;\n}\n\n/**\n * Result of converting WellData array to grids\n */\nexport interface WellDataGridResult {\n /** 2D grid of numeric values for the active layer */\n grid: (number | null)[][];\n /** 2D grid of string values for categorical visualization */\n categories: (string | null)[][];\n /** Map of wellId -> all values (for tooltip display) */\n allValues: Map<string, Record<string, string | number | null>>;\n /** Map of wellId -> tooltipData */\n tooltipData: Map<string, Record<string, unknown>>;\n}\n\n","import {\n PLATE_FORMAT_96,\n PLATE_FORMAT_384,\n PLATE_FORMAT_1536,\n} from \"./types\";\n\n/**\n * Default category colors for well types in categorical visualization mode.\n * Override these by passing custom colors via the `categoryColors` prop.\n */\nexport const DEFAULT_CATEGORY_COLORS: Record<string, string> = {\n sample: \"#4575b4\", // Blue\n control: \"#d73027\", // Red\n empty: \"#f0f0f0\", // Light gray\n};\n\n/**\n * Plate dimension configurations\n */\nexport const PLATE_CONFIGS: Record<\n typeof PLATE_FORMAT_96 | typeof PLATE_FORMAT_384 | typeof PLATE_FORMAT_1536,\n { rows: number; columns: number }\n> = {\n [PLATE_FORMAT_96]: { rows: 8, columns: 12 },\n [PLATE_FORMAT_384]: { rows: 16, columns: 24 },\n [PLATE_FORMAT_1536]: { rows: 32, columns: 48 },\n};\n\n/**\n * Default color scale (blue to red gradient suitable for plate data)\n */\nexport const DEFAULT_COLOR_SCALE: Array<[number, string]> = [\n [0, \"#313695\"],\n [0.1, \"#4575b4\"],\n [0.2, \"#74add1\"],\n [0.3, \"#abd9e9\"],\n [0.4, \"#e0f3f8\"],\n [0.5, \"#ffffbf\"],\n [0.6, \"#fee090\"],\n [0.7, \"#fdae61\"],\n [0.8, \"#f46d43\"],\n [0.9, \"#d73027\"],\n [1, \"#a50026\"],\n];\n\n/**\n * UI color constants for PlateMap component styling\n */\nexport const COLORS = {\n /** Primary blue color for active states */\n primary: \"#4575b4\",\n /** White background */\n white: \"#fff\",\n /** Light gray for borders */\n borderLight: \"#ccc\",\n /** Dark gray for text */\n textDark: \"#333\",\n /** Default region border color */\n regionBorder: \"#000\",\n /** Default empty well color (light gray) */\n emptyWell: \"#f0f0f0\",\n} as const;\n\n/**\n * Named Plotly colorscales converted to array format.\n * Used to extend colorscales with emptyWellColor when there are null values.\n * Reference: https://plotly.com/javascript/colorscales/\n */\nexport const NAMED_COLORSCALES: Record<string, Array<[number, string]>> = {\n Viridis: [\n [0, \"#440154\"],\n [0.25, \"#414487\"],\n [0.5, \"#2a788e\"],\n [0.75, \"#22a884\"],\n [1, \"#7ad151\"],\n ],\n Blues: [\n [0, \"#f7fbff\"],\n [0.25, \"#c6dbef\"],\n [0.5, \"#6baed6\"],\n [0.75, \"#2171b5\"],\n [1, \"#08306b\"],\n ],\n RdBu: [\n [0, \"#67001f\"],\n [0.25, \"#d6604d\"],\n [0.5, \"#f7f7f7\"],\n [0.75, \"#4393c3\"],\n [1, \"#053061\"],\n ],\n Greens: [\n [0, \"#f7fcf5\"],\n [0.25, \"#c7e9c0\"],\n [0.5, \"#74c476\"],\n [0.75, \"#238b45\"],\n [1, \"#00441b\"],\n ],\n Reds: [\n [0, \"#fff5f0\"],\n [0.25, \"#fcbba1\"],\n [0.5, \"#fb6a4a\"],\n [0.75, \"#cb181d\"],\n [1, \"#67000d\"],\n ],\n Greys: [\n [0, \"#ffffff\"],\n [0.25, \"#d9d9d9\"],\n [0.5, \"#969696\"],\n [0.75, \"#525252\"],\n [1, \"#000000\"],\n ],\n Hot: [\n [0, \"#000000\"],\n [0.33, \"#e60000\"],\n [0.66, \"#ffff00\"],\n [1, \"#ffffff\"],\n ],\n YlGnBu: [\n [0, \"#ffffd9\"],\n [0.25, \"#c7e9b4\"],\n [0.5, \"#41b6c4\"],\n [0.75, \"#225ea8\"],\n [1, \"#081d58\"],\n ],\n YlOrRd: [\n [0, \"#ffffcc\"],\n [0.25, \"#fed976\"],\n [0.5, \"#fd8d3c\"],\n [0.75, \"#e31a1c\"],\n [1, \"#800026\"],\n ],\n Plasma: [\n [0, \"#0d0887\"],\n [0.25, \"#7e03a8\"],\n [0.5, \"#cc4778\"],\n [0.75, \"#f89540\"],\n [1, \"#f0f921\"],\n ],\n};\n\n/**\n * Numeric constants for PlateMap calculations and layout\n */\nexport const PLATEMAP_CONSTANTS = {\n /** Maximum random data value for demonstration */\n MAX_RANDOM_VALUE: 50000,\n /** Sentinel value ratio for empty wells below data range */\n SENTINEL_RATIO: 0.01,\n /** Color scale data start ratio for extended scales */\n COLOR_SCALE_THRESHOLD: 0.99,\n /** Small epsilon for color scale band calculations */\n COLOR_SCALE_EPSILON: 0.001,\n /** Proportions for multi-value well display */\n MULTI_VALUE_PRIMARY_RATIO: 0.575,\n MULTI_VALUE_SECONDARY_RATIO: 0.425,\n /** Font sizes */\n FONT_SIZE_LARGE: 11,\n /** Offset for centering labels */\n LABEL_CENTER_OFFSET: -0.5,\n /** Opacity values */\n HOVER_OPACITY_FAINT: 0.15,\n HOVER_OPACITY_VISIBLE: 0.85,\n /** Layout margins */\n MARGIN_TOP: 70,\n MARGIN_RIGHT: 50,\n MARGIN_BOTTOM: 40,\n MARGIN_LEFT: 80,\n /** Colorbar dimensions */\n COLORBAR_LENGTH: 130,\n COLORBAR_X_OFFSET: 70,\n /** Domain position constants for legend placement */\n DOMAIN_COLORBAR_OFFSET: 0.15,\n DOMAIN_COLORBAR_END: 0.85,\n} as const;\n","import { PLATEMAP_CONSTANTS } from \"./constants\";\n\nimport type { WellData, WellDataGridResult, LayerConfig, LegendPosition } from \"./types\";\n\n/** ASCII code for uppercase 'A' */\nconst ASCII_UPPERCASE_A = 65;\n/** Number of letters in the alphabet */\nconst ALPHABET_LENGTH = 26;\n\n/**\n * Generate row labels (A, B, C, ... for 96-well; A-P for 384-well; A-AF for 1536-well)\n * For rows beyond Z (26), uses AA, AB, AC, etc.\n */\nexport function generateRowLabels(count: number): string[] {\n return Array.from({ length: count }, (_, i) =>\n i < ALPHABET_LENGTH\n ? String.fromCharCode(ASCII_UPPERCASE_A + i)\n : \"A\" + String.fromCharCode(ASCII_UPPERCASE_A + (i - ALPHABET_LENGTH))\n );\n}\n\n/**\n * Generate column labels (1, 2, 3, ...)\n */\nexport function generateColumnLabels(count: number): number[] {\n return Array.from({ length: count }, (_, i) => i + 1);\n}\n\n/**\n * Parse well ID to row and column indices\n * @param wellId - Well identifier (e.g., \"A1\", \"H12\", \"P24\", \"AA1\", \"AF48\")\n * @returns { row, col } zero-indexed\n */\nexport function parseWellId(wellId: string): { row: number; col: number } | null {\n // Match single letter (A-Z) or double letter (AA-AF) followed by 1-2 digits\n const match = wellId.match(/^([A-Z]{1,2})(\\d{1,2})$/i);\n if (!match) return null;\n\n const rowStr = match[1].toUpperCase();\n const row =\n rowStr.length === 1\n ? rowStr.charCodeAt(0) - ASCII_UPPERCASE_A\n : ALPHABET_LENGTH + (rowStr.charCodeAt(1) - ASCII_UPPERCASE_A);\n\n const col = parseInt(match[2], 10) - 1;\n\n return { row, col };\n}\n\n/** Parsed well position */\ninterface ParsedWellPosition {\n row: number;\n col: number;\n}\n\n/**\n * Checks if a parsed well position is within grid bounds.\n */\nfunction isValidWellPosition(\n parsed: ParsedWellPosition | null,\n rows: number,\n columns: number\n): parsed is ParsedWellPosition {\n if (!parsed) return false;\n const { row, col } = parsed;\n // Check bounds including >= 0 to prevent negative indices (e.g., \"A0\" -> col=-1)\n return row >= 0 && col >= 0 && row < rows && col < columns;\n}\n\n/**\n * Extracts the layer value from well values for the specified layer.\n */\nfunction extractLayerValue(\n values: Record<string, string | number | null> | undefined,\n layerId?: string\n): string | number | null {\n if (!values) return null;\n const effectiveLayerId = layerId ?? Object.keys(values)[0];\n return effectiveLayerId ? values[effectiveLayerId] : null;\n}\n\n/**\n * Stores the layer value in the appropriate grid based on its type.\n */\nfunction storeLayerValue(\n layerValue: string | number | null,\n row: number,\n col: number,\n grid: (number | null)[][],\n categories: (string | null)[][]\n): void {\n if (typeof layerValue === \"number\") {\n grid[row][col] = layerValue;\n } else if (typeof layerValue === \"string\") {\n categories[row][col] = layerValue;\n }\n}\n\n/**\n * Convert WellData array to 2D grids for a specific layer\n */\nexport function wellDataToGrid(\n wells: WellData[],\n rows: number,\n columns: number,\n layerId?: string\n): WellDataGridResult {\n // Initialize grids with nulls\n const grid: (number | null)[][] = Array.from({ length: rows }, () =>\n Array(columns).fill(null)\n );\n const categories: (string | null)[][] = Array.from({ length: rows }, () =>\n Array(columns).fill(null)\n );\n const allValues = new Map<string, Record<string, string | number | null>>();\n const tooltipData = new Map<string, Record<string, unknown>>();\n\n for (const well of wells) {\n const parsed = parseWellId(well.wellId);\n if (!isValidWellPosition(parsed, rows, columns)) continue;\n\n const wellIdUpper = well.wellId.toUpperCase();\n\n // Store all values for tooltip\n if (well.values) {\n allValues.set(wellIdUpper, well.values);\n }\n\n // Store tooltipData\n if (well.tooltipData) {\n tooltipData.set(wellIdUpper, well.tooltipData);\n }\n\n // Extract and store the layer value\n const layerValue = extractLayerValue(well.values, layerId);\n storeLayerValue(layerValue, parsed.row, parsed.col, grid, categories);\n }\n\n return { grid, categories, allValues, tooltipData };\n}\n\n/**\n * Calculate min/max values from grid, ignoring nulls\n */\nexport function calculateValueRange(grid: (number | null)[][]): { min: number; max: number } {\n let min = Infinity;\n let max = -Infinity;\n\n for (const row of grid) {\n for (const val of row) {\n if (val !== null && Number.isFinite(val)) {\n min = Math.min(min, val);\n max = Math.max(max, val);\n }\n }\n }\n\n // Handle case where all values are null\n if (!Number.isFinite(min)) min = 0;\n if (!Number.isFinite(max)) max = 1;\n\n // Ensure min < max\n if (min === max) {\n max = min + 1;\n }\n\n return { min, max };\n}\n\n/**\n * Check if WellData array contains multi-value wells (has `values` property)\n */\nexport function hasMultiValueWells(data: WellData[]): boolean {\n return data.some((well) => well.values && Object.keys(well.values).length > 0);\n}\n\n/**\n * Extract unique layer IDs from WellData array with `values`\n */\nexport function extractLayerIds(data: WellData[]): string[] {\n const layerIds = new Set<string>();\n for (const well of data) {\n if (well.values) {\n Object.keys(well.values).forEach((k) => layerIds.add(k));\n }\n }\n return [...layerIds];\n}\n\n/**\n * Check if a layer contains string values (categorical) or numeric values (heatmap)\n */\nexport function isStringValueLayer(data: WellData[], layerId: string): boolean {\n for (const well of data) {\n const val = well.values?.[layerId];\n if (typeof val === \"string\") {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Extract layer configs from multi-value WellData array.\n * Creates a layer entry for each unique key found in the `values` objects.\n * Merges with user-provided layerConfigs to apply custom settings.\n */\nexport function extractLayers(\n data: WellData[],\n layerConfigs?: LayerConfig[]\n): LayerConfig[] {\n const layerIds = extractLayerIds(data);\n\n return layerIds.map((id) => {\n const config = layerConfigs?.find((c) => c.id === id);\n const isStringLayer = isStringValueLayer(data, id);\n\n return {\n id,\n name: config?.name ?? id,\n // Auto-set categorical mode for string layers if not explicitly configured\n visualizationMode: config?.visualizationMode ?? (isStringLayer ? \"categorical\" : undefined),\n colorScale: config?.colorScale,\n valueMin: config?.valueMin,\n valueMax: config?.valueMax,\n valueUnit: config?.valueUnit,\n categoryColors: config?.categoryColors,\n };\n });\n}\n\n/**\n * Parse region wells from range notation like \"A1:B6\"\n * Returns the bounding box coordinates for overlay rendering\n */\nexport function parseRegionWells(\n wells: string,\n rowLabels: readonly (string | number)[],\n colLabels: readonly (string | number)[]\n): { minRow: number; maxRow: number; minCol: number; maxCol: number } | null {\n // Parse range notation like \"A1:B6\"\n const rangeMatch = wells.match(/^([A-Z]{1,2})(\\d{1,2}):([A-Z]{1,2})(\\d{1,2})$/i);\n if (!rangeMatch) {\n return null;\n }\n\n // The regex above guarantees valid well ID format, so parseWellId will always succeed\n const startWell = parseWellId(`${rangeMatch[1]}${rangeMatch[2]}`)!;\n const endWell = parseWellId(`${rangeMatch[3]}${rangeMatch[4]}`)!;\n\n const minRow = Math.min(startWell.row, endWell.row);\n const maxRow = Math.max(startWell.row, endWell.row);\n const minCol = Math.min(startWell.col, endWell.col);\n const maxCol = Math.max(startWell.col, endWell.col);\n\n // Validate bounds against actual labels\n const numRows = rowLabels.length;\n const numCols = colLabels.length;\n if (minRow >= numRows || maxRow >= numRows || minCol >= numCols || maxCol >= numCols) {\n return null;\n }\n\n return { minRow, maxRow, minCol, maxCol };\n}\n\n/** Options for building hover text for a well */\nexport interface BuildHoverTextOptions {\n wellId: string;\n value: number | null;\n allValues: Record<string, number | string | null> | undefined;\n tooltipExtra: Record<string, unknown> | undefined;\n activeLayerId: string | undefined;\n layerConfigMap: Map<string, LayerConfig>;\n precision: number;\n valueUnit: string;\n}\n\n/**\n * Builds the hover text HTML for a single well.\n * Shows all layer values with the active layer marked.\n */\nexport function buildWellHoverText({\n wellId,\n value,\n allValues,\n tooltipExtra,\n activeLayerId,\n layerConfigMap,\n precision,\n valueUnit,\n}: BuildHoverTextOptions): string {\n let text = `Well ${wellId}`;\n\n if (allValues) {\n text += formatAllLayerValues(allValues, activeLayerId, layerConfigMap, precision);\n } else if (value !== null) {\n text += `<br>Value: ${value.toFixed(precision)}${valueUnit}`;\n } else if (activeLayerId) {\n text += `<br>▶ ${activeLayerId}: -`;\n } else {\n text += `<br>No data`;\n }\n\n if (tooltipExtra) {\n text += formatTooltipExtra(tooltipExtra);\n }\n\n return text;\n}\n\n/** Formats all layer values for hover text display */\nfunction formatAllLayerValues(\n allValues: Record<string, number | string | null>,\n activeLayerId: string | undefined,\n layerConfigMap: Map<string, LayerConfig>,\n precision: number\n): string {\n let result = \"\";\n for (const [key, value] of Object.entries(allValues)) {\n const isActiveLayer = key === activeLayerId;\n const prefix = isActiveLayer ? \"▶ \" : \"\";\n const rawLayerUnit = layerConfigMap.get(key)?.valueUnit;\n const layerUnit = rawLayerUnit ? ` ${rawLayerUnit}` : \"\";\n\n if (value === null) {\n result += `<br>${prefix}${key}: -`;\n } else if (typeof value === \"number\") {\n result += `<br>${prefix}${key}: ${value.toFixed(precision)}${layerUnit}`;\n } else {\n result += `<br>${prefix}${key}: ${value.charAt(0).toUpperCase() + value.slice(1)}`;\n }\n }\n return result;\n}\n\n/** Formats tooltip extra data for display */\nfunction formatTooltipExtra(tooltipExtra: Record<string, unknown>): string {\n let result = \"\";\n for (const [key, value] of Object.entries(tooltipExtra)) {\n result += `<br>${key}: ${String(value)}`;\n }\n return result;\n}\n\n/** Colorbar configuration for a specific position */\nexport interface ColorbarConfig {\n orientation?: \"h\" | \"v\";\n thickness: number;\n len: number;\n outlinewidth: number;\n ticksuffix: string;\n x: number;\n xanchor: \"left\" | \"center\" | \"right\";\n y: number;\n yanchor: \"top\" | \"middle\" | \"bottom\";\n title?: { text: string; side: \"top\" | \"bottom\" | \"right\" };\n}\n\n/**\n * Builds the colorbar configuration based on legend position.\n */\nexport function buildColorbarConfig(\n position: LegendPosition,\n valueUnit: string,\n legendTitle?: string\n): ColorbarConfig {\n const title = legendTitle ? { text: legendTitle } : undefined;\n\n switch (position) {\n case \"bottom\":\n return {\n orientation: \"h\",\n thickness: 20,\n len: 0.75,\n outlinewidth: 0,\n ticksuffix: valueUnit,\n y: -0.15,\n yanchor: \"top\",\n x: 0.5,\n xanchor: \"center\",\n title: title ? { ...title, side: \"top\" } : undefined,\n };\n case \"top\":\n return {\n orientation: \"h\",\n thickness: 20,\n len: 0.75,\n outlinewidth: 0,\n ticksuffix: valueUnit,\n y: 1.15,\n yanchor: \"bottom\",\n x: 0.5,\n xanchor: \"center\",\n title: title ? { ...title, side: \"bottom\" } : undefined,\n };\n case \"left\":\n return {\n thickness: 28,\n len: 1,\n outlinewidth: 0,\n ticksuffix: valueUnit,\n y: 0.5,\n yanchor: \"middle\",\n x: -0.15,\n xanchor: \"right\",\n title: title ? { ...title, side: \"right\" } : undefined,\n };\n default:\n // \"right\" (default)\n return {\n thickness: 20,\n len: 0.9,\n outlinewidth: 0,\n ticksuffix: valueUnit,\n x: 0.88,\n xanchor: \"left\",\n y: 0.5,\n yanchor: \"middle\",\n title: title ? { ...title, side: \"right\" } : undefined,\n };\n }\n}\n\n/** Margin configuration for the plot */\nexport interface PlotMargins {\n l: number;\n r: number;\n b: number;\n t: number;\n pad: number;\n}\n\n/**\n * Builds the margin configuration based on legend position and title presence.\n */\nexport function buildPlotMargins(\n position: LegendPosition,\n hasTitle: boolean,\n hasYTitle: boolean\n): PlotMargins {\n const baseLeft = hasYTitle ? PLATEMAP_CONSTANTS.MARGIN_TOP : PLATEMAP_CONSTANTS.MARGIN_RIGHT;\n const baseRight = PLATEMAP_CONSTANTS.MARGIN_RIGHT;\n\n const leftMargin = position === \"left\" ? baseLeft + PLATEMAP_CONSTANTS.MARGIN_RIGHT : baseLeft;\n const rightMargin = position === \"right\" ? baseRight + PLATEMAP_CONSTANTS.MARGIN_RIGHT : baseRight;\n const bottomMargin = position === \"bottom\" ? PLATEMAP_CONSTANTS.MARGIN_LEFT : PLATEMAP_CONSTANTS.MARGIN_RIGHT;\n\n let topMargin: number;\n if (hasTitle) {\n topMargin = position === \"top\" ? PLATEMAP_CONSTANTS.COLORBAR_LENGTH : 100;\n } else {\n topMargin = position === \"top\" ? PLATEMAP_CONSTANTS.MARGIN_TOP : PLATEMAP_CONSTANTS.MARGIN_BOTTOM;\n }\n\n return { l: leftMargin, r: rightMargin, b: bottomMargin, t: topMargin, pad: 5 };\n}\n\n/**\n * Calculates the title X position based on legend position.\n */\nexport function calculateTitleX(position: LegendPosition): number {\n switch (position) {\n case \"left\":\n return PLATEMAP_CONSTANTS.MULTI_VALUE_PRIMARY_RATIO;\n case \"right\":\n return PLATEMAP_CONSTANTS.MULTI_VALUE_SECONDARY_RATIO;\n default:\n return 0.5;\n }\n}\n\n/**\n * Calculates the X-axis domain based on legend position.\n */\nexport function calculateAxisDomain(position: LegendPosition): [number, number] {\n switch (position) {\n case \"left\":\n return [PLATEMAP_CONSTANTS.DOMAIN_COLORBAR_OFFSET, 1];\n case \"right\":\n return [0, PLATEMAP_CONSTANTS.DOMAIN_COLORBAR_END];\n default:\n return [0, 1];\n }\n}\n\n/** Data arrays for scatter plot */\nexport interface ScatterPlotData {\n xData: number[];\n yData: string[];\n colorData: number[];\n textData: string[];\n}\n\n/**\n * Flattens 2D grid data into arrays for scatter plot rendering.\n */\nexport function flattenGridData(\n plotZ: (number | null)[][],\n rowLabels: (string | number)[],\n hoverText: string[][],\n rows: number,\n columns: number,\n plotZMin: number\n): ScatterPlotData {\n const xData: number[] = [];\n const yData: string[] = [];\n const colorData: number[] = [];\n const textData: string[] = [];\n\n for (let rowIdx = 0; rowIdx < rows; rowIdx++) {\n for (let colIdx = 0; colIdx < columns; colIdx++) {\n xData.push(colIdx + 1); // 1-indexed columns\n yData.push(rowLabels[rowIdx] as string);\n const zValue = plotZ[rowIdx][colIdx];\n colorData.push(zValue ?? plotZMin); // Use min value for null wells\n textData.push(hoverText[rowIdx][colIdx]);\n }\n }\n\n return { xData, yData, colorData, textData };\n}\n\n/** Marker size calculation result */\nexport interface MarkerSizeResult {\n markerSize: number;\n}\n\n/** Minimum marker size in pixels */\nconst MIN_MARKER_SIZE = 4;\n/** Size multiplier for square markers (fill entire cell) */\nconst SQUARE_SIZE_MULTIPLIER = 1.0;\n/** Size multiplier for circle markers (leave gaps) */\nconst CIRCLE_SIZE_MULTIPLIER = 0.8;\n/** Default colorbar space reservation */\nconst COLORBAR_SPACE = 100;\n\n/**\n * Calculates the marker size based on plot dimensions and marker shape.\n */\nexport function calculateMarkerSize(\n width: number,\n height: number,\n rows: number,\n columns: number,\n markerShape: \"circle\" | \"square\",\n hasTitle: boolean,\n hasYTitle: boolean\n): number {\n const leftMargin = hasYTitle ? PLATEMAP_CONSTANTS.MARGIN_TOP : PLATEMAP_CONSTANTS.MARGIN_RIGHT;\n const rightMargin = COLORBAR_SPACE; // Always reserve space for colorbar\n const topMargin = hasTitle ? COLORBAR_SPACE : PLATEMAP_CONSTANTS.MARGIN_BOTTOM;\n const bottomMargin = PLATEMAP_CONSTANTS.MARGIN_RIGHT;\n const plotWidth = width - leftMargin - rightMargin;\n const plotHeight = height - topMargin - bottomMargin;\n\n const cellWidth = plotWidth / columns;\n const cellHeight = plotHeight / rows;\n\n // Circles: use smaller dimension; Squares: use larger dimension\n const cellSize = markerShape === \"square\"\n ? Math.max(cellWidth, cellHeight)\n : Math.min(cellWidth, cellHeight);\n\n const sizeMultiplier = markerShape === \"square\" ? SQUARE_SIZE_MULTIPLIER : CIRCLE_SIZE_MULTIPLIER;\n return Math.max(MIN_MARKER_SIZE, cellSize * sizeMultiplier);\n}\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport \"./PlateMap.scss\";\nimport {\n PLATE_CONFIGS,\n DEFAULT_COLOR_SCALE,\n COLORS,\n DEFAULT_CATEGORY_COLORS,\n PLATEMAP_CONSTANTS,\n NAMED_COLORSCALES,\n} from \"./constants\";\nimport {\n PLATE_FORMAT_96,\n PLATE_FORMAT_CUSTOM,\n} from \"./types\";\nimport {\n generateRowLabels,\n generateColumnLabels,\n wellDataToGrid,\n calculateValueRange,\n hasMultiValueWells,\n extractLayers,\n parseRegionWells,\n buildWellHoverText,\n buildColorbarConfig,\n buildPlotMargins,\n calculateTitleX,\n calculateAxisDomain,\n flattenGridData,\n calculateMarkerSize,\n} from \"./utils\";\n\nimport type {\n PlateMapProps,\n LayerConfig,\n WellData,\n} from \"./types\";\n\n// Re-export types and constants for external consumers\nexport * from \"./types\";\nexport { DEFAULT_CATEGORY_COLORS } from \"./constants\";\n\n/**\n * PlateMap component for visualizing well plate data as a heatmap or categorical display.\n *\n * **Supported Plate Formats:**\n * - 96-well (8 rows × 12 columns, wells A1-H12)\n * - 384-well (16 rows × 24 columns, wells A1-P24)\n * - 1536-well (32 rows × 48 columns, wells A1-AF48)\n * - Custom dimensions with user-specified rows/columns\n *\n * **Visualization Modes:**\n * - `\"heatmap\"`: Continuous color gradient for quantitative values\n * - `\"categorical\"`: Discrete colors for well types (sample, control, empty)\n *\n * **Features:**\n * - Multiple data layers with independent visualization settings\n * - Control region highlighting with borders and fill colors\n * - Configurable color scales, tooltips, and click interactions\n * - Support for WellData arrays with multi-layer visualization\n *\n * **Data Format:**\n * - **WellData array**: `[{ wellId: \"A1\", values: { RFU: 100 }, tooltipData: {...} }, ...]`\n *\n */\nconst PlateMap: React.FC<PlateMapProps> = ({\n data,\n layerConfigs,\n initialLayerId,\n onLayerChange,\n plateFormat = PLATE_FORMAT_96,\n rows: customRows,\n columns: customColumns,\n visualizationMode: propVisualizationMode = \"heatmap\",\n categoryColors: customCategoryColors,\n regions,\n title,\n xTitle,\n yTitle,\n xLabels: customXLabels,\n yLabels: customYLabels,\n colorScale: propColorScale = DEFAULT_COLOR_SCALE,\n valueMin: propValueMin,\n valueMax: propValueMax,\n emptyWellColor = COLORS.emptyWell,\n showColorBar = true,\n showLegend = true,\n legendConfig,\n width = 800,\n height = 500,\n precision = 0,\n markerShape = \"circle\",\n onWellClick,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const onWellClickRef = useRef(onWellClick);\n onWellClickRef.current = onWellClick;\n\n // Internal state for layer toggling, initialized with initialLayerId\n const [activeLayerId, setActiveLayerId] = useState<string | undefined>(initialLayerId);\n\n // Determine plate dimensions\n let rows: number;\n let columns: number;\n\n if (plateFormat === PLATE_FORMAT_CUSTOM) {\n rows = customRows ?? 8;\n columns = customColumns ?? 12;\n } else {\n const config = PLATE_CONFIGS[plateFormat];\n rows = config.rows;\n columns = config.columns;\n }\n\n // Auto-generate layers from multi-value WellData\n const effectiveLayers = useMemo((): LayerConfig[] | null => {\n // Check if data contains multi-value wells\n if (Array.isArray(data) && data.length > 0 && \"wellId\" in (data[0] as WellData)) {\n const wellDataArray = data as WellData[];\n if (hasMultiValueWells(wellDataArray)) {\n return extractLayers(wellDataArray, layerConfigs);\n }\n }\n\n return null;\n }, [data, layerConfigs]);\n\n // Handle layer toggling - determine active layer\n const activeLayer = useMemo((): LayerConfig | null => {\n if (!effectiveLayers || effectiveLayers.length === 0) return null;\n if (activeLayerId) {\n return effectiveLayers.find((l) => l.id === activeLayerId) ?? effectiveLayers[0];\n }\n return effectiveLayers[0];\n }, [effectiveLayers, activeLayerId]);\n\n // Get effective props from active layer or default props\n // Data is always the same - we just change which layer is being visualized\n const visualizationMode = activeLayer?.visualizationMode ?? propVisualizationMode;\n const colorScale = activeLayer?.colorScale ?? propColorScale;\n const valueMin = activeLayer?.valueMin ?? propValueMin;\n const valueMax = activeLayer?.valueMax ?? propValueMax;\n // Derive valueUnit from layer config\n const valueUnit = activeLayer?.valueUnit ? ` ${activeLayer.valueUnit}` : \"\";\n\n // Merge custom category colors with defaults, including layer-specific colors\n const categoryColors = useMemo(\n () => ({ ...DEFAULT_CATEGORY_COLORS, ...customCategoryColors, ...activeLayer?.categoryColors }),\n [customCategoryColors, activeLayer?.categoryColors]\n );\n\n // Convert data to grid format - memoize to prevent re-render issues\n // Use activeLayer.id to extract the appropriate value from multi-value wells\n const activeLayerId_ = activeLayer?.id;\n const { grid, categoriesGrid, allValuesMap, tooltipDataMap } = useMemo(() => {\n let resultGrid: (number | null)[][];\n let resultCategories: (string | null)[][] = Array.from({ length: rows }, () =>\n Array(columns).fill(null)\n );\n let resultAllValues = new Map<string, Record<string, string | number | null>>();\n let resultTooltipData = new Map<string, Record<string, unknown>>();\n\n if (Array.isArray(data) && data.length > 0) {\n // WellData array format - pass activeLayerId to extract the right layer\n const result = wellDataToGrid(data, rows, columns, activeLayerId_);\n resultGrid = result.grid;\n resultCategories = result.categories;\n resultAllValues = result.allValues;\n resultTooltipData = result.tooltipData;\n } else {\n // Generate random data for demonstration when no data provided\n resultGrid = Array.from({ length: rows }, () =>\n Array.from({ length: columns }, () => Math.random() * PLATEMAP_CONSTANTS.MAX_RANDOM_VALUE)\n );\n }\n\n return { grid: resultGrid, categoriesGrid: resultCategories, allValuesMap: resultAllValues, tooltipDataMap: resultTooltipData };\n }, [data, rows, columns, activeLayerId_]);\n\n // Generate labels - use custom labels if provided, otherwise auto-generate\n const rowLabels = customYLabels ?? generateRowLabels(rows);\n const colLabels = customXLabels ?? generateColumnLabels(columns);\n\n // Calculate value range if not provided\n const range = calculateValueRange(grid);\n const zMin = valueMin ?? range.min;\n const zMax = valueMax ?? range.max;\n\n // Check if grid has any null values\n const hasNullValues = grid.some(row => row.includes(null));\n\n // Create sentinel value for empty wells (below the data range)\n // This allows us to show emptyWellColor for null cells\n const sentinelValue = zMin - (zMax - zMin) * PLATEMAP_CONSTANTS.SENTINEL_RATIO - 1;\n\n // Replace null values with sentinel for Plotly rendering\n const displayGrid = hasNullValues\n ? grid.map(row => row.map(val => val === null ? sentinelValue : val))\n : grid;\n\n // Extend colorscale to include emptyWellColor at the bottom for null values\n const effectiveColorScale = useMemo(() => {\n if (!hasNullValues) return colorScale;\n\n // Convert colorScale to array format if it's a named string scale\n let arrayColorScale: Array<[number, string]>;\n if (typeof colorScale === \"string\") {\n // Look up the named scale in our mapping\n const namedScale = NAMED_COLORSCALES[colorScale];\n if (namedScale) {\n arrayColorScale = namedScale;\n } else {\n // Unknown named scale - can't extend it, return as-is\n // This is a fallback for custom/unknown Plotly scale names\n return colorScale;\n }\n } else {\n arrayColorScale = colorScale;\n }\n\n // For array colorscales, prepend emptyWellColor at position 0\n // and shift all other positions proportionally\n const totalRange = zMax - sentinelValue;\n const dataStartRatio = (zMin - sentinelValue) / totalRange;\n\n // Create new colorscale with emptyWellColor at the bottom\n const extendedScale: Array<[number, string]> = [\n [0, emptyWellColor],\n [dataStartRatio * PLATEMAP_CONSTANTS.COLOR_SCALE_THRESHOLD, emptyWellColor], // Small band for empty wells\n ];\n\n // Remap original colorscale positions to the remaining range\n for (const [pos, color] of arrayColorScale) {\n const newPos = dataStartRatio + pos * (1 - dataStartRatio);\n extendedScale.push([newPos, color]);\n }\n\n return extendedScale;\n }, [colorScale, hasNullValues, zMin, zMax, sentinelValue, emptyWellColor]);\n\n // Effective zMin includes sentinel value if we have nulls\n const effectiveZMin = hasNullValues ? sentinelValue : zMin;\n\n // Create a lookup map for layer configs to get valueUnit for each layer\n const layerConfigMap = useMemo(() => {\n const map = new Map<string, LayerConfig>();\n if (effectiveLayers) {\n for (const layer of effectiveLayers) {\n map.set(layer.id, layer);\n }\n }\n return map;\n }, [effectiveLayers]);\n\n // Build custom hover text matrix - shows ALL values regardless of active layer\n const hoverText: string[][] = grid.map((row, rowIdx) =>\n row.map((val, colIdx) => {\n const wellId = `${rowLabels[rowIdx]}${colLabels[colIdx]}`;\n const wellIdUpper = String(wellId).toUpperCase();\n return buildWellHoverText({\n wellId,\n value: val,\n allValues: allValuesMap.get(wellIdUpper),\n tooltipExtra: tooltipDataMap.get(wellIdUpper),\n activeLayerId: activeLayer?.id,\n layerConfigMap,\n precision,\n valueUnit,\n });\n })\n );\n\n // Build categorical data for categorical mode\n const { categoricalGrid, categoricalColorScale, uniqueTypes, catMax } = useMemo(() => {\n if (visualizationMode !== \"categorical\") {\n return { categoricalGrid: null, categoricalColorScale: null, uniqueTypes: [], catMax: 0 };\n }\n\n // Collect unique categories from the categoriesGrid\n const typesSet = new Set<string>();\n let hasNullCategory = false;\n for (const row of categoriesGrid) {\n for (const category of row) {\n if (category) {\n typesSet.add(category);\n } else {\n hasNullCategory = true;\n }\n }\n }\n // Only include \"empty\" if there are actual null wells\n if (hasNullCategory) {\n typesSet.add(\"empty\");\n }\n const types = [...typesSet].sort();\n\n // Create numeric grid where each category maps to an index\n const typeToIndex = new Map<string, number>();\n types.forEach((type, idx) => typeToIndex.set(type, idx));\n\n const catGrid: number[][] = categoriesGrid.map((row) =>\n row.map((category) => {\n if (category === null) {\n return typeToIndex.get(\"empty\") ?? 0;\n }\n return typeToIndex.get(category) ?? typeToIndex.get(\"empty\") ?? 0;\n })\n );\n\n // Build discrete colorscale for categories\n // The grid contains integer indices 0, 1, 2, ... (numTypes - 1)\n // With cmin=0 and cmax=numTypes-1, Plotly maps:\n // index 0 -> normalized 0.0\n // index (numTypes-1) -> normalized 1.0\n // We need each index to map to a distinct color band\n const numTypes = types.length;\n const catColorScale: Array<[number, string]> = [];\n\n if (numTypes === 1) {\n // Single type: entire range is one color\n const color = categoryColors[types[0]] || emptyWellColor;\n catColorScale.push([0, color]);\n catColorScale.push([1, color]);\n } else {\n // Multiple types: create bands for each index\n // Index i maps to normalized value i / (numTypes - 1)\n types.forEach((type, idx) => {\n const color = categoryColors[type] || emptyWellColor;\n const normalizedPos = idx / (numTypes - 1);\n // Create a small band around each position\n const bandHalf = 0.5 / (numTypes - 1);\n const start = Math.max(0, normalizedPos - bandHalf);\n const end = Math.min(1, normalizedPos + bandHalf - PLATEMAP_CONSTANTS.COLOR_SCALE_EPSILON);\n catColorScale.push([start, color]);\n catColorScale.push([end, color]);\n });\n }\n\n // cmax should be numTypes - 1 to match the index range\n return { categoricalGrid: catGrid, categoricalColorScale: catColorScale, uniqueTypes: types, catMax: numTypes - 1 };\n }, [visualizationMode, categoriesGrid, categoryColors, emptyWellColor]);\n\n // Build Plotly shapes for highlighted regions\n const regionShapes = useMemo(() => {\n if (!regions || regions.length === 0) {\n return [];\n }\n\n const shapes: Array<Partial<Plotly.Shape>> = [];\n\n for (const region of regions) {\n const bounds = parseRegionWells(region.wells, rowLabels, colLabels);\n if (!bounds) continue;\n\n // Plotly heatmap uses the actual label values for positioning.\n // colLabels are 1-indexed (1, 2, 3, ...), so we need to convert from 0-indexed bounds.\n // Each cell is centered on its label, so we offset by inset to cover the cell.\n // For columns: bounds.minCol=0 means column label 1, so x0 = 1 - inset\n // For rows: bounds.minRow=0 means row index 0, which is correct for y-axis\n //\n // Use 0.49 inset to place boundary just inside cell edge,\n // avoiding line doubling when adjacent regions share a border\n const inset = 0.49;\n const x0 = (bounds.minCol + 1) - inset;\n const x1 = (bounds.maxCol + 1) + inset;\n const y0 = bounds.minRow - inset;\n const y1 = bounds.maxRow + inset;\n\n shapes.push({\n type: \"rect\",\n xref: \"x\",\n yref: \"y\",\n x0,\n x1,\n y0,\n y1,\n line: {\n color: region.borderColor || COLORS.textDark,\n width: region.borderWidth ?? 2,\n },\n fillcolor: region.fillColor || \"transparent\",\n layer: \"above\",\n });\n }\n\n return shapes;\n }, [regions, rowLabels, colLabels]);\n\n useEffect(() => {\n const currentRef = plotRef.current;\n if (!currentRef) return;\n\n // Determine which grid and colorscale to use based on mode\n const isCategorical = visualizationMode === \"categorical\";\n const plotZ = isCategorical && categoricalGrid ? categoricalGrid : displayGrid;\n const plotColorScale = isCategorical && categoricalColorScale ? categoricalColorScale : effectiveColorScale;\n const plotZMin = isCategorical ? 0 : effectiveZMin;\n const plotZMax = isCategorical ? (catMax || 1) : zMax;\n const plotShowScale = isCategorical ? false : showColorBar;\n\n // Flatten 2D grid data into arrays for scatter plot\n const { xData, yData, colorData, textData } = flattenGridData(\n plotZ,\n rowLabels,\n hoverText,\n rows,\n columns,\n plotZMin\n );\n\n // Calculate marker size based on plot dimensions\n const markerSize = calculateMarkerSize(\n width,\n height,\n rows,\n columns,\n markerShape,\n !!title,\n !!yTitle\n );\n\n // Create scatter plot with markers\n const plotData: Plotly.Data[] = [\n {\n x: xData,\n y: yData,\n mode: \"markers\" as const,\n type: \"scatter\" as const,\n marker: {\n symbol: markerShape,\n size: markerSize,\n color: colorData,\n colorscale: plotColorScale,\n cmin: plotZMin,\n cmax: plotZMax,\n showscale: plotShowScale,\n colorbar: buildColorbarConfig(\n legendConfig?.position ?? \"right\",\n valueUnit,\n legendConfig?.title\n ),\n line: {\n color: \"var(--grey-400)\",\n width: 1,\n },\n },\n hoverinfo: \"text\" as const,\n text: textData,\n },\n ];\n\n const legendPosition = legendConfig?.position ?? \"right\";\n\n const layout = {\n autosize: false, // Prevent auto-sizing to maintain consistent layout\n title: title\n ? {\n text: title,\n font: {\n family: \"Inter, sans-serif\",\n size: 20,\n color: \"var(--black-300)\",\n },\n x: calculateTitleX(legendPosition),\n xanchor: \"center\" as const,\n y: 0.98,\n yanchor: \"top\" as const,\n }\n : undefined,\n width,\n height,\n margin: buildPlotMargins(legendPosition, !!title, !!yTitle),\n xaxis: {\n title: {\n text: xTitle || \"\",\n font: {\n size: 16,\n color: \"var(--black-300)\",\n family: \"Inter, sans-serif\",\n },\n standoff: 15,\n },\n side: \"top\" as const,\n fixedrange: true,\n dtick: 1,\n range: [0.5, columns + 0.5], // Explicit range to prevent auto-padding\n automargin: false, // Prevent auto margin adjustment\n tickmode: \"array\" as const,\n tickvals: Array.from({ length: columns }, (_, i) => i + 1),\n ticktext: colLabels.map(String),\n tickangle: 0, // Keep labels horizontal\n tickfont: { size: columns > 24 ? 8 : PLATEMAP_CONSTANTS.FONT_SIZE_LARGE }, // Smaller font for high-density plates\n // Adjust domain based on legend position to prevent colorbar overlap\n domain: calculateAxisDomain(legendPosition),\n },\n yaxis: {\n title: {\n text: yTitle || \"\",\n font: {\n size: 16,\n color: \"var(--black-300)\",\n family: \"Inter, sans-serif\",\n },\n standoff: 15,\n },\n fixedrange: true,\n dtick: 1,\n range: [rows + PLATEMAP_CONSTANTS.LABEL_CENTER_OFFSET, PLATEMAP_CONSTANTS.LABEL_CENTER_OFFSET], // Reversed range: high to low puts row A at top\n automargin: false, // Prevent auto margin adjustment\n tickmode: \"array\" as const,\n tickvals: Array.from({ length: rows }, (_, i) => i),\n ticktext: rowLabels.map(String),\n tickfont: { size: rows > 16 ? 8 : PLATEMAP_CONSTANTS.FONT_SIZE_LARGE }, // Smaller font for high-density plates\n },\n paper_bgcolor: \"var(--white-900)\",\n plot_bgcolor: \"var(--white-900)\",\n font: {\n family: \"Inter, sans-serif\",\n color: \"var(--grey-600)\",\n },\n shapes: regionShapes,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(currentRef, plotData, layout, config);\n\n // Always attach click handler - check onWellClickRef.current inside callback\n // This ensures handler is registered even if onWellClick is provided after initial render\n (currentRef as unknown as Plotly.PlotlyHTMLElement).on(\"plotly_click\", (eventData: Plotly.PlotMouseEvent) => {\n if (!onWellClickRef.current) return;\n const point = eventData.points[0];\n if (point) {\n // Cast labels to handle union type\n const rowLabelsArr = rowLabels as (string | number)[];\n const colLabelsArr = colLabels as (string | number)[];\n const rowIdx = rowLabelsArr.indexOf(point.y as string | number);\n const colIdx = colLabelsArr.indexOf(point.x as string | number);\n if (rowIdx >= 0 && colIdx >= 0) {\n const wellId = `${rowLabelsArr[rowIdx]}${colLabelsArr[colIdx]}`;\n const wellIdUpper = String(wellId).toUpperCase();\n // Get all values and tooltipData for this well\n const allValues = allValuesMap.get(wellIdUpper);\n const tooltipData = tooltipDataMap.get(wellIdUpper);\n const wellData: WellData = {\n wellId,\n values: allValues,\n tooltipData,\n };\n onWellClickRef.current?.(wellData);\n }\n }\n });\n\n return () => {\n if (currentRef) {\n Plotly.purge(currentRef);\n }\n };\n }, [\n displayGrid,\n colLabels,\n rowLabels,\n effectiveColorScale,\n showColorBar,\n effectiveZMin,\n zMax,\n valueUnit,\n title,\n xTitle,\n yTitle,\n width,\n height,\n hoverText,\n precision,\n tooltipDataMap,\n allValuesMap,\n grid,\n visualizationMode,\n categoricalGrid,\n categoricalColorScale,\n uniqueTypes.length,\n catMax,\n regionShapes,\n rows,\n columns,\n legendConfig,\n markerShape,\n ]);\n\n // Render layer selector tabs\n const renderLayerSelector = () => {\n if (!effectiveLayers || effectiveLayers.length <= 1) {\n return null;\n }\n\n return (\n <div className=\"platemap-layer-selector\">\n {effectiveLayers.map((layer) => {\n const isActive = activeLayer?.id === layer.id;\n return (\n <button\n key={layer.id}\n type=\"button\"\n className={`platemap-layer-selector__button${isActive ? \" platemap-layer-selector__button--active\" : \"\"}`}\n onClick={() => {\n setActiveLayerId(layer.id);\n onLayerChange?.(layer.id);\n }}\n >\n {layer.name}\n </button>\n );\n })}\n </div>\n );\n };\n\n // Legend configuration with defaults\n const legendPosition = legendConfig?.position ?? \"right\";\n const legendFontSize = legendConfig?.fontSize ?? 12;\n const legendItemSpacing = legendConfig?.itemSpacing ?? 4;\n const legendSwatchSize = legendConfig?.swatchSize ?? 16;\n const legendTitle = legendConfig?.title;\n\n // Fixed width for categorical legend to prevent layout shift\n const legendWidth = 120;\n\n // Determine if legend is horizontal (top/bottom) or vertical (left/right)\n const isHorizontalLegend = legendPosition === \"top\" || legendPosition === \"bottom\";\n\n // Render legend (categorical types and/or regions)\n const renderLegend = () => {\n const hasCategoricalItems = visualizationMode === \"categorical\" && uniqueTypes.length > 0;\n const hasRegions = regions && regions.length > 0;\n\n if (!showLegend || (!hasCategoricalItems && !hasRegions)) {\n // Return empty placeholder to maintain consistent width (only for vertical legends)\n if (!isHorizontalLegend) {\n return <div className=\"platemap-legend-placeholder\" style={{ width: legendWidth }} />;\n }\n return null;\n }\n\n // Build legend class names\n const legendClassNames = [\"platemap-legend\"];\n if (isHorizontalLegend) {\n legendClassNames.push(\"platemap-legend--horizontal\");\n } else if (legendPosition === \"left\") {\n legendClassNames.push(\"platemap-legend--left\");\n } else if (legendPosition === \"right\") {\n legendClassNames.push(\"platemap-legend--right\");\n }\n\n // Dynamic styles that depend on props\n const legendStyle: React.CSSProperties = {\n gap: `${legendItemSpacing}px`,\n width: isHorizontalLegend ? undefined : legendWidth,\n };\n\n return (\n <div className={legendClassNames.join(\" \")} style={legendStyle}>\n {legendTitle && (\n <div\n className={`platemap-legend__title${isHorizontalLegend ? \" platemap-legend__title--horizontal\" : \"\"}`}\n style={{ fontSize: `${legendFontSize}px` }}\n >\n {legendTitle}\n </div>\n )}\n {/* Categorical type items */}\n {hasCategoricalItems &&\n uniqueTypes.map((type) => (\n <div key={type} className=\"platemap-legend__item\">\n <div\n className=\"platemap-legend__swatch\"\n style={{\n width: `${legendSwatchSize}px`,\n height: `${legendSwatchSize}px`,\n backgroundColor: categoryColors[type] || emptyWellColor,\n }}\n />\n <span\n className=\"platemap-legend__label platemap-legend__label--capitalize\"\n style={{ fontSize: `${legendFontSize}px` }}\n >\n {type}\n </span>\n </div>\n ))}\n {/* Region items */}\n {hasRegions &&\n regions.map((region) => (\n <div key={region.id} className=\"platemap-legend__item\">\n <div\n className=\"platemap-legend__swatch platemap-legend__swatch--region\"\n style={{\n width: `${legendSwatchSize}px`,\n height: `${legendSwatchSize}px`,\n backgroundColor: region.fillColor || \"transparent\",\n border: `${region.borderWidth || 2}px solid ${region.borderColor || COLORS.regionBorder}`,\n }}\n />\n <span\n className=\"platemap-legend__label\"\n style={{ fontSize: `${legendFontSize}px` }}\n >\n {region.name}\n </span>\n </div>\n ))}\n </div>\n );\n };\n\n // Build the plot content based on legend position\n const plotContent = <div ref={plotRef} className=\"platemap-plot\" style={{ width, height }} />;\n const legendContent = renderLegend();\n\n const renderPlotWithLegend = () => {\n switch (legendPosition) {\n case \"left\":\n return (\n <div className=\"platemap-plot-wrapper platemap-plot-wrapper--vertical\">\n {legendContent}\n {plotContent}\n </div>\n );\n case \"top\":\n return (\n <div className=\"platemap-plot-wrapper platemap-plot-wrapper--horizontal\">\n {legendContent}\n {plotContent}\n </div>\n );\n case \"bottom\":\n return (\n <div className=\"platemap-plot-wrapper platemap-plot-wrapper--horizontal\">\n {plotContent}\n {legendContent}\n </div>\n );\n case \"right\":\n default:\n return (\n <div className=\"platemap-plot-wrapper platemap-plot-wrapper--vertical\">\n {plotContent}\n {legendContent}\n </div>\n );\n }\n };\n\n return (\n <div className=\"platemap-container\" style={{ width: isHorizontalLegend ? undefined : width }}>\n {renderLayerSelector()}\n {renderPlotWithLegend()}\n </div>\n );\n};\n\nexport { PlateMap };","import React, { useMemo } from \"react\";\n\nimport { PlateMap } from \"../PlateMap\";\n\nimport type { ColorScale, WellData } from \"../PlateMap\";\n\n/**\n * Props for the Heatmap component\n * @deprecated Use PlateMap component instead. Heatmap is now a wrapper around PlateMap for backward compatibility.\n */\ninterface HeatmapProps {\n /** 2D array of numeric values */\n data?: number[][];\n /** Custom x-axis labels (column labels) */\n xLabels?: string[] | number[];\n /** Custom y-axis labels (row labels) */\n yLabels?: string[] | number[];\n /** Chart title */\n title?: string;\n /** X-axis title */\n xTitle?: string;\n /** Y-axis title */\n yTitle?: string;\n /** Color scale - string name or array of [position, color] pairs */\n colorscale?: string | Array<[number, string]>;\n /** Chart width in pixels */\n width?: number;\n /** Chart height in pixels */\n height?: number;\n /** Show color scale legend */\n showScale?: boolean;\n /** Number of decimal places for values */\n precision?: number;\n /** Minimum value for color scale */\n zmin?: number;\n /** Maximum value for color scale */\n zmax?: number;\n /** Value unit suffix */\n valueUnit?: string;\n}\n\n/**\n * Heatmap component for 2D data visualization\n * @deprecated Use PlateMap component instead. This component is now a wrapper around PlateMap for backward compatibility.\n *\n * @example\n * ```tsx\n * <Heatmap\n * data={[[1, 2, 3], [4, 5, 6]]}\n * xLabels={['A', 'B', 'C']}\n * yLabels={['Row 1', 'Row 2']}\n * title=\"My Heatmap\"\n * />\n * ```\n */\n/**\n * Normalize jagged 2D array to consistent width (backward compatibility)\n */\nfunction normalizeData(data: number[][]): number[][] {\n if (!data || data.length === 0) return [];\n\n const maxLength = Math.max(...data.map((row) => row.length));\n\n return data.map((row) => {\n if (row.length === maxLength) return row;\n\n const newRow = [...row];\n while (newRow.length < maxLength) {\n newRow.push(0);\n }\n return newRow;\n });\n}\n\nconst Heatmap: React.FC<HeatmapProps> = ({\n data,\n xLabels,\n yLabels,\n title,\n xTitle,\n yTitle,\n colorscale,\n width = 800,\n height = 600,\n showScale = true,\n precision = 0,\n zmin,\n zmax,\n valueUnit = \"\",\n}) => {\n // Normalize jagged arrays to consistent width (backward compatibility)\n const normalizedData = data ? normalizeData(data) : undefined;\n\n // Determine rows and columns from normalized data or labels\n const rows = normalizedData?.length ?? (yLabels?.length ?? 16);\n const columns = normalizedData?.[0]?.length ?? (xLabels?.length ?? 24);\n\n // Convert 2D array to WellData format for PlateMap\n const wellData: WellData[] | undefined = useMemo(() => {\n if (!normalizedData) return;\n\n const defaultRows = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n const wells: WellData[] = [];\n\n for (let r = 0; r < normalizedData.length; r++) {\n for (let c = 0; c < normalizedData[r].length; c++) {\n const rowLabel = yLabels?.[r]?.toString() ?? defaultRows[r] ?? `R${r + 1}`;\n const colLabel = xLabels?.[c]?.toString() ?? String(c + 1);\n const wellId = `${rowLabel}${colLabel}`;\n wells.push({ wellId, values: { Value: normalizedData[r][c] } });\n }\n }\n return wells;\n }, [normalizedData, xLabels, yLabels]);\n\n // Pass colorscale directly - PlateMap's ColorScale type supports both string and array formats\n const plateMapColorScale: ColorScale | undefined = colorscale;\n\n return (\n <PlateMap\n data={wellData}\n plateFormat=\"custom\"\n rows={rows}\n columns={columns}\n title={title}\n xTitle={xTitle}\n yTitle={yTitle}\n xLabels={xLabels}\n yLabels={yLabels}\n colorScale={plateMapColorScale}\n valueMin={zmin}\n valueMax={zmax}\n showColorBar={showScale}\n width={width}\n height={height}\n layerConfigs={[{ id: \"Value\", valueUnit }]}\n precision={precision}\n />\n );\n};\n\nexport { Heatmap };\nexport type { HeatmapProps };\n","import { COLORS } from \"@utils/colors\";\nimport Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\nimport \"./Histogram.scss\";\n\n/** Exponent coefficient for normal distribution calculation */\nconst NORMAL_DISTRIBUTION_EXPONENT_COEFF = -0.5;\n\ninterface HistogramDataSeries {\n x: number[];\n name: string;\n color?: string;\n autobinx?: boolean;\n xbins?: {\n start: number;\n end: number;\n size: number;\n };\n opacity?: number;\n showDistributionLine?: boolean;\n lineWidth?: number;\n}\n\ntype HistogramProps = {\n dataSeries: HistogramDataSeries | HistogramDataSeries[];\n width?: number;\n height?: number;\n title?: string;\n xTitle?: string;\n yTitle?: string;\n bargap?: number;\n showDistributionLine?: boolean;\n};\n\nconst calculateMean = (data: number[]): number => {\n const sum = data.reduce((acc, val) => acc + val, 0);\n return sum / data.length;\n};\n\nconst calculateStdDev = (data: number[], mean: number): number => {\n const squaredDiffs = data.map((value) => Math.pow(value - mean, 2));\n const variance =\n squaredDiffs.reduce((acc, val) => acc + val, 0) / data.length;\n return Math.sqrt(variance);\n};\n\nconst generateNormalDistributionPoints = (\n mean: number,\n stdDev: number,\n start: number,\n end: number,\n points = 100\n): { x: number[]; y: number[] } => {\n const xValues: number[] = [];\n const yValues: number[] = [];\n\n const step = (end - start) / (points - 1);\n\n for (let i = 0; i < points; i++) {\n const x = start + i * step;\n xValues.push(x);\n\n const exponent = NORMAL_DISTRIBUTION_EXPONENT_COEFF * Math.pow((x - mean) / stdDev, 2);\n const y = (1 / (stdDev * Math.sqrt(2 * Math.PI))) * Math.exp(exponent);\n yValues.push(y);\n }\n\n return { x: xValues, y: yValues };\n};\n\nconst scaleDistributionCurve = (\n yValues: number[],\n histogramData: number[],\n bins: { start: number; end: number; size: number }\n): number[] => {\n const binCount = Math.ceil((bins.end - bins.start) / bins.size);\n const binFrequencies = Array(binCount).fill(0);\n\n histogramData.forEach((value) => {\n if (value >= bins.start && value <= bins.end) {\n const binIndex = Math.floor((value - bins.start) / bins.size);\n binFrequencies[binIndex]++;\n }\n });\n\n const maxBinFrequency = Math.max(...binFrequencies);\n const maxCurveValue = Math.max(...yValues);\n\n const scaleFactor = maxBinFrequency / maxCurveValue;\n\n return yValues.map((y) => y * scaleFactor);\n};\n\nconst Histogram: React.FC<HistogramProps> = ({\n dataSeries,\n width = 480,\n height = 480,\n title = \"Histogram\",\n xTitle = \"X Axis\",\n yTitle = \"Frequency\",\n bargap = 0.2,\n showDistributionLine = false,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const seriesArray = useMemo(\n () => (Array.isArray(dataSeries) ? dataSeries : [dataSeries]),\n [dataSeries],\n );\n const effectiveBarMode = useMemo<\n \"stack\" | \"group\" | \"overlay\" | \"relative\" | undefined\n >(() => (seriesArray.length > 1 ? \"stack\" : undefined), [seriesArray.length]);\n\n const defaultColors = useMemo(\n () => [\n COLORS.ORANGE,\n COLORS.RED,\n COLORS.BLUE,\n COLORS.GREEN,\n COLORS.PURPLE,\n COLORS.YELLOW,\n ],\n [],\n );\n\n const seriesWithColors = useMemo(() => {\n return seriesArray.map((series, index) => {\n const hasDistributionLine =\n typeof series.showDistributionLine === \"undefined\"\n ? showDistributionLine\n : series.showDistributionLine;\n\n return {\n ...series,\n color: series.color || defaultColors[index % defaultColors.length],\n opacity: hasDistributionLine ? 0.5 : series.opacity || 1,\n showDistributionLine: hasDistributionLine,\n lineWidth: series.lineWidth || 3,\n };\n });\n }, [seriesArray, showDistributionLine, defaultColors]);\n\n const gridColor = COLORS.GREY_200;\n\n const histogramData = useMemo(\n () =>\n seriesWithColors.map((series) => ({\n type: \"histogram\" as const,\n x: series.x,\n name: series.name,\n marker: {\n color: series.color,\n line: {\n color: COLORS.WHITE,\n width: 1,\n },\n opacity: series.opacity,\n },\n autobinx: series.autobinx,\n xbins: series.xbins,\n hovertemplate: `${xTitle}: %{x}<br>${yTitle}: %{y}<extra>${series.name}</extra>`,\n })),\n [seriesWithColors, xTitle, yTitle],\n );\n\n const distributionLines = useMemo(\n () =>\n seriesWithColors\n .filter((series) => series.showDistributionLine)\n .map((series) => {\n const mean = calculateMean(series.x);\n const stdDev = calculateStdDev(series.x, mean);\n\n const min = Math.min(...series.x);\n const max = Math.max(...series.x);\n const range = max - min;\n const start = min - range * 0.1;\n const end = max + range * 0.1;\n\n const bins = series.xbins || {\n start: start,\n end: end,\n size: range / 10,\n };\n\n const curvePoints = generateNormalDistributionPoints(\n mean,\n stdDev,\n start,\n end,\n 100,\n );\n\n const scaledYValues = scaleDistributionCurve(\n curvePoints.y,\n series.x,\n bins,\n );\n\n return {\n type: \"scatter\" as const,\n x: curvePoints.x,\n y: scaledYValues,\n mode: \"lines\" as const,\n name: `${series.name} Distribution`,\n line: {\n color: series.color,\n width: series.lineWidth,\n },\n hoverinfo: \"none\" as const,\n };\n }),\n [seriesWithColors],\n );\n\n const plotData = useMemo(\n () => [...histogramData, ...distributionLines],\n [histogramData, distributionLines],\n );\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n const layout = {\n width,\n height,\n font: {\n family: \"Inter, sans-serif\",\n },\n showlegend: false,\n margin: { l: 90, r: 40, b: 80, t: 40 },\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: COLORS.BLACK_600,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 20,\n },\n gridcolor: gridColor,\n tickcolor: COLORS.GREY_200,\n ticklen: 8,\n tickwidth: 1,\n ticks: \"outside\" as const,\n linecolor: COLORS.BLACK_900,\n linewidth: 1,\n zeroline: false,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: COLORS.BLACK_600,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 20,\n },\n gridcolor: gridColor,\n tickcolor: COLORS.GREY_200,\n ticklen: 8,\n tickwidth: 1,\n ticks: \"outside\" as const,\n linecolor: COLORS.BLACK_900,\n linewidth: 1,\n zeroline: false,\n rangemode: \"tozero\" as const,\n },\n barmode: effectiveBarMode,\n bargap: bargap,\n paper_bgcolor: COLORS.WHITE,\n plot_bgcolor: COLORS.WHITE,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, plotData, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [width, height, xTitle, yTitle, bargap, plotData, effectiveBarMode, gridColor]);\n\n const ChartLegend: React.FC<{\n series: Array<{ name: string; color: string }>;\n }> = ({ series }) => {\n const items = series.map((item, i) => (\n <React.Fragment key={item.name}>\n <div className=\"legend-item\">\n <span className=\"color-box\" style={{ background: item.color }} />\n {item.name}\n {i < series.length - 1 && <span className=\"divider\" />}\n </div>\n </React.Fragment>\n ));\n\n const rows = [];\n const rowSize = 6;\n for (let i = 0; i < items.length; i += rowSize) {\n rows.push(\n <div className=\"legend-row\" key={i}>\n {items.slice(i, i + rowSize)}\n </div>\n );\n }\n\n return <div className=\"legend-container\">{rows}</div>;\n };\n\n return (\n <div className=\"histogram-container\" style={{ width: width }}>\n <div className=\"chart-container\">\n {title && (\n <div className=\"title-container\">\n <h2 className=\"title\">{title}</h2>\n </div>\n )}\n <div\n ref={plotRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n margin: \"0\",\n }}\n />\n <ChartLegend series={seriesWithColors} />\n </div>\n </div>\n );\n};\n\nexport { Histogram };\nexport type { HistogramDataSeries, HistogramProps };\n","/**\n * Default colors for the scatter plot\n */\nexport const COLORS = {\n primary: \"#4575b4\",\n selected: \"#d73027\",\n unselected: \"#cccccc\",\n hover: \"#fdae61\",\n gridLine: \"#e0e0e0\",\n axisLine: \"#333333\",\n background: \"#ffffff\",\n};\n\n/**\n * Default color scale for continuous color mapping\n */\nexport const DEFAULT_COLOR_SCALE: Array<[number, string]> = [\n [0, \"#313695\"],\n [0.25, \"#4575b4\"],\n [0.5, \"#ffffbf\"],\n [0.75, \"#fdae61\"],\n [1, \"#a50026\"],\n];\n\n/**\n * Default category colors (cycle through these)\n */\nexport const DEFAULT_CATEGORY_COLORS = [\n \"#4575b4\", // Blue\n \"#d73027\", // Red\n \"#1a9850\", // Green\n \"#fdae61\", // Orange\n \"#9467bd\", // Purple\n \"#e377c2\", // Pink\n \"#8c564b\", // Brown\n \"#bcbd22\", // Olive\n \"#17becf\", // Cyan\n \"#ff7f0e\", // Dark orange\n];\n\n/**\n * Default sizes\n */\nexport const DEFAULT_MARKER_SIZE = 8;\nexport const DEFAULT_SIZE_RANGE: [number, number] = [4, 20];\n\n/**\n * Default downsampling configuration\n */\nexport const DEFAULT_MAX_POINTS = 5000;\n\n/**\n * Constants for plot layout\n */\nexport const PLOT_CONSTANTS = {\n MARGIN_LEFT: 80,\n MARGIN_RIGHT: 30,\n MARGIN_TOP: 80,\n MARGIN_BOTTOM: 80,\n TITLE_FONT_SIZE: 20,\n AXIS_TITLE_FONT_SIZE: 16,\n AXIS_TICK_FONT_SIZE: 12,\n LEGEND_FONT_SIZE: 12,\n FONT_FAMILY: \"Inter, sans-serif\",\n GRID_WIDTH: 1,\n AXIS_LINE_WIDTH: 1,\n AUTO_RANGE_PADDING: 0.1, // 10% padding\n};\n\n/**\n * Selection mode keyboard modifiers\n */\nexport const SELECTION_MODIFIERS = {\n ADD: \"shiftKey\", // Shift\n REMOVE: \"ctrlKey\", // Ctrl/Cmd\n TOGGLE: \"both\", // Shift + Ctrl/Cmd\n} as const;\n","import {\n DEFAULT_CATEGORY_COLORS,\n DEFAULT_MAX_POINTS,\n DEFAULT_MARKER_SIZE,\n DEFAULT_SIZE_RANGE,\n PLOT_CONSTANTS,\n} from \"./constants\";\n\nimport type {\n AxisConfig,\n ColorMapping,\n DownsamplingConfig,\n ScatterPoint,\n SelectionMode,\n ShapeMapping,\n SizeMapping,\n} from \"./types\";\n\n/**\n * Calculate min and max values for a numeric field in the data\n */\nexport function calculateRange(data: ScatterPoint[], field: string): { min: number; max: number } {\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n for (const point of data) {\n const value = point.metadata?.[field];\n if (typeof value === \"number\" && Number.isFinite(value)) {\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n }\n\n // Handle edge case where all values are invalid\n if (!Number.isFinite(min) || !Number.isFinite(max)) {\n return { min: 0, max: 1 };\n }\n\n // Handle edge case where min === max\n if (min === max) {\n return { min: min - 1, max: max + 1 };\n }\n\n return { min, max };\n}\n\n/**\n * Get unique categorical values from a field\n */\nexport function getUniqueCategories(data: ScatterPoint[], field: string): string[] {\n const uniqueCategories = data\n .map((point) => point.metadata?.[field])\n .filter((value): value is string => typeof value === \"string\");\n\n return [...new Set(uniqueCategories)].sort();\n}\n\n/**\n * Map colors based on color mapping configuration\n */\nexport function mapColors(data: ScatterPoint[], colorMapping: ColorMapping | undefined): string[] {\n if (!colorMapping || colorMapping.type === \"static\") {\n const color = colorMapping?.value || \"#4575b4\";\n return new Array(data.length).fill(color);\n }\n\n if (colorMapping.type === \"categorical\" && colorMapping.field) {\n const categories = getUniqueCategories(data, colorMapping.field);\n const colorMap = colorMapping.categoryColors || {};\n\n // Assign default colors to categories without explicit colors\n const categoryColorMap: Record<string, string> = {};\n categories.forEach((category, index) => {\n categoryColorMap[category] =\n colorMap[category] || DEFAULT_CATEGORY_COLORS[index % DEFAULT_CATEGORY_COLORS.length];\n });\n\n return data.map((point) => {\n const value = point.metadata?.[colorMapping.field!];\n return categoryColorMap[String(value)] || DEFAULT_CATEGORY_COLORS[0];\n });\n }\n\n return new Array(data.length).fill(\"#4575b4\");\n}\n\n/**\n * Map shapes based on shape mapping configuration\n */\nexport function mapShapes(data: ScatterPoint[], shapeMapping: ShapeMapping | undefined): string[] {\n if (!shapeMapping || shapeMapping.type === \"static\") {\n const shape = shapeMapping?.value || \"circle\";\n return new Array(data.length).fill(shape);\n }\n\n if (shapeMapping.type === \"categorical\" && shapeMapping.field) {\n const categories = getUniqueCategories(data, shapeMapping.field);\n const shapeMap = shapeMapping.categoryShapes || {};\n const defaultShapes = [\"circle\", \"square\", \"diamond\", \"cross\", \"x\", \"triangle-up\", \"triangle-down\", \"star\"];\n\n // Assign default shapes to categories without explicit shapes\n const categoryShapeMap: Record<string, string> = {};\n categories.forEach((category, index) => {\n categoryShapeMap[category] = shapeMap[category] || defaultShapes[index % defaultShapes.length];\n });\n\n return data.map((point) => {\n const value = point.metadata?.[shapeMapping.field!];\n return categoryShapeMap[String(value)] || \"circle\";\n });\n }\n\n return new Array(data.length).fill(\"circle\");\n}\n\n/**\n * Map sizes based on size mapping configuration\n */\nexport function mapSizes(data: ScatterPoint[], sizeMapping: SizeMapping | undefined): number[] {\n if (!sizeMapping || sizeMapping.type === \"static\") {\n const size = sizeMapping?.value || DEFAULT_MARKER_SIZE;\n return new Array(data.length).fill(size);\n }\n\n if (sizeMapping.type === \"categorical\" && sizeMapping.field) {\n const categories = getUniqueCategories(data, sizeMapping.field);\n const sizeMap = sizeMapping.categorySizes || {};\n\n // Assign default sizes to categories without explicit sizes\n const categorySizeMap: Record<string, number> = {};\n categories.forEach((category, index) => {\n categorySizeMap[category] = sizeMap[category] || DEFAULT_MARKER_SIZE + index * 2;\n });\n\n return data.map((point) => {\n const value = point.metadata?.[sizeMapping.field!];\n return categorySizeMap[String(value)] || DEFAULT_MARKER_SIZE;\n });\n }\n\n if (sizeMapping.type === \"continuous\" && sizeMapping.field) {\n const range =\n sizeMapping.min !== undefined && sizeMapping.max !== undefined\n ? { min: sizeMapping.min, max: sizeMapping.max }\n : calculateRange(data, sizeMapping.field);\n\n const sizeRange = sizeMapping.sizeRange || DEFAULT_SIZE_RANGE;\n const [minSize, maxSize] = sizeRange;\n\n return data.map((point) => {\n const value = point.metadata?.[sizeMapping.field!];\n if (typeof value === \"number\" && Number.isFinite(value)) {\n // Normalize and map to size range\n const normalized = (value - range.min) / (range.max - range.min);\n return minSize + normalized * (maxSize - minSize);\n }\n return DEFAULT_MARKER_SIZE;\n });\n }\n\n return new Array(data.length).fill(DEFAULT_MARKER_SIZE);\n}\n\n/**\n * Downsample data using specified strategy\n */\nexport function downsampleData(data: ScatterPoint[], config: DownsamplingConfig): ScatterPoint[] {\n if (!config.enabled || data.length <= (config.maxPoints || DEFAULT_MAX_POINTS)) {\n return data;\n }\n\n const maxPoints = config.maxPoints || DEFAULT_MAX_POINTS;\n const strategy = config.strategy || \"lttb\";\n\n if (strategy === \"lttb\") {\n // Largest Triangle Three Buckets algorithm\n return lttbDownsample(data, maxPoints);\n }\n\n return data;\n}\n\n/**\n * Compute the (x, y) centroid of data[start..end).\n * Falls back to the point at clamp(start, 0, dataLength-1) when the range is\n * empty (only reachable under extreme floating-point drift) to prevent NaN.\n */\nfunction bucketCentroid(\n data: ScatterPoint[],\n start: number,\n end: number,\n dataLength: number,\n): { x: number; y: number } {\n const length = end - start;\n if (length > 0) {\n let sumX = 0;\n let sumY = 0;\n for (let j = start; j < end; j++) {\n sumX += data[j].x;\n sumY += data[j].y;\n }\n return { x: sumX / length, y: sumY / length };\n }\n const fallbackIdx = Math.max(0, Math.min(start, dataLength - 1));\n return { x: data[fallbackIdx].x, y: data[fallbackIdx].y };\n}\n\n/**\n * Largest Triangle Three Buckets (LTTB) downsampling algorithm.\n * Preserves the visual shape of the data by maximizing the triangle area\n * formed by adjacent bucket centroids and each candidate point.\n * Exported for unit testing\n */\nexport function lttbDownsample(data: ScatterPoint[], threshold: number): ScatterPoint[] {\n const dataLength = data.length;\n\n // --- Edge cases ---\n if (threshold <= 0 || dataLength === 0) return [];\n // No downsampling needed; return the original reference unchanged.\n if (threshold >= dataLength) return data;\n if (threshold === 1) return [data[0]];\n if (threshold === 2) return [data[0], data[dataLength - 1]];\n\n // At this point: 3 <= threshold < dataLength, so dataLength >= 4.\n // Spread (dataLength - 2) interior points across (threshold - 2) buckets,\n // keeping the first and last points fixed outside the buckets.\n // With threshold < dataLength, every > 1, so no bucket is ever empty.\n const every = (dataLength - 2) / (threshold - 2);\n\n const { floor, abs, min } = Math;\n const sampled: ScatterPoint[] = [data[0]];\n\n // Index of the previously selected point — left vertex A of the triangle.\n let a = 0;\n\n for (let i = 0; i < threshold - 2; i++) {\n // Centroid of the *next* bucket — right vertex C of the triangle.\n // Biases candidate selection toward points that preserve visual variance.\n const avgRangeStart = min(floor((i + 1) * every) + 1, dataLength - 1);\n const avgRangeEnd = min(floor((i + 2) * every) + 1, dataLength);\n const { x: avgX, y: avgY } = bucketCentroid(data, avgRangeStart, avgRangeEnd, dataLength);\n\n // Boundaries of the current bucket — middle vertex B candidates.\n // Clamped to valid index range to guard against floating-point drift.\n const rangeStart = min(floor(i * every) + 1, dataLength - 1);\n const rangeEnd = min(floor((i + 1) * every) + 1, dataLength - 1);\n\n const pointAX = data[a].x;\n const pointAY = data[a].y;\n\n // Safe fallback: first point in the bucket, used when the bucket is degenerate.\n let maxArea = -1;\n let maxAreaPoint: ScatterPoint = data[rangeStart];\n let nextA = rangeStart;\n\n for (let j = rangeStart; j < rangeEnd; j++) {\n // Area of the triangle formed by A (prev selected), B (candidate), C (next centroid).\n // The point maximising this area is the most visually significant in the bucket.\n const area = abs((pointAX - avgX) * (data[j].y - pointAY) - (pointAX - data[j].x) * (avgY - pointAY)) * 0.5;\n if (area > maxArea) {\n maxArea = area;\n maxAreaPoint = data[j];\n nextA = j;\n }\n }\n\n sampled.push(maxAreaPoint);\n a = nextA;\n }\n\n sampled.push(data[dataLength - 1]); // Always include the last point.\n\n return sampled;\n}\n\n/**\n * Generate default tooltip content\n */\nexport function generateTooltipContent(point: ScatterPoint, fields?: string[]): string {\n const lines: string[] = [];\n\n // Always include x, y\n lines.push(`X: ${point.x.toFixed(2)}`);\n lines.push(`Y: ${point.y.toFixed(2)}`);\n\n // Add label if present\n if (point.label) {\n lines.push(`Label: ${point.label}`);\n }\n\n // Add requested fields from metadata\n if (fields && point.metadata) {\n for (const field of fields) {\n if (field in point.metadata) {\n const value = point.metadata[field];\n lines.push(`${field}: ${value}`);\n }\n }\n } else if (point.metadata && !fields) {\n // If no fields specified, show all metadata\n for (const [key, value] of Object.entries(point.metadata)) {\n lines.push(`${key}: ${value}`);\n }\n }\n\n return lines.join(\"<br>\");\n}\n\n/**\n * Determine selection mode from keyboard event\n */\nexport function getSelectionMode(event: { shiftKey: boolean; ctrlKey: boolean; metaKey: boolean }): SelectionMode {\n const ctrlOrCmd = event.ctrlKey || event.metaKey;\n\n if (event.shiftKey && ctrlOrCmd) {\n return \"toggle\";\n }\n if (event.shiftKey) {\n return \"add\";\n }\n if (ctrlOrCmd) {\n return \"remove\";\n }\n return \"replace\";\n}\n\n/**\n * Calculate axis range with padding.\n *\n * When `scale` is `\"log\"`, the returned range is in log10 units (what Plotly\n * expects for `type: \"log\"` axes), and padding is applied in log-space so that\n * the visual margin is proportional on the logarithmic axis.\n */\nexport function calculateAxisRange(\n data: ScatterPoint[],\n axis: \"x\" | \"y\",\n padding = 0.1,\n scale: \"linear\" | \"log\" = \"linear\",\n): [number, number] {\n const isLog = scale === \"log\";\n let min = Infinity;\n let max = -Infinity;\n\n for (const point of data) {\n const v = point[axis];\n if (!Number.isFinite(v)) continue;\n // log10 is undefined for non-positive values — skip them silently\n if (isLog && v <= 0) continue;\n // Plotly log axes expect range bounds in log10 units\n const mapped = isLog ? Math.log10(v) : v;\n if (mapped < min) min = mapped;\n if (mapped > max) max = mapped;\n }\n\n if (!Number.isFinite(min)) {\n return [0, 1];\n }\n\n if (min === max) {\n return [min - 1, max + 1];\n }\n\n const range = max - min;\n return [min - range * padding, max + range * padding];\n}\n\n/**\n * Apply selection to a set of point IDs\n */\nexport function applySelection(\n currentSelection: Set<string | number>,\n newIds: Set<string | number>,\n mode: SelectionMode,\n): Set<string | number> {\n const result = new Set(currentSelection);\n\n switch (mode) {\n case \"replace\":\n return new Set(newIds);\n\n case \"add\":\n for (const id of newIds) {\n result.add(id);\n }\n return result;\n\n case \"remove\":\n for (const id of newIds) {\n result.delete(id);\n }\n return result;\n\n case \"toggle\":\n for (const id of newIds) {\n if (result.has(id)) {\n result.delete(id);\n } else {\n result.add(id);\n }\n }\n return result;\n\n default:\n return result;\n }\n}\n\nexport const getPlotlyLayoutConfig = ({\n title,\n xAxis,\n yAxis,\n width,\n height,\n xRange,\n yRange,\n enableLassoSelection,\n enableBoxSelection,\n}: {\n title: string | undefined;\n xAxis: AxisConfig;\n yAxis: AxisConfig;\n width: number;\n height: number;\n xRange: [number, number] | undefined;\n yRange: [number, number] | undefined;\n enableLassoSelection: boolean;\n enableBoxSelection: boolean;\n}): Partial<Plotly.Layout> => ({\n autosize: false,\n width,\n height,\n title: title\n ? {\n text: title,\n font: {\n family: PLOT_CONSTANTS.FONT_FAMILY,\n size: PLOT_CONSTANTS.TITLE_FONT_SIZE,\n color: \"#333333\",\n },\n x: 0.5,\n xanchor: \"center\",\n }\n : undefined,\n margin: {\n l: PLOT_CONSTANTS.MARGIN_LEFT,\n r: PLOT_CONSTANTS.MARGIN_RIGHT,\n t: title ? PLOT_CONSTANTS.MARGIN_TOP : PLOT_CONSTANTS.MARGIN_TOP - PLOT_CONSTANTS.TITLE_FONT_SIZE,\n b: PLOT_CONSTANTS.MARGIN_BOTTOM,\n },\n xaxis: {\n title: {\n text: xAxis.title || \"\",\n font: {\n family: PLOT_CONSTANTS.FONT_FAMILY,\n size: PLOT_CONSTANTS.AXIS_TITLE_FONT_SIZE,\n color: \"#333333\",\n },\n },\n type: xAxis.scale === \"log\" ? \"log\" : \"linear\",\n range: xRange,\n autorange: !xRange,\n gridcolor: \"#e0e0e0\",\n linecolor: \"#333333\",\n linewidth: PLOT_CONSTANTS.AXIS_LINE_WIDTH,\n tickfont: {\n family: PLOT_CONSTANTS.FONT_FAMILY,\n size: PLOT_CONSTANTS.AXIS_TICK_FONT_SIZE,\n },\n zeroline: false,\n },\n yaxis: {\n title: {\n text: yAxis.title || \"\",\n font: {\n family: PLOT_CONSTANTS.FONT_FAMILY,\n size: PLOT_CONSTANTS.AXIS_TITLE_FONT_SIZE,\n color: \"#333333\",\n },\n },\n type: yAxis.scale === \"log\" ? \"log\" : \"linear\",\n range: yRange,\n autorange: !yRange,\n gridcolor: \"#e0e0e0\",\n linecolor: \"#333333\",\n linewidth: PLOT_CONSTANTS.AXIS_LINE_WIDTH,\n tickfont: {\n family: PLOT_CONSTANTS.FONT_FAMILY,\n size: PLOT_CONSTANTS.AXIS_TICK_FONT_SIZE,\n },\n zeroline: false,\n },\n paper_bgcolor: \"#ffffff\",\n plot_bgcolor: \"#ffffff\",\n font: {\n family: PLOT_CONSTANTS.FONT_FAMILY,\n color: \"#333333\",\n },\n hovermode: \"closest\",\n dragmode: enableLassoSelection ? \"lasso\" : enableBoxSelection ? \"select\" : false,\n});\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { DEFAULT_COLOR_SCALE, PLOT_CONSTANTS } from \"./constants\";\nimport \"./InteractiveScatter.scss\";\nimport {\n applySelection,\n calculateAxisRange,\n calculateRange,\n downsampleData,\n generateTooltipContent,\n getPlotlyLayoutConfig,\n getSelectionMode,\n mapColors,\n mapShapes,\n mapSizes,\n} from \"./utils\";\n\nimport type { InteractiveScatterProps, SelectionMode } from \"./types\";\n\n/**\n * InteractiveScatter component for visualizing scatter plot data with advanced interactions.\n *\n * **Features:**\n * - Data-driven and static styling (color, shape, size)\n * - Interactive selection (click, box, lasso)\n * - Keyboard modifiers for click-selection modes (Shift/Ctrl)\n * - Customizable tooltips with rich content support\n * - Axis customization (ranges, log/linear scales)\n * - Performance optimizations for large datasets\n * - Selection propagation via callbacks\n *\n * **Selection Modes (click selection only):**\n * - Default click: Replace selection\n * - Shift + click: Add to selection\n * - Ctrl/Cmd + click: Remove from selection\n * - Shift + Ctrl + click: Toggle selection\n *\n * Box/lasso selection always replaces the current selection because\n * Plotly does not expose the original keyboard event for drag operations.\n */\nconst InteractiveScatter: React.FC<InteractiveScatterProps> = ({\n data,\n title,\n xAxis = {},\n yAxis = {},\n colorMapping,\n shapeMapping,\n sizeMapping,\n tooltip = { enabled: true },\n enableClickSelection = true,\n enableBoxSelection = true,\n enableLassoSelection = true,\n selectedIds: controlledSelectedIds,\n onSelectionChange,\n onPointClick,\n downsampling,\n width = 800,\n height = 600,\n showColorBar = true,\n className,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const onSelectionChangeRef = useRef(onSelectionChange);\n const onPointClickRef = useRef(onPointClick);\n const selectedIdsRef = useRef<Set<string | number>>(new Set());\n const isControlledRef = useRef(false);\n\n // Keep refs updated\n onSelectionChangeRef.current = onSelectionChange;\n onPointClickRef.current = onPointClick;\n\n // Internal selection state (only used in uncontrolled mode)\n const [internalSelectedIds, setInternalSelectedIds] = useState<Set<string | number>>(new Set());\n\n // Use controlled or uncontrolled selection\n const isControlled = controlledSelectedIds !== undefined;\n const selectedIds = isControlled ? controlledSelectedIds : internalSelectedIds;\n selectedIdsRef.current = selectedIds;\n isControlledRef.current = isControlled;\n\n // Normalize to strings so numeric IDs passed by consumers always match the\n // string IDs that Plotly stores (we always do String(p.id) when building the trace).\n const normalizedSelectedIds = useMemo(() => new Set([...selectedIds].map(String)), [selectedIds]);\n\n // Reverse-lookup: Plotly string ID → original (possibly numeric) ScatterPoint ID.\n // Used to restore original ID types when echoing selections back to consumers.\n const originalIdLookup = useMemo(() => new Map(data.map((p) => [String(p.id), p.id])), [data]);\n\n // Apply downsampling if configured\n const processedData = useMemo(() => {\n if (!downsampling) {\n return data;\n }\n return downsampleData(data, downsampling);\n }, [data, downsampling]);\n\n // Map colors, shapes, and sizes based on configuration\n const colors = useMemo(() => mapColors(processedData, colorMapping), [processedData, colorMapping]);\n\n const shapes = useMemo(() => mapShapes(processedData, shapeMapping), [processedData, shapeMapping]);\n\n const sizes = useMemo(() => mapSizes(processedData, sizeMapping), [processedData, sizeMapping]);\n\n // Calculate axis ranges\n const xRange = useMemo(() => {\n if (xAxis.range) return xAxis.range;\n if (xAxis.autoRange === false) return;\n return calculateAxisRange(processedData, \"x\", xAxis.autoRangePadding ?? PLOT_CONSTANTS.AUTO_RANGE_PADDING, xAxis.scale);\n }, [processedData, xAxis]);\n\n const yRange = useMemo(() => {\n if (yAxis.range) return yAxis.range;\n if (yAxis.autoRange === false) return;\n return calculateAxisRange(processedData, \"y\", yAxis.autoRangePadding ?? PLOT_CONSTANTS.AUTO_RANGE_PADDING, yAxis.scale);\n }, [processedData, yAxis]);\n\n const tooltipEnabled = tooltip.enabled !== false;\n\n // Build tooltip text\n const tooltipText = useMemo(() => {\n if (!tooltipEnabled) return [];\n\n return processedData.map((point) =>\n tooltip.content ? tooltip.content(point) : generateTooltipContent(point, tooltip.fields),\n );\n }, [processedData, tooltip, tooltipEnabled]);\n\n // Prepare Plotly-compatible color data\n const plotlyColors = useMemo(() => {\n if (colorMapping?.type === \"continuous\" && colorMapping.field && processedData.length > 0) {\n // For continuous mapping, extract the numeric values\n return processedData.map((point) => {\n const value = point.metadata?.[colorMapping.field!];\n return typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n });\n }\n return colors;\n }, [processedData, colorMapping, colors]);\n\n // Build colorscale for continuous mapping\n const plotlyColorscale = useMemo(() => {\n if (colorMapping?.type === \"continuous\") {\n const scale = colorMapping.colorScale || DEFAULT_COLOR_SCALE;\n return typeof scale === \"string\" ? scale : scale;\n }\n }, [colorMapping]);\n\n // Build marker configuration for Plotly\n const markerConfig = useMemo((): Partial<Plotly.PlotMarker> => {\n const config: Partial<Plotly.PlotMarker> = {\n size: sizes,\n symbol: shapes,\n line: {\n color: \"#ffffff\",\n width: 1,\n },\n };\n\n // Configure color mapping\n if (colorMapping?.type === \"continuous\" && plotlyColorscale) {\n config.color = plotlyColors as number[];\n config.colorscale = plotlyColorscale;\n config.showscale = showColorBar;\n\n if (colorMapping.field) {\n const range =\n colorMapping.min !== undefined && colorMapping.max !== undefined\n ? { min: colorMapping.min, max: colorMapping.max }\n : calculateRange(processedData, colorMapping.field);\n config.cmin = range.min;\n config.cmax = range.max;\n config.colorbar = {\n title: { text: colorMapping.field, side: \"right\" },\n thickness: 20,\n len: 0.7,\n };\n }\n } else {\n config.color = colors;\n }\n\n return config;\n }, [sizes, shapes, colorMapping, plotlyColorscale, plotlyColors, showColorBar, processedData, colors]);\n\n // Create Plotly plot\n useEffect(() => {\n const currentRef = plotRef.current;\n if (!currentRef || processedData.length === 0) return;\n\n const xValues = processedData.map((p) => p.x);\n const yValues = processedData.map((p) => p.y);\n const ids = processedData.map((p) => String(p.id));\n\n // Create base trace\n const trace: Partial<Plotly.PlotData> & {\n unselected?: { marker?: { opacity?: number } };\n selected?: { marker?: { opacity?: number; line?: { color?: string; width?: number } } };\n } = {\n x: xValues,\n y: yValues,\n ids,\n mode: \"markers\",\n type: \"scatter\",\n marker: markerConfig,\n hoverinfo: tooltipEnabled ? \"text\" : \"skip\",\n text: tooltipText,\n hovertemplate: tooltipEnabled ? \"%{text}<extra></extra>\" : undefined,\n showlegend: false,\n unselected: {\n marker: {\n opacity: 0.3,\n },\n },\n selected: {\n marker: {\n opacity: 1,\n line: {\n color: \"#d73027\",\n width: 2,\n },\n },\n },\n };\n\n const plotData: Plotly.Data[] = [trace as Plotly.Data];\n\n // Configure layout\n const layout: Partial<Plotly.Layout> = getPlotlyLayoutConfig({\n title,\n xAxis,\n yAxis,\n width,\n height,\n xRange,\n yRange,\n enableLassoSelection,\n enableBoxSelection,\n });\n\n const config: Partial<Plotly.Config> = {\n responsive: true,\n displayModeBar: true,\n displaylogo: false,\n modeBarButtonsToAdd: [],\n modeBarButtonsToRemove: [\"toImage\"],\n };\n\n // Add selection mode buttons if enabled\n if (enableBoxSelection) {\n config.modeBarButtonsToAdd?.push(\"select2d\" as never);\n }\n if (enableLassoSelection) {\n config.modeBarButtonsToAdd?.push(\"lasso2d\" as never);\n }\n\n Plotly.newPlot(currentRef, plotData, layout, config);\n\n // Attach event handlers\n const plotElement = currentRef as unknown as Plotly.PlotlyHTMLElement;\n\n // Handle point click\n if (enableClickSelection) {\n plotElement.on(\"plotly_click\", (eventData: Plotly.PlotMouseEvent) => {\n const point = eventData.points[0];\n if (point && point.data.ids) {\n const clickedId = point.data.ids[point.pointIndex];\n const clickedPoint = processedData.find((p) => String(p.id) === clickedId);\n\n if (clickedPoint) {\n // Call point click handler if provided\n onPointClickRef.current?.(clickedPoint, eventData.event as MouseEvent);\n\n // Handle selection. Use the original-typed ID from the matched point so\n // numeric IDs (e.g., 123) are preserved instead of being coerced to \"123\".\n const mode = getSelectionMode(eventData.event as MouseEvent);\n const newSelection = applySelection(selectedIdsRef.current, new Set([clickedPoint.id]), mode);\n\n if (!isControlledRef.current) {\n setInternalSelectedIds(newSelection);\n }\n onSelectionChangeRef.current?.(newSelection, mode);\n }\n }\n });\n }\n\n // Handle box/lasso selection\n if (enableBoxSelection || enableLassoSelection) {\n plotElement.on(\"plotly_selected\", (eventData: Plotly.PlotSelectionEvent) => {\n if (eventData && eventData.points) {\n const selectedPointIds = eventData.points\n .map((p): string | number | null => {\n if (p.data.ids && p.pointIndex !== undefined) {\n const strId = p.data.ids[p.pointIndex] as string;\n // Restore the original ID type (string or number) via the lookup.\n return originalIdLookup.get(strId) ?? strId;\n }\n return null;\n })\n .filter((id: string | number | null): id is string | number => id !== null);\n\n // Get selection mode from keyboard state\n // Note: Plotly doesn't pass the original event, so we can't detect modifiers\n // For now, box/lasso selection always replaces\n const mode: SelectionMode = \"replace\";\n const newSelection = new Set<string | number>(selectedPointIds);\n\n if (!isControlledRef.current) {\n setInternalSelectedIds(newSelection);\n }\n onSelectionChangeRef.current?.(newSelection, mode);\n }\n });\n\n // Handle deselect (clicking on background)\n plotElement.on(\"plotly_deselect\", () => {\n const newSelection = new Set<string | number>();\n if (!isControlledRef.current) {\n setInternalSelectedIds(newSelection);\n }\n onSelectionChangeRef.current?.(newSelection, \"replace\");\n });\n }\n\n return () => {\n if (currentRef) {\n Plotly.purge(currentRef);\n }\n };\n }, [\n processedData,\n markerConfig,\n xAxis,\n yAxis,\n xRange,\n yRange,\n title,\n width,\n height,\n tooltip,\n tooltipText,\n enableClickSelection,\n enableBoxSelection,\n enableLassoSelection,\n originalIdLookup,\n tooltipEnabled,\n ]);\n\n // Apply selection state to Plotly\n useEffect(() => {\n const currentRef = plotRef.current;\n if (!currentRef || processedData.length === 0) return;\n\n const plotElement = currentRef as unknown as Plotly.PlotlyHTMLElement;\n\n // Find indices of selected points. Use the string-normalized set to match the string IDs Plotly stores\n const selectedIndices = processedData\n .map((point, index) => (normalizedSelectedIds.has(String(point.id)) ? index : null))\n .filter((index): index is number => index !== null);\n\n // Update Plotly selection\n if (selectedIndices.length > 0) {\n Plotly.restyle(\n plotElement,\n {\n selectedpoints: [selectedIndices],\n },\n [0],\n );\n } else {\n Plotly.restyle(\n plotElement,\n {\n selectedpoints: [null],\n },\n [0],\n );\n }\n }, [normalizedSelectedIds, processedData]);\n\n const containerClassName = className ? `interactive-scatter ${className}` : \"interactive-scatter\";\n\n return (\n <div className={containerClassName}>\n <div ref={plotRef} className=\"interactive-scatter__plot\" style={{ width, height }} />\n </div>\n );\n};\n\nexport { InteractiveScatter };\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\n\nimport \"./LineGraph.scss\";\nimport { COLORS } from \"../../../utils/colors\";\n\ntype MarkerSymbol =\n | \"circle\"\n | \"circle-open\"\n | \"circle-dot\"\n | \"circle-open-dot\"\n | \"square\"\n | \"square-open\"\n | \"square-dot\"\n | \"square-open-dot\"\n | \"diamond\"\n | \"diamond-open\"\n | \"diamond-dot\"\n | \"diamond-open-dot\"\n | \"cross\"\n | \"cross-open\"\n | \"cross-dot\"\n | \"cross-open-dot\"\n | \"x\"\n | \"x-open\"\n | \"x-dot\"\n | \"x-open-dot\"\n | \"triangle-up\"\n | \"triangle-up-open\"\n | \"triangle-up-dot\"\n | \"triangle-up-open-dot\"\n | \"triangle-down\"\n | \"triangle-down-open\"\n | \"triangle-down-dot\"\n | \"triangle-down-open-dot\"\n | \"triangle-left\"\n | \"triangle-left-open\"\n | \"triangle-left-dot\"\n | \"triangle-left-open-dot\"\n | \"triangle-right\"\n | \"triangle-right-open\"\n | \"triangle-right-dot\"\n | \"triangle-right-open-dot\"\n | \"triangle-ne\"\n | \"triangle-ne-open\"\n | \"triangle-ne-dot\"\n | \"triangle-ne-open-dot\"\n | \"triangle-se\"\n | \"triangle-se-open\"\n | \"triangle-se-dot\"\n | \"triangle-se-open-dot\"\n | \"triangle-sw\"\n | \"triangle-sw-open\"\n | \"triangle-sw-dot\"\n | \"triangle-sw-open-dot\"\n | \"triangle-nw\"\n | \"triangle-nw-open\"\n | \"triangle-nw-dot\"\n | \"triangle-nw-open-dot\"\n | \"pentagon\"\n | \"pentagon-open\"\n | \"pentagon-dot\"\n | \"pentagon-open-dot\"\n | \"hexagon\"\n | \"hexagon-open\"\n | \"hexagon-dot\"\n | \"hexagon-open-dot\"\n | \"hexagon2\"\n | \"hexagon2-open\"\n | \"hexagon2-dot\"\n | \"hexagon2-open-dot\"\n | \"octagon\"\n | \"octagon-open\"\n | \"octagon-dot\"\n | \"octagon-open-dot\"\n | \"star\"\n | \"star-open\"\n | \"star-dot\"\n | \"star-open-dot\"\n | \"hexagram\"\n | \"hexagram-open\"\n | \"hexagram-dot\"\n | \"hexagram-open-dot\"\n | \"star-triangle-up\"\n | \"star-triangle-up-open\"\n | \"star-triangle-up-dot\"\n | \"star-triangle-up-open-dot\"\n | \"star-triangle-down\"\n | \"star-triangle-down-open\"\n | \"star-triangle-down-dot\"\n | \"star-triangle-down-open-dot\"\n | \"star-square\"\n | \"star-square-open\"\n | \"star-square-dot\"\n | \"star-square-open-dot\"\n | \"star-diamond\"\n | \"star-diamond-open\"\n | \"star-diamond-dot\"\n | \"star-diamond-open-dot\"\n | \"diamond-tall\"\n | \"diamond-tall-open\"\n | \"diamond-tall-dot\"\n | \"diamond-tall-open-dot\"\n | \"diamond-wide\"\n | \"diamond-wide-open\"\n | \"diamond-wide-dot\"\n | \"diamond-wide-open-dot\"\n | \"hourglass\"\n | \"hourglass-open\"\n | \"bowtie\"\n | \"bowtie-open\"\n | \"circle-cross\"\n | \"circle-cross-open\"\n | \"circle-x\"\n | \"circle-x-open\"\n | \"square-cross\"\n | \"square-cross-open\"\n | \"square-x\"\n | \"square-x-open\"\n | \"diamond-cross\"\n | \"diamond-cross-open\"\n | \"diamond-x\"\n | \"diamond-x-open\"\n | \"cross-thin\"\n | \"cross-thin-open\"\n | \"x-thin\"\n | \"x-thin-open\"\n | \"asterisk\"\n | \"asterisk-open\"\n | \"hash\"\n | \"hash-open\"\n | \"hash-dot\"\n | \"hash-open-dot\"\n | \"y-up\"\n | \"y-up-open\"\n | \"y-down\"\n | \"y-down-open\"\n | \"y-left\"\n | \"y-left-open\"\n | \"y-right\"\n | \"y-right-open\"\n | \"line-ew\"\n | \"line-ew-open\"\n | \"line-ns\"\n | \"line-ns-open\"\n | \"line-ne\"\n | \"line-ne-open\"\n | \"line-nw\"\n | \"line-nw-open\"\n | \"arrow\"\n | \"arrow-open\"\n | \"arrow-wide\"\n | \"arrow-wide-open\";\n\ninterface LineDataSeries {\n x: number[];\n y: number[];\n name: string;\n color: string;\n symbol?: MarkerSymbol;\n error_y?: {\n type: \"data\";\n array: number[];\n visible: boolean;\n };\n}\n\ntype LineGraphVariant = \"lines\" | \"lines+markers\" | \"lines+markers+error_bars\";\n\ntype LineGraphProps = {\n dataSeries: LineDataSeries[];\n width?: number;\n height?: number;\n xRange?: [number, number];\n yRange?: [number, number];\n variant?: LineGraphVariant;\n xTitle?: string;\n yTitle?: string;\n title?: string;\n};\n\nconst LineGraph: React.FC<LineGraphProps> = ({\n dataSeries,\n width = 1000,\n height = 600,\n xRange,\n yRange,\n variant = \"lines\",\n xTitle = \"Columns\",\n yTitle = \"Rows\",\n title = \"Line Graph\",\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n\n const { yMin, yMax } = useMemo(() => {\n let minX = Number.MAX_VALUE;\n let maxX = Number.MIN_VALUE;\n let minY = Number.MAX_VALUE;\n let maxY = Number.MIN_VALUE;\n\n dataSeries.forEach((series) => {\n series.x.forEach((x) => {\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n });\n series.y.forEach((y) => {\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n const xPadding = (maxX - minX) * 0.1;\n const yPadding = (maxY - minY) * 0.1;\n\n return {\n xMin: minX - xPadding,\n xMax: maxX + xPadding,\n yMin: minY - yPadding,\n yMax: maxY + yPadding,\n };\n }, [dataSeries]);\n\n const effectiveYRange = useMemo(\n () => yRange || [yMin, yMax],\n [yRange, yMin, yMax],\n );\n\n const yTicks = useMemo(() => {\n const range = effectiveYRange[1] - effectiveYRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveYRange[0] / step) * step;\n while (current <= effectiveYRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveYRange]);\n\n const xTicks = useMemo(\n () => [...new Set(dataSeries.flatMap((s) => s.x))],\n [dataSeries],\n );\n\n const mode = useMemo((): \"lines\" | \"lines+markers\" => {\n switch (variant) {\n case \"lines+markers\":\n case \"lines+markers+error_bars\":\n return \"lines+markers\";\n default:\n return \"lines\";\n }\n }, [variant]);\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: COLORS.GREY_200,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: COLORS.BLACK_900,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n linecolor: COLORS.BLACK_900,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [],\n );\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n const plotData = dataSeries.map((series) => ({\n x: series.x,\n y: series.y,\n type: \"scatter\" as const,\n mode: mode,\n name: series.name,\n line: {\n color: series.color,\n width: 1.5,\n },\n marker:\n variant === \"lines\"\n ? { opacity: 0 }\n : {\n color: series.color,\n size: 8,\n symbol: series.symbol || \"triangle-up\",\n },\n error_y:\n variant === \"lines+markers+error_bars\"\n ? series.error_y || {\n type: \"data\" as const,\n array: series.y.map(() => 10),\n visible: true,\n color: series.color,\n thickness: 1,\n width: 5,\n }\n : undefined,\n }));\n\n const layout = {\n title: {\n text: title,\n font: {\n size: 32,\n family: \"Inter, sans-serif\",\n color: COLORS.BLACK_900,\n },\n },\n width,\n height,\n margin: { l: 80, r: 30, b: 80, t: 60, pad: 10 },\n paper_bgcolor: COLORS.WHITE,\n plot_bgcolor: COLORS.WHITE,\n font: {\n family: \"Inter, sans-serif\",\n },\n dragmode: false as const,\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: COLORS.BLACK_600,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 32,\n },\n gridcolor: COLORS.GREY_200,\n range: xRange,\n autorange: !xRange,\n tickmode: \"array\" as const,\n tickvals: xTicks,\n ticktext: xTicks.map(String),\n showgrid: true,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: COLORS.BLACK_600,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 30,\n },\n gridcolor: COLORS.GREY_200,\n range: yRange,\n autorange: !yRange,\n tickmode: \"array\" as const,\n tickvals: yTicks,\n showgrid: true,\n ...tickOptions,\n },\n legend: {\n x: 0.5,\n y: -0.2,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n orientation: \"h\" as const,\n font: {\n size: 16,\n color: COLORS.BLUE_900,\n family: \"Inter, sans-serif\",\n weight: 500,\n },\n },\n showlegend: true,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, plotData, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [dataSeries, width, height, xRange, yRange, xTitle, yTitle, title, mode, tickOptions, xTicks, yTicks, effectiveYRange, variant]);\n\n return (\n <div className=\"chart-container\">\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n </div>\n );\n};\n\nexport { LineGraph };\nexport type { LineDataSeries, LineGraphVariant, LineGraphProps, MarkerSymbol };\n","// import { ReactFlowProvider } from \"@xyflow/react\";\nimport { Button } from \"@atoms/Button\";\nimport { Icon, IconName } from \"@atoms/Icon\";\nimport { AppHeader } from \"@molecules/AppHeader\";\nimport { CardSidebar } from \"@molecules/CardSidebar\";\n// import {PipelineBuilder} from \"./pipeline-builder\";\nimport { LaunchContent } from \"@molecules/LaunchContent\";\nimport { Navbar } from \"@molecules/Navbar\";\nimport { ProtocolConfiguration } from \"@molecules/ProtocolConfiguration\";\nimport { Sidebar } from \"@molecules/Sidebar\";\nimport { TabGroup } from \"@molecules/TabGroup\";\nimport React, { useState } from \"react\";\nimport styled from \"styled-components\";\n\nexport interface MainProps {\n userProfile: {\n name: string;\n avatar?: string;\n };\n hostname: string;\n organization: {\n name: string;\n subtext?: string;\n logo?: React.ReactNode;\n };\n}\n\nconst MainContainer = styled.div`\n display: flex;\n flex-direction: column;\n width: 100vw;\n height: 100vh;\n`;\n\nconst ContentContainer = styled.div`\n display: flex;\n flex: 1;\n overflow: hidden;\n`;\n\nconst MainContent = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n`;\n\nconst ContainerWithTabs = styled.div`\n display: flex;\n flex-direction: column;\n background-color: var(--white-900);\n flex: 1;\n overflow: hidden;\n`;\n\nconst MainTabsContainer = styled.div`\n border-bottom: 1px solid var(--grey-200);\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n`;\n\nconst TemplatesHeader = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 24px 0;\n background-color: var(--white-900);\n`;\n\nconst TemplatesTitle = styled.h2`\n font-family: \"Inter\", sans-serif;\n font-size: 20px;\n font-weight: 500;\n color: var(--black-900);\n margin: 0;\n`;\n\nconst ButtonsContainer = styled.div`\n display: flex;\n gap: 8px;\n`;\n\nconst IconButton = styled(Button)`\n border-radius: 4px;\n width: 32px;\n height: 32px;\n`;\n\nconst LeftSide = styled.div`\n width: 360px;\n height: 100%;\n display: flex;\n flex-direction: column;\n padding: 16px 24px;\n overflow: hidden;\n max-height: 100%;\n`;\n\nconst RightSide = styled.div`\n flex: 1;\n height: 100%;\n background-color: var(--grey-100);\n display: flex;\n flex-direction: column;\n`;\n\nconst RightSideTabGroupContainer = styled.div`\n padding: 16px 24px 0 24px;\n`;\n\nconst TemplatesList = styled.div`\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n flex: 1;\n margin-top: 8px;\n max-height: calc(100vh - 240px);\n`;\n\nconst EmptyStateContainer = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: 16px;\n`;\n\nconst EmptyStateText = styled.div`\n color: var(--grey-400);\n font-size: 14px;\n font-weight: 500;\n`;\n\nconst TemplateCardContainer = styled.div`\n cursor: pointer;\n\n &:last-child {\n border-bottom: none;\n }\n`;\n\nconst TemplateCardSidebar = styled(CardSidebar)``;\n\nconst ContentWrapper = styled.div`\n padding: 24px;\n margin-top: -1px;\n flex: 1;\n border-top: 1px solid var(--grey-200);\n`;\n\nconst PipelineWrapper = styled.div`\n height: 100%;\n border: 1px solid var(--grey-200);\n border-radius: 8px;\n overflow: hidden;\n`;\n\nconst Main: React.FC<MainProps> = ({ userProfile, hostname, organization }) => {\n // Define sidebar items\n const sidebarItems = [\n { icon: IconName.SEARCH_DOCUMENT, label: \"Search\" },\n { icon: IconName.SEARCH_SQL, label: \"SQL Search\" },\n { icon: IconName.LAMP, label: \"Projects\" },\n { icon: IconName.PIPELINE, label: \"Pipelines\" },\n { icon: IconName.COMPUTER, label: \"Data & AI Workspace\" },\n { icon: IconName.CUBE, label: \"Artifacts\" },\n { icon: IconName.DATABASE, label: \"Data Sources\" },\n { icon: IconName.PIE_CHART, label: \"Health Monitoring\" },\n { icon: IconName.BULK_CHECK, label: \"Bulk Actions\" },\n { icon: IconName.CODE, label: \"Attribute Management\" },\n { icon: IconName.GEAR, label: \"Administration\" },\n ];\n\n // Tabs for the first tab group (left side)\n const leftTabs = [\n { id: \"templates\", label: \"Templates\" },\n { id: \"protocol\", label: \"Protocol\" },\n { id: \"steps\", label: \"Steps\" },\n ];\n\n // Tabs for the second tab group (right side)\n const rightTabs = [\n { id: \"pipelineBuilder\", label: \"Pipeline Builder\" },\n { id: \"configuration\", label: \"Configuration\" },\n { id: \"launch\", label: \"Launch\" },\n ];\n\n // State hooks\n const [activeItem, setActiveItem] = useState(\"Pipelines\");\n const [activeLeftTab, setActiveLeftTab] = useState(\"templates\");\n const [activeRightTab, setActiveRightTab] = useState(\"pipelineBuilder\");\n const [selectedTemplate, setSelectedTemplate] = useState<string | null>(\"1\");\n\n // Templates data\n const templates = [\n {\n id: \"1\",\n title: \"Tecan D300e and PerkinElmer EnVision to Dotmatics (v1)\",\n description: \"c901ejs\",\n buttonText: \"\",\n linkText: \"\",\n },\n {\n id: \"2\",\n title: \"Bruker D8 Andvanced CRD Raw to IDS(Draft)\",\n description: \"c901ejs\",\n buttonText: \"\",\n linkText: \"\",\n },\n {\n id: \"3\",\n title: \"Extract and Decorate(Draft)\",\n description: \"c901ejs\",\n buttonText: \"\",\n linkText: \"\",\n },\n {\n id: \"4\",\n title: \"Intellict (Que3 Raw to IDS(Draft)\",\n description: \"c901ejs\",\n buttonText: \"\",\n linkText: \"\",\n },\n {\n id: \"5\",\n title: \"Leica Aperio RAW to IDS(Draft)\",\n description: \"c901ejs\",\n buttonText: \"\",\n linkText: \"\",\n },\n {\n id: \"6\",\n title: \"IDS to Benchling(Draft)\",\n description: \"c901ejs\",\n buttonText: \"\",\n linkText: \"\",\n },\n {\n id: \"7\",\n title: \"Lorem Ipsum\",\n description: \"c901ejs\",\n buttonText: \"\",\n linkText: \"\",\n },\n ];\n\n const protocol: { id: string; title: string; description: string }[] = [];\n const steps: { id: string; title: string; description: string }[] = [];\n\n // Handlers\n const handleSidebarItemClick = (label: string) => {\n setActiveItem(label);\n };\n\n const handleLeftTabChange = (tabId: string) => {\n setActiveLeftTab(tabId);\n };\n\n const handleRightTabChange = (tabId: string) => {\n setActiveRightTab(tabId);\n };\n\n const handleHomeClick = () => {\n console.log(\"Home clicked\");\n };\n\n const handleSettingsClick = () => {\n console.log(\"Settings clicked\");\n };\n\n const handleUserProfileClick = () => {\n console.log(\"User profile clicked\");\n };\n\n const handleTemplateClick = (templateId: string) => {\n setSelectedTemplate(templateId === selectedTemplate ? null : templateId);\n };\n\n const handleUseTemplate = (templateId: string) => {\n console.log(`Using template: ${templateId}`);\n };\n\n const handleViewTemplate = (templateId: string) => {\n console.log(`Viewing template: ${templateId}`);\n };\n\n return (\n <MainContainer>\n <Navbar organization={organization} />\n\n <ContentContainer>\n <Sidebar\n items={sidebarItems}\n activeItem={activeItem}\n onItemClick={handleSidebarItemClick}\n />\n\n <MainContent>\n <AppHeader\n hostname={hostname}\n userProfile={userProfile}\n onHomeClick={handleHomeClick}\n onSettingsClick={handleSettingsClick}\n onUserProfileClick={handleUserProfileClick}\n />\n\n <ContainerWithTabs>\n <MainTabsContainer>\n <div style={{ display: \"flex\", height: \"100%\" }}>\n <LeftSide>\n <TabGroup\n tabs={leftTabs}\n activeTab={activeLeftTab}\n onChange={handleLeftTabChange}\n />\n {activeLeftTab === \"templates\" && (\n <>\n <TemplatesHeader>\n <TemplatesTitle>Templates</TemplatesTitle>\n <ButtonsContainer>\n <IconButton\n variant=\"tertiary\"\n size=\"small\"\n aria-label=\"Delete\"\n noPadding\n >\n <Icon\n name={IconName.TRASH}\n width=\"20\"\n height=\"20\"\n fill=\"var(--red-error)\"\n />\n </IconButton>\n <IconButton\n variant=\"primary\"\n size=\"small\"\n aria-label=\"Add\"\n noPadding\n >\n <Icon\n name={IconName.PLUS}\n width=\"20\"\n height=\"20\"\n fill=\"var(--white-900)\"\n />\n </IconButton>\n </ButtonsContainer>\n </TemplatesHeader>\n\n <TemplatesList>\n {templates.length > 0 ? (\n templates.map((template) => (\n <TemplateCardContainer\n key={template.id}\n onClick={() => handleTemplateClick(template.id)}\n >\n <TemplateCardSidebar\n title={template.title}\n description={template.description}\n buttonText={template.buttonText}\n linkText={template.linkText}\n status={\n selectedTemplate === template.id\n ? \"active\"\n : \"default\"\n }\n onButtonClick={() =>\n handleUseTemplate(template.id)\n }\n onLinkClick={() =>\n handleViewTemplate(template.id)\n }\n />\n </TemplateCardContainer>\n ))\n ) : (\n <EmptyStateContainer>\n <Icon\n name={IconName.INBOX}\n width=\"40\"\n height=\"40\"\n fill=\"var(--grey-400)\"\n />\n <EmptyStateText>No data</EmptyStateText>\n </EmptyStateContainer>\n )}\n </TemplatesList>\n </>\n )}\n\n {activeLeftTab === \"protocol\" && (\n <>\n <TemplatesHeader>\n <TemplatesTitle>\n Protocol ({protocol.length})\n </TemplatesTitle>\n </TemplatesHeader>\n <TemplatesList>\n {protocol.length > 0 ? (\n protocol.map((template) => (\n <TemplateCardContainer\n key={template.id}\n onClick={() => handleTemplateClick(template.id)}\n >\n <TemplateCardSidebar\n title={template.title}\n description={template.description}\n status={\n selectedTemplate === template.id\n ? \"active\"\n : \"default\"\n }\n onButtonClick={() =>\n handleUseTemplate(template.id)\n }\n onLinkClick={() =>\n handleViewTemplate(template.id)\n }\n />\n </TemplateCardContainer>\n ))\n ) : (\n <EmptyStateContainer>\n <Icon\n name={IconName.INBOX}\n width=\"40\"\n height=\"40\"\n fill=\"var(--grey-400)\"\n />\n <EmptyStateText>No data</EmptyStateText>\n </EmptyStateContainer>\n )}\n </TemplatesList>\n </>\n )}\n\n {activeLeftTab === \"steps\" && (\n <>\n <TemplatesHeader>\n <TemplatesTitle>\n Task Scripts ({steps.length})\n </TemplatesTitle>\n </TemplatesHeader>\n <TemplatesList>\n {protocol.length > 0 ? (\n protocol.map((template) => (\n <TemplateCardContainer\n key={template.id}\n onClick={() => handleTemplateClick(template.id)}\n >\n <TemplateCardSidebar\n title={template.title}\n description={template.description}\n status={\n selectedTemplate === template.id\n ? \"active\"\n : \"default\"\n }\n onButtonClick={() =>\n handleUseTemplate(template.id)\n }\n onLinkClick={() =>\n handleViewTemplate(template.id)\n }\n />\n </TemplateCardContainer>\n ))\n ) : (\n <EmptyStateContainer>\n <Icon\n name={IconName.INBOX}\n width=\"40\"\n height=\"40\"\n fill=\"var(--grey-400)\"\n />\n <EmptyStateText>No data</EmptyStateText>\n </EmptyStateContainer>\n )}\n </TemplatesList>\n </>\n )}\n </LeftSide>\n <RightSide>\n <RightSideTabGroupContainer>\n <TabGroup\n tabs={rightTabs}\n activeTab={activeRightTab}\n onChange={handleRightTabChange}\n />\n </RightSideTabGroupContainer>\n <ContentWrapper>\n {activeRightTab === \"pipelineBuilder\" && (\n <PipelineWrapper>\n {/* <ReactFlowProvider>\n <PipelineBuilder width=\"100%\" height=\"100%\" />\n </ReactFlowProvider> */}\n </PipelineWrapper>\n )}\n {activeRightTab === \"configuration\" && (\n <ProtocolConfiguration />\n )}\n {activeRightTab === \"launch\" && <LaunchContent />}\n </ContentWrapper>\n </RightSide>\n </div>\n </MainTabsContainer>\n </ContainerWithTabs>\n </MainContent>\n </ContentContainer>\n </MainContainer>\n );\n};\n\nexport default Main;\n","import { COLORS } from \"@utils/colors\";\nimport Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\nimport \"./PieChart.scss\";\n\ninterface PieDataSeries {\n labels: string[];\n values: number[];\n name: string;\n colors?: string[];\n}\n\ntype PieTextInfo =\n | \"none\"\n | \"label\"\n | \"percent\"\n | \"value\"\n | \"label+percent\"\n | \"label+value\"\n | \"value+percent\"\n | \"label+value+percent\";\n\ntype PieChartProps = {\n dataSeries: PieDataSeries;\n width?: number;\n height?: number;\n title?: string;\n textInfo?: PieTextInfo;\n hole?: number;\n rotation?: number;\n};\n\nconst DEFAULT_COLORS = [\n COLORS.BLUE,\n COLORS.GREEN,\n COLORS.ORANGE,\n COLORS.RED,\n COLORS.YELLOW,\n COLORS.PURPLE,\n];\n\nconst PieChart: React.FC<PieChartProps> = ({\n dataSeries,\n width = 400,\n height = 400,\n title = \"Pie Chart\",\n textInfo = \"percent\",\n hole = 0,\n rotation = 0,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n\n const colors = useMemo(() => {\n if (\n dataSeries.colors &&\n dataSeries.colors.length >= dataSeries.labels.length\n ) {\n return dataSeries.colors;\n }\n\n const result = [...(dataSeries.colors || [])];\n const missingColors = dataSeries.labels.length - result.length;\n\n if (missingColors <= 0) return result;\n\n for (let i = 0; i < missingColors; i++) {\n result.push(DEFAULT_COLORS[i % DEFAULT_COLORS.length]);\n }\n\n return result;\n }, [dataSeries.colors, dataSeries.labels.length]);\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n const plotData = [\n {\n type: \"pie\" as const,\n labels: dataSeries.labels,\n values: dataSeries.values,\n name: dataSeries.name,\n marker: {\n colors: colors,\n },\n textinfo: textInfo,\n hoverinfo: \"label+text+value\" as const,\n insidetextfont: {\n size: 0,\n family: \"Inter, sans-serif\",\n color: \"transparent\",\n },\n hole: hole,\n rotation: rotation,\n },\n ];\n\n const layout = {\n width,\n height,\n font: {\n family: \"Inter, sans-serif\",\n },\n showlegend: false,\n margin: { l: 40, r: 40, b: 40, t: 40 },\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, plotData, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [colors, dataSeries.labels, dataSeries.name, dataSeries.values, width, height, textInfo, hole, rotation]);\n\n const PieChartLegend: React.FC<{ labels: string[]; colors: string[] }> = ({\n labels,\n colors,\n }) => {\n const items = labels.map((label, i) => (\n <React.Fragment key={label}>\n <div className=\"legend-item\">\n <span className=\"color-box\" style={{ background: colors[i] }} />\n {label}\n {i < labels.length - 1 && <span className=\"divider\" />}\n </div>\n </React.Fragment>\n ));\n\n const rowSize = 6;\n const rows = [];\n for (let i = 0; i < items.length; i += rowSize) {\n rows.push(\n <div className=\"legend-row\" key={i}>\n {items.slice(i, i + rowSize)}\n </div>\n );\n }\n return <div className=\"legend-container\">{rows}</div>;\n };\n\n return (\n <div className=\"card-container\" style={{ width: width }}>\n <div className=\"chart-container\">\n {title && (\n <div className=\"title-container\">\n <h2 className=\"title\">{title}</h2>\n </div>\n )}\n <div\n ref={plotRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n margin: \"0\",\n }}\n />\n <PieChartLegend labels={dataSeries.labels} colors={colors} />\n </div>\n </div>\n );\n};\n\nexport { PieChart };\nexport type { PieDataSeries, PieTextInfo, PieChartProps };\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\n\nimport \"./ScatterGraph.scss\";\nimport { COLORS } from \"../../../utils/colors\";\n\ninterface ScatterDataPoint {\n x: number;\n y: number;\n additionalInfo?: Record<string, string | number>;\n}\n\ninterface ScatterDataSeries {\n x: number[];\n y: number[];\n name: string;\n color: string;\n}\n\ninterface ScatterGraphProps {\n dataSeries: ScatterDataSeries[];\n width?: number;\n height?: number;\n xRange?: [number, number];\n yRange?: [number, number];\n xTitle?: string;\n yTitle?: string;\n title?: string;\n}\n\nconst ScatterGraph: React.FC<ScatterGraphProps> = ({\n dataSeries,\n width = 1000,\n height = 600,\n xRange,\n yRange,\n xTitle = \"Columns\",\n yTitle = \"Rows\",\n title = \"Scatter Plot\",\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n\n const { xMin, xMax, yMin, yMax } = useMemo(() => {\n let minX = Number.MAX_VALUE;\n let maxX = Number.MIN_VALUE;\n let minY = Number.MAX_VALUE;\n let maxY = Number.MIN_VALUE;\n\n dataSeries.forEach((series) => {\n series.x.forEach((x) => {\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n });\n series.y.forEach((y) => {\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n const xPadding = (maxX - minX) * 0.1;\n const yPadding = (maxY - minY) * 0.1;\n\n return {\n xMin: minX - xPadding,\n xMax: maxX + xPadding,\n yMin: minY - yPadding,\n yMax: maxY + yPadding,\n };\n }, [dataSeries]);\n\n const effectiveXRange = useMemo(\n () => xRange || [xMin, xMax],\n [xRange, xMin, xMax],\n );\n\n const effectiveYRange = useMemo(\n () => yRange || [yMin, yMax],\n [yRange, yMin, yMax],\n );\n\n const xTicks = useMemo(() => {\n const range = effectiveXRange[1] - effectiveXRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveXRange[0] / step) * step;\n while (current <= effectiveXRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveXRange]);\n\n const yTicks = useMemo(() => {\n const range = effectiveYRange[1] - effectiveYRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveYRange[0] / step) * step;\n while (current <= effectiveYRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveYRange]);\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: COLORS.GREY_200,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: COLORS.BLACK_900,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n linecolor: COLORS.BLACK_900,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [],\n );\n\n const spikeOptions = useMemo(\n () => ({\n showspikes: true,\n spikemode: \"across\" as const,\n spikedash: \"solid\" as const,\n spikecolor: COLORS.BLACK_OPACITY_20,\n spikethickness: 2,\n }),\n [],\n );\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n const plotData = dataSeries.map((series) => ({\n x: series.x,\n y: series.y,\n type: \"scatter\" as const,\n mode: \"markers\" as const,\n name: series.name,\n marker: {\n color: series.color,\n size: 10,\n symbol: \"circle\" as const,\n },\n hovertemplate: `${xTitle}: %{x}<br>${yTitle}: %{y}<extra>${series.name}</extra>`,\n }));\n\n const layout = {\n title: {\n text: title,\n font: {\n size: 32,\n family: \"Inter, sans-serif\",\n color: COLORS.BLACK_900,\n },\n },\n width,\n height,\n margin: { l: 80, r: 30, b: 80, t: 60, pad: 10 },\n paper_bgcolor: COLORS.WHITE,\n plot_bgcolor: COLORS.WHITE,\n font: {\n family: \"Inter, sans-serif\",\n },\n dragmode: false as const,\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: COLORS.BLACK_600,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 32,\n },\n gridcolor: COLORS.GREY_200,\n range: xRange,\n autorange: !xRange,\n tickmode: \"array\" as const,\n tickvals: xTicks,\n ticktext: xTicks.map(String),\n showgrid: true,\n ...spikeOptions,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: COLORS.BLACK_600,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 30,\n },\n gridcolor: COLORS.GREY_200,\n range: yRange,\n autorange: !yRange,\n tickmode: \"array\" as const,\n tickvals: yTicks,\n showgrid: true,\n ...spikeOptions,\n ...tickOptions,\n },\n legend: {\n x: 0.5,\n y: -0.2,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n orientation: \"h\" as const,\n font: {\n size: 16,\n color: COLORS.BLUE_900,\n family: \"Inter, sans-serif\",\n weight: 500,\n },\n },\n showlegend: true,\n hovermode: \"closest\" as const,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, plotData, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [dataSeries, width, height, xRange, yRange, xTitle, yTitle, title, effectiveXRange, effectiveYRange, xTicks, yTicks, tickOptions, spikeOptions]);\n\n return (\n <div className=\"chart-container\">\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n </div>\n );\n};\n\nexport { ScatterGraph };\nexport type { ScatterDataPoint, ScatterDataSeries, ScatterGraphProps };\n","import { Dropdown } from \"@atoms/Dropdown\";\nimport React from \"react\";\n\nimport type { TdpFiltersRenderProps } from \"../types\";\n\nexport const DefaultFilters: React.FC<TdpFiltersRenderProps> = ({ filters, filterValues, onFilterChange }) => (\n <div className=\"tdp-search__filters-row\">\n {filters.map((filter) => (\n <div key={filter.key} className=\"tdp-search__filter-wrapper\">\n <label className=\"tdp-search__filter-label\">{filter.label}</label>\n <Dropdown\n options={filter.options}\n value={filterValues[filter.key] || \"\"}\n onChange={(value) => onFilterChange(filter.key, value)}\n />\n </div>\n ))}\n </div>\n);\n","import { Table } from \"@molecules/Table\";\nimport React from \"react\";\n\nimport type { TdpResultsRenderProps } from \"../types\";\n\nexport const DefaultResults: React.FC<TdpResultsRenderProps> = ({\n results,\n total,\n currentPage,\n pageSize,\n columns,\n onPageChange,\n sortKey,\n sortDirection,\n onSort,\n}) => (\n <>\n <div className=\"tdp-search__results-header\">\n <div className=\"tdp-search__results-count\">\n Showing {(currentPage - 1) * pageSize + 1}-{Math.min(currentPage * pageSize, total)} of {total} results\n </div>\n </div>\n <Table\n columns={columns}\n data={results}\n pageSize={pageSize}\n currentPage={currentPage}\n totalItems={total}\n onPageChange={onPageChange}\n sortKey={sortKey || undefined}\n sortDirection={sortDirection}\n onSort={onSort}\n rowKey={(row) => row.id || Math.random().toString()}\n />\n </>\n);\n","import Search from \"@assets/icon/Search\";\nimport { Button } from \"@atoms/Button\";\nimport { Input } from \"@atoms/Input\";\nimport React from \"react\";\n\nimport type { TdpSearchBarRenderProps } from \"../types\";\n\nexport const DefaultSearchBar: React.FC<TdpSearchBarRenderProps> = ({\n query,\n setQuery,\n onSearch,\n isLoading,\n placeholder,\n}) => {\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n onSearch();\n }\n };\n\n return (\n <div className=\"tdp-search__search-bar\">\n <div className=\"tdp-search__search-input-wrapper\">\n <Input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n iconLeft={<Search />}\n size=\"small\"\n />\n </div>\n <Button variant=\"primary\" onClick={onSearch} disabled={!query.trim() || isLoading}>\n {isLoading ? \"Searching...\" : \"Search\"}\n </Button>\n </div>\n );\n};\n","export const AUTH_TOKEN_HEADER = \"ts-auth-token\";\nexport const ORG_SLUG_HEADER = \"x-org-slug\";\n\nexport const STANDALONE_SEARCH_PATH = \"/v1/datalake/searchEql\";","import type { SearchEqlRequest } from \"@tetrascience-npm/ts-connectors-sdk\";\n\n/** Build Elasticsearch-style body from SearchEqlRequest (TDP API does not accept searchTerm key). */\nexport const buildEsBody = (\n searchRequest: Omit<SearchEqlRequest, \"from\" | \"size\">,\n from: number,\n size: number,\n): Record<string, unknown> => {\n const { searchTerm, sort, order, ...rest } = searchRequest;\n const body: Record<string, unknown> = { from, size };\n if (searchTerm !== undefined && searchTerm !== \"\") {\n body.query = {\n simple_query_string: {\n query: searchTerm,\n default_operator: \"and\",\n },\n };\n }\n if (sort !== undefined && sort !== \"\") {\n body.sort = order ? [{ [sort]: order }] : [sort];\n }\n Object.entries(rest).forEach(([k, v]) => {\n if (v !== undefined) body[k] = v;\n });\n return body;\n};\n","import { useState } from \"react\";\n\nimport { AUTH_TOKEN_HEADER, ORG_SLUG_HEADER, STANDALONE_SEARCH_PATH } from \"../constants\";\nimport { buildEsBody } from \"../utils\";\n\nimport type { SearchResult, UseSearchConfig, UseSearchResult } from \"../types\";\nimport type { SearchEqlRequest } from \"@tetrascience-npm/ts-connectors-sdk\";\n\nexport function useSearch(config: UseSearchConfig): UseSearchResult {\n const [results, setResults] = useState<SearchResult[]>([]);\n const [total, setTotal] = useState(0);\n const [currentPage, setCurrentPage] = useState(1);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const executeSearch = async (\n searchRequest: Omit<SearchEqlRequest, \"from\" | \"size\">,\n page: number = 1,\n ): Promise<SearchResult[]> => {\n setIsLoading(true);\n setError(null);\n\n const { pageSize, standalone, baseUrl, apiEndpoint = \"/api/search\", authToken, orgSlug } = config;\n const from = (page - 1) * pageSize;\n\n let url: string;\n let fetchInit: RequestInit;\n\n if (standalone) {\n if (!baseUrl) throw new Error(\"baseUrl is required when standalone is true\");\n url = `${baseUrl.replace(/\\/$/, \"\")}${STANDALONE_SEARCH_PATH}`;\n fetchInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(authToken && { [AUTH_TOKEN_HEADER]: authToken }),\n ...(orgSlug && { [ORG_SLUG_HEADER]: orgSlug }),\n },\n body: JSON.stringify(buildEsBody(searchRequest, from, pageSize)),\n };\n } else {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (authToken && orgSlug) {\n headers[AUTH_TOKEN_HEADER] = authToken;\n headers[ORG_SLUG_HEADER] = orgSlug;\n }\n url = apiEndpoint;\n fetchInit = {\n method: \"POST\",\n headers,\n credentials: \"include\",\n body: JSON.stringify({ ...searchRequest, size: pageSize, from }),\n };\n }\n\n try {\n const response = await fetch(url, fetchInit);\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: \"Unknown error\" }));\n const message = standalone ? errorData.error?.message || errorData.error : errorData.error;\n throw new Error(message || `HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.json();\n\n const transformedResults: SearchResult[] = (data.hits?.hits || []).map((hit: any) => ({\n id: hit._id,\n ...hit._source,\n _score: hit._score,\n }));\n\n const totalHits = typeof data.hits?.total === \"number\" ? data.hits.total : data.hits?.total?.value || 0;\n\n setResults(transformedResults);\n setTotal(totalHits);\n setCurrentPage(page);\n return transformedResults;\n } catch (err: any) {\n setError(err.message || \"An error occurred while searching\");\n setResults([]);\n setTotal(0);\n return [];\n } finally {\n setIsLoading(false);\n }\n };\n\n return { results, total, currentPage, isLoading, error, executeSearch };\n}\n","/**\n * Resolves TDP auth credentials with the following priority:\n * 1. Explicitly passed props\n * 2. localStorage\n * 3. Browser cookies\n */\n\nimport { AUTH_TOKEN_HEADER, ORG_SLUG_HEADER } from \"../constants\";\n\nfunction readLocalStorage(key: string): string | undefined {\n try {\n return localStorage.getItem(key) ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction readCookie(name: string): string | undefined {\n try {\n const match = document.cookie.match(new RegExp(\"(?:^|; )\" + name + \"=([^;]*)\"));\n return match ? decodeURIComponent(match[1]) : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport interface TdpCredentials {\n authToken: string | undefined;\n orgSlug: string | undefined;\n}\n\n/**\n * Resolves TDP auth credentials from explicit props → localStorage → cookies\n */\nexport function useTdpCredentials(explicitToken?: string, explicitOrgSlug?: string): TdpCredentials {\n if (explicitToken && explicitOrgSlug) {\n return { authToken: explicitToken, orgSlug: explicitOrgSlug };\n }\n\n const lsToken = readLocalStorage(AUTH_TOKEN_HEADER);\n const lsOrgSlug = readLocalStorage(ORG_SLUG_HEADER);\n if (lsToken && lsOrgSlug) {\n return { authToken: lsToken, orgSlug: lsOrgSlug };\n }\n\n const cookieToken = readCookie(AUTH_TOKEN_HEADER);\n const cookieOrgSlug = readCookie(ORG_SLUG_HEADER);\n if (cookieToken && cookieOrgSlug) {\n return { authToken: cookieToken, orgSlug: cookieOrgSlug };\n }\n\n return { authToken: explicitToken, orgSlug: explicitOrgSlug };\n}\n","import Search from \"@assets/icon/Search\";\nimport { ErrorAlert } from \"@atoms/ErrorAlert\";\nimport React, { useState } from \"react\";\n\nimport { DefaultFilters } from \"./components/DefaultFilters\";\nimport { DefaultResults } from \"./components/DefaultResults\";\nimport { DefaultSearchBar } from \"./components/DefaultSearchBar\";\nimport { useSearch } from \"./hooks/useSearch\";\nimport { useTdpCredentials } from \"./hooks/useTdpCredentials\";\n\nimport type { TdpSearchProps, SearchEqlExpression } from \"./types\";\nimport type { SearchEqlRequest } from \"@tetrascience-npm/ts-connectors-sdk\";\n\nimport \"./TdpSearch.scss\";\n\n/**\n * TdpSearch Component\n *\n * A reusable search component for querying the TDP.\n *\n * @example\n * ```tsx\n * <TdpSearch\n * columns={[\n * { key: \"id\", header: \"ID\" },\n * { key: \"filePath\", header: \"File Path\", sortable: true }\n * ]}\n * defaultQuery=\"sample-data\"\n * pageSize={20}\n * />\n * ```\n */\n\nexport const TdpSearch: React.FC<TdpSearchProps> = ({\n defaultQuery = \"\",\n columns,\n filters = [],\n defaultSort,\n advancedSearchParams,\n pageSize = 10,\n searchPlaceholder = \"Enter search term...\",\n className,\n onSearch,\n renderSearchBar,\n renderFilters,\n renderResults,\n ...props\n}) => {\n const { authToken, orgSlug } = useTdpCredentials(props.authToken, props.orgSlug);\n\n const { results, total, currentPage, isLoading, error, executeSearch } = useSearch({\n ...props,\n authToken: authToken ?? \"\",\n orgSlug: orgSlug ?? \"\",\n pageSize,\n });\n\n // UI state\n const [query, setQuery] = useState(defaultQuery);\n const [filterValues, setFilterValues] = useState<Record<string, string>>({});\n const [sortKey, setSortKey] = useState<string | null>(null);\n const [sortDirection, setSortDirection] = useState<\"asc\" | \"desc\">(\"asc\");\n const [hasSearched, setHasSearched] = useState(false);\n\n // Execute search with current UI state. Optional sortOverride avoids stale state when called from handleSort.\n const handleExecuteSearch = async (\n page: number = 1,\n sortOverride?: { sortKey: string; sortDirection: \"asc\" | \"desc\" },\n ) => {\n if (!query.trim()) {\n return;\n }\n\n setHasSearched(true);\n\n const effectiveSortKey = sortOverride?.sortKey ?? sortKey ?? defaultSort?.field;\n const effectiveOrder =\n sortOverride == null\n ? sortKey\n ? sortDirection\n : (defaultSort?.order ?? sortDirection)\n : sortOverride.sortDirection;\n\n const filterExpressions = Object.entries(filterValues)\n .filter(([, value]) => value !== \"\")\n .map(([key, value]) => ({ field: key, operator: \"eq\", value }));\n\n let expression: SearchEqlExpression | undefined = advancedSearchParams?.expression as\n | SearchEqlExpression\n | undefined;\n\n if (filterExpressions.length > 0) {\n expression = {\n g: \"AND\",\n e: expression ? [...filterExpressions, expression] : filterExpressions,\n };\n }\n\n const searchRequest: Omit<SearchEqlRequest, \"from\" | \"size\"> = {\n searchTerm: query.trim(),\n sort: effectiveSortKey ?? undefined,\n order: effectiveOrder,\n ...advancedSearchParams,\n ...(expression !== undefined && { expression }),\n };\n\n const newResults = await executeSearch(searchRequest, page);\n\n // Call onSearch with the freshly fetched results (not stale state)\n if (onSearch) {\n onSearch({ ...searchRequest, from: (page - 1) * pageSize, size: pageSize }, newResults);\n }\n };\n\n // Handle search button click\n const handleSearch = () => {\n handleExecuteSearch(1);\n };\n\n // Handle filter change\n const handleFilterChange = (filterKey: string, value: string) => {\n setFilterValues((prev) => ({\n ...prev,\n [filterKey]: value,\n }));\n };\n\n // Handle page change\n const handlePageChange = (page: number) => {\n handleExecuteSearch(page);\n };\n\n // Handle sort\n const handleSort = (key: string, direction: \"asc\" | \"desc\") => {\n setSortKey(key);\n setSortDirection(direction);\n handleExecuteSearch(1, { sortKey: key, sortDirection: direction });\n };\n\n const emptyState = (\n <div className=\"tdp-search__empty-state\">\n <div className=\"tdp-search__empty-state-icon\">\n <Search />\n </div>\n <div className=\"tdp-search__empty-state-text\">No results found. Try adjusting your search query or filters.</div>\n </div>\n );\n\n const searchBarProps = { query, setQuery, onSearch: handleSearch, isLoading, placeholder: searchPlaceholder };\n const filtersProps = { filters, filterValues, onFilterChange: handleFilterChange };\n const resultsProps = {\n results,\n total,\n currentPage,\n pageSize,\n columns,\n onPageChange: handlePageChange,\n sortKey,\n sortDirection,\n onSort: handleSort,\n };\n\n return (\n <div className={`tdp-search ${className || \"\"}`}>\n {renderSearchBar ? renderSearchBar(searchBarProps) : <DefaultSearchBar {...searchBarProps} />}\n\n {filters.length > 0 && (renderFilters ? renderFilters(filtersProps) : <DefaultFilters {...filtersProps} />)}\n\n {error && (\n <>\n <ErrorAlert error={error} onClose={() => {}} />\n {emptyState}\n </>\n )}\n\n {isLoading && <div className=\"tdp-search__loading-overlay\">Loading results...</div>}\n\n {!isLoading && !hasSearched && (\n <div className=\"tdp-search__empty-state\">\n <div className=\"tdp-search__empty-state-icon\">\n <Search />\n </div>\n <div className=\"tdp-search__empty-state-text\">Enter a search query and click Search to get started.</div>\n </div>\n )}\n\n {!isLoading &&\n !error &&\n hasSearched &&\n results.length > 0 &&\n (renderResults ? renderResults(resultsProps) : <DefaultResults {...resultsProps} />)}\n\n {!isLoading && !error && hasSearched && results.length === 0 && emptyState}\n </div>\n );\n};\n\nexport default TdpSearch;\n","/**\n * Theme type definitions for TetraScience UI Kit\n */\n\nexport interface ThemeColors {\n primary?: string;\n primaryHover?: string;\n primaryActive?: string;\n background?: string;\n text?: string;\n border?: string;\n cardBackground?: string;\n cardBorder?: string;\n}\n\nexport interface ThemeRadius {\n small?: string;\n medium?: string;\n large?: string;\n}\n\nexport interface ThemeSpacing {\n small?: string;\n medium?: string;\n large?: string;\n}\n\nexport interface Theme {\n colors?: ThemeColors;\n radius?: ThemeRadius;\n spacing?: ThemeSpacing;\n}\n\nexport const defaultTheme: Theme = {\n colors: {\n primary: \"var(--blue-900)\",\n primaryHover: \"var(--blue-800)\",\n primaryActive: \"var(--blue-800)\",\n background: \"var(--white-900)\",\n text: \"var(--black-900)\",\n border: \"var(--grey-200)\",\n cardBackground: \"var(--white-900)\",\n cardBorder: \"var(--grey-200)\",\n },\n radius: {\n small: \"4px\",\n medium: \"8px\",\n large: \"16px\",\n },\n spacing: {\n small: \"8px\",\n medium: \"16px\",\n large: \"24px\",\n },\n};","import React, { useMemo } from \"react\";\nimport styled, { ThemeProvider as StyledThemeProvider } from \"styled-components\";\n\nimport { defaultTheme } from \"./types\";\n\nimport type { Theme} from \"./types\";\n\nexport interface ThemeProviderProps {\n theme?: Theme;\n children: React.ReactNode;\n}\n\n// Styled wrapper that applies CSS custom properties locally\nconst ThemeWrapper = styled.div<{ $themeStyles: Record<string, string> }>`\n ${(props) =>\n Object.entries(props.$themeStyles)\n .map(([key, value]) => `${key}: ${value};`)\n .join(\"\\n\")}\n`;\n\n/**\n * ThemeProvider component that sets CSS custom properties for theming\n *\n * This provider merges the provided theme with the default theme and\n * sets CSS variables on a wrapper element, making them available to both\n * styled-components and SCSS styles within the provider's scope.\n *\n * @example\n * ```tsx\n * import { ThemeProvider, Button } from '@tetrascience-npm/tetrascience-react-ui';\n *\n * const customTheme = {\n * colors: {\n * primary: '#FF0000',\n * },\n * radius: {\n * medium: '12px',\n * }\n * };\n *\n * <ThemeProvider theme={customTheme}>\n * <Button>Click me</Button>\n * </ThemeProvider>\n * ```\n */\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n theme = {},\n children,\n}) => {\n // Merge provided theme with default theme\n const mergedTheme = useMemo(() => {\n return {\n colors: { ...defaultTheme.colors, ...theme.colors },\n radius: { ...defaultTheme.radius, ...theme.radius },\n spacing: { ...defaultTheme.spacing, ...theme.spacing },\n };\n }, [theme]);\n\n // Build CSS custom properties object for the wrapper\n const themeStyles = useMemo(() => {\n const styles: Record<string, string> = {};\n\n // Set color variables\n if (mergedTheme.colors) {\n Object.entries(mergedTheme.colors).forEach(([key, value]) => {\n if (value) {\n styles[`--theme-${key}`] = value;\n }\n });\n }\n\n // Set radius variables\n if (mergedTheme.radius) {\n Object.entries(mergedTheme.radius).forEach(([key, value]) => {\n if (value) {\n styles[`--theme-radius-${key}`] = value;\n }\n });\n }\n\n // Set spacing variables\n if (mergedTheme.spacing) {\n Object.entries(mergedTheme.spacing).forEach(([key, value]) => {\n if (value) {\n styles[`--theme-spacing-${key}`] = value;\n }\n });\n }\n\n return styles;\n }, [mergedTheme]);\n\n // Also provide theme to styled-components (cast to any to avoid type conflicts)\n return (\n <StyledThemeProvider theme={mergedTheme as any}>\n <ThemeWrapper $themeStyles={themeStyles}>{children}</ThemeWrapper>\n </StyledThemeProvider>\n );\n};\n\nexport default ThemeProvider;\n"],"names":["sizeStyles","css","variantStyles","StyledBadge","styled","$size","$variant","$disabled","Badge","children","size","variant","disabled","iconLeft","iconRight","className","jsxs","heightStyles","getPadding","noPadding","StyledButton","props","Button","loading","leftIcon","rightIcon","fullWidth","ref","rest","ButtonContainer","ButtonControl","icon","selected","onClick","jsx","CardContainer","CardTitle","CardContent","Card","title","Bars3BottomLeft","fill","width","height","Building","BulkCheck","Check","CheckCircle","CheckSquare","ChevronDown","Close","Code","Computer","Copy","Cube","Database","ExclamationCircle","ExclamationTriangle","Gear","Globe","Hashtag","Home","Inbox","InformationCircle","InformationCircleMicro","Lamp","LockOpen","Minus","PaperPlaneIcon","Pencil","PieChart","Pipeline","Plus","Profile","QuestionCircle","RocketLaunch","Search","SearchDocument","SearchSQL","Sitemap","TetraScienceIcon","Text","Trash","ViewfinderCircle","IconName","Icon","svg","name","CheckboxContainer","HiddenCheckbox","StyledCheckbox","CheckIcon","StyledLabel","Checkbox","checked","onChange","label","e","TooltipContainer","TooltipContent","Tooltip","content","placement","delay","isVisible","setIsVisible","useState","timeoutRef","useRef","handleMouseEnter","handleMouseLeave","useEffect","themeModules","THEME_MAP","EditorContainer","EditorActions","ButtonWrapper","CodeEditor","value","language","theme","options","onCopy","onLaunch","copyState","setCopyState","launchState","setLaunchState","FEEDBACK_RESET_DELAY_MS","handleCopy","useCallback","code","handleLaunch","handleEditorWillMount","monaco","monacoTheme","themeFile","themes","themeModule","themeData","error","defaultOptions","MonacoEditor","DropdownContainer","DropdownButton","ChevronIcon","ButtonText","DropdownMenu","NoDataContainer","NoDataText","DropdownItem","Dropdown","placeholder","onOpen","onClose","menuWidth","isOpen","setIsOpen","selectedValue","setSelectedValue","dropdownRef","itemRefs","handleClickOutside","event","selectedIndex","option","indexToFocus","handleToggle","newState","handleSelect","findNextEnabledIndex","currentIndex","i","findPrevEnabledIndex","handleKeyDown","index","nextIndex","prevIndex","handleButtonKeyDown","selectedOption","displayText","el","AlertContainer","AlertHeader","IconContainer","CloseButton","TitleContainer","StyledSpace","Paragraph","SecondaryText","CollapseContainer","CollapseHeader","CollapseContent","PreContainer","isAxiosError","parseAxiosResponseData","responseData","detail","parseAxiosError","errorType","message","description","details","status","statusText","parsed","parseStandardError","parseObjectError","parseError","Collapse","header","defaultExpanded","isExpanded","setIsExpanded","ErrorAlert","showDetailsDefault","Fragment","InputContainer","StyledInput","IconWrapper","Input","LabelContainer","LabelHeader","InfoIcon","InfoIconWrapper","Label","infoText","nord","COPY_FEEDBACK_DELAY_MS","CodeText","BasicCodeRenderer","inline","match","codeString","isCopied","setIsCopied","showMessage","msg","err","React","SyntaxHighlighter","MarkdownDisplay","markdown","codeRenderer","ReactMarkdown","remarkGfm","rehypeRaw","StyledMenuItem","ItemContent","MenuItem","showCheckbox","onCheckChange","active","handleClick","handleCheckboxChange","isChecked","handleCheckboxClick","ANIMATION_DURATION_MS","GlobalStyle","createGlobalStyle","modalFadeIn","keyframes","modalFadeOut","backdropFadeIn","backdropFadeOut","ModalRoot","Backdrop","ModalContainer","HeaderWrapper","ModalTitle","Actions","ModalContent","Modal","onCloseLabel","onConfirm","onConfirmLabel","hideActions","isFadeOut","setIsFadeOut","animationTimeout","handleClose","PopoverContainer","PopoverTitle","PopoverContent","ButtonsContainer","PopConfirmWrapper","PopConfirm","onCancel","okText","cancelText","okButtonProps","cancelButtonProps","wrapperRef","handleConfirm","handleCancel","Container","SupportiveText","showCheck","TabContainer","Tab","StyledTableCell","TableCell","align","StyledTableHeaderCell","HeaderContent","HeaderText","SortIcon","TableHeaderCell","sortable","sortDirection","onSort","filterable","filterOptions","filterValue","onFilterChange","handleSort","TextareaContainer","StyledTextarea","Textarea","rows","typeStyles","ToastContainer","ContentContainer","Heading","Description","color","SuccessIcon","WarningIcon","ErrorIcon","NeutralIcon","getIcon","type","Toast","heading","ToggleContainer","ToggleSwitch","ToggleKnob","LabelText","Toggle","setIsChecked","TDP_ROUTE_PREFIXES","getTdpBaseUrlFromReferrer","referrerUrl","pathname","prefix","prefixIndex","basePath","buildTdpUrl","baseUrl","path","normalizedPath","url","navigateToTdpUrl","tdpUrl","relativePath","tdpPaths","fileId","pipelineId","query","namespace","slug","TdpNavigationContext","createContext","useTdpNavigationContext","context","useContext","TdpNavigationProvider","explicitBaseUrl","tdpBaseUrl","useMemo","contextValue","useTdpNavigation","opts","StyledLink","TDPLink","navigationOptions","getTdpUrl","navigateToTdp","href","HeaderContainer","HostnameText","ActionsContainer","UserProfileContainer","Avatar","UserName","IconButtonStyle","Separator","AppHeader","hostname","userProfile","onHomeClick","onSettingsClick","onUserProfileClick","getInitials","part","ModalOverlay","ModalHeader","TitleWrapper","Title","PromptText","QueryContainer","QueryTextarea","EditorWrapper","SendButton","AssistantModal","open","prompt","initialCode","userQuery","onUserQueryChange","onSend","setCode","input","setInput","localUserQuery","setLocalUserQuery","v","GroupContainer","ButtonControlGroup","controls","selectedId","vertical","id","control","getBackgroundColor","getTitleColor","getDescriptionColor","getLinkColor","ActionContainer","Link","CardSidebar","buttonText","linkText","onButtonClick","onLinkClick","StatusText","EditCodeButtonWrapper","CodeScriptEditorButton","onCodeSave","modalTitle","buttonProps","modalProps","isModalOpen","setIsModalOpen","currentCode","setCurrentCode","lineCount","charCount","handleOpenModal","handleSave","handleCodeChange","FormFieldContainer","FormField","supportiveText","showSupportiveCheck","inputProps","TOAST_DISPLAY_MS","DEPLOY_DELAY_MS","Header","Controls","VersionContainer","defaultInitialCode","ToastWrapper","LaunchContent","onDeploy","versions","currentVersion","onVersionChange","overwriteMode","setOverwriteMode","isDeploying","setIsDeploying","infoToast","setInfoToast","successToast","setSuccessToast","errorToast","setErrorToast","handleDeploy","MenuContainer","MenuTitle","MenuItems","Menu","items","onItemClick","onItemCheckChange","activeItemId","handleItemClick","itemId","handleItemCheckChange","item","NavbarContainer","Section","SectionTitle","OrganizationName","OrganizationSubtext","OrganizationContent","LogoContainer","ProjectSelector","ProjectName","FirstColumn","DefaultLogo","DefaultProjectIcon","Navbar","organization","ProtocolConfigHeader","ProtocolConfigTitle","EditModeWrapper","ConfigurationContainer","ConfigurationHeader","ConfigurationTitle","ConfigurationContent","EmptyStateContainer","EmptyStateText","ProtocolConfiguration","isEditMode","setIsEditMode","prev","Divider","StyledToggle","StyledDropdown","ProtocolYamlCard","newVersionMode","onToggleNewVersionMode","versionOptions","selectedVersion","yaml","onYamlChange","PythonEditorModal","initialValue","onSave","SelectFieldContainer","SelectField","dropdownProps","SidebarContainer","SidebarItemContainer","SidebarItem","Sidebar","activeItem","TableContainer","StyledTable","TableBody","TableRow","CheckboxCell","CheckboxHeaderCell","PaginationContainer","PaginationButton","PageNumbers","PageNumber","Table","columns","data","pageSize","rowKey","selectable","onRowSelect","controlledSortKey","controlledSortDirection","controlledOnSort","controlledCurrentPage","controlledOnPageChange","totalItems","controlledSelectedRows","internalSortKey","setInternalSortKey","internalSortDirection","setInternalSortDirection","internalCurrentPage","setInternalCurrentPage","internalSelectedRows","setInternalSelectedRows","columnFilters","setColumnFilters","isControlledSort","isControlledPage","isControlledSelection","sortKey","currentPage","selectedRows","filteredData","result","key","row","sortedData","a","b","aValue","bValue","comparison","totalPages","paginatedData","start","handlePageChange","page","handleSelectAll","newSelection","getRowKey","handleRowSelect","r","isRowSelected","allCurrentPageSelected","handleFilterChange","columnKey","getPageNumbers","pages","end","column","rowIndex","TabGroupContainer","TabGroup","tabs","activeTab","selectedTab","setSelectedTab","handleTabClick","tabId","tab","toasts","listeners","subscribeToToasts","callback","listener","ToastManager","position","currentToasts","setCurrentToasts","isMounted","setIsMounted","unsubscribe","createPortal","toast","AppLayout","sidebarItems","setActiveItem","getCSSVar","cssVar","fallback","fallbackSuffix","COLORS","CHART_COLORS","AreaGraph","dataSeries","xRange","yRange","xTitle","yTitle","plotRef","xMin","xMax","yMin","yMax","minX","maxX","minY","maxY","series","x","y","xPadding","yPadding","effectiveXRange","effectiveYRange","xTicks","range","step","ticks","current","yTicks","tickOptions","titleOptions","cumulativeY","stackedY","layout","config","Plotly","plotElement","BarGraph","barWidth","s","barMode","DEFAULT_POINT_POSITION","Boxplot","showPoints","PLOT_HEIGHT_OFFSET","Y_AXIS_PADDING_FACTOR","determineBase","peakValues","values","val","highestBase","highestValue","base","Chromatogram","positionInterval","colorA","colorT","colorG","colorC","positions","sequence","peakA","peakT","peakG","peakC","aTrace","tTrace","gTrace","cTrace","maxValue","plotData","renderSequenceLetters","minPosition","maxPosition","chartWidth","leftPosition","renderPositionNumbers","startPos","regularPositionLabels","pos","CHROMATOGRAM_LAYOUT","CHROMATOGRAM_ANNOTATION","ANNOTATION_SLOTS","groupOverlappingPeaks","peaksWithMeta","overlapThreshold","sorted","groups","currentGroup","lastInGroup","createPeakAnnotation","peak","seriesIndex","slot","isUserDefined","textColor","text","ax","ay","createGroupAnnotations","group","slotIndex","BOUNDARY_MARKER_START_Y","BOUNDARY_MARKER_END_Y","BOUNDARY_MARKER_SERIES_OFFSET","createMarkerTrace","xPos","yPos","markerType","createBoundaryMarkerTraces","allPeaks","traces","peaks","startMarkerY","endMarkerY","startIdx","endIdx","startX","endX","startMarkerType","endMarkerType","calculateProminence","peakIndex","searchWindow","leftMin","rightMin","j","findPeakBoundaries","startIndex","endIndex","calculatePeakArea","baselineY","area","h","y1","y2","calculateWidthAtHalfMax","halfMax","leftHalf","rightHalf","filterPeaksByDistance","minDistance","filtered","p","detectPeaks","minHeight","prominence","relativeThreshold","threshold","prominenceThreshold","widthAtHalfMax","findClosestIndex","arr","target","left","right","mid","processUserAnnotations","annotations","xArray","yArray","ann","collectPeaksWithBoundaryData","allDetectedPeaks","processedSeries","peaksWithData","annotationsWithBoundaries","buildHoverExtraContent","seriesName","metadata","metaLines","formattedKey","validateSeriesData","length","validX","sanitizedY","applyBaselineCorrection","method","windowSize","slope","baseline","halfWindow","windowSlice","ChromatogramChart","xAxisTitle","yAxisTitle","showLegend","showGridX","showGridY","showMarkers","markerSize","showCrosshairs","baselineCorrection","baselineWindowSize","peakDetectionOptions","showPeakAreas","boundaryMarkers","annotationOverlapThreshold","showExportButton","enablePeakDetection","validated","processedAnnotations","detected","currentRef","traceColor","extraContent","trace","boundaryTraces","allPeaksWithMeta","plotlyAnnotations","DotPlot","seriesArray","defaultColors","defaultSymbols","seriesWithColors","gridColor","PLATE_FORMAT_96","PLATE_FORMAT_384","PLATE_FORMAT_1536","PLATE_FORMAT_CUSTOM","DEFAULT_CATEGORY_COLORS","PLATE_CONFIGS","DEFAULT_COLOR_SCALE","NAMED_COLORSCALES","PLATEMAP_CONSTANTS","ASCII_UPPERCASE_A","ALPHABET_LENGTH","generateRowLabels","count","_","generateColumnLabels","parseWellId","wellId","rowStr","col","isValidWellPosition","extractLayerValue","layerId","effectiveLayerId","storeLayerValue","layerValue","grid","categories","wellDataToGrid","wells","allValues","tooltipData","well","wellIdUpper","calculateValueRange","min","max","hasMultiValueWells","extractLayerIds","layerIds","k","isStringValueLayer","extractLayers","layerConfigs","c","isStringLayer","parseRegionWells","rowLabels","colLabels","rangeMatch","startWell","endWell","minRow","maxRow","minCol","maxCol","numRows","numCols","buildWellHoverText","tooltipExtra","activeLayerId","layerConfigMap","precision","valueUnit","formatAllLayerValues","formatTooltipExtra","rawLayerUnit","layerUnit","buildColorbarConfig","legendTitle","buildPlotMargins","hasTitle","hasYTitle","baseLeft","baseRight","leftMargin","rightMargin","bottomMargin","topMargin","calculateTitleX","calculateAxisDomain","flattenGridData","plotZ","hoverText","plotZMin","xData","yData","colorData","textData","rowIdx","colIdx","zValue","MIN_MARKER_SIZE","SQUARE_SIZE_MULTIPLIER","CIRCLE_SIZE_MULTIPLIER","COLORBAR_SPACE","calculateMarkerSize","markerShape","plotWidth","plotHeight","cellWidth","cellHeight","cellSize","PlateMap","initialLayerId","onLayerChange","plateFormat","customRows","customColumns","propVisualizationMode","customCategoryColors","regions","customXLabels","customYLabels","propColorScale","propValueMin","propValueMax","emptyWellColor","showColorBar","legendConfig","onWellClick","onWellClickRef","setActiveLayerId","effectiveLayers","wellDataArray","activeLayer","l","visualizationMode","colorScale","valueMin","valueMax","categoryColors","activeLayerId_","categoriesGrid","allValuesMap","tooltipDataMap","resultGrid","resultCategories","resultAllValues","resultTooltipData","zMin","zMax","hasNullValues","sentinelValue","displayGrid","effectiveColorScale","arrayColorScale","namedScale","totalRange","dataStartRatio","extendedScale","newPos","effectiveZMin","map","layer","categoricalGrid","categoricalColorScale","uniqueTypes","catMax","typesSet","hasNullCategory","category","types","typeToIndex","idx","catGrid","numTypes","catColorScale","normalizedPos","bandHalf","regionShapes","shapes","region","bounds","inset","x0","x1","y0","isCategorical","plotColorScale","plotZMax","plotShowScale","legendPosition","eventData","point","rowLabelsArr","colLabelsArr","wellData","renderLayerSelector","isActive","legendFontSize","legendItemSpacing","legendSwatchSize","legendWidth","isHorizontalLegend","renderLegend","hasCategoricalItems","hasRegions","legendClassNames","legendStyle","plotContent","legendContent","renderPlotWithLegend","normalizeData","maxLength","newRow","Heatmap","xLabels","yLabels","colorscale","showScale","zmin","zmax","normalizedData","defaultRows","rowLabel","colLabel","NORMAL_DISTRIBUTION_EXPONENT_COEFF","calculateMean","acc","calculateStdDev","mean","variance","generateNormalDistributionPoints","stdDev","points","xValues","yValues","exponent","scaleDistributionCurve","histogramData","bins","binCount","binFrequencies","binIndex","maxBinFrequency","maxCurveValue","scaleFactor","Histogram","bargap","showDistributionLine","effectiveBarMode","hasDistributionLine","distributionLines","curvePoints","scaledYValues","rowSize","DEFAULT_MARKER_SIZE","DEFAULT_SIZE_RANGE","DEFAULT_MAX_POINTS","PLOT_CONSTANTS","SELECTION_MODIFIERS","calculateRange","field","getUniqueCategories","uniqueCategories","mapColors","colorMapping","colorMap","categoryColorMap","mapShapes","shapeMapping","shape","shapeMap","defaultShapes","categoryShapeMap","mapSizes","sizeMapping","sizeMap","categorySizeMap","sizeRange","minSize","maxSize","normalized","downsampleData","maxPoints","lttbDownsample","bucketCentroid","dataLength","sumX","sumY","fallbackIdx","every","floor","abs","sampled","avgRangeStart","avgRangeEnd","avgX","avgY","rangeStart","rangeEnd","pointAX","pointAY","maxArea","maxAreaPoint","nextA","generateTooltipContent","fields","lines","getSelectionMode","ctrlOrCmd","calculateAxisRange","axis","padding","scale","isLog","mapped","applySelection","currentSelection","newIds","mode","getPlotlyLayoutConfig","xAxis","yAxis","enableLassoSelection","enableBoxSelection","InteractiveScatter","tooltip","enableClickSelection","controlledSelectedIds","onSelectionChange","onPointClick","downsampling","onSelectionChangeRef","onPointClickRef","selectedIdsRef","isControlledRef","internalSelectedIds","setInternalSelectedIds","isControlled","selectedIds","normalizedSelectedIds","originalIdLookup","processedData","colors","sizes","tooltipEnabled","tooltipText","plotlyColors","plotlyColorscale","markerConfig","ids","clickedId","clickedPoint","selectedPointIds","strId","selectedIndices","containerClassName","LineGraph","MainContainer","MainContent","ContainerWithTabs","MainTabsContainer","TemplatesHeader","TemplatesTitle","IconButton","LeftSide","RightSide","RightSideTabGroupContainer","TemplatesList","TemplateCardContainer","TemplateCardSidebar","ContentWrapper","PipelineWrapper","Main","leftTabs","rightTabs","activeLeftTab","setActiveLeftTab","activeRightTab","setActiveRightTab","selectedTemplate","setSelectedTemplate","templates","protocol","steps","handleSidebarItemClick","handleLeftTabChange","handleRightTabChange","handleHomeClick","handleSettingsClick","handleUserProfileClick","handleTemplateClick","templateId","handleUseTemplate","handleViewTemplate","template","DEFAULT_COLORS","textInfo","hole","rotation","missingColors","labels","ScatterGraph","spikeOptions","DefaultFilters","filters","filterValues","filter","DefaultResults","results","total","onPageChange","DefaultSearchBar","setQuery","onSearch","isLoading","AUTH_TOKEN_HEADER","ORG_SLUG_HEADER","STANDALONE_SEARCH_PATH","buildEsBody","searchRequest","from","searchTerm","sort","order","body","useSearch","setResults","setTotal","setCurrentPage","setIsLoading","setError","standalone","apiEndpoint","authToken","orgSlug","fetchInit","headers","response","errorData","transformedResults","hit","totalHits","readLocalStorage","readCookie","useTdpCredentials","explicitToken","explicitOrgSlug","lsToken","lsOrgSlug","cookieToken","cookieOrgSlug","TdpSearch","defaultQuery","defaultSort","advancedSearchParams","searchPlaceholder","renderSearchBar","renderFilters","renderResults","executeSearch","setFilterValues","setSortKey","setSortDirection","hasSearched","setHasSearched","handleExecuteSearch","sortOverride","effectiveSortKey","effectiveOrder","filterExpressions","expression","newResults","handleSearch","filterKey","direction","emptyState","searchBarProps","filtersProps","resultsProps","defaultTheme","ThemeWrapper","ThemeProvider","mergedTheme","themeStyles","styles","StyledThemeProvider"],"mappings":"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","x_google_ignoreList":[53]}
|