customer-module-frontend 2.7.0-beta.33 → 2.7.0-beta.35
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 +189 -0
- package/dist/customer-module.css +1 -1
- package/dist/customer-module.js +30045 -28133
- package/dist/customer-module.js.map +1 -1
- package/dist/hui/base.css +12 -0
- package/dist/hui/customer-module.css +1 -0
- package/dist/hui/customer-module.js +14070 -0
- package/dist/hui/customer-module.js.map +1 -0
- package/dist/hui/mockServiceWorker.js +349 -0
- package/dist/hui/vite.svg +1 -0
- package/package.json +50 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customer-module.js","sources":["../../node_modules/hiver-ui-kit-extended/dist/themes.hui.js","../../node_modules/hiver-ui-kit-extended/dist/HUIThemeProvider-BBurfZRy.js","../../node_modules/hiver-ui-kit-extended/dist/env.hui.js","../../src/stores/renderConfig.tsx","../../src/components/Icon/sources.hui.ts","../../src/components/Icon/index.tsx","../../src/components/Avatar/constants.tsx","../../src/components/Avatar/index.tsx","../../src/components/Tooltip/index.tsx","../../src/components/TruncatedText/index.tsx","../../src/utils/classNames.ts","../../src/components/Glyph/index.tsx","../../src/utils/cookies.ts","../../src/utils/conversation.ts","../../src/utils/envelope.ts","../../src/services/axios.ts","../../src/services/conversations.ts","../../src/assets/search.svg","../../src/hooks/useRenderConfig.tsx","../../src/constants/endpoints.ts","../../src/services/contacts.ts","../../src/stores/contacts.ts","../../src/assets/kebab.svg","../../src/constants/gainsightEvents.ts","../../src/components/Contacts/index.tsx","../../src/assets/india-gate.svg","../../src/constants/cdnAssets.ts","../../src/components/EmptyState/index.tsx","../../src/components/Loader/index.tsx","../../src/assets/slack.svg","../../src/assets/whatsapp.svg","../../src/assets/sm_inboxes_light.svg","../../src/components/ConversationBox/constants.tsx","../../src/assets/open_in_a_new_tab.svg?react","../../src/utils/randomDataGenerator.ts","../../src/components/ConversationBox/index.tsx","../../src/components/ConversationBox/ConversationBoxShimmer.tsx","../../src/assets/no-data.svg","../../src/assets/no-data-transparent.png","../../src/components/EmptyData/NoDataFound.tsx","../../src/assets/no-conversation.svg","../../src/services/companies.ts","../../src/stores/companies.ts","../../src/constants/features.ts","../../src/utils/dateUtils.ts","../../src/constants/channels.ts","../../src/utils/formatValue.ts","../../src/utils/conversationMapper.ts","../../src/hooks/useIntersectionObserver.tsx","../../src/hooks/useConversationInfiniteScroll.tsx","../../src/components/ConversationList/index.tsx","../../src/constants/custom-field-icons.tsx","../../src/constants/custom-fields.ts","../../src/components/RightPanel/ContactPanel.tsx","../../src/components/RightPanel/AccountPanel.tsx","../../src/components/RightPanel/index.tsx","../../src/components/Mount/index.tsx","../../src/features/account-insights/constants.ts","../../src/services/insights.ts","../../src/stores/insights.ts","../../src/features/account-insights/components/HealthContributorRow.tsx","../../src/features/account-insights/components/HealthInfoPopover.tsx","../../src/components/Button/index.tsx","../../src/components/Textarea/index.tsx","../../src/features/account-insights/components/FeedbackReasonForm.tsx","../../src/assets/insights/thumb_up.svg?react","../../src/assets/insights/thumb_up_filled.svg?react","../../src/assets/insights/thumb_down.svg?react","../../src/assets/insights/thumb_down_filled.svg?react","../../src/features/account-insights/components/HealthFeedbackRow.tsx","../../src/assets/insights/health_plus.svg?react","../../src/assets/insights/alert_triangle_filled.svg?react","../../src/features/account-insights/components/AccountHealthSection.tsx","../../src/assets/insights/sentiment_smiley.svg?react","../../src/features/account-insights/components/AccountSentimentSection.tsx","../../src/features/account-insights/components/AccountHealthSkeleton.tsx","../../src/features/account-insights/components/SignalConversationsModal.tsx","../../src/features/account-insights/components/CustomerIntelligencePanel.tsx","../../src/services/search.ts","../../src/hooks/useFeature.ts","../../src/components/Header/index.tsx","../../node_modules/hiver-ui-kit-extended/dist/icons.js","../../src/assets/hiver-logo.svg?react","../../src/components/BrandGlyph/index.tsx","../../src/components/SideNav/index.tsx","../../src/components/Breadcrumb/index.tsx","../../src/hooks/useBreadcrumb.tsx","../../src/components/BreadcrumbsSection/index.tsx","../../src/components/CustomersLayout/index.tsx","../../src/hooks/useTableInfiniteScroll.tsx","../../src/components/Listing/LoadErrorState.tsx","../../src/assets/insights/sentiment_face_positive.svg?react","../../src/assets/insights/sentiment_face_negative.svg?react","../../src/assets/insights/sentiment_face_neutral.svg?react","../../src/components/Listing/insightCells.tsx","../../src/components/Listing/AccountTable.tsx","../../src/stores/filters.ts","../../src/hooks/useIntersectObserver.ts","../../src/hooks/useDelayedState.tsx","../../src/services/custom-fields/callback.ts","../../src/services/custom-fields/get-config.ts","../../src/constants/queries.ts","../../src/queries/useCFList.ts","../../src/services/excluded-domains.ts","../../src/queries/useExcludedDomains.ts","../../src/components/Drawer/index.tsx","../../src/assets/download.svg?react","../../src/components/Icon/glyphs.tsx","../../src/components/Drawer/Header.tsx","../../src/components/TextField/counter.tsx","../../src/components/TextField/index.tsx","../../src/components/Styles/index.tsx","../../src/components/Select/index.tsx","../../src/components/DateField/index.tsx","../../src/features/entity/create-edit/date-field.tsx","../../src/components/ChipField/chip.tsx","../../src/components/ChipField/index.tsx","../../src/validations/contactPhone.ts","../../src/utils/validations.ts","../../src/constants/entity.ts","../../src/stores/form.ts","../../src/contexts/form.tsx","../../src/utils/debounce.ts","../../src/components/FormField/index.tsx","../../src/components/Drawer/Footer.tsx","../../src/hooks/useFormActions.ts","../../src/features/entity/create-edit/footer.tsx","../../src/features/entity/create-edit/provider.tsx","../../src/services/crm-sync/index.ts","../../src/queries/useCrmConfigs.ts","../../src/features/entity/utils/index.ts","../../src/utils/form.ts","../../src/utils/api.ts","../../src/services/create-edit-company.ts","../../src/hooks/useApiToasts.tsx","../../src/mutations/useCompanyMutate.ts","../../src/services/create-edit-contact.ts","../../src/mutations/useContactMutate.ts","../../src/utils/entity.ts","../../src/components/TextField/number.tsx","../../src/features/entity/create-edit/index.tsx","../../src/constants/routes.ts","../../src/components/Listing/v2/toolbar/icon-button.tsx","../../src/components/Listing/v2/actions/cf-config.tsx","../../src/features/exclude-domains/components/ExcludeListInput.tsx","../../src/features/exclude-domains/components/ExcludeListItem.tsx","../../src/features/exclude-domains/components/ExcludeListCard.tsx","../../src/mutations/useUpdateDomains.ts","../../src/mutations/useRemoveDomain.ts","../../src/features/exclude-domains/hooks/useExcludeList.ts","../../src/features/exclude-domains/constants.ts","../../src/features/exclude-domains/index.tsx","../../src/components/Listing/v2/actions/settings.tsx","../../src/assets/green_tick.svg?react","../../src/assets/chev_Arrow_Right-light.svg?react","../../src/components/Drawer/TabBar.tsx","../../src/features/import-csv/constants.ts","../../src/stores/importCSV.ts","../../src/services/importCSV.ts","../../src/mutations/usePresignedUpload.ts","../../src/mutations/useS3Upload.ts","../../src/mutations/useValidateImport.ts","../../src/mutations/useCommitImport.ts","../../src/features/import-csv/hooks/useImportCSVFlow.ts","../../src/assets/csv_icon.svg?react","../../src/components/ProgressBar/index.tsx","../../src/features/import-csv/components/drawer/drop-zone.tsx","../../src/features/import-csv/components/drawer/validation-result.tsx","../../src/features/import-csv/components/drawer/footer.tsx","../../src/features/import-csv/components/drawer/upload-tab.tsx","../../src/assets/warning_icon.svg?react","../../src/assets/expand_more.svg?react","../../src/assets/in_progress.svg?react","../../src/assets/erroricon.svg?react","../../src/components/ActivityLog/activity-item.tsx","../../src/components/ActivityLog/index.tsx","../../src/features/import-csv/hooks/useImportJobHistory.ts","../../src/features/import-csv/utils/activity.ts","../../src/features/import-csv/components/drawer/activity-tab.tsx","../../src/features/import-csv/components/drawer/index.tsx","../../src/assets/close.svg","../../src/assets/vector_right.svg?react","../../src/components/StepProgress/index.tsx","../../src/features/crm-sync/components/shared/CrmSelect.tsx","../../src/features/crm-sync/components/shared/FieldTypeIcon.tsx","../../src/features/crm-sync/components/shared/SearchableDropdown.tsx","../../src/assets/error.svg?react","../../src/features/crm-sync/components/shared/HiverFieldItem.tsx","../../src/assets/info.svg","../../src/features/crm-sync/components/shared/SyncSectionHeader.tsx","../../src/features/crm-sync/components/shared/SyncStartedView.tsx","../../src/features/crm-sync/constants.ts","../../src/features/crm-sync/components/shared/CreateNewFieldPanel.tsx","../../src/features/crm-sync/utils.ts","../../src/features/crm-sync/hooks/useFieldMappingData.ts","../../src/features/crm-sync/utils/settings.ts","../../src/services/custom-fields/create-field.ts","../../src/features/crm-sync/hooks/useFieldMappingMutations.ts","../../src/features/crm-sync/components/shared/FieldMappingStep.tsx","../../src/services/crm-sync/connectorApi.ts","../../src/features/crm-sync/hooks/useConnectorStatus.ts","../../src/queries/useEnabledConnectors.ts","../../src/features/crm-sync/hooks/useCrmAuthMutations.ts","../../src/features/crm-sync/hooks/useCrmLoginAction.ts","../../src/features/crm-sync/components/shared/CrmConnectStep.tsx","../../src/features/crm-sync/components/shared/CrmConnectDrawer.tsx","../../src/features/crm-sync/hooks/useCrmSyncMutations.ts","../../src/features/crm-sync/components/shared/DisconnectCrmModal.tsx","../../src/features/crm-sync/components/shared/tabs/SettingsTabSections.tsx","../../src/features/crm-sync/components/shared/tabs/SettingsTab.tsx","../../src/features/crm-sync/hooks/useCrmSyncRuns.ts","../../src/features/crm-sync/utils/activity.ts","../../src/features/crm-sync/components/shared/tabs/ActivityTab.tsx","../../src/hooks/useCrmSyncStatus.ts","../../src/features/crm-sync/components/shared/CrmSettingsDrawer.tsx","../../src/stores/crmSync.ts","../../src/features/crm-sync/hooks/useCrmConnections.ts","../../src/assets/hubspot.svg?react","../../src/assets/salesforce.svg?react","../../src/features/crm-sync/providerConfig.tsx","../../src/features/import-csv/components/trigger/index.tsx","../../src/components/Checkbox/index.tsx","../../src/components/MultiSelect/styles.tsx","../../src/components/MultiSelect/index.tsx","../../src/features/entity-filters/components/FilterField.tsx","../../src/features/entity-filters/components/FilterFooter.tsx","../../src/features/entity-filters/components/FilterHeader.tsx","../../src/features/entity-filters/components/FilterPopover.tsx","../../src/features/entity-filters/components/FilterTrigger.tsx","../../src/hooks/useClickAway.ts","../../src/features/entity-filters/components/EntityFilter.tsx","../../src/components/Listing/v2/toolbar/filter.tsx","../../src/components/Search/SearchInput.tsx","../../src/stores/search.ts","../../src/components/Listing/v2/toolbar/search.tsx","../../src/components/Listing/v2/toolbar/index.tsx","../../src/stores/sort.ts","../../src/components/Listing/v2/cells/header.tsx","../../src/queries/useCompanies.ts","../../src/components/Chips/Chip.tsx","../../src/components/Chips/index.tsx","../../src/components/TableShimmer/index.tsx","../../src/services/custom-fields/view-configs.ts","../../src/utils/customFields.ts","../../src/queries/useCFColumns.ts","../../src/utils/table.ts","../../src/components/Listing/v2/cells/cf-field.tsx","../../src/hooks/useDebouncedValue.ts","../../src/constants/search.ts","../../src/hooks/useListingSearchText.ts","../../src/components/Listing/v2/actions/create.tsx","../../src/components/DragAndDrop/index.tsx","../../src/features/column-preference/components/PreferenceHeader.tsx","../../src/features/column-preference/components/PreferenceRow.tsx","../../src/features/column-preference/components/PreferencePopover.tsx","../../src/features/column-preference/components/PreferenceTrigger.tsx","../../src/features/column-preference/components/ColumnPreference.tsx","../../src/features/column-preference/hooks/useColumnPreferences.ts","../../src/components/Listing/v2/AccountTable.tsx","../../src/pages/Accounts.tsx","../../src/assets/compose_mail.svg","../../src/assets/phone-disabled.svg","../../src/constants/outboundCalls.ts","../../src/components/TableCells/index.tsx","../../src/components/Listing/ContactTable.tsx","../../src/queries/useContacts.ts","../../src/components/Listing/v2/ContactTable.tsx","../../src/pages/Contacts.tsx","../../src/components/Card/index.tsx","../../src/components/AccountsConversation/index.tsx","../../src/components/DetailsCard/index.tsx","../../src/services/custom-fields/entity-summary.ts","../../src/queries/useEntitySummary.ts","../../src/features/custom-fields/components/summary/row.tsx","../../src/features/custom-fields/components/summary/index.tsx","../../src/components/AccountDetails/index.tsx","../../src/assets/edit.svg","../../src/components/AccountDetails/EditAccount.tsx","../../src/components/AccountContacts/index.tsx","../../src/pages/AccountDetail.tsx","../../src/components/ContactConversation/index.tsx","../../src/components/Contacts/EditContact.tsx","../../src/components/ContactDetails/index.tsx","../../src/components/Contacts/EditContactV2.tsx","../../src/pages/ContactDetail.tsx","../../src/components/ContactConversation/Converation.tsx","../../src/services/custom-fields/edit-field.ts","../../src/mutations/useCFMutate.ts","../../src/features/custom-fields/components/create-edit/footer.tsx","../../src/services/crm-sync/map-crm-field.ts","../../src/mutations/useMapCrmFields.ts","../../src/features/custom-fields/hooks/useFieldMapping.ts","../../src/assets/trash.svg?react","../../src/components/OptionsField/index.tsx","../../src/features/custom-fields/components/create-edit/type-field.tsx","../../src/features/custom-fields/utils/index.ts","../../src/features/custom-fields/components/create-edit/crm-mapping.tsx","../../src/utils/index.ts","../../src/features/custom-fields/components/create-edit/form-body.tsx","../../src/features/custom-fields/components/create-edit/index.tsx","../../src/services/custom-fields/toggle-visibility.ts","../../src/mutations/useCFVisibility.ts","../../src/features/custom-fields/components/table-cells/data-source.tsx","../../src/features/custom-fields/components/table-cells/visibility.tsx","../../src/features/custom-fields/components/table-cells/type.tsx","../../src/features/custom-fields/components/table-cells/actions.tsx","../../src/features/custom-fields/components/listing.tsx","../../src/pages/CustomFields.tsx","../../src/App.tsx","../../src/constants/api.ts","../../src/index.tsx","../../src/assets/Import.svg?raw","../../src/assets/account_friction.svg?raw","../../src/assets/account_sentiment.svg?raw","../../src/assets/accounts.svg?raw","../../src/assets/activity_icon.svg?raw","../../src/assets/at_the_rate.svg?raw","../../src/assets/buildings.svg?raw","../../src/assets/calendar.svg?raw","../../src/assets/cf-config.svg?raw","../../src/assets/chat.svg?raw","../../src/assets/chev_Arrow_Right-light.svg?raw","../../src/assets/chev_arrow_left.svg?raw","../../src/assets/chev_arrow_right.svg?raw","../../src/assets/chevron.svg?raw","../../src/assets/close.svg?raw","../../src/assets/close_bold.svg?raw","../../src/assets/columns.svg?raw","../../src/assets/company_small.svg?raw","../../src/assets/compose_mail.svg?raw","../../src/assets/contacts.svg?raw","../../src/assets/contacts_dark.svg?raw","../../src/assets/conversation.svg?raw","../../src/assets/csv_icon.svg?raw","../../src/assets/customers.svg?raw","../../src/assets/details.svg?raw","../../src/assets/domain.svg?raw","../../src/assets/download.svg?raw","../../src/assets/drag_icon.svg?raw","../../src/assets/edit.svg?raw","../../src/assets/email.svg?raw","../../src/assets/error.svg?raw","../../src/assets/erroricon.svg?raw","../../src/assets/expand_more.svg?raw","../../src/assets/external_link.svg?raw","../../src/assets/field_boolean.svg?raw","../../src/assets/field_date.svg?raw","../../src/assets/field_dropdown.svg?raw","../../src/assets/field_input.svg?raw","../../src/assets/field_number.svg?raw","../../src/assets/field_url.svg?raw","../../src/assets/filter.svg?raw","../../src/assets/google.svg?raw","../../src/assets/green_tick.svg?raw","../../src/assets/hubspot.svg?raw","../../src/assets/hyperlink.svg?raw","../../src/assets/in_progress.svg?raw","../../src/assets/inbox.svg?raw","../../src/assets/inbox_tooltip.svg?raw","../../src/assets/info.svg?raw","../../src/assets/insights/alert_triangle_filled.svg?raw","../../src/assets/insights/check.svg?raw","../../src/assets/insights/chevron_down.svg?raw","../../src/assets/insights/factor_csat.svg?raw","../../src/assets/insights/factor_escalation.svg?raw","../../src/assets/insights/factor_friction.svg?raw","../../src/assets/insights/factor_query.svg?raw","../../src/assets/insights/factor_sentiment.svg?raw","../../src/assets/insights/factor_sla.svg?raw","../../src/assets/insights/factor_ticket.svg?raw","../../src/assets/insights/health_plus.svg?raw","../../src/assets/insights/sentiment_face_negative.svg?raw","../../src/assets/insights/sentiment_face_neutral.svg?raw","../../src/assets/insights/sentiment_face_positive.svg?raw","../../src/assets/insights/sentiment_smiley.svg?raw","../../src/assets/insights/thumb_down.svg?raw","../../src/assets/insights/thumb_down_filled.svg?raw","../../src/assets/insights/thumb_up.svg?raw","../../src/assets/insights/thumb_up_filled.svg?raw","../../src/assets/insights/trend_arrow.svg?raw","../../src/assets/kebab.svg?raw","../../src/assets/message.svg?raw","../../src/assets/number.svg?raw","../../src/assets/open_in_a_new_tab.svg?raw","../../src/assets/phone-disabled.svg?raw","../../src/assets/phone.svg?raw","../../src/assets/plus.svg?raw","../../src/assets/rounded_arrow_down.svg?raw","../../src/assets/search.svg?raw","../../src/assets/search_typing.svg?raw","../../src/assets/setting.svg?raw","../../src/assets/settings.svg?raw","../../src/assets/slack.svg?raw","../../src/assets/sm_contacts.svg?raw","../../src/assets/sm_inboxes_light.svg?raw","../../src/assets/sm_inboxs.svg?raw","../../src/assets/sm_slider.svg?raw","../../src/assets/sort_asc.svg?raw","../../src/assets/sort_normal.svg?raw","../../src/assets/status-resolved.svg?raw","../../src/assets/status-snoozed.svg?raw","../../src/assets/status_open.svg?raw","../../src/assets/text_icon.svg?raw","../../src/assets/ticket.svg?raw","../../src/assets/toggle_icon.svg?raw","../../src/assets/trash.svg?raw","../../src/assets/user.svg?raw","../../src/assets/vector_right.svg?raw","../../src/assets/warning_icon.svg?raw","../../src/assets/whatsapp.svg?raw"],"sourcesContent":["const HUITheme = {\n palette: {\n primary: {\n main: \"#000\",\n light: \"#000\",\n dark: \"#000\"\n }\n }\n};\n\nexport { HUITheme };\n//# sourceMappingURL=themes.hui.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport { createContext, useContext } from 'react';\nimport { HiverThemeProviderUnStyled } from '@hiver/hiver-ui-kit';\nimport { HUITheme } from './themes.hui.js';\n\nfunction asKitComponent(component) {\n return component;\n}\n\nconst KitThemeProvider = asKitComponent(HiverThemeProviderUnStyled);\nconst HUIThemeContext = createContext(HUITheme);\nfunction useHUITheme() {\n return useContext(HUIThemeContext);\n}\nfunction HUIThemeProvider({\n children,\n theme = HUITheme,\n mode = \"light\",\n darkAuto = false\n}) {\n return /* @__PURE__ */ jsx(HUIThemeContext.Provider, { value: theme, children: /* @__PURE__ */ jsx(KitThemeProvider, { v2: true, mode, darkAuto, children }) });\n}\n\nexport { HUIThemeProvider as H, asKitComponent as a, useHUITheme as u };\n//# sourceMappingURL=HUIThemeProvider-BBurfZRy.js.map\n","import { jsxs, jsx, Fragment as Fragment$1 } from 'react/jsx-runtime';\nimport { Tabs as Tabs$1, Box, Typography as Typography$1, TablePagination, Popover, Pagination as Pagination$1 } from '@hiver/hiver-ui-kit';\nimport { Tab as Tab$1, Button as Button$1, IconButton as IconButton$1, Input, Toast as Toast$1, Modal, Breadcrumbs, Tag, Avatar as Avatar$1, Table, Dropdown, SideDrawer } from '@hiver/hiver-ui-kit/v2';\nimport { a as asKitComponent } from './HUIThemeProvider-BBurfZRy.js';\nexport { H as HUIThemeProvider, H as ThemeProvider, u as useHUITheme } from './HUIThemeProvider-BBurfZRy.js';\nimport { forwardRef, useState, useCallback, useImperativeHandle, Children, isValidElement, Fragment, useRef } from 'react';\nimport { ArrowLeft, XClose, Calendar } from '@hiver/hiver-ui-kit/icons';\nimport { DesktopDatePicker } from '@mui/x-date-pickers/DesktopDatePicker';\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\nimport { AdapterMoment } from '@mui/x-date-pickers/AdapterMoment';\nexport { HUITheme } from './themes.hui.js';\n\nconst TabsComponent = asKitComponent(Tabs$1);\nconst stripSx = {\n borderBottom: \"1px solid\",\n borderColor: \"border.neutral.subtle\",\n paddingLeft: \"8px\",\n \"&:not(.MuiTabs-vertical) .MuiTab-root.MuiButtonBase-root\": {\n borderBottom: 0\n }\n};\nconst TabItem$1 = asKitComponent(Tab$1.Item);\nconst Tabs = (props) => {\n const {\n value,\n onTabChange,\n items,\n className\n } = props;\n return (\n /* A plain element, not a `Box`: this is a full-width wrapper with no token\n in it, so reaching for a styled primitive only to set `width: 100%` pulls\n a v1 component in for nothing. */\n /* @__PURE__ */ jsxs(\"div\", { style: { width: \"100%\" }, className, children: [\n /* @__PURE__ */ jsx(\n TabsComponent,\n {\n value,\n onChange: (event, index) => onTabChange({ originalEvent: event, index }),\n textColor: \"inherit\",\n TabIndicatorProps: { sx: { display: \"none\" } },\n sx: stripSx,\n children: items.map((t, idx) => /* @__PURE__ */ jsx(\n TabItem$1,\n {\n variant: \"underline\",\n label: t.label,\n icon: t.icon,\n active: value === idx,\n value: idx\n },\n idx\n ))\n }\n ),\n items.map((t, idx) => /* @__PURE__ */ jsx(\n \"div\",\n {\n hidden: value !== idx,\n role: \"tabpanel\",\n style: { padding: \"16px 0\" },\n children: value === idx && t.content\n },\n idx\n ))\n ] })\n );\n};\n\nconst TabItem = asKitComponent(Tab$1.Item);\nconst Tab = (props) => {\n const {\n header,\n value,\n icon,\n count,\n countVisible,\n disabled = false,\n sx,\n className,\n style,\n onClick\n } = props;\n return /* @__PURE__ */ jsx(\n TabItem,\n {\n variant: \"underline\",\n label: header,\n value,\n icon,\n badge: count !== void 0 ? String(count) : void 0,\n showBadge: countVisible,\n disabled,\n sx,\n className,\n style,\n onClick\n }\n );\n};\n\nconst VARIANTS$1 = {\n contained: \"primary_old\",\n outlined: \"secondary\",\n text: \"link\"\n};\nconst SIZES$2 = {\n small: \"sm\",\n medium: \"md\",\n large: \"lg\"\n};\nconst ButtonComponent = asKitComponent(Button$1);\nconst Button = (props) => {\n const {\n label,\n children,\n variant = \"contained\",\n color = \"primary\",\n size = \"medium\",\n disabled = false,\n onClick,\n className,\n icon,\n isTextStyled\n } = props;\n const baseVariant = VARIANTS$1[isTextStyled ? \"text\" : variant];\n const v2Variant = color === \"error\" && baseVariant !== \"link\" ? \"destructive\" : baseVariant;\n return /* @__PURE__ */ jsx(\n ButtonComponent,\n {\n size: SIZES$2[size],\n variant: v2Variant,\n onClick,\n disabled,\n className,\n startIcon: typeof icon === \"string\" ? /* @__PURE__ */ jsx(\"i\", { className: icon }) : icon,\n children: children || label\n }\n );\n};\n\nconst SIZES$1 = {\n sm: \"sm\",\n md: \"md\",\n lg: \"lg\",\n xl: \"lg\",\n small: \"sm\",\n medium: \"md\",\n large: \"lg\"\n};\nconst IconButtonComponent$1 = asKitComponent(IconButton$1);\nconst IconButton = (props) => {\n const {\n children,\n icon,\n image,\n alt = \"\",\n color = \"default\",\n size = \"medium\",\n disabled = false,\n onClick,\n className = \"\",\n iconWrapperClassName = \"\",\n iconClassName = \"\",\n style,\n edge,\n ariaLabel,\n \"aria-label\": ariaLabelAlt,\n outlined = false,\n text = false,\n raised = false\n } = props;\n const effectiveAriaLabel = ariaLabel || ariaLabelAlt || \"\";\n const v2Variant = color === \"error\" ? \"destructive\" : raised ? \"filled\" : outlined ? \"secondary\" : text ? \"ghost\" : \"ghost\";\n const renderContent = () => {\n if (children) return children;\n if (image) {\n return /* @__PURE__ */ jsx(\"div\", { className: `icon-button__icon-wrapper ${iconWrapperClassName}`, children: /* @__PURE__ */ jsx(\"img\", { src: image, alt, className: `icon-button__icon ${iconClassName}` }) });\n }\n if (icon) {\n return /* @__PURE__ */ jsx(\"i\", { className: `${icon} ${iconClassName}` });\n }\n return null;\n };\n return /* @__PURE__ */ jsx(\n IconButtonComponent$1,\n {\n size: SIZES$1[size] ?? \"md\",\n variant: v2Variant,\n disabled,\n onClick,\n className: className.trim(),\n style,\n edge,\n \"aria-label\": effectiveAriaLabel,\n children: renderContent()\n }\n );\n};\n\nconst SIZES = { small: \"sm\", medium: \"md\" };\nconst InputComponent = asKitComponent(Input.Text);\nfunction renderIcon$1(icon) {\n if (typeof icon === \"string\") {\n return /* @__PURE__ */ jsx(\"img\", { src: icon, alt: \"\", \"aria-hidden\": \"true\" });\n }\n return icon;\n}\nconst TextField = (props) => {\n const {\n value,\n onChange,\n placeholder,\n disabled = false,\n type = \"text\",\n className,\n style,\n name,\n id,\n autoFocus = false,\n required = false,\n error = false,\n helperText,\n label,\n fullWidth = true,\n size = \"medium\",\n icon,\n iconPosition = \"left\",\n ...extraProps\n } = props;\n const adornment = icon ? renderIcon$1(icon) : void 0;\n return /* @__PURE__ */ jsx(\n InputComponent,\n {\n value,\n onChange,\n placeholder,\n disabled,\n type,\n className,\n style,\n name,\n id,\n autoFocus,\n required,\n error,\n helperText,\n label,\n size: SIZES[size],\n prefix: iconPosition === \"left\" ? adornment : void 0,\n suffix: iconPosition === \"right\" ? adornment : void 0,\n slotProps: fullWidth ? void 0 : { root: { sx: { width: \"auto\" } } },\n ...extraProps\n }\n );\n};\n\nconst TONES$1 = {\n success: \"success\",\n error: \"error\",\n warning: \"warning\",\n info: \"info\"\n};\nconst mapPosition = (position) => {\n switch (position) {\n case \"top-left\":\n return { vertical: \"top\", horizontal: \"left\" };\n case \"top-center\":\n case \"center\":\n return { vertical: \"top\", horizontal: \"center\" };\n case \"top-right\":\n return { vertical: \"top\", horizontal: \"right\" };\n case \"bottom-left\":\n return { vertical: \"bottom\", horizontal: \"left\" };\n case \"bottom-center\":\n return { vertical: \"bottom\", horizontal: \"center\" };\n case \"bottom-right\":\n return { vertical: \"bottom\", horizontal: \"right\" };\n default:\n return { vertical: \"top\", horizontal: \"right\" };\n }\n};\nconst ToastComponent = asKitComponent(Toast$1);\nlet nextKey = 0;\nconst Toast = forwardRef(\n ({ position = \"top-right\", className }, ref) => {\n const [message, setMessage] = useState(null);\n const push = useCallback((next) => {\n nextKey += 1;\n setMessage({ ...next, key: nextKey });\n }, []);\n useImperativeHandle(\n ref,\n () => ({\n show: (props) => {\n const { text, severity = \"info\", life = 3e3, closable = true, icon } = props;\n push({ text, severity, life, closable, icon });\n },\n success: (text, options) => {\n push({\n text,\n severity: \"success\",\n life: options?.life || 3e3,\n closable: options?.closable !== false,\n icon: options?.icon\n });\n },\n error: (text, options) => {\n push({\n text,\n severity: \"error\",\n life: options?.life || 3e3,\n closable: options?.closable !== false,\n icon: options?.icon\n });\n },\n warning: (text, options) => {\n push({\n text,\n severity: \"warning\",\n life: options?.life || 3e3,\n closable: options?.closable !== false,\n icon: options?.icon\n });\n },\n info: (text, options) => {\n push({\n text,\n severity: \"info\",\n life: options?.life || 3e3,\n closable: options?.closable !== false,\n icon: options?.icon\n });\n }\n }),\n [push]\n );\n if (!message) {\n return null;\n }\n const handleClose = (_event, reason) => {\n if (reason === \"clickaway\") {\n return;\n }\n if (reason === \"timeout\" || message.closable) {\n setMessage(null);\n }\n };\n return /* @__PURE__ */ jsx(\n ToastComponent,\n {\n open: true,\n size: \"sm\",\n tone: TONES$1[message.severity],\n title: message.text,\n icon: message.icon === null ? false : message.icon,\n dismissible: message.closable,\n onDismiss: () => setMessage(null),\n className,\n anchorOrigin: mapPosition(position),\n autoHideDuration: message.life,\n onClose: handleClose\n },\n message.key\n );\n }\n);\nToast.displayName = \"Toast\";\n\nconst MAX_WIDTHS = {\n xs: 444,\n sm: 600,\n md: 900,\n lg: 1200,\n xl: 1536\n};\nconst ModalContainer = asKitComponent(Modal.Container);\nconst ModalBody = asKitComponent(Modal.Body);\nconst ModalFooter = asKitComponent(Modal.Footer);\nconst BoxComponent = asKitComponent(Box);\nconst TypographyComponent$1 = asKitComponent(Typography$1);\nconst IconButtonComponent = asKitComponent(IconButton$1);\nconst Dialog = (props) => {\n const {\n children,\n className,\n style,\n maskClassName,\n open = false,\n onClose,\n fullWidth = false,\n maxWidth = \"sm\",\n fullScreen = false,\n disableEscapeKeyDown = false,\n title,\n footer,\n variant = \"confirmation\",\n onBack,\n showBackButton = true,\n showCloseButton = true\n } = props;\n const handleClose = (event, reason) => {\n if (disableEscapeKeyDown && reason === \"escapeKeyDown\") {\n return;\n }\n if (onClose) {\n onClose(event, reason);\n }\n };\n const handleBack = () => {\n if (onBack) {\n onBack();\n } else if (onClose) {\n onClose({}, \"backdropClick\");\n }\n };\n const handleCloseButton = () => {\n if (onClose) {\n onClose({}, \"backdropClick\");\n }\n };\n const width = fullScreen ? \"100vw\" : fullWidth ? \"100%\" : maxWidth === false ? void 0 : MAX_WIDTHS[maxWidth];\n const renderHeader = () => {\n if (variant === \"confirmation\" && title) {\n return /* @__PURE__ */ jsxs(\n BoxComponent,\n {\n className: \"omni-dialog-header-confirmation\",\n sx: { display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", width: \"100%\", gap: 1 },\n children: [\n /* @__PURE__ */ jsxs(BoxComponent, { sx: { display: \"flex\", alignItems: \"center\", gap: 1.25, minWidth: 0 }, children: [\n showBackButton && /* @__PURE__ */ jsx(\n IconButtonComponent,\n {\n variant: \"ghost\",\n size: \"xs\",\n className: \"omni-dialog-back-button\",\n \"aria-label\": \"Go back\",\n onClick: handleBack,\n children: /* @__PURE__ */ jsx(ArrowLeft, {})\n }\n ),\n /* @__PURE__ */ jsx(\n TypographyComponent$1,\n {\n variant: \"heading_sm_medium\",\n component: \"div\",\n sx: { minWidth: 0, color: \"text.neutral.strong\" },\n children: title\n }\n )\n ] }),\n showCloseButton && /* @__PURE__ */ jsx(\n IconButtonComponent,\n {\n variant: \"ghost\",\n size: \"xs\",\n className: \"omni-dialog-close-button\",\n \"aria-label\": \"Close\",\n onClick: handleCloseButton,\n children: /* @__PURE__ */ jsx(XClose, {})\n }\n )\n ]\n }\n );\n }\n return title;\n };\n return /* @__PURE__ */ jsxs(\n ModalContainer,\n {\n open,\n onClose: handleClose,\n disableEscapeKeyDown,\n className: maskClassName,\n width,\n surfaceProps: {\n className,\n style,\n ...fullScreen ? { sx: { height: \"100vh\", maxHeight: \"100vh\", borderRadius: 0 } } : {}\n },\n children: [\n title && /* @__PURE__ */ jsx(\n BoxComponent,\n {\n sx: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 1,\n px: 2,\n minHeight: 52,\n borderBottom: \"1px solid\",\n borderColor: \"border.neutral.subtle\",\n // The title slot takes arbitrary content — the search dialog passes a\n // whole TextField — so it has to be able to fill the row.\n \"& > *\": { minWidth: 0 }\n },\n children: renderHeader()\n }\n ),\n /* @__PURE__ */ jsx(ModalBody, { type: \"custom\", children }),\n footer && /* @__PURE__ */ jsx(ModalFooter, { type: \"Slot\", children: footer })\n ]\n }\n );\n};\n\nconst BreadcrumbsComponent = asKitComponent(Breadcrumbs);\nconst SLOT_PROPS = {\n item: { variant: \"body_sm_medium\" },\n currentItem: { variant: \"body_sm_medium\" }\n};\nconst iconLabelSx = { display: \"inline-flex\", alignItems: \"center\", gap: 4 };\nfunction renderIcon(icon) {\n return typeof icon === \"string\" ? /* @__PURE__ */ jsx(\"span\", { className: icon }) : icon;\n}\nconst Breadcrumb = (props) => {\n const {\n items,\n className,\n style\n } = props;\n return /* @__PURE__ */ jsx(\n BreadcrumbsComponent,\n {\n \"aria-label\": \"breadcrumb\",\n className,\n style,\n slotProps: SLOT_PROPS,\n items: items.map((item, index) => ({\n key: index,\n label: item.icon ? /* @__PURE__ */ jsxs(\"span\", { style: iconLabelSx, children: [\n renderIcon(item.icon),\n item.label\n ] }) : item.label,\n href: item.url,\n /*\n * `command` becomes v2's `onClick`, which renders the crumb as a\n * real `<button>`. Not on the LAST crumb: that is the current\n * page, and v2 draws it as the non-interactive current item\n * regardless — a handler there would be dead code.\n */\n onClick: !item.url && item.command && index < items.length - 1 ? item.command : void 0\n }))\n }\n );\n};\n\nconst TONES = {\n default: \"neutral\",\n primary: \"info\",\n secondary: \"neutral\",\n info: \"info\",\n success: \"success\",\n warning: \"warning\",\n error: \"error\"\n};\nconst TagComponent$1 = asKitComponent(Tag);\nconst Chip = (props) => {\n const {\n label,\n className,\n style,\n color = \"primary\",\n size = \"medium\",\n icon,\n onClick,\n removable,\n onRemove\n } = props;\n const [removed, setRemoved] = useState(false);\n const handleRemove = (event) => {\n const shouldRemove = onRemove?.({\n originalEvent: event,\n value: typeof label === \"string\" ? label : \"\"\n });\n if (shouldRemove !== false) {\n setRemoved(true);\n }\n };\n if (removed) {\n return null;\n }\n return /* @__PURE__ */ jsx(\n TagComponent$1,\n {\n tone: TONES[color],\n size: size === \"small\" ? \"sm\" : \"md\",\n className,\n style,\n startIcon: icon ? /* @__PURE__ */ jsx(\"i\", { className: icon }) : void 0,\n onClick,\n removable: Boolean(removable),\n onRemove: removable ? handleRemove : void 0,\n children: label\n }\n );\n};\n\nconst AvatarComponent = asKitComponent(Avatar$1);\nconst Avatar = ({ label, color = \"blue\", size = \"xs\", className, style, ...rest }) => /* @__PURE__ */ jsx(\n AvatarComponent,\n {\n type: \"initials\",\n background: \"subtle\",\n shape: \"circle\",\n color,\n size,\n className,\n style,\n \"aria-label\": rest[\"aria-label\"],\n children: label\n }\n);\n\nfunction devWarn(message) {\n}\n\nconst TableRoot = asKitComponent(Table);\nconst hasExplicitWidth = (columns) => columns.some((col) => col.style?.width !== void 0);\nconst TableContainer = asKitComponent(Table.Container);\nconst scrollSx = (scrollable, scrollHeight) => scrollable ? {\n overflowY: \"auto\",\n ...scrollHeight && scrollHeight !== \"flex\" ? { maxHeight: scrollHeight } : {}\n} : void 0;\nconst TableHeader = asKitComponent(Table.Header);\nconst TableBody = asKitComponent(Table.Body);\nconst TableRow = asKitComponent(Table.Row);\nconst HeaderCell = asKitComponent(Table.HeaderCell);\nconst BodyCell = asKitComponent(Table.BodyCell);\nconst BODY_CELL_SX = { \"& > .MuiBox-root\": { minHeight: \"55px\" } };\nconst CELL_LABEL_SLOT = {\n title: {\n component: \"div\",\n /*\n * `Table.BodyCell` gives its title slot `overflow: hidden` but no\n * `text-overflow`, so content that does not fit is cut mid-glyph with\n * nothing to signal it. On a data table that reads as a VALUE error\n * rather than a layout one — a connector called \"Salesforce\" rendered\n * as \"Salesfor\", which looks like bad data.\n */\n /*\n * Regular, not the kit's medium. `Table.BodyCell` sets every title in\n * `body_sm_medium`, which is the kit's single-line default; the HiG\n * listings (Figma 1:7222 and the design QA's A1/CL4) set body cells in\n * `body/sm/regular` — medium on every row made the rows read as bold\n * and flattened them against the header labels.\n */\n sx: { textOverflow: \"ellipsis\", fontWeight: 400 }\n }\n};\nconst DATATABLE_CLASS = \"hui-datatable\";\nconst HEADER_CELL_CLASS = \"hui-datatable__header-cell\";\nconst ROW_CLASS = \"hui-datatable__row\";\nconst CELL_CLASS = \"hui-datatable__cell\";\nconst join = (...parts) => parts.filter(Boolean).join(\" \");\nconst cellPresentation = (col) => ({\n style: col.style\n});\nconst Column = () => null;\nColumn.displayName = \"Column\";\nfunction flattenElements(children) {\n return Children.toArray(children).filter(isValidElement).flatMap(\n (child) => child.type === Fragment ? flattenElements(child.props.children) : [child]\n );\n}\nfunction isColumnElement(child) {\n if (child.type === Column) {\n return true;\n }\n const type = child.type;\n return type?.displayName === \"Column\" || type?.type?.displayName === \"Column\";\n}\nfunction columnsFromChildren(children) {\n const elements = flattenElements(children);\n const columns = elements.filter(isColumnElement);\n if (elements.length > 0 && columns.length === 0) {\n devWarn(\n `[DataTable] Received ${elements.length} element child(ren) but recognised no <Column>. The table will render them as-is. If you meant to declare columns, import { Column } from the same entry point as { DataTable } and do not wrap it in another element.`\n );\n }\n return columns.map((child, index) => {\n const { field, header, ...rest } = child.props;\n return {\n id: field || String(index),\n label: header,\n field,\n ...rest\n };\n });\n}\nfunction DataTable(props) {\n const {\n children,\n className,\n style,\n columns,\n value = [],\n tableStyle,\n rows: rowsPerPageProp,\n paginator,\n rowsPerPageOptions,\n onRowClick,\n emptyMessage,\n scrollable,\n scrollHeight\n } = props;\n const containerSx = scrollSx(scrollable, scrollHeight);\n const [page, setPage] = useState(0);\n const [rowsPerPage, setRowsPerPage] = useState(rowsPerPageProp || 10);\n const handleChangePage = (_event, newPage) => {\n setPage(newPage);\n };\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n const paginatedData = paginator && rowsPerPage ? value.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage) : value;\n const resolvedColumns = columns && columns.length > 0 ? columns : columnsFromChildren(children);\n if (resolvedColumns.length === 0) {\n return /* @__PURE__ */ jsx(TableContainer, { className: join(DATATABLE_CLASS, className), style, sx: containerSx, children: /* @__PURE__ */ jsx(TableRoot, { style: tableStyle, children }) });\n }\n return /* @__PURE__ */ jsxs(TableContainer, { className: join(DATATABLE_CLASS, className), style, sx: containerSx, children: [\n /* @__PURE__ */ jsxs(\n TableRoot,\n {\n style: tableStyle,\n sx: hasExplicitWidth(resolvedColumns) ? { tableLayout: \"fixed\" } : void 0,\n children: [\n /* @__PURE__ */ jsx(TableHeader, { children: /* @__PURE__ */ jsx(TableRow, { children: resolvedColumns.map((col) => /* @__PURE__ */ jsx(\n HeaderCell,\n {\n color: \"gray\",\n label: col.label,\n sx: {\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n \"& > *\": { minWidth: 0, overflow: \"hidden\", textOverflow: \"ellipsis\" },\n /*\n * 12px, which is NEITHER of v2's two header\n * densities — and that is a discrepancy to\n * raise with design, not a preference.\n *\n * `HeaderCell` offers `white` (py 8, so a\n * 36px row) and `gray` (py 16, so 52). Both\n * D-02 (`1:7222`) and the custom-fields\n * frame (`1:7475`) draw their \"Table header\n * cell\" instance at **44**, which is py 12.\n * The Figma and the shipped component do\n * not agree, and 8px on every table header\n * is visible.\n *\n * The Figma wins here because it is what\n * the screens were signed off against. If\n * the component is right and the frames are\n * stale, delete these two lines.\n */\n paddingTop: \"12px\",\n paddingBottom: \"12px\",\n /*\n * The header rule has to travel with the\n * pinned header. With collapsed table\n * borders a header cell's border belongs to\n * the table, not the cell, so once the header\n * pins, that border stays behind and scrolls\n * away with the first row. An inset shadow is\n * painted by the cell itself, so it is the\n * ONLY rule: the table's border is removed\n * outright (`&&` doubles the class to outrank\n * the kit's own border rule — a see-through\n * colour lost and drew both, 2px at rest and\n * 1px once scrolled). 13px bottom padding\n * gives back the border's pixel, so the\n * header stays 44.\n *\n * (Worded around utility names on purpose:\n * Tailwind scans this text and would emit\n * them into the primereact stylesheet.)\n */\n \"&&\": { borderBottom: 0, paddingBottom: \"13px\" },\n boxShadow: (theme) => `inset 0 -1px 0 ${theme.palette?.border?.neutral?.subtle ?? \"#eeeeee\"}`\n },\n ...cellPresentation(col),\n className: join(HEADER_CELL_CLASS, col.className)\n },\n col.id\n )) }) }),\n /* @__PURE__ */ jsxs(TableBody, { children: [\n value.length === 0 && emptyMessage ? (\n // Parity with PrimeReact's DataTable, which renders `emptyMessage`\n // under the headers instead of an empty body.\n /* @__PURE__ */ jsx(TableRow, { className: ROW_CLASS, children: /* @__PURE__ */ jsx(\n BodyCell,\n {\n className: CELL_CLASS,\n colSpan: resolvedColumns.length,\n slotProps: CELL_LABEL_SLOT,\n label: typeof emptyMessage === \"function\" ? emptyMessage() : emptyMessage\n }\n ) })\n ) : null,\n paginatedData.map((row, rowIndex) => /* @__PURE__ */ jsx(\n TableRow,\n {\n className: ROW_CLASS,\n onClick: (e) => onRowClick && onRowClick({ originalEvent: e, data: row, index: rowIndex }),\n sx: onRowClick ? { cursor: \"pointer\" } : void 0,\n children: resolvedColumns.map((col) => {\n const field = col.field || col.id;\n const cellValue = row[field];\n const cellContent = col.body ? typeof col.body === \"function\" ? col.body(row) : col.body : cellValue;\n return /* @__PURE__ */ jsx(\n BodyCell,\n {\n variant: \"text\",\n sx: BODY_CELL_SX,\n label: cellContent,\n slotProps: CELL_LABEL_SLOT,\n ...cellPresentation(col),\n className: join(CELL_CLASS, col.className)\n },\n col.id\n );\n })\n },\n rowIndex\n ))\n ] })\n ]\n }\n ),\n paginator && /* @__PURE__ */ jsx(\n TablePagination,\n {\n component: \"div\",\n count: value.length,\n rowsPerPage,\n page,\n onPageChange: handleChangePage,\n onRowsPerPageChange: handleChangeRowsPerPage,\n rowsPerPageOptions: rowsPerPageOptions || [5, 10, 25, 50]\n }\n )\n ] });\n}\n\nconst VARIANTS = {\n // display 28/24 -> heading 20/18/16 -> body 16/14/13/12 -> caption 12.\n h1: \"display_lg_semiBold\",\n h2: \"display_md_semiBold\",\n h3: \"heading_lg_semiBold\",\n h4: \"heading_md_semiBold\",\n // 16/22/500 — the step the old `typographyVariantSx.h5` was hand-writing as\n // \"16/24/500\" against MUI's factory 16/1.334/400.\n h5: \"heading_sm_medium\",\n h6: \"body_md_semiBold\",\n body: \"body_md_regular\",\n body2: \"body_sm_regular\",\n body3: \"body_md_regular\",\n sm: \"body_sm_regular\",\n caption: \"caption_regular\"\n};\nconst TypographyComponent = asKitComponent(Typography$1);\nfunction Typography({\n text,\n variant = \"body\",\n tag = \"p\",\n noWrap = false,\n children,\n className,\n ...rest\n}) {\n return /* @__PURE__ */ jsx(\n TypographyComponent,\n {\n variant: VARIANTS[variant],\n component: tag,\n noWrap,\n className,\n ...rest,\n children: children || text\n }\n );\n}\n\nconst DropdownField = asKitComponent(Dropdown.Field);\nconst DropdownMenu = asKitComponent(Dropdown.Menu);\nconst PopoverComponent = asKitComponent(Popover);\nconst OPEN_KEYS = [\"Enter\", \" \", \"ArrowDown\", \"ArrowUp\"];\nfunction DropdownSurface({\n value,\n placeholder,\n disabled = false,\n error = false,\n helperText,\n size = \"md\",\n className,\n style,\n id,\n panelClassName,\n appendTo,\n onShow,\n onHide,\n footer,\n children\n}) {\n const fieldRef = useRef(null);\n const [anchor, setAnchor] = useState(null);\n const [triggerWidth, setTriggerWidth] = useState(void 0);\n const open = anchor !== null;\n const show = () => {\n const trigger = fieldRef.current;\n setAnchor(trigger);\n setTriggerWidth(trigger?.clientWidth);\n onShow?.();\n };\n const close = () => {\n setAnchor(null);\n onHide?.();\n };\n const toggle = () => open ? close() : show();\n const handleKeyDown = (event) => {\n if (disabled) return;\n if (!open && OPEN_KEYS.includes(event.key)) {\n event.preventDefault();\n show();\n return;\n }\n if (open && event.key === \"Escape\") {\n close();\n }\n };\n return /* @__PURE__ */ jsxs(Fragment$1, { children: [\n /* @__PURE__ */ jsx(\n DropdownField,\n {\n ref: fieldRef,\n value,\n placeholder,\n disabled,\n error,\n helperText,\n size,\n open,\n className,\n style,\n id,\n onTriggerClick: disabled ? void 0 : toggle,\n onTriggerKeyDown: handleKeyDown\n }\n ),\n /* @__PURE__ */ jsx(\n PopoverComponent,\n {\n open,\n anchorEl: anchor,\n container: appendTo ?? void 0,\n onClose: close,\n anchorOrigin: { vertical: \"bottom\", horizontal: \"left\" },\n transformOrigin: { vertical: \"top\", horizontal: \"left\" },\n PaperProps: {\n className: panelClassName,\n // Popover only positions and portals. `Dropdown.Menu` is the visual\n // surface, so the Paper's own background and shadow are stripped —\n // otherwise the menu renders as a card inside a card.\n sx: {\n mt: 0.5,\n background: \"transparent\",\n boxShadow: \"none\",\n overflow: \"visible\"\n }\n },\n children: /* @__PURE__ */ jsx(\n DropdownMenu,\n {\n minWidth: triggerWidth,\n maxHeight: 320,\n showFooter: Boolean(footer),\n customFooter: footer?.({ close }),\n slotProps: footer ? { customFooter: { sx: { padding: \"8px\" } } } : void 0,\n children: children({ close })\n }\n )\n }\n )\n ] });\n}\n\nconst optionKey = (index) => String(index);\nfunction indexOfOptionValue(options, optionValue, value) {\n return options.findIndex((option) => Object.is(option[optionValue], value));\n}\nfunction warnOnDuplicateOptionValues(component, options, optionValue) {\n const seen = /* @__PURE__ */ new Set();\n for (const option of options) {\n const value = option[optionValue];\n if (seen.has(value)) {\n return;\n }\n seen.add(value);\n }\n}\nfunction isOptionDisabled(option, optionDisabled) {\n if (!optionDisabled) return false;\n return typeof optionDisabled === \"function\" ? optionDisabled(option) : Boolean(option[optionDisabled]);\n}\n\nconst ListItem$1 = asKitComponent(Dropdown.ListItem);\nconst Select = (props) => {\n const {\n value,\n options = [],\n optionLabel = \"label\",\n optionValue = \"value\",\n placeholder,\n disabled = false,\n invalid = false,\n name,\n id,\n className,\n panelClassName,\n style,\n appendTo,\n onChange,\n onShow,\n onHide,\n itemTemplate,\n valueTemplate,\n optionDisabled,\n panelFooterTemplate,\n helperText\n } = props;\n warnOnDuplicateOptionValues(\"Select\", options, optionValue);\n const selectedIndex = indexOfOptionValue(options, optionValue, value);\n const selectedOption = selectedIndex === -1 ? void 0 : options[selectedIndex];\n const select = (option, event) => {\n if (isOptionDisabled(option, optionDisabled)) return;\n const nextValue = option[optionValue];\n onChange?.({\n originalEvent: event,\n value: nextValue,\n target: { name: name ?? \"\", id: id ?? \"\", value: nextValue }\n });\n };\n const display = valueTemplate ? valueTemplate(selectedOption) : selectedOption ? String(selectedOption[optionLabel] ?? \"\") : void 0;\n return /* @__PURE__ */ jsx(\n DropdownSurface,\n {\n value: display,\n placeholder,\n disabled,\n error: invalid,\n helperText,\n className,\n style,\n id,\n panelClassName,\n appendTo,\n onShow,\n onHide,\n footer: panelFooterTemplate === void 0 || panelFooterTemplate === null ? void 0 : ({ close }) => (\n // A footer row behaves like any other: the same ListItem, and a\n // click anywhere on it closes the panel.\n /* @__PURE__ */ jsx(ListItem$1, { onClick: close, children: typeof panelFooterTemplate === \"function\" ? panelFooterTemplate(props, close) : panelFooterTemplate })\n ),\n children: ({ close }) => options.map((option, index) => /* @__PURE__ */ jsx(\n ListItem$1,\n {\n selected: index === selectedIndex,\n disabled: isOptionDisabled(option, optionDisabled),\n onClick: (event) => {\n select(option, event);\n close();\n },\n children: itemTemplate ? itemTemplate(option) : String(option[optionLabel] ?? \"\")\n },\n optionKey(index)\n ))\n }\n );\n};\n\nconst UNMATCHED_PREFIX = \"?\";\nconst ListItem = asKitComponent(Dropdown.ListItem);\nconst TagComponent = asKitComponent(Tag);\nconst MultiSelect = (props) => {\n const {\n value,\n options = [],\n optionLabel = \"label\",\n optionValue = \"value\",\n display = \"chip\",\n placeholder,\n disabled = false,\n invalid = false,\n name,\n id,\n className,\n panelClassName,\n style,\n appendTo,\n onChange,\n onShow,\n onHide,\n itemTemplate\n } = props;\n warnOnDuplicateOptionValues(\"MultiSelect\", options, optionValue);\n const optionsByKey = new Map(options.map((option, index) => [optionKey(index), option]));\n const unmatchedByKey = /* @__PURE__ */ new Map();\n const selectedKeys = (Array.isArray(value) ? value : []).map((selected, index) => {\n const optionIndex = indexOfOptionValue(options, optionValue, selected);\n if (optionIndex !== -1) {\n return optionKey(optionIndex);\n }\n const key = `${UNMATCHED_PREFIX}${index}`;\n unmatchedByKey.set(key, selected);\n return key;\n });\n const valueForKey = (key) => {\n const option = optionsByKey.get(key);\n return option ? option[optionValue] : unmatchedByKey.get(key);\n };\n const labelFor = (key) => {\n const option = optionsByKey.get(key);\n return String(option ? option[optionLabel] ?? key : valueForKey(key) ?? key);\n };\n const emit = (nextKeys, originalEvent) => {\n const nextValue = nextKeys.map(valueForKey);\n onChange?.({\n originalEvent,\n value: nextValue,\n target: { name: name ?? \"\", id: id ?? \"\", value: nextValue }\n });\n };\n const toggle = (key, event) => {\n const next = selectedKeys.includes(key) ? selectedKeys.filter((selectedKey) => selectedKey !== key) : [...selectedKeys, key];\n emit(next, event);\n };\n const handleRemove = (key) => (event) => {\n event.stopPropagation();\n emit(\n selectedKeys.filter((selectedKey) => selectedKey !== key),\n event\n );\n };\n const summary = selectedKeys.length === 0 ? void 0 : display === \"comma\" ? selectedKeys.map(labelFor).join(\", \") : selectedKeys.map((key) => /* @__PURE__ */ jsx(\n TagComponent,\n {\n size: \"sm\",\n removable: !disabled,\n onRemove: disabled ? void 0 : handleRemove(key),\n children: labelFor(key)\n },\n key\n ));\n return /* @__PURE__ */ jsx(\n DropdownSurface,\n {\n value: summary,\n placeholder,\n disabled,\n error: invalid,\n className,\n style,\n id,\n panelClassName,\n appendTo,\n onShow,\n onHide,\n children: () => options.map((option, index) => {\n const key = optionKey(index);\n const checked = selectedKeys.includes(key);\n return /* @__PURE__ */ jsx(\n ListItem,\n {\n selected: checked,\n startCheckbox: !itemTemplate,\n slotProps: itemTemplate ? void 0 : { startCheckbox: { checked } },\n onClick: (event) => toggle(key, event),\n children: itemTemplate ? itemTemplate(option) : String(option[optionLabel] ?? \"\")\n },\n key\n );\n })\n }\n );\n};\n\nconst TextareaComponent = asKitComponent(Input.TextArea);\nconst Textarea = (props) => {\n const {\n value,\n defaultValue,\n placeholder,\n disabled = false,\n error = false,\n rows = 4,\n autoResize = false,\n maxLength,\n name,\n id,\n required = false,\n autoFocus = false,\n className,\n style,\n onChange,\n onBlur,\n onFocus\n } = props;\n return /* @__PURE__ */ jsx(\n TextareaComponent,\n {\n ...autoResize ? { minRows: rows } : { rows },\n value,\n defaultValue,\n placeholder,\n disabled,\n error,\n name,\n id,\n required,\n autoFocus,\n className,\n style,\n slotProps: maxLength !== void 0 ? { input: { maxLength } } : void 0,\n onChange,\n onBlur,\n onFocus\n }\n );\n};\n\nconst InputText = asKitComponent(Input.Text);\nconst popperPaperSx = {\n pointerEvents: \"auto\",\n width: \"max-content\",\n borderRadius: \"8px\",\n border: \"1px solid\",\n borderColor: \"border.neutral.subtle\",\n boxShadow: \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)\",\n \"& .MuiPickersDay-root\": {\n borderRadius: \"50%\",\n color: \"text.neutral.default\"\n },\n // MUI's default ring is `rgba(0, 0, 0, 0.6)`, a hard near-black against the\n // light grey D-03 draws.\n \"& .MuiPickersDay-today\": {\n borderColor: \"border.neutral.default\"\n },\n \"& .MuiPickersDay-root.Mui-selected\": {\n backgroundColor: \"background.royal.default\",\n color: \"text.inverse\"\n },\n \"& .MuiPickersDay-root.Mui-selected:hover, & .MuiPickersDay-root.Mui-selected:focus\": {\n backgroundColor: \"background.royal.strong\"\n }\n};\nconst popperSx = {\n pointerEvents: \"auto\"\n};\nconst OpenPickerIcon = () => /* @__PURE__ */ jsx(Calendar, { width: 16, height: 16, \"aria-hidden\": \"true\" });\nconst PICKER_COMPONENTS = { OpenPickerIcon };\nconst MIN_TIME = Date.UTC(1900, 0, 1);\nconst MAX_TIME = Date.UTC(2099, 11, 31, 23, 59, 59);\nconst DateField = (props) => {\n const {\n value,\n placeholder,\n disabled = false,\n error = false,\n name,\n id,\n readOnly = false,\n className,\n panelClassName,\n style,\n appendTo,\n onChange,\n onBlur,\n onValidityChange\n } = props;\n const dateValue = typeof value === \"number\" && !Number.isNaN(value) ? new Date(value) : null;\n const handleChange = (next) => {\n if (!next) {\n onChange?.(void 0);\n onValidityChange?.(true);\n return;\n }\n const time = next.valueOf();\n const valid = !Number.isNaN(time) && time >= MIN_TIME && time <= MAX_TIME;\n onChange?.(valid ? time : void 0);\n onValidityChange?.(valid);\n };\n return /* @__PURE__ */ jsx(LocalizationProvider, { dateAdapter: AdapterMoment, children: /* @__PURE__ */ jsx(\n DesktopDatePicker,\n {\n value: dateValue,\n onChange: handleChange,\n disabled,\n readOnly,\n inputFormat: \"DD MMM, YYYY\",\n disableMaskedInput: true,\n components: PICKER_COMPONENTS,\n PopperProps: {\n container: appendTo ?? void 0,\n className: panelClassName,\n sx: popperSx\n },\n PaperProps: { sx: popperPaperSx },\n renderInput: ({ inputRef, InputProps, inputProps, ...params }) => /* @__PURE__ */ jsx(\n InputText,\n {\n ...params,\n inputRef,\n suffix: InputProps?.endAdornment,\n name,\n id,\n error,\n onBlur,\n className,\n style,\n size: \"md\",\n slotProps: {\n // MUI X writes `inputFormat` into the input as its placeholder. The\n // caller's own placeholder is the contract on both variants, so it wins.\n input: { ...inputProps, placeholder: placeholder ?? \"\" }\n }\n }\n )\n }\n ) });\n};\n\nconst CrmSelect = (props) => {\n const {\n mapKey = \"value\",\n errorMessage,\n invalid = false,\n className = \"\",\n onChange,\n options = [],\n ...rest\n } = props;\n const optionsMap = Object.fromEntries(\n options.map((option) => [String(option[mapKey]), option])\n );\n const handleChange = (event) => {\n const option = optionsMap[String(event.value)];\n if (option?.error || option?.disabled) return;\n onChange?.(event);\n };\n const hasError = invalid || className.split(/\\s+/).includes(\"p-invalid\");\n return /* @__PURE__ */ jsx(\n Select,\n {\n ...rest,\n options,\n className: [\"form-dropdown\", \"crm-select-dropdown\", className].filter(Boolean).join(\" \"),\n invalid: hasError,\n helperText: hasError ? errorMessage : void 0,\n onChange: handleChange\n }\n );\n};\n\nconst PaginationComponent = asKitComponent(Pagination$1);\nfunction Pagination(props) {\n const {\n page,\n count,\n rowsPerPage = 10,\n rowsPerPageOptions,\n disabled = false,\n className,\n style,\n onPageChange,\n onRowsPerPageChange\n } = props;\n const handlePageChange = (_event, nextPage) => {\n onPageChange?.({ page: nextPage, first: nextPage * rowsPerPage, rows: rowsPerPage });\n };\n const handleRowsPerPageChange = (event) => {\n const nextRows = parseInt(event.target.value, 10);\n onRowsPerPageChange?.(nextRows);\n onPageChange?.({ page: 0, first: 0, rows: nextRows });\n };\n return /* @__PURE__ */ jsx(\n PaginationComponent,\n {\n component: \"div\",\n count,\n page,\n rowsPerPage,\n rowsPerPageOptions: rowsPerPageOptions ?? [],\n disabled,\n className,\n style,\n onPageChange: handlePageChange,\n onRowsPerPageChange: onRowsPerPageChange ? handleRowsPerPageChange : void 0\n }\n );\n}\n\nconst SideDrawerComponent = asKitComponent(SideDrawer);\nconst SidePanel = (props) => {\n const {\n open,\n children,\n position = \"right\",\n width = 560,\n showOverlay = true,\n closeOnOverlayClick = true,\n className,\n style,\n appendTo,\n onClose\n } = props;\n return /* @__PURE__ */ jsx(\n SideDrawerComponent,\n {\n anchor: position,\n open,\n variant: \"temporary\",\n hideBackdrop: !showOverlay,\n showClose: false,\n className,\n onClose: closeOnOverlayClick ? onClose : void 0,\n PaperProps: { style: { width, ...style } },\n slotProps: { header: { sx: { display: \"none\" } } },\n ModalProps: { container: appendTo ?? void 0 },\n children\n }\n );\n};\n\nconst ToolbarComponent = asKitComponent(Table.Toolbar);\nconst Toolbar = ({\n title,\n badge,\n supportingText,\n actions,\n className,\n style\n}) => /* @__PURE__ */ jsx(\n ToolbarComponent,\n {\n title,\n badge,\n supportingText,\n actions,\n className,\n style\n }\n);\n\nconst SearchComponent = asKitComponent(Input.Search);\nconst Search = ({\n value,\n onChange,\n onClear,\n placeholder = \"Search...\",\n disabled = false,\n size = \"sm\",\n name,\n id,\n className,\n style,\n icon,\n \"aria-label\": ariaLabel = \"Search\"\n}) => (\n /*\n * `className` and `aria-label` both go through `slotProps`, and neither is an\n * arbitrary choice.\n *\n * `Input.Search` wraps MUI's `InputBase`, so a top-level `className` lands on\n * the InputBase ROOT — a `<div>` — and a top-level `aria-label` lands there\n * too. The consequences are not cosmetic: a consumer's width utility never\n * reaches the outer element it was aimed at, and the accessible name is\n * attached to a div rather than to the `<input>`, so assistive technology\n * announces an unlabelled text field. `slotProps.root` is the outer Stack and\n * `slotProps.input` is the native element.\n */\n /* @__PURE__ */ jsx(\n SearchComponent,\n {\n value,\n onChange: (event) => onChange?.(event.target.value),\n onClear,\n placeholder,\n disabled,\n size,\n name,\n id,\n style,\n prefixIcon: icon,\n slotProps: {\n root: { className },\n input: { \"aria-label\": ariaLabel }\n }\n }\n )\n);\n\nexport { Avatar, Breadcrumb, Button, Chip, Column, CrmSelect, DataTable, DateField, Dialog, IconButton, MultiSelect, Pagination, Search, Select, SidePanel, Tab, Tabs, TextField, Textarea, Toast, Toolbar, Typography };\n//# sourceMappingURL=env.hui.js.map\n","import { create } from 'zustand';\nimport type { CustomerModuleCallbacks, CustomerModuleConfig } from '../types';\n\ntype Theme = 'light' | 'dark';\n\ninterface RenderConfigState {\n callbacks: CustomerModuleCallbacks | null;\n config: CustomerModuleConfig | null;\n theme: Theme;\n showEditPrimaryContact: boolean;\n isComposeEnabled?: boolean;\n features?: Record<string, boolean>;\n meta: { rootElement: HTMLElement | null, globalMountElement: HTMLElement | null };\n setFeatures: (features: Record<string, boolean>) => void;\n setCallbacks: (callbacks: CustomerModuleCallbacks | null) => void;\n setConfig: (config: CustomerModuleConfig | null) => void;\n setTheme: (theme: Theme) => void;\n setShowEditPrimaryContact: (show: boolean) => void;\n setIsComposeEnabled: (isComposeEnabled: boolean) => void;\n setMeta: (metaData: Partial<RenderConfigState['meta']>) => void;\n}\n\nexport const useRenderConfigStore = create<RenderConfigState>((set) => ({\n callbacks: null,\n config: null,\n theme: 'light',\n showEditPrimaryContact: true,\n meta: { rootElement: null, globalMountElement: null },\n setCallbacks: (callbacks) => set({ callbacks }),\n // Keep `theme` in sync whenever a config carrying a theme is set.\n setConfig: (config) => set(config?.theme ? { config, theme: config.theme } : { config }),\n setTheme: (theme) => set({ theme }),\n setShowEditPrimaryContact: (show) => set({ showEditPrimaryContact: show }),\n setIsComposeEnabled: (isComposeEnabled: boolean) => set({ isComposeEnabled: isComposeEnabled }),\n // MERGE, don't replace: host surfaces call setCustomerModuleConfig with\n // different-sized feature sets (the CM page passes the full set; the\n // conversation sidebar/drawer pass only their two keys). \n setFeatures: (features) =>\n set((state) => ({ features: { ...state.features, ...features } })),\n setMeta: (metaData) => set(state => ({ meta: { ...state.meta, ...metaData } })),\n}));\n\n","// The hui build's `<Icon name>` sources: the same glob, minus the illustrations.\n//\n// Both library builds set `inlineDynamicImports`, so every file this glob matches\n// is inlined into the artifact as a raw string whether or not anything asks for\n// it. The files excluded here are never looked up by name — each is imported\n// directly by the one component that draws it (as a URL or through svgr), so\n// the glob only ever added a second copy. Together they were ~90 KB of the hui\n// artifact, most of it base64 PNG wrapped in an `<image>` tag.\n//\n// Every `<Icon name>` in src/ is a literal or comes from a literal table\n// (TYPE_ICON, account-insights/constants.ts, RightPanel rows); none resolves to\n// one of these. Adding an illustration here is safe for the same reason; adding\n// an icon is not.\nexport const icons = import.meta.glob(\n [\n '/src/assets/**/*.svg',\n '!/src/assets/no-data.svg',\n '!/src/assets/no-conversation.svg',\n '!/src/assets/hiver-logo.svg',\n '!/src/assets/salesforce.svg',\n '!/src/assets/file.svg',\n '!/src/assets/india-gate.svg',\n '!/src/assets/react.svg',\n ],\n { query: '?raw', import: 'default' }\n);\n","import { useEffect, useState } from 'react';\nimport { useRenderConfigStore } from '@/stores/renderConfig';\nimport type { IconProps } from './types';\nimport { icons } from '@/components/Icon/sources';\n\n\nconst strokeWidths: Record<string, string> = { '14': '1.1', '16': '1.3' };\n\n// Dark-mode remap for the light-slate icon colours hardcoded across callers, so\n// dim icons (#64758B etc.) become legible on the dark theme. Colours outside\n// this map (status oranges/greens/blues, brand colours) pass through unchanged.\nconst DARK_ICON_MAP: Record<string, string> = {\n '#64758b': '#7a7c81',\n '#334155': '#d1d2d5',\n '#475569': '#7a7c81',\n '#94a3b8': '#3d3e41',\n '#0f172a': '#d1d2d5',\n '#1e293b': '#d1d2d5',\n '#276cf0': '#3b6ce8',\n};\n\nconst NEUTRAL_FILL_PATTERN =\n /fill=\"(?:#334155|#64758b|#475569|#94a3b8|#0f172a|#1e293b)\"/gi;\n\nconst Icon: React.FC<IconProps> = ({\n name,\n size = 16,\n type = 'active',\n folder = '',\n disabled = false,\n color,\n fill,\n className,\n onClick,\n}) => {\n const [svgContent, setSvgContent] = useState<string>('');\n const isDark = useRenderConfigStore((state) => state.theme === 'dark');\n\n useEffect(() => {\n const loadIcon = async () => {\n try {\n const basePath = folder\n ? `/src/assets/${folder}/${name}.svg`\n : `/src/assets/${name}.svg`;\n\n const loader = icons[basePath];\n if (!loader) {\n console.error(`[Icon] Icon '${name}' not found at ${basePath}`);\n return;\n }\n\n const raw = (await loader()) as string;\n const sizeStr = String(size);\n const themedColor = color\n ? (isDark ? (DARK_ICON_MAP[color.toLowerCase()] ?? color) : color)\n : `var(--cm-color-slate-icons-${disabled ? 'disabled' : type})`;\n const stroke = themedColor;\n const strokeWidth = strokeWidths[sizeStr] || '1.3';\n\n let processed = raw\n .replace(/stroke=\".*?\"/g, `stroke=\"${stroke}\"`)\n // A few design-system icons (email, ticket) are fill-only. Keep\n // brand and status fills intact while theming the neutral slate\n // palette through the same semantic colour as stroked icons.\n .replace(NEUTRAL_FILL_PATTERN, `fill=\"${themedColor}\"`)\n .replace(/stroke-width=\".*?\"/g, `stroke-width=\"${strokeWidth}\"`)\n .replace(/<svg([^>]*?)>/, (_, attrs: string) => {\n let newAttrs = attrs;\n \n // Update or add width\n if (/width=\".*?\"/.test(newAttrs)) {\n newAttrs = newAttrs.replace(/width=\".*?\"/, `width=\"${sizeStr}\"`);\n } else {\n newAttrs = `${newAttrs} width=\"${sizeStr}\"`;\n }\n \n // Update or add height\n if (/height=\".*?\"/.test(newAttrs)) {\n newAttrs = newAttrs.replace(/height=\".*?\"/, `height=\"${sizeStr}\"`);\n } else {\n newAttrs = `${newAttrs} height=\"${sizeStr}\"`;\n }\n\n return `<svg${newAttrs} style=\"max-width: ${sizeStr}px;\">`;\n });\n\n // Handle fill for rect elements\n if (fill) {\n processed = processed.replace(/<rect([^>]*?)\\/?>/g, (_match, rectAttrs: string) => {\n if (/fill=\"/.test(rectAttrs)) {\n return `<rect${rectAttrs.replace(/fill=\".*?\"/, `fill=\"${fill}\"`)} />`;\n }\n return `<rect${rectAttrs} fill=\"${fill}\" />`;\n });\n }\n\n setSvgContent(processed);\n } catch (error) {\n console.error(`[Icon] Error loading icon '${name}':`, error);\n }\n };\n\n loadIcon();\n }, [name, size, type, disabled, color, fill, folder, isDark]);\n\n return (\n <span\n className={`cm:flex cm:items-center cm:justify-center cm:w-max ${disabled ? 'cm:cursor-not-allowed' : 'cm:cursor-inherit'} ${className || ''}`}\n onClick={onClick}\n dangerouslySetInnerHTML={{ __html: svgContent }}\n />\n );\n};\n\nexport default Icon;\n","// Generate a deterministic hash from a string\nexport const generateStringHash = (str: string): number => {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n return hash;\n};\n\n// Avatar palette — mirrors outlook-ui exactly (AvatarNew.vue `avatar.*` tokens),\n// same colours AND same order, so an identical hash maps to the identical colour.\n// Order: green, lightblue, purple, slate, violet, red, orange, yellow.\n// Light = pastel* / slate.400; dark = charcoalAvatar.* (from the design system).\nexport const colorOptions = [\n '#52B39E', // green (pastelgreen.500)\n '#5398CF', // lightblue (pastellightblue.500)\n '#8789C5', // purple (pastelpurple.500)\n '#94A3B8', // slate (slate.400)\n '#AC80B7', // violet (pastelviolet.700)\n '#D04B4F', // red (pastelred.500)\n '#E3692C', // orange (pastelorange.500)\n '#E3CB2D', // yellow (pastelyellow.500)\n];\n\nexport const darkColorOptions = [\n '#307052', // green (charcoalAvatar.green)\n '#2F6696', // lightblue (charcoalAvatar.lightblue)\n '#735385', // purple (charcoalAvatar.purple)\n '#697E9B', // slate (charcoalAvatar.slate)\n '#464995', // violet (charcoalAvatar.violet)\n '#A44A46', // red (charcoalAvatar.red)\n '#98562F', // orange (charcoalAvatar.orange)\n '#8F6924', // yellow (charcoalAvatar.yellow)\n];\n\nexport const avatarColorKeys = [\n 'green',\n 'lightblue',\n 'purple',\n 'slate',\n 'violet',\n 'red',\n 'orange',\n 'yellow',\n] as const;\n\nexport type AvatarColorKey = (typeof avatarColorKeys)[number];\n\nexport const getColorKeyForLabel = (\n label: string | undefined,\n): AvatarColorKey => {\n if (!label) return 'lightblue';\n\n const hash = generateStringHash(label);\n return avatarColorKeys[Math.abs(hash) % avatarColorKeys.length];\n};\n\n// Generate a deterministic color for a label\nexport const getColorForLabel = (\n label: string | undefined,\n isDark = false,\n): string => {\n const palette = isDark ? darkColorOptions : colorOptions;\n const index = avatarColorKeys.indexOf(getColorKeyForLabel(label));\n return palette[index];\n};\n\n// Size configuration\nexport const sizeConfig = {\n small: {\n size: \"cm:w-3.5 cm:h-3.5\", // 14x14\n text: \"cm:text-[8px]\",\n leading: \"cm:leading-[12px]\",\n },\n default: {\n size: \"cm:w-4 cm:h-4\", // 16x16\n text: \"cm:text-[9px]\",\n leading: \"cm:leading-[13.5px]\",\n },\n large: {\n size: \"cm:w-7 cm:h-7\", // 28x18\n text: \"cm:text-sm\",\n leading: \"cm:leading-7\",\n },\n medium: {\n size: \"cm:w-6 cm:h-6\", // 24x24\n text: \"cm:text-sm\",\n leading: \"cm:leading-6\",\n },\n};\n\n/**\n * The same eight buckets on the HiG design system's accent families, so a\n * person keeps their colour across both builds. v2 has no yellow or slate\n * monogram family; lime and cyan are the nearest unused hues.\n */\nexport const v2AvatarColors = {\n green: 'green',\n lightblue: 'blue',\n purple: 'violet',\n slate: 'cyan',\n violet: 'fuchsia',\n red: 'red',\n orange: 'orange',\n yellow: 'lime',\n} as const satisfies Record<AvatarColorKey, string>;\n\n// Remove emojis from string\nconst removeEmoji = (str: string): string => {\n return str.replace(/[\\u{1F600}-\\u{1F64F}\\u{1F300}-\\u{1F5FF}\\u{1F680}-\\u{1F6FF}\\u{1F1E0}-\\u{1F1FF}\\u{2600}-\\u{26FF}\\u{2700}-\\u{27BF}]/gu, '');\n};\n\n/** The monogram: first letter of each word, A–Z only, `@` when there is none. */\nexport const getAvatarInitials = (nameToUse: string | undefined, letterCount = 1): string => {\n if (!nameToUse || typeof nameToUse !== 'string') return '@';\n\n const nameWithoutEmoji = removeEmoji(nameToUse);\n\n return (\n nameWithoutEmoji\n .split(/[ -]/)\n .map(part => part.charAt(0).toUpperCase())\n .join('')\n .replace(/[^A-Z]/g, '')\n .substring(0, letterCount) || '@'\n );\n};\n","import React, { useMemo } from 'react';\nimport { getAvatarInitials, getColorForLabel, getColorKeyForLabel, sizeConfig } from './constants';\n\nexport interface AvatarProps {\n name: string;\n size?: 'small' | 'default' | 'medium' | 'large';\n className?: string;\n color?: string;\n labelName?: string;\n letterCount?: number;\n}\n\nconst Avatar: React.FC<AvatarProps> = ({ \n name, \n size = 'default', \n className, \n color, \n labelName,\n letterCount = 1 \n}) => {\n const label = useMemo(\n () => getAvatarInitials(labelName || name, letterCount),\n [name, labelName, letterCount],\n );\n\n const colorLabel = labelName || name;\n const colorKey = useMemo(\n () => color ? null : getColorKeyForLabel(colorLabel),\n [color, colorLabel],\n );\n\n const assignedColor = useMemo(() =>\n color ? color : getColorForLabel(colorLabel),\n [color, colorLabel]);\n\n const sizeStyles = sizeConfig[size];\n \n return (\n <div\n className={`cm-avatar ${colorKey ? `cm-avatar--${colorKey}` : ''} cm:flex cm:items-center cm:justify-center cm:rounded-full ${sizeStyles.size} cm:shrink-0 ${className || ''}`}\n style={{ backgroundColor: assignedColor }}\n >\n <p className={`cm:font-medium ${sizeStyles.leading} ${sizeStyles.text} cm:text-white cm:text-center cm:whitespace-nowrap`}>\n {label}\n </p>\n </div>\n );\n};\n\nexport default Avatar;\n","import React, { useState, useRef, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useRenderConfigStore } from '@/stores/renderConfig';\n\nimport type { ReactNode } from 'react';\n\ninterface TooltipProps {\n /** The content to show in the tooltip */\n content: ReactNode;\n /** The element that triggers the tooltip on hover */\n children: React.ReactElement;\n /** Optional custom className for the tooltip trigger */\n triggerClassName?: string;\n /** Optional custom className for the tooltip */\n tooltipClassName?: string;\n /** Optional z-index for the tooltip */\n zIndex?: number;\n /** Optional offset from the trigger element (in pixels) */\n offset?: number;\n offsetX?: number;\n positionX?: 'center' | 'left' | 'right'\n}\n\n/**\n * Reusable Tooltip component that positions itself relative to a trigger element.\n * Shows on hover and handles viewport edge detection.\n */\nconst Tooltip: React.FC<TooltipProps> = ({\n content,\n children,\n triggerClassName = 'cm:flex cm:min-w-0 cm:max-w-full',\n tooltipClassName = '',\n zIndex = 9999,\n offset = 8,\n offsetX = 0,\n positionX = 'center'\n}) => {\n const [isHovered, setIsHovered] = useState(false);\n const triggerRef = useRef<HTMLDivElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const timeoutIdRef = useRef<ReturnType<typeof setTimeout>>();\n const globalMountElement = useRenderConfigStore((state) => state.meta.globalMountElement);\n\n // Position tooltip relative to the trigger element\n useEffect(() => {\n if (isHovered && triggerRef.current && tooltipRef.current) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n const leftOffset = positionX === 'center' ? (triggerRect.width / 2) : positionX === 'right' ? triggerRect.width : offsetX;\n const tooltipOffset = positionX === 'center' ? (tooltipRect.width / 2) : positionX === 'right' ? tooltipRect.width : 0;\n let left = triggerRect.left + leftOffset - tooltipOffset;\n\n // Ensure tooltip doesn't go off-screen horizontally\n if (left < offset) {\n left = offset; // padding from left edge\n } else if (left + tooltipRect.width > viewportWidth - offset) {\n left = viewportWidth - tooltipRect.width - offset; // padding from right edge\n }\n\n // Calculate vertical position (above trigger by default, closer to trigger)\n let top = triggerRect.top - tooltipRect.height - 4; // Reduced offset for closer positioning\n\n // If tooltip would go off top of screen, show below instead\n if (top < offset) {\n top = triggerRect.bottom + 4; // Reduced offset for closer positioning\n // If it would go off bottom too, position it at the top with offset\n if (top + tooltipRect.height > viewportHeight - offset) {\n top = offset;\n }\n }\n\n tooltipRef.current.style.top = `${top}px`;\n tooltipRef.current.style.left = `${left}px`;\n }\n }, [isHovered, content, offset, positionX, offsetX]);\n \n \n useEffect(() => { \n return () => clearTimeout(timeoutIdRef.current);\n }, [])\n \n const onMouseEnter = () => {\n timeoutIdRef.current = setTimeout(() => { \n setIsHovered(true);\n }, 400)\n }\n \n const onMouseLeave = () => {\n clearTimeout(timeoutIdRef.current);\n setIsHovered(false);\n }\n\n return (\n <>\n <div\n ref={triggerRef}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n // Keyboard parity: a focusable child (e.g. a disabled-looking button whose tooltip is the\n // only explanation of why it is inert) would otherwise never surface its tooltip for a\n // keyboard user. Focus events bubble from the child to this wrapper, so no child changes.\n onFocus={onMouseEnter}\n onBlur={onMouseLeave}\n className={triggerClassName}\n >\n {children}\n </div>\n {isHovered && content && !!globalMountElement && createPortal(\n <div\n ref={tooltipRef}\n className={`cm-tooltip cm:fixed cm:font-medium cm:px-2 cm:py-1 cm:text-xs cm:rounded-md ${tooltipClassName}`}\n style={{ pointerEvents: 'none', zIndex }}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n <span className=\"cm-tooltip-content\">{content}</span>\n </div>,\n globalMountElement\n )}\n </>\n );\n};\nexport default Tooltip;\n","import React, { useState, useEffect, useCallback, useMemo } from 'react';\nimport Tooltip from '../Tooltip';\n\ninterface TruncatedTextProps {\n /** The text content to display */\n text: string;\n /** Additional CSS classes to apply */\n className?: string;\n /** Optional custom tooltip className */\n tooltipClassName?: string;\n /** Optional z-index for the tooltip */\n zIndex?: number;\n /** Optional inline style */\n style?: React.CSSProperties;\n /** Children can be used to pass custom element instead of default span */\n children?: React.ReactElement;\n}\n\n/**\n * TruncatedText component that automatically shows a tooltip with full content\n * only when the text is actually truncated.\n */\nconst TruncatedText: React.FC<TruncatedTextProps> = ({\n text,\n className = '',\n tooltipClassName = '',\n zIndex,\n style,\n children,\n}) => {\n const [isTruncated, setIsTruncated] = useState(false);\n const [tooltipText, setTooltipText] = useState(text);\n const containerRef = React.useRef<HTMLElement | null>(null);\n\n const checkTruncation = useCallback(() => {\n if (containerRef.current) {\n // Find the actual text element that might be truncated\n let checkElement: HTMLElement | null = null;\n \n // Check if container itself has truncate class\n const containerHasTruncate = containerRef.current.classList.contains('truncate') || \n containerRef.current.className.includes('truncate');\n \n if (containerHasTruncate) {\n checkElement = containerRef.current;\n } else {\n // Otherwise, try to find an element with truncate class inside\n const truncateElement = containerRef.current.querySelector('[class*=\"truncate\"]') as HTMLElement;\n if (truncateElement) {\n checkElement = truncateElement;\n } else if (containerRef.current.firstElementChild) {\n // Fallback to first child\n checkElement = containerRef.current.firstElementChild as HTMLElement;\n } else {\n // Last resort: use container itself\n checkElement = containerRef.current;\n }\n }\n \n if (checkElement) {\n // Check if text is truncated by comparing scrollWidth to clientWidth\n // Defer state update to avoid synchronous setState\n requestAnimationFrame(() => {\n if (checkElement) {\n const truncated = checkElement.scrollWidth > checkElement.clientWidth;\n setIsTruncated(truncated);\n // Update tooltip text from actual rendered content\n if (truncated) {\n const actualText = checkElement.textContent || checkElement.innerText || text;\n setTooltipText(actualText);\n } else {\n // Reset tooltip text if not truncated\n setTooltipText(text);\n }\n }\n });\n }\n }\n }, [text]);\n\n useEffect(() => {\n // Update tooltip text when text prop changes (defer to avoid synchronous setState)\n requestAnimationFrame(() => {\n setTooltipText(text);\n });\n \n // Defer initial check to avoid synchronous setState in effect\n const timeoutId = setTimeout(() => {\n checkTruncation();\n }, 0);\n\n // Recheck on window resize\n window.addEventListener('resize', checkTruncation);\n \n return () => {\n clearTimeout(timeoutId);\n window.removeEventListener('resize', checkTruncation);\n };\n }, [text, checkTruncation]);\n\n // Use callback ref to handle both div and span cases\n const setRef = useCallback((node: HTMLElement | null) => {\n containerRef.current = node;\n }, []);\n\n // If children are provided, wrap in container; otherwise use default span\n const element = useMemo(() => {\n if (children) {\n return (\n <div ref={setRef as React.Ref<HTMLDivElement>} className=\"cm:flex cm:min-w-0 cm:max-w-full\">\n {React.cloneElement(children, {\n ...children.props,\n className: `${children.props?.className || ''} ${className}`.trim(),\n style: { ...children.props?.style, ...style },\n })}\n </div>\n );\n }\n // Check if className already has truncate - if so, ensure it can truncate properly\n const hasTruncate = className.includes('truncate');\n // For truncate to work:\n // 1. Element needs to be block or inline-block (not inline) - truncate requires this\n // 2. Element needs min-w-0 to shrink below content size in flex containers\n // 3. Element needs max-w-full to be constrained by parent\n const hasBlockDisplay = className.includes('block') || className.includes('inline-block');\n \n let displayClass = '';\n if (hasTruncate) {\n // Ensure element is block-level for truncate to work\n if (!hasBlockDisplay) {\n displayClass = 'cm:inline-block';\n }\n // Add min-w-0 to allow shrinking in flex containers and max-w-full to be constrained\n displayClass += ' cm:min-w-0 cm:max-w-full';\n }\n const finalClassName = displayClass ? `${className} ${displayClass}`.trim() : className;\n \n return (\n <span ref={setRef as React.Ref<HTMLSpanElement>} className={finalClassName} style={style}>\n {text}\n </span>\n );\n }, [children, className, style, text, setRef]);\n\n // Only show tooltip if text is truncated\n if (isTruncated) {\n return (\n <Tooltip\n content={<span className=\"cm:text-white cm:text-sm cm:font-normal cm:leading-5 cm:whitespace-nowrap\">{tooltipText}</span>}\n tooltipClassName={tooltipClassName}\n zIndex={zIndex}\n >\n {element}\n </Tooltip>\n );\n }\n\n return <>{element}</>;\n};\n\nexport default TruncatedText;\n\n","export const cn = (...classes: (string | undefined | false)[]) => {\n const classList = classes.flatMap( classNames => classNames? classNames.trim().split(/\\s+/) : [] )\n return classList.filter(className => !!className).join(' ');\n}","import type { CSSProperties } from \"react\";\n\nimport { cn } from \"@/utils/classNames\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\n\n/**\n * The handful of icons this codebase draws from primeicons' font rather than\n * from `src/assets/`.\n *\n * WHY THIS EXISTS: primeicons ships as a webfont inside the *primereact* theme\n * stylesheet. The hui build aliases its design-system stylesheet to\n * `src/theme/design-system.hui.css` (empty on purpose — hui styles via\n * CSS-in-JS), so the hui artifact carries zero `.pi-` rules while the root\n * artifact carries 317. A bare `<i className=\"pi pi-check\" />` therefore renders\n * a blank box on every hui screen — silently, since a missing glyph throws\n * nothing.\n *\n * So the glyph is chosen per build: primeicons on prime, an inline SVG on hui.\n *\n * The prime branch reproduces the previous markup EXACTLY — same element, same\n * class string, same order (`cn` neither reorders nor dedupes) — so the root\n * artifact Omni consumes renders identically to before this component existed.\n * Keep it that way: this is a hui-only repair, not a redesign of prime's icons.\n *\n * `size` is ignored by the prime branch, which sizes its glyph from `font-size`\n * the way primeicons expects (the callers' `cm:text-sm` / `cm:text-xs`). An SVG\n * has no such behaviour, so the hui branch needs the pixel box stated outright.\n * Pass a `size` that matches whatever font-size utility `className` carries.\n *\n * Colour is NOT a prop: every glyph paints with `currentColor`, so the callers'\n * existing text-colour utilities keep working across both branches unchanged.\n *\n * The SVG paths are inline rather than imported from `src/assets/` on purpose.\n * Asset imports are module-level and this module is retained by BOTH builds\n * (prime needs the `pi` branch), so an import would put the asset in front of\n * prime's tree-shaker for no reason. Inline JSX inside the dead `IS_HUI` branch\n * is removed outright.\n *\n * Every Tailwind utility used here is already used elsewhere under `src/`\n * (`cm:animate-spin` — see `Loader` and the import-csv trigger). That matters:\n * Tailwind v4 scans SOURCE text, not the built bundle, so a utility whose only\n * user is hui-only code is still emitted into PRIME's stylesheet. Do not\n * introduce a novel one here; scope it in an inline <style> the way `SideNav`\n * does if one is ever genuinely needed.\n *\n * COVERED: the spinner, the info circle, the check, and the disclosure\n * chevrons used by the detail view's \"Additional details\" section. That last\n * pair was missed when this component was introduced and rendered a blank box\n * on hui — the section looked headerless and un-collapsible, with no clue it\n * could be toggled.\n *\n * NOT COVERED — `src/components/DateField`'s `icon=\"pi pi-calendar\"`. That is a\n * prop handed to `primereact/calendar`, which renders the trigger button\n * itself, so it cannot be branched from out here. DateField is one of the five\n * wrappers that still import primereact directly in BOTH builds; its calendar\n * glyph is fixed when those are repointed at the toolkit (AF-2), not before.\n */\n\nexport type GlyphName =\n | \"spinner\"\n | \"info-circle\"\n | \"check\"\n | \"chevron-down\"\n | \"chevron-right\";\n\n/** primeicons class per glyph — the root artifact's rendering, unchanged. */\nconst PRIME_CLASS: Record<GlyphName, string> = {\n spinner: \"pi pi-spin pi-spinner\",\n \"info-circle\": \"pi pi-info-circle\",\n check: \"pi pi-check\",\n \"chevron-down\": \"pi pi-chevron-down\",\n \"chevron-right\": \"pi pi-chevron-right\",\n};\n\ntype GlyphProps = {\n name: GlyphName;\n /**\n * Pixel box for the hui SVG. Ignored on prime, which sizes from font-size.\n * Defaults to 16 — primeicons' own default, i.e. `1rem` at the base scale.\n */\n size?: number;\n className?: string;\n /**\n * Passed straight through to BOTH branches, so a caller that sized its\n * original `<i>` with an inline `font-size` keeps prime's markup exactly as\n * it was. Inert on the hui SVG, which takes its box from `size` — pass both\n * and keep them in step.\n */\n style?: CSSProperties;\n};\n\nexport const Glyph = ({ name, size = 16, className, style }: GlyphProps) => {\n if (!IS_HUI) {\n return <i className={cn(PRIME_CLASS[name], className)} style={style} />;\n }\n\n const common = {\n width: size,\n height: size,\n viewBox: \"0 0 16 16\",\n fill: \"none\" as const,\n \"aria-hidden\": true,\n focusable: false as const,\n };\n\n if (name === \"spinner\") {\n return (\n <svg {...common} className={cn(\"cm:animate-spin\", className)} style={style}>\n {/* Open arc, so the rotation stays visible. Matches the spinner\n already drawn inline by the import-csv trigger's badge. */}\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n stroke=\"currentColor\"\n strokeOpacity=\"0.25\"\n strokeWidth=\"1.6\"\n />\n <path\n d=\"M14 8A6 6 0 0 0 8 2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n }\n\n if (name === \"info-circle\") {\n return (\n <svg {...common} className={className} style={style}>\n <circle cx=\"8\" cy=\"8\" r=\"6.2\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <path\n d=\"M8 7.4v3.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"8\" cy=\"5.2\" r=\"0.85\" fill=\"currentColor\" />\n </svg>\n );\n }\n\n if (name === \"check\") {\n return (\n <svg {...common} className={className} style={style}>\n <path\n d=\"M3.2 8.4 6.4 11.6 12.8 5.2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n }\n\n // The two chevrons are one path rotated, so they share it rather than\n // carrying a near-duplicate `d`. primeicons draws its chevrons at roughly\n // this weight, which is what keeps the prime and hui branches reading the\n // same at the 12px the disclosure callers use.\n return (\n <svg\n {...common}\n className={className}\n style={\n name === \"chevron-down\"\n ? { ...style, transform: \"rotate(90deg)\" }\n : style\n }\n >\n <path\n d=\"M6 3.5 10.5 8 6 12.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default Glyph;\n","import Cookies from 'universal-cookie';\n\n// Cookie storage keys\nconst COOKIES_STORAGE = {\n HOT_SESSION: 'hot_d_session_info',\n SESSION: 'session',\n} as const;\n\n// Check if we're in production\nconst IS_PROD = true;\n\n// Default cookie options\nconst defaultOptions = {\n path: '/',\n secure: Boolean(IS_PROD), // Ensures the cookie is only sent over secure HTTPS connections\n};\n\nconst appCookies = new Cookies();\n\nconst getAuthCookies = () => appCookies.get(COOKIES_STORAGE.HOT_SESSION);\n\nconst getSessionCookies = () => appCookies.get(COOKIES_STORAGE.SESSION);\n\nexport {\n getAuthCookies,\n getSessionCookies,\n defaultOptions,\n};\n","/**\n * Three-tier conversation field normaliser.\n *\n * The HiG proxy rewrites `GET /v1/{contacts,companies}/:id/conversations` onto\n * the older `/v1/conversations/{contact|company}/:id/conversation` router,\n * which returns a strict subset of the fields the CRM Page renders. The tiers\n * encode what may be invented and what may not:\n *\n * - **Tier 1** — a type-legal fallback exists, so fill it in silently. Warning\n * on these would bury the tier-3 signal in noise.\n * - **Tier 2** — optional, feature-gated, and absent is meaningful. Never\n * synthesised: `null` here would claim the backend answered when it did not.\n * - **Tier 3** — load-bearing and unfaked. One structured warning per missing\n * field, then the row renders degraded. `has_access` is deliberately not\n * defaulted in either direction: guessing `true` leaks a conversation\n * preview, guessing `false` hides one the agent owns.\n *\n * Warnings name the field and the route and nothing else — never a body or a\n * payload fragment (TC-SEC-05). The proxy holds the same line server-side.\n */\n\n/** Silent fallbacks — a type-legal default exists. */\nconst TIER_1_FALLBACKS = {\n message_preview: (row: ConversationRow) => row.message_preview ?? null,\n created_at: (row: ConversationRow) => row.created_at ?? row.timestamp ?? null,\n sm_details: (row: ConversationRow) => row.sm_details ?? [],\n} as const;\n\n/** Optional and feature-gated — left absent rather than invented. */\nexport const TIER_2_OPTIONAL_FIELDS = ['inbox_type', 'space_id', 'issue_type', 'voice'] as const;\n\n/**\n * Load-bearing fields that must be warned about when missing.\n *\n * `channel_type` is company-only: `ContactConversation` has never carried it,\n * so demanding it on the contact route would warn on every full payload.\n *\n * `contact` is company-only for the same reason (`ContactConversation` never\n * carries it either) and belongs in tier 3, not tier 1 or tier 2: a\n * synthesised `{name, email}` (tier 1) would put fabricated identity in the\n * UI, and it is load-bearing rather than optional or feature-gated (tier 2).\n * Tier 3 warns with field + route + path and nothing else — exactly the\n * mechanism D-CM-02 relies on to turn these warnings into the N1 diff.\n */\nconst TIER_3_REQUIRED_FIELDS = ['inbox_conversation_id', 'has_access', 'channel'] as const;\nconst TIER_3_COMPANY_ONLY_FIELDS = ['channel_type', 'contact'] as const;\n\nexport type ConversationRow = Record<string, unknown> & {\n message_preview?: string | null;\n created_at?: string | null;\n timestamp?: string | null;\n sm_details?: unknown[];\n};\n\n/** Which conversations route produced the rows — it decides the tier-3 set. */\nexport type ConversationRoute = 'contact' | 'company';\n\nconst requiredFieldsFor = (route: ConversationRoute): readonly string[] =>\n route === 'company'\n ? [...TIER_3_REQUIRED_FIELDS, ...TIER_3_COMPANY_ONLY_FIELDS]\n : TIER_3_REQUIRED_FIELDS;\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\n/**\n * Normalises one conversation row in place-free fashion.\n *\n * Non-object rows are returned untouched — a malformed row is the upstream's\n * problem to report, not this function's to reshape.\n */\nexport const normaliseConversationRow = (\n row: unknown,\n route: ConversationRoute,\n path: string\n): unknown => {\n if (!isPlainObject(row)) return row;\n\n for (const field of requiredFieldsFor(route)) {\n if (!(field in row)) {\n console.warn('[customer-module] conversation field missing', {\n field,\n route: path,\n tier: 3,\n });\n }\n }\n\n const normalised: Record<string, unknown> = { ...row };\n for (const [field, resolve] of Object.entries(TIER_1_FALLBACKS)) {\n normalised[field] = resolve(row as ConversationRow);\n }\n // Tier 2 is untouched by construction: nothing above writes those keys, so a\n // field the payload omitted stays omitted.\n return normalised;\n};\n\n/** Normalises every row of a conversations page. */\nexport const normaliseConversationRows = (\n rows: unknown,\n route: ConversationRoute,\n path: string\n): unknown => {\n if (!Array.isArray(rows)) return rows;\n return rows.map((row) => normaliseConversationRow(row, route, path));\n};\n","/**\n * Platform-keyed response-envelope normaliser.\n *\n * On HIVERWEB the `customer-module` API answers every route with\n * `standard_json_response` — `{ status, message, data }`. On GMAIL the tenant\n * is resolved from the (deliberately absent) `x-hiver-tenant` header, so\n * `Tenant.from_header` falls back to GMAIL and two route families answer with a\n * bare page body instead. This module carries the allow-list of those routes\n * and the mapping each one needs, so the rest of the library keeps seeing one\n * response shape.\n *\n * The allow-list is the whole safety story: Groups C, D, E and F are immune by\n * construction — they are simply not in it — and a wrong entry is silent, since\n * a transposed A/B mapping still renders a page, just one that paginates\n * wrongly. `classification.test.ts` is what keeps it honest.\n */\n\nimport { normaliseConversationRows } from './conversation';\n\n/**\n * - `A` — bare page body that must be wrapped **and** key-renamed.\n * - `B` — bare page body that must be wrapped, keys left alone.\n * - `C` — already `standard_json_response` on every path; wrapping double-wraps.\n * - `D` — enveloped and outside the CRM Page's list surfaces.\n * - `E` — account settings; enveloped.\n * - `F` — non-JSON body (CSV download); never touched.\n */\nexport type EnvelopeGroup = 'A' | 'B' | 'C' | 'D' | 'E' | 'F';\n\n/**\n * Every path the `customer-module` axios instance can issue, mapped to exactly\n * one group. Keys are the path templates as the library writes them —\n * `:param` segments are matched positionally at runtime.\n *\n * Verified against the live contract rather than PRD §6, which is wrong about\n * three Group C members: `/summary`, `/activity` and `PUT /v1/contacts/:id`\n * already return `standard_json_response` on every code path.\n *\n * The four `/api/v1/config|entity/*` custom-fields paths are deliberately\n * absent: they are reached through `cfApiCallback`, never through this\n * instance, so they have no group here.\n */\nexport const ENDPOINT_GROUPS: Record<string, EnvelopeGroup> = {\n // Group A — wrap + rename. The only two routes whose query params the HiG\n // proxy forwards wholesale.\n '/v1/contacts': 'A',\n '/v1/companies': 'A',\n\n // Group B — wrap only. Explicit proxy routes that rewrite onto the older\n // `/v1/conversations/{contact|company}/:id/conversation` router, which is\n // also why their rows arrive as subsets (see `utils/conversation.ts`).\n '/v1/contacts/:contact_id/conversations': 'B',\n '/v1/companies/:company_id/conversations': 'B',\n\n // Group C — already enveloped on every code path.\n '/v1/contacts/:entity_id': 'C',\n '/v1/companies/:entity_id': 'C',\n '/v1/contacts/:contact_id/summary': 'C',\n '/v1/companies/:company_id/summary': 'C',\n '/v1/contacts/:contact_id/activity': 'C',\n '/v1/contacts/search-by-custom-fields': 'C',\n '/v1/companies/search-by-custom-fields': 'C',\n '/v1/conversations/:conversation_id/primary-contact': 'C',\n\n // Group D — enveloped, and outside the CRM Page list surfaces entirely.\n '/v1/search': 'D',\n '/v1/preferences/view': 'D',\n '/v1/import/presigned-upload': 'D',\n '/v1/import/jobs': 'D',\n '/v1/import/jobs/:job_id/validate': 'D',\n '/v1/import/jobs/:job_id/commit': 'D',\n '/v1/import/jobs/:job_id/failure-file': 'D',\n '/v1/crm/configs/:crmType/mappings/:entityType': 'D',\n '/v1/accounts/:company_id/insights': 'D',\n '/v1/accounts/:company_id/insights/health/feedback': 'D',\n '/v1/accounts/:company_id/insights/:type/contributors': 'D',\n\n // Group E — account settings.\n '/v1/account-settings/excluded-domains': 'E',\n\n // Group F — a CSV download, not JSON. Immune on the content-type guard too.\n '/v1/import/sample-csv': 'F',\n};\n\n/** The list key each Group A path renames `results` to. */\nconst GROUP_A_COLLECTION_KEY: Record<string, string> = {\n '/v1/contacts': 'contacts',\n '/v1/companies': 'companies',\n};\n\nconst isTemplateSegment = (segment: string) => segment.startsWith(':');\n\n/** Strips the query string and any trailing slash, then splits into segments. */\nconst toSegments = (path: string): string[] =>\n path.split(/[?#]/)[0].replace(/\\/+$/, '').split('/');\n\nconst matchesTemplate = (template: string, path: string): boolean => {\n const templateSegments = toSegments(template);\n const pathSegments = toSegments(path);\n if (templateSegments.length !== pathSegments.length) return false;\n return templateSegments.every(\n (segment, index) => isTemplateSegment(segment) || segment === pathSegments[index]\n );\n};\n\n/** How many segments of a template are literal rather than `:param`. */\nconst specificity = (template: string) =>\n toSegments(template).filter((segment) => !isTemplateSegment(segment)).length;\n\n/**\n * The templates a concrete path matches, keeping only the most specific ones.\n *\n * `/v1/contacts/search-by-custom-fields` matches both its own literal entry and\n * `/v1/contacts/:entity_id`; the literal wins, as it does in any router. What\n * survives the tie-break is genuine ambiguity — two entries equally specific —\n * and `classification.test.ts` fails the build on that rather than letting\n * object key order decide silently.\n */\nexport const matchingTemplates = (path: string): string[] => {\n const matches = Object.keys(ENDPOINT_GROUPS).filter((template) =>\n matchesTemplate(template, path)\n );\n if (matches.length < 2) return matches;\n const mostSpecific = Math.max(...matches.map(specificity));\n return matches.filter((template) => specificity(template) === mostSpecific);\n};\n\n/** The group a concrete request path belongs to, or `null` if unclassified. */\nexport const classifyPath = (path: string): EnvelopeGroup | null => {\n const matches = matchingTemplates(path);\n if (matches.length !== 1) return null;\n return ENDPOINT_GROUPS[matches[0]];\n};\n\n/** The `results` → collection key rename a Group A path needs. */\nexport const groupACollectionKey = (path: string): string | null => {\n const template = matchingTemplates(path).find((match) => ENDPOINT_GROUPS[match] === 'A');\n return template ? GROUP_A_COLLECTION_KEY[template] ?? null : null;\n};\n\n/** The `{ status, message, data }` shape every consumer in this library expects. */\nexport interface StandardEnvelope<T = unknown> {\n status: string;\n message: string | null;\n data: T;\n}\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\n/** Already `standard_json_response` — wrapping again would double-wrap. */\nexport const isEnveloped = (body: unknown): boolean =>\n isPlainObject(body) && 'status' in body && 'data' in body;\n\n/** The bare page shape both Group A and Group B arrive as on GMAIL. */\nconst isBarePage = (body: unknown): body is Record<string, unknown> =>\n isPlainObject(body) && 'results' in body;\n\nconst wrap = <T>(data: T): StandardEnvelope<T> => ({\n status: 'success',\n message: null,\n data,\n});\n\n/**\n * Group A: wrap and rename. `results` becomes the collection key the path\n * implies, the pagination keys take their `standard_json_response` names, and\n * every other top-level key is carried through untouched — `at_risk_count`\n * rides along on `/v1/companies`, and the next rollup will too.\n */\nconst mapGroupA = (body: Record<string, unknown>, collectionKey: string): StandardEnvelope => {\n const { results, total_results, page_number, ...rest } = body;\n return wrap({\n [collectionKey]: results,\n total: total_results,\n page: page_number,\n ...rest,\n });\n};\n\n/**\n * The designed early-warning signal for an upstream envelope change: an\n * allow-listed path answered with a shape that is neither the legacy page nor\n * `standard_json_response`. Names the path and the status, never the body.\n */\nconst warnFallthrough = (path: string, group: EnvelopeGroup, status: number) => {\n console.warn('[customer-module] envelope normaliser fell through', {\n route: path,\n group,\n status,\n });\n};\n\nexport interface NormaliseArgs {\n path: string;\n method: string;\n status: number;\n contentType?: string;\n body: unknown;\n}\n\nconst isJsonContentType = (contentType?: string) => {\n if (!contentType) return true; // no header to disprove it; the body guards decide\n return /\\bjson\\b/i.test(contentType);\n};\n\n/**\n * Applies the group mapping for `path`, in the guard order the contract fixes:\n *\n * ```\n * content-type not JSON → passthrough # Group F\n * path ∉ ALLOW_LIST (A|B) → passthrough # C, D, E immune by construction\n * 'status' in body && 'data' → passthrough # already enveloped\n * else → apply the group mapping\n * ```\n *\n * The platform guard sits one level up, in the response interceptor, so this\n * function is never reached for a HIVERWEB response.\n */\nexport const normaliseBody = ({ path, method, status, contentType, body }: NormaliseArgs): unknown => {\n if (!isJsonContentType(contentType)) return body;\n\n const group = classifyPath(path);\n if (group !== 'A' && group !== 'B') return body;\n\n // A and B are GET-only contracts. `POST /v1/contacts` shares Group A's path\n // but returns `standard_json_response`; the envelope guard below would catch\n // it anyway, and this makes that non-accidental.\n if (method.toUpperCase() !== 'GET') return body;\n\n if (isEnveloped(body)) return body;\n\n if (!isBarePage(body)) {\n warnFallthrough(path, group, status);\n return body;\n }\n\n if (group === 'B') {\n return wrap({\n ...body,\n results: normaliseConversationRows(\n body.results,\n path.includes('/companies/') ? 'company' : 'contact',\n path\n ),\n });\n }\n\n const collectionKey = groupACollectionKey(path);\n if (!collectionKey) {\n warnFallthrough(path, group, status);\n return body;\n }\n return mapGroupA(body, collectionKey);\n};\n","import axios, { AxiosError, isAxiosError } from 'axios';\nimport { useRenderConfigStore } from '../stores/renderConfig';\nimport { getAuthCookies, getSessionCookies } from '../utils/cookies';\n\nimport { normaliseBody } from '../utils/envelope';\n\nimport type { AxiosAdapter, AxiosResponse, InternalAxiosRequestConfig } from 'axios';\nimport type { HostTransport, HostTransportParams, MethodType } from '../types/callbacks';\n\n/**\n * Query params in the shape a host transport expects.\n *\n * Axios would stringify these into the query string anyway; doing it one step\n * earlier keeps the transport's `Record<string, string>` contract honest.\n * `undefined`/`null` entries are dropped, exactly as axios drops them.\n */\nconst toTransportParams = (params: unknown): Record<string, string> | undefined => {\n if (!params || typeof params !== 'object') return undefined;\n const serialised: Record<string, string> = {};\n for (const [key, value] of Object.entries(params as Record<string, unknown>)) {\n if (value === undefined || value === null) continue;\n serialised[key] = String(value);\n }\n return serialised;\n};\n\n/**\n * Wraps a host `cmApiCallback` as an axios adapter.\n *\n * The host owns the wire — base URL, auth headers, credentials, CSRF — so the\n * adapter forwards only what the library owns: the path, the params, the body,\n * and the two per-request options (`responseType`, `paramsSerializer`) that\n * silently change behaviour when a transport drops them.\n */\nexport const createHostAdapter = (transport: HostTransport): AxiosAdapter =>\n async (config: InternalAxiosRequestConfig): Promise<AxiosResponse> => {\n const method = (config.method ?? 'get').toUpperCase() as MethodType;\n const transportParams = {\n method,\n params: toTransportParams(config.params),\n responseType: config.responseType,\n paramsSerializer: config.paramsSerializer,\n ...(method === 'GET' ? {} : { data: config.data }),\n } as HostTransportParams<MethodType, unknown>;\n\n // A host transport rejecting natively (its fetch threw, the host wrapped it)\n // must not lose its status on the way out — re-wrap anything that is not\n // already an AxiosError so `responseStatus` can still read it.\n let hostResponse: AxiosResponse;\n try {\n hostResponse = await transport(config.url ?? '', transportParams);\n } catch (cause) {\n if (isAxiosError(cause)) throw cause;\n throw new AxiosError(\n cause instanceof Error ? cause.message : 'Host transport failed',\n AxiosError.ERR_NETWORK,\n config,\n null,\n (cause as { response?: AxiosResponse } | undefined)?.response\n );\n }\n\n // Re-attach this config: the response interceptor keys the envelope\n // normaliser off `response.config.url`, and a host is free to return a\n // response object carrying its own (host-shaped) config.\n const response = { ...hostResponse, config } as AxiosResponse;\n\n // A custom adapter owns settling its own promise. `dispatchRequest` is a\n // bare `adapter(config).then(...)` — it does not apply `validateStatus` the\n // way the built-in adapters' `settle()` does, so without this every non-2xx\n // the host relays would resolve as a success and the whole error path below\n // (`isAuthError`, `responseStatus`, `isSortRejection`) would be dead code.\n const validateStatus =\n config.validateStatus ?? ((status: number) => status >= 200 && status < 300);\n if (!validateStatus(response.status)) {\n throw new AxiosError(\n `Request failed with status code ${response.status}`,\n response.status >= 500 ? AxiosError.ERR_BAD_RESPONSE : AxiosError.ERR_BAD_REQUEST,\n config,\n null,\n response\n );\n }\n\n return response;\n };\n\n/**\n * Axios instance configured with base URL and default headers\n * Base URL is constructed from config store as: baseUrl/api/v1/accounts/{accountId}/customer-module\n * Uses CustomerModuleConfig.baseUrl and CustomerModuleConfig.accountId\n */\nexport const apiClient = axios.create({\n baseURL: '',\n headers: {\n 'Content-Type': 'application/json',\n },\n});\n\n// Request interceptor for setting base URL from config and adding auth tokens or other headers\napiClient.interceptors.request.use(\n (config) => {\n // Read both per request, never cached on this singleton: one page can hold\n // two host configs, and a cached platform/transport would leak across them.\n const storeConfig = useRenderConfigStore.getState().config;\n const hostTransport = useRenderConfigStore.getState().callbacks?.cmApiCallback;\n\n if (hostTransport) {\n config.adapter = createHostAdapter(hostTransport);\n // Hand the host the body it was given, not axios' JSON string — the host\n // serialises with its own transport.\n config.transformRequest = [(data) => data];\n }\n\n if(config.meta?.getParams){\n config.params = {\n ...config.params,\n ...config.meta.getParams(storeConfig!),\n }\n }\n\n if(config.meta?.getBaseUrl){\n config.baseURL = config.meta.getBaseUrl(storeConfig!);\n }\n // A host transport owns the base URL; building one here would prefix the\n // path twice.\n else if (!hostTransport && storeConfig?.baseUrl && storeConfig?.accountId) {\n // Construct base URL: baseUrl/api/v1/accounts/{accountId}/customer-module\n config.baseURL = `${storeConfig.baseUrl}/api/v1/accounts/${storeConfig.accountId}/customer-module`;\n }\n \n // Get auth cookies and set headers. A host transport authenticates the\n // request itself, so the devise cookie set stays out of its way.\n const authCookie = hostTransport ? null : getAuthCookies();\n if (authCookie) {\n // authCookie might be a string (JSON) or already parsed object\n let authData: Record<string, string>;\n if (typeof authCookie === 'string') {\n try {\n authData = JSON.parse(authCookie);\n } catch {\n // If parsing fails, try URL decoding first\n try {\n authData = JSON.parse(decodeURIComponent(authCookie));\n } catch {\n console.error('Failed to parse auth cookie');\n authData = {};\n }\n }\n } else {\n authData = authCookie as Record<string, string>;\n }\n \n // Set headers directly on config.headers\n if (authData['access-token'] || authData['access_token']) {\n config.headers['access-token'] = authData['access-token'] || authData['access_token'];\n }\n if (authData['token-type'] || authData['token_type']) {\n config.headers['token-type'] = authData['token-type'] || authData['token_type'];\n }\n if (authData.client) {\n config.headers['client'] = authData.client;\n }\n if (authData.expiry) {\n config.headers['expiry'] = authData.expiry;\n }\n if (authData.uid) {\n config.headers['uid'] = authData.uid;\n }\n\n if(storeConfig?.tenant){\n config.headers['x-hiver-tenant'] = storeConfig.tenant;\n }\n if(storeConfig?.accountId){\n config.headers['x-hiver-usergroupid'] = storeConfig.accountId;\n }\n if(storeConfig?.userId){\n config.headers['x-hiver-userid'] = storeConfig.userId;\n }\n \n const sessionCookie = getSessionCookies();\n if (sessionCookie) {\n config.headers['cookie'] = sessionCookie;\n }\n }\n \n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n);\n\n/** Reads a header off an axios header bag, whatever casing it arrived in. */\nconst readHeader = (headers: unknown, name: string): string | undefined => {\n if (!headers || typeof headers !== 'object') return undefined;\n const bag = headers as Record<string, unknown> & { get?: (key: string) => unknown };\n const value = typeof bag.get === 'function' ? bag.get(name) : undefined;\n if (typeof value === 'string') return value;\n const entry = Object.entries(bag).find(([key]) => key.toLowerCase() === name);\n return typeof entry?.[1] === 'string' ? entry[1] : undefined;\n};\n\n/**\n * The HiG session-expiry body. `extensionmode` answers an expired session with\n * `401 {\"state\":\"not_loggedin\"}` rather than a redirect, so it arrives as JSON\n * and must be recognised as an auth failure — not fed to the normaliser, and\n * not mistaken for a parse error against an HTML login page.\n */\nexport const isAuthError = (error: unknown): boolean => {\n const response = (error as AxiosError | undefined)?.response;\n if (!response) return false;\n if (response.status !== 401) return false;\n const body = response.data;\n if (typeof body === 'object' && body !== null && 'state' in body) {\n return (body as { state?: unknown }).state === 'not_loggedin';\n }\n return true;\n};\n\n/** A 5xx the proxy relayed — retryable, and never a Group A payload. */\nexport const isRetryableServerError = (error: unknown): boolean => {\n const status = (error as AxiosError | undefined)?.response?.status;\n return typeof status === 'number' && status >= 500;\n};\n\n/** The HTTP status behind a rejected request, or `null` if it never got one. */\nexport const responseStatus = (error: unknown): number | null =>\n (error as AxiosError | undefined)?.response?.status ?? null;\n\n/** A 422 on a list request — a stale sort key the listing can recover from. */\nexport const isSortRejection = (error: unknown): boolean => responseStatus(error) === 422;\n\n// Response interceptor: platform-keyed envelope normalisation on the success\n// path, error classification on the failure path.\napiClient.interceptors.response.use(\n (response) => {\n // Guard 1 — read per response, never cached: a HIVERWEB response must be\n // byte-identical to 2.6.2 even when a GMAIL config shares the page.\n const platform = useRenderConfigStore.getState().config?.platform;\n if (platform !== 'GMAIL') return response;\n\n response.data = normaliseBody({\n path: response.config?.url ?? '',\n method: response.config?.method ?? 'get',\n status: response.status,\n contentType: readHeader(response.headers, 'content-type'),\n body: response.data,\n });\n return response;\n },\n (error) => {\n // Error bodies are never normalised: the proxy's `{\"error\": ...}` shapes,\n // the 401 `{\"state\":\"not_loggedin\"}` and a non-JSON 500 are all left\n // exactly as they arrived, and classified rather than reshaped.\n if (isAuthError(error)) {\n (error as AxiosError & { isAuthError?: boolean }).isAuthError = true;\n }\n return Promise.reject(error);\n }\n);\n\n","import { apiClient } from './axios';\nimport type {\n UpdatePrimaryContactApiResponse,\n UpdatePrimaryContactRequest,\n} from '../types/api';\n\n/**\n * Update the primary contact for a conversation\n * \n * @param conversationId - Conversation ID (path parameter)\n * @param body - Request body with contact_id, preserve_old_as_secondary, and reason\n * @returns Promise resolving to update primary contact API response\n */\nexport const updatePrimaryContact = async (\n conversationId: number,\n body: UpdatePrimaryContactRequest\n): Promise<UpdatePrimaryContactApiResponse> => {\n // To:do - by default, the channel is email even if we dont send it, we will add channel=chat in future\n const response = await apiClient.patch<UpdatePrimaryContactApiResponse>(\n `/v1/conversations/${conversationId}/primary-contact?channel=email`,\n body\n );\n return response.data;\n};\n\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%3e%3cpath%20d='M14%2014L11.1%2011.1M12.6667%207.33333C12.6667%2010.2789%2010.2789%2012.6667%207.33333%2012.6667C4.38781%2012.6667%202%2010.2789%202%207.33333C2%204.38781%204.38781%202%207.33333%202C10.2789%202%2012.6667%204.38781%2012.6667%207.33333Z'%20stroke='%2364758B'%20stroke-width='1.3'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","import { useRenderConfigStore } from '../stores/renderConfig';\n\n/**\n * Hook to access render configuration callbacks\n * @returns The callbacks object or null if not configured\n */\nexport const useRenderConfig = () => {\n const callbacks = useRenderConfigStore((state) => state.callbacks);\n return callbacks;\n};\n\n","export const ENDPOINTS = {\n COMPANIES: '/v1/companies',\n COMPANIES_WITH_FILTERS: '/v1/companies/search-by-custom-fields',\n CONTACTS_WITH_FILTERS: '/v1/contacts/search-by-custom-fields',\n EDIT_COMPANY: '/v1/companies/:entity_id',\n COMPANY_SUMMARY: '/v1/companies/:company_id/summary',\n COMPANY_CONVERSATIONS: '/v1/companies/:company_id/conversations',\n EXCLUDED_DOMAINS: '/v1/account-settings/excluded-domains',\n CONTACTS: '/v1/contacts',\n EDIT_CONTACT: '/v1/contacts/:entity_id',\n CONTACT_SUMMARY: '/v1/contacts/:contact_id/summary',\n CONTACT_CONVERSATIONS: '/v1/contacts/:contact_id/conversations',\n GET_CUSTOM_FIELDS: '/api/v1/config/custom-fields',\n VIEW_CUSTOM_FIELDS: '/v1/preferences/view',\n TOGGLE_CUSTOM_FIELD_VISIBILITY: '/api/v1/config/edit/:cf_id',\n EDIT_CUSTOM_FIELD: '/api/v1/config/edit/:cf_id',\n CREATE_CUSTOM_FIELD: '/api/v1/config/create',\n IMPORT_PRESIGNED_UPLOAD: '/v1/import/presigned-upload',\n IMPORT_SAMPLE_CSV: '/v1/import/sample-csv',\n IMPORT_VALIDATE: '/v1/import/jobs/:job_id/validate',\n ENTITY_CFSUMMARY: '/api/v1/entity/details',\n IMPORT_COMMIT: '/v1/import/jobs/:job_id/commit',\n IMPORT_JOBS_LIST: '/v1/import/jobs',\n IMPORT_JOB_FAILURE_FILE: '/v1/import/jobs/:job_id/failure-file',\n MAP_CRM_FIELD: '/v1/crm/configs/:crmType/mappings/:entityType',\n INSIGHTS_DETAILED: '/v1/accounts/:company_id/insights',\n INSIGHTS_HEALTH_FEEDBACK: '/v1/accounts/:company_id/insights/health/feedback',\n INSIGHTS_SIGNAL_CONVERSATIONS: '/v1/accounts/:company_id/insights/:type/contributors'\n} as const;\n","import { apiClient } from './axios';\nimport { ENDPOINTS } from '@/constants/endpoints';\nimport type {\n ContactsApiResponse,\n ContactsFilterResponseData,\n GetContactsParams,\n ContactSummaryApiResponse,\n ContactSummaryData,\n ContactConversationsApiResponse,\n GetContactConversationsParams,\n ContactActivityApiResponse,\n GetContactActivityParams,\n UpdateContactApiResponse,\n UpdateContactRequest,\n CreateContactApiResponse,\n CreateContactRequest,\n EntityFilterParams\n} from '../types/api';\n\n/**\n * Get contacts list with enhanced search and filtering\n * \n * @param params - Query parameters for filtering and pagination\n * @returns Promise resolving to contacts API response\n */\nexport const getContacts = async (\n params?: GetContactsParams\n): Promise<ContactsApiResponse> => {\n const response = await apiClient.get<ContactsApiResponse>(ENDPOINTS.CONTACTS, {\n params: {\n text: params?.text,\n page_number: params?.page_number ?? 1,\n page_size: params?.page_size ?? 20,\n company_id: params?.company_id,\n channel: params?.channel,\n sort: params?.sort ?? 'name',\n order: params?.order ?? 'asc',\n has_conversations: params?.has_conversations,\n has_email: params?.has_email,\n },\n });\n return response.data;\n};\n\n\nexport const getContactsWithFilters = async (body: EntityFilterParams): Promise<ContactsFilterResponseData> => {\n const response = await apiClient.post<ContactsFilterResponseData>(ENDPOINTS.CONTACTS_WITH_FILTERS, body);\n return response.data;\n};\n\n/**\n * Get contact summary with aggregated data\n * \n * @param contactId - Contact ID (path parameter)\n * @returns Promise resolving to contact summary API response\n */\nexport const getContactSummary = async (\n contactId: number\n): Promise<ContactSummaryApiResponse> => {\n const response = await apiClient.get<ContactSummaryApiResponse>(\n `/v1/contacts/${contactId}/summary`\n );\n return response.data;\n};\n\n/**\n * Get conversations for a contact\n * \n * @param contactId - Contact ID (path parameter)\n * @param params - Query parameters for filtering and pagination\n * @returns Promise resolving to contact conversations API response\n */\nexport const getContactConversations = async (\n contactId: number,\n params?: GetContactConversationsParams\n): Promise<ContactConversationsApiResponse> => {\n const response = await apiClient.get<ContactConversationsApiResponse>(\n `/v1/contacts/${contactId}/conversations`,\n {\n params: {\n page_number: params?.page_number ?? 1,\n page_size: params?.page_size ?? 20,\n channel: params?.channel,\n sort: params?.sort ?? 'timestamp',\n order: params?.order ?? 'desc',\n date_from: params?.date_from,\n date_to: params?.date_to,\n },\n }\n );\n return response.data;\n};\n\n/**\n * Get activity timeline for a contact\n * \n * @param contactId - Contact ID (path parameter)\n * @param params - Query parameters for filtering and pagination\n * @returns Promise resolving to contact activity API response\n */\nexport const getContactActivity = async (\n contactId: number,\n params?: GetContactActivityParams\n): Promise<ContactActivityApiResponse> => {\n const response = await apiClient.get<ContactActivityApiResponse>(\n `/v1/contacts/${contactId}/activity`,\n {\n params: {\n page_number: params?.page_number ?? 1,\n page_size: params?.page_size ?? 20,\n activity_type: params?.activity_type,\n },\n }\n );\n return response.data;\n};\n\n/**\n * Update contact name\n * \n * @param contactId - Contact ID (path parameter)\n * @param body - Request body with name field\n * @returns Promise resolving to update contact API response\n */\nexport const updateContact = async (\n contactId: number,\n body: UpdateContactRequest\n): Promise<UpdateContactApiResponse> => {\n const response = await apiClient.put<UpdateContactApiResponse>(\n `/v1/contacts/${contactId}`,\n body\n );\n // response.data from axios is the API response body\n // If API returns { status, message, data }, return it as is\n // If API returns contact object directly, wrap it in ApiResponse format\n const apiResponse = response.data;\n if (apiResponse && typeof apiResponse === 'object' && 'status' in apiResponse && 'data' in apiResponse) {\n return apiResponse;\n }\n // API returned contact object directly, wrap it\n return {\n status: 'success',\n message: null,\n data: apiResponse as ContactSummaryData,\n };\n};\n\n/**\n * Create a contact\n *\n * @param body - Request body with email_id and name\n * @returns Promise resolving to create contact API response\n */\nexport const createContact = async (\n body: CreateContactRequest\n): Promise<CreateContactApiResponse> => {\n const response = await apiClient.post<CreateContactApiResponse | ContactSummaryData>(\n '/v1/contacts',\n body\n );\n const apiResponse = response.data;\n if (apiResponse && typeof apiResponse === 'object' && 'status' in apiResponse && 'data' in apiResponse) {\n return apiResponse as CreateContactApiResponse;\n }\n return {\n status: 'success',\n message: null,\n data: apiResponse as ContactSummaryData,\n };\n};\n\n/**\n * Search contacts by email IDs\n * \n * @param emails - Array of email addresses to search for\n * @returns Promise resolving to search API response\n */\nexport const searchContactsByEmails = async (\n emails: string[]\n): Promise<unknown> => {\n // Construct query params with multiple emails - need to serialize as emails=...&emails=...\n // Using paramsSerializer to ensure emails are repeated as separate query params\n const paramsSerializer = () => {\n const searchParams = new URLSearchParams();\n emails.forEach(email => {\n searchParams.append('emails', email);\n });\n return searchParams.toString();\n };\n\n const response = await apiClient.get('/v1/search', {\n params: {},\n paramsSerializer: paramsSerializer,\n });\n return response.data;\n};\n\n","import { create } from 'zustand';\nimport { responseStatus } from '../services/axios';\nimport { getContacts, getContactSummary, getContactConversations, searchContactsByEmails } from '../services/contacts';\nimport type { \n ContactsResponseData, \n GetContactsParams,\n ContactSummaryData,\n ContactConversationsResponseData,\n GetContactConversationsParams\n} from '../types/api';\n\ninterface ContactsState {\n data: ContactsResponseData | null;\n isLoading: boolean;\n error: string | null;\n /**\n * HTTP status behind `error`, so the listing can tell a recoverable\n * 422 (stale sort key) from a generic failure. `null` when the request\n * never reached a response.\n */\n errorStatus: number | null;\n summaries: Record<number, ContactSummaryData>;\n summaryLoading: Record<number, boolean>;\n summaryErrors: Record<number, string | null>;\n conversations: Record<number, ContactConversationsResponseData>;\n conversationsLoading: Record<number, boolean>;\n conversationsErrors: Record<number, string | null>;\n emailToNameMap: Record<string, string>;\n fetchContacts: (params?: GetContactsParams) => Promise<void>;\n fetchNextPage: (params?: Omit<GetContactsParams, 'page_number'>) => Promise<void>;\n fetchContactSummary: (contactId: number) => Promise<void>;\n fetchContactConversations: (contactId: number, params?: GetContactConversationsParams) => Promise<void>;\n fetchNextPageContactConversations: (contactId: number, params?: Omit<GetContactConversationsParams, 'page_number'>) => Promise<void>;\n updateContactSummary: (contactId: number, summary: ContactSummaryData) => void;\n updateContactInList: (contactId: number, updates: Partial<ContactSummaryData>) => void;\n setData: (data: ContactsResponseData | null) => void;\n searchContactsByEmails: (emails: string[]) => Promise<void>;\n}\n\nexport const useContactsStore = create<ContactsState>((set, get) => ({\n data: null,\n isLoading: false,\n error: null,\n errorStatus: null,\n summaries: {},\n summaryLoading: {},\n summaryErrors: {},\n conversations: {},\n conversationsLoading: {},\n conversationsErrors: {},\n emailToNameMap: {},\n fetchContacts: async (params) => {\n set({ isLoading: true, error: null, errorStatus: null, data: null });\n try {\n const response = await getContacts(params);\n set({ data: response.data, isLoading: false });\n } catch (error) {\n set({\n error: error instanceof Error ? error.message : 'Failed to fetch contacts',\n errorStatus: responseStatus(error),\n isLoading: false,\n });\n }\n },\n fetchNextPage: async (params) => {\n const currentState = get();\n if (currentState.isLoading) {\n return; // Prevent concurrent requests\n }\n \n // Check if there are more pages to load\n if (currentState.data) {\n const { total, page, page_size } = currentState.data;\n if ((page * page_size) >= total) {\n return; // No more pages to load\n }\n }\n \n set({ isLoading: true, error: null, errorStatus: null });\n try {\n const currentPage = currentState.data?.page ?? 0;\n const nextPage = currentPage + 1;\n const response = await getContacts({ ...params, page_number: nextPage });\n \n set((state) => {\n if (!state.data) {\n return { data: response.data, isLoading: false };\n }\n \n // Append new contacts to existing ones\n const existingContacts = state.data.contacts || [];\n const newContacts = response.data.contacts || [];\n \n return {\n data: {\n ...response.data,\n contacts: [...existingContacts, ...newContacts],\n },\n isLoading: false,\n };\n });\n } catch (error) {\n set({\n error: error instanceof Error ? error.message : 'Failed to fetch contacts',\n errorStatus: responseStatus(error),\n isLoading: false,\n });\n }\n },\n fetchContactSummary: async (contactId) => {\n set((state) => ({\n summaryLoading: { ...state.summaryLoading, [contactId]: true },\n summaryErrors: { ...state.summaryErrors, [contactId]: null },\n }));\n try {\n const response = await getContactSummary(contactId);\n set((state) => ({\n summaries: { ...state.summaries, [contactId]: response.data },\n summaryLoading: { ...state.summaryLoading, [contactId]: false },\n }));\n } catch (error) {\n set((state) => ({\n summaryErrors: {\n ...state.summaryErrors,\n [contactId]: error instanceof Error ? error.message : 'Failed to fetch contact summary',\n },\n summaryLoading: { ...state.summaryLoading, [contactId]: false },\n }));\n }\n },\n fetchContactConversations: async (contactId, params) => {\n set((state) => ({\n conversationsLoading: { ...state.conversationsLoading, [contactId]: true },\n conversationsErrors: { ...state.conversationsErrors, [contactId]: null },\n }));\n try {\n const response = await getContactConversations(contactId, params);\n set((state) => ({\n conversations: { ...state.conversations, [contactId]: response.data },\n conversationsLoading: { ...state.conversationsLoading, [contactId]: false },\n }));\n } catch (error) {\n set((state) => ({\n conversationsErrors: {\n ...state.conversationsErrors,\n [contactId]: error instanceof Error ? error.message : 'Failed to fetch contact conversations',\n },\n conversationsLoading: { ...state.conversationsLoading, [contactId]: false },\n }));\n }\n },\n fetchNextPageContactConversations: async (contactId, params) => {\n const currentState = get();\n if (currentState.conversationsLoading[contactId]) {\n return; // Prevent concurrent requests\n }\n \n // Check if there are more pages to load\n const currentData = currentState.conversations[contactId];\n if (currentData) {\n const { total_results, page_number, page_size } = currentData;\n if ((page_number * page_size) >= total_results) {\n return; // No more pages to load\n }\n }\n \n set((state) => ({\n conversationsLoading: { ...state.conversationsLoading, [contactId]: true },\n conversationsErrors: { ...state.conversationsErrors, [contactId]: null },\n }));\n try {\n const currentPage = currentData?.page_number ?? 0;\n const nextPage = currentPage + 1;\n const response = await getContactConversations(contactId, { ...params, page_number: nextPage });\n \n set((state) => {\n if (!state.conversations[contactId]) {\n return {\n conversations: { ...state.conversations, [contactId]: response.data },\n conversationsLoading: { ...state.conversationsLoading, [contactId]: false },\n };\n }\n \n // Append new conversations to existing ones\n const existingConversations = state.conversations[contactId].results || [];\n const newConversations = response.data.results || [];\n \n return {\n conversations: {\n ...state.conversations,\n [contactId]: {\n ...response.data,\n results: [...existingConversations, ...newConversations],\n },\n },\n conversationsLoading: { ...state.conversationsLoading, [contactId]: false },\n };\n });\n } catch (error) {\n set((state) => ({\n conversationsErrors: {\n ...state.conversationsErrors,\n [contactId]: error instanceof Error ? error.message : 'Failed to fetch contact conversations',\n },\n conversationsLoading: { ...state.conversationsLoading, [contactId]: false },\n }));\n }\n },\n updateContactSummary: (contactId, summary) => {\n set((state) => ({\n summaries: { ...state.summaries, [contactId]: summary },\n }));\n },\n updateContactInList: (contactId, updates) => {\n set((state) => {\n if (!state.data?.contacts) return state;\n const updatedContacts = state.data.contacts.map((contact) =>\n contact.id === contactId ? { ...contact, name: updates.name || contact.name } : contact\n );\n return {\n data: {\n ...state.data,\n contacts: updatedContacts,\n },\n };\n });\n },\n setData: (data) => set({ data }),\n searchContactsByEmails: async (emails) => {\n try {\n // Limit to first 10 emails (max allowed by API)\n const emailsToSearch = emails.slice(0, 10);\n \n const response = await searchContactsByEmails(emailsToSearch);\n \n // Parse response and create email-to-name mapping\n if (response && typeof response === 'object' && 'data' in response) {\n const responseData = (response as { data: { results?: Array<{ email?: string; generated_name?: string; name?: string }> } }).data;\n const results = responseData?.results || [];\n \n const emailToNameMap: Record<string, string> = {};\n results.forEach((contact) => {\n if (contact.email) {\n // Prefer generated_name, fall back to name\n const displayName = contact.generated_name || contact.name;\n if (displayName) {\n emailToNameMap[contact.email] = displayName;\n }\n }\n });\n \n // Update the email-to-name map in store\n set((state) => ({\n emailToNameMap: {\n ...state.emailToNameMap,\n ...emailToNameMap,\n },\n }));\n }\n } catch (error) {\n console.error('Failed to search contacts by emails:', error);\n }\n },\n}));\n\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%3e%3cpath%20d='M7.99967%208.66536C8.36787%208.66536%208.66634%208.3669%208.66634%207.9987C8.66634%207.6305%208.36787%207.33203%207.99967%207.33203C7.63147%207.33203%207.33301%207.6305%207.33301%207.9987C7.33301%208.3669%207.63147%208.66536%207.99967%208.66536Z'%20stroke='%23475569'%20stroke-width='1.3'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M7.99967%204.0013C8.36787%204.0013%208.66634%203.70282%208.66634%203.33464C8.66634%202.96645%208.36787%202.66797%207.99967%202.66797C7.63147%202.66797%207.33301%202.96645%207.33301%203.33464C7.33301%203.70282%207.63147%204.0013%207.99967%204.0013Z'%20stroke='%23475569'%20stroke-width='1.3'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M7.99967%2013.3333C8.36787%2013.3333%208.66634%2013.0349%208.66634%2012.6667C8.66634%2012.2985%208.36787%2012%207.99967%2012C7.63147%2012%207.33301%2012.2985%207.33301%2012.6667C7.33301%2013.0349%207.63147%2013.3333%207.99967%2013.3333Z'%20stroke='%23475569'%20stroke-width='1.3'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","export const GAINSIGHT_EVENTS = {\n // Customer Module - Account Events\n ACCOUNT_LIST_VIEWED: \"AccountListViewed\",\n ACCOUNT_ROW_CLICKED: \"AccountRowClicked\",\n ACCOUNT_EDIT_USED: \"AccountEditUsed\",\n ACCOUNTS_TAB_RIGHT_PANEL: \"AccountsTabRightPanel\",\n\n // Customer Module - Contact Events\n CONTACT_LIST_VIEWED: \"ContactListViewed\",\n CONTACT_ROW_CLICKED: \"ContactRowClicked\",\n CONTACT_COMPOSE_EMAIL_USED: \"ContactComposeEmailUsed\",\n CONTACT_EDIT_USED: \"ContactEditUsed\",\n PHONE_NUMBER_CLICKED: \"PhoneNumberClicked\",\n PRIMARY_CONTACT_CHANGED: \"PrimaryContactChanged\",\n CUSTOMERS_TAB_RIGHT_PANEL: \"CustomersTabRightPanel\",\n\n // Customer Module - Search Events\n CUSTOMER_SEARCH_CLICKED: \"CustomerSearchClicked\",\n CUSTOMER_SEARCH_RESULTS_CLICKED: \"CustomerSearchResultsClicked\",\n\n // Customer Module - Conversation Events\n CONVERSATION_OPENED_FROM_CUSTOMER_MODULE: \"ConversationOpenedFromCustomerModule\",\n\n // Customer Module - Account Insights (Account Health drawer) Events\n CUSTOMER_INTELLIGENCE_INSIGHTS_DETAIL_OPENED: \"CustomerIntelligenceInsightsDetailOpened\",\n CUSTOMER_INTELLIGENCE_INSIGHTS_SIGNAL_DRILLDOWN_OPENED: \"CustomerIntelligenceInsightsSignalDrilldownOpened\",\n CUSTOMER_INTELLIGENCE_INSIGHTS_FEEDBACK_POSITIVE: \"CustomerIntelligenceInsightsFeedbackPositive\",\n CUSTOMER_INTELLIGENCE_INSIGHTS_FEEDBACK_NEGATIVE: \"CustomerIntelligenceInsightsFeedbackNegative\",\n CUSTOMER_INTELLIGENCE_INSIGHTS_FEEDBACK_COMMENT_SUBMITTED: \"CustomerIntelligenceInsightsFeedbackCommentSubmitted\",\n CUSTOMER_INTELLIGENCE_AT_RISK_TAB_OPENED: \"CustomerIntelligenceAtRiskTabOpened\",\n CUSTOMER_INTELLIGENCE_AT_RISK_ACCOUNT_OPENED: \"CustomerIntelligenceAtRiskAccountOpened\",\n } as const;\n \n /**\n * Type-safe event name type\n */\n export type GainsightEventName = typeof GAINSIGHT_EVENTS[keyof typeof GAINSIGHT_EVENTS];\n \n ","import { useState, useMemo, useEffect, useRef } from \"react\";\nimport { Dialog, Button, TextField, IconButton } from \"hiver-ui-kit-extended\";\nimport Avatar from \"../Avatar\";\nimport TruncatedText from \"../TruncatedText\";\nimport { Glyph } from \"../Glyph\";\nimport { updatePrimaryContact } from \"../../services/conversations\";\nimport searchIcon from \"../../assets/search.svg\";\nimport { useRenderConfig } from \"../../hooks/useRenderConfig\";\nimport { useContactsStore } from \"../../stores/contacts\";\nimport { useRenderConfigStore } from \"../../stores/renderConfig\";\nimport kebabIcon from \"../../assets/kebab.svg\";\nimport { GAINSIGHT_EVENTS } from \"@/constants/gainsightEvents\";\n\ntype DialogState = \"add-primary-contact\" | \"primary-contact-confirmation\";\n\ninterface Contact {\n id: string;\n name: string;\n email: string;\n isSelected?: boolean;\n}\n\ninterface PrimaryContactsDialogProps {\n conversationId?: number;\n conversationMembers: any;\n contactId?: number;\n onSuccess?: (newContactId: number) => void;\n isHovered?: boolean;\n}\n\nconst PrimaryContactsDialog = ({\n isHovered,\n conversationId,\n conversationMembers,\n contactId,\n onSuccess,\n}: PrimaryContactsDialogProps) => {\n const callbacks = useRenderConfig();\n const showEditPrimaryContact = useRenderConfigStore((state) => state.showEditPrimaryContact);\n const isDark = useRenderConfigStore((state) => state.theme === \"dark\");\n const {\n updateContactSummary,\n fetchContactSummary,\n summaries,\n searchContactsByEmails,\n emailToNameMap,\n } = useContactsStore();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [dialogState, setDialogState] = useState<DialogState>(\n \"add-primary-contact\"\n );\n const [searchValue, setSearchValue] = useState(\"\");\n const [selectedContact, setSelectedContact] = useState<Contact | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isChangePrimaryContactOpen, setIsChangePrimaryContactOpen] =\n useState(false);\n const searchedEmailsRef = useRef<Set<string>>(new Set());\n\n // Check if any conversation members are missing names\n const hasMissingNames = useMemo(() => {\n if (!conversationMembers || !Array.isArray(conversationMembers)) {\n return false;\n }\n return conversationMembers.some(\n (member: any) => !member.name && member.email\n );\n }, [conversationMembers]);\n\n // Fetch contacts if any members have missing names\n useEffect(() => {\n if (hasMissingNames && conversationMembers && Array.isArray(conversationMembers)) {\n // Extract emails from members that have missing names and haven't been searched yet\n const emailsToSearch = conversationMembers\n .filter((member: any) => {\n const email = member.email;\n return !member.name && \n email && \n !emailToNameMap[email] && \n !searchedEmailsRef.current.has(email);\n })\n .map((member: any) => member.email);\n \n // Limit to first 10 emails (max allowed by API)\n if (emailsToSearch.length > 0) {\n const emailsToFetch = emailsToSearch.slice(0, 10);\n // Mark emails as being searched to prevent duplicate calls\n emailsToFetch.forEach(email => searchedEmailsRef.current.add(email));\n searchContactsByEmails(emailsToFetch);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hasMissingNames, conversationMembers, searchContactsByEmails]);\n\n // Use email-to-name map from store (populated by searchContactsByEmails API)\n // This map is updated when searchContactsByEmails is called\n\n const handleClick = () => {\n setIsChangePrimaryContactOpen(false);\n setDialogOpen(true);\n };\n\n const handleKebabClick = () => {\n setIsChangePrimaryContactOpen((prev) => !prev);\n setDialogOpen(false);\n };\n\n const handleClose = () => {\n setDialogOpen(false);\n setIsChangePrimaryContactOpen(false);\n setDialogState(\"add-primary-contact\");\n setSearchValue(\"\");\n setSelectedContact(null);\n };\n\n // Get current primary contact email from summaries\n const currentPrimaryEmail = contactId ? summaries[contactId]?.email : null;\n\n // Transform conversationMembers to Contact format\n const contacts = useMemo(() => {\n if (!conversationMembers || !Array.isArray(conversationMembers)) {\n return [];\n }\n return conversationMembers.map((member: any, index: number) => {\n const email = member.email || \"\";\n // If name is missing, try to get it from the email-to-name map (populated by searchContactsByEmails)\n const name = member.name || (email ? emailToNameMap[email] : \"\") || \"\";\n return {\n id: email || `contact-${index}`,\n name,\n email,\n isSelected: currentPrimaryEmail ? email === currentPrimaryEmail : false,\n };\n });\n }, [conversationMembers, currentPrimaryEmail, emailToNameMap]);\n\n const filteredContacts = contacts.filter(\n (contact) =>\n contact.name.toLowerCase().includes(searchValue.toLowerCase()) ||\n contact.email.toLowerCase().includes(searchValue.toLowerCase())\n );\n\n const handleContactSelect = (contact: Contact) => {\n setSelectedContact(contact);\n setDialogState(\"primary-contact-confirmation\");\n };\n\n const handleChangePrimaryContact = async () => {\n if (!selectedContact || !conversationId) {\n console.error(\"Missing conversationId or selectedContact\");\n callbacks?.showToast?.(\"error\", \"Missing required information\");\n return;\n }\n\n setIsLoading(true);\n try {\n const response = await updatePrimaryContact(conversationId, {\n email: selectedContact.email,\n name: selectedContact.name,\n });\n\n // Update the contact summary in the store with the new primary contact data\n const newContactId = response.data.new_primary_contact.id;\n const newContactName = response.data.new_primary_contact.name;\n const newContactEmail = response.data.new_primary_contact.email;\n\n // Always fetch the full contact summary for the new primary contact\n // This ensures we get all the details (phone, company, etc.) not just name/email\n await fetchContactSummary(newContactId);\n\n // If we're updating the same contact (same ID), also update the summary immediately\n // with the data we have from the response for instant UI update\n if (contactId && contactId === newContactId) {\n const currentSummary = summaries[contactId];\n if (currentSummary) {\n updateContactSummary(contactId, {\n ...currentSummary,\n name: newContactName,\n email: newContactEmail,\n });\n }\n }\n\n callbacks?.sendGainsightEvent?.(GAINSIGHT_EVENTS.PRIMARY_CONTACT_CHANGED);\n callbacks?.showToast?.(\"success\", \"Primary contact successfully changed\");\n handleClose();\n // Call onSuccess callback with new contactId to trigger re-render and fetch new data\n onSuccess?.(newContactId);\n } catch (error) {\n console.error(\"Error updating primary contact:\", error);\n callbacks?.showToast?.(\n \"error\",\n \"Failed to update primary contact. Please try again.\"\n );\n } finally {\n setIsLoading(false);\n }\n };\n\n const renderHeader = () => {\n return \"Change Primary Contact\";\n };\n\n const renderContent = () => {\n if (dialogState === \"primary-contact-confirmation\") {\n return (\n <div className=\"w-[380px]\" onClick={(e) => e.stopPropagation()}>\n <p className=\"cm:font-[family-name:var(--font-family-sans)] cm:font-normal leading-5 text-sm m-0 w-full mb-4\" style={{ color: 'var(--cm-color-slate-text-subtle)' }}>\n Are you sure you want to change the contact to{\" \"}\n <span className=\"cm:text-label-small cm:font-hanken cm:not-italic cm:font-medium contact-name-highlight\">\n {selectedContact?.name || selectedContact?.email}?\n </span>\n This will replace the existing contact for this conversation.\n </p>\n <div className=\"cm:flex cm:gap-3 cm:items-center cm:justify-end cm:w-full\">\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n size=\"medium\"\n onClick={handleClose}\n >\n Cancel\n </Button>\n <Button\n onClick={handleChangePrimaryContact}\n size=\"medium\"\n disabled={isLoading || !conversationId}\n >\n {isLoading ? \"Changing...\" : \"Change primary contact\"}\n </Button>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"w-[380px]\" onClick={(e) => e.stopPropagation()}>\n <div className=\"w-full mb-4\">\n {/* <TextField\n placeholder=\"Search name or email\"\n value={searchValue}\n onChange={(e) => setSearchValue(e.target.value)}\n /> */}\n\n <TextField\n size=\"medium\"\n placeholder=\"Search name or email\"\n value={searchValue}\n onChange={(e) => setSearchValue(e.target.value)}\n icon={searchIcon}\n className=\"cm:h-10\"\n />\n </div>\n <div className=\"cm:flex cm:flex-col cm:gap-2 cm:items-start cm:w-full\">\n <p className=\"cm:font-normal cm:leading-5 cm:text-sm cm:text-slate-text-subtle\">\n Contacts in this conversation\n </p>\n <div className=\"cm:flex cm:flex-col cm:items-start cm:w-full cm:gap-0\">\n {filteredContacts.map((contact: Contact) => (\n <ContactItem\n key={contact.id}\n contact={contact}\n onSelect={() => handleContactSelect(contact)}\n />\n ))}\n </div>\n </div>\n </div>\n );\n };\n\n return (\n <>\n {isHovered && showEditPrimaryContact &&\n <IconButton\n image={kebabIcon}\n alt=\"kebabIcon\"\n ariaLabel=\"kebabIcon\"\n size=\"sm\"\n onClick={handleKebabClick}\n className={`cm:hover:bg-slate-100! ${\n isChangePrimaryContactOpen ? \"cm:bg-slate-surface-subtle-100!\" : \"\"\n }`}\n />\n}\n\n {isChangePrimaryContactOpen && (\n <div\n onClick={handleClick}\n className=\"cm:absolute cm:top-[190px] cm:right-[10px] cm:bg-slate-surface-white hover:cm:bg-slate-100 cm:text-slate-text-body cm:rounded-lg cm:flex cm:p-1 cm:items-center cm:gap-2 cm:cursor-pointer cm:border cm:border-slate-border-light cm:text-sm cm:font-normal cm:leading-5 cm:h-12 \n cm:shadow-md\"\n >\n <div className=\"cm:w-full cm:h-full cm:rounded-lg cm:flex cm:items-center cm:justify-center cm:hover:bg-slate-100 cm:px-2 cm:py-2.5\">\n Change primary contact\n </div>\n </div>\n )}\n\n <style>{`\n .p-dialog-mask {\n background-color: rgba(0, 0, 0, 0.75) !important;\n }\n `}</style>\n <Dialog\n showBackButton={dialogState === \"primary-contact-confirmation\"}\n showCloseButton={dialogState === \"add-primary-contact\"}\n open={dialogOpen}\n variant=\"confirmation\"\n onClose={handleClose}\n onBack={() => setDialogState(\"add-primary-contact\")}\n maxWidth=\"sm\"\n title={renderHeader()}\n // @ts-ignore\n maskClassName={`cm-root${isDark ? \" cm-dark\" : \"\"}`}\n >\n {renderContent()}\n </Dialog>\n </>\n );\n};\n\nexport default PrimaryContactsDialog;\n\nconst ContactItem = ({\n contact,\n onSelect,\n}: {\n contact: Contact;\n onSelect: () => void;\n}) => {\n return (\n <div\n className=\"cm:flex cm:gap-3 cm:items-center cm:px-2 cm:py-2 cm:rounded-lg cm:w-full cm:cursor-pointer cm:bg-slate-surface-white cm:hover:bg-slate-surface-subtle cm:transition-colors\"\n onClick={onSelect}\n >\n <div className=\"cm:flex cm:gap-3 cm:items-center cm:flex-1 cm:min-w-0\">\n <Avatar name={contact.name || contact.email} labelName={contact.name} size=\"medium\" />\n <div className=\"cm:flex cm:flex-col cm:items-start cm:justify-center cm:flex-1 cm:min-w-0\">\n <TruncatedText\n text={contact.name || contact.email}\n className=\"cm:font-normal cm:leading-5 cm:text-sm cm:text-slate-text-body cm:truncate cm:w-full\"\n />\n <TruncatedText\n text={contact.email}\n className=\"cm:font-normal cm:leading-[18px] cm:text-xs cm:text-slate-text-subtle cm:truncate cm:w-full\"\n />\n </div>\n </div>\n {contact.isSelected && (\n <div className=\"cm:overflow-clip cm:relative cm:shrink-0 cm:w-3.5 cm:h-3.5\">\n <Glyph name=\"check\" size={14} className=\"cm:text-primary-text-default cm:text-sm cm:pr-2\" />\n </div>\n )}\n </div>\n );\n};\n","export default \"data:image/svg+xml,%3csvg%20width='100'%20height='94'%20viewBox='0%200%20100%2094'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20opacity='0.551665'%20d='M10.959%2049.9883H32.8768V62.4883H10.959V49.9883Z'%20fill='%23B3D0E8'/%3e%3cpath%20opacity='0.551665'%20d='M67.209%2049.9883H89.1268V62.4883H67.209V49.9883Z'%20fill='%23B3D0E8'/%3e%3cpath%20opacity='0.8'%20d='M11%200H89V12H11V0Z'%20fill='%23B3D0E8'/%3e%3cpath%20opacity='0.551665'%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M89.1263%2065.5742V82.7831H67.2085V65.5742H89.1263ZM78.1674%2074.9609H75.0363C74.1717%2074.9609%2073.4707%2075.6613%2073.4707%2076.5254C73.4707%2077.3894%2074.1717%2078.0898%2075.0363%2078.0898H78.1674C79.032%2078.0898%2079.733%2077.3894%2079.733%2076.5254C79.733%2075.6613%2079.032%2074.9609%2078.1674%2074.9609Z'%20fill='%23D3E5F3'/%3e%3cpath%20d='M0%2089.8633H100V93.0311H0V89.8633Z'%20fill='%23D5E5F2'/%3e%3cpath%20opacity='0.551665'%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M32.8763%2065.5742V82.7831H10.9585V65.5742H32.8763ZM25.0485%2074.9609H21.9174C21.0528%2074.9609%2020.3518%2075.6613%2020.3518%2076.5254C20.3518%2077.3894%2021.0528%2078.0898%2021.9174%2078.0898H25.0485C25.9131%2078.0898%2026.6141%2077.3894%2026.6141%2076.5254C26.6141%2075.6613%2025.9131%2074.9609%2025.0485%2074.9609Z'%20fill='%23D3E5F3'/%3e%3cpath%20opacity='0.8'%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M93.5164%2014.7714C93.2315%2014.311%2092.7284%2014.031%2092.1868%2014.0312H7.8132C7.27162%2014.031%206.76853%2014.311%206.48365%2014.7713C6.19876%2015.2316%206.1727%2015.8066%206.41479%2016.2907L10.9381%2025.3301V46.8223H32.8128V40.5764C32.8214%2032.8186%2039.1122%2026.5317%2046.875%2026.5231H53.1249C60.8877%2026.5317%2067.1786%2032.8186%2067.1872%2040.5764V46.8223H89.0618V25.3301L93.5852%2016.2907C93.8273%2015.8066%2093.8013%2015.2317%2093.5164%2014.7714ZM25.0004%2029.6462H21.8755C21.0125%2029.6462%2020.313%2028.9471%2020.313%2028.0848C20.313%2027.2224%2021.0125%2026.5233%2021.8755%2026.5233H25.0004C25.8633%2026.5233%2026.5629%2027.2224%2026.5629%2028.0848C26.5629%2028.9471%2025.8633%2029.6462%2025.0004%2029.6462ZM78.1245%2026.5233H74.9996C74.1366%2026.5233%2073.4371%2027.2224%2073.4371%2028.0848C73.4371%2028.9471%2074.1366%2029.6462%2074.9996%2029.6462H78.1245C78.9874%2029.6462%2079.687%2028.9471%2079.687%2028.0848C79.687%2027.2224%2078.9874%2026.5233%2078.1245%2026.5233ZM74.9996%2043.6994H73.4371C72.5742%2043.6994%2071.8746%2043.0003%2071.8746%2042.1379C71.8746%2041.2755%2072.5742%2040.5764%2073.4371%2040.5764H74.9996C75.8625%2040.5764%2076.562%2041.2755%2076.562%2042.1379C76.562%2043.0003%2075.8625%2043.6994%2074.9996%2043.6994ZM79.687%2043.6994H81.2495C82.1124%2043.6994%2082.8119%2043.0003%2082.8119%2042.1379C82.8119%2041.2755%2082.1124%2040.5764%2081.2495%2040.5764H79.687C78.8241%2040.5764%2078.1245%2041.2755%2078.1245%2042.1379C78.1245%2043.0003%2078.8241%2043.6994%2079.687%2043.6994Z'%20fill='%23B3D0E8'/%3e%3crect%20x='2'%20y='14.0312'%20width='9'%20height='30'%20fill='white'/%3e%3crect%20x='89'%20y='14.0312'%20width='9'%20height='30'%20fill='white'/%3e%3c/svg%3e\"","const CDN_ASSETS_HOSTED_URL =\n \"https://cdn.hiverhq.com/channels/default_bot_images\";\n\nexport const CDN_ASSETS = {\n hiverBee: `${CDN_ASSETS_HOSTED_URL}/Hiver_Bee.svg`,\n hiverBee2: `${CDN_ASSETS_HOSTED_URL}/Hiver_Bee_2.png`,\n importAnimation: `${CDN_ASSETS_HOSTED_URL}/import-animation.gif`,\n salesforceSync: `${CDN_ASSETS_HOSTED_URL}/salesforce-sync.svg`,\n hubspotLogo: `${CDN_ASSETS_HOSTED_URL}/hubspot.png`,\n hubspotIllustration: `${CDN_ASSETS_HOSTED_URL}/Illustration.png`,\n successState: `${CDN_ASSETS_HOSTED_URL}/success-state.gif`,\n} as const;\n","import React from 'react';\nimport indiaGateIcon from '../../assets/india-gate.svg';\nimport { CDN_ASSETS } from '@/constants/cdnAssets';\nimport { useRenderConfigStore } from '@/stores/renderConfig';\n\nexport interface EmptyStateProps {\n title: string;\n /** Omitted for a filtered/searched empty result, which has nothing to explain. */\n subcopy?: string;\n icon?: 'hiver-bee' | 'india-gate';\n iconContent?: string;\n contentClassName?: string;\n}\n\nconst EmptyState: React.FC<EmptyStateProps> = ({ title, subcopy, icon = 'hiver-bee', iconContent, contentClassName }) => {\n const isDark = useRenderConfigStore((state) => state.theme === 'dark');\n const iconSrc = icon === 'india-gate' ? indiaGateIcon : CDN_ASSETS.hiverBee;\n const resolvedIconContent =\n iconContent && isDark && iconContent === CDN_ASSETS.hiverBee2\n ? CDN_ASSETS.hiverBee\n : iconContent;\n\n return (\n <div className=\"cm:flex cm:flex-1 cm:flex-col cm:items-center cm:justify-center cm:w-full cm:min-h-[400px] cm:py-8\">\n <div className={`cm:flex cm:flex-1 cm:flex-col cm:items-center cm:justify-center cm:gap-3 ${contentClassName || ''}`}>\n <div className=\"cm:h-[93.031px] cm:w-[100px] cm:shrink-0\">\n <img\n src={resolvedIconContent || iconSrc}\n alt=\"Empty state\"\n className=\"cm:w-full cm:h-full\"\n />\n </div>\n <div className=\"cm:flex cm:flex-col cm:items-center cm:justify-center cm:gap-px cm:text-center\">\n <p className=\"cm:font-medium cm:leading-6 cm:text-base cm:text-slate-text-body cm:whitespace-nowrap\">\n {title}\n </p>\n {subcopy && (\n <p className=\"cm:font-normal cm:leading-5 cm:text-sm cm:text-slate-text-subtle cm:max-w-[236px]\">\n {subcopy}\n </p>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default EmptyState;\n","import React from 'react';\n\ninterface LoaderProps {\n className?: string;\n}\n\nconst Loader: React.FC<LoaderProps> = ({ className = '' }) => {\n return (\n <div className={`cm:flex cm:items-center cm:justify-center cm:w-full cm:py-12 ${className}`}>\n <div className=\"cm:relative cm:w-8 cm:h-8\">\n <div className=\"cm:absolute cm:inset-0 cm:border-2 cm:border-slate-border-light cm:rounded-full\"></div>\n <div className=\"cm:absolute cm:inset-0 cm:border-2 cm:border-transparent cm:border-t-slate-icons-subtle cm:rounded-full cm:animate-spin\"></div>\n </div>\n </div>\n );\n};\n\nexport default Loader;\n\n","export default \"data:image/svg+xml,%3csvg%20width='14'%20height='14'%20viewBox='0%200%2014%2014'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M2.94%208.84c0%20.81-.66%201.47-1.47%201.47S0%209.65%200%208.84s.66-1.47%201.47-1.47h1.47v1.47Zm.74%200c0-.81.66-1.47%201.47-1.47s1.47.66%201.47%201.47v3.69c0%20.81-.66%201.47-1.47%201.47s-1.47-.66-1.47-1.47V8.84Z'%20fill='%23E01E5A'/%3e%3cpath%20d='M5.16%202.94c-.81%200-1.47-.66-1.47-1.47S4.35%200%205.16%200s1.47.66%201.47%201.47v1.47H5.16Zm0%20.74c.81%200%201.47.66%201.47%201.47s-.66%201.47-1.47%201.47H1.47C.66%206.63%200%205.97%200%205.16s.66-1.47%201.47-1.47h3.69Z'%20fill='%2336C5F0'/%3e%3cpath%20d='M11.06%205.16c0-.81.66-1.47%201.47-1.47S14%204.35%2014%205.16s-.66%201.47-1.47%201.47h-1.47V5.16Zm-.74%200c0%20.81-.66%201.47-1.47%201.47s-1.47-.66-1.47-1.47V1.47C7.38.66%208.04%200%208.85%200s1.47.66%201.47%201.47v3.69Z'%20fill='%232EB67D'/%3e%3cpath%20d='M8.85%2011.06c.81%200%201.47.66%201.47%201.47S9.66%2014%208.85%2014s-1.47-.66-1.47-1.47v-1.47h1.47Zm0-.74c-.81%200-1.47-.66-1.47-1.47s.66-1.47%201.47-1.47h3.69c.81%200%201.47.66%201.47%201.47s-.66%201.47-1.47%201.47H8.85Z'%20fill='%23ECB22E'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='14'%20height='14'%20viewBox='0%200%2014%2014'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M7%200C3.13406%200%200%203.13406%200%207C0%208.27186%200.339306%209.46458%200.932167%2010.4924L0%2014L3.6365%2013.1404C4.63478%2013.6883%205.78083%2014%207%2014C10.8659%2014%2014%2010.8659%2014%207C14%203.13406%2010.8659%200%207%200ZM7%2012.7462C5.83003%2012.7462%204.74192%2012.3966%203.83406%2011.796L1.68564%2012.3431L2.28822%2010.2896C1.63625%209.35764%201.25378%208.22344%201.25378%206.99981C1.25378%203.82628%203.82647%201.25358%207%201.25358C10.1735%201.25358%2012.7462%203.82628%2012.7462%206.99981C12.7462%2010.1733%2010.1735%2012.746%207%2012.746V12.7462Z'%20fill='%23475569'/%3e%3cpath%20d='M8.64015%207.92402L10.3338%208.7224C10.4115%208.75896%2010.4613%208.8379%2010.4543%208.92346C10.436%209.14629%2010.3466%209.59293%209.94623%209.99329C8.81612%2011.1234%206.7867%209.84474%206.70407%209.79535C6.20493%209.52721%205.73068%209.16846%205.28093%208.7189C4.83137%208.26935%204.47243%207.7949%204.20429%207.29577C4.1547%207.21332%202.87604%205.1839%204.00634%204.0536C4.4067%203.65324%204.85334%203.56379%205.07618%203.54552C5.16193%203.53852%205.24068%203.58829%205.27723%203.66607L6.07582%205.35968C6.11354%205.43979%206.09701%205.53507%206.0344%205.59768L5.4392%206.19288C5.31048%206.3216%205.27276%206.52207%205.36143%206.68113C5.57862%207.0706%205.87068%207.44568%206.20901%207.79082C6.55415%208.12915%206.92923%208.4214%207.3187%208.6384C7.47776%208.72707%207.67804%208.68935%207.80695%208.56063L8.40215%207.96543C8.46476%207.90282%208.56004%207.8861%208.64015%207.92402Z'%20fill='%23475569'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='14'%20height='14'%20viewBox='0%200%2014%2014'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M1.45835%207.00065H3.43117C3.83087%207.00065%204.19627%207.22646%204.37502%207.58398C4.55377%207.94151%204.91917%208.16732%205.31887%208.16732H8.68119C9.08089%208.16732%209.44629%207.94151%209.62502%207.58398C9.80375%207.22646%2010.1692%207.00065%2010.5689%207.00065H12.5417M5.23051%202.33398H8.7695C9.39769%202.33398%209.71176%202.33398%209.98908%202.42963C10.2343%202.51421%2010.4577%202.65225%2010.643%202.83376C10.8525%203.039%2010.993%203.31993%2011.2739%203.88178L12.5377%206.40944C12.648%206.62994%2012.7031%206.74019%2012.742%206.85569C12.7765%206.95836%2012.8014%207.06394%2012.8164%207.17116C12.8334%207.29185%2012.8334%207.41511%2012.8334%207.66162V8.86732C12.8334%209.84743%2012.8334%2010.3374%2012.6426%2010.7118C12.4748%2011.0411%2012.2071%2011.3088%2011.8779%2011.4766C11.5035%2011.6673%2011.0135%2011.6673%2010.0334%2011.6673H3.96669C2.98659%2011.6673%202.49655%2011.6673%202.1222%2011.4766C1.79292%2011.3088%201.5252%2011.0411%201.35743%2010.7118C1.16669%2010.3374%201.16669%209.84743%201.16669%208.86732V7.66162C1.16669%207.41511%201.16669%207.29185%201.18359%207.17116C1.1986%207.06394%201.22353%206.95836%201.25805%206.85569C1.29692%206.74019%201.35205%206.62994%201.46229%206.40944L2.72612%203.88178C3.00705%203.31993%203.14751%203.039%203.35707%202.83376C3.54239%202.65225%203.76573%202.51421%204.01096%202.42963C4.28825%202.33398%204.60234%202.33398%205.23051%202.33398Z'%20stroke='%23FFFFFF'%20stroke-width='1.1'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","import React from 'react';\nimport type { ConversationStatus, ConversationBoxSize } from \"./types\";\nimport slackIcon from '../../assets/slack.svg';\nimport whatsappIcon from '../../assets/whatsapp.svg';\nimport sharedMailboxLightIcon from '../../assets/sm_inboxes_light.svg';\nimport Icon from '../Icon';\nimport { useRenderConfigStore } from '../../stores/renderConfig';\n\nconst SLATE_ICON_SUBTLE = '#64758B';\nconst CHARCOAL_ICON_SECONDARY = 'var(--cm-color-charcoal-icon-secondary)';\n\n/** Neutral conversation-list icon colour — charcoal secondary in dark mode. */\nconst useConversationIconColor = () => {\n const isDark = useRenderConfigStore((state) => state.theme === 'dark');\n return isDark ? CHARCOAL_ICON_SECONDARY : SLATE_ICON_SUBTLE;\n};\n\n// Status configuration with colors and icons\nexport const statusConfig: Record<ConversationStatus, { label: string; color: string; iconColor: string; icon: string }> = {\n open: { label: 'Open', color: '#E37144', iconColor: '#E3692C', icon: 'status_open' },\n pending: { label: 'Pending', color: '#5398CF', iconColor: '#276CF0', icon: 'status-snoozed' },\n snoozed: { label: 'Pending', color: '#5398CF', iconColor: '#276CF0', icon: 'status-snoozed' },\n close: { label: 'Closed', color: '#2DBB6D', iconColor: '#2DBB6D', icon: 'status-resolved' },\n closed: { label: 'Closed', color: '#2DBB6D', iconColor: '#2DBB6D', icon: 'status-resolved' },\n resolved: { label: 'Closed', color: '#2DBB6D', iconColor: '#2DBB6D', icon: 'status-resolved' },\n};\n\n// Size configuration\nexport const sizeConfig: Record<ConversationBoxSize, {\n padding: { email: string; chat: string };\n gap: string;\n iconSize: string;\n fontSize: { title: string; body: string; timestamp: string };\n avatarSize: string;\n avatarText: string;\n maxWidth: string;\n dividerHeight: string;\n}> = {\n default: {\n padding: {\n email: 'cm:px-5 cm:py-4',\n chat: 'cm:px-5 cm:py-4',\n },\n gap: 'cm:gap-1.5',\n iconSize: 'cm:w-3.5 cm:h-3.5',\n fontSize: {\n title: 'cm:text-sm',\n body: 'cm:text-sm',\n timestamp: 'cm:text-[13px]',\n },\n avatarSize: 'cm:w-4 cm:h-4',\n avatarText: 'cm:text-[9px]',\n maxWidth: 'cm:max-w-[914px]',\n dividerHeight: 'cm:h-4',\n },\n small: {\n padding: {\n email: 'cm:p-4',\n chat: 'cm:p-4',\n },\n gap: 'cm:gap-1',\n iconSize: 'cm:w-3 cm:h-3',\n fontSize: {\n title: 'cm:text-xs',\n body: 'cm:text-xs',\n timestamp: 'cm:text-xs',\n },\n avatarSize: 'cm:w-3 cm:h-3',\n avatarText: 'cm:text-[8px]',\n maxWidth: 'cm:max-w-90',\n dividerHeight: 'cm:h-3',\n },\n};\n\n\nexport const conversationBoxsizeConfig: Record<ConversationBoxSize, {\n padding: { email: string; chat: string };\n gap: string;\n iconSize: string;\n fontSize: { title: string; body: string; timestamp: string };\n avatarSize: string;\n avatarText: string;\n maxWidth: string;\n dividerHeight: string;\n}> = {\n default: {\n padding: {\n email: 'cm:px-5 cm:py-4',\n chat: 'cm:px-5 cm:py-4',\n },\n gap: 'cm:gap-1.5',\n iconSize: 'cm:w-3.5 cm:h-3.5',\n fontSize: {\n title: 'cm:text-sm',\n body: 'cm:text-sm',\n timestamp: 'cm:text-[13px]',\n },\n avatarSize: 'cm:w-4 cm:h-4',\n avatarText: 'cm:text-[9px]',\n maxWidth: 'cm:max-w-[914px]',\n dividerHeight: 'cm:h-4',\n },\n small: {\n padding: {\n email: 'cm:p-4',\n chat: 'cm:p-4',\n },\n gap: 'cm:gap-2',\n iconSize: 'cm:w-3.5 cm:h-3.5',\n fontSize: {\n title: 'cm:text-sm',\n body: 'cm:text-sm',\n timestamp: 'cm:text-xs',\n },\n avatarSize: 'cm:w-3 cm:h-3',\n avatarText: 'cm:text-[8px]',\n maxWidth: 'cm:max-w-90',\n dividerHeight: 'cm:h-3',\n },\n};\n\n// Icon components\ninterface IconProps {\n iconSize: string;\n}\n\nexport const ChatIcon: React.FC<IconProps> = ({ iconSize }) => {\n const color = useConversationIconColor();\n return <Icon name=\"conversation\" size={14} color={color} className={iconSize} />;\n};\n\nexport const EnvelopeIcon: React.FC<IconProps> = ({ iconSize }) => {\n const color = useConversationIconColor();\n return <Icon name=\"email\" size={14} color={color} className={iconSize} />;\n};\n\nexport const SlackIcon: React.FC<IconProps> = ({ iconSize }) => (\n <img\n src={slackIcon}\n alt=\"Slack\"\n className={iconSize}\n />\n);\n\nexport const WhatsAppIcon: React.FC<IconProps> = ({ iconSize }) => (\n <img\n src={whatsappIcon}\n alt=\"WhatsApp\"\n className={iconSize}\n />\n);\n\nexport const TicketIcon: React.FC<IconProps> = ({ iconSize }) => {\n const color = useConversationIconColor();\n return <Icon name=\"ticket\" size={14} color={color} className={iconSize} />;\n};\n\nexport const VoiceIcon: React.FC<IconProps> = ({ iconSize }) => {\n const color = useConversationIconColor();\n return <Icon name=\"phone\" size={14} color={color} className={iconSize} />;\n};\n\nexport const SharedMailboxIcon: React.FC<IconProps> = ({ iconSize }) => {\n const color = useConversationIconColor();\n return <Icon name=\"sm_inboxs\" size={14} color={color} className={iconSize} />;\n};\n\nexport const SharedMailboxLightIcon: React.FC<IconProps> = ({ iconSize }) => (\n <img\n src={sharedMailboxLightIcon}\n alt=\"Shared Mailbox\"\n className={iconSize }\n />\n);\n\nexport const StatusIcon: React.FC<IconProps & { icon: string; label: string; color: string }> = ({ iconSize, icon, color }) => (\n <Icon\n name={icon}\n size={14}\n color={color}\n className={iconSize}\n />\n);\n","import * as React from \"react\";\nconst SvgOpenInANewTab = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 14, height: 14, viewBox: \"0 0 14 14\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip0_815_38495)\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M12.25 5.25001V1.75001M12.25 1.75001H8.75M12.25 1.75001L7 7M5.83333 1.75H4.55C3.56991 1.75 3.07986 1.75 2.70552 1.94074C2.37623 2.10852 2.10852 2.37623 1.94074 2.70552C1.75 3.07986 1.75 3.56991 1.75 4.55V9.45C1.75 10.4301 1.75 10.9201 1.94074 11.2945C2.10852 11.6238 2.37623 11.8915 2.70552 12.0592C3.07986 12.25 3.56991 12.25 4.55 12.25H9.45C10.4301 12.25 10.9201 12.25 11.2945 12.0592C11.6238 11.8915 11.8915 11.6238 12.0592 11.2945C12.25 10.9201 12.25 10.4301 12.25 9.45V8.16667\", stroke: \"currentColor\", strokeWidth: 1.1375, strokeLinecap: \"round\", strokeLinejoin: \"round\" })), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"clipPath\", { id: \"clip0_815_38495\" }, /* @__PURE__ */ React.createElement(\"rect\", { width: 14, height: 14, fill: \"white\" }))));\nexport default SvgOpenInANewTab;\n","/**\n * Generates a random string of specified length\n * \n * @param minLength - Minimum length of the string\n * @param maxLength - Maximum length of the string\n * @returns Random string containing letters, numbers, and spaces\n */\nexport const generateRandomString = (minLength: number, maxLength: number): string => {\n const length = Math.floor(Math.random() * (maxLength - minLength + 1)) + minLength;\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ';\n let result = '';\n \n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n \n return result;\n};\n\n/**\n * Generates a random date in the past (before current date)\n * and formats it to match the timestamp format used in ConversationBox\n * Format: \"MMM D, H:MM AM/PM\" (e.g., \"Jan 1, 12:23 AM\")\n * \n * @returns Formatted random date string\n */\nexport const generateRandomDate = (): string => {\n const now = new Date();\n // Generate a random date between 1 year ago and 1 day ago\n const oneYearAgo = new Date(now.getTime() - 365 * 24 * 60 * 60 * 1000);\n const oneDayAgo = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n \n // Random timestamp between oneYearAgo and oneDayAgo\n const randomTime = Math.random() * (oneDayAgo.getTime() - oneYearAgo.getTime()) + oneYearAgo.getTime();\n const randomDate = new Date(randomTime);\n \n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const month = months[randomDate.getMonth()];\n const day = randomDate.getDate();\n \n let hours = randomDate.getHours();\n const minutes = randomDate.getMinutes().toString().padStart(2, '0');\n const ampm = hours >= 12 ? 'PM' : 'AM';\n \n // Convert to 12-hour format\n hours = hours % 12;\n hours = hours ? hours : 12; // 0 should be 12\n \n const formattedHours = hours.toString();\n \n return `${month} ${day}, ${formattedHours}:${minutes} ${ampm}`;\n};\n\n","import React, { useState, useMemo } from 'react';\nimport type { ConversationBoxProps } from './types';\nimport { statusConfig, ChatIcon, EnvelopeIcon, TicketIcon, SlackIcon, VoiceIcon, WhatsAppIcon, SharedMailboxIcon, StatusIcon, conversationBoxsizeConfig, SharedMailboxLightIcon } from './constants';\nimport Avatar from '../Avatar';\nimport Tooltip from '../Tooltip';\nimport TruncatedText from '../TruncatedText';\nimport OpenInANewTabIcon from '../../assets/open_in_a_new_tab.svg?react';\nimport { useRenderConfigStore } from '../../stores/renderConfig';\nimport { GAINSIGHT_EVENTS } from '../../constants/gainsightEvents';\nimport { generateRandomString, generateRandomDate } from '../../utils/randomDataGenerator';\n\nconst formatDuration = (seconds: number): string => {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n if (mins === 0) return `${secs}s`;\n return `${mins}m ${secs}s`;\n};\n\nconst formatVoiceHeading = (voice?: import('./types').VoiceInfo): string => {\n if (!voice) return 'Voice call';\n const direction = voice.direction === 'inbound' ? 'Incoming Call' : 'Outgoing Call';\n\n if (voice.voicemailAvailable) return `Voicemail`;\n if (voice.isMissedCall) return `Missed Call`;\n\n const state = voice.callState === 'completed'\n ? formatDuration(voice.durationSeconds)\n : voice.callState === 'in-progress'\n ? 'In progress'\n : 'Ringing';\n return `${direction} · ${state}`;\n};\n\n// Divider component - moved outside to avoid creating during render\nconst Divider: React.FC<{ dividerHeight?: string }> = ({ dividerHeight }) => (\n <div className={`${dividerHeight} cm:w-px cm:bg-slate-border-light cm:shrink-0`} />\n);\n\nconst ConversationBox: React.FC<ConversationBoxProps> = ({\n hasAccess = true,\n type,\n status,\n size = 'default',\n senderName,\n timestamp,\n messagePreview,\n heading,\n mailboxName,\n assignedAgent,\n smDetails,\n issueType,\n permaLink,\n voice,\n conversation\n}) => {\n const [isHovered, setIsHovered] = useState(false);\n const statusInfo = status ? statusConfig[status] : undefined;\n const sizeStyles = conversationBoxsizeConfig[size];\n const callbacks = useRenderConfigStore((state) => state.callbacks);\n\n // Generate random data when hasAccess is false\n // Use API fields if available, otherwise generate random ones\n const displayData = useMemo(() => {\n if (hasAccess) {\n return {\n subject: heading,\n messagePreview: messagePreview,\n timestamp: timestamp,\n };\n }\n\n // When hasAccess is false, use API fields if present, otherwise generate random\n return {\n subject: heading || generateRandomString(10, 30),\n messagePreview: messagePreview || generateRandomString(30, 50),\n timestamp: timestamp || generateRandomDate(),\n };\n }, [hasAccess, heading, messagePreview, timestamp]);\n\n // Use smDetails if available, otherwise fall back to legacy props\n const displaySmDetails = smDetails && smDetails.length > 0\n ? smDetails\n : (mailboxName || assignedAgent\n ? [{ sm_name: mailboxName || '', assignee: assignedAgent?.name, sm_id: 0, status } as const]\n : []);\n\n // Show only the first SM detail, then \"+ n more\" if there are more than 1\n const firstSmDetail = displaySmDetails.length > 0 ? displaySmDetails[0] : null;\n const remainingCount = displaySmDetails.length > 1 ? displaySmDetails.length - 1 : 0;\n const remainingSmDetails = displaySmDetails.length > 1 ? displaySmDetails.slice(1) : [];\n\n const isClickable = hasAccess;\n\n // For a no-access space card (slack or voice) we blur everything except the contact name: on\n // top of the preview and timestamp (blurred for all types), inbox name and assignee. Voice was\n // omitted here only because it could never report hasAccess=false; now that Spaces resolves it\n // from space membership, a voice card must blur exactly like a slack one.\n const blurSpaceMeta = !hasAccess && (type === 'slack' || type === 'voice');\n\n const handleActionClick = (e: React.MouseEvent) => {\n if (!isClickable) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n e.stopPropagation();\n callbacks?.sendGainsightEvent?.(GAINSIGHT_EVENTS.CONVERSATION_OPENED_FROM_CUSTOMER_MODULE);\n callbacks?.navigationEvent?.(permaLink, type, type === 'voice' ? conversation : undefined);\n };\n\n const handleCardClick = (e: React.MouseEvent) => {\n if (!isClickable) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n handleActionClick(e);\n };\n\n // Card content - shared between both access states\n const cardContent = (\n <>\n {/* Top row: Sender, Status, Timestamp */}\n <div className={`cm:flex ${size === 'small' ? 'cm:gap-2' : 'cm:gap-2.5'} cm:items-center cm:w-full`}>\n <div className={`cm:flex-1 cm:flex ${size === 'small' ? 'cm:gap-2' : 'cm:gap-2.5'} cm:items-center cm:min-w-0`}>\n {/* Icon and Sender Name */}\n <div className={`cm:flex ${size === 'small' ? 'cm:gap-1.5' : 'cm:gap-2'} cm:items-center cm:shrink-0`}>\n <div className={`${sizeStyles.iconSize} cm:shrink-0 cm:flex cm:items-center cm:justify-center cm:text-slate-icons-subtle`}>\n {type === 'slack'\n ? <SlackIcon iconSize={sizeStyles.iconSize} />\n : type === 'whatsapp'\n ? <WhatsAppIcon iconSize={sizeStyles.iconSize} />\n : type === 'voice'\n ? <VoiceIcon iconSize={sizeStyles.iconSize} />\n : type === 'chat'\n ? <ChatIcon iconSize={sizeStyles.iconSize} />\n : issueType === 'ticket'\n ? <TicketIcon iconSize={sizeStyles.iconSize} />\n : <EnvelopeIcon iconSize={sizeStyles.iconSize} />}\n </div>\n <div className=\"cm:flex cm:gap-1 cm:items-center\">\n {size === 'small' ? (\n <TruncatedText\n text={senderName || ''}\n className={`cm:font-medium cm:leading-5 ${sizeStyles.fontSize.title} cm:text-slate-text-title cm:whitespace-nowrap cm:truncate cm:w-full cm:!max-w-20 cm:text-sm!`}\n />\n ) : (\n <p className={`cm:font-medium cm:leading-5 ${sizeStyles.fontSize.title} cm:text-slate-text-title cm:whitespace-nowrap`}>\n {senderName}\n </p>\n )}\n </div>\n </div>\n\n {/* Status Chip */}\n {statusInfo && statusInfo.icon && statusInfo.label && (\n <>\n {/* Divider */}\n <Divider dividerHeight={sizeStyles.dividerHeight} />\n <div className={`cm:flex ${size === 'small' ? 'cm:gap-1.5' : 'cm:gap-2'} cm:items-center cm:justify-center cm:rounded-2xl cm:shrink-0`}>\n <div className={`cm:shrink-0 cm:flex cm:items-center cm:justify-center`}>\n <StatusIcon\n iconSize={sizeStyles.iconSize}\n icon={statusInfo.icon}\n label={statusInfo.label}\n color={statusInfo.iconColor}\n />\n {size !== 'small' && (\n <p className={`cm:text-sm cm:text-slate-text-body cm:whitespace-nowrap cm:ml-2 capitalize-first`}>\n {statusInfo.label}\n </p>\n )}\n </div>\n </div>\n </>\n )}\n </div>\n\n {/* Timestamp or Action Button - fixed width container to prevent layout shift */}\n <div className=\"cm:relative cm:shrink-0 cm:min-w-[100px] cm:flex cm:items-center cm:justify-end\">\n {/* Timestamp - always rendered but hidden on hover */}\n <p\n className={`cm:font-normal cm:leading-[18px] ${sizeStyles.fontSize.timestamp} cm:text-slate-text-subtle cm:whitespace-nowrap cm:text-right cm:transition-opacity ${!hasAccess ? 'conversation-box-blurred' : ''} ${isClickable && isHovered && size == 'default' ? 'cm:opacity-0' : 'cm:opacity-100'}`}\n style={!hasAccess ? { userSelect: 'none', pointerEvents: 'none' } as React.CSSProperties : undefined}\n >\n {displayData.timestamp}\n </p>\n\n {/* Action Button - absolutely positioned, shown on hover (only when clickable) */}\n {isClickable && (\n <button\n className={`cm:absolute cm:right-0 cm:bg-slate-surface-white cm:border cm:border-slate-border-light cm:rounded-[6px] cm:flex cm:items-center cm:justify-center cm:p-1.5 cm:w-7 cm:h-7 cm:text-slate-icons-active cm:hover:bg-slate-surface-subtle cm:transition-all ${isHovered && size == 'default' ? 'cm:opacity-100 cm:pointer-events-auto' : 'cm:opacity-0 cm:pointer-events-none'} cursor-pointer`}\n aria-label=\"Open in a new tab\"\n onClick={handleActionClick}\n >\n <div className=\"cm:w-3.5 cm:h-3.5 cm:flex cm:items-center cm:justify-center\">\n <OpenInANewTabIcon className=\"cm:w-3.5 cm:h-3.5\" />\n </div>\n </button>\n )}\n </div>\n </div>\n\n {/* Content Section */}\n <div className=\"cm:flex cm:flex-col cm:items-start cm:w-full\">\n {/* Heading (for email or voice) */}\n {((type === 'email' && displayData.subject) || type === 'voice') && (\n <div className={`cm:flex ${size === 'small' ? 'cm:gap-2' : 'cm:gap-3'} cm:items-center cm:w-full`}>\n <div className={`cm:flex-1 cm:flex cm:flex-col cm:font-normal cm:justify-center cm:leading-none cm:overflow-hidden ${sizeStyles.fontSize.body} cm:text-slate-text-body`}>\n <p\n className={`cm:leading-5 cm:text-left cm:overflow-ellipsis cm:overflow-hidden ${size === 'small' ? 'cm:mb-0.5' : ''} ${!hasAccess ? 'conversation-box-blurred' : ''}`}\n style={!hasAccess ? { userSelect: 'none', pointerEvents: 'none' } as React.CSSProperties : undefined}\n >\n {type === 'voice' ? formatVoiceHeading(voice) : displayData.subject}\n </p>\n </div>\n </div>\n )}\n\n {/* Message Preview and Footer */}\n <div className={`cm:flex cm:gap-2 ${size === 'small' ? 'cm:flex-col' : 'cm:flex-row cm:items-center cm:justify-between'} cm:w-full`}>\n <p\n className={`cm:font-normal cm:leading-5 cm:overflow-ellipsis cm:overflow-hidden ${sizeStyles.fontSize.body} cm:text-slate-text-subtle cm:whitespace-nowrap ${size === 'small' ? 'cm:w-full' : 'cm:max-w-[560px]'} ${!hasAccess ? 'conversation-box-blurred' : ''}`}\n style={!hasAccess ? { userSelect: 'none', pointerEvents: 'none' } as React.CSSProperties : undefined}\n >\n {type === 'chat' ? displayData.subject : displayData.messagePreview}\n </p>\n\n {/* MailboxName and Assigned Agent */}\n {firstSmDetail && (\n <div\n className={`cm:flex ${size === 'small' ? 'cm:gap-2 cm:w-full cm:flex-col' : 'cm:gap-2.5'} ${size === 'small' ? 'cm:items-start' : 'cm:items-center'} ${size === 'small' ? '' : 'cm:shrink-0'} ${blurSpaceMeta ? 'conversation-box-blurred' : ''}`}\n >\n <div className={`cm:flex ${size === 'small' ? 'cm:gap-2 cm:w-full' : 'cm:gap-2.5'} cm:items-center ${size === 'small' ? 'cm:flex-wrap' : 'cm:shrink-0'}`}>\n {/* Mailbox Name */}\n {firstSmDetail.sm_name && (\n <>\n <div className={`cm:flex cm:gap-1 cm:items-center cm:justify-center cm:py-0.5 cm:rounded cm:shrink-0 ${size === 'small' ? 'cm:min-w-0' : ''}`}>\n <div className={`${sizeStyles.iconSize} cm:overflow-hidden cm:shrink-0 cm:flex cm:items-center cm:justify-center cm:text-slate-icons-subtle`}>\n <SharedMailboxIcon iconSize={sizeStyles.iconSize} />\n </div>\n {size === 'small' ? (\n <TruncatedText\n text={firstSmDetail.sm_name}\n className={`cm:font-normal cm:leading-5 ${sizeStyles.fontSize.body} cm:text-slate-text-subtle cm:truncate cm:!max-w-[120px]`}\n />\n ) : (\n <p className={`cm:font-normal cm:leading-5 ${sizeStyles.fontSize.body} cm:text-slate-text-subtle cm:whitespace-nowrap`}>\n {firstSmDetail.sm_name}\n </p>\n )}\n </div>\n\n {/* Divider after mailbox if assignee exists */}\n {firstSmDetail.assignee && (\n <Divider dividerHeight={sizeStyles.dividerHeight} />\n )}\n </>\n )}\n\n {/* Assigned Agent */}\n {firstSmDetail.assignee && (\n <>\n <div className={`cm:flex ${size === 'small' ? 'cm:gap-1' : 'cm:gap-1.5'} cm:items-center cm:shrink-0 ${size === 'small' ? 'cm:min-w-0' : ''}`}>\n <Avatar name={firstSmDetail.assignee} size={size} />\n {size === 'small' ? (\n <TruncatedText\n text={firstSmDetail.assignee}\n className={`cm:font-normal cm:leading-5 ${sizeStyles.fontSize.body} cm:text-slate-text-subtle cm:truncate cm:!max-w-[120px]`}\n />\n ) : (\n <p className={`cm:font-normal cm:leading-5 ${sizeStyles.fontSize.body} cm:text-slate-text-subtle cm:whitespace-nowrap`}>\n {firstSmDetail.assignee}\n </p>\n )}\n </div>\n\n {/* Divider after assignee if there are more items - hide for small */}\n {remainingCount > 0 && size !== 'small' && (\n <Divider dividerHeight={sizeStyles.dividerHeight} />\n )}\n </>\n )}\n\n {/* Divider after mailbox if no assignee but there are more items - hide for small */}\n {firstSmDetail.sm_name && !firstSmDetail.assignee && remainingCount > 0 && size !== 'small' && (\n <Divider dividerHeight={sizeStyles.dividerHeight} />\n )}\n </div>\n\n {/* \"+ n more\" indicator */}\n {remainingCount > 0 && (\n <Tooltip\n content={\n <div className=\"cm:flex cm:gap-2.5 cm:items-center\">\n {remainingSmDetails.map((smDetail, index) => (\n <React.Fragment key={smDetail.sm_id || index}>\n {index > 0 && (\n <div className=\"cm-conversation-tooltip-divider cm:h-[13px] cm:w-px cm:bg-slate-text-body cm:shrink-0\" />\n )}\n <div className=\"cm:flex cm:gap-2.5 cm:items-center cm:shrink-0\">\n {/* Mailbox Name */}\n {smDetail.sm_name && (\n <div className=\"cm:flex cm:gap-1 cm:items-center cm:justify-center cm:py-0.5 cm:rounded cm:shrink-0\">\n <div className={`${sizeStyles.iconSize} cm:overflow-hidden cm:shrink-0 cm:flex cm:items-center cm:justify-center cm:text-white`}>\n <SharedMailboxLightIcon iconSize={sizeStyles.iconSize} />\n </div>\n <p className={`cm:font-normal cm:leading-5 ${sizeStyles.fontSize.body} cm:text-white cm:whitespace-nowrap`}>\n {smDetail.sm_name}\n </p>\n </div>\n )}\n\n {/* Assigned Agent */}\n {smDetail.assignee && (\n <div className={`cm:flex ${size === 'small' ? 'cm:gap-1' : 'cm:gap-1.5'} cm:items-center cm:shrink-0`}>\n <Avatar name={smDetail.assignee} size={size} />\n <p className={`cm:font-normal cm:leading-5 ${sizeStyles.fontSize.body} cm:text-white cm:whitespace-nowrap`}>\n {smDetail.assignee}\n </p>\n </div>\n )}\n </div>\n </React.Fragment>\n ))}\n </div>\n }\n tooltipClassName=\"cm:flex cm:gap-2.5 cm:items-center\"\n zIndex={50}\n >\n <div className={`more-link-hover cm:flex cm:items-center ${size === 'small' ? 'cm:justify-start' : 'cm:justify-center'} cm:px-0 cm:py-1 cm:rounded-[6px] cm:relative cm:cursor-pointer ${size === 'small' ? 'cm:shrink-0 cm:-mt-2 cm:-mb-1' : ''}`}>\n <p className=\"cm:font-normal cm:leading-[20px] cm:text-[14px] cm:text-slate-text-subtle cm:whitespace-nowrap cm:transition-all\">\n +{remainingCount} more\n </p>\n </div>\n </Tooltip>\n )}\n </div>\n )}\n </div>\n </div>\n </>\n );\n\n return (\n <>\n <style>{`\n .more-link-hover:hover p {\n font-weight: 500 !important;\n color: var(--cm-color-slate-text-body) !important;\n text-decoration: underline !important;\n text-decoration-style: solid !important;\n }\n ${!hasAccess ? `\n .conversation-box-blurred {\n filter: blur(4px) !important;\n user-select: none !important;\n pointer-events: none !important;\n -webkit-user-select: none !important;\n -moz-user-select: none !important;\n -ms-user-select: none !important;\n }\n ` : ''}\n `}</style>\n {!hasAccess ? (\n <Tooltip\n content={<span className=\"cm:text-white cm:text-sm cm:font-normal cm:leading-5 cm:whitespace-nowrap\">You don't have access to this conversation</span>}\n >\n <div\n className={`cm-conversation-card cm:border cm:p-3.5 cm:border-slate-border-light cm:rounded-[10px] cm:flex cm:flex-col ${sizeStyles.gap} cm:w-full cm:cursor-default cm:relative ${type === 'email' ? sizeStyles.padding.email : sizeStyles.padding.chat}`}\n >\n {cardContent}\n </div>\n </Tooltip>\n ) : (\n <div\n className={`cm-conversation-card cm:border cm:p-3.5 cm:border-slate-border-light cm:rounded-[10px] cm:flex cm:flex-col ${sizeStyles.gap} cm:w-full ${isClickable ? 'cm:cursor-pointer cm-conversation-card--interactive' : 'cm:cursor-default'} cm:transition-colors cm:relative ${type === 'email' ? sizeStyles.padding.email : sizeStyles.padding.chat}`}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onClick={isClickable ? handleCardClick : undefined}\n >\n {cardContent}\n </div>\n )}\n </>\n );\n};\n\nexport default ConversationBox;\n","import React from 'react';\nimport type { ConversationBoxSize, ConversationType } from './types';\nimport { sizeConfig } from './constants';\n\ninterface ConversationBoxShimmerProps {\n /**\n * Size of the conversation box (default: 'default')\n */\n size?: ConversationBoxSize;\n /**\n * Type of conversation (default: 'email'). Non-email types ('chat', 'slack') share the\n * chat layout in the shimmer.\n */\n type?: ConversationType;\n}\n\n/**\n * Shimmer version of ConversationBox for loading states\n */\nexport const ConversationBoxShimmer: React.FC<ConversationBoxShimmerProps> = ({ \n size = 'default',\n type = 'email'\n}) => {\n const sizeStyles = sizeConfig[size];\n const paddingClass = type === 'email' ? sizeStyles.padding.email : sizeStyles.padding.chat;\n\n return (\n <div className={`cm-conversation-card cm-conversation-card--shimmer cm:border cm:border-slate-border-light cm:rounded-[10px] cm:flex cm:flex-col ${sizeStyles.gap} cm:w-full cm:animate-pulse ${paddingClass}`}>\n {/* Top row: Sender, Status, Timestamp */}\n <div className={`cm:flex ${size === 'small' ? 'cm:gap-2' : 'cm:gap-2.5'} cm:items-center cm:w-full`}>\n <div className={`cm:flex-1 cm:flex ${size === 'small' ? 'cm:gap-2' : 'cm:gap-2.5'} cm:items-center cm:min-w-0`}>\n {/* Icon and Sender Name */}\n <div className={`cm:flex ${size === 'small' ? 'cm:gap-1.5' : 'cm:gap-2'} cm:items-center cm:shrink-0`}>\n <div className={`${sizeStyles.iconSize} cm:bg-gray-200 cm:rounded`}></div>\n <div className={`${sizeStyles.fontSize.title.includes('text-sm') ? 'cm:h-5' : 'cm:h-4'} cm:w-24 cm:bg-gray-200 cm:rounded`}></div>\n </div>\n\n {/* Divider */}\n <div className={`${sizeStyles.dividerHeight} cm:w-px cm:bg-slate-border-light cm:shrink-0`}></div>\n\n {/* Status Chip */}\n <div className={`cm:flex ${size === 'small' ? 'cm:gap-1.5' : 'cm:gap-2'} cm:items-center cm:justify-center cm:rounded-2xl cm:shrink-0`}>\n <div className={`${sizeStyles.iconSize} cm:bg-gray-200 cm:rounded`}></div>\n {size !== 'small' && (\n <div className={`${sizeStyles.fontSize.body.includes('text-sm') ? 'cm:h-5' : 'cm:h-4'} cm:w-16 cm:bg-gray-200 cm:rounded`}></div>\n )}\n </div>\n </div>\n\n {/* Timestamp */}\n <div className=\"cm:shrink-0 cm:min-w-[100px] cm:flex cm:items-center cm:justify-end\">\n <div className={`${sizeStyles.fontSize.timestamp.includes('text-sm') ? 'cm:h-4' : 'cm:h-3'} cm:w-16 cm:bg-gray-200 cm:rounded`}></div>\n </div>\n </div>\n\n {/* Content Section */}\n <div className=\"cm:flex cm:flex-col cm:items-start cm:w-full\">\n {/* Heading (for email) */}\n {type === 'email' && (\n <div className={`cm:flex ${size === 'small' ? 'cm:gap-2' : 'cm:gap-3'} cm:items-center cm:w-full ${size === 'small' ? 'cm:mb-1' : 'cm:mb-2'}`}>\n <div className={`${sizeStyles.fontSize.body.includes('text-sm') ? 'cm:h-5' : 'cm:h-4'} cm:w-3/4 cm:bg-gray-200 cm:rounded`}></div>\n </div>\n )}\n\n {/* Message Preview and Footer */}\n <div className={`cm:flex ${size === 'small' ? 'cm:flex-col cm:gap-1' : 'cm:flex-row cm:items-center cm:justify-between'} cm:w-full`}>\n <div className={`${sizeStyles.fontSize.body.includes('text-sm') ? 'cm:h-5' : 'cm:h-4'} ${size === 'small' ? 'cm:w-full' : 'cm:max-w-[560px] cm:w-2/3'} cm:bg-gray-200 cm:rounded`}></div>\n\n {/* MailboxName and Assigned Agent */}\n <div className={`cm:flex ${size === 'small' ? 'cm:gap-2 cm:w-full' : 'cm:gap-2.5'} cm:items-center cm:shrink-0`}>\n <div className=\"cm:flex cm:gap-1 cm:items-center cm:justify-center cm:py-0.5 cm:rounded cm:shrink-0\">\n <div className={`${sizeStyles.iconSize} cm:bg-gray-200 cm:rounded`}></div>\n <div className={`${sizeStyles.fontSize.body.includes('text-sm') ? 'cm:h-5' : 'cm:h-4'} cm:w-20 cm:bg-gray-200 cm:rounded`}></div>\n </div>\n <div className={`${sizeStyles.dividerHeight} cm:w-px cm:bg-slate-border-light cm:shrink-0`}></div>\n <div className={`cm:flex ${size === 'small' ? 'cm:gap-1' : 'cm:gap-1.5'} cm:items-center cm:shrink-0`}>\n <div className={`${sizeStyles.avatarSize} cm:bg-gray-200 cm:rounded-full`}></div>\n <div className={`${sizeStyles.fontSize.body.includes('text-sm') ? 'cm:h-5' : 'cm:h-4'} cm:w-16 cm:bg-gray-200 cm:rounded`}></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n","export default \"data:image/svg+xml,%3csvg%20width='100'%20height='100'%20viewBox='0%200%20100%20100'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3crect%20width='100'%20height='100'%20fill='url(%23pattern0_815_38175)'/%3e%3cdefs%3e%3cpattern%20id='pattern0_815_38175'%20patternContentUnits='objectBoundingBox'%20width='1'%20height='1'%3e%3cuse%20xlink:href='%23image0_815_38175'%20transform='scale(0.00333333)'/%3e%3c/pattern%3e%3cimage%20id='image0_815_38175'%20width='300'%20height='300'%20preserveAspectRatio='none'%20xlink:href='data:image/png;base64,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'/%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/png;base64,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\"","import React from 'react';\nimport NoDataImage from '../../assets/no-data.svg';\nimport NoDataTransparentImage from '../../assets/no-data-transparent.png';\nimport { useRenderConfigStore } from '@/stores/renderConfig';\n\nexport interface NoDataFoundProps {\n title: string;\n description: string;\n image?: string;\n}\n\nconst NoDataFound: React.FC<NoDataFoundProps> = ({ title, description, image }) => {\n const isDark = useRenderConfigStore((state) => state.theme === 'dark');\n const defaultImage = isDark ? NoDataTransparentImage : NoDataImage;\n\n return (\n <div className=\"cm:flex cm:flex-1 cm:flex-col cm:items-center cm:justify-center cm:w-full cm:h-full cm:py-12\">\n <div className=\"cm:flex cm:flex-col cm:items-center cm:gap-3\">\n <img\n src={image || defaultImage}\n alt=\"No data\"\n className=\"cm:mix-blend-multiply\"\n />\n <div className=\"cm:flex cm:flex-col cm:items-center cm:gap-1\">\n <p className=\"cm:text-label-medium cm:text-slate-text-body cm:text-center\">\n {title}\n </p>\n <p className=\"cm:text-sm cm:font-normal cm:leading-5 cm:text-slate-text-subtle cm:text-center\">\n {description}\n </p>\n </div>\n </div>\n </div>\n );\n};\n\nexport default NoDataFound;\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='70'%20height='68'%20viewBox='0%200%2070%2068'%20fill='none'%3e%3cpath%20d='M46.5343%2021.0848C59.3159%2020.8896%2069.7481%2030.9495%2069.9956%2043.7301C70.0319%2045.6066%2069.8443%2047.433%2069.458%2049.1849C68.8036%2052.1513%2068.4147%2055.1699%2068.4147%2058.2077V64.0795C68.4147%2064.9791%2067.6854%2065.7083%2066.7858%2065.7083H60.914C57.8763%2065.7083%2054.8576%2066.0973%2051.8913%2066.7516C50.1395%2067.138%2048.3131%2067.3256%2046.4366%2067.2892C33.6561%2067.0419%2023.5962%2056.61%2023.7912%2043.8287C23.9814%2031.3531%2034.0589%2021.2754%2046.5343%2021.0848Z'%20fill='url(%23paint0_linear_2165_2741)'/%3e%3cpath%20d='M46.5343%2021.0848C59.3159%2020.8896%2069.7481%2030.9495%2069.9956%2043.7301C70.0319%2045.6066%2069.8443%2047.433%2069.458%2049.1849C68.8036%2052.1513%2068.4147%2055.1699%2068.4147%2058.2077V64.0795C68.4147%2064.9791%2067.6854%2065.7083%2066.7858%2065.7083H60.914C57.8763%2065.7083%2054.8576%2066.0973%2051.8913%2066.7516C50.1395%2067.138%2048.3131%2067.3256%2046.4366%2067.2892C33.6561%2067.0419%2023.5962%2056.61%2023.7912%2043.8287C23.9814%2031.3531%2034.0589%2021.2754%2046.5343%2021.0848Z'%20fill='url(%23paint1_linear_2165_2741)'/%3e%3cpath%20d='M28.5877%200.00340525C13.0162%20-0.234485%200.306983%2012.0211%200.00538116%2027.5915C-0.038779%2029.8773%200.189678%2032.1026%200.660537%2034.2368C1.45761%2037.8506%201.93147%2041.5282%201.93147%2045.229V52.3824C1.93147%2053.4783%202.81987%2054.3669%203.91595%2054.3669H11.0693C14.77%2054.3669%2018.4476%2054.8407%2022.0615%2055.6378C24.1957%2056.1085%2026.4209%2056.3371%2028.7067%2056.2928C44.2768%2055.9914%2056.5324%2043.2825%2056.2951%2027.7114C56.0632%2012.5128%2043.7861%200.235417%2028.5877%200.00340525Z'%20fill='url(%23paint2_linear_2165_2741)'/%3e%3cpath%20d='M18.0733%2026.6412C17.2781%2025.7962%2016.1526%2025.2656%2014.9006%2025.2656C12.4925%2025.2656%2010.5405%2027.2177%2010.5405%2029.6257C10.5405%2030.8777%2011.0709%2032.0031%2011.916%2032.7984L21.3214%2042.2038C22.1167%2043.0488%2023.2422%2043.5794%2024.4941%2043.5794C26.9021%2043.5794%2028.8542%2041.6273%2028.8542%2039.2193C28.8542%2037.9673%2028.3236%2036.8419%2027.4787%2036.0466L18.0733%2026.6412Z'%20fill='url(%23paint3_linear_2165_2741)'/%3e%3ccircle%20cx='14.9006'%20cy='29.6257'%20r='4.3601'%20fill='white'/%3e%3cpath%20d='M30.4039%2026.6412C29.6087%2025.7962%2028.4833%2025.2656%2027.2312%2025.2656C24.8232%2025.2656%2022.8711%2027.2177%2022.8711%2029.6257C22.8711%2030.8777%2023.4016%2032.0031%2024.2466%2032.7984L33.6521%2042.2038C34.4473%2043.0488%2035.5728%2043.5794%2036.8247%2043.5794C39.2328%2043.5794%2041.1848%2041.6273%2041.1848%2039.2193C41.1848%2037.9673%2040.6542%2036.8419%2039.8093%2036.0466L30.4039%2026.6412Z'%20fill='url(%23paint4_linear_2165_2741)'/%3e%3ccircle%20cx='27.2314'%20cy='29.6257'%20r='4.3601'%20fill='white'/%3e%3cpath%20d='M42.7344%2026.6412C41.9392%2025.7962%2040.8138%2025.2656%2039.5617%2025.2656C37.1537%2025.2656%2035.2016%2027.2177%2035.2016%2029.6257C35.2016%2030.8777%2035.7322%2032.0031%2036.5771%2032.7984L45.9826%2042.2038C46.7778%2043.0488%2047.9033%2043.5794%2049.1552%2043.5794C51.5633%2043.5794%2053.5153%2041.6273%2053.5153%2039.2193C53.5153%2037.9673%2052.9847%2036.8419%2052.1398%2036.0466L42.7344%2026.6412Z'%20fill='url(%23paint5_linear_2165_2741)'/%3e%3ccircle%20cx='39.5625'%20cy='29.6257'%20r='4.3601'%20fill='white'/%3e%3cdefs%3e%3clinearGradient%20id='paint0_linear_2165_2741'%20x1='25.2684'%20y1='56.4867'%20x2='59.1916'%20y2='90.4099'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23A7F3CE'/%3e%3cstop%20offset='1'%20stop-color='%2361DB99'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint1_linear_2165_2741'%20x1='60.5383'%20y1='43.4248'%20x2='46.1296'%20y2='29.0175'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%2361DB99'%20stop-opacity='0.01'/%3e%3cstop%20offset='1'%20stop-color='%23009E74'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint2_linear_2165_2741'%20x1='12.8809'%20y1='49.8579'%20x2='56.2985'%20y2='49.8579'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23FFFABC'/%3e%3cstop%20offset='1'%20stop-color='%23FFA650'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint3_linear_2165_2741'%20x1='32.3463'%20y1='35.529'%20x2='22.2372'%20y2='24.4146'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23FFFABC'%20stop-opacity='0.01'/%3e%3cstop%20offset='1'%20stop-color='%23FFA650'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint4_linear_2165_2741'%20x1='44.6769'%20y1='35.529'%20x2='34.5678'%20y2='24.4146'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23FFFABC'%20stop-opacity='0.01'/%3e%3cstop%20offset='1'%20stop-color='%23FFA650'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint5_linear_2165_2741'%20x1='57.0074'%20y1='35.529'%20x2='46.8983'%20y2='24.4146'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23FFFABC'%20stop-opacity='0.01'/%3e%3cstop%20offset='1'%20stop-color='%23FFA650'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e\"","import { apiClient } from './axios';\nimport { ENDPOINTS } from '@/constants/endpoints';\n\nimport type {\n CompaniesApiResponse,\n CompaniesFilterResponseData,\n GetCompaniesParams,\n CompanySummaryApiResponse,\n CompanyConversationsApiResponse,\n GetCompanyConversationsParams,\n EntityFilterParams\n} from '../types/api';\n\n/**\n * Get companies list with enhanced search and filtering\n * \n * @param params - Query parameters for filtering and pagination\n * @returns Promise resolving to companies API response\n */\nexport const getCompanies = async (\n params?: GetCompaniesParams\n): Promise<CompaniesApiResponse> => {\n const response = await apiClient.get<CompaniesApiResponse>(ENDPOINTS.COMPANIES, {\n params: {\n text: params?.text,\n page_number: params?.page_number ?? 1,\n page_size: params?.page_size ?? 20,\n sort: params?.sort ?? 'name',\n order: params?.order ?? 'asc',\n has_contacts: params?.has_contacts,\n has_conversations: params?.has_conversations,\n filter_by: params?.filter_by,\n },\n });\n return response.data;\n};\n\n\nexport const getCompaniesWithFilters = async (\n body: EntityFilterParams,\n filterBy?: 'at_risk'\n): Promise<CompaniesFilterResponseData> => {\n const response = await apiClient.post<CompaniesFilterResponseData>(\n ENDPOINTS.COMPANIES_WITH_FILTERS,\n body,\n // Keep the At Risk tab applied when custom-field filters are active too.\n { params: filterBy ? { filter_by: filterBy } : undefined }\n );\n return response.data;\n};\n\n/**\n * Get account summary with aggregated data\n * \n * @param companyId - Company ID (path parameter)\n * @returns Promise resolving to company summary API response\n */\nexport const getCompanySummary = async (\n companyId: number\n): Promise<CompanySummaryApiResponse> => {\n const response = await apiClient.get<CompanySummaryApiResponse>(\n `/v1/companies/${companyId}/summary`\n );\n return response.data;\n};\n\n/**\n * Get conversations for a company\n * \n * @param companyId - Company ID (path parameter)\n * @param params - Query parameters for filtering and pagination\n * @returns Promise resolving to company conversations API response\n */\nexport const getCompanyConversations = async (\n companyId: number,\n params?: GetCompanyConversationsParams\n): Promise<CompanyConversationsApiResponse> => {\n const response = await apiClient.get<CompanyConversationsApiResponse>(\n `/v1/companies/${companyId}/conversations`,\n {\n params: {\n page_number: params?.page_number ?? 1,\n page_size: params?.page_size ?? 20,\n channel: params?.channel,\n sort: params?.sort ?? 'timestamp',\n order: params?.order ?? 'desc',\n date_from: params?.date_from,\n date_to: params?.date_to,\n },\n }\n );\n return response.data;\n};\n\n","import { create } from 'zustand';\nimport { responseStatus } from '../services/axios';\nimport { getCompanies, getCompanySummary, getCompanyConversations } from '../services/companies';\nimport type { \n CompaniesResponseData, \n GetCompaniesParams,\n CompanySummaryData,\n CompanyConversationsResponseData,\n GetCompanyConversationsParams\n} from '../types/api';\n\ninterface CompaniesState {\n data: CompaniesResponseData | null;\n isLoading: boolean;\n error: string | null;\n /**\n * HTTP status behind `error`, so the listing can tell a recoverable\n * 422 (stale sort key) from a generic failure. `null` when the request\n * never reached a response.\n */\n errorStatus: number | null;\n summaries: Record<number, CompanySummaryData>;\n summaryLoading: Record<number, boolean>;\n summaryErrors: Record<number, string | null>;\n conversations: Record<number, CompanyConversationsResponseData>;\n conversationsLoading: Record<number, boolean>;\n conversationsErrors: Record<number, string | null>;\n fetchCompanies: (params?: GetCompaniesParams) => Promise<void>;\n fetchNextPage: (params?: Omit<GetCompaniesParams, 'page_number'>) => Promise<void>;\n fetchCompanySummary: (companyId: number) => Promise<void>;\n fetchCompanyConversations: (companyId: number, params?: GetCompanyConversationsParams) => Promise<void>;\n fetchNextPageCompanyConversations: (companyId: number, params?: Omit<GetCompanyConversationsParams, 'page_number'>) => Promise<void>;\n setData: (data: CompaniesResponseData | null) => void;\n}\n\nexport const useCompaniesStore = create<CompaniesState>((set, get) => ({\n data: null,\n isLoading: false,\n error: null,\n errorStatus: null,\n summaries: {},\n summaryLoading: {},\n summaryErrors: {},\n conversations: {},\n conversationsLoading: {},\n conversationsErrors: {},\n fetchCompanies: async (params) => {\n set({ isLoading: true, error: null, errorStatus: null });\n try {\n const response = await getCompanies(params);\n set({ data: response.data, isLoading: false });\n } catch (error) {\n set({\n error: error instanceof Error ? error.message : 'Failed to fetch companies',\n errorStatus: responseStatus(error),\n isLoading: false,\n });\n }\n },\n fetchNextPage: async (params) => {\n const currentState = get();\n if (currentState.isLoading) {\n return; // Prevent concurrent requests\n }\n \n // Check if there are more pages to load\n if (currentState.data) {\n const { total, page, page_size } = currentState.data;\n if ((page * page_size) >= total) {\n return; // No more pages to load\n }\n }\n \n set({ isLoading: true, error: null, errorStatus: null });\n try {\n const currentPage = currentState.data?.page ?? 0;\n const nextPage = currentPage + 1;\n const response = await getCompanies({ ...params, page_number: nextPage });\n \n set((state) => {\n if (!state.data) {\n return { data: response.data, isLoading: false };\n }\n \n // Append new companies to existing ones\n const existingCompanies = state.data.companies || [];\n const newCompanies = response.data.companies || [];\n \n return {\n data: {\n ...response.data,\n companies: [...existingCompanies, ...newCompanies],\n },\n isLoading: false,\n };\n });\n } catch (error) {\n set({\n error: error instanceof Error ? error.message : 'Failed to fetch companies',\n errorStatus: responseStatus(error),\n isLoading: false,\n });\n }\n },\n fetchCompanySummary: async (companyId) => {\n set((state) => ({\n summaryLoading: { ...state.summaryLoading, [companyId]: true },\n summaryErrors: { ...state.summaryErrors, [companyId]: null },\n }));\n try {\n const response = await getCompanySummary(companyId);\n set((state) => ({\n summaries: { ...state.summaries, [companyId]: response.data },\n summaryLoading: { ...state.summaryLoading, [companyId]: false },\n }));\n } catch (error) {\n set((state) => ({\n summaryErrors: {\n ...state.summaryErrors,\n [companyId]: error instanceof Error ? error.message : 'Failed to fetch company summary',\n },\n summaryLoading: { ...state.summaryLoading, [companyId]: false },\n }));\n }\n },\n fetchCompanyConversations: async (companyId, params) => {\n set((state) => ({\n conversationsLoading: { ...state.conversationsLoading, [companyId]: true },\n conversationsErrors: { ...state.conversationsErrors, [companyId]: null },\n }));\n try {\n const response = await getCompanyConversations(companyId, params);\n set((state) => ({\n conversations: { ...state.conversations, [companyId]: response.data },\n conversationsLoading: { ...state.conversationsLoading, [companyId]: false },\n }));\n } catch (error) {\n set((state) => ({\n conversationsErrors: {\n ...state.conversationsErrors,\n [companyId]: error instanceof Error ? error.message : 'Failed to fetch company conversations',\n },\n conversationsLoading: { ...state.conversationsLoading, [companyId]: false },\n }));\n }\n },\n fetchNextPageCompanyConversations: async (companyId, params) => {\n const currentState = get();\n if (currentState.conversationsLoading[companyId]) {\n return; // Prevent concurrent requests\n }\n \n // Check if there are more pages to load\n const currentData = currentState.conversations[companyId];\n if (currentData) {\n const { total_results, page_number, page_size } = currentData;\n if ((page_number * page_size) >= total_results) {\n return; // No more pages to load\n }\n }\n \n set((state) => ({\n conversationsLoading: { ...state.conversationsLoading, [companyId]: true },\n conversationsErrors: { ...state.conversationsErrors, [companyId]: null },\n }));\n try {\n const currentPage = currentData?.page_number ?? 0;\n const nextPage = currentPage + 1;\n const response = await getCompanyConversations(companyId, { ...params, page_number: nextPage });\n \n set((state) => {\n if (!state.conversations[companyId]) {\n return {\n conversations: { ...state.conversations, [companyId]: response.data },\n conversationsLoading: { ...state.conversationsLoading, [companyId]: false },\n };\n }\n \n // Append new conversations to existing ones\n const existingResults = state.conversations[companyId].results || [];\n const newResults = response.data.results || [];\n \n return {\n conversations: {\n ...state.conversations,\n [companyId]: {\n ...response.data,\n results: [...existingResults, ...newResults],\n },\n },\n conversationsLoading: { ...state.conversationsLoading, [companyId]: false },\n };\n });\n } catch (error) {\n set((state) => ({\n conversationsErrors: {\n ...state.conversationsErrors,\n [companyId]: error instanceof Error ? error.message : 'Failed to fetch company conversations',\n },\n conversationsLoading: { ...state.conversationsLoading, [companyId]: false },\n }));\n }\n },\n setData: (data) => set({ data }),\n}));\n\n","export const FEATURES = {\n CUSTOM_FIELDS_ENABLED: 'customFieldsEnabled',\n CUSTOM_FIELDS_M2_ENABLED: 'customFieldsM2Enabled',\n CUSTOM_FIELDS_M3_ENABLED: 'customFieldsM3Enabled',\n IS_ADMIN: 'isAdmin',\n VOICE_ENABLED: 'voiceEnabled',\n // Gates display of slack conversations in the CM list (omni-slack-customer-module). Frontend-only;\n // the backend may still return slack (SPACE/inbox_type=slack) conversations.\n SLACK_CUSTOMER_MODULE_ENABLED: 'slackCustomerModuleEnabled',\n // Gates the Customer Intelligence surfaces on the CM tab (at-risk indicator,\n // Account Sentiment column, All/At Risk tabs, account-detail Overview tab).\n // Driven by the host's omni-ftr-customer-intelligence flag.\n CUSTOMER_INTELLIGENCE_ENABLED: 'customerIntelligenceEnabled',\n // Renders timestamps in 24-hour format instead of 12-hour (AM/PM). The host\n // resolves its hot-ftr-omni-time-format flag AND the agent's per-user\n // time_format preference into this single boolean (enabled && preference ===\n // '24h') and passes it in `features`. Off/absent => 12-hour, today's behavior.\n TIME_FORMAT_24_HOUR: 'timeFormat24Hour',\n IMPORT_CSV_ACTIVITY_ENABLED: 'importCsvActivityEnabled',\n};","import { FEATURES } from '../constants/features';\nimport { useRenderConfigStore } from '../stores/renderConfig';\n\n/**\n * Whether timestamps should render in 24-hour format. The host resolves its\n * hot-ftr-omni-time-format flag + the agent's time_format preference into this\n * single boolean and injects it via `features`. Read the same getState() way\n * conversationMapper reads its flags, so pure formatters (which have no React\n * context) can honor it. Default false => 12-hour (AM/PM), today's behavior.\n */\nexport const is24HourTimeFormat = (): boolean =>\n useRenderConfigStore.getState().features?.[FEATURES.TIME_FORMAT_24_HOUR] ??\n false;\n\n/**\n * Formats ISO timestamp (UTC) to readable format in local timezone\n * (e.g., \"Jan 1, 12:23 AM\" in 12-hour, or \"Jan 1, 00:23\" in 24-hour).\n *\n * @param isoString - ISO 8601 timestamp string (UTC, e.g., \"2026-01-02T07:35:32+00:00\")\n * or chat format (UTC, e.g., \"2026-01-02 07:35:32\")\n * @param is24Hour - render 24-hour time; defaults to the host preference.\n * @returns Formatted date string converted to local timezone\n */\nexport const formatTimestamp = (\n isoString: string,\n is24Hour: boolean = is24HourTimeFormat(),\n): string => {\n // Normalize the timestamp format\n // Chat format: \"2026-01-02 07:35:32\" (UTC but without timezone indicator)\n // Email format: \"2026-01-02T07:35:32+00:00\" (UTC with timezone indicator)\n // All backend timestamps are UTC. Normalize so new Date() treats them as UTC and converts to the\n // user's local timezone. Handles three shapes:\n // - chat: \"2026-01-02 07:35:32\" (space separator, no timezone)\n // - slack: \"2026-06-10T06:42:54(.ffffff)\" (T separator, no timezone — Python isoformat() of a\n // naive UTC datetime)\n // - email: \"2026-01-02T07:35:32+00:00\" (already has a timezone offset)\n let normalizedString = isoString.trim().replace(' ', 'T');\n\n // If there's no timezone indicator (trailing Z or ±HH:MM offset), mark it as UTC.\n const hasTimezone = /(Z|[+-]\\d{2}:?\\d{2})$/.test(normalizedString);\n if (!hasTimezone) {\n normalizedString += 'Z';\n }\n \n // Parse the UTC timestamp - new Date() automatically converts UTC to local timezone\n // When you pass \"2026-01-02T07:35:32+00:00\" or \"2026-01-02T07:35:32Z\", it converts to the user's local time\n const date = new Date(normalizedString);\n \n // Validate the date\n if (isNaN(date.getTime())) {\n return '';\n }\n \n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n \n // All these methods return values in the user's local timezone:\n // - getMonth() returns local month (0-11)\n // - getDate() returns local day of month (1-31)\n // - getHours() returns local hours (0-23)\n // - getMinutes() returns local minutes (0-59)\n const month = months[date.getMonth()];\n const day = date.getDate();\n \n // Get hours and minutes in local timezone (already converted from UTC)\n let hours = date.getHours();\n const minutes = date.getMinutes().toString().padStart(2, '0');\n\n // 24-hour: zero-padded hour, no AM/PM (e.g., \"Jan 1, 00:23\" / \"Jan 1, 13:23\").\n if (is24Hour) {\n const paddedHours = hours.toString().padStart(2, '0');\n return `${month} ${day}, ${paddedHours}:${minutes}`;\n }\n\n const ampm = hours >= 12 ? 'PM' : 'AM';\n\n // Convert to 12-hour format\n hours = hours % 12;\n hours = hours ? hours : 12; // 0 should be 12\n\n // Format hours without leading zero (e.g., \"1:23 AM\" not \"01:23 AM\")\n const formattedHours = hours.toString();\n\n return `${month} ${day}, ${formattedHours}:${minutes} ${ampm}`;\n};\n\n\nexport const epochMillisToDateView= (epochMillis?: number): string => {\n if(!epochMillis) return '-';\n const date = new Date(epochMillis);\n if(isNaN(date.getTime())) return '-';\n const day = date.getDate();\n const month = date.getMonth() + 1;\n const year = date.getFullYear();\n return `${day}-${month}-${year}`;\n};\n","/**\n * Channel a contact was created from — customer-module's `contacts.inferred_channel`,\n * sent as `channel_type` on the contacts list, the company contacts list and the contact\n * summary.\n *\n * SPACE covers BOTH voice and slack: the contact row records only the channel family, so\n * there is no contact-level signal that separates the two. Conversation rows do carry one\n * (`inbox_type`), contacts do not.\n */\nexport const CONTACT_CHANNEL_TYPE = {\n EMAIL: 1,\n WHATSAPP: 2,\n CHAT: 3,\n SPACE: 4,\n} as const;\n\n/**\n * True for a contact that came from a Space channel (voice or slack).\n *\n * Accepts the string form too: the summary endpoint sends the numeric id, while\n * `GET /v1/contacts/{id}` sends a name — today it only ever names email and whatsapp, so a\n * literal 'space' does not appear yet, but matching it means this keeps working if that\n * mapper is completed.\n */\nexport const isSpaceChannelContact = (\n channelType: number | string | null | undefined\n): boolean =>\n channelType === CONTACT_CHANNEL_TYPE.SPACE ||\n (typeof channelType === 'string' && channelType.toLowerCase() === 'space');\n","import { isSpaceChannelContact } from '../constants/channels';\n\n/** Shown wherever a contact has no name yet. */\nconst UNKNOWN_CONTACT_NAME = 'Unknown';\n\n/** Whitespace-only counts as no name, matching formatValue. */\nconst isBlankName = (name: string | null | undefined): boolean =>\n !name || name.trim() === '';\n\n/**\n * Formats a value to display \"-\" if it's empty, null, or undefined\n * @param value - The value to format (string, null, or undefined)\n * @returns The formatted value or \"-\" if empty\n */\nexport const formatValue = (value: string | null | undefined): string => {\n if (!value || (typeof value === 'string' && value.trim() === '')) {\n return '-';\n }\n return value;\n};\n\n/**\n * Display name for a contact, falling back to \"Unknown\" when there is no name.\n *\n * Contacts created from a voice call carry only a phone number until someone names them, which\n * left the Name column and the details header rendering blank — an empty cell beside an avatar\n * showing the placeholder glyph, which reads as a broken row rather than a nameless contact.\n *\n * Scoped to Space-channel contacts so no other channel's rendering changes. Note what that can\n * and cannot express: `channel_type` is the contact's `inferred_channel`, which only\n * distinguishes EMAIL / WHATSAPP / CHAT / SPACE — voice and slack share SPACE, and a contact\n * row carries nothing finer. So this covers voice, and slack rides along; a nameless slack\n * contact would read \"Unknown\" too. Everything else keeps rendering its blank name untouched.\n *\n * Callers that have no channel to hand pass nothing and get the name back verbatim, so the\n * fallback can never leak into a surface that has not opted in.\n *\n * Whitespace-only counts as empty, matching formatValue.\n */\nexport const formatContactName = (\n name: string | null | undefined,\n channelType?: number | string | null\n): string => {\n if (isBlankName(name) && isSpaceChannelContact(channelType)) {\n return UNKNOWN_CONTACT_NAME;\n }\n return name ?? '';\n};\n\n/**\n * The same fallback for a caller that has already established the row is voice.\n *\n * Conversation rows carry `inbox_type`, which separates voice from slack — a distinction the\n * contact-level `channel_type` cannot make — so this takes no channel argument and applies to\n * voice only, by construction. Used for the conversation card's sender line, which sits beside\n * the voice icon and was rendering as empty space for a caller nobody has named yet.\n */\nexport const formatVoiceSenderName = (name: string | null | undefined): string =>\n isBlankName(name) ? UNKNOWN_CONTACT_NAME : (name as string);\n\nexport const formatFileSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n};","import type { ContactConversation, Conversation, VoiceDetails } from '../types/api';\nimport type { ConversationBoxProps, ConversationStatus, SmDetail, VoiceInfo } from '../components/ConversationBox/types';\nimport type { SignalConversation, SignalConversationSmDetail } from '../types/insights';\nimport { formatTimestamp } from './dateUtils';\nimport { formatVoiceSenderName } from './formatValue';\nimport { FEATURES } from '../constants/features';\nimport { useRenderConfigStore } from '../stores/renderConfig';\n\nconst isVoiceEnabled = (): boolean => {\n const features = useRenderConfigStore.getState().features;\n return features?.[FEATURES.VOICE_ENABLED] ?? false;\n};\n\nconst isSlackCustomerModuleEnabled = (): boolean => {\n const features = useRenderConfigStore.getState().features;\n return features?.[FEATURES.SLACK_CUSTOMER_MODULE_ENABLED] ?? false;\n};\n\nconst mapVoiceDetails = (voice: VoiceDetails): VoiceInfo => ({\n direction: voice.direction,\n callState: voice.call_state,\n durationSeconds: voice.duration_seconds,\n customerPhoneNumber: voice.customer_phone_number,\n isMissedCall: voice.is_missed_call ?? false,\n voicemailAvailable: voice.voicemail_available ?? false,\n});\n\n/**\n * Maps channel type from API to ConversationBox type\n *\n * @param channel - Channel type from API ('email' | 'chat' | 'whatsapp' | 'slack' | 'space')\n * @returns ConversationBox type\n */\nexport const mapChannelToType = (channel: 'email' | 'chat' | 'whatsapp' | 'slack' | 'space' | string | undefined, inboxType?: string, hasVoice?: boolean): 'chat' | 'email' | 'slack' | 'voice' | 'whatsapp' => {\n if (hasVoice || inboxType === 'voice') {\n return 'voice';\n }\n if (!channel) {\n return 'email'; // Default to email if channel is undefined/null\n }\n const normalizedChannel = channel.toLowerCase();\n if (normalizedChannel === 'email') {\n return 'email';\n }\n // A SPACE row is slack when inbox_type says so; the backend keeps channel as 'space'.\n if (normalizedChannel === 'slack' || (normalizedChannel === 'space' && inboxType === 'slack')) {\n return 'slack';\n }\n // Same shape as slack: whatsapp arrives either as its own channel or as a SPACE row whose\n // inbox_type identifies the sub-channel. It previously fell through to 'chat', which gave it the\n // chat icon and — because the host routes the open action on this type — meant clicking a\n // whatsapp conversation did nothing.\n if (normalizedChannel === 'whatsapp' || (normalizedChannel === 'space' && inboxType === 'whatsapp')) {\n return 'whatsapp';\n }\n return 'chat';\n};\n\n/**\n * Maps ContactConversation API response to ConversationBoxProps\n * \n * @param conversation - ContactConversation data from API\n * @param senderName - Optional sender name (if not provided, defaults to 'Unknown Sender')\n * @param messagePreview - Optional message preview (if not provided, uses subject or empty string)\n * @returns ConversationBoxProps without onClick handler\n */\nexport const mapConversationToBoxProps = (\n conversation: ContactConversation,\n senderName?: string,\n messagePreview?: string\n): Omit<ConversationBoxProps, 'onClick'> | null => {\n const voiceEnabled = isVoiceEnabled();\n // Only a SPACE row whose sub-channel is voice (inbox_type) is a voice conversation. A slack\n // SPACE row (inbox_type='slack') must NOT be dropped, even though channel is 'space'.\n const isVoiceConversation = conversation.inbox_type === 'voice' || !!conversation.voice;\n // Hide voice conversations when feature is disabled\n if (!voiceEnabled && isVoiceConversation) return null;\n\n // Hide slack conversations from the CM list when the omni-slack-customer-module FF is off\n // (the backend may still return them). A slack SPACE row is identified by inbox_type='slack'.\n if (!isSlackCustomerModuleEnabled() && conversation.inbox_type === 'slack') return null;\n\n const smDetails = conversation.sm_details || [];\n const firstSmDetail = smDetails[0];\n // Use the last item's status for the status icon\n const lastSmDetail = smDetails.length > 0 ? smDetails[smDetails.length - 1] : null;\n const hasVoice = voiceEnabled && !!conversation.voice;\n\n return {\n hasAccess: conversation.has_access,\n type: mapChannelToType(conversation.channel, conversation.inbox_type, hasVoice),\n status: lastSmDetail?.status,\n // The card's sender line sits beside the channel icon. A voice contact is only a phone\n // number until someone names it, which left that line blank — icon, divider, status, and\n // nothing in between. Voice only: `isVoiceConversation` comes from inbox_type, so slack\n // SPACE rows and every other channel keep whatever name they were given.\n senderName: isVoiceConversation ? formatVoiceSenderName(senderName) : senderName,\n timestamp: conversation.created_at ? formatTimestamp(conversation.created_at) : undefined,\n messagePreview: messagePreview || conversation.message_preview || '',\n heading: conversation.subject || undefined, // Use subject for heading\n mailboxName: firstSmDetail?.sm_name, // Kept for backward compatibility - use first for display\n assignedAgent: firstSmDetail?.assignee ? { // Kept for backward compatibility - use first for display\n name: firstSmDetail.assignee,\n } : undefined,\n smDetails: smDetails,\n issueType: conversation.issue_type,\n conversationId: conversation.inbox_conversation_id,\n permaLink: conversation.permalink,\n ...(hasVoice && { voice: mapVoiceDetails(conversation.voice!) }),\n ...(hasVoice && { conversation: conversation as unknown as Record<string, unknown> }),\n };\n};\n\n/**\n * Maps Conversation (Company conversations) API response to ConversationBoxProps\n *\n * @param conversation - Conversation data from API\n * @returns ConversationBoxProps without onClick handler\n */\n/**\n * The conversation token the read API expects — the last `/conversation/`\n * segment of the permalink (the signal endpoint returns a full browser URL).\n * Falls back to the raw value when there's no such segment. NOTE:\n * `conversation_id` is a *different* encoding (base64 of the raw UUID bytes)\n * and must NOT be used for routing.\n */\nconst resolveSignalConversationToken = (permalink: string): string => {\n const match = permalink?.match(/\\/conversation\\/([^/?#]+)/);\n return match ? match[1] : permalink;\n};\n\nconst resolveSignalAssigneeName = (\n assignee: SignalConversationSmDetail['assignee']\n): string | undefined => {\n if (typeof assignee === 'string') return assignee;\n if (assignee && typeof assignee.name === 'string') return assignee.name;\n return undefined;\n};\n\n/**\n * Maps a Screen-3 SignalConversation to ConversationBoxProps so the signal\n * modal reuses the shared ConversationBox card (incl. its no-access blur).\n * Signal rows are always email and never dropped. `permaLink` carries the\n * extracted routing token — ConversationBox passes it verbatim to\n * `navigationEvent(permaLink, 'email')`, matching the prior card's behavior.\n */\nexport const mapSignalConversationToBoxProps = (\n conversation: SignalConversation\n): Omit<ConversationBoxProps, 'onClick'> => {\n const smDetails: SmDetail[] = (conversation.sm_details ?? []).map((detail) => ({\n sm_id: detail.sm_id,\n sm_name: detail.sm_name,\n status: detail.status as ConversationStatus,\n assignee: resolveSignalAssigneeName(detail.assignee),\n }));\n const lastSmDetail = smDetails.length > 0 ? smDetails[smDetails.length - 1] : null;\n\n return {\n hasAccess: conversation.has_access,\n type: 'email',\n status: lastSmDetail?.status,\n // Sender line prefers the contact's name; email is the fallback.\n senderName:\n conversation.contact?.name || conversation.contact?.email || undefined,\n timestamp: conversation.created_at\n ? formatTimestamp(conversation.created_at)\n : undefined,\n messagePreview: conversation.message_preview || '',\n heading: conversation.subject || undefined,\n smDetails,\n issueType: conversation.issue_type,\n permaLink: resolveSignalConversationToken(conversation.permalink),\n };\n};\n\nexport const mapCompanyConversationToBoxProps = (\n conversation: Conversation\n): Omit<ConversationBoxProps, 'onClick'> | null => {\n // Only a SPACE row whose sub-channel is voice (inbox_type) is a voice conversation. A slack\n // SPACE row (inbox_type='slack') must NOT be dropped, even though channel is 'space'.\n const isVoiceConversation = conversation.inbox_type === 'voice' || !!conversation.voice;\n // Hide voice conversations when feature is disabled\n if (isVoiceConversation) return null;\n\n // Hide slack conversations from the CM list when the omni-slack-customer-module FF is off\n // (the backend may still return them). A slack SPACE row is identified by inbox_type='slack'.\n if (!isSlackCustomerModuleEnabled() && conversation.inbox_type === 'slack') return null;\n\n const smDetails = conversation.sm_details || [];\n const firstSmDetail = smDetails[0];\n // Use the last item's status for the status icon\n const lastSmDetail = smDetails.length > 0 ? smDetails[smDetails.length - 1] : null;\n const hasVoice = !!conversation.voice;\n\n\n // Use created_at if available (UTC format), otherwise fall back to timestamp\n const timestampValue = conversation.created_at || conversation.timestamp;\n\n return {\n hasAccess: conversation.has_access,\n type: mapChannelToType(conversation.channel, conversation.inbox_type, hasVoice),\n status: lastSmDetail?.status,\n senderName: conversation.contact?.name || conversation.contact?.email || undefined,\n timestamp: timestampValue ? formatTimestamp(timestampValue) : undefined,\n messagePreview: conversation.message_preview || '',\n heading: conversation.subject || undefined, // Use subject for heading\n mailboxName: firstSmDetail?.sm_name, // Kept for backward compatibility - use first for display\n assignedAgent: firstSmDetail?.assignee ? { // Kept for backward compatibility - use first for display\n name: firstSmDetail.assignee,\n } : undefined,\n smDetails: smDetails,\n issueType: conversation.issue_type,\n conversationId: conversation.inbox_conversation_id,\n permaLink: conversation.permalink,\n ...(hasVoice && { voice: mapVoiceDetails(conversation.voice!) }),\n ...(hasVoice && { conversation: conversation as unknown as Record<string, unknown> }),\n };\n};\n\n","import { useEffect, useRef, useCallback } from 'react';\nimport type { RefObject } from 'react';\n\ninterface UseIntersectionObserverOptions {\n /**\n * The root element to observe (scrollable container)\n */\n rootElement: RefObject<HTMLElement> | HTMLElement | null;\n \n /**\n * Callback function to trigger when near the bottom\n */\n onIntersect: () => void;\n \n /**\n * Distance from bottom in pixels to trigger the callback (default: 200)\n */\n threshold?: number;\n \n /**\n * Condition function that returns true when observation should stop\n * When this returns true, the observer will be disconnected\n */\n shouldUnobserve?: () => boolean;\n \n /**\n * Whether the observer is enabled (default: true)\n */\n enabled?: boolean;\n \n /**\n * External sentinel element ref. If provided, this element will be used instead of creating one internally\n */\n sentinelElement?: RefObject<HTMLElement> | HTMLElement | null;\n}\n\n/**\n * Custom hook that uses Intersection Observer to detect when user scrolls\n * within the last N pixels of a scrollable element\n * \n * @example\n * ```tsx\n * const containerRef = useRef<HTMLDivElement>(null);\n * const [hasMore, setHasMore] = useState(true);\n * \n * useIntersectionObserver({\n * rootElement: containerRef,\n * onIntersect: () => {\n * // Load more data\n * loadMoreData();\n * },\n * threshold: 200,\n * shouldUnobserve: () => !hasMore,\n * enabled: hasMore\n * });\n * ```\n */\nexport function useIntersectionObserver({\n rootElement,\n onIntersect,\n threshold = 200,\n shouldUnobserve,\n enabled = true,\n sentinelElement,\n}: UseIntersectionObserverOptions) {\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n const observerRef = useRef<IntersectionObserver | null>(null);\n const onIntersectRef = useRef(onIntersect);\n const shouldUnobserveRef = useRef(shouldUnobserve);\n\n // Keep refs updated\n useEffect(() => {\n onIntersectRef.current = onIntersect;\n shouldUnobserveRef.current = shouldUnobserve;\n }, [onIntersect, shouldUnobserve]);\n\n useEffect(() => {\n if (!enabled) {\n // Clean up observer if disabled\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n return;\n }\n\n const root = rootElement instanceof HTMLElement \n ? rootElement \n : rootElement?.current;\n\n if (!root) {\n console.log('Intersection Observer: root element not found');\n return;\n }\n\n // Use external sentinel element if provided, otherwise create one\n let sentinel: HTMLElement | null = null;\n let shouldCleanupSentinel = false;\n\n if (sentinelElement) {\n // Use external sentinel\n sentinel = sentinelElement instanceof HTMLElement \n ? sentinelElement \n : sentinelElement.current;\n \n if (!sentinel) {\n console.log('Intersection Observer: External sentinel element not found yet, will retry');\n // Retry after a short delay to allow sentinel to be injected\n const retryTimeout = setTimeout(() => {\n const retrySentinel = sentinelElement instanceof HTMLElement \n ? sentinelElement \n : sentinelElement.current;\n if (retrySentinel) {\n console.log('Intersection Observer: External sentinel element found on retry:', retrySentinel);\n // Re-run the effect by updating a dependency or trigger\n // For now, we'll let the next render cycle handle it\n }\n }, 200);\n return () => clearTimeout(retryTimeout);\n }\n } else {\n // Create sentinel element that will be placed at the bottom of content\n sentinel = document.createElement('div');\n sentinel.style.height = '1px';\n sentinel.style.minHeight = '1px';\n sentinel.style.width = '100%';\n sentinel.style.pointerEvents = 'none';\n sentinel.style.opacity = '0.01'; // Very low opacity but not 0, so it's still detectable\n sentinel.style.position = 'relative';\n sentinel.style.marginTop = '0';\n sentinel.style.marginBottom = '0';\n sentinel.style.padding = '0';\n sentinel.style.border = 'none';\n sentinel.style.display = 'block';\n sentinel.setAttribute('data-intersection-sentinel', 'true');\n shouldCleanupSentinel = true;\n \n sentinelRef.current = sentinel as HTMLDivElement;\n\n // Try to find the content wrapper (like tbody, or the last scrollable child)\n // Otherwise append directly to root\n let targetElement: HTMLElement = root;\n \n // Look for common content containers\n const possibleContainers = root.querySelectorAll('tbody, [role=\"rowgroup\"], .p-datatable-tbody');\n if (possibleContainers.length > 0) {\n targetElement = possibleContainers[possibleContainers.length - 1] as HTMLElement;\n } else {\n // If no specific container, append to root\n targetElement = root;\n }\n\n // Append sentinel to target (at the end of content)\n targetElement.appendChild(sentinel);\n console.log('Intersection Observer: Sentinel appended to target element', {\n targetElement,\n sentinelParent: sentinel.parentElement,\n rootScrollHeight: root.scrollHeight,\n rootClientHeight: root.clientHeight,\n });\n }\n\n if (!sentinel) {\n console.log('Intersection Observer: No sentinel element available');\n return;\n }\n\n // Create intersection observer with rootMargin to create threshold effect\n // Negative bottom margin means intersection happens when sentinel is threshold pixels from bottom\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n // Check if we're within threshold distance from bottom\n // isIntersecting will be true when sentinel is visible within the rootMargin-adjusted viewport\n if (entry.isIntersecting) {\n // Don't unobserve - always allow triggering\n // Trigger callback\n onIntersectRef.current();\n }\n });\n },\n {\n root: root,\n rootMargin: `0px 0px -${threshold}px 0px`,\n threshold: [0, 0.1, 0.5, 1.0], // Multiple thresholds to catch the intersection\n }\n );\n\n observer.observe(sentinel);\n observerRef.current = observer;\n console.log('Intersection Observer: Observer created and started observing sentinel');\n\n // Track if we've already triggered to avoid multiple calls\n let hasTriggered = false;\n \n // Add scroll listener as primary mechanism to detect when near bottom\n const handleScroll = () => {\n const scrollTop = root.scrollTop;\n const scrollHeight = root.scrollHeight;\n const clientHeight = root.clientHeight;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n const shouldTrigger = distanceFromBottom <= threshold;\n \n if (shouldTrigger && !hasTriggered) {\n hasTriggered = true;\n \n // Trigger callback (no unobserve logic)\n onIntersectRef.current();\n \n // Reset after a short delay to allow triggering again if user scrolls back up and down again\n setTimeout(() => {\n hasTriggered = false;\n }, 1000);\n } else if (distanceFromBottom > threshold + 50) {\n // Reset if scrolled back up significantly\n hasTriggered = false;\n }\n };\n\n root.addEventListener('scroll', handleScroll, { passive: true });\n\n // Cleanup\n return () => {\n observer.disconnect();\n observerRef.current = null;\n root.removeEventListener('scroll', handleScroll);\n \n // Only remove sentinel if we created it (not if it was provided externally)\n if (shouldCleanupSentinel && sentinel && sentinel.parentElement) {\n sentinel.parentElement.removeChild(sentinel);\n }\n \n if (shouldCleanupSentinel) {\n sentinelRef.current = null;\n }\n };\n }, [rootElement, threshold, enabled, sentinelElement]);\n\n // Return a function to manually disconnect the observer\n const disconnect = useCallback(() => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n }, []);\n\n return { sentinelRef, disconnect };\n}\n\n","import { useEffect, useRef, useState, useCallback } from 'react';\nimport { useIntersectionObserver } from './useIntersectionObserver';\n\ninterface UseConversationInfiniteScrollOptions {\n /**\n * Wrapper ref for the conversation container\n */\n wrapperRef: React.RefObject<HTMLDivElement>;\n \n /**\n * Conversation items array to determine when shimmer elements are present\n */\n conversationItems: unknown[];\n \n /**\n * Whether the conversations are currently loading\n */\n isLoading: boolean;\n \n /**\n * Whether there are more pages to load\n */\n hasMorePages: boolean;\n \n /**\n * Callback function to trigger when near the bottom\n */\n onIntersect: () => Promise<void> | void;\n \n /**\n * Distance from bottom in pixels to trigger the callback (default: 200)\n */\n threshold?: number;\n}\n\n/**\n * Custom hook that handles infinite scroll for conversation list components\n * - Finds the scrollable element (usually the parent container)\n * - Finds and sets the last shimmer conversation box as sentinel\n * - Sets up intersection observer for pagination\n * \n * @example\n * ```tsx\n * const wrapperRef = useRef<HTMLDivElement>(null);\n * useConversationInfiniteScroll({\n * wrapperRef,\n * conversationItems,\n * isLoading,\n * hasMorePages,\n * onIntersect: async () => {\n * await fetchNextPage();\n * },\n * threshold: 200,\n * });\n * ```\n */\nexport function useConversationInfiniteScroll({\n wrapperRef,\n conversationItems,\n isLoading,\n hasMorePages,\n onIntersect,\n threshold = 200,\n}: UseConversationInfiniteScrollOptions) {\n const scrollContainerRef = useRef<HTMLElement | null>(null);\n const shimmerRef = useRef<HTMLDivElement | null>(null);\n const [scrollableElement, setScrollableElement] = useState<HTMLElement | null>(null);\n const [shimmerElement, setShimmerElement] = useState<HTMLDivElement | null>(null);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n\n // Find the scrollable element (wrapper itself or parent container)\n useEffect(() => {\n if (!wrapperRef.current) return;\n\n // Find the scrollable element - check wrapper itself first, then parent containers\n // First try to find one that's actually scrollable, then fall back to any with overflow-y\n const findScrollableElement = (element: HTMLElement, preferOverflowing: boolean = true): HTMLElement | null => {\n const style = window.getComputedStyle(element);\n const hasOverflow = style.overflowY === 'auto' || style.overflowY === 'scroll';\n const isOverflowing = element.scrollHeight > element.clientHeight;\n \n if (preferOverflowing) {\n // First pass: prefer elements that are actually overflowing\n if (hasOverflow && isOverflowing) {\n return element;\n }\n } else {\n // Second pass: accept any element with overflow-y set\n if (hasOverflow) {\n return element;\n }\n }\n \n // Check parent containers\n let current: HTMLElement | null = element.parentElement;\n while (current) {\n const parentStyle = window.getComputedStyle(current);\n const parentHasOverflow = parentStyle.overflowY === 'auto' || parentStyle.overflowY === 'scroll';\n const parentIsOverflowing = current.scrollHeight > current.clientHeight;\n \n if (preferOverflowing) {\n if (parentHasOverflow && parentIsOverflowing) {\n return current;\n }\n } else {\n if (parentHasOverflow) {\n return current;\n }\n }\n current = current.parentElement;\n }\n \n return null;\n };\n\n // Use a small delay to ensure content has rendered\n const timeoutId = setTimeout(() => {\n // First try to find an element that's actually overflowing\n let scrollable = findScrollableElement(wrapperRef.current!, true);\n \n // If not found, try to find any element with overflow-y (even if not overflowing)\n if (!scrollable) {\n scrollable = findScrollableElement(wrapperRef.current!, false);\n }\n \n // If still not found, use the wrapper element as fallback\n if (!scrollable) {\n scrollable = wrapperRef.current;\n }\n \n if (scrollable) {\n scrollContainerRef.current = scrollable;\n setScrollableElement(scrollable);\n }\n }, 100);\n\n return () => clearTimeout(timeoutId);\n }, [wrapperRef, conversationItems, isLoading]);\n\n // Find the last shimmer conversation box and set it as sentinel\n useEffect(() => {\n if (wrapperRef.current && hasMorePages && !isLoading && conversationItems.length > 0) {\n const timeoutId = setTimeout(() => {\n // Find shimmer elements by looking for ConversationBoxShimmer components\n // They should have the shimmer class or be the last few elements\n const shimmerElements = wrapperRef.current?.querySelectorAll('[data-conversation-shimmer]');\n \n if (shimmerElements && shimmerElements.length > 0) {\n // Use the last shimmer element as sentinel\n const lastShimmer = shimmerElements[shimmerElements.length - 1] as HTMLDivElement;\n (shimmerRef as React.MutableRefObject<HTMLDivElement | null>).current = lastShimmer;\n setShimmerElement(lastShimmer);\n } else {\n // Fallback: use the last child element if shimmer selector doesn't work\n const children = wrapperRef.current?.children;\n if (children && children.length >= 3) {\n const lastChild = children[children.length - 1] as HTMLDivElement;\n // Check if it looks like a shimmer (has animate-pulse or gray backgrounds)\n const hasShimmer = lastChild.classList.contains('cm:animate-pulse') ||\n lastChild.querySelector('.cm\\\\:bg-gray-200') !== null;\n if (hasShimmer) {\n (shimmerRef as React.MutableRefObject<HTMLDivElement | null>).current = lastChild;\n setShimmerElement(lastChild);\n }\n }\n }\n }, 150);\n\n return () => clearTimeout(timeoutId);\n } else if (!hasMorePages) {\n (shimmerRef as React.MutableRefObject<HTMLDivElement | null>).current = null;\n setShimmerElement(null);\n }\n }, [wrapperRef, hasMorePages, isLoading, conversationItems]);\n\n // Wrapper for onIntersect that handles loading state\n const handleIntersect = useCallback(async () => {\n if (!isLoadingMore && hasMorePages && !isLoading) {\n setIsLoadingMore(true);\n try {\n await onIntersect();\n } finally {\n setIsLoadingMore(false);\n }\n }\n }, [isLoadingMore, hasMorePages, isLoading, onIntersect]);\n\n // Handle intersection observer for infinite scroll\n useIntersectionObserver({\n rootElement: scrollableElement || wrapperRef.current,\n sentinelElement: shimmerElement,\n onIntersect: handleIntersect,\n threshold,\n enabled: !isLoading && (!!scrollableElement || !!wrapperRef.current) && hasMorePages && !!shimmerElement,\n });\n\n // Fallback: Check if all content is visible and trigger pagination immediately\n useEffect(() => {\n if (!hasMorePages || isLoading || !shimmerElement || isLoadingMore) {\n return;\n }\n\n // Use scrollableElement if available, otherwise use wrapperRef\n const container = scrollableElement || wrapperRef.current;\n if (!container) {\n return;\n }\n\n // Check if the container is not actually scrollable (all content fits)\n const isNotScrollable = container.scrollHeight <= container.clientHeight;\n \n if (isNotScrollable) {\n // Check if shimmer element is visible (all content including shimmer fits in viewport)\n const shimmerRect = shimmerElement.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n \n // If shimmer is within the visible area, trigger pagination\n const isShimmerVisible = \n shimmerRect.top >= containerRect.top &&\n shimmerRect.bottom <= containerRect.bottom;\n \n if (isShimmerVisible) {\n // Small delay to avoid immediate trigger on mount and allow DOM to settle\n const timeoutId = setTimeout(() => {\n // Double-check conditions before triggering\n if (!isLoadingMore && hasMorePages && !isLoading) {\n handleIntersect();\n }\n }, 300);\n \n return () => clearTimeout(timeoutId);\n }\n }\n }, [scrollableElement, wrapperRef, shimmerElement, hasMorePages, isLoading, isLoadingMore, handleIntersect]);\n\n return {\n isLoadingMore,\n };\n}\n\n","import React, { useEffect, useMemo, useRef } from 'react';\nimport ConversationBox from '../ConversationBox';\nimport { ConversationBoxShimmer } from '../ConversationBox/ConversationBoxShimmer';\nimport Loader from '../Loader';\nimport NoDataFound from '../EmptyData/NoDataFound';\nimport NoConversationImage from '../../assets/no-conversation.svg';\nimport { useContactsStore } from '../../stores/contacts';\nimport { useCompaniesStore } from '../../stores/companies';\nimport {\n mapConversationToBoxProps,\n mapCompanyConversationToBoxProps,\n} from '../../utils/conversationMapper';\nimport { useConversationInfiniteScroll } from '../../hooks/useConversationInfiniteScroll';\n\nexport type ConversationListEntityType = 'contact' | 'company';\n\nexport interface ConversationListProps {\n /** Which entity's conversations to list; selects the store and mapper. */\n entityType: ConversationListEntityType;\n /** Contact id or company id. Nothing renders (empty list state) when absent. */\n entityId?: number;\n /**\n * Re-fetch trigger — pass the host conversation id so switching the open\n * conversation refreshes the list (mirrors the panels' previous behavior).\n */\n conversationId?: number;\n /**\n * Display name of the entity. Used as the sender-name fallback for contact\n * conversations and in the empty-state copy. Defaults to the panels'\n * previous fallbacks ('Unknown Contact' / 'Unknown Account').\n */\n entityName?: string;\n /** Optional class on the list root, for host-controlled spacing. */\n className?: string;\n}\n\n/**\n * Self-fetching conversation list shared by ContactPanel, AccountPanel, and\n * external hosts (e.g. the Vue sidebar's \"View all conversations\" takeovers).\n * Owns fetch + pagination (infinite scroll), loading shimmers, and the empty\n * state; renders ConversationBox cards. Clicks route through the render-config\n * `navigationEvent` callback inside ConversationBox.\n */\nconst ConversationList: React.FC<ConversationListProps> = ({\n entityType,\n entityId,\n conversationId,\n entityName,\n className,\n}) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const isContact = entityType === 'contact';\n\n // Both stores are subscribed unconditionally (rules of hooks); the active\n // one is selected by entityType below.\n const contacts = useContactsStore();\n const companies = useCompaniesStore();\n\n const contactData =\n isContact && entityId != null ? contacts.conversations[entityId] : undefined;\n const companyData =\n !isContact && entityId != null ? companies.conversations[entityId] : undefined;\n const conversationsData = isContact ? contactData : companyData;\n const isLoading =\n entityId != null\n ? ((isContact\n ? contacts.conversationsLoading[entityId]\n : companies.conversationsLoading[entityId]) ?? false)\n : false;\n\n const fetchConversations = isContact\n ? contacts.fetchContactConversations\n : companies.fetchCompanyConversations;\n const fetchNextPage = isContact\n ? contacts.fetchNextPageContactConversations\n : companies.fetchNextPageCompanyConversations;\n\n const displayName =\n entityName || (isContact ? 'Unknown Contact' : 'Unknown Account');\n\n // Fetch (first page) when the entity or the host conversation changes.\n useEffect(() => {\n if (entityId != null) {\n fetchConversations(entityId);\n }\n }, [entityId, conversationId, entityType, fetchConversations]);\n\n // Calculate if there are more pages to load\n const hasMorePages = useMemo(() => {\n if (!conversationsData || !conversationsData.results) return false;\n const { total_results, page_number, page_size } = conversationsData;\n return page_number * page_size < total_results;\n }, [conversationsData]);\n\n // Map API conversations to ConversationBox format\n const mappedConversations = useMemo(() => {\n if (isContact) {\n return (contactData?.results ?? [])\n .map(conversation => mapConversationToBoxProps(conversation, displayName))\n .filter((props): props is NonNullable<typeof props> => props !== null);\n }\n return (companyData?.results ?? [])\n .map(conversation => mapCompanyConversationToBoxProps(conversation))\n .filter((props): props is NonNullable<typeof props> => props !== null);\n }, [isContact, contactData, companyData, displayName]);\n\n // Create shimmer boxes when there are more pages\n const shimmerBoxes = useMemo(() => {\n if (!hasMorePages) return [];\n const firstConversation = mappedConversations[0];\n const type = firstConversation?.type || 'email';\n\n return Array.from({ length: 3 }, (_, index) => (\n <div key={`shimmer-${index}`} data-conversation-shimmer>\n <ConversationBoxShimmer size=\"small\" type={type} />\n </div>\n ));\n }, [hasMorePages, mappedConversations]);\n\n // Handle infinite scroll\n useConversationInfiniteScroll({\n wrapperRef,\n conversationItems: [...mappedConversations, ...shimmerBoxes],\n isLoading,\n hasMorePages,\n onIntersect: async () => {\n if (entityId != null && hasMorePages) {\n await fetchNextPage(entityId);\n }\n },\n threshold: 200,\n });\n\n if (isLoading && mappedConversations.length === 0) {\n return (\n <div className=\"cm:flex cm:items-center cm:justify-center cm:w-full cm:py-8\">\n <Loader />\n </div>\n );\n }\n\n if (mappedConversations.length === 0) {\n return (\n <div className=\"cm:flex-1 cm:min-h-0\">\n <NoDataFound\n title=\"No conversations yet\"\n description={`There are no conversations linked to ${displayName}.`}\n image={NoConversationImage}\n />\n </div>\n );\n }\n\n return (\n <div\n ref={wrapperRef}\n className={`cm:flex cm:flex-col cm:gap-2 cm:px-4${className ? ` ${className}` : ''}`}\n >\n {mappedConversations.map(conversation => (\n <ConversationBox\n key={conversation.conversationId}\n size=\"small\"\n {...conversation}\n />\n ))}\n {shimmerBoxes}\n </div>\n );\n};\n\nexport default ConversationList;\n","import Icon from '@/components/Icon';\n\n\nexport const textFieldIcon = () => <Icon name=\"field_input\" size={14} color=\"#334155\" />\nexport const dateFieldIcon = () => <Icon name=\"field_date\" size={14} color=\"#334155\" />\nexport const numberFieldIcon = () => <Icon name=\"field_number\" size={14} color=\"#334155\" />\nexport const urlFieldIcon = () => <Icon name=\"field_url\" size={14} color=\"#334155\" />\nexport const booleanFieldIcon = () => <Icon name=\"field_boolean\" size={14} color=\"#334155\" />\nexport const dropdownFieldIcon = () => <Icon name=\"field_dropdown\" size={14} color=\"#334155\" />\n","import {\n textFieldIcon,\n dateFieldIcon,\n numberFieldIcon,\n booleanFieldIcon,\n urlFieldIcon,\n dropdownFieldIcon\n} from './custom-field-icons';\n\nimport type { ReactElement } from 'react';\nimport type { CF_TYPE, CF_SOURCE_TYPE, ENTITY_TYPE, SCOPE, CF_FormState } from '@/types/custom-fields';\nimport type { FormFieldOption } from '@/types/form';\n\nexport const ENTITY_TYPES= {\n COMPANY: 'company',\n CONTACT: 'contact',\n} as const satisfies Record< Uppercase<ENTITY_TYPE>, ENTITY_TYPE>;\n\nexport const SCOPES: Record< Uppercase<SCOPE>, SCOPE> = {\n ACCOUNT: 'account',\n ALL: 'all',\n} as const;\n\nexport const CF_TYPES: Record< Uppercase<CF_TYPE>, CF_TYPE> = {\n TEXT: 'TEXT', \n NUMBER: 'NUMBER',\n DATE: 'DATE',\n URL: 'URL',\n DROPDOWN: 'DROPDOWN',\n CHIP: 'CHIP',\n BOOLEAN: 'BOOLEAN'\n} as const;\n\nexport const CF_SOURCES: Record< Uppercase<CF_SOURCE_TYPE>, CF_SOURCE_TYPE> = {\n HIVER: 'hiver',\n CONNECTOR: 'connector',\n} as const;\n\nexport type CFTypeOption = {\n label: string;\n value: CF_TYPE;\n getIcon: () => ReactElement;\n};\n\nexport const CF_TYPE_OPTIONS: CFTypeOption[] = [\n { label: 'Text', value: CF_TYPES.TEXT, getIcon: textFieldIcon },\n { label: 'Number', value: CF_TYPES.NUMBER, getIcon: numberFieldIcon },\n { label: 'Dropdown', value: CF_TYPES.DROPDOWN, getIcon: dropdownFieldIcon },\n { label: 'Date', value: CF_TYPES.DATE, getIcon: dateFieldIcon },\n { label: 'Url', value: CF_TYPES.URL, getIcon: urlFieldIcon },\n { label: 'Yes or no', value: CF_TYPES.BOOLEAN, getIcon: booleanFieldIcon },\n];\n\nexport const INIT_DATA: CF_FormState = {\n type: CF_TYPES.TEXT,\n dropdown_values: [],\n display_name: \"\",\n description: \"\",\n}\n\nexport const BOOLEAN_OPTIONS: FormFieldOption[] = [\n {label: 'Yes', value: true },\n {label: 'No', value: false },\n]","import React, { useEffect, useState, useCallback } from 'react';\nimport Icon from '../Icon';\nimport Avatar from '../Avatar';\nimport PrimaryContactsDialog from '../Contacts';\nimport EmptyState from '../EmptyState';\nimport Loader from '../Loader';\nimport ConversationList from '../ConversationList';\nimport TruncatedText from '../TruncatedText';\nimport { useContactsStore } from '../../stores/contacts';\nimport { GAINSIGHT_EVENTS } from '../../constants/gainsightEvents';\nimport { useRenderConfigStore } from '../../stores/renderConfig';\nimport { ENTITY_TYPES } from '@/constants/custom-fields';\n\nexport interface ContactInfo {\n name: string;\n email: string;\n phone: string;\n account: string;\n avatarColor?: string;\n}\n\nexport interface Conversation {\n id: string;\n type: 'chat' | 'email';\n status: 'open' | 'pending' | 'closed';\n senderName: string;\n timestamp: string;\n heading?: string;\n messagePreview: string;\n mailboxName?: string;\n assignedAgent?: {\n name: string;\n avatarColor?: string;\n };\n}\n\nexport interface ContactPanelProps {\n contact?: ContactInfo;\n conversations?: Conversation[];\n conversationId?: number;\n contactId?: number;\n conversationMembers: any;\n}\n\nconst ContactPanel: React.FC<ContactPanelProps> = ({\n conversationId,\n contactId: initialContactId,\n conversationMembers,\n}) => {\n // Use state to track current contactId so it can be updated when primary contact changes\n const [contactId, setContactId] = useState<number | undefined>(initialContactId);\n const [isHeaderHovered, setIsHeaderHovered] = useState(false);\n \n const {\n fetchContactSummary,\n summaries,\n summaryLoading\n } = useContactsStore();\n\n const callbacks = useRenderConfigStore((state) => state.callbacks);\n\n const summary = contactId ? summaries[contactId] : undefined;\n const summaryLoadingState = contactId ? summaryLoading[contactId] : false;\n\n // Update contactId when initialContactId prop changes\n useEffect(() => {\n setContactId(initialContactId);\n }, [initialContactId]);\n\n // Fetch contact summary when contactId or conversationId changes\n // (conversations are fetched by ConversationList)\n useEffect(() => {\n if (contactId) {\n callbacks?.sendGainsightEvent?.(GAINSIGHT_EVENTS.CUSTOMERS_TAB_RIGHT_PANEL);\n fetchContactSummary(contactId);\n }\n }, [contactId, conversationId, fetchContactSummary, callbacks]);\n\n // Use API data\n const contactName = summary?.name || 'Unknown Contact';\n const contactEmail = summary?.email || '';\n const contactPhone = summary?.phone_number || '';\n const accountName = summary?.company?.generated_name || summary?.company?.name || '';\n\n const customFieldsRefCb = useCallback((node:HTMLDivElement) => {\n if (!node|| !contactId) return;\n callbacks?.setCFPanelNode?.(node, { entityType:ENTITY_TYPES.CONTACT, entityId: contactId});\n }, [callbacks, contactId])\n\n // Show empty state if contactId doesn't exist\n if (!contactId) {\n return (\n <div className=\"cm:flex cm:flex-1 cm:flex-col cm:w-full cm:h-full cm:min-h-0 cm:overflow-hidden\" style={{ marginTop: '-40px' }}>\n <EmptyState\n title=\"No contact\"\n subcopy=\"There are no contacts info to display\"\n icon=\"hiver-bee\"\n contentClassName=\"\"\n />\n </div>\n );\n }\n\n // Show loader when loading summary\n if (summaryLoadingState) {\n return (\n <div className=\"cm:flex cm:items-center cm:justify-center cm:w-full cm:h-full\">\n <Loader />\n </div>\n );\n }\n\n return (\n <div className=\"cm:flex cm:flex-col cm:gap-3 cm:w-full cm:pb-6\">\n {/* Contact Header */}\n <div className=\"cm:flex cm:flex-col cm:gap-4 cm:px-4 cm:pt-6 cm:pb-5 cm:shrink-0\">\n {/* Avatar and Name */}\n\n <div \n className=\"cm:flex cm:items-center cm:justify-between cm:px-0 cm:rounded-[6px] cm:shrink-0\"\n onMouseEnter={() => setIsHeaderHovered(true)}\n onMouseLeave={() => setIsHeaderHovered(false)}\n >\n <div className=\"cm:flex cm:gap-3 cm:items-center\">\n <Avatar\n name={contactName}\n labelName={contactName}\n size=\"large\"\n />\n\n <h3 className=\"cm:text-base cm:font-medium cm:text-slate-text-title cm:leading-5\">\n {contactName}\n </h3>\n </div>\n {/* <EditContact /> */}\n \n <PrimaryContactsDialog \n conversationId={conversationId} \n isHovered={isHeaderHovered}\n conversationMembers={conversationMembers}\n contactId={contactId}\n onSuccess={(newContactId) => {\n // Update contactId to trigger re-render and fetch new conversation data\n if (newContactId) {\n setContactId(newContactId);\n }\n }}\n />\n \n </div>\n\n {/* Contact Details */}\n <div className=\"cm:flex cm:flex-col cm:gap-1\">\n {/* Email */}\n {contactEmail && (\n <ContactDetailRow\n icon=\"at_the_rate\"\n label=\"Email\"\n value={contactEmail}\n />\n )}\n\n {/* Phone */}\n {contactPhone && (\n <ContactDetailRow\n icon=\"phone\"\n label=\"Phone\"\n value={contactPhone}\n />\n )}\n\n {/* Account */}\n {accountName && (\n <ContactDetailRow\n icon=\"accounts\"\n label=\"Account\"\n value={accountName}\n />\n )}\n\n <div id=\"custom-fields-contact\" ref={customFieldsRefCb}></div>\n </div>\n </div>\n\n {/* Divider */}\n <div className=\"cm:h-px cm:bg-slate-border-light cm:shrink-0\" />\n\n {/* Conversations Section */}\n <div className=\"cm:flex cm:flex-col cm:gap-3\">\n <h4 className=\"cm:text-sm cm:font-medium cm:text-slate-text-title cm:leading-5 cm:text-left cm:px-4 cm:shrink-0\">\n Conversations with {contactName}\n </h4>\n\n {/* Conversations List */}\n <ConversationList\n entityType=\"contact\"\n entityId={contactId}\n conversationId={conversationId}\n entityName={contactName}\n />\n </div>\n </div>\n );\n};\n\ninterface ContactDetailRowProps {\n icon: string;\n label: string;\n value: string;\n}\n\nconst ContactDetailRow: React.FC<ContactDetailRowProps> = ({ icon, label, value }) => {\n return (\n <div className=\"cm:flex cm:gap-3 cm:items-center cm:h-[38px]\">\n <div className=\"cm:flex cm:gap-2 cm:items-center cm:shrink-0 cm:w-27\">\n <Icon name={icon} size={14} color=\"#64758b\" />\n <span className=\"cm:text-sm cm:text-slate-text-subtle cm:leading-5\">\n {label}\n </span>\n </div>\n <TruncatedText\n text={value}\n className=\"cm:text-sm cm:text-slate-text-body cm:leading-5 cm:truncate\"\n />\n </div>\n );\n};\n\nexport default ContactPanel;\n","import React, { useEffect, useCallback } from 'react';\nimport Icon from '../Icon';\nimport EmptyState from '../EmptyState';\nimport Loader from '../Loader';\nimport ConversationList from '../ConversationList';\nimport TruncatedText from '../TruncatedText';\nimport { useCompaniesStore } from '../../stores/companies';\nimport { useRenderConfigStore } from '../../stores/renderConfig';\nimport { GAINSIGHT_EVENTS } from '../../constants/gainsightEvents';\nimport { ENTITY_TYPES } from '@/constants/custom-fields';\n\nexport interface AccountInfo {\n name: string;\n domain: string;\n contactCount: number;\n}\n\nexport interface Conversation {\n id: string;\n type: 'chat' | 'email';\n status: 'open' | 'pending' | 'closed';\n senderName: string;\n timestamp: string;\n heading?: string;\n messagePreview: string;\n mailboxName?: string;\n assignedAgent?: {\n name: string;\n avatarColor?: string;\n };\n}\n\nexport interface AccountPanelProps {\n account?: AccountInfo;\n conversations?: Conversation[];\n accountId?: number;\n conversationId?: number;\n}\n\nconst AccountPanel: React.FC<AccountPanelProps> = ({\n accountId,\n conversationId,\n}) => {\n const fetchCompanySummary = useCompaniesStore((state) => state.fetchCompanySummary);\n const summary = useCompaniesStore((state) =>\n accountId ? state.summaries[accountId] : undefined\n );\n const summaryLoading = useCompaniesStore((state) =>\n accountId ? state.summaryLoading[accountId] : false\n );\n const { callbacks } = useRenderConfigStore();\n\n // Fetch company summary when accountId or conversationId changes\n // (conversations are fetched by ConversationList)\n useEffect(() => {\n if (accountId) {\n fetchCompanySummary(accountId);\n // Send Gainsight event for AccountsTabRightPanel\n if (callbacks?.sendGainsightEvent) {\n callbacks.sendGainsightEvent(GAINSIGHT_EVENTS.ACCOUNTS_TAB_RIGHT_PANEL);\n }\n }\n }, [accountId, conversationId, fetchCompanySummary, callbacks]);\n\n // Use API data\n const accountName = summary?.generated_name || summary?.name || 'Unknown Account';\n const domain = summary?.domains?.[0]?.name || summary?.generated_name || '';\n const contactCount = summary?.contact_count ?? 0;\n\n const customFieldsRefCb = useCallback((node:HTMLDivElement) => {\n if (!node || !accountId ) return;\n callbacks?.setCFPanelNode?.(node, { entityType: ENTITY_TYPES.COMPANY, entityId: accountId });\n }, [callbacks, accountId])\n\n // Show loader when loading summary\n if (summaryLoading) {\n return (\n <div className=\"cm:flex cm:items-center cm:justify-center cm:w-full cm:h-full\">\n <Loader />\n </div>\n );\n }\n\n // Show empty state when not loading and no summary\n if (!summary) {\n return (\n <div className=\"cm:flex cm:flex-1 cm:flex-col cm:w-full cm:h-full cm:min-h-0 cm:overflow-hidden\" style={{ marginTop: '-40px' }}>\n <EmptyState\n title=\"No account\"\n subcopy=\"There are no accounts info to display\"\n icon=\"hiver-bee\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"cm:flex cm:flex-col cm:gap-3 cm:w-full cm:pb-6\">\n {/* Account Header */}\n <div className=\"cm:flex cm:flex-col cm:gap-4 cm:px-4 cm:pt-6 cm:pb-4 cm:shrink-0\">\n {/* Icon and Account Name */}\n <div className=\"cm:flex cm:gap-3 cm:items-center\">\n <div className=\"cm:w-7 cm:h-7 cm:rounded-full cm:flex cm:items-center cm:justify-center cm:shrink-0 cm:bg-slate-100\">\n <Icon name=\"buildings\" size={14} color=\"#94A3B8\" />\n </div>\n <h3 className=\"cm:text-base cm:font-medium cm:text-slate-text-title cm:leading-5\">\n {accountName}\n </h3>\n </div>\n\n {/* Account Details */}\n <div className=\"cm:flex cm:flex-col cm:gap-1\">\n {/* Domain */}\n {domain && (\n <AccountDetailRow\n icon=\"domain\"\n label=\"Domain\"\n value={domain}\n />\n )}\n\n {/* Contact Count */}\n <AccountDetailRow\n icon=\"contacts\"\n label=\"Contact\"\n value={String(contactCount)}\n />\n\n <div id=\"custom-fields-account\" ref={customFieldsRefCb}></div>\n </div>\n </div>\n\n {/* Divider */}\n <div className=\"cm:h-px cm:bg-slate-border-light cm:shrink-0\" />\n\n {/* Conversations Section */}\n <div className=\"cm:flex cm:flex-col cm:gap-3\">\n <h4 className=\"cm:px-4 cm:text-sm cm:font-medium cm:text-slate-text-title cm:leading-5 cm:text-left cm:shrink-0\">\n Conversations from {accountName}\n </h4>\n\n {/* Conversations List */}\n <ConversationList\n entityType=\"company\"\n entityId={accountId}\n conversationId={conversationId}\n entityName={accountName}\n />\n </div>\n </div>\n );\n};\n\ninterface AccountDetailRowProps {\n icon: string;\n label: string;\n value: string;\n}\n\nconst AccountDetailRow: React.FC<AccountDetailRowProps> = ({ icon, label, value }) => {\n return (\n <div className=\"cm:flex cm:gap-3 cm:items-center cm:h-[38px]\">\n <div className=\"cm:flex cm:gap-2 cm:items-center cm:min-w-[90px] cm:shrink-0 cm:w-27\">\n <Icon name={icon} size={14} color=\"#64758b\" />\n <span className=\"cm:text-sm cm:text-slate-text-subtle cm:leading-5\">\n {label}\n </span>\n </div>\n <TruncatedText\n text={value}\n className=\"cm:text-sm cm:text-slate-text-body cm:leading-5 cm:truncate\"\n />\n </div>\n );\n};\n\nexport default AccountPanel;\n","import { useMemo, useState, useEffect } from 'react';\nimport { Tabs } from 'hiver-ui-kit-extended';\nimport ContactPanel from './ContactPanel';\nimport AccountPanel from './AccountPanel';\nimport { useRenderConfigStore } from '@/stores/renderConfig';\nimport './styles.css';\n\ninterface RightPanelProps {\n className?: string;\n companyId?: string;\n contactId?: string;\n conversationId?: number;\n conversationMembers: any;\n}\n\nconst RightPanel = ({ className, companyId, contactId, conversationId, conversationMembers }: RightPanelProps) => {\n const isDark = useRenderConfigStore((state) => state.theme === 'dark');\n\n return (\n <div className={`cm-right-panel cm:flex cm:flex-col cm:h-full cm:bg-slate-surface-white [&_.p-tabview-panels]:p-0 ${isDark ? 'cm-right-panel--dark' : ''} ${className || ''}`}>\n <ContactsTabs accountId={companyId} contactId={contactId} conversationId={conversationId} conversationMembers={conversationMembers}/>\n </div>\n );\n};\n\nexport default RightPanel;\n\ninterface ContactsTabsProps {\n accountId?: string;\n contactId?: string;\n conversationId?: number;\n conversationMembers: any;\n}\n\nconst ContactsTabs = ({ accountId, contactId, conversationId, conversationMembers }: ContactsTabsProps) => {\n const [activeTab, setActiveTab] = useState<number>(0);\n\n // Reset active tab to 0 when conversationId changes\n useEffect(() => {\n if (conversationId && (accountId || contactId)) {\n setActiveTab(0);\n }\n }, [accountId, contactId, conversationId]);\n\n // Always build both tabs\n const tabItems = useMemo(() => {\n const contactIdNum = contactId ? parseInt(contactId, 10) : undefined;\n const accountIdNum = accountId ? parseInt(accountId, 10) : undefined;\n \n return [\n {\n label: 'Contact',\n content: (\n <ContactPanel\n conversationId={conversationId}\n contactId={contactIdNum && !isNaN(contactIdNum) ? contactIdNum : undefined}\n conversationMembers={conversationMembers}\n />\n ),\n },\n {\n label: 'Account',\n content: (\n <AccountPanel\n accountId={accountIdNum && !isNaN(accountIdNum) ? accountIdNum : undefined}\n conversationId={conversationId}\n />\n ),\n },\n ];\n }, [accountId, contactId, conversationId, conversationMembers]);\n\n return (\n <div className=\"cm:flex cm:flex-col cm:flex-1 cm:min-h-0 [&_.p-tabview-panels]:p-0\">\n <style>{`\n .cm-root .p-tabview-nav {\n padding-left: 16px !important;\n gap: 16px !important;\n }\n .cm-root .p-tabview-nav-link {\n padding: 12px !important;\n height: 44px !important;\n box-sizing: border-box !important;\n }\n .cm-root .p-tabview {\n display: flex !important;\n flex-direction: column !important;\n flex: 1 !important;\n min-height: 0 !important;\n }\n .cm-root .p-tabview-panels {\n flex: 1 !important;\n min-height: 0 !important;\n overflow-y: auto !important;\n display: flex !important;\n flex-direction: column !important;\n }\n .cm-root .p-tabview-panel {\n flex: 1 !important;\n min-height: 0 !important;\n display: flex !important;\n flex-direction: column !important;\n height: 100% !important;\n }\n `}</style>\n <Tabs\n value={activeTab}\n onTabChange={(e: { index: number }) => setActiveTab(e.index)}\n items={tabItems}\n className=\"cm:flex cm:flex-col cm:flex-1 cm:min-h-0\"\n />\n </div>\n );\n};\n","import { useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useRenderConfigStore } from '@/stores/renderConfig';\n\nconst globalMountStyle = {\n position: 'fixed',\n inset: '0',\n zIndex: '9999',\n pointerEvents: 'none',\n} as const;\n\nexport const GlobalMount = () => {\n\n const setMeta = useRenderConfigStore((state) => state.setMeta);\n const theme = useRenderConfigStore((state) => state.theme);\n\n const refCallback = useCallback((node: HTMLDivElement | null) => {\n if (!node)return;\n setMeta({ globalMountElement: node });\n }, [setMeta]);\n\n // Overlays (dropdowns, tooltips, dialogs) portal into this node, which is\n // attached to document.body — outside the main root. It also carries the\n // `cm-root` scope class, so it must mirror the dark scope class too.\n const children = (\n <div\n ref={refCallback}\n className={theme === 'dark' ? 'cm-root cm-dark' : 'cm-root'}\n style={globalMountStyle}\n ></div>\n )\n\n const root = document?.body || null;\n if (!root) return null;\n return createPortal(children, root);\n}","import type { FeedbackReasonCode, HealthFactor } from '@/types/insights';\n\ninterface HealthFactorMeta {\n /** Icon name resolved by the shared <Icon> component. */\n icon: string;\n /** Asset subfolder for the icon ('' = src/assets root). */\n folder: string;\n /** Metric-row title (matches the row labels in Figma 5778-1718). */\n title: string;\n /** Title in the \"What affects health score\" popover (differs for some). */\n infoTitle: string;\n /** Copy shown in the info popover. */\n description: string;\n}\n\n/**\n * FE-owned factor → display mapping (locked: backend sends only the enum).\n * Popover copy and glyphs per the approved info-popover design (2026-07-17).\n */\nexport const HEALTH_FACTOR_META: Record<HealthFactor, HealthFactorMeta> = {\n sentiment: {\n icon: 'account_sentiment',\n folder: '',\n title: 'Account sentiment',\n infoTitle: 'Account sentiment',\n description:\n 'Overall sentiment detected from the tone of recent conversations.',\n },\n conversation_volume: {\n icon: 'factor_ticket',\n folder: 'insights',\n title: 'Conversation volume',\n infoTitle: 'Conversation volume',\n description:\n 'Unusual increases compared to the previous 30-day average volume.',\n },\n query_type: {\n icon: 'factor_query',\n folder: 'insights',\n title: 'Query Type',\n infoTitle: 'Query Type',\n description: 'Ratio of bug reports vs. general how-to queries',\n },\n friction: {\n // Updated icon (2026-08-14) — lives at src/assets root, hence folder ''.\n icon: 'account_friction',\n folder: '',\n title: 'Replies to resolution',\n infoTitle: 'Replies to resolution',\n description:\n 'Number of replies before resolution and how often conversations are reopened.',\n },\n sla: {\n icon: 'factor_sla',\n folder: 'insights',\n title: 'SLA Performance',\n infoTitle: 'SLA',\n description:\n 'Breaches of first response, next response, or resolution policies.',\n },\n csat: {\n icon: 'factor_csat',\n folder: 'insights',\n title: 'CSAT',\n infoTitle: 'CSAT',\n description:\n 'Average customer satisfaction rating across recent conversations.',\n },\n escalation_rate: {\n icon: 'factor_escalation',\n folder: 'insights',\n title: 'Escalation Rate',\n infoTitle: 'Escalation Rate',\n description: 'Tickets escalated to senior support vs. account baseline',\n },\n};\n\n/** Popover list order (per the approved design, not the enum order). */\nexport const HEALTH_INFO_FACTOR_ORDER: HealthFactor[] = [\n 'sentiment',\n 'conversation_volume',\n 'friction',\n 'sla',\n 'csat',\n];\n\n\nexport const FEEDBACK_REASONS: Array<{\n code: FeedbackReasonCode;\n label: string;\n}> = [\n { code: 'incorrect_data', label: 'Conversations flagged' },\n { code: 'missing_signals', label: 'Signals identified' },\n { code: 'other', label: 'Other' },\n];\n\n\nexport const HEALTH_STATUS_CHIP: Record<\n string,\n { label: string; className: string; withIcon?: boolean }\n> = {\n at_risk: {\n label: 'At Risk',\n className: 'cm:bg-pastelred-surface-subtle cm:text-pastelred-text-body',\n withIcon: true,\n },\n indifferent: {\n label: 'Indifferent',\n className: 'cm:bg-slate-100 cm:text-slate-text-subtle',\n },\n healthy: {\n label: 'Healthy',\n className: 'cm:bg-green-50 cm:text-green-700',\n },\n};\n\n\n/** Sentiment period-selector options (days) — locked contract enum. */\nexport const SENTIMENT_WINDOW_OPTIONS = [7, 14, 30, 60, 90] as const;\n\nexport const DEFAULT_SENTIMENT_WINDOW = 90;\n\n/**\n * FE-owned sentiment label → color mapping (labels arrive display-cased from\n * the BE, e.g. \"Negative\"). Only Negative appears in the Figma frames; the\n * Positive/Neutral tones follow the app's success/slate scales.\n */\nexport const SENTIMENT_LABEL_COLORS: Record<string, string> = {\n negative: '#B81717',\n positive: '#1B6F41',\n neutral: '#64758B',\n};\n\nexport const SENTIMENT_LABEL_FALLBACK_COLOR = '#334155';\n\nexport const HEALTH_INFO_TITLE = 'What affects health score';\n\nexport const HEALTH_INFO_INTRO =\n 'Insights are based on conversations with this account from the last 90 days.';\n","import { apiClient } from './axios';\nimport { ENDPOINTS } from '@/constants/endpoints';\nimport type { ApiResponse } from '@/types/api';\nimport type {\n InsightsDetailedResponse,\n InsightBand,\n DetailedInsightsApiData,\n HealthFeedback,\n PostHealthFeedbackBody,\n SignalConversationsPage,\n SignalConversationsParams,\n SignalType,\n} from '@/types/insights';\n\nconst insightsUrl = (companyId: number) =>\n ENDPOINTS.INSIGHTS_DETAILED.replace(':company_id', String(companyId));\n\nconst capitalize = (value?: string) =>\n value ? value.charAt(0).toUpperCase() + value.slice(1) : '';\n\n/**\n * Reshape the raw detailed-insights payload (`DetailedInsightsApiData`, the\n * shape the backend serves and mocks are authored in) into the nested\n * `InsightsDetailedResponse` the components read:\n * - `sentiment`/`health` move from siblings of `insights` to nested inside it;\n * - band arrives as `status`; sentiment trend as `trend: { window_days, points }`.\n */\nconst normalizeDetailed = (\n raw?: DetailedInsightsApiData | null\n): InsightsDetailedResponse => {\n if (!raw || !raw.insights) {\n return {\n company_id: raw?.company_id ?? 0,\n insights: null,\n insufficient_data: raw?.insufficient_data ?? false,\n };\n }\n\n // status 'insufficient_data' means no computable sentiment — treat as\n // absent so the Sentiment section renders nowhere (drawer + CM tab).\n const sentiment = raw.sentiment && raw.sentiment.status !== 'insufficient_data'\n ? {\n // `score` is only used for the trend-arrow direction; the signed\n // trend points carry that sign. Magnitude lives in `window.points`.\n score: raw.sentiment.trend?.points ?? 0,\n label: capitalize(raw.sentiment.status),\n summary: raw.sentiment.summary ?? '',\n summary_status: raw.sentiment.summary_status,\n window: {\n // The period-selector value is driven by the ROOT `window` (the\n // selected filter), NOT `trend.window_days` (the trend measurement\n // window, e.g. 14). Only `points` comes from the trend.\n days: raw.window ?? 90,\n points: Math.abs(raw.sentiment.trend?.points ?? 0),\n },\n period: raw.sentiment.trend?.period,\n }\n : undefined;\n\n const health = raw.health\n ? {\n score: 0,\n label: raw.health.status ?? '',\n summary: raw.health.summary ?? '',\n status: raw.health.status,\n contributors: raw.health.contributors ?? [],\n }\n : undefined;\n\n return {\n company_id: raw.company_id,\n insufficient_data: raw.insufficient_data ?? false,\n insights: {\n band: (raw.insights.status ?? 'indifferent') as InsightBand,\n summary: raw.insights.summary ?? '',\n action: raw.insights.action ?? '',\n sentiment,\n health,\n },\n };\n};\n\nconst feedbackUrl = (companyId: number) =>\n ENDPOINTS.INSIGHTS_HEALTH_FEEDBACK.replace(':company_id', String(companyId));\n\n/**\n * Get detailed account insights (health + sentiment) for a company.\n * Screen 2 of Customer Intelligence — fetched lazily on drawer open.\n * `windowDays` (7|14|30|60|90) drives the sentiment period-selector refetch;\n * the response carries the full payload but callers consume only the\n * sentiment section from a window refetch (locked spec).\n */\nexport const getDetailedInsights = async (\n companyId: number,\n windowDays?: number\n): Promise<ApiResponse<InsightsDetailedResponse>> => {\n const response = await apiClient.get<ApiResponse<DetailedInsightsApiData>>(\n insightsUrl(companyId),\n { params: windowDays ? { window: windowDays } : undefined }\n );\n // Reshape the raw API payload into the nested shape the components read.\n return { ...response.data, data: normalizeDetailed(response.data?.data) };\n};\n\n/**\n * Get the paginated email conversations behind a signal — a health\n * contributor (`?factor=`) or the sentiment drop (`?window=`). Screen 3.\n */\nexport const getSignalConversations = async (\n companyId: number,\n type: SignalType,\n params: SignalConversationsParams\n): Promise<ApiResponse<SignalConversationsPage>> => {\n const pageSize = params.page_size ?? 10;\n const url = ENDPOINTS.INSIGHTS_SIGNAL_CONVERSATIONS.replace(\n ':company_id',\n String(companyId)\n ).replace(':type', type);\n const response = await apiClient.get<ApiResponse<SignalConversationsPage>>(\n url,\n {\n params: {\n page_number: params.page_number,\n page_size: pageSize,\n ...(type === 'health' ? { factor: params.factor } : {}),\n ...(type === 'sentiment' ? { window: params.window } : {}),\n },\n }\n );\n return response.data;\n};\n\n/**\n * Get the user's remembered health-score feedback vote for a company.\n */\nexport const getHealthFeedback = async (\n companyId: number\n): Promise<ApiResponse<HealthFeedback>> => {\n const response = await apiClient.get<ApiResponse<HealthFeedback>>(\n feedbackUrl(companyId)\n );\n return response.data;\n};\n\n/**\n * Submit a health-score feedback vote. `reason_code` is required for -1;\n * `vote: 0` retracts the current vote.\n */\nexport const postHealthFeedback = async (\n companyId: number,\n body: PostHealthFeedbackBody\n): Promise<ApiResponse<HealthFeedback>> => {\n const response = await apiClient.post<ApiResponse<HealthFeedback>>(\n feedbackUrl(companyId),\n body\n );\n return response.data;\n};\n","import { create } from 'zustand';\nimport { DEFAULT_SENTIMENT_WINDOW } from '../features/account-insights/constants';\nimport {\n getDetailedInsights,\n getHealthFeedback,\n postHealthFeedback,\n} from '../services/insights';\nimport type {\n DetailedInsights,\n HealthFactor,\n HealthFeedback,\n PostHealthFeedbackBody,\n SentimentInsights,\n SignalType,\n} from '../types/insights';\n\n/** Parameters of the currently-open Screen-3 signal-conversations modal. */\nexport interface SignalModalParams {\n type: SignalType;\n /** Clicked contributor's factor — forwarded verbatim (health only). */\n factor?: HealthFactor;\n /** Currently-selected sentiment window (sentiment only). */\n window?: number;\n title: string;\n subtitle?: string;\n /**\n * Which host mounted `CustomerIntelligencePanel` — carried through to the\n * modal purely for the `CustomerIntelligenceInsightsSignalDrilldownOpened`\n * analytics event. Set by the row that opened the modal, not derived here.\n */\n surface?: 'right_panel' | 'customer_module';\n}\n\n/**\n * Customer Intelligence drawer data. Detailed insights are re-fetched on every\n * drawer open and each sentiment-window selection always hits the API (no\n * cache-skip — the FE should reflect live backend data). Only in-flight guards\n * remain, to stop a single action from firing duplicate concurrent requests.\n * Writes are keyed by company id so responses can't cross-contaminate on\n * company switches.\n */\ninterface InsightsState {\n detailed: Record<number, DetailedInsights>;\n detailedLoading: Record<number, boolean>;\n detailedErrors: Record<number, boolean>;\n /** BE `insufficient_data` flag — the account lacks enough activity for insights. */\n detailedInsufficient: Record<number, boolean>;\n /** Latest sentiment per company per window (`?window=` always refetches). */\n sentimentByWindow: Record<number, Record<number, SentimentInsights>>;\n sentimentLoading: Record<number, boolean>;\n /**\n * Period-dropdown selection per company. Lives here (not component state)\n * so the CM tab's panel-bottom signal link and the section's dropdown agree\n * on the active window.\n */\n selectedWindows: Record<number, number>;\n setSelectedWindow: (companyId: number, days: number) => void;\n feedback: Record<number, HealthFeedback>;\n feedbackSubmitting: Record<number, boolean>;\n /** Screen-3 modal — non-null while open. */\n signalModal: SignalModalParams | null;\n openSignalModal: (params: SignalModalParams) => void;\n closeSignalModal: () => void;\n fetchInsights: (companyId: number) => Promise<void>;\n /** Window fetch — always hits the API, updates ONLY the sentiment section. */\n fetchSentimentWindow: (companyId: number, days: number) => Promise<boolean>;\n fetchFeedback: (companyId: number) => Promise<void>;\n submitFeedback: (\n companyId: number,\n body: PostHealthFeedbackBody\n ) => Promise<boolean>;\n}\n\nexport const useInsightsStore = create<InsightsState>((set, get) => ({\n detailed: {},\n detailedLoading: {},\n detailedErrors: {},\n detailedInsufficient: {},\n sentimentByWindow: {},\n sentimentLoading: {},\n selectedWindows: {},\n feedback: {},\n feedbackSubmitting: {},\n signalModal: null,\n\n setSelectedWindow: (companyId, days) =>\n set((state) => ({\n selectedWindows: { ...state.selectedWindows, [companyId]: days },\n })),\n\n openSignalModal: (params) => set({ signalModal: params }),\n closeSignalModal: () => set({ signalModal: null }),\n\n fetchInsights: async (companyId) => {\n if (get().detailedLoading[companyId]) {\n return; // in flight — don't fire a duplicate concurrent request\n }\n set((state) => ({\n detailedLoading: { ...state.detailedLoading, [companyId]: true },\n detailedErrors: { ...state.detailedErrors, [companyId]: false },\n }));\n try {\n const response = await getDetailedInsights(\n companyId,\n DEFAULT_SENTIMENT_WINDOW\n );\n const insights = response.data?.insights;\n const insufficient = response.data?.insufficient_data ?? false;\n set((state) => ({\n detailed: insights\n ? { ...state.detailed, [companyId]: insights }\n : state.detailed,\n detailedInsufficient: {\n ...state.detailedInsufficient,\n [companyId]: insufficient,\n },\n // Seed the default-window sentiment so the section shows the freshly\n // fetched value immediately on (re)open. Selecting any window — incl.\n // this one — still re-hits the API (see fetchSentimentWindow).\n sentimentByWindow: insights?.sentiment?.window?.days\n ? {\n ...state.sentimentByWindow,\n [companyId]: {\n ...state.sentimentByWindow[companyId],\n [insights.sentiment.window.days]: insights.sentiment,\n },\n }\n : state.sentimentByWindow,\n // Insufficient data is a VALID state (BE may send insights: null with\n // the flag) — it must render the empty state, not the error path.\n detailedErrors: {\n ...state.detailedErrors,\n [companyId]: !insights && !insufficient,\n },\n detailedLoading: { ...state.detailedLoading, [companyId]: false },\n }));\n } catch {\n // Silent per spec: GET errors render nothing.\n set((state) => ({\n detailedErrors: { ...state.detailedErrors, [companyId]: true },\n detailedLoading: { ...state.detailedLoading, [companyId]: false },\n }));\n }\n },\n\n fetchSentimentWindow: async (companyId, days) => {\n if (get().sentimentLoading[companyId]) {\n return false; // a window fetch is already in flight\n }\n set((state) => ({\n sentimentLoading: { ...state.sentimentLoading, [companyId]: true },\n }));\n try {\n const response = await getDetailedInsights(companyId, days);\n const sentiment = response.data?.insights?.sentiment;\n set((state) => ({\n sentimentByWindow: sentiment\n ? {\n ...state.sentimentByWindow,\n [companyId]: {\n ...state.sentimentByWindow[companyId],\n [days]: sentiment,\n },\n }\n : state.sentimentByWindow,\n sentimentLoading: { ...state.sentimentLoading, [companyId]: false },\n }));\n return Boolean(sentiment);\n } catch {\n set((state) => ({\n sentimentLoading: { ...state.sentimentLoading, [companyId]: false },\n }));\n return false;\n }\n },\n\n fetchFeedback: async (companyId) => {\n if (get().feedback[companyId]) {\n return;\n }\n try {\n const response = await getHealthFeedback(companyId);\n set((state) => ({\n feedback: { ...state.feedback, [companyId]: response.data },\n }));\n } catch {\n // No remembered vote is a fine default; thumbs render unselected.\n set((state) => ({\n feedback: {\n ...state.feedback,\n [companyId]: { vote: 0, reason_code: null, reason_text: null, at: null },\n },\n }));\n }\n },\n\n submitFeedback: async (companyId, body) => {\n if (get().feedbackSubmitting[companyId]) {\n return false;\n }\n const previous = get().feedback[companyId];\n // Reflect the user's choice immediately — the real POST returns a bare\n // success without echoing the vote, so we can't wait for the response to\n // drive the thumb state.\n const optimistic: HealthFeedback = {\n vote: body.vote,\n reason_code: body.vote === -1 ? (body.reason_code ?? null) : null,\n reason_text: body.vote === -1 ? (body.reason_text ?? null) : null,\n at: body.vote === 0 ? null : new Date().toISOString(),\n };\n set((state) => ({\n feedback: { ...state.feedback, [companyId]: optimistic },\n feedbackSubmitting: { ...state.feedbackSubmitting, [companyId]: true },\n }));\n try {\n const response = await postHealthFeedback(companyId, body);\n const returned = response?.data;\n set((state) => ({\n // Trust the server echo only if it carries a vote; otherwise keep the\n // optimistic value.\n feedback: {\n ...state.feedback,\n [companyId]:\n returned && typeof returned.vote === 'number' ? returned : optimistic,\n },\n feedbackSubmitting: { ...state.feedbackSubmitting, [companyId]: false },\n }));\n return true;\n } catch {\n // Revert to the previous vote on failure (the component also toasts).\n const reverted: HealthFeedback = previous ?? {\n vote: 0,\n reason_code: null,\n reason_text: null,\n at: null,\n };\n set((state) => ({\n feedback: { ...state.feedback, [companyId]: reverted },\n feedbackSubmitting: { ...state.feedbackSubmitting, [companyId]: false },\n }));\n return false;\n }\n },\n}));\n","import Icon from '@/components/Icon';\nimport { useInsightsStore } from '@/stores/insights';\nimport { HEALTH_FACTOR_META } from '../constants';\nimport type { HealthContributor } from '@/types/insights';\n\ninterface HealthContributorRowProps {\n contributor: HealthContributor;\n /** Forwarded to the opened signal modal — analytics only. */\n surface?: 'right_panel' | 'customer_module';\n}\n\n/**\n * One metric row: factor icon + title + summary. The `summary_links[0].text`\n * substring of the summary renders as a blue link.\n */\nexport const HealthContributorRow = ({\n contributor,\n surface,\n}: HealthContributorRowProps) => {\n const openSignalModal = useInsightsStore((state) => state.openSignalModal);\n const meta = HEALTH_FACTOR_META[contributor.factor];\n if (!meta) return null;\n\n const { summary } = contributor;\n // The clickable substring comes from the first summary link's `text`\n // (the `link` key is intentionally not consumed — the modal opens by factor).\n const highlight = contributor.summary_links?.[0]?.text;\n const highlightIndex = highlight ? summary.indexOf(highlight) : -1;\n\n return (\n <div className=\"cm:flex cm:w-full cm:items-start cm:gap-3\">\n <span className=\"cm:flex cm:size-6 cm:shrink-0 cm:items-center cm:justify-center cm:rounded-[4.8px]\">\n <Icon name={meta.icon} folder={meta.folder} size={14} color=\"#64758B\" />\n </span>\n <div className=\"cm:flex cm:min-w-0 cm:flex-1 cm:flex-col cm:gap-0.5\">\n <p className=\"cm:text-[13px] cm:leading-[18px] cm:font-medium cm:text-slate-text-body\">\n {meta.title}\n </p>\n <p className=\"cm:text-[13px] cm:leading-[19px] cm:text-slate-text-subtle cm:break-words\">\n {highlight && highlightIndex !== -1 ? (\n <>\n {summary.slice(0, highlightIndex)}\n <button\n type=\"button\"\n className=\"cm:cursor-pointer cm:border-0 cm:bg-transparent cm:p-0 cm:text-[13px] cm:leading-[19px] cm:text-[#0F53D2]\"\n onClick={() =>\n // Screen-3 modal; the row's factor is the signal id.\n openSignalModal({\n type: 'health',\n factor: contributor.factor,\n title: meta.title,\n subtitle: contributor.summary,\n surface,\n })\n }\n >\n {highlight}\n </button>\n {summary.slice(highlightIndex + highlight.length)}\n </>\n ) : (\n summary\n )}\n </p>\n </div>\n </div>\n );\n};\n","import { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport Icon from '@/components/Icon';\nimport { useRenderConfigStore } from '@/stores/renderConfig';\nimport {\n HEALTH_FACTOR_META,\n HEALTH_INFO_FACTOR_ORDER,\n HEALTH_INFO_TITLE,\n HEALTH_INFO_INTRO,\n} from '../constants';\n\nconst PANEL_WIDTH = 260;\nconst VIEWPORT_GUTTER = 12;\n\n/**\n * Info icon + click-toggled \"What affects health score\" popover. Static FE\n * content (locked spec; copy/layout per the approved design, 2026-07-17).\n * Portals into the GlobalMount layer so it isn't clipped by the sidebar's\n * overflow container; the layer is pointer-events none, so the panel\n * re-enables them on itself.\n */\nexport const HealthInfoPopover = () => {\n const [open, setOpen] = useState(false);\n const [position, setPosition] = useState({ top: 0, left: 0 });\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const globalMountElement = useRenderConfigStore(\n (state) => state.meta.globalMountElement\n );\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n panelRef.current?.contains(target) ||\n triggerRef.current?.contains(target)\n ) {\n return;\n }\n setOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false);\n };\n document.addEventListener('mousedown', onPointerDown);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('mousedown', onPointerDown);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n const toggle = () => {\n if (!open && triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n const left = Math.max(\n VIEWPORT_GUTTER,\n Math.min(rect.left, window.innerWidth - PANEL_WIDTH - VIEWPORT_GUTTER)\n );\n setPosition({ top: rect.bottom + 8, left });\n }\n setOpen((value) => !value);\n };\n\n return (\n <>\n <button\n ref={triggerRef}\n type=\"button\"\n aria-label={HEALTH_INFO_TITLE}\n aria-expanded={open}\n className=\"cm:flex cm:cursor-pointer cm:items-center cm:border-0 cm:bg-transparent cm:p-0\"\n onClick={toggle}\n >\n <Icon name=\"info\" size={14} color=\"#64758B\" />\n </button>\n {open &&\n globalMountElement &&\n createPortal(\n <div\n ref={panelRef}\n className=\"cm:pointer-events-auto cm:fixed cm:flex cm:flex-col cm:gap-4 cm:overflow-hidden cm:rounded-xl cm:border cm:border-[#E2E8F0] cm:bg-white cm:p-3 cm:shadow-lg\"\n style={{\n top: position.top,\n left: position.left,\n width: PANEL_WIDTH,\n zIndex: 9999,\n }}\n >\n <div className=\"cm:flex cm:flex-col cm:gap-1\">\n <p className=\"cm:text-[12px] cm:leading-4 cm:font-medium cm:text-slate-text-body\">\n {HEALTH_INFO_TITLE}\n </p>\n <p className=\"cm:text-[12px] cm:leading-[18px] cm:text-slate-text-subtle\">\n {HEALTH_INFO_INTRO}\n </p>\n </div>\n <div className=\"cm:h-px cm:w-full cm:bg-[#E2E8F0]\" />\n <div className=\"cm:flex cm:flex-col cm:gap-2\">\n {HEALTH_INFO_FACTOR_ORDER.map((factor) => {\n const meta = HEALTH_FACTOR_META[factor];\n return (\n <div key={factor} className=\"cm:flex cm:flex-col\">\n <div className=\"cm:flex cm:items-center cm:gap-2.5\">\n <span className=\"cm:flex cm:size-6 cm:shrink-0 cm:items-center cm:justify-center\">\n <Icon\n name={meta.icon}\n folder={meta.folder}\n size={14}\n color=\"#64758B\"\n />\n </span>\n <p className=\"cm:text-[12px] cm:leading-4 cm:font-medium cm:text-slate-text-body\">\n {meta.infoTitle}\n </p>\n </div>\n <p className=\"cm:pl-[34px] cm:text-[11px] cm:leading-[15px] cm:text-slate-text-subtle\">\n {meta.description}\n </p>\n </div>\n );\n })}\n </div>\n </div>,\n globalMountElement\n )}\n </>\n );\n};\n","import { Button as PrimeButton, type ButtonProps as PrimeButtonProps } from \"hiver-ui-kit-extended\";\n\nimport type { ReactNode } from \"react\";\n\nimport { Glyph } from \"@/components/Glyph\";\n\nexport type ButtonProps = Omit<PrimeButtonProps, 'label'> & {\n isLoading?: boolean;\n /** Rendered as the button's children — accepts styled nodes, not just strings. */\n label?: ReactNode;\n}\n\nexport const Button = ({ isLoading, label, ...props }: ButtonProps) => {\n return (\n <PrimeButton {...props}>\n {isLoading ? (\n <span className=\"cm:inline-flex cm:items-center cm:gap-2\">\n <Glyph name=\"spinner\" />\n {label}\n </span>\n ) : (\n label\n )}\n </PrimeButton>\n )\n}","import { Textarea as KitTextarea } from \"hiver-ui-kit-extended\";\nimport { cn } from \"@/utils/classNames\";\n\nimport type { TextareaProps as KitTextareaProps } from \"hiver-ui-kit-extended\";\n\n/**\n * AF-2: this reached `primereact/inputtextarea` directly until now, which put\n * primereact into the hui artifact no matter what `resolve.conditions` said —\n * a direct package specifier has no `hui` variant for the resolver to pick.\n * Going through the toolkit is what makes the design system switchable here.\n *\n * The toolkit's prime variant renders the same `InputTextarea` with the same\n * `fontFamily` style, so Omni's markup is unchanged apart from the two classes\n * it adds (`omni-textarea`, and `omni-textarea-error` in the error state, which\n * this app has no rules for) and the `p-invalid` that `error` now sets. The\n * local error border below is `!important` and still wins, so the rendering is\n * the same; the extra classes are inert.\n *\n * `error` is forwarded rather than expressed only as a class because the hui\n * variant has no `.p-*` DOM for the class to reach — it needs the prop.\n *\n * `cm-textarea` on the class list is a HOOK, not a utility. `cm:p-2!` beside it\n * lands on the MUI TextField ROOT — className goes to the outermost element\n * there, unlike primereact where it reaches the textarea itself — which pushed\n * the whole field 8px right of every other control in a form. The hui\n * stylesheet takes that padding back through this class.\n *\n * Keep notes like this HERE, in the module doc block, and never inside the\n * `cn(...)` call below: comments inside that expression survive into the built\n * bundle as text. One mentioning the hui stylesheet by filename reached prime's\n * artifact and tripped TC-DATA-01's `.hui` module-reference assertion.\n */\nexport type TextareaProps = KitTextareaProps & {\n error?: boolean;\n}\n\nexport const Textarea = ({\n className = \"\",\n rows = 4,\n autoResize = false,\n error = false,\n ...props\n}: TextareaProps) => {\n return (\n <KitTextarea\n {...props}\n rows={rows}\n autoResize={autoResize}\n error={error}\n className={cn( \n error && \"cm:border-error-border! cm:border-[1.5px]! cm:border-solid! cm:shadow-none!\", \n \"cm-textarea cm:w-full cm:text-[14px]! cm:p-2! cm:placeholder:text-slate-500\", \n className\n )}\n />\n );\n};\n","import { useState } from 'react';\nimport { Button } from '@/components/Button';\nimport { Textarea } from '@/components/Textarea';\nimport { cn } from '@/utils/classNames';\nimport { FEEDBACK_REASONS } from '../constants';\nimport type { FeedbackReasonCode } from '@/types/insights';\n\nconst ButtonLabel = ({ children }: { children: React.ReactNode }) => (\n <span className=\"cm:flex cm:h-5 cm:items-center cm:text-sm cm:leading-5 cm:font-medium\">\n {children}\n </span>\n);\n\ninterface FeedbackReasonFormProps {\n submitting: boolean;\n initialReason?: FeedbackReasonCode | null;\n initialText?: string | null;\n onCancel: () => void;\n onSubmit: (reasonCode: FeedbackReasonCode, reasonText: string) => void;\n}\n\nexport const FeedbackReasonForm = ({\n submitting,\n initialReason = null,\n initialText = null,\n onCancel,\n onSubmit,\n}: FeedbackReasonFormProps) => {\n const [reason, setReason] = useState<FeedbackReasonCode | null>(initialReason);\n const [text, setText] = useState(initialText ?? '');\n\n return (\n <div className=\"cm:flex cm:w-full cm:flex-col cm:gap-3.5 cm:bg-white\">\n <p className=\"cm:text-[13px] cm:leading-5 cm:font-medium cm:text-slate-text-body\">\n We’re sorry to hear. What was not accurate?\n </p>\n <div className=\"cm:flex cm:flex-wrap cm:gap-2\">\n {FEEDBACK_REASONS.map(({ code, label }) => {\n const selected = reason === code;\n return (\n <button\n key={code}\n type=\"button\"\n aria-pressed={selected}\n className={cn(\n 'cm:flex cm:h-6 cm:cursor-pointer cm:items-center cm:justify-center cm:whitespace-nowrap cm:rounded-full cm:border-[0.5px] cm:px-2 cm:text-[13px] cm:font-medium',\n selected\n ? 'cm:border-[#538BF3] cm:bg-[#E6EFFD] cm:text-[#0C3E9D]'\n : 'cm:border-[#E2E8F0] cm:bg-[#F1F5F9] cm:text-slate-text-body'\n )}\n onClick={() => setReason(selected ? null : code)}\n >\n {label}\n </button>\n );\n })}\n </div>\n <Textarea\n rows={4}\n placeholder=\"Add any details (optional)\"\n className=\"cm:min-h-[100px] cm:placeholder:text-slate-400!\"\n value={text}\n onChange={(event) => setText(event.target.value)}\n />\n <div className=\"cm:flex cm:justify-end cm:gap-4\">\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n label={<ButtonLabel>Cancel</ButtonLabel>}\n className=\"cm:h-8! cm:min-h-0! cm:px-3! cm:py-1.5!\"\n disabled={submitting}\n onClick={onCancel}\n />\n <Button\n color=\"primary\"\n label={<ButtonLabel>Submit</ButtonLabel>}\n className=\"cm:h-8! cm:min-h-0! cm:px-3! cm:py-1.5! cm:disabled:bg-[#F1F5F9]! cm:disabled:text-[#94A3B8]! cm:disabled:border-transparent! cm:disabled:opacity-100!\"\n isLoading={submitting}\n disabled={(!reason && !text.trim()) || submitting}\n onClick={() => {\n const trimmed = text.trim();\n if (!reason && !trimmed) return;\n onSubmit(reason ?? 'other', trimmed);\n }}\n />\n </div>\n </div>\n );\n};\n","import * as React from \"react\";\nconst SvgThumbUp = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 14, height: 14, viewBox: \"0 0 14 14\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M4.08268 12.8327V6.41602M1.16602 7.58268V11.666C1.16602 12.3104 1.68835 12.8327 2.33268 12.8327H10.1646C11.0284 12.8327 11.763 12.2025 11.8943 11.3488L12.5225 7.26547C12.6856 6.20537 11.8654 5.24935 10.7929 5.24935H8.74935C8.42717 5.24935 8.16602 4.98818 8.16602 4.66602V2.60442C8.16602 1.81001 7.52202 1.16602 6.72763 1.16602C6.53811 1.16602 6.36643 1.27761 6.28949 1.45075L4.23665 6.06957C4.14302 6.28027 3.93412 6.41602 3.70359 6.41602H2.33268C1.68835 6.41602 1.16602 6.93833 1.16602 7.58268Z\", stroke: \"currentColor\", strokeWidth: 1.1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }));\nexport default SvgThumbUp;\n","import * as React from \"react\";\nconst SvgThumbUpFilled = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 14, height: 14, viewBox: \"0 0 14 14\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M1.16602 11.666V7.58268C1.16602 6.93833 1.68835 6.41602 2.33268 6.41602H3.70359C3.93412 6.41602 4.14302 6.28027 4.23665 6.06957L6.28949 1.45075C6.36643 1.27761 6.53811 1.16602 6.72763 1.16602C7.52202 1.16602 8.16602 1.81001 8.16602 2.60442V4.66602C8.16602 4.98818 8.42717 5.24935 8.74935 5.24935H10.7929C11.8654 5.24935 12.6856 6.20537 12.5225 7.26547L11.8943 11.3488C11.763 12.2025 11.0284 12.8327 10.1646 12.8327H4.08268H2.33268C1.68835 12.8327 1.16602 12.3104 1.16602 11.666Z\", fill: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M4.08268 12.8327V6.41602M1.16602 7.58268V11.666C1.16602 12.3104 1.68835 12.8327 2.33268 12.8327H10.1646C11.0284 12.8327 11.763 12.2025 11.8943 11.3488L12.5225 7.26547C12.6856 6.20537 11.8654 5.24935 10.7929 5.24935H8.74935C8.42717 5.24935 8.16602 4.98818 8.16602 4.66602V2.60442C8.16602 1.81001 7.52202 1.16602 6.72763 1.16602C6.53811 1.16602 6.36643 1.27761 6.28949 1.45075L4.23665 6.06957C4.14302 6.28027 3.93412 6.41602 3.70359 6.41602H2.33268C1.68835 6.41602 1.16602 6.93833 1.16602 7.58268Z\", stroke: \"white\", strokeWidth: 1.16667, strokeLinecap: \"round\", strokeLinejoin: \"round\" }));\nexport default SvgThumbUpFilled;\n","import * as React from \"react\";\nconst SvgThumbDown = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 14, height: 14, viewBox: \"0 0 14 14\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { transform: \"rotate(180 7 7)\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M4.08268 12.8327V6.41602M1.16602 7.58268V11.666C1.16602 12.3104 1.68835 12.8327 2.33268 12.8327H10.1646C11.0284 12.8327 11.763 12.2025 11.8943 11.3488L12.5225 7.26547C12.6856 6.20537 11.8654 5.24935 10.7929 5.24935H8.74935C8.42717 5.24935 8.16602 4.98818 8.16602 4.66602V2.60442C8.16602 1.81001 7.52202 1.16602 6.72763 1.16602C6.53811 1.16602 6.36643 1.27761 6.28949 1.45075L4.23665 6.06957C4.14302 6.28027 3.93412 6.41602 3.70359 6.41602H2.33268C1.68835 6.41602 1.16602 6.93833 1.16602 7.58268Z\", stroke: \"currentColor\", strokeWidth: 1.1, strokeLinecap: \"round\", strokeLinejoin: \"round\" })));\nexport default SvgThumbDown;\n","import * as React from \"react\";\nconst SvgThumbDownFilled = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 14, height: 14, viewBox: \"0 0 14 14\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { transform: \"rotate(180 7 7)\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M1.16602 11.666V7.58268C1.16602 6.93833 1.68835 6.41602 2.33268 6.41602H3.70359C3.93412 6.41602 4.14302 6.28027 4.23665 6.06957L6.28949 1.45075C6.36643 1.27761 6.53811 1.16602 6.72763 1.16602C7.52202 1.16602 8.16602 1.81001 8.16602 2.60442V4.66602C8.16602 4.98818 8.42717 5.24935 8.74935 5.24935H10.7929C11.8654 5.24935 12.6856 6.20537 12.5225 7.26547L11.8943 11.3488C11.763 12.2025 11.0284 12.8327 10.1646 12.8327H4.08268H2.33268C1.68835 12.8327 1.16602 12.3104 1.16602 11.666Z\", fill: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M4.08268 12.8327V6.41602M1.16602 7.58268V11.666C1.16602 12.3104 1.68835 12.8327 2.33268 12.8327H10.1646C11.0284 12.8327 11.763 12.2025 11.8943 11.3488L12.5225 7.26547C12.6856 6.20537 11.8654 5.24935 10.7929 5.24935H8.74935C8.42717 5.24935 8.16602 4.98818 8.16602 4.66602V2.60442C8.16602 1.81001 7.52202 1.16602 6.72763 1.16602C6.53811 1.16602 6.36643 1.27761 6.28949 1.45075L4.23665 6.06957C4.14302 6.28027 3.93412 6.41602 3.70359 6.41602H2.33268C1.68835 6.41602 1.16602 6.93833 1.16602 7.58268Z\", stroke: \"white\", strokeWidth: 1.16667, strokeLinecap: \"round\", strokeLinejoin: \"round\" })));\nexport default SvgThumbDownFilled;\n","import { useState } from 'react';\nimport { useInsightsStore } from '@/stores/insights';\nimport { useRenderConfig } from '@/hooks/useRenderConfig';\nimport { cn } from '@/utils/classNames';\nimport { FeedbackReasonForm } from './FeedbackReasonForm';\nimport { GAINSIGHT_EVENTS } from '@/constants/gainsightEvents';\nimport ThumbUpIcon from '@/assets/insights/thumb_up.svg?react';\nimport ThumbUpFilledIcon from '@/assets/insights/thumb_up_filled.svg?react';\nimport ThumbDownIcon from '@/assets/insights/thumb_down.svg?react';\nimport ThumbDownFilledIcon from '@/assets/insights/thumb_down_filled.svg?react';\nimport type { PostHealthFeedbackBody } from '@/types/insights';\n\ninterface HealthFeedbackRowProps {\n companyId: number;\n /** Current health band (`AccountHealth.status`) — carried only for the\n * FeedbackPositive event. */\n healthBadge?: string;\n}\n\nconst thumbButtonClass =\n 'cm:flex cm:size-6 cm:shrink-0 cm:cursor-pointer cm:items-center cm:justify-center cm:rounded cm:border cm:border-slate-border-mild cm:bg-white cm:p-0.5 cm:hover:bg-slate-surface-subtle';\n\n/**\n * \"Is the score accurate?\" thumbs feedback. Clicking the active thumb\n * retracts (vote 0); thumbs-down opens the inline reason form and only POSTs\n * on submit (reason_code required for -1).\n */\nexport const HealthFeedbackRow = ({\n companyId,\n healthBadge,\n}: HealthFeedbackRowProps) => {\n const feedback = useInsightsStore((state) => state.feedback[companyId]);\n const submitting = useInsightsStore(\n (state) => state.feedbackSubmitting[companyId] ?? false\n );\n const submitFeedback = useInsightsStore((state) => state.submitFeedback);\n const callbacks = useRenderConfig();\n const [showReasonForm, setShowReasonForm] = useState(false);\n\n const vote = feedback?.vote ?? 0;\n\n const submit = async (body: PostHealthFeedbackBody): Promise<boolean> => {\n const ok = await submitFeedback(companyId, body);\n // Retracting an existing vote (clicking the active thumb → vote 0) is\n // silent — no success/failure toast; the thumb state itself is feedback.\n if (body.vote !== 0) {\n if (ok) {\n callbacks?.showToast?.('success', 'Thanks for your feedback');\n } else {\n callbacks?.showToast?.('error', 'Could not submit feedback. Please try again.');\n }\n }\n return ok;\n };\n\n const onThumbUp = () => {\n if (submitting) return;\n setShowReasonForm(false);\n // vote === 1 already → this click retracts (vote 0), not a fresh\n // positive vote, so it must not count as FeedbackPositive.\n const isNewPositiveVote = vote !== 1;\n void submit({ vote: isNewPositiveVote ? 1 : 0 }).then((ok) => {\n if (ok && isNewPositiveVote) {\n callbacks?.sendGainsightEvent?.(\n GAINSIGHT_EVENTS.CUSTOMER_INTELLIGENCE_INSIGHTS_FEEDBACK_POSITIVE,\n { account_id: companyId, health_badge: healthBadge }\n );\n }\n });\n };\n\n const onThumbDown = () => {\n if (submitting) return;\n if (vote === -1) {\n // Active thumb → retract. Not a fresh negative vote, so no event.\n setShowReasonForm(false);\n void submit({ vote: 0 });\n return;\n }\n // Reason form already open from a prior click (vote stays 0 until the\n // form is actually submitted) — don't re-open/re-fire on repeat clicks.\n if (showReasonForm) return;\n setShowReasonForm(true);\n // Fired on the click itself (opening the reason form) — not on the\n // eventual reason-form submit/API response, per spec.\n callbacks?.sendGainsightEvent?.(\n GAINSIGHT_EVENTS.CUSTOMER_INTELLIGENCE_INSIGHTS_FEEDBACK_NEGATIVE,\n { account_id: companyId, health_badge: healthBadge }\n );\n };\n\n const onReasonSubmit = async (\n reasonCode: NonNullable<PostHealthFeedbackBody['reason_code']>,\n reasonText: string\n ) => {\n const ok = await submit({\n vote: -1,\n reason_code: reasonCode,\n reason_text: reasonText || undefined,\n });\n if (ok) {\n setShowReasonForm(false);\n callbacks?.sendGainsightEvent?.(\n GAINSIGHT_EVENTS.CUSTOMER_INTELLIGENCE_INSIGHTS_FEEDBACK_COMMENT_SUBMITTED,\n {\n account_id: companyId,\n feedback_rating: reasonCode,\n has_comment: Boolean(reasonText),\n }\n );\n }\n };\n\n return (\n <div className=\"cm:flex cm:w-full cm:flex-col cm:gap-3\">\n <div className=\"cm:flex cm:w-full cm:items-center cm:gap-3.5\">\n <p className=\"cm:min-w-0 cm:flex-1 cm:text-xs cm:leading-[18px] cm:text-slate-text-subtle\">\n Is this accurate?\n </p>\n <div className=\"cm:flex cm:items-center cm:gap-2\">\n <button\n type=\"button\"\n aria-label=\"Score is accurate\"\n aria-pressed={vote === 1}\n className={thumbButtonClass}\n onClick={onThumbUp}\n >\n {vote === 1 ? (\n <ThumbUpFilledIcon\n width={14}\n height={14}\n className=\"cm:text-[#276CF0]\"\n />\n ) : (\n <ThumbUpIcon\n width={14}\n height={14}\n className=\"cm:text-slate-icons-subtle\"\n />\n )}\n </button>\n <button\n type=\"button\"\n aria-label=\"Score is not accurate\"\n aria-pressed={vote === -1}\n className={cn(thumbButtonClass)}\n onClick={onThumbDown}\n >\n {vote === -1 ? (\n <ThumbDownFilledIcon\n width={14}\n height={14}\n className=\"cm:text-[#276CF0]\"\n />\n ) : showReasonForm ? (\n // Reason form open but not submitted yet — filled slate thumb\n // signals the pending down-vote.\n <ThumbDownFilledIcon\n width={14}\n height={14}\n className=\"cm:text-[#94A3B8]\"\n />\n ) : (\n <ThumbDownIcon\n width={14}\n height={14}\n className=\"cm:text-slate-icons-subtle\"\n />\n )}\n </button>\n </div>\n </div>\n {showReasonForm && (\n <FeedbackReasonForm\n submitting={submitting}\n initialReason={feedback?.reason_code ?? null}\n initialText={feedback?.reason_text ?? null}\n onCancel={() => setShowReasonForm(false)}\n onSubmit={onReasonSubmit}\n />\n )}\n </div>\n );\n};\n","import * as React from \"react\";\nconst SvgHealthPlus = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 14, height: 14, viewBox: \"0 0 10.2857 10.2857\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { transform: \"translate(3.4286 0) rotate(180 3.4286 3.4286)\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M6.85714 0.857143C6.85714 0.383756 6.47339 0 6 0H4.28571C3.81233 0 3.42857 0.383756 3.42857 0.857143V6C3.42857 6.47339 3.81233 6.85714 4.28571 6.85714H6C6.47339 6.85714 6.85714 6.47339 6.85714 6V0.857143Z\", fill: \"#A6BFF4\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M6 3.42857C6.47339 3.42857 6.85714 3.04482 6.85714 2.57143L6.85714 0.857143C6.85714 0.383756 6.47339 0 6 0L0.857143 0C0.383756 0 0 0.383756 0 0.857143L0 2.57143C0 3.04482 0.383756 3.42857 0.857143 3.42857L6 3.42857Z\", fill: \"#2A5EF5\" })), /* @__PURE__ */ React.createElement(\"g\", { transform: \"translate(0 3.4286)\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M6.85714 0.857143C6.85714 0.383756 6.47339 0 6 0H4.28571C3.81233 0 3.42857 0.383756 3.42857 0.857143V6C3.42857 6.47339 3.81233 6.85714 4.28571 6.85714H6C6.47339 6.85714 6.85714 6.47339 6.85714 6V0.857143Z\", fill: \"#A6BFF4\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M6.85714 2.57143H3.42857V4.28571H6.85714V2.57143Z\", fill: \"#5887EB\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M6.85714 3.42857L6.85714 0.857143C6.85714 0.383756 6.47339 0 6 0L0.857142 0C0.383756 0 0 0.383756 0 0.857143L0 2.57143C0 3.04482 0.383756 3.42857 0.857143 3.42857L6.85714 3.42857Z\", fill: \"#2A5EF5\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M6.85714 3.42857L3.42857 0V3.42857H6.85714Z\", fill: \"#113FC5\" })));\nexport default SvgHealthPlus;\n","import * as React from \"react\";\nconst SvgAlertTriangleFilled = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 14, height: 14, viewBox: \"0 0 14 14\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M6.45288 2.89741C6.75388 2.32924 7.24504 2.32691 7.54721 2.89741L11.7029 10.7479C12.0039 11.3161 11.7291 11.781 11.0863 11.781H2.91379C2.27096 11.781 1.99504 11.3184 2.29721 10.7479L6.45288 2.89741ZM6.58756 8.57914C6.69696 8.68853 6.84533 8.74999 7.00004 8.74999C7.15475 8.74999 7.30312 8.68853 7.41252 8.57914C7.52192 8.46974 7.58338 8.32137 7.58338 8.16666V5.24999C7.58338 5.09528 7.52192 4.94691 7.41252 4.83751C7.30312 4.72812 7.15475 4.66666 7.00004 4.66666C6.84533 4.66666 6.69696 4.72812 6.58756 4.83751C6.47817 4.94691 6.41671 5.09528 6.41671 5.24999V8.16666C6.41671 8.32137 6.47817 8.46974 6.58756 8.57914ZM6.58756 10.3291C6.69696 10.4385 6.84533 10.5 7.00004 10.5C7.15475 10.5 7.30312 10.4385 7.41252 10.3291C7.52192 10.2197 7.58338 10.0714 7.58338 9.91666C7.58338 9.76195 7.52192 9.61357 7.41252 9.50418C7.30312 9.39478 7.15475 9.33332 7.00004 9.33332C6.84533 9.33332 6.69696 9.39478 6.58756 9.50418C6.47817 9.61357 6.41671 9.76195 6.41671 9.91666C6.41671 10.0714 6.47817 10.2197 6.58756 10.3291Z\", fill: \"#B22E33\" }));\nexport default SvgAlertTriangleFilled;\n","import { HealthContributorRow } from './HealthContributorRow';\nimport { HealthInfoPopover } from './HealthInfoPopover';\nimport { HealthFeedbackRow } from './HealthFeedbackRow';\nimport { HEALTH_FACTOR_META, HEALTH_STATUS_CHIP } from '../constants';\nimport HealthPlusIcon from '@/assets/insights/health_plus.svg?react';\nimport AlertTriangleFilledIcon from '@/assets/insights/alert_triangle_filled.svg?react';\nimport type { AccountHealth } from '@/types/insights';\n\ninterface AccountHealthSectionProps {\n companyId: number;\n health: AccountHealth;\n /** Forwarded to each row's opened signal modal — analytics only. */\n surface?: 'right_panel' | 'customer_module';\n}\n\nexport const AccountHealthSection = ({\n companyId,\n health,\n surface,\n}: AccountHealthSectionProps) => {\n // Contributors arrive pre-ranked by contribution; all renderable\n // (known-factor) rows show at once — no collapse/expand.\n const contributors = (health.contributors ?? []).filter(\n (contributor) => HEALTH_FACTOR_META[contributor.factor]\n );\n\n return (\n <div className=\"cm:flex cm:w-full cm:flex-col cm:gap-4 cm:bg-white cm:p-4\">\n <div className=\"cm:flex cm:h-6 cm:w-full cm:items-center cm:gap-3\">\n <div className=\"cm:flex cm:min-w-0 cm:flex-1 cm:items-center cm:gap-3\">\n <span className=\"cm:flex cm:size-6 cm:shrink-0 cm:items-center cm:justify-center cm:rounded-lg cm:bg-[#F2F6FF]\">\n <HealthPlusIcon width={13} height={13} />\n </span>\n <div className=\"cm:flex cm:min-w-0 cm:items-center cm:gap-2\">\n <span className=\"cm:truncate cm:text-[15px] cm:leading-5 cm:font-medium cm:text-slate-text-body\">\n Account health\n </span>\n <HealthInfoPopover />\n </div>\n </div>\n {health.status && HEALTH_STATUS_CHIP[health.status] && (\n <span\n className={`cm:flex cm:h-[18px] cm:shrink-0 cm:items-center cm:justify-center cm:gap-0.5 cm:rounded-full cm:px-1.5 cm:text-[13px] cm:leading-none cm:font-medium ${HEALTH_STATUS_CHIP[health.status].className}`}\n >\n {HEALTH_STATUS_CHIP[health.status].withIcon && (\n <AlertTriangleFilledIcon width={14} height={14} />\n )}\n {HEALTH_STATUS_CHIP[health.status].label}\n </span>\n )}\n </div>\n\n <div className=\"cm:h-px cm:w-full cm:bg-slate-border-mild\" />\n\n <div className=\"cm:flex cm:w-full cm:flex-col cm:gap-4\">\n {contributors.map((contributor) => (\n <HealthContributorRow\n key={contributor.factor}\n contributor={contributor}\n surface={surface}\n />\n ))}\n </div>\n\n <div className=\"cm:h-px cm:w-full cm:bg-slate-border-mild\" />\n\n <HealthFeedbackRow companyId={companyId} healthBadge={health.status} />\n </div>\n );\n};\n","import * as React from \"react\";\nconst SvgSentimentSmiley = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 12, height: 12, viewBox: \"0 0 11.1429 11.1429\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M5.57143 0C4.09379 0 2.67668 0.586989 1.63183 1.63183C0.586989 2.67668 0 4.09379 0 5.57143C0 7.04906 0.586989 8.46618 1.63183 9.51102C2.67668 10.5559 4.09379 11.1429 5.57143 11.1429L5.57143 5.57143L5.57143 0Z\", fill: \"#765CF0\" }), /* @__PURE__ */ React.createElement(\"circle\", { cx: 3.42878, cy: 4.28572, r: 0.857143, fill: \"#D0C9F6\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M5.57143 11.1429C7.04906 11.1429 8.46618 10.5559 9.51102 9.51102C10.5559 8.46618 11.1429 7.04906 11.1429 5.57143C11.1429 4.09379 10.5559 2.67668 9.51102 1.63183C8.46618 0.586989 7.04906 0 5.57143 0L5.57143 5.57143L5.57143 11.1429Z\", fill: \"#D0C9F6\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M2.57164 6.42857C2.57164 6.82254 2.64924 7.21265 2.8 7.57662C2.95076 7.9406 3.17174 8.27132 3.45032 8.54989C3.72889 8.82847 4.05961 9.04945 4.42359 9.20021C4.78757 9.35097 5.17767 9.42857 5.57164 9.42857L5.57164 6.42857L2.57164 6.42857Z\", fill: \"#D0C9F6\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M8.57164 6.42857C8.57164 6.82254 8.49404 7.21265 8.34328 7.57662C8.19251 7.9406 7.97153 8.27132 7.69296 8.54989C7.41438 8.82847 7.08366 9.04945 6.71969 9.20021C6.35571 9.35097 5.9656 9.42857 5.57164 9.42857L5.57164 6.42857L8.57164 6.42857Z\", fill: \"#765CF0\" }), /* @__PURE__ */ React.createElement(\"circle\", { cx: 7.7145, cy: 4.28572, r: 0.857143, fill: \"#765CF0\" }));\nexport default SvgSentimentSmiley;\n","import { useInsightsStore } from '@/stores/insights';\n// import { cn } from '@/utils/classNames';\n// import { PeriodDropdown } from './PeriodDropdown';\nimport {\n DEFAULT_SENTIMENT_WINDOW,\n SENTIMENT_LABEL_COLORS,\n SENTIMENT_LABEL_FALLBACK_COLOR,\n} from '../constants';\nimport SentimentSmileyIcon from '@/assets/insights/sentiment_smiley.svg?react';\n// import TrendArrowIcon from '@/assets/insights/trend_arrow.svg?react';\nimport ChevronDownIcon from '@/assets/insights/chevron_down.svg?react';\nimport type { SentimentInsights } from '@/types/insights';\n\ninterface AccountSentimentSectionProps {\n companyId: number;\n /** Default-window sentiment from the base detailed payload. */\n sentiment: SentimentInsights;\n showSignalLink?: boolean;\n signalLinkAtBottom?: boolean;\n}\n\nexport const SentimentSignalLink = ({\n companyId,\n sentiment,\n}: {\n companyId: number;\n sentiment: SentimentInsights;\n}) => {\n const selectedDays = useInsightsStore(\n (state) =>\n state.selectedWindows[companyId] ??\n sentiment.window?.days ??\n DEFAULT_SENTIMENT_WINDOW\n );\n const windowCache = useInsightsStore(\n (state) => state.sentimentByWindow[companyId]\n );\n const openSignalModal = useInsightsStore((state) => state.openSignalModal);\n const active = windowCache?.[selectedDays] ?? sentiment;\n\n return (\n <button\n type=\"button\"\n className=\"cm:flex cm:h-6 cm:cursor-pointer cm:items-center cm:gap-1 cm:rounded-md cm:border-0 cm:bg-transparent cm:p-0 cm:text-[13px] cm:leading-none cm:font-medium cm:text-slate-text-subtle\"\n onClick={() =>\n openSignalModal({\n type: 'sentiment',\n window: selectedDays,\n title: 'Sentiment',\n subtitle: active.summary,\n })\n }\n >\n Conversations that drove this sentiment\n <ChevronDownIcon\n width={14}\n height={14}\n className=\"cm:-rotate-90 cm:text-slate-icons-subtle\"\n />\n </button>\n );\n};\n\n/**\n * Sentiment section of the Customer Intelligence drawer.\n * Figma: Omni-Customer-Module node 5778-1818. The period selector refetches\n * `?window=` and updates ONLY this section (locked spec); results are cached\n * per company per window in the insights store.\n */\nexport const AccountSentimentSection = ({\n companyId,\n sentiment,\n showSignalLink = true,\n signalLinkAtBottom = false,\n}: AccountSentimentSectionProps) => {\n const selectedDays = useInsightsStore(\n (state) =>\n state.selectedWindows[companyId] ??\n sentiment.window?.days ??\n DEFAULT_SENTIMENT_WINDOW\n );\n const setSelectedWindow = useInsightsStore(\n (state) => state.setSelectedWindow\n );\n const windowCache = useInsightsStore(\n (state) => state.sentimentByWindow[companyId]\n );\n const loading = useInsightsStore(\n (state) => state.sentimentLoading[companyId] ?? false\n );\n const fetchSentimentWindow = useInsightsStore(\n (state) => state.fetchSentimentWindow\n );\n\n const active: SentimentInsights = windowCache?.[selectedDays] ?? sentiment;\n\n // const onSelectWindow = (days: number) => {\n // const previous = selectedDays;\n // setSelectedWindow(companyId, days);\n // void fetchSentimentWindow(companyId, days).then((ok) => {\n // // Silent GET failure (locked spec) — fall back to the previous window\n // // rather than showing stale data under a wrong label.\n // if (!ok) setSelectedWindow(companyId, previous);\n // });\n // };\n void setSelectedWindow;\n void fetchSentimentWindow;\n void showSignalLink;\n void signalLinkAtBottom;\n\n const labelColor =\n SENTIMENT_LABEL_COLORS[active.label?.toLowerCase() ?? ''] ??\n SENTIMENT_LABEL_FALLBACK_COLOR;\n // const trendingDown = active.score < 0;\n // const trendColor = trendingDown ? '#B81717' : '#1B6F41';\n // const points = active.window?.points ?? 0;\n // const period = active.period ?? 'past two weeks'; // BE trend period + fallback\n\n return (\n <div className=\"cm:flex cm:w-full cm:flex-col cm:gap-4 cm:bg-white cm:p-4\">\n <div className=\"cm:flex cm:h-6 cm:w-full cm:items-center cm:gap-3\">\n <div className=\"cm:flex cm:min-w-0 cm:flex-1 cm:items-center cm:gap-3\">\n {/* Figma tile rgba(242,240,255,0.8) — hex-alpha to dodge the\n postcss-prefix-scope comma bug. */}\n <span className=\"cm:flex cm:size-6 cm:shrink-0 cm:items-center cm:justify-center cm:rounded-[7px] cm:bg-[#F2F0FFCC]\">\n <SentimentSmileyIcon width={12} height={12} />\n </span>\n <span className=\"cm:truncate cm:text-[15px] cm:leading-5 cm:font-medium cm:text-slate-text-body\">\n Account sentiment\n </span>\n </div>\n {/* \n <PeriodDropdown\n selectedDays={selectedDays}\n disabled={loading}\n onSelect={onSelectWindow}\n />\n */}\n </div>\n\n <div className=\"cm:h-px cm:w-full cm:bg-slate-border-mild\" />\n\n {loading ? (\n <div className=\"cm:flex cm:flex-col cm:gap-2\">\n <div className=\"cm:h-6 cm:w-24 cm:animate-pulse cm:rounded cm:bg-gray-200\" />\n <div className=\"cm:h-3.5 cm:w-full cm:animate-pulse cm:rounded cm:bg-gray-200\" />\n </div>\n ) : (\n // Label row and summary sit 4px apart (own group) — the section's\n // 16px gap applies around the group, not between them.\n <div className=\"cm:flex cm:w-full cm:flex-col cm:gap-1\">\n <div className=\"cm:flex cm:w-full cm:items-center cm:justify-between\">\n <p\n className=\"cm:whitespace-nowrap cm:text-[18px] cm:leading-7 cm:font-medium\"\n style={{ color: labelColor }}\n >\n {active.label}\n </p>\n {/*\n {points !== 0 && (\n <div className=\"cm:flex cm:items-center cm:gap-1 cm:pt-0.5\">\n <TrendArrowIcon\n width={14}\n height={14}\n className={cn('cm:shrink-0', trendingDown && 'cm:-scale-y-100')}\n style={{ color: trendColor }}\n />\n <span className=\"cm:whitespace-nowrap cm:text-[13px] cm:leading-[18px] cm:font-medium cm:text-slate-text-body\">\n {trendingDown ? '-' : '+'}\n {points}pts\n </span>\n <span className=\"cm:whitespace-nowrap cm:text-xs cm:leading-[18px] cm:text-slate-text-subtle\">\n {period}\n </span>\n </div>\n )}\n */}\n </div>\n <p className=\"cm:w-full cm:text-xs cm:leading-[18px] cm:italic cm:text-[#E96C28]\">\n {active.summary}\n </p>\n </div>\n )}\n\n {/* \"Conversations that drove this sentiment\" link removed per updated\n design (Figma 6527-7502). Kept for reintroduction:\n {showSignalLink && (\n <div\n className={cn(\n 'cm:flex cm:w-full cm:flex-col cm:gap-4',\n signalLinkAtBottom && 'cm:mt-auto'\n )}\n >\n <div className=\"cm:h-px cm:w-full cm:bg-slate-border-mild\" />\n <SentimentSignalLink companyId={companyId} sentiment={sentiment} />\n </div>\n )}\n */}\n\n </div>\n );\n};\n","/**\n * Loading skeleton mirroring the Account Health layout (header + 2 rows).\n */\nexport const AccountHealthSkeleton = () => (\n <div className=\"cm:flex cm:w-full cm:flex-col cm:gap-4 cm:bg-white cm:p-4\">\n <div className=\"cm:flex cm:items-center cm:gap-3\">\n <div className=\"cm:size-6 cm:shrink-0 cm:animate-pulse cm:rounded-lg cm:bg-gray-200\" />\n <div className=\"cm:h-4 cm:w-32 cm:animate-pulse cm:rounded cm:bg-gray-200\" />\n </div>\n <div className=\"cm:h-px cm:w-full cm:bg-slate-border-mild\" />\n {[0, 1].map((row) => (\n <div key={row} className=\"cm:flex cm:items-start cm:gap-3\">\n <div className=\"cm:size-6 cm:shrink-0 cm:animate-pulse cm:rounded cm:bg-gray-200\" />\n <div className=\"cm:flex cm:flex-1 cm:flex-col cm:gap-1.5\">\n <div className=\"cm:h-3.5 cm:w-28 cm:animate-pulse cm:rounded cm:bg-gray-200\" />\n <div className=\"cm:h-3.5 cm:w-full cm:animate-pulse cm:rounded cm:bg-gray-200\" />\n </div>\n </div>\n ))}\n </div>\n);\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport Icon from '@/components/Icon';\nimport ConversationBox from '@/components/ConversationBox';\nimport { ConversationBoxShimmer } from '@/components/ConversationBox/ConversationBoxShimmer';\nimport { mapSignalConversationToBoxProps } from '@/utils/conversationMapper';\nimport { useInsightsStore } from '@/stores/insights';\nimport { useRenderConfigStore } from '@/stores/renderConfig';\nimport { GAINSIGHT_EVENTS } from '@/constants/gainsightEvents';\nimport { getSignalConversations } from '@/services/insights';\nimport { HEALTH_FACTOR_META } from '../constants';\nimport SentimentSmileyIcon from '@/assets/insights/sentiment_smiley.svg?react';\nimport type { SignalConversation } from '@/types/insights';\n\nconst PAGE_SIZE = 10;\n\ninterface SignalConversationsModalProps {\n companyId?: number;\n}\n\n/**\n * Screen 3 — the Signal Conversations modal. Lists the email conversations\n * behind a clicked health contributor (`?factor=`) or the sentiment drop\n * (`?window=`), page size 10 with infinite scroll (sentinel observer inside\n * the modal's own scroll container; `total_results` is the stop condition).\n *\n * Portals to document.body at z-50 — deliberately BELOW the host's\n * TabbedBrowserModal (z-100), which must stack above when a conversation\n * preview opens while this modal stays open behind (locked spec). NOT the\n * GlobalMount layer: that sits at z-9999 and would bury the preview.\n */\nexport const SignalConversationsModal = ({\n companyId,\n}: SignalConversationsModalProps) => {\n const params = useInsightsStore((state) => state.signalModal);\n const close = useInsightsStore((state) => state.closeSignalModal);\n\n const [items, setItems] = useState<SignalConversation[]>([]);\n const [total, setTotal] = useState<number | null>(null);\n const [loading, setLoading] = useState(false);\n const [failed, setFailed] = useState(false);\n const pageRef = useRef(0);\n const scrollRef = useRef<HTMLDivElement>(null);\n const sentinelRef = useRef<HTMLDivElement>(null);\n const dialogRef = useRef<HTMLDivElement>(null);\n const subtitleRef = useRef<HTMLParagraphElement>(null);\n const [subtitleExpanded, setSubtitleExpanded] = useState(false);\n const [subtitleOverflows, setSubtitleOverflows] = useState(false);\n\n useEffect(() => {\n setSubtitleExpanded(false);\n }, [params]);\n\n useEffect(() => {\n if (subtitleExpanded) return;\n const el = subtitleRef.current;\n setSubtitleOverflows(el ? el.scrollWidth > el.clientWidth : false);\n }, [params?.subtitle, subtitleExpanded]);\n // In-flight guard — refs (not `loading` state) so every caller, including\n // observer callbacks with stale closures and StrictMode double-effects,\n // sees the truth synchronously. Kills duplicate concurrent page fetches.\n const inFlightRef = useRef(false);\n // Bumped on every reset so a response that lands after the modal re-opened\n // with different params is discarded instead of appended to the new list.\n const requestSeqRef = useRef(0);\n\n const hasMore = total === null || items.length < total;\n\n const loadNextPage = useCallback(async () => {\n if (!params || !companyId || inFlightRef.current) return;\n inFlightRef.current = true;\n const seq = requestSeqRef.current;\n setLoading(true);\n setFailed(false);\n const nextPage = pageRef.current + 1;\n try {\n const response = await getSignalConversations(companyId, params.type, {\n factor: params.factor,\n window: params.window,\n page_number: nextPage,\n page_size: PAGE_SIZE,\n });\n if (seq !== requestSeqRef.current) return; // stale — params changed\n pageRef.current = response.data.page_number;\n setTotal(response.data.total_results);\n setItems((current) => [...current, ...response.data.results]);\n // Fire once per open, on the first page only (page 2+ is pagination,\n // not a fresh drilldown) — `linked_conversation_count` needs\n // `total_results`, which only exists once this request resolves.\n // `signal_type` only makes sense for the health path; the sentiment\n // modal (currently unused/dead code) has no factor to report.\n if (response.data.page_number === 1 && params.type === 'health') {\n useRenderConfigStore\n .getState()\n .callbacks?.sendGainsightEvent?.(\n GAINSIGHT_EVENTS.CUSTOMER_INTELLIGENCE_INSIGHTS_SIGNAL_DRILLDOWN_OPENED,\n {\n account_id: companyId,\n signal_type: params.factor,\n linked_conversation_count: response.data.total_results,\n surface: params.surface,\n }\n );\n }\n } catch {\n if (seq === requestSeqRef.current) setFailed(true);\n } finally {\n // A stale request must not clear the guard/loading of the newer one.\n if (seq === requestSeqRef.current) {\n inFlightRef.current = false;\n setLoading(false);\n }\n }\n }, [params, companyId]);\n\n // Reset + first page whenever the modal (re)opens with new params.\n useEffect(() => {\n if (!params) return;\n // Invalidate any in-flight request from the previous params and release\n // its guard so the new first page can start immediately.\n requestSeqRef.current += 1;\n inFlightRef.current = false;\n setItems([]);\n setTotal(null);\n setFailed(false);\n pageRef.current = 0;\n void loadNextPage();\n }, [params, loadNextPage]);\n\n // Escape closes.\n useEffect(() => {\n if (!params) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') close();\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [params, close]);\n\n // Focus management (WCAG 2.1.2): move focus into the dialog on open and\n // restore it to the triggering element on close/unmount.\n useEffect(() => {\n if (!params) return;\n const previouslyFocused =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null;\n dialogRef.current?.focus();\n return () => previouslyFocused?.focus();\n }, [params]);\n\n // Tab trap: wrap focus at the dialog edges so keyboard users can't tab\n // into the inert page behind the backdrop.\n const onTrapKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key !== 'Tab') return;\n const dialog = dialogRef.current;\n if (!dialog) return;\n const focusables = Array.from(\n dialog.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n )\n );\n if (focusables.length === 0) {\n event.preventDefault();\n return;\n }\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = document.activeElement;\n if (event.shiftKey) {\n if (active === first || active === dialog) {\n event.preventDefault();\n last.focus();\n }\n } else if (active === last) {\n event.preventDefault();\n first.focus();\n }\n };\n\n // Latest pagination state for the observer callback — read through refs so\n // the observer never acts on a stale closure and never needs rebuilding\n // when `loading`/`failed` flip (rebuild churn opened duplicate-fetch races).\n const scrollStateRef = useRef({ hasMore, failed });\n scrollStateRef.current = { hasMore, failed };\n const loadNextPageRef = useRef(loadNextPage);\n loadNextPageRef.current = loadNextPage;\n\n // Infinite scroll: observe the sentinel inside the modal's scroll body.\n // Rebuilt only when a page actually lands (items.length) — the fresh\n // initial-intersection callback is what keeps auto-filling short lists\n // whose sentinel never leaves the viewport. In-flight dedupe lives in\n // loadNextPage itself (inFlightRef), so a rebuild can't double-fetch.\n useEffect(() => {\n if (!params) return;\n const sentinel = sentinelRef.current;\n const root = scrollRef.current;\n if (!sentinel || !root) return;\n const observer = new IntersectionObserver(\n (entries) => {\n const { hasMore: more, failed: hasFailed } = scrollStateRef.current;\n if (entries[0]?.isIntersecting && more && !hasFailed && !inFlightRef.current) {\n void loadNextPageRef.current();\n }\n },\n { root, rootMargin: '200px' }\n );\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, [params, items.length]);\n\n if (!params || !companyId) return null;\n\n const factorMeta = params.factor ? HEALTH_FACTOR_META[params.factor] : null;\n\n return createPortal(\n // Outer div is the bare .cm-root scope; utilities live on the inner div —\n // the prefix-scope plugin compiles `cm:` classes as DESCENDANT selectors\n // of .cm-root, so they never apply on the .cm-root element itself.\n <div className=\"cm-root\">\n <div className=\"cm:fixed cm:inset-0 cm:z-50 cm:flex cm:items-center cm:justify-center\">\n {/* Backdrop (hex-alpha: postcss-prefix-scope mangles comma classes) */}\n <div\n className=\"cm:absolute cm:inset-0 cm:bg-[#00000066]\"\n onClick={close}\n />\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={params.title}\n tabIndex={-1}\n className=\"cm:relative cm:flex cm:max-h-[80vh] cm:w-[640px] cm:max-w-[calc(100vw-48px)] cm:flex-col cm:overflow-hidden cm:rounded-[10px] cm:bg-white cm:shadow-xl cm:outline-none\"\n onKeyDown={onTrapKeyDown}\n >\n <div className=\"cm:flex cm:shrink-0 cm:items-start cm:gap-3 cm:border-b cm:border-slate-border-mild cm:bg-slate-surface-subtle cm:px-6 cm:py-4\">\n <span className=\"cm:flex cm:size-9 cm:shrink-0 cm:items-center cm:justify-center cm:rounded-md cm:border cm:border-[#E2E8F0] cm:bg-white\">\n {params.type === 'sentiment' ? (\n <SentimentSmileyIcon\n width={16}\n height={16}\n className=\"cm:text-[#334155]\"\n />\n ) : (\n factorMeta && (\n <Icon\n name={factorMeta.icon}\n folder={factorMeta.folder}\n size={16}\n color=\"#334155\"\n />\n )\n )}\n </span>\n <div className=\"cm:flex cm:min-w-0 cm:flex-1 cm:flex-col cm:gap-0.5\">\n <p className=\"cm:truncate cm:text-[16px] cm:leading-6 cm:font-medium cm:text-slate-text-body\">\n {params.title}\n </p>\n {params.subtitle && (\n <div className=\"cm:flex cm:min-w-0 cm:flex-col\">\n <div className=\"cm:flex cm:min-w-0 cm:items-baseline cm:gap-1\">\n <p\n ref={subtitleRef}\n className={`cm:min-w-0 cm:flex-1 cm:text-[13px] cm:leading-[18px] cm:text-slate-text-subtle ${\n subtitleExpanded ? 'cm:break-words' : 'cm:truncate'\n }`}\n >\n {params.subtitle}\n </p>\n {subtitleOverflows && !subtitleExpanded && (\n <button\n type=\"button\"\n className=\"cm:shrink-0 cm:cursor-pointer cm:border-0 cm:bg-transparent cm:p-0 cm:text-[13px] cm:leading-[18px] cm:font-medium cm:text-slate-text-body\"\n onClick={() => setSubtitleExpanded(true)}\n >\n Show more\n </button>\n )}\n </div>\n {subtitleOverflows && subtitleExpanded && (\n <button\n type=\"button\"\n className=\"cm:mt-1 cm:cursor-pointer cm:self-start cm:border-0 cm:bg-transparent cm:p-0 cm:text-[13px] cm:leading-[18px] cm:font-medium cm:text-slate-text-body\"\n onClick={() => setSubtitleExpanded(false)}\n >\n Show less\n </button>\n )}\n </div>\n )}\n </div>\n <button\n type=\"button\"\n aria-label=\"Close\"\n className=\"cm:flex cm:size-6 cm:shrink-0 cm:cursor-pointer cm:items-center cm:justify-center cm:rounded cm:border-0 cm:bg-transparent cm:hover:bg-slate-surface-subtle-150\"\n onClick={close}\n >\n <Icon name=\"close\" size={16} color=\"#334155\" />\n </button>\n </div>\n\n <div\n ref={scrollRef}\n className=\"cm:flex cm:flex-col cm:gap-3 cm:overflow-y-auto cm:px-6 cm:pb-6 cm:pt-4\"\n >\n {total !== null && (\n <p className=\"cm:text-[13px] cm:leading-[18px] cm:text-slate-text-subtle\">\n {total} {total === 1 ? 'conversation' : 'conversations'} linked to\n this signal\n </p>\n )}\n {/* Default size — same card treatment as the CM Conversations tab\n (small caps the sender name at 80px and truncates early). */}\n {items.map((conversation) => (\n <ConversationBox\n key={conversation.conversation_id}\n {...mapSignalConversationToBoxProps(conversation)}\n />\n ))}\n\n {loading &&\n Array.from({ length: items.length ? 2 : 4 }, (_, i) => (\n <ConversationBoxShimmer key={`shimmer-${i}`} type=\"email\" />\n ))}\n\n {failed && (\n <div className=\"cm:flex cm:flex-col cm:items-center cm:gap-2 cm:py-3\">\n <p className=\"cm:text-[13px] cm:text-slate-text-subtle\">\n Couldn't load conversations.\n </p>\n <button\n type=\"button\"\n className=\"cm:cursor-pointer cm:rounded-md cm:border cm:border-slate-border-light cm:bg-white cm:px-3 cm:py-1.5 cm:text-[13px] cm:font-medium cm:text-slate-text-body cm:hover:bg-slate-surface-subtle\"\n onClick={() => void loadNextPage()}\n >\n Retry\n </button>\n </div>\n )}\n\n <div ref={sentinelRef} aria-hidden=\"true\" className=\"cm:h-px cm:w-full cm:shrink-0\" />\n </div>\n </div>\n </div>\n </div>,\n document.body\n );\n};\n","import { useEffect, useRef } from 'react';\nimport { GlobalMount } from '@/components/Mount';\nimport NoDataFound from '@/components/EmptyData/NoDataFound';\nimport { useInsightsStore } from '@/stores/insights';\nimport { useRenderConfigStore } from '@/stores/renderConfig';\nimport { GAINSIGHT_EVENTS } from '@/constants/gainsightEvents';\nimport { AccountHealthSection } from './AccountHealthSection';\nimport { AccountSentimentSection } from './AccountSentimentSection';\nimport { AccountHealthSkeleton } from './AccountHealthSkeleton';\nimport { SignalConversationsModal } from './SignalConversationsModal';\nimport { HEALTH_FACTOR_META } from '../constants';\n\nexport interface CustomerIntelligencePanelProps {\n companyId?: number;\n /** Conversation the drawer was opened from — carried in analytics only. */\n conversationId?: string | number;\n /**\n * Fire `CustomerIntelligenceInsightsDetailOpened` when the health fetch\n * resolves. Explicit opt-in — set by the Vue right-panel drawer only; the CM\n * app's own Account Details → Overview tab (`AccountDetail.tsx`, same panel,\n * `sectionsLayout=\"row\"`) must NOT double-count as a right-panel open, so it\n * leaves this false rather than the gate inferring \"drawer vs. CM tab\" from\n * `sectionsLayout` or `conversationId` presence, either of which could\n * change for unrelated reasons later.\n */\n trackDetailOpened?: boolean;\n /**\n * Which host this panel is mounted in — forwarded to\n * `CustomerIntelligenceInsightsSignalDrilldownOpened`. Defaults to\n * 'customer_module' (this package's own Account Details page, which never\n * passes this prop); the Vue right-panel drawer wrappers explicitly pass\n * 'right_panel'.\n */\n surface?: 'right_panel' | 'customer_module';\n /**\n * Render the GlobalMount portal layer. Required when embedded in the Vue\n * host (nothing else provides it there); MUST be false inside the full CM\n * app (App.tsx already renders one — a second mount would repoint\n * meta.globalMountElement and detach every portal when this unmounts).\n */\n includeGlobalMount?: boolean;\n /**\n * Render the centered \"Overview isn't available yet\" empty state when the\n * BE reports `insufficient_data`. Opt-in — the CM tab's Overview enables\n * it; the Vue right-panel drawer keeps its render-nothing behavior.\n */\n showInsufficientEmptyState?: boolean;\n /**\n * Section arrangement: 'stack' (default — the narrow right-panel drawer)\n * or 'row' (CM tab Overview — Health and Sentiment side by side with\n * equal widths and matched card heights).\n */\n sectionsLayout?: 'stack' | 'row';\n}\n\n/**\n * Customer Intelligence drawer content — the embed surface consumed by the\n * Vue host (mounted via ReactComponentWrapper inside the V2 right-panel\n * takeover) and by the CM tab later. Phase 1 renders the Account Health\n * section only; Sentiment and AI Insights land in later phases.\n *\n * Data is fetched lazily on mount (drawer open) and cached per company id in\n * the insights store. Errors render nothing (locked spec).\n */\nconst CustomerIntelligencePanel = ({\n companyId,\n conversationId,\n trackDetailOpened = false,\n surface = 'customer_module',\n includeGlobalMount = true,\n showInsufficientEmptyState = false,\n sectionsLayout = 'stack',\n}: CustomerIntelligencePanelProps) => {\n const detailed = useInsightsStore((state) =>\n companyId ? state.detailed[companyId] : undefined\n );\n const loading = useInsightsStore((state) =>\n companyId ? (state.detailedLoading[companyId] ?? false) : false\n );\n const errored = useInsightsStore((state) =>\n companyId ? (state.detailedErrors[companyId] ?? false) : false\n );\n const insufficient = useInsightsStore((state) =>\n companyId ? (state.detailedInsufficient[companyId] ?? false) : false\n );\n const fetchInsights = useInsightsStore((state) => state.fetchInsights);\n const fetchFeedback = useInsightsStore((state) => state.fetchFeedback);\n\n useEffect(() => {\n if (!companyId) return;\n void fetchInsights(companyId);\n void fetchFeedback(companyId);\n }, [companyId, fetchInsights, fetchFeedback]);\n\n // Fires once per drawer-open, the first time THIS mount's health fetch\n // resolves successfully (there's no explicit status code in this store — a\n // settled, non-errored `detailed.health` is the closest available proxy\n // for \"200\"). The drawer is fully unmounted/remounted on close/reopen\n // (Vue-side v-if), so a plain per-mount ref is enough — no cross-open\n // dedup needed.\n //\n // `detailed[companyId]` can already be cached from a prior mount, so the\n // very first render can see `loading === false` + cached `detailed.health`\n // before this mount's own `fetchInsights` call (above) has flipped\n // `loading` to `true` — that would fire on stale cached data and latch\n // `detailOpenedFired`, permanently swallowing the real completion this\n // mount's own fetch produces. Require having observed `loading === true`\n // at least once first, so only a fetch actually started by this mount can\n // satisfy the \"settled\" check (fetchInsights always re-fetches — no\n // cache-skip — so every mount does pass through loading === true).\n const detailOpenedFired = useRef(false);\n const hasSeenLoadingRef = useRef(false);\n useEffect(() => {\n if (!trackDetailOpened) return;\n if (loading) {\n hasSeenLoadingRef.current = true;\n return;\n }\n if (!hasSeenLoadingRef.current) return;\n if (detailOpenedFired.current) return;\n if (!companyId || errored || !detailed?.health) return;\n detailOpenedFired.current = true;\n const signalCount = (detailed.health.contributors ?? []).filter(\n (contributor) => HEALTH_FACTOR_META[contributor.factor]\n ).length;\n useRenderConfigStore\n .getState()\n .callbacks?.sendGainsightEvent?.(\n GAINSIGHT_EVENTS.CUSTOMER_INTELLIGENCE_INSIGHTS_DETAIL_OPENED,\n {\n account_id: companyId,\n conversation_id: conversationId,\n health_badge: detailed.health.status,\n signal_count: signalCount,\n }\n );\n }, [trackDetailOpened, companyId, conversationId, loading, errored, detailed]);\n\n let body: React.ReactNode = null;\n if (companyId) {\n if (loading) {\n body = <AccountHealthSkeleton />;\n } else if (insufficient && showInsufficientEmptyState) {\n body = (\n <NoDataFound\n title=\"Overview isn't available yet\"\n description=\"Account health and sentiment appear once this account has enough linked conversation activity.\"\n />\n );\n } else if (!errored && (detailed?.health || detailed?.sentiment)) {\n const row = sectionsLayout === 'row';\n const cellClass = row\n ? 'cm:flex cm:min-w-0 cm:flex-1 cm:overflow-hidden cm:rounded-[10px] cm:border cm:border-[#EDF1F6]'\n : 'cm:w-full';\n body = (\n <div\n className={`cm:flex cm:w-full ${\n row ? 'cm:flex-row cm:items-start cm:gap-4' : 'cm:flex-col'\n }`}\n >\n {detailed.health && (\n <div className={cellClass}>\n <AccountHealthSection\n companyId={companyId}\n health={detailed.health}\n surface={surface}\n />\n </div>\n )}\n {/* Drawer (stack) separator between the two sections — the drawer\n bg is white now, so a hairline divides them instead of a gap. */}\n {!row && detailed.health && detailed.sentiment && (\n <div className=\"cm:h-px cm:w-full cm:shrink-0 cm:bg-slate-border-mild\" />\n )}\n {detailed.sentiment && (\n <div className={cellClass}>\n <AccountSentimentSection\n companyId={companyId}\n sentiment={detailed.sentiment}\n signalLinkAtBottom={row}\n />\n </div>\n )}\n {!row && detailed.sentiment && (\n <div className=\"cm:h-px cm:w-full cm:shrink-0 cm:bg-slate-border-mild\" />\n )}\n </div>\n );\n }\n }\n\n return (\n <>\n {/* Portal layer for tooltips/popovers — required outside the standalone\n app, where App.tsx isn't mounted to provide it. */}\n {includeGlobalMount && <GlobalMount />}\n {body}\n <SignalConversationsModal companyId={companyId} />\n </>\n );\n};\n\nexport default CustomerIntelligencePanel;\n","import { apiClient } from './axios';\nimport type {\n SearchApiResponse,\n GetSearchParams,\n} from '../types/api';\n\n/**\n * Search across companies and contacts\n * \n * @param params - Query parameters for search and pagination\n * @returns Promise resolving to search API response\n */\nexport const search = async (\n params?: GetSearchParams\n): Promise<SearchApiResponse> => {\n const response = await apiClient.get<SearchApiResponse>('/v1/search', {\n params: {\n text: params?.text ?? '',\n page_number: params?.page_number ?? 1,\n page_size: params?.page_size ?? 20,\n has_email: params?.has_email,\n },\n });\n return response.data;\n};\n\n","import { useRenderConfigStore } from \"@/stores/renderConfig\";\n\nexport const useFeature = (feature: string) => {\n const features = useRenderConfigStore((state) => state.features);\n return features?.[feature] ?? false;\n};","import React, { useState, useEffect, useRef } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport SearchDialog from \"../Search/SearchDialog\";\nimport Icon from \"../Icon\";\nimport { GAINSIGHT_EVENTS } from \"@/constants/gainsightEvents\";\nimport { useRenderConfigStore } from \"@/stores/renderConfig\";\nimport { useFeature } from \"@/hooks/useFeature\";\nimport { FEATURES } from \"@/constants/features\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\ninterface LayoutProps {\n children: ReactNode;\n}\n\nconst Layout: React.FC<LayoutProps> = ({ children }) => {\n const [isSearchDialogOpen, setIsSearchDialogOpen] = useState(false);\n const location = useLocation();\n const isRootRoute = location.pathname === '/' || location.pathname === '/accounts' || location.pathname === '/contacts';\n const callbacks = useRenderConfigStore((state) => state.callbacks);\n const isDark = useRenderConfigStore((state) => state.theme === \"dark\");\n const containerRef = useRef<HTMLDivElement>(null);\n\n const isCustomFieldsEnabled = useFeature(FEATURES.CUSTOM_FIELDS_ENABLED);\n\n /**\n * An INLINE style, so it outranks every stylesheet rule including the\n * `.cm-root`-scoped ones — which is why hui cannot simply override it and has\n * to be excluded here instead.\n *\n * hui paints this surface from `--cm-hui-page-bg` in\n * `theme/design-system.hui.css` (§12): HiG's page wash is\n * `background/accents/hig/Subtle`, and routing it through a custom property\n * is what lets the dark scope flip it in one place rather than needing a\n * second `isDark` branch here.\n */\n const mainStyle = isDark || IS_HUI\n ? undefined\n : { backgroundColor: 'rgb(249, 250, 252)' };\n\n // Set CSS variable for container height\n useEffect(() => {\n const updateHeight = () => {\n if (containerRef.current) {\n const height = containerRef.current.offsetHeight;\n containerRef.current.style.setProperty('--cm-container-height', `${height}px`);\n }\n };\n\n updateHeight();\n window.addEventListener('resize', updateHeight);\n return () => window.removeEventListener('resize', updateHeight);\n }, []);\n\n const handleSearchClick = () => {\n if (callbacks?.sendGainsightEvent) {\n callbacks.sendGainsightEvent(GAINSIGHT_EVENTS.CUSTOMER_SEARCH_CLICKED);\n }\n setIsSearchDialogOpen(true);\n };\n\n return (\n <div id=\"cm-container\" ref={containerRef} className=\"cm:h-full cm:min-h-0 cm:flex-1 cm:basis-0 cm:bg-slate-surface-white cm:flex cm:flex-col cm:overflow-hidden\">\n {/*\n THE HEADER BAR IS PRIME-ONLY.\n\n HiG gives the module no chrome of its own: the side rail carries the\n \"Hiver / Customers\" identity, and search belongs to the table it filters\n (see `Listing/v2/toolbar/search`). Keeping this bar on hui meant two\n \"Customers\" labels one above the other and two search affordances that\n did different things — the header's opened a global dialog, the table's\n filters the list.\n\n `IS_HUI` is a build-time constant, so prime's artifact keeps this branch\n and hui's drops it along with `SearchDialog` and everything only it used.\n\n The wrapper, the `--cm-container-height` measurement and `<main>` stay on\n both paths — they are layout, not chrome, and the height variable is read\n by descendants that exist in both builds.\n */}\n {!IS_HUI && <header className=\"cm:border-b cm:border-slate-border-light cm:bg-charcoal-surface-default cm:px-12 cm:h-14 cm:flex cm:items-center cm:justify-between cm:shrink-0\">\n {/* Right: Search Bar */}\n\n <div className=\"cm:flex cm:items-center cm:gap-3\">\n <Icon\n name=\"customers\"\n size={16}\n type=\"active\"\n color={isDark ? \"#d1d2d5\" : \"#0F172A\"}\n />\n <div className=\"cm:text-label-medium cm:text-slate-text-title\">\n Customers\n </div>\n </div>\n\n <button\n onClick={handleSearchClick}\n className=\"cm:w-[300px] cm:bg-slate-surface-white cm:border-[1.2px] cm:border-slate-border-light cm:rounded-lg cm:flex cm:items-center cm:gap-2 cm:px-3 cm:py-1.5 cm:cursor-pointer cm:transition-colors hover:cm:bg-slate-surface-subtle-100 focus:cm:outline-none focus:cm:border-slate-border-light focus:cm:bg-slate-surface-white active:cm:border-slate-border-light active:cm:bg-slate-surface-white focus-visible:cm:outline-none disabled:cm:border-slate-border-light disabled:cm:bg-slate-surface-white visited:cm:border-slate-border-light visited:cm:bg-slate-surface-white\"\n >\n <Icon\n name=\"search\"\n size={16}\n color={isDark ? \"var(--cm-color-charcoal-icon-secondary)\" : \"#64758B\"}\n className=\"cm:shrink-0\"\n />\n <span className=\"cm:text-sm cm:font-normal cm:leading-5 cm:text-slate-text-subtle cm:whitespace-nowrap\">\n Search\n </span>\n </button>\n </header>}\n\n {/* Main Content */}\n <main \n className={`cm-layout-main cm:flex-1 cm:basis-0 cm:flex cm:flex-col cm:min-h-0 cm:overflow-hidden ${isDark ? 'cm:bg-charcoal-surface-subtle' : ''} ${!isRootRoute ? 'cm:bg-slate-surface-subtle' : ''}`}\n style={isCustomFieldsEnabled ? mainStyle : undefined}\n >\n {children}\n </main>\n {/* Nothing opens this on hui — its only trigger was the header button\n above. Mounting it anyway would ship the dialog, its query hooks and\n its portal into the hui artifact for a surface with no way in. */}\n {!IS_HUI && (\n <SearchDialog\n open={isSearchDialogOpen}\n onClose={() => {\n setIsSearchDialogOpen(false);\n }}\n />\n )}\n </div>\n );\n};\n\nexport default Layout;\n","export * from '@hiver/hiver-ui-kit/icons';\nexport { ChevronSelectorVertical as ExpandAll } from '@hiver/hiver-ui-kit/icons';\nimport { jsxs, jsx } from 'react/jsx-runtime';\n\nconst IconBase = ({ title, children, ...props }) => /* @__PURE__ */ jsxs(\n \"svg\",\n {\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n ...props,\n children: [\n title ? /* @__PURE__ */ jsx(\"title\", { children: title }) : null,\n children\n ]\n }\n);\n\nconst strokeAttrs = {\n stroke: \"currentColor\",\n strokeWidth: 1.7,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nconst Arrange = (props) => /* @__PURE__ */ jsxs(IconBase, { ...props, children: [\n /* @__PURE__ */ jsx(\"path\", { d: \"M16 6C16.5523 6 17 5.55228 17 5C17 4.44772 16.5523 4 16 4C15.4477 4 15 4.44772 15 5C15 5.55228 15.4477 6 16 6Z\", ...strokeAttrs }),\n /* @__PURE__ */ jsx(\"path\", { d: \"M16 13C16.5523 13 17 12.5523 17 12C17 11.4477 16.5523 11 16 11C15.4477 11 15 11.4477 15 12C15 12.5523 15.4477 13 16 13Z\", ...strokeAttrs }),\n /* @__PURE__ */ jsx(\"path\", { d: \"M16 20C16.5523 20 17 19.5523 17 19C17 18.4477 16.5523 18 16 18C15.4477 18 15 18.4477 15 19C15 19.5523 15.4477 20 16 20Z\", ...strokeAttrs }),\n /* @__PURE__ */ jsx(\"path\", { d: \"M9 6C9.55228 6 10 5.55228 10 5C10 4.44772 9.55228 4 9 4C8.44772 4 8 4.44772 8 5C8 5.55228 8.44772 6 9 6Z\", ...strokeAttrs }),\n /* @__PURE__ */ jsx(\"path\", { d: \"M9 13C9.55228 13 10 12.5523 10 12C10 11.4477 9.55228 11 9 11C8.44772 11 8 11.4477 8 12C8 12.5523 8.44772 13 9 13Z\", ...strokeAttrs }),\n /* @__PURE__ */ jsx(\"path\", { d: \"M9 20C9.55228 20 10 19.5523 10 19C10 18.4477 9.55228 18 9 18C8.44772 18 8 18.4477 8 19C8 19.5523 8.44772 20 9 20Z\", ...strokeAttrs })\n] });\n\nexport { Arrange };\n//# sourceMappingURL=icons.js.map\n","import * as React from \"react\";\nconst SvgHiverLogo = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", xmlnsXlink: \"http://www.w3.org/1999/xlink\", width: 24, height: 25, viewBox: \"0 0 24 25\", fill: \"none\", ...props }, /* @__PURE__ */ React.createElement(\"rect\", { id: \"image 8\", width: 24, height: 25, fill: \"url(#pattern0_1_730)\" }), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"pattern\", { id: \"pattern0_1_730\", patternContentUnits: \"objectBoundingBox\", width: 1, height: 1 }, /* @__PURE__ */ React.createElement(\"use\", { xlinkHref: \"#image0_1_730\", transform: \"translate(0.0416667) scale(0.00345238 0.00335571)\" })), /* @__PURE__ */ React.createElement(\"image\", { id: \"image0_1_730\", \"data-name\": \"image.png\", width: 700, height: 298, preserveAspectRatio: \"none\", xlinkHref: \"data:image/png;base64,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\" })));\nexport default SvgHiverLogo;\n","import { IS_HUI } from \"@/constants/uiFramework\";\n\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\n\n/**\n * The Account / Contact marks — HiG only.\n *\n * Every number below is exported from Figma, not redrawn: `Hiver Gmail\n * Icons/Accounts` (`1:6241`), `Hiver Gmail Icons/Users` (`1:6415`) and their line\n * twins `Icons/Line/briefcase-02` (`1:6413`) and `Icons/Line/user-01` (`1:614`).\n * A first pass adapted the extension's `account_dropdown.svg` instead and was\n * rejected on sight — that one floods the whole case with yellow, where the real\n * mark fills only a small rounded panel behind the handle.\n *\n * ONE PATH PER ENTITY, TWO STATES. The selected and idle exports carry the\n * identical `d`; selection adds a yellow shape underneath. So there is no second\n * drawing to keep in step — only the fill moves.\n *\n * ONE STROKE WEIGHT, the kit's. Figma strikes these at 1.33 in a 16 box, but\n * every v2 line icon beside them is `strokeWidth 1.7` in a 24 box — 1.13 at 16 —\n * so the Figma weight read visibly heavier than the search, filter and chevron\n * glyphs around it (supervisor: \"a bit broader strokes\"). The kit's weight, in\n * this 16 viewBox, is what makes the pair sit in the same icon family. The\n * earlier per-state/per-variant weights (0.887 / 1.33 / 1.52) are gone with it.\n *\n * Selected only in the side nav. The detail panels' headers draw the IDLE mark:\n * Figma shows them yellow, but the supervisor ruled they are not a selection and\n * take the plain line icon.\n *\n * WHY A COMPONENT AND NOT AN ASSET IMPORT. `src/assets/*.svg?react` resolves at\n * module level, and `pages/AccountDetail` is retained by BOTH builds — an import\n * there would put the asset in front of prime's tree-shaker for markup prime\n * never renders. Inline JSX inside a dead `IS_HUI` branch is removed outright.\n * Same shape, same reason, as `components/Glyph`.\n *\n * WHY THE COLOURS ARE LITERAL. Every other glyph here paints with `currentColor`\n * so a caller's text colour carries it. These cannot: the mark's point is the\n * brand yellow, which has to survive sitting on a row whose text is #171717. It\n * does not flip for dark mode, exactly as the logo beside it does not.\n *\n * Renders NOTHING on prime; callers pair it with whatever prime already drew.\n */\n\nexport type BrandGlyphProps = {\n entity: ENTITY_TYPE;\n /** Selected state — adds the yellow fill. Side nav only. */\n active?: boolean;\n /** Pixel box. 16 in the nav, 14 in the detail panels' headers. */\n size?: number;\n className?: string;\n};\n\nconst BRAND_FILL = \"#FFCF54\";\nconst BRAND_STROKE = \"#404040\";\n\n/** v2 line icons: 1.7 in a 24 viewBox, restated for this 16 viewBox. */\nconst STROKE_WIDTH = (1.7 * 16) / 24;\n\n/** Corner radius of the Account mark's yellow panel (Figma, 16 box). */\nconst PANEL_RADIUS = 0.666667;\n\nconst BRIEFCASE_D =\n \"M5.33333 14V4.66667C5.33333 4.04669 5.33333 3.7367 5.40148 3.48236C5.58642 2.79218 6.12551 2.25308 6.8157 2.06815C7.07003 2 7.38002 2 8 2C8.61998 2 8.92997 2 9.1843 2.06815C9.87449 2.25308 10.4136 2.79218 10.5985 3.48236C10.6667 3.7367 10.6667 4.04669 10.6667 4.66667V14M3.46667 14H12.5333C13.2801 14 13.6534 14 13.9387 13.8547C14.1895 13.7268 14.3935 13.5229 14.5213 13.272C14.6667 12.9868 14.6667 12.6134 14.6667 11.8667V6.8C14.6667 6.05326 14.6667 5.6799 14.5213 5.39468C14.3935 5.1438 14.1895 4.93982 13.9387 4.81199C13.6534 4.66667 13.2801 4.66667 12.5333 4.66667H3.46667C2.71993 4.66667 2.34656 4.66667 2.06135 4.81199C1.81046 4.93982 1.60649 5.1438 1.47866 5.39468C1.33333 5.6799 1.33333 6.05326 1.33333 6.8V11.8667C1.33333 12.6134 1.33333 12.9868 1.47866 13.272C1.60649 13.5229 1.81046 13.7268 2.06135 13.8547C2.34656 14 2.71993 14 3.46667 14Z\";\n\nconst USER_D =\n \"M13.3333 14C13.3333 13.0696 13.3333 12.6044 13.2185 12.2259C12.96 11.3736 12.293 10.7067 11.4408 10.4482C11.0622 10.3333 10.597 10.3333 9.66666 10.3333H6.33334C5.40296 10.3333 4.93777 10.3333 4.55924 10.4482C3.70697 10.7067 3.04003 11.3736 2.78149 12.2259C2.66667 12.6044 2.66667 13.0696 2.66667 14M11 5C11 6.65685 9.65685 8 8 8C6.34315 8 5 6.65685 5 5C5 3.34315 6.34315 2 8 2C9.65685 2 11 3.34315 11 5Z\";\n\n/** The person mark's yellow shoulders — a rounded-top slab under the outline. */\nconst USER_FILL_D =\n \"M2.66675 12.3544C2.66675 11.2499 3.56218 10.3544 4.66675 10.3544H11.3335C12.4381 10.3544 13.3335 11.2499 13.3335 12.3544V14.2684H2.66675V12.3544Z\";\n\nexport const BrandGlyph = ({\n entity,\n active = false,\n size = 16,\n className,\n}: BrandGlyphProps) => {\n if (!IS_HUI) return null;\n\n const isCompany = entity === \"company\";\n\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n aria-hidden\n focusable={false}\n >\n {active &&\n (isCompany ? (\n /* Figma draws this as a rect, not as a filled copy of the\n outline — the case stays white and only the panel behind\n the handle is yellow. */\n <rect\n x=\"5\"\n y=\"5\"\n width=\"6\"\n height=\"9\"\n rx={PANEL_RADIUS}\n fill={BRAND_FILL}\n />\n ) : (\n <path d={USER_FILL_D} fill={BRAND_FILL} />\n ))}\n <path\n d={isCompany ? BRIEFCASE_D : USER_D}\n stroke={BRAND_STROKE}\n strokeWidth={STROKE_WIDTH}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default BrandGlyph;\n","import { useState } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { XClose } from 'hiver-ui-kit-extended/icons';\nimport { useRenderConfigStore } from '@/stores/renderConfig';\n// Safe to import an asset at module level HERE, unlike in `Glyph` or\n// `BrandGlyph`: those modules are retained by both builds, this one is dropped\n// from prime entirely by the `IS_HUI` gate in `CustomersLayout`, so the asset\n// never faces prime's tree-shaker. Same mark the Figma's nav header carries.\nimport HiverLogo from '@/assets/hiver-logo.svg?react';\nimport { BrandGlyph } from '@/components/BrandGlyph';\n\n/**\n * The HiG side nav (Design Pack D-02) — a persistent 240px rail carrying the\n * \"Hiver Customers\" header and the Accounts/Contacts destinations.\n *\n * Deliberately a LOCAL component, not the toolkit's `SidePanel`: `SidePanel` is\n * an overlay drawer (`open`, `showOverlay`, `closeOnOverlayClick`, portalled via\n * `appendTo`), which is the wrong shape for a persistent rail with no backdrop.\n * Composed instead from `Icon` + Tailwind, following the `TabsSection`/`Header`\n * conventions already in this codebase.\n *\n * Renders in the hui artifact only — `CustomersLayout` gates it behind `IS_HUI`,\n * and it is the *only* navigation affordance there (D-01: the tab strip is not\n * rendered alongside it, on any route).\n *\n * NC-2 — KNOWN GAP: the Figma mounts this in the Gmail host's left-nav column\n * (`#leftPanelCMContact`), which CM-HIG-001's extension AF-1 currently\n * collapses. Un-collapsing it is an `extension`-repo change, out of scope here,\n * so this rail renders inside the module's own container instead: visually\n * correct in isolation, but not occupying the host's dedicated nav column.\n */\n\n// Stable, deliberately-unique marker class. `artifact-scan.test.ts`'s TC-HP-08\n// greps the built bundles for this exact string to prove the side nav ships in\n// the hui artifact and NOT in prime's. Do not reuse it elsewhere, and do not\n// rename it without updating that test.\nconst ROOT_CLASS = 'cm-side-nav';\n\n/**\n * BOTH STATES COME FROM `components/BrandGlyph`, not from the kit.\n *\n * Figma `1:7288` (Accounts selected) and `157:11940` (Contacts selected) export\n * the selected and idle marks with the IDENTICAL path — selection adds a yellow\n * shape underneath and changes the stroke weight. Drawing the idle one from the\n * kit's `Briefcase01` / `User01` instead would make the pair two different\n * drawings that have to be kept looking alike by eye, and it could not produce\n * the selected state at all: those are single-path outlines with nothing to\n * fill, so a `color` prop only ever moves the stroke.\n */\nconst NAV_ITEMS = [\n { label: 'Accounts', entity: 'company', path: '/accounts' },\n { label: 'Contacts', entity: 'contact', path: '/contacts' },\n] as const;\n\nexport default function SideNav() {\n const location = useLocation();\n const navigate = useNavigate();\n\n // The dismiss \"x\" now asks the HOST to close the module, through\n // `CustomerModuleCallbacks.onClose`.\n //\n // It used to be local state only, hiding the rail inside this module's own\n // render tree, because no such callback existed. That left the button doing\n // the wrong thing in the only host that has it: the rail disappeared and the\n // user was stranded inside a CRM view with no navigation and no way back to\n // the inbox — there is no other affordance to leave the surface.\n //\n // The local hide is kept as the FALLBACK, not the behaviour. A host that\n // supplies no handler has no \"closed\" state to return to (the standalone dev\n // harness is one), and for it collapsing the rail is still the best available\n // answer. A host that does supply one — the Gmail extension drops the CRM tab,\n // which unmounts the module and restores Gmail's own layout — never reaches it.\n const onClose = useRenderConfigStore((state) => state.callbacks?.onClose);\n const [dismissed, setDismissed] = useState(false);\n\n const handleDismiss = () => {\n if (onClose) {\n onClose();\n return;\n }\n setDismissed(true);\n };\n\n /**\n * The custom-fields route is `/custom-fields/<entityType>`, which starts with\n * neither nav path — so on \"Manage account fields\" no item was highlighted\n * and the rail looked inert. The Figma highlights the entity whose fields are\n * being managed, so that route maps onto its listing.\n */\n const CF_ENTITY_PATH: Record<string, string> = {\n company: '/accounts',\n contact: '/contacts',\n };\n const cfEntity = location.pathname.startsWith('/custom-fields/')\n ? location.pathname.split('/')[2]\n : undefined;\n const activePath = (cfEntity && CF_ENTITY_PATH[cfEntity]) || location.pathname;\n\n const activeIndex = NAV_ITEMS.findIndex((item) =>\n activePath.startsWith(item.path)\n );\n\n const isActive = (index: number) => index === activeIndex;\n\n if (dismissed) return null;\n\n return (\n <nav\n aria-label=\"Customers\"\n className={`${ROOT_CLASS} cm:shrink-0 cm:h-full cm:min-h-0 cm:flex cm:flex-col cm:bg-slate-surface-white`}\n >\n {/* The rail's width and right border live here rather than in `cm:`\n utilities on purpose. Tailwind v4 generates CSS by scanning\n SOURCE text, not the built bundle, so a utility used only by this\n hui-only component is still emitted into PRIME's stylesheet even\n though `IS_HUI` dead-code-eliminates the component itself from\n prime's JS. The three utilities this rail would otherwise be\n the only user of (a fixed 235px width, a right border, and a\n border reset on the buttons) measurably added 193 bytes to\n prime's CSS. Scoping them here instead keeps them inside the\n component, which prime drops entirely. Follows the\n scoped-<style> pattern already used by TabsSection and\n AccountTable.\n Do NOT name those utilities literally in this comment — the\n scanner reads comments too, and writing them would put the rules\n back into prime's stylesheet. */}\n <style>\n {`\n /* Figma background/neutral/subtle. The rail read as pure\n white, the same value as the table card it sits beside, so\n the two surfaces merged and the rail had no edge of its own\n beyond the 1px border. A distinct nav surface is what makes\n it read as chrome rather than as more page. */\n .cm-root .cm-side-nav { width: 240px; border-right: 1px solid var(--cm-color-slate-border-mild, #eeeeee); background-color: var(--cm-hui-nav-bg, #fafafa); }\n /* icon-size/sm, and flex-shrink 0 because a long label in a\n 216px item would otherwise squeeze the glyph narrower. */\n .cm-root .cm-side-nav__icon { width: 16px; height: 16px; flex-shrink: 0; }\n .cm-root .cm-side-nav__close { width: 16px; height: 16px; color: var(--cm-color-slate-icons-subtle, #737373); }\n .cm-root .cm-side-nav__btn { border: none; }\n /* The Figma's nav header is 82px and stacks a 12px \"Hiver\"\n eyebrow over the 14px \"Customers\" title beside a 24px\n mark — the single 16px line this rail shipped with was a\n placeholder for it. */\n .cm-root .cm-side-nav__header { height: 82px; }\n .cm-root .cm-side-nav__brand { display: flex; flex-direction: column; min-width: 0; }\n /* overline: 12/14 medium, letter-spacing/wide (0.08px). */\n .cm-root .cm-side-nav__eyebrow {\n font-size: 12px; line-height: 14px; font-weight: 500; letter-spacing: 0.08px;\n color: var(--cm-color-slate-text-subtle, #64758B);\n }\n /* text/neutral/default, not the strong title tone. */\n .cm-root .cm-side-nav__title {\n font-size: 14px; line-height: 20px; font-weight: 500;\n color: var(--cm-color-slate-text-body, #404040);\n }\n .cm-root .cm-side-nav__mark { width: 24px; height: 24px; flex-shrink: 0; }\n /* Figma: 216x32 items in a 12px gutter, selected on\n background/accents/hig/Strong. That token is HiG-specific\n and has no slate equivalent, so it is not approximated\n with slate-100 (#F1F5F9), which is what this rail was\n using. The variable is declared — light and dark — in\n src/theme/design-system.hui.css, which is this build's\n design-system stylesheet; a bare hex here would not flip\n for the dark theme, since .cm-root.cm-dark only\n reassigns custom properties.\n (No backticks in this block: it is a JS template literal,\n and one would terminate the string.) */\n /* Figma _HIG Nav Item: a 216 slot with 6px inside it, so\n the pill is 204 wide at 18 from the rail edge, padded 8,\n 2px apart, starting straight under the 82px header. Both\n states set their label in text/neutral/default; only the\n weight differs. */\n .cm-root .cm-side-nav__items { display: flex; flex-direction: column; gap: 2px; padding: 0 17px 0 18px; }\n .cm-root .cm-side-nav__item { height: 32px; padding: 0 8px; color: var(--cm-color-slate-text-body, #404040); }\n .cm-root .cm-side-nav__item--active { background-color: var(--cm-hui-nav-selected-bg, #E8EDF7); }\n `}\n </style>\n <div className=\"cm-side-nav__header cm:flex cm:items-center cm:justify-between cm:gap-3 cm:px-4 cm:shrink-0\">\n <div className=\"cm:flex cm:items-center cm:gap-3 cm:min-w-0\">\n <HiverLogo className=\"cm-side-nav__mark\" />\n <div className=\"cm-side-nav__brand\">\n <span className=\"cm-side-nav__eyebrow cm:truncate\">Hiver</span>\n <span className=\"cm-side-nav__title cm:truncate\">Customers</span>\n </div>\n </div>\n <button\n type=\"button\"\n aria-label=\"Hide navigation\"\n onClick={handleDismiss}\n className=\"cm-side-nav__btn cm:shrink-0 cm:flex cm:items-center cm:cursor-pointer cm:bg-transparent cm:p-1\"\n >\n <XClose className=\"cm-side-nav__close\" />\n </button>\n </div>\n\n <div className=\"cm-side-nav__items\">\n {NAV_ITEMS.map((item, index) => (\n <button\n key={item.path}\n type=\"button\"\n aria-current={isActive(index) ? 'page' : undefined}\n onClick={() => navigate(item.path)}\n className={`cm-side-nav__btn cm-side-nav__item cm:flex cm:items-center cm:gap-2 cm:w-full cm:rounded-lg cm:cursor-pointer cm:text-left cm:text-sm cm:leading-5 ${\n isActive(index)\n ? 'cm-side-nav__item--active cm:font-medium'\n : 'cm:bg-transparent cm:font-normal'\n }`}\n >\n {/*\n * The glyph carries its own colours in both states —\n * Figma strikes it #404040 whether the row is selected\n * or not, so it deliberately does NOT track the button's\n * text colour the way a `currentColor` icon would. The\n * markup before this hard-coded #0F172A and #64758B,\n * which left the icon on the slate ramp after the label\n * had moved to HiG's neutrals.\n */}\n <BrandGlyph\n entity={item.entity}\n active={isActive(index)}\n size={16}\n className=\"cm-side-nav__icon\"\n />\n {item.label}\n </button>\n ))}\n </div>\n </nav>\n );\n}\n","import { Breadcrumb as KitBreadcrumb } from 'hiver-ui-kit-extended';\n\nimport type { ReactNode } from 'react';\nimport type { BreadcrumbItem } from 'hiver-ui-kit-extended';\n\n/**\n * Breadcrumb seam — the toolkit's component on BOTH builds.\n *\n * hui used to render a hand-rolled list from `./hui.tsx`, because the toolkit's\n * hui variant ignored `command` and every crumb here navigates with one (the\n * module runs under a `MemoryRouter`, so there is never an href to give). The\n * toolkit now maps `command` onto v2 `Breadcrumbs`' `onClick`, so hui gets the\n * design system's own component — type, colours, slash separator and\n * `aria-current` included — and the local copy is gone.\n *\n * `template` is primereact's render-prop escape hatch: prime's call sites still\n * use it, and primereact honours it. hui call sites pass `label` (+ `icon`).\n */\ntype BreadcrumbProps = {\n items: (BreadcrumbItem & { template?: () => ReactNode })[];\n className?: string;\n style?: React.CSSProperties;\n};\n\nexport const Breadcrumb = ({ items, className, style }: BreadcrumbProps) => (\n <KitBreadcrumb items={items} className={className} style={style} />\n);\n\nexport default Breadcrumb;\n","import { useLocation, useNavigate } from \"react-router-dom\";\nimport { useCompaniesStore } from '../stores/companies';\nimport { useContactsStore } from '../stores/contacts';\n\nexport function useBreadcrumb() {\n const location = useLocation();\n const navigate = useNavigate();\n const companiesData = useCompaniesStore((state) => state.data);\n const companiesSummaries = useCompaniesStore((state) => state.summaries);\n const contactsData = useContactsStore((state) => state.data);\n const contactsSummaries = useContactsStore((state) => state.summaries);\n\n const path = location.pathname; // works even in MemoryRouter\n // Preserved on the account crumbs so going up keeps the listing's tab.\n const search = location.search;\n\n const items = [];\n\n // Helper function to get account name\n const getAccountName = (accountId: string): string => {\n const accountIdNum = parseInt(accountId, 10);\n if (isNaN(accountIdNum)) return 'Account';\n \n // Try summary first (most up-to-date)\n const summary = companiesSummaries[accountIdNum];\n if (summary?.name) {\n return summary.generated_name || summary.name;\n }\n \n // Fall back to companies list\n const account = companiesData?.companies?.find(\n (acc) => acc.id === accountIdNum\n );\n return account?.generated_name || account?.name || 'Account';\n };\n\n // Helper function to get contact name\n const getContactName = (contactId: string): string => {\n const contactIdNum = parseInt(contactId, 10);\n if (isNaN(contactIdNum)) return 'Contact';\n \n // Try summary first (most up-to-date)\n const summary = contactsSummaries[contactIdNum];\n if (summary?.name) {\n return summary.name;\n }\n \n // Fall back to contacts list\n const contact = contactsData?.contacts?.find(\n (cont) => cont.id === contactIdNum\n );\n return contact?.name || 'Contact';\n };\n\n // Handle nested route: /accounts/:accountId/contacts/:contactId\n if (path.startsWith(\"/accounts\") && path.includes(\"/contacts/\")) {\n items.push({\n label: \"Accounts\",\n command: () => navigate({ pathname: \"/accounts\", search })\n });\n\n const parts = path.split(\"/\");\n const accountId = parts[2];\n const contactId = parts[4]; // /accounts/:accountId/contacts/:contactId\n\n if (accountId) {\n const accountName = getAccountName(accountId);\n items.push({\n label: accountName,\n command: () => navigate({ pathname: `/accounts/${accountId}`, search })\n });\n }\n\n if (contactId) {\n const contactName = getContactName(contactId);\n items.push({\n label: contactName,\n command: () => navigate({ pathname: `/accounts/${accountId}/contacts/${contactId}`, search })\n });\n }\n }\n // Handle /accounts/:accountId route\n else if (path.startsWith(\"/accounts\")) {\n items.push({\n label: \"Accounts\",\n command: () => navigate({ pathname: \"/accounts\", search })\n });\n\n const parts = path.split(\"/\");\n\n if (parts[2]) {\n const accountId = parts[2];\n const accountName = getAccountName(accountId);\n items.push({\n label: accountName,\n command: () => navigate({ pathname: `/accounts/${accountId}`, search })\n });\n }\n }\n // Handle /contacts/:contactId route\n else if (path.startsWith(\"/contacts\")) {\n items.push({\n label: \"Contacts\",\n command: () => navigate(\"/contacts\")\n });\n\n const parts = path.split(\"/\");\n\n if (parts[2]) {\n const contactId = parts[2];\n const contactName = getContactName(contactId);\n items.push({\n label: contactName,\n command: () => navigate(`/contacts/${contactId}`)\n });\n }\n }\n\n return items;\n}\n","import { Breadcrumb } from '@/components/Breadcrumb';\nimport { useBreadcrumb } from '../../hooks/useBreadcrumb';\n\nconst BreadcrumbsSection = () => {\n const breadcrumbItems = useBreadcrumb();\n \n return (\n <>\n <style>{`\n .cm-root .p-breadcrumb .p-breadcrumb-list li.p-menuitem-separator {\n margin: 0 !important;\n }\n `}</style>\n <Breadcrumb\n items={breadcrumbItems}\n style={{\n background: 'transparent',\n padding: '8px 0px 8px 2px',\n }}\n />\n </>\n );\n};\n\nexport default BreadcrumbsSection;","import { Outlet, useLocation } from \"react-router-dom\";\nimport Header from \"../Header\";\nimport TabsSection from \"../TabsSection\";\nimport SideNav from \"../SideNav\";\nimport BreadcrumbsSection from \"../BreadcrumbsSection\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\n\nexport default function CustomersLayout() {\n const location = useLocation();\n const isDetailsPage = location.pathname.includes(\"/accounts/\") ||\n location.pathname.includes(\"/contacts/\");\n\n // D-01: exactly one navigation affordance per build. The hui branch renders\n // the side nav and NEVER the tab strip — and unlike today's listing-only tab\n // strip, the rail is present on detail routes too. `IS_HUI` is a build-time\n // constant, so the unused branch is eliminated as dead code; prime's\n // artifact must stay byte-identical.\n if (IS_HUI) {\n return (\n <div className=\"cm:flex cm:h-full cm:min-h-0\">\n <SideNav />\n {/* Header keeps its own `cm:h-full cm:min-h-0 cm:flex-1` box, so\n the offsetHeight measurement in its useEffect still resolves\n against a real height now that it is no longer outermost. */}\n {/* `min-w-0` is load-bearing, not defensive. A flex item's\n default `min-width: auto` sizes it to its content, and the\n content here is a wide, horizontally-scrolling DataTable — so\n without it this column measured 1499px beside a 235px rail in\n a 1440px viewport. The overflow was clipped rather than\n scrolled, which silently pushed the toolbar's Import and\n Create-account buttons and the header's search field off the\n right edge: they rendered, they just could not be seen. */}\n <div className=\"cm:flex-1 cm:min-w-0 cm:flex cm:flex-col cm:min-h-0\">\n <Header>\n {/* `cm-detail-crumbs` is hui's hook for the crumbs' Figma\n spacing (design-system.hui.css §4); this branch is\n dead code on prime, so prime never sees it. */}\n <div className={`cm-detail-crumbs cm:px-12 cm:shrink-0 ${!isDetailsPage ? 'cm:pt-2' : ''}`}>\n {isDetailsPage && <BreadcrumbsSection />}\n </div>\n <div className=\"cm:flex-1 cm:flex cm:flex-col cm:min-h-0\">\n <Outlet />\n </div>\n </Header>\n </div>\n </div>\n );\n }\n\n return (\n <Header>\n <div className={`cm:px-12 cm:shrink-0 ${!isDetailsPage ? 'cm:pt-2' : ''}`}>\n {isDetailsPage ? <BreadcrumbsSection /> : <TabsSection />}\n </div>\n <div className=\"cm:flex-1 cm:flex cm:flex-col cm:min-h-0\">\n <Outlet />\n </div>\n </Header>\n );\n}\n","import { useEffect, useRef, useState, useCallback } from 'react';\nimport { useIntersectionObserver } from './useIntersectionObserver';\n\ninterface UseTableInfiniteScrollOptions {\n /**\n * Wrapper ref for the table container\n */\n wrapperRef: React.RefObject<HTMLDivElement>;\n \n /**\n * Table data array to determine when shimmer rows are present\n */\n tableData: unknown[];\n \n /**\n * Whether the table is currently loading\n */\n isLoading: boolean;\n \n /**\n * Whether there are more pages to load\n */\n hasMorePages: boolean;\n \n /**\n * Callback function to trigger when near the bottom\n */\n onIntersect: () => Promise<void> | void;\n \n /**\n * Distance from bottom in pixels to trigger the callback (default: 200)\n */\n threshold?: number;\n}\n\n/**\n * Custom hook that handles infinite scroll for DataTable components\n * - Finds the scrollable element inside DataTable\n * - Finds and sets the last shimmer row as sentinel\n * - Sets up intersection observer for pagination\n * \n * @example\n * ```tsx\n * const wrapperRef = useRef<HTMLDivElement>(null);\n * useTableInfiniteScroll({\n * wrapperRef,\n * tableData,\n * isLoading,\n * hasMorePages,\n * onIntersect: async () => {\n * await fetchNextPage();\n * },\n * threshold: 200,\n * });\n * ```\n */\nexport function useTableInfiniteScroll({\n wrapperRef,\n tableData,\n isLoading,\n hasMorePages,\n onIntersect,\n threshold = 200,\n}: UseTableInfiniteScrollOptions) {\n const scrollContainerRef = useRef<HTMLElement | null>(null);\n const shimmerRef = useRef<HTMLTableRowElement>(null);\n const [scrollableElement, setScrollableElement] = useState<HTMLElement | null>(null);\n const [shimmerElement, setShimmerElement] = useState<HTMLTableRowElement | null>(null);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n\n // Find the actual scrollable element inside DataTable\n useEffect(() => {\n if (tableData.length === 0) return;\n\n // Find the scrollable element - typically a div with overflow-y: auto or scroll\n // First try to find one that's actually scrollable, then fall back to any with overflow-y\n const findScrollableElement = (element: HTMLElement, preferOverflowing: boolean = true): HTMLElement | null => {\n const style = window.getComputedStyle(element);\n const hasOverflow = style.overflowY === 'auto' || style.overflowY === 'scroll';\n const isOverflowing = element.scrollHeight > element.clientHeight;\n \n if (preferOverflowing) {\n // First pass: prefer elements that are actually overflowing\n if (hasOverflow && isOverflowing) {\n return element;\n }\n } else {\n // Second pass: accept any element with overflow-y set\n if (hasOverflow) {\n return element;\n }\n }\n \n for (let i = 0; i < element.children.length; i++) {\n const child = element.children[i] as HTMLElement;\n const found = findScrollableElement(child, preferOverflowing);\n if (found) return found;\n }\n return null;\n };\n\n // Retry logic to wait for wrapperRef.current to be available\n let retryCount = 0;\n const maxRetries = 10;\n const retryDelay = 150;\n\n const tryFindScrollable = () => {\n if (!wrapperRef.current) {\n if (retryCount < maxRetries) {\n retryCount++;\n setTimeout(tryFindScrollable, retryDelay);\n }\n return;\n }\n\n // First try to find an element that's actually overflowing\n let scrollable = findScrollableElement(wrapperRef.current, true);\n \n // If not found, try to find any element with overflow-y (even if not overflowing)\n if (!scrollable) {\n scrollable = findScrollableElement(wrapperRef.current, false);\n }\n \n // If still not found, use the wrapper element as fallback\n if (!scrollable) {\n scrollable = wrapperRef.current;\n }\n \n if (scrollable) {\n scrollContainerRef.current = scrollable;\n setScrollableElement(scrollable);\n } else if (retryCount < maxRetries) {\n retryCount++;\n setTimeout(tryFindScrollable, retryDelay);\n }\n };\n\n const timeoutId = setTimeout(tryFindScrollable, retryDelay);\n return () => clearTimeout(timeoutId);\n }, [wrapperRef, tableData.length, isLoading]);\n\n // Find the last shimmer row and set it as sentinel\n useEffect(() => {\n if (!hasMorePages || isLoading || tableData.length === 0) {\n if (!hasMorePages) {\n (shimmerRef as React.MutableRefObject<HTMLTableRowElement | null>).current = null;\n setShimmerElement(null);\n }\n return;\n }\n\n // Retry logic to wait for wrapperRef.current to be available\n let retryCount = 0;\n const maxRetries = 10;\n const retryDelay = 150;\n\n const tryFindShimmer = () => {\n if (!wrapperRef.current) {\n if (retryCount < maxRetries) {\n retryCount++;\n setTimeout(tryFindShimmer, retryDelay);\n }\n return;\n }\n\n const tbody = wrapperRef.current.querySelector('tbody.p-datatable-tbody') as HTMLTableSectionElement | null;\n if (tbody) {\n const rows = tbody.querySelectorAll('tr');\n if (rows.length >= 3) {\n const lastRow = rows[rows.length - 1] as HTMLTableRowElement;\n const hasShimmer = lastRow.querySelector('.cm\\\\:bg-gray-200') !== null;\n if (hasShimmer) {\n (shimmerRef as React.MutableRefObject<HTMLTableRowElement | null>).current = lastRow;\n setShimmerElement(lastRow);\n } else if (retryCount < maxRetries) {\n retryCount++;\n setTimeout(tryFindShimmer, retryDelay);\n }\n } else if (retryCount < maxRetries) {\n retryCount++;\n setTimeout(tryFindShimmer, retryDelay);\n }\n } else if (retryCount < maxRetries) {\n retryCount++;\n setTimeout(tryFindShimmer, retryDelay);\n }\n };\n\n const timeoutId = setTimeout(tryFindShimmer, retryDelay);\n return () => clearTimeout(timeoutId);\n }, [wrapperRef, hasMorePages, isLoading, tableData.length]);\n\n // Wrapper for onIntersect that handles loading state\n const handleIntersect = useCallback(async () => {\n if (!isLoadingMore && hasMorePages && !isLoading) {\n setIsLoadingMore(true);\n try {\n await onIntersect();\n } finally {\n setIsLoadingMore(false);\n }\n }\n }, [isLoadingMore, hasMorePages, isLoading, onIntersect]);\n\n // Handle intersection observer for infinite scroll\n useIntersectionObserver({\n rootElement: scrollableElement || wrapperRef.current,\n sentinelElement: shimmerElement,\n onIntersect: handleIntersect,\n threshold,\n enabled: !isLoading && (!!scrollableElement || !!wrapperRef.current) && hasMorePages && !!shimmerElement,\n });\n\n // Fallback: Check if all content is visible and trigger pagination immediately\n useEffect(() => {\n if (!hasMorePages || isLoading || !shimmerElement || isLoadingMore) {\n return;\n }\n\n // Use scrollableElement if available, otherwise use wrapperRef\n const container = scrollableElement || wrapperRef.current;\n if (!container) {\n return;\n }\n\n // Check if the container is not actually scrollable (all content fits)\n const isNotScrollable = container.scrollHeight <= container.clientHeight;\n \n if (isNotScrollable) {\n // Check if shimmer element is visible (all content including shimmer fits in viewport)\n const shimmerRect = shimmerElement.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n \n // If shimmer is within the visible area, trigger pagination\n const isShimmerVisible = \n shimmerRect.top >= containerRect.top &&\n shimmerRect.bottom <= containerRect.bottom;\n \n if (isShimmerVisible) {\n // Small delay to avoid immediate trigger on mount and allow DOM to settle\n const timeoutId = setTimeout(() => {\n // Double-check conditions before triggering\n if (!isLoadingMore && hasMorePages && !isLoading) {\n handleIntersect();\n }\n }, 300);\n \n return () => clearTimeout(timeoutId);\n }\n }\n }, [scrollableElement, wrapperRef, shimmerElement, hasMorePages, isLoading, isLoadingMore, handleIntersect]);\n\n return {\n isLoadingMore,\n };\n}\n\n","import EmptyState from '../EmptyState';\n\ninterface LoadErrorStateProps {\n /** What the listing shows — used only in the copy. */\n entityLabel: string;\n /** Re-issues the fetch exactly as it was issued. */\n onRetry: () => void;\n}\n\n/**\n * The state a listing shows when the request failed for a reason it cannot\n * recover from on its own — a 5xx from the proxy, a 401 session expiry, a\n * network drop, a 400 on a bad path.\n *\n * It exists because the alternative is worse than unhelpful: without it every\n * one of those failures falls through to \"No contacts found\", so a user whose\n * session expired and a user with a genuinely empty list see the same cheerful\n * screen.\n */\nexport default function LoadErrorState({ entityLabel, onRetry }: LoadErrorStateProps) {\n return (\n <div className=\"cm:px-12 cm:flex cm:flex-col cm:flex-1\">\n <EmptyState\n title={`Couldn't load ${entityLabel}`}\n subcopy=\"Something went wrong on our side. Try again in a moment.\"\n />\n <div className=\"cm:flex cm:justify-center cm:pb-8\">\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"cm:text-sm cm:font-medium cm:text-blue-600 cm:underline cm:cursor-pointer\"\n >\n Try again\n </button>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nconst SvgSentimentFacePositive = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 20, height: 20, viewBox: \"0 0 20 20\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"circle\", { cx: 10, cy: 10, r: 10, fill: \"#8CC8B5\" }), /* @__PURE__ */ React.createElement(\"circle\", { cx: 6.9, cy: 8.1, r: 0.95, fill: \"#2F5147\" }), /* @__PURE__ */ React.createElement(\"circle\", { cx: 13.1, cy: 8.1, r: 0.95, fill: \"#2F5147\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M6.7 12.2C7.5 13.35 8.65 14 10 14C11.35 14 12.5 13.35 13.3 12.2\", stroke: \"#2F5147\", strokeWidth: 1.2, strokeLinecap: \"round\" }));\nexport default SvgSentimentFacePositive;\n","import * as React from \"react\";\nconst SvgSentimentFaceNegative = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 20, height: 20, viewBox: \"-1 -1 22 22\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"circle\", { cx: 10, cy: 10, r: 10, fill: \"#F0AFA3\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M5.7 6.7L8 7.6M14.3 6.7L12 7.6\", stroke: \"#5C2E28\", strokeWidth: 1.1, strokeLinecap: \"round\" }), /* @__PURE__ */ React.createElement(\"circle\", { cx: 6.9, cy: 9.4, r: 0.95, fill: \"#5C2E28\" }), /* @__PURE__ */ React.createElement(\"circle\", { cx: 13.1, cy: 9.4, r: 0.95, fill: \"#5C2E28\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M6.7 14C7.5 12.85 8.65 12.2 10 12.2C11.35 12.2 12.5 12.85 13.3 14\", stroke: \"#5C2E28\", strokeWidth: 1.2, strokeLinecap: \"round\" }));\nexport default SvgSentimentFaceNegative;\n","import * as React from \"react\";\nconst SvgSentimentFaceNeutral = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 20, height: 20, viewBox: \"0 0 20 20\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"circle\", { cx: 10, cy: 10, r: 10, fill: \"#EFDD82\" }), /* @__PURE__ */ React.createElement(\"circle\", { cx: 6.9, cy: 8.3, r: 0.95, fill: \"#5C4F1E\" }), /* @__PURE__ */ React.createElement(\"circle\", { cx: 13.1, cy: 8.3, r: 0.95, fill: \"#5C4F1E\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M7 12.8H13\", stroke: \"#5C4F1E\", strokeWidth: 1.2, strokeLinecap: \"round\" }));\nexport default SvgSentimentFaceNeutral;\n","import AlertTriangleFilledIcon from '@/assets/insights/alert_triangle_filled.svg?react';\nimport PositiveFaceIcon from '@/assets/insights/sentiment_face_positive.svg?react';\nimport NegativeFaceIcon from '@/assets/insights/sentiment_face_negative.svg?react';\nimport NeutralFaceIcon from '@/assets/insights/sentiment_face_neutral.svg?react';\nimport Tooltip from '@/components/Tooltip';\n\nimport type { FC, SVGProps } from 'react';\nimport type { AccountHealthBand, AccountSentiment } from '@/types/api';\n\n/**\n * Customer Intelligence rollup cells for the accounts listing\n * (`account_sentiment` / `account_health` on `GET /v1/companies`).\n */\n\nconst SENTIMENT_META: Record<\n AccountSentiment,\n { Icon: FC<SVGProps<SVGSVGElement>>; label: string }\n> = {\n positive: { Icon: PositiveFaceIcon, label: 'Positive' },\n neutral: { Icon: NeutralFaceIcon, label: 'Neutral' },\n negative: { Icon: NegativeFaceIcon, label: 'Negative' },\n};\n\n/** \"Account Sentiment\" column cell: face icon + label; `-` when absent. */\nexport const AccountSentimentCell = ({\n sentiment,\n}: {\n sentiment?: AccountSentiment | null;\n}) => {\n const meta = sentiment ? SENTIMENT_META[sentiment] : null;\n if (!meta) {\n return <span className=\"cm:text-slate-text-subtle\">-</span>;\n }\n const { Icon, label } = meta;\n return (\n <span className=\"cm:inline-flex cm:items-center cm:gap-2\">\n <Icon width={18} height={18} className=\"cm:shrink-0\" />\n <span className=\"cm:text-slate-text-body\">{label}</span>\n </span>\n );\n};\n\nexport const AccountHealthIndicator = ({\n health,\n sentiment,\n}: {\n health?: AccountHealthBand | null;\n sentiment?: AccountSentiment | null;\n}) => {\n void sentiment;\n if (health !== 'at_risk') return null;\n return (\n <Tooltip\n content={\n <span className=\"cm:text-white cm:text-sm cm:font-normal cm:leading-5 cm:whitespace-nowrap\">\n This account is at risk\n </span>\n }\n triggerClassName=\"cm:inline-flex cm:shrink-0 cm:items-center\"\n >\n <span\n aria-label=\"This account is at risk\"\n className=\"cm:inline-flex cm:shrink-0 cm:items-center\"\n >\n <AlertTriangleFilledIcon width={14} height={14} />\n </span>\n </Tooltip>\n );\n};\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { DataTable } from \"hiver-ui-kit-extended\";\nimport { useNavigate } from \"react-router-dom\";\nimport { useCompaniesStore } from \"../../stores/companies\";\nimport { formatValue } from \"../../utils/formatValue\";\nimport { useTableInfiniteScroll } from \"../../hooks/useTableInfiniteScroll\";\nimport { GAINSIGHT_EVENTS } from \"@/constants/gainsightEvents\";\nimport { useRenderConfigStore } from \"@/stores/renderConfig\";\nimport EmptyState from \"../EmptyState\";\nimport LoadErrorState from \"./LoadErrorState\";\nimport Loader from \"../Loader\";\nimport TruncatedText from \"../TruncatedText\";\nimport { AccountHealthIndicator, AccountSentimentCell } from \"./insightCells\";\n\nimport type { AccountHealthBand, AccountSentiment } from \"@/types/api\";\n\n// Shimmer cell component\nconst ShimmerCell = () => (\n <div className=\"cm:h-4 cm:bg-gray-200 cm:rounded cm:w-3/4 cm:animate-pulse\"></div>\n);\n\n// Name cell component — CI risk indicator (at-risk triangle) beside the name\nconst NameCell = ({ name, health, sentiment }: { name: string; health?: AccountHealthBand | null; sentiment?: AccountSentiment | null }) => (\n <span className=\"cm:inline-flex cm:min-w-0 cm:items-center cm:gap-1.5\">\n <TruncatedText text={name} className=\"text-slate-900\" />\n <AccountHealthIndicator health={health} sentiment={sentiment} />\n </span>\n);\n\n// Domain cell component\nconst DomainCell = ({ domain }: { domain: string }) => (\n <TruncatedText text={domain} className=\"text-slate-900\" />\n);\n\nconst BASE_COLUMNS = [\n {\n id: \"name\",\n field: \"nameDisplay\",\n label: \"Account name\",\n },\n {\n id: \"domain\",\n field: \"domainDisplay\",\n label: \"Domain\",\n },\n];\n\nconst ACCOUNT_SENTIMENT_COLUMN = {\n id: \"account_sentiment\",\n field: \"accountSentimentDisplay\",\n label: \"Account Sentiment\",\n};\n\ninterface AccountTableProps {\n /** Customer Intelligence gate — adds the sentiment column + at-risk indicator. */\n ciEnabled?: boolean;\n}\n\nexport default function AccountTable({ ciEnabled = false }: AccountTableProps = {}) {\n const navigate = useNavigate();\n const columns = useMemo(\n () => (ciEnabled ? [...BASE_COLUMNS, ACCOUNT_SENTIMENT_COLUMN] : BASE_COLUMNS),\n [ciEnabled]\n );\n const { data, isLoading, error, errorStatus, fetchCompanies, fetchNextPage } =\n useCompaniesStore();\n const wrapperRef = useRef<HTMLDivElement>(null);\n const callbacks = useRenderConfigStore((state) => state.callbacks);\n const [isInitialFetch, setIsInitialFetch] = useState(true);\n\n useEffect(() => {\n setIsInitialFetch(true);\n fetchCompanies().finally(() => {\n setIsInitialFetch(false);\n });\n }, [fetchCompanies]);\n\n // Calculate if there are more pages to load\n const hasMorePages = useMemo(() => {\n if (!data) return false;\n const { total, page, page_size } = data;\n // Check if current loaded items are less than total\n return page * page_size < total;\n }, [data]);\n\n // Transform company results to table data\n const tableData = useMemo(() => {\n if (!data?.companies) return [];\n\n const companies = data.companies.map((company) => ({\n id: company.id,\n name: formatValue(\n company.generated_name ? company.generated_name : company.name\n ),\n domain: formatValue(company.domains[0]?.name || company.generated_name),\n nameDisplay: (\n <NameCell\n name={formatValue(\n company.generated_name ? company.generated_name : company.name\n )}\n health={ciEnabled ? company.account_health : undefined}\n sentiment={ciEnabled ? company.account_sentiment : undefined}\n />\n ),\n domainDisplay: (\n <DomainCell\n domain={formatValue(\n company.domains[0]?.name || company.generated_name\n )}\n />\n ),\n ...(ciEnabled\n ? {\n accountSentimentDisplay: (\n <AccountSentimentCell sentiment={company.account_sentiment} />\n ),\n }\n : {}),\n isNoDataRow: false,\n }));\n\n // Add shimmer rows at the end when there are more pages\n if (hasMorePages) {\n const shimmerRows = Array.from({ length: 3 }, (_, index) => ({\n id: `shimmer-${index}`,\n name: \"\",\n domain: \"\",\n nameDisplay: <ShimmerCell />,\n domainDisplay: <ShimmerCell />,\n ...(ciEnabled ? { accountSentimentDisplay: <ShimmerCell /> } : {}),\n isShimmerRow: true,\n isNoDataRow: true,\n }));\n return [...companies, ...shimmerRows];\n }\n\n return companies;\n }, [data, isLoading, hasMorePages, ciEnabled]);\n\n // Check if we should show empty state - only when loading is done and we have no data\n const showEmptyState = useMemo(() => {\n return (\n !isLoading && (!data || !data.companies || data.companies.length === 0)\n );\n }, [isLoading, data]);\n\n // Handle infinite scroll with reusable hook\n useTableInfiniteScroll({\n wrapperRef,\n tableData,\n isLoading,\n hasMorePages,\n onIntersect: async () => {\n if (hasMorePages) {\n await fetchNextPage();\n }\n },\n threshold: 200,\n });\n\n // A failure — 5xx from the proxy, 401 session expiry, a network drop — is\n // not \"you have no accounts\"; retry the fetch as it was issued.\n const handleRetry = () => {\n fetchCompanies();\n };\n\n const handleAccountClick = (event: {\n data: { id: string; isNoDataRow?: boolean };\n }) => {\n const data = event.data;\n // Don't navigate if it's a no-data row\n if (data.isNoDataRow) {\n return;\n }\n callbacks?.sendGainsightEvent?.(GAINSIGHT_EVENTS.ACCOUNT_ROW_CLICKED);\n navigate(`/accounts/${data.id}`);\n };\n\n // Show loader while loading, during initial fetch, OR if we don't have data yet\n if (isInitialFetch || (isLoading && (!data || !data.companies || data.companies.length === 0))) {\n return (\n <div className=\"cm:flex cm:items-center cm:justify-center cm:w-full cm:h-full\">\n <Loader />\n </div>\n );\n }\n\n // The error state is scoped to \"nothing on screen\": `errorStatus` is one\n // store field written by the initial fetch *and* by `fetchNextPage`, so\n // without this guard a failure while paginating would replace the rows the\n // user is already reading with a full-screen recovery state.\n const hasRows = (data?.companies?.length ?? 0) > 0;\n\n // Any failure is a failure, not an empty list. Without this a 500, a\n // 401 or an offline browser all render as \"No accounts yet\".\n if ((errorStatus !== null || error) && !hasRows) {\n return <LoadErrorState entityLabel=\"accounts\" onRetry={handleRetry} />;\n }\n\n // Show empty state when we have data but no companies OR if tableData is empty\n if (showEmptyState || tableData.length === 0) {\n return (\n <div className=\"cm:px-12 cm:flex cm:flex-col cm:flex-1\">\n <EmptyState\n title=\"No accounts yet\"\n subcopy=\"Accounts will start showing up here when new conversations are created.\"\n />\n </div>\n );\n }\n\n // Only show table if we have valid data with companies\n return (\n <>\n <style>\n {`\n .cm-root .omni-datatable .p-datatable-tbody > tr > td{\n border-bottom: none !important;\n }`}\n </style>\n <div className=\"cm:px-12 cm:w-full cm:flex cm:flex-col cm:flex-1 cm:min-h-0 account-table-datatable\" ref={wrapperRef}>\n <DataTable\n scrollable={true}\n scrollHeight=\"calc(var(--cm-container-height, 100vh) - 160px)\"\n value={tableData}\n columns={columns}\n onRowClick={handleAccountClick}\n loading={false}\n />\n </div>\n </>\n );\n}\n","import { create } from 'zustand'\n\nimport type { EntityFilterPayload } from '@/types/entity'\nimport type { ENTITY_TYPE } from '@/types/custom-fields'\n\nexport type FiltersState = Record<ENTITY_TYPE, { filters: EntityFilterPayload }> & {\n setFilters: (entityType: ENTITY_TYPE, filters: EntityFilterPayload) => void\n}\n\nexport const useFiltersStore = create<FiltersState>((set) => ({\n company: { filters: [] },\n contact: { filters: [] },\n setFilters: (entityType, filters) => set({ [entityType]: { filters } }),\n}))","import { useCallback, useEffect, useRef } from \"react\";\n\ntype IntersectCallback = (\n entry: IntersectionObserverEntry,\n observer: IntersectionObserver\n) => void;\n\nconst defaultSelectTargetNode = ( node?: HTMLElement | null ) => node ?? null;\n\ninterface UseIntersectObserverProps {\n callback: IntersectCallback;\n selectTargetNode?: ( node?: HTMLElement | null ) => HTMLElement | null;\n rootMargin?: string;\n threshold?: IntersectionObserverInit[\"threshold\"];\n}\n\nexport function useIntersectObserver({\n callback,\n selectTargetNode = defaultSelectTargetNode,\n rootMargin = \"0px\",\n threshold = 0,\n}: UseIntersectObserverProps) {\n const callbackRef = useRef(callback);\n const selectTargetNodeRef = useRef(selectTargetNode);\n const observerRef = useRef<IntersectionObserver | null>(null);\n const targetNodeRef = useRef<Element | null>(null);\n const parentNodeRef = useRef<Element | null>(null);\n\n callbackRef.current = callback;\n selectTargetNodeRef.current = selectTargetNode;\n\n const startObserving = useCallback((isParent: boolean) => { \n if (!parentNodeRef.current || !targetNodeRef.current) { \n return;\n }\n\n if( observerRef.current ) {\n observerRef.current.unobserve(targetNodeRef.current);\n }\n\n if(isParent || !observerRef.current){\n observerRef.current = new IntersectionObserver(\n (entries, currentObserver) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n callbackRef.current(entry, currentObserver);\n }\n });\n },\n {\n root: parentNodeRef.current,\n rootMargin,\n threshold,\n }\n );\n }\n\n observerRef.current.observe(targetNodeRef.current);\n \n }, [rootMargin, threshold]);\n\n const unobserve = useCallback(() => {\n if (!observerRef.current) {\n return;\n }\n\n if(targetNodeRef.current)observerRef.current.unobserve(targetNodeRef.current);\n observerRef.current.disconnect();\n observerRef.current = null;\n }, []);\n\n const parentCbRef = useCallback((node: HTMLElement | null) => {\n parentNodeRef.current = node;\n startObserving(true);\n }, [startObserving]);\n\n const targetCbRef = useCallback((node: HTMLElement | null) => {\n targetNodeRef.current = selectTargetNodeRef.current(node);\n startObserving(false);\n }, [startObserving]);\n\n useEffect(() => {\n startObserving(false); // start observing if unobserved during mounting\n return () => {\n unobserve();\n };\n }, [unobserve, startObserving]);\n\n return {\n parentCbRef,\n targetCbRef,\n unobserve,\n };\n}\n","import { useState, useEffect } from \"react\";\nexport const useDelayedState = <T = unknown>( state: T, delay: number ) =>{\n const [delayed, setDelayed] = useState(state);\n \n useEffect(() => {\n const timeoutId = setTimeout(() => {\n setDelayed(state);\n }, delay)\n \n return () => clearTimeout(timeoutId);\n }, [state, delay]);\n \n return delayed;\n}","import { useRenderConfigStore } from '@/stores/renderConfig';\n\n\nexport const getCFApiCallback = () => useRenderConfigStore.getState().callbacks?.cfApiCallback!;","import { useRenderConfigStore } from '@/stores/renderConfig';\nimport { SCOPES } from '@/constants/custom-fields';\nimport { ENDPOINTS } from '@/constants/endpoints';\nimport { getCFApiCallback } from './callback';\n\nimport type { GetCFConfigsResponse, ENTITY_TYPE, SCOPE } from '@/types/custom-fields';\n\n\nexport type GetCFConfigsParams = {\n entity_type: ENTITY_TYPE;\n scope?: SCOPE;\n}\n\nexport const getCFConfigs = async (\n { entity_type, scope = SCOPES.ACCOUNT }: GetCFConfigsParams\n): Promise<GetCFConfigsResponse> => {\n const cfApiCallback = getCFApiCallback();\n const config = useRenderConfigStore.getState().config!;\n const response = await cfApiCallback<GetCFConfigsResponse>(ENDPOINTS.GET_CUSTOM_FIELDS, {\n method: 'GET',\n params: {\n scope,\n entity_type,\n ug_id: config.accountId\n }\n });\n return response.data as GetCFConfigsResponse;\n};","export const __BASE_QUERIES = {\n COMPANIES: 'companies',\n COMPANIES_WITH_FILTERS: 'companies-with-filters',\n CONTACTS: 'contacts',\n CONTACTS_WITH_FILTERS: 'contacts-with-filters',\n CUSTOM_FIELDS_COLUMNS: 'custom-fields-columns',\n CUSTOM_FIELDS_LIST: 'custom-fields-list',\n ENTITY_SUMMARY: 'entity-summary',\n IMPORT_JOB_HISTORY: 'import-job-history',\n CRM_SYNC_RUNS: 'crm-sync-runs',\n CRM_SYNC_STATUS: 'crm-sync-status',\n EXCLUDED_DOMAINS: 'excluded-domains',\n} as const;\n\ntype UniqueQueryKeys<T extends Record<string,string>> = { [ key in keyof T]: T[key] extends T[keyof Omit<T, key>] ? never : T[key] };\n\nexport const QUERIES: UniqueQueryKeys<typeof __BASE_QUERIES> = __BASE_QUERIES;","import { useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { getCFConfigs } from '@/services/custom-fields/get-config';\nimport { QUERIES } from '@/constants/queries';\n\nimport type { ENTITY_TYPE, CustomField } from '@/types/custom-fields';\n\n\nexport type UseCFListParams = {\n entity_type: ENTITY_TYPE;\n}\n\nexport const useCFList = ({ entity_type }: UseCFListParams) => {\n\n const queryClient = useQueryClient();\n const queryProps = useQuery<CustomField[]>({\n queryKey: [QUERIES.CUSTOM_FIELDS_LIST, entity_type],\n queryFn: async () => {\n const data = await getCFConfigs({ entity_type });\n const entityData = data.account_custom_fields.find(item => item.entity_type === entity_type);\n return (entityData?.custom_fields ?? []) as CustomField[];\n },\n });\n\n const updateData = (field: CustomField) => {\n queryClient.setQueryData([QUERIES.CUSTOM_FIELDS_LIST, entity_type], (previous?: CustomField[]) => {\n if(!previous) return [];\n return previous.map(item => item?.cf_id === field.cf_id ? field : item);\n });\n }\n\n return { ...queryProps, updateData };\n};\n","import { apiClient } from './axios';\nimport { ENDPOINTS } from '@/constants/endpoints';\n\nexport type UpdateDomainsListParams = {\n domains: string[];\n}\n\nexport type DeleteDomainParams = {\n domain: string;\n}\n\nexport const getExcludedDomainsList = async (): Promise<string[]> => {\n const response = await apiClient(ENDPOINTS.EXCLUDED_DOMAINS, {\n method: 'GET'\n });\n const data = (response.data?.domains || []) as string[];\n return data;\n};\n\n\nexport const updateDomainsList = async (\n { domains }: UpdateDomainsListParams\n): Promise<boolean> => {\n\n const data = {\n domains\n } \n const response = await apiClient(ENDPOINTS.EXCLUDED_DOMAINS, {\n method: 'POST',\n data,\n });\n if( response.status === 200 ) {\n return true;\n }\n return false;\n};\n\nexport const deleteDomain = async (\n { domain }: DeleteDomainParams\n): Promise<boolean|string> => {\n\n const queryParams = new URLSearchParams();\n queryParams.append('domains', domain);\n\n const url = `${ENDPOINTS.EXCLUDED_DOMAINS}?${queryParams.toString()}`;\n const response = await apiClient(url, {\n method: 'DELETE'\n });\n if( response.status === 200 ) {\n return domain;\n }\n return false;\n};\n","import { useQuery } from '@tanstack/react-query';\nimport { getExcludedDomainsList } from '@/services/excluded-domains';\n\nimport { QUERIES } from '@/constants/queries';\n\nexport const useExcludedDomains = ( enabled: boolean = true ) => {\n return useQuery({\n queryKey: [QUERIES.EXCLUDED_DOMAINS],\n queryFn: () => getExcludedDomainsList(),\n enabled,\n });\n};","import { type MouseEvent, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { useRenderConfigStore } from \"@/stores/renderConfig\";\n\ntype DrawerPosition = \"left\" | \"right\";\n\nexport type DrawerProps = {\n open: boolean;\n children: ReactNode;\n className?: string;\n showOverlay?: boolean;\n closeOnOverlayClick?: boolean;\n position?: DrawerPosition;\n width?: number | string;\n onClose: () => void;\n};\n\nexport const Drawer = ({\n open,\n children,\n className = \"\",\n showOverlay = true,\n closeOnOverlayClick = true,\n position = \"right\",\n width,\n onClose,\n}: DrawerProps) => {\n\n const rootElement = useRenderConfigStore( (state) => state.meta.rootElement );\n\n if (!rootElement) {\n return null;\n }\n\n /**\n * Closes only for a click that actually landed outside the panel — the\n * container itself, or the dim overlay.\n *\n * This used to be a bare `onClose()` here plus `stopPropagation()` on the\n * panel, which stopped a panel click bubbling up to it. That worked, but\n * `stopPropagation` stops the click reaching `document` too, and `document` is\n * where every overlay component listens for its click-away: primereact's\n * Dropdown and MUI's Menu both. So a select opened inside a drawer could not\n * be dismissed by clicking elsewhere in the drawer — it stayed open, holding\n * focus, and the drawer read as frozen. `CrmSelect` already carried a bespoke\n * `mousedown` workaround for exactly this.\n *\n * Comparing target to currentTarget gets the same containment answer without\n * interfering with the click, so the event still reaches `document`.\n */\n const handleContainerClick = (event: MouseEvent<HTMLElement>) => {\n if (event.target !== event.currentTarget) return;\n if (closeOnOverlayClick) onClose();\n };\n\n const handleOverlayClick = () => {\n if (closeOnOverlayClick) onClose();\n };\n\n const getPanelClasses = ({ position, open }: {position: DrawerPosition, open: boolean}) => {\n const margin = position === \"left\" ? \"cm:mr-auto\" : \"cm:ml-auto\";\n const translate = position === \"left\" ? \"cm:translate-x-[-100%]\" : \"cm:translate-x-full\";\n const visible = open ? \"cm:translate-x-0\" : `${translate} cm:pointer-events-none`;\n return `${margin} ${visible}`;\n }\n\n const getBackdropClasses = ({ open }: {open: boolean}) => {\n const visible = open ? \"cm:opacity-100\" : \"cm:opacity-0 cm:pointer-events-none\";\n return `${visible}`;\n }\n return createPortal(\n <div\n className={`cm:fixed cm:inset-0 cm:z-[999] cm:flex cm:transition-opacity cm:duration-300 ${getBackdropClasses({ open })}`}\n onClick={handleContainerClick}\n role=\"presentation\"\n >\n {showOverlay ? (\n <div className=\"cm:absolute cm:inset-0 cm:bg-slate-900/35\" onClick={handleOverlayClick} />\n ) : null}\n\n <section\n className={`cm-drawer-panel cm:relative cm:z-10 cm:h-full cm:w-[560px] cm:bg-white cm:flex cm:flex-col cm:transition-transform cm:duration-300 ${getPanelClasses({ position, open })} ${className}`}\n style={width !== undefined ? { width } : undefined}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <div className=\"cm:flex-1 cm:min-h-0\">{children}</div>\n </section>\n </div>,\n rootElement\n );\n}\n","import * as React from \"react\";\nconst SvgDownload = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 60, height: 60, viewBox: \"0 0 60 60\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M0 0 C0.99 0.33 1.98 0.66 3 1 C3.495 15.355 3.495 15.355 4 30 C6.97 27.03 9.94 24.06 13 21 C14.32 20.67 15.64 20.34 17 20 C17.91796875 22.046875 17.91796875 22.046875 18 25 C16.11608783 27.76233457 13.7361895 29.96161932 11.3125 32.25 C10.3544043 33.20519531 10.3544043 33.20519531 9.37695312 34.1796875 C3.89977088 39.50393911 3.89977088 39.50393911 0 40 C-1.859375 38.84765625 -1.859375 38.84765625 -3.75 37.0625 C-4.43449219 36.41667969 -5.11898438 35.77085938 -5.82421875 35.10546875 C-6.54222656 34.41066406 -7.26023437 33.71585938 -8 33 C-8.76957031 32.31550781 -9.53914063 31.63101563 -10.33203125 30.92578125 C-11.06808594 30.24902344 -11.80414063 29.57226562 -12.5625 28.875 C-13.24441406 28.25367187 -13.92632813 27.63234375 -14.62890625 26.9921875 C-16 25 -16 25 -15.71484375 22.2578125 C-15.47894531 21.51273438 -15.24304687 20.76765625 -15 20 C-10.95838045 21.34484714 -8.61321846 23.0505162 -5.6875 26.125 C-4.99011719 26.84945313 -4.29273438 27.57390625 -3.57421875 28.3203125 C-3.05472656 28.87460937 -2.53523438 29.42890625 -2 30 C-1.97494385 29.12674072 -1.9498877 28.25348145 -1.92407227 27.35375977 C-1.82912291 24.12397448 -1.72987971 20.89435846 -1.62768555 17.66479492 C-1.58428566 16.26510801 -1.54261436 14.86536641 -1.50268555 13.46557617 C-1.44510555 11.45738505 -1.38086 9.44938851 -1.31640625 7.44140625 C-1.27974854 6.23170166 -1.24309082 5.02199707 -1.20532227 3.77563477 C-1 1 -1 1 0 0 Z \", fill: \"currentColor\", transform: \"translate(29,5)\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M0 0 C0.85049423 0.00222061 1.70098846 0.00444122 2.57725525 0.00672913 C4.01863609 0.00684242 4.01863609 0.00684242 5.48913574 0.00695801 C7.05630592 0.01469994 7.05630592 0.01469994 8.65513611 0.02259827 C9.71913132 0.02401321 10.78312653 0.02542816 11.87936401 0.02688599 C15.29293069 0.03250388 18.70643286 0.04505941 22.11997986 0.05775452 C24.42792162 0.06276721 26.73586441 0.06733052 29.04380798 0.07142639 C34.71505412 0.08247912 40.38626238 0.09923465 46.05747986 0.12025452 C46.61997986 2.05775452 46.61997986 2.05775452 47.05747986 4.12025452 C46.05747986 5.12025452 46.05747986 5.12025452 44.11495972 5.24050903 C43.26446548 5.23828842 42.41397125 5.23606781 41.53770447 5.23377991 C40.09632362 5.23366661 40.09632362 5.23366661 38.62582397 5.23355103 C37.58104385 5.22838974 36.53626373 5.22322845 35.45982361 5.21791077 C34.3958284 5.21649582 33.33183319 5.21508087 32.2355957 5.21362305 C28.82202903 5.20800515 25.40852686 5.19544963 21.99497986 5.18275452 C19.68703809 5.17774182 17.37909531 5.17317852 15.07115173 5.16908264 C9.39990559 5.15802991 3.72869733 5.14127438 -1.94252014 5.12025452 C-2.50502014 3.18275452 -2.50502014 3.18275452 -2.94252014 1.12025452 C-1.94252014 0.12025452 -1.94252014 0.12025452 0 0 Z \", fill: \"currentColor\", transform: \"translate(7.9425201416015625,49.87974548339844)\" }));\nexport default SvgDownload;\n","import { IS_HUI } from \"@/constants/uiFramework\";\n\n// hui: the design system's own glyphs.\nimport {\n Activity,\n Arrange,\n InfoCircle,\n SearchMd,\n Trash01,\n UploadCloud01,\n Columns03,\n Download01,\n Plus,\n FilterFunnel01,\n Rows03,\n Settings01,\n XClose,\n ChevronSelectorVertical,\n ChevronUp,\n ChevronDown,\n} from \"hiver-ui-kit-extended/icons\";\n\n// prime: the local assets Omni has always drawn. Unchanged, deliberately.\nimport CFConfigIcon from \"@/assets/cf-config.svg?react\";\nimport ColumnsIcon from \"@/assets/columns.svg?react\";\nimport DownloadIcon from \"@/assets/download.svg?react\";\nimport FilterIcon from \"@/assets/filter.svg?react\";\nimport SettingsIcon from \"@/assets/settings.svg?react\";\nimport SettingIcon from \"@/assets/setting.svg?react\";\nimport ActivityIcon from \"@/assets/activity_icon.svg?react\";\nimport SearchIcon from \"@/assets/search.svg?react\";\nimport DragIcon from \"@/assets/drag_icon.svg?react\";\nimport CloseBoldIcon from \"@/assets/close_bold.svg?react\";\nimport InfoIcon from \"@/assets/info.svg?react\";\nimport PlusIcon from \"@/assets/plus.svg?react\";\nimport FileIcon from \"@/assets/file.svg?react\";\nimport CloseIcon from \"@/assets/close.svg?react\";\nimport SortNormalIcon from \"@/assets/sort_normal.svg?react\";\nimport SortAscIcon from \"@/assets/sort_asc.svg?react\";\n\n/**\n * Per-build glyph selection, resolved once at module scope.\n *\n * WHY THIS FILE EXISTS — AND WHY THE ICONS ARE NOT SWAPPED AT THE CALL SITE.\n *\n * The brief is \"all icons from hiver-ui-kit\", but the components that draw them\n * (`FilterTrigger`, `PreferenceTrigger`, the toolbar actions, the import menu)\n * are SHARED by both entry points. Importing a kit glyph directly into them\n * changes Omni twice over: it renders a different drawing, and its artifact\n * picks up `@hiver/hiver-ui-kit/dist/v2Icons/*` modules it has never carried.\n * The second one is caught by TC-DATA-01, which asserts prime's sourcemap\n * `sources` contain no hui modules at all — it failed on exactly this, listing\n * ten `v2Icons` entries.\n *\n * `IS_HUI` is a `vite.config.ts` `define`, so it is a folded literal by the time\n * Rollup runs. Each ternary below collapses to one side and the other import\n * becomes unreferenced and is dropped — the same dead-code elimination that\n * keeps `SideNav` out of prime and `TabsSection` out of hui, which TC-HP-08\n * already proves works. So prime keeps its own assets and its artifact stays\n * clean; hui gets the kit set.\n *\n * Resolved at module scope rather than inside each component so the mapping is\n * one readable table, and so the ternary is evaluated once rather than on every\n * render.\n */\nexport const FilterGlyph = IS_HUI ? FilterFunnel01 : FilterIcon;\nexport const ColumnsGlyph = IS_HUI ? Columns03 : ColumnsIcon;\nexport const FieldsConfigGlyph = IS_HUI ? Rows03 : CFConfigIcon;\nexport const SettingsGlyph = IS_HUI ? Settings01 : SettingsIcon;\nexport const DownloadGlyph = IS_HUI ? Download01 : DownloadIcon;\n/* The drawer tab strip. `setting.svg` and `settings.svg` are two different local\n assets — the singular one is the tab's, the plural one the toolbar's — which is\n exactly the kind of thing the kit set removes. */\nexport const TabSettingsGlyph = IS_HUI ? Settings01 : SettingIcon;\nexport const TabActivityGlyph = IS_HUI ? Activity : ActivityIcon;\nexport const SearchGlyph = IS_HUI ? SearchMd : SearchIcon;\n/* `Arrange` is the 2x3 grip — one of the four glyphs added to the toolkit\n because the kit has no equivalent (`DotsGrid` is a 3x3 apps affordance). */\nexport const DragHandleGlyph = IS_HUI ? Arrange : DragIcon;\n/* Omni removes a row with an ✕; HiG uses a bin. Not interchangeable — an ✕ on a\n list row reads as \"dismiss\", a bin as \"delete\", and this one deletes. */\nexport const DeleteGlyph = IS_HUI ? Trash01 : CloseBoldIcon;\nexport const InfoGlyph = IS_HUI ? InfoCircle : InfoIcon;\nexport const UploadGlyph = IS_HUI ? UploadCloud01 : FileIcon;\n/* D-02 draws \"+ Create account\" — the plus is part of the label, not decoration. */\nexport const PlusGlyph = IS_HUI ? Plus : PlusIcon;\n\n/* The ✕ in every drawer and modal header. */\nexport const CloseGlyph = IS_HUI ? XClose : CloseIcon;\n\n/* Sortable column headers. Omni draws its own up/down pair and rotates the\n ascending glyph 180° for descending; HiG uses the line set's chevrons — the\n vertical selector for \"unsorted\", a single chevron once a direction is set —\n so descending is its own glyph there rather than a transform (prime never\n renders `SortDescGlyph`; the header rotates `SortAscGlyph` instead). Sized by\n `.cm-sort-icon svg` in design-system.hui.css — the kit's line glyphs default\n to 24px, and sizing them in CSS keeps prime's call sites byte-identical. */\nexport const SortNeutralGlyph = IS_HUI ? ChevronSelectorVertical : SortNormalIcon;\nexport const SortAscGlyph = IS_HUI ? ChevronUp : SortAscIcon;\nexport const SortDescGlyph = IS_HUI ? ChevronDown : SortAscIcon;\n","import type { ReactNode } from \"react\";\n\nimport { CloseGlyph } from \"@/components/Icon/glyphs\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\n\nexport type DrawerHeaderProps = {\n title: ReactNode;\n onClose: () => void;\n className?: string;\n titleClassName?: string;\n actions?: ReactNode;\n};\n\nexport const DrawerHeader = ({\n title,\n onClose,\n className = \"\",\n titleClassName = \"\",\n actions,\n}: DrawerHeaderProps) => {\n return (\n <header\n className={`cm:flex cm:items-center cm:justify-between cm:gap-3 cm:px-7 cm:py-4 cm:border-b cm:border-[#edf1f6] cm:shrink-0 ${className}`}\n >\n <h2\n className={`cm:text-lg cm:leading-6 cm:text-slate-700 cm:font-medium! ${titleClassName}`}\n >\n {title}\n </h2>\n {actions && (\n <div className=\"cm:flex cm:items-center cm:gap-3 cm:flex-shrink-0\">\n {actions}\n </div>\n )}\n <button\n type=\"button\"\n aria-label=\"Close\"\n onClick={onClose}\n className=\"cm:flex cm:h-8 cm:w-8 cm:items-center cm:justify-center cm:rounded-md cm:bg-transparent cm:border-0 cm:cursor-pointer cm:text-slate-icons-subtle cm:hover:bg-[#F1F5F9]\"\n >\n {/* HiG's IconButton is 32px with a 16px glyph; Omni's has always drawn 20. */}\n <CloseGlyph width={IS_HUI ? 16 : 20} height={IS_HUI ? 16 : 20} />\n </button>\n </header>\n );\n};\n","import { cn } from \"@/utils/classNames\";\n\nexport const Counter = ({\n value,\n max,\n hidden = false,\n}: {\n value: number;\n max: number;\n hidden?: boolean;\n}) => (\n <span\n className={cn(\n \"cm:text-[12px] cm:font-normal cm:text-slate-text-subtle cm:whitespace-nowrap cm:pointer-events-none\",\n hidden && \"cm:invisible\",\n )}\n >\n {value}/{max}\n </span>\n);","import { cn } from \"@/utils/classNames\";\nimport { TextField as HiverTextField } from \"hiver-ui-kit-extended\";\n\nimport { Counter } from \"./counter\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\n\nimport type { ChangeEvent } from \"react\";\nimport type { TextFieldProps as HiverTextFieldProps } from \"hiver-ui-kit-extended\";\n\nexport type TextFieldProps = HiverTextFieldProps & {\n maxLength?: number;\n onBlur?: () => void;\n}\n\nexport const TextField = ({ className = '', maxLength, error = false, onChange, onBlur, ...props }: TextFieldProps) => {\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (maxLength && event.target.value.length > maxLength) return;\n onChange?.(event);\n }\n\n /** always pass counter if maxLength is present to avoid input unmounting */\n const valueLength = props.value?.length ?? 0;\n const counter = maxLength ? (\n <Counter value={valueLength} max={maxLength} hidden={valueLength === 0} />\n ) : undefined;\n\n return <HiverTextField\n {...props}\n className={cn(\n error && \"cm:[&_input]:border-error-border! cm:[&_input]:shadow-none!\",\n \"cm:w-full cm:text-[14px]!\",\n \"cm:[&_input]:py-[8px]! cm:[&_input]:border-solid! cm:[&_input]:border-[1.5px]!\",\n // Disabled: match the Domain (ChipField) border and use a lighter fill.\n \"cm:[&_input:disabled]:border-slate-border-light! cm:[&_input:disabled]:bg-slate-surface-subtle-150! cm:[&_input:disabled]:opacity-100!\",\n className\n )}\n height={40}\n // hui: v2 `Input` draws its own error state on the outline. This wrapper\n // used to keep `error` to itself and express it only through the\n // `[&_input]` utilities above, which target the inner <input> — on v2\n // that is not the element with the border, so text / email / number\n // fields in error showed no border at all. Prime keeps the utilities\n // and does not receive the prop, exactly as before.\n error={IS_HUI ? error : undefined}\n onChange={handleChange}\n onBlur={onBlur}\n icon={counter}\n iconPosition={counter ? \"right\" : undefined}\n />;\n};","export const ScopedStyles = ({ children }: { children: React.ReactNode }) => {\n return (\n <style>\n {`\n @scope(.cm-root) {\n ${children}\n }\n `}\n </style>\n )\n}","import { Select as KitSelect } from \"hiver-ui-kit-extended\";\nimport { cn } from \"@/utils/classNames\";\nimport { useRenderConfigStore } from \"@/stores/renderConfig\";\nimport { ScopedStyles } from \"../Styles\";\n\nimport type { SelectProps as KitSelectProps } from \"hiver-ui-kit-extended\";\n\n/**\n * AF-2: this reached `primereact/dropdown` directly until now, which put\n * primereact into the hui artifact regardless of `resolve.conditions` — a\n * direct package specifier has no `hui` variant for the resolver to pick.\n *\n * The toolkit's prime variant is this wrapper's own former body: `Dropdown`\n * with `cn(\"form-dropdown\", className)` and `cn(\"form-dropdown-panel\",\n * panelClassName)`. Those two class names therefore move to the toolkit and are\n * dropped from the strings below — everything else stays here, including the\n * `<ScopedStyles>` block, because the toolkit ships no CSS for them. Omni's\n * class list is unchanged.\n */\n\nexport type SelectOption<T = string> = {\n label: string;\n value: T;\n icon?: string;\n};\n\nexport const Select = ({ className = \"\", ...props }: KitSelectProps) => {\n const globalMountElement = useRenderConfigStore((state) => state.meta.globalMountElement);\n const isDark = useRenderConfigStore((state) => state.theme === \"dark\");\n\n // Keep dropdown rows neutral in dark mode. A selected value still needs a\n // visible state, but a blue/slate fill is too prominent for this menu.\n const hoverBg = isDark\n ? \"var(--cm-color-charcoal-surface-hover)\"\n : \"var(--color-slate-surface-subtle)\";\n const highlightBg = isDark\n ? \"var(--cm-color-charcoal-surface-active)\"\n : \"#f1f5f9\";\n const itemText = isDark\n ? \"var(--cm-color-charcoal-text-primary)\"\n : \"var(--color-slate-text-body)\";\n const disabledBg = isDark\n ? \"var(--cm-form-field-disabled-background)\"\n : \"var(--color-slate-surface-subtle-150)\";\n const disabledBorder = isDark\n ? \"var(--cm-form-field-border)\"\n : \"var(--color-slate-border-light)\";\n const disabledText = isDark\n ? \"var(--cm-form-field-disabled-color)\"\n : \"var(--color-slate-text-disabled)\";\n\n return (\n <>\n <ScopedStyles>\n {`\n .form-dropdown .p-dropdown-label{\n font-size: 14px !important;\n padding: 8px !important;\n }\n .form-dropdown.p-disabled{\n opacity: 1 !important;\n background: ${disabledBg} !important;\n border-color: ${disabledBorder} !important;\n }\n .form-dropdown.p-disabled .p-dropdown-label{\n color: ${disabledText} !important;\n }\n .form-dropdown .p-dropdown-trigger{\n width: 36px !important;\n }\n .form-dropdown .p-dropdown-trigger svg {\n width: 10px !important;\n height: 10px !important;\n }\n .form-dropdown-panel .p-dropdown-items-wrapper ul{\n padding: 4px !important;\n }\n .form-dropdown-panel .p-dropdown-items-wrapper li{\n padding: 8px 10px !important;\n border-radius: 6px !important;\n }\n .form-dropdown-panel .p-dropdown-items-wrapper li.p-dropdown-item:hover,\n .form-dropdown-panel .p-dropdown-items-wrapper li.p-dropdown-item.p-focus{\n background-color: ${hoverBg} !important;\n color: ${itemText} !important;\n }\n .form-dropdown-panel .p-dropdown-items-wrapper li.p-dropdown-item.p-highlight{\n background-color: ${highlightBg} !important;\n color: ${itemText} !important;\n }\n .form-dropdown-panel .p-dropdown-items-wrapper li.p-dropdown-item.p-highlight:hover,\n .form-dropdown-panel .p-dropdown-items-wrapper li.p-dropdown-item.p-highlight.p-focus{\n background-color: ${highlightBg} !important;\n color: ${itemText} !important;\n }\n `}\n </ScopedStyles>\n <KitSelect\n {...props}\n className={cn(\"cm:w-full cm:text-[14px]! cm:[& span]:text-[14px]!\", className)}\n panelClassName=\"cm:text-[14px]! cm:pointer-events-auto!\"\n appendTo={globalMountElement}\n />\n </>\n );\n};\n","import { DateField as KitDateField } from \"hiver-ui-kit-extended\";\nimport { cn } from \"@/utils/classNames\";\nimport { useRenderConfigStore } from \"@/stores/renderConfig\";\n\nimport type { DateFieldProps as KitDateFieldProps } from \"hiver-ui-kit-extended\";\n\n/**\n * AF-2: this reached `primereact/calendar` directly until now, which put\n * primereact into the hui artifact regardless of `resolve.conditions` — a\n * direct package specifier has no `hui` variant for the resolver to pick.\n *\n * The epoch-millis contract this wrapper existed to provide (`value` in, a\n * `number | undefined` back out of `onChange`) is now the toolkit's own\n * `DateFieldProps`, so the Date<->millis conversion moves there verbatim and\n * the two call-site props stay exactly as they were.\n *\n * `showIcon`, `icon=\"pi pi-calendar\"` and the `cm-date-field` /\n * `cm-date-field-panel` class names move with it — the toolkit's prime variant\n * sets all of them. It also maps `error` onto primereact's `invalid`, which\n * adds `p-invalid`; the `!important` error border below still wins, so Omni\n * renders the same.\n *\n * Everything below stays here because the toolkit ships no CSS: these are\n * Tailwind arbitrary selectors against primereact's internal DOM. They are\n * inert in the hui build, and deliberately left in source rather than deleted —\n * Tailwind v4 generates CSS by scanning source text, so removing them would\n * silently shrink PRIME's stylesheet, which is frozen.\n */\nexport type DateFieldProps = KitDateFieldProps;\n\nexport const DateField = ({\n className = \"\",\n error = false,\n ...props\n}: DateFieldProps) => {\n const globalMountElement = useRenderConfigStore((state) => state.meta.globalMountElement);\n\n return (\n <KitDateField\n {...props}\n error={error}\n className={cn(\n error &&\n \"cm:[&>input]:border-error-border! cm:[&>input]:border-[1.5px]! cm:[&>input]:border-solid! cm:[&>input]:shadow-none!\",\n \"cm:relative cm:w-full cm:text-[14px]!\",\n \"cm:[&>input]:text-[14px]! cm:[&>input]:px-[8px]! cm:[&>input]:py-[10px]! cm:[&>input]:pr-9!\",\n \"cm:[&>input]:placeholder:text-[#6b7280]!\",\n \"cm:[&_.p-datepicker-trigger]:absolute! cm:[&_.p-datepicker-trigger]:top-1/2! cm:[&_.p-datepicker-trigger]:right-2! cm:[&_.p-datepicker-trigger]:-translate-y-1/2!\",\n \"cm:[&_.p-datepicker-trigger]:bg-transparent! cm:[&_.p-datepicker-trigger]:border-0! cm:[&_.p-datepicker-trigger]:shadow-none!\",\n \"cm:[&_.p-datepicker-trigger]:w-5! cm:[&_.p-datepicker-trigger]:h-5! cm:[&_.p-datepicker-trigger]:min-w-0! cm:[&_.p-datepicker-trigger]:p-0!\",\n \"cm:[&_.p-datepicker-trigger_.pi]:text-[14px]! cm:[&_.p-datepicker-trigger_.pi]:text-slate-400!\",\n className,\n )}\n panelClassName={\n cn(\n \"cm:pointer-events-auto! cm:text-[14px]! cm:min-w-fit! cm:[&_td]:text-[14px]! cm:[&_td]:p-[0]! cm:[&_span]:text-[14px]! cm:[&_span]:p-[4px]! cm:[&_span]:shadow-none! cm:[&_.p-datepicker-header]:p-0!\",\n \"cm:[&_th]:p-[0]! cm:[&_th]:text-[14px]! cm:[&_th]:font-normal! cm:[&_.p-datepicker-title>button]:font-normal!\"\n )\n }\n appendTo={globalMountElement}\n />\n );\n};\n","import { DateField, type DateFieldProps } from \"@/components/DateField\";\n\nexport type CFDateFieldProps = Omit<DateFieldProps, \"onChange\" | \"onValidityChange\"> & {\n onChange: (value: number | undefined) => void;\n};\n\n/**\n * A custom-field date that can be \"not a date\".\n *\n * The toolkit's `onChange` speaks epoch millis, and text that parses to no date\n * reaches it as `undefined` — the same as an empty field — while the text stays\n * in the input. The form then saw a blank optional field, raised nothing, and\n * saved. `onValidityChange` follows every `onChange`, so for invalid text this\n * overwrites that `undefined` with NaN, which `dateValidation` reports.\n */\nexport const CFDateField = ({ onChange, ...props }: CFDateFieldProps) => (\n <DateField\n {...props}\n onChange={onChange}\n onValidityChange={(valid) => {\n if (!valid) onChange(Number.NaN);\n }}\n />\n);\n","import Icon from \"@/components/Icon\";\n\nexport type ChipProps = {\n value: string;\n disabled?: boolean;\n onRemove: () => void;\n}\n\nexport const Chip = ({ value, disabled, onRemove }: ChipProps) => {\n\n return (\n <span\n className=\"cm-editable-chip cm:inline-flex cm:items-center cm:gap-1 cm:bg-slate-surface-subtle-100 cm:text-slate-text-body cm:rounded cm:px-1.5 cm:py-0.5 cm:text-sm cm:leading-5\"\n >\n <span className=\"cm:text-sm cm:leading-5\">{value}</span>\n {!disabled && (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n onRemove();\n }}\n aria-label={`Remove ${value}`}\n className=\"cm:flex cm:items-center cm:justify-center cm:cursor-pointer cm:opacity-50 cm:hover:opacity-100 cm:transition-opacity disabled:cm:cursor-not-allowed\"\n >\n <Icon\n name=\"close\"\n size={14}\n color=\"#334155\"\n />\n </button>\n )}\n </span>\n )\n}\n","import { useRef, useState } from \"react\";\nimport { cn } from \"@/utils/classNames\";\nimport { Chip } from \"./chip\";\n\nexport type ChipProps = {\n value?: string[];\n placeholder?: string;\n error?: boolean;\n disabled?: boolean;\n maxLength?: number;\n className?: string;\n onChange?: (value: string[]) => void;\n onBlur?: () => void;\n};\n\nexport const ChipField = ({\n value = [],\n placeholder,\n error = false,\n disabled = false,\n maxLength,\n className = \"\",\n onChange,\n onBlur,\n}: ChipProps) => {\n const [inputValue, setInputValue] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const commitChip = () => {\n const trimmed = inputValue.trim();\n if (!trimmed) return false;\n if (value.includes(trimmed)) {\n setInputValue(\"\");\n return true;\n }\n onChange?.([...value, trimmed]);\n setInputValue(\"\");\n return true;\n };\n\n const removeChip = (index: number) => {\n const next = value.filter((_, i) => i !== index);\n onChange?.(next);\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const next = event.target.value;\n if (maxLength && next.length > maxLength) return;\n setInputValue(next);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\" || event.key === \"Tab\") {\n if (inputValue.trim()) {\n event.preventDefault();\n commitChip();\n }\n return;\n }\n if (event.key === \"Backspace\" && !inputValue && value.length > 0) {\n removeChip(value.length - 1);\n }\n };\n\n const handleBlur = () => {\n setIsFocused(false);\n onBlur?.();\n commitChip();\n };\n\n const focusInput = () => {\n if (disabled) return;\n inputRef.current?.focus();\n };\n\n return (\n <div\n onClick={focusInput}\n className={cn(\n \"cm-chip-field cm:w-full cm:min-h-10 cm:flex cm:flex-wrap cm:items-center cm:gap-1\",\n \"cm:p-2 cm:rounded-md cm:border cm:border-solid cm:text-sm cm:transition-[border-color,background-color]\",\n disabled ? \"cm:cursor-not-allowed\" : \"cm:cursor-text\",\n isFocused && !error && \"cm-chip-field--focused cm:border-[1.5px]\",\n error\n ? \"cm-chip-field--error cm:border-error-border cm:border-[1.5px]\"\n : isFocused\n ? \"cm:border-primary-border-lighter\"\n : disabled\n ? \"cm:border-slate-border-light\"\n : \"cm:border-slate-border-light cm:hover:border-slate-border-default\",\n disabled\n ? \"cm-chip-field--disabled cm:bg-slate-surface-subtle-150\"\n : \"cm:bg-white\",\n className,\n )}\n >\n {\n value.map((chip, index) => (\n <Chip\n key={`${chip}-${index}`}\n value={chip}\n disabled={disabled}\n onRemove={() => removeChip(index)}\n />\n ))\n }\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={handleBlur}\n placeholder={value.length === 0 ? placeholder : \"\"}\n disabled={disabled}\n className={cn(\n \"cm:flex-1 cm:min-w-[80px] cm:h-5 cm:bg-transparent cm:outline-none cm:border-0\",\n \"cm:text-sm cm:p-0 cm:text-slate-text-body\",\n \"cm:placeholder:text-slate-500\",\n )}\n />\n </div>\n );\n};\n","import type { KeyboardEvent } from \"react\";\n\nexport const PHONE_VALIDATION_ERROR =\n \"Phone number should contain your country code e.g +1415555555\";\n\n/** E.164-style input: digits and at most one leading + */\nexport const sanitizePhoneInput = (raw: string): string => {\n const allowed = raw.replace(/[^\\d+]/g, \"\");\n const digitsOnly = allowed.replace(/\\+/g, \"\");\n return allowed.startsWith(\"+\") ? `+${digitsOnly}` : digitsOnly;\n};\n\nexport const validatePhoneNumber = (value: string): string => {\n const trimmed = value.trim();\n if (!trimmed) return \"\";\n if (!/^\\+\\d{7,15}$/.test(trimmed)) return PHONE_VALIDATION_ERROR;\n return \"\";\n};\n\nconst PHONE_NAV_KEYS = new Set([\n \"Backspace\",\n \"Delete\",\n \"Tab\",\n \"Escape\",\n \"Enter\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"Home\",\n \"End\",\n]);\n\n/**\n * Block non-digit / non-+ keys before they reach the input (TextField does not forward onKeyDown).\n * Capture phase on a wrapper is required. Paste is still sanitized in onChange.\n */\nexport const handlePhoneFieldKeyDownCapture = (\n e: KeyboardEvent<HTMLDivElement>\n) => {\n const input = e.target;\n if (!(input instanceof HTMLInputElement)) return;\n\n const { key } = e;\n if (PHONE_NAV_KEYS.has(key)) return;\n if (e.ctrlKey || e.metaKey || e.altKey) return;\n\n if (/^\\d$/.test(key)) return;\n\n if (key === \"+\") {\n const start = input.selectionStart ?? 0;\n const end = input.selectionEnd ?? 0;\n const { value } = input;\n if (start !== 0) {\n e.preventDefault();\n return;\n }\n if (value.startsWith(\"+\") && start === end) {\n e.preventDefault();\n return;\n }\n return;\n }\n\n e.preventDefault();\n};\n","import { validatePhoneNumber } from \"@/validations/contactPhone\";\n\nimport type { TypeofResult } from \"@/types\";\nimport type { ValidationRule, CheckDiffFn } from \"@/types/form\";\nimport type { CF_DropdownOption } from \"@/types/custom-fields\";\n\nconst isEmpty = (value: unknown) => {\n if( typeof value === 'string' ) return value.trim() === '';\n if( Array.isArray(value) ) return value.length === 0;\n return !value\n}\n\nconst primitiveTypes: TypeofResult[] = ['number', 'string', 'boolean'] \n\nexport const hasChanged:CheckDiffFn = (value, previous) => { \n if (primitiveTypes.includes(typeof value)) return value !== previous;\n return false;\n}\n\nexport const stringListChanged: CheckDiffFn = ( value, previous ) => {\n if (!Array.isArray(value) || !Array.isArray(previous)) return true;\n if (value.length !== previous.length) return true;\n return value.some((domain, index) => domain !== previous[index]);\n}\n\nexport const objectListChanged: (keysToCheck: string[]) => CheckDiffFn = (keysToCheck) => (value, previous) => {\n if (!Array.isArray(value) || !Array.isArray(previous)) return true;\n if (value.length !== previous.length) return true;\n return value.some((obj1, index) => { \n const obj2 = previous[index];\n return keysToCheck.some(key => obj1?.[key] !== obj2?.[key]);\n });\n}\n\nexport const getValidationError = (value: unknown, validations?: ValidationRule) => {\n if( !validations ) return false;\n\n if( validations?.isRequired && isEmpty(value) ) {\n return \"This field is required\";\n }\n\n const valueLength = typeof value === 'string' ? value.length : 0;\n\n if( validations?.maxLength && valueLength > validations.maxLength ) {\n return `This field must be less than ${validations.maxLength} characters`;\n }\n\n if( validations?.custom )return validations.custom(value);\n\n return false;\n}\n\nexport const optionsValidation = (value: unknown) => {\n const options = value as CF_DropdownOption[];\n if( !options.some(option => !!option.display_name )) return \"At least one option is required\";\n const hash: Record<string, boolean> = {};\n for( const option of options ) {\n if(!option.display_name)continue;\n if( hash[option.display_name] ) return \"Duplicate option names are not allowed\";\n hash[option.display_name!] = true;\n }\n return false;\n}\n\nexport const phoneValidation = (value:unknown) => {\n if(typeof value !== 'string') return false;\n const response = validatePhoneNumber(value);\n if(response) return response;\n return false;\n}\n\n// A date field whose text parses to no date holds NaN (see CFDateField), so the\n// form can tell \"not a date\" apart from \"empty\".\nexport const dateValidation = (value: unknown): string | false => {\n if (typeof value === \"number\" && Number.isNaN(value)) return \"Please enter a valid date\";\n return false;\n};\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;\n\nexport const emailValidation = (value: unknown): string | false => {\n if (typeof value !== \"string\") return false;\n const trimmed = value.trim();\n if (!trimmed) return false;\n if (!EMAIL_REGEX.test(trimmed)) return \"Please enter a valid email address\";\n return false;\n};\n\nconst DOMAIN_REGEX =\n /^(?!-)(?:[a-zA-Z0-9-]{1,63}(?<!-)\\.)+[a-zA-Z]{2,}$/;\n\nexport const checkDomain = ( value: unknown, withValue:boolean ) => { \n if (typeof value !== \"string\") return false;\n if (!value) return false;\n if (value.length > 253) return \"Domain is too long\";\n if (!DOMAIN_REGEX.test(value)) return withValue ? `${value} doesn't look like a valid domain` : \"That doesn't look like a domain\";\n}\n\nexport const domainValidation = (value: unknown, options: { items: string[], maxItems?: number }): string | false => { \n if (typeof value !== 'string') return false;\n const valueError = checkDomain(value, false);\n if (typeof valueError === 'string') return valueError;\n if(options.maxItems && options.items.length >= options.maxItems) return `Remove a domain to add another (max ${options.maxItems}).`;\n if(options.items.includes(value)) return \"Domain already exists\";\n return false;\n};\n\nexport const getDomainsListValidation = (excludedList?: string[]) => {\n if(!Array.isArray(excludedList)) return undefined;\n return (value:unknown) => { \n if(!Array.isArray(value)) return false;\n for( const domain of value ){\n const error = checkDomain(domain, true);\n if (typeof error === 'string') return error;\n }\n for( const item of value as string[] ) {\n if( excludedList.some(excluded => item.includes(excluded))) return `${item} is not allowed`;\n }\n return false;\n }\n}","import { CF_TYPES, ENTITY_TYPES } from \"./custom-fields\";\nimport { emailValidation, stringListChanged } from \"@/utils/validations\";\n\nimport type { FormFieldType } from \"@/types/form\";\nimport type { ColumnType, CompanyFields, ContactFields } from \"@/types/entity\";\n\nexport const LABELS = {\n HEADER: {\n CREATE: {\n [ENTITY_TYPES.COMPANY]: \"Create an account\",\n [ENTITY_TYPES.CONTACT]: \"Create a contact\",\n },\n EDIT: {\n [ENTITY_TYPES.COMPANY]: \"Edit account\",\n [ENTITY_TYPES.CONTACT]: \"Edit contact\",\n }\n },\n FOOTER: {\n CREATE: {\n [ENTITY_TYPES.COMPANY]: \"Create account\",\n [ENTITY_TYPES.CONTACT]: \"Create contact\",\n },\n EDIT: {\n [ENTITY_TYPES.COMPANY]: \"Save changes\",\n [ENTITY_TYPES.CONTACT]: \"Save changes\",\n }\n }\n} as const;\n\n// Shown on fields that are locked because their data is synced one-way from a\n// connected CRM, so editing them here would have no effect.\nexport const CRM_SYNCED_FIELD_TOOLTIP =\n \"This field is synced with {{CRM}} and can't be edited.\";\n\nexport const COMPANY_FORM_FIELDS: FormFieldType[] = [\n {\n name: \"name\",\n label: \"Account name\",\n placeholder: \"e.g. Acme Inc\",\n type: CF_TYPES.TEXT,\n validations: {\n isRequired: true,\n },\n },\n {\n name: \"domains\",\n label: \"Domain(s)\",\n type: CF_TYPES.CHIP,\n placeholder: \"@acme.com\",\n info: \"Press Enter or Tab to add each domain\",\n validations: {\n isRequired: true,\n },\n checkDiff: stringListChanged\n }\n] satisfies (FormFieldType &{ name: CompanyFields })[];\n\nexport const CONTACT_FORM_FIELDS: FormFieldType[] = [\n {\n name: \"name\",\n label: \"Contact name\",\n type: CF_TYPES.TEXT,\n placeholder: \"e.g. John Doe\",\n validations: {\n isRequired: true,\n },\n },\n {\n name: \"email\",\n label: \"Email\",\n type: CF_TYPES.TEXT,\n placeholder: \"e.g. john.doe@acme.com\",\n validations: {\n isRequired: true,\n custom: emailValidation,\n },\n },\n {\n name: \"phone_number\",\n label: \"Phone\",\n type: CF_TYPES.TEXT,\n placeholder: \"Enter a phone number\",\n validations: {\n isRequired: false,\n // custom: phoneValidation, phone currently validated from backend\n },\n },\n]satisfies (FormFieldType &{ name: ContactFields })[];\n\nexport const ENTITY_FORM_FIELDS = {\n [ENTITY_TYPES.COMPANY]: COMPANY_FORM_FIELDS,\n [ENTITY_TYPES.CONTACT]: CONTACT_FORM_FIELDS,\n} as const;\n\nexport const ENTITY_FIELD_KEYS = {\n [ENTITY_TYPES.COMPANY]: COMPANY_FORM_FIELDS.map((field) => field.name),\n [ENTITY_TYPES.CONTACT]: CONTACT_FORM_FIELDS.map((field) => field.name),\n} as const;\n\n\nexport const companyColumns: ColumnType[] = [\n {\n id: \"name\",\n sortId: \"generated_name\",\n type: CF_TYPES.TEXT,\n description: '---',\n field: \"nameDisplay\",\n label: \"Account name\",\n visible: true,\n locked: true,\n style: { width: \"300px\" },\n _crmLocked: true\n },\n {\n id: \"domain\",\n sortId: \"name\",\n type: CF_TYPES.URL,\n description: '---',\n field: \"domainDisplay\",\n label: \"Domain\",\n visible: true,\n locked: true,\n style: { width: \"450px\" },\n _crmLocked: true\n },\n];\n\nexport const contactColumns: ColumnType[] = [\n {\n id: \"name\",\n field: \"nameDisplay\",\n label: \"Name\",\n type: CF_TYPES.TEXT,\n description: '---',\n style: { width: \"400px\" },\n _crmLocked: true\n },\n {\n id: \"email\",\n type: CF_TYPES.TEXT,\n description: '---',\n field: \"emailDisplay\",\n label: \"Email\",\n style: { width: \"350px\" },\n _crmLocked: true\n },\n {\n id: \"phone\",\n sortId: \"phone_number\",\n type: CF_TYPES.TEXT,\n description: '---',\n field: \"phoneDisplay\",\n label: \"Phone Number\",\n style: { width: \"240px\" },\n _crmLocked: true\n },\n {\n id: \"account\",\n type: CF_TYPES.DROPDOWN,\n description: '---',\n field: \"accountDisplay\",\n label: \"Account\",\n style: { width: \"300px\" },\n _crmLocked: true\n },\n];\n\nexport const ENTITY_DEFAULT_COLUMNS = {\n [ENTITY_TYPES.COMPANY]: companyColumns,\n [ENTITY_TYPES.CONTACT]: contactColumns,\n} as const;","import { createStore } from \"zustand\";\n\nexport type FormState<T extends Record<string, unknown> = Record<string, unknown>> = {\n values: T;\n initialData: T;\n errors?: Partial<Record<keyof T, string>>;\n diffs?: Partial<Record<keyof T, boolean>>;\n touched?: { [K in keyof T]?: boolean };\n onChange: (name: keyof T, value: unknown) => void;\n onError: (name: keyof T, error?: string) => void;\n setDiff: (name: keyof T, changed: boolean) => void;\n onTouch: (name: keyof T) => void;\n setValues: (values: T) => void;\n setErrors: (errors: Partial<Record<keyof T, string>>) => void;\n setTouched: (touched: Partial<Record<keyof T, boolean>>) => void;\n}\n\nexport const createFormStore = <T extends Record<string, unknown>>(initialData: T) =>\n createStore<FormState<T>>((set) => ({\n values: initialData,\n initialData: initialData,\n diffs: {},\n onChange: (name, value) => set((state) => ({ values: { ...state.values, [name]: value } })),\n onTouch: (name) => set((state) => ({ touched: { ...state.touched!, [name]: true } })),\n onError: (name, error) => set((state) => ({ errors: { ...state.errors!, [name]: error } })),\n setDiff: (name, changed) => set((state) => ({ diffs: { ...state.diffs!, [name]: changed } })),\n setValues: (values) => set({ values }),\n setErrors: (errors) => {\n const touched = Object.fromEntries(Object.keys(errors).map((key) => [key as keyof T, true]));\n set((state) => ({ errors: { ...state.errors, ...errors}, touched: { ...state.touched!, ...touched } }));\n },\n setTouched: (touched) => set({ touched }),\n })\n)","import { createContext, useContext, useRef } from \"react\";\nimport { useStore } from \"zustand\";\nimport { createFormStore, type FormState } from \"@/stores/form\";\n\nimport type { StoreApi, ExtractState } from \"zustand\";\n\ntype FormProviderProps = {\n children: React.ReactNode;\n initialData: Record<string, unknown>;\n}\n\nconst FormContext = createContext<StoreApi<FormState> | null>(null);\n\nexport const useFormStore = <U = unknown>( selector: (state: ExtractState<StoreApi<FormState>>) => U ): U => {\n const store = useContext(FormContext);\n if(!store) {\n throw new Error(\"FormProvider not found\");\n }\n return useStore(store, selector);\n};\n\nexport const FormProvider = ({ children, initialData }: FormProviderProps) => { \n\n const storeRef = useRef(null as ( StoreApi<FormState> | null ));\n\n if(!storeRef.current) {\n storeRef.current = createFormStore(initialData);\n }\n\n return (\n <FormContext.Provider value={storeRef.current}>\n {children}\n </FormContext.Provider>\n )\n}\n\n","export const debounce = (delay: number ) => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n return (fn: () => void) => {\n if( timeout ) clearTimeout(timeout);\n timeout = setTimeout(fn, delay);\n }\n}","import { useRef, useMemo, useEffect } from \"react\";\nimport { useFormStore } from \"@/contexts/form\";\nimport Tooltip from \"@/components/Tooltip\";\n\nimport { debounce } from \"@/utils/debounce\";\nimport { getValidationError, hasChanged } from \"@/utils/validations\";\n\nimport type { ReactElement, ReactNode } from \"react\";\nimport type { ValidationRule } from \"@/types/form\";\n\nexport type RenderFieldProps = {\n name: string;\n value: unknown;\n hasError: boolean;\n onChange: (value: unknown) => void;\n onBlur: () => void;\n onError: (error: string) => void;\n}\n\nexport type FormFieldProps = {\n name: string;\n label: string;\n info?: string;\n disabledTooltip?: string;\n validations?: ValidationRule;\n validateOnMount?: boolean;\n checkDiff?: typeof hasChanged;\n renderField: (props: RenderFieldProps) => ReactNode;\n}\n\nconst hasSavedValue = (value: unknown) =>\n Array.isArray(value) ? value.length > 0 : value !== undefined && value !== null && value !== '';\n\nexport const FormField = ({ name, label, info, disabledTooltip, validations, checkDiff, validateOnMount = true, renderField }: FormFieldProps) => {\n\n const validatedRef = useRef(false);\n const debouncedValidate = useMemo(() => debounce(300),[])\n\n const value = useFormStore((state) => state.values[name]) as string;\n const initValue = useFormStore((state) => state.initialData[name]) as string;\n const errors = useFormStore((state) => state.errors)\n const setChange = useFormStore((state) => state.onChange);\n const setTouch = useFormStore((state) => state.onTouch);\n const setError = useFormStore((state) => state.onError);\n const setDiff = useFormStore((state) => state.setDiff);\n const touched = useFormStore((state) => state.touched);\n\n const error = errors?.[name] as string;\n const isTouched = touched?.[name] as boolean;\n const hasError = Boolean(error) && isTouched;\n\n const validate = (value: unknown) => {\n // The diff is not debounced: it gates the Save button, which otherwise\n // stayed disabled for 300ms after the last keystroke — a quick click\n // after typing landed on a disabled button.\n const diffFn = checkDiff ?? hasChanged;\n setDiff(name, diffFn(value, initValue));\n debouncedValidate(() => {\n const error = getValidationError(value, validations);\n setError(name, error ? error : undefined)\n })\n }\n\n const onError = (error: string) => {\n setError(name, error);\n }\n \n const onBlur = () => {\n setTouch(name);\n validate(value);\n }\n\n const onChange = (value: unknown) => {\n setChange(name, value);\n validate(value);\n }\n\n useEffect(() => {\n if(validatedRef.current || !validateOnMount) return;\n const error = getValidationError(value, validations);\n setError(name, error ? error : undefined)\n // SAVED data that already fails a rule (e.g. a domain added to the\n // excluded list since): show the error now. Left untouched it was\n // hidden, and Save sat disabled with nothing on screen saying why.\n // Keyed on this field's own saved value, not on the form having any\n // initial data — create forms carry defaults (a field type), and an\n // empty required field there must stay quiet until touched.\n if (error && hasSavedValue(initValue)) setTouch(name);\n validatedRef.current = true;\n }, [name, value, initValue, validations, validateOnMount, setError, setTouch]);\n\n const isRequired = validations?.isRequired ?? false;\n\n return (\n <div className=\"cm:flex cm:flex-col cm:gap-1.5\">\n <label className=\"cm-form-field-label cm:text-sm cm:font-normal cm:text-slate-text-body\">\n {label}\n {isRequired && <span className=\"cm:text-error cm:text-xs cm:font-normal cm:leading-[18px] cm:pl-1\">*</span>}\n </label>\n {disabledTooltip ? (\n <Tooltip content={disabledTooltip} triggerClassName=\"cm:flex cm:w-full\">\n {renderField({ name, value, hasError, onChange, onBlur, onError }) as ReactElement}\n </Tooltip>\n ) : (\n renderField({ name, value, hasError, onChange, onBlur, onError })\n )}\n {hasError && (\n <span className=\"cm:text-error cm:text-xs cm:font-normal cm:leading-[18px]\">\n {error}\n </span>\n )}\n {!hasError && info && (\n <span className=\"cm:text-xs cm:font-normal cm:text-[#94a3b8] cm:leading-[18px]\">\n {info}\n </span>\n )}\n </div>\n )\n}\n","import type { ReactNode } from \"react\";\nimport { Button, type ButtonProps } from \"@/components/Button\";\n\nimport { cn } from \"@/utils/classNames\";\n\nexport type DrawerFooterProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport const DrawerFooter = ({ children, className = \"\" }: DrawerFooterProps) => {\n return (\n <footer\n className={`cm:flex cm:items-center cm:justify-end cm:gap-3 cm:px-7 cm:py-4 cm:border-t cm:border-[#edf1f6] cm:shrink-0 cm:bg-white ${className}`}\n >\n {children}\n </footer>\n );\n};\n\n\nexport const PrimaryButton = (props: ButtonProps) => {\n return (\n <Button\n variant=\"contained\"\n color=\"primary\"\n label=\"Save\"\n {...props}\n className={cn(`\n cm:h-[36px]\n cm:min-h-[unset]! \n cm:pl-[16px]! \n cm:pr-[16px]! \n cm:pt-0! \n cm:pb-0! \n cm:font-regular!\n cm:disabled:bg-slate-surface-subtle-200!\n cm:disabled:text-slate-text-disabled!\n cm:disabled:border-slate-surface-subtle-200!\n `, props.className)}\n />\n )\n}\n\nexport const SecondaryButton = (props: ButtonProps) => {\n return (\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n label=\"Cancel\"\n {...props}\n className={cn(\"cm:h-[36px] cm:min-h-[unset]! cm:pl-[32px]! cm:pr-[32px]! cm:pt-0! cm:pb-0! cm:font-normal!\", props.className)}\n /> \n )\n}","import { useFormStore } from \"@/contexts/form\";\nimport type { ReactNode } from \"react\";\n\nexport type FormActionsViewProps = {\n hasError: boolean;\n formData: Record<string, unknown>;\n}\n\nexport type FormActionsProps = {\n renderView: (props: FormActionsViewProps) => ReactNode;\n}\n\nexport const useFormActions = () => {\n \n const formData = useFormStore((state) => state.values);\n const hasError = useFormStore((state) => Object.values(state.errors || {}).filter(Boolean).length > 0);\n const hasChanged = useFormStore((state) => Object.values(state.diffs || {}).filter(Boolean).length > 0);\n const setErrors = useFormStore((state) => state.setErrors);\n \n return {\n formData,\n hasError,\n hasChanged,\n setErrors,\n }\n}","import { DrawerFooter, PrimaryButton, SecondaryButton } from \"@/components/Drawer/Footer\"\nimport { useFormActions } from \"@/hooks/useFormActions\";\n\nimport type { CF_FormState, ENTITY_TYPE } from \"@/types/custom-fields\";\nimport { LABELS } from \"@/constants/entity\";\n\nexport type FooterProps = {\n isEdit: boolean;\n isLoading: boolean;\n entityType: ENTITY_TYPE;\n onSubmit: ( data: CF_FormState ) => void;\n onCancel: () => void;\n}\n\nexport const Footer = ({ isEdit, entityType, isLoading, onSubmit, onCancel }: FooterProps) => {\n\n const { formData, hasChanged, hasError } = useFormActions();\n\n const TYPE = isEdit ? \"EDIT\" : \"CREATE\";\n const saveLabel = LABELS.FOOTER[TYPE][entityType];\n\n const handleSubmit = () => {\n onSubmit(formData as CF_FormState);\n }\n \n const disabled = (isEdit && !hasChanged) || hasError || isLoading\n\n return (\n <DrawerFooter>\n <SecondaryButton\n label=\"Cancel\"\n disabled={isLoading}\n onClick={onCancel}\n />\n <PrimaryButton\n label={saveLabel}\n disabled={disabled}\n onClick={handleSubmit}\n />\n </DrawerFooter>\n )\n}","import { FormProvider } from \"@/contexts/form\";\n\nexport type EntityFormProviderProps = {\n children: React.ReactNode;\n initialData?: Record<string, unknown>;\n entityId?: number;\n}\n\nexport const EntityFormProvider = ({ initialData, entityId, children }: EntityFormProviderProps) => {\n return <FormProvider initialData={initialData ?? {}} key={entityId}>{children}</FormProvider>;\n};","import { apiClient } from \"@/services/axios\";\nimport type {\n DisconnectCrmPayload,\n DisconnectCrmResponse,\n GetCrmConfigsResponse,\n GetCrmFieldsResponse,\n GetCrmSyncRunFailureFileResponse,\n GetCrmSyncRunsResponse,\n TriggerSyncPayload,\n TriggerSyncResponse,\n UpdateCrmSyncConfigPayload,\n UpdateFieldMappingsPayload,\n} from \"@/features/crm-sync/types\";\nimport type { GetCrmSyncStatusResponse } from \"@/types/crm\";\n\nexport const getCrmConfigs = async (): Promise<GetCrmConfigsResponse> => {\n const response =\n await apiClient.get<GetCrmConfigsResponse>(\"/v1/crm/configs\");\n return response.data;\n};\n\nexport const getCrmFields = async (\n provider: string,\n entityType: string,\n): Promise<GetCrmFieldsResponse> => {\n const response = await apiClient.get<\n Omit<GetCrmFieldsResponse, \"data\"> & {\n data: Array<{\n name?: string;\n label?: string;\n crm_field_key?: string;\n display_name?: string;\n type: string;\n is_custom?: boolean;\n hiver_field_types: string[];\n default_hiver_field: string | null;\n is_required?: boolean;\n }>;\n }\n >(`/v1/crm/${provider}/${entityType}/fields`);\n\n const normalized: GetCrmFieldsResponse = {\n ...response.data,\n data: response.data.data.map((f) => ({\n crm_field_key: f.crm_field_key ?? f.name ?? \"\",\n display_name: f.display_name ?? f.label ?? \"\",\n type: f.type,\n hiver_field_types: f.hiver_field_types,\n default_hiver_field: f.default_hiver_field,\n is_required: f.is_required ?? false,\n })),\n };\n\n return normalized;\n};\n\nexport const updateCrmSyncConfig = async (\n payload: UpdateCrmSyncConfigPayload,\n): Promise<boolean> => {\n await apiClient.patch(\"/v1/crm/configs\", payload);\n return true;\n};\n\nexport const createCrmSyncConfig = async (\n payload: UpdateCrmSyncConfigPayload,\n): Promise<boolean> => {\n await apiClient.post(\"/v1/crm/configs\", payload);\n return true;\n};\n\nexport const updateFieldMappings = async (\n crmProvider: string,\n entityType: string,\n payload: UpdateFieldMappingsPayload,\n): Promise<boolean> => {\n await apiClient.put(\n `/v1/crm/configs/${crmProvider}/mappings/${entityType}`,\n payload,\n );\n return true;\n};\n\nexport const disconnectCrm = async (\n crmProvider: string,\n payload: DisconnectCrmPayload,\n): Promise<DisconnectCrmResponse> => {\n const response = await apiClient.delete<DisconnectCrmResponse>(\n `/v1/crm/configs/${crmProvider}`,\n { params: payload },\n );\n return response.data;\n};\n\nexport const getCrmSyncRuns = async (params: {\n crm_provider?: string;\n after_id?: number;\n limit?: number;\n}): Promise<GetCrmSyncRunsResponse> => {\n const response = await apiClient.get<GetCrmSyncRunsResponse>(\n \"/v1/crm/sync/runs\",\n { params },\n );\n return response.data;\n};\n\nexport const getCrmSyncRunFailureFileUrl = async (\n syncRunId: number,\n): Promise<GetCrmSyncRunFailureFileResponse> => {\n const response = await apiClient.get<GetCrmSyncRunFailureFileResponse>(\n `/v1/crm/sync/runs/${syncRunId}/failure-file`,\n );\n return response.data;\n};\n\nexport const getCrmSyncStatus =\n async (): Promise<GetCrmSyncStatusResponse> => {\n const response = await apiClient.get<GetCrmSyncStatusResponse>(\n \"/v1/crm/sync/status\",\n );\n return response.data;\n };\n\nexport const triggerSync = async (\n crmProvider: string,\n entityType: string,\n syncMode: \"full\" | \"delta\" = \"full\",\n): Promise<TriggerSyncResponse> => {\n const payload: TriggerSyncPayload = {\n crm_provider: crmProvider,\n sync_mode: syncMode,\n entity_type: entityType,\n };\n const response = await apiClient.post<TriggerSyncResponse>(\n \"/v1/crm/sync\",\n payload,\n );\n return response.data;\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { getCrmConfigs } from \"@/services/crm-sync\";\n\nexport const CRM_CONFIGS_QUERY_KEY = [\"crmConfigs\"] as const;\n\nexport const useCrmConfigs = (enabled = true) =>\n useQuery({\n queryKey: CRM_CONFIGS_QUERY_KEY,\n queryFn: getCrmConfigs,\n enabled,\n staleTime: 60_000,\n refetchOnWindowFocus: false,\n });","import { ENTITY_TYPES } from \"@/constants/custom-fields\";\n\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\nimport type { CrmSyncConfig, GetCrmConfigsResponse } from \"@/features/crm-sync/types\";\n// Built-in form fields that are owned by the CRM (and therefore locked in the\n// edit form) once a CRM provider is connected, keyed by entity type.\nconst CRM_LOCKED_BASE_FIELDS: Record<ENTITY_TYPE, string[]> = {\n [ENTITY_TYPES.COMPANY]: [\"name\", \"domains\"],\n [ENTITY_TYPES.CONTACT]: [\"name\", \"phone_number\"],\n};\n\n/**\n * Given the CRM configs response, returns the names of the entity form fields\n * that should be disabled while editing. When a CRM provider is connected the\n * CRM-owned base fields (account/contact name etc.) are locked, along with any\n * custom field already mapped to the CRM (matched by `cf_id`).\n *\n * Returns an empty list when no CRM provider is connected.\n */\nexport const getCrmDisabledFieldNames = (\n configs: GetCrmConfigsResponse | undefined,\n entityType: ENTITY_TYPE,\n): string[] => {\n\n const syncedKey: keyof CrmSyncConfig = entityType === ENTITY_TYPES.COMPANY ? 'company_sync_enabled' : 'contact_sync_enabled';\n const connectedConfigs =\n configs?.data?.filter(\n (config) => config.crm_provider && config.status === \"active\" && !!config[syncedKey],\n ) ?? [];\n\n if (connectedConfigs.length === 0) return [];\n\n const mappedCfIds = connectedConfigs.flatMap((config) =>\n (config.field_mappings?.[entityType] ?? []).map((mapping) =>\n String(mapping.cf_id),\n ),\n );\n\n return Array.from(\n new Set([...CRM_LOCKED_BASE_FIELDS[entityType], ...mappedCfIds]),\n );\n};","import type { CF_DropdownOption, CF_TYPE } from \"@/types/custom-fields\";\nimport { CF_TYPES } from \"@/constants/custom-fields\";\n\nexport const getPlaceholder = (display_name: string, type: CF_TYPE) => {\n if(type === CF_TYPES.DATE || type === CF_TYPES.DROPDOWN ) return `Select a ${display_name}`;\n return `Enter ${display_name.toLowerCase()}`;\n}\n\nexport const getDropdownPayload = (value: unknown) => {\n const options = value as CF_DropdownOption[];\n if( !Array.isArray(options) ) return [];\n return options.map(option => {\n const data = { ...option};\n data.value = option.display_name || option.value;\n data.status = data.value ? 1 : 0;\n delete data.__id;\n delete data.display_name;\n return data;\n }).filter(option => option.status === 1);\n}","export const replaceParams = (url: string, params: Record<string, string>) => {\n return url.replace(/\\/:(\\w+)/g, (match, p1) => params[p1] ? `/${params[p1]}` : match);\n}","import { apiClient } from './axios';\nimport { ENDPOINTS } from '@/constants/endpoints';\n\nimport type { EntityMutatePayload } from '@/types/entity';\nimport { replaceParams } from '@/utils/api';\n\n\nexport type CreateEditCompanyParams = {\n payload: EntityMutatePayload<'company'>;\n entityId?: number;\n}\n\n\n\nexport const createEditCompany = async (\n { payload, entityId }: CreateEditCompanyParams\n): Promise<boolean> => {\n\n const endpoint = entityId ? replaceParams(ENDPOINTS.EDIT_COMPANY, { entity_id: String(entityId) }) : ENDPOINTS.COMPANIES;\n const data = {\n ...payload,\n } \n const response = await apiClient(endpoint, {\n method: entityId ? 'PUT' : 'POST',\n data,\n });\n if( response.status === 200 ) {\n return true;\n }\n return false;\n};\n","import { useRenderConfigStore } from \"@/stores/renderConfig\";\n\nexport const useApiToasts = () => {\n const { callbacks } = useRenderConfigStore();\n\n const showSuccessToast = (toastMessage: string) => {\n callbacks?.showToast?.('success', toastMessage);\n };\n\n const showErrorToast = (toastMessage?: string) => {\n callbacks?.showToast?.('error', toastMessage ?? 'Something went wrong');\n };\n\n return {\n showSuccessToast,\n showErrorToast,\n }; \n};","import { useMutation } from \"@tanstack/react-query\";\n\nimport { createEditCompany } from \"@/services/create-edit-company\";\nimport { useApiToasts } from \"@/hooks/useApiToasts\";\n\nimport type { AxiosError } from \"axios\";\nimport type { EntityErrorPayload } from \"@/types/entity\";\n\nexport type UseCompanyMutateParams = {\n isEdit: boolean;\n onSuccess: () => void;\n onError: (error: EntityErrorPayload) => void;\n}\n\n\nexport const useCompanyMutate = ({ isEdit, onSuccess, onError }: UseCompanyMutateParams) => {\n const { showSuccessToast, showErrorToast } = useApiToasts();\n return useMutation({\n mutationFn: createEditCompany,\n onSuccess: () => {\n showSuccessToast(`Account ${isEdit ? 'updated' : 'created'} successfully`);\n onSuccess();\n },\n onError:(error: AxiosError<EntityErrorPayload>) => {\n const errorMessage = error?.response?.data?.detail ?? error?.message;\n showErrorToast(errorMessage);\n const errorData = error?.response?.data;\n if(Array.isArray(errorData?.custom_fields_errors) && errorData.custom_fields_errors.length > 0){\n onError(errorData);\n }\n }\n });\n};","import { apiClient } from './axios';\nimport { ENDPOINTS } from '@/constants/endpoints';\n\nimport type { EntityMutatePayload } from '@/types/entity';\nimport { replaceParams } from '@/utils/api';\n\n\nexport type CreateEditContactParams = {\n payload: EntityMutatePayload<'contact'>;\n entityId?: number;\n}\n\n\n\nexport const createEditContact = async (\n { payload, entityId }: CreateEditContactParams\n): Promise<boolean> => {\n const data = {\n ...payload,\n email_id: payload.email\n } \n const endpoint = entityId ? replaceParams(ENDPOINTS.EDIT_CONTACT, { entity_id: String(entityId) }) : ENDPOINTS.CONTACTS;\n const response = await apiClient(endpoint, {\n method: entityId ? 'PUT' : 'POST',\n data,\n });\n if( response.status === 200 ) {\n return true;\n }\n return false;\n};\n","import { useMutation } from \"@tanstack/react-query\";\n\nimport { createEditContact } from \"@/services/create-edit-contact\";\nimport { useApiToasts } from \"@/hooks/useApiToasts\";\n\nimport type { AxiosError } from \"axios\";\nimport type { EntityErrorPayload } from \"@/types/entity\";\n\nexport type UseContactMutateParams = {\n isEdit: boolean;\n onError: (error: EntityErrorPayload) => void;\n onSuccess: () => void;\n}\n\n\nexport const useContactMutate = ({ isEdit, onSuccess, onError }: UseContactMutateParams) => {\n const { showSuccessToast, showErrorToast } = useApiToasts();\n return useMutation({\n mutationFn: createEditContact,\n onSuccess: () => {\n showSuccessToast(`Contact ${isEdit ? 'updated' : 'created'} successfully`);\n onSuccess();\n },\n onError: (error: AxiosError<EntityErrorPayload>) => {\n const errorMessage = error?.response?.data?.detail ?? error?.message;\n showErrorToast(errorMessage);\n const errorData = error?.response?.data;\n if(Array.isArray(errorData?.custom_fields_errors) && errorData.custom_fields_errors.length > 0){\n onError(errorData);\n }\n },\n });\n};","import { ENTITY_TYPES } from \"@/constants/custom-fields\";\nimport { ENTITY_FIELD_KEYS } from \"@/constants/entity\";\nimport type { CustomFieldMap, ENTITY_TYPE, CF_VALUE } from \"@/types/custom-fields\";\nimport type { EntityFields, EntityMutatePayload, EntityFilterValue, EntityFilterPayload } from \"@/types/entity\";\n\nexport const getCreatePayload = <T extends ENTITY_TYPE>( formData: Record<string, unknown>, entityType: T):EntityMutatePayload<T> => {\n const fieldKeys = ENTITY_FIELD_KEYS[entityType] as (EntityFields<T>)[];\n const extractData = { ...formData };\n const data = {} as EntityMutatePayload<T>;\n for( const key of fieldKeys ) {\n data[key] = extractData[key] as EntityMutatePayload<T>[typeof key];\n delete extractData[key];\n }\n\n data.custom_fields = [] as CustomFieldMap[];\n\n for( const key in extractData ) {\n data.custom_fields.push({\n cf_id: Number(key),\n value: extractData[key] as CF_VALUE,\n });\n }\n return data;\n}\n\nexport const getFilterPayload = (value: EntityFilterValue): EntityFilterPayload => {\n const payload = [] as EntityFilterPayload;\n for( const key in value ){\n const values = value[key];\n if( !Array.isArray(values) || values.length === 0 ) continue;\n payload.push({\n custom_field_id: key,\n values: values,\n })\n }\n\n return payload;\n}\n\nexport const getFilterValue = (payload: EntityFilterPayload): EntityFilterValue => {\n const value = {} as EntityFilterValue;\n for( const item of payload ){\n if(!Array.isArray(item.values) || item.values.length === 0) continue;\n value[item.custom_field_id] = item.values;\n }\n return value;\n}\n\nexport const getEntityName = (entityType: ENTITY_TYPE) => { \n return entityType === ENTITY_TYPES.COMPANY ? 'account' : 'contact';\n}","import { TextField, type TextFieldProps } from './index';\n\nexport type NumberFieldProps = Omit<TextFieldProps, 'value' | 'onChange'> & {\n value?: number;\n min?: number;\n max?: number;\n step?: number;\n onChange?: (value: number) => void;\n}\n\nexport const NumberField = ({ ...props }: NumberFieldProps) => {\n const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n const number = Number(value);\n if(isNaN(number)) return;\n props.onChange?.(number);\n }\n return <TextField {...props} type=\"text\" value={props.value ? String(props.value): ''} onChange={onChange} />;\n};","import { useMemo } from \"react\";\n\nimport { useDelayedState } from \"@/hooks/useDelayedState\";\nimport { useCFList } from \"@/queries/useCFList\";\nimport { useExcludedDomains } from \"@/queries/useExcludedDomains\";\nimport { Drawer } from \"@/components/Drawer\";\nimport { DrawerHeader } from \"@/components/Drawer/Header\";\nimport { TextField } from \"@/components/TextField\";\nimport { Select } from \"@/components/Select\";\nimport { CFDateField } from \"./date-field\";\nimport { ChipField } from \"@/components/ChipField\";\nimport { CF_TYPES, BOOLEAN_OPTIONS } from \"@/constants/custom-fields\";\nimport { LABELS, CRM_SYNCED_FIELD_TOOLTIP } from \"@/constants/entity\";\nimport { FormField } from \"@/components/FormField\";\nimport { Footer } from \"./footer\";\nimport { EntityFormProvider } from \"./provider\";\nimport { useCrmConfigs } from \"@/queries/useCrmConfigs\";\nimport { getCrmDisabledFieldNames } from \"../utils\";\n\n\nimport { getPlaceholder } from \"@/utils/form\";\nimport { useCompanyMutate } from \"@/mutations/useCompanyMutate\";\nimport { useContactMutate } from \"@/mutations/useContactMutate\";\nimport { getCreatePayload } from \"@/utils/entity\";\nimport { NumberField } from \"@/components/TextField/number\";\nimport { useFormActions } from \"@/hooks/useFormActions\";\nimport { ENTITY_TYPES } from \"@/constants/custom-fields\";\nimport { ENTITY_FORM_FIELDS } from \"@/constants/entity\";\nimport { dateValidation, getDomainsListValidation } from \"@/utils/validations\";\n\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\nimport type { FormFieldType } from \"@/types/form\";\nimport type { EntityErrorPayload, ContactFields, CompanyFields } from \"@/types/entity\";\n\nexport type CreateEditCFProps = {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n entityId?: number;\n initialData?: Record<string, unknown>;\n entityType: ENTITY_TYPE;\n};\n\nexport const CreateEditEntity = ( props: CreateEditCFProps) => {\n const delayedOpen = useDelayedState(props.open, 200);\n \n if (!props.open) return null;\n return (\n <EntityFormProvider initialData={props.initialData} entityId={props.entityId}>\n <RootCreateEditEntity {...props} open={delayedOpen} />\n </EntityFormProvider>\n );\n};\n\nconst editDisabledFields = { \n [ENTITY_TYPES.CONTACT]: ['email'] satisfies ContactFields[],\n [ENTITY_TYPES.COMPANY]: [] satisfies CompanyFields[],\n}\n\nconst RootCreateEditEntity = ({ open, entityId, entityType, onClose, onSuccess }: CreateEditCFProps) => {\n\n const isEdit = Boolean(entityId);\n\n const { data: crmConfigs } = useCrmConfigs(isEdit);\n\n const forcedDisabledFields = useMemo(\n () => isEdit ? getCrmDisabledFieldNames(crmConfigs, entityType) : [],\n [ isEdit, crmConfigs, entityType],\n );\n\n const crmDisableMessage = useMemo(() => { \n if (!Array.isArray(crmConfigs?.data)) return '';\n const connected = crmConfigs.data.find(config => config.status === 'active');\n const connectorName = connected?.crm_provider ?? '';\n if (!connectorName || ( typeof connectorName !== 'string' ) ) return '';\n const capitalisedName = connectorName[0].toUpperCase() + connectorName.slice(1);\n return CRM_SYNCED_FIELD_TOOLTIP.replace('{{CRM}}', capitalisedName);\n }, [crmConfigs])\n\n const defaultFormFields = ENTITY_FORM_FIELDS[entityType];\n\n const { data: cfList } = useCFList({ entity_type: entityType });\n\n const { data: excludedDomains } = useExcludedDomains(!!open && entityType === ENTITY_TYPES.COMPANY);\n\n const { setErrors } = useFormActions();\n\n const onError = ( error: EntityErrorPayload ) => {\n const fieldErrors = error.custom_fields_errors;\n const errors = Object.fromEntries(fieldErrors.map((field) => [field.cf_id, field.reason]));\n setErrors(errors);\n };\n\n const companyApiProps = useCompanyMutate({\n isEdit,\n onSuccess, \n onError\n });\n const contactApiProps = useContactMutate({\n isEdit,\n onSuccess,\n onError\n });\n\n\n const apiProps = entityType === ENTITY_TYPES.COMPANY ? companyApiProps : contactApiProps;\n\n const { isPending } = apiProps;\n\n const formFields = useMemo<FormFieldType[]>(() => {\n if(!Array.isArray(cfList) || cfList.length === 0) return defaultFormFields;\n\n const baseDisabledFields = isEdit ? editDisabledFields[entityType] : [];\n const crmDisabledFieldNames = new Set<string>(forcedDisabledFields ?? []);\n const disabledFieldNames = new Set<string>([\n ...(baseDisabledFields as string[]),\n ...crmDisabledFieldNames,\n ]);\n const existingFields = defaultFormFields.map((field) => ({\n ...field,\n disabled: disabledFieldNames.has(field.name),\n disabledTooltip: crmDisabledFieldNames.has(field.name) ? crmDisableMessage : undefined,\n }));\n const cfFields = cfList.map((cf) => {\n const name = String(cf.cf_id);\n return {\n name,\n label: cf.display_name,\n type: cf.type,\n placeholder: getPlaceholder(cf.display_name, cf.type),\n options: cf.dropdown_values?.map(option => ({ label: option.display_name ?? '', value: option.id ?? '' })) ?? [],\n disabled: disabledFieldNames.has(name),\n disabledTooltip: crmDisabledFieldNames.has(name) ? crmDisableMessage : undefined,\n validations: cf.type === CF_TYPES.DATE ? { custom: dateValidation } : undefined,\n }\n });\n\n return [ ...existingFields, ...cfFields ];\n }, [defaultFormFields, cfList, isEdit, entityType, forcedDisabledFields, crmDisableMessage])\n\n const handleSubmit = ( data: Record<string, unknown> ) => {\n const payload = getCreatePayload(data, entityType);\n apiProps.mutate({ payload, entityId });\n };\n\n const headerTitle = isEdit ? LABELS.HEADER.EDIT[entityType] : LABELS.HEADER.CREATE[entityType];\n const domainKey: CompanyFields = 'domains';\n const domainsListValidation = getDomainsListValidation(excludedDomains);\n\n // `closeOnOverlayClick={false}`: this drawer holds a form. A click that landed\n // on the backdrop — including one that merely OVERSHOT a field near the panel\n // edge — discarded everything typed, with no confirmation and no undo. The\n // header's X and the footer's Cancel remain the ways out, both deliberate.\n return (\n <Drawer open={open} className=\"cm:w-[640px]\" onClose={onClose} closeOnOverlayClick={false}>\n <div className=\"cm:flex cm:flex-col cm:h-full\">\n <DrawerHeader\n title={headerTitle}\n onClose={onClose}\n />\n <div className=\"cm:flex-1 cm:min-h-0 cm:overflow-y-auto cm:px-7 cm:py-5 cm:flex cm:flex-col cm:gap-5\">\n\n {formFields.map((field) => (\n <FormField \n key={field.name}\n name={field.name}\n label={field.label}\n info={field.info}\n disabledTooltip={field.disabled ? field.disabledTooltip : undefined}\n validations={field.name === domainKey? {...field.validations, custom:domainsListValidation} : field.validations}\n checkDiff={field.checkDiff}\n renderField={(props) => {\n\n if( field.type === CF_TYPES.DROPDOWN ){\n return (\n <Select\n placeholder={field.placeholder}\n value={props.value}\n disabled={field.disabled}\n onChange={(e) => props.onChange(e.target.value)}\n options={field.options}\n />\n )\n }\n if(field.type === CF_TYPES.BOOLEAN ){\n return (\n <Select\n placeholder={\"Select yes or no\"}\n value={props.value}\n disabled={field.disabled}\n onChange={(e) => props.onChange(e.target.value)}\n options={BOOLEAN_OPTIONS}\n />\n )\n }\n\n if( field.type === CF_TYPES.DATE ){\n return (\n <CFDateField\n placeholder={field.placeholder}\n value={props.value as number}\n error={props.hasError}\n disabled={field.disabled}\n onChange={props.onChange}\n onBlur={props.onBlur}\n />\n )\n }\n\n if( field.type === CF_TYPES.NUMBER ){\n return (\n <NumberField\n placeholder={field.placeholder}\n value={props.value as number}\n error={props.hasError}\n disabled={field.disabled}\n onChange={(value) => props.onChange(value)}\n onBlur={props.onBlur}\n />\n )\n }\n\n if( field.type === CF_TYPES.CHIP ){\n return (\n <ChipField\n placeholder={field.placeholder}\n value={props.value as string[]}\n error={props.hasError}\n disabled={field.disabled}\n onChange={(value) => props.onChange(value)}\n onBlur={props.onBlur}\n />\n )\n }\n\n return (\n <TextField\n placeholder={field.placeholder}\n value={props.value as string}\n error={props.hasError}\n disabled={field.disabled}\n onChange={(e) => props.onChange(e.target.value)}\n onBlur={props.onBlur}\n />\n )\n }}\n />\n ))}\n </div>\n <Footer \n isEdit={isEdit} \n entityType={entityType}\n isLoading={isPending} \n onSubmit={handleSubmit} \n onCancel={onClose} \n />\n </div>\n </Drawer>\n );\n};\n","export const ROUTES = {\n CUSTOM_FIELDS: '/custom-fields/:entityType',\n ACCOUNTS: '/accounts',\n CONTACTS: '/contacts',\n} as const;\n\n/** Search-param key for the Accounts listing's selected tab. */\nexport const LIST_TAB_PARAM = 'tab';\n\n/** URL slugs, not tab indexes — index 1 only exists while At Risk is rendered. */\nexport const ACCOUNT_LIST_TABS = {\n ALL: 'all',\n AT_RISK: 'at-risk',\n} as const;\n\nexport type AccountListTab = (typeof ACCOUNT_LIST_TABS)[keyof typeof ACCOUNT_LIST_TABS];\n","import { cn } from \"@/utils/classNames\";\nimport Tooltip from \"@/components/Tooltip\";\n\nimport type { ReactNode } from \"react\";\n\nexport type ToolbarIconButtonProps = {\n open: boolean;\n children: ReactNode;\n tooltip: string;\n disabled?: boolean;\n className?: string;\n onClick: () => void;\n};\n\nexport const ToolbarIconButton = ({ open, children, tooltip, disabled=false, className, onClick }: ToolbarIconButtonProps) => (\n /*\n * `triggerClassName` IS THE FIX FOR THE OVERLAPPING ICONS.\n *\n * `Tooltip`'s default trigger is `cm:flex cm:min-w-0 cm:max-w-full` — a flex\n * item that may shrink to nothing. In the toolbar's actions row that is\n * exactly what happened: each 32px button sat in a wrapper compressed to\n * 16px, so every button overflowed its box and overlapped its neighbour by\n * 8px. The button itself already carries `shrink-0`; the wrapper AROUND it\n * did not, and the wrapper is the flex item.\n *\n * The default stays as it is for the ten other call sites, where the trigger\n * wraps text that genuinely should be allowed to truncate.\n */\n <Tooltip content={tooltip} triggerClassName=\"cm:flex cm:shrink-0\">\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n /* These buttons are icon-only, so without this they have NO accessible\n name — a screen reader announced five unlabelled buttons in a row, and\n nothing could address them by name. The tooltip already carries the\n right words (\"Filter\", \"Table preferences\", \"Manage account fields\",\n \"Account settings\"); this just makes them reachable. */\n aria-label={tooltip}\n className={cn(\n \"cm:w-[32px] cm:h-[32px] cm:rounded-md cm:border cm:flex cm:items-center cm:justify-center cm:shrink-0 cm:cursor-pointer cm:transition-colors\",\n \"cm:disabled:opacity-80 cm:disabled:bg-slate-surface-subtle-200! cm:disabled:cursor-not-allowed cm:disabled:hover:bg-white\",\n open\n ? \"cm:bg-primary-surface-subtle cm:border-primary-border-default cm:text-primary-text-default\"\n : \"cm:bg-white cm:border-slate-border-light cm:text-slate-text-body cm:hover:bg-slate-100\",\n className\n )}\n >\n {children}\n </button>\n </Tooltip>\n);","import { useNavigate } from \"react-router-dom\";\nimport { ROUTES } from \"@/constants/routes\";\nimport { replaceParams} from \"@/utils/api\";\nimport { ToolbarIconButton } from \"../toolbar/icon-button\";\nimport { getEntityName } from \"@/utils/entity\";\n\nimport { FieldsConfigGlyph } from \"@/components/Icon/glyphs\";\n\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\n\ntype CFConfigProps = {\n entityType: ENTITY_TYPE;\n className?: string;\n};\n\nexport const CFConfigButton = ({ entityType, className }: CFConfigProps) => {\n\n const navigate = useNavigate();\n \n const entityName = getEntityName(entityType);\n\n const handleClick = () => {\n navigate(replaceParams(ROUTES.CUSTOM_FIELDS, { entityType }));\n }\n\n return (\n <ToolbarIconButton\n open={false}\n tooltip={`Manage ${entityName} fields`}\n className={className}\n onClick={handleClick}\n >\n <FieldsConfigGlyph className=\"cm:w-4 cm:h-4\" />\n </ToolbarIconButton>\n );\n};\n","import { useState, useRef, useMemo, useEffect } from \"react\";\n\nimport { TextField } from \"@/components/TextField\";\nimport { Button } from \"@/components/Button\";\nimport { domainValidation } from \"@/utils/validations\";\nimport { debounce } from \"@/utils/debounce\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\n\nimport type { ChangeEvent, KeyboardEvent } from \"react\";\n\nexport type ExcludeListInputProps = {\n maxItems: number;\n items: string[];\n error: string | null;\n isPending: boolean;\n placeholder?: string;\n addLabel?: string;\n setError: (errorMessage: string | null) => void;\n onAdd: (value: string) => void;\n};\n\nexport const ExcludeListInput = ({\n maxItems,\n items,\n placeholder,\n error,\n isPending,\n addLabel = \"Add\",\n setError,\n onAdd,\n}: ExcludeListInputProps) => {\n\n const [value, setValue] = useState(\"\");\n const refValue = useRef(value);\n const debouncedValidate = useMemo(() => debounce(300), []);\n\n useEffect(() => {\n return () => {\n debouncedValidate(() => {\n const error = domainValidation(refValue.current, { maxItems: maxItems, items: items });\n setError(error ? error : null);\n });\n };\n }, [items, maxItems, debouncedValidate, setError]);\n\n const onChange = (value: string) => {\n setValue(value);\n refValue.current = value;\n };\n\n const handleAdd = (value: string) => {\n onAdd(value);\n onChange(\"\");\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key !== \"Enter\" || !!error || isPending) return;\n event.preventDefault();\n // Read the controlled value, not `event.currentTarget.value`: on hui the key\n // handler sits on v2 Input's root <div>, whose `value` is undefined — Enter\n // then \"added\" an empty string and cleared the field without a request.\n if (!value.trim()) return;\n // Validation is debounced; Enter can land inside that window.\n const validationError = domainValidation(value, { maxItems, items });\n if (validationError) {\n setError(validationError);\n return;\n }\n handleAdd(value);\n };\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value || \"\";\n onChange(value);\n debouncedValidate(() => {\n const error = domainValidation(value, { maxItems: maxItems, items: items });\n setError(error ? error : null);\n });\n };\n\n return (\n <div className=\"cm-exclude-add-row cm:flex cm:flex-col cm:gap-2 cm:px-4 cm:pt-4 cm:pb-3\">\n <div className=\"cm:flex cm:items-start cm:gap-3\">\n <div className=\"cm:flex-1 cm:min-w-0\">\n <TextField\n placeholder={placeholder}\n value={value}\n // hui: the outline shows the error like every other form field.\n // Omni has always shown the message only, and keeps that.\n error={IS_HUI && !!error}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n />\n </div>\n <Button\n variant=\"contained\"\n color=\"primary\"\n label={addLabel}\n isLoading={isPending}\n onClick={() => handleAdd(value)}\n disabled={!!error || isPending}\n className=\"cm:px-4! cm:h-[40px]\"\n />\n </div>\n {!!error && <p className=\"cm:m-0 cm:text-[13px] cm:text-[#c0531f]\">{error}</p>}\n </div>\n );\n};\n","import { DeleteGlyph } from \"@/components/Icon/glyphs\";\n\nexport type ExcludeListItemProps = {\n value: string;\n onRemove: (value: string) => void;\n removeAriaLabel?: string;\n};\n\nexport const ExcludeListItem = ({\n value,\n onRemove,\n removeAriaLabel,\n}: ExcludeListItemProps) => {\n return (\n <li className=\"cm:flex cm:items-center cm:justify-between cm:gap-3 cm:px-4 cm:py-3 cm:border-b cm:border-[#edf1f6] cm:last:border-b-0\">\n <span className=\"cm:text-[14px] cm:text-slate-text-title cm:truncate\">\n {value}\n </span>\n <button\n type=\"button\"\n aria-label={removeAriaLabel ?? `Remove ${value}`}\n onClick={() => onRemove(value)}\n className=\"cm:w-7 cm:h-7 cm:p-0 cm:bg-transparent cm:border-0 cm:rounded-md cm:text-slate-icons-subtle cm:hover:bg-slate-surface-subtle-100 cm:flex cm:items-center cm:justify-center cm:cursor-pointer\"\n >\n <DeleteGlyph aria-hidden=\"true\" className=\"cm-exclude-item__delete cm:w-3 cm:h-3\" />\n </button>\n </li>\n );\n};\n","import { ExcludeListInput, type ExcludeListInputProps } from \"./ExcludeListInput\";\nimport { ExcludeListItem } from \"./ExcludeListItem\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\n\nexport type ExcludeListCardProps = ExcludeListInputProps & {\n items: string[];\n onRemove: (value: string) => void;\n removeAriaLabel?: (value: string) => string;\n};\n\nexport const ExcludeListCard = ({\n items,\n onRemove,\n removeAriaLabel,\n ...inputProps\n}: ExcludeListCardProps) => {\n const hasItems = items.length > 0;\n\n const rows = items.map((item) => (\n <ExcludeListItem\n key={item}\n value={item}\n onRemove={onRemove}\n removeAriaLabel={removeAriaLabel?.(item)}\n />\n ));\n\n /*\n * HiG separates the two: the add field is its own control ABOVE a card that\n * holds only the existing domains. Omni nests the field inside the card as its\n * first row.\n *\n * That is a structural difference, not a paint one — the field moves out of\n * the bordered container — so it forks here rather than being styled around.\n * `IS_HUI` is a build-time constant, so each artifact keeps one branch.\n */\n if (IS_HUI) {\n return (\n <div className=\"cm:flex cm:flex-col cm:gap-4\">\n <ExcludeListInput {...inputProps} items={items} />\n\n {hasItems ? (\n <ul className=\"cm-exclude-list cm:list-none cm:m-0 cm:p-0 cm:rounded-lg cm:border cm:border-slate-border-mild cm:bg-white cm:overflow-hidden\">\n {rows}\n </ul>\n ) : null}\n </div>\n );\n }\n\n return (\n <div className=\"cm:rounded-lg cm:border cm:border-[#edf1f6] cm:bg-white\">\n <ExcludeListInput {...inputProps} items={items}/>\n\n {hasItems ? (\n <ul className=\"cm:list-none cm:m-0 cm:p-0 cm:border-t cm:border-[#edf1f6]\">\n {rows}\n </ul>\n ) : null}\n </div>\n );\n};\n","import { useMutation } from \"@tanstack/react-query\";\n\nimport { updateDomainsList } from \"@/services/excluded-domains\";\nimport { useApiToasts } from \"@/hooks/useApiToasts\";\n\ntype UpdateDomainParams = {\n onSuccess?: () => void;\n}\n\n\nexport const useUpdateDomains = ({ onSuccess }: UpdateDomainParams) => {\n const { showErrorToast } = useApiToasts();\n\n return useMutation({\n mutationFn: updateDomainsList,\n onSuccess: () => {\n onSuccess?.();\n },\n onError: () => {\n showErrorToast('Domain list update failed');\n },\n });\n};","import { useMutation } from \"@tanstack/react-query\";\n\nimport { deleteDomain } from \"@/services/excluded-domains\";\nimport { useApiToasts } from \"@/hooks/useApiToasts\";\n\ntype DeleteDomainParams = {\n onSuccess?: () => void;\n}\n\n\nexport const useRemoveDomain = ({ onSuccess }: DeleteDomainParams) => {\n const { showSuccessToast, showErrorToast } = useApiToasts();\n\n return useMutation({\n mutationFn: deleteDomain,\n onSuccess: (domain) => {\n if(!domain)return;\n showSuccessToast(`Domain ${domain} removed successfully`);\n onSuccess?.();\n },\n onError: () => {\n showErrorToast('Domain removal failed');\n },\n });\n};","import { useState, useEffect } from \"react\";\n\nimport { useExcludedDomains } from \"@/queries/useExcludedDomains\";\nimport { useUpdateDomains } from \"@/mutations/useUpdateDomains\";\nimport { useRemoveDomain } from \"@/mutations/useRemoveDomain\";\n\nexport const useExcludeList = () => {\n const [items, setItems] = useState<string[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n const { data: excludedDomains, refetch: refetchList } = useExcludedDomains();\n const { mutate: updateDomains, isPending: isUpdating } = useUpdateDomains({ onSuccess: refetchList });\n const { mutate: removeDomain, isPending: isRemoving } = useRemoveDomain({ onSuccess: refetchList });\n\n const isPending = isUpdating || isRemoving;\n\n useEffect(() => {\n if(Array.isArray(excludedDomains)) {\n setItems(excludedDomains);\n }\n }, [excludedDomains]);\n\n const update = (next: string[]) => {\n setItems(next);\n }\n\n const add = (value: string) => {\n const trimmed = value.trim().toLowerCase();\n if(!trimmed)return;\n const next = [...items, trimmed];\n update(next);\n updateDomains({ domains: [...items, trimmed] });\n };\n\n const remove = (value: string) => {\n const next = items.filter((item) => item !== value);\n update(next);\n removeDomain({ domain: value });\n }\n\n return { items, error, isPending, setError, add, remove };\n};\n","export const DEFAULT_MAX_DOMAINS = 3;\n\nexport const DRAWER_WIDTH = 586;\n\nexport const COPY = {\n drawerTitle: \"Account settings\",\n sectionTitle: \"Exclude common domains\",\n sectionDescription:\n \"Domains added here won't be treated as accounts. Use this to exclude personal email providers or domains that don't represent an organization.\",\n inputPlaceholder: \"e.g. gmail.com\",\n addButton: \"Add\",\n limitReached: (max: number) => `Remove a domain to add another (max ${max}).`,\n removeAriaLabel: (value: string) => `Remove ${value}`,\n} as const;\n","import { Drawer } from \"@/components/Drawer\";\nimport { DrawerHeader } from \"@/components/Drawer/Header\";\n\nimport { ExcludeListCard } from \"./components/ExcludeListCard\";\nimport { useExcludeList } from \"./hooks/useExcludeList\";\nimport { COPY, DEFAULT_MAX_DOMAINS, DRAWER_WIDTH } from \"./constants\";\n\nexport type ExcludeDomainsDrawerProps = {\n open: boolean;\n maxDomains?: number;\n onClose: () => void;\n};\n\nexport const ExcludeDomainsDrawer = ({\n open,\n maxDomains = DEFAULT_MAX_DOMAINS,\n onClose,\n}: ExcludeDomainsDrawerProps) => {\n const { items, error, isPending, setError, add, remove } = useExcludeList();\n\n return (\n <Drawer open={open} onClose={onClose} width={DRAWER_WIDTH}>\n <div className=\"cm:flex cm:flex-col cm:h-full\">\n <DrawerHeader title={COPY.drawerTitle} onClose={onClose} className=\"cm:px-11\" />\n\n <div className=\"cm:flex-1 cm:min-h-0 cm:overflow-y-auto cm:px-11 cm:py-11 cm:flex cm:flex-col cm:gap-2\">\n <h3 className=\"cm:text-[16px] cm:font-medium cm:text-slate-text-title cm:m-0\">\n {COPY.sectionTitle}\n </h3>\n <p className=\"cm:text-[13px] cm:leading-5 cm:font-normal cm:text-slate-500 cm:m-0\">\n {COPY.sectionDescription}\n </p>\n\n <div className=\"cm:mt-4\">\n <ExcludeListCard\n items={items}\n error={error}\n maxItems={maxDomains}\n placeholder={COPY.inputPlaceholder}\n addLabel={COPY.addButton}\n isPending={isPending}\n removeAriaLabel={COPY.removeAriaLabel}\n setError={setError}\n onAdd={add}\n onRemove={remove}\n />\n </div>\n </div>\n </div>\n </Drawer>\n );\n};\n","import { useState } from \"react\";\n\nimport { ExcludeDomainsDrawer } from \"@/features/exclude-domains\";\nimport { ENTITY_TYPES } from \"@/constants/custom-fields\";\nimport { ToolbarIconButton } from \"../toolbar/icon-button\";\n\nimport { SettingsGlyph } from \"@/components/Icon/glyphs\";\n\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\n\ntype SettingsProps = {\n entityType: ENTITY_TYPE;\n className?: string;\n};\n\nconst DEFAULT_MAX_DOMAINS = 5;\nexport const SettingsButton = ({ entityType }: SettingsProps) => {\n\n const [open, setOpen] = useState(false);\n\n const isCompany = entityType === ENTITY_TYPES.COMPANY;\n if(!isCompany) return null;\n return (\n <>\n <ToolbarIconButton\n open={false}\n tooltip=\"Account settings\"\n onClick={() => setOpen(true)}\n >\n <SettingsGlyph className=\"cm:w-4 cm:h-4\" />\n </ToolbarIconButton>\n <ExcludeDomainsDrawer\n open={open}\n onClose={() => setOpen(false)}\n maxDomains={DEFAULT_MAX_DOMAINS}\n />\n </>\n );\n};\n","import * as React from \"react\";\nconst SvgGreenTick = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 14, height: 14, viewBox: \"0 0 14 14\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"rect\", { width: 14, height: 14, fill: \"white\", fillOpacity: 0.01 }), /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M12.8327 7.00001C12.8327 10.2217 10.221 12.8333 6.99935 12.8333C3.77769 12.8333 1.16602 10.2217 1.16602 7.00001C1.16602 3.77834 3.77769 1.16667 6.99935 1.16667C10.221 1.16667 12.8327 3.77834 12.8327 7.00001ZM5.47242 6.45687C5.54359 6.48745 5.60795 6.53189 5.66176 6.5876L6.41601 7.34185L8.33693 5.42093C8.39074 5.36522 8.45511 5.32078 8.52628 5.29021C8.59745 5.25964 8.67399 5.24354 8.75145 5.24287C8.8289 5.2422 8.90571 5.25696 8.9774 5.28629C9.04909 5.31562 9.11422 5.35893 9.16899 5.4137C9.22377 5.46847 9.26708 5.5336 9.29641 5.60529C9.32574 5.67698 9.3405 5.7538 9.33983 5.83125C9.33915 5.90871 9.32306 5.98525 9.29249 6.05642C9.26192 6.12759 9.21748 6.19196 9.16176 6.24577L6.82843 8.5791C6.71904 8.68846 6.57069 8.74989 6.41601 8.74989C6.26133 8.74989 6.11299 8.68846 6.0036 8.5791L4.83693 7.41243C4.78122 7.35862 4.73678 7.29426 4.7062 7.22309C4.67563 7.15192 4.65954 7.07537 4.65887 6.99792C4.6582 6.92046 4.67295 6.84365 4.70229 6.77196C4.73162 6.70027 4.77493 6.63514 4.8297 6.58037C4.88447 6.5256 4.9496 6.48229 5.02129 6.45295C5.09298 6.42362 5.16979 6.40886 5.24725 6.40954C5.3247 6.41021 5.40125 6.4263 5.47242 6.45687Z\", fill: \"#1B6F41\" }));\nexport default SvgGreenTick;\n","import * as React from \"react\";\nconst SvgChevArrowRightLight = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 14, height: 14, viewBox: \"0 0 14 14\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M5.25 10.5L8.75 7L5.25 3.5\", stroke: \"currentColor\", strokeWidth: 1.1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }));\nexport default SvgChevArrowRightLight;\n","import { cn } from \"@/utils/classNames\";\nimport type { ReactNode } from \"react\";\n\nexport interface TabButtonProps {\n active: boolean;\n onClick: () => void;\n icon: ReactNode;\n label: string;\n}\n\nexport const TabButton = ({ active, onClick, icon, label }: TabButtonProps) => (\n <button\n type=\"button\"\n onClick={onClick}\n className={`cm-drawer-tab cm:flex cm:items-center cm:gap-1.5 cm:px-4 cm:py-3 cm:text-sm cm:font-medium\n cm:border-b-2 cm:transition-colors cm:cursor-pointer\n ${\n active\n ? \"cm-drawer-tab--active cm:border-slate-800 cm:text-slate-700\"\n : \"cm:border-transparent cm:text-slate-500 cm:hover:text-slate-600\"\n }`}\n >\n {icon}\n {label}\n </button>\n);\n\nexport const TabBar = ({ children, className }: { children: ReactNode, className?: string }) => (\n <div className={cn(\"cm-drawer-tabbar cm:flex cm:border-b cm:border-slate-200 cm:pl-10 cm:pr-10 cm:flex-shrink-0\", className)}>\n {children}\n </div>\n);\n","export const IMPORT_STATUS = {\n IDLE: \"idle\",\n MINTING: \"minting\",\n UPLOADING: \"uploading\",\n VALIDATING: \"validating\",\n VALIDATED: \"validated\",\n COMMITTING: \"committing\",\n QUEUED: \"queued\",\n ERROR: \"error\",\n} as const;\n\nexport type ImportStatus = (typeof IMPORT_STATUS)[keyof typeof IMPORT_STATUS];\n","import { create } from \"zustand\";\n\nimport {\n IMPORT_STATUS,\n type ImportStatus,\n} from \"@/features/import-csv/constants\";\n\nexport interface ValidationResult {\n columns_to_import: string[];\n columns_to_skip: string[];\n}\n\nexport interface ValidationErrorDetail {\n code: string;\n missing_mandatory: string[];\n columns_to_import: string[];\n columns_to_skip: string[];\n}\n\ninterface ImportCSVStore {\n file: File | null;\n jobId: string | null;\n uploadProgress: number;\n status: ImportStatus;\n validationResult: ValidationResult | null;\n validationErrorDetail: ValidationErrorDetail | null;\n error: string | null;\n\n setFile: (file: File | null) => void;\n setJobId: (id: string) => void;\n setUploadProgress: (pct: number) => void;\n setStatus: (status: ImportStatus) => void;\n setValidationResult: (result: ValidationResult | null) => void;\n setValidationErrorDetail: (detail: ValidationErrorDetail | null) => void;\n setError: (error: string | null) => void;\n reset: () => void;\n}\n\nconst initialState = {\n file: null,\n jobId: null,\n uploadProgress: 0,\n status: IMPORT_STATUS.IDLE as ImportStatus,\n validationResult: null,\n validationErrorDetail: null,\n error: null,\n};\n\nexport const useImportCSVStore = create<ImportCSVStore>((set) => ({\n ...initialState,\n setFile: (file) => set({ file }),\n setJobId: (jobId) => set({ jobId }),\n setUploadProgress: (uploadProgress) => set({ uploadProgress }),\n setStatus: (status) => set({ status }),\n setValidationResult: (validationResult) => set({ validationResult }),\n setValidationErrorDetail: (validationErrorDetail) =>\n set({ validationErrorDetail }),\n setError: (error) => set({ error }),\n reset: () => set(initialState),\n}));\n","import { apiClient } from \"./axios\";\nimport { ENDPOINTS } from \"@/constants/endpoints\";\n\nexport type EntityType = \"contact\" | \"account\" | \"company\";\n\nexport interface PresignedUploadPayload {\n entity_type: EntityType;\n filename: string;\n content_type: string;\n content_length: number;\n}\n\nexport interface PresignedUploadResponse {\n status: string;\n data: {\n job_id: string;\n upload_url: string;\n expires_at: string;\n };\n}\n\nexport interface ValidateImportResponse {\n status: string;\n data: {\n columns_to_import: string[];\n columns_to_skip: string[];\n };\n}\n\nexport interface ValidateImportErrorDetail {\n code: string;\n missing_mandatory: string[];\n columns_to_import: string[];\n columns_to_skip: string[];\n}\n\nexport const downloadSampleCSV = async (\n entityType: EntityType,\n): Promise<Blob> => {\n const response = await apiClient.get<Blob>(\n `${ENDPOINTS.IMPORT_SAMPLE_CSV}/${entityType}`,\n { responseType: \"blob\" },\n );\n return response.data;\n};\n\nexport const mintPresignedUploadUrl = async (\n payload: PresignedUploadPayload,\n): Promise<PresignedUploadResponse> => {\n const response = await apiClient.post<PresignedUploadResponse>(\n ENDPOINTS.IMPORT_PRESIGNED_UPLOAD,\n payload,\n );\n return response.data;\n};\n\nexport const validateImportJob = async (\n jobId: string,\n entityType: EntityType,\n): Promise<ValidateImportResponse> => {\n const url = ENDPOINTS.IMPORT_VALIDATE.replace(\":job_id\", jobId);\n const response = await apiClient.post<ValidateImportResponse>(url, {\n entity_type: entityType,\n });\n return response.data;\n};\n\nexport interface CommitImportResponse {\n status: string;\n data: {\n job_id: string;\n status: \"queued\" | \"processing\" | \"completed\" | \"failed\";\n };\n}\n\nexport const commitImportJob = async (\n jobId: string,\n entityType: EntityType,\n): Promise<CommitImportResponse> => {\n const url = ENDPOINTS.IMPORT_COMMIT.replace(\":job_id\", jobId);\n const response = await apiClient.post<CommitImportResponse>(url, {\n entity_type: entityType,\n });\n return response.data;\n};\n\nexport interface ImportJobMetadata {\n filename: string;\n content_type: string;\n file_size_bytes: number;\n uploaded_file_s3_path: string;\n failure_file_s3_path: string | null;\n triggered_by_user_id: number;\n}\n\nexport interface ImportJob {\n job_id: string;\n entity_type: EntityType;\n status: \"queued\" | \"processing\" | \"completed\" | \"failed\";\n total_rows: number;\n processed_rows: number;\n failed_rows: number;\n last_processed_offset: number;\n metadata: ImportJobMetadata;\n created_at: string;\n updated_at: string;\n}\n\nexport interface ImportJobsListResponse {\n status: string;\n data: {\n jobs: ImportJob[];\n total: number;\n page: number;\n page_size: number;\n };\n}\n\nexport interface ImportJobFailureFileResponse {\n status: string;\n data: {\n presigned_url: string;\n expires_at: string;\n };\n}\n\nexport const getImportJobs = async (\n entityType: EntityType,\n page = 1,\n pageSize = 20,\n): Promise<ImportJobsListResponse> => {\n const response = await apiClient.get<ImportJobsListResponse>(\n ENDPOINTS.IMPORT_JOBS_LIST,\n { params: { entity_type: entityType, page, page_size: pageSize } },\n );\n return response.data;\n};\n\nexport const getImportJobFailureFileUrl = async (\n jobId: string,\n): Promise<ImportJobFailureFileResponse> => {\n const url = ENDPOINTS.IMPORT_JOB_FAILURE_FILE.replace(\":job_id\", jobId);\n const response = await apiClient.get<ImportJobFailureFileResponse>(url);\n return response.data;\n};\n\nexport const uploadFileToS3 = (\n uploadUrl: string,\n file: File,\n onProgress?: (pct: number) => void,\n): Promise<void> => {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(\"PUT\", uploadUrl);\n xhr.setRequestHeader(\"Content-Type\", \"text/csv\");\n\n if (onProgress) {\n xhr.upload.addEventListener(\"progress\", (e) => {\n if (e.lengthComputable) {\n onProgress(Math.round((e.loaded / e.total) * 100));\n }\n });\n }\n\n xhr.addEventListener(\"load\", () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve();\n } else {\n reject(new Error(`S3 upload failed: ${xhr.status} ${xhr.statusText}`));\n }\n });\n\n xhr.addEventListener(\"error\", () => {\n reject(new Error(\"S3 upload failed: network error\"));\n });\n\n xhr.send(file);\n });\n};\n","import { useMutation } from \"@tanstack/react-query\";\n\nimport { mintPresignedUploadUrl } from \"@/services/importCSV\";\nimport type { PresignedUploadResponse } from \"@/services/importCSV\";\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\n\ninterface UsePresignedUploadOptions {\n onSuccess?: (data: PresignedUploadResponse) => void;\n onError?: (error: Error) => void;\n}\n\nexport const usePresignedUpload = (\n entityType: ENTITY_TYPE,\n options?: UsePresignedUploadOptions,\n) => {\n return useMutation({\n mutationFn: (file: File) =>\n mintPresignedUploadUrl({\n entity_type: entityType,\n filename: file.name,\n content_type: file.type || \"text/csv\",\n content_length: file.size,\n }),\n onSuccess: options?.onSuccess,\n onError: options?.onError,\n });\n};\n","import { useMutation } from \"@tanstack/react-query\";\n\nimport { uploadFileToS3 } from \"@/services/importCSV\";\n\nexport interface S3UploadPayload {\n uploadUrl: string;\n file: File;\n}\n\ninterface UseS3UploadOptions {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n onProgress?: (pct: number) => void;\n}\n\nexport const useS3Upload = (options?: UseS3UploadOptions) => {\n return useMutation({\n mutationFn: ({ uploadUrl, file }: S3UploadPayload) =>\n uploadFileToS3(uploadUrl, file, options?.onProgress),\n onSuccess: options?.onSuccess,\n onError: options?.onError,\n });\n};\n","import { useMutation } from '@tanstack/react-query';\n\nimport { validateImportJob } from '@/services/importCSV';\nimport type { ValidateImportResponse, ValidateImportErrorDetail } from '@/services/importCSV';\nimport type { EntityType } from '@/services/importCSV';\n\ninterface UseValidateImportOptions {\n onSuccess?: (data: ValidateImportResponse) => void;\n onError?: (error: unknown) => void;\n}\n\nexport interface ValidateImportPayload {\n jobId: string;\n entityType: EntityType;\n}\n\nexport const isValidateErrorDetail = (data: unknown): data is ValidateImportErrorDetail =>\n typeof data === 'object' &&\n data !== null &&\n 'code' in data &&\n 'missing_mandatory' in data;\n\nexport const useValidateImport = (options?: UseValidateImportOptions) => {\n return useMutation({\n mutationFn: ({ jobId, entityType }: ValidateImportPayload) =>\n validateImportJob(jobId, entityType),\n onSuccess: options?.onSuccess,\n onError: options?.onError,\n });\n};\n","import { useMutation } from '@tanstack/react-query';\n\nimport { commitImportJob } from '@/services/importCSV';\nimport type { CommitImportResponse, EntityType } from '@/services/importCSV';\n\ninterface UseCommitImportOptions {\n onSuccess?: (data: CommitImportResponse) => void;\n onError?: (error: unknown) => void;\n}\n\nexport interface CommitImportPayload {\n jobId: string;\n entityType: EntityType;\n}\n\nexport const useCommitImport = (options?: UseCommitImportOptions) => {\n return useMutation({\n mutationFn: ({ jobId, entityType }: CommitImportPayload) =>\n commitImportJob(jobId, entityType),\n onSuccess: options?.onSuccess,\n onError: options?.onError,\n });\n};\n","import { isAxiosError } from \"axios\";\n\nimport { useImportCSVStore } from \"@/stores/importCSV\";\nimport { useRenderConfig } from \"@/hooks/useRenderConfig\";\nimport { IMPORT_STATUS } from \"../constants\";\nimport { usePresignedUpload } from \"@/mutations/usePresignedUpload\";\nimport { useS3Upload } from \"@/mutations/useS3Upload\";\nimport {\n useValidateImport,\n isValidateErrorDetail,\n} from \"@/mutations/useValidateImport\";\nimport { useCommitImport } from \"@/mutations/useCommitImport\";\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\n\nexport const useImportCSVFlow = (entityType: ENTITY_TYPE) => {\n const {\n setFile,\n setJobId,\n setUploadProgress,\n setStatus,\n setValidationResult,\n setValidationErrorDetail,\n setError,\n } = useImportCSVStore();\n\n const callbacks = useRenderConfig();\n const showToast = callbacks?.showToast;\n\n const { mutate: validateImport } = useValidateImport({\n onSuccess: (data) => {\n setUploadProgress(100);\n setValidationResult(data.data);\n setStatus(IMPORT_STATUS.VALIDATED);\n },\n onError: (err) => {\n setUploadProgress(100);\n if (isAxiosError(err)) {\n if (err.response?.status === 422) {\n const detail = err.response.data?.detail;\n if (isValidateErrorDetail(detail)) setValidationErrorDetail(detail);\n setError(\"Validation failed: missing mandatory column(s).\");\n } else if (err.response?.status === 503) {\n setError(\n \"CSV import is currently not enabled for your account. Please contact support to enable this feature.\",\n );\n } else {\n setError(err.message);\n }\n } else {\n setError(\"Validation failed.\");\n }\n setStatus(IMPORT_STATUS.ERROR);\n },\n });\n\n const { mutate: uploadToS3 } = useS3Upload({\n onProgress: (pct) => setUploadProgress(pct),\n onSuccess: () => {\n setUploadProgress(70);\n setStatus(IMPORT_STATUS.VALIDATING);\n const { jobId } = useImportCSVStore.getState();\n if (jobId) validateImport({ jobId, entityType });\n },\n onError: (error) => {\n setUploadProgress(100);\n setStatus(IMPORT_STATUS.ERROR);\n setError(error.message);\n showToast?.(\"error\", error.message);\n },\n });\n\n const { mutate: mintUploadUrl } = usePresignedUpload(entityType, {\n onSuccess: (data) => {\n setJobId(data.data.job_id);\n setUploadProgress(20);\n setStatus(IMPORT_STATUS.UPLOADING);\n const file = useImportCSVStore.getState().file;\n if (file) uploadToS3({ uploadUrl: data.data.upload_url, file });\n },\n onError: (error) => {\n setUploadProgress(100);\n setStatus(IMPORT_STATUS.ERROR);\n setError(error.message);\n showToast?.(\"error\", error.message);\n },\n });\n\n const startUpload = (file: File) => {\n setFile(file);\n setStatus(IMPORT_STATUS.MINTING);\n setUploadProgress(0);\n setError(null);\n mintUploadUrl(file);\n };\n\n const startCommit = () => {\n const { jobId } = useImportCSVStore.getState();\n if (!jobId) return;\n setStatus(IMPORT_STATUS.COMMITTING);\n setError(null);\n commit({ jobId, entityType });\n };\n\n const { mutate: commit } = useCommitImport({\n onSuccess: () => {\n setStatus(IMPORT_STATUS.QUEUED);\n },\n onError: (err) => {\n let msg: string;\n if (isAxiosError(err)) {\n if (err.response?.status === 409) {\n msg =\n \"Another import for this entity type is already in progress. Please wait for it to complete.\";\n } else if (err.response?.status === 404) {\n msg = \"Import session expired. Please re-upload your CSV file.\";\n } else if (err.response?.status === 503) {\n msg =\n \"CSV import is currently not enabled for your account. Please contact support to enable this feature.\";\n } else {\n msg = err.message;\n }\n } else {\n msg = \"Failed to submit import. Please try again.\";\n }\n setError(msg);\n showToast?.(\"error\", msg);\n setStatus(IMPORT_STATUS.ERROR);\n },\n });\n\n return { startUpload, startCommit };\n};\n","import * as React from \"react\";\nconst SvgCsvIcon = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 28, height: 36, viewBox: \"0 0 28 36\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M0 4.48C0 2.00577 2.00576 0 4.48 0H16.8L22.4 5.6L28 11.2V31.36C28 33.8342 25.9942 35.84 23.52 35.84H4.48C2.00576 35.84 0 33.8342 0 31.36V4.48Z\", fill: \"#2F6E61\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M8.95996 19.6002H19.04M8.95996 22.9602H19.04M14 16.2402V26.3202M11.648 16.2402H16.352C17.2929 16.2402 17.7633 16.2402 18.1227 16.4233C18.4388 16.5844 18.6958 16.8414 18.8568 17.1575C19.04 17.5169 19.04 17.9873 19.04 18.9282V23.6322C19.04 24.5731 19.04 25.0435 18.8568 25.403C18.6958 25.7191 18.4388 25.9761 18.1227 26.1371C17.7633 26.3202 17.2929 26.3202 16.352 26.3202H11.648C10.7071 26.3202 10.2366 26.3202 9.87726 26.1371C9.56114 25.9761 9.30414 25.7191 9.14307 25.403C8.95996 25.0435 8.95996 24.5731 8.95996 23.6322V18.9282C8.95996 17.9873 8.95996 17.5169 9.14307 17.1575C9.30414 16.8414 9.56114 16.5844 9.87726 16.4233C10.2366 16.2402 10.7071 16.2402 11.648 16.2402Z\", stroke: \"white\", strokeWidth: 1.12, strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M16.7998 8.96V0L27.9998 11.2H19.0398C17.8027 11.2 16.7998 10.1971 16.7998 8.96Z\", fill: \"#DDEFEB\" }));\nexport default SvgCsvIcon;\n","interface ProgressBarProps {\n value: number; // 0–100\n color?: string;\n trackColor?: string;\n height?: number;\n className?: string;\n animated?: boolean;\n \"aria-label\"?: string;\n}\n\nexport default function ProgressBar({\n value,\n color = \"cm:bg-blue-500\",\n trackColor = \"cm:bg-slate-100\",\n height = 5,\n className = \"\",\n animated = false,\n \"aria-label\": ariaLabel,\n}: ProgressBarProps) {\n const clamped = Math.min(100, Math.max(0, value));\n\n return (\n <div\n role=\"progressbar\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={ariaLabel}\n className={`cm:w-full cm:rounded-full cm:overflow-hidden ${trackColor} ${className}`}\n style={{ height }}\n >\n <div\n className={`cm:h-full cm:rounded-full \n cm:transition-[width] \n cm:duration-500 cm:ease-[cubic-bezier(0.4,0,0.2,1)] \n ${color} ${animated ? \"cm:animate-pulse\" : \"\"}`}\n style={{ width: `${clamped}%` }}\n />\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nimport { UploadGlyph } from \"@/components/Icon/glyphs\";\nimport CSVIcon from \"@/assets/csv_icon.svg?react\";\nimport { CloseGlyph } from \"@/components/Icon/glyphs\";\nimport ProgressBar from \"@/components/ProgressBar\";\nimport { formatFileSize } from \"@/utils/formatValue\";\nimport { IMPORT_STATUS, type ImportStatus } from \"../../constants\";\n\ninterface DropZoneProps {\n selectedFile: File | null;\n status: ImportStatus;\n uploadProgress: number;\n isPending: boolean;\n onFileSelect: (file: File) => void;\n onRemove: () => void;\n}\n\nexport const DropZone = ({\n selectedFile,\n status,\n uploadProgress,\n isPending,\n onFileSelect,\n onRemove,\n}: DropZoneProps) => {\n const [isDragging, setIsDragging] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!selectedFile && fileInputRef.current) fileInputRef.current.value = \"\";\n }, [selectedFile]);\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n const file = e.dataTransfer.files?.[0];\n if (file) onFileSelect(file);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) onFileSelect(file);\n };\n\n return (\n <div\n onDragOver={(e) => {\n e.preventDefault();\n setIsDragging(true);\n }}\n onDragLeave={() => setIsDragging(false)}\n onDrop={(e) => !selectedFile && handleDrop(e)}\n className={`cm-csv-dropzone cm:rounded-xl cm:border-1 cm:border-dashed cm:bg-slate-50 cm:py-[72px] cm:px-[40px]\n cm:flex cm:flex-col cm:items-center cm:justify-center cm:gap-4 cm:transition-colors cm:min-h-[330px]\n ${isDragging && !selectedFile ? \"cm:border-blue-400 cm:bg-blue-50\" : \"cm:border-slate-200\"}`}\n >\n {selectedFile ? (\n <div className=\"cm:w-full cm:bg-white cm:border cm:border-slate-200 cm:rounded-xl cm:px-4 cm:py-3 cm:flex cm:flex-col cm:gap-2\">\n <div className=\"cm:flex cm:items-center cm:gap-3\">\n <CSVIcon width={44} height={44} />\n <div className=\"cm:flex-1 cm:min-w-0\">\n <p className=\"cm:text-sm cm:font-medium cm:text-slate-800 cm:truncate\">\n {selectedFile.name}\n </p>\n <p className=\"cm:text-xs cm:text-slate-400 cm:mt-0.5\">\n {formatFileSize(selectedFile.size)}\n </p>\n </div>\n <button\n onClick={onRemove}\n className=\"cm:flex-shrink-0 cm:text-slate-400 \n cm:hover:text-slate-600 cm:cursor-pointer\"\n aria-label=\"Remove file\"\n >\n <CloseGlyph width={14} height={14} />\n </button>\n </div>\n {isPending && (\n <ProgressBar\n value={\n status === IMPORT_STATUS.MINTING\n ? 5\n : Math.max(5, uploadProgress)\n }\n animated\n aria-label=\"File upload progress\"\n />\n )}\n </div>\n ) : (\n <>\n {/* HiG puts the glyph on a rounded tile rather than using a\n full-bleed illustration, so the empty state reads as a control. */}\n <span className=\"cm-csv-dropzone__tile\">\n <UploadGlyph className=\"cm-csv-dropzone__glyph\" />\n </span>\n <p className=\"cm:text-sm cm:text-slate-500 cm:font-medium\">\n Drop your CSV file onto this area to upload\n </p>\n <div className=\"cm:flex cm:items-center cm:gap-3 cm:w-full cm:max-w-xs\">\n <div className=\"cm:flex-1 cm:h-px cm:bg-slate-200\" />\n <span className=\"cm:text-sm cm:text-slate-500\">or</span>\n <div className=\"cm:flex-1 cm:h-px cm:bg-slate-200\" />\n </div>\n <button\n onClick={() => fileInputRef.current?.click()}\n className=\"cm-csv-dropzone__choose cm:text-sm cm:font-medium cm:text-slate-700 cm:border cm:border-slate-200\n cm-secondary-action cm:rounded-md cm:px-4 cm:py-2 cm:cursor-pointer cm:bg-white cm:hover:bg-slate-50 cm:transition-colors\"\n >\n Choose a CSV file\n </button>\n </>\n )}\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".csv\"\n className=\"cm:hidden\"\n onChange={handleChange}\n />\n </div>\n );\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport ChevronIcon from \"@/assets/chev_Arrow_Right-light.svg?react\";\nimport { IMPORT_STATUS } from \"../../constants\";\nimport type { ImportStatus } from \"../../constants\";\nimport type {\n ValidationResult,\n ValidationErrorDetail,\n} from \"@/stores/importCSV\";\n\ninterface ValidationResultPanelProps {\n status: ImportStatus;\n validationResult: ValidationResult | null;\n validationErrorDetail: ValidationErrorDetail | null;\n error: string | null;\n}\n\n// TODO - replace icons once M3 PR is merged.\n\nconst GreenCheckIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle className=\"cm-import-validation__status-shape\" cx=\"10\" cy=\"10\" r=\"9\" fill=\"#15803D\" />\n <path\n d=\"M6.5 10.5L9 13L13.5 8\"\n stroke=\"white\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst AmberInfoIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle className=\"cm-import-validation__status-shape\" cx=\"10\" cy=\"10\" r=\"9\" fill=\"#933E0F\" />\n <rect x=\"9.25\" y=\"9\" width=\"1.5\" height=\"5\" rx=\"0.75\" fill=\"white\" />\n <rect x=\"9.25\" y=\"6\" width=\"1.5\" height=\"1.75\" rx=\"0.75\" fill=\"white\" />\n </svg>\n);\n\nconst RedWarningIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M9.134 3.438a1 1 0 0 1 1.732 0l7 12.124A1 1 0 0 1 17 17H3a1 1 0 0 1-.866-1.438l7-12.124Z\"\n className=\"cm-import-validation__status-shape\"\n fill=\"#D94F54\"\n />\n <rect x=\"9.25\" y=\"7.5\" width=\"1.5\" height=\"4.5\" rx=\"0.75\" fill=\"white\" />\n <rect x=\"9.25\" y=\"13\" width=\"1.5\" height=\"1.5\" rx=\"0.75\" fill=\"white\" />\n </svg>\n);\n\nconst VARIANTS = {\n success: {\n container: \"cm:bg-green-50 cm:border-green-400\",\n text: \"cm:text-green-700\",\n contentBg: \"\",\n chevron: \"#15803D\",\n },\n warning: {\n container: \"cm:bg-[#FBE2D5] cm:border-[0.5px] cm:border-[#EC8A54]\",\n text: \"cm:text-[#933E0F]\",\n contentBg: \"cm:bg-[#FEF6F2]\",\n chevron: \"#933E0F\",\n },\n error: {\n container: \"cm:bg-[#FCE4E4] cm:border-[0.5px] cm:border-red-200\",\n text: \"cm:text-[#6D0D0E]\",\n contentBg: \"cm:bg-[#FDF7F7]\",\n chevron: \"#6D0D0E\",\n },\n} as const;\n\nexport const ValidationResultPanel = ({\n status,\n validationResult,\n validationErrorDetail,\n error,\n}: ValidationResultPanelProps) => {\n const scrollRef = useRef<HTMLDivElement>(null);\n const [isExpanded, setIsExpanded] = useState(false);\n\n const show =\n status === IMPORT_STATUS.VALIDATED ||\n (status === IMPORT_STATUS.ERROR && (validationErrorDetail || error));\n\n useEffect(() => {\n setIsExpanded(false);\n }, [status]);\n\n useEffect(() => {\n if (show && scrollRef.current) {\n scrollRef.current.scrollIntoView({\n behavior: \"smooth\",\n block: \"nearest\",\n });\n }\n }, [show]);\n\n if (!show) return null;\n\n const isValidated = status === IMPORT_STATUS.VALIDATED;\n\n const columnsToSkip = validationResult?.columns_to_skip ?? [];\n const hasColumnsToSkip = columnsToSkip.length > 0;\n\n const missingMandatory = validationErrorDetail?.missing_mandatory ?? [];\n\n let variant: keyof typeof VARIANTS = \"success\";\n let label = \"\";\n let icon: React.ReactNode = null;\n let expandedContent: React.ReactNode = null;\n\n if (isValidated && !hasColumnsToSkip) {\n variant = \"success\";\n icon = <GreenCheckIcon />;\n label = \"Validation passed\";\n }\n\n if (isValidated && hasColumnsToSkip) {\n variant = \"warning\";\n icon = <AmberInfoIcon />;\n label = `${columnsToSkip.length} column${columnsToSkip.length > 1 ? \"s\" : \"\"} skipped`;\n\n expandedContent = (\n <div className=\"cm:max-h-[160px] cm:overflow-y-auto\">\n <p className=\"cm:text-sm cm:leading-5 cm:text-[#933E0F]\">\n {columnsToSkip.join(\", \")}\n </p>\n </div>\n );\n }\n\n if (!isValidated) {\n variant = \"error\";\n icon = <RedWarningIcon />;\n label = \"Validation failed\";\n\n if (validationErrorDetail && missingMandatory.length > 0) {\n expandedContent = (\n <div className=\"cm:max-h-[160px] cm:overflow-y-auto\">\n <p className=\"cm:text-sm cm:leading-5 cm:text-[#6D0D0E]\">\n Missing mandatory column : {missingMandatory.join(\", \")}\n </p>\n </div>\n );\n } else if (error) {\n expandedContent = (\n <div className=\"cm:max-h-[160px] cm:overflow-y-auto\">\n <p className=\"cm:text-sm cm:leading-5 cm:text-[#6D0D0E]\">{error}</p>\n </div>\n );\n }\n }\n\n const styles = VARIANTS[variant];\n const isExpandable = Boolean(expandedContent);\n\n return (\n <div\n ref={scrollRef}\n className={`\n cm:rounded-lg\n cm:border\n cm-import-validation\n cm-import-validation--${variant}\n ${styles.container}\n `}\n >\n <button\n type=\"button\"\n onClick={() => isExpandable && setIsExpanded((prev) => !prev)}\n className={`\n cm:flex\n cm:w-full\n cm:items-center\n cm:gap-2\n cm:px-3\n cm:py-2.5\n ${isExpandable ? \"cm:cursor-pointer\" : \"cm:cursor-default\"}\n `}\n >\n {icon}\n\n <span\n className={`\n cm:flex-1\n cm:text-left\n cm:text-sm\n cm:font-medium\n ${styles.text}\n `}\n >\n {label}\n </span>\n\n {isExpandable && (\n <ChevronIcon\n width={16}\n height={16}\n style={{ color: styles.chevron }}\n className={`\n cm-import-validation__chevron\n cm:flex-shrink-0\n cm:transition-transform\n cm:duration-200\n ${isExpanded ? \"cm:-rotate-90\" : \"cm:rotate-90\"}\n `}\n />\n )}\n </button>\n\n {isExpandable && isExpanded && (\n <div\n className={`\n cm:px-3\n cm:py-2.5\n ${styles.contentBg}\n cm:rounded-b-lg\n `}\n >\n {expandedContent}\n </div>\n )}\n </div>\n );\n};\n","import {\n DrawerFooter,\n PrimaryButton,\n SecondaryButton,\n} from \"@/components/Drawer/Footer\";\nimport { IMPORT_STATUS } from \"../../constants\";\nimport type { ImportStatus } from \"../../constants\";\n\ninterface ImportCSVFooterProps {\n status: ImportStatus;\n onCancel: () => void;\n onImport: () => void;\n}\n\nconst getImportLabel = (status: ImportStatus) => {\n if (status === IMPORT_STATUS.MINTING || status === IMPORT_STATUS.UPLOADING) return \"Uploading…\";\n if (status === IMPORT_STATUS.VALIDATING) return \"Validating…\";\n if (status === IMPORT_STATUS.COMMITTING) return \"Submitting…\";\n return \"Import CSV\";\n};\n\nexport const ImportCSVFooter = ({\n status,\n onCancel,\n onImport,\n}: ImportCSVFooterProps) => (\n <DrawerFooter>\n <SecondaryButton label=\"Cancel\" onClick={onCancel} />\n <PrimaryButton\n label={getImportLabel(status)}\n disabled={status !== IMPORT_STATUS.VALIDATED}\n onClick={onImport}\n />\n </DrawerFooter>\n);\n","import { useState, useEffect } from \"react\";\n\nimport Icon from \"@/components/Icon\";\nimport { InfoGlyph } from \"@/components/Icon/glyphs\";\nimport { useImportCSVStore } from \"@/stores/importCSV\";\nimport { downloadSampleCSV } from \"@/services/importCSV\";\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\nimport { useRenderConfig } from \"@/hooks/useRenderConfig\";\nimport { getEntityName } from \"@/utils/entity\";\n\nimport { IMPORT_STATUS } from \"../../constants\";\nimport { useImportCSVFlow } from \"../../hooks/useImportCSVFlow\";\nimport { DropZone } from \"./drop-zone\";\nimport { ValidationResultPanel } from \"./validation-result\";\nimport { ImportCSVFooter } from \"./footer\";\nimport { ENTITY_TYPES } from \"@/constants/custom-fields\";\n\ninterface UploadTabProps {\n entityType: ENTITY_TYPE;\n onClose: () => void;\n}\n\nexport const UploadTab = ({ entityType, onClose }: UploadTabProps) => {\n const [isDownloadingSample, setIsDownloadingSample] = useState(false);\n\n const {\n file: selectedFile,\n uploadProgress,\n status,\n validationResult,\n validationErrorDetail,\n error,\n reset,\n } = useImportCSVStore();\n\n const { startUpload, startCommit } = useImportCSVFlow(entityType);\n const callbacks = useRenderConfig();\n\n const isPending =\n status === IMPORT_STATUS.MINTING ||\n status === IMPORT_STATUS.UPLOADING ||\n status === IMPORT_STATUS.VALIDATING;\n\n const handleFileSelect = (file: File) => {\n if (!file.name.endsWith(\".csv\")) return;\n startUpload(file);\n };\n\n const handleClose = () => {\n reset();\n onClose();\n };\n\n useEffect(() => {\n if (status === IMPORT_STATUS.QUEUED) {\n callbacks?.showToast?.(\"info\", \"CSV import is in progress.\");\n handleClose();\n }\n }, [status]);\n\n const handleImport = () => {\n if (!selectedFile) return;\n startCommit();\n };\n\n const handleDownloadSample = async () => {\n if (isDownloadingSample) return;\n setIsDownloadingSample(true);\n try {\n const blob = await downloadSampleCSV(entityType);\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `sample_${entityType}.csv`;\n a.click();\n URL.revokeObjectURL(url);\n } catch (err) {\n console.error(\"[ImportCSV] failed to download sample CSV:\", err);\n callbacks?.showToast?.(\n \"error\",\n \"Failed to download sample CSV. Please try again.\",\n );\n } finally {\n setIsDownloadingSample(false);\n }\n };\n\n const entityName = getEntityName(entityType);\n const entityFields = entityType === ENTITY_TYPES.COMPANY ? 'name and domain' : 'name and emails';\n return (\n <>\n <div className=\"cm:flex-1 cm:overflow-y-auto cm:p-[40px] cm:flex cm:flex-col cm:gap-5\">\n <div className=\"cm-info-banner cm-csv-banner cm:rounded-lg cm:border cm:border-[0.5px] cm:border-[#506dff] cm:bg-[#f5f7ff] cm:p-5 cm:h-[165px] cm:flex cm:flex-col cm:gap-3\">\n <div className=\"cm:flex cm:items-center cm:gap-2\">\n <InfoGlyph className=\"cm-info-banner__icon\" />\n <p className=\"cm-info-banner__text cm:text-sm cm:font-medium cm:text-slate-800\">\n Preparing your CSV\n </p>\n </div>\n <p className=\"cm-info-banner__text cm:text-sm cm:text-slate-500 cm:leading-relaxed\">\n Your CSV must include columns for {entityName} - {entityFields}. You can also include any custom account fields you've created.\n </p>\n <button\n onClick={handleDownloadSample}\n disabled={isDownloadingSample}\n className=\"cm-link cm-csv-banner__link cm:text-sm cm:font-medium cm:text-blue-700 cm:hover:underline cm:w-fit cm:cursor-pointer disabled:cm:opacity-50 disabled:cm:cursor-not-allowed\"\n >\n {isDownloadingSample ? \"Downloading…\" : \"Download sample CSV\"}\n <Icon\n name=\"external_link\"\n size={12}\n color=\"var(--cm-color-slate-text-link)\"\n className=\"cm:inline-flex cm:ml-1\"\n />\n </button>\n </div>\n\n <DropZone\n selectedFile={selectedFile}\n status={status}\n uploadProgress={uploadProgress}\n isPending={isPending}\n onFileSelect={handleFileSelect}\n onRemove={reset}\n />\n\n <ValidationResultPanel\n status={status}\n validationResult={validationResult}\n validationErrorDetail={validationErrorDetail}\n error={error}\n />\n </div>\n\n <ImportCSVFooter\n status={status}\n onCancel={handleClose}\n onImport={handleImport}\n />\n </>\n );\n};\n","import * as React from \"react\";\nconst SvgWarningIcon = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 14, height: 14, viewBox: \"0 0 14 14\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"rect\", { width: 14, height: 14, fill: \"white\", fillOpacity: 0.01 }), /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M6.45397 2.89706C6.75497 2.3289 7.24614 2.32656 7.54831 2.89706L11.704 10.7476C12.005 11.3157 11.7302 11.7806 11.0874 11.7806H2.91489C2.27206 11.7806 1.99614 11.3181 2.29831 10.7476L6.45397 2.89706ZM6.58866 8.57879C6.69806 8.68819 6.84643 8.74965 7.00114 8.74965C7.15585 8.74965 7.30422 8.68819 7.41362 8.57879C7.52302 8.46939 7.58447 8.32102 7.58447 8.16631V5.24965C7.58447 5.09494 7.52302 4.94656 7.41362 4.83717C7.30422 4.72777 7.15585 4.66631 7.00114 4.66631C6.84643 4.66631 6.69806 4.72777 6.58866 4.83717C6.47927 4.94656 6.41781 5.09494 6.41781 5.24965V8.16631C6.41781 8.32102 6.47927 8.46939 6.58866 8.57879ZM6.58866 10.3288C6.69806 10.4382 6.84643 10.4996 7.00114 10.4996C7.15585 10.4996 7.30422 10.4382 7.41362 10.3288C7.52302 10.2194 7.58447 10.071 7.58447 9.91631C7.58447 9.7616 7.52302 9.61323 7.41362 9.50383C7.30422 9.39444 7.15585 9.33298 7.00114 9.33298C6.84643 9.33298 6.69806 9.39444 6.58866 9.50383C6.47927 9.61323 6.41781 9.7616 6.41781 9.91631C6.41781 10.071 6.47927 10.2194 6.58866 10.3288Z\", fill: \"#E3692C\" }));\nexport default SvgWarningIcon;\n","import * as React from \"react\";\nconst SvgExpandMore = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", height: 24, viewBox: \"0 -960 960 960\", width: 24, ...props }, /* @__PURE__ */ React.createElement(\"path\", { fill: \"currentColor\", d: \"M480-345 240-585l56-56 184 184 184-184 56 56-240 240Z\" }));\nexport default SvgExpandMore;\n","import * as React from \"react\";\nconst SvgInProgress = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 18, height: 18, viewBox: \"0 0 18 18\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"circle\", { cx: 9, cy: 9, r: 8.25, stroke: \"#EC8A54\", strokeWidth: 1.5 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M9 3C10.5913 3 12.1174 3.63214 13.2426 4.75736C14.3679 5.88258 15 7.4087 15 9C15 10.5913 14.3679 12.1174 13.2426 13.2426C12.1174 14.3679 10.5913 15 9 15L9 9V3Z\", fill: \"#EC8A54\" }));\nexport default SvgInProgress;\n","import * as React from \"react\";\nconst SvgErroricon = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 14, height: 14, viewBox: \"0 0 14 14\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip0_453_626)\" }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip1_453_626)\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M8.74999 8.75002L5.24999 5.25002M8.74999 5.25002L5.24999 8.75002M6.99999 12.8334C3.77836 12.8334 1.16666 10.2217 1.16666 7.00002C1.16666 3.77836 3.77836 1.16669 6.99999 1.16669C10.2217 1.16669 12.8333 3.77836 12.8333 7.00002C12.8333 10.2217 10.2217 12.8334 6.99999 12.8334Z\", stroke: \"currentColor\", strokeWidth: 1.1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }))), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"clipPath\", { id: \"clip0_453_626\" }, /* @__PURE__ */ React.createElement(\"rect\", { width: 14, height: 14, fill: \"white\" })), /* @__PURE__ */ React.createElement(\"clipPath\", { id: \"clip1_453_626\" }, /* @__PURE__ */ React.createElement(\"rect\", { width: 14, height: 14, fill: \"white\", transform: \"matrix(0 1 -1 0 14 0)\" }))));\nexport default SvgErroricon;\n","import { useState } from \"react\";\nimport type { ActivityLogItem } from \"./types\";\nimport { is24HourTimeFormat } from \"@/utils/dateUtils\";\nimport GreenTickIcon from \"@/assets/green_tick.svg?react\";\nimport WarningIcon from \"@/assets/warning_icon.svg?react\";\nimport ExpandIcon from \"@/assets/expand_more.svg?react\";\nimport InProgressIcon from \"@/assets/in_progress.svg?react\";\nimport ErrorIcon from \"@/assets/erroricon.svg?react\";\n\nconst FALLBACK_CONFIG = {\n label: \"--\",\n labelClass: \"cm:text-slate-400\",\n icon: (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n aria-label=\"Unknown\"\n >\n <circle cx=\"10\" cy=\"10\" r=\"9\" stroke=\"var(--cm-color-slate-border-light)\" strokeWidth=\"1.5\" />\n <circle cx=\"10\" cy=\"10\" r=\"3\" fill=\"var(--cm-color-slate-icons-disabled)\" />\n </svg>\n ),\n};\n\nconst STATUS_CONFIG: Record<string, typeof FALLBACK_CONFIG> = {\n success: {\n label: \"Success\",\n labelClass: \"cm:text-green-700\",\n icon: <GreenTickIcon width={16} height={16} aria-label=\"Success\" />,\n },\n warning: {\n label: \"Warning\",\n labelClass: \"cm:text-[#E96C28]\",\n icon: <WarningIcon width={16} height={16} aria-label=\"Warning\" />,\n },\n error: {\n label: \"Error\",\n labelClass: \"cm:text-red-600\",\n icon: (\n <ErrorIcon width={16} height={16} aria-label=\"Error\" color=\"#DC2626\" />\n ),\n },\n pending: {\n label: \"In Progress\",\n labelClass: \"cm:text-slate-500\",\n icon: <InProgressIcon width={16} height={16} aria-label=\"In Progress\" />,\n },\n};\n\nconst formatTimestamp = (ts: string | Date): string => {\n const date = typeof ts === \"string\" ? new Date(ts) : ts;\n return (\n date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }) +\n \" · \" +\n // '24h' uses hourCycle 'h23' so midnight renders as 00:xx (not 24:xx) with\n // zero-padded hours; '12h' keeps hour12 (byte-identical to before).\n date.toLocaleTimeString(\n \"en-US\",\n is24HourTimeFormat()\n ? { hour: \"2-digit\", minute: \"2-digit\", hourCycle: \"h23\" }\n : { hour: \"numeric\", minute: \"2-digit\", hour12: true },\n )\n );\n};\n\ninterface ActivityItemProps {\n item: ActivityLogItem;\n}\n\nexport const ActivityItem = ({ item }: ActivityItemProps) => {\n const [expanded, setExpanded] = useState(false);\n const config = STATUS_CONFIG[item.status] ?? FALLBACK_CONFIG;\n\n return (\n <div className=\"cm:py-4 cm:px-1\">\n <div\n className={`cm:flex cm:items-start cm:gap-3 ${item?.expandable ? \"cm:cursor-pointer\" : \"\"}`}\n onClick={() => item?.expandable && setExpanded((prev) => !prev)}\n >\n <div className=\"cm:flex cm:h-6 cm:flex-shrink-0 cm:items-center\">\n {config.icon}\n </div>\n\n <div className=\"cm:flex-1 cm:min-w-0\" key={config.label}>\n <div className=\"cm:flex cm:items-center cm:justify-between cm:gap-4\">\n <span\n className={`cm:text-md cm:font-semibold ${config.labelClass}`}\n >\n {config.label}\n </span>\n <span className=\"cm:text-xs cm:text-slate-500 cm:flex-shrink-0\">\n {formatTimestamp(item?.timestamp)}\n </span>\n </div>\n <p className=\"cm:text-sm cm:text-slate-500 cm:mt-0.5\">\n {item?.description}\n </p>\n </div>\n\n {item?.expandable && (\n <ExpandIcon\n aria-label={expanded ? \"Collapse details\" : \"Expand details\"}\n className={`cm:text-slate-icons-subtle ${expanded ? \"cm:rotate-180\" : \"cm:rotate-0\"}`}\n />\n )}\n </div>\n\n {item?.expandable && expanded && item?.renderDetails && (\n <div className=\"cm-activity-details cm:mt-3 cm:ml-8 cm:pl-1\">{item.renderDetails()}</div>\n )}\n </div>\n );\n};\n","import type { ActivityLogItem } from \"./types\";\nimport { ActivityItem } from \"./activity-item\";\nimport Icon from \"@/components/Icon\";\n\ninterface PaginationProps {\n page: number;\n totalPages: number;\n hasNextPage: boolean;\n isFetching: boolean;\n onPageChange: (page: number) => void;\n}\n\nconst PaginationControls = ({\n page,\n totalPages,\n hasNextPage,\n isFetching,\n onPageChange,\n}: PaginationProps) => {\n if (page === 1 && !hasNextPage) return null;\n\n const prevDisabled = page === 1 || isFetching;\n const nextDisabled = !hasNextPage || isFetching;\n\n return (\n <div className=\"cm:flex cm:items-center cm:justify-between cm:border-t cm:border-slate-100 cm:pt-4 cm:mt-2 cm:px-1\">\n <button\n onClick={() => onPageChange(page - 1)}\n disabled={prevDisabled}\n className=\"cm:flex cm:items-center cm:gap-1 cm:text-xs cm:font-medium cm:text-slate-600\n cm:px-2.5 cm:py-1.5 cm:rounded-md cm:border cm:border-slate-200 cm:bg-white\n cm:hover:bg-slate-50 cm:transition-colors cm:cursor-pointer cm:disabled:cursor-not-allowed\n cm:disabled:bg-slate-50 cm:disabled:border-slate-100 cm:disabled:text-slate-300\n cm:disabled:hover:bg-slate-50\"\n >\n <Icon\n name=\"chev_arrow_left\"\n size={12}\n disabled={prevDisabled}\n color={prevDisabled ? \"#94A3B8\" : \"#334155\"}\n />\n Previous\n </button>\n\n <span className=\"cm:text-xs cm:text-slate-400\">\n {isFetching ? (\n <span className=\"cm:animate-pulse\">Loading…</span>\n ) : (\n <>\n Page{\" \"}\n <span className=\"cm:font-medium cm:text-slate-600\">{page}</span> of{\" \"}\n <span className=\"cm:font-medium cm:text-slate-600\">\n {totalPages}\n </span>\n </>\n )}\n </span>\n\n <button\n onClick={() => onPageChange(page + 1)}\n disabled={nextDisabled}\n className=\"cm:flex cm:items-center cm:gap-1 cm:text-xs cm:font-medium cm:text-slate-600\n cm:px-2.5 cm:py-1.5 cm:rounded-md cm:border cm:border-slate-200 cm:bg-white\n cm:hover:bg-slate-50 cm:transition-colors cm:cursor-pointer cm:disabled:cursor-not-allowed\n cm:disabled:bg-slate-50 cm:disabled:border-slate-100 cm:disabled:text-slate-300\n cm:disabled:hover:bg-slate-50\"\n >\n Next\n <Icon\n name=\"chev_arrow_right\"\n size={12}\n disabled={nextDisabled}\n color={nextDisabled ? \"#94A3B8\" : \"#334155\"}\n />\n </button>\n </div>\n );\n};\n\ninterface ActivityLogProps {\n items: ActivityLogItem[];\n isLoading?: boolean;\n isFetching?: boolean;\n emptyState?: React.ReactNode;\n pagination?: {\n page: number;\n totalPages: number;\n hasNextPage: boolean;\n onPageChange: (page: number) => void;\n };\n}\n\nconst Shimmer = () => (\n <div className=\"cm:flex cm:flex-col cm:gap-0\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"cm:py-4 cm:px-1 cm:flex cm:items-start cm:gap-3\">\n <div className=\"cm:w-5 cm:h-5 cm:rounded-full cm:bg-slate-200 cm:animate-pulse cm:flex-shrink-0 cm:mt-0.5\" />\n <div className=\"cm:flex-1 cm:flex cm:flex-col cm:gap-2\">\n <div className=\"cm:flex cm:justify-between\">\n <div className=\"cm:h-4 cm:w-16 cm:bg-slate-200 cm:animate-pulse cm:rounded\" />\n <div className=\"cm:h-3 cm:w-28 cm:bg-slate-200 cm:animate-pulse cm:rounded\" />\n </div>\n <div className=\"cm:h-3 cm:w-3/4 cm:bg-slate-200 cm:animate-pulse cm:rounded\" />\n </div>\n </div>\n ))}\n </div>\n);\n\nconst DefaultEmptyState = () => (\n <div className=\"cm:flex cm:flex-col cm:items-center cm:justify-center cm:py-16 cm:gap-2\">\n <Icon name=\"activity_icon\" size={14} color=\"#64758B\" />\n <p className=\"cm:text-sm cm:text-slate-400\">No activity yet</p>\n </div>\n);\n\nexport const ActivityLog = ({\n items,\n isLoading,\n isFetching = false,\n emptyState,\n pagination,\n}: ActivityLogProps) => {\n if (isLoading) return <Shimmer />;\n\n if (items.length === 0) {\n return <>{emptyState ?? <DefaultEmptyState />}</>;\n }\n\n return (\n <div className=\"cm:flex cm:flex-col\">\n <div className={isFetching ? \"cm:opacity-60 cm:pointer-events-none\" : \"\"}>\n {items.map((item, index) => (\n <div key={`${item.id}-${index}`}>\n <ActivityItem item={item} />\n {index < items.length - 1 && (\n <div className=\"cm:border-t cm:border-slate-100 cm:mx-1\" />\n )}\n </div>\n ))}\n </div>\n\n {pagination && (\n <PaginationControls\n page={pagination.page}\n totalPages={pagination.totalPages}\n hasNextPage={pagination.hasNextPage}\n isFetching={isFetching}\n onPageChange={pagination.onPageChange}\n />\n )}\n </div>\n );\n};\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport { getImportJobs } from \"@/services/importCSV\";\nimport { QUERIES } from \"@/constants/queries\";\nimport type { EntityType } from \"@/services/importCSV\";\n\nexport const PAGE_SIZE = 10;\n\nexport const useImportJobHistory = (\n entityType: EntityType,\n page: number,\n enabled = true,\n) => {\n return useQuery({\n queryKey: [QUERIES.IMPORT_JOB_HISTORY, entityType, page],\n queryFn: () => getImportJobs(entityType, page, PAGE_SIZE),\n enabled,\n retry: false,\n });\n};\n","import type { ReactNode } from \"react\";\nimport type { ImportJob } from \"@/services/importCSV\";\nimport type { ActivityLogItem } from \"@/components/ActivityLog/types\";\n\nexport const formatRowCount = (count: number): string => count.toLocaleString();\n\nexport const buildDescription = (job: ImportJob): string => {\n // Jobs report accounts as \"company\" (the upload's own entity type); \"account\"\n // is kept for the older spelling.\n const entity =\n job?.entity_type === \"company\" || job?.entity_type === \"account\" ? \"accounts\" : \"contacts\";\n\n if (job?.status === \"queued\" || job?.status === \"processing\") {\n return `Processing ${formatRowCount(job?.total_rows)} ${entity}…`;\n }\n if (job?.status === \"failed\") {\n // A job that fails before its file is recorded has no filename.\n const filename = job?.metadata?.filename;\n return filename ? `Import failed — ${filename}` : \"Import failed\";\n }\n\n const succeeded = job?.processed_rows - job?.failed_rows;\n if (job?.failed_rows === 0) {\n return `Import completed — ${formatRowCount(succeeded)} ${entity} imported`;\n }\n return `${formatRowCount(succeeded)} ${entity} imported — ${formatRowCount(job?.failed_rows)} failed`;\n};\n\nexport const mapJobToActivityItem = (\n job: ImportJob,\n renderFailureDetails: (job: ImportJob) => ReactNode,\n): ActivityLogItem => {\n const hasFailures = job?.failed_rows > 0;\n const isFullFailure = job?.status === \"failed\";\n const isTerminalWithFailures = hasFailures || isFullFailure;\n\n const status: ActivityLogItem[\"status\"] =\n job?.status === \"queued\" || job?.status === \"processing\"\n ? \"pending\"\n : job?.status === \"failed\"\n ? \"error\"\n : job?.status === \"completed\"\n ? hasFailures\n ? \"warning\"\n : \"success\"\n : \"unknown\";\n\n return {\n id: job?.job_id,\n status,\n title: status.charAt(0).toUpperCase() + status.slice(1),\n description: buildDescription(job),\n timestamp: job?.created_at,\n expandable: isTerminalWithFailures,\n renderDetails: isTerminalWithFailures\n ? () => renderFailureDetails(job)\n : undefined,\n };\n};\n","import { useState, useRef } from \"react\";\nimport DownloadIcon from \"@/assets/download.svg?react\";\nimport { ActivityLog } from \"@/components/ActivityLog\";\nimport { getImportJobFailureFileUrl } from \"@/services/importCSV\";\nimport type { EntityType } from \"@/services/importCSV\";\nimport {\n useImportJobHistory,\n PAGE_SIZE,\n} from \"../../hooks/useImportJobHistory\";\nimport { mapJobToActivityItem } from \"../../utils/activity\";\n\ninterface FailureDownloaderProps {\n jobId: string;\n filename: string;\n}\n\nconst FailureFileDownloader = ({ jobId, filename }: FailureDownloaderProps) => {\n const [isDownloading, setIsDownloading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleDownload = async () => {\n if (isDownloading) return;\n setIsDownloading(true);\n setError(null);\n try {\n const res = await getImportJobFailureFileUrl(jobId);\n const a = document.createElement(\"a\");\n a.href = res.data.presigned_url;\n a.download = `failures_${filename || `${jobId}.csv`}`;\n a.click();\n } catch {\n setError(\"Failed to fetch the failure file. Please try again.\");\n } finally {\n setIsDownloading(false);\n }\n };\n\n return (\n <div className=\"cm:flex cm:flex-col cm:gap-2 cm:bg-slate-50 cm:rounded-lg cm:p-3 cm:border cm:border-slate-200\">\n <p className=\"cm:text-xs cm:text-slate-500\">\n The failure file contains every skipped row with{\" \"}\n <span className=\"cm:font-medium cm:text-slate-700\">_error_type</span>{\" \"}\n and{\" \"}\n <span className=\"cm:font-medium cm:text-slate-700\">_error_message</span>{\" \"}\n columns appended.\n </p>\n {error && <p className=\"cm:text-xs cm:text-red-600\">{error}</p>}\n <button\n onClick={handleDownload}\n disabled={isDownloading}\n className=\"cm-link cm:flex cm:items-center cm:gap-1.5 cm:text-xs cm:font-medium cm:text-blue-600\n cm:hover:underline cm:w-fit cm:cursor-pointer disabled:cm:opacity-50 disabled:cm:cursor-not-allowed\"\n >\n <DownloadIcon width={14} height={14} aria-label=\"Download file\" />\n\n {isDownloading ? \"Downloading…\" : \"Download failure file\"}\n </button>\n </div>\n );\n};\n\ninterface ActivityTabProps {\n entityType: EntityType;\n}\n\nexport const ActivityTab = ({ entityType }: ActivityTabProps) => {\n const [page, setPage] = useState(1);\n const scrollRef = useRef<HTMLDivElement>(null);\n\n const { data, isLoading, isFetching, isError } = useImportJobHistory(\n entityType,\n page,\n );\n\n // When React Query serves a cached page while fetching the new one, data.page\n // doesn't match the requested page. Treat that as a loading state so stale\n // items from the previous page don't appear alongside the new page's results.\n const isPageMismatch =\n !isLoading && isFetching && (data?.data.page ?? page) !== page;\n const effectiveLoading = isLoading || isPageMismatch;\n\n const items = effectiveLoading\n ? []\n : (data?.data.jobs ?? []).map((job) =>\n mapJobToActivityItem(job, (j) => (\n <FailureFileDownloader\n jobId={j.job_id}\n filename={j.metadata.filename}\n />\n )),\n );\n const total = data?.data.total ?? 0;\n const hasNextPage = page < Math.ceil(total / PAGE_SIZE);\n\n const handlePageChange = (nextPage: number) => {\n setPage(nextPage);\n scrollRef.current?.scrollTo({ top: 0 });\n };\n\n if (isError) {\n return (\n <div className=\"cm:flex cm:items-center cm:justify-center cm:py-16\">\n <p className=\"cm:text-sm cm:text-red-600\">\n Failed to load activity. Please try again.\n </p>\n </div>\n );\n }\n\n return (\n <div\n ref={scrollRef}\n className=\"cm:flex-1 cm:overflow-y-auto cm:px-6 cm:py-2\"\n >\n <ActivityLog\n items={items}\n isLoading={effectiveLoading}\n isFetching={isFetching && !isPageMismatch}\n pagination={{\n page,\n totalPages: total,\n hasNextPage,\n onPageChange: handlePageChange,\n }}\n />\n </div>\n );\n};\n","import { useState } from \"react\";\nimport Icon from \"@/components/Icon\";\nimport { Drawer } from \"@/components/Drawer\";\nimport { DrawerHeader } from \"@/components/Drawer/Header\";\nimport { TabBar, TabButton } from \"@/components/Drawer/TabBar\";\nimport { Upload01 } from \"hiver-ui-kit-extended/icons\";\nimport { TabActivityGlyph } from \"@/components/Icon/glyphs\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\nimport type { EntityType } from \"@/services/importCSV\";\n\nimport { FEATURES } from \"@/constants/features\";\nimport { useFeature } from \"@/hooks/useFeature\";\nimport { UploadTab } from \"./upload-tab\";\nimport { ActivityTab } from \"./activity-tab\";\n\ntype DrawerTab = \"upload\" | \"activity\";\n\nconst UploadIcon = () => (\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\">\n <path\n d=\"M7.5 10V3M5 5.5L7.5 3 10 5.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M2 12h11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n/**\n * The Upload / Activity log tabs show only with `FEATURES.IMPORT_CSV_ACTIVITY_ENABLED`\n * (past import jobs from /v1/import/jobs). Off or absent, the drawer opens\n * straight onto the upload, as before. The tab strip is the CRM settings\n * drawer's `TabBar`, which hui paints as a segmented control\n * (design-system.hui.css §17).\n */\ninterface ImportCSVDrawerProps {\n open: boolean;\n onClose: () => void;\n entityType: ENTITY_TYPE;\n}\n\nexport const ImportCSVDrawer = ({\n open,\n onClose,\n entityType,\n}: ImportCSVDrawerProps) => {\n const [activeTab, setActiveTab] = useState<DrawerTab>(\"upload\");\n const isActivityEnabled = useFeature(FEATURES.IMPORT_CSV_ACTIVITY_ENABLED);\n\n return (\n <Drawer open={open} onClose={onClose} position=\"right\" width={750}>\n <div className=\"cm:flex cm:flex-col cm:h-full\">\n <DrawerHeader\n title=\"Import CSV\"\n onClose={onClose}\n className=\"cm:pl-10\"\n titleClassName=\"cm:flex-1! cm:min-w-0! cm:pl-3!\"\n />\n\n {isActivityEnabled && (\n <TabBar>\n <TabButton\n active={activeTab === \"upload\"}\n onClick={() => setActiveTab(\"upload\")}\n icon={IS_HUI ? <Upload01 className=\"cm-drawer-tab__icon\" /> : <UploadIcon />}\n label=\"Upload\"\n />\n <TabButton\n active={activeTab === \"activity\"}\n onClick={() => setActiveTab(\"activity\")}\n icon={\n IS_HUI ? (\n <TabActivityGlyph className=\"cm-drawer-tab__icon\" />\n ) : (\n <Icon name=\"activity_icon\" size={14} color=\"#64758B\" />\n )\n }\n label=\"Activity log\"\n />\n </TabBar>\n )}\n\n {!isActivityEnabled || activeTab === \"upload\" ? (\n <UploadTab entityType={entityType} onClose={onClose} />\n ) : (\n <ActivityTab entityType={entityType as EntityType} />\n )}\n </div>\n </Drawer>\n );\n};\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='14'%20height='14'%20viewBox='0%200%2014%2014'%20fill='none'%3e%3cpath%20d='M10.5%203.5L3.5%2010.5M3.5%203.5L10.5%2010.5'%20stroke='currentColor'%20stroke-width='1.1'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","import * as React from \"react\";\nconst SvgVectorRight = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 12, height: 12, viewBox: \"0 0 12 12\", fill: \"none\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M6 0L4.9425 1.0575L9.1275 5.25H0V6.75H9.1275L4.9425 10.9425L6 12L12 6L6 0Z\", fill: \"currentColor\" }));\nexport default SvgVectorRight;\n","interface StepProgressProps {\n current: number;\n total: number;\n className?: string;\n}\n\nexport const StepProgress = ({ current, total, className = \"\" }: StepProgressProps) => {\n const percent = Math.round((current / total) * 100);\n\n return (\n <div className={`cm:flex cm:items-center cm:gap-3 ${className}`}>\n <div\n role=\"progressbar\"\n aria-valuenow={percent}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`Step ${current} of ${total}`}\n className=\"cm:rounded-full cm:overflow-hidden cm:bg-slate-200\"\n style={{ width: 100, height: 6 }}\n >\n <div\n className=\"cm:h-full cm:rounded-full cm:bg-green-500 cm:transition-[width] cm:duration-500\"\n style={{ width: `${percent}%` }}\n />\n </div>\n <span className=\"cm:text-sm cm:text-slate-600 cm:whitespace-nowrap\">\n {current} of {total}\n </span>\n </div>\n );\n};\n","import { useEffect, useMemo, type ReactNode } from \"react\";\nimport { CrmSelect as KitCrmSelect } from \"hiver-ui-kit-extended\";\nimport { cn } from \"@/utils/classNames\";\nimport Tooltip from \"@/components/Tooltip\";\nimport WarningIcon from \"@/assets/warning_icon.svg?react\";\nimport { useRenderConfigStore } from \"@/stores/renderConfig\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\nimport \"./CrmSelect.css\";\n\nimport type { CrmSelectProps as KitCrmSelectProps } from \"hiver-ui-kit-extended\";\n\n/**\n * AF-2: this reached `primereact/dropdown` directly until now — the last of the\n * five wrappers that did, and the one that kept `primereact/dropdown` in the\n * hui artifact even after `Select` moved, because both pulled the same module.\n *\n * The toolkit owns the hard part now: the options map, the disabled/error\n * option guard, and the drawer outside-click fix (the Drawer calls\n * `stopPropagation` on its panel's `onClick`, which kills PrimeReact's\n * document-level click listener, so the listener has to be on `mousedown`). All\n * of that was lifted from this file verbatim, including the `hide()` call that\n * needs an imperative handle on the Dropdown — which is why this could not have\n * been done with the toolkit's plain `Select`.\n *\n * WHAT STAYS HERE, AND WHY — the error affordance.\n * The toolkit's CrmSelect draws its own error chrome: a stroked 16px triangle in\n * `currentColor`, a native `title`, and an inline `.crm-select-error-message`\n * span. Omni's is a filled orange 14px triangle (`warning_icon.svg`) with a\n * hover `Tooltip`, and there are no rules for that span in this app, so taking\n * the toolkit's would have been a visible, unrequested change to Omni's CRM-sync\n * error state. So `errorMessage` is deliberately NOT forwarded — that alone\n * suppresses the title and the span — and the toolkit's icon is hidden by one\n * rule in CrmSelect.css, with this app's icon drawn in its place.\n *\n * That rule is the only coupling to a toolkit internal in this file. The clean\n * fix is upstream: CrmSelect should take the error chrome as a slot, or leave it\n * to the consumer entirely. Recorded as a toolkit follow-up.\n *\n * `useDropdownPortal` also stays: the toolkit deliberately owns no mount\n * registry (`appendTo` is the consumer's to supply), and this portal carries the\n * `cm-root`/`cm-dark` scope classes the module's CSS needs.\n */\n\ntype CrmSelectProps = KitCrmSelectProps & {\n errorMessage?: ReactNode;\n};\n\n/**\n * hui: an option of type `create` is an action, not a value. v2 pins it under\n * the list as the menu's footer (`panelFooterTemplate`), with the kit's own\n * full-width divider, instead of listing it last. Choosing it still reaches\n * `onChange` with its value, so callers handle it exactly as before.\n */\nconst pinCreateOption = (props: KitCrmSelectProps): KitCrmSelectProps => {\n const createOption = props.options?.find((option) => option.type === \"create\");\n if (!createOption) return props;\n\n const valueKey = props.optionValue ?? \"value\";\n const value = createOption[valueKey];\n\n return {\n ...props,\n options: props.options?.filter((option) => option !== createOption),\n panelFooterTemplate: (\n <div\n className=\"cm:w-full\"\n onClick={() =>\n props.onChange?.({ value, target: { name: props.name ?? \"\", id: props.id ?? \"\", value } })\n }\n >\n {props.itemTemplate ? props.itemTemplate(createOption) : String(createOption.label ?? \"\")}\n </div>\n ),\n };\n};\n\nconst useDropdownPortal = () => {\n const theme = useRenderConfigStore((state) => state.theme);\n const rootElement = useMemo(() => {\n if (typeof document === \"undefined\") return null;\n\n const element = document.createElement(\"div\");\n element.style.cssText =\n \"position: fixed; inset: 0; z-index: 1000; pointer-events: none;\";\n element.classList.add(\"cm-root\");\n return element;\n }, []);\n\n useEffect(() => {\n if (!rootElement) return;\n\n rootElement.classList.toggle(\"cm-dark\", theme === \"dark\");\n }, [rootElement, theme]);\n\n useEffect(() => {\n if (!rootElement) return;\n\n document.body.appendChild(rootElement);\n\n return () => rootElement.remove();\n }, [rootElement]);\n\n return rootElement;\n};\n\nexport const CrmSelect = ({\n className = \"\",\n panelClassName = \"\",\n invalid = false,\n errorMessage,\n ...props\n}: CrmSelectProps) => {\n const rootElement = useDropdownPortal();\n\n // Mirrors the toolkit's own `hasError`, because this app draws the icon the\n // toolkit's copy of that expression would otherwise draw.\n const hasError = invalid || className.split(/\\s+/).includes(\"p-invalid\");\n\n const select = (\n <div className=\"crm-select-error-host\">\n <KitCrmSelect\n {...(IS_HUI ? pinCreateOption(props) : props)}\n className={cn(\"cm:w-full cm:text-[14px]! cm:[& span]:text-[14px]!\", className)}\n panelClassName={cn(\"cm:text-[14px]! cm:pointer-events-auto!\", panelClassName)}\n appendTo={rootElement}\n invalid={invalid}\n />\n {hasError && (\n <WarningIcon aria-hidden=\"true\" className=\"crm-select-warning-icon\" />\n )}\n </div>\n );\n\n if (hasError && errorMessage) {\n return (\n <Tooltip\n content={<span className=\"cm:text-xs cm:text-white\">{errorMessage}</span>}\n triggerClassName=\"cm:flex cm:min-w-0 cm:max-w-full cm:w-full\"\n >\n {select}\n </Tooltip>\n );\n }\n\n return select;\n};\n","import Icon from \"@/components/Icon\";\n\nconst TYPE_ICONS: Record<string, string> = {\n text: \"text_icon\",\n string: \"text_icon\",\n number: \"number\",\n currency: \"number\",\n integer: \"number\",\n user: \"user\",\n lookup: \"user\",\n dropdown: \"rounded_arrow_down\",\n select: \"rounded_arrow_down\",\n picklist: \"rounded_arrow_down\",\n multipicklist: \"rounded_arrow_down\",\n date: \"calendar\",\n datetime: \"calendar\",\n url: \"hyperlink\",\n link: \"hyperlink\",\n boolean: \"toggle_icon\",\n toggle: \"toggle_icon\",\n checkbox: \"toggle_icon\",\n};\n\ninterface FieldTypeIconProps {\n type: string;\n className?: string;\n}\n\nexport const FieldTypeIcon = ({ type, className = \"\" }: FieldTypeIconProps) => {\n const icon = TYPE_ICONS[type.toLowerCase()] ?? \"text_icon\";\n return (\n <Icon\n name={icon}\n size={12}\n color=\"#334155\"\n className={`cm:flex-shrink-0 ${className}`}\n />\n );\n};\n","import { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { SearchGlyph } from \"@/components/Icon/glyphs\";\nimport Tooltip from \"@/components/Tooltip\";\nimport { useRenderConfigStore } from \"@/stores/renderConfig\";\n\ninterface SearchableDropdownProps<T> {\n triggerLabel: React.ReactNode;\n title: React.ReactNode;\n items: T[];\n getItemKey: (item: T) => string;\n isItemDisabled?: (item: T) => boolean;\n filterItem: (item: T, search: string) => boolean;\n renderItem: (item: T, isDisabled: boolean) => React.ReactNode;\n getItemTooltip?: (item: T, isDisabled: boolean) => React.ReactNode;\n onSelect: (item: T) => void;\n searchPlaceholder?: string;\n emptyMessage?: string;\n dropdownWidth?: string;\n dropdownHeight?: string;\n}\n\nexport const SearchableDropdown = <T,>({\n triggerLabel,\n title,\n items,\n getItemKey,\n isItemDisabled,\n filterItem,\n renderItem,\n getItemTooltip,\n onSelect,\n searchPlaceholder = \"Search\",\n emptyMessage = \"No results found\",\n dropdownWidth = \"320px\",\n dropdownHeight = \"400px\"\n}: SearchableDropdownProps<T>) => {\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [position, setPosition] = useState<{ left: number; bottom: number } | null>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const globalMountElement = useRenderConfigStore((state) => state.meta.globalMountElement);\n\n // Anchor the dropdown's bottom just above the trigger, left-aligned with it.\n const updatePosition = useCallback(() => {\n const trigger = triggerRef.current;\n if (!trigger) return;\n const rect = trigger.getBoundingClientRect();\n setPosition({\n left: rect.left,\n bottom: window.innerHeight - rect.top + 8,\n });\n }, []);\n\n useLayoutEffect(() => {\n if (!isOpen) return;\n updatePosition();\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }, [isOpen, updatePosition]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handleMouseDown = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n !triggerRef.current?.contains(target) &&\n !dropdownRef.current?.contains(target)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleMouseDown);\n return () => document.removeEventListener(\"mousedown\", handleMouseDown);\n }, [isOpen]);\n\n const filtered = items.filter((item) => filterItem(item, search));\n\n const handleTrigger = () => {\n setSearch(\"\");\n setIsOpen((prev) => !prev);\n };\n\n const handleSelect = (item: T) => {\n if (isItemDisabled?.(item)) return;\n onSelect(item);\n setIsOpen(false);\n setSearch(\"\");\n };\n\n return (\n <div style={{ display: \"inline-block\" }}>\n <button\n ref={triggerRef}\n type=\"button\"\n onClick={handleTrigger}\n className=\"cm-link cm:text-[13px] cm:font-medium cm:text-blue-500 cm:bg-transparent cm:border-0 cm:p-0 cm:cursor-pointer cm:hover:text-blue-600\"\n >\n {triggerLabel}\n </button>\n\n {isOpen && !!globalMountElement && !!position && createPortal(\n <div\n ref={dropdownRef}\n style={{\n position: \"fixed\",\n bottom: position.bottom,\n left: position.left,\n width: dropdownWidth,\n maxHeight: dropdownHeight,\n zIndex: 9999,\n pointerEvents: 'auto'\n }}\n className=\"cm-searchable-dropdown cm:bg-white cm:rounded-lg cm:border cm:border-slate-100 cm:shadow-xl cm:overflow-hidden\"\n >\n <div className=\"cm:px-4 cm:py-2 cm:border-b cm:border-slate-100\">\n <span className=\"cm:text-md cm:font-regular cm:text-slate-700\">\n {title}\n </span>\n </div>\n\n <div className=\"cm:px-1 cm:py-1 cm:border-md cm:border-slate-100\">\n <div className=\"cm-searchable-dropdown-input cm:flex cm:items-center cm:gap-2.5 cm:h-11 cm:rounded-md cm:border cm:border-slate-200 cm:px-3.5\">\n <SearchGlyph className=\"cm-searchable-dropdown-input__icon cm:flex-shrink-0\" />\n <input\n type=\"text\"\n placeholder={searchPlaceholder}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n autoFocus\n className=\"cm-searchable-dropdown-input__field cm:flex-1 cm:text-base cm:text-slate-700 cm:outline-none cm:bg-transparent cm:placeholder:text-slate-400\"\n />\n </div>\n </div>\n\n <div className=\"cm:max-h-[400px] cm:overflow-y-auto cm:py-1\">\n {filtered.map((item) => {\n const disabled = isItemDisabled?.(item) ?? false;\n const itemContent = renderItem(item, disabled);\n const tooltipContent = getItemTooltip?.(item, disabled);\n const button = (\n <button\n key={getItemKey(item)}\n type=\"button\"\n disabled={disabled}\n onClick={() => handleSelect(item)}\n className={`cm:w-full cm:text-left cm:border-0 cm:bg-transparent ${\n disabled\n ? \"cm:opacity-70 cm:cursor-not-allowed cm:pointer-events-none\"\n : \"cm:cursor-pointer cm:hover:bg-slate-50\"\n }`}\n >\n {itemContent}\n </button>\n );\n\n if (!tooltipContent) return button;\n\n return (\n <Tooltip\n key={getItemKey(item)}\n content={tooltipContent}\n positionX=\"left\"\n offsetX={8}\n triggerClassName={`cm:flex cm:min-w-0 cm:max-w-full cm:w-full ${disabled ? \"cm:cursor-not-allowed\" : \"\"}`}\n >\n {button}\n </Tooltip>\n );\n })}\n\n {filtered.length === 0 && (\n <div className=\"cm:px-4 cm:py-6 cm:text-center cm:text-sm cm:text-slate-400\">\n {emptyMessage}\n </div>\n )}\n </div>\n </div>,\n globalMountElement\n )}\n </div>\n );\n};\n","import * as React from \"react\";\nconst SvgError = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 12, height: 12, viewBox: \"0 0 14 14\", fill: \"none\", ...props }, /* @__PURE__ */ React.createElement(\"circle\", { cx: 7, cy: 7, r: 5.5, fill: \"#ef4444\" }), /* @__PURE__ */ React.createElement(\"rect\", { x: 3.8, y: 6.4, width: 6.4, height: 1.2, rx: 0.6, fill: \"white\" }));\nexport default SvgError;\n","import type { CF_ID } from \"@/types/custom-fields\";\nimport Tooltip from \"@/components/Tooltip\";\nimport { PlusGlyph } from \"@/components/Icon/glyphs\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\nimport { FieldTypeIcon } from \"./FieldTypeIcon\";\nimport ErrorIcon from \"@/assets/error.svg?react\";\nimport PlusIcon from \"@/assets/plus.svg?react\";\n\nexport type HiverSelectOption = {\n label: string;\n value: CF_ID;\n type: string;\n className?: string;\n error?: string;\n disabled?: boolean;\n};\n\nexport const HiverFieldItem = (option: HiverSelectOption) => {\n const hasError = Boolean(option.error && !option.disabled);\n\n if (option.type === \"create\") {\n if (IS_HUI) {\n // hui: `CrmSelect` pins this as the menu's footer row, under the kit's\n // own divider, so it is laid out exactly like the rows above it.\n return (\n <div className=\"cm:flex cm:items-center cm:gap-2 cm:w-full cm:py-0.5\">\n <PlusGlyph width={12} height={12} className=\"cm:flex-shrink-0\" />\n <span className=\"cm:flex-1 cm:text-sm cm:font-medium cm:text-slate-700\">\n {option.label}\n </span>\n </div>\n );\n }\n\n return (\n <div className=\"crm-select-create-option-template\">\n <div className=\"crm-select-create-option-divider\" />\n <div className=\"crm-select-create-option-content\">\n <PlusIcon\n className=\"crm-select-create-option-icon\"\n width={14}\n height={14}\n />\n <span className=\"crm-select-create-option-label\">\n {option.label}\n </span>\n <span aria-hidden=\"true\" className=\"crm-select-create-option-spacer\" />\n </div>\n </div>\n );\n }\n\n const disabled = option.disabled || hasError;\n\n const inner = (\n <div\n className={`cm:flex cm:items-center cm:gap-2 cm:w-full cm:py-0.5${disabled ? \" cm:opacity-50\" : \"\"}`}\n style={\n disabled\n ? { pointerEvents: \"auto\", cursor: \"not-allowed\" }\n : undefined\n }\n >\n <FieldTypeIcon type={option.type} />\n <span\n className={`cm:flex-1 cm:text-sm cm:truncate ${disabled ? \"cm:text-slate-400\" : \"cm:text-slate-700\"}`}\n >\n {option.label}\n </span>\n {hasError && (\n <span className=\"cm:flex cm:shrink-0\">\n <ErrorIcon />\n </span>\n )}\n </div>\n );\n\n if (option.disabled) {\n return (\n <Tooltip\n content={\n <span className=\"cm:text-xs cm:text-white\">\n Already mapped to another field\n </span>\n }\n >\n {inner}\n </Tooltip>\n );\n }\n\n if (hasError) {\n return (\n <Tooltip\n content={<span className=\"cm:text-xs cm:text-white\">{option.error}</span>}\n triggerClassName=\"cm:flex cm:min-w-0 cm:max-w-full cm:w-full\"\n >\n {inner}\n </Tooltip>\n );\n }\n\n return inner;\n};\n","export default \"data:image/svg+xml,%3csvg%20width='14'%20height='14'%20viewBox='0%200%2014%2014'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3ccircle%20cx='7'%20cy='7'%20r='5.5'%20stroke='%23475569'%20stroke-width='1.2'/%3e%3ccircle%20cx='7'%20cy='4'%20r='0.65'%20fill='%23475569'/%3e%3cpath%20d='M7%206.15V10'%20stroke='%23475569'%20stroke-width='1.2'%20stroke-linecap='round'/%3e%3c/svg%3e\"","import InfoIcon from \"@/assets/info.svg\";\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\n\ninterface SyncSectionHeaderProps {\n entityType: ENTITY_TYPE;\n crmName: string;\n}\n\nexport const SyncSectionHeader = ({\n entityType,\n crmName,\n}: SyncSectionHeaderProps) => {\n const title = entityType === \"company\" ? \"Sync account\" : \"Sync contacts\";\n const noun = entityType === \"company\" ? \"account\" : \"contact\";\n\n return (\n <div className=\"cm:flex cm:w-full cm:flex-col cm:gap-6\">\n <div className=\"cm:flex cm:flex-col cm:gap-0.5\">\n <h3 className=\"cm:text-lg cm:font-medium cm:leading-7 cm:text-slate-700\">\n {title}\n </h3>\n <p className=\"cm:max-w-[570px] cm:text-sm cm:leading-5 cm:text-slate-500\">\n Select {noun} specific fields that you want to sync from {crmName}.\n </p>\n </div>\n\n <div\n role=\"status\"\n className=\"cm-info-banner cm:flex cm:min-h-9 cm:w-full cm:items-center cm:rounded-lg cm:border-[0.5px] cm:border-slate-200 cm:bg-slate-100 cm:px-2 cm:py-1.5 cm:box-border\"\n >\n <div className=\"cm:flex cm:min-w-0 cm:flex-1 cm:items-center cm:gap-1\">\n <div className=\"cm:flex cm:h-6 cm:w-6 cm:flex-shrink-0 cm:items-center cm:justify-center\">\n <img\n src={InfoIcon}\n alt=\"\"\n aria-hidden=\"true\"\n width={14}\n height={14}\n className=\"cm-info-banner__icon cm:h-3.5 cm:w-3.5\"\n />\n </div>\n <div className=\"cm:flex cm:min-w-0 cm:flex-1 cm:flex-col cm:justify-center\">\n <p className=\"cm-info-banner__text cm:text-xs cm:leading-[18px] cm:text-slate-700\">\n <strong className=\"cm:font-medium cm:text-slate-700\">\n Existing data\n </strong>{\" \"}\n in Hiver may be{\" \"}\n <strong className=\"cm:font-medium cm:text-slate-700\">\n overwritten\n </strong>{\" \"}\n with values from {crmName} when you sync.\n </p>\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import { CDN_ASSETS } from \"@/constants/cdnAssets\";\n\ninterface SyncStartedViewProps {\n crmName: string;\n fieldsMapped: number;\n newFieldsCreated: number;\n}\n\nexport const SyncStartedView = ({\n crmName,\n fieldsMapped,\n newFieldsCreated,\n}: SyncStartedViewProps) => (\n <div className=\"cm:flex-1 cm:flex cm:flex-col cm:items-center cm:justify-center cm:gap-5 cm:px-7 cm:py-10\">\n <img\n src={CDN_ASSETS.importAnimation}\n alt=\"Import started\"\n className=\"cm:h-28 cm:w-28\"\n />\n\n <div className=\"cm:flex cm:flex-col cm:items-center cm:gap-2 cm:text-center\">\n <h2 className=\"cm:text-xl cm:font-semibold cm:text-slate-900\">\n Import started!\n </h2>\n <p className=\"cm:text-sm cm:text-slate-600\">\n Your {crmName} data is syncing. This usually takes 2-5 minutes.\n </p>\n </div>\n\n <div className=\"cm:flex cm:flex-wrap cm:justify-center cm:gap-2\">\n {fieldsMapped > 0 && (\n <span className=\"cm-sync-tag cm:inline-flex cm:items-center cm:px-4 cm:py-2 cm:text-sm cm:text-slate-900 cm:bg-slate-100 cm:rounded-full cm:font-medium\">\n {fieldsMapped} field{fieldsMapped !== 1 ? \"s\" : \"\"} mapped\n </span>\n )}\n {newFieldsCreated > 0 && (\n <span className=\"cm-sync-tag cm:inline-flex cm:items-center cm:px-4 cm:py-2 cm:text-sm cm:text-slate-900 cm:bg-slate-100 cm:rounded-full cm:font-medium\">\n {newFieldsCreated} new custom field{newFieldsCreated !== 1 ? \"s\" : \"\"}{\" \"}\n created\n </span>\n )}\n </div>\n </div>\n);\n","export const SALESFORCE_TYPE = \"salesforce\";\nexport const HUBSPOT_TYPE = \"hubspot\";\nexport const CRM_PROVIDER_TYPES = [SALESFORCE_TYPE, HUBSPOT_TYPE] as const;\n\nexport const NEW_FIELD_TYPES = [\n { label: \"Text\", value: \"TEXT\", iconType: \"text\" },\n { label: \"Number\", value: \"NUMBER\", iconType: \"number\" },\n { label: \"Date\", value: \"DATE\", iconType: \"date\" },\n { label: \"Dropdown\", value: \"DROPDOWN\", iconType: \"dropdown\" },\n { label: \"URL\", value: \"URL\", iconType: \"url\" },\n { label: \"Boolean\", value: \"BOOLEAN\", iconType: \"boolean\" },\n];\n","import { PrimaryButton, SecondaryButton } from \"@/components/Drawer/Footer\";\nimport Tooltip from \"@/components/Tooltip\";\nimport ErrorIcon from \"@/assets/error.svg?react\";\nimport { NEW_FIELD_TYPES } from \"../../constants\";\nimport { CrmSelect } from \"./CrmSelect\";\nimport { FieldTypeIcon } from \"./FieldTypeIcon\";\n\nexport type CreatingFieldState = {\n name: string;\n fieldType: string;\n isLoading: boolean;\n};\n\ntype FieldTypeOptionData = {\n label: string;\n value: string;\n iconType: string;\n error?: string;\n};\n\nconst FieldTypeOption = ({\n hideError = false,\n ...option\n}: FieldTypeOptionData & { hideError?: boolean }) => {\n const hasError = Boolean(option.error && !hideError);\n\n const inner = (\n <div className={`cm:flex cm:items-center cm:gap-2 cm:w-full cm:py-0.5 ${hasError ? \"cm:opacity-50\" : \"\"}`} style={\n hasError\n ? { pointerEvents: \"auto\", cursor: \"not-allowed\" }\n : undefined\n }>\n <FieldTypeIcon type={option.iconType} />\n <span className={`cm:flex-1 cm:text-sm cm:text-slate-700 ${hasError ? \"cm:text-slate-400\" : \"cm:text-slate-700\"}`}>\n {option.label}\n </span>\n {hasError && (\n <span className=\"cm:flex cm:shrink-0\">\n <ErrorIcon />\n </span>\n )}\n </div>\n );\n\n if (!hasError) return inner;\n\n return (\n <Tooltip\n content={<span className=\"cm:text-xs cm:text-white\">{option.error}</span>}\n triggerClassName=\"cm:flex cm:min-w-0 cm:max-w-full cm:w-full\"\n >\n {inner}\n </Tooltip>\n );\n};\n\ninterface CreateNewFieldPanelProps {\n state: CreatingFieldState;\n fieldTypeErrorMessage?: string;\n getFieldTypeErrorMessage?: (fieldType: string) => string | undefined;\n onNameChange: (name: string) => void;\n onFieldTypeChange: (fieldType: string) => void;\n onCreate: () => void;\n onCancel: () => void;\n}\n\nexport const CreateNewFieldPanel = ({\n state,\n fieldTypeErrorMessage,\n getFieldTypeErrorMessage,\n onNameChange,\n onFieldTypeChange,\n onCreate,\n onCancel,\n}: CreateNewFieldPanelProps) => {\n const fieldTypeOptions = NEW_FIELD_TYPES.map((option) => ({\n ...option,\n error: getFieldTypeErrorMessage?.(option.value),\n }));\n\n return (\n <div className=\"cm:flex cm:w-full cm:flex-col cm:items-start cm:box-border cm:px-4 cm:pt-1 cm:pb-4\">\n <div className=\"cm:flex cm:w-full cm:flex-col cm:items-end cm:rounded-xl cm:bg-[#EDF1F6]\">\n <div className=\"cm:flex cm:w-full cm:items-center cm:box-border cm:px-4 cm:py-2\">\n <span className=\"cm:text-sm cm:font-medium cm:leading-5 cm:text-slate-700\">\n Create custom fields\n </span>\n </div>\n\n <div className=\"cm:flex cm:w-full cm:flex-col cm:items-end cm:gap-3 cm:box-border cm:rounded-xl cm:border cm:border-slate-200 cm:bg-white cm:px-5 cm:py-3.5\">\n <div className=\"cm:flex cm:w-full cm:items-start cm:gap-5\">\n <div className=\"cm:flex cm:min-w-0 cm:flex-1 cm:flex-col cm:gap-1\">\n <label className=\"cm-form-field-label cm:text-sm cm:font-normal cm:leading-5 cm:text-slate-text-body\">\n Name\n </label>\n <input\n type=\"text\"\n placeholder=\"Add a field name\"\n value={state.name}\n onChange={(e) => onNameChange(e.target.value)}\n className=\"cm:h-8 cm:w-full cm:box-border cm:rounded-md cm:border-[1.5px] cm:border-slate-200 cm:bg-white cm:px-2 cm:py-0 \n cm:font-[family-name:var(--font-family-sans)] cm:text-sm cm:font-light cm:text-body cm:outline-none cm:[&::placeholder]:font-light cm:focus:border-blue-400\"\n />\n </div>\n\n <div className=\"cm:flex cm:min-w-0 cm:flex-1 cm:flex-col cm:gap-1\">\n <label className=\"cm-form-field-label cm:text-sm cm:font-normal cm:leading-5 cm:text-slate-text-body\">\n Custom field type\n </label>\n <CrmSelect\n value={state.fieldType}\n options={fieldTypeOptions}\n optionValue=\"value\"\n optionLabel=\"label\"\n // The toolkit types an option `SelectOptionLike` and the\n // event's value `unknown`, where primereact typed both `any`.\n // The options here are `fieldTypeOptions`, so both narrowings\n // are to the type this call site already builds.\n onChange={(e) => onFieldTypeChange(e.value as string)}\n itemTemplate={(opt) => <FieldTypeOption {...(opt as FieldTypeOptionData)} />}\n valueTemplate={(opt) =>\n opt ? <FieldTypeOption {...(opt as FieldTypeOptionData)} hideError /> : null\n }\n />\n {fieldTypeErrorMessage && (\n <span className=\"cm:text-xs cm:text-[#9A3412] cm:font-normal\">\n Data type format mismatch\n </span>\n )}\n </div>\n </div>\n\n <div className=\"cm:flex cm:items-center cm:justify-end cm:gap-4\">\n <SecondaryButton\n onClick={onCancel}\n className=\"cm:h-9! cm:px-3! cm:text-sm! cm:font-medium!\"\n >\n Cancel\n </SecondaryButton>\n <PrimaryButton\n disabled={!state.name.trim() || state.isLoading}\n onClick={onCreate}\n label=\"Create custom fields\"\n className=\"cm:h-9! cm:px-3! cm:text-sm! cm:font-medium!\"\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import type { ENTITY_TYPE, GetCFConfigsResponse } from \"@/types/custom-fields\";\nimport type {\n CrmField,\n CrmSyncConfig,\n FieldRow,\n HiverDropdownOption,\n} from \"./types\";\n\nexport const TYPE_DISPLAY_LABELS: Record<string, string> = {\n text: \"Text\",\n string: \"Text\",\n number: \"Number\",\n currency: \"Currency\",\n integer: \"Integer\",\n dropdown: \"Dropdown\",\n picklist: \"Dropdown\",\n select: \"Dropdown\",\n date: \"Date\",\n datetime: \"DateTime\",\n boolean: \"Boolean\",\n toggle: \"Boolean\",\n user: \"User\",\n url: \"URL\",\n link: \"URL\",\n};\n\nexport const processHiverCFs = (\n data: GetCFConfigsResponse,\n entityType: ENTITY_TYPE,\n): HiverDropdownOption[] => {\n const entityData = data.account_custom_fields.find(\n (item) => item.entity_type === entityType,\n );\n if (!entityData) return [];\n\n return entityData.custom_fields\n .filter((cf) => cf.status == null || cf.status === 1)\n .filter((cf) => !cf.display_name.startsWith(\"__hiver_system.\"))\n .map((cf) => ({\n value: cf.cf_id,\n label: cf.display_name,\n type: (cf.type ?? \"\").toLowerCase(),\n }));\n};\n\nexport const getDefaultHiverFieldKey = (\n defaultHiverField: string | null,\n hiverOptions: HiverDropdownOption[],\n): HiverDropdownOption[\"value\"] | null => {\n if (!defaultHiverField) return null;\n\n const normalizedDefault = defaultHiverField.trim().toLowerCase();\n const matchingOption = hiverOptions.find(\n (option) =>\n String(option.value) === defaultHiverField ||\n option.label.trim().toLowerCase() === normalizedDefault,\n );\n\n return matchingOption?.value ?? null;\n};\n\nexport const formatDefaultHiverFieldLabel = (\n defaultHiverField: string | null,\n): string => {\n if (!defaultHiverField) return \"\";\n\n return defaultHiverField\n ?.split(/[_\\s-]+/)\n ?.filter(Boolean)\n ?.map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n ?.join(\" \");\n};\n\nexport const buildFieldRows = (fields: CrmField[]): FieldRow[] =>\n fields\n .filter((f) => f.is_required || Boolean(f.default_hiver_field))\n .map((f, i) => ({\n id: String(i),\n crm_field_key: f.crm_field_key,\n crmFieldType: f.type,\n crmLabel: f.display_name,\n crmTypeLabel: TYPE_DISPLAY_LABELS[(f.type ?? \"\").toLowerCase()] ?? f.type,\n default_hiver_field: f.default_hiver_field,\n hiver_field_types: (f.hiver_field_types ?? []).map((t) => (t ?? \"\").toLowerCase()),\n hiverFieldKey: null,\n isAutocreated: f.default_hiver_field != null,\n isRequired: f.is_required,\n }));\n\nexport const applyExistingMappings = (\n rows: FieldRow[],\n configs: CrmSyncConfig[],\n entityType: ENTITY_TYPE,\n provider: string,\n allFields: CrmField[],\n): FieldRow[] => {\n const config = configs.find((c) => c.crm_provider === provider);\n\n if (!config) return rows;\n\n const entityMappings = config.field_mappings[entityType] ?? [];\n\n if (entityMappings.length === 0) return rows;\n\n const initialKeys = new Set(rows.map((r) => r.crm_field_key));\n\n const mappingsByKey = new Map(\n entityMappings.map((m) => [m.crm_field_key, m.cf_id]),\n );\n\n const updatedRows = rows.map((row) => {\n if (mappingsByKey.has(row.crm_field_key)) {\n return {\n ...row,\n hiverFieldKey: mappingsByKey.get(row.crm_field_key)!,\n isAutocreated: row.default_hiver_field != null,\n };\n }\n return row;\n });\n\n const extraRows: FieldRow[] = entityMappings\n .filter((m) => !initialKeys.has(m.crm_field_key))\n .reduce<FieldRow[]>((acc, m, i) => {\n const field = allFields.find((f) => f.crm_field_key === m.crm_field_key);\n if (!field) return acc;\n acc.push({\n id: `existing-${i}`,\n crm_field_key: field.crm_field_key,\n crmFieldType: field.type,\n crmLabel: field.display_name,\n crmTypeLabel:\n TYPE_DISPLAY_LABELS[(field.type ?? \"\").toLowerCase()] ?? field.type,\n default_hiver_field: field.default_hiver_field,\n hiver_field_types: (field.hiver_field_types ?? []).map((t) => (t ?? \"\").toLowerCase()),\n hiverFieldKey: m.cf_id,\n isAutocreated: field.default_hiver_field != null,\n isRequired: false,\n });\n return acc;\n }, []);\n\n return [...updatedRows, ...extraRows];\n};\n\nexport const applyDefaultHiverFieldMappings = (\n rows: FieldRow[],\n hiverOptions: HiverDropdownOption[],\n): FieldRow[] =>\n rows.map((row) => {\n if (row.hiverFieldKey != null) return row;\n\n const defaultFieldKey = getDefaultHiverFieldKey(\n row.default_hiver_field,\n hiverOptions,\n );\n\n if (defaultFieldKey == null) return row;\n\n return {\n ...row,\n hiverFieldKey: defaultFieldKey,\n };\n });\n","import {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type SetStateAction,\n} from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\nimport type { FieldRow, HiverDropdownOption } from \"../types\";\nimport {\n applyDefaultHiverFieldMappings,\n applyExistingMappings,\n buildFieldRows,\n processHiverCFs,\n} from \"../utils\";\nimport { getCrmConfigs, getCrmFields } from \"@/services/crm-sync\";\nimport { getCFConfigs } from \"@/services/custom-fields/get-config\";\n\ninterface UseFieldMappingDataParams {\n open: boolean;\n entityType: ENTITY_TYPE;\n crmProvider: string;\n}\n\nexport const useFieldMappingData = ({\n open,\n entityType,\n crmProvider,\n}: UseFieldMappingDataParams) => {\n const [mappingsOverride, setMappingsOverride] = useState<{\n key: string;\n value: FieldRow[];\n } | null>(null);\n const [hiverOptionsOverride, setHiverOptionsOverride] = useState<{\n key: string;\n value: HiverDropdownOption[];\n } | null>(null);\n\n const query = useQuery({\n queryKey: [\"crm-field-mapping-data\", crmProvider, entityType],\n enabled: open && Boolean(crmProvider),\n refetchOnWindowFocus: false,\n queryFn: async () => {\n const [configsRes, fieldsRes, hiverCFRes] = await Promise.all([\n getCrmConfigs(),\n getCrmFields(crmProvider, entityType),\n getCFConfigs({ entity_type: entityType }),\n ]);\n\n const entityFields = fieldsRes.data;\n const processedHiverOptions = processHiverCFs(hiverCFRes, entityType);\n\n const rows = applyDefaultHiverFieldMappings(\n applyExistingMappings(\n buildFieldRows(entityFields),\n configsRes.data,\n entityType,\n crmProvider,\n entityFields,\n ),\n processedHiverOptions,\n );\n\n return {\n rows,\n entityFields,\n processedHiverOptions,\n };\n },\n });\n\n const dataKey = query.data\n ? `${crmProvider}:${entityType}:${query.dataUpdatedAt}`\n : `${crmProvider}:${entityType}:empty`;\n const baseMappings = useMemo(() => query.data?.rows ?? [], [query.data]);\n const baseHiverOptions = useMemo(\n () => query.data?.processedHiverOptions ?? [],\n [query.data],\n );\n const mappings =\n mappingsOverride?.key === dataKey ? mappingsOverride.value : baseMappings;\n const hiverOptions =\n hiverOptionsOverride?.key === dataKey\n ? hiverOptionsOverride.value\n : baseHiverOptions;\n const crmFields = query.data?.entityFields ?? [];\n\n const setMappings = useCallback((updater: SetStateAction<FieldRow[]>) => {\n setMappingsOverride((currentOverride) => {\n const currentValue =\n currentOverride?.key === dataKey\n ? currentOverride.value\n : baseMappings;\n const nextValue =\n typeof updater === \"function\" ? updater(currentValue) : updater;\n\n return {\n key: dataKey,\n value: nextValue,\n };\n });\n }, [baseMappings, dataKey]);\n\n const setHiverOptions = useCallback(\n (updater: SetStateAction<HiverDropdownOption[]>) => {\n setHiverOptionsOverride((currentOverride) => {\n const currentValue =\n currentOverride?.key === dataKey\n ? currentOverride.value\n : baseHiverOptions;\n const nextValue =\n typeof updater === \"function\" ? updater(currentValue) : updater;\n\n return {\n key: dataKey,\n value: nextValue,\n };\n });\n },\n [baseHiverOptions, dataKey],\n );\n\n useEffect(() => {\n if (query.error) {\n console.error(\"[useFieldMappingData] load failed:\", query.error);\n }\n }, [query.error]);\n\n return {\n mappings,\n setMappings,\n hiverOptions,\n setHiverOptions,\n crmFields,\n loading: query.isFetching,\n error: query.isError\n ? \"Failed to load field mappings. Please try again.\"\n : null,\n };\n};\n","import type { CrmSyncConfig, CrmSyncEntityConfig } from \"../types\";\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\nimport { is24HourTimeFormat } from \"@/utils/dateUtils\";\n\n// Built per call so it honors the host's live 12h/24h preference; '12h' keeps\n// hour12:true (byte-identical to before), '24h' uses hourCycle 'h23' so midnight\n// renders as 00:xx (not 24:xx) with zero-padded hours, matching dateUtils.\nconst dateTimeFormatter = (): Intl.DateTimeFormat =>\n new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n minute: \"2-digit\",\n ...(is24HourTimeFormat()\n ? { hour: \"2-digit\", hourCycle: \"h23\" }\n : { hour: \"numeric\", hour12: true }),\n });\n\nconst DATE_FORMATTER = new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n});\n\nconst ENTITY_LABELS: Record<ENTITY_TYPE, string> = {\n company: \"accounts\",\n contact: \"contacts\",\n};\n\nexport const formatDateTime = (isoDate: string): string =>\n dateTimeFormatter().format(new Date(isoDate));\n\nexport const formatDate = (isoDate: string): string =>\n DATE_FORMATTER.format(new Date(isoDate));\n\nexport const getEntityLabel = (entityType: ENTITY_TYPE): string =>\n ENTITY_LABELS[entityType];\n\nexport const getLastSyncedLabel = (\n config: CrmSyncConfig | null,\n): string | null => {\n const timestamps = [\n config?.contact_last_full_sync_at,\n config?.company_last_full_sync_at,\n config?.contact_last_delta_sync_at,\n config?.company_last_delta_sync_at,\n ].filter((timestamp): timestamp is string => Boolean(timestamp));\n\n if (timestamps.length === 0) return null;\n\n const latestTimestamp = timestamps.reduce((latest, current) =>\n new Date(current).getTime() > new Date(latest).getTime() ? current : latest,\n );\n\n return `Last synced on ${formatDateTime(latestTimestamp)}`;\n};\n\nexport const getConnectedSinceLabel = (\n config: CrmSyncConfig | null,\n): string | null =>\n config?.connected_at ? formatDate(config.connected_at) : null;\n\nexport const getEntityRows = (\n config: CrmSyncConfig | null,\n crmName: string,\n): CrmSyncEntityConfig[] => [\n {\n entityType: \"company\",\n label: \"Sync accounts\",\n isSynced: config?.company_sync_enabled ?? false,\n syncedLabel: config?.company_last_full_sync_at\n ? `Last synced on ${formatDateTime(config.company_last_full_sync_at)}`\n : \"Not yet synced\",\n unsyncedDescription: `Choose the account fields to sync from ${crmName}.`,\n },\n {\n entityType: \"contact\",\n label: \"Sync contacts\",\n isSynced: config?.contact_sync_enabled ?? false,\n syncedLabel: config?.contact_last_full_sync_at\n ? `Last synced on ${formatDateTime(config.contact_last_full_sync_at)}`\n : \"Not yet synced\",\n unsyncedDescription: `Choose the contact fields to sync from ${crmName}.`,\n },\n];\n","import { ENDPOINTS } from '@/constants/endpoints';\nimport { getCFApiCallback } from './callback';\nimport { useRenderConfigStore } from '@/stores/renderConfig';\n\nimport type { CreateCFPayload, ENTITY_TYPE, CustomField } from '@/types/custom-fields';\n\n\nexport type CreateCFParams = {\n payload: CreateCFPayload;\n entity_type: ENTITY_TYPE;\n}\n\n\n\nexport const createCF = async (\n { payload, entity_type }: CreateCFParams\n): Promise<CustomField> => {\n const config = useRenderConfigStore.getState().config!;\n const cfApiCallback = getCFApiCallback();\n const data = {\n ...payload,\n entity_type,\n ug_id: config.accountId,\n status: 1\n }\n const response = await cfApiCallback(ENDPOINTS.CREATE_CUSTOM_FIELD, {\n method: 'POST',\n data\n });\n \n const apiData = response.data as { data: CustomField };\n return apiData?.data;\n};\n","import { useMutation } from \"@tanstack/react-query\";\n\nimport { createCF } from \"@/services/custom-fields/create-field\";\nimport { getCFConfigs } from \"@/services/custom-fields/get-config\";\nimport { triggerSync, updateFieldMappings } from \"@/services/crm-sync\";\nimport type { CF_TYPE, ENTITY_TYPE } from \"@/types/custom-fields\";\nimport type { UpdateFieldMappingItem } from \"../types\";\n\nexport const useCreateMappedCustomField = () =>\n useMutation({\n mutationFn: async ({\n name,\n fieldType,\n entityType,\n }: {\n name: string;\n fieldType: CF_TYPE;\n entityType: ENTITY_TYPE;\n }) => {\n const createdField = await createCF({\n payload: {\n display_name: name,\n type: fieldType,\n description: \"\",\n info_icon: false,\n },\n entity_type: entityType,\n });\n\n if (!createdField) {\n return { createdField, hiverCFRes: null };\n }\n\n const hiverCFRes = await getCFConfigs({ entity_type: entityType });\n return { createdField, hiverCFRes };\n },\n });\n\nexport const useSaveFieldMappingsAndTriggerSync = () =>\n useMutation({\n mutationFn: async ({\n crmProvider,\n entityType,\n fieldMappings,\n }: {\n crmProvider: string;\n entityType: ENTITY_TYPE;\n fieldMappings: UpdateFieldMappingItem[];\n }) => {\n const saved = await updateFieldMappings(crmProvider, entityType, {\n field_mappings: fieldMappings,\n });\n\n if (!saved) return false;\n\n await triggerSync(crmProvider, entityType);\n return true;\n },\n });\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport axios from \"axios\";\n\nimport closeIcon from \"@/assets/close.svg\";\nimport HiverLogo from \"@/assets/hiver-logo.svg?react\";\nimport ArrowRightIcon from \"@/assets/vector_right.svg?react\";\n\nimport { Drawer } from \"@/components/Drawer\";\nimport { DrawerHeader } from \"@/components/Drawer/Header\";\nimport {\n DrawerFooter,\n PrimaryButton,\n SecondaryButton,\n} from \"@/components/Drawer/Footer\";\nimport { StepProgress } from \"@/components/StepProgress\";\n\nimport { CrmSelect } from \"./CrmSelect\";\nimport { FieldTypeIcon } from \"./FieldTypeIcon\";\nimport { SearchableDropdown } from \"./SearchableDropdown\";\nimport { HiverFieldItem, type HiverSelectOption } from \"./HiverFieldItem\";\nimport { SyncSectionHeader } from \"./SyncSectionHeader\";\nimport { SyncStartedView } from \"./SyncStartedView\";\nimport {\n CreateNewFieldPanel,\n type CreatingFieldState,\n} from \"./CreateNewFieldPanel\";\n\nimport type { CF_ID, CF_TYPE, ENTITY_TYPE } from \"@/types/custom-fields\";\nimport type { CrmField, FieldRow, UpdateFieldMappingItem } from \"../../types\";\nimport {\n TYPE_DISPLAY_LABELS,\n formatDefaultHiverFieldLabel,\n getDefaultHiverFieldKey,\n processHiverCFs,\n} from \"../../utils\";\nimport { useApiToasts } from \"@/hooks/useApiToasts\";\nimport { useFieldMappingData } from \"../../hooks/useFieldMappingData\";\nimport { getEntityLabel } from \"../../utils/settings\";\nimport {\n useCreateMappedCustomField,\n useSaveFieldMappingsAndTriggerSync,\n} from \"../../hooks/useFieldMappingMutations\";\n\ninterface FieldMappingStepProps {\n open: boolean;\n onClose: () => void;\n onExit?: () => void;\n onSync?: () => void;\n entityType: ENTITY_TYPE;\n crmProvider: string;\n crmName: string;\n crmLogo?: ReactNode;\n}\n\nexport const FieldMappingStep = ({\n open,\n onClose,\n onExit = onClose,\n onSync,\n entityType,\n crmProvider,\n crmName,\n crmLogo,\n}: FieldMappingStepProps) => {\n const {\n mappings,\n setMappings,\n hiverOptions,\n setHiverOptions,\n crmFields,\n loading,\n error,\n } = useFieldMappingData({ open, entityType, crmProvider });\n\n const [creatingField, setCreatingField] = useState<\n Record<string, CreatingFieldState | null>\n >({});\n\n const [syncStarted, setSyncStarted] = useState(false);\n const [isSyncing, setIsSyncing] = useState(false);\n const [syncError, setSyncError] = useState<string | null>(null);\n const [syncStats, setSyncStats] = useState<{\n fieldsMapped: number;\n newFieldsCreated: number;\n } | null>(null);\n const { showSuccessToast, showErrorToast } = useApiToasts();\n const createMappedCustomFieldMutation = useCreateMappedCustomField();\n const saveFieldMappingsMutation = useSaveFieldMappingsAndTriggerSync();\n\n const newFieldsCreatedRef = useRef(0);\n const nextIdRef = useRef(1000);\n\n useEffect(() => {\n if (!open) {\n setSyncStarted(false);\n setSyncStats(null);\n newFieldsCreatedRef.current = 0;\n }\n }, [open]);\n\n const getTypeMismatchMessage = (\n row: FieldRow,\n hiverFieldType: string,\n ): string => {\n const crmTypeLabel =\n row.crmTypeLabel ||\n TYPE_DISPLAY_LABELS[row.crmFieldType.toLowerCase()] ||\n row.crmFieldType;\n const hiverTypeLabel =\n TYPE_DISPLAY_LABELS[hiverFieldType] ?? hiverFieldType;\n\n return `'${crmTypeLabel}' type cannot be stored as '${hiverTypeLabel}' — incompatible`;\n };\n\n const getSelectedTypeMismatchMessage = (\n row: FieldRow,\n ): string | undefined => {\n if (!row.hiverFieldKey) return undefined;\n\n const selectedOption = hiverOptions.find(\n (option) => option.value === row.hiverFieldKey,\n );\n\n if (\n !selectedOption ||\n row.hiver_field_types.length === 0 ||\n row.hiver_field_types.includes(selectedOption.type)\n ) {\n return undefined;\n }\n\n return getTypeMismatchMessage(row, selectedOption.type);\n };\n\n const getNewFieldTypeMismatchMessage = (\n row: FieldRow,\n fieldType: string,\n ): string | undefined => {\n const normalizedFieldType = fieldType.toLowerCase();\n\n if (\n row.hiver_field_types.length === 0 ||\n row.hiver_field_types.includes(normalizedFieldType)\n ) {\n return undefined;\n }\n\n return getTypeMismatchMessage(row, normalizedFieldType);\n };\n\n const getRowOptions = (row: FieldRow): HiverSelectOption[] => {\n const usedKeys = new Set<CF_ID>(\n mappings\n .filter((r) => r.id !== row.id)\n .map((r) => r.hiverFieldKey)\n .filter((k): k is CF_ID => k != null),\n );\n\n const opts = hiverOptions.map((opt) => ({\n label: opt.label,\n value: opt.value,\n type: opt.type,\n disabled: usedKeys.has(opt.value),\n error: usedKeys.has(opt.value)\n ? undefined\n : row.hiver_field_types.length > 0 &&\n !row.hiver_field_types.includes(opt.type)\n ? getTypeMismatchMessage(row, opt.type)\n : undefined,\n }));\n\n return [\n ...opts,\n {\n label: \"Create a new custom field\",\n value: \"__create_new__\" as CF_ID,\n type: \"create\",\n className: \"crm-select-create-option\",\n },\n ];\n };\n\n const getAutoCreatedHiverField = (row: FieldRow) => {\n const options = getRowOptions(row);\n const selectedValue =\n row.hiverFieldKey ??\n (`__auto_created_${row.id}` as HiverSelectOption[\"value\"]);\n const hasSelectedOption = options.some(\n (option) => option.value === selectedValue,\n );\n\n if (hasSelectedOption) {\n return { options, value: selectedValue };\n }\n\n return {\n options: [\n {\n label:\n formatDefaultHiverFieldLabel(row.default_hiver_field) ||\n String(selectedValue),\n value: selectedValue,\n type: row.hiver_field_types[0] ?? row.crmFieldType.toLowerCase(),\n },\n ...options,\n ],\n value: selectedValue,\n };\n };\n\n const renderAutoCreatedHiverFieldValue = (\n option: HiverSelectOption | null,\n ) => {\n if (!option) return null;\n\n return <HiverFieldItem {...option} />;\n };\n\n const updateHiverField = (id: string, hiverFieldKey: CF_ID | null) => {\n setMappings((prev) =>\n prev.map((r) => (r.id === id ? { ...r, hiverFieldKey } : r)),\n );\n };\n\n const handleHiverFieldChange = (id: string, value: CF_ID | null) => {\n if (value === (\"__create_new__\" as CF_ID)) {\n setCreatingField((prev) => ({\n ...prev,\n [id]: { name: \"\", fieldType: \"TEXT\", isLoading: false },\n }));\n setMappings((prev) =>\n prev.map((r) => (r.id === id ? { ...r, hiverFieldKey: null } : r)),\n );\n return;\n }\n updateHiverField(id, value);\n };\n\n const handleCreateField = async (rowId: string) => {\n const state = creatingField[rowId];\n if (!state || !state.name.trim()) return;\n\n setCreatingField((prev) => ({\n ...prev,\n [rowId]: { ...state, isLoading: true },\n }));\n\n try {\n const { createdField, hiverCFRes } =\n await createMappedCustomFieldMutation.mutateAsync({\n name: state.name.trim(),\n fieldType: state.fieldType as CF_TYPE,\n entityType,\n });\n\n if (!createdField || !hiverCFRes) {\n setCreatingField((prev) => ({\n ...prev,\n [rowId]: { ...state, isLoading: false },\n }));\n showErrorToast(\"Failed to create field. Please try again.\");\n return;\n }\n\n const newOptions = processHiverCFs(hiverCFRes, entityType);\n setHiverOptions(newOptions);\n\n const newField = newOptions.find((option) => {\n if (String(option.value) === String(createdField.cf_id)) return true;\n return option.label === state.name.trim();\n });\n\n if (newField) updateHiverField(rowId, newField.value);\n\n newFieldsCreatedRef.current += 1;\n setCreatingField((prev) => ({ ...prev, [rowId]: null }));\n } catch {\n setCreatingField((prev) => ({\n ...prev,\n [rowId]: { ...state, isLoading: false },\n }));\n showErrorToast(\"Failed to create field. Please try again.\");\n }\n };\n\n const handleSyncNow = async () => {\n setIsSyncing(true);\n setSyncError(null);\n\n try {\n const fieldMappings: UpdateFieldMappingItem[] = mappings\n .filter((r) => r.hiverFieldKey != null || r.default_hiver_field != null)\n .map((r) => ({\n cf_id: r.hiverFieldKey ?? null,\n crm_field_key: r.crm_field_key,\n crm_field_label: r.crmLabel,\n crm_field_type: r.crmFieldType,\n default_hiver_field: r.default_hiver_field,\n }));\n\n const saved = await saveFieldMappingsMutation.mutateAsync({\n crmProvider,\n entityType,\n fieldMappings,\n });\n\n if (!saved) {\n const errorMessage = \"Failed to save field mappings. Please try again.\";\n setSyncError(errorMessage);\n showErrorToast(errorMessage);\n return;\n }\n\n setSyncStats({\n fieldsMapped: fieldMappings.length,\n newFieldsCreated: newFieldsCreatedRef.current,\n });\n setSyncStarted(true);\n onSync?.();\n showSuccessToast(\n `Field mappings saved and sync started for ${getEntityLabel(entityType)}`,\n );\n } catch (err) {\n let errorMessage = \"Something went wrong. Please try again.\";\n if (axios.isAxiosError(err)) {\n const status = err.response?.status;\n if (status === 404) {\n errorMessage = `No active CRM config found. Please reconnect ${crmName} and try again.`;\n } else if (status === 409) {\n errorMessage =\n \"A sync is already running for this entity. Please wait for it to finish.\";\n } else if (status === 422) {\n errorMessage =\n \"Invalid field mapping. Check your selections and ensure you have 100 or fewer mappings.\";\n }\n }\n setSyncError(errorMessage);\n showErrorToast(errorMessage);\n } finally {\n setIsSyncing(false);\n }\n };\n\n const cancelCreateField = (rowId: string) => {\n setCreatingField((prev) => ({ ...prev, [rowId]: null }));\n };\n\n const removeRow = (id: string) => {\n setMappings((prev) => prev.filter((r) => r.id !== id));\n };\n\n const addRowFromField = (field: CrmField) => {\n const defaultFieldKey = getDefaultHiverFieldKey(\n field.default_hiver_field,\n hiverOptions,\n );\n\n setMappings((prev) => [\n ...prev,\n {\n id: String(nextIdRef.current++),\n crm_field_key: field.crm_field_key,\n crmFieldType: field.type,\n crmLabel: field.display_name,\n crmTypeLabel:\n TYPE_DISPLAY_LABELS[(field.type ?? \"\").toLowerCase()] ?? field.type,\n default_hiver_field: field.default_hiver_field,\n hiver_field_types: (field.hiver_field_types ?? []).map((t) =>\n (t ?? \"\").toLowerCase(),\n ),\n hiverFieldKey: defaultFieldKey,\n isAutocreated: field.default_hiver_field != null,\n isRequired: false,\n },\n ]);\n };\n\n const getTypePath = (row: FieldRow): string => {\n if (!row.crmTypeLabel) return \"\";\n const opt = hiverOptions.find((o) => o.value === row.hiverFieldKey);\n if (!opt) return row.crmTypeLabel;\n return `${row.crmTypeLabel} > ${TYPE_DISPLAY_LABELS[opt.type] ?? opt.type}`;\n };\n\n return (\n <Drawer open={open} onClose={onClose} position=\"right\" width={680}>\n <div className=\"cm:flex cm:flex-col cm:h-full\">\n <DrawerHeader\n title={\n <div className=\"cm:flex cm:items-center cm:gap-2.5 cm:min-w-0 cm:min-h-11\">\n <span className=\"cm:flex-shrink-0 cm:[&>svg]:h-[32px]! cm:[&>svg]:w-[32px]!\">{crmLogo}</span>\n <span className=\"cm:truncate cm:text-slate-700 cm:text-lg cm:font-medium\">\n Connect {crmName} to Hiver\n </span>\n </div>\n }\n actions={\n <div className=\"cm:flex cm:items-center\">\n <StepProgress current={2} total={2} />\n <div className=\"cm:pl-5\">\n <div className=\"cm:w-px cm:h-4 cm:bg-slate-200\" />\n </div>\n </div>\n }\n onClose={onClose}\n className=\"cm:pt-3! cm:pr-5! cm:pb-3! cm:pl-7!\"\n titleClassName=\"cm:flex-1! cm:min-w-0! cm:pl-3!\"\n />\n\n {syncStarted && syncStats ? (\n <SyncStartedView\n crmName={crmName}\n fieldsMapped={syncStats.fieldsMapped}\n newFieldsCreated={syncStats.newFieldsCreated}\n />\n ) : (\n <div className=\"cm:flex-1 cm:min-h-0 cm:overflow-y-auto cm:pl-10 cm:pr-[30px] cm:pb-10 cm:box-border\">\n <div className=\"cm:flex cm:w-full cm:flex-col cm:gap-6 cm:pt-6 cm:pb-2\">\n <SyncSectionHeader entityType={entityType} crmName={crmName} />\n\n {loading && (\n <div className=\"cm:flex cm:items-center cm:justify-center cm:py-12 cm:text-sm cm:text-slate-400\">\n Loading field mappings…\n </div>\n )}\n\n {error && (\n <div className=\"cm:text-sm cm:text-red-500 cm:py-4\">\n {error}\n </div>\n )}\n\n {!loading && !error && (\n <div className=\"cm:flex cm:w-full cm:flex-col cm:gap-5\">\n {/* TABLE */}\n <div className=\"cm:rounded-xl cm:border cm:border-slate-200 cm:overflow-hidden\">\n {/* Header */}\n <div className=\"cm:grid cm:grid-cols-[27.9%_22%_50.1%] cm:items-stretch cm:bg-slate-100 cm:border-b cm:border-slate-200\">\n <div className=\"cm:flex cm:h-11 cm:items-center cm:gap-2 cm:pl-5 cm:pr-3\">\n <span className=\"cm:flex cm:h-5 cm:w-5 cm:items-center cm:justify-center cm:flex-shrink-0\">\n {crmLogo}\n </span>\n <span className=\"cm:text-sm cm:font-medium cm:leading-5 cm:text-slate-700 cm:whitespace-nowrap\">\n {crmName} fields\n </span>\n </div>\n <div className=\"cm:h-11\" />\n <div className=\"cm:flex cm:h-11 cm:items-center cm:gap-2 cm:pl-4 cm:pr-4\">\n <span className=\"cm:flex cm:h-5 cm:w-5 cm:items-center cm:justify-center cm:rounded-[3px] cm:bg-[#EDF1F6] cm:overflow-hidden cm:flex-shrink-0\">\n <HiverLogo\n width={14}\n height={14}\n aria-hidden=\"true\"\n />\n </span>\n <span className=\"cm:text-sm cm:font-medium cm:leading-5 cm:text-slate-700 cm:whitespace-nowrap\">\n Hiver fields\n </span>\n </div>\n </div>\n\n {/* Rows */}\n <div>\n {mappings.map((row, rowIndex) => {\n const typePath = getTypePath(row);\n const creating = creatingField[row.id] ?? null;\n const isAutoCreated = row.default_hiver_field != null;\n const autoCreatedHiverField = isAutoCreated\n ? getAutoCreatedHiverField(row)\n : null;\n const mismatchMessage =\n getSelectedTypeMismatchMessage(row);\n const hasMismatch = Boolean(mismatchMessage);\n const hasRowDivider = rowIndex < mappings.length - 1;\n const newFieldTypeMismatchMessage = creating\n ? getNewFieldTypeMismatchMessage(\n row,\n creating.fieldType,\n )\n : undefined;\n\n return (\n <div\n key={row.id}\n className={\n hasRowDivider\n ? \"cm:border-b cm:border-slate-200\"\n : undefined\n }\n >\n <div className=\"cm:grid cm:grid-cols-[27.9%_22%_50.1%] cm:items-stretch cm:min-h-14\">\n {/* CRM FIELD */}\n <div className=\"cm:flex cm:min-h-14 cm:flex-col cm:justify-center cm:items-start cm:pl-5 cm:pr-3 cm:py-[9px]\">\n <span className=\"cm:text-sm cm:font-normal cm:leading-5 cm:text-slate-700\">\n {row.crmLabel}\n </span>\n {typePath && (\n <div className=\"cm:flex cm:items-center cm:gap-1 cm:mt-0.5\">\n {typePath\n .split(\" > \")\n .map((typeLabel, index, parts) => (\n <div\n key={`${row.id}-${typeLabel}-${index}`}\n className=\"cm:flex cm:items-center cm:gap-1\"\n >\n <span className=\"cm-map-typepath__part cm:text-xs cm:leading-[18px] cm:text-slate-500\">\n {typeLabel}\n </span>\n {index < parts.length - 1 && (\n <span\n aria-hidden=\"true\"\n className=\"cm-map-typepath__sep cm:text-sm cm:leading-[18px] cm:text-slate-400\"\n >\n →\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* CONNECTOR */}\n <div className=\"cm:flex cm:min-h-14 cm:items-center cm:justify-center cm:px-2\">\n {isAutoCreated ? (\n <div className=\"cm:flex cm:items-center cm:w-full cm:justify-center cm:gap-2\">\n <span className=\"cm-map-tag cm:inline-flex cm:h-[22px] cm:items-center cm:px-2 cm:py-0.5 cm:text-xs cm:leading-5 cm:text-slate-800 cm:bg-slate-100 cm:border cm:border-slate-200 cm:rounded-full cm:whitespace-nowrap\">\n Auto mapped\n </span>\n </div>\n ) : (\n <div className=\"cm:flex cm:w-full cm:justify-center\">\n <ArrowRightIcon\n width={12}\n height={12}\n aria-hidden=\"true\"\n className=\"cm:text-slate-500\"\n />\n </div>\n )}\n </div>\n\n {/* HIVER FIELD */}\n <div\n className={`cm:flex cm:min-h-14 cm:flex-col cm:items-start cm:justify-center cm:gap-1 cm:py-2 cm:pl-4 cm:pr-4 ${isAutoCreated ? \"cm:cursor-not-allowed\" : \"\"}`}\n >\n <div className=\"cm:flex cm:w-full cm:items-center cm:gap-2\">\n {isAutoCreated ? (\n <CrmSelect\n value={autoCreatedHiverField?.value}\n options={autoCreatedHiverField?.options}\n optionLabel=\"label\"\n optionValue=\"value\"\n optionDisabled=\"disabled\"\n placeholder=\"Select a field\"\n itemTemplate={HiverFieldItem}\n valueTemplate={\n renderAutoCreatedHiverFieldValue\n }\n disabled\n />\n ) : row.isRequired ? (\n <span className=\"cm:flex cm:h-8 cm:items-center cm:text-sm cm:text-slate-700\">\n {hiverOptions.find(\n (o) => o.value === row.hiverFieldKey,\n )?.label ?? \"—\"}\n </span>\n ) : (\n <CrmSelect\n value={\n creating ? null : row.hiverFieldKey\n }\n options={getRowOptions(row)}\n optionDisabled=\"disabled\"\n onChange={(e) =>\n // `unknown` under the toolkit's event\n // type where primereact said `any`; the\n // options are this row's own, keyed by\n // CF_ID.\n handleHiverFieldChange(\n row.id,\n e.value as CF_ID | null\n )\n }\n placeholder=\"Select a field\"\n itemTemplate={HiverFieldItem}\n invalid={hasMismatch}\n errorMessage={mismatchMessage}\n />\n )}\n\n <div className=\"cm:flex cm:h-[22px] cm:w-[22px] cm:flex-shrink-0 cm:items-center cm:justify-center\">\n {!row.isRequired && !isAutoCreated && (\n <button\n type=\"button\"\n aria-label=\"Remove mapping\"\n onClick={() => removeRow(row.id)}\n className=\"cm:flex cm:h-[22px] cm:w-[22px] cm:items-center cm:justify-center cm:rounded cm:bg-transparent cm:border-0 cm:p-0 cm:cursor-pointer cm:opacity-[0.45] cm:hover:bg-slate-100\"\n >\n <img\n src={closeIcon}\n alt=\"\"\n className=\"cm:h-3.5 cm:w-3.5\"\n />\n </button>\n )}\n </div>\n </div>\n\n {hasMismatch && !isAutoCreated && (\n <span className=\"cm:text-xs cm:text-[#9A3412] cm:font-normal\">\n Data type format mismatch\n </span>\n )}\n </div>\n </div>\n\n {creating && (\n <CreateNewFieldPanel\n state={creating}\n fieldTypeErrorMessage={\n newFieldTypeMismatchMessage\n }\n getFieldTypeErrorMessage={(fieldType) =>\n getNewFieldTypeMismatchMessage(row, fieldType)\n }\n onNameChange={(name) =>\n setCreatingField((prev) => ({\n ...prev,\n [row.id]: { ...prev[row.id]!, name },\n }))\n }\n onFieldTypeChange={(fieldType) =>\n setCreatingField((prev) => ({\n ...prev,\n [row.id]: { ...prev[row.id]!, fieldType },\n }))\n }\n onCreate={() => handleCreateField(row.id)}\n onCancel={() => cancelCreateField(row.id)}\n />\n )}\n </div>\n );\n })}\n </div>\n </div>\n\n {/* ADD FIELD */}\n <SearchableDropdown\n triggerLabel=\"+ Add field\"\n title={`${crmName} ${entityType === \"company\" ? \"account\" : \"contact\"} fields`}\n items={crmFields}\n getItemKey={(f) => f.crm_field_key}\n isItemDisabled={(f) =>\n mappings.some((r) => r.crm_field_key === f.crm_field_key)\n }\n getItemTooltip={(field, isDisabled) =>\n isDisabled\n ? `${field.display_name} is already added`\n : undefined\n }\n filterItem={(f, search) =>\n (f.display_name ?? \"\")\n .toLowerCase()\n .includes(search.toLowerCase())\n }\n onSelect={addRowFromField}\n renderItem={(field, isDisabled) => (\n <div className=\"cm:flex cm:items-center cm:gap-3 cm:px-4 cm:py-2.5\">\n <FieldTypeIcon\n type={(field.type ?? \"\").toLowerCase()}\n className=\"cm:flex-shrink-0\"\n />\n <div className=\"cm:flex cm:flex-col cm:min-w-0\">\n <span\n className={`cm:text-sm cm:truncate ${isDisabled ? \"cm:text-slate-400\" : \"cm:text-slate-700 cm:font-medium\"}`}\n >\n {field.display_name}\n </span>\n <span className=\"cm:text-xs cm:text-slate-500\">\n {TYPE_DISPLAY_LABELS[\n (field.type ?? \"\").toLowerCase()\n ] ?? field.type}\n </span>\n </div>\n </div>\n )}\n emptyMessage=\"No fields found\"\n />\n </div>\n )}\n </div>\n </div>\n )}\n\n <DrawerFooter>\n {syncStarted ? (\n <PrimaryButton label=\"Exit\" onClick={onExit} />\n ) : (\n <>\n {syncError && (\n <span className=\"cm:text-xs cm:text-red-500 cm:mr-auto\">\n {syncError}\n </span>\n )}\n <SecondaryButton label=\"Cancel\" onClick={onClose} />\n <PrimaryButton\n label={isSyncing ? \"Syncing…\" : \"Sync now\"}\n onClick={handleSyncNow}\n disabled={isSyncing}\n />\n </>\n )}\n </DrawerFooter>\n </div>\n </Drawer>\n );\n};\n","import { useRenderConfigStore } from \"@/stores/renderConfig\";\n\nconst unwrapResponse = <T>(raw: T | { data: T }): T =>\n raw !== null &&\n typeof raw === \"object\" &&\n \"data\" in (raw as object) &&\n !Array.isArray(raw)\n ? (raw as { data: T }).data\n : (raw as T);\n\nconst getConnectorCallback = () => {\n const callback =\n useRenderConfigStore.getState().callbacks?.connectorApiCallback;\n if (!callback) throw new Error(\"connectorApiCallback is not configured\");\n return callback;\n};\n\nexport type ConnectorTemplate = {\n id: string;\n type: string;\n name: string;\n description: string;\n logo: string;\n authDetails: {\n authType: \"Oauth1\" | \"Oauth2\" | \"ApiKey\" | \"BasicAuth\";\n clientId?: string | null;\n clientSecret?: string | null;\n scopes?: string;\n authEndpointUrl?: string;\n tokenEndpointUrl?: string;\n refreshTokenUrl?: string;\n keyName?: string;\n prefix?: string;\n // Fields returned by the template endpoint but not sent to /auth\n grantType?: string;\n accessToken?: string;\n refreshToken?: string;\n metaParams?: Record<string, unknown>;\n };\n variables: Record<string, unknown>;\n isTemplateNew: boolean;\n};\n\nexport type EnabledConnector = {\n id: string;\n type: string;\n name: string;\n logo: string;\n description: string;\n isEnabled: boolean;\n isAuthenticated: boolean;\n};\n\nexport type ConnectorAuthResponse = {\n id: string;\n authorizationUrl: string;\n success: boolean;\n};\n\nexport type ConnectorStatus = {\n status: \"success\" | \"pending\" | \"failed\";\n};\n\nexport type ConnectorAuthSource = \"ug\" | \"list\";\n\nexport const getEnabledConnectors = async (): Promise<EnabledConnector[]> => {\n const cb = getConnectorCallback();\n const response = await cb<EnabledConnector[]>(\"/v1/api/connectors/ug\", {\n method: \"GET\",\n });\n return unwrapResponse<EnabledConnector[]>(\n response.data as EnabledConnector[] | { data: EnabledConnector[] },\n );\n};\n\nexport const getConnectorTemplates = async (): Promise<ConnectorTemplate[]> => {\n const cb = getConnectorCallback();\n const response = await cb<ConnectorTemplate[]>(\"/v1/api/template/list\", {\n method: \"GET\",\n });\n return unwrapResponse<ConnectorTemplate[]>(\n response.data as ConnectorTemplate[] | { data: ConnectorTemplate[] },\n );\n};\n\nexport const getConnectorTemplateById = async (\n id: string,\n): Promise<ConnectorTemplate> => {\n const cb = getConnectorCallback();\n try {\n const response = await cb<ConnectorTemplate>(`/v1/api/connectors/${id}`, {\n method: \"GET\",\n });\n return unwrapResponse<ConnectorTemplate>(\n response.data as ConnectorTemplate | { data: ConnectorTemplate },\n );\n } catch {\n const response = await cb<ConnectorTemplate>(`/v1/api/template/${id}`, {\n method: \"GET\",\n });\n return unwrapResponse<ConnectorTemplate>(\n response.data as ConnectorTemplate | { data: ConnectorTemplate },\n );\n }\n};\n\nexport const postConnectorAuth = async (\n templateId: string,\n authDetails: ConnectorTemplate[\"authDetails\"],\n variables: ConnectorTemplate[\"variables\"],\n source: ConnectorAuthSource,\n): Promise<ConnectorAuthResponse> => {\n const cb = getConnectorCallback();\n const {\n authType,\n clientId,\n clientSecret,\n scopes,\n authEndpointUrl,\n tokenEndpointUrl,\n refreshTokenUrl,\n keyName,\n prefix,\n } = authDetails;\n const authPath =\n source === \"ug\"\n ? `/v1/api/connector/${templateId}/auth`\n : \"/v1/api/connector/auth\";\n const method = source === \"ug\" ? \"PATCH\" : \"POST\";\n const data = {\n ...(source === \"list\" ? { templateId } : {}),\n authDetails: {\n authType,\n clientId,\n clientSecret,\n scopes,\n authEndpointUrl,\n tokenEndpointUrl,\n refreshTokenUrl,\n keyName,\n prefix,\n },\n variables,\n };\n\n const response = await cb<\n ConnectorAuthResponse,\n Record<string, unknown>,\n typeof method\n >(authPath, {\n method,\n data,\n });\n return response.data as ConnectorAuthResponse;\n};\n\nexport const getConnectorStatus = async (\n connectorId: string,\n): Promise<ConnectorStatus> => {\n const cb = getConnectorCallback();\n const response = await cb<ConnectorStatus>(\n `/v1/api/connectors/${connectorId}/status`,\n { method: \"GET\" },\n );\n return response.data as ConnectorStatus;\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { getConnectorStatus } from \"@/services/crm-sync/connectorApi\";\n\nconst POLL_INTERVAL_MS = 1000;\n\nexport const useConnectorStatus = ({\n connectorId,\n enabled = false,\n}: {\n connectorId: string | null;\n enabled: boolean;\n}) => {\n return useQuery({\n queryKey: [\"connectorStatus\", connectorId],\n queryFn: () => getConnectorStatus(connectorId!),\n enabled: enabled && !!connectorId,\n refetchInterval: (query) => {\n const status = query.state.data?.status;\n return status === \"success\" || status === \"failed\"\n ? false\n : POLL_INTERVAL_MS;\n },\n refetchIntervalInBackground: true,\n refetchOnWindowFocus: false,\n retry: false,\n });\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { getEnabledConnectors } from \"@/services/crm-sync/connectorApi\";\nimport { useRenderConfigStore } from \"@/stores/renderConfig\";\n\nexport const ENABLED_CONNECTORS_QUERY_KEY = [\"enabledConnectors\"] as const;\n\n// Raw CI /ug query. Connection state is derived (together with /v1/crm/configs)\n// in useCrmConnections — do not derive it here.\nexport const useEnabledConnectors = () => {\n const hasCallback = useRenderConfigStore(\n (s) => !!s.callbacks?.connectorApiCallback,\n );\n\n return useQuery({\n queryKey: ENABLED_CONNECTORS_QUERY_KEY,\n queryFn: getEnabledConnectors,\n enabled: hasCallback,\n staleTime: 60_000,\n refetchOnWindowFocus: false,\n });\n};\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\n\nimport {\n getConnectorTemplateById,\n postConnectorAuth,\n} from \"@/services/crm-sync/connectorApi\";\nimport {\n createCrmSyncConfig,\n updateCrmSyncConfig,\n} from \"@/services/crm-sync\";\nimport { CRM_CONFIGS_QUERY_KEY } from \"@/queries/useCrmConfigs\";\nimport { ENABLED_CONNECTORS_QUERY_KEY } from \"@/queries/useEnabledConnectors\";\nimport type { ConnectorLoginAction } from \"./useCrmLoginAction\";\n\nexport const useActivateCrmConfig = (crmType: string) => {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n ciConnectorId,\n hasExistingConfig,\n }: {\n ciConnectorId?: string;\n hasExistingConfig: boolean;\n }) => {\n const payload = {\n crm_provider: crmType,\n status: \"active\" as const,\n ...(ciConnectorId ? { ci_connector_id: ciConnectorId } : {}),\n };\n\n if (hasExistingConfig) {\n await updateCrmSyncConfig(payload);\n } else {\n await createCrmSyncConfig(payload);\n }\n },\n onSuccess: async () => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: CRM_CONFIGS_QUERY_KEY }),\n queryClient.invalidateQueries({\n queryKey: ENABLED_CONNECTORS_QUERY_KEY,\n }),\n ]);\n },\n });\n};\n\nexport const useStartConnectorAuth = () =>\n useMutation({\n mutationFn: async (loginAction: ConnectorLoginAction) => {\n const template = await getConnectorTemplateById(loginAction.id);\n return postConnectorAuth(\n loginAction.id,\n template.authDetails,\n template.variables,\n loginAction.source,\n );\n },\n });\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport {\n getEnabledConnectors,\n getConnectorTemplates,\n type ConnectorAuthSource,\n} from \"@/services/crm-sync/connectorApi\";\nimport { getCrmConfigs } from \"@/services/crm-sync\";\nimport type { CrmSyncConfig } from \"../types\";\n\ntype ConnectorAuthTarget = {\n type: \"oauth\";\n id: string;\n source: ConnectorAuthSource;\n};\n\ntype FinalizeAuthTarget = {\n type: \"finalize\";\n connectorId: string;\n};\n\nexport type LoginAction = ConnectorAuthTarget | FinalizeAuthTarget;\nexport type ConnectorLoginAction = ConnectorAuthTarget;\n\nconst findLoginConnector = (\n connectors: Awaited<ReturnType<typeof getEnabledConnectors>>,\n config: CrmSyncConfig | null,\n crmType: string,\n) => {\n const connectorByConfigId = config?.ci_connector_id\n ? connectors.find(\n (connector) =>\n connector.id === config.ci_connector_id && connector.type === crmType,\n )\n : null;\n\n return connectorByConfigId ?? connectors.find((c) => c.type === crmType);\n};\n\nexport const useCrmLoginAction = ({\n open,\n crmType,\n crmName,\n}: {\n open: boolean;\n crmType: string;\n crmName: string;\n}) =>\n useQuery({\n queryKey: [\"crm-login-action\", crmType],\n enabled: open,\n staleTime: 0,\n refetchOnMount: \"always\",\n refetchOnWindowFocus: false,\n retry: false,\n queryFn: async () => {\n const [connectors, configs] = await Promise.all([\n getEnabledConnectors(),\n getCrmConfigs(),\n ]);\n\n const config =\n configs.data.find((item) => item.crm_provider === crmType) ?? null;\n\n const connector = findLoginConnector(connectors, config, crmType);\n if (connector?.isAuthenticated) {\n return {\n config,\n loginAction: {\n type: \"finalize\",\n connectorId: connector.id,\n } satisfies LoginAction,\n };\n }\n\n if (connector) {\n return {\n config,\n loginAction: {\n type: \"oauth\",\n id: connector.id,\n source: \"ug\",\n } satisfies LoginAction,\n };\n }\n\n const templates = await getConnectorTemplates();\n const template =\n templates.find((item) => item.type === crmType) ??\n templates.find((item) => item.name.toLowerCase().includes(crmType));\n\n if (!template) {\n console.error(\n `[CrmConnectStep] ${crmName} not found in /ug or /list. Available types:`,\n templates.map((item) => item.type),\n );\n }\n\n return {\n config,\n loginAction: template\n ? ({\n type: \"oauth\",\n id: template.id,\n source: \"list\",\n } satisfies LoginAction)\n : null,\n };\n },\n });\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\n\nimport { Drawer } from \"@/components/Drawer\";\nimport { DrawerHeader } from \"@/components/Drawer/Header\";\nimport { StepProgress } from \"@/components/StepProgress\";\nimport { CDN_ASSETS } from \"@/constants/cdnAssets\";\nimport { useApiToasts } from \"@/hooks/useApiToasts\";\nimport { useConnectorStatus } from \"../../hooks/useConnectorStatus\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { ENABLED_CONNECTORS_QUERY_KEY } from \"@/queries/useEnabledConnectors\";\nimport {\n useActivateCrmConfig,\n useStartConnectorAuth,\n} from \"../../hooks/useCrmAuthMutations\";\nimport {\n useCrmLoginAction,\n type LoginAction,\n} from \"../../hooks/useCrmLoginAction\";\nimport type { CrmSyncConfig } from \"../../types\";\n\ninterface CrmConnectStepProps {\n open: boolean;\n onClose: () => void;\n onLogin: () => void;\n crmType: string;\n crmName: string;\n logo: ReactNode;\n illustration: ReactNode;\n description?: string;\n prerequisites?: string[];\n}\n\ntype ConnectPhase =\n | \"checking\"\n | \"idle\"\n | \"loading\"\n | \"polling\"\n | \"success\"\n | \"error\";\n\nexport const CrmConnectStep = ({\n open,\n onClose,\n onLogin,\n crmType,\n crmName,\n logo,\n illustration,\n description,\n prerequisites,\n}: CrmConnectStepProps) => {\n const queryClient = useQueryClient();\n const { showSuccessToast, showErrorToast } = useApiToasts();\n const [phase, setPhase] = useState<ConnectPhase>(\"checking\");\n const [connectorId, setConnectorId] = useState<string | null>(null);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const loginActionQuery = useCrmLoginAction({ open, crmType, crmName });\n const activateCrmConfigMutation = useActivateCrmConfig(crmType);\n const startConnectorAuthMutation = useStartConnectorAuth();\n\n const loginActionRef = useRef<LoginAction | null>(null);\n const configRef = useRef<CrmSyncConfig | null>(null);\n const onLoginRef = useRef(onLogin);\n onLoginRef.current = onLogin;\n const oauthWindowRef = useRef<Window | null>(null);\n const isUpdatingConfigRef = useRef(false);\n\n const { data: statusData } = useConnectorStatus({\n connectorId,\n enabled: phase === \"polling\",\n });\n\n useEffect(() => {\n if (!open) {\n setPhase(\"checking\");\n setConnectorId(null);\n setErrorMessage(null);\n loginActionRef.current = null;\n configRef.current = null;\n oauthWindowRef.current = null;\n isUpdatingConfigRef.current = false;\n }\n }, [open]);\n\n useEffect(() => {\n if (open && loginActionQuery.isFetching) {\n setPhase(\"checking\");\n }\n }, [open, loginActionQuery.isFetching]);\n\n useEffect(() => {\n if (!open || loginActionQuery.isFetching) return;\n\n if (loginActionQuery.isError) {\n console.error(\n \"[CrmConnectStep] Error during connection check:\",\n loginActionQuery.error,\n );\n setPhase(\"idle\");\n return;\n }\n\n if (!loginActionQuery.data) return;\n\n configRef.current = loginActionQuery.data.config;\n loginActionRef.current = loginActionQuery.data.loginAction;\n setPhase(\"idle\");\n }, [\n open,\n loginActionQuery.data,\n loginActionQuery.error,\n loginActionQuery.isError,\n loginActionQuery.isFetching,\n ]);\n\n const activateCrmConfig = useCallback(\n async (ciConnectorId?: string) => {\n await activateCrmConfigMutation.mutateAsync({\n ciConnectorId,\n hasExistingConfig: Boolean(configRef.current),\n });\n },\n [activateCrmConfigMutation],\n );\n\n const closeOAuthWindow = useCallback(() => {\n const oauthWindow = oauthWindowRef?.current;\n oauthWindowRef.current = null;\n\n try {\n if (oauthWindow && !oauthWindow.closed) {\n oauthWindow.close();\n }\n window.focus();\n } catch (err) {\n console.warn(\"[CrmConnectStep] Failed to close OAuth window:\", err);\n }\n }, []);\n\n useEffect(() => {\n if (phase !== \"polling\" || !statusData) return;\n if (statusData.status === \"success\") {\n if (isUpdatingConfigRef.current) return;\n\n isUpdatingConfigRef.current = true;\n closeOAuthWindow();\n\n (async () => {\n try {\n setPhase(\"success\");\n showSuccessToast(`${crmName} authorisation successful`);\n await activateCrmConfig(connectorId ?? undefined);\n } catch (err) {\n console.error(\n `[CrmConnectStep] Failed to update ${crmName} config status:`,\n err,\n );\n showErrorToast(`Config update failed`);\n setPhase(\"success\");\n } finally {\n isUpdatingConfigRef.current = false;\n }\n })();\n } else if (statusData.status === \"failed\") {\n const message = `${crmName} authorisation failed. Please try again.`;\n setPhase(\"error\");\n setErrorMessage(message);\n showErrorToast(message);\n }\n }, [\n phase,\n statusData,\n crmName,\n connectorId,\n activateCrmConfig,\n closeOAuthWindow,\n showSuccessToast,\n showErrorToast,\n ]);\n\n // If user closes the OAuth tab without completing login, stop polling\n useEffect(() => {\n if (phase !== \"polling\") return;\n\n const interval = setInterval(() => {\n if (oauthWindowRef.current?.closed) {\n oauthWindowRef.current = null;\n setConnectorId(null);\n setPhase(\"idle\");\n }\n }, 1000);\n\n return () => clearInterval(interval);\n }, [phase]);\n\n // Auto-advance to field mapping 4s after success; invalidate /ug cache after nav\n useEffect(() => {\n if (phase !== \"success\") return;\n const timer = setTimeout(() => {\n queryClient.invalidateQueries({ queryKey: ENABLED_CONNECTORS_QUERY_KEY });\n onLoginRef.current();\n }, 2000);\n return () => clearTimeout(timer);\n }, [phase, queryClient]);\n\n const handleLoginClick = useCallback(async () => {\n setPhase(\"loading\");\n setErrorMessage(null);\n try {\n const loginAction = loginActionRef.current;\n if (!loginAction) throw new Error(`${crmName} template ID not resolved`);\n\n if (loginAction.type === \"finalize\") {\n await activateCrmConfig(loginAction.connectorId);\n setPhase(\"success\");\n showSuccessToast(`${crmName} authorisation successful`);\n return;\n }\n\n const { id: instanceId, authorizationUrl } =\n await startConnectorAuthMutation.mutateAsync(loginAction);\n\n oauthWindowRef.current = window.open(authorizationUrl, \"_blank\");\n setConnectorId(instanceId);\n setPhase(\"polling\");\n showSuccessToast(`${crmName} authorisation started`);\n } catch (err) {\n console.error(`[CrmConnectStep] ${crmName} connect failed:`, err);\n const message = `Failed to initiate ${crmName} login. Please try again.`;\n setPhase(\"error\");\n setErrorMessage(message);\n showErrorToast(message);\n }\n }, [\n crmName,\n activateCrmConfig,\n startConnectorAuthMutation,\n showSuccessToast,\n showErrorToast,\n ]);\n\n const isChecking = phase === \"checking\";\n const isLoading = phase === \"loading\" || phase === \"polling\";\n const isSuccess = phase === \"success\";\n const isError = phase === \"error\";\n const shouldCreateConfigFromAuthenticatedConnector =\n loginActionQuery.data?.loginAction?.type === \"finalize\" &&\n !loginActionQuery.data.config;\n\n const getButtonText = () => {\n if (isChecking) return \"Checking connection...\";\n\n if (isLoading) {\n return phase === \"polling\"\n ? \"Waiting for authorisation...\"\n : \"Connecting...\";\n }\n\n if (isError) return \"Retry\";\n\n if (shouldCreateConfigFromAuthenticatedConnector) {\n return `Continue with ${crmName}`;\n }\n\n return `Login via ${crmName}`;\n };\n\n return (\n <Drawer open={open} onClose={onClose} position=\"right\" width={680}>\n <div className=\"cm:flex cm:flex-col cm:h-full cm:overflow-y-auto\">\n <DrawerHeader\n title={\n <div className=\"cm:flex cm:items-center cm:gap-2.5 cm:min-w-0 cm:min-h-11\">\n <span className=\"cm:flex-shrink-0 cm:[&>svg]:h-[32px]! cm:[&>svg]:w-[32px]!\">{logo}</span>\n <span className=\"cm:truncate cm:text-slate-700 cm:text-lg cm:font-medium\">\n Connect {crmName} to Hiver\n </span>\n </div>\n }\n actions={\n <div className=\"cm:flex cm:items-center\">\n <StepProgress current={1} total={2} />\n <div className=\"cm:pl-5\">\n <div className=\"cm:w-px cm:h-4 cm:bg-slate-200\" />\n </div>\n </div>\n }\n onClose={onClose}\n className=\"cm:pt-3! cm:pr-5! cm:pb-3! cm:pl-7!\"\n titleClassName=\"cm:flex-1! cm:min-w-0! cm:pl-3!\"\n />\n\n {isSuccess ? (\n <div className=\"cm:flex-1 cm:flex cm:flex-col cm:items-center cm:justify-center cm:gap-4\">\n <img\n src={CDN_ASSETS.successState}\n alt=\"Authorization successful\"\n className=\"cm:w-32 cm:h-32\"\n />\n <p className=\"cm:text-base cm:font-semibold cm:text-slate-700\">\n {crmName} authorisation successful\n </p>\n <p className=\"cm:text-sm cm:text-slate-400\">redirecting...</p>\n </div>\n ) : (\n <div\n className=\"cm:flex-1 cm:flex cm:flex-col cm:gap-8\n cm:pt-[72px] cm:px-[76px] cm:pb-[90px]\"\n >\n {illustration}\n\n <div className=\"cm:flex cm:flex-col cm:gap-4\">\n <div className=\"cm:flex cm:flex-col cm:gap-2\">\n <h3 className=\"cm:text-base cm:font-semibold cm:text-slate-700\">\n Connect {crmName}\n </h3>\n <p className=\"cm:text-sm cm:text-slate-500 cm:leading-relaxed\">\n {description ??\n `Map fields from ${crmName} to Hiver so customer details stay up to date.`}\n </p>\n </div>\n\n {prerequisites && prerequisites.length > 0 && (\n <div className=\"cm:flex cm:flex-col cm:gap-2\">\n <p className=\"cm:text-sm cm:font-medium cm:text-slate-700\">\n Before you connect, make sure you have:\n </p>\n <ul className=\"cm:flex cm:flex-col cm:gap-1.5 cm:list-disc cm:pl-5\">\n {prerequisites.map((item) => (\n <li\n key={item}\n className=\"cm:text-sm cm:text-slate-500 cm:leading-relaxed\"\n >\n {item}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {isError && errorMessage && (\n <p className=\"cm:text-sm cm:text-red-500\">{errorMessage}</p>\n )}\n\n <button\n type=\"button\"\n onClick={handleLoginClick}\n disabled={isChecking || isLoading}\n className=\"cm-primary-action cm:w-fit cm:px-5 cm:py-2 cm:bg-blue-500 cm:text-white\n cm:text-sm cm:font-medium cm:rounded-lg cm:cursor-pointer\n cm:hover:bg-blue-600 cm:transition-colors\n cm:disabled:opacity-50 cm:disabled:cursor-not-allowed\"\n >\n {getButtonText()}\n </button>\n </div>\n </div>\n )}\n </div>\n </Drawer>\n );\n};\n","import { useState, type ReactNode } from \"react\";\n\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\nimport { FieldMappingStep } from \"./FieldMappingStep\";\nimport { CrmConnectStep } from \"./CrmConnectStep\";\n\ntype Step = \"connect\" | \"field-mapping\";\nexport type CrmConnectDrawerInitialStep = Step;\n\ninterface CrmConnectDrawerProps {\n open: boolean;\n onClose: () => void;\n entityType: ENTITY_TYPE;\n crmType: string;\n crmName: string;\n crmLogo?: ReactNode;\n crmIllustration?: ReactNode;\n crmDescription?: string;\n crmPrerequisites?: string[];\n initialStep?: CrmConnectDrawerInitialStep;\n}\n\nexport const CrmConnectDrawer = ({\n open,\n onClose,\n entityType,\n crmType,\n crmName,\n crmLogo,\n crmIllustration,\n crmDescription,\n crmPrerequisites,\n initialStep = \"connect\",\n}: CrmConnectDrawerProps) => {\n const [step, setStep] = useState<Step>(initialStep);\n\n const handleClose = () => {\n setStep(\"connect\");\n onClose();\n };\n\n return (\n <>\n <CrmConnectStep\n open={open && step === \"connect\"}\n onClose={handleClose}\n onLogin={() => setStep(\"field-mapping\")}\n crmType={crmType}\n crmName={crmName}\n logo={crmLogo}\n illustration={crmIllustration}\n description={crmDescription}\n prerequisites={crmPrerequisites}\n />\n <FieldMappingStep\n open={open && step === \"field-mapping\"}\n onClose={handleClose}\n entityType={entityType}\n crmProvider={crmType}\n crmName={crmName}\n crmLogo={crmLogo}\n />\n </>\n );\n};\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\n\nimport { disconnectCrm, triggerSync } from \"@/services/crm-sync\";\nimport { CRM_CONFIGS_QUERY_KEY } from \"@/queries/useCrmConfigs\";\nimport { ENABLED_CONNECTORS_QUERY_KEY } from \"@/queries/useEnabledConnectors\";\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\n\nexport const useTriggerCrmSync = () =>\n useMutation({\n mutationFn: ({\n crmProvider,\n entityType,\n }: {\n crmProvider: string;\n entityType: ENTITY_TYPE;\n }) => triggerSync(crmProvider, entityType),\n });\n\nexport const useDisconnectCrm = () => {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n crmProvider,\n retainData,\n }: {\n crmProvider: string;\n retainData: boolean;\n }) => disconnectCrm(crmProvider, { retain_data: retainData }),\n onSuccess: async () => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: CRM_CONFIGS_QUERY_KEY }),\n queryClient.invalidateQueries({\n queryKey: ENABLED_CONNECTORS_QUERY_KEY,\n }),\n ]);\n },\n });\n};\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { CloseGlyph } from \"@/components/Icon/glyphs\";\nimport { cn } from \"@/utils/classNames\";\nimport { Glyph } from \"@/components/Glyph\";\n\ntype DataChoice = \"keep\" | \"delete\";\n\nconst DATA_OPTIONS: Array<{\n value: DataChoice;\n title: string;\n description: (crmName: string) => string;\n}> = [\n {\n value: \"keep\",\n title: \"Keep synced data\",\n description: () => \"Account and contact records stay in Hiver.\",\n },\n {\n value: \"delete\",\n title: \"Delete synced data\",\n description: (crmName) =>\n `Permanently removes all records imported from ${crmName}. This can't be undone.`,\n },\n];\n\n// ─── Private sub-component ───────────────────────────────────────────────────\n\ninterface DataOptionCardProps {\n option: (typeof DATA_OPTIONS)[number];\n isSelected: boolean;\n crmName: string;\n onChange: () => void;\n}\n\nconst DataOptionCard = ({\n option,\n isSelected,\n crmName,\n onChange,\n}: DataOptionCardProps) => (\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n onClick={onChange}\n className={cn(\n \"cm:block cm:w-full cm:p-3 cm:rounded-xl cm:border cm:cursor-pointer cm:transition-colors cm:text-left cm:bg-white\",\n isSelected\n ? \"cm:border-[#EDF1F6]\"\n : \"cm:border-[#EDF1F6] cm:hover:border-slate-200\",\n )}\n style={{\n display: \"block\",\n width: \"100%\",\n textAlign: \"left\",\n fontFamily: 'var(--font-family-sans, \"Hanken Grotesk\", sans-serif)',\n }}\n >\n <div\n className=\"cm:flex cm:w-full cm:items-start cm:gap-4\"\n style={{ display: \"flex\", alignItems: \"flex-start\", gap: 16 }}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n \"cm-radio cm:mt-[5px] cm:flex cm:h-4 cm:w-4 cm:flex-shrink-0 cm:items-center cm:justify-center cm:rounded-full cm:border cm:bg-white\",\n isSelected ? \"cm-radio--selected cm:border-[#276CF0]\" : \"cm:border-slate-200\",\n )}\n style={{ flexShrink: 0 }}\n >\n {isSelected ? (\n <span className=\"cm-radio__dot cm:block cm:h-2.5 cm:w-2.5 cm:rounded-full cm:bg-[#276CF0]\" />\n ) : null}\n </span>\n <div className=\"cm:flex cm:min-w-0 cm:flex-1 cm:flex-col\">\n <span className=\"cm:text-base cm:font-medium cm:leading-6 cm:text-slate-700\">\n {option.title}\n </span>\n <span className=\"cm:text-sm cm:font-medium cm:leading-5 cm:text-slate-500\">\n {option.description(crmName)}\n </span>\n </div>\n </div>\n </button>\n);\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\ninterface DisconnectCrmModalProps {\n open: boolean;\n onClose: () => void;\n onConfirm: (retainData: boolean) => void;\n crmName: string;\n isLoading?: boolean;\n}\n\nexport const DisconnectCrmModal = ({\n open,\n onClose,\n onConfirm,\n crmName,\n isLoading = false,\n}: DisconnectCrmModalProps) => {\n const [choice, setChoice] = useState<DataChoice>(\"keep\");\n\n const handleClose = useCallback(() => {\n setChoice(\"keep\");\n onClose();\n }, [onClose]);\n\n const handleConfirm = useCallback(() => {\n onConfirm(choice === \"keep\");\n }, [choice, onConfirm]);\n\n useEffect(() => {\n if (!open) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") handleClose();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, handleClose]);\n\n if (!open) return null;\n\n return (\n <div\n className=\"cm:fixed cm:inset-0 cm:z-[1100] cm:flex cm:items-center cm:justify-center\"\n role=\"presentation\"\n >\n {/* Backdrop */}\n <div\n className=\"cm:absolute cm:inset-0 cm:bg-slate-900/50\"\n onClick={handleClose}\n aria-hidden=\"true\"\n />\n\n {/* Panel */}\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"disconnect-modal-title\"\n className=\"cm:relative cm:z-[1110] cm:w-[calc(100%-32px)] cm:max-w-[492px] cm:bg-[#EDF1F6] cm:rounded-xl cm:shadow-[0_8px_40px_rgba(15,23,42,0.18)] cm:flex cm:flex-col cm:overflow-hidden\"\n style={{ fontFamily: 'var(--font-family-sans, \"Hanken Grotesk\", sans-serif)' }}\n >\n {/* Header */}\n <div className=\"cm:flex cm:items-center cm:justify-between cm:px-4 cm:py-2\">\n {/* No leading icon: the design drops it. A bin glyph beside a title that\n already says \"Disconnect <CRM>?\" adds nothing, and it read as a\n delete action when the default choice here KEEPS the data. */}\n <div className=\"cm:flex cm:items-center cm:gap-0.5\">\n <h2\n id=\"disconnect-modal-title\"\n className=\"cm:m-0 cm:text-base cm:font-medium cm:leading-6 cm:text-slate-700 cm:whitespace-nowrap\"\n >\n Disconnect {crmName}?\n </h2>\n </div>\n <button\n type=\"button\"\n onClick={handleClose}\n disabled={isLoading}\n aria-label=\"Close\"\n className=\"cm:flex cm:items-center cm:justify-center cm:w-6 cm:h-6 cm:p-0 cm:rounded-md cm:hover:bg-slate-200 cm:transition-colors cm:cursor-pointer cm:border-0 cm:bg-transparent cm:disabled:opacity-50\"\n >\n <CloseGlyph width={14} height={14} className=\"cm:text-slate-500\" />\n </button>\n </div>\n\n {/* Body + Footer */}\n <div className=\"cm:m-0 cm:flex cm:flex-col cm:gap-5 cm:rounded-xl cm:border cm:border-slate-200 cm:bg-white cm:p-5\">\n <p className=\"cm:m-0 cm:text-sm cm:font-normal cm:leading-5 cm:text-slate-500\">\n This stops syncing {crmName} accounts and contacts into Hiver. Any\n data imported will continue to be available but won't update\n anymore. Your company's {crmName} connection in Hiver isn't\n affected.\n </p>\n\n <fieldset\n className=\"cm:flex cm:flex-col cm:gap-3 cm:border-0 cm:p-0 cm:m-0\"\n role=\"radiogroup\"\n >\n <legend className=\"cm:mb-3 cm:p-0 cm:text-sm cm:font-medium cm:leading-5 cm:text-slate-700\">\n Choose what happens to synced data\n </legend>\n {DATA_OPTIONS.map((option) => (\n <DataOptionCard\n key={option.value}\n option={option}\n isSelected={choice === option.value}\n crmName={crmName}\n onChange={() => setChoice(option.value)}\n />\n ))}\n </fieldset>\n\n {/* Footer */}\n <div className=\"cm:flex cm:items-center cm:justify-end cm:gap-4\">\n <button\n type=\"button\"\n onClick={handleClose}\n disabled={isLoading}\n className=\"cm:h-9 cm:px-3 cm:py-1 cm:text-sm cm:font-medium cm:leading-5 cm:text-slate-700\n cm-secondary-action cm:bg-white cm:border cm:border-slate-200 cm:rounded-md cm:cursor-pointer cm:hover:bg-slate-50\n cm:transition-colors cm:disabled:opacity-50 cm:disabled:cursor-not-allowed\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleConfirm}\n disabled={isLoading}\n className=\"cm:inline-flex cm:h-9 cm:items-center cm:gap-2 cm:px-3 cm:py-1\n cm:text-sm cm:font-medium cm:leading-5 cm:text-white cm:bg-[#B81717] cm:rounded-md\n cm:cursor-pointer cm:hover:bg-red-700 cm:transition-colors cm:disabled:opacity-50 \n cm:disabled:cursor-not-allowed\"\n >\n {isLoading && <Glyph name=\"spinner\" size={12} className=\"cm:text-xs\" />}\n {isLoading ? \"Disconnecting…\" : \"Disconnect\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import type { ReactNode } from \"react\";\n\nimport Icon from \"@/components/Icon\";\n// hui only — referenced solely inside the `IS_HUI` branch below, so prime's\n// build folds that branch away and never pulls these glyphs in (same DCE as\n// `components/Icon/glyphs.tsx`).\nimport { Briefcase02, User01 } from \"hiver-ui-kit-extended/icons\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\nimport type { CrmSyncEntityConfig } from \"@/features/crm-sync/types\";\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\n\n// Figma 157-10381 \"Icon tile\": an 18px line glyph in a 40px tile. Omni keeps its\n// 14/16px local icons.\nconst ENTITY_ICONS: Record<ENTITY_TYPE, ReactNode> = IS_HUI\n ? {\n company: <Briefcase02 width={18} height={18} aria-hidden=\"true\" />,\n contact: <User01 width={18} height={18} aria-hidden=\"true\" />,\n }\n : {\n company: <Icon name=\"company_small\" size={14} color=\"#64758B\" />,\n contact: <Icon name=\"contacts\" size={16} color=\"#64758B\" />,\n };\n\ninterface EntityRowProps extends CrmSyncEntityConfig {\n onSync: (entityType: ENTITY_TYPE) => void;\n}\n\nconst EntityRow = ({\n entityType,\n label,\n isSynced,\n syncedLabel,\n unsyncedDescription,\n onSync,\n}: EntityRowProps) => (\n <div className={IS_HUI ? \"cm-crm-card cm-crm-card--row\" : \"cm:flex cm:items-center cm:justify-between cm:gap-4 cm:px-3 cm:py-3 cm:rounded-xl cm:border cm:border-slate-200\"}>\n <div className=\"cm:flex cm:items-center cm:gap-3 cm:min-w-0\">\n <div className={IS_HUI ? \"cm-crm-icon-tile\" : \"cm:flex-shrink-0 cm:w-10 cm:h-10 cm:rounded-lg cm:bg-slate-100 cm:flex cm:items-center cm:justify-center\"}>\n {ENTITY_ICONS[entityType]}\n </div>\n <div className=\"cm:flex cm:flex-col cm:min-w-0\">\n <span className=\"cm:text-[15px] cm:font-medium cm:text-slate-700\">\n {label}\n </span>\n <span className=\"cm:text-[13px] cm:text-slate-500 cm:mt-0.5\">\n {isSynced ? syncedLabel : unsyncedDescription}\n </span>\n </div>\n </div>\n\n {isSynced ? (\n <span\n className=\"cm:inline-flex cm:items-center cm:h-[18px] cm:flex-shrink-0 \n cm:px-3 cm:text-xs cm:font-normal cm:text-slate-700 cm:bg-slate-150 cm:border-[0.5px] cm:border-slate-200\n cm:rounded-[4px] cm:whitespace-nowrap cm:pl-[8px] cm:pr-[8px]\"\n >\n Data's are synced real time\n </span>\n ) : (\n <button\n type=\"button\"\n onClick={() => onSync(entityType)}\n className=\"cm-primary-action cm:flex-shrink-0 cm:px-3 cm:py-1.5 cm:bg-blue-500 cm:text-white cm:text-xs cm:font-medium cm:rounded-md cm:cursor-pointer cm:hover:bg-blue-600 cm:transition-colors cm:whitespace-nowrap\"\n >\n {label}\n </button>\n )}\n </div>\n);\n\ninterface ObjectImportSectionProps {\n crmName: string;\n entityRows: CrmSyncEntityConfig[];\n onSyncEntity: (entityType: ENTITY_TYPE) => void;\n}\n\nexport const ObjectImportSection = ({\n crmName,\n entityRows,\n onSyncEntity,\n}: ObjectImportSectionProps) => (\n <div className={IS_HUI ? \"cm-crm-section\" : \"cm:flex cm:flex-col cm:gap-5 cm:pb-2\"}>\n <div>\n <h3 className=\"cm:text-md cm:font-semibold cm:text-slate-700\">\n Sync {crmName} data\n </h3>\n <p className=\"cm:text-sm cm:text-slate-500 cm:mt-0.5\">\n Choose customer details you want to bring into Hiver.\n </p>\n </div>\n\n <div className=\"cm:flex cm:flex-col cm:gap-3\">\n {entityRows.map((entity) => (\n <EntityRow\n key={entity.entityType}\n {...entity}\n onSync={onSyncEntity}\n />\n ))}\n </div>\n </div>\n);\n\ninterface ManualSyncSectionProps {\n lastSyncedLabel: string | null;\n isManualSyncing: boolean;\n isManualSyncDisabled: boolean;\n onManualSync: () => void;\n}\n\nexport const ManualSyncSection = ({\n lastSyncedLabel,\n isManualSyncing,\n isManualSyncDisabled,\n onManualSync,\n}: ManualSyncSectionProps) => (\n <div className={IS_HUI ? \"cm-crm-card cm-crm-card--wrap\" : \"cm:rounded-xl cm:border cm:border-slate-200 cm:mt-2\"}>\n <div className=\"cm:flex cm:items-center cm:justify-between cm:px-3.5 cm:py-3.5\">\n <div>\n <p className=\"cm:text-[15px] cm:font-medium cm:text-slate-700\">\n Manual sync\n </p>\n {lastSyncedLabel && (\n <p className=\"cm:mt-0.5 cm:text-sm cm:text-slate-500 cm:truncate cm:font-normal\">\n {lastSyncedLabel}\n </p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={onManualSync}\n disabled={isManualSyncing || isManualSyncDisabled}\n className=\"cm-secondary-action cm:px-3 cm:py-1 cm:text-xs cm:font-medium cm:text-slate-700 cm:bg-white cm:border cm:border-slate-200 cm:rounded-md cm:cursor-pointer cm:hover:bg-slate-50 cm:transition-colors cm:disabled:opacity-50 cm:disabled:cursor-not-allowed\"\n >\n {isManualSyncing ? \"Syncing…\" : \"Sync now\"}\n </button>\n </div>\n </div>\n);\n\ninterface ConnectionSectionProps {\n crmName: string;\n crmLogo: ReactNode;\n connectedSince: string | null;\n isDisconnecting: boolean;\n onDisconnect: () => void;\n}\n\nexport const ConnectionSection = ({\n crmName,\n crmLogo,\n connectedSince,\n isDisconnecting,\n onDisconnect,\n}: ConnectionSectionProps) => (\n <div className={IS_HUI ? \"cm-crm-card cm-crm-card--wrap\" : \"cm:rounded-xl cm:border cm:border-slate-200\"}>\n <div className=\"cm:flex cm:items-center cm:justify-between cm:gap-4 cm:px-3.5 cm:py-3.5\">\n <div className=\"cm:flex cm:items-center cm:gap-3 cm:min-w-0\">\n <span className={IS_HUI ? \"cm-crm-app-tile\" : \"cm:flex-shrink-0\"}>{crmLogo}</span>\n <div className=\"cm:flex cm:flex-col cm:min-w-0\">\n <span className=\"cm:text-md cm:font-medium cm:text-slate-700\">\n {crmName} CRM sync\n </span>\n {connectedSince && (\n <span className=\"cm:text-sm cm:text-slate-500 cm:truncate cm:font-normal\">\n Connected since {connectedSince}\n </span>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onDisconnect}\n disabled={isDisconnecting}\n className=\"cm:flex-shrink-0 cm:text-xs cm:font-medium cm:text-red-500 \n cm:cursor-pointer cm:hover:text-red-600 cm:transition-colors \n cm:bg-transparent cm:border-0 cm:disabled:opacity-50 \n cm:disabled:cursor-not-allowed cm:px-2\"\n >\n {isDisconnecting ? \"Disconnecting…\" : \"Disconnect\"}\n </button>\n </div>\n </div>\n);\n","import type { ReactNode } from \"react\";\n\nimport { IS_HUI } from \"@/constants/uiFramework\";\n\nimport type { CrmSyncConfig } from \"@/features/crm-sync/types\";\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\nimport {\n ConnectionSection,\n ManualSyncSection,\n ObjectImportSection,\n} from \"./SettingsTabSections\";\nimport {\n getConnectedSinceLabel,\n getEntityRows,\n getLastSyncedLabel,\n} from \"@/features/crm-sync/utils/settings\";\n\ninterface SettingsTabProps {\n crmName: string;\n crmLogo: ReactNode;\n crmConfig: CrmSyncConfig | null;\n entityType: ENTITY_TYPE;\n onSyncEntity: (entityType: ENTITY_TYPE) => void;\n onDisconnect: () => void;\n onManualSync: () => void;\n isManualSyncing?: boolean;\n isDisconnecting?: boolean;\n actionError?: string | null;\n}\n\nexport const SettingsTab = ({\n crmName,\n crmLogo,\n crmConfig,\n entityType,\n onSyncEntity,\n onDisconnect,\n onManualSync,\n isManualSyncing = false,\n isDisconnecting = false,\n actionError,\n}: SettingsTabProps) => {\n // Only surface the sync row that matches the tab this drawer was opened from\n // — Sync accounts on the Accounts tab, Sync contacts on the Contacts tab.\n const entityRows = getEntityRows(crmConfig, crmName).filter(\n (row) => row.entityType === entityType,\n );\n const lastSyncedLabel = getLastSyncedLabel(crmConfig);\n const connectedSince = getConnectedSinceLabel(crmConfig);\n const isManualSyncDisabled =\n entityType === \"contact\"\n ? !crmConfig?.contact_sync_enabled\n : !crmConfig?.company_sync_enabled;\n\n return (\n <div className={IS_HUI ? \"cm-crm-drawer-body\" : \"cm:flex-1 cm:overflow-y-auto cm:flex cm:flex-col cm:gap-5 cm:pt-9 cm:px-10 cm:pb-10\"}>\n <ObjectImportSection\n crmName={crmName}\n entityRows={entityRows}\n onSyncEntity={onSyncEntity}\n />\n\n <div className=\"cm:border-t cm:border-slate-100\" />\n\n <ManualSyncSection\n lastSyncedLabel={lastSyncedLabel}\n isManualSyncing={isManualSyncing}\n isManualSyncDisabled={isManualSyncDisabled}\n onManualSync={onManualSync}\n />\n\n <ConnectionSection\n crmName={crmName}\n crmLogo={crmLogo}\n connectedSince={connectedSince}\n isDisconnecting={isDisconnecting}\n onDisconnect={onDisconnect}\n />\n\n {actionError && (\n <p className=\"cm:text-xs cm:text-red-500\">{actionError}</p>\n )}\n </div>\n );\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { QUERIES } from \"@/constants/queries\";\nimport { getCrmSyncRuns } from \"@/services/crm-sync\";\n\nexport const PAGE_SIZE = 10;\n\nexport const useCrmSyncRuns = (\n crmProvider: string,\n afterId?: number,\n enabled = true,\n) => {\n return useQuery({\n queryKey: [QUERIES.CRM_SYNC_RUNS, crmProvider, afterId],\n queryFn: () =>\n getCrmSyncRuns({\n crm_provider: crmProvider,\n after_id: afterId,\n limit: PAGE_SIZE,\n }),\n enabled,\n retry: false,\n });\n};\n","import type { ReactNode } from \"react\";\nimport type { ActivityLogItem } from \"@/components/ActivityLog/types\";\nimport type { CrmSyncRun } from \"../types\";\n\nconst ENTITY_LABEL: Record<string, string> = {\n company: \"accounts\",\n contact: \"contacts\",\n};\n\nexport const mapSyncRunToActivityItem = (\n run: CrmSyncRun,\n renderFailureDetails?: (run: CrmSyncRun) => ReactNode,\n): ActivityLogItem => {\n const status: ActivityLogItem[\"status\"] =\n run.status === \"completed\"\n ? run.error_count > 0\n ? \"warning\"\n : \"success\"\n : run.status === \"partially_completed\"\n ? \"warning\"\n : run.status === \"failed\"\n ? \"error\"\n : run.status === \"queued\" || run.status === \"running\"\n ? \"pending\"\n : \"unknown\";\n\n const entityLabel = ENTITY_LABEL[run.entity_type] ?? run.entity_type;\n\n let description: string;\n if (run.status === \"queued\") {\n description = `Queued for sync`;\n } else if (run.status === \"running\") {\n description = `Syncing ${entityLabel}…`;\n } else if (run.status === \"failed\") {\n description = `Sync ${entityLabel} failed`;\n } else if (run.error_count === 0) {\n description = `${run.synced_records.toLocaleString()} ${entityLabel} synced`;\n } else {\n description = `${run.synced_records.toLocaleString()} ${entityLabel} synced — ${run.error_count.toLocaleString()} failed`;\n }\n\n return {\n id: String(run.id),\n status,\n title: status.charAt(0).toUpperCase() + status.slice(1),\n description,\n timestamp: run.started_at ?? run.created_at,\n expandable: run.has_failure_file,\n renderDetails:\n run.has_failure_file && renderFailureDetails\n ? () => renderFailureDetails(run)\n : undefined,\n };\n};\n","import { useRef, useState } from \"react\";\n\nimport DownloadIcon from \"@/assets/download.svg?react\";\nimport { ActivityLog } from \"@/components/ActivityLog\";\nimport { PAGE_SIZE, useCrmSyncRuns } from \"../../../hooks/useCrmSyncRuns\";\nimport { mapSyncRunToActivityItem } from \"../../../utils/activity\";\nimport { getCrmSyncRunFailureFileUrl } from \"@/services/crm-sync\";\nimport type { CrmSyncRun } from \"../../../types\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\n\ninterface ActivityTabProps {\n crmProvider: string;\n}\n\ninterface FailureFileDownloaderProps {\n run: CrmSyncRun;\n}\n\nconst FailureFileDownloader = ({ run }: FailureFileDownloaderProps) => {\n const [isDownloading, setIsDownloading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleDownload = async () => {\n if (isDownloading) return;\n\n setIsDownloading(true);\n setError(null);\n try {\n const res = await getCrmSyncRunFailureFileUrl(run.id);\n const a = document.createElement(\"a\");\n a.href = res.data.presigned_url;\n a.download = `crm_sync_failures_${run.id}.csv`;\n a.click();\n } catch {\n setError(\"Failed to fetch the failure file. Please try again.\");\n } finally {\n setIsDownloading(false);\n }\n };\n\n return (\n <div className=\"cm:flex cm:flex-col cm:gap-2 cm:bg-slate-50 cm:rounded-lg cm:p-3 cm:border cm:border-slate-200\">\n <p className=\"cm:text-xs cm:text-slate-500\">\n Download the per-row failure CSV for this sync run.\n </p>\n {error && <p className=\"cm:text-xs cm:text-red-600\">{error}</p>}\n <button\n onClick={handleDownload}\n disabled={isDownloading}\n className=\"cm-link cm:flex cm:items-center cm:gap-1.5 cm:text-xs cm:font-medium cm:text-blue-600\n cm:hover:underline cm:w-fit cm:cursor-pointer disabled:cm:opacity-50 disabled:cm:cursor-not-allowed\"\n >\n <DownloadIcon width={14} height={14} aria-label=\"Download file\" />\n {isDownloading ? \"Downloading…\" : \"Download failure file\"}\n </button>\n </div>\n );\n};\n\nexport const ActivityTab = ({ crmProvider }: ActivityTabProps) => {\n const [page, setPage] = useState(1);\n const [cursors, setCursors] = useState<Array<number | undefined>>([\n undefined,\n ]);\n const scrollRef = useRef<HTMLDivElement>(null);\n\n const afterCursor = cursors[page - 1];\n const { data, isLoading, isFetching, isError } = useCrmSyncRuns(\n crmProvider,\n afterCursor,\n );\n\n const handlePageChange = (nextPage: number) => {\n const nextCursor = data?.data.next_cursor;\n if (nextPage > page && nextCursor != null) {\n setCursors((prev) => {\n if (prev[page] !== undefined) return prev;\n\n const updated = [...prev];\n updated[page] = nextCursor;\n return updated;\n });\n }\n setPage(nextPage);\n scrollRef.current?.scrollTo({ top: 0 });\n };\n\n const runs = data?.data.runs ?? [];\n const hasNextPage = data?.data.next_cursor != null;\n const totalPages =\n data?.data.total != null\n ? Math.max(1, Math.ceil(data.data.total / PAGE_SIZE))\n : Math.max(cursors.length, hasNextPage ? page + 1 : page);\n const items = isLoading\n ? []\n : runs.map((run) =>\n mapSyncRunToActivityItem(run, (syncRun) => (\n <FailureFileDownloader run={syncRun} />\n )),\n );\n\n if (isError) {\n return (\n <div className=\"cm:flex cm:items-center cm:justify-center cm:py-16\">\n <p className=\"cm:text-sm cm:text-red-600\">\n Failed to load activity. Please try again.\n </p>\n </div>\n );\n }\n\n return (\n <div\n ref={scrollRef}\n className={IS_HUI ? \"cm-crm-drawer-body\" : \"cm:flex-1 cm:overflow-y-auto cm:pt-[26px] cm:px-10 cm:pb-10\"}\n >\n <ActivityLog\n items={items}\n isLoading={isLoading}\n isFetching={isFetching}\n pagination={{\n page,\n totalPages,\n hasNextPage,\n onPageChange: handlePageChange,\n }}\n />\n </div>\n );\n};\n","import { useMemo } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { QUERIES } from \"@/constants/queries\";\nimport { getCrmSyncStatus } from \"@/services/crm-sync\";\nimport type { CrmSyncStatusEntry } from \"@/types/crm\";\n\n/** Default first poll delay once a sync is running. */\nconst DEFAULT_BASE_INTERVAL_MS = 2000;\n/** Default ceiling the poll delay backs off to. */\nconst DEFAULT_MAX_INTERVAL_MS = 30000;\n/** Default multiplier applied to the delay after each poll. */\nconst DEFAULT_BACKOFF_FACTOR = 1.5;\n\nexport interface UseCrmSyncStatusOptions {\n /** Whether the query is active. Defaults to `true`. */\n enabled?: boolean;\n /** Delay (ms) before the first poll while a sync is running. */\n baseInterval?: number;\n /** Maximum delay (ms) the backoff is capped at. */\n maxInterval?: number;\n /**\n * Factor the delay is multiplied by after each poll so the frequency\n * decreases over time. Use `1` for a constant interval.\n */\n backoffFactor?: number;\n}\n\nconst isRunning = (entry: CrmSyncStatusEntry) => entry.status === \"running\" || entry.status === 'queued';\n\n/**\n * Polls `GET /v1/crm/sync/status` and reports, per entity type, whether a\n * sync is currently running.\n *\n * Polling only happens while at least one entry is in the `running` state and\n * stops automatically once none are. The poll delay starts at `baseInterval`\n * and grows by `backoffFactor` on each poll (capped at `maxInterval`), so the\n * frequency decreases the longer a sync runs.\n *\n * Lives in global hooks since sync status is consumed across features.\n */\nexport const useCrmSyncStatus = ({\n enabled = true,\n baseInterval = DEFAULT_BASE_INTERVAL_MS,\n maxInterval = DEFAULT_MAX_INTERVAL_MS,\n backoffFactor = DEFAULT_BACKOFF_FACTOR,\n}: UseCrmSyncStatusOptions = {}) => {\n const query = useQuery({\n queryKey: [QUERIES.CRM_SYNC_STATUS],\n queryFn: getCrmSyncStatus,\n enabled,\n refetchOnWindowFocus: false,\n retry: false,\n refetchInterval: (q) => {\n const entries = q.state.data?.data ?? [];\n const anyRunning = entries.some(isRunning);\n if (!anyRunning) return false;\n\n // `dataUpdateCount` increments on every successful fetch (starting at 1),\n // giving us a deterministic poll count without a side-effecting ref.\n const poll = Math.max(0, q.state.dataUpdateCount - 1);\n return Math.min(baseInterval * backoffFactor ** poll, maxInterval);\n },\n refetchIntervalInBackground: true,\n });\n\n const entries = useMemo(() => query.data?.data ?? [], [query.data]);\n\n const syncingByEntity = useMemo(() => {\n const map: Record<string, boolean> = {};\n for (const entry of entries) {\n map[entry.entity_type] = map[entry.entity_type] || isRunning(entry);\n }\n return map;\n }, [entries]);\n\n return {\n ...query,\n /** Raw status entries from the latest response. */\n entries,\n /** Whether any entity_type is currently syncing. */\n isSyncing: entries.some(isRunning),\n /** Whether a `contact` sync is currently running. */\n contactSyncing: !!syncingByEntity.contact,\n /** Whether a `company` sync is currently running. */\n companySyncing: !!syncingByEntity.company,\n /** Per-entity-type running flags, e.g. `{ contact: true, company: false }`. */\n syncingByEntity,\n };\n};\n\nexport const useCrmSyncStatusRefetch = () => {\n const queryClient = useQueryClient();\n\n const refetchStatus = () => {\n queryClient.invalidateQueries({ queryKey: [QUERIES.CRM_SYNC_STATUS] });\n }\n\n return { refetchStatus }\n}\n","import { useMemo, useState, type ReactNode } from \"react\";\nimport axios from \"axios\";\n\n\nimport { Drawer } from \"@/components/Drawer\";\nimport { DrawerHeader } from \"@/components/Drawer/Header\";\nimport { TabBar, TabButton } from \"@/components/Drawer/TabBar\";\nimport { TabActivityGlyph, TabSettingsGlyph } from \"@/components/Icon/glyphs\";\n\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\nimport { useApiToasts } from \"@/hooks/useApiToasts\";\nimport { getEntityLabel } from \"@/features/crm-sync/utils/settings\";\nimport { useCrmConfigs } from \"@/queries/useCrmConfigs\";\nimport {\n useDisconnectCrm,\n useTriggerCrmSync,\n} from \"../../hooks/useCrmSyncMutations\";\nimport { DisconnectCrmModal } from \"./DisconnectCrmModal\";\nimport { FieldMappingStep } from \"./FieldMappingStep\";\nimport { SettingsTab } from \"./tabs/SettingsTab\";\nimport { ActivityTab } from \"./tabs/ActivityTab\";\nimport { useCrmSyncStatusRefetch } from \"@/hooks/useCrmSyncStatus\";\n\ntype SettingsDrawerTab = \"settings\" | \"activity\";\n\ninterface CrmSettingsDrawerProps {\n open: boolean;\n onClose: () => void;\n crmProvider: string;\n crmName: string;\n crmLogo: ReactNode;\n entityType: ENTITY_TYPE;\n}\n\nexport const CrmSettingsDrawer = ({\n open,\n onClose,\n crmProvider,\n crmName,\n crmLogo,\n entityType,\n}: CrmSettingsDrawerProps) => {\n const [activeTab, setActiveTab] = useState<SettingsDrawerTab>(\"settings\");\n const [fieldMappingEntity, setFieldMappingEntity] =\n useState<ENTITY_TYPE | null>(null);\n const [isManualSyncing, setIsManualSyncing] = useState(false);\n const [isDisconnecting, setIsDisconnecting] = useState(false);\n const [showDisconnectModal, setShowDisconnectModal] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n const { showSuccessToast, showErrorToast } = useApiToasts();\n const { data: crmConfigs, refetch: refetchConfigs } = useCrmConfigs(open);\n const { refetchStatus } = useCrmSyncStatusRefetch();\n const triggerCrmSyncMutation = useTriggerCrmSync();\n const disconnectCrmMutation = useDisconnectCrm();\n\n const crmConfig = useMemo(\n () =>\n crmConfigs?.data.find((config) => config.crm_provider === crmProvider) ??\n null,\n [crmConfigs, crmProvider],\n );\n\n const handleClose = () => {\n setFieldMappingEntity(null);\n onClose();\n };\n const handleManualSync = async () => {\n setIsManualSyncing(true);\n setActionError(null);\n try {\n await triggerCrmSyncMutation.mutateAsync({ crmProvider, entityType });\n showSuccessToast(`Sync started for ${getEntityLabel(entityType)}`);\n refetchConfigs();\n refetchStatus();\n } catch (err) {\n let errorMessage = \"Failed to trigger sync. Please try again.\";\n if (axios.isAxiosError(err) && err.response?.status === 404) {\n errorMessage = `No active CRM config found. Please reconnect ${crmName}.`;\n }\n setActionError(errorMessage);\n showErrorToast(errorMessage);\n } finally {\n setIsManualSyncing(false);\n }\n };\n\n const handleDisconnect = async (retainData: boolean) => {\n setIsDisconnecting(true);\n setActionError(null);\n try {\n await disconnectCrmMutation.mutateAsync({ crmProvider, retainData });\n showSuccessToast(`${crmName} disconnected successfully`);\n setShowDisconnectModal(false);\n refetchConfigs();\n refetchStatus();\n handleClose();\n } catch {\n const errorMessage = \"Failed to disconnect. Please try again.\";\n setActionError(errorMessage);\n showErrorToast(errorMessage);\n } finally {\n setIsDisconnecting(false);\n }\n };\n\n const onSync = () => {\n refetchConfigs();\n refetchStatus();\n }\n\n return (\n <>\n <Drawer\n /*\n * Hidden while the disconnect modal is up.\n *\n * The modal is a centred dialog at z-1100 and this drawer is a 680px\n * panel pinned to the right edge, so the two overlapped: the drawer sat\n * lit behind the modal's backdrop, half-covered, and the eye read two\n * competing surfaces. The same pattern the field-mapping step already\n * uses (`!fieldMappingEntity`) — one surface at a time.\n *\n * Only the drawer's `open` changes, so its state survives; dismissing\n * the modal brings it back exactly as it was.\n */\n open={open && !fieldMappingEntity && !showDisconnectModal}\n onClose={handleClose}\n position=\"right\"\n width={680}\n >\n <div className=\"cm:flex cm:flex-col cm:h-full\">\n <DrawerHeader\n title={\n <div className=\"cm:flex cm:items-center cm:gap-2.5 cm:min-w-0 cm:min-h-11\">\n <span className=\"cm:flex-shrink-0 cm:[&>svg]:h-[32px]! cm:[&>svg]:w-[32px]!\">{crmLogo}</span>\n <span className=\"cm:truncate cm:text-slate-700 cm:text-lg cm:font-medium\">\n {crmName} settings\n </span>\n </div>\n }\n onClose={handleClose}\n className=\"cm:pt-3! cm:pr-5! cm:pb-3! cm:pl-7!\"\n titleClassName=\"cm:flex-1! cm:min-w-0! cm:pl-3!\"\n />\n\n <TabBar>\n <TabButton\n active={activeTab === \"settings\"}\n onClick={() => setActiveTab(\"settings\")}\n icon={<TabSettingsGlyph className=\"cm-drawer-tab__icon\" />}\n label=\"Settings\"\n />\n <TabButton\n active={activeTab === \"activity\"}\n onClick={() => setActiveTab(\"activity\")}\n icon={<TabActivityGlyph className=\"cm-drawer-tab__icon\" />}\n label=\"Activity log\"\n />\n </TabBar>\n\n {activeTab === \"settings\" ? (\n <SettingsTab\n crmName={crmName}\n crmLogo={crmLogo}\n crmConfig={crmConfig}\n entityType={entityType}\n onSyncEntity={setFieldMappingEntity}\n onManualSync={handleManualSync}\n onDisconnect={() => setShowDisconnectModal(true)}\n isManualSyncing={isManualSyncing}\n isDisconnecting={isDisconnecting}\n actionError={actionError}\n />\n ) : (\n <ActivityTab crmProvider={crmProvider} />\n )}\n </div>\n </Drawer>\n\n {fieldMappingEntity && (\n <FieldMappingStep\n open={true}\n onClose={handleClose}\n onExit={handleClose}\n onSync={onSync}\n entityType={fieldMappingEntity}\n crmProvider={crmProvider}\n crmName={crmName}\n crmLogo={crmLogo}\n />\n )}\n\n <DisconnectCrmModal\n open={showDisconnectModal}\n onClose={() => setShowDisconnectModal(false)}\n onConfirm={handleDisconnect}\n crmName={crmName}\n isLoading={isDisconnecting}\n />\n </>\n );\n};\n","import { create } from \"zustand\";\n\ninterface CrmSyncState {\n isSalesforceConnected: boolean;\n isHubspotConnected: boolean;\n setConnectedStatuses: (sf: boolean, hs: boolean) => void;\n}\n\nexport const useCrmSyncStore = create<CrmSyncState>((set) => ({\n isSalesforceConnected: false,\n isHubspotConnected: false,\n setConnectedStatuses: (isSalesforceConnected, isHubspotConnected) =>\n set({ isSalesforceConnected, isHubspotConnected }),\n}));\n","import { useEffect } from \"react\";\n\nimport { useCrmSyncStore } from \"@/stores/crmSync\";\nimport type { EnabledConnector } from \"@/services/crm-sync/connectorApi\";\nimport type { CrmSyncConfig } from \"@/features/crm-sync/types\";\nimport { CRM_PROVIDER_TYPES, HUBSPOT_TYPE, SALESFORCE_TYPE } from \"../constants\";\nimport { useEnabledConnectors } from \"@/queries/useEnabledConnectors\";\nimport { useCrmConfigs } from \"@/queries/useCrmConfigs\";\n\nexport type CrmConnectionBadge =\n | \"connected\"\n | \"pending_auth\"\n | \"disconnecting\"\n | null;\nexport type CrmConnectionRoute = \"settings\" | \"connect\";\n\nexport interface CrmConnectionState {\n crmType: string;\n config: CrmSyncConfig | null;\n connector: EnabledConnector | null;\n /** CI says the connector backing this config is authenticated. */\n ugAuthenticated: boolean;\n /** CM config exists and is explicitly active. */\n configActive: boolean;\n /** The dropdown badge state. */\n badge: CrmConnectionBadge;\n /** Connected badge state. */\n isConnected: boolean;\n /** Pending auth badge state. */\n isPendingAuth: boolean;\n /** Disconnect is in progress. */\n isDisconnecting: boolean;\n /** Where a click on this CRM item should land. */\n route: CrmConnectionRoute;\n /** Whether this CRM should prevent connecting another CRM. */\n locksOtherCrm: boolean;\n ciConnectorId: string | null;\n}\n\nconst findConnectorForConfig = (\n crmType: string,\n connectors: EnabledConnector[],\n config: CrmSyncConfig | null,\n) => {\n if (config?.ci_connector_id) {\n return (\n connectors.find(\n (c) => c.id === config.ci_connector_id && c.type === crmType,\n ) ?? null\n );\n }\n\n return connectors.find((c) => c.type === crmType) ?? null;\n};\n\nconst resolveConnection = (\n crmType: string,\n connectors: EnabledConnector[],\n configs: CrmSyncConfig[],\n): CrmConnectionState => {\n const config = configs.find((c) => c.crm_provider === crmType) ?? null;\n const connector = findConnectorForConfig(crmType, connectors, config);\n\n // `isAuthenticated` is the connected signal. `isEnabled` is the connector-\n // module toggle and is independent of auth (an Admin-Panel-connected CRM can\n // be isAuthenticated: true while isEnabled: false), so it must NOT gate this.\n const ugAuthenticated = !!connector?.isAuthenticated;\n const configActive = config?.status === \"active\";\n const configDisconnecting = config?.status === \"disconnecting\";\n const badge: CrmConnectionBadge = configDisconnecting\n ? \"disconnecting\"\n : (configActive && ugAuthenticated) ||\n (config?.status === \"pending_auth\" && ugAuthenticated)\n ? \"connected\"\n : configActive && !ugAuthenticated\n ? \"pending_auth\"\n : null;\n\n return {\n crmType,\n config,\n connector,\n ugAuthenticated,\n configActive,\n badge,\n isConnected: badge === \"connected\",\n isPendingAuth: badge === \"pending_auth\",\n isDisconnecting: badge === \"disconnecting\",\n route: configActive && ugAuthenticated ? \"settings\" : \"connect\",\n locksOtherCrm: badge !== null,\n ciConnectorId: config?.ci_connector_id ?? connector?.id ?? null,\n };\n};\n\n/**\n * Resolves Salesforce/HubSpot connection state from BOTH CI (/ug) and CM\n * (/v1/crm/configs). Display and routing are intentionally derived separately:\n * an authenticated pending_auth config can show Connected but still open the\n * login step so the user can finalize CM config activation.\n */\nexport const useCrmConnections = (enabled = true) => {\n const setConnectedStatuses = useCrmSyncStore((s) => s.setConnectedStatuses);\n\n const connectorsQuery = useEnabledConnectors();\n const configsQuery = useCrmConfigs(enabled);\n\n const connectors = connectorsQuery.data ?? [];\n const configs = configsQuery.data?.data ?? [];\n\n const connectionsByType = CRM_PROVIDER_TYPES.reduce<\n Record<string, CrmConnectionState>\n >((acc, crmType) => {\n acc[crmType] = resolveConnection(crmType, connectors, configs);\n return acc;\n }, {});\n const salesforce = connectionsByType[SALESFORCE_TYPE];\n const hubspot = connectionsByType[HUBSPOT_TYPE];\n\n useEffect(() => {\n setConnectedStatuses(salesforce.isConnected, hubspot.isConnected);\n }, [salesforce.isConnected, hubspot.isConnected, setConnectedStatuses]);\n\n return {\n salesforce,\n hubspot,\n connectionsByType,\n isLoading: connectorsQuery.isLoading || configsQuery.isLoading,\n };\n};\n","import * as React from \"react\";\nconst SvgHubspot = (props) => /* @__PURE__ */ React.createElement(\"svg\", { height: 2500, viewBox: \"6.20856283 .64498824 244.26943717 251.24701176\", width: 2500, xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"m191.385 85.694v-29.506a22.722 22.722 0 0 0 13.101-20.48v-.677c0-12.549-10.173-22.722-22.721-22.722h-.678c-12.549 0-22.722 10.173-22.722 22.722v.677a22.722 22.722 0 0 0 13.101 20.48v29.506a64.342 64.342 0 0 0 -30.594 13.47l-80.922-63.03c.577-2.083.878-4.225.912-6.375a25.6 25.6 0 1 0 -25.633 25.55 25.323 25.323 0 0 0 12.607-3.43l79.685 62.007c-14.65 22.131-14.258 50.974.987 72.7l-24.236 24.243c-1.96-.626-4-.959-6.057-.987-11.607.01-21.01 9.423-21.007 21.03.003 11.606 9.412 21.014 21.018 21.017 11.607.003 21.02-9.4 21.03-21.007a20.747 20.747 0 0 0 -.988-6.056l23.976-23.985c21.423 16.492 50.846 17.913 73.759 3.562 22.912-14.352 34.475-41.446 28.985-67.918-5.49-26.473-26.873-46.734-53.603-50.792m-9.938 97.044a33.17 33.17 0 1 1 0-66.316c17.85.625 32 15.272 32.01 33.134.008 17.86-14.127 32.522-31.977 33.165\", fill: \"#ff7a59\" }));\nexport default SvgHubspot;\n","import * as React from \"react\";\nconst SvgSalesforce = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 2500, height: 1750, viewBox: \"0.5 0.5 999 699.242\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { fill: \"#00A1E0\", d: \"M416.224 76.763c32.219-33.57 77.074-54.391 126.682-54.391 65.946 0 123.48 36.772 154.12 91.361 26.626-11.896 56.098-18.514 87.106-18.514 118.94 0 215.368 97.268 215.368 217.247 0 119.993-96.428 217.261-215.368 217.261a213.735 213.735 0 0 1-42.422-4.227c-26.981 48.128-78.397 80.646-137.412 80.646-24.705 0-48.072-5.706-68.877-15.853-27.352 64.337-91.077 109.448-165.348 109.448-77.344 0-143.261-48.939-168.563-117.574-11.057 2.348-22.513 3.572-34.268 3.572C75.155 585.74.5 510.317.5 417.262c0-62.359 33.542-116.807 83.378-145.937-10.26-23.608-15.967-49.665-15.967-77.06C67.911 87.25 154.79.5 261.948.5c62.914 0 118.827 29.913 154.276 76.263\" }), /* @__PURE__ */ React.createElement(\"path\", { fill: \"#FFF\", d: \"M145.196 363.11c-.626 1.637.228 1.979.427 2.263 1.878 1.366 3.786 2.349 5.707 3.444 10.189 5.407 19.81 6.986 29.871 6.986 20.492 0 33.214-10.9 33.214-28.447v-.341c0-16.224-14.358-22.115-27.835-26.37l-1.75-.569c-10.161-3.302-18.927-6.147-18.927-12.836v-.355c0-5.721 5.123-9.934 13.064-9.934 8.823 0 19.297 2.932 26.042 6.66 0 0 1.978 1.281 2.704-.64.398-1.025 3.814-10.218 4.17-11.214.384-1.082-.299-1.879-.996-2.306-7.699-4.682-18.344-7.884-29.358-7.884l-2.049.014c-18.756 0-31.848 11.328-31.848 27.565v.342c0 17.119 14.444 22.669 27.978 26.54l2.177.669c9.862 3.031 18.358 5.635 18.358 12.58v.342c0 6.347-5.521 11.071-14.43 11.071-3.458 0-14.487-.071-26.398-7.6-1.438-.84-2.277-1.451-3.387-2.12-.583-.37-2.049-1.011-2.689.925l-4.045 11.215zM445.194 363.11c-.626 1.637.228 1.979.427 2.263 1.878 1.366 3.786 2.349 5.706 3.444 10.189 5.407 19.811 6.986 29.871 6.986 20.492 0 33.215-10.9 33.215-28.447v-.341c0-16.224-14.359-22.115-27.836-26.37l-1.75-.569c-10.161-3.302-18.928-6.147-18.928-12.836v-.355c0-5.721 5.123-9.934 13.064-9.934 8.823 0 19.297 2.932 26.043 6.66 0 0 1.978 1.281 2.703-.64.398-1.025 3.814-10.218 4.17-11.214.385-1.082-.299-1.879-.996-2.306-7.699-4.682-18.344-7.884-29.358-7.884l-2.05.014c-18.756 0-31.848 11.328-31.848 27.565v.342c0 17.119 14.444 22.669 27.978 26.54l2.177.669c9.862 3.031 18.373 5.635 18.373 12.58v.342c0 6.347-5.536 11.071-14.445 11.071-3.457 0-14.486-.071-26.397-7.6-1.438-.84-2.291-1.423-3.372-2.12-.371-.242-2.107-.911-2.705.925l-4.042 11.215zM649.995 328.74c0 9.919-1.85 17.731-5.493 23.253-3.601 5.465-9.051 8.126-16.649 8.126-7.613 0-13.035-2.647-16.579-8.126-3.587-5.507-5.407-13.334-5.407-23.253 0-9.904 1.82-17.703 5.407-23.168 3.544-5.407 8.966-8.04 16.579-8.04 7.599 0 13.049 2.633 16.664 8.04 3.629 5.464 5.478 13.263 5.478 23.168m17.106-18.386c-1.68-5.679-4.298-10.688-7.784-14.857-3.487-4.184-7.898-7.542-13.136-9.99-5.223-2.433-11.398-3.671-18.328-3.671-6.945 0-13.121 1.238-18.344 3.671-5.237 2.448-9.648 5.807-13.149 9.99-3.472 4.184-6.091 9.193-7.784 14.857-1.665 5.649-2.505 11.825-2.505 18.386s.84 12.751 2.505 18.386c1.693 5.664 4.298 10.674 7.799 14.857 3.486 4.184 7.912 7.528 13.135 9.904 5.236 2.377 11.398 3.586 18.344 3.586 6.93 0 13.092-1.209 18.328-3.586 5.223-2.376 9.648-5.721 13.136-9.904 3.486-4.17 6.104-9.179 7.784-14.857 1.68-5.649 2.519-11.84 2.519-18.386s-.841-12.737-2.52-18.386M807.568 357.47c-.569-1.665-2.177-1.039-2.177-1.039-2.49.954-5.138 1.836-7.955 2.277-2.861.44-6.006.669-9.379.669-8.281 0-14.856-2.462-19.566-7.329-4.725-4.867-7.372-12.736-7.344-23.381.029-9.691 2.362-16.978 6.561-22.527 4.17-5.521 10.517-8.354 18.984-8.354 7.059 0 12.438.811 18.072 2.59 0 0 1.352.583 1.992-1.181 1.494-4.156 2.604-7.13 4.198-11.698.456-1.295-.654-1.85-1.053-2.007-2.22-.868-7.457-2.276-11.413-2.874-3.7-.569-8.026-.868-12.836-.868-7.188 0-13.591 1.224-19.069 3.672-5.465 2.433-10.104 5.791-13.775 9.976-3.672 4.184-6.461 9.192-8.325 14.856-1.85 5.649-2.789 11.854-2.789 18.415 0 14.188 3.828 25.657 11.385 34.054 7.57 8.425 18.941 12.708 33.77 12.708 8.766 0 17.76-1.778 24.221-4.326 0 0 1.238-.598.697-2.034l-4.199-11.599zM837.497 319.238c.811-5.507 2.334-10.09 4.682-13.661 3.544-5.422 8.951-8.396 16.551-8.396s12.623 2.988 16.223 8.396c2.391 3.571 3.43 8.354 3.843 13.661h-41.299zm57.592-12.111c-1.451-5.479-5.052-11.015-7.414-13.548-3.729-4.013-7.371-6.816-10.986-8.382-4.725-2.021-10.389-3.358-16.593-3.358-7.229 0-13.79 1.21-19.112 3.714-5.336 2.505-9.818 5.921-13.334 10.176-3.516 4.24-6.162 9.292-7.842 15.027-1.693 5.707-2.547 11.926-2.547 18.485 0 6.675.883 12.894 2.633 18.486 1.765 5.636 4.582 10.602 8.396 14.714 3.799 4.142 8.695 7.387 14.558 9.648 5.821 2.249 12.894 3.416 21.019 3.401 16.722-.057 25.53-3.785 29.159-5.792.641-.355 1.253-.981.483-2.774l-3.785-10.603c-.568-1.579-2.177-.996-2.177-.996-4.142 1.537-10.032 4.298-23.766 4.27-8.979-.014-15.64-2.661-19.81-6.803-4.283-4.24-6.375-10.474-6.745-19.268l57.905.057s1.522-.028 1.68-1.509c.057-.624 1.993-11.895-1.722-24.945M373.762 319.238c.825-5.507 2.334-10.09 4.682-13.661 3.543-5.422 8.951-8.396 16.55-8.396s12.623 2.988 16.237 8.396c2.376 3.571 3.415 8.354 3.828 13.661h-41.297zm57.577-12.111c-1.451-5.479-5.037-11.015-7.399-13.548-3.729-4.013-7.372-6.816-10.986-8.382-4.725-2.021-10.388-3.358-16.593-3.358-7.215 0-13.79 1.21-19.112 3.714-5.336 2.505-9.819 5.921-13.334 10.176-3.515 4.24-6.162 9.292-7.841 15.027-1.679 5.707-2.547 11.926-2.547 18.485 0 6.675.882 12.894 2.633 18.486 1.765 5.636 4.583 10.602 8.396 14.714 3.8 4.142 8.695 7.387 14.558 9.648 5.821 2.249 12.893 3.416 21.019 3.401 16.721-.057 25.53-3.785 29.159-5.792.641-.355 1.252-.981.484-2.774l-3.771-10.603c-.584-1.579-2.191-.996-2.191-.996-4.141 1.537-10.019 4.298-23.78 4.27-8.965-.014-15.625-2.661-19.795-6.803-4.284-4.24-6.375-10.474-6.746-19.268l57.905.057s1.522-.028 1.679-1.509c.055-.624 1.99-11.895-1.738-24.945M248.601 357.153c-2.263-1.808-2.576-2.263-3.344-3.43-1.139-1.779-1.722-4.312-1.722-7.528 0-5.095 1.679-8.752 5.166-11.214-.042.015 4.981-4.34 16.792-4.184 8.296.114 15.71 1.338 15.71 1.338v26.327h.014s-7.357 1.579-15.639 2.077c-11.783.712-17.02-3.4-16.977-3.386m23.039-40.686c-2.348-.171-5.394-.271-9.037-.271-4.966 0-9.762.626-14.259 1.836-4.525 1.209-8.595 3.103-12.096 5.606a27.927 27.927 0 0 0-8.396 9.549c-2.049 3.814-3.088 8.311-3.088 13.349 0 5.123.882 9.577 2.647 13.221 1.765 3.657 4.312 6.702 7.556 9.051 3.216 2.348 7.187 4.069 11.797 5.108 4.54 1.039 9.691 1.565 15.327 1.565 5.934 0 11.854-.483 17.589-1.466 5.678-.968 12.651-2.377 14.586-2.817a146.25 146.25 0 0 0 4.056-1.039c1.438-.355 1.324-1.893 1.324-1.893l-.029-52.952c0-11.613-3.102-20.223-9.207-25.559-6.077-5.322-15.028-8.013-26.597-8.013-4.341 0-11.328.599-15.512 1.438 0 0-12.651 2.448-17.86 6.518 0 0-1.138.712-.512 2.306l4.099 11.015c.512 1.423 1.893.939 1.893.939s.441-.171.954-.47c11.143-6.062 25.231-5.877 25.231-5.877 6.262 0 11.072 1.252 14.316 3.742 3.159 2.419 4.767 6.076 4.767 13.789v2.448c-4.981-.711-9.549-1.123-9.549-1.123M738.669 286.631c.44-1.31-.484-1.936-.869-2.078-.981-.384-5.905-1.423-9.705-1.665-7.271-.441-11.312.783-14.928 2.405-3.586 1.622-7.57 4.24-9.791 7.215v-7.044c0-.982-.697-1.765-1.665-1.765h-14.843c-.967 0-1.664.782-1.664 1.765v86.366c0 .968.797 1.765 1.764 1.765h15.213a1.76 1.76 0 0 0 1.75-1.765v-43.147c0-5.792.641-11.569 1.922-15.198 1.252-3.587 2.96-6.461 5.066-8.525 2.12-2.049 4.525-3.486 7.158-4.297 2.689-.826 5.663-1.096 7.77-1.096 3.031 0 6.361.782 6.361.782 1.109.128 1.736-.555 2.105-1.565.997-2.647 3.815-10.574 4.356-12.153\" }), /* @__PURE__ */ React.createElement(\"path\", { fill: \"#FFF\", d: \"M595.874 246.603c-1.85-.569-3.529-.954-5.721-1.366-2.221-.398-4.867-.598-7.869-.598-10.475 0-18.729 2.96-24.52 8.794-5.764 5.807-9.678 14.644-11.642 26.271l-.712 3.913h-13.148s-1.594-.057-1.936 1.68l-2.148 12.053c-.157 1.139.342 1.864 1.878 1.864h12.794l-12.979 72.463c-1.011 5.835-2.178 10.631-3.473 14.273-1.267 3.587-2.504 6.276-4.041 8.24-1.48 1.879-2.875 3.273-5.295 4.084-1.992.669-4.297.982-6.816.982-1.395 0-3.258-.229-4.639-.513-1.366-.271-2.092-.569-3.131-1.011 0 0-1.494-.568-2.092.926-.47 1.238-3.885 10.615-4.298 11.769-.398 1.152.171 2.049.896 2.319 1.708.598 2.974.996 5.294 1.551 3.217.755 5.934.797 8.481.797 5.322 0 10.189-.754 14.217-2.205 4.042-1.466 7.57-4.014 10.701-7.457 3.373-3.729 5.493-7.628 7.515-12.964 2.006-5.266 3.729-11.812 5.094-19.439l13.05-73.815h19.069s1.607.057 1.936-1.693l2.162-12.039c.143-1.152-.341-1.864-1.893-1.864h-18.514c.1-.412.939-6.931 3.06-13.063.911-2.604 2.618-4.725 4.056-6.177 1.424-1.423 3.06-2.433 4.854-3.017 1.835-.598 3.928-.882 6.219-.882 1.736 0 3.457.199 4.752.469 1.793.385 2.49.584 2.961.727 1.893.569 2.148.014 2.519-.896l4.426-12.153c.455-1.312-.669-1.867-1.067-2.023M337.194 371.834c0 .968-.697 1.751-1.665 1.751h-15.355c-.968 0-1.651-.783-1.651-1.751v-123.58c0-.967.683-1.75 1.651-1.75h15.355c.968 0 1.665.783 1.665 1.75v123.58z\" }));\nexport default SvgSalesforce;\n","import type { ReactNode } from \"react\";\n\nimport HubspotDropdownLogo from \"@/assets/hubspot.svg?react\";\nimport SalesforceLogo from \"@/assets/salesforce.svg?react\";\nimport { CDN_ASSETS } from \"@/constants/cdnAssets\";\n\nimport { HUBSPOT_TYPE, SALESFORCE_TYPE } from \"./constants\";\n\nexport type CrmProviderConfig = {\n type: string;\n name: string;\n dropdownLogo: ReactNode;\n drawerLogo: ReactNode;\n connectIllustration: ReactNode;\n /**\n * Copy shown on the connect screen. `connectDescription` is optional and\n * defaults to a name-templated string; `prerequisites` are connector-specific\n * and render under \"Before you connect, make sure you have:\".\n */\n connectDescription?: string;\n prerequisites: string[];\n};\n\nexport const CRM_PROVIDER_CONFIGS: CrmProviderConfig[] = [\n {\n type: SALESFORCE_TYPE,\n name: \"Salesforce\",\n dropdownLogo: <SalesforceLogo width={30} height={24} aria-label=\"Salesforce\" />,\n drawerLogo: <SalesforceLogo width={28} height={20} aria-hidden=\"true\" />,\n connectIllustration: (\n <img\n src={CDN_ASSETS.salesforceSync}\n width={528}\n height={276}\n className=\"cm:rounded-xl\"\n aria-hidden=\"true\"\n />\n ),\n connectDescription:\n \"Map fields from Salesforce to Hiver so customer details stay up to date.\",\n prerequisites: [\n \"Admin access in Salesforce\",\n \"Permission to create connected apps in Salesforce\",\n \"Access to the email for your Salesforce admin account\",\n ],\n },\n {\n type: HUBSPOT_TYPE,\n name: \"HubSpot\",\n dropdownLogo: (\n <HubspotDropdownLogo width={24} height={24} aria-label=\"HubSpot\" />\n ),\n drawerLogo: (\n <img src={CDN_ASSETS.hubspotLogo} width={28} height={20} aria-hidden=\"true\" />\n ),\n connectIllustration: (\n <img\n src={CDN_ASSETS.hubspotIllustration}\n width={528}\n height={276}\n className=\"cm:rounded-xl\"\n aria-hidden=\"true\"\n />\n ),\n connectDescription:\n \"Map fields from HubSpot to Hiver so customer details stay up to date.\",\n prerequisites: [\n \"Admin access in HubSpot\",\n \"A HubSpot developer account with permission to create apps\",\n ],\n },\n];\n","import { Button } from \"hiver-ui-kit-extended\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\nimport { useEffect, useRef, useState } from \"react\";\n\nimport GreenTickIcon from \"@/assets/green_tick.svg?react\";\nimport ChevronIcon from \"@/assets/chev_Arrow_Right-light.svg?react\";\nimport { DownloadGlyph } from \"@/components/Icon/glyphs\";\nimport { ImportCSVDrawer } from \"../drawer\";\nimport { CrmConnectDrawer } from \"@/features/crm-sync/components/shared/CrmConnectDrawer\";\nimport { CrmSettingsDrawer } from \"@/features/crm-sync/components/shared/CrmSettingsDrawer\";\nimport { useCrmSyncStatus } from \"@/hooks/useCrmSyncStatus\";\nimport {\n useCrmConnections,\n type CrmConnectionBadge,\n type CrmConnectionState,\n} from \"@/features/crm-sync/hooks/useCrmConnections\";\nimport { CRM_PROVIDER_CONFIGS } from \"@/features/crm-sync/providerConfig\";\nimport { useFeature } from \"@/hooks/useFeature\";\nimport { FEATURES } from \"@/constants/features\";\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\n\nconst ConnectedBadge = () => (\n <span\n className=\"cm:inline-flex cm:items-center cm:gap-1 cm:py-0 cm:pl-1 cm:pr-1.5 cm:text-xs cm:font-medium \n cm:text-[#1F473E] cm:border-[0.5px] cm:border-[#52B39E] cm:rounded-sm cm:bg-[#DDEFEB] cm:flex-shrink-0\"\n >\n <GreenTickIcon width={12} height={12} aria-hidden=\"true\" />\n Connected\n </span>\n);\n\nconst PendingAuthBadge = () => (\n <span\n className=\"cm:inline-flex cm:items-center cm:py-0 cm:pl-1 cm:pr-1.5 cm:text-xs \n cm:font-medium cm:text-amber-700 cm:border-[0.5px] cm:border-amber-300 \n cm:bg-amber-50 cm:rounded-sm cm:flex-shrink-0\"\n >\n Pending Auth\n </span>\n);\n\nconst DisconnectingBadge = () => (\n <span\n className=\"cm:inline-flex cm:items-center cm:py-0 cm:pl-1 cm:pr-1.5 cm:text-xs \n cm:font-medium cm:text-slate-600 cm:border-[0.5px] \n cm:border-slate-300 cm:bg-slate-50 cm:rounded-sm cm:flex-shrink-0\"\n >\n Disconnecting\n </span>\n);\n\nconst SyncingBadge = () => (\n <span\n className=\"cm:inline-flex cm:items-center cm:gap-1 cm:py-0 cm:pl-1 cm:pr-1.5 cm:text-xs\n cm:font-medium cm:text-blue-600 cm:border-[0.5px] cm:border-blue-300\n cm:bg-white cm:rounded-md cm:flex-shrink-0\"\n >\n <svg\n width={12}\n height={12}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"cm:animate-spin\"\n aria-hidden=\"true\"\n >\n {/* Scale about the center (12,12) to set the circle radius to 6 (9 → 6);\n stroke width is scaled up so it still renders at 3. Open arc (no\n arrowhead) leaves a gap so the rotation stays visible. */}\n <g transform=\"translate(4 4) scale(0.667)\">\n <path d=\"M20.49 15a9 9 0 1 1-2.12-9.36\" strokeWidth={4.5} />\n </g>\n </svg>\n Syncing\n </span>\n);\n\nconst StatusBadge = ({ badge }: { badge: CrmConnectionBadge }) => {\n if (badge === \"connected\") return <ConnectedBadge />;\n if (badge === \"pending_auth\") return <PendingAuthBadge />;\n if (badge === \"disconnecting\") return <DisconnectingBadge />;\n return null;\n};\n\nconst getCrmDisabledTooltip = (\n crmName: string,\n state: CrmConnectionState,\n lockingCrmName: string | null,\n syncing: boolean,\n) => {\n if (syncing) return \"Syncing in progress\";\n if (state.isDisconnecting) return `${crmName} is disconnecting`;\n if (lockingCrmName) {\n return `Disable ${lockingCrmName} to connect ${crmName}`;\n }\n return undefined;\n};\n\ninterface DropdownItemProps {\n icon: React.ReactNode;\n label: string;\n description: string;\n badge?: CrmConnectionBadge;\n syncing?: boolean;\n disabled?: boolean;\n disabledTooltip?: string;\n onClick: () => void;\n}\n\nconst DropdownItem = ({\n icon,\n label,\n description,\n badge = null,\n syncing = false,\n disabled,\n disabledTooltip,\n onClick,\n}: DropdownItemProps) => (\n <div className=\"cm:relative cm:group\">\n <button\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n className={`cm-import-sync-option cm:w-full cm:flex cm:items-center cm:gap-3 cm:px-2 cm:py-2 cm:rounded-lg cm:text-left cm:border cm:border-[#edf1f6]\n ${\n disabled\n ? \"cm:opacity-50 cm:cursor-not-allowed\"\n : \"cm:cursor-pointer cm:hover:bg-slate-50\"\n }`}\n >\n <div className=\"cm-import-sync-option__icon cm:flex-shrink-0 cm:w-10 cm:h-10 cm:rounded-lg cm:bg-slate-100 cm:flex cm:items-center cm:justify-center\">\n {icon}\n </div>\n <div className=\"cm:flex-1 cm:min-w-0\">\n <div className=\"cm:flex cm:items-center cm:gap-2\">\n <p className=\"cm-import-sync-option__label cm:text-md cm:font-medium cm:text-slate-700\">{label}</p>\n {syncing ? <SyncingBadge /> : <StatusBadge badge={badge} />}\n </div>\n <p className=\"cm-import-sync-option__desc cm:text-sm cm:text-slate-500 cm:mt-0.5\">{description}</p>\n </div>\n <ChevronIcon\n width={16}\n height={16}\n className=\"cm-import-sync-option__chevron cm:flex-shrink-0 cm:opacity-40\"\n />\n </button>\n\n {disabled && disabledTooltip && (\n <div className=\"cm:absolute cm:left-1/2 cm:-translate-x-1/2 cm:top-full cm:mt-1.5 cm:z-50 cm:hidden cm:group-hover:block cm:pointer-events-none\">\n <div className=\"cm-tooltip cm:relative cm:text-xs cm:px-3 cm:py-2 cm:rounded-lg cm:whitespace-nowrap\">\n <div className=\"cm-tooltip-arrow cm:absolute cm:bottom-full cm:left-1/2 cm:-translate-x-1/2 cm:border-[5px] cm:border-transparent\" />\n <span className=\"cm-tooltip-content\">{disabledTooltip}</span>\n </div>\n </div>\n )}\n </div>\n);\n\ninterface ImportSyncDropdownProps {\n entityType: ENTITY_TYPE;\n}\n\nexport const ImportSyncDropdown = ({ entityType }: ImportSyncDropdownProps) => {\n const isM3Enabled = useFeature(FEATURES.CUSTOM_FIELDS_M3_ENABLED);\n const { connectionsByType: crmConnections } = useCrmConnections(isM3Enabled);\n const [open, setOpen] = useState(false);\n const [csvDrawerOpen, setCsvDrawerOpen] = useState(false);\n const [openCrmType, setOpenCrmType] = useState<string | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const { contactSyncing, companySyncing, entries } = useCrmSyncStatus({\n enabled: true,\n baseInterval: 2000,\n backoffFactor: 1.2,\n maxInterval: 10000,\n });\n\n // Whether the entity this dropdown manages is currently syncing, and which\n // CRM provider is running that sync (so only it gets the \"Syncing\" badge).\n const entitySyncing =\n entityType === \"company\" ? companySyncing : contactSyncing;\n // Describe the CRM rows by the tab they're opened from: \"accounts\" on the\n // Accounts tab, \"contacts\" on the Contacts tab.\n const syncEntityNoun = entityType === \"company\" ? \"accounts\" : \"contacts\";\n const syncingProvider = entries.find(\n (e) => (e.status === \"running\" || e.status === \"queued\") && e.entity_type === entityType,\n )?.crm_provider;\n\n useEffect(() => {\n if (!open) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [open]);\n\n const handleSelect = (action: string) => {\n setOpen(false);\n if (action === \"csv\") setCsvDrawerOpen(true);\n if (crmConnections[action]) setOpenCrmType(action);\n };\n\n const selectedCrmConfig =\n CRM_PROVIDER_CONFIGS.find((config) => config.type === openCrmType) ?? null;\n const selectedCrmState = selectedCrmConfig\n ? crmConnections[selectedCrmConfig.type]\n : null;\n\n return (\n <div className=\"cm:relative cm:ml-auto cm:flex-shrink-0\" ref={containerRef}>\n {/*\n * The listing's primary action. Was a hand-rolled `<button>` whose\n * `py-[6px]` made it 36px tall in a row of 32px controls — visible as\n * the one chunky control on the bar. D-02 (`1:7222`) draws it at\n * **88 x 32**; `size=\"small\"` is v2's `sm` step, `minHeight:\n * spacing/8` = 32px, and `variant=\"contained\"` resolves the royal fill\n * from the theme rather than a `bg-blue-500` utility.\n */}\n <Button\n variant=\"contained\"\n size=\"small\"\n onClick={() => setOpen((prev) => !prev)}\n /* `cm-primary-action` is OMNI's primary rule — `.cm-root\n .cm-primary-action:not(:disabled)` in `index.css`, (0,3,0) — and it\n paints `#276cf0`. On hui that out-specifies the design system's own\n emotion class and overrides the royal `#246fea` the Figma specifies,\n so the hook is passed only on the build that needs it. */\n className={IS_HUI ? undefined : \"cm-primary-action\"}\n icon={<DownloadGlyph width={16} height={16} aria-hidden=\"true\" />}\n label=\"Import\"\n />\n\n {open && (\n <div\n className=\"cm-import-sync-menu cm:absolute cm:right-0 cm:top-full cm:mt-2 cm:w-[445px] cm:bg-white cm:rounded-xl cm:shadow-xl\n cm:border cm:border-slate-100 cm:z-50 cm:p-6\"\n >\n {isM3Enabled && (\n <>\n <p className=\"cm-import-sync-heading cm:text-xs cm:font-medium cm:text-slate-500 cm:tracking-wider cm:mb-3\">\n Import via CRM sync\n </p>\n <div className=\"cm:flex cm:flex-col cm:gap-4\">\n {CRM_PROVIDER_CONFIGS.map((provider) => {\n const state = crmConnections[provider.type];\n if (!state) return null;\n\n const lockingCrm = CRM_PROVIDER_CONFIGS.find(\n (otherProvider) =>\n otherProvider.type !== provider.type &&\n crmConnections[otherProvider.type]?.locksOtherCrm,\n );\n const isProviderSyncing = syncingProvider === provider.type;\n\n return (\n <DropdownItem\n key={provider.type}\n icon={provider.dropdownLogo}\n label={provider.name}\n description={\n isProviderSyncing\n ? \"Sync in progress — importing your data\"\n : `Sync ${syncEntityNoun} from ${provider.name}`\n }\n badge={state.badge}\n syncing={isProviderSyncing}\n disabled={\n state.isDisconnecting ||\n Boolean(lockingCrm) ||\n entitySyncing\n }\n disabledTooltip={getCrmDisabledTooltip(\n provider.name,\n state,\n lockingCrm?.name ?? null,\n entitySyncing && isProviderSyncing,\n )}\n onClick={() => handleSelect(provider.type)}\n />\n );\n })}\n </div>\n <div className=\"cm-import-sync-separator cm:mt-4 cm:mb-4 cm:border-t cm:border-slate-100\" />\n </>\n )}\n\n <p className=\"cm-import-sync-heading cm:text-xs cm:font-medium cm:text-slate-500 cm:tracking-wider cm:mb-3\">\n Import via spreadsheet\n </p>\n <div className=\"cm:flex cm:flex-col cm:gap-4\">\n <DropdownItem\n icon={\n <DownloadGlyph className=\"cm-import-sync-option__glyph\" width={20} height={20} />\n }\n label=\"Import CSV\"\n description=\"Upload a .CSV file\"\n disabled={entitySyncing}\n disabledTooltip={\n entitySyncing ? \"Available once the sync completes\" : undefined\n }\n onClick={() => handleSelect(\"csv\")}\n />\n </div>\n </div>\n )}\n\n <ImportCSVDrawer\n open={csvDrawerOpen}\n onClose={() => setCsvDrawerOpen(false)}\n entityType={entityType}\n />\n\n {selectedCrmConfig && selectedCrmState?.route === \"settings\" && (\n <CrmSettingsDrawer\n open={true}\n onClose={() => setOpenCrmType(null)}\n entityType={entityType}\n crmProvider={selectedCrmConfig.type}\n crmName={selectedCrmConfig.name}\n crmLogo={selectedCrmConfig.drawerLogo}\n />\n )}\n\n {selectedCrmConfig && selectedCrmState?.route !== \"settings\" && (\n <CrmConnectDrawer\n open={true}\n onClose={() => setOpenCrmType(null)}\n entityType={entityType}\n crmType={selectedCrmConfig.type}\n crmName={selectedCrmConfig.name}\n crmLogo={selectedCrmConfig.drawerLogo}\n crmIllustration={selectedCrmConfig.connectIllustration}\n crmDescription={selectedCrmConfig.connectDescription}\n crmPrerequisites={selectedCrmConfig.prerequisites}\n />\n )}\n </div>\n );\n};\n","import { cn } from \"@/utils/classNames\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\nimport type { KeyboardEvent } from \"react\";\n\n/**\n * HiG paints this control quite differently from Omni, so the two are split on\n * `IS_HUI` rather than converged: Omni's blue box is untouched, and because\n * `IS_HUI` is a build-time constant each artifact keeps only its own branch.\n *\n * HiG (Figma node 1-7342): a 4px-radius box with no border, filled\n * `background/neutral-bold/strong` (#171717) when checked. A checked-but-DISABLED\n * row — every Hiver-owned default field on the custom-fields listing — is a flat\n * `#737373`, not the checked colour dimmed, which is why the disabled state below\n * swaps the fill rather than adding an opacity. The container drops its blanket\n * 50% opacity on hui for the same reason: it would wash out a colour the design\n * specifies exactly.\n */\nconst HUI_BOX = {\n checked: \"cm:rounded-[4px] cm:border-0 cm:bg-[#171717]\",\n checkedDisabled: \"cm:rounded-[4px] cm:border-0 cm:bg-[#737373]\",\n unchecked: \"cm:rounded-[4px] cm:border cm:border-[#d4d4d4] cm:bg-white\",\n};\n\nexport type CheckboxValue = boolean | \"indeterminate\";\n\nexport type CheckboxProps = {\n checked: CheckboxValue;\n disabled?: boolean;\n /** Outer box size in pixels. Defaults to 14px. */\n size?: number;\n onClick?: () => void;\n ariaLabel?: string;\n className?: string;\n};\n\nconst DEFAULT_SIZE = 14;\n\n/**\n * The glyph is a fraction of the box rather than a fixed size, so a 14px and an\n * 18px checkbox stay optically consistent.\n *\n * HiG draws a heavier tick than Omni: at 0.57 the mark inside a 16px box is 9px\n * and reads as a hairline against the solid #171717 fill the design specifies.\n * 0.68 matches the Figma. Omni keeps 0.57 — its box is a lighter blue and the\n * thinner mark is correct there.\n */\nconst MARK_RATIO = IS_HUI ? 0.68 : 0.57;\n\nconst CheckMark = ({ size }: { size: number }) => (\n <svg\n width={Math.round(size * MARK_RATIO)}\n height={Math.round(size * MARK_RATIO)}\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 7.2L5.8 10L11 4.8\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst MinusMark = ({ size }: { size: number }) => (\n <svg\n width={Math.round(size * MARK_RATIO)}\n height={Math.round(size * MARK_RATIO)}\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 7H11\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nexport const Checkbox = ({\n checked,\n disabled = false,\n size = DEFAULT_SIZE,\n onClick,\n ariaLabel,\n className,\n}: CheckboxProps) => {\n const isFilled = checked === true || checked === \"indeterminate\";\n\n const handleClick = () => {\n if (disabled) return;\n onClick?.();\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLSpanElement>) => {\n if (event.key !== \" \" && event.key !== \"Enter\") return;\n event.preventDefault();\n handleClick();\n };\n\n return (\n <div\n className={cn(\n \"cm-checkbox-container cm:flex cm:items-center cm:justify-center\",\n disabled\n ? cn(\n \"cm-checkbox-container--disabled cm:cursor-not-allowed\",\n // hui encodes \"disabled\" in the fill itself (see HUI_BOX).\n !IS_HUI && \"cm:opacity-[50%]\",\n )\n : \"cm:cursor-pointer\",\n className,\n )}\n >\n <span\n role=\"checkbox\"\n aria-checked={checked === \"indeterminate\" ? \"mixed\" : checked}\n aria-disabled={disabled}\n aria-label={ariaLabel}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n tabIndex={disabled ? -1 : 0}\n style={{ height: size, width: size }}\n className={cn(\n \"cm-checkbox cm:flex cm:items-center cm:justify-center\",\n !IS_HUI && \"cm:rounded-[3px] cm:border-2\",\n isFilled\n ? cn(\n \"cm-checkbox--checked\",\n IS_HUI\n ? (disabled ? HUI_BOX.checkedDisabled : HUI_BOX.checked)\n : \"cm:border-[#0B5FFF] cm:bg-[#0B5FFF]\",\n )\n : cn(\n \"cm-checkbox--unchecked\",\n IS_HUI\n ? HUI_BOX.unchecked\n : \"cm:border-[#97ADD8] cm:bg-white cm:shadow-[0px_1px_3px_rgba(15,23,42,0.12)]\",\n ),\n disabled && \"cm-checkbox--disabled\",\n )}\n >\n {checked === true && <CheckMark size={size} />}\n {checked === \"indeterminate\" && <MinusMark size={size} />}\n </span>\n </div>\n );\n};\n","import { ScopedStyles } from \"../Styles\";\n\nexport const MultiSelectStyles = ({ isDark }: { isDark: boolean }) => {\n\n const tokenBackground = isDark ? \"var(--cm-color-charcoal-surface-active)\" : \"#F1F5F9\";\n const tokenText = isDark ? \"var(--cm-color-charcoal-text-secondary)\" : \"#334155\";\n const tokenIcon = isDark ? \"var(--cm-color-charcoal-icon-secondary)\" : \"#64748B\";\n const tokenIconHover = isDark ? \"var(--cm-color-charcoal-icon-primary)\" : \"#0F172A\";\n const fieldBorder = isDark ? \"var(--cm-form-field-border)\" : \"#d1d5db\";\n const optionHover = isDark ? \"var(--cm-color-charcoal-surface-hover)\" : \"#F8FAFC\";\n const optionSelected = isDark ? \"var(--cm-color-charcoal-surface-active)\" : \"#F1F5F9\";\n\n return (\n <ScopedStyles>\n {`\n .form-multiselect .p-multiselect-trigger{\n width: 36px !important;\n }\n .form-multiselect .p-multiselect-trigger svg {\n width: 10px !important;\n height: 10px !important;\n }\n .form-multiselect-panel .p-multiselect-items-wrapper ul{\n padding: 4px !important;\n }\n .form-multiselect-panel .p-multiselect-items-wrapper li{\n padding: 8px 10px !important;\n border-radius: 6px !important;\n }\n .form-multiselect-panel .p-multiselect-items-wrapper li.p-dropdown-item:hover{\n background-color: ${optionHover} !important;\n color: ${tokenText} !important;\n }\n .form-multiselect-panel .p-multiselect-items-wrapper li.p-dropdown-item.p-highlight{\n background-color: ${optionSelected} !important;\n color: ${tokenText} !important;\n } \n\n .form-multiselect{\n min-height: 40px !important;\n box-shadow: none !important;\n border: 1px solid ${fieldBorder} !important;\n }\n .form-multiselect .p-multiselect-label-container{\n display: flex !important;\n align-items: center !important;\n justify-content: flex-start !important;\n }\n .form-multiselect .p-multiselect-label{\n font-size: 14px !important;\n padding: 3px 10px 3px 6px !important;\n white-space: normal !important;\n overflow: visible !important;\n text-overflow: clip !important;\n text-align: start !important;\n }\n .form-multiselect .p-multiselect-label.p-multiselect-items-label{\n display: flex !important;\n flex-wrap: wrap !important;\n gap: 6px !important;\n padding: 3px 10px !important;\n }\n .form-multiselect .p-multiselect-token{\n display: inline-flex !important;\n align-items: center !important;\n gap: 4px !important;\n background: ${tokenBackground} !important;\n color: ${tokenText} !important;\n border-radius: 6px !important;\n padding: 4px 8px !important;\n margin: 3px !important;\n font-size: 14px !important;\n line-height: 1.25 !important;\n }\n .form-multiselect .p-multiselect-token .p-multiselect-token-label{\n font-size: 14px !important;\n color: ${tokenText} !important;\n }\n .form-multiselect .p-multiselect-token .p-multiselect-token-icon{\n cursor: pointer !important;\n color: ${tokenIcon} !important;\n width: 14px !important;\n height: 14px !important;\n font-size: 14px !important;\n background: transparent !important;\n border-radius: 0 !important;\n margin-left: 0 !important;\n }\n .form-multiselect .p-multiselect-token .p-multiselect-token-icon:hover{\n color: ${tokenIconHover} !important;\n background: transparent !important;\n }\n .form-multiselect-panel .p-multiselect-header{\n display: none !important;\n }\n .form-multiselect-panel .p-multiselect-item .p-checkbox{\n display: none !important;\n }\n .form-multiselect-panel .p-multiselect-item.p-highlight,\n .form-multiselect-panel .p-multiselect-item.p-highlight.p-focus{\n background: ${optionSelected} !important;\n color: inherit !important;\n }\n .form-multiselect-panel .p-multiselect-item.p-highlight:hover,\n .form-multiselect-panel .p-multiselect-item:hover{\n background: ${optionHover} !important;\n color: inherit !important;\n }\n `}\n </ScopedStyles>\n )\n}\n","import { MultiSelect as KitMultiSelect } from \"hiver-ui-kit-extended\";\n\nimport { Checkbox } from \"@/components/Checkbox\";\nimport { useRenderConfigStore } from \"@/stores/renderConfig\";\nimport { cn } from \"@/utils/classNames\";\nimport { MultiSelectStyles } from \"./styles\";\n\nimport type { MultiSelectProps as KitMultiSelectProps } from \"hiver-ui-kit-extended\";\n\n/**\n * AF-2: this reached `primereact/multiselect` directly until now, which put\n * primereact into the hui artifact regardless of `resolve.conditions` — a\n * direct package specifier has no `hui` variant for the resolver to pick.\n *\n * Four things move to the toolkit, whose prime variant already does all of\n * them identically: the `form-multiselect`/`form-multiselect-panel` classes,\n * `showSelectAll={false}`, `filter={false}`, and the chip remove icon (its\n * `renderRemoveIcon` is the same SVG this file used to declare, so the local\n * copy is deleted rather than passed down). Omni's markup is unchanged.\n *\n * What stays here is what the toolkit cannot own: `MultiSelectStyles`, because\n * the toolkit ships no CSS for those classes, and the checkbox row template,\n * because it renders this app\\'s own `Checkbox`.\n */\n\n\nexport type MultiSelectOption<T = string|boolean> = {\n label: string;\n value: T;\n};\n\nconst resolveKey = (\n accessor: string | ((option: unknown) => unknown) | undefined,\n fallback: string,\n option: Record<string, unknown>,\n): unknown => {\n if (typeof accessor === \"function\") return accessor(option);\n return option[accessor ?? fallback];\n};\n\nexport const MultiSelect = ({\n className = \"\",\n panelClassName,\n display = \"chip\",\n itemTemplate,\n optionLabel = \"label\",\n optionValue = \"value\",\n value,\n ...props\n}: KitMultiSelectProps) => {\n const globalMountElement = useRenderConfigStore((state) => state.meta.globalMountElement);\n const isDark = useRenderConfigStore((state) => state.theme === \"dark\");\n\n const selectedValues = Array.isArray(value) ? (value as unknown[]) : [];\n\n const defaultItemTemplate = (option: Record<string, unknown>) => {\n const optValue = resolveKey(optionValue, \"value\", option);\n const optLabel = resolveKey(optionLabel, \"label\", option) as string;\n const checked = selectedValues.includes(optValue);\n return (\n <div className=\"cm:flex cm:items-center cm:gap-3 cm:w-full\">\n <Checkbox\n checked={checked}\n size={16}\n ariaLabel={`Toggle ${optLabel}`}\n />\n <span className=\"cm:text-sm cm:text-slate-text-title cm:flex-1 cm:min-w-0 cm:truncate\">\n {optLabel}\n </span>\n </div>\n );\n };\n\n return (\n <>\n <MultiSelectStyles isDark={isDark} />\n <KitMultiSelect\n {...props}\n display={display}\n value={value}\n optionLabel={optionLabel}\n optionValue={optionValue}\n itemTemplate={itemTemplate ?? defaultItemTemplate}\n className={cn(\n \"cm:w-full cm:text-[14px]! cm:[& span]:text-[14px]!\",\n className,\n )}\n panelClassName={cn(\n \"cm:text-[14px]! cm:pointer-events-auto!\",\n panelClassName,\n )}\n appendTo={globalMountElement}\n />\n </>\n );\n};\n","import { useMemo } from \"react\";\n\nimport { MultiSelect, type MultiSelectOption } from \"@/components/MultiSelect\";\nimport { BOOLEAN_OPTIONS, CF_TYPES } from \"@/constants/custom-fields\";\n\nimport type { CustomField, CF_DropdownOption } from \"@/types/custom-fields\";\nimport type { FilterFieldValue } from \"@/types/entity\";\n\nexport type FilterFieldProps = {\n field: CustomField;\n value: FilterFieldValue[];\n onChange: (next: FilterFieldValue[]) => void;\n};\n\nconst getOptionValue = (option: CF_DropdownOption): string|boolean =>\n option.id ?? option.value!;\n\nconst getOptionLabel = (option: CF_DropdownOption): string =>\n option.display_name ?? option.value as string ?? \"\";\n\nexport const FilterField = ({ field, value, onChange }: FilterFieldProps) => {\n const options = useMemo<MultiSelectOption[]>(\n () => { \n if (field.type === CF_TYPES.BOOLEAN) return BOOLEAN_OPTIONS;\n return (field.dropdown_values ?? []).map((option) => ({\n label: getOptionLabel(option),\n value: getOptionValue(option),\n }));\n },\n [field.dropdown_values, field.type],\n );\n \n const placeholder = field.type === CF_TYPES.BOOLEAN ? 'Select yes or no' : `Select ${field.display_name}`;\n\n return (\n <div className=\"cm:flex cm:flex-col cm:gap-1.5\">\n <label className=\"cm-form-field-label cm:text-sm cm:text-slate-text-body cm:text-start\">\n {field.display_name}\n </label>\n <MultiSelect\n value={value}\n options={options}\n placeholder={placeholder}\n onChange={(event) => onChange(event.value as string[])}\n />\n </div>\n );\n};\n","import { PrimaryButton, SecondaryButton } from \"@/components/Drawer/Footer\";\n\nexport type FilterFooterProps = {\n onCancel: () => void;\n onApply: () => void;\n disabled?: boolean;\n};\n\nexport const FilterFooter = ({ onCancel, onApply, disabled = false }: FilterFooterProps) => (\n <div className=\"cm:flex cm:items-center cm:justify-end cm:gap-3 cm:px-4 cm:py-3 cm:border-t cm:border-slate-border-mild\">\n <SecondaryButton\n label=\"Cancel\"\n onClick={onCancel}\n className=\"cm:pl-[16px]! cm:pr-[16px]!\"\n />\n <PrimaryButton\n label=\"Apply\"\n onClick={onApply}\n disabled={disabled}\n />\n </div>\n);\n","/**\n * The title row of the filter popover.\n *\n * NO CLOSE BUTTON, deliberately. The design drops it, and the popover already\n * has two ways out that it did not: `useClickAway` in `EntityFilter` dismisses\n * it on any click outside, and the footer's Cancel calls the same `onClose`. A\n * third affordance in the corner of a 280px popover was crowding a header that\n * holds one word.\n *\n * `onClose` stays on the props so the component keeps a single owner for the\n * dismiss contract — `FilterPopover` still passes it, and a future header\n * action (clear-all, say) has somewhere to hang.\n */\nexport const FilterHeader = () => (\n <div className=\"cm:flex cm:items-center cm:px-4 cm:py-3 cm:border-b cm:border-slate-border-mild\">\n <span className=\"cm:text-sm cm:font-medium cm:text-slate-text-title\">\n Filter\n </span>\n </div>\n);\n","import { FilterField } from \"./FilterField\";\nimport { FilterFooter } from \"./FilterFooter\";\nimport { FilterHeader } from \"./FilterHeader\";\n\nimport type { CustomField } from \"@/types/custom-fields\";\nimport type { EntityFilterValue, FilterFieldValue } from \"@/types/entity\";\n\nexport type FilterPopoverProps = {\n fields: CustomField[];\n draft: EntityFilterValue;\n setDraft: (next: EntityFilterValue) => void;\n onApply: (next: EntityFilterValue) => void;\n onClose: () => void;\n};\n\nexport const FilterPopover = ({\n fields,\n draft,\n setDraft,\n onApply,\n onClose,\n}: FilterPopoverProps) => {\n\n const handleFieldChange = (cfId: CustomField[\"cf_id\"], next: FilterFieldValue[]) => {\n const updated = { ...draft };\n if (next.length === 0) {\n delete updated[cfId];\n return setDraft(updated);\n }\n updated[cfId] = next;\n setDraft(updated);\n };\n\n const handleApply = () => {\n onApply(draft);\n onClose();\n };\n\n return (\n <div\n className=\"cm-filter-popover cm:absolute cm:right-0 cm:top-full cm:mt-2 cm:w-[360px] cm:bg-white cm:rounded-xl cm:shadow-xl cm:border cm:border-slate-border-mild cm:z-50 cm:overflow-hidden\"\n role=\"dialog\"\n aria-label=\"Entity filter\"\n >\n <FilterHeader />\n <div className=\"cm:max-h-[420px] cm:overflow-y-auto cm:px-4 cm:py-4 cm:flex cm:flex-col cm:gap-4\">\n {fields.length === 0 ? (\n <div className=\"cm:text-sm cm:text-slate-text-subtle cm:py-4 cm:text-center\">\n No filters available\n </div>\n ) : (\n fields.map((field) => (\n <FilterField\n key={field.cf_id}\n field={field}\n value={draft[field.cf_id] ?? []}\n onChange={(next) => handleFieldChange(field.cf_id, next)}\n />\n ))\n )}\n </div>\n <FilterFooter onCancel={onClose} onApply={handleApply} disabled={fields.length === 0} />\n </div>\n );\n};\n","import { ToolbarIconButton } from \"@/components/Listing/v2/toolbar/icon-button\";\n\nimport { FilterGlyph } from \"@/components/Icon/glyphs\";\n\nexport type FilterTriggerProps = {\n open: boolean;\n disabled: boolean;\n disableMessage: string;\n hasActiveFilters?: boolean;\n onClick: () => void;\n};\n\nexport const FilterTrigger = ({ open, disabled, disableMessage, hasActiveFilters, onClick }: FilterTriggerProps) => (\n <ToolbarIconButton\n open={open}\n disabled={disabled}\n tooltip={disabled? disableMessage : \"Filter\"}\n onClick={onClick}\n >\n <FilterGlyph className=\"cm:w-4 cm:h-4\" />\n {hasActiveFilters && (\n <span\n aria-hidden=\"true\"\n className=\"cm:absolute cm:top-[4px] cm:right-[4px] cm:w-[6px] cm:h-[6px] cm:rounded-full cm:bg-primary-surface-default\"\n />\n )}\n </ToolbarIconButton>\n);\n","import { useState, useEffect } from \"react\";\nimport { useRenderConfigStore } from \"@/stores/renderConfig\";\n\nimport type { RefObject } from \"react\";\n\nexport type UseClickAwayProps = {\n containerRef: RefObject<HTMLElement>;\n initialOpen?: boolean;\n}\n\n// handle close on click away from the container or the global mount element\nexport const useClickAway = ({ containerRef, initialOpen = false }: UseClickAwayProps) => {\n const [open, setOpen] = useState(initialOpen);\n\n const globalMountElement = useRenderConfigStore((state) => state.meta.globalMountElement);\n\n useEffect(() => {\n if (!open) return;\n const handleClickOutside = (event: MouseEvent) => {\n if( containerRef.current?.contains(event.target as Node) || globalMountElement?.contains(event.target as Node) ) return;\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [open, globalMountElement]);\n\n return {\n open,\n setOpen,\n };\n}","import { useMemo, useRef, useState } from \"react\";\n\nimport { CF_TYPES } from \"@/constants/custom-fields\";\nimport { FilterPopover } from \"./FilterPopover\";\nimport { FilterTrigger } from \"./FilterTrigger\";\nimport { useClickAway } from \"@/hooks/useClickAway\";\nimport { getFilterPayload, getFilterValue } from \"@/utils/entity\";\n\nimport type { CustomField, CF_TYPE } from \"@/types/custom-fields\";\nimport type { EntityFilterPayload, EntityFilterValue } from \"@/types/entity\";\n\n\n\nexport type EntityFilterProps = {\n fields: CustomField[];\n defaultValue: EntityFilterPayload;\n onChange: (value: EntityFilterPayload) => void;\n};\n\nconst definitiveTypes:CF_TYPE[] = [CF_TYPES.DROPDOWN, CF_TYPES.BOOLEAN];\n\nexport const EntityFilter = ({ fields, defaultValue, onChange }: EntityFilterProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const { open, setOpen } = useClickAway({ containerRef, initialOpen: false });\n const [draft, setDraft] = useState<EntityFilterValue>(() => getFilterValue(defaultValue));\n\n const dropdownFields = useMemo(\n () => fields.filter((field) => definitiveTypes.includes(field.type) ),\n [fields],\n );\n\n const hasActiveFilters = Array.isArray(defaultValue) && defaultValue.length > 0;\n\n const handleChange = (next: EntityFilterValue) => {\n onChange(getFilterPayload(next));\n };\n\n return (\n <div className=\"cm:relative cm:shrink-0\" ref={containerRef}>\n <FilterTrigger\n open={open}\n hasActiveFilters={hasActiveFilters}\n disabled={!dropdownFields.length}\n disableMessage=\"Please add dropdown field for filtering\"\n onClick={() => setOpen((prev) => !prev)}\n />\n {open && (\n <FilterPopover\n fields={dropdownFields}\n draft={draft}\n setDraft={setDraft}\n onApply={handleChange}\n onClose={() => setOpen(false)}\n />\n )}\n </div>\n );\n};\n","import { EntityFilter } from \"@/features/entity-filters\";\nimport { useCFList } from \"@/queries/useCFList\";\nimport { useFiltersStore } from \"@/stores/filters\";\n\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\nimport type { EntityFilterPayload } from \"@/types/entity\";\n\nexport type FilterProps = {\n entityType: ENTITY_TYPE;\n};\n\nexport const Filter = ({ entityType }: FilterProps) => {\n const { data: cfList = [] } = useCFList({ entity_type: entityType });\n const filters = useFiltersStore((state) => state[entityType]?.filters ?? []);\n const setFilters = useFiltersStore((state) => state.setFilters);\n\n const onChange = (value: EntityFilterPayload) => {\n setFilters(entityType, value);\n };\n return (\n <EntityFilter fields={cfList} defaultValue={filters} onChange={onChange} />\n )\n}","import { Search } from \"hiver-ui-kit-extended\";\nimport { cn } from \"@/utils/classNames\";\n\n/**\n * The one search field in the module.\n *\n * WHY IT EXISTS. There were three of these: the listing toolbar had none (the\n * Figma asks for one), the custom-fields screen rolled its own `TextField` with\n * an `<img src={searchIcon}>` and a pile of arbitrary `[&_input]:` overrides to\n * force the height, and the global header had a fake one built out of a\n * `<button>`. They disagreed on height, icon size, placeholder and font, which\n * is exactly what the design review called out on two separate screens.\n *\n * IT IS NOW THE DESIGN SYSTEM'S SEARCH, NOT A TEXT FIELD WEARING A MAGNIFIER.\n * This used to be the toolkit's `TextField` handed a `SearchMd` glyph as an\n * adornment, plus a `cm-search-input` class and two height overrides to bring a\n * 40px form control down to the 32px a toolbar wants. `Input.Search` — reached\n * through the toolkit so the primereact build resolves its own variant — ships\n * the magnifier, the clear affordance and a size ladder, so `size=\"sm\"` IS the\n * 32px control and the overrides are gone.\n */\n\nexport type SearchInputProps = {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n /** Tailwind width utility. Defaults to the 240px the Figma draws. */\n className?: string;\n ariaLabel?: string;\n};\n\nexport const SearchInput = ({\n value,\n onChange,\n placeholder = \"Search...\",\n className,\n ariaLabel = \"Search\",\n}: SearchInputProps) => (\n <Search\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n aria-label={ariaLabel}\n size=\"sm\"\n className={cn(\"cm-search-input cm:w-[240px] cm:shrink-0\", className)}\n />\n);\n\nexport default SearchInput;\n","import { create } from 'zustand'\n\nimport type { ENTITY_TYPE } from '@/types/custom-fields'\n\n/**\n * The listing's search text, per entity.\n *\n * Shaped after `useFiltersStore` deliberately — same per-entity keying, same\n * `set<X>(entityType, value)` signature — because the two are read together by\n * the query hooks and diverging shapes here would make those hooks harder to\n * follow than the feature warrants.\n *\n * A STORE RATHER THAN LOCAL STATE, for the same reason the filters are:\n * the toolbar owns the input and the table owns the query, and they are\n * siblings. Threading the value between them would mean lifting it into every\n * table component and passing it back down through `EntityToolbar`'s props,\n * which is the prop-drilling the filters store already exists to avoid.\n */\nexport type SearchState = Record<ENTITY_TYPE, { text: string }> & {\n setSearch: (entityType: ENTITY_TYPE, text: string) => void\n}\n\nexport const useSearchStore = create<SearchState>((set) => ({\n company: { text: '' },\n contact: { text: '' },\n setSearch: (entityType, text) => set({ [entityType]: { text } }),\n}))\n","import { SearchInput } from \"@/components/Search/SearchInput\";\n\nimport { useSearchStore } from \"@/stores/search\";\nimport { ENTITY_TYPES } from \"@/constants/custom-fields\";\n\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\n\nexport type ListingSearchProps = {\n entityType: ENTITY_TYPE;\n};\n\n/**\n * The listing toolbar's search — A TABLE FILTER, not global search.\n *\n * This control has now been four things, so it is worth writing down where it\n * landed and why. The module's own header used to carry a fake search button that\n * opened `SearchDialog`, a modal querying `/v1/search` across accounts AND\n * contacts and navigating to whichever record you picked. The HiG pass dropped\n * that header. The first replacement wired a real field to the list query's\n * `text`; review round 2 read that as a regression and restored the global query\n * in a popover; review round 3 asked for the modal, so it became a trigger again.\n *\n * **The supervisor has now settled it: on HiG this IS the search.** Global search\n * stays with Omni, where `Header` still renders it behind `!IS_HUI`, and is not\n * offered on this surface at all. So the field filters the table it sits on, and\n * `SearchDialog` is no longer imported here — which is what lets DCE drop the\n * dialog, and the result list it owns, back out of the hui bundle.\n *\n * WHY THIS WRITES TO A STORE AND READS NOTHING BACK. The toolbar owns the input,\n * the two v2 tables own the queries, and they are siblings; `stores/search` has\n * the same shape as `useFiltersStore` for exactly that reason. The debounce and\n * the `SEARCH_MIN_CHARS` floor live at the READ end, in `useListingSearchText`,\n * not here: a field that applied the floor itself could never reach a third\n * character, and one that debounced its own value would be laggy to type in.\n */\nexport const ListingSearch = ({ entityType }: ListingSearchProps) => {\n const value = useSearchStore((state) => state[entityType]?.text ?? \"\");\n const setSearch = useSearchStore((state) => state.setSearch);\n\n const noun = entityType === ENTITY_TYPES.COMPANY ? \"accounts\" : \"contacts\";\n\n return (\n <SearchInput\n value={value}\n onChange={(text) => setSearch(entityType, text)}\n ariaLabel={`Search ${noun}`}\n />\n );\n};\n","import { Toolbar } from \"hiver-ui-kit-extended\";\n\nimport { CFConfigButton } from \"../actions/cf-config\";\nimport { SettingsButton } from \"../actions/settings\";\n\nimport { ImportSyncDropdown } from \"@/features/import-csv\";\nimport { ENTITY_TYPES } from \"@/constants/custom-fields\";\nimport { Filter } from \"./filter\";\nimport { ListingSearch } from \"./search\";\nimport { useFeature } from \"@/hooks/useFeature\";\nimport { FEATURES } from \"@/constants/features\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\n\nimport type { ReactNode } from \"react\";\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\n \n\nexport type ToolbarProps = {\n total: number;\n entityType: ENTITY_TYPE;\n rightNode: ReactNode;\n /** Extra actions rendered between the filter button and the CF config button. */\n extraActions?: ReactNode;\n}\n\n/*\n * The action groups exist for hui, where `design-system.hui.css` lays them out.\n * Prime has no rule for them, so as plain block <div>s they stacked every button\n * on its own line (Omni, since 229b482). On prime the children go straight into\n * the toolbar's own flex row, as they did before the grouping.\n */\nconst group = (className: string, children: ReactNode) =>\n IS_HUI ? <div className={className}>{children}</div> : <>{children}</>;\n\nexport const EntityToolbar = ({ total, entityType, rightNode, extraActions }: ToolbarProps) => {\n const countSuffix = entityType === ENTITY_TYPES.COMPANY ? \"accounts\" : \"contacts\";\n\n const isCustomFieldsM2Enabled = useFeature(FEATURES.CUSTOM_FIELDS_M2_ENABLED);\n const isAdmin = useFeature(FEATURES.IS_ADMIN);\n\n /*\n * GROUPED, because D-02 groups them. The Figma's action slot is\n * [search] 12 [four icon buttons @ 8] 12 [Import 10 Create], not seven\n * items on one even rhythm — which is what a single flat row produced.\n * The gaps live in `design-system.hui.css` beside the toolbar's own\n * framing, so the three class names here are the only structure.\n */\n const actions = group(\"cm-toolbar-actions\", <>\n {/* hui only: on prime the search lives in the module's own header\n bar, which the hui build no longer renders (see `Header`). */}\n {IS_HUI && <ListingSearch entityType={entityType} />}\n {group(\"cm-toolbar-icon-group\", <>\n <Filter entityType={entityType} />\n {extraActions}\n {isAdmin && <CFConfigButton entityType={entityType} />}\n {isAdmin && <SettingsButton entityType={entityType} />}\n </>)}\n {group(\"cm-toolbar-button-group\", <>\n {isCustomFieldsM2Enabled && isAdmin && <ImportSyncDropdown entityType={entityType} />}\n {rightNode}\n </>)}\n </>);\n\n /*\n * D-02 composes the toolbar's left side as a heading carrying the entity\n * name and its count (\"Accounts (129)\"), not the plain count line prime\n * renders.\n *\n * WHY THIS IS THE TOOLKIT'S `Toolbar` AND NOT A FLEX DIV ANY MORE.\n * The hand-rolled version had two layout defects, and both were one missing\n * rule. Its actions row was allowed to shrink, so the icon buttons\n * overlapped each other by 8px and the \"Create account\" button compressed\n * below its own text and wrapped onto two lines. The design system's\n * `Table.Toolbar` — reached through the toolkit, so prime resolves its own\n * variant — pins the actions row at `flex-shrink: 0` and gives the title\n * column `flex: 1 0 0; min-width: 0`, which is the correct pair.\n *\n * The label is computed inline rather than hoisted to a const: a hoisted\n * const would be live code that prime retains, putting both strings into\n * Omni's artifact for a branch prime never renders.\n *\n * The density control the Figma also names still does not exist: nothing in\n * this codebase has a row-height setting to drive, so it stays reported as\n * a gap rather than stubbed out.\n */\n if (IS_HUI) {\n return (\n <Toolbar\n className=\"cm-listing-toolbar\"\n title={`${entityType === ENTITY_TYPES.COMPANY ? 'Accounts' : 'Contacts'} (${total ?? 0})`}\n actions={actions}\n />\n );\n }\n\n return (\n <div className=\"cm:flex cm:items-center cm:justify-between cm:pl-6 cm:pr-3 cm:py-2.5 cm:border cm:border-slate-border-light cm:rounded-t-lg cm:bg-white\">\n <div className=\"cm:text-sm cm:font-normal cm:text-slate-text-body\">\n {total > 0 ? `${total ?? 0} ${countSuffix}` : ''}\n </div>\n <div className=\"cm:flex cm:items-center cm:gap-2\">\n {actions}\n </div>\n </div>\n )\n}\n","import { create } from \"zustand\";\n\nimport { ENTITY_TYPES } from \"@/constants/custom-fields\";\n\nimport type { SortData, SortDirection } from \"@/types/entity\";\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\n\ntype SortState = {\n [key in ENTITY_TYPE]: SortData;\n} & {\n setSort: (entity: ENTITY_TYPE) => (field: string | number, isCF: boolean) => void;\n setEntityOrder: (entity: ENTITY_TYPE) => (order: SortData) => void;\n};\n\nconst directions: SortDirection[] = ['asc', 'desc', null];\n\nexport const useSortStore = create<SortState>((set, get) => ({\n [ENTITY_TYPES.COMPANY]: {\n order: null\n },\n [ENTITY_TYPES.CONTACT]: {\n order: null\n },\n setSort: (entity: ENTITY_TYPE) => (field, isCF) => {\n const sortData = get()[entity];\n const currentField = isCF ? sortData.custom_field_id : sortData.field;\n let nextOrder = directions[0];\n \n if (currentField === field) {\n const orderIndex = directions.findIndex(order => order === sortData.order);\n const nextIndex = (orderIndex + 1) % directions.length;\n nextOrder = directions[nextIndex];\n }\n \n const next = { [isCF ? 'custom_field_id' : 'field']: field, order: nextOrder };\n set({ [entity]: next });\n },\n setEntityOrder: (entity: ENTITY_TYPE) => (order: SortData) => set({ [entity]: order })\n}));\n\nexport const getSortDirection = ( sortData: SortData ) => (field:string|number, isCF:boolean) => {\n const currentField = isCF ? sortData.custom_field_id : sortData.field;\n if (field !== currentField) return null;\n return sortData.order;\n}\n","import { useSortStore, getSortDirection } from \"@/stores/sort\";\nimport Tooltip from \"@/components/Tooltip\";\n\nimport { SortAscGlyph, SortDescGlyph, SortNeutralGlyph } from \"@/components/Icon/glyphs\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\n\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\nimport type { SortDirection } from \"@/types/entity\";\n\ninterface SortableHeaderProps {\n title: string;\n entityType: ENTITY_TYPE;\n field: string | number;\n isCF: boolean;\n}\n\nexport const SortableHeader = ({ title, entityType, field, isCF }: SortableHeaderProps) => {\n const sortData = useSortStore(state => state[entityType]);\n const setSort = useSortStore(state => state.setSort);\n \n const setSortData = setSort(entityType);\n const direction = getSortDirection(sortData)(field, isCF);\n \n const getTooltip = (direction: SortDirection) => {\n if( direction === 'asc'){\n return 'Sorted in ascending'\n }\n if( direction === 'desc'){\n return 'Sorted in descending'\n }\n return `Sort by ${title}`\n } \n \n const handleClick = () => { \n setSortData(field, isCF);\n }\n\n return (\n <div\n className=\"cm:flex cm:items-center cm:gap-1 cm:cursor-pointer cm:select-none\"\n onClick={handleClick}\n >\n <span>{title}</span>\n <Tooltip content={getTooltip(direction)}>\n <span\n className={`cm-sort-icon cm:flex cm:items-center cm:mt-px${direction ? ' cm-sort-icon--active' : ''}`}\n >\n {!direction && (IS_HUI ? (\n // The kit draws both chevrons as one path, so the lower one is a\n // second, clipped copy in the disabled tone: it reads as \"click\n // for ascending\".\n <span className=\"cm-sort-neutral\">\n <SortNeutralGlyph className=\"cm-sort-neutral__upper\" />\n <SortNeutralGlyph aria-hidden=\"true\" className=\"cm-sort-neutral__lower\" />\n </span>\n ) : <SortNeutralGlyph />)}\n {direction === \"asc\" && <SortAscGlyph />}\n {direction === \"desc\" && (IS_HUI\n ? <SortDescGlyph />\n : <SortAscGlyph style={{ transform: \"rotate(180deg)\" }} />)}\n </span>\n </Tooltip>\n </div>\n );\n};\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport { getCompanies, getCompaniesWithFilters } from \"@/services/companies\";\nimport { QUERIES } from '@/constants/queries';\n\nimport { useSortStore } from \"@/stores/sort\";\nimport { useFiltersStore } from \"@/stores/filters\";\nimport { ENTITY_TYPES } from \"@/constants/custom-fields\";\n\nimport type { CompaniesApiResponse, GetCompaniesParams, CompaniesFilterResponseData } from \"@/types/api\";\nimport type { SortApiData } from \"@/types/entity\";\n\nconst NO_DATA_RES = { total: 0, page: 0, page_size: 0 }\nconst NO_FILTER_DATA_RES = { total_results: 0, page_number: 0, page_size: 0 }\n\nconst getNextPageParam = ( lastData: CompaniesApiResponse) => {\n const { total, page = 0, page_size } = lastData?.data ?? NO_DATA_RES;\n // Check if current loaded items are less than total\n return page * page_size < total ? page + 1 : undefined;\n}\n\nconst isFilterResponse = (response?: CompaniesApiResponse | CompaniesFilterResponseData): response is CompaniesFilterResponseData => {\n // `!!response?.data` rather than `!!response`: the proxy's `proxyResponse()`\n // relays a literal JSON `null` when upstream sends an empty or invalid\n // JSON-typed body, and `'results' in null` throws rather than returning false.\n return !!response?.data && 'results' in response.data;\n}\n\nconst getFilterNextPageParam = ( lastData: CompaniesFilterResponseData ) => {\n const { total_results, page_number = 0, page_size } = lastData?.data ?? NO_FILTER_DATA_RES;\n return page_number * page_size < total_results ? page_number + 1 : undefined;\n}\nexport const useCompanies = (params?: GetCompaniesParams, enabled: boolean = true) => {\n\n const filters = useFiltersStore((state) => state.company.filters);\n const sortData = useSortStore(state => state[ENTITY_TYPES.COMPANY]);\n\n const hasFilters = Array.isArray(filters) && filters.length > 0;\n \n const sortApiData: SortApiData|null = (sortData.field || sortData.custom_field_id) && sortData.order ? ({\n ...sortData,\n by: sortData.field ? 'native' : 'cf'\n }) : null;\n\n // The listing search applies to BOTH paths. On the GET path it is a query\n // param; here it rides in the POST body (`EntityFilterParams.text`). It is part\n // of the query key for the same reason the filters are — two different searches\n // are two different result sets, and react-query would otherwise serve the\n // first one's pages for the second.\n const filterProps = useInfiniteQuery({\n queryKey: [QUERIES.COMPANIES_WITH_FILTERS, filters, sortData, params?.filter_by, params?.text],\n queryFn: ( { pageParam: page_number } ) => getCompaniesWithFilters({ filters, sort: sortApiData, page_size: 20, page_number, ...(params?.text ? { text: params.text } : {}) }, params?.filter_by),\n getNextPageParam: getFilterNextPageParam,\n initialPageParam: 1,\n enabled: enabled && hasFilters,\n refetchOnMount: true,\n gcTime: 0,\n });\n\n const sort = sortData.custom_field_id ? `cf:${sortData.custom_field_id}` : sortData.field;\n const order = sortData.order ?? undefined;\n const listProps = useInfiniteQuery({\n queryKey: [QUERIES.COMPANIES, params, sortData],\n queryFn: ( { pageParam: page_number } ) => getCompanies({ ...params, page_number, sort, order }),\n getNextPageParam,\n initialPageParam: 1,\n enabled: enabled && !hasFilters,\n refetchOnMount: true,\n gcTime: 0,\n });\n\n const{ data, ...props } = hasFilters ? filterProps : listProps;\n\n const companies = data?.pages.flatMap((page) => { \n if (isFilterResponse(page)) {\n return page.data.results ?? [];\n }\n // Same reason as `isFilterResponse`: a page whose `data` the proxy relayed\n // as `null` must render as empty, not throw on the way to the table.\n else return page?.data?.companies ?? [];\n }) ?? [];\n\n const firstRecord = data?.pages[0];\n const total = isFilterResponse(firstRecord) ? firstRecord?.data?.total_results ?? 0 : firstRecord?.data?.total ?? 0;\n // Only the base GET list response carries at_risk_count; undefined while\n // loading or on the custom-field-filter (POST) path.\n const atRiskCount = isFilterResponse(firstRecord) ? undefined : firstRecord?.data?.at_risk_count;\n // GET-path total only (undefined on the POST filter path) — callers use it\n // for the tab count chips, which must not follow custom-field filtering.\n const listTotal = isFilterResponse(firstRecord) ? undefined : firstRecord?.data?.total;\n\n return {\n companies,\n total,\n atRiskCount,\n listTotal,\n ...props,\n };\n};","import { cn } from \"@/utils/classNames\";\n\nexport type ChipProps = {\n label: string;\n className?: string;\n};\n\nexport const Chip = ({ label, className }: ChipProps) => {\n return (\n <span\n className={cn(\n \"cm-domain-chip cm:inline-flex cm:items-center cm:rounded-md\",\n \"cm:bg-slate-surface-subtle-100 cm:text-slate-text-body\",\n \"cm:px-2 cm:py-[3px] cm:text-[13px] cm:leading-tight\",\n \"cm:max-w-full cm:truncate\",\n className,\n )}\n title={label}\n >\n {label}\n </span>\n );\n};\n","import { useMemo, useState } from \"react\";\nimport { cn } from \"@/utils/classNames\";\nimport { Chip } from \"./Chip\";\n\nexport type ChipsProps = {\n /** Values to render as chips */\n values: string[];\n /** Maximum number of chips to render before collapsing into \"+N more\" */\n maxVisible?: number;\n /** Optional className for the wrapping container */\n className?: string;\n /** Optional className applied to each chip */\n chipClassName?: string;\n};\n\nconst DEFAULT_MAX_VISIBLE = 2;\n\n/**\n * Renders a list of read-only chips. When the number of values exceeds\n * `maxVisible`, the remaining values are collapsed into a \"+N more\"\n * indicator. Clicking it expands the list to reveal all values along with\n * a \"Show less\" toggle that collapses the list back to its initial view.\n */\nexport const Chips = ({\n values,\n maxVisible = DEFAULT_MAX_VISIBLE,\n className,\n chipClassName,\n}: ChipsProps) => {\n const [expanded, setExpanded] = useState(false);\n\n const { visible, hidden } = useMemo(() => {\n if (!Array.isArray(values) || values.length === 0) {\n return { visible: [], hidden: [] as string[] };\n }\n const safeMax = Math.max(0, maxVisible);\n return {\n visible: values.slice(0, safeMax),\n hidden: values.slice(safeMax),\n };\n }, [values, maxVisible]);\n\n if (visible.length === 0 && hidden.length === 0) return null;\n\n const shown = expanded ? values : visible;\n\n const toggle = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setExpanded((prev) => !prev);\n };\n\n return (\n <div\n className={cn(\n \"cm:inline-flex cm:flex-wrap cm:items-center cm:gap-1.5 cm:max-w-full\",\n className,\n )}\n >\n {shown.map((value, index) => (\n <Chip key={`${value}-${index}`} label={value} className={chipClassName} />\n ))}\n {hidden.length > 0 && (\n <button\n type=\"button\"\n onClick={toggle}\n className=\"cm-link cm:inline-flex cm:items-center cm:text-blue-600 cm:text-[13px] cm:leading-tight cm:cursor-pointer cm:whitespace-nowrap cm:bg-transparent cm:border-0 cm:p-0\"\n aria-expanded={expanded}\n aria-label={expanded ? \"Show less\" : `${hidden.length} more`}\n >\n {expanded ? \"Show less\" : `+${hidden.length} more`}\n </button>\n )}\n </div>\n );\n};\n","import type { MutableRefObject, RefCallback } from \"react\";\n\ntype RefType<T> = MutableRefObject<T> | RefCallback<T> | null;\n\n// Shimmer cell component\nexport const ShimmerCell = ({ nodeRef }: { nodeRef?: RefType<HTMLDivElement> | null }) => (\n <div className=\"cm:h-4 cm:bg-gray-200 cm:rounded cm:w-3/4 cm:animate-pulse\" ref={nodeRef}></div>\n);\n","// /api/v1/config/custom-fields?ug_id=4&inbox_id=4704\n\nimport { apiClient } from '../axios';\nimport { ENDPOINTS } from '@/constants/endpoints';\n\nimport type { ViewCFConfigsResponse, ENTITY_TYPE, SaveViewCFConfigsParams } from '@/types/custom-fields';\n\n\nexport type ViewCFConfigsParams = {\n entity_type: ENTITY_TYPE;\n}\n\nexport const viewCFConfigs = async (\n { entity_type }: ViewCFConfigsParams\n): Promise<ViewCFConfigsResponse> => {\n const response = await apiClient.get(ENDPOINTS.VIEW_CUSTOM_FIELDS, {\n params: {\n entity_type,\n }\n });\n return response.data.data as ViewCFConfigsResponse;\n};\n\n\nexport const saveViewCFConfigs = async (\n { entity_type, visible_items }: SaveViewCFConfigsParams\n): Promise<boolean> => {\n try{\n const response = await apiClient.put(ENDPOINTS.VIEW_CUSTOM_FIELDS, {\n entity_type,\n visible_items,\n });\n return response.status === 200;\n }\n catch(error){\n console.error(error);\n return false;\n }\n};","import { CF_TYPES } from \"@/constants/custom-fields\";\nimport { epochMillisToDateView } from \"./dateUtils\";\n\nimport type { ReactNode } from \"react\";\nimport type { CF_ID, CustomField, CustomFieldMap } from \"@/types/custom-fields\";\nimport type { ColumnType } from \"@/types/entity\";\n\nexport const getCFKey = (cf_id: CF_ID) => `CF.${cf_id}`;\n\nexport const createCFColumns = (columns: CustomField[]): ColumnType[] => {\n return columns.map(column => { \n const field = getCFKey(column.cf_id);\n const body = (rowData: Record<string, unknown>) => { \n if (rowData[field]) return rowData[field] as ReactNode;\n return '-';\n } \n return ({\n id: String(column.cf_id),\n field: getCFKey(column.cf_id),\n label: column.display_name,\n visible: true,\n style: { width: \"180px\" },\n body\n })\n })\n};\n\n\nexport const createCFRows = ( component: ( field: CustomFieldMap ) => ReactNode ) => (rows?: CustomFieldMap[]) => { \n if(!Array.isArray(rows))return {};\n const rowData: Record<string, ReactNode> = {};\n\n for( const field of rows ){\n const key = getCFKey(field.cf_id);\n rowData[key] = component(field);\n }\n\n return rowData;\n}\n\nexport const getViewConfig = ( value: string ) => {\n const [ key, visible ] = value?.split(':') ?? [];\n return { key, visible: visible === 'true' }\n}\n\nexport const getViewKey = ( key: string, visible: boolean ) => {\n return `${key}:${visible}`;\n}\n\nexport const renderCFValue = (field: CustomFieldMap) => {\n let isPresent: boolean;\n switch (field?.type) {\n case CF_TYPES.DATE: \n return epochMillisToDateView(field?.value as number);\n case CF_TYPES.BOOLEAN:\n isPresent = typeof field?.value === 'boolean';\n if (isPresent) return field.value ? 'Yes' : 'No';\n return '-';\n default:\n return field?.value as string || '-';\n }\n}","import { useQuery } from '@tanstack/react-query';\nimport { viewCFConfigs } from '@/services/custom-fields/view-configs';\nimport { getCFConfigs } from '@/services/custom-fields/get-config';\nimport { QUERIES } from '@/constants/queries';\nimport { createCFColumns, getViewConfig } from '@/utils/customFields';\n\nimport type { ENTITY_TYPE } from '@/types/custom-fields';\nimport type { ColumnType } from '@/types/entity';\n\nexport type GetCFColumnsApiParams = {\n entity_type: ENTITY_TYPE;\n defaultColumns: ColumnType[];\n extraColumns?: ColumnType[];\n}\n\nconst getCFColumnsApi = async ({ entity_type, defaultColumns, extraColumns = [] }: GetCFColumnsApiParams) => {\n const [ viewConfig, configsList ] = await Promise.all([\n viewCFConfigs({ entity_type }),\n getCFConfigs({ entity_type }),\n ]);\n\n const customFields = configsList.account_custom_fields.find( item => item.entity_type === entity_type )?.custom_fields ?? [];\n\n const cfColumns = createCFColumns(customFields);\n\n const lockedColumns = defaultColumns.map(column => ({...column, locked: true, visible: true}));\n\n const allCols = [...lockedColumns, ...cfColumns, ...extraColumns];\n\n const preference = viewConfig.visible_items;\n\n if(!preference?.length) return allCols;\n\n const map:Record<string, ColumnType> = {};\n\n for( const column of allCols ){\n map[column.id] = column;\n }\n\n const preferredCols = preference.map(item => {\n if(!item || typeof item !== 'string') return null;\n const { key, visible } = getViewConfig(item);\n const column = map[ key ];\n if(!column) return null;\n delete map[key];\n return { ...column, visible: column.locked ? (column.visible ?? true) : visible };\n }).filter(Boolean) as ColumnType[];\n\n const leftovers = Object.values(map).filter(Boolean);\n\n return [...preferredCols, ...leftovers];\n};\n\n\nexport const useCFColumns = ({ entity_type, defaultColumns, extraColumns }: GetCFColumnsApiParams) => {\n return useQuery({\n // extraColumns ids join the key so flag flips (CI on/off) re-derive the set.\n queryKey: [\n QUERIES.CUSTOM_FIELDS_COLUMNS,\n entity_type,\n (extraColumns ?? []).map((column) => column.id),\n ],\n queryFn: () => getCFColumnsApi({ entity_type, defaultColumns, extraColumns }),\n });\n};","export const selectTableRowNode = ( node?: HTMLElement | null ) => {\n if(!node)return null;\n const rowNode = node.parentElement?.parentElement;\n if(rowNode?.tagName === 'TR')return rowNode;\n return node;\n};","import { renderCFValue } from \"@/utils/customFields\";\n\nimport type { CustomFieldMap } from \"@/types/custom-fields\";\n\nexport const CFField = ({ field }: { field: CustomFieldMap }) => {\n return (\n <div>\n {renderCFValue(field)}\n </div>\n )\n}","import { useEffect, useState } from 'react';\n\n/**\n * Trails `value` by `delay` ms.\n *\n * The listing's search goes to the server on every change, so the raw input\n * value must not drive the query — typing \"acme\" would fire four requests and\n * render whichever came back last, which is not necessarily the one for \"acme\".\n * The input stays controlled by the immediate value (so typing feels instant)\n * and only the debounced copy reaches the query key.\n */\nexport const useDebouncedValue = <T,>(value: T, delay = 300): T => {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const timer = window.setTimeout(() => setDebounced(value), delay);\n return () => window.clearTimeout(timer);\n }, [value, delay]);\n\n return debounced;\n};\n","/**\n * The listing toolbar's search.\n *\n * Both values are named here rather than inlined at the call site because the\n * floor in particular is a product decision that has already moved once and is\n * expected to move again — three characters is what the supervisor asked for on\n * 2026-09-22, not a property of the endpoint.\n */\n\n/**\n * Below this many characters the listing does not search at all: the query goes\n * out with no `text` and the table shows the unfiltered list.\n *\n * Applied at the READ end, not in the input — see `useListingSearchText`. If the\n * input refused to accept the first two characters you could never type a third.\n */\nexport const SEARCH_MIN_CHARS = 3;\n\n/** How long the field trails the keystrokes before the query key moves. */\nexport const SEARCH_DEBOUNCE_MS = 300;\n","import { useSearchStore } from '@/stores/search';\nimport { useDebouncedValue } from '@/hooks/useDebouncedValue';\nimport { SEARCH_DEBOUNCE_MS, SEARCH_MIN_CHARS } from '@/constants/search';\n\nimport type { ENTITY_TYPE } from '@/types/custom-fields';\n\n/**\n * The search text a listing query should actually send, or `undefined`.\n *\n * Three things happen here and they all belong together:\n *\n * 1. **Read from the store, not from props.** The toolbar owns the input and the\n * table owns the query; they are siblings. `stores/search` exists so the value\n * does not have to be threaded back up through `EntityToolbar`.\n * 2. **Debounced at the READ end.** The field stays controlled by the immediate\n * value so typing feels instant, and only the trailing copy reaches the query\n * key — otherwise \"acme\" fires four requests and renders whichever lands last.\n * 3. **The `SEARCH_MIN_CHARS` floor.** Below it this returns `undefined`, which is\n * byte-for-byte the \"no search\" query key the listing had before the field\n * existed, so no request is made and the cached unfiltered page is reused.\n *\n * The floor is applied HERE and not in the input: a field that refuses the first\n * two characters can never reach a third. It is also applied AFTER the debounce\n * so that deleting from three characters to two settles once, not twice.\n *\n * Both v2 tables call this, which is the point — the rule is one place. Note they\n * are SHARED components, so this runs in prime too; the store is never written to\n * there (the toolbar's field is `IS_HUI`-only), so it always returns `undefined`\n * and the Omni query is unchanged.\n */\nexport const useListingSearchText = (entityType: ENTITY_TYPE): string | undefined => {\n const searchText = useSearchStore((state) => state[entityType]?.text ?? '');\n const debounced = useDebouncedValue(searchText, SEARCH_DEBOUNCE_MS);\n\n const trimmed = debounced.trim();\n return trimmed.length >= SEARCH_MIN_CHARS ? trimmed : undefined;\n};\n","import { Button } from \"hiver-ui-kit-extended\";\nimport { PlusGlyph } from \"@/components/Icon/glyphs\";\n\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\n\ntype CreateButtonProps = {\n entityType: ENTITY_TYPE;\n className?: string;\n onClick?: () => void;\n};\n\nconst LABELS: Record<ENTITY_TYPE, string> = {\n company: \"Create account\",\n contact: \"Create contact\",\n};\n\n/**\n * The listing's secondary action.\n *\n * WAS A HAND-ROLLED `<button>`, AND MEASURABLY WRONG FOR IT. It hard-coded\n * `h-[32px] w-[150px]`, its own border, radius, hover and type scale — and it\n * had no leading glyph, while D-02 (`1:7222`) draws \"+ Create account\" at\n * **142 x 32**. The plus is part of the label there, not decoration.\n *\n * `size=\"small\"` is v2's `sm` step, whose `minHeight` is `spacing/8` = 32px —\n * the Figma's height, as a token rather than a magic number. The width is left\n * to the content, which is what produces 142 rather than a fixed 150.\n */\nexport const CreateButton = ({ entityType, className, onClick }: CreateButtonProps) => (\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={onClick}\n className={className}\n icon={<PlusGlyph width={16} height={16} aria-hidden=\"true\" />}\n label={LABELS[entityType]}\n />\n);\n","import { useLayoutEffect, useRef, useState } from \"react\";\nimport { cn } from \"@/utils/classNames\";\n\nimport { DragHandleGlyph } from \"@/components/Icon/glyphs\";\n\nimport type { ReactNode, DragEvent, CSSProperties } from \"react\";\n\nconst DEFAULT_ROW_GAP_PX = 8;\n\nexport type DragAndDropProps<T> = {\n items: T[];\n getKey: (item: T, index: number) => string | number;\n renderItem: (item: T, index: number) => ReactNode;\n onReorder: (items: T[]) => void;\n dragIcon?: ReactNode;\n disabled?: boolean;\n /** Vertical gap between rows in pixels. Used to compute slide animations. */\n rowGap?: number;\n className?: string;\n itemClassName?: string;\n handleClassName?: string;\n style?: CSSProperties;\n};\n\nexport function DragAndDrop<T>({\n items,\n getKey,\n renderItem,\n onReorder,\n dragIcon,\n disabled = false,\n rowGap = DEFAULT_ROW_GAP_PX,\n className,\n itemClassName,\n handleClassName,\n style,\n}: DragAndDropProps<T>) {\n const [draggingIndex, setDraggingIndex] = useState<number | null>(null);\n const [dragOverIndex, setDragOverIndex] = useState<number | null>(null);\n const [rowHeight, setRowHeight] = useState(0);\n \n const dragSourceRef = useRef<number | null>(null);\n const rowRefs = useRef<Array<HTMLDivElement | null>>([]);\n\n useLayoutEffect(() => {\n const first = rowRefs.current.find(Boolean);\n if (first) {\n const next = first.offsetHeight;\n setRowHeight((current) => (current === next ? current : next));\n }\n }, [items]);\n\n const resetDragState = () => {\n dragSourceRef.current = null;\n setDraggingIndex(null);\n setDragOverIndex(null);\n };\n\n const handleMouseDown = (index: number) => {\n if (disabled) return;\n dragSourceRef.current = index;\n };\n\n const handleMouseUp = () => {\n dragSourceRef.current = null;\n };\n\n const handleDragStart = (event: DragEvent<HTMLDivElement>, index: number) => {\n if (dragSourceRef.current !== index || disabled) {\n event.preventDefault();\n return;\n }\n setDraggingIndex(index);\n event.dataTransfer.effectAllowed = \"move\";\n try {\n event.dataTransfer.setData(\"text/plain\", String(index));\n } catch {\n // Some browsers throw if drag data isn't allowed; safe to ignore.\n }\n };\n\n const handleRowDragOver = (event: DragEvent<HTMLDivElement>, index: number) => {\n if (disabled || draggingIndex === null) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = \"move\";\n if (dragOverIndex !== index) setDragOverIndex(index);\n };\n\n const handleContainerDragOver = (event: DragEvent<HTMLDivElement>) => {\n if (draggingIndex === null) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = \"move\";\n };\n\n const commitReorder = () => {\n const from = draggingIndex;\n const target = dragOverIndex;\n if (from === null || target === null || from === target) return;\n const next = [...items];\n const [moved] = next.splice(from, 1);\n next.splice(target, 0, moved);\n onReorder(next);\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.stopPropagation();\n commitReorder();\n resetDragState();\n };\n\n const handleDragEnd = () => {\n resetDragState();\n };\n\n /**\n * Returns the vertical offset in pixels that row `i` should be translated by\n * to indicate the live insertion position.\\\n */\n const getRowOffset = (i: number): number => {\n if (\n draggingIndex === null ||\n dragOverIndex === null ||\n rowHeight === 0 ||\n i === draggingIndex\n ) {\n return 0;\n }\n const shift = rowHeight + rowGap;\n if (draggingIndex < dragOverIndex) {\n if (i > draggingIndex && i <= dragOverIndex) return -shift;\n } else if (draggingIndex > dragOverIndex) {\n if (i >= dragOverIndex && i < draggingIndex) return shift;\n }\n return 0;\n };\n\n return (\n <div\n className={cn(\"cm:flex cm:flex-col\", className)}\n style={{ rowGap: `${rowGap}px`, ...style }}\n onDragOver={handleContainerDragOver}\n onDrop={handleDrop}\n >\n {items.map((item, index) => {\n const isDragging = draggingIndex === index;\n const offset = getRowOffset(index);\n\n return (\n <div\n key={getKey(item, index)}\n ref={(el) => {\n rowRefs.current[index] = el;\n }}\n draggable={!disabled}\n onDragStart={(event) => handleDragStart(event, index)}\n onDragOver={(event) => handleRowDragOver(event, index)}\n onDrop={handleDrop}\n onDragEnd={handleDragEnd}\n style={{\n transform: offset !== 0 ? `translateY(${offset}px)` : undefined,\n transition:\n draggingIndex === null || isDragging\n ? \"transform 0ms\"\n : \"transform 180ms ease\",\n }}\n className={cn(\n \"cm:flex cm:items-center cm:gap-2\",\n isDragging && \"cm:opacity-40\",\n itemClassName,\n )}\n >\n <span\n onMouseDown={() => handleMouseDown(index)}\n onMouseUp={handleMouseUp}\n className={cn(\n \"cm:flex cm:items-center cm:justify-center cm:select-none\",\n !disabled\n ? \"cm:cursor-grab cm:active:cursor-grabbing hover:cm:text-slate-icons-subtle\"\n : \"cm:cursor-not-allowed cm:opacity-60 cm:text-slate-icons-disabled\",\n handleClassName,\n )}\n aria-label=\"Drag handle\"\n role=\"button\"\n tabIndex={-1}\n >\n {dragIcon ?? <DragHandleGlyph className=\"cm-drag-handle__icon\" />}\n </span>\n <div className=\"cm:flex-1 cm:min-w-0\">{renderItem(item, index)}</div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { Checkbox, type CheckboxValue } from \"@/components/Checkbox\";\n\nexport type PreferenceHeaderProps = {\n selectAllState: CheckboxValue;\n onSelectAll: () => void;\n disabled?: boolean;\n};\n\nexport const PreferenceHeader = ({\n selectAllState,\n onSelectAll,\n disabled,\n}: PreferenceHeaderProps) => (\n <div className=\"cm:flex cm:items-center cm:justify-between cm:px-4 cm:py-3 cm:border-b cm:border-slate-border-mild\">\n <span className=\"cm:text-sm cm:font-medium cm:text-slate-text-title\">\n Table preferences\n </span>\n <Checkbox\n checked={selectAllState}\n disabled={disabled}\n size={18}\n onClick={onSelectAll}\n ariaLabel=\"Toggle all configurable columns\"\n />\n </div>\n);\n","import { Checkbox } from \"@/components/Checkbox\";\nimport { cn } from \"@/utils/classNames\";\n\nimport type { ColumnType } from \"@/types/entity\";\n\nexport type PreferenceRowProps = {\n item: ColumnType;\n onToggle: (id: string) => void;\n};\n\nexport const PreferenceRow = ({ item, onToggle }: PreferenceRowProps) => {\n const isChecked = !!item.visible;\n const isLocked = !!item.locked;\n\n return (\n <div className=\"cm-pref-row cm:flex cm:items-center cm:gap-3 cm:py-[10px] cm:px-3 cm:min-h-[40px]\">\n <Checkbox\n checked={isChecked}\n disabled={isLocked}\n size={16}\n onClick={() => onToggle(item.id)}\n ariaLabel={`${isChecked ? \"Hide\" : \"Show\"} ${item.label} column`}\n />\n <span\n className={cn(\n \"cm:text-sm cm:flex-1 cm:min-w-0 cm:truncate cm:font-medium\",\n isLocked\n ? \"cm:text-slate-text-subtle\"\n : \"cm:text-slate-text-title\",\n )}\n title={item.label}\n >\n {item.label}\n </span>\n </div>\n );\n};\n","import { useMemo } from \"react\";\nimport { DragAndDrop } from \"@/components/DragAndDrop\";\nimport { PreferenceHeader } from \"./PreferenceHeader\";\nimport { PreferenceRow } from \"./PreferenceRow\";\n\nimport type { CheckboxValue } from \"@/components/Checkbox\";\nimport type { ColumnType } from \"@/types/entity\";\n\nexport type PreferencePopoverProps = {\n items: ColumnType[];\n onToggle: (id: string) => void;\n onReorder: (items: ColumnType[]) => void;\n onSelectAll: (next: boolean) => void;\n};\n\nconst getSelectAllState = (\n items: ColumnType[],\n): CheckboxValue => {\n const configurables = items.filter((item) => !item.locked);\n const visibleCount = configurables.filter((item) => item.visible).length;\n if( visibleCount === configurables.length ) return true;\n if( visibleCount === 0 ) return false;\n return \"indeterminate\";\n\n};\n\nexport const PreferencePopover = ({\n items,\n onToggle,\n onReorder,\n onSelectAll,\n}: PreferencePopoverProps) => {\n const selectAllState = useMemo(\n () => getSelectAllState(items),\n [items],\n );\n\n return (\n <div\n className=\"cm:absolute cm:right-0 cm:top-full cm:mt-2 cm:w-[320px] cm:bg-white cm:rounded-xl cm:shadow-xl cm:border cm:border-slate-border-mild cm:z-50 cm:overflow-hidden\"\n role=\"dialog\"\n aria-label=\"Column preferences\"\n >\n <PreferenceHeader\n selectAllState={selectAllState}\n onSelectAll={() => onSelectAll(selectAllState !== true)}\n disabled={!items.length}\n />\n <div className=\"cm:max-h-[360px] cm:overflow-y-auto cm:py-1\">\n <DragAndDrop\n items={items}\n getKey={(item) => item.id}\n rowGap={0}\n onReorder={onReorder}\n renderItem={(item) => (\n <PreferenceRow item={item} onToggle={onToggle} />\n )}\n itemClassName=\"cm:px-3 cm:border-b cm:last:border-b-0 cm:border-slate-border-mild last:cm:border-b-0\"\n handleClassName=\"cm:w-4\"\n />\n </div>\n </div>\n );\n};\n","import { ToolbarIconButton } from \"@/components/Listing/v2/toolbar/icon-button\";\n\nimport { ColumnsGlyph } from \"@/components/Icon/glyphs\";\n\nexport type PreferenceTriggerProps = {\n open: boolean;\n onClick: () => void;\n};\n\nexport const PreferenceTrigger = ({ open, onClick }: PreferenceTriggerProps) => (\n <ToolbarIconButton\n open={open}\n tooltip=\"Table preferences\"\n onClick={onClick}\n >\n <ColumnsGlyph className=\"cm:w-4 cm:h-4\" />\n </ToolbarIconButton>\n);\n","import { useEffect, useRef, useState } from \"react\";\n\nimport { PreferencePopover } from \"./PreferencePopover\";\nimport { PreferenceTrigger } from \"./PreferenceTrigger\";\n\nimport type { ColumnType } from \"@/types/entity\";\n\nexport type ColumnPreferenceProps = {\n items: ColumnType[];\n onToggle: (id: string) => void;\n onReorder: (items: ColumnType[]) => void;\n onSelectAll: (visible: boolean) => void;\n};\n\nexport const ColumnPreference = ({\n items,\n onToggle,\n onReorder,\n onSelectAll,\n}: ColumnPreferenceProps) => {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [open]);\n\n return (\n <div className=\"cm:relative cm:shrink-0\" ref={containerRef}>\n <PreferenceTrigger\n open={open}\n onClick={() => setOpen((prev) => !prev)}\n />\n {open && (\n <PreferencePopover\n items={items}\n onToggle={onToggle}\n onReorder={onReorder}\n onSelectAll={onSelectAll}\n />\n )}\n </div>\n );\n};\n","import { useEffect, useMemo, useState, useRef } from \"react\";\n\nimport type { ColumnType } from \"@/types/entity\";\n\nexport type UseColumnPreferencesOptions = {\n /** memoised items list */\n items: ColumnType[];\n delayedSave?: number;\n savePreferences: (preferences: ColumnType[]) => void;\n};\n\nexport const useColumnPreferences = ({ items, delayedSave = 1000, savePreferences }: UseColumnPreferencesOptions) => {\n const [preferences, setPreferences] = useState<ColumnType[]>(items);\n\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>();\n\n useEffect(() => {\n if(!items.length) return;\n setPreferences(items);\n }, [items]);\n\n useEffect(() => {\n return () => clearTimeout(timeoutRef.current);\n }, []);\n\n const saveDelayedPreferences = ( preferences: ColumnType[] ) => {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n savePreferences(preferences);\n }, delayedSave);\n }\n\n const togglePreference = (id: string) => {\n const newPreferences = preferences.map((item) =>\n item.id === id && !item.locked\n ? { ...item, visible: !item.visible }\n : item,\n );\n setPreferences(newPreferences);\n saveDelayedPreferences(newPreferences);\n }\n\n const reorderPreferences = (nextOrder: ColumnType[]) => {\n setPreferences(nextOrder)\n saveDelayedPreferences(nextOrder);\n }\n\n const setAllVisible = (visible: boolean) => {\n const newPreferences = preferences.map((item) =>\n item.locked ? item : { ...item, visible },\n );\n setPreferences(newPreferences);\n saveDelayedPreferences(newPreferences);\n }\n\n const visibleIds = useMemo(\n () => preferences.filter((item) => item.visible).map((item) => item.id),\n [preferences],\n );\n\n return {\n preferences,\n visibleIds,\n togglePreference,\n reorderPreferences,\n setAllVisible,\n };\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport { DataTable } from \"hiver-ui-kit-extended\";\nimport { useLocation, useNavigate } from \"react-router-dom\";\nimport { formatValue } from \"../../../utils/formatValue\";\nimport { useRenderConfigStore } from \"@/stores/renderConfig\";\nimport { useFiltersStore } from \"@/stores/filters\";\nimport { useIntersectObserver } from \"@/hooks/useIntersectObserver\";\nimport EmptyState from \"../../EmptyState\";\nimport Loader from \"../../Loader\";\nimport TruncatedText from \"../../TruncatedText\";\nimport { CreateEditEntity } from \"@/features/entity/create-edit\";\nimport { EntityToolbar } from \"./toolbar\";\nimport { SortableHeader } from \"./cells/header\";\n\nimport { useCompanies } from \"@/queries/useCompanies\";\nimport { Chips } from \"@/components/Chips\";\nimport { ShimmerCell } from \"@/components/TableShimmer\";\nimport { useCFColumns } from \"@/queries/useCFColumns\";\nimport { createCFRows, getViewKey } from \"@/utils/customFields\";\nimport { selectTableRowNode } from \"@/utils/table\";\nimport { CFField } from \"./cells/cf-field\";\n\nimport { companyColumns } from \"@/constants/entity\";\nimport { GAINSIGHT_EVENTS } from \"@/constants/gainsightEvents\";\nimport { ENTITY_TYPES } from \"@/constants/custom-fields\";\nimport { useListingSearchText } from \"@/hooks/useListingSearchText\";\nimport { CDN_ASSETS } from \"@/constants/cdnAssets\";\nimport { CreateButton } from \"./actions/create\";\nimport {\n ColumnPreference,\n useColumnPreferences,\n} from \"@/features/column-preference\";\nimport { saveViewCFConfigs } from \"@/services/custom-fields/view-configs\";\n\nimport {\n AccountHealthIndicator,\n AccountSentimentCell,\n} from \"../insightCells\";\n\nimport type { ColumnType } from \"@/types/entity\";\nimport type { AccountHealthBand, AccountSentiment } from \"@/types/api\";\n\nconst getCFRows = createCFRows( field => <CFField field={field} /> );\nconst getCFShimmer = createCFRows( () => <ShimmerCell /> );\n\nconst ACCOUNT_SENTIMENT_COLUMN: ColumnType = {\n id: \"account_sentiment\",\n field: \"accountSentimentDisplay\",\n label: \"Account Sentiment\",\n visible: true,\n locked: true,\n sortable: false,\n style: { width: \"300px\" },\n};\n\n// Name cell component — CI health indicator (at-risk triangle) beside the name\nconst NameCell = ({ name, health, sentiment }: { name: string; health?: AccountHealthBand | null; sentiment?: AccountSentiment | null }) => (\n <span className=\"cm:inline-flex cm:min-w-0 cm:items-center cm:gap-1.5\">\n <TruncatedText text={name} className=\"cm:text-slate-900\" />\n <AccountHealthIndicator health={health} sentiment={sentiment} />\n </span>\n);\n\n// Domain cell component – renders all domains as chips with overflow tooltip\nconst DomainCell = ({ domains, fallback }: { domains: string[]; fallback: string }) => {\n if (!domains.length) {\n return <TruncatedText text={fallback} className=\"cm:text-slate-900\" />;\n }\n return <Chips values={domains} maxVisible={2} />;\n};\n\ninterface AccountTableProps {\n /** CI listing filter — the \"At Risk\" tab passes 'at_risk'; All passes nothing. */\n filterBy?: 'at_risk';\n /** Tab bar rendered between the toolbar and the table (CI All/At Risk tabs). */\n tabs?: React.ReactNode;\n /** Customer Intelligence gate — adds the sentiment column + at-risk indicator. */\n ciEnabled?: boolean;\n /** Reports the list response's at_risk_count up (drives At Risk tab visibility). */\n onAtRiskCount?: (count: number) => void;\n /** Reports the overall (unfiltered) account total up — the \"All\" tab chip. */\n onAllCount?: (count: number) => void;\n}\n\nexport default function AccountTable({ filterBy, tabs, ciEnabled = false, onAtRiskCount, onAllCount }: AccountTableProps = {}) {\n const navigate = useNavigate();\n // Forwarded onto the detail route so the breadcrumb can rebuild this URL,\n // selected tab included.\n const { search } = useLocation();\n\n const [ openCreate, setOpenCreate ] = useState(false);\n\n /*\n * BOTH BUILDS SCROLL INFINITELY.\n *\n * hui briefly used the toolkit's discrete `Pagination` to follow the Figma.\n * That was reverted on instruction: page controls are a deliberate divergence\n * from the design here, and the default scrolling behaviour is what this\n * surface should keep.\n *\n * Reverting it removed more than it added. The page-based path needed a\n * parallel `useCompaniesPage`, a `page` state, and a `useResetPageOnFilterChange`\n * to stop a filter applied on page 3 querying page 3 of a one-page result —\n * all of which are gone. It also closes two of the three sources of the\n * hui/prime JS delta recorded in the run's handover: `useCompaniesPage` and\n * `useContactsPage` were reachable from prime's entry (React forbids\n * conditional hook calls, so both hooks had to be called and one selected),\n * which put their code in Omni's bundle for a query that never ran there.\n */\n // Debounce and the three-character floor both live in the hook — see\n // `useListingSearchText`. Below the floor it returns undefined, which is the\n // same query key this table had before the field existed.\n const text = useListingSearchText(ENTITY_TYPES.COMPANY);\n\n const listParams = useMemo(\n () => (filterBy || text ? { ...(filterBy ? { filter_by: filterBy } : {}), ...(text ? { text } : {}) } : undefined),\n [filterBy, text],\n );\n\n const { companies, total, atRiskCount, listTotal, isLoading: isLoadingCompanies, refetch,\n hasNextPage, isFetchingNextPage, fetchNextPage } = useCompanies(listParams);\n\n // Report only real values — the POST filter path / loading yield undefined,\n // which must not clobber a previously reported count.\n useEffect(() => {\n if (typeof atRiskCount === 'number') onAtRiskCount?.(atRiskCount);\n }, [atRiskCount, onAtRiskCount]);\n\n // The overall total only comes from the UNfiltered list — the At Risk\n // table's `total` is the at-risk subset and must not feed the All chip.\n useEffect(() => {\n if (!filterBy && typeof listTotal === 'number') onAllCount?.(listTotal);\n }, [filterBy, listTotal, onAllCount]);\n const { parentCbRef, targetCbRef } = useIntersectObserver({\n callback: async () => {\n if (hasNextPage) {\n await fetchNextPage();\n }\n },\n selectTargetNode: selectTableRowNode,\n });\n\n const { data: columnsData = [], refetch: refetchCFColumns } = useCFColumns({\n entity_type: ENTITY_TYPES.COMPANY,\n defaultColumns: companyColumns,\n extraColumns: ciEnabled ? [ACCOUNT_SENTIMENT_COLUMN] : [],\n });\n\n const callbacks = useRenderConfigStore((state) => state.callbacks);\n\n\n const savePreferences = async ( columnPreferences: ColumnType[] ) => {\n const visibleItems = columnPreferences.map(item => getViewKey(item.id, item.visible ?? false));\n const success = await saveViewCFConfigs({ entity_type: ENTITY_TYPES.COMPANY, visible_items: visibleItems });\n if( !success ) return;\n refetchCFColumns();\n }\n\n const {\n preferences,\n togglePreference,\n reorderPreferences,\n setAllVisible,\n } = useColumnPreferences({ items: columnsData, savePreferences });\n\n const isLoading = isLoadingCompanies || preferences.length === 0;\n\n const columns = useMemo(() => {\n // sortable === false keeps a plain header — SortableHeader would offer a\n // sort the listing API doesn't support (e.g. account_sentiment).\n return preferences.filter(item => item?.visible).map(item => (\n item.sortable === false\n ? item\n : {\n ...item,\n label: <SortableHeader title={item.label} entityType={ENTITY_TYPES.COMPANY} field={item.sortId || item.id} isCF={!item.locked} />\n }\n ));\n }, [preferences]);\n\n // Transform company results to table data\n const tableData = useMemo(() => {\n if (!companies) return [];\n\n const tableData = companies.map((company) => {\n const domainNames = (company.domains || [])\n .map((domain) => domain?.name)\n .filter((name): name is string => !!name);\n\n return {\n id: company.id,\n name: formatValue(\n company.generated_name ? company.generated_name : company.name\n ),\n domain: formatValue(domainNames[0] || company.generated_name),\n nameDisplay: (\n <NameCell\n name={formatValue(\n company.generated_name ? company.generated_name : company.name\n )}\n health={ciEnabled ? company.account_health : undefined}\n sentiment={ciEnabled ? company.account_sentiment : undefined}\n />\n ),\n domainDisplay: (\n <DomainCell\n domains={domainNames}\n fallback={formatValue(company.generated_name)}\n />\n ),\n ...(ciEnabled\n ? {\n accountSentimentDisplay: (\n <AccountSentimentCell sentiment={company.account_sentiment} />\n ),\n }\n : {}),\n isNoDataRow: false,\n ...getCFRows(company.custom_fields),\n };\n });\n\n const customFields = companies[0]?.custom_fields;\n\n // Shimmer rows at the end whenever there are more pages — the tail the\n // intersection observer watches to pull the next one in.\n if (hasNextPage) {\n const shimmerRows = Array.from({ length: 3 }, (_, index) => ({\n id: `shimmer-${index}`,\n name: \"\",\n domain: \"\",\n nameDisplay: <ShimmerCell nodeRef={ !index && !isFetchingNextPage ? targetCbRef : null} />,\n domainDisplay: <ShimmerCell />,\n ...(ciEnabled ? { accountSentimentDisplay: <ShimmerCell /> } : {}),\n isShimmerRow: true,\n isNoDataRow: true,\n ...getCFShimmer(customFields)\n }));\n return [...tableData, ...shimmerRows];\n }\n\n return tableData;\n }, [companies, isLoading, hasNextPage, isFetchingNextPage, targetCbRef, ciEnabled]);\n\n const onCreateSuccess = () => {\n setOpenCreate(false);\n refetch();\n };\n\n // Check if we should show empty state - only when loading is done and we have no data\n // A filter or a search that matches nothing is not an empty workspace — it\n // gets \"No … found\" and no \"will start showing up\" explainer.\n const hasFilters = useFiltersStore((state) => state.company.filters.length > 0);\n const isNarrowed = hasFilters || !!text;\n const showEmptyState = !isLoading && ( !companies || companies.length === 0)\n\n\n const handleAccountClick = (event: {\n data: { id: string; isNoDataRow?: boolean };\n }) => {\n const data = event.data;\n // Don't navigate if it's a no-data row\n if (data.isNoDataRow) {\n return;\n }\n callbacks?.sendGainsightEvent?.(GAINSIGHT_EVENTS.ACCOUNT_ROW_CLICKED);\n if (filterBy === 'at_risk') {\n // `data.id` is typed `string` but is actually the row's numeric\n // `Company.id` passed straight through by the table — compare both\n // sides as strings so this doesn't depend on which one is accurate.\n const company = companies?.find(\n (item) => String(item.id) === String(data.id)\n );\n callbacks?.sendGainsightEvent?.(\n GAINSIGHT_EVENTS.CUSTOMER_INTELLIGENCE_AT_RISK_ACCOUNT_OPENED,\n {\n account_id: data.id,\n health_badge: company?.account_health,\n account_sentiment: company?.account_sentiment,\n source: 'customer_module',\n }\n );\n }\n navigate({ pathname: `/accounts/${data.id}`, search });\n };\n \n const renderTable = () => {\n if( isLoading && !columns.length ){\n return (\n <div className=\"cm:flex cm:items-center cm:justify-center cm:w-full cm:h-full\">\n <Loader />\n </div>\n )\n }\n if (showEmptyState) {\n return (\n <div className=\"cm-listing-empty cm:px-12 cm:flex cm:flex-col cm:flex-1\">\n <EmptyState\n title={isNarrowed ? \"No accounts found\" : \"No accounts yet\"}\n iconContent={CDN_ASSETS.hiverBee2}\n subcopy={isNarrowed ? undefined : \"Accounts will start showing up here when new conversations are created.\"}\n />\n </div>\n );\n }\n\n return (\n <DataTable\n scrollable={true}\n value={tableData}\n columns={columns}\n onRowClick={handleAccountClick}\n loading={isLoading}\n loadingIcon={<Loader />}\n />\n )\n }\n // Only show table if we have valid data with companies\n return (\n <>\n <style>\n {`\n .cm-root .account-table-datatable .omni-datatable{\n flex-basis: 0;\n flex-grow: 1;\n min-height: 0;\n margin-bottom: 30px;\n }\n .cm-root .account-table-datatable .omni-datatable .p-datatable-table{\n width: max-content !important;\n min-width: 100% !important;\n }\n .cm-root .account-table-datatable .omni-datatable .p-datatable-wrapper{\n border-top-left-radius: 0 !important;\n border-top-right-radius: 0 !important;\n border-top: 0 !important;\n max-height: 100%;\n }\n .cm-root .omni-datatable .p-datatable-tbody > tr > td{\n border-bottom: none !important;\n }\n `}\n </style>\n <div className=\"cm-listing-shell cm:px-12 cm:w-full cm:flex cm:flex-col cm:flex-1 cm:basis-0 cm:min-h-0 account-table-datatable\" ref={parentCbRef}>\n <EntityToolbar \n total={total} \n entityType={ENTITY_TYPES.COMPANY} \n extraActions={\n <ColumnPreference\n items={preferences}\n onToggle={togglePreference}\n onReorder={reorderPreferences}\n onSelectAll={setAllVisible}\n />\n }\n rightNode={\n <CreateButton entityType={ENTITY_TYPES.COMPANY} onClick={() => setOpenCreate(true)} />\n }\n />\n {tabs && (\n // Continues the card sides between the rounded toolbar cap and the\n // table (whose own top border/radius is stripped by the style block).\n <div className=\"cm:shrink-0 cm:border-x cm:border-b cm:border-slate-border-light cm:bg-white\">\n {tabs}\n </div>\n )}\n {renderTable()}\n </div>\n <CreateEditEntity\n open={openCreate}\n onClose={() => setOpenCreate(false)}\n onSuccess={onCreateSuccess}\n entityType={ENTITY_TYPES.COMPANY}\n />\n </>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Tabs } from 'hiver-ui-kit-extended';\nimport { cn } from '@/utils/classNames';\nimport AccountTable from '../components/Listing/AccountTable';\nimport AccountTableV2 from '../components/Listing/v2/AccountTable';\nimport { ScopedStyles } from '@/components/Styles';\nimport { GAINSIGHT_EVENTS } from '@/constants/gainsightEvents';\nimport { useRenderConfigStore } from '@/stores/renderConfig';\nimport { useFeature } from '@/hooks/useFeature';\nimport { FEATURES } from '@/constants/features';\nimport { ACCOUNT_LIST_TABS, LIST_TAB_PARAM } from '@/constants/routes';\n\nimport type { AccountListTab } from '@/constants/routes';\n\n/** All is the default, so it's the param's absence rather than ?tab=all. */\nconst setTabParam = (tab: AccountListTab) => (current: URLSearchParams) => {\n const next = new URLSearchParams(current);\n if (tab === ACCOUNT_LIST_TABS.AT_RISK) next.set(LIST_TAB_PARAM, tab);\n else next.delete(LIST_TAB_PARAM);\n return next;\n};\n\n/** Count pill beside a tab label (e.g. \"All ⑬\"). Nothing until count known. */\nconst TabCountChip = ({ count, active }: { count?: number; active: boolean }) =>\n typeof count === 'number' ? (\n <span\n className={cn(\n 'cm-tab-count-chip cm:ml-1.5 cm:inline-flex cm:h-[18px] cm:min-w-[18px] cm:items-center cm:justify-center cm:rounded-full cm:px-1.5 cm:text-xs cm:leading-none cm:font-medium',\n active\n ? 'cm-tab-count-chip--active cm:bg-[#E2E8F0] cm:text-slate-text-body'\n : 'cm-tab-count-chip--inactive cm:bg-[#F1F5F9] cm:text-slate-text-subtle'\n )}\n >\n {count}\n </span>\n ) : null;\n\nconst Accounts: React.FC = () => {\n const callbacks = useRenderConfigStore((state) => state.callbacks);\n const customFieldsEnabled = useFeature(FEATURES.CUSTOM_FIELDS_ENABLED);\n // Customer Intelligence gate — the All/At Risk tabs (and the sentiment\n // column + at-risk indicator inside the table) only exist when ON.\n const ciEnabled = useFeature(FEATURES.CUSTOMER_INTELLIGENCE_ENABLED);\n\n // CI listing tabs: All (unfiltered — the existing screen) / At Risk (same\n // table + API with ?filter_by=at_risk); each tab mounts its own table instance.\n // In the URL so it survives the unmount when a detail page opens.\n const [searchParams, setSearchParams] = useSearchParams();\n // Unrecognised values normalise to All.\n const tab =\n searchParams.get(LIST_TAB_PARAM) === ACCOUNT_LIST_TABS.AT_RISK\n ? ACCOUNT_LIST_TABS.AT_RISK\n : ACCOUNT_LIST_TABS.ALL;\n const hasTabParam = searchParams.has(LIST_TAB_PARAM);\n // at_risk_count from the companies list response. Reported up by the table;\n // undefined until the first list response lands (tab stays visible while\n // unknown — it only hides on a confirmed 0).\n const [atRiskCount, setAtRiskCount] = useState<number | undefined>(undefined);\n // Overall (unfiltered) account total — the \"All\" chip. Deliberately NOT the\n // live query total: custom-field filtering must not change the chip.\n const [allCount, setAllCount] = useState<number | undefined>(undefined);\n const showAtRiskTab = atRiskCount !== 0;\n // Guarded — index 1 only exists while the At Risk tab is rendered.\n const activeIndex = tab === ACCOUNT_LIST_TABS.AT_RISK && showAtRiskTab ? 1 : 0;\n // TabItem.label is typed string but rendered as a ReactNode child at\n // runtime (ui-kit renderHeader), so label nodes with count chips work.\n const tabsItems = [\n {\n label: (\n <span className=\"cm:inline-flex cm:items-center\">\n All\n <TabCountChip count={allCount} active={activeIndex === 0} />\n </span>\n ) as unknown as string,\n content: '',\n },\n ...(showAtRiskTab\n ? [\n {\n label: (\n <span className=\"cm:inline-flex cm:items-center\">\n At Risk\n <TabCountChip count={atRiskCount} active={activeIndex === 1} />\n </span>\n ) as unknown as string,\n content: '',\n },\n ]\n : []),\n ];\n const onTabChange = (e: unknown) => {\n const index = (e as { index: number })?.index;\n if (index === 1) {\n // Fired on the click itself — `atRiskCount` is whatever's already in\n // state (from the \"All\" tab's list response), no fetch awaited here.\n callbacks?.sendGainsightEvent?.(\n GAINSIGHT_EVENTS.CUSTOMER_INTELLIGENCE_AT_RISK_TAB_OPENED,\n { at_risk_account_count: atRiskCount, source: 'customer_module' }\n );\n }\n setSearchParams(\n setTabParam(index === 1 ? ACCOUNT_LIST_TABS.AT_RISK : ACCOUNT_LIST_TABS.ALL),\n // Replace, not push — pushing stacks a history entry per toggle.\n { replace: true }\n );\n };\n\n // If the count drops to 0 while the user sits on At Risk, fall back to All\n // (the tab they're on no longer exists) and clear the dead param.\n useEffect(() => {\n if (showAtRiskTab || !hasTabParam) return;\n setSearchParams(setTabParam(ACCOUNT_LIST_TABS.ALL), { replace: true });\n }, [showAtRiskTab, hasTabParam, setSearchParams]);\n\n useEffect(() => {\n if (callbacks?.sendGainsightEvent) {\n callbacks.sendGainsightEvent(GAINSIGHT_EVENTS.ACCOUNT_LIST_VIEWED);\n }\n }, [callbacks]);\n\n if (!customFieldsEnabled) {\n // Legacy table path — CI gate passed down for the column/indicator.\n return (\n <div className=\"cm:w-full cm:flex cm:flex-col cm:flex-1 cm:basis-0 cm:min-h-0\">\n <AccountTable ciEnabled={ciEnabled} />\n </div>\n );\n }\n\n // CI OFF: the pre-CI single table (no tabs, no At Risk, no sentiment column).\n if (!ciEnabled) {\n return (\n <div className=\"cm:w-full cm:flex cm:flex-col cm:flex-1 cm:basis-0 cm:min-h-0\">\n <AccountTableV2 ciEnabled={false} />\n </div>\n );\n }\n\n // Rendered inside the table card, between the toolbar and the table header\n // (design). State lives here so each tab mounts its own table instance.\n const tabsNode = (\n <>\n <ScopedStyles>\n {`\n .omni-tabs-primereact li:first-child {\n margin-left: 20px !important;\n }\n .omni-tabs-primereact li.p-unselectable-text .p-tabview-nav-link {\n padding: 14px 4px !important;\n }\n `}\n </ScopedStyles>\n <Tabs value={activeIndex} onTabChange={onTabChange} items={tabsItems} />\n </>\n );\n\n return (\n <div className=\"cm:w-full cm:flex cm:flex-col cm:flex-1 cm:basis-0 cm:min-h-0\">\n {activeIndex === 0 && (\n <AccountTableV2\n ciEnabled\n tabs={tabsNode}\n onAtRiskCount={setAtRiskCount}\n onAllCount={setAllCount}\n />\n )}\n {activeIndex === 1 && (\n <AccountTableV2\n ciEnabled\n filterBy=\"at_risk\"\n tabs={tabsNode}\n onAtRiskCount={setAtRiskCount}\n onAllCount={setAllCount}\n />\n )}\n </div>\n );\n};\n\nexport default Accounts;\n","export default \"data:image/svg+xml,%3csvg%20width='14'%20height='14'%20viewBox='0%200%2014%2014'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_960_14978)'%3e%3cpath%20d='M6.41666%202.33314H3.96666C2.98656%202.33314%202.49652%202.33314%202.12217%202.52388C1.79289%202.69166%201.52517%202.95938%201.35739%203.28866C1.16666%203.663%201.16666%204.15305%201.16666%205.13314V10.0332C1.16666%2011.0132%201.16666%2011.5033%201.35739%2011.8776C1.52517%2012.2069%201.79289%2012.4746%202.12217%2012.6424C2.49652%2012.8331%202.98656%2012.8331%203.96666%2012.8331H8.86666C9.84677%2012.8331%2010.3368%2012.8331%2010.7112%2012.6424C11.0404%2012.4746%2011.3081%2012.2069%2011.4759%2011.8776C11.6667%2011.5033%2011.6667%2011.0132%2011.6667%2010.0332V7.58315M4.66664%209.33315H5.64346C5.92881%209.33315%206.0715%209.33315%206.20578%209.30089C6.32478%209.27231%206.43859%209.22518%206.54301%209.16124C6.66072%209.08908%206.76164%208.98817%206.96341%208.78639L12.5417%203.20814C13.0249%202.72489%2013.0249%201.94139%2012.5417%201.45814C12.0584%200.974894%2011.2749%200.974888%2010.7917%201.45814L5.21337%207.03639C5.0116%207.23817%204.91071%207.33908%204.83856%207.4568C4.7746%207.56122%204.72746%207.67497%204.69887%207.79403C4.66664%207.92831%204.66664%208.07099%204.66664%208.35636V9.33315Z'%20stroke='%230C3E9D'%20stroke-width='1.1'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_960_14978'%3e%3crect%20width='14'%20height='14'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='14'%20height='14'%20viewBox='0%200%2014%2014'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M4.88862%205.1644C5.29462%206.01001%205.84808%206.80255%206.549%207.50347C7.24992%208.20439%208.04246%208.75785%208.88807%209.16385C8.96081%209.19877%208.99717%209.21623%209.04319%209.22965C9.20673%209.27732%209.40755%209.24308%209.54605%209.1439C9.58502%209.116%209.61837%209.08266%209.68505%209.01597C9.88898%208.81204%209.99095%208.71007%2010.0935%208.6434C10.4802%208.39199%2010.9787%208.39199%2011.3654%208.6434C11.4679%208.71007%2011.5699%208.81204%2011.7738%209.01597L11.8875%209.12965C12.1975%209.43966%2012.3525%209.59466%2012.4367%209.76113C12.6042%2010.0922%2012.6042%2010.4832%2012.4367%2010.8143C12.3525%2010.9807%2012.1975%2011.1358%2011.8875%2011.4458L11.7955%2011.5377C11.4866%2011.8467%2011.3321%2012.0011%2011.1221%2012.1191C10.889%2012.25%2010.5271%2012.3442%2010.2598%2012.3434C10.0189%2012.3426%209.85428%2012.2959%209.52502%2012.2025C7.75554%2011.7002%206.08583%2010.7526%204.69284%209.35962C3.29985%207.96664%202.35224%206.29693%201.85001%204.52744C1.75656%204.19818%201.70983%204.03355%201.70911%203.79267C1.70832%203.52537%201.80244%203.16342%201.93336%202.93037C2.05133%202.72035%202.20581%202.56588%202.51476%202.25693L2.60671%202.16498C2.91672%201.85497%203.07172%201.69997%203.23819%201.61577C3.56927%201.44831%203.96026%201.44831%204.29134%201.61577C4.45781%201.69997%204.61281%201.85497%204.92282%202.16498L5.03649%202.27865C5.24043%202.48259%205.3424%202.58456%205.40907%202.6871C5.66048%203.07378%205.66048%203.57229%205.40907%203.95898C5.3424%204.06151%205.24043%204.16348%205.03649%204.36742C4.96981%204.4341%204.93647%204.46744%204.90856%204.50641C4.80939%204.64492%204.77515%204.84573%204.82282%205.00927C4.83623%205.05529%204.8537%205.09166%204.88862%205.1644Z'%20stroke='%2394A3B8'%20stroke-width='1.3'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","/**\n * Temporary compliance block on agent-initiated outbound calls.\n *\n * Outbound calling is restricted while legal and compliance questions are being resolved. Flip\n * this constant to `false` to restore the button here.\n *\n * It is NOT the whole revert. outlook-ui guards its voice store's `startOutbound`, which every\n * entry point funnels through, so flipping this alone would give agents an enabled-looking button\n * whose calls are still refused by the host — worse than the current honest disabled state.\n * Restoring outbound calling means flipping BOTH this and OUTBOUND_CALLS_BLOCKED in\n * outlook-ui (packages/voice/src/constants/outboundCalls.constants.ts). The host guard is the\n * enforcement; this constant is only the presentation.\n *\n * Here it only affects the contact list's phone button, which is disabled and explains itself on\n * hover rather than disappearing: an agent should be able to see that calling exists and is\n * currently unavailable, not wonder whether the feature broke.\n *\n * The host application blocks the call itself. outlook-ui guards its voice store's\n * `startOutbound`, which every entry point funnels through, so the `onPhoneClick` callback cannot\n * place a call even if this button were somehow reachable. This constant governs presentation;\n * that guard governs behaviour.\n */\nexport const OUTBOUND_CALLS_BLOCKED = true;\n\n/** Hover copy for the disabled button. Matches the wording used in outlook-ui. */\nexport const OUTBOUND_CALLS_BLOCKED_MESSAGE =\n 'Outbound calls are restricted at the moment';\n","import { useState } from 'react';\nimport { formatValue, formatContactName } from '../../utils/formatValue';\nimport Avatar from '../Avatar';\nimport { getAvatarInitials, getColorKeyForLabel, v2AvatarColors } from '../Avatar/constants';\nimport { Avatar as KitAvatar } from 'hiver-ui-kit-extended';\nimport { IS_HUI } from '@/constants/uiFramework';\nimport composeMail from '../../assets/compose_mail.svg';\nimport phoneIcon from '../../assets/phone.svg';\n// Separate asset rather than a CSS filter on phone.svg: the two differ only in stroke\n// colour (#64758B enabled vs #94A3B8 blocked, straight from the Figma export) and\n// filter-shifting one hex to another is guesswork that drifts the moment either changes.\nimport phoneIconDisabled from '../../assets/phone-disabled.svg';\nimport { useRenderConfigStore } from '../../stores/renderConfig';\nimport TruncatedText from '../TruncatedText';\nimport { GAINSIGHT_EVENTS } from '../../constants/gainsightEvents';\nimport Tooltip from '../Tooltip';\nimport {\n OUTBOUND_CALLS_BLOCKED,\n OUTBOUND_CALLS_BLOCKED_MESSAGE,\n} from '../../constants/outboundCalls';\n\n/**\n * EVERY TAILWIND UTILITY IN THIS FILE MUST CARRY THE `cm:` PREFIX.\n *\n * `src/index.css` imports Tailwind as `@import \"tailwindcss\" prefix(cm)`, so this\n * module only ever generates `cm:`-prefixed utilities. An unprefixed `flex` or\n * `gap-2` here generates nothing from our own CSS — yet it still *worked* on the\n * primereact build, because the toolkit's stylesheet is a full UNPREFIXED\n * Tailwind build and prime loads it. The hui build loads no toolkit stylesheet,\n * so the identical class list resolved to nothing and this cell rendered as a\n * plain `display: block` div: the avatar and the name with no flex row and no\n * gap between them.\n *\n * That is why the defect was invisible until a hui build existed, and why\n * reading one build cannot catch it. The fix is the prefix — not a rule\n * somewhere else that puts the gap back.\n */\n\n// Name cell with avatar\nexport const NameCellWithAvatar = ({\n name,\n channelType,\n avatarSize = 'default',\n containerClassName = 'cm:flex cm:items-center cm:gap-2 cm:min-w-0',\n textClassName = 'cm:text-sm cm:text-slate-900 cm:truncate'\n}: {\n name: string;\n /** Contact's `channel_type`; the \"Unknown\" fallback applies to Space contacts only. */\n channelType?: number | string | null;\n avatarSize?: 'default' | 'small' | 'large';\n containerClassName?: string;\n textClassName?: string;\n}) => {\n // Falls back to \"Unknown\" so a nameless voice contact (a call is only a phone number until\n // someone names it) renders as a named row rather than an empty cell. The avatar takes the\n // same value so its initial matches what is shown.\n const displayName = formatContactName(name, channelType);\n return (\n <div className={containerClassName}>\n {/* hui: the design system's tinted 24px monogram (v2 Avatar, xs). */}\n {IS_HUI ? (\n <KitAvatar\n label={getAvatarInitials(displayName)}\n color={v2AvatarColors[getColorKeyForLabel(displayName)]}\n size=\"xs\"\n />\n ) : (\n <Avatar name={displayName} labelName={displayName} size={avatarSize} />\n )}\n <TruncatedText\n text={displayName}\n className={textClassName}\n />\n </div>\n );\n};\n\n// Email cell with primary color styling and compose icon on hover\nexport const EmailCellWithCompose = ({\n email,\n onCompose,\n baseClassName = 'cm:text-sm cm:truncate cm:block',\n containerClassName = 'cm:flex cm:items-center cm:gap-1',\n}: {\n email: string;\n onCompose?: (email: string) => void;\n baseClassName?: string;\n containerClassName?: string;\n}) => {\n const [isHovered, setIsHovered] = useState(false);\n const isComposeEnabled = useRenderConfigStore((state) => state.isComposeEnabled);\n const displayValue = formatValue(email);\n const hasValidEmail = displayValue !== \"-\" && email;\n const canCompose = hasValidEmail && onCompose && isComposeEnabled;\n\n const handleComposeClick = (e: React.MouseEvent) => {\n e.stopPropagation(); // Prevent row click\n if (canCompose) {\n onCompose(email);\n }\n };\n\n return (\n <div\n className={containerClassName}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <TruncatedText\n text={displayValue}\n className={`cm-link ${baseClassName} !text-primary-text-default ${\n canCompose\n ? \"cursor-pointer hover:underline\"\n : \"\"\n }`}\n >\n <span\n onClick={canCompose ? handleComposeClick : undefined}\n style={{ color: displayValue === '-' ? 'var(--cm-color-slate-text-body)' : (canCompose ? 'var(--cm-color-primary-text-default)' : 'var(--cm-color-slate-text-body)') }}\n className={`cm-link ${baseClassName} !text-primary-text-default ${\n canCompose\n ? \"cursor-pointer hover:underline\"\n : \"\"\n }`}\n >\n {displayValue}\n </span>\n </TruncatedText>\n {canCompose && (\n <button\n onClick={handleComposeClick}\n className=\"cm:flex cm:items-center cm:justify-center cm:shrink-0 cm:cursor-pointer cm:w-3.5 cm:h-3.5\"\n style={{\n opacity: isHovered ? 1 : 0,\n pointerEvents: isHovered ? 'auto' : 'none',\n transition: 'opacity 0.2s ease-in-out'\n }}\n aria-label=\"Compose email\"\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <img\n src={composeMail}\n alt=\"compose email\"\n className=\"cm:w-3.5 cm:h-3.5\"\n />\n </button>\n )}\n </div>\n );\n};\n\n// Phone cell\nexport const PhoneCell = ({\n phone,\n className = 'cm:text-slate-900',\n style = { color: 'var(--cm-color-slate-text-body)' },\n baseClassName = 'cm:text-sm cm:truncate cm:block'\n}: {\n phone: string;\n className?: string;\n style?: React.CSSProperties;\n baseClassName?: string;\n}) => {\n const displayValue = formatValue(phone);\n return (\n <TruncatedText\n text={displayValue}\n className={`${baseClassName} ${className}`}\n style={style}\n />\n );\n};\n\n// Phone call button cell\nexport const PhoneCallCell = ({\n phone,\n contactId,\n contactName,\n accountId,\n}: {\n phone: string | null;\n contactId: number;\n contactName?: string;\n accountId?: number;\n}) => {\n const callbacks = useRenderConfigStore((state) => state.callbacks);\n const hasPhone = phone != null && phone !== '' && formatValue(phone) !== '-';\n\n if (!hasPhone || !callbacks?.onPhoneClick) return null;\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n callbacks.sendGainsightEvent?.(GAINSIGHT_EVENTS.PHONE_NUMBER_CLICKED);\n callbacks.onPhoneClick?.({\n phoneNumber: phone,\n contactId,\n contactName,\n accountId,\n source: 'contactList',\n });\n };\n\n const icon = (\n <img src={phoneIcon} alt=\"Call\" style={{ width: '14px', height: '14px', filter: 'brightness(0) invert(1)' }} />\n );\n\n // Same 14px glyph, but on the muted fill it is shown in its own slate stroke instead of being\n // inverted to white — the design's blocked state, and unreadable if left white.\n const iconDisabled = (\n <img src={phoneIconDisabled} alt=\"\" style={{ width: '14px', height: '14px' }} />\n );\n\n // Outbound calling is restricted for compliance. The button stays visible but inert and says\n // why on hover, rather than vanishing — an agent should see that calling exists and is\n // currently unavailable, not assume it broke. The host application also refuses the call\n // itself, so this is the explanation, not the enforcement.\n if (OUTBOUND_CALLS_BLOCKED) {\n return (\n <Tooltip\n content={\n <span className=\"cm:text-white cm:text-sm cm:font-normal cm:leading-5 cm:whitespace-nowrap\">\n {OUTBOUND_CALLS_BLOCKED_MESSAGE}\n </span>\n }\n triggerClassName=\"cm:inline-flex\"\n >\n {/*\n `aria-disabled` rather than the `disabled` attribute: Chrome does not dispatch mouse\n events over a disabled form control, which would stop the tooltip from ever appearing —\n and the tooltip is the entire point of leaving the button on screen. The click is a\n no-op instead, so the button is inert either way.\n */}\n <button\n type=\"button\"\n aria-disabled=\"true\"\n onClick={(e) => e.stopPropagation()}\n className=\"cm-phone-call-btn cm-phone-call-btn--disabled\"\n aria-label={OUTBOUND_CALLS_BLOCKED_MESSAGE}\n >\n {iconDisabled}\n </button>\n </Tooltip>\n );\n }\n\n return (\n <button\n onClick={handleClick}\n className=\"cm-phone-call-btn\"\n aria-label=\"Call contact\"\n >\n {icon}\n </button>\n );\n};\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { DataTable } from \"hiver-ui-kit-extended\";\nimport { useNavigate } from 'react-router-dom';\nimport { useContactsStore } from '../../stores/contacts';\nimport { formatValue } from '../../utils/formatValue';\nimport { useTableInfiniteScroll } from '../../hooks/useTableInfiniteScroll';\nimport { GAINSIGHT_EVENTS } from '@/constants/gainsightEvents';\nimport { useRenderConfigStore } from '@/stores/renderConfig';\nimport EmptyState from '../EmptyState';\nimport LoadErrorState from './LoadErrorState';\nimport Loader from '../Loader';\nimport { NameCellWithAvatar, EmailCellWithCompose, PhoneCell, PhoneCallCell } from '../TableCells';\nimport TruncatedText from '../TruncatedText';\nimport { useFeature } from '@/hooks/useFeature';\nimport { FEATURES } from '@/constants/features';\n\n// Shimmer cell component\nconst ShimmerCell = () => (\n <div className=\"cm:h-4 cm:bg-gray-200 cm:rounded cm:w-3/4 cm:animate-pulse\"></div>\n);\n\n// Account cell\nconst AccountCell = ({ account }: { account: string }) => {\n const displayValue = formatValue(account);\n return (\n <TruncatedText \n text={displayValue}\n className=\"text-slate-900\"\n />\n );\n};\n\nconst baseColumns = [\n {\n id: \"name\",\n field: \"nameDisplay\",\n label: \"Name\",\n style: { width: \"30%\" },\n },\n {\n id: \"email\",\n field: \"emailDisplay\",\n label: \"Email\",\n style: { width: \"30%\" },\n },\n {\n id: \"phone\",\n field: \"phoneDisplay\",\n label: \"Phone Number\",\n style: { width: \"20%\" },\n },\n];\n\nconst phoneCallColumn = {\n id: \"phoneCall\",\n field: \"phoneCallDisplay\",\n label: \"\",\n style: { width: \"60px\" },\n};\n\nconst accountColumn = {\n id: \"account\",\n field: \"accountDisplay\",\n label: \"Account\",\n style: { width: \"20%\" },\n};\n\nexport default function ContactTable() {\n const {\n data,\n isLoading,\n error,\n errorStatus,\n fetchContacts,\n fetchNextPage,\n setData\n } = useContactsStore();\n\n const navigate = useNavigate();\n const wrapperRef = useRef<HTMLDivElement>(null);\n const callbacks = useRenderConfigStore((state) => state.callbacks);\n const isVoiceEnabled = useFeature(FEATURES.VOICE_ENABLED);\n const [isInitialFetch, setIsInitialFetch] = useState(true);\n const hasFetchedRef = useRef(false);\n\n const showPhoneCall = isVoiceEnabled && !!callbacks?.onPhoneClick;\n\n const columns = useMemo(() => {\n return showPhoneCall\n ? [...baseColumns, phoneCallColumn, accountColumn]\n : [...baseColumns, accountColumn];\n }, [showPhoneCall]);\n\n useEffect(() => {\n // Always fetch on mount, but prevent duplicate calls if already fetching\n if (hasFetchedRef.current) {\n return;\n }\n\n // Clear old data immediately to prevent flash\n setData(null);\n setIsInitialFetch(true);\n hasFetchedRef.current = true;\n fetchContacts().finally(() => {\n setIsInitialFetch(false);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // Empty dependency array - only run on mount\n\n // Calculate if there are more pages to load\n const hasMorePages = useMemo(() => {\n if (!data) return false;\n const { total, page, page_size } = data;\n // Check if current loaded items are less than total\n return (page * page_size) < total;\n }, [data]);\n\n // Transform data with custom renderers\n const tableData = useMemo(() => {\n // Return empty array immediately when loading initial data to prevent showing old data\n if (isLoading && (!data || !data.contacts || data.contacts.length === 0)) {\n return [];\n }\n \n if (!data?.contacts) return [];\n\n const handleComposeEmail = (email: string) => {\n callbacks?.onCompose?.(email);\n };\n \n const contacts = data.contacts.map((result) => ({\n ...result,\n nameDisplay: <NameCellWithAvatar name={result.name} channelType={result.channel_type} />,\n emailDisplay: <EmailCellWithCompose email={result.email} onCompose={handleComposeEmail} />,\n phoneDisplay: <PhoneCell phone={result.phone_number || ''} />,\n ...(showPhoneCall && { phoneCallDisplay: <PhoneCallCell phone={result.phone_number} contactId={result.id} contactName={result.name} accountId={result.company?.id} /> }),\n accountDisplay: <AccountCell account={result.company?.name || ''} />,\n isNoDataRow: false,\n }));\n\n // Add shimmer rows at the end when there are more pages\n if (hasMorePages) {\n const shimmerRows = Array.from({ length: 3 }, (_, index) => ({\n id: `shimmer-${index}`,\n name: '',\n email: '',\n phone_number: '',\n company: null,\n nameDisplay: <ShimmerCell />,\n emailDisplay: <ShimmerCell />,\n phoneDisplay: <ShimmerCell />,\n phoneCallDisplay: null,\n accountDisplay: <ShimmerCell />,\n isShimmerRow: true,\n isNoDataRow: true, // Make them non-clickable\n }));\n return [...contacts, ...shimmerRows];\n }\n\n return contacts;\n }, [data, isLoading, hasMorePages, callbacks]);\n\n // Check if we should show empty state - only when loading is done and we have no data\n const showEmptyState = useMemo(() => {\n return !isLoading && (!data || !data.contacts || data.contacts.length === 0);\n }, [isLoading, data]);\n\n // Handle infinite scroll with reusable hook\n useTableInfiniteScroll({\n wrapperRef,\n tableData,\n isLoading,\n hasMorePages,\n onIntersect: async () => {\n if (hasMorePages) {\n await fetchNextPage();\n }\n },\n threshold: 200,\n });\n\n // A failure — 5xx from the proxy, 401 session expiry, a network drop — is\n // not \"you have no contacts\"; retry the fetch as it was issued.\n const handleRetry = () => {\n fetchContacts();\n };\n\n const handleContactClick = (event: { data: { id: string; isNoDataRow?: boolean } }) => {\n const data = event.data;\n // Don't navigate if it's a no-data row\n if (data.isNoDataRow) {\n return;\n }\n callbacks?.sendGainsightEvent?.(GAINSIGHT_EVENTS.CONTACT_ROW_CLICKED);\n navigate(`/contacts/${data.id}`);\n };\n\n // Show loader during initial fetch - don't show old data\n if (isInitialFetch || (isLoading && (!data || !data.contacts || data.contacts.length === 0))) {\n return (\n <div className=\"cm:flex cm:items-center cm:justify-center cm:w-full cm:h-full\">\n <Loader />\n </div>\n );\n }\n\n // The error state is scoped to \"nothing on screen\": `errorStatus` is one\n // store field written by the initial fetch *and* by `fetchNextPage`, so\n // without this guard a failure while paginating would replace the rows the\n // user is already reading with a full-screen recovery state.\n const hasRows = (data?.contacts?.length ?? 0) > 0;\n\n // Any failure is a failure, not an empty list. This has to sit above\n // the empty state: `data` is null after a failed fetch, so without it a 500,\n // a 401 or an offline browser all render as \"No contacts found\".\n if ((errorStatus !== null || error) && !hasRows) {\n return <LoadErrorState entityLabel=\"contacts\" onRetry={handleRetry} />;\n }\n\n // Show empty state when we have data but no contacts OR if tableData is empty\n if (showEmptyState || tableData.length === 0) {\n return (\n <div className=\"cm:px-12 cm:flex cm:flex-col cm:flex-1\">\n <EmptyState\n title=\"No contacts found\"\n subcopy=\"Contacts will start showing up here when new conversations are created.\"\n />\n </div>\n );\n }\n\n // Only show table if we have valid data with contacts\n if (!data || !data.contacts || data.contacts.length === 0) {\n return null;\n }\n\n return (\n <>\n <style>{`\n .cm-root .contact-table-datatable .p-datatable-thead > tr > th:nth-child(1),\n .cm-root .contact-table-datatable .p-datatable-tbody > tr > td:nth-child(1) {\n width: 30% !important;\n min-width: 30% !important;\n max-width: 30% !important;\n overflow: hidden !important;\n text-overflow: ellipsis !important;\n }\n .cm-root .contact-table-datatable .p-datatable-thead > tr > th:nth-child(2),\n .cm-root .contact-table-datatable .p-datatable-tbody > tr > td:nth-child(2) {\n width: 30% !important;\n min-width: 30% !important;\n max-width: 30% !important;\n overflow: hidden !important;\n text-overflow: ellipsis !important;\n }\n .cm-root .contact-table-datatable .p-datatable-thead > tr > th:nth-child(3),\n .cm-root .contact-table-datatable .p-datatable-tbody > tr > td:nth-child(3) {\n width: 20% !important;\n min-width: 20% !important;\n max-width: 20% !important;\n overflow: hidden !important;\n text-overflow: ellipsis !important;\n }\n ${showPhoneCall ? `\n .cm-root .contact-table-datatable .p-datatable-thead > tr > th:nth-child(4),\n .cm-root .contact-table-datatable .p-datatable-tbody > tr > td:nth-child(4) {\n width: 60px !important;\n min-width: 60px !important;\n max-width: 60px !important;\n }\n .cm-root .contact-table-datatable .p-datatable-thead > tr > th:nth-child(5),\n .cm-root .contact-table-datatable .p-datatable-tbody > tr > td:nth-child(5) {\n width: 20% !important;\n min-width: 20% !important;\n max-width: 20% !important;\n overflow: hidden !important;\n text-overflow: ellipsis !important;\n }\n ` : `\n .cm-root .contact-table-datatable .p-datatable-thead > tr > th:nth-child(4),\n .cm-root .contact-table-datatable .p-datatable-tbody > tr > td:nth-child(4) {\n width: 20% !important;\n min-width: 20% !important;\n max-width: 20% !important;\n overflow: hidden !important;\n text-overflow: ellipsis !important;\n }\n `}\n .cm-root .contact-table-datatable .p-datatable-table {\n table-layout: fixed !important;\n }\n .cm-root .contact-table-datatable .p-datatable-tbody > tr > td {\n overflow: hidden !important;\n white-space: nowrap !important;\n }\n .cm-root .omni-datatable .p-datatable-tbody > tr > td{\n border-bottom: none !important;\n }\n `}</style>\n <div className=\"cm:px-12 cm:w-full cm:flex cm:flex-col cm:flex-1 cm:min-h-0 contact-table-datatable\" ref={wrapperRef}>\n <DataTable \n scrollable={true} \n scrollHeight=\"calc(var(--cm-container-height, 100vh) - 160px)\" \n value={tableData} \n columns={columns}\n onRowClick={handleContactClick}\n loading={false}\n />\n </div>\n </>\n );\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport { getContacts, getContactsWithFilters } from \"@/services/contacts\";\nimport { QUERIES } from '@/constants/queries';\n\nimport { useSortStore } from \"@/stores/sort\";\nimport { useFiltersStore } from \"@/stores/filters\";\nimport { ENTITY_TYPES } from \"@/constants/custom-fields\";\n\nimport type { SortApiData } from \"@/types/entity\";\nimport type { ContactsApiResponse, GetContactsParams, ContactsFilterResponseData } from \"@/types/api\";\n\nconst NO_DATA_RES = { total: 0, page: 0, page_size: 0 }\nconst NO_FILTER_DATA_RES = { total_results: 0, page_number: 0, page_size: 0 }\n\nconst getNextPageParam = ( lastData: ContactsApiResponse) => {\n const { total, page = 0, page_size } = lastData?.data ?? NO_DATA_RES;\n // Check if current loaded items are less than total\n return page * page_size < total ? page + 1 : undefined;\n}\n\nconst getFilterNextPageParam = ( lastData: ContactsFilterResponseData ) => {\n const { total_results, page_number = 0, page_size } = lastData?.data ?? NO_FILTER_DATA_RES;\n return page_number * page_size < total_results ? page_number + 1 : undefined;\n}\n\nconst isFilterResponse = (response?: ContactsApiResponse | ContactsFilterResponseData): response is ContactsFilterResponseData => {\n // `!!response?.data` rather than `!!response`: the proxy's `proxyResponse()`\n // relays a literal JSON `null` when upstream sends an empty or invalid\n // JSON-typed body, and `'results' in null` throws rather than returning false.\n return !!response?.data && 'results' in response.data;\n}\n\nexport const useContacts = (params?: GetContactsParams, enabled: boolean = true) => {\n\n const filters = useFiltersStore((state) => state.contact.filters);\n\n const hasFilters = Array.isArray(filters) && filters.length > 0;\n const sortData = useSortStore(state => state[ENTITY_TYPES.CONTACT]);\n \n const sortApiData: SortApiData|null = (sortData.field || sortData.custom_field_id) && sortData.order ? ({\n ...sortData,\n by: sortData.field ? 'native' : 'cf'\n }) : null;\n \n // The listing search applies to BOTH paths — a query param on the GET one,\n // a body field here. In the key for the same reason the filters are: two\n // searches are two result sets, and react-query would otherwise hand the\n // second one the first one's pages.\n const filterProps = useInfiniteQuery({\n queryKey: [QUERIES.CONTACTS_WITH_FILTERS, filters, sortData, params?.text],\n queryFn: ( { pageParam: page_number } ) => getContactsWithFilters({ filters, sort: sortApiData, page_size: 20, page_number, ...(params?.text ? { text: params.text } : {}) }),\n getNextPageParam: getFilterNextPageParam,\n initialPageParam: 1,\n enabled: enabled && hasFilters,\n refetchOnMount: true,\n gcTime: 0,\n });\n\n const sort = sortData.custom_field_id ? `cf:${sortData.custom_field_id}` : sortData.field;\n const order = sortData.order ?? undefined;\n const listProps = useInfiniteQuery({\n queryKey: [QUERIES.CONTACTS, params, sortData],\n queryFn: ( { pageParam: page_number } ) => getContacts({ ...params, page_number, sort, order }),\n getNextPageParam,\n initialPageParam: 1,\n enabled: enabled && !hasFilters,\n refetchOnMount: true,\n gcTime: 0,\n });\n\n const{ data, ...props } = hasFilters ? filterProps : listProps;\n\n const contacts = data?.pages.flatMap((page) => {\n if (isFilterResponse(page)) {\n return page.data.results ?? [];\n }\n // Same reason as `isFilterResponse`: a page whose `data` the proxy relayed\n // as `null` must render as empty, not throw on the way to the table.\n else return page?.data?.contacts ?? [];\n }) ?? [];\n\n const firstRecord = data?.pages[0];\n const total = isFilterResponse(firstRecord) ? firstRecord?.data?.total_results ?? 0 : firstRecord?.data?.total ?? 0;\n\n return {\n contacts,\n total,\n ...props,\n };\n};","import { useMemo, useState } from 'react';\nimport { DataTable } from \"hiver-ui-kit-extended\";\nimport { useNavigate } from 'react-router-dom';\nimport { formatValue } from '../../../utils/formatValue';\nimport { GAINSIGHT_EVENTS } from '@/constants/gainsightEvents';\nimport { useRenderConfigStore } from '@/stores/renderConfig';\nimport { useFiltersStore } from '@/stores/filters';\nimport EmptyState from '../../EmptyState';\nimport Loader from '../../Loader';\nimport { NameCellWithAvatar, EmailCellWithCompose, PhoneCell, PhoneCallCell } from '../../TableCells';\nimport TruncatedText from '../../TruncatedText';\nimport { ShimmerCell } from '@/components/TableShimmer';\nimport { createCFRows, getViewKey } from '@/utils/customFields';\nimport { useCFColumns } from '@/queries/useCFColumns';\nimport { selectTableRowNode } from '@/utils/table';\nimport { CreateButton } from \"./actions/create\";\nimport { CreateEditEntity } from '@/features/entity/create-edit';\nimport { EntityToolbar } from './toolbar';\nimport { saveViewCFConfigs } from \"@/services/custom-fields/view-configs\";\nimport { ColumnPreference, useColumnPreferences } from '@/features/column-preference';\nimport { CFField } from './cells/cf-field';\nimport { SortableHeader } from './cells/header';\nimport { contactColumns } from '@/constants/entity';\n\nimport { ENTITY_TYPES } from '@/constants/custom-fields';\nimport { useListingSearchText } from '@/hooks/useListingSearchText';\nimport { CDN_ASSETS } from '@/constants/cdnAssets';\nimport { FEATURES } from '@/constants/features';\nimport { useFeature } from '@/hooks/useFeature';\n\nimport { useContacts } from '@/queries/useContacts';\nimport { useIntersectObserver } from '@/hooks/useIntersectObserver';\n\nimport type { ColumnType } from '@/types/entity';\n\nconst getCFRows = createCFRows( field => <CFField field={field} /> );\nconst getCFShimmer = createCFRows( () => <ShimmerCell /> );\n\nconst phoneCallColumn: ColumnType = {\n id: 'phoneCall',\n field: 'phoneCallDisplay',\n label: '',\n style: { width: '60px' },\n};\n\n// Account cell\nconst AccountCell = ({ account }: { account: string }) => {\n const displayValue = formatValue(account);\n return (\n <TruncatedText \n text={displayValue}\n className=\"text-slate-900\"\n />\n );\n};\n\nexport default function ContactTable() {\n const [ openCreate, setOpenCreate ] = useState(false);\n\n // Both builds scroll infinitely — see the note in AccountTable for why the\n // discrete page control was reverted and what came out with it.\n // Debounce and the three-character floor both live in the hook — see\n // `useListingSearchText`.\n const text = useListingSearchText(ENTITY_TYPES.CONTACT);\n\n const listParams = useMemo(() => (text ? { text } : undefined), [text]);\n\n const { contacts, total, isLoading: isLoadingContacts, refetch,\n hasNextPage, isFetchingNextPage, fetchNextPage } = useContacts(listParams);\n const { parentCbRef, targetCbRef } = useIntersectObserver({\n callback: async () => {\n if (hasNextPage) {\n await fetchNextPage();\n }\n },\n selectTargetNode: selectTableRowNode,\n });\n\n const navigate = useNavigate();\n const callbacks = useRenderConfigStore((state) => state.callbacks);\n const isVoiceEnabled = useFeature(FEATURES.VOICE_ENABLED);\n\n const { data: columnsData =[], refetch: refetchCFColumns } = useCFColumns({ entity_type: ENTITY_TYPES.CONTACT, defaultColumns: contactColumns });\n\n const savePreferences = async ( columnPreferences: ColumnType[] ) => {\n const visibleItems = columnPreferences.map(item => getViewKey(item.id, item.visible ?? false));\n const success = await saveViewCFConfigs({ entity_type: ENTITY_TYPES.CONTACT, visible_items: visibleItems });\n if( !success ) return;\n refetchCFColumns();\n }\n\n const {\n preferences,\n togglePreference,\n reorderPreferences,\n setAllVisible,\n } = useColumnPreferences({ items: columnsData, savePreferences });\n\n const isLoading = isLoadingContacts || preferences.length === 0;\n\n const columns = useMemo(() => {\n let visibleColumns = preferences.filter(item => item?.visible);\n\n // Insert phone call column right after the phone column when voice is enabled\n if (isVoiceEnabled && callbacks?.onPhoneClick) {\n const phoneIndex = visibleColumns.findIndex(col => col.id === 'phone');\n if (phoneIndex !== -1) {\n visibleColumns = [...visibleColumns];\n visibleColumns.splice(phoneIndex + 1, 0, phoneCallColumn);\n }\n }\n\n return visibleColumns.map(item => item.id === 'phoneCall' ? item : ({\n ...item,\n label: <SortableHeader title={item.label} entityType={ENTITY_TYPES.CONTACT} field={item.sortId || item.id} isCF={!item.locked} />\n }));\n }, [preferences, callbacks?.onPhoneClick, isVoiceEnabled]);\n\n // Transform data with custom renderers\n const tableRows = useMemo(() => {\n // Return empty array immediately when loading initial data to prevent showing old data\n if (isLoading || !contacts?.length ) {\n return [];\n }\n\n const handleComposeEmail = (email: string) => {\n callbacks?.onCompose?.(email);\n };\n \n const tableRows = contacts.map((result) => ({\n ...result,\n nameDisplay: <NameCellWithAvatar name={result.name} channelType={result.channel_type} />,\n emailDisplay: <EmailCellWithCompose email={result.email} onCompose={handleComposeEmail} />,\n phoneDisplay: <PhoneCell phone={formatValue(result.phone_number )} />,\n ...(isVoiceEnabled && callbacks?.onPhoneClick && { phoneCallDisplay: <PhoneCallCell phone={result.phone_number} contactId={result.id} contactName={result.name} accountId={result.company?.id} /> }),\n accountDisplay: <AccountCell account={formatValue(result.company?.name)} />,\n isNoDataRow: false,\n ...getCFRows(result.custom_fields)\n }));\n\n const customFields = contacts[0]?.custom_fields;\n // Shimmer rows at the end whenever there are more pages — the tail the\n // intersection observer watches to pull the next one in.\n if (hasNextPage) {\n const shimmerRows = Array.from({ length: 3 }, (_, index) => ({\n id: `shimmer-${index}`,\n name: '',\n email: '',\n phone_number: '',\n company: null,\n nameDisplay: <ShimmerCell nodeRef={ !index && !isFetchingNextPage ? targetCbRef : null} />,\n emailDisplay: <ShimmerCell />,\n phoneDisplay: <ShimmerCell />,\n phoneCallDisplay: null,\n accountDisplay: <ShimmerCell />,\n isShimmerRow: true,\n isNoDataRow: true, // Make them non-clickable\n ...getCFShimmer(customFields)\n }));\n return [...tableRows, ...shimmerRows];\n }\n\n return tableRows;\n }, [contacts, isLoading, hasNextPage, isFetchingNextPage, callbacks, targetCbRef]);\n\n const onCreateSuccess = () => {\n setOpenCreate(false);\n refetch();\n };\n\n // Check if we should show empty state - only when loading is done and we have no data\n // A filter or a search that matches nothing is not an empty workspace — it\n // gets \"No … found\" and no \"will start showing up\" explainer.\n const hasFilters = useFiltersStore((state) => state.contact.filters.length > 0);\n const isNarrowed = hasFilters || !!text;\n const showEmptyState = !isLoading && !tableRows?.length;\n\n\n const handleContactClick = (event: { data: { id: string; isNoDataRow?: boolean } }) => {\n const data = event.data;\n // Don't navigate if it's a no-data row\n if (data.isNoDataRow) {\n return;\n }\n callbacks?.sendGainsightEvent?.(GAINSIGHT_EVENTS.CONTACT_ROW_CLICKED);\n navigate(`/contacts/${data.id}`);\n };\n\n const renderTable = () => {\n if( isLoading && !columns.length ){\n return (\n <div className=\"cm:flex cm:items-center cm:justify-center cm:w-full cm:h-full\">\n <Loader />\n </div>\n )\n }\n\n if (showEmptyState) {\n return (\n <div className=\"cm-listing-empty cm:px-12 cm:flex cm:flex-col cm:flex-1\">\n <EmptyState\n title={isNarrowed ? \"No contacts found\" : \"No contacts yet\"}\n iconContent={CDN_ASSETS.hiverBee2}\n subcopy={isNarrowed ? undefined : \"Contacts will start showing up here when new conversations are created.\"}\n />\n </div>\n );\n }\n\n return (\n <DataTable \n scrollable={true}\n value={tableRows} \n columns={columns}\n onRowClick={handleContactClick}\n loading={isLoading}\n loadingIcon={<Loader />}\n />\n )\n\n }\n\n return (\n <>\n <style>\n {`\n .cm-root .contact-table-datatable .omni-datatable{\n flex-basis: 0;\n flex-grow: 1;\n min-height: 0;\n margin-bottom: 30px;\n }\n .cm-root .contact-table-datatable .omni-datatable .p-datatable-table{\n width: max-content !important;\n min-width: 100% !important;\n }\n .cm-root .contact-table-datatable .omni-datatable .p-datatable-wrapper{\n border-top-left-radius: 0 !important;\n border-top-right-radius: 0 !important;\n border-top: 0 !important;\n max-height: 100%;\n }\n .cm-root .omni-datatable .p-datatable-tbody > tr > td{\n border-bottom: none !important;\n }\n `}\n </style>\n <div className=\"cm-listing-shell cm:px-12 cm:w-full cm:flex cm:flex-col cm:flex-1 cm:basis-0 cm:min-h-0 contact-table-datatable\" ref={parentCbRef}>\n <EntityToolbar \n total={total} \n entityType={ENTITY_TYPES.CONTACT} \n extraActions={\n <ColumnPreference\n items={preferences}\n onToggle={togglePreference}\n onReorder={reorderPreferences}\n onSelectAll={setAllVisible}\n />\n }\n rightNode={\n <CreateButton entityType={ENTITY_TYPES.CONTACT} onClick={() => setOpenCreate(true)} />\n }\n />\n \n {renderTable()}\n </div>\n <CreateEditEntity\n open={openCreate}\n onClose={() => setOpenCreate(false)}\n onSuccess={onCreateSuccess}\n entityType={ENTITY_TYPES.CONTACT}\n />\n </>\n );\n}\n","import React, { useEffect } from 'react';\nimport ContactTable from '../components/Listing/ContactTable';\nimport ContactTableV2 from '../components/Listing/v2/ContactTable';\nimport { GAINSIGHT_EVENTS } from '@/constants/gainsightEvents';\nimport { useRenderConfigStore } from '@/stores/renderConfig';\nimport { useFeature } from '@/hooks/useFeature';\nimport { FEATURES } from '@/constants/features';\n\nconst Contacts: React.FC = () => {\n const callbacks = useRenderConfigStore((state) => state.callbacks);\n const customFieldsEnabled = useFeature(FEATURES.CUSTOM_FIELDS_ENABLED);\n\n useEffect(() => {\n if (callbacks?.sendGainsightEvent) {\n callbacks.sendGainsightEvent(GAINSIGHT_EVENTS.CONTACT_LIST_VIEWED);\n }\n }, [callbacks]);\n\n return (\n <div className=\"cm:w-full cm:flex cm:flex-col cm:flex-1 cm:basis-0 cm:min-h-0\">\n {customFieldsEnabled ? <ContactTableV2 /> : <ContactTable />}\n </div>\n );\n};\n\nexport default Contacts;\n\n","import React from 'react';\nimport type { CardProps } from './types';\n\nconst Card: React.FC<CardProps> = ({ \n children, \n header, \n className = '', \n}) => {\n return (\n <div\n className={`cm:bg-slate-surface-white cm:flex cm:flex-col cm:border cm:border-slate-border-light cm:rounded-[12px] cm:relative cm:flex-1 cm:h-[calc(100%-22px)] ${className}`}>\n <div className=\"cm:flex cm:flex-col cm:items-start cm:flex-1 cm:overflow-clip cm:relative cm:rounded-[inherit] cm:w-full cm:min-h-0\">\n {header && (\n <div className=\"cm:border-b cm:border-slate-border-light cm:box-border cm:flex cm:h-12 cm:items-center cm:px-0 cm:pr-4 cm:py-0 cm:relative cm:shrink-0 cm:w-full\">\n {header}\n </div>\n )}\n <div className=\"cm:box-border cm:flex cm:flex-col cm:items-start cm:px-0 cm:py-0 cm:relative cm:flex-1 cm:min-h-0 cm:w-full\">\n {children}\n </div>\n </div>\n </div>\n );\n};\n\nexport default Card;\n\n","import React, { useEffect, useMemo, useRef } from 'react';\nimport { useParams } from 'react-router-dom';\nimport ConversationBox from '../ConversationBox';\nimport { ConversationBoxShimmer } from '../ConversationBox/ConversationBoxShimmer';\nimport NoDataFound from '../EmptyData/NoDataFound';\nimport Loader from '../Loader';\nimport NoConversationImage from '../../assets/no-conversation.svg';\nimport { useCompaniesStore } from '../../stores/companies';\nimport { mapCompanyConversationToBoxProps } from '../../utils/conversationMapper';\nimport { useConversationInfiniteScroll } from '../../hooks/useConversationInfiniteScroll';\n\nconst AccountsConversation: React.FC = () => {\n const { accountId } = useParams<{ accountId: string }>();\n const wrapperRef = useRef<HTMLDivElement>(null);\n const conversationsData = useCompaniesStore((state) => \n accountId ? state.conversations[parseInt(accountId, 10)] : undefined\n );\n const conversationsLoading = useCompaniesStore((state) => \n accountId ? state.conversationsLoading[parseInt(accountId, 10)] : false\n );\n const fetchCompanyConversations = useCompaniesStore((state) => state.fetchCompanyConversations);\n const fetchNextPageCompanyConversations = useCompaniesStore((state) => state.fetchNextPageCompanyConversations);\n\n useEffect(() => {\n if (accountId) {\n const companyId = parseInt(accountId, 10);\n if (!isNaN(companyId)) {\n fetchCompanyConversations(companyId);\n }\n }\n }, [accountId, fetchCompanyConversations]);\n\n // Calculate if there are more pages to load\n const hasMorePages = useMemo(() => {\n if (!conversationsData) return false;\n const { total_results, page_number, page_size } = conversationsData;\n return (page_number * page_size) < total_results;\n }, [conversationsData]);\n\n // Map conversations to ConversationBoxProps\n const mappedConversations = useMemo(() => {\n if (!conversationsData?.results) return [];\n return conversationsData.results\n .map((conversation) => mapCompanyConversationToBoxProps(conversation))\n .filter((props): props is NonNullable<typeof props> => props !== null);\n }, [conversationsData]);\n\n // Create shimmer boxes when there are more pages\n // Determine size and type from first conversation if available, otherwise use defaults\n const shimmerBoxes = useMemo(() => {\n if (!hasMorePages) return [];\n const firstConversation = mappedConversations[0];\n const size = firstConversation?.size || 'default';\n const type = firstConversation?.type || 'email';\n \n return Array.from({ length: 3 }, (_, index) => (\n <div key={`shimmer-${index}`} data-conversation-shimmer>\n <ConversationBoxShimmer size={size} type={type} />\n </div>\n ));\n }, [hasMorePages, mappedConversations]);\n\n // Handle infinite scroll\n useConversationInfiniteScroll({\n wrapperRef,\n conversationItems: [...mappedConversations, ...shimmerBoxes],\n isLoading: conversationsLoading,\n hasMorePages,\n onIntersect: async () => {\n if (accountId && hasMorePages) {\n const companyId = parseInt(accountId, 10);\n if (!isNaN(companyId)) {\n await fetchNextPageCompanyConversations(companyId);\n }\n }\n },\n threshold: 200,\n });\n\n // Only show loading state on initial load (when we have no data yet)\n // Don't hide the list when loading more pages\n if (conversationsLoading && mappedConversations.length === 0) {\n return (\n <div className=\"cm:flex cm:items-center cm:justify-center cm:w-full cm:h-full\">\n <Loader />\n </div>\n );\n }\n\n if (mappedConversations.length === 0 && !conversationsLoading) {\n return (\n <NoDataFound\n title=\"No conversations yet\"\n description=\"There are no conversations linked to this account.\"\n image={NoConversationImage}\n />\n );\n }\n\n return (\n <div \n ref={wrapperRef} \n className=\"cm:flex cm:flex-col cm:gap-2 cm:p-6 cm:w-full cm:overflow-y-auto\"\n style={{ maxHeight: 'calc(var(--cm-container-height, 100vh) - 220px)' }}\n >\n {mappedConversations.map((conversation) => (\n <ConversationBox\n key={conversation.conversationId}\n {...conversation}\n />\n ))}\n {shimmerBoxes}\n </div>\n );\n};\n\nexport default AccountsConversation;\n","import React from 'react';\nimport { useState } from 'react';\nimport type { DetailsCardProps } from './types';\n\nconst DetailsCard: React.FC<DetailsCardProps> = ({\n id,\n header,\n children,\n className = '',\n maxWidth = 'cm:max-w-90',\n maxHeight = 'cm:h-[calc(100%-22px)]'\n}) => {\n const [isHovered, setIsHovered] = useState(false);\n\n return (\n <div\n id={id}\n className={`cm:bg-slate-surface-white cm:border cm:border-slate-border-light cm:rounded-[12px] cm:relative cm:w-full cm:flex cm:flex-col cm:flex-1 ${maxWidth} ${maxHeight} ${className}`}\n >\n <div className=\"cm:flex cm:flex-col cm:flex-1 cm:items-start cm:overflow-clip cm:relative cm:rounded-[inherit] cm:w-full\">\n {/* Header Section */}\n <div className=\"cm:border-b cm:border-slate-border-mild cm:box-border cm:flex cm:h-12 cm:items-center cm:pl-[21px] cm:pr-[25px] cm:py-[14px] cm:relative cm:shrink-0 cm:w-full\">\n {header}\n </div>\n\n {/* Content Section */}\n <div className=\"cm:box-border cm:flex cm:flex-col cm:items-start cm:overflow-clip cm:px-[21px] cm:py-5 cm:relative cm:shrink-0 cm:w-full\"\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {React.isValidElement(children) \n ? React.cloneElement(children, { isHovered } as any)\n : children\n }\n </div>\n </div>\n </div>\n );\n};\n\nexport default DetailsCard;\n\n","import { ENDPOINTS } from '@/constants/endpoints';\nimport { getCFApiCallback } from './callback';\nimport { useRenderConfigStore } from '@/stores/renderConfig';\n\nimport type { ENTITY_TYPE, EntityCFSummary, EntityCFSummaryApiResponse } from '@/types/custom-fields';\n\n\nexport type EntitySummaryParams = {\n ug_id?: number;\n entity_type: ENTITY_TYPE;\n entity_ids: number[];\n}\n\n\n\nexport const getEntityCFSummary = async (\n payload: EntitySummaryParams\n): Promise<EntityCFSummary> => {\n const config = useRenderConfigStore.getState().config!;\n const cfApiCallback = getCFApiCallback();\n const data = {\n ...payload,\n ug_id: config.accountId\n } \n const response = await cfApiCallback<EntityCFSummaryApiResponse, unknown, 'POST'>(ENDPOINTS.ENTITY_CFSUMMARY, {\n method: 'POST',\n data\n });\n return response.data.data[0];\n};\n","import { useQuery } from '@tanstack/react-query';\nimport { getEntityCFSummary } from '@/services/custom-fields/entity-summary';\n\nimport { QUERIES } from '@/constants/queries';\nimport type { EntitySummaryParams } from '@/services/custom-fields/entity-summary';\n\nexport type UseEntitySummaryProps = EntitySummaryParams & {\n enabled: boolean;\n}\n\nexport const useEntitySummary = ({ entity_type, entity_ids, enabled }: UseEntitySummaryProps) => {\n return useQuery({\n queryKey: [QUERIES.ENTITY_SUMMARY, entity_type, entity_ids],\n queryFn: () => getEntityCFSummary({ entity_type, entity_ids }),\n enabled,\n });\n};","import Icon from '@/components/Icon';\nimport { renderCFValue } from '@/utils/customFields';\nimport { CF_TYPES } from '@/constants/custom-fields';\nimport { IS_HUI } from '@/constants/uiFramework';\n\nimport type { CF_TYPE, CustomFieldMap } from '@/types/custom-fields';\n\n/**\n * The glyph for a field's TYPE, by the same names the create-field form uses for\n * its Type list (`constants/custom-field-icons`). Reached through `Icon` rather\n * than through `CF_TYPE_OPTIONS.getIcon` because those helpers bake in #334155,\n * and here the mark has to sit at the built-in rows' #64758B so the whole column\n * reads as one family.\n *\n * `CHIP` is absent from the create form too — it is not a type a user can pick —\n * so it falls through to the text mark rather than leaving a hole in the column.\n */\nconst TYPE_ICON: Record<CF_TYPE, string> = {\n TEXT: 'field_input',\n NUMBER: 'field_number',\n DROPDOWN: 'field_dropdown',\n DATE: 'field_date',\n URL: 'field_url',\n BOOLEAN: 'field_boolean',\n CHIP: 'field_input',\n};\n\n/**\n * One row of \"Additional details\" on the Account / Contact detail views.\n *\n * ON HiG THIS IS THE SAME ROW AS A BUILT-IN FIELD. Prime's version — two equal\n * flex halves and no icon — puts the custom fields in a visibly different rhythm\n * from the Account / Domain / Contacts rows right above them, their labels\n * lining up only by accident. The detail-view Figma (`157:8780`, `157:8900`)\n * draws a single property list: a 14px mark, a fixed label column, then the\n * value. So the hui branch reproduces `DetailRow`'s geometry exactly — 90px\n * label block, `gap 2`, `px-1` on the value — and fills the mark with the\n * field's own type icon, which is the only thing a custom field carries to\n * distinguish it.\n *\n * The section keeps its divider and its disclosure: those were a supervisor\n * decision, not the Figma's, which draws neither.\n *\n * The prime branch is byte-for-byte the markup this file shipped before —\n * `AccountDetails` / `ContactDetails` are shared by both entry points and\n * HANDOVER §4 holds Omni's artifact to semantically equivalent JS. `IS_HUI` is a\n * build-time constant, so each artifact keeps only its own branch.\n */\nexport const CustomFieldRow: React.FC<CustomFieldMap> = (props) => {\n if (!IS_HUI) {\n return (\n <div className=\"cm:flex cm:items-center cm:relative cm:shrink-0 cm:w-full\">\n <p className=\"cm:font-normal cm:leading-5 cm:text-sm cm:text-slate-text-subtle cm:flex-1 cm:min-w-0\">\n {props.display_name ?? props.cf_id}\n </p>\n <div className=\"cm:flex-1 cm:flex cm:items-center cm:min-w-0\">\n <p className=\"cm:font-medium cm:leading-5 cm:text-sm cm:text-slate-text-title cm:truncate\">\n {renderCFValue(props)}\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"cm:flex cm:items-center cm:relative cm:shrink-0 cm:w-full\">\n <div className=\"cm:flex cm:gap-2 cm:items-center cm:relative cm:shrink-0 cm:w-[100px]\">\n <div className=\"cm:relative cm:shrink-0 cm:w-3.5 cm:h-3.5 cm:flex cm:items-center cm:justify-center\">\n <Icon name={TYPE_ICON[props.type ?? CF_TYPES.TEXT]} size={14} color=\"#64758B\" />\n </div>\n {/*\n `title` because THIS column clips and the built-in one never did.\n 100px is `DetailRow`'s label width on hui — `157:8793` draws the\n label frame at 100 with the value starting at x=100 — and it has to\n match `DetailRow` exactly, or the values\n below stop lining up with Account / Domain / Contacts — but those three\n are short strings this codebase chose, whereas a custom field's name is\n whatever the customer typed, so \"Billing Email\" already ellipsises. The\n native tooltip is the cheap half of the fix; if it needs to be a real\n one, the extension's `useIsTruncated` is the pattern (it measures\n scrollWidth rather than guessing a character count).\n */}\n <p\n title={props.display_name ?? String(props.cf_id)}\n className=\"cm:font-normal cm:leading-5 cm:text-sm cm:text-slate-text-subtle cm:w-[100px] cm:truncate\"\n >\n {props.display_name ?? props.cf_id}\n </p>\n </div>\n <div className=\"cm:flex-1 cm:flex cm:gap-2 cm:h-full cm:items-center cm:min-w-0 cm:px-1 cm:py-0 cm:relative cm:shrink-0\">\n <p className=\"cm:font-medium cm:leading-5 cm:text-sm cm:text-slate-text-title cm:min-w-0 cm:truncate\">\n {renderCFValue(props)}\n </p>\n </div>\n </div>\n );\n};\n","import React, { useState } from 'react';\n\nimport { useEntitySummary } from '@/queries/useEntitySummary';\nimport { CustomFieldRow } from './row';\n// primeicons is bundled with the *primereact* theme only, so a bare\n// `<i className=\"pi pi-chevron-down\" />` drew nothing on hui. `Glyph` picks the\n// glyph per build and leaves prime's markup byte-for-byte as it was.\nimport { Glyph } from '@/components/Glyph';\nimport { IS_HUI } from '@/constants/uiFramework';\n\nimport type { ENTITY_TYPE } from '@/types/custom-fields';\n\ntype CustomFieldsProps = {\n entityType: ENTITY_TYPE;\n entityId: number;\n}\n\n/**\n * Row rhythm: 20px on HiG, prime's original 12 elsewhere.\n *\n * The hui rows now carry the same icon + fixed-label geometry as the built-in\n * Account / Domain / Contacts rows above them, and those sit on a 20px pitch\n * (`gap-[20px]` on `AccountDetails`' own column). At 12 the two halves of one\n * property list read as two separate lists. Prime keeps the denser row it was\n * drawn for.\n *\n * DECLARED HERE, NOT INLINE IN THE JSX. A bare block comment in an expression\n * position survives the build and lands in PRIME's artifact verbatim — measured\n * at +499 bytes of English prose in `dist/customer-module.js` when this note was\n * written between `{isExpanded && (` and the `<div>`. Same family as the shared\n * inline `<style>` trap in HANDOVER §11: first-party source text shared by both\n * entry points reaches Omni as a string literal. Comments above a declaration are\n * stripped; comments inside JSX are not.\n */\nconst ROW_GAP = IS_HUI ? 'cm:gap-5' : 'cm:gap-3';\n\nconst CustomFields: React.FC<CustomFieldsProps> = ( { entityType, entityId } ) => {\n const [isExpanded, setIsExpanded] = useState(true);\n\n const { data: entityCustomFields } = useEntitySummary({ entity_type: entityType, entity_ids: [entityId], enabled: Boolean(entityId) });\n\n const customFields = entityCustomFields?.custom_fields ?? [];\n\n const toggleExpanded = () => setIsExpanded((prev) => !prev);\n\n if (customFields.length === 0) return null;\n return (\n <div className=\"cm:flex cm:flex-col cm:gap-5 cm:items-stretch cm:relative cm:shrink-0 cm:w-full cm:border-t cm:border-slate-border-mild cm:pt-5\">\n <button\n type=\"button\"\n onClick={toggleExpanded}\n aria-expanded={isExpanded}\n className=\"cm:flex cm:gap-2 cm:items-center cm:relative cm:shrink-0 cm:w-full cm:bg-transparent cm:border-0 cm:p-0 cm:cursor-pointer cm:text-left\"\n >\n <Glyph\n name={isExpanded ? 'chevron-down' : 'chevron-right'}\n size={12}\n className=\"cm:text-slate-text-body\"\n // The `<i>` this replaced carried this inline, and prime still renders\n // that `<i>` — so it has to stay inline rather than become a utility\n // class, or prime's markup changes for a hui-only repair.\n style={{ fontSize: '12px' }}\n />\n <p className=\"cm:font-medium cm:leading-5 cm:text-sm cm:text-slate-text-body\">\n Additional details\n </p>\n </button>\n\n {isExpanded && (\n <div className={`cm:flex cm:flex-col ${ROW_GAP} cm:items-stretch cm:relative cm:shrink-0 cm:w-full`}>\n {customFields.map((cfData) => (\n <CustomFieldRow\n key={cfData.cf_id}\n { ...cfData }\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport default CustomFields;\n","import React, { useEffect, useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useCompaniesStore } from '../../stores/companies';\nimport Loader from '../Loader';\nimport Icon from '../Icon';\nimport CustomFieldsSummary from '@/features/custom-fields/components/summary';\nimport { useFeature } from '@/hooks/useFeature';\nimport { FEATURES } from '@/constants/features';\nimport { Chips } from '../Chips';\nimport { IS_HUI } from '@/constants/uiFramework';\n\nimport type { ReactNode } from 'react';\n\n/**\n * The property row's label column.\n *\n * 90px is OMNI's width and has always been. The HiG account panel\n * (`157:8793`) draws the label frame at **100** with the value starting at\n * x=100, and the 10px is not cosmetic: at 90 a label like \"Billing Email\"\n * ellipsises, which is why a native `title` tooltip was added to work around\n * it. At 100 it fits.\n *\n * Forked rather than changed, because `DetailRow` is shared and Omni's layout\n * is explicitly out of scope (\"hui components, layout unchanged\"). `IS_HUI` is\n * a build-time constant, so each artifact keeps only its own literal.\n */\nconst LABEL_W = IS_HUI ? 'cm:w-[100px]' : 'cm:w-[90px]';\n\ninterface DetailRowProps {\n icon: React.ReactNode;\n label: string;\n value: ReactNode;\n}\n\nconst DetailRow: React.FC<DetailRowProps> = ({ icon, label, value }) => (\n <div className=\"cm:flex cm:flex-col cm:items-start cm:relative cm:shrink-1 cm:w-full\">\n <div className=\"cm:flex cm:items-center cm:relative cm:shrink-0 cm:w-full\">\n <div className={`cm:flex cm:gap-2 cm:items-center cm:relative cm:shrink-0 ${LABEL_W}`}>\n <div className=\"cm:relative cm:shrink-0 cm:w-3.5 cm:h-3.5 cm:flex cm:items-center cm:justify-center\">\n {icon}\n </div>\n <p className={`cm:font-normal cm:leading-5 cm:text-sm cm:text-slate-text-subtle ${LABEL_W}`}>\n {label}\n </p>\n </div>\n <div className=\"cm:flex-1 cm:flex cm:gap-2 cm:h-full cm:items-center cm:min-w-0 cm:px-1 cm:py-0 cm:relative cm:shrink-0\">\n <div className=\"cm:font-medium cm:leading-5 cm:text-sm cm:text-slate-text-title cm:min-w-0 cm:max-w-full\">\n {value}\n </div>\n </div>\n </div>\n </div>\n);\n\nconst AccountDetails: React.FC = () => {\n const { accountId } = useParams<{ accountId: string }>();\n const fetchCompanySummary = useCompaniesStore((state) => state.fetchCompanySummary);\n const { summaries } = useCompaniesStore();\n\n const crmSyncEnabled = useFeature(FEATURES.CUSTOM_FIELDS_ENABLED);\n \n const summary = useMemo(() => { \n return accountId ? summaries[parseInt(accountId, 10)] : undefined\n }, [accountId, summaries]);\n\n useEffect(() => {\n if (accountId) {\n const companyId = parseInt(accountId, 10);\n if (!isNaN(companyId)) {\n fetchCompanySummary(companyId);\n }\n }\n }, [accountId, fetchCompanySummary]);\n\n const summaryLoading = useCompaniesStore((state) => \n accountId ? state.summaryLoading[parseInt(accountId, 10)] : false\n );\n\n // Check if we've attempted to fetch (loading key exists in store)\n const hasAttemptedFetch = useCompaniesStore((state) => \n accountId ? (parseInt(accountId, 10) in state.summaryLoading) : false\n );\n\n const contactsCount = summary?.contact_count ?? 0;\n const domain = summary?.domains?.[0]?.name || summary?.generated_name || '-';\n const domains = Array.isArray(summary?.domains) ? summary.domains.map(domain => domain.name) : [domain];\n\n // Show loader while loading OR if accountId exists but we haven't attempted fetch yet\n if (summaryLoading || (accountId && !hasAttemptedFetch)) {\n return (\n <div className=\"cm:flex cm:items-center cm:justify-center cm:w-full cm:py-4\">\n <Loader />\n </div>\n );\n }\n\n // Only show \"not found\" if we've attempted fetch, loading is complete, but no summary exists\n if (hasAttemptedFetch && !summaryLoading && accountId && !summary) {\n return (\n <div>\n <p className=\"cm:text-sm cm:text-slate-text-subtle\">Account not found</p>\n </div>\n );\n }\n\n // Don't render anything if no accountId or no summary\n if (!accountId || !summary) {\n return null;\n }\n\n return (\n <div className=\"cm:flex cm:flex-col cm:gap-[20px] cm:items-stretch cm:relative cm:shrink-0 cm:w-full\">\n {/* Account Name Section */}\n {summary && (\n <div className=\"cm:flex cm:gap-3 cm:items-center cm:relative cm:w-full\">\n <DetailRow\n icon={<Icon name=\"accounts\" size={14} color=\"#64758B\" />}\n label=\"Account\"\n value={summary.generated_name || summary.name || '-'}\n />\n </div>\n )}\n\n {/* Details Section */}\n {/* <div className=\"cm:flex cm:flex-col cm:gap-0.5 cm:items-start cm:relative cm:shrink-0 cm:w-full\"> */}\n <DetailRow\n icon={<Icon name=\"domain\" size={14} color=\"#64758B\" />}\n label=\"Domain\"\n value={ crmSyncEnabled ? <Chips values={domains} maxVisible={1} /> : domain }\n />\n <DetailRow\n icon={<Icon name=\"contacts\" size={14} color=\"#64758B\" />}\n label=\"Contacts\"\n value={contactsCount}\n />\n {/* </div> */}\n\n <CustomFieldsSummary entityType=\"company\" entityId={summary.id} />\n </div>\n );\n};\n\nexport default AccountDetails;\n","export default \"data:image/svg+xml,%3csvg%20width='14'%20height='14'%20viewBox='0%200%2014%2014'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_960_6836)'%3e%3cg%20clip-path='url(%23clip1_960_6836)'%3e%3cpath%20d='M1.67773%2010.5663C1.70453%2010.3251%201.71793%2010.2045%201.75442%2010.0918C1.7868%209.99178%201.83254%209.89664%201.89041%209.80885C1.95564%209.70992%202.04144%209.62417%202.21305%209.45255L9.91672%201.74887C10.5611%201.10454%2011.6057%201.10454%2012.2501%201.74887C12.8944%202.39321%2012.8944%203.43788%2012.2501%204.08221L4.54638%2011.7859C4.37477%2011.9575%204.28897%2012.0432%204.19006%2012.1085C4.1023%2012.1664%204.00713%2012.2121%203.90712%2012.2445C3.79439%2012.281%203.67379%2012.2944%203.43259%2012.3212L1.45837%2012.5405L1.67773%2010.5663Z'%20stroke='%23334155'%20stroke-width='1.1'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/g%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_960_6836'%3e%3crect%20width='14'%20height='14'%20fill='white'/%3e%3c/clipPath%3e%3cclipPath%20id='clip1_960_6836'%3e%3crect%20width='14'%20height='14'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","import { useState, useMemo } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { IconButton } from \"hiver-ui-kit-extended\";\n\nimport { useCompaniesStore } from \"@/stores/companies\";\nimport Tooltip from \"../Tooltip\";\nimport { CreateEditEntity } from \"@/features/entity/create-edit\";\nimport { ENTITY_TYPES, CF_TYPES } from \"@/constants/custom-fields\";\nimport { QUERIES } from \"@/constants/queries\";\nimport { useEntitySummary } from \"@/queries/useEntitySummary\";\nimport { useFeature } from \"@/hooks/useFeature\";\nimport { FEATURES } from \"@/constants/features\";\nimport { GAINSIGHT_EVENTS } from \"@/constants/gainsightEvents\";\nimport { useRenderConfig } from \"@/hooks/useRenderConfig\";\n\nimport editIcon from \"../../assets/edit.svg\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\n\nconst EditAccount = () => {\n\n const [openEdit, setOpenEdit] = useState(false);\n \n const { accountId } = useParams<{ accountId: string }>();\n const entityId = accountId ? parseInt(accountId, 10) : undefined;\n\n const callbacks = useRenderConfig();\n\n const { summaries, fetchCompanySummary } = useCompaniesStore();\n const summary = useMemo(() => {\n return accountId ? summaries[parseInt(accountId, 10)] : undefined\n }, [accountId, summaries]);\n\n const queryClient = useQueryClient();\n\n const customFieldsEnabled = useFeature(FEATURES.CUSTOM_FIELDS_ENABLED);\n \n const { data: entityCustomFields, isLoading: entityCFLoading } = useEntitySummary({ entity_type: ENTITY_TYPES.COMPANY, entity_ids: [entityId!], enabled: customFieldsEnabled && Boolean(entityId) });\n \n const initialData = useMemo(() => {\n if(!summary) return {};\n const initialData: Record<string, unknown> = {\n name: summary.generated_name,\n domains: summary.domains.map(domain => domain.name)\n }\n\n for( const field of entityCustomFields?.custom_fields ?? [] ) {\n initialData[String(field.cf_id)] = field.type === CF_TYPES.DROPDOWN ? field.value_id : field.value;\n }\n\n return initialData;\n \n }, [ summary, entityCustomFields ])\n \n \n const onSuccess = () => {\n setOpenEdit(false);\n if (!entityId) return;\n // Refresh the summary data so the saved changes are reflected on the detail page.\n fetchCompanySummary(entityId);\n queryClient.invalidateQueries({\n queryKey: [QUERIES.ENTITY_SUMMARY, ENTITY_TYPES.COMPANY],\n });\n };\n\n if (!customFieldsEnabled || !summary || entityCFLoading) return null;\n\n return (\n <div className=\"cm:ml-auto\">\n <Tooltip content=\"Edit account\" tooltipClassName=\"cm:text-white cm:text-sm cm:font-medium cm:leading-5 cm:whitespace-nowrap\">\n <IconButton\n image={editIcon}\n alt=\"Edit account\"\n ariaLabel=\"Edit account\"\n size=\"md\"\n className={`cm-account-edit-btn ${IS_HUI ? \"cm:opacity-100\" : \"cm:opacity-0 cm:hover:opacity-100\"}`}\n onClick={() => {\n callbacks?.sendGainsightEvent?.(GAINSIGHT_EVENTS.ACCOUNT_EDIT_USED);\n setOpenEdit(true);\n }}\n />\n </Tooltip>\n <CreateEditEntity\n key={entityId}\n open={openEdit}\n onClose={() => setOpenEdit(false)}\n onSuccess={onSuccess}\n entityType={ENTITY_TYPES.COMPANY}\n entityId={entityId}\n initialData={initialData}\n />\n </div>\n );\n};\n\nexport default EditAccount;\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useParams, useNavigate, useLocation } from \"react-router-dom\";\nimport { DataTable } from \"hiver-ui-kit-extended\";\nimport { useContactsStore } from \"../../stores/contacts\";\nimport { useRenderConfigStore } from \"../../stores/renderConfig\";\nimport NoDataFound from \"../EmptyData/NoDataFound\";\nimport Loader from \"../Loader\";\nimport { NameCellWithAvatar, EmailCellWithCompose, PhoneCell } from \"../TableCells\";\nimport { useTableInfiniteScroll } from \"../../hooks/useTableInfiniteScroll\";\n\n// Shimmer cell component\nconst ShimmerCell = () => (\n <div className=\"cm:h-4 cm:bg-gray-200 cm:rounded cm:w-3/4 cm:animate-pulse\"></div>\n);\n\nconst AccountContacts: React.FC = () => {\n const { fetchContacts, fetchNextPage, data: contactsData, isLoading } = useContactsStore();\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [isInitialFetch, setIsInitialFetch] = useState(true);\n\n const { accountId } = useParams<{ accountId: string }>();\n const navigate = useNavigate();\n // Forwarded on so the nested breadcrumb can still rebuild the listing URL.\n const { search } = useLocation();\n const { callbacks } = useRenderConfigStore();\n\n // Fetch contacts for the selected account\n useEffect(() => {\n if (accountId) {\n const companyId = parseInt(accountId, 10);\n if (!isNaN(companyId)) {\n requestAnimationFrame(() => {\n setIsInitialFetch(true);\n });\n fetchContacts({ company_id: companyId }).finally(() => {\n setIsInitialFetch(false);\n });\n }\n } else {\n requestAnimationFrame(() => {\n setIsInitialFetch(false);\n });\n }\n }, [accountId, fetchContacts]);\n\n // Get contacts for the selected account\n const accountContacts = useMemo(() => {\n if (!contactsData?.contacts) return [];\n return contactsData.contacts;\n }, [contactsData]);\n\n // Calculate if there are more pages to load\n const hasMorePages = useMemo(() => {\n if (!contactsData) return false;\n const { total, page, page_size } = contactsData;\n return (page * page_size) < total;\n }, [contactsData]);\n\n // Transform data with custom renderers\n const tableData = useMemo(() => {\n // Return empty array immediately when loading initial data to prevent showing old data\n if (isLoading && (!contactsData || !contactsData.contacts || contactsData.contacts.length === 0)) {\n return [];\n }\n\n const handleComposeEmail = (email: string) => {\n callbacks?.onCompose?.(email);\n };\n\n const contacts = accountContacts.map((contact) => ({\n ...contact,\n nameDisplay: (\n <NameCellWithAvatar\n name={contact.name}\n channelType={contact.channel_type}\n avatarSize=\"default\"\n containerClassName=\"cm:flex cm:items-center cm:gap-1.5 cm:min-w-0\"\n textClassName=\"cm:text-sm cm:text-slate-900 cm:truncate\"\n />\n ),\n emailDisplay: (\n <EmailCellWithCompose \n email={contact.email} \n onCompose={handleComposeEmail}\n baseClassName=\"cm:text-sm cm:truncate cm:block\"\n containerClassName=\"cm:flex cm:items-center cm:gap-1\"\n />\n ),\n phoneDisplay: (\n <PhoneCell \n phone={contact.phone_number || \"\"}\n className=\"cm:font-medium cm:text-slate-text-body\"\n baseClassName=\"cm:text-sm cm:truncate cm:block\"\n />\n ),\n isNoDataRow: false,\n }));\n\n // Add shimmer rows at the end when there are more pages\n if (hasMorePages) {\n const shimmerRows = Array.from({ length: 3 }, (_, index) => ({\n id: `shimmer-${index}`,\n name: '',\n email: '',\n phone_number: '',\n nameDisplay: <ShimmerCell />,\n emailDisplay: <ShimmerCell />,\n phoneDisplay: <ShimmerCell />,\n isShimmerRow: true,\n isNoDataRow: true, // Make them non-clickable\n }));\n return [...contacts, ...shimmerRows];\n }\n\n return contacts;\n }, [accountContacts, callbacks, hasMorePages, isLoading, contactsData]);\n\n // Handle infinite scroll\n useTableInfiniteScroll({\n wrapperRef,\n tableData,\n isLoading,\n hasMorePages,\n onIntersect: async () => {\n if (accountId && hasMorePages) {\n const companyId = parseInt(accountId, 10);\n if (!isNaN(companyId)) {\n await fetchNextPage({ company_id: companyId });\n }\n }\n },\n threshold: 200,\n });\n\n const columns = [\n {\n id: \"name\",\n field: \"nameDisplay\",\n label: \"Name\",\n style: { width: \"40%\" },\n },\n {\n id: \"email\",\n field: \"emailDisplay\",\n label: \"Email\",\n style: { width: \"40%\" },\n },\n {\n id: \"phone\",\n field: \"phoneDisplay\",\n label: \"Phone\",\n style: { width: \"20%\" },\n },\n ];\n\n const handleContactClick = (event: { data: { id: string; isNoDataRow?: boolean } }) => {\n const data = event.data;\n // Don't navigate if it's a no-data row (shimmer row)\n if (data.isNoDataRow) {\n return;\n }\n // Navigate to nested route: /accounts/:accountId/contacts/:contactId\n if (accountId) {\n navigate({ pathname: `/accounts/${accountId}/contacts/${data.id}`, search });\n } else {\n navigate(`/contacts/${data.id}`);\n }\n };\n\n if (!accountId) {\n return (\n <div className=\"cm:px-6 cm:py-6\">\n <p className=\"cm:text-sm cm:text-slate-text-subtle\">\n No account selected\n </p>\n </div>\n );\n }\n\n // Show loader during initial fetch or when loading and no data - don't show old data\n if (isInitialFetch || (isLoading && (!contactsData || !contactsData.contacts || contactsData.contacts.length === 0))) {\n return (\n <div className=\"cm:flex cm:items-center cm:justify-center cm:w-full cm:h-full\">\n <Loader />\n </div>\n );\n }\n\n if (accountContacts.length === 0 && !isLoading) {\n return (\n <NoDataFound\n title=\"There are no contacts in this account.\"\n description=\"There are no contacts in this account.\"\n />\n );\n }\n\n return (\n <>\n <style>{`\n .cm-root .account-contacts-datatable .p-datatable-wrapper {\n border: 0 !important;\n border-radius: 0 !important;\n }\n .cm-root .account-contacts-datatable .p-datatable-thead > tr > th:nth-child(1),\n .cm-root .account-contacts-datatable .p-datatable-tbody > tr > td:nth-child(1) {\n width: 40% !important;\n min-width: 40% !important;\n max-width: 40% !important;\n overflow: hidden !important;\n text-overflow: ellipsis !important;\n }\n .cm-root .account-contacts-datatable .p-datatable-thead > tr > th:nth-child(2),\n .cm-root .account-contacts-datatable .p-datatable-tbody > tr > td:nth-child(2) {\n width: 40% !important;\n min-width: 40% !important;\n max-width: 40% !important;\n overflow: hidden !important;\n text-overflow: ellipsis !important;\n }\n .cm-root .account-contacts-datatable .p-datatable-thead > tr > th:nth-child(3),\n .cm-root .account-contacts-datatable .p-datatable-tbody > tr > td:nth-child(3) {\n width: 20% !important;\n min-width: 20% !important;\n max-width: 20% !important;\n overflow: hidden !important;\n text-overflow: ellipsis !important;\n }\n .cm-root .account-contacts-datatable .p-datatable-table {\n table-layout: fixed !important;\n }\n .cm-root .account-contacts-datatable .p-datatable-tbody > tr > td {\n overflow: hidden !important;\n white-space: nowrap !important;\n }\n `}</style>\n <div \n ref={wrapperRef}\n className=\"cm:w-full cm:flex cm:flex-col cm:flex-1 cm:min-h-0 account-contacts-datatable\"\n >\n <DataTable\n scrollable={true}\n scrollHeight=\"calc(var(--cm-container-height, 100vh) - 220px)\"\n value={tableData}\n columns={columns}\n onRowClick={handleContactClick}\n loading={false}\n style={{ border: 0, borderRadius: 0 }}\n />\n </div>\n </>\n );\n};\n\nexport default AccountContacts;\n","import React from 'react';\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport Card from '../components/Card';\nimport { Tabs } from 'hiver-ui-kit-extended';\nimport CustomerIntelligencePanel from '@/features/account-insights/components/CustomerIntelligencePanel';\nimport AccountsConversation from '@/components/AccountsConversation';\nimport DetailsCard from '@/components/DetailsCard';\nimport AccountDetails from '@/components/AccountDetails';\nimport EditAccount from '@/components/AccountDetails/EditAccount';\nimport AccountContacts from '../components/AccountContacts';\nimport Icon from '../components/Icon';\nimport { ScopedStyles } from '@/components/Styles';\nimport { BrandGlyph } from '@/components/BrandGlyph';\nimport { IS_HUI } from '@/constants/uiFramework';\nimport { ENTITY_TYPES } from '@/constants/custom-fields';\nimport { useFeature } from '@/hooks/useFeature';\nimport { FEATURES } from '@/constants/features';\n\nconst AccountDetail: React.FC = () => {\n const { accountId } = useParams();\n // Guard against a non-numeric route param — Number('abc') is NaN (truthy),\n // which would otherwise leak into the insights URL as /accounts/NaN/….\n const numericAccountId = Number(accountId);\n const companyId = Number.isFinite(numericAccountId)\n ? numericAccountId\n : undefined;\n // CI gate — the Overview tab (Account Health + Sentiment) only exists when\n // ON. When OFF, Conversations is the first/default tab, as it was pre-CI.\n const ciEnabled = useFeature(FEATURES.CUSTOMER_INTELLIGENCE_ENABLED);\n const [activeIndex, setActiveIndex] = useState(0);\n\n // Tab set is derived from the flag so removing Overview cleanly re-indexes\n // Conversations→0 (default) and Contacts→1.\n const tabs = [\n ...(ciEnabled\n ? [\n {\n icon: 'accounts',\n label: 'Overview',\n render: () => (\n // Same sections as the right-panel drawer. GlobalMount is\n // provided by App.tsx here, so the panel must not mount its own.\n <div className=\"cm:flex cm:w-full cm:flex-1 cm:min-h-0 cm:flex-col cm:overflow-y-auto cm:bg-slate-surface-subtle cm:p-6\">\n <CustomerIntelligencePanel\n companyId={companyId}\n includeGlobalMount={false}\n showInsufficientEmptyState\n sectionsLayout=\"row\"\n />\n </div>\n ),\n },\n ]\n : []),\n { icon: 'message', label: 'Conversations', render: () => <AccountsConversation /> },\n { icon: 'contacts', label: 'Contacts', render: () => <AccountContacts /> },\n ];\n\n const tabsItems = tabs.map((tab, index) => ({\n label: (\n <div className=\"cm:flex cm:items-center cm:gap-2\">\n <Icon\n name={tab.icon}\n size={14}\n type=\"active\"\n color={activeIndex === index ? '#0F172A' : '#64758B'}\n />\n {tab.label}\n </div>\n ) as unknown as string,\n content: '',\n }));\n\n const onTabChange = (e: unknown) => {\n setActiveIndex((e as {index:number})?.index);\n };\n\n return (\n <div className=\"cm:flex cm:gap-2 cm:px-12 cm:items-start cm:relative cm:shrink-0 cm:w-full cm:flex-1\">\n <ScopedStyles>\n {`\n .omni-tabs-primereact li:first-child {\n margin-left: 20px !important;\n }\n .omni-tabs-primereact li.p-unselectable-text .p-tabview-nav-link {\n padding: 14px 4px !important;\n }\n #cm-account-details-sidepanel:hover .cm-account-edit-btn{\n opacity: 1;\n }\n `}\n </ScopedStyles>\n <DetailsCard\n id='cm-account-details-sidepanel'\n header={\n <div className=\"cm:flex cm:gap-2 cm:items-center cm:justify-start cm:px-0 cm:rounded-[6px] cm:shrink-0 cm:w-full\">\n {/*\n The entity's own mark — the briefcase the side nav carries — in\n its IDLE state. Figma `157:8795` draws it selected (yellow); the\n supervisor ruled a panel header is not a selection. Contact detail\n carries the person mark the same way.\n\n Prime keeps its own glyph untouched: `BrandGlyph` renders null there\n and this branch is what Omni has always shown.\n */}\n <div className=\"cm:relative cm:shrink-0 cm:w-3.5 cm:h-3.5\">\n {IS_HUI ? (\n <BrandGlyph entity={ENTITY_TYPES.COMPANY} size={14} />\n ) : (\n <Icon name=\"details\" size={14} type=\"active\" color=\"#334155\" />\n )}\n </div>\n <p className=\"cm:font-medium cm:leading-5 cm:text-sm cm:text-slate-text-body cm:whitespace-nowrap\">\n Account details\n </p>\n <EditAccount />\n </div>\n }\n >\n <AccountDetails />\n </DetailsCard>\n <Card>\n <Tabs value={activeIndex} onTabChange={onTabChange} items={tabsItems} />\n {tabs[activeIndex]?.render()}\n </Card>\n </div>\n );\n};\n\nexport default AccountDetail;\n","import React, { useEffect, useMemo, useRef } from 'react';\nimport { useParams } from 'react-router-dom';\nimport ConversationBox from '../ConversationBox';\nimport { ConversationBoxShimmer } from '../ConversationBox/ConversationBoxShimmer';\nimport NoDataFound from '../EmptyData/NoDataFound';\nimport Loader from '../Loader';\nimport NoConversationImage from '../../assets/no-conversation.svg';\nimport { useContactsStore } from '../../stores/contacts';\nimport { mapConversationToBoxProps } from '../../utils/conversationMapper';\nimport { useConversationInfiniteScroll } from '../../hooks/useConversationInfiniteScroll';\n\nconst ContactConversation: React.FC = () => {\n const { contactId } = useParams<{ accountId?: string; contactId: string }>();\n const wrapperRef = useRef<HTMLDivElement>(null);\n const conversationsData = useContactsStore((state) => \n contactId ? state.conversations[parseInt(contactId, 10)] : undefined\n );\n const conversationsLoading = useContactsStore((state) => \n contactId ? state.conversationsLoading[parseInt(contactId, 10)] : false\n );\n const fetchContactConversations = useContactsStore((state) => state.fetchContactConversations);\n const fetchNextPageContactConversations = useContactsStore((state) => state.fetchNextPageContactConversations);\n const summary = useContactsStore((state) => \n contactId ? state.summaries[parseInt(contactId, 10)] : undefined\n );\n\n useEffect(() => {\n if (contactId) {\n const contactIdNum = parseInt(contactId, 10);\n if (!isNaN(contactIdNum)) {\n fetchContactConversations(contactIdNum);\n }\n }\n }, [contactId, fetchContactConversations]);\n\n // Calculate if there are more pages to load\n const hasMorePages = useMemo(() => {\n if (!conversationsData) return false;\n const { total_results, page_number, page_size } = conversationsData;\n return (page_number * page_size) < total_results;\n }, [conversationsData]);\n\n // Map conversations to ConversationBoxProps\n const mappedConversations = useMemo(() => {\n if (!conversationsData?.results) return [];\n const contactName = summary?.name;\n return conversationsData.results\n .map((conversation) => mapConversationToBoxProps(conversation, contactName))\n .filter((props): props is NonNullable<typeof props> => props !== null);\n }, [conversationsData, summary]);\n\n // Create shimmer boxes when there are more pages\n // Determine size and type from first conversation if available, otherwise use defaults\n const shimmerBoxes = useMemo(() => {\n if (!hasMorePages) return [];\n const firstConversation = mappedConversations[0];\n const size = firstConversation?.size || 'default';\n const type = firstConversation?.type || 'email';\n \n return Array.from({ length: 3 }, (_, index) => (\n <div key={`shimmer-${index}`} data-conversation-shimmer>\n <ConversationBoxShimmer size={size} type={type} />\n </div>\n ));\n }, [hasMorePages, mappedConversations]);\n\n // Handle infinite scroll\n useConversationInfiniteScroll({\n wrapperRef,\n conversationItems: [...mappedConversations, ...shimmerBoxes],\n isLoading: conversationsLoading,\n hasMorePages,\n onIntersect: async () => {\n if (contactId && hasMorePages) {\n const contactIdNum = parseInt(contactId, 10);\n if (!isNaN(contactIdNum)) {\n await fetchNextPageContactConversations(contactIdNum);\n }\n }\n },\n threshold: 200,\n });\n\n // Only show loading state on initial load (when we have no data yet)\n // Don't hide the list when loading more pages\n if (conversationsLoading && mappedConversations.length === 0) {\n return (\n <div className=\"cm:flex cm:items-center cm:justify-center cm:w-full cm:h-full\">\n <Loader />\n </div>\n );\n }\n\n if (mappedConversations.length === 0 && !conversationsLoading) {\n return (\n <NoDataFound\n title=\"No conversations yet\"\n description=\"There are no conversations linked to this contact.\"\n image={NoConversationImage}\n />\n );\n }\n\n return (\n <div \n ref={wrapperRef} \n className=\"cm:flex cm:flex-col cm:gap-2 cm:p-6 cm:w-full cm:overflow-y-auto cm:flex-1\"\n style={{ maxHeight: 'calc(var(--cm-container-height, 100vh) - 220px)' }}\n >\n {mappedConversations.map((conversation) => (\n <ConversationBox\n key={conversation.conversationId}\n {...conversation}\n />\n ))}\n {shimmerBoxes}\n </div>\n );\n};\n\nexport default ContactConversation;\n\n","import { useState, useRef, useEffect } from \"react\";\nimport { Dialog, Button, TextField, Toast, IconButton } from \"hiver-ui-kit-extended\";\nimport closeIcon from \"../../assets/close.svg\";\nimport Tooltip from \"../Tooltip\";\nimport { updateContact } from \"../../services/contacts\";\nimport { useContactsStore } from \"../../stores/contacts\";\nimport { GAINSIGHT_EVENTS } from \"@/constants/gainsightEvents\";\nimport { useRenderConfigStore } from \"@/stores/renderConfig\";\nimport editIcon from \"../../assets/edit.svg\";\nimport {\n sanitizePhoneInput,\n validatePhoneNumber,\n handlePhoneFieldKeyDownCapture,\n} from \"@/validations/contactPhone\";\n\ninterface Contact {\n id: number;\n name: string;\n email: string;\n phone_number?: string | null;\n company?: {\n id: number;\n name: string;\n generated_name: string;\n description?: string | null;\n created_at: string;\n updated_at: string;\n updated_by: string;\n domains?: Array<{\n id: number;\n name: string;\n description?: string | null;\n }>;\n } | null;\n}\n\ninterface EditContactProps {\n contact?: Contact;\n open?: boolean;\n onClose?: () => void;\n}\n\nconst EditContact = ({ contact, open = false, onClose }: EditContactProps) => {\n const { updateContactSummary, updateContactInList, fetchContactSummary } =\n useContactsStore();\n\n const callbacks = useRenderConfigStore((state) => state.callbacks);\n const isDark = useRenderConfigStore((state) => state.theme === \"dark\");\n\n const [dialogOpen, setDialogOpen] = useState(open);\n const [formData, setFormData] = useState({\n name: contact?.name || \"\",\n email: contact?.email || \"\",\n phone_number: sanitizePhoneInput(contact?.phone_number || \"\"),\n account_name: contact?.company?.generated_name || \"\",\n });\n\n const [errors, setErrors] = useState({\n name: \"\",\n email: \"\",\n phone_number: \"\",\n account_name: \"\",\n });\n\n const [isLoading, setIsLoading] = useState(false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const toast = useRef<any>(null);\n\n // Sync form data when contact prop changes\n useEffect(() => {\n if (contact) {\n setFormData({\n name: contact.name || \"\",\n email: contact.email || \"\",\n phone_number: sanitizePhoneInput(contact.phone_number || \"\"),\n account_name: contact.company?.generated_name || \"\",\n });\n }\n }, [contact]);\n\n const handleClick = () => {\n setDialogOpen(true);\n if (callbacks?.sendGainsightEvent) {\n callbacks.sendGainsightEvent(GAINSIGHT_EVENTS.CONTACT_EDIT_USED);\n }\n };\n\n const handleClose = () => {\n setDialogOpen(false);\n setFormData({\n name: contact?.name || \"\",\n email: contact?.email || \"\",\n phone_number: sanitizePhoneInput(contact?.phone_number || \"\"),\n account_name: contact?.company?.generated_name || \"\",\n });\n setErrors({ name: \"\", email: \"\", phone_number: \"\", account_name: \"\" });\n onClose?.();\n };\n\n const validateForm = () => {\n const newErrors = {\n name: \"\",\n email: \"\",\n phone_number: \"\",\n account_name: \"\",\n };\n\n let isValid = true;\n\n // API only updates name field, so only validate name\n if (!formData.name.trim()) {\n newErrors.name = \"Full Name is required\";\n isValid = false;\n } else if (formData.name.length > 50) {\n newErrors.name = \"Name must be 50 characters or less\";\n isValid = false;\n }\n\n const phoneError = validatePhoneNumber(formData.phone_number);\n if (phoneError) {\n newErrors.phone_number = phoneError;\n isValid = false;\n }\n\n setErrors(newErrors);\n return isValid;\n };\n\n const handleSubmit = async () => {\n if (!validateForm() || !contact) {\n return;\n }\n\n setIsLoading(true);\n try {\n const response = await updateContact(contact.id, {\n name: formData.name.trim(),\n phone_number: formData.phone_number.trim(),\n });\n\n // Handle response structure: response is UpdateContactApiResponse which has { status, message, data }\n // The response from updateContact is already the ApiResponse, so response.data contains ContactSummaryData\n // Extract the contact data from response.data\n const contactData = response.data;\n\n if (!contactData) {\n console.error('Invalid response structure:', response);\n throw new Error('Invalid response: contact data is missing');\n }\n\n if (!contactData.name) {\n console.error('Invalid contact data:', contactData);\n throw new Error('Invalid response: contact name is missing');\n }\n\n updateContactSummary(contact.id, contactData);\n\n // Update the contact in the contacts list if it exists\n updateContactInList(contact.id, {\n name: contactData.name,\n });\n\n // Refetch the contact summary to ensure we have the latest data\n fetchContactSummary(contact.id);\n \n // Send Gainsight event for primary contact changed\n if (callbacks?.sendGainsightEvent) {\n callbacks.sendGainsightEvent(GAINSIGHT_EVENTS.PRIMARY_CONTACT_CHANGED);\n }\n \n // Update form data with the new contact data from API response\n setFormData({\n name: contactData.name || \"\",\n email: contactData.email || \"\",\n phone_number: sanitizePhoneInput(contactData.phone_number || \"\"),\n account_name: contactData.company?.generated_name || \"\",\n });\n \n callbacks?.showToast?.('success', 'Contact details updated');\n \n handleClose();\n onClose?.();\n } catch (error) {\n console.error('Error updating contact:', error);\n callbacks?.showToast?.('error', 'Failed to update contact. Please try again.');\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleInputChange = (field: keyof typeof formData, value: string) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n // Clear error when user starts typing\n if (errors[field]) {\n setErrors((prev) => ({ ...prev, [field]: \"\" }));\n }\n };\n\n const renderHeader = () => {\n return (\n <div className=\"cm:flex cm:items-center cm:justify-between cm:w-full cursor-pointer\">\n <div className=\"cm:text-slate-text-body cm:text-label-medium\">\n {contact ? \"Edit Contact\" : \"Add Contact\"}\n </div>\n <Button\n onClick={handleClose}\n variant=\"text\"\n icon={closeIcon}\n size=\"small\"\n color=\"primary\"\n className=\"cm:p-0\"\n />\n </div>\n );\n };\n\n const renderContent = () => {\n return (\n <div className=\"\" onClick={(e) => e.stopPropagation()}>\n {/* Form Fields */}\n <div className=\"cm:flex cm:flex-col cm:gap-4\">\n {/* Name Field */}\n <div className=\"cm:flex cm:flex-col cm:gap-1.5\">\n <label className=\"cm-form-field-label cm:text-slate-text-body cm:text-body-small cm:font-normal\">\n Full name\n </label>\n <TextField\n placeholder=\"Enter contact name\"\n value={formData.name}\n onChange={(e) => handleInputChange(\"name\", e.target.value)}\n className=\"cm:w-full\"\n error={!!errors.name}\n />\n {errors.name && (\n <span className=\"cm:text-error cm:text-xs cm:font-normal cm:leading-[18px]\">\n {errors.name}\n </span>\n )}\n </div>\n\n {/* Account Name Field - Read-only */}\n <div className=\"cm:flex cm:flex-col cm:gap-1.5\">\n <label className=\"cm-form-field-label cm:text-slate-text-body cm:text-body-small cm:font-normal\">\n Account name\n </label>\n <Tooltip\n content={\n <p className=\"cm:text-white cm:text-sm cm:font-medium cm:leading-5 cm:whitespace-nowrap\">\n This field is not editable\n </p>\n }\n >\n <TextField\n placeholder=\"No account associated\"\n value={formData.account_name}\n disabled={true}\n className=\"cm:w-full\"\n />\n </Tooltip>\n </div>\n\n {/* Email Field - Read-only (API only updates name) */}\n <div className=\"cm:flex cm:flex-col cm:gap-1.5\">\n <label className=\"cm-form-field-label cm:text-slate-text-body cm:text-body-small cm:font-normal\">\n Email\n </label>\n <Tooltip\n content={\n <p className=\"cm:text-white cm:text-sm cm:font-medium cm:leading-5 cm:whitespace-nowrap\">\n This field is not editable\n </p>\n }\n >\n <TextField\n placeholder=\"Enter email address\"\n value={formData.email}\n disabled={true}\n className=\"cm:w-full\"\n />\n </Tooltip>\n </div>\n\n {/* Phone — international format with country code (+ and digits only) */}\n <div className=\"cm:flex cm:flex-col cm:gap-1.5\">\n <label className=\"cm-form-field-label cm:text-slate-text-body cm:text-body-small cm:font-normal\">\n Phone number\n </label>\n <div\n className=\"cm:w-full\"\n onKeyDownCapture={handlePhoneFieldKeyDownCapture}\n >\n <TextField\n placeholder=\"Enter phone number\"\n value={formData.phone_number}\n type=\"tel\"\n className=\"cm:w-full\"\n error={!!errors.phone_number}\n onChange={(e) => {\n handleInputChange(\"phone_number\", sanitizePhoneInput(e.target.value));\n }}\n />\n </div>\n {errors.phone_number && (\n <span className=\"cm:text-error cm:text-xs cm:font-normal cm:leading-[18px]\">\n {errors.phone_number}\n </span>\n )}\n </div>\n </div>\n\n {/* Action Buttons */}\n </div>\n );\n };\n\n return (\n <div>\n <Tooltip content=\"Edit contact\" tooltipClassName=\"cm:text-white cm:text-sm cm:font-medium cm:leading-5 cm:whitespace-nowrap\">\n <IconButton\n image={editIcon}\n alt=\"Edit\"\n ariaLabel=\"Edit\"\n size=\"md\"\n onClick={handleClick}\n />\n </Tooltip>\n\n <style>{`\n .p-dialog-mask {\n background-color: rgba(0, 0, 0, 0.75) !important;\n }\n `}</style>\n <Dialog\n showBackButton={false}\n showCloseButton={true}\n open={dialogOpen}\n onClose={handleClose}\n maxWidth=\"sm\"\n title={renderHeader()}\n // `maskClassName` is declared on the toolkit's DialogProps as of\n // 1.1.0-beta.4 and honoured by both variants, so the suppression this\n // carried is gone.\n maskClassName={`cm-root${isDark ? \" cm-dark\" : \"\"}`}\n className=\"cm-root cm:bg-slate-surface-white cm:w-[440px]\"\n footer={\n <div className=\"cm:flex cm:gap-3 cm:items-center cm:justify-end cm:w-full\">\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n size=\"medium\"\n onClick={handleClose}\n className=\"cm:!w-[80px]\"\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n onClick={handleSubmit}\n size=\"medium\"\n color={\n isLoading ||\n !contact ||\n (formData.name.trim() === (contact?.name ?? '').trim() &&\n (formData.phone_number.trim() || \"\") ===\n (contact?.phone_number?.trim() || \"\"))\n ? \"secondary\"\n : \"primary\"\n }\n disabled={\n isLoading ||\n !contact ||\n (formData.name.trim() === (contact?.name ?? '').trim() &&\n (formData.phone_number.trim() || \"\") ===\n (contact?.phone_number?.trim() || \"\"))\n }\n className=\"cm:!w-[80px] cm:border-none!\"\n > \n {isLoading ? \"Saving...\" : \"Save\"}\n </Button>\n </div>\n }\n >\n {renderContent()}\n </Dialog>\n <Toast ref={toast} position=\"bottom-left\" />\n </div>\n );\n};\n\nexport default EditContact;\n","import React, { useEffect, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useContactsStore } from '../../stores/contacts';\nimport { useRenderConfigStore } from '../../stores/renderConfig';\nimport Loader from '../Loader';\nimport Icon from '../Icon';\nimport Avatar from '../Avatar';\nimport { formatContactName } from '../../utils/formatValue';\nimport TruncatedText from '../TruncatedText';\nimport EditContact from '../Contacts/EditContact';\nimport { GAINSIGHT_EVENTS } from '../../constants/gainsightEvents';\nimport CustomFieldsSummary from '@/features/custom-fields/components/summary';\nimport { useFeature } from '@/hooks/useFeature';\nimport { FEATURES } from '@/constants/features';\n\ninterface DetailRowProps {\n icon: React.ReactNode;\n label: string;\n value: string | number;\n valueColor?: 'default' | 'primary';\n onClick?: () => void;\n showComposeIconOnHover?: boolean;\n}\n\nconst DetailRow: React.FC<DetailRowProps> = ({ \n icon, \n label, \n value, \n valueColor = 'default', \n onClick,\n showComposeIconOnHover = false\n}) => {\n const [isHovered, setIsHovered] = useState(false);\n\n return (\n <div \n className=\"cm:flex cm:flex-col cm:items-start cm:relative cm:shrink-0 cm:w-full\"\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <div className=\"cm:flex cm:items-center cm:relative cm:shrink-0 cm:w-full\">\n <div className=\"cm:flex cm:gap-2 cm:items-center cm:relative cm:shrink-0 cm:w-[90px]\">\n <div className=\"cm:relative cm:shrink-0 cm:w-3.5 cm:h-3.5 cm:flex cm:items-center cm:justify-center\">\n {icon}\n </div>\n <p className=\"cm:font-normal cm:leading-5 cm:text-sm cm:text-left cm:text-slate-text-subtle cm:w-[90px]\">\n {label}\n </p>\n </div>\n <div className=\"cm:flex-1 cm:flex cm:gap-1 cm:h-full cm:items-center cm:min-w-0 cm:px-1 cm:py-0 cm:relative cm:shrink-0\">\n <TruncatedText\n text={String(value)}\n className={`cm:font-medium cm:leading-5 cm:text-sm cm:truncate cm:block cm:min-w-0 ${\n valueColor === 'primary' \n ? 'cm-link cm:text-primary-text-default'\n : 'cm:text-slate-text-title'\n } ${onClick ? 'cm:cursor-pointer cm:hover:underline' : ''}`}\n >\n <p onClick={onClick}>\n {value}\n </p>\n </TruncatedText>\n {showComposeIconOnHover && isHovered && onClick && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onClick();\n }}\n className=\"cm:flex cm:items-center cm:justify-center cm:shrink-0 cm:cursor-pointer\"\n aria-label=\"Compose email\"\n >\n <Icon name=\"compose_mail\" size={14} color=\"#64758B\" />\n </button>\n )}\n </div>\n </div>\n </div>\n );\n};\n\ninterface ContactDetailsProps {\n isHovered?: boolean;\n}\n\nconst ContactDetails: React.FC<ContactDetailsProps> = ({ isHovered = false }) => {\n const {\n fetchContactSummary,\n summaries\n } = useContactsStore();\n \n const customFieldsEnabled = useFeature(FEATURES.CUSTOM_FIELDS_ENABLED)\n\n const { callbacks, isComposeEnabled } = useRenderConfigStore();\n\n const { contactId } = useParams<{ contactId: string }>();\n\n const summary = contactId ? summaries[parseInt(contactId, 10)] : undefined;\n\n const summaryLoading = useContactsStore((state) => \n contactId ? state.summaryLoading[parseInt(contactId, 10)] : false\n );\n\n // Check if we've attempted to fetch (loading key exists in store)\n const hasAttemptedFetch = useContactsStore((state) => \n contactId ? (parseInt(contactId, 10) in state.summaryLoading) : false\n );\n\n useEffect(() => {\n if (contactId) {\n const contactIdNum = parseInt(contactId, 10);\n if (!isNaN(contactIdNum)) {\n fetchContactSummary(contactIdNum);\n }\n }\n }, [contactId, fetchContactSummary]);\n\n const account = summary?.company;\n\n const handleComposeEmail = () => {\n if (summary?.email && isComposeEnabled) {\n callbacks?.sendGainsightEvent?.(GAINSIGHT_EVENTS.CONTACT_COMPOSE_EMAIL_USED);\n callbacks?.onCompose?.(summary.email);\n }\n };\n\n // Show loader while loading OR if contactId exists but we haven't attempted fetch yet\n if (summaryLoading || (contactId && !hasAttemptedFetch)) {\n return (\n <div className=\"cm:flex cm:items-center cm:justify-center cm:w-full cm:py-4\">\n <Loader />\n </div>\n );\n }\n\n // Only show \"not found\" if we've attempted fetch, loading is complete, but no summary exists\n if (hasAttemptedFetch && !summaryLoading && contactId && !summary) {\n return (\n <div>\n <p className=\"cm:text-sm cm:text-slate-text-subtle\">Contact not found</p>\n </div>\n );\n }\n\n // Don't render anything if no contactId or no summary\n if (!contactId || !summary) {\n return null;\n }\n\n const displayName = formatContactName(summary.name, summary.channel_type);\n\n return (\n <div className=\"cm:flex cm:flex-col cm:gap-[20px] cm:items-stretch cm:relative cm:w-full\">\n {/* Contact Name Section */}\n <div className=\"cm:flex cm:items-center cm:justify-between cm:px-0 cm:rounded-[6px] cm:shrink-0\">\n <div className=\"cm:flex cm:gap-3 cm:items-center cm:relative cm:w-full\">\n {/* Contact Avatar */}\n {/* \"Unknown\" when a Space (voice) contact has no name — a voice contact is only a\n phone number until someone names it, which otherwise left this header blank next\n to a placeholder avatar. Same fallback, and same channel scope, as the contacts\n list. The summary sends the numeric channel id. */}\n <Avatar\n name={displayName}\n labelName={displayName}\n size=\"large\"\n className=\"cm:w-[28px] cm:h-[28px]\"\n />\n <p className=\"cm:font-medium cm:leading-5 cm:text-sm cm:text-slate-text-title cm:whitespace-nowrap\">\n {displayName}\n </p>\n </div>\n {!customFieldsEnabled && isHovered && <EditContact contact={summary} />}\n </div>\n\n {/* Details Section */}\n {/* <div className=\"cm:flex cm:flex-col cm:gap-0.5 cm:items-start cm:relative cm:shrink-0 cm:w-full\"> */}\n {account && (\n <DetailRow\n icon={<Icon name=\"accounts\" size={14} color=\"#64758B\" />}\n label=\"Account\"\n value={account.name || '-'}\n />\n )}\n <DetailRow\n icon={<Icon name=\"at_the_rate\" size={14} color=\"#64758B\" />}\n label=\"Email\"\n value={summary.email || '-'}\n valueColor={summary.email && isComposeEnabled ? \"primary\" : \"default\"}\n onClick={summary.email && isComposeEnabled ? handleComposeEmail : undefined}\n showComposeIconOnHover={!!summary.email && !!isComposeEnabled}\n />\n <DetailRow\n icon={<Icon name=\"phone\" size={14} color=\"#64758B\" />}\n label=\"Phone\"\n value={summary.phone_number || '-'}\n />\n {/* </div> */}\n\n <CustomFieldsSummary entityType=\"contact\" entityId={summary.id} />\n </div>\n );\n};\n\nexport default ContactDetails;\n","import { useState, useMemo } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport { useQueryClient } from \"@tanstack/react-query\";\n\nimport Tooltip from \"../Tooltip\";\nimport Icon from \"../Icon\";\nimport { CreateEditEntity } from \"@/features/entity/create-edit\";\nimport { ENTITY_TYPES, CF_TYPES } from \"@/constants/custom-fields\";\nimport { QUERIES } from \"@/constants/queries\";\nimport { useEntitySummary } from \"@/queries/useEntitySummary\";\nimport { useContactsStore } from \"@/stores/contacts\";\nimport { useFeature } from \"@/hooks/useFeature\";\nimport { FEATURES } from \"@/constants/features\";\nimport { sanitizePhoneInput } from '@/validations/contactPhone';\nimport { GAINSIGHT_EVENTS } from \"@/constants/gainsightEvents\";\nimport { useRenderConfig } from \"@/hooks/useRenderConfig\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\n\nconst EditContact = () => {\n\n const [openEdit, setOpenEdit] = useState(false);\n \n const { contactId } = useParams<{ contactId: string }>();\n const entityId = contactId ? parseInt(contactId, 10) : undefined;\n\n const callbacks = useRenderConfig();\n\n const { summaries, fetchContactSummary } = useContactsStore();\n const summary = contactId ? summaries[parseInt(contactId, 10)] : undefined;\n\n const queryClient = useQueryClient();\n\n const customFieldsEnabled = useFeature(FEATURES.CUSTOM_FIELDS_ENABLED)\n \n const { data: entityCustomFields, isLoading: entityCFLoading } = useEntitySummary({ entity_type: ENTITY_TYPES.CONTACT, entity_ids: [entityId!], enabled: customFieldsEnabled && Boolean(entityId) });\n \n const initialData = useMemo(() => {\n if(!summary) return {};\n const initialData: Record<string, unknown> = {\n name: summary.name,\n email: summary.email,\n phone_number: sanitizePhoneInput(summary.phone_number || \"\"),\n }\n\n for( const field of entityCustomFields?.custom_fields ?? [] ) {\n initialData[String(field.cf_id)] = field.type === CF_TYPES.DROPDOWN ? field.value_id : field.value;\n }\n\n return initialData;\n \n }, [ summary, entityCustomFields ])\n \n const onSuccess = () => {\n setOpenEdit(false);\n if (!entityId) return;\n // Refresh the summary data so the saved changes are reflected on the detail page.\n fetchContactSummary(entityId);\n queryClient.invalidateQueries({\n queryKey: [QUERIES.ENTITY_SUMMARY, ENTITY_TYPES.CONTACT],\n });\n };\n\n if (!customFieldsEnabled || !summary || entityCFLoading) return null;\n\n return (\n <div className=\"cm:ml-auto\">\n <Tooltip content=\"Edit contact\" tooltipClassName=\"cm:text-white cm:text-sm cm:font-medium cm:leading-5 cm:whitespace-nowrap\">\n <button\n type=\"button\"\n aria-label=\"Edit contact\"\n className={`cm-contact-edit-btn cm:w-7 cm:h-7 cm:p-0 cm:rounded-md cm:border-0 cm:bg-transparent cm:flex cm:items-center cm:justify-center cm:hover:bg-slate-surface-subtle-100 cm:transition-[opacity,background-color] cm:cursor-pointer ${IS_HUI ? \"cm:opacity-100\" : \"cm:opacity-0 cm:hover:opacity-100\"}`}\n onClick={() => {\n callbacks?.sendGainsightEvent?.(GAINSIGHT_EVENTS.CONTACT_EDIT_USED);\n setOpenEdit(true);\n }}\n >\n <Icon name=\"edit\" size={14} color=\"#334155\" />\n </button>\n </Tooltip>\n <CreateEditEntity\n open={openEdit}\n key={entityId}\n onClose={() => setOpenEdit(false)}\n onSuccess={onSuccess}\n entityType={ENTITY_TYPES.CONTACT}\n entityId={entityId}\n initialData={initialData}\n />\n </div>\n );\n};\n\nexport default EditContact;\n","import React from 'react';\nimport { useState } from 'react';\nimport Card from '../components/Card';\nimport { Tabs } from 'hiver-ui-kit-extended';\nimport ContactConversation from '../components/ContactConversation';\nimport DetailsCard from '../components/DetailsCard';\nimport ContactDetails from '../components/ContactDetails';\nimport EditContact from '@/components/Contacts/EditContactV2';\nimport Icon from '../components/Icon';\nimport { ScopedStyles } from '@/components/Styles';\nimport { BrandGlyph } from '@/components/BrandGlyph';\nimport { ENTITY_TYPES } from '@/constants/custom-fields';\nimport { IS_HUI } from '@/constants/uiFramework';\n\nconst ContactDetail: React.FC = () => {\n const [activeIndex, setActiveIndex] = useState(0);\n const tabsItems = [\n {\n label: (\n <div className=\"cm:flex cm:items-center cm:gap-2\">\n <Icon name=\"message\" size={14} type=\"active\" color=\"#0F172A\" />\n Conversations\n </div>\n ) as unknown as string,\n content: '',\n url: '/contacts'\n },\n ];\n const onTabChange = (e: unknown) => {\n setActiveIndex((e as {index:number})?.index);\n };\n\n return (\n <div className=\"cm:flex cm:gap-2 cm:px-12 cm:items-start cm:relative cm:shrink-0 cm:w-full cm:flex-1\">\n <ScopedStyles>\n {`\n .omni-tabs-primereact li:first-child {\n margin-left: 20px !important;\n }\n .omni-tabs-primereact li.p-unselectable-text .p-tabview-nav-link {\n padding: 14px 4px !important;\n }\n #cm-contact-details-sidepanel:hover .cm-contact-edit-btn{\n opacity: 1;\n }\n `}\n </ScopedStyles>\n <DetailsCard\n id='cm-contact-details-sidepanel'\n header={\n <div className=\"cm:flex cm:gap-2 cm:h-8 cm:items-center cm:justify-start cm:px-0 cm:py-1 cm:rounded-[6px] cm:shrink-0 cm:w-full\">\n <div className=\"cm:relative cm:shrink-0 cm:w-3.5 cm:h-3.5\">\n {/* hui: the side nav's person mark, idle — see AccountDetail. */}\n {IS_HUI ? (\n <BrandGlyph entity={ENTITY_TYPES.CONTACT} size={14} />\n ) : (\n <Icon name=\"details\" size={14} type=\"active\" color=\"#334155\" />\n )}\n </div>\n <p className=\"cm:font-medium cm:leading-5 cm:text-sm cm:text-slate-text-body cm:whitespace-nowrap\">\n Contact details\n </p>\n <EditContact />\n </div>\n }\n >\n <ContactDetails />\n </DetailsCard>\n <Card>\n <Tabs value={activeIndex} onTabChange={onTabChange} items={tabsItems} />\n {activeIndex === 0 && <ContactConversation />}\n </Card>\n </div>\n );\n};\n\nexport default ContactDetail;\n","import RightPanel from \"../RightPanel\";\nconst Converation = () => {\n return (\n <div className=\"cm:flex cm:gap-4 cm:items-start cm:relative cm:shrink-0 cm:w-full cm:h-full\">\n <div className=\"cm:flex-1\">dummy data</div>\n\n <div className=\"cm:border-l cm:h-full cm:border-slate-border-light cm:w-[330px]\">\n <RightPanel conversationMembers={[]} />\n </div>\n </div>\n );\n};\n\nexport default Converation;\n","import { ENDPOINTS } from '@/constants/endpoints';\n\nimport { replaceParams } from '@/utils/api';\nimport { getCFApiCallback } from './callback';\nimport type { EditCFPayload, ENTITY_TYPE, CF_ID, CustomField } from '@/types/custom-fields';\nimport { CF_TYPES } from '@/constants/custom-fields';\n\n\nexport type EditCFParams = {\n payload: EditCFPayload;\n cf_id: CF_ID;\n entity_type: ENTITY_TYPE;\n}\n\n\n\nexport const editCF = async (\n { payload, entity_type, cf_id }: EditCFParams\n): Promise<CustomField> => {\n const cfApiCallback = getCFApiCallback();\n const data = {\n ...payload,\n status: payload.status === 0 ? 0 : 1,\n action: \"EDIT\"\n }\n\n if( data.type !== CF_TYPES.DROPDOWN) {\n delete data.dropdown_default_value;\n delete data.dropdown_values;\n }\n\n const url = replaceParams(ENDPOINTS.EDIT_CUSTOM_FIELD, {\n entity_type,\n cf_id: String(cf_id),\n });\n const response = await cfApiCallback(url, {\n method: 'PUT',\n data\n });\n const apiData = response.data as { data: CustomField };\n return apiData?.data;\n};\n","import { useMutation, type MutationFunction } from \"@tanstack/react-query\";\n\nimport { createCF } from \"@/services/custom-fields/create-field\";\nimport { editCF } from \"@/services/custom-fields/edit-field\";\nimport { useApiToasts } from \"@/hooks/useApiToasts\";\nimport { ENTITY_TYPES } from \"@/constants/custom-fields\";\n\nimport type { EditCFParams } from \"@/services/custom-fields/edit-field\";\nimport type { CreateCFParams } from \"@/services/custom-fields/create-field\";\nimport type { CF_ID, CustomField, ENTITY_TYPE } from \"@/types/custom-fields\";\n\nexport type UseCFMutateParams<T extends CF_ID | undefined> = {\n entityType: ENTITY_TYPE;\n cf_id?: T;\n onSuccess: (data: CustomField) => void;\n}\n\ntype MutationParams = EditCFParams | CreateCFParams;\n\n\nexport const useCFMutate = <T extends CF_ID | undefined>({ entityType, cf_id, onSuccess }: UseCFMutateParams<T>) => {\n const { showSuccessToast, showErrorToast } = useApiToasts();\n\n const entity = entityType === ENTITY_TYPES.COMPANY ? 'Account' : 'Contact'; \n return useMutation<CustomField, Error, MutationParams>({\n mutationFn: (cf_id ? editCF : createCF) as MutationFunction<CustomField, MutationParams>,\n onSuccess: ( data ) => {\n showSuccessToast(`${entity} field ${cf_id ? 'updated' : 'created'}`);\n onSuccess(data);\n },\n onError: (error) => {\n showErrorToast(error?.message);\n },\n });\n};","import { DrawerFooter, PrimaryButton, SecondaryButton } from \"@/components/Drawer/Footer\"\nimport { useFormActions } from \"@/hooks/useFormActions\";\n\nimport type { CF_FormState } from \"@/types/custom-fields\";\n\nexport type FooterProps = {\n isEdit: boolean;\n isLoading: boolean;\n entityName: string;\n hasChanges: boolean;\n onSubmit: ( data: CF_FormState ) => void;\n onCancel: () => void;\n}\n\nexport const Footer = ({ isEdit, isLoading, entityName, hasChanges, onSubmit, onCancel }: FooterProps) => {\n\n const { formData, hasChanged, hasError } = useFormActions();\n\n const handleSubmit = () => {\n onSubmit(formData as CF_FormState);\n }\n\n const disabled = (isEdit && !hasChanged && !hasChanges) || hasError || isLoading;\n return (\n <DrawerFooter>\n <SecondaryButton\n label=\"Cancel\"\n disabled={isLoading}\n onClick={onCancel}\n />\n <PrimaryButton\n label={ isEdit ? 'Save' : `Create ${entityName} field`}\n disabled={disabled}\n onClick={handleSubmit}\n />\n </DrawerFooter>\n )\n}","import { apiClient } from \"@/services/axios\";\nimport { ENDPOINTS } from \"@/constants/endpoints\";\nimport { replaceParams } from \"@/utils/api\";\n\nimport type { ENTITY_TYPE } from \"@/types/custom-fields\";\nimport type { CrmConfigFieldMapping } from \"@/types/crm\";\n\nexport type MapFieldParams = {\n crmType: string;\n entityType: ENTITY_TYPE;\n fieldMappings: CrmConfigFieldMapping[];\n}\n\nexport const mapCrmFields = async ({ crmType, entityType, fieldMappings }: MapFieldParams): Promise<boolean> => {\n const url = replaceParams(ENDPOINTS.MAP_CRM_FIELD, {\n crmType,\n entityType\n })\n const response = await apiClient.put(url, {\n field_mappings: fieldMappings\n });\n return !!response.data;\n};","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\n\nimport { mapCrmFields } from \"@/services/crm-sync/map-crm-field\";\nimport { useApiToasts } from \"@/hooks/useApiToasts\";\nimport { CRM_CONFIGS_QUERY_KEY } from \"@/queries/useCrmConfigs\";\n\ntype UseMapCrmFieldsParams = {\n successMessage?: string;\n onSuccess?: () => void;\n};\n\nexport const useMapCrmFields = ({ successMessage = \"Mapping updated\", onSuccess }: UseMapCrmFieldsParams = {}) => {\n const queryClient = useQueryClient();\n const { showSuccessToast, showErrorToast } = useApiToasts();\n\n return useMutation({\n mutationFn: mapCrmFields,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: CRM_CONFIGS_QUERY_KEY });\n showSuccessToast(successMessage);\n onSuccess?.();\n },\n onError: (error: Error) => {\n showErrorToast(error?.message);\n },\n });\n};\n","import { useMemo, useState } from \"react\";\n\nimport { useCrmConfigs } from \"@/queries/useCrmConfigs\";\nimport { useMapCrmFields } from \"@/mutations/useMapCrmFields\";\n\nimport type { CustomField, ENTITY_TYPE } from \"@/types/custom-fields\";\nimport type { CrmField, CrmConfigFieldMapping } from \"@/types/crm\";\n\nexport type UseFieldMappingProps = {\n customField?: CustomField;\n entityType: ENTITY_TYPE;\n onSuccess?: () => void;\n}\n\nexport type OnAddMapping = ReturnType<typeof useFieldMapping>['onAddMapping'];\nexport type OnRemoveMapping = ReturnType<typeof useFieldMapping>['onRemoveMapping'];\nexport type CurrentMapping = ReturnType<typeof useFieldMapping>['currentMapping'];\n\nconst ACTIONS = {\n REMOVE: 'remove'\n} as const;\n\ntype ActionMapping = Omit<CrmConfigFieldMapping, 'cf_id'> | typeof ACTIONS.REMOVE;\n\nconst isRemoveAction = (action?: ActionMapping): action is typeof ACTIONS.REMOVE => action === ACTIONS.REMOVE;\n\nexport const useFieldMapping = ({ customField, entityType, onSuccess }: UseFieldMappingProps) => { \n\n const [ actionMapping, setActionMapping ] = useState<ActionMapping>()\n const { data } = useCrmConfigs();\n\n const config = useMemo(() => {\n const configs = data?.data ?? [];\n return configs[0] ?? null;\n }, [data]);\n\n const crmProvider = config?.crm_provider ?? \"\";\n\n const entityMappings = useMemo<CrmConfigFieldMapping[]>(\n () => config?.field_mappings[entityType] ?? [],\n [config, entityType],\n );\n\n const currentMapping = useMemo(() => { \n const existing = customField && customField.connector_id\n ? entityMappings.find((m) => String(m.cf_id) === String(customField.cf_id)) ?? null\n : null;\n\n if (isRemoveAction(actionMapping)) return null;\n if (actionMapping) return actionMapping;\n return existing;\n }, [entityMappings, actionMapping, customField]);\n\n const { mutate: mapFields, isPending } = useMapCrmFields({\n successMessage: customField?.connector_id ? \"Mapping removed\" : \"Field mapped\",\n onSuccess\n });\n\n const onRemoveMapping = () => {\n if (!customField) return;\n setActionMapping(ACTIONS.REMOVE);\n };\n\n const onAddMapping = (field: CrmField) => {\n const newMapping: Omit<CrmConfigFieldMapping, 'cf_id'> = {\n crm_field_key: field.crm_field_key,\n crm_field_label: field.display_name,\n crm_field_type: field.type,\n status: \"active\",\n };\n setActionMapping(newMapping);\n };\n\n const updateMapping = (customField: CustomField) => {\n if (!actionMapping || !customField) return onSuccess?.();\n if (actionMapping === ACTIONS.REMOVE) {\n return mapFields({\n crmType: crmProvider,\n entityType,\n // All mappings for this entity_type with the current one removed.\n fieldMappings: entityMappings.filter(\n (m) => String(m.cf_id) !== String(customField.cf_id),\n ),\n });\n }\n\n const newMapping = {\n ...actionMapping as CrmConfigFieldMapping,\n cf_id: customField.cf_id,\n }\n return mapFields({\n crmType: crmProvider,\n entityType,\n fieldMappings: [...entityMappings, newMapping],\n });\n \n }\n\n const connected = config?.status === 'active';\n\n return {\n connected,\n actionMapping,\n crmProvider,\n entityMappings,\n currentMapping,\n isPending,\n updateMapping,\n onAddMapping,\n onRemoveMapping,\n }\n}","import * as React from \"react\";\nconst SvgTrash = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 16, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", \"aria-hidden\": \"true\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6M10 11v6M14 11v6\", stroke: \"currentColor\", strokeWidth: 1.5, strokeLinecap: \"round\", strokeLinejoin: \"round\" }));\nexport default SvgTrash;\n","import { useRef, useEffect, useMemo } from \"react\";\nimport { cn } from \"@/utils/classNames\";\nimport { DragAndDrop } from \"@/components/DragAndDrop\";\nimport { TextField } from \"@/components/TextField\";\nimport Tooltip from \"@/components/Tooltip\";\n\nimport TrashIcon from \"@/assets/trash.svg?react\";\n\ntype Row = Record<string, unknown>;\n\nexport type OptionsFieldProps<T extends Row> = {\n value: T[];\n inputKey: keyof T;\n getKey: (row: T) => string | number;\n createRow: () => T;\n onChange: (value: T[]) => void;\n onBlur?: () => void;\n placeholder?: string;\n maxLength?: number;\n error?: boolean;\n disabled?: boolean;\n className?: string;\n};\n\nexport const OptionsField = <T extends Row>({\n value = [],\n inputKey,\n getKey,\n createRow,\n onChange,\n onBlur,\n placeholder = \"Please enter the field value\",\n maxLength = 50,\n error = false,\n disabled = false,\n className,\n}: OptionsFieldProps<T>) => {\n\n const initDataRef = useRef(false);\n\n const rows = useMemo(() => Array.isArray(value) ? value : [], [value]);\n\n useEffect(() => {\n if(initDataRef.current) return;\n const next = rows.length ? [...rows, createRow()] : [createRow()];\n onChange(next);\n initDataRef.current = true;\n }, [rows, createRow, onChange]);\n\n const handleEdit = (index: number, inputValue: string) => {\n const rowData = rows[index];\n if (!rowData) return;\n const next = [...rows];\n next[index] = { ...rowData, [inputKey]: inputValue };\n if(index === rows.length - 1 && !rowData[inputKey] && !!inputValue) { \n next.push(createRow());\n }\n onChange(next);\n };\n\n const handleDelete = (index: number) => {\n const next = rows.filter((_, i) => i !== index);\n onChange(next);\n };\n\n const handleReorder = (next: T[]) => onChange(next);\n\n const lastIndex = rows.length - 1;\n const filledCount = rows.length - 1;\n const canDelete = filledCount > 1;\n\n return (\n <div className={cn(\"cm:flex cm:flex-col cm:gap-2\", className)}>\n <DragAndDrop\n items={rows}\n getKey={getKey}\n onReorder={handleReorder}\n disabled={disabled}\n renderItem={(row, index) => {\n const isTrailing = index === lastIndex;\n return (\n <div className=\"cm:flex cm:items-center cm:gap-2 cm:w-full\">\n <TextField\n value={row[inputKey] as string}\n placeholder={placeholder}\n maxLength={maxLength}\n error={error && !isTrailing}\n disabled={disabled}\n onChange={(event) => handleEdit(index, event.target.value)}\n onBlur={onBlur}\n />\n {\n !isTrailing && (\n <Tooltip content=\"Delete\">\n <button\n type=\"button\"\n onClick={() => handleDelete(index)}\n disabled={!canDelete || disabled}\n aria-label=\"Delete option\"\n className={cn(\n \"cm:w-10 cm:h-10 cm:flex cm:items-center cm:justify-center cm:shrink-0\",\n \"cm:rounded-md cm:bg-white cm:border cm:border-solid cm:border-slate-border-light\",\n \"cm:text-slate-icons-subtle\",\n \"cm:hover:bg-slate-surface-subtle-100 cm:hover:[&>svg]:text-slate-icons-active\",\n canDelete && !disabled\n ? \"cm:cursor-pointer hover:cm:bg-slate-surface-subtle\"\n : \"cm:cursor-not-allowed cm:opacity-50\",\n )}\n > \n <TrashIcon />\n </button>\n </Tooltip>\n )\n }\n </div>\n );\n }}\n />\n </div>\n );\n};\n","import { Select } from \"@/components/Select\";\nimport { CF_TYPE_OPTIONS } from \"@/constants/custom-fields\";\n\nimport type { CFTypeOption } from '@/constants/custom-fields';\n\nexport type TypeFieldProps = {\n value: unknown;\n isEdit: boolean;\n onChange: (value: string) => void;\n}\n\nconst itemTemplate = (value: CFTypeOption) => {\n if (!value.getIcon) return value?.label || '-';\n return (\n <div className=\"cm:flex cm:items-center cm:gap-1\">\n <span className=\"cm:flex cm:items-center cm:justify-center cm:w-6 cm:h-6 cm:-m-1\">\n {value.getIcon()}\n </span>\n <span className=\"cm:text-sm cm:text-slate-text-default\">{value.label}</span>\n </div>\n )\n}\n\nconst valueTemplate = (value: CFTypeOption) => {\n if (!value.getIcon) return value?.label || '-';\n return (\n <div className=\"cm:flex cm:items-center cm:gap-1 cm:px-1\">\n <span className=\"cm:flex cm:items-center cm:justify-center cm:w-6 cm:h-6 cm:-m-1\">\n {value.getIcon()}\n </span>\n <span className=\"cm:text-sm cm:text-slate-text-default\">{value.label}</span>\n </div>\n )\n}\n\n\nexport const TypeField = ({ value, isEdit, onChange }: TypeFieldProps) => { \n \n return (\n <Select\n value={value}\n options={CF_TYPE_OPTIONS}\n disabled={isEdit}\n // The toolkit types the event's value `unknown` where primereact typed it\n // `any` — the options are `CF_TYPE_OPTIONS`, whose values are the CF type\n // strings, so this narrows rather than assumes.\n onChange={(e) => onChange(e.target.value as string)}\n itemTemplate={itemTemplate}\n valueTemplate={valueTemplate}\n />\n )\n}","import { CF_TYPES } from \"@/constants/custom-fields\";\n\nimport type { CF_TYPE } from \"@/types/custom-fields\";\n\nexport const getTypeText = (type: CF_TYPE) => {\n switch(type) {\n case CF_TYPES.TEXT:\n return 'Text';\n case CF_TYPES.NUMBER:\n return 'Number';\n case CF_TYPES.DATE:\n return 'Date';\n case CF_TYPES.URL:\n return 'URL';\n case CF_TYPES.DROPDOWN:\n return 'Dropdown';\n case CF_TYPES.CHIP:\n return 'List of values';\n case CF_TYPES.BOOLEAN:\n return 'Yes or No'\n default:\n return type || '';\n }\n}","import { useMemo } from 'react';\nimport { useFieldMappingData } from \"@/features/crm-sync/hooks/useFieldMappingData\";\nimport { SearchableDropdown } from \"@/features/crm-sync/components/shared/SearchableDropdown\";\nimport { FieldTypeIcon } from \"@/features/crm-sync/components/shared/FieldTypeIcon\";\nimport { useFieldMapping } from \"../../hooks/useFieldMapping\";\nimport { getTypeText } from '../../utils';\nimport { ENTITY_TYPES } from '@/constants/custom-fields';\n\nimport type { CF_TYPE, CustomField, ENTITY_TYPE } from \"@/types/custom-fields\";\nimport type { OnAddMapping, OnRemoveMapping, CurrentMapping } from '../../hooks/useFieldMapping';\n\nexport type CrmMappingProps = {\n customField?: CustomField;\n entityType: ENTITY_TYPE;\n fieldType: CF_TYPE;\n currentMapping: CurrentMapping;\n onAddMapping: OnAddMapping;\n onRemoveMapping: OnRemoveMapping;\n};\n\nconst getDisabledData = (isMapped: boolean, fieldType?: CF_TYPE, crmTypes?: string[],) => {\n if (isMapped) {\n return {\n disabled: true,\n disabledMessage: 'Already mapped to another field'\n }\n }\n if (!fieldType || !Array.isArray(crmTypes)) return null;\n if (crmTypes.includes(fieldType.toLowerCase())) return null;\n\n const crmType = (crmTypes[0] ?? '').toUpperCase() as CF_TYPE;\n return {\n disabled: true,\n disabledMessage: `'${getTypeText(crmType)}' is incompatible with '${getTypeText(fieldType)}' - cannot be mapped`\n }\n}\n\nexport const CrmMapping = ({ customField, fieldType, entityType, currentMapping, onAddMapping, onRemoveMapping }: CrmMappingProps) => {\n\n const { crmProvider, connected, entityMappings } = useFieldMapping({ customField, entityType });\n\n // CRM field catalogue (for the \"Map a field\" picker) — only fetched when\n // connector is connected but not yet mapped.\n const { crmFields } = useFieldMappingData({\n open: Boolean(crmProvider) && !currentMapping,\n entityType,\n crmProvider,\n });\n\n const dropdownFields = useMemo(() => { \n if (!Array.isArray(crmFields) || !crmFields.length) return [];\n const mappedFields = Object.fromEntries(entityMappings.map(entity => [entity.crm_field_key, true]));\n return crmFields.map(field => ({\n ...field,\n ...getDisabledData(mappedFields[field.crm_field_key], fieldType, field.hiver_field_types)\n }))\n }, [ crmFields, fieldType, entityMappings ])\n\n const entityName = entityType === ENTITY_TYPES.COMPANY ? 'account' : 'contact';\n const providerNameNode = typeof crmProvider === 'string' && crmProvider.length ? <span className='cm:capitalize'>{crmProvider}</span> : null;\n\n if (!connected) return null;\n\n if (currentMapping) {\n return (\n <div className=\"cm:flex cm:flex-col cm:gap-1.5\">\n <span className=\"cm:text-sm cm:text-slate-text-subtle\">{providerNameNode} field</span>\n <div className=\"cm:flex cm:items-center cm:justify-between cm:gap-2 cm:rounded-md cm:bg-[#F8FAFC] cm:border cm:border-slate-200 cm:px-3.5 cm:py-3\">\n <span className=\"cm:text-sm cm:text-slate-text-default\">{currentMapping?.crm_field_label || 'unknown'}</span>\n <button\n type=\"button\"\n onClick={onRemoveMapping}\n className=\"cm-link cm:text-sm cm:font-medium cm:cursor-pointer cm:bg-transparent cm:border-0 cm:p-0 cm:disabled:opacity-50 cm:disabled:cursor-not-allowed\"\n >\n Remove mapping\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"cm-cf-mapping\">\n <SearchableDropdown\n triggerLabel={<span>+ Map a field{providerNameNode ? ' from' : null} {providerNameNode}</span>}\n title={<span>{providerNameNode} {entityName} fields</span>}\n items={dropdownFields}\n getItemKey={(f) => f.crm_field_key}\n isItemDisabled={(f) => f.disabled ?? false}\n filterItem={(f, search) =>\n (f.display_name ?? \"\").toLowerCase().includes(search.toLowerCase())\n }\n onSelect={onAddMapping}\n searchPlaceholder=\"Search fields\"\n emptyMessage=\"No fields found\"\n dropdownHeight=\"320px\"\n getItemTooltip={(field) => field.disabledMessage}\n renderItem={(field, isDisabled) => (\n <div className=\"cm:flex cm:items-center cm:gap-3 cm:px-4 cm:py-2.5\">\n <FieldTypeIcon type={(field.type ?? \"\").toLowerCase()} className=\"cm:flex-shrink-0\" />\n <div className=\"cm:flex cm:flex-col cm:min-w-0\">\n <span\n className={`cm:text-sm cm:truncate ${isDisabled ? \"cm:text-slate-400\" : \"cm:text-slate-700\"}`}\n >\n {field.display_name}\n </span>\n {field.type && (\n <span\n className={`cm:text-xs cm:font-normal cm:capitalize cm:truncate ${isDisabled ? \"cm:text-slate-300\" : \"cm:text-slate-400\"}`}\n >\n {field.type}\n </span>\n )}\n </div>\n </div>\n )}\n />\n </div>\n );\n};\n","export const getUniqueId = () => {\n if( typeof window !== 'undefined' && window.crypto && window.crypto.randomUUID ) return window.crypto.randomUUID();\n return Date.now().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n}","import { TextField } from \"@/components/TextField\";\nimport { Textarea } from \"@/components/Textarea\";\nimport { OptionsField } from \"@/components/OptionsField\";\nimport { FormField } from \"@/components/FormField\";\nimport { TypeField } from \"./type-field\";\nimport { CrmMapping } from \"./crm-mapping\";\nimport { getUniqueId } from \"@/utils\";\nimport { useFormStore } from \"@/contexts/form\";\nimport { optionsValidation, objectListChanged } from \"@/utils/validations\";\nimport { CF_TYPES } from \"@/constants/custom-fields\";\n\nimport type { CF_DropdownOption, CF_TYPE, CustomField, ENTITY_TYPE } from \"@/types/custom-fields\";\nimport type { CurrentMapping, OnAddMapping, OnRemoveMapping } from \"../../hooks/useFieldMapping\";\n\nconst objectDiff = objectListChanged(['value', 'display_name']);\n\nconst checkDropdownDiff = ( value: unknown, previous: unknown ) => {\n if (!Array.isArray(value)) return true;\n const filteredValue = value.filter(option => !!option.value);\n return objectDiff(filteredValue, previous)\n}\n\nexport type FormBodyProps = {\n entityName: string;\n isEdit: boolean;\n entityType: ENTITY_TYPE;\n customField?: CustomField;\n currentMapping: CurrentMapping;\n onAddMapping: OnAddMapping;\n onRemoveMapping: OnRemoveMapping;\n}\n\nexport const FormBody = ({ entityName, isEdit, entityType, customField, currentMapping, onAddMapping, onRemoveMapping }: FormBodyProps) => {\n const type = useFormStore((state) => state.values.type as CF_TYPE);\n\n return (\n <div className=\"cm:flex-1 cm:min-h-0 cm:overflow-y-auto cm:px-7 cm:py-5 cm:flex cm:flex-col cm:gap-5\">\n <FormField\n name=\"type\"\n label=\"Field type\"\n validations={{isRequired: true}}\n renderField={(props) => (\n <TypeField\n value={props.value}\n isEdit={isEdit}\n onChange={props.onChange}\n />\n )}\n />\n <FormField\n name=\"display_name\"\n label=\"Name\"\n validations={{ isRequired: true, maxLength: 50 }}\n renderField={(props) => (\n <TextField\n placeholder=\"Enter a name\"\n value={props.value as string}\n error={props.hasError}\n onChange={(e) => props.onChange(e.target.value)}\n onBlur={props.onBlur}\n maxLength={50}\n />\n )}\n />\n <FormField\n name=\"description\"\n label=\"Description\"\n renderField={(props) => (\n <Textarea\n placeholder={`Add a description for this ${entityName} field`}\n value={props.value as string}\n error={props.hasError}\n onChange={(e) => props.onChange(e.target.value)}\n maxLength={150}\n onBlur={props.onBlur}\n />\n )}\n />\n\n {type === CF_TYPES.DROPDOWN && (\n <FormField\n name=\"dropdown_values\"\n label=\"Field values\"\n validations={{\n isRequired: true,\n custom: optionsValidation,\n }}\n checkDiff={checkDropdownDiff}\n renderField={(props) => {\n const options = (props.value as CF_DropdownOption[] | undefined) ?? [];\n\n const createRow = (): CF_DropdownOption => ({ display_name: \"\", __id: getUniqueId() });\n\n return (\n <OptionsField\n value={options}\n inputKey=\"display_name\"\n maxLength={50}\n error={props.hasError}\n createRow={createRow}\n getKey={(row) => row.id || row.__id!}\n onChange={props.onChange}\n onBlur={props.onBlur}\n />\n );\n }}\n />\n )}\n\n <CrmMapping\n customField={customField}\n entityType={entityType}\n fieldType={type}\n currentMapping={currentMapping}\n onAddMapping={onAddMapping}\n onRemoveMapping={onRemoveMapping}\n />\n\n {/* For V2: Add a button to map a field from Salesforce */}\n {/* <button\n type=\"button\"\n className=\"cm:text-sm cm:font-medium cm:text-[#0B5FFF] cm:self-start cm:cursor-pointer cm:bg-transparent cm:border-0 cm:p-0\"\n >\n + Map a field from Salesforce\n </button> */}\n </div>\n );\n};","import { useMemo } from \"react\";\n\nimport { useDelayedState } from \"@/hooks/useDelayedState\";\nimport { FormProvider } from \"@/contexts/form\";\nimport { Drawer } from \"@/components/Drawer\";\nimport { DrawerHeader } from \"@/components/Drawer/Header\";\nimport { CF_TYPES } from \"@/constants/custom-fields\";\nimport { useCFMutate } from \"@/mutations/useCFMutate\";\nimport { INIT_DATA } from \"@/constants/custom-fields\";\nimport { Footer } from \"./footer\";\nimport { getDropdownPayload } from \"@/utils/form\";\nimport { getEntityName } from \"@/utils/entity\";\nimport { useFieldMapping } from \"../../hooks/useFieldMapping\";\n\nimport { FormBody } from \"./form-body\";\n\nimport type { CustomField, ENTITY_TYPE, CF_FormState } from \"@/types/custom-fields\";\n\nexport type CreateEditCFProps = {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n entityType: ENTITY_TYPE;\n customField?: CustomField;\n};\n\nexport const CreateEditCF = (props: CreateEditCFProps) => {\n const delayedOpen = useDelayedState(props.open, 200);\n \n if (!props.open) return;\n \n return <CreateEditCFForm { ...props } delayedOpen={delayedOpen} />\n}\n\n\nexport const CreateEditCFForm = ({ open, delayedOpen, customField, entityType, onClose, onSuccess }: CreateEditCFProps & { delayedOpen: boolean }) => {\n const isEdit = Boolean(customField);\n \n const entityName = getEntityName(entityType);\n\n const { actionMapping, currentMapping, updateMapping, onAddMapping, onRemoveMapping } = useFieldMapping({ customField, entityType, onSuccess });\n\n const onCFMutateSuccess = ( savedField: CustomField ) => {\n updateMapping(customField || savedField);\n }\n\n const { mutate: mutateCF, isPending } = useCFMutate({\n entityType,\n cf_id: customField?.cf_id,\n onSuccess: onCFMutateSuccess\n });\n\n const initialData: CF_FormState = useMemo(() =>{\n if(customField) {\n return {\n type: customField.type,\n display_name: customField.display_name,\n description: customField.description,\n dropdown_values: customField.dropdown_values ?? [],\n }\n }\n return { ...INIT_DATA };\n }, [customField]);\n\n\n const handleSubmit = ( data: CF_FormState ) => {\n if( customField?.cf_id ){\n mutateCF({\n payload: {\n ...data,\n info_icon: false,\n status: customField.status === 0 ? 0 : 1,\n ...( data.type === CF_TYPES.DROPDOWN && {\n dropdown_default_value: null,\n dropdown_values: getDropdownPayload(data.dropdown_values),\n })\n },\n entity_type: entityType,\n cf_id: customField.cf_id,\n });\n } else {\n mutateCF({\n payload: {\n ...data,\n info_icon: false,\n ...( data.type === CF_TYPES.DROPDOWN && {\n dropdown_default_value: null,\n dropdown_values: getDropdownPayload(data.dropdown_values),\n })\n },\n entity_type: entityType,\n });\n }\n };\n \n if (!open) return null;\n\n // Also a form — see the note in features/entity/create-edit.\n return (\n <Drawer open={delayedOpen} className=\"cm:w-[640px]\" onClose={onClose} closeOnOverlayClick={false}>\n <div className=\"cm:flex cm:flex-col cm:h-full\">\n <DrawerHeader\n title={isEdit ? `Edit ${entityName} field` : `Create ${entityName} field`}\n onClose={onClose}\n />\n\n <FormProvider initialData={initialData} key={customField?.cf_id}>\n <FormBody\n entityName={entityName}\n isEdit={isEdit}\n entityType={entityType}\n customField={customField}\n currentMapping={currentMapping}\n onAddMapping={onAddMapping}\n onRemoveMapping={onRemoveMapping}\n />\n <Footer\n isEdit={isEdit}\n entityName={entityName}\n isLoading={isPending}\n hasChanges={!!actionMapping}\n onSubmit={handleSubmit}\n onCancel={onClose}\n />\n </FormProvider>\n </div>\n </Drawer>\n );\n};\n","// /api/v1/config/custom-fields?ug_id=4&inbox_id=4704\n\nimport { ENDPOINTS } from '@/constants/endpoints';\n\nimport { getCFApiCallback } from './callback';\nimport { replaceParams } from '@/utils/api';\n\nimport { CF_TYPES } from '@/constants/custom-fields';\nimport type { CustomField, CF_VISIBILITY, CF_DropdownOption } from '@/types/custom-fields';\n\n\nconst CUSTOMER_PANEL: CF_VISIBILITY = \"customer_panel\";\n\nexport type ToggleCFVisibilityParams = {\n customField: CustomField;\n}\n\nconst standardiseDropdown = ( dropdowns?: CF_DropdownOption[] ) => {\n if (!Array.isArray(dropdowns)) return [];\n return dropdowns.map(dropdown => ({\n value: dropdown.value || dropdown.display_name,\n id: dropdown.id,\n status: dropdown.status,\n }))\n}\n\nexport const toggleCFVisibility = async (\n { customField }: ToggleCFVisibilityParams\n): Promise<boolean> => {\n const currentVisibility = customField.visibility ?? [];\n const visibility = currentVisibility.includes(CUSTOMER_PANEL)\n ? currentVisibility.filter((item) => item !== CUSTOMER_PANEL)\n : [...currentVisibility, CUSTOMER_PANEL];\n\n const body = {\n display_name: customField.display_name,\n status: customField.status ?? 1,\n info_icon: false,\n visibility,\n action: \"EDIT\",\n ...customField.type === CF_TYPES.DROPDOWN ? {\n dropdown_values: standardiseDropdown(customField.dropdown_values),\n dropdown_default_value: null\n }: null\n }\n const cfApiCallback = getCFApiCallback();\n\n const url = replaceParams(ENDPOINTS.TOGGLE_CUSTOM_FIELD_VISIBILITY, {\n cf_id: customField.cf_id as string,\n });\n const response = await cfApiCallback(url, {\n method: 'PUT',\n data: body\n });\n\n return response.status === 200;\n};","import { useState } from \"react\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nimport { toggleCFVisibility } from \"@/services/custom-fields/toggle-visibility\";\n\nimport type { ToggleCFVisibilityParams } from \"@/services/custom-fields/toggle-visibility\";\nimport type { CF_ID, CustomField } from \"@/types/custom-fields\";\nimport { useApiToasts } from \"@/hooks/useApiToasts\";\n\nexport type UseCFVisibilityParams = {\n onSuccess: (customField: CustomField) => void;\n}\n\nexport const useCFVisibility = ({ onSuccess }: UseCFVisibilityParams) => {\n const [ toggleFields, setToggleFields ] = useState<Record<CF_ID, CustomField>>({}); \n const { showErrorToast } = useApiToasts();\n const mutationProps = useMutation({\n mutationFn: async (params:ToggleCFVisibilityParams) => {\n setToggleFields(fields => ({ ...fields, [params.customField?.cf_id]: params.customField }));\n await toggleCFVisibility(params);\n return params.customField;\n },\n onSuccess: (customField) => {\n setToggleFields( fields => {\n const next = { ...fields };\n delete next[customField?.cf_id];\n return next;\n });\n\n onSuccess({ ...customField, status: customField?.status === 1 ? 0 : 1 });\n },\n onError: (error) => {\n showErrorToast(error?.message);\n },\n });\n\n return {\n ...mutationProps,\n toggleFields,\n }\n};","import { CF_SOURCES } from \"@/constants/custom-fields\";\nimport { useEnabledConnectors } from \"@/queries/useEnabledConnectors\";\n\nimport HiverIcon from \"@/assets/hiver-logo.svg?react\";\n\nimport type { CF_SOURCE_TYPE } from \"@/types/custom-fields\";\n\nexport const DataSourceCell = ({\n source = CF_SOURCES.HIVER,\n connectorId,\n }: {\n source?: CF_SOURCE_TYPE;\n connectorId?: string;\n }) => {\n const { data: connectors } = useEnabledConnectors();\n\n const connector = connectorId\n ? connectors?.find((item) => item.id === connectorId)\n : undefined;\n\n if (connector?.logo) {\n return (\n <div className=\"cm:flex cm:items-center cm:gap-2\">\n <img\n src={connector.logo}\n alt={connector.name}\n className=\"cm:w-4 cm:h-4 cm:rounded-full cm:object-contain\"\n />\n <span className=\"cm:text-sm cm:text-slate-text-body capitalize-first\">\n {connector.name}\n </span>\n </div>\n );\n }\n\n const iconNode = source === CF_SOURCES.HIVER ? <HiverIcon /> : null;\n\n return (\n <div className=\"cm:flex cm:items-center cm:gap-2\">\n <div\n className={`cm:w-4 cm:h-4 cm:rounded-full cm:flex cm:items-center cm:justify-center cm:text-[10px] cm:font-semibold cm:text-white`}\n >\n {iconNode}\n </div>\n <span className=\"cm:text-sm cm:text-slate-text-body capitalize-first\">\n {source}\n </span>\n </div>\n );\n};\n","import { Checkbox } from \"@/components/Checkbox\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\n\nexport type VisibilityCellProps = {\n checked: boolean;\n disabled?: boolean;\n onClick: () => void;\n}\n\nexport const VisibilityCell = ({ checked, disabled = false, onClick }: VisibilityCellProps) => (\n <Checkbox\n checked={checked}\n disabled={disabled}\n /* `Checkbox`'s 14px default is Omni's. HiG draws it at 16 (icon-size/sm),\n and the box is set by an inline style, so this cannot be corrected from\n the stylesheet — it has to be the prop. */\n size={IS_HUI ? 16 : undefined}\n onClick={onClick}\n />\n);\n","import { getTypeText } from \"../../utils\";\nimport TruncatedText from \"@/components/TruncatedText\";\n\nimport type { CF_TYPE } from \"@/types/custom-fields\";\n\nexport const TypeCell = ({ type }: { type: CF_TYPE }) => {\n return (\n <TruncatedText text={getTypeText(type)} className=\"cm:text-[#334155] cm:font-normal\" />\n )\n};\n","import Tooltip from \"@/components/Tooltip\";\nimport Icon from \"@/components/Icon\";\n\n/**\n * Hover-reveal on BOTH builds.\n *\n * This reverses an earlier decision in this run, deliberately and on\n * instruction. hui was switched to always-visible because the row-hover rule\n * that should have revealed the button never reached it in the custom-fields\n * table, so the only edit affordance on that screen was effectively invisible —\n * always-on was the fix for a broken hover, not a considered design choice.\n *\n * The supervisor's review asks for hover-only here, so the hover is repaired\n * instead: section 19 of `theme/design-system.hui.css` targets the row and the\n * button directly. Keyboard users are not stranded — `:focus-within` on the row\n * reveals it too, which the opacity-only Omni treatment never did.\n */\n\nexport type ActionsCellProps = {\n onClick: () => void;\n}\n\nexport const ActionsCell = ({ onClick }: ActionsCellProps) => {\n return (\n <Tooltip content=\"Edit\" tooltipClassName=\"cm:text-white cm:text-sm cm:font-medium cm:leading-5 cm:whitespace-nowrap\">\n <button\n type=\"button\"\n aria-label=\"Edit custom field\"\n onClick={onClick}\n className={`cm-cf-edit-action cell-actions cm:w-7 cm:h-7 cm:p-0 cm:border cm:border-slate-border-light cm:rounded-md cm:bg-white cm:hover:bg-slate-surface-subtle-100 cm:flex cm:items-center cm:justify-center cm:cursor-pointer cm:transition-[background-color,border-color,box-shadow] cm:opacity-0`}\n >\n <Icon name=\"edit\" size={14} color=\"#334155\" />\n </button>\n </Tooltip>\n )\n}\n","import { useMemo, useState } from \"react\";\nimport { Button, DataTable, TextField, Toolbar } from \"hiver-ui-kit-extended\";\nimport { SearchInput } from \"@/components/Search/SearchInput\";\nimport { PlusGlyph } from \"@/components/Icon/glyphs\";\nimport searchIcon from \"@/assets/search.svg\";\nimport TruncatedText from \"@/components/TruncatedText\";\nimport { CreateEditCF } from \"./create-edit\";\nimport Loader from \"@/components/Loader\";\nimport EmptyState from \"@/components/EmptyState\";\nimport { CDN_ASSETS } from \"@/constants/cdnAssets\";\n\nimport { useCFList } from \"@/queries/useCFList\";\nimport { useCFVisibility } from \"@/mutations/useCFVisibility\";\nimport { ENTITY_DEFAULT_COLUMNS } from \"@/constants/entity\";\nimport { useFeature } from \"@/hooks/useFeature\";\nimport { FEATURES } from \"@/constants/features\";\nimport { CF_TYPES } from \"@/constants/custom-fields\";\nimport { DataSourceCell } from \"./table-cells/data-source\";\nimport { VisibilityCell } from \"./table-cells/visibility\";\nimport { TypeCell } from \"./table-cells/type\";\nimport { ActionsCell } from \"./table-cells/actions\";\nimport { cn } from \"@/utils/classNames\";\nimport { getEntityName } from \"@/utils/entity\";\nimport { IS_HUI } from \"@/constants/uiFramework\";\n\nimport PlusIcon from '@/assets/plus.svg?react';\n\nimport type { CustomField, ENTITY_TYPE } from \"@/types/custom-fields\";\nimport { useCrmConfigs } from \"@/queries/useCrmConfigs\";\nimport { ENTITY_TYPES } from \"@/constants/custom-fields\";\n\nexport type CustomFieldsListingProps = {\n entity_type: ENTITY_TYPE;\n}\n\nconst isCustomField = (row: Record<string,unknown>): row is CustomField => {\n return !('_no_actions' in row);\n}\n\nconst isLockedField = (row: Record<string,unknown>): row is CustomField => {\n return !!row._crmLocked;\n}\n\nexport const CustomFieldsListing = ({ entity_type = 'company' }: CustomFieldsListingProps) => {\n const [search, setSearch] = useState(\"\");\n const [openDrawer, setOpenDrawer] = useState(false);\n const [editCF, setEditCF] = useState<CustomField | undefined>();\n\n const title = entity_type === 'company' ? 'Account' : 'Contact';\n const subtitle = entity_type === 'company' ? 'accounts' : 'contacts';\n const entityName = getEntityName(entity_type);\n\n const { data: customFields, isLoading: isLoadingCustomFields,isFetching: isFetchingCustomFields, refetch: refetchCustomFields, updateData } = useCFList({ entity_type });\n const { data: crmConfigData } = useCrmConfigs();\n\n const configs = crmConfigData?.data;\n const connectorEnabledId = useMemo(() => { \n if (!Array.isArray(configs) || !configs.length ) return undefined;\n const config = configs.find(config => entity_type === ENTITY_TYPES.COMPANY ? config.company_sync_enabled : config.contact_sync_enabled);\n return config?.ci_connector_id;\n }, [ configs, entity_type ]) \n\n const onToggleSuccess = (customField: CustomField) => {\n updateData(customField);\n refetchCustomFields();\n }\n\n const { mutate: toggleCFVisibility, isPending: isToggling, toggleFields } = useCFVisibility({\n onSuccess: onToggleSuccess\n });\n\n const isToggleLoading = isToggling || isFetchingCustomFields;\n\n const ciEnabled = useFeature(FEATURES.CUSTOMER_INTELLIGENCE_ENABLED);\n\n const filteredRows = useMemo(() => {\n const query = search.trim().toLowerCase();\n const defaultColumns = ENTITY_DEFAULT_COLUMNS[entity_type];\n const defaultData = defaultColumns.map(column => ({\n cf_id: column.id,\n display_name: column.label!,\n type: column.type!,\n description: column.description!,\n status: 1,\n _no_actions: true,\n _crmLocked: column._crmLocked,\n visibility: ['customer_panel']\n }));\n\n const sentimentRow =\n ciEnabled && entity_type === ENTITY_TYPES.COMPANY\n ? [{\n cf_id: 'account_sentiment',\n display_name: 'Account Sentiment',\n type: CF_TYPES.TEXT,\n description: '---',\n status: 1,\n _no_actions: true,\n visibility: ['customer_panel'],\n }]\n : [];\n\n const allData = [...defaultData, ...sentimentRow, ...(customFields ?? [])];\n if (!query) return allData;\n\n return allData.filter((row) =>\n [row.display_name, row.type, row.description].some((value) =>\n value?.toLowerCase().includes(query)\n )\n );\n }, [search, customFields, entity_type, ciEnabled]);\n\n const tableRows = useMemo(\n () =>\n {\n return (\n filteredRows.map((row) => ({\n id: row.cf_id,\n fieldNameDisplay: (\n <TruncatedText text={row.display_name} className=\"cm:text-[#334155] cm:font-normal\" />\n ),\n typeDisplay: (\n <TypeCell type={row.type} />\n ),\n descriptionDisplay: (\n <TruncatedText text={row.description} className=\"cm:text-[#334155] cm:font-normal\" />\n ),\n dataSourceDisplay: <DataSourceCell connectorId={isLockedField(row) ? connectorEnabledId: isCustomField(row) ? row.connector_id : undefined} />,\n showInHiverPanelDisplay: <VisibilityCell disabled={isToggleLoading && !!toggleFields[row.cf_id] || !isCustomField(row)} checked={!!row.visibility?.includes(\"customer_panel\")} onClick={() => {\n if(isCustomField(row)) {\n toggleCFVisibility({ customField: row })\n }\n }} />,\n actionsDisplay: (\n isCustomField(row) ? (\n <ActionsCell onClick={() => {\n setEditCF(row)\n setOpenDrawer(true)\n }} />\n ) : null\n ),\n }))\n )\n },\n [filteredRows, toggleCFVisibility, isToggleLoading, toggleFields, connectorEnabledId]\n );\n\n const columns = useMemo(\n () => [\n {\n id: \"field-name\",\n field: \"fieldNameDisplay\",\n label: \"Field name\",\n style: { width: \"18%\" },\n },\n {\n id: \"type\",\n field: \"typeDisplay\",\n label: \"Type\",\n style: { width: \"10%\" },\n },\n {\n id: \"description\",\n field: \"descriptionDisplay\",\n label: \"Description\",\n style: { width: \"28%\" },\n },\n {\n id: \"data-source\",\n field: \"dataSourceDisplay\",\n label: \"Data source\",\n style: { width: \"16%\" },\n },\n {\n id: \"show-in-hiver-panel\",\n field: \"showInHiverPanelDisplay\",\n label: \"Show in conversations\",\n style: { width: \"18%\" },\n className: \"cf-col-visibility\",\n },\n {\n id: \"actions\",\n field: \"actionsDisplay\",\n label: \" \",\n style: { width: \"10%\" },\n }\n ],\n []\n );\n\n const dataTableKey = useMemo(() => {\n if(!isToggleLoading) return 'loaded';\n return Object.keys(toggleFields).join(',');\n }, [isToggleLoading, toggleFields]);\n\n const onCloseDrawer = () => {\n setOpenDrawer(false)\n setEditCF(undefined)\n }\n\n const onSubmitSuccess = () => {\n onCloseDrawer()\n refetchCustomFields()\n }\n\n const rowClassName = (row: typeof tableRows[0]) => {\n const commonClasses = 'cm:[&:hover_.cell-actions]:opacity-100! cm:hover:bg-[#f1f5f9]! cm:last:border-b-0! cm:last:[&>td]:border-b-0!';\n if(!!toggleFields[row.id] && isToggling) {\n return cn(`\n cm:bg-[#F1F5F9]\n cm:animate-pulse cm:bg-slate-300\n cm:[--tw-animate-pulse-opacity:0.2]\n cm:opacity-50\n cm:dark:bg-slate-700\n cm:[animation-duration:0.8s]\n cm:cursor-not-allowed\n `, commonClasses)\n }\n return commonClasses;\n }\n\n if(isLoadingCustomFields) {\n return (\n <div className=\"cm:flex cm:items-center cm:justify-center cm:w-full cm:h-full\">\n <Loader />\n </div>\n );\n }\n\n return (\n <>\n {/*\n PRIMEREACT SELECTORS ONLY BELOW. The hui rules that merge this header into\n the table, and centre the visibility column, live in\n src/theme/design-system.hui.css under \"10. Custom fields listing\".\n\n They are split because this block is first-party source shared by BOTH\n entry points, so every byte of it ships into prime's artifact as a string\n literal — MUI selectors included, for markup prime never renders. The hui\n stylesheet is aliased in for UI_FRAMEWORK=hui only.\n */}\n <style>{`\n .cm-root .custom-fields-table .omni-datatable{\n flex-basis: 0;\n flex-grow: 1;\n min-height: 0;\n margin-bottom: 30px;\n }\n .cm-root .custom-fields-table .omni-datatable .p-datatable-wrapper{\n height: max-content;\n max-height: 100%;\n }\n .cm-root .custom-fields-table .omni-datatable .p-datatable-tbody > tr > td {\n border-bottom: 1px solid var(--cm-color-slate-border-light) !important;\n height: 40px;\n padding-top: 10px !important;\n padding-bottom: 10px !important;\n }\n .cm-root .custom-fields-table tr.cm\\\\:cursor-not-allowed {\n cursor: not-allowed !important;\n }\n `}</style>\n {/*\n HiG (Figma node 1-7475) composes this screen as a SINGLE card: the title\n sits on the left of a header row with the search field and a primary\n \"Add …\" button on the right, and the table merges into the same outline\n directly beneath it. Omni keeps the stacked title / subtitle / divider /\n search-left layout it has always had — the two are far enough apart to\n fork rather than converge, and `IS_HUI` is a build-time constant so each\n artifact keeps only its own branch.\n\n The Figma drops the \"Create and manage …\" subtitle, which is why it\n appears in the prime branch only.\n */}\n {IS_HUI ? (\n <div className=\"cf-card cm:w-full cm:h-full cm:flex cm:flex-col cm:min-h-0\">\n {/*\n * The SAME toolbar the listings use, and for the same reason: the\n * custom-fields frame (`1:7475`) reuses the design system's\n * `Table header` component verbatim — 1136 x 72 with its 32px\n * content row at y=20, a 240px search and a 32px button 12px after\n * it. The hand-rolled version here was 56px tall on `px-5 py-3`,\n * with its own `h-8 px-3.5 bg-[#246fea]` button restating the royal\n * fill as a literal.\n */}\n <Toolbar\n className=\"cm-listing-toolbar cm-cf-toolbar\"\n title={`${title} fields`}\n actions={\n <div className=\"cm-toolbar-actions\">\n <SearchInput\n value={search}\n onChange={setSearch}\n ariaLabel={`Search ${entityName} fields`}\n />\n <Button\n variant=\"contained\"\n size=\"small\"\n className=\"cm-cf-add-action\"\n onClick={() => setOpenDrawer(true)}\n icon={<PlusGlyph width={16} height={16} aria-hidden=\"true\" />}\n label={`Add ${entityName} field`}\n />\n </div>\n }\n />\n\n {/*\n * A search that matches nothing gets the listings' \"No … found\"\n * empty state rather than a bare header row. Rows are never empty\n * without a search — the default columns are always listed.\n */}\n {tableRows.length ? (\n <div className=\"cm:flex cm:flex-col cm:flex-1 cm:min-h-0 custom-fields-table\">\n <DataTable\n scrollable\n value={tableRows}\n columns={columns}\n loading={false}\n rowClassName={rowClassName}\n key={dataTableKey} // force re-render when toggling\n />\n </div>\n ) : (\n <div className=\"cm-cf-empty cm:flex cm:flex-col cm:flex-1\">\n <EmptyState\n title={`No ${entityName} fields found`}\n iconContent={CDN_ASSETS.hiverBee2}\n />\n </div>\n )}\n </div>\n ) : (\n <div className=\"cm:px-12 cm:py-9 cm:w-full cm:h-full cm:flex cm:flex-col cm:min-h-0\">\n <div className=\"cm:flex cm:items-start cm:justify-between cm:gap-4 cm:pt-2\">\n <div className=\"cm:flex cm:flex-col cm:gap-1\">\n <h1 className=\"cm:text-[20px] cm:leading-8 cm:font-normal cm:text-slate-text-title\">\n {title} fields\n </h1>\n <p className=\"cm:text-sm cm:leading-5 cm:text-slate-text-subtle\">\n Create and manage {subtitle} fields\n </p>\n </div>\n </div>\n\n <div style={{ height: '1px', background: 'var(--cm-color-slate-surface-subtle-150)', width: '100%', margin: '20px 0 0' }}></div>\n <div className=\"cm:mt-6 cm:mb-4 cm:flex cm:items-center\">\n <TextField\n placeholder={`Search ${subtitle} fields`}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n icon={searchIcon}\n iconPosition=\"left\"\n height={32}\n className=\"w-[300px] cm:w-[300px] cm:flex-grow-0 cm:[&_input]:border-[1.2px] cm:[&_input]:py-1 cm:[&_input]:h-8! cm:[&_input]:min-h-8!\"\n />\n <button\n type=\"button\"\n className=\"cm-secondary-action cm:h-[32px] cm:px-3.5 cm:border cm:border-slate-border-light cm:rounded-lg cm:bg-white cm:text-slate-text-body cm:text-sm cm:font-medium cm:flex cm:items-center cm:gap-2 cm:ml-auto cm:cursor-pointer\"\n onClick={() => setOpenDrawer(true)}\n >\n <PlusIcon />\n Add {entityName} field\n </button>\n </div>\n\n <div className=\"cm:flex cm:flex-col cm:flex-1 cm:min-h-0 custom-fields-table\">\n <DataTable\n scrollable\n value={tableRows}\n columns={columns}\n loading={false}\n rowClassName={rowClassName}\n key={dataTableKey} // force re-render when toggling\n />\n </div>\n </div>\n )}\n <CreateEditCF\n open={openDrawer}\n onClose={onCloseDrawer}\n onSuccess={onSubmitSuccess}\n entityType={entity_type}\n customField={editCF}\n />\n </>\n );\n};\n","import { useNavigate, useParams } from 'react-router-dom';\nimport { type BreadcrumbItem } from 'hiver-ui-kit-extended';\nimport { Breadcrumb } from '@/components/Breadcrumb';\nimport { CustomFieldsListing } from '@/features/custom-fields';\nimport SideNav from '@/components/SideNav';\nimport Icon from '@/components/Icon';\nimport { IS_HUI } from '@/constants/uiFramework';\nimport { ENTITY_TYPES } from '@/constants/custom-fields';\nimport { ROUTES } from '@/constants/routes';\n\nimport type { ENTITY_TYPE } from '@/types/custom-fields';\n\nexport const CustomFields = () => {\n const { entityType } = useParams();\n const navigate = useNavigate();\n\n const title = entityType === ENTITY_TYPES.COMPANY ? 'Accounts' : 'Contacts';\n const navigatePath = entityType === ENTITY_TYPES.COMPANY ? ROUTES.ACCOUNTS : ROUTES.CONTACTS;\n const icon = entityType === ENTITY_TYPES.COMPANY ? 'accounts' : 'contacts';\n const entityName = entityType === ENTITY_TYPES.COMPANY ? 'account' : 'contact';\n\n // hui hands v2 `Breadcrumbs` a plain label + icon + command, so the crumb gets\n // the design system's type and colours; primereact keeps its `template`s.\n const breadcrumbItems = IS_HUI ? [\n {\n label: title,\n icon: <Icon name={icon} size={14} color=\"currentColor\" />,\n command: () => navigate(navigatePath),\n },\n { label: `Manage ${entityName} fields` },\n ] as unknown as BreadcrumbItem[] : [\n {\n template: () => (\n <button\n type=\"button\"\n onClick={() => navigate(navigatePath)}\n className=\"cm:flex cm:items-center cm:gap-1.5 cm:bg-transparent cm:border-0 cm:p-0 cm:cursor-pointer cm:text-slate-text-subtle hover:cm:text-slate-text-title\"\n >\n <Icon name={icon} size={14} color=\"currentColor\" />\n <span className=\"cm:text-sm\">{title}</span>\n </button>\n ),\n },\n { template: () => <span className=\"cm:text-sm cm:text-slate-text-title\">Manage {entityName} fields</span> },\n ] as unknown as BreadcrumbItem[];\n\n // Figma 1-7342 draws no rule and no panel fill under the crumbs on hui — they\n // sit on the page canvas above the fields card (`.cf-breadcrumb-bar`).\n const page = (\n <div className=\"cf-page-wrapper cm-page-canvas cm:flex cm:flex-col cm:h-full cm:min-h-0 cm:flex-1 cm:min-w-0 cm:bg-slate-surface-canvas\">\n <div className={IS_HUI\n ? \"cf-breadcrumb-bar cm:shrink-0\"\n : \"cm:px-8 cm:py-3 cm:shrink-0 cm:border-b cm:border-slate-border-light cm:bg-slate-surface-panel cm:border-slate-border-light\"}>\n <Breadcrumb items={breadcrumbItems} />\n </div>\n <div className=\"cm:flex-1 cm:min-h-0 cm:px-8 cm:py-6 cm:overflow-hidden\">\n <div className=\"cf-page-card cm:h-full cm:bg-white cm:border cm:border-slate-border-light cm:rounded-xl cm:overflow-hidden cm:flex cm:flex-col\">\n <CustomFieldsListing entity_type={entityType as ENTITY_TYPE} />\n </div>\n </div>\n </div>\n );\n\n return (\n <>\n <style>{`\n .cf-page-wrapper .cm-root .p-breadcrumb,\n .cf-page-wrapper .p-breadcrumb {\n background: transparent !important;\n padding: 0 !important;\n border: 0 !important;\n }\n .cf-page-wrapper .p-breadcrumb .p-breadcrumb-list li.p-menuitem-separator {\n margin: 0 !important;\n }\n `}</style>\n {/*\n D-01 / Figma node 1-7475: the rail is the only navigation affordance\n in the hui build, and it is present on this screen too — without it\n there was no way to move between Account and Contact fields, or back\n to a listing, except the breadcrumb. It is a sibling of the page\n rather than part of `CustomersLayout` on purpose: this route is\n outside that layout, and the Figma shows no module header here.\n\n This route does NOT go inside `CustomersLayout`, which would bring\n the \"Customers\" + search header with it.\n */}\n {/*\n PRIME GETS NO WRAPPER AT ALL — that is the point of the ternary\n rather than a conditional className.\n\n This was `<div className={IS_HUI ? '…' : undefined}>`, which left\n prime with a plain block `<div>` between `#root` and\n `cf-page-wrapper`. A block div takes its height from its content, so\n `cf-page-wrapper`'s `h-full` stopped resolving against the 834px root\n and the whole column collapsed: measured in `dev:prime`, the wrapper\n came out 378px, `.p-datatable-wrapper` 2px, around a 583px table with\n all 11 of its rows in it. Omni's fields screen showed a card with a\n header, a search box and no table.\n\n Returning `page` bare on prime restores the exact element chain it\n had before the rail existed. `display: contents` on the wrapper also\n works, but it costs prime's stylesheet a rule it otherwise has no\n user for (+40 bytes, measured) and HANDOVER §4 holds that artifact\n to byte-identical CSS.\n */}\n {IS_HUI ? (\n <div className=\"cm:flex cm:h-full cm:min-h-0\">\n <SideNav />\n {page}\n </div>\n ) : (\n page\n )}\n </>\n );\n};\n\nexport default CustomFields;\n","import { useEffect } from 'react';\nimport { Routes, Route, Navigate } from 'react-router-dom';\nimport { useRenderConfigStore } from './stores/renderConfig';\nimport CustomersLayout from './components/CustomersLayout';\nimport Accounts from './pages/Accounts';\nimport Contacts from './pages/Contacts';\nimport AccountDetail from './pages/AccountDetail';\nimport ContactDetail from './pages/ContactDetail';\nimport Conversation from './components/ContactConversation/Converation';\nimport CustomFields from './pages/CustomFields';\nimport { GlobalMount } from './components/Mount';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { ThemeProvider } from 'hiver-ui-kit-extended';\nimport { ROUTES } from './constants/routes';\nimport './App.css';\n\n\nconst queryClient = new QueryClient()\n\nfunction App() {\n const theme = useRenderConfigStore((state) => state.theme);\n const rootElement = useRenderConfigStore((state) => state.meta.rootElement);\n\n // Keep the main root's dark scope class in sync so the host can switch\n // light<->dark at runtime without remounting the module.\n useEffect(() => {\n rootElement?.classList.toggle('cm-dark', theme === 'dark');\n }, [theme, rootElement]);\n\n /**\n * `ThemeProvider` is the toolkit's BUILD-RESOLVED provider, not a per-framework\n * symbol: `hiver-ui-kit-extended` exports the name from both entry points and\n * the `hui` / `primereact` export condition decides the implementation. That is\n * what keeps this import legal in shared source — the `IS_HUI ? A : B` pattern\n * `Icon/glyphs.tsx` uses cannot express it, because a static import of a name\n * the resolved entry does not export is a build ERROR, not a dead branch.\n *\n * On hui it mounts the kit's v2-enabled MUI theme, which the toolkit's v2\n * components REQUIRE — outside one they throw rather than render unstyled. On\n * prime it is a documented pass-through that renders `children` and nothing\n * else, so Omni's element tree is unchanged.\n *\n * `mode` is the module's own light/dark state, so the whole v2 token set\n * follows the host's theme switch without the stylesheet restating a single\n * colour.\n */\n return (\n <ThemeProvider mode={theme === 'dark' ? 'dark' : 'light'}>\n <QueryClientProvider client={queryClient}>\n <Routes>\n <Route path=\"/conversation\" element={<Conversation />} />\n <Route element={<CustomersLayout />}>\n <Route path=\"/\" element={<Navigate to={ROUTES.ACCOUNTS} />} />\n <Route path={ROUTES.ACCOUNTS} element={<Accounts />} />\n <Route path={ROUTES.CONTACTS} element={<Contacts />} />\n {/* Details Pages */}\n <Route path=\"/accounts/:accountId\" element={<AccountDetail />} />\n <Route path=\"/accounts/:accountId/contacts/:contactId\" element={<ContactDetail />} />\n <Route path=\"/contacts/:contactId\" element={<ContactDetail />} />\n </Route>\n <Route path={ROUTES.CUSTOM_FIELDS} element={<CustomFields />} />\n </Routes>\n <GlobalMount />\n </QueryClientProvider>\n </ThemeProvider>\n );\n}\n\nexport default App;\n","import type { MethodType } from '@/types/callbacks';\n\nexport const API_METHODS: Record<MethodType, string> = {\n GET: 'GET',\n POST: 'POST',\n PUT: 'PUT',\n DELETE: 'DELETE',\n PATCH: 'PATCH',\n};","export { default as RightPanel } from './components/RightPanel';\nexport { default as ConversationList } from './components/ConversationList';\nexport type { ConversationListProps, ConversationListEntityType } from './components/ConversationList';\nexport { default as CustomerIntelligencePanel } from './features/account-insights/components/CustomerIntelligencePanel';\nexport type { CustomerIntelligencePanelProps } from './features/account-insights/components/CustomerIntelligencePanel';\nexport type { ContactInfo, Conversation as ContactConversation } from './components/RightPanel/ContactPanel';\nexport type { AccountInfo, Conversation as AccountConversation } from './components/RightPanel/AccountPanel';\nexport type {\n InsightsDetailedResponse,\n DetailedInsights,\n AccountHealth,\n HealthContributor,\n HealthFactor,\n InsightBand,\n HealthFeedback,\n FeedbackReasonCode,\n} from './types/insights';\n\n// Export types\nexport type { RenderConfig, CustomerModuleCallbacks, CustomerModuleConfig } from './types';\n\n// Export render function for the full application\nimport { StrictMode } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport { MemoryRouter } from 'react-router-dom';\nimport App from './App';\nimport './index.css';\nimport '@theme/design-system.css';\nimport { useRenderConfigStore } from './stores/renderConfig';\nimport type { RenderConfig } from './types';\nexport { API_METHODS } from './constants/api';\nexport { FEATURES } from './constants/features';\nexport { ENTITY_TYPES } from './constants/custom-fields';\n\nexport interface RenderOptions {\n rootElement?: HTMLElement | string;\n initialEntries?: string[];\n config?: RenderConfig;\n}\n\n// Live React root per container element. WeakMap so detached containers (and\n// their entries) can be garbage-collected.\nconst activeRoots = new WeakMap<HTMLElement, Root>();\n\nexport * as contactsServices from './services/contacts';\nexport * as searchServices from './services/search';\n\n/**\n * Sets the configuration for the Customer Module without rendering\n * @param config - Configuration options including callbacks and config\n */\nexport function setCustomerModuleConfig(config: RenderConfig): void {\n // Initialize callbacks in the store if provided\n if (config?.callbacks) {\n useRenderConfigStore.getState().setCallbacks(config.callbacks);\n }\n\n // Initialize config in the store if provided\n if (config?.config) {\n useRenderConfigStore.getState().setConfig(config.config);\n }\n\n if(config?.features){\n useRenderConfigStore.getState().setFeatures(config.features);\n }\n\n if(Object.prototype.hasOwnProperty.call(config, 'showEditPrimaryContact')) {\n useRenderConfigStore.getState().setShowEditPrimaryContact(config.showEditPrimaryContact as boolean);\n }\n\n if(Object.prototype.hasOwnProperty.call(config, 'isComposeEnabled')) {\n useRenderConfigStore.getState().setIsComposeEnabled(config.isComposeEnabled as boolean);\n }\n}\n\n/**\n * Ref object for controlling the Customer Module instance\n */\nexport interface CustomerModuleRef {\n /**\n * Unmounts the Customer Module application\n */\n unmount: () => void;\n}\n\n/**\n * Renders the full Customer Module application\n * @param options - Configuration options for rendering\n * @returns A ref object with an unmount method to unmount the application\n */\nexport function renderCustomerModule(options: RenderOptions = {}): CustomerModuleRef {\n const {\n rootElement,\n initialEntries,\n config,\n } = options;\n\n // Initialize callbacks in the store if provided\n if (config?.callbacks) {\n useRenderConfigStore.getState().setCallbacks(config.callbacks);\n }\n\n // Initialize config in the store if provided\n if (config?.config) {\n useRenderConfigStore.getState().setConfig(config.config);\n }\n\n if(config?.features){\n useRenderConfigStore.getState().setFeatures(config.features);\n }\n\n if(Object.prototype.hasOwnProperty.call(config, 'showEditPrimaryContact')) {\n useRenderConfigStore.getState().setShowEditPrimaryContact(config?.showEditPrimaryContact as boolean);\n }\n\n if(Object.prototype.hasOwnProperty.call(config, 'isComposeEnabled')) {\n useRenderConfigStore.getState().setIsComposeEnabled(config?.isComposeEnabled as boolean);\n }\n\n // Get the root element\n let rootEl: HTMLElement;\n if (typeof rootElement === 'string') {\n const element = document.querySelector(rootElement);\n if (!element) {\n throw new Error(`Element with selector \"${rootElement}\" not found`);\n }\n rootEl = element as HTMLElement;\n } else if (rootElement) {\n rootEl = rootElement;\n } else {\n const defaultEl = document.getElementById('root');\n if (!defaultEl) {\n throw new Error('No root element found. Please provide a rootElement option or ensure an element with id=\"root\" exists.');\n }\n rootEl = defaultEl;\n }\n\n // Add a stable scope class so our exported CSS can be safely namespaced\n rootEl.classList.add('cm-root');\n\n // Apply the dark scope class up-front (before first paint) to avoid a\n // light->dark flash. Runtime theme changes are handled by the App effect.\n rootEl.classList.toggle('cm-dark', useRenderConfigStore.getState().theme === 'dark');\n\n useRenderConfigStore.getState().setMeta({ rootElement: rootEl });\n\n // A second createRoot on the same element takes over the DOM but leaves the\n // first tree mounted forever — a ghost that keeps reacting to the shared\n // stores (duplicate modals/fetches). Unmount any live root for this element\n // before creating a new one.\n const existing = activeRoots.get(rootEl);\n if (existing) {\n existing.unmount();\n activeRoots.delete(rootEl);\n }\n\n // Create React root\n const root: Root = createRoot(rootEl);\n activeRoots.set(rootEl, root);\n\n // Render the app with MemoryRouter\n root.render(\n <StrictMode>\n <MemoryRouter initialEntries={initialEntries}>\n <App />\n </MemoryRouter>\n </StrictMode>\n );\n\n // Return ref object with unmount method\n let unmounted = false;\n return {\n unmount: () => {\n // Idempotent — the host and the registry may both try to clean up.\n if (unmounted) return;\n unmounted = true;\n if (activeRoots.get(rootEl) === root) {\n activeRoots.delete(rootEl);\n }\n root.unmount();\n },\n };\n}\n\n","export default \"<svg width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M28 28H4M8 14.6667L16 22.6667L24 14.6667M16 22.6667V4\\\" stroke=\\\"#334155\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M6.66667 5.66816C6.78413 5.33424 7.016 5.05267 7.32113 4.87332C7.62633 4.69397 7.98513 4.6284 8.334 4.68825C8.68287 4.74809 8.99933 4.92947 9.22727 5.20027C9.45527 5.47107 9.58 5.81381 9.57947 6.16779C9.57947 7.16707 8.0806 7.66667 8.0806 7.66667M8.09993 9.66667H8.1066M6.6 12.8L7.57333 14.0978C7.71807 14.2908 7.79047 14.3873 7.8792 14.4218C7.95687 14.452 8.04313 14.452 8.1208 14.4218C8.20953 14.3873 8.28193 14.2908 8.42667 14.0978L9.4 12.8C9.5954 12.5394 9.69313 12.4091 9.81233 12.3097C9.97127 12.1771 10.1589 12.0832 10.3603 12.0357C10.5114 12 10.6743 12 11 12C11.9319 12 12.3978 12 12.7654 11.8477C13.2554 11.6448 13.6448 11.2554 13.8477 10.7654C14 10.3978 14 9.93187 14 9V5.2C14 4.07989 14 3.51984 13.782 3.09202C13.5903 2.71569 13.2843 2.40973 12.908 2.21799C12.4801 2 11.9201 2 10.8 2H5.2C4.07989 2 3.51984 2 3.09202 2.21799C2.71569 2.40973 2.40973 2.71569 2.21799 3.09202C2 3.51984 2 4.07989 2 5.2V9C2 9.93187 2 10.3978 2.15224 10.7654C2.35523 11.2554 2.74458 11.6448 3.23463 11.8477C3.60217 12 4.06812 12 5 12C5.32572 12 5.48858 12 5.63967 12.0357C5.84113 12.0832 6.02875 12.1771 6.18767 12.3097C6.30685 12.4091 6.40457 12.5394 6.6 12.8Z\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g clip-path=\\\"url(#clip0_6528_8345)\\\">\\n<path d=\\\"M5.33331 9.33203C5.33331 9.33203 6.33331 10.6654 7.99998 10.6654C9.66665 10.6654 10.6666 9.33203 10.6666 9.33203M9.99998 5.9987H10.0066M5.99998 5.9987H6.00665M14.6666 7.9987C14.6666 11.6806 11.6818 14.6654 7.99998 14.6654C4.31808 14.6654 1.33331 11.6806 1.33331 7.9987C1.33331 4.3168 4.31808 1.33203 7.99998 1.33203C11.6818 1.33203 14.6666 4.3168 14.6666 7.9987ZM10.3333 5.9987C10.3333 6.18279 10.184 6.33203 9.99998 6.33203C9.81591 6.33203 9.66665 6.18279 9.66665 5.9987C9.66665 5.8146 9.81591 5.66536 9.99998 5.66536C10.184 5.66536 10.3333 5.8146 10.3333 5.9987ZM6.33331 5.9987C6.33331 6.18279 6.18407 6.33203 5.99998 6.33203C5.81589 6.33203 5.66665 6.18279 5.66665 5.9987C5.66665 5.8146 5.81589 5.66536 5.99998 5.66536C6.18407 5.66536 6.33331 5.8146 6.33331 5.9987Z\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</g>\\n<defs>\\n<clipPath id=\\\"clip0_6528_8345\\\">\\n<rect width=\\\"16\\\" height=\\\"16\\\" fill=\\\"white\\\"/>\\n</clipPath>\\n</defs>\\n</svg>\\n\"","export default \"<svg width=\\\"13\\\" height=\\\"12\\\" viewBox=\\\"0 0 13 12\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M4.15002 11.1504V2.98372C4.15002 2.44124 4.15002 2.17 4.20965 1.94746C4.37147 1.34355 4.84318 0.871836 5.44707 0.710019C5.66961 0.650391 5.94086 0.650391 6.48336 0.650391C7.02586 0.650391 7.29711 0.650391 7.51965 0.710019C8.12352 0.871836 8.59526 1.34355 8.75708 1.94746C8.81669 2.17 8.81669 2.44124 8.81669 2.98372V11.1504M2.51669 11.1504H10.45C11.1034 11.1504 11.4301 11.1504 11.6797 11.0232C11.8992 10.9114 12.0777 10.7329 12.1895 10.5134C12.3167 10.2638 12.3167 9.93711 12.3167 9.28372V4.85039C12.3167 4.19699 12.3167 3.8703 12.1895 3.62074C12.0777 3.40121 11.8992 3.22273 11.6797 3.11088C11.4301 2.98372 11.1034 2.98372 10.45 2.98372H2.51669C1.86329 2.98372 1.5366 2.98372 1.28704 3.11088C1.06751 3.22273 0.889034 3.40121 0.777185 3.62074C0.650024 3.8703 0.650024 4.19699 0.650024 4.85039V9.28372C0.650024 9.93711 0.650024 10.2638 0.777185 10.5134C0.889034 10.7329 1.06751 10.9114 1.28704 11.0232C1.5366 11.1504 1.8633 11.1504 2.51669 11.1504Z\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"13\\\" height=\\\"12\\\" viewBox=\\\"0 0 13 12\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M12.2174 5.8H9.88412L8.13412 11.05L4.63411 0.550003L2.88411 5.8H0.550781\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g clip-path=\\\"url(#clip0_798_33316)\\\">\\n<path d=\\\"M9.3333 4.66761V7.58428C9.3333 8.04838 9.51769 8.49352 9.84588 8.8217C10.1741 9.14989 10.6191 9.33428 11.0833 9.33428C11.5474 9.33428 11.9925 9.14989 12.3207 8.8217C12.6489 8.49352 12.8333 8.04838 12.8333 7.58428V7.00095C12.8332 5.68437 12.3878 4.40655 11.5694 3.37525C10.751 2.34395 9.60776 1.61982 8.32565 1.32061C7.04354 1.02141 5.69793 1.16471 4.50758 1.72724C3.31725 2.28976 2.3522 3.23842 1.76936 4.41894C1.18653 5.59948 1.0202 6.94244 1.2974 8.2295C1.5746 9.51657 2.27903 10.672 3.29616 11.508C4.3133 12.3439 5.5833 12.8111 6.89969 12.8338C8.21604 12.8564 9.50136 12.4331 10.5466 11.6326M9.3333 7.00095C9.3333 8.28959 8.28861 9.33428 6.99997 9.33428C5.7113 9.33428 4.66664 8.28959 4.66664 7.00095C4.66664 5.71227 5.7113 4.66761 6.99997 4.66761C8.28861 4.66761 9.3333 5.71227 9.3333 7.00095Z\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</g>\\n<defs>\\n<clipPath id=\\\"clip0_798_33316\\\">\\n<rect width=\\\"14\\\" height=\\\"14\\\" fill=\\\"white\\\"/>\\n</clipPath>\\n</defs>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"15\\\" height=\\\"14\\\" viewBox=\\\"0 0 15 14\\\" fill=\\\"none\\\">\\n <path d=\\\"M4.31657 5.98372H2.38324C2.00987 5.98372 1.82318 5.98372 1.68058 6.05639C1.55514 6.12032 1.45315 6.22226 1.38923 6.34772C1.31657 6.49032 1.31657 6.67699 1.31657 7.05039V12.6504M10.3166 5.98372H12.2499C12.6233 5.98372 12.81 5.98372 12.9526 6.05639C13.078 6.12032 13.18 6.22226 13.2439 6.34772C13.3166 6.49032 13.3166 6.67699 13.3166 7.05039V12.6504M10.3166 12.6504V2.78372C10.3166 2.03699 10.3166 1.66362 10.1712 1.3784C10.0434 1.12752 9.83944 0.923544 9.58857 0.795717C9.30337 0.650391 8.92997 0.650391 8.18324 0.650391H6.4499C5.70316 0.650391 5.3298 0.650391 5.04458 0.795717C4.7937 0.923544 4.58972 1.12752 4.4619 1.3784C4.31657 1.66362 4.31657 2.03699 4.31657 2.78372V12.6504M13.9832 12.6504H0.649902M6.6499 3.31706H7.98324M6.6499 5.98372H7.98324M6.6499 8.65039H7.98324\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\"","export default \"<svg width=\\\"12\\\" height=\\\"13\\\" viewBox=\\\"0 0 12 13\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M11.0498 5.21665H0.549805M8.13314 0.549988V2.88332M3.46647 0.549988V2.88332M3.3498 12.2167H8.2498C9.22992 12.2167 9.71992 12.2167 10.0943 12.0259C10.4236 11.8581 10.6913 11.5904 10.8591 11.2612C11.0498 10.8868 11.0498 10.3968 11.0498 9.41665V4.51665C11.0498 3.53656 11.0498 3.04651 10.8591 2.67217C10.6913 2.34289 10.4236 2.07517 10.0943 1.90739C9.71992 1.71665 9.22992 1.71665 8.2498 1.71665H3.3498C2.36971 1.71665 1.87966 1.71665 1.50532 1.90739C1.17604 2.07517 0.908321 2.34289 0.740543 2.67217C0.549805 3.04651 0.549805 3.53656 0.549805 4.51665V9.41665C0.549805 10.3968 0.549805 10.8868 0.740543 11.2612C0.908321 11.5904 1.17604 11.8581 1.50532 12.0259C1.87966 12.2167 2.36971 12.2167 3.3498 12.2167Z\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <rect x=\\\"2.25\\\" y=\\\"2.25\\\" width=\\\"11.5\\\" height=\\\"4.5\\\" rx=\\\"1.5\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.2\\\" />\\n <rect x=\\\"2.25\\\" y=\\\"9.25\\\" width=\\\"11.5\\\" height=\\\"4.5\\\" rx=\\\"1.5\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M4.25 4.5h0.5\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M6.25 4.5h5.5\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M4.25 11.5h0.5\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M6.25 11.5h5.5\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" />\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\">\\n <path d=\\\"M12.25 7C12.25 9.89952 9.89952 12.25 7 12.25C6.30169 12.25 5.63517 12.1137 5.0257 11.8661C4.90905 11.8187 4.85073 11.7951 4.80359 11.7845C4.75747 11.7742 4.72334 11.7704 4.67608 11.7704C4.62776 11.7704 4.57514 11.7791 4.46988 11.7967L2.39444 12.1426C2.17711 12.1788 2.06844 12.1969 1.98986 12.1632C1.92108 12.1337 1.86628 12.0789 1.83678 12.0101C1.80307 11.9316 1.82118 11.8229 1.85741 11.6055L2.20331 9.53015C2.22086 9.42486 2.22963 9.37224 2.22962 9.32394C2.22962 9.27663 2.22584 9.24251 2.2155 9.19642C2.20493 9.14929 2.18124 9.09096 2.13387 8.97429C1.88635 8.36482 1.75 7.69831 1.75 7C1.75 4.10051 4.10051 1.75 7 1.75C9.89952 1.75 12.25 4.10051 12.25 7Z\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M5.25 10.5L8.75 7L5.25 3.5\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" stroke=\\\"#091E42\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M8.75 3.5L5.25 7L8.75 10.5\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" stroke=\\\"#091E42\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M5.25 10.5L8.75 7L5.25 3.5\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<svg version=\\\"1.1\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"48\\\" height=\\\"48\\\" viewBox=\\\"0 0 48 48\\\">\\n<path d=\\\"M0 0 C4.93369898 0.39758746 7.54104759 2.87194769 10.875 6.25 C11.38546875 6.72824219 11.8959375 7.20648438 12.421875 7.69921875 C14.63575078 9.90711108 15.95811709 11.3137646 16.15234375 14.49609375 C14.59437311 17.88137912 12.32687887 20.25506821 9.6875 22.8125 C9.20087891 23.31458984 8.71425781 23.81667969 8.21289062 24.33398438 C5.18881813 27.32549619 4.43001812 28 0 28 C0.48713098 23.58489226 1.85053197 21.69553355 5.0625 18.6875 C5.79597656 17.99011719 6.52945312 17.29273437 7.28515625 16.57421875 C8.13400391 15.79498047 8.13400391 15.79498047 9 15 C7.24885128 10.96705143 4.68628398 8.6774795 1.4609375 5.78125 C0 4 0 4 0 0 Z \\\" fill=\\\"#94A3B7\\\" transform=\\\"translate(16,10)\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\">\\n <path d=\\\"M10.5 3.5L3.5 10.5M3.5 3.5L10.5 10.5\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\">\\n <path d=\\\"M10.5 3.5L3.5 10.5M3.5 3.5L10.5 10.5\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <rect x=\\\"2.25\\\" y=\\\"2.25\\\" width=\\\"11.5\\\" height=\\\"11.5\\\" rx=\\\"2.75\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M6.25 3.75v8.5M9.75 3.75v8.5\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" />\\n</svg>\\n\"","export default \"<svg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<rect width=\\\"20\\\" height=\\\"14\\\" x=\\\"2\\\" y=\\\"7\\\" rx=\\\"2\\\" ry=\\\"2\\\"/>\\n<path d=\\\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\\\"/>\\n</svg>\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g clip-path=\\\"url(#clip0_960_14978)\\\">\\n<path d=\\\"M6.41666 2.33314H3.96666C2.98656 2.33314 2.49652 2.33314 2.12217 2.52388C1.79289 2.69166 1.52517 2.95938 1.35739 3.28866C1.16666 3.663 1.16666 4.15305 1.16666 5.13314V10.0332C1.16666 11.0132 1.16666 11.5033 1.35739 11.8776C1.52517 12.2069 1.79289 12.4746 2.12217 12.6424C2.49652 12.8331 2.98656 12.8331 3.96666 12.8331H8.86666C9.84677 12.8331 10.3368 12.8331 10.7112 12.6424C11.0404 12.4746 11.3081 12.2069 11.4759 11.8776C11.6667 11.5033 11.6667 11.0132 11.6667 10.0332V7.58315M4.66664 9.33315H5.64346C5.92881 9.33315 6.0715 9.33315 6.20578 9.30089C6.32478 9.27231 6.43859 9.22518 6.54301 9.16124C6.66072 9.08908 6.76164 8.98817 6.96341 8.78639L12.5417 3.20814C13.0249 2.72489 13.0249 1.94139 12.5417 1.45814C12.0584 0.974894 11.2749 0.974888 10.7917 1.45814L5.21337 7.03639C5.0116 7.23817 4.91071 7.33908 4.83856 7.4568C4.7746 7.56122 4.72746 7.67497 4.69887 7.79403C4.66664 7.92831 4.66664 8.07099 4.66664 8.35636V9.33315Z\\\" stroke=\\\"#0C3E9D\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</g>\\n<defs>\\n<clipPath id=\\\"clip0_960_14978\\\">\\n<rect width=\\\"14\\\" height=\\\"14\\\" fill=\\\"white\\\"/>\\n</clipPath>\\n</defs>\\n</svg>\\n\"","export default \"<svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M13.3333 14C13.3333 13.0696 13.3333 12.6045 13.2185 12.2259C12.96 11.3737 12.293 10.7067 11.4407 10.4481C11.0622 10.3333 10.597 10.3333 9.66663 10.3333H6.33329C5.40292 10.3333 4.93773 10.3333 4.5592 10.4481C3.70693 10.7067 3.03999 11.3737 2.78145 12.2259C2.66663 12.6045 2.66663 13.0696 2.66663 14M11 5C11 6.65685 9.65683 8 7.99996 8C6.34311 8 4.99996 6.65685 4.99996 5C4.99996 3.34315 6.34311 2 7.99996 2C9.65683 2 11 3.34315 11 5Z\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M13.3333 14C13.3333 13.0696 13.3333 12.6045 13.2185 12.2259C12.96 11.3737 12.293 10.7067 11.4407 10.4481C11.0622 10.3333 10.597 10.3333 9.66663 10.3333H6.33329C5.40292 10.3333 4.93773 10.3333 4.5592 10.4481C3.70693 10.7067 3.03999 11.3737 2.78145 12.2259C2.66663 12.6045 2.66663 13.0696 2.66663 14M11 5C11 6.65685 9.65683 8 7.99996 8C6.34311 8 4.99996 6.65685 4.99996 5C4.99996 3.34315 6.34311 2 7.99996 2C9.65683 2 11 3.34315 11 5Z\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g clip-path=\\\"url(#clip0_1453_2142)\\\">\\n<path d=\\\"M12.25 7C12.25 9.89952 9.89952 12.25 7 12.25C6.30169 12.25 5.63517 12.1137 5.0257 11.8661C4.90905 11.8187 4.85073 11.7951 4.80359 11.7845C4.75747 11.7742 4.72334 11.7704 4.67608 11.7704C4.62776 11.7704 4.57514 11.7791 4.46988 11.7967L2.39444 12.1426C2.17711 12.1788 2.06844 12.1969 1.98986 12.1632C1.92108 12.1337 1.86628 12.0789 1.83678 12.0101C1.80307 11.9316 1.82118 11.8229 1.85741 11.6055L2.20331 9.53015C2.22086 9.42486 2.22963 9.37224 2.22962 9.32394C2.22962 9.27663 2.22584 9.24251 2.2155 9.19642C2.20493 9.14929 2.18124 9.09096 2.13387 8.97429C1.88635 8.36482 1.75 7.69831 1.75 7C1.75 4.10051 4.10051 1.75 7 1.75C9.89952 1.75 12.25 4.10051 12.25 7Z\\\" stroke=\\\"#475569\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</g>\\n<defs>\\n<clipPath id=\\\"clip0_1453_2142\\\">\\n<rect width=\\\"14\\\" height=\\\"14\\\" fill=\\\"white\\\"/>\\n</clipPath>\\n</defs>\\n</svg>\\n\"","export default \"<svg width=\\\"28\\\" height=\\\"36\\\" viewBox=\\\"0 0 28 36\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M0 4.48C0 2.00577 2.00576 0 4.48 0H16.8L22.4 5.6L28 11.2V31.36C28 33.8342 25.9942 35.84 23.52 35.84H4.48C2.00576 35.84 0 33.8342 0 31.36V4.48Z\\\" fill=\\\"#2F6E61\\\"/>\\n<path d=\\\"M8.95996 19.6002H19.04M8.95996 22.9602H19.04M14 16.2402V26.3202M11.648 16.2402H16.352C17.2929 16.2402 17.7633 16.2402 18.1227 16.4233C18.4388 16.5844 18.6958 16.8414 18.8568 17.1575C19.04 17.5169 19.04 17.9873 19.04 18.9282V23.6322C19.04 24.5731 19.04 25.0435 18.8568 25.403C18.6958 25.7191 18.4388 25.9761 18.1227 26.1371C17.7633 26.3202 17.2929 26.3202 16.352 26.3202H11.648C10.7071 26.3202 10.2366 26.3202 9.87726 26.1371C9.56114 25.9761 9.30414 25.7191 9.14307 25.403C8.95996 25.0435 8.95996 24.5731 8.95996 23.6322V18.9282C8.95996 17.9873 8.95996 17.5169 9.14307 17.1575C9.30414 16.8414 9.56114 16.5844 9.87726 16.4233C10.2366 16.2402 10.7071 16.2402 11.648 16.2402Z\\\" stroke=\\\"white\\\" stroke-width=\\\"1.12\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n<path d=\\\"M16.7998 8.96V0L27.9998 11.2H19.0398C17.8027 11.2 16.7998 10.1971 16.7998 8.96Z\\\" fill=\\\"#DDEFEB\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g clip-path=\\\"url(#clip0_786_30536)\\\">\\n<path d=\\\"M2.66672 14.5456C3.06844 14.6673 3.61103 14.6673 4.53337 14.6673H11.4667C12.389 14.6673 12.9316 14.6673 13.3334 14.5456M2.66672 14.5456C2.58059 14.5195 2.50093 14.4879 2.42539 14.4493C2.04907 14.2576 1.74311 13.9516 1.55136 13.5753C1.33337 13.1475 1.33337 12.5875 1.33337 11.4673V4.53398C1.33337 3.41388 1.33337 2.85382 1.55136 2.426C1.74311 2.04968 2.04907 1.74372 2.42539 1.55197C2.85321 1.33398 3.41327 1.33398 4.53337 1.33398H11.4667C12.5868 1.33398 13.1468 1.33398 13.5747 1.55197C13.951 1.74372 14.257 2.04968 14.4487 2.426C14.6667 2.85382 14.6667 3.41388 14.6667 4.53398V11.4673C14.6667 12.5875 14.6667 13.1475 14.4487 13.5753C14.257 13.9516 13.951 14.2576 13.5747 14.4493C13.4992 14.4879 13.4195 14.5195 13.3334 14.5456M2.66672 14.5456C2.66694 14.0061 2.67018 13.7206 2.71795 13.4804C2.92837 12.4226 3.75529 11.5957 4.81313 11.3853C5.07073 11.334 5.3805 11.334 6.00004 11.334H10C10.6196 11.334 10.9294 11.334 11.187 11.3853C12.2448 11.5957 13.0717 12.4226 13.2821 13.4804C13.3299 13.7206 13.3331 14.0061 13.3334 14.5456M10.6667 6.33398C10.6667 7.80672 9.47277 9.00065 8.00004 9.00065C6.52728 9.00065 5.33337 7.80672 5.33337 6.33398C5.33337 4.86122 6.52728 3.66732 8.00004 3.66732C9.47277 3.66732 10.6667 4.86122 10.6667 6.33398Z\\\" stroke=\\\"#0F172A\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</g>\\n<defs>\\n<clipPath id=\\\"clip0_786_30536\\\">\\n<rect width=\\\"16\\\" height=\\\"16\\\" fill=\\\"white\\\"/>\\n</clipPath>\\n</defs>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M8.16671 6.41602H4.66671M5.83337 8.74935H4.66671M9.33337 4.08268H4.66671M11.6667 3.96602V10.0327C11.6667 11.0128 11.6667 11.5028 11.476 11.8772C11.3082 12.2065 11.0405 12.4742 10.7112 12.6419C10.3368 12.8327 9.84682 12.8327 8.86671 12.8327H5.13337C4.15328 12.8327 3.66323 12.8327 3.28889 12.6419C2.95961 12.4742 2.69189 12.2065 2.52411 11.8772C2.33337 11.5028 2.33337 11.0128 2.33337 10.0327V3.96602C2.33337 2.98592 2.33337 2.49588 2.52411 2.12153C2.69189 1.79225 2.95961 1.52453 3.28889 1.35675C3.66323 1.16602 4.15328 1.16602 5.13337 1.16602H8.86671C9.84682 1.16602 10.3368 1.16602 10.7112 1.35675C11.0405 1.52453 11.3082 1.79225 11.476 2.12153C11.6667 2.49588 11.6667 2.98592 11.6667 3.96602Z\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\">\\n <g clip-path=\\\"url(#clip0_798_33686)\\\">\\n <path d=\\\"M1.16663 6.99935H12.8333M1.16663 6.99935C1.16663 10.221 3.7783 12.8327 6.99996 12.8327M1.16663 6.99935C1.16663 3.77769 3.7783 1.16602 6.99996 1.16602M12.8333 6.99935C12.8333 10.221 10.2216 12.8327 6.99996 12.8327M12.8333 6.99935C12.8333 3.77769 10.2216 1.16602 6.99996 1.16602M6.99996 12.8327C8.45905 11.2353 9.28826 9.16235 9.33329 6.99935C9.28826 4.83637 8.45905 2.76339 6.99996 1.16602M6.99996 12.8327C5.54088 11.2353 4.71169 9.16235 4.66663 6.99935C4.71169 4.83637 5.54088 2.76339 6.99996 1.16602\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n </g>\\n <defs>\\n <clipPath id=\\\"clip0_798_33686\\\">\\n <rect width=\\\"14\\\" height=\\\"14\\\" fill=\\\"white\\\"/>\\n </clipPath>\\n </defs>\\n</svg>\"","export default \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<svg version=\\\"1.1\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"60\\\" height=\\\"60\\\" viewBox=\\\"0 0 60 60\\\">\\n<path d=\\\"M0 0 C0.99 0.33 1.98 0.66 3 1 C3.495 15.355 3.495 15.355 4 30 C6.97 27.03 9.94 24.06 13 21 C14.32 20.67 15.64 20.34 17 20 C17.91796875 22.046875 17.91796875 22.046875 18 25 C16.11608783 27.76233457 13.7361895 29.96161932 11.3125 32.25 C10.3544043 33.20519531 10.3544043 33.20519531 9.37695312 34.1796875 C3.89977088 39.50393911 3.89977088 39.50393911 0 40 C-1.859375 38.84765625 -1.859375 38.84765625 -3.75 37.0625 C-4.43449219 36.41667969 -5.11898438 35.77085938 -5.82421875 35.10546875 C-6.54222656 34.41066406 -7.26023437 33.71585938 -8 33 C-8.76957031 32.31550781 -9.53914063 31.63101563 -10.33203125 30.92578125 C-11.06808594 30.24902344 -11.80414063 29.57226562 -12.5625 28.875 C-13.24441406 28.25367187 -13.92632813 27.63234375 -14.62890625 26.9921875 C-16 25 -16 25 -15.71484375 22.2578125 C-15.47894531 21.51273438 -15.24304687 20.76765625 -15 20 C-10.95838045 21.34484714 -8.61321846 23.0505162 -5.6875 26.125 C-4.99011719 26.84945313 -4.29273438 27.57390625 -3.57421875 28.3203125 C-3.05472656 28.87460937 -2.53523438 29.42890625 -2 30 C-1.97494385 29.12674072 -1.9498877 28.25348145 -1.92407227 27.35375977 C-1.82912291 24.12397448 -1.72987971 20.89435846 -1.62768555 17.66479492 C-1.58428566 16.26510801 -1.54261436 14.86536641 -1.50268555 13.46557617 C-1.44510555 11.45738505 -1.38086 9.44938851 -1.31640625 7.44140625 C-1.27974854 6.23170166 -1.24309082 5.02199707 -1.20532227 3.77563477 C-1 1 -1 1 0 0 Z \\\" fill=\\\"currentColor\\\" transform=\\\"translate(29,5)\\\"/>\\n<path d=\\\"M0 0 C0.85049423 0.00222061 1.70098846 0.00444122 2.57725525 0.00672913 C4.01863609 0.00684242 4.01863609 0.00684242 5.48913574 0.00695801 C7.05630592 0.01469994 7.05630592 0.01469994 8.65513611 0.02259827 C9.71913132 0.02401321 10.78312653 0.02542816 11.87936401 0.02688599 C15.29293069 0.03250388 18.70643286 0.04505941 22.11997986 0.05775452 C24.42792162 0.06276721 26.73586441 0.06733052 29.04380798 0.07142639 C34.71505412 0.08247912 40.38626238 0.09923465 46.05747986 0.12025452 C46.61997986 2.05775452 46.61997986 2.05775452 47.05747986 4.12025452 C46.05747986 5.12025452 46.05747986 5.12025452 44.11495972 5.24050903 C43.26446548 5.23828842 42.41397125 5.23606781 41.53770447 5.23377991 C40.09632362 5.23366661 40.09632362 5.23366661 38.62582397 5.23355103 C37.58104385 5.22838974 36.53626373 5.22322845 35.45982361 5.21791077 C34.3958284 5.21649582 33.33183319 5.21508087 32.2355957 5.21362305 C28.82202903 5.20800515 25.40852686 5.19544963 21.99497986 5.18275452 C19.68703809 5.17774182 17.37909531 5.17317852 15.07115173 5.16908264 C9.39990559 5.15802991 3.72869733 5.14127438 -1.94252014 5.12025452 C-2.50502014 3.18275452 -2.50502014 3.18275452 -2.94252014 1.12025452 C-1.94252014 0.12025452 -1.94252014 0.12025452 0 0 Z \\\" fill=\\\"currentColor\\\" transform=\\\"translate(7.9425201416015625,49.87974548339844)\\\"/>\\n</svg>\\n\"","export default \"<svg\\n width=\\\"14\\\"\\n height=\\\"16\\\"\\n viewBox=\\\"0 0 14 16\\\"\\n fill=\\\"none\\\"\\n className={className}\\n xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n aria-hidden=\\\"true\\\"\\n>\\n <circle cx=\\\"5\\\" cy=\\\"3\\\" r=\\\"1\\\" fill=\\\"currentColor\\\" />\\n <circle cx=\\\"9\\\" cy=\\\"3\\\" r=\\\"1\\\" fill=\\\"currentColor\\\" />\\n <circle cx=\\\"5\\\" cy=\\\"8\\\" r=\\\"1\\\" fill=\\\"currentColor\\\" />\\n <circle cx=\\\"9\\\" cy=\\\"8\\\" r=\\\"1\\\" fill=\\\"currentColor\\\" />\\n <circle cx=\\\"5\\\" cy=\\\"13\\\" r=\\\"1\\\" fill=\\\"currentColor\\\" />\\n <circle cx=\\\"9\\\" cy=\\\"13\\\" r=\\\"1\\\" fill=\\\"currentColor\\\" />\\n</svg>\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g clip-path=\\\"url(#clip0_960_6836)\\\">\\n<g clip-path=\\\"url(#clip1_960_6836)\\\">\\n<path d=\\\"M1.67773 10.5663C1.70453 10.3251 1.71793 10.2045 1.75442 10.0918C1.7868 9.99178 1.83254 9.89664 1.89041 9.80885C1.95564 9.70992 2.04144 9.62417 2.21305 9.45255L9.91672 1.74887C10.5611 1.10454 11.6057 1.10454 12.2501 1.74887C12.8944 2.39321 12.8944 3.43788 12.2501 4.08221L4.54638 11.7859C4.37477 11.9575 4.28897 12.0432 4.19006 12.1085C4.1023 12.1664 4.00713 12.2121 3.90712 12.2445C3.79439 12.281 3.67379 12.2944 3.43259 12.3212L1.45837 12.5405L1.67773 10.5663Z\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</g>\\n</g>\\n<defs>\\n<clipPath id=\\\"clip0_960_6836\\\">\\n<rect width=\\\"14\\\" height=\\\"14\\\" fill=\\\"white\\\"/>\\n</clipPath>\\n<clipPath id=\\\"clip1_960_6836\\\">\\n<rect width=\\\"14\\\" height=\\\"14\\\" fill=\\\"white\\\"/>\\n</clipPath>\\n</defs>\\n</svg>\\n\"","export default \"<svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M14.0169 5.91374L9.59604 9.00945C9.19935 9.28716 8.86462 9.53463 8.47983 9.63054C8.16483 9.70909 7.83487 9.70909 7.51987 9.63054C7.13517 9.53456 6.80029 9.28712 6.40366 9.00945L1.98373 5.91472V10.1335C1.98373 10.7042 1.98357 11.0933 2.00815 11.3942C2.03209 11.6871 2.07578 11.839 2.13022 11.946C2.25956 12.1998 2.46624 12.4064 2.72006 12.5358C2.82706 12.5903 2.97949 12.6339 3.2728 12.6579C3.57368 12.6825 3.96281 12.6833 4.53354 12.6833H11.4671C12.0374 12.6833 12.4261 12.6824 12.7269 12.6579C13.0202 12.6339 13.1726 12.5904 13.2796 12.5358L13.3724 12.4841C13.5839 12.3544 13.7562 12.1683 13.8695 11.946C13.924 11.839 13.9676 11.6872 13.9915 11.3942C14.0161 11.0933 14.0169 10.7042 14.0169 10.1335V5.91374ZM4.53354 3.31706C3.96285 3.31706 3.57367 3.3169 3.2728 3.34148C2.97949 3.36544 2.82707 3.40902 2.72006 3.46355C2.4662 3.59295 2.25962 3.79953 2.13022 4.05339C2.09305 4.12634 2.06169 4.22063 2.03745 4.36589L7.14975 7.94402C7.63394 8.28299 7.73982 8.34519 7.83432 8.36882H7.8353C7.94363 8.39576 8.05706 8.39583 8.16537 8.36882C8.25995 8.34524 8.36618 8.28338 8.85092 7.94402L13.9613 4.36687C13.937 4.22119 13.9067 4.12646 13.8695 4.05339C13.74 3.79951 13.5335 3.59291 13.2796 3.46355C13.1726 3.40903 13.0201 3.36543 12.7269 3.34148C12.4262 3.31694 12.0374 3.31706 11.4671 3.31706H4.53354ZM15.3167 10.1335C15.3167 10.6826 15.3173 11.1336 15.2874 11.4997C15.2569 11.8734 15.1911 12.216 15.0277 12.5368C14.7736 13.0353 14.368 13.441 13.8695 13.695C13.5488 13.8583 13.2068 13.9233 12.8333 13.9538C12.4673 13.9837 12.0163 13.9831 11.4671 13.9831H4.53354C3.98421 13.9831 3.53247 13.9837 3.16635 13.9538C2.79283 13.9232 2.4509 13.8574 2.13022 13.694C1.63178 13.44 1.22605 13.0353 0.972015 12.5368C0.808566 12.216 0.74376 11.8734 0.713226 11.4997C0.683328 11.1336 0.682953 10.6827 0.682953 10.1335V5.86687C0.682953 5.45303 0.683977 5.09479 0.696625 4.78679C0.677017 4.68281 0.684494 4.57573 0.717133 4.47234C0.748641 4.10953 0.812649 3.77633 0.972015 3.46355C1.22608 2.96491 1.63159 2.55941 2.13022 2.30534C2.45088 2.14196 2.79286 2.0771 3.16635 2.04655C3.53246 2.01664 3.98421 2.01628 4.53354 2.01628H11.4671C12.0163 2.01628 12.4673 2.01665 12.8333 2.04655C13.2069 2.07709 13.5488 2.14202 13.8695 2.30534C14.3681 2.5594 14.7736 2.96497 15.0277 3.46355C15.1878 3.77777 15.2532 4.11246 15.2845 4.47722C15.3161 4.58009 15.323 4.68652 15.3031 4.78972C15.3156 5.09706 15.3167 5.45433 15.3167 5.86687V10.1335Z\\\" fill=\\\"#334155\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"12\\\" height=\\\"12\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\"><circle cx=\\\"7\\\" cy=\\\"7\\\" r=\\\"5.5\\\" fill=\\\"#ef4444\\\"></circle><rect x=\\\"3.8\\\" y=\\\"6.4\\\" width=\\\"6.4\\\" height=\\\"1.2\\\" rx=\\\"0.6\\\" fill=\\\"white\\\"></rect></svg>\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g clip-path=\\\"url(#clip0_453_626)\\\">\\n<g clip-path=\\\"url(#clip1_453_626)\\\">\\n<path d=\\\"M8.74999 8.75002L5.24999 5.25002M8.74999 5.25002L5.24999 8.75002M6.99999 12.8334C3.77836 12.8334 1.16666 10.2217 1.16666 7.00002C1.16666 3.77836 3.77836 1.16669 6.99999 1.16669C10.2217 1.16669 12.8333 3.77836 12.8333 7.00002C12.8333 10.2217 10.2217 12.8334 6.99999 12.8334Z\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</g>\\n</g>\\n<defs>\\n<clipPath id=\\\"clip0_453_626\\\">\\n<rect width=\\\"14\\\" height=\\\"14\\\" fill=\\\"white\\\"/>\\n</clipPath>\\n<clipPath id=\\\"clip1_453_626\\\">\\n<rect width=\\\"14\\\" height=\\\"14\\\" fill=\\\"white\\\" transform=\\\"matrix(0 1 -1 0 14 0)\\\"/>\\n</clipPath>\\n</defs>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" height=\\\"24\\\" viewBox=\\\"0 -960 960 960\\\" width=\\\"24\\\"><path fill=\\\"currentColor\\\" d=\\\"M480-345 240-585l56-56 184 184 184-184 56 56-240 240Z\\\"/></svg>\\n\"","export default \"<svg width=\\\"12\\\" height=\\\"12\\\" viewBox=\\\"0 0 12 12\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M11.05 4.05078V0.550782H7.55004M11.05 0.550782L5.80005 5.80078M11.05 6.96745V8.25078C11.05 9.23087 11.05 9.72092 10.8593 10.0953C10.6915 10.4245 10.4238 10.6923 10.0945 10.86C9.72019 11.0508 9.23014 11.0508 8.25005 11.0508H3.35005C2.36993 11.0508 1.87993 11.0508 1.50555 10.86C1.17626 10.6923 0.908566 10.4245 0.740799 10.0953C0.550049 9.72092 0.550049 9.23087 0.550049 8.25078V3.35078C0.550049 2.37066 0.550049 1.88067 0.740799 1.50628C0.908566 1.17699 1.17626 0.909298 1.50555 0.741531C1.87993 0.550781 2.36993 0.550782 3.35005 0.550782H4.63338\\\" stroke=\\\"#0021C7\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\">\\n <path d=\\\"M1.16699 7C1.16699 5.067 2.73399 3.5 4.66699 3.5H9.33366C11.2667 3.5 12.8337 5.067 12.8337 7C12.8337 8.93299 11.2667 10.5 9.33366 10.5H4.66699C2.73399 10.5 1.16699 8.93299 1.16699 7Z\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n <path d=\\\"M4.66634 8.45835C5.47176 8.45835 6.12467 7.80543 6.12467 7.00002C6.12467 6.19461 5.47176 5.54169 4.66634 5.54169C3.86093 5.54169 3.20801 6.19461 3.20801 7.00002C3.20801 7.80543 3.86093 8.45835 4.66634 8.45835Z\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\">\\n <path d=\\\"M12.25 5.83335H1.75M9.33333 1.16669V3.50002M4.66667 1.16669V3.50002M4.55 12.8334H9.45C10.4301 12.8334 10.9201 12.8334 11.2945 12.6426C11.6238 12.4748 11.8915 12.2071 12.0592 11.8779C12.25 11.5035 12.25 11.0135 12.25 10.0334V5.13335C12.25 4.15326 12.25 3.66321 12.0592 3.28887C11.8915 2.95959 11.6238 2.69187 11.2945 2.52409C10.9201 2.33335 10.4301 2.33335 9.45 2.33335H4.55C3.56991 2.33335 3.07986 2.33335 2.70552 2.52409C2.37623 2.69187 2.10852 2.95959 1.94074 3.28887C1.75 3.66321 1.75 4.15326 1.75 5.13335V10.0334C1.75 11.0135 1.75 11.5035 1.94074 11.8779C2.10852 12.2071 2.37623 12.4748 2.70552 12.6426C3.07986 12.8334 3.56991 12.8334 4.55 12.8334Z\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\">\\n <path d=\\\"M4.66667 6L7 8.33333L9.33333 6M4.55 12.25H9.45C10.4301 12.25 10.9201 12.25 11.2945 12.0592C11.6238 11.8915 11.8915 11.6238 12.0592 11.2945C12.25 10.9201 12.25 10.4301 12.25 9.45V4.55C12.25 3.56991 12.25 3.07986 12.0592 2.70552C11.8915 2.37623 11.6238 2.10852 11.2945 1.94074C10.9201 1.75 10.4301 1.75 9.45 1.75H4.55C3.56991 1.75 3.07986 1.75 2.70552 1.94074C2.37623 2.10852 2.10852 2.37623 1.94074 2.70552C1.75 3.07986 1.75 3.56991 1.75 4.55V9.45C1.75 10.4301 1.75 10.9201 1.94074 11.2945C2.10852 11.6238 2.37623 11.8915 2.70552 12.0592C3.07986 12.25 3.56991 12.25 4.55 12.25Z\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\">\\n <path d=\\\"M2.33301 4.08331C2.33301 3.53972 2.33301 3.26792 2.42181 3.05351C2.54023 2.76765 2.76735 2.54053 3.05321 2.42212C3.26761 2.33331 3.53941 2.33331 4.08301 2.33331H9.91634C10.46 2.33331 10.7317 2.33331 10.9462 2.42212C11.232 2.54053 11.4591 2.76765 11.5776 3.05351C11.6663 3.26792 11.6663 3.53972 11.6663 4.08331M5.24967 11.6666H8.74967M6.99967 2.33331V11.6666\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\">\\n <path d=\\\"M2.33301 4.66667H11.6663M2.33301 9.33333H11.6663M4.66634 1.75V12.25M9.33301 1.75V12.25\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\">\\n <path d=\\\"M5.25033 9.91665H4.08366C2.47283 9.91665 1.16699 8.6108 1.16699 6.99998C1.16699 5.38915 2.47283 4.08331 4.08366 4.08331H5.25033M8.75033 9.91665H9.91699C11.5278 9.91665 12.8337 8.6108 12.8337 6.99998C12.8337 5.38915 11.5278 4.08331 9.91699 4.08331H8.75033M4.08366 6.99998H9.91699\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M1.16667 2.625C1.16667 2.235 1.16667 2.04 1.23958 1.89167C1.30333 1.76167 1.40833 1.65667 1.53833 1.59292C1.68667 1.52 1.88167 1.52 2.27167 1.52H11.7283C12.1183 1.52 12.3133 1.52 12.4617 1.59292C12.5917 1.65667 12.6967 1.76167 12.7604 1.89167C12.8333 2.04 12.8333 2.235 12.8333 2.625V3.15C12.8333 3.33 12.8333 3.42 12.8125 3.505C12.7942 3.58 12.7617 3.65083 12.7175 3.71417C12.6675 3.785 12.5992 3.84333 12.4617 3.96L8.955 7.04C8.8175 7.15667 8.74917 7.215 8.69917 7.28583C8.655 7.34917 8.6225 7.42 8.60417 7.495C8.58333 7.58 8.58333 7.67 8.58333 7.85V10.3833L5.41667 12.8333V7.85C5.41667 7.67 5.41667 7.58 5.39583 7.495C5.3775 7.42 5.345 7.34917 5.30083 7.28583C5.25083 7.215 5.1825 7.15667 5.045 7.04L1.53833 3.96C1.40083 3.84333 1.3325 3.785 1.2825 3.71417C1.23833 3.65083 1.20583 3.58 1.1875 3.505C1.16667 3.42 1.16667 3.33 1.16667 3.15V2.625Z\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"></path></svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"28\\\" height=\\\"28\\\" viewBox=\\\"0 0 28 28\\\" fill=\\\"none\\\">\\n <rect width=\\\"28\\\" height=\\\"28\\\" rx=\\\"14\\\" fill=\\\"#EDF1F6\\\"/>\\n <path d=\\\"M9.625 10.1603V19.798C9.625 19.943 9.74253 20.0605 9.8875 20.0605H15.4875C15.6325 20.0605 15.75 19.943 15.75 19.798V7.36028C15.75 7.16514 15.5446 7.03823 15.3701 7.12549L9.77011 9.92549C9.68118 9.96996 9.625 10.0609 9.625 10.1603Z\\\" fill=\\\"#94A3B8\\\"/>\\n <path d=\\\"M18.27 8.1693L17.045 7.25055C16.872 7.12076 16.625 7.24423 16.625 7.46055V19.798C16.625 19.943 16.7425 20.0605 16.8875 20.0605H18.1125C18.2575 20.0605 18.375 19.943 18.375 19.798V8.3793C18.375 8.29667 18.3361 8.21887 18.27 8.1693Z\\\" fill=\\\"#94A3B8\\\"/>\\n <path d=\\\"M19.25 14.7978V19.798C19.25 19.943 19.3675 20.0605 19.5125 20.0605H20.7375C20.8825 20.0605 21 19.943 21 19.798V15.4103C21 15.3109 20.9438 15.22 20.8549 15.1755L19.6299 14.563C19.4554 14.4757 19.25 14.6026 19.25 14.7978Z\\\" fill=\\\"#94A3B8\\\"/>\\n <path d=\\\"M8.75 14.7978V19.798C8.75 19.943 8.63247 20.0605 8.4875 20.0605H7.2625C7.11753 20.0605 7 19.943 7 19.798V15.4103C7 15.3109 7.05618 15.22 7.14511 15.1755L8.37011 14.563C8.54464 14.4757 8.75 14.6026 8.75 14.7978Z\\\" fill=\\\"#94A3B8\\\"/>\\n <path d=\\\"M11.8125 20.0605V17.0664C11.8125 17.0262 11.8398 16.9912 11.8788 16.9815L13.4538 16.5877C13.509 16.5739 13.5625 16.6157 13.5625 16.6726V20.0605\\\" stroke=\\\"#EDF1F6\\\" stroke-width=\\\"0.8\\\"/>\\n</svg>\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<rect width=\\\"14\\\" height=\\\"14\\\" fill=\\\"white\\\" fill-opacity=\\\"0.01\\\"/>\\n<path fill-rule=\\\"evenodd\\\" clip-rule=\\\"evenodd\\\" d=\\\"M12.8327 7.00001C12.8327 10.2217 10.221 12.8333 6.99935 12.8333C3.77769 12.8333 1.16602 10.2217 1.16602 7.00001C1.16602 3.77834 3.77769 1.16667 6.99935 1.16667C10.221 1.16667 12.8327 3.77834 12.8327 7.00001ZM5.47242 6.45687C5.54359 6.48745 5.60795 6.53189 5.66176 6.5876L6.41601 7.34185L8.33693 5.42093C8.39074 5.36522 8.45511 5.32078 8.52628 5.29021C8.59745 5.25964 8.67399 5.24354 8.75145 5.24287C8.8289 5.2422 8.90571 5.25696 8.9774 5.28629C9.04909 5.31562 9.11422 5.35893 9.16899 5.4137C9.22377 5.46847 9.26708 5.5336 9.29641 5.60529C9.32574 5.67698 9.3405 5.7538 9.33983 5.83125C9.33915 5.90871 9.32306 5.98525 9.29249 6.05642C9.26192 6.12759 9.21748 6.19196 9.16176 6.24577L6.82843 8.5791C6.71904 8.68846 6.57069 8.74989 6.41601 8.74989C6.26133 8.74989 6.11299 8.68846 6.0036 8.5791L4.83693 7.41243C4.78122 7.35862 4.73678 7.29426 4.7062 7.22309C4.67563 7.15192 4.65954 7.07537 4.65887 6.99792C4.6582 6.92046 4.67295 6.84365 4.70229 6.77196C4.73162 6.70027 4.77493 6.63514 4.8297 6.58037C4.88447 6.5256 4.9496 6.48229 5.02129 6.45295C5.09298 6.42362 5.16979 6.40886 5.24725 6.40954C5.3247 6.41021 5.40125 6.4263 5.47242 6.45687Z\\\" fill=\\\"#1B6F41\\\"/>\\n</svg>\\n\"","export default \"<svg height=\\\"2500\\\" viewBox=\\\"6.20856283 .64498824 244.26943717 251.24701176\\\" width=\\\"2500\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"m191.385 85.694v-29.506a22.722 22.722 0 0 0 13.101-20.48v-.677c0-12.549-10.173-22.722-22.721-22.722h-.678c-12.549 0-22.722 10.173-22.722 22.722v.677a22.722 22.722 0 0 0 13.101 20.48v29.506a64.342 64.342 0 0 0 -30.594 13.47l-80.922-63.03c.577-2.083.878-4.225.912-6.375a25.6 25.6 0 1 0 -25.633 25.55 25.323 25.323 0 0 0 12.607-3.43l79.685 62.007c-14.65 22.131-14.258 50.974.987 72.7l-24.236 24.243c-1.96-.626-4-.959-6.057-.987-11.607.01-21.01 9.423-21.007 21.03.003 11.606 9.412 21.014 21.018 21.017 11.607.003 21.02-9.4 21.03-21.007a20.747 20.747 0 0 0 -.988-6.056l23.976-23.985c21.423 16.492 50.846 17.913 73.759 3.562 22.912-14.352 34.475-41.446 28.985-67.918-5.49-26.473-26.873-46.734-53.603-50.792m-9.938 97.044a33.17 33.17 0 1 1 0-66.316c17.85.625 32 15.272 32.01 33.134.008 17.86-14.127 32.522-31.977 33.165\\\" fill=\\\"#ff7a59\\\"/></svg>\"","export default \"<svg width=\\\"13\\\" height=\\\"7\\\" viewBox=\\\"0 0 13 7\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M4.63314 6.38332H3.46647C1.85564 6.38332 0.549805 5.07747 0.549805 3.46665C0.549805 1.85583 1.85564 0.549988 3.46647 0.549988H4.63314M8.13314 6.38332H9.29981C10.9106 6.38332 12.2165 5.07747 12.2165 3.46665C12.2165 1.85583 10.9106 0.549988 9.29981 0.549988H8.13314M3.46647 3.46665H9.29981\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"18\\\" height=\\\"18\\\" viewBox=\\\"0 0 18 18\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<circle cx=\\\"9\\\" cy=\\\"9\\\" r=\\\"8.25\\\" stroke=\\\"#EC8A54\\\" stroke-width=\\\"1.5\\\"/>\\n<path d=\\\"M9 3C10.5913 3 12.1174 3.63214 13.2426 4.75736C14.3679 5.88258 15 7.4087 15 9C15 10.5913 14.3679 12.1174 13.2426 13.2426C12.1174 14.3679 10.5913 15 9 15L9 9V3Z\\\" fill=\\\"#EC8A54\\\"/>\\n</svg>\\n\"","export default \"\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\">\\n <path d=\\\"M1.45866 6.9987H3.43147C3.83117 6.9987 4.19657 7.2245 4.37533 7.58203C4.55408 7.93955 4.91948 8.16536 5.31918 8.16536H8.68149C9.08119 8.16536 9.44659 7.93955 9.62533 7.58203C9.80406 7.2245 10.1695 6.9987 10.5692 6.9987H12.542M5.23082 2.33203H8.76981C9.398 2.33203 9.71207 2.33203 9.98938 2.42767C10.2346 2.51226 10.458 2.6503 10.6433 2.8318C10.8528 3.03705 10.9933 3.31798 11.2742 3.87983L12.538 6.40749C12.6483 6.62799 12.7034 6.73824 12.7423 6.85374C12.7768 6.95641 12.8018 7.06199 12.8167 7.16921C12.8337 7.2899 12.8337 7.41315 12.8337 7.65967V8.86536C12.8337 9.84548 12.8337 10.3355 12.6429 10.7099C12.4751 11.0392 12.2075 11.3068 11.8782 11.4746C11.5038 11.6654 11.0138 11.6654 10.0337 11.6654H3.96699C2.9869 11.6654 2.49685 11.6654 2.12251 11.4746C1.79322 11.3068 1.52551 11.0392 1.35773 10.7099C1.16699 10.3355 1.16699 9.84548 1.16699 8.86536V7.65967C1.16699 7.41315 1.16699 7.2899 1.18389 7.16921C1.19891 7.06199 1.22383 6.95641 1.25835 6.85374C1.29723 6.73824 1.35235 6.62799 1.4626 6.40749L2.72642 3.87983C3.00735 3.31798 3.14782 3.03705 3.35738 2.8318C3.54269 2.6503 3.76604 2.51226 4.01126 2.42767C4.28855 2.33203 4.60264 2.33203 5.23082 2.33203Z\\\" stroke=\\\"white\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<circle cx=\\\"7\\\" cy=\\\"7\\\" r=\\\"5.5\\\" stroke=\\\"#475569\\\" stroke-width=\\\"1.2\\\"/>\\n<circle cx=\\\"7\\\" cy=\\\"4\\\" r=\\\"0.65\\\" fill=\\\"#475569\\\"/>\\n<path d=\\\"M7 6.15V10\\\" stroke=\\\"#475569\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path fill-rule=\\\"evenodd\\\" clip-rule=\\\"evenodd\\\" d=\\\"M6.45288 2.89741C6.75388 2.32924 7.24504 2.32691 7.54721 2.89741L11.7029 10.7479C12.0039 11.3161 11.7291 11.781 11.0863 11.781H2.91379C2.27096 11.781 1.99504 11.3184 2.29721 10.7479L6.45288 2.89741ZM6.58756 8.57914C6.69696 8.68853 6.84533 8.74999 7.00004 8.74999C7.15475 8.74999 7.30312 8.68853 7.41252 8.57914C7.52192 8.46974 7.58338 8.32137 7.58338 8.16666V5.24999C7.58338 5.09528 7.52192 4.94691 7.41252 4.83751C7.30312 4.72812 7.15475 4.66666 7.00004 4.66666C6.84533 4.66666 6.69696 4.72812 6.58756 4.83751C6.47817 4.94691 6.41671 5.09528 6.41671 5.24999V8.16666C6.41671 8.32137 6.47817 8.46974 6.58756 8.57914ZM6.58756 10.3291C6.69696 10.4385 6.84533 10.5 7.00004 10.5C7.15475 10.5 7.30312 10.4385 7.41252 10.3291C7.52192 10.2197 7.58338 10.0714 7.58338 9.91666C7.58338 9.76195 7.52192 9.61357 7.41252 9.50418C7.30312 9.39478 7.15475 9.33332 7.00004 9.33332C6.84533 9.33332 6.69696 9.39478 6.58756 9.50418C6.47817 9.61357 6.41671 9.76195 6.41671 9.91666C6.41671 10.0714 6.47817 10.2197 6.58756 10.3291Z\\\" fill=\\\"#B22E33\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M2.9 7.4L5.5 10L11.1 4.4\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M3.5 5.25L7 8.75L10.5 5.25\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g transform=\\\"translate(1 1)\\\">\\n<path d=\\\"M6.58156 2.01442C6.71596 1.74204 6.78322 1.60585 6.87445 1.56233C6.95385 1.52447 7.04613 1.52447 7.12552 1.56233C7.21681 1.60585 7.28401 1.74204 7.41847 2.01442L8.69405 4.59856C8.73371 4.67897 8.75355 4.71918 8.78254 4.7504C8.80826 4.77804 8.83906 4.80044 8.87325 4.81634C8.91192 4.83431 8.95625 4.8408 9.04498 4.85376L11.8982 5.27081C12.1987 5.31473 12.3489 5.33668 12.4185 5.41007C12.4789 5.47392 12.5074 5.56166 12.4959 5.64885C12.4826 5.74907 12.3739 5.85502 12.1564 6.06688L10.0925 8.07705C10.0282 8.1397 9.99599 8.17108 9.97522 8.20836C9.95685 8.24131 9.94506 8.2776 9.94051 8.31511C9.93538 8.35746 9.94296 8.40173 9.95813 8.49022L10.4452 11.3295C10.4965 11.629 10.5222 11.7788 10.4739 11.8676C10.4319 11.9449 10.3573 11.9991 10.2708 12.0152C10.1713 12.0336 10.0369 11.9629 9.76796 11.8215L7.21722 10.48C7.13771 10.4383 7.09799 10.4174 7.0561 10.4092C7.01906 10.4019 6.98091 10.4019 6.94387 10.4092C6.90199 10.4174 6.86226 10.4383 6.78281 10.48L4.23202 11.8215C3.96311 11.9629 3.82864 12.0336 3.72922 12.0152C3.64272 11.9991 3.56807 11.9449 3.52609 11.8676C3.47782 11.7788 3.50351 11.629 3.55486 11.3295L4.04184 8.49022C4.05702 8.40173 4.06461 8.35746 4.05947 8.31511C4.05492 8.2776 4.04314 8.24131 4.02476 8.20836C4.004 8.17108 3.97183 8.1397 3.9075 8.07705L1.84365 6.06688C1.62612 5.85502 1.51736 5.74907 1.50413 5.64885C1.49262 5.56166 1.52106 5.47392 1.58155 5.41007C1.65108 5.33668 1.8013 5.31473 2.10176 5.27081L4.955 4.85376C5.04373 4.8408 5.0881 4.83431 5.12674 4.81634C5.16095 4.80044 5.19175 4.77804 5.21743 4.7504C5.24644 4.71918 5.26628 4.67897 5.30597 4.59856L6.58156 2.01442Z\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</g>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<circle cx=\\\"7\\\" cy=\\\"7\\\" r=\\\"5.25\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.1\\\"/>\\n<path d=\\\"M5.4 8.6L8.6 5.4M5.4 5.4L8.6 8.6\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M8 4V8L10.6667 9.33333M14.6667 8C14.6667 11.6819 11.6819 14.6667 8 14.6667C4.3181 14.6667 1.33333 11.6819 1.33333 8C1.33333 4.3181 4.3181 1.33333 8 1.33333C11.6819 1.33333 14.6667 4.3181 14.6667 8Z\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M2.1 5.6A5.13 5.13 0 0 1 7 2.04a5.13 5.13 0 0 1 4.96 3.85M11.9 8.4A5.13 5.13 0 0 1 7 11.96a5.13 5.13 0 0 1-4.96-3.85\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\"/>\\n<path d=\\\"M2.04 3.06v2.6h2.6M11.96 10.94v-2.6h-2.6\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M5.33333 8.66667V11.3333M10.6667 7.33333V11.3333M8 4.66667V11.3333M5.2 14H10.8C11.9201 14 12.4801 14 12.908 13.782C13.2843 13.5903 13.5903 13.2843 13.782 12.908C14 12.4801 14 11.9201 14 10.8V5.2C14 4.07989 14 3.51984 13.782 3.09202C13.5903 2.71569 13.2843 2.40973 12.908 2.21799C12.4801 2 11.9201 2 10.8 2H5.2C4.07989 2 3.51984 2 3.09202 2.21799C2.71569 2.40973 2.40973 2.71569 2.21799 3.09202C2 3.51984 2 4.07989 2 5.2V10.8C2 11.9201 2 12.4801 2.21799 12.908C2.40973 13.2843 2.71569 13.5903 3.09202 13.782C3.51984 14 4.07989 14 5.2 14Z\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g transform=\\\"translate(2.137 2.019)\\\">\\n<path d=\\\"M4.59919 11.6038C4.93056 11.6038 5.19919 11.3352 5.19919 11.0038C5.19919 10.6724 4.93056 10.4038 4.59919 10.4038V11.0038V11.6038ZM9.74292 0.6V-1.39116e-08H2.70263V0.6V1.2H9.74292V0.6ZM0.6 2.70262H8.44011e-10V10.373H0.6H1.2V2.70262H0.6ZM1.23079 11.0038V11.6038H4.59919V11.0038V10.4038H1.23079V11.0038ZM0.6 10.373H8.44011e-10C8.44011e-10 11.0527 0.551042 11.6038 1.23079 11.6038V11.0038V10.4038C1.21378 10.4038 1.2 10.39 1.2 10.373H0.6ZM2.70263 0.6V-1.39116e-08C1.21001 -1.39116e-08 8.44011e-10 1.21001 8.44011e-10 2.70262H0.6H1.2C1.2 1.87275 1.87275 1.2 2.70263 1.2V0.6Z\\\" fill=\\\"#64758B\\\"/>\\n<path d=\\\"M8.15694 4.36375C8.15694 4.69512 8.42557 4.96375 8.75694 4.96375C9.08831 4.96375 9.35694 4.69512 9.35694 4.36375H8.75694H8.15694ZM8.75694 3.01871V3.61871H10.2604V3.01871V2.41871H8.75694V3.01871ZM10.8186 2.46055H11.4186V1.63082H10.8186H10.2186V2.46055H10.8186ZM8.75694 1.63082H8.15694V4.36375H8.75694H9.35694V1.63082H8.75694ZM9.78776 0.6V-1.39116e-08C8.88709 -1.39116e-08 8.15694 0.730143 8.15694 1.63082H8.75694H9.35694C9.35694 1.39288 9.54983 1.2 9.78776 1.2V0.6ZM10.8186 1.63082H11.4186C11.4186 0.730141 10.6884 -1.39116e-08 9.78776 -1.39116e-08V0.6V1.2C10.0257 1.2 10.2186 1.39288 10.2186 1.63082H10.8186ZM10.2604 3.01871V3.61871C10.9001 3.61871 11.4186 3.10018 11.4186 2.46055H10.8186H10.2186C10.2186 2.43744 10.2373 2.41871 10.2604 2.41871V3.01871Z\\\" fill=\\\"#64758B\\\"/>\\n<path d=\\\"M2.65299 3.27295H4.70594\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\"/>\\n<path d=\\\"M2.65299 5.57893H6.07458\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\"/>\\n<circle cx=\\\"8.73034\\\" cy=\\\"8.9662\\\" r=\\\"2.39511\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.2\\\"/>\\n<path d=\\\"M8.46969 9.15603V8.12955\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.31926\\\" stroke-linecap=\\\"round\\\"/>\\n<path d=\\\"M8.46969 9.15343L9.154 9.49558\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\"/>\\n</g>\\n</svg>\\n\"","export default \"<svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M6.66667 5.33333V4.66667M6.66667 8.33333V7.66667M6.66667 11.3333V10.6667M3.46667 2.66667H12.5333C13.2801 2.66667 13.6535 2.66667 13.9387 2.81199C14.1895 2.93982 14.3935 3.14379 14.5213 3.39468C14.6667 3.67989 14.6667 4.05327 14.6667 4.8V5.66667C13.378 5.66667 12.3333 6.71133 12.3333 8C12.3333 9.28867 13.378 10.3333 14.6667 10.3333V11.2C14.6667 11.9467 14.6667 12.3201 14.5213 12.6053C14.3935 12.8562 14.1895 13.0602 13.9387 13.188C13.6535 13.3333 13.2801 13.3333 12.5333 13.3333H3.46667C2.71993 13.3333 2.34656 13.3333 2.06135 13.188C1.81046 13.0602 1.60649 12.8562 1.47866 12.6053C1.33333 12.3201 1.33333 11.9467 1.33333 11.2V10.3333C2.622 10.3333 3.66667 9.28867 3.66667 8C3.66667 6.71133 2.622 5.66667 1.33333 5.66667V4.8C1.33333 4.05327 1.33333 3.67989 1.47866 3.39468C1.60649 3.14379 1.81046 2.93982 2.06135 2.81199C2.34656 2.66667 2.71993 2.66667 3.46667 2.66667Z\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 10.2857 10.2857\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g transform=\\\"translate(3.4286 0) rotate(180 3.4286 3.4286)\\\">\\n<path d=\\\"M6.85714 0.857143C6.85714 0.383756 6.47339 0 6 0H4.28571C3.81233 0 3.42857 0.383756 3.42857 0.857143V6C3.42857 6.47339 3.81233 6.85714 4.28571 6.85714H6C6.47339 6.85714 6.85714 6.47339 6.85714 6V0.857143Z\\\" fill=\\\"#A6BFF4\\\"/>\\n<path d=\\\"M6 3.42857C6.47339 3.42857 6.85714 3.04482 6.85714 2.57143L6.85714 0.857143C6.85714 0.383756 6.47339 0 6 0L0.857143 0C0.383756 0 0 0.383756 0 0.857143L0 2.57143C0 3.04482 0.383756 3.42857 0.857143 3.42857L6 3.42857Z\\\" fill=\\\"#2A5EF5\\\"/>\\n</g>\\n<g transform=\\\"translate(0 3.4286)\\\">\\n<path d=\\\"M6.85714 0.857143C6.85714 0.383756 6.47339 0 6 0H4.28571C3.81233 0 3.42857 0.383756 3.42857 0.857143V6C3.42857 6.47339 3.81233 6.85714 4.28571 6.85714H6C6.47339 6.85714 6.85714 6.47339 6.85714 6V0.857143Z\\\" fill=\\\"#A6BFF4\\\"/>\\n<path d=\\\"M6.85714 2.57143H3.42857V4.28571H6.85714V2.57143Z\\\" fill=\\\"#5887EB\\\"/>\\n<path d=\\\"M6.85714 3.42857L6.85714 0.857143C6.85714 0.383756 6.47339 0 6 0L0.857142 0C0.383756 0 0 0.383756 0 0.857143L0 2.57143C0 3.04482 0.383756 3.42857 0.857143 3.42857L6.85714 3.42857Z\\\" fill=\\\"#2A5EF5\\\"/>\\n<path d=\\\"M6.85714 3.42857L3.42857 0V3.42857H6.85714Z\\\" fill=\\\"#113FC5\\\"/>\\n</g>\\n</svg>\\n\"","export default \"<svg width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"-1 -1 22 22\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<circle cx=\\\"10\\\" cy=\\\"10\\\" r=\\\"10\\\" fill=\\\"#F0AFA3\\\"/>\\n<path d=\\\"M5.7 6.7L8 7.6M14.3 6.7L12 7.6\\\" stroke=\\\"#5C2E28\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\"/>\\n<circle cx=\\\"6.9\\\" cy=\\\"9.4\\\" r=\\\"0.95\\\" fill=\\\"#5C2E28\\\"/>\\n<circle cx=\\\"13.1\\\" cy=\\\"9.4\\\" r=\\\"0.95\\\" fill=\\\"#5C2E28\\\"/>\\n<path d=\\\"M6.7 14C7.5 12.85 8.65 12.2 10 12.2C11.35 12.2 12.5 12.85 13.3 14\\\" stroke=\\\"#5C2E28\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 20 20\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<circle cx=\\\"10\\\" cy=\\\"10\\\" r=\\\"10\\\" fill=\\\"#EFDD82\\\"/>\\n<circle cx=\\\"6.9\\\" cy=\\\"8.3\\\" r=\\\"0.95\\\" fill=\\\"#5C4F1E\\\"/>\\n<circle cx=\\\"13.1\\\" cy=\\\"8.3\\\" r=\\\"0.95\\\" fill=\\\"#5C4F1E\\\"/>\\n<path d=\\\"M7 12.8H13\\\" stroke=\\\"#5C4F1E\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 20 20\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<circle cx=\\\"10\\\" cy=\\\"10\\\" r=\\\"10\\\" fill=\\\"#8CC8B5\\\"/>\\n<circle cx=\\\"6.9\\\" cy=\\\"8.1\\\" r=\\\"0.95\\\" fill=\\\"#2F5147\\\"/>\\n<circle cx=\\\"13.1\\\" cy=\\\"8.1\\\" r=\\\"0.95\\\" fill=\\\"#2F5147\\\"/>\\n<path d=\\\"M6.7 12.2C7.5 13.35 8.65 14 10 14C11.35 14 12.5 13.35 13.3 12.2\\\" stroke=\\\"#2F5147\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"12\\\" height=\\\"12\\\" viewBox=\\\"0 0 11.1429 11.1429\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M5.57143 0C4.09379 0 2.67668 0.586989 1.63183 1.63183C0.586989 2.67668 0 4.09379 0 5.57143C0 7.04906 0.586989 8.46618 1.63183 9.51102C2.67668 10.5559 4.09379 11.1429 5.57143 11.1429L5.57143 5.57143L5.57143 0Z\\\" fill=\\\"#765CF0\\\"/>\\n<circle cx=\\\"3.42878\\\" cy=\\\"4.28572\\\" r=\\\"0.857143\\\" fill=\\\"#D0C9F6\\\"/>\\n<path d=\\\"M5.57143 11.1429C7.04906 11.1429 8.46618 10.5559 9.51102 9.51102C10.5559 8.46618 11.1429 7.04906 11.1429 5.57143C11.1429 4.09379 10.5559 2.67668 9.51102 1.63183C8.46618 0.586989 7.04906 0 5.57143 0L5.57143 5.57143L5.57143 11.1429Z\\\" fill=\\\"#D0C9F6\\\"/>\\n<path d=\\\"M2.57164 6.42857C2.57164 6.82254 2.64924 7.21265 2.8 7.57662C2.95076 7.9406 3.17174 8.27132 3.45032 8.54989C3.72889 8.82847 4.05961 9.04945 4.42359 9.20021C4.78757 9.35097 5.17767 9.42857 5.57164 9.42857L5.57164 6.42857L2.57164 6.42857Z\\\" fill=\\\"#D0C9F6\\\"/>\\n<path d=\\\"M8.57164 6.42857C8.57164 6.82254 8.49404 7.21265 8.34328 7.57662C8.19251 7.9406 7.97153 8.27132 7.69296 8.54989C7.41438 8.82847 7.08366 9.04945 6.71969 9.20021C6.35571 9.35097 5.9656 9.42857 5.57164 9.42857L5.57164 6.42857L8.57164 6.42857Z\\\" fill=\\\"#765CF0\\\"/>\\n<circle cx=\\\"7.7145\\\" cy=\\\"4.28572\\\" r=\\\"0.857143\\\" fill=\\\"#765CF0\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g transform=\\\"rotate(180 7 7)\\\">\\n<path d=\\\"M4.08268 12.8327V6.41602M1.16602 7.58268V11.666C1.16602 12.3104 1.68835 12.8327 2.33268 12.8327H10.1646C11.0284 12.8327 11.763 12.2025 11.8943 11.3488L12.5225 7.26547C12.6856 6.20537 11.8654 5.24935 10.7929 5.24935H8.74935C8.42717 5.24935 8.16602 4.98818 8.16602 4.66602V2.60442C8.16602 1.81001 7.52202 1.16602 6.72763 1.16602C6.53811 1.16602 6.36643 1.27761 6.28949 1.45075L4.23665 6.06957C4.14302 6.28027 3.93412 6.41602 3.70359 6.41602H2.33268C1.68835 6.41602 1.16602 6.93833 1.16602 7.58268Z\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</g>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g transform=\\\"rotate(180 7 7)\\\">\\n<path d=\\\"M1.16602 11.666V7.58268C1.16602 6.93833 1.68835 6.41602 2.33268 6.41602H3.70359C3.93412 6.41602 4.14302 6.28027 4.23665 6.06957L6.28949 1.45075C6.36643 1.27761 6.53811 1.16602 6.72763 1.16602C7.52202 1.16602 8.16602 1.81001 8.16602 2.60442V4.66602C8.16602 4.98818 8.42717 5.24935 8.74935 5.24935H10.7929C11.8654 5.24935 12.6856 6.20537 12.5225 7.26547L11.8943 11.3488C11.763 12.2025 11.0284 12.8327 10.1646 12.8327H4.08268H2.33268C1.68835 12.8327 1.16602 12.3104 1.16602 11.666Z\\\" fill=\\\"currentColor\\\"/>\\n<path d=\\\"M4.08268 12.8327V6.41602M1.16602 7.58268V11.666C1.16602 12.3104 1.68835 12.8327 2.33268 12.8327H10.1646C11.0284 12.8327 11.763 12.2025 11.8943 11.3488L12.5225 7.26547C12.6856 6.20537 11.8654 5.24935 10.7929 5.24935H8.74935C8.42717 5.24935 8.16602 4.98818 8.16602 4.66602V2.60442C8.16602 1.81001 7.52202 1.16602 6.72763 1.16602C6.53811 1.16602 6.36643 1.27761 6.28949 1.45075L4.23665 6.06957C4.14302 6.28027 3.93412 6.41602 3.70359 6.41602H2.33268C1.68835 6.41602 1.16602 6.93833 1.16602 7.58268Z\\\" stroke=\\\"white\\\" stroke-width=\\\"1.16667\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</g>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M4.08268 12.8327V6.41602M1.16602 7.58268V11.666C1.16602 12.3104 1.68835 12.8327 2.33268 12.8327H10.1646C11.0284 12.8327 11.763 12.2025 11.8943 11.3488L12.5225 7.26547C12.6856 6.20537 11.8654 5.24935 10.7929 5.24935H8.74935C8.42717 5.24935 8.16602 4.98818 8.16602 4.66602V2.60442C8.16602 1.81001 7.52202 1.16602 6.72763 1.16602C6.53811 1.16602 6.36643 1.27761 6.28949 1.45075L4.23665 6.06957C4.14302 6.28027 3.93412 6.41602 3.70359 6.41602H2.33268C1.68835 6.41602 1.16602 6.93833 1.16602 7.58268Z\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M1.16602 11.666V7.58268C1.16602 6.93833 1.68835 6.41602 2.33268 6.41602H3.70359C3.93412 6.41602 4.14302 6.28027 4.23665 6.06957L6.28949 1.45075C6.36643 1.27761 6.53811 1.16602 6.72763 1.16602C7.52202 1.16602 8.16602 1.81001 8.16602 2.60442V4.66602C8.16602 4.98818 8.42717 5.24935 8.74935 5.24935H10.7929C11.8654 5.24935 12.6856 6.20537 12.5225 7.26547L11.8943 11.3488C11.763 12.2025 11.0284 12.8327 10.1646 12.8327H4.08268H2.33268C1.68835 12.8327 1.16602 12.3104 1.16602 11.666Z\\\" fill=\\\"currentColor\\\"/>\\n<path d=\\\"M4.08268 12.8327V6.41602M1.16602 7.58268V11.666C1.16602 12.3104 1.68835 12.8327 2.33268 12.8327H10.1646C11.0284 12.8327 11.763 12.2025 11.8943 11.3488L12.5225 7.26547C12.6856 6.20537 11.8654 5.24935 10.7929 5.24935H8.74935C8.42717 5.24935 8.16602 4.98818 8.16602 4.66602V2.60442C8.16602 1.81001 7.52202 1.16602 6.72763 1.16602C6.53811 1.16602 6.36643 1.27761 6.28949 1.45075L4.23665 6.06957C4.14302 6.28027 3.93412 6.41602 3.70359 6.41602H2.33268C1.68835 6.41602 1.16602 6.93833 1.16602 7.58268Z\\\" stroke=\\\"white\\\" stroke-width=\\\"1.16667\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M12.8339 4.08362L8.24389 8.67363C8.01289 8.90463 7.89733 9.02019 7.76415 9.06342C7.64702 9.10151 7.52079 9.10151 7.40365 9.06342C7.27048 9.02019 7.15492 8.90463 6.92392 8.67363L5.3272 7.07693C5.09619 6.84593 4.98069 6.73038 4.8475 6.68715C4.73034 6.64906 4.60414 6.64906 4.48697 6.68715C4.35378 6.73038 4.23828 6.84593 4.00727 7.07693L1.16724 9.91695M12.8339 8.16695V4.08362H8.75057\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.1375\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\">\\n <path d=\\\"M7.99967 8.66536C8.36787 8.66536 8.66634 8.3669 8.66634 7.9987C8.66634 7.6305 8.36787 7.33203 7.99967 7.33203C7.63147 7.33203 7.33301 7.6305 7.33301 7.9987C7.33301 8.3669 7.63147 8.66536 7.99967 8.66536Z\\\" stroke=\\\"#475569\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n <path d=\\\"M7.99967 4.0013C8.36787 4.0013 8.66634 3.70282 8.66634 3.33464C8.66634 2.96645 8.36787 2.66797 7.99967 2.66797C7.63147 2.66797 7.33301 2.96645 7.33301 3.33464C7.33301 3.70282 7.63147 4.0013 7.99967 4.0013Z\\\" stroke=\\\"#475569\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n <path d=\\\"M7.99967 13.3333C8.36787 13.3333 8.66634 13.0349 8.66634 12.6667C8.66634 12.2985 8.36787 12 7.99967 12C7.63147 12 7.33301 12.2985 7.33301 12.6667C7.33301 13.0349 7.63147 13.3333 7.99967 13.3333Z\\\" stroke=\\\"#475569\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M3.66667 5.27741H7M3.66667 7.36303H9M3.66667 10.9384V12.3301C3.66667 12.6476 3.66667 12.8064 3.73949 12.8879C3.80281 12.9588 3.89885 13.0001 4.00036 13C4.11709 12.9999 4.25578 12.9007 4.53317 12.7024L6.12347 11.5652C6.44833 11.3329 6.6108 11.2167 6.79167 11.1341C6.95213 11.0608 7.12293 11.0073 7.29947 10.9749C7.49847 10.9384 7.70647 10.9384 8.12247 10.9384H8.8C9.92013 10.9384 10.4801 10.9384 10.908 10.7435C11.2843 10.5722 11.5903 10.2987 11.782 9.96232C12 9.57987 12 9.07932 12 8.0781V4.86028C12 3.85909 12 3.35849 11.782 2.97609C11.5903 2.63971 11.2843 2.36624 10.908 2.19485C10.4801 2 9.92013 2 8.8 2H4.2C3.07989 2 2.51984 2 2.09202 2.19485C1.71569 2.36624 1.40973 2.63971 1.21799 2.97609C1 3.35849 1 3.85909 1 4.86028V8.55482C1 9.109 1 9.38609 1.06815 9.61342C1.25308 10.2303 1.79218 10.7122 2.48236 10.8775C2.73669 10.9384 3.04669 10.9384 3.66667 10.9384Z\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"11\\\" height=\\\"12\\\" viewBox=\\\"0 0 11 12\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M0.549805 3.46665H9.88314M0.549805 8.13332H9.88314M2.88314 0.549988V11.05M7.5498 0.549988V11.05\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g clip-path=\\\"url(#clip0_815_38495)\\\">\\n<path d=\\\"M12.25 5.25001V1.75001M12.25 1.75001H8.75M12.25 1.75001L7 7M5.83333 1.75H4.55C3.56991 1.75 3.07986 1.75 2.70552 1.94074C2.37623 2.10852 2.10852 2.37623 1.94074 2.70552C1.75 3.07986 1.75 3.56991 1.75 4.55V9.45C1.75 10.4301 1.75 10.9201 1.94074 11.2945C2.10852 11.6238 2.37623 11.8915 2.70552 12.0592C3.07986 12.25 3.56991 12.25 4.55 12.25H9.45C10.4301 12.25 10.9201 12.25 11.2945 12.0592C11.6238 11.8915 11.8915 11.6238 12.0592 11.2945C12.25 10.9201 12.25 10.4301 12.25 9.45V8.16667\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.1375\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</g>\\n<defs>\\n<clipPath id=\\\"clip0_815_38495\\\">\\n<rect width=\\\"14\\\" height=\\\"14\\\" fill=\\\"white\\\"/>\\n</clipPath>\\n</defs>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M4.88862 5.1644C5.29462 6.01001 5.84808 6.80255 6.549 7.50347C7.24992 8.20439 8.04246 8.75785 8.88807 9.16385C8.96081 9.19877 8.99717 9.21623 9.04319 9.22965C9.20673 9.27732 9.40755 9.24308 9.54605 9.1439C9.58502 9.116 9.61837 9.08266 9.68505 9.01597C9.88898 8.81204 9.99095 8.71007 10.0935 8.6434C10.4802 8.39199 10.9787 8.39199 11.3654 8.6434C11.4679 8.71007 11.5699 8.81204 11.7738 9.01597L11.8875 9.12965C12.1975 9.43966 12.3525 9.59466 12.4367 9.76113C12.6042 10.0922 12.6042 10.4832 12.4367 10.8143C12.3525 10.9807 12.1975 11.1358 11.8875 11.4458L11.7955 11.5377C11.4866 11.8467 11.3321 12.0011 11.1221 12.1191C10.889 12.25 10.5271 12.3442 10.2598 12.3434C10.0189 12.3426 9.85428 12.2959 9.52502 12.2025C7.75554 11.7002 6.08583 10.7526 4.69284 9.35962C3.29985 7.96664 2.35224 6.29693 1.85001 4.52744C1.75656 4.19818 1.70983 4.03355 1.70911 3.79267C1.70832 3.52537 1.80244 3.16342 1.93336 2.93037C2.05133 2.72035 2.20581 2.56588 2.51476 2.25693L2.60671 2.16498C2.91672 1.85497 3.07172 1.69997 3.23819 1.61577C3.56927 1.44831 3.96026 1.44831 4.29134 1.61577C4.45781 1.69997 4.61281 1.85497 4.92282 2.16498L5.03649 2.27865C5.24043 2.48259 5.3424 2.58456 5.40907 2.6871C5.66048 3.07378 5.66048 3.57229 5.40907 3.95898C5.3424 4.06151 5.24043 4.16348 5.03649 4.36742C4.96981 4.4341 4.93647 4.46744 4.90856 4.50641C4.80939 4.64492 4.77515 4.84573 4.82282 5.00927C4.83623 5.05529 4.8537 5.09166 4.88862 5.1644Z\\\" stroke=\\\"#94A3B8\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M4.88849 5.16445C5.29449 6.01008 5.84797 6.8026 6.54885 7.50353C7.24978 8.20447 8.04236 8.75793 8.88796 9.16393C8.9607 9.19882 8.99704 9.21632 9.04306 9.22973C9.20663 9.27739 9.40741 9.24315 9.5459 9.14398C9.58492 9.11604 9.61823 9.08273 9.68491 9.01606C9.88884 8.81207 9.99081 8.7101 10.0934 8.64348C10.48 8.39207 10.9786 8.39207 11.3653 8.64348C11.4678 8.7101 11.5698 8.81207 11.7737 9.01606L11.8873 9.12969C12.1974 9.43973 12.3524 9.59472 12.4365 9.76121C12.604 10.0922 12.604 10.4833 12.4365 10.8144C12.3524 10.9808 12.1974 11.1358 11.8873 11.4458L11.7954 11.5377C11.4865 11.8467 11.332 12.0012 11.1219 12.1192C10.8889 12.2501 10.5269 12.3442 10.2597 12.3434C10.0188 12.3427 9.85413 12.296 9.5249 12.2025C7.75541 11.7003 6.08568 10.7527 4.69272 9.3597C3.29973 7.9667 2.35212 6.29697 1.84989 4.52751C1.75643 4.19824 1.7097 4.03362 1.70899 3.79273C1.70819 3.52543 1.80232 3.16348 1.93323 2.93043C2.05121 2.72042 2.20568 2.56594 2.51463 2.25699L2.60658 2.16504C2.91659 1.85503 3.0716 1.70003 3.23807 1.61583C3.56915 1.44837 3.96013 1.44837 4.29121 1.61583C4.45768 1.70003 4.61269 1.85503 4.92269 2.16504L5.03637 2.27872C5.2403 2.48265 5.34228 2.58462 5.40894 2.68715C5.66036 3.07385 5.66036 3.57235 5.40894 3.95904C5.34228 4.06157 5.2403 4.16354 5.03637 4.36747C4.96969 4.43416 4.93635 4.4675 4.90844 4.50647C4.80927 4.64497 4.77502 4.84579 4.82269 5.00933C4.83611 5.05535 4.85357 5.09172 4.88849 5.16445Z\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\"><path d=\\\"M8 3v10M3 8h10\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.4\\\" stroke-linecap=\\\"round\\\"></path></svg>\\n\"","export default \"<svg width=\\\"12\\\" height=\\\"12\\\" viewBox=\\\"0 0 12 12\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M3.46647 4.79999L5.7998 7.13332L8.13314 4.79999M3.3498 11.05H8.2498C9.22992 11.05 9.71992 11.05 10.0943 10.8592C10.4236 10.6915 10.6913 10.4238 10.8591 10.0945C11.0498 9.7201 11.0498 9.2301 11.0498 8.24999V3.34999C11.0498 2.36989 11.0498 1.87985 10.8591 1.50551C10.6913 1.17622 10.4236 0.908505 10.0943 0.740726C9.71992 0.549988 9.22992 0.549988 8.2498 0.549988H3.3498C2.36971 0.549988 1.87966 0.549988 1.50532 0.740726C1.17604 0.908505 0.908321 1.17622 0.740543 1.50551C0.549805 1.87985 0.549805 2.36989 0.549805 3.34999V8.24999C0.549805 9.2301 0.549805 9.7201 0.740543 10.0945C0.908321 10.4238 1.17604 10.6915 1.50532 10.8592C1.87966 11.05 2.36971 11.05 3.3498 11.05Z\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\">\\n <path d=\\\"M14 14L11.1 11.1M12.6667 7.33333C12.6667 10.2789 10.2789 12.6667 7.33333 12.6667C4.38781 12.6667 2 10.2789 2 7.33333C2 4.38781 4.38781 2 7.33333 2C10.2789 2 12.6667 4.38781 12.6667 7.33333Z\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\"","export default \"<svg width=\\\"64\\\" height=\\\"64\\\" viewBox=\\\"0 0 64 64\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<rect width=\\\"64\\\" height=\\\"64\\\" rx=\\\"32\\\" fill=\\\"#F8FAFC\\\"/>\\n<path d=\\\"M44 44L38.2 38.2M30.6667 24C34.3485 24 37.3333 26.9848 37.3333 30.6667M41.3333 30.6667C41.3333 36.5577 36.5577 41.3333 30.6667 41.3333C24.7756 41.3333 20 36.5577 20 30.6667C20 24.7756 24.7756 20 30.6667 20C36.5577 20 41.3333 24.7756 41.3333 30.6667Z\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.77778\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"#334155\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\\\"/>\\n<circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M8.00033 10C9.10487 10 10.0003 9.1046 10.0003 8C10.0003 6.8954 9.10487 6 8.00033 6C6.89573 6 6.00033 6.8954 6.00033 8C6.00033 9.1046 6.89573 10 8.00033 10Z\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"></path><path d=\\\"M6.19305 12.9141L6.58268 13.7904C6.69853 14.0512 6.88753 14.2729 7.1268 14.4284C7.36613 14.5839 7.6454 14.6667 7.9308 14.6667C8.21627 14.6667 8.49553 14.5839 8.7348 14.4284C8.97413 14.2729 9.16313 14.0512 9.279 13.7904L9.6686 12.9141C9.80733 12.6031 10.0406 12.3439 10.3353 12.1733C10.6318 12.0023 10.9748 11.9294 11.3153 11.9652L12.2686 12.0667C12.5524 12.0967 12.8388 12.0437 13.0931 11.9142C13.3473 11.7847 13.5586 11.5842 13.7012 11.3371C13.844 11.09 13.912 10.8069 13.897 10.5219C13.882 10.237 13.7847 9.96253 13.6167 9.73187L13.0523 8.95627C12.8513 8.67807 12.7439 8.3432 12.7457 8C12.7456 7.65773 12.854 7.32427 13.0553 7.0474L13.6197 6.27185C13.7876 6.04117 13.885 5.76671 13.9 5.48178C13.915 5.19685 13.8469 4.91369 13.7041 4.66667C13.5615 4.41949 13.3503 4.21899 13.096 4.08949C12.8417 3.95998 12.5553 3.90702 12.2716 3.93704L11.3183 4.03852C10.9778 4.07427 10.6347 4.00141 10.3383 3.83037C10.043 3.65883 9.8096 3.39824 9.6716 3.08593L9.279 2.20963C9.16313 1.94878 8.97413 1.72715 8.7348 1.5716C8.49553 1.41605 8.21627 1.33329 7.9308 1.33333C7.6454 1.33329 7.36613 1.41605 7.1268 1.5716C6.88753 1.72715 6.69853 1.94878 6.58268 2.20963L6.19305 3.08593C6.055 3.39824 5.82163 3.65883 5.52638 3.83037C5.22986 4.00141 4.88683 4.07427 4.54638 4.03852L3.59009 3.93704C3.30631 3.90702 3.01991 3.95998 2.76563 4.08949C2.51135 4.21899 2.30009 4.41949 2.15749 4.66667C2.01471 4.91369 1.94668 5.19685 1.96167 5.48178C1.97666 5.76671 2.07402 6.04117 2.24194 6.27185L2.80638 7.0474C3.00767 7.32427 3.11607 7.65773 3.11601 8C3.11607 8.34227 3.00767 8.6758 2.80638 8.9526L2.24194 9.72813C2.07402 9.9588 1.97666 10.2333 1.96167 10.5182C1.94668 10.8031 2.01471 11.0863 2.15749 11.3333C2.30024 11.5804 2.51151 11.7808 2.76576 11.9103C3.02001 12.0397 3.30633 12.0928 3.59009 12.0629L4.54342 11.9615C4.88387 11.9257 5.22689 11.9986 5.52342 12.1696C5.81977 12.3407 6.05423 12.6013 6.19305 12.9141Z\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"></path></svg>\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M2.94 8.84c0 .81-.66 1.47-1.47 1.47S0 9.65 0 8.84s.66-1.47 1.47-1.47h1.47v1.47Zm.74 0c0-.81.66-1.47 1.47-1.47s1.47.66 1.47 1.47v3.69c0 .81-.66 1.47-1.47 1.47s-1.47-.66-1.47-1.47V8.84Z\\\" fill=\\\"#E01E5A\\\"/>\\n<path d=\\\"M5.16 2.94c-.81 0-1.47-.66-1.47-1.47S4.35 0 5.16 0s1.47.66 1.47 1.47v1.47H5.16Zm0 .74c.81 0 1.47.66 1.47 1.47s-.66 1.47-1.47 1.47H1.47C.66 6.63 0 5.97 0 5.16s.66-1.47 1.47-1.47h3.69Z\\\" fill=\\\"#36C5F0\\\"/>\\n<path d=\\\"M11.06 5.16c0-.81.66-1.47 1.47-1.47S14 4.35 14 5.16s-.66 1.47-1.47 1.47h-1.47V5.16Zm-.74 0c0 .81-.66 1.47-1.47 1.47s-1.47-.66-1.47-1.47V1.47C7.38.66 8.04 0 8.85 0s1.47.66 1.47 1.47v3.69Z\\\" fill=\\\"#2EB67D\\\"/>\\n<path d=\\\"M8.85 11.06c.81 0 1.47.66 1.47 1.47S9.66 14 8.85 14s-1.47-.66-1.47-1.47v-1.47h1.47Zm0-.74c-.81 0-1.47-.66-1.47-1.47s.66-1.47 1.47-1.47h3.69c.81 0 1.47.66 1.47 1.47s-.66 1.47-1.47 1.47H8.85Z\\\" fill=\\\"#ECB22E\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\">\\n <path d=\\\"M14.6667 14V12.6667C14.6667 11.4241 13.8168 10.3801 12.6667 10.084M10.3333 2.19384C11.3106 2.58943 12 3.54754 12 4.66667C12 5.78579 11.3106 6.74393 10.3333 7.13947M11.3333 14C11.3333 12.7575 11.3333 12.1363 11.1303 11.6462C10.8597 10.9928 10.3405 10.4737 9.68713 10.203C9.19706 10 8.57586 10 7.33333 10H5.33333C4.09081 10 3.46956 10 2.97951 10.203C2.3261 10.4737 1.80697 10.9928 1.53631 11.6462C1.33333 12.1363 1.33333 12.7575 1.33333 14M8.99999 4.66667C8.99999 6.13943 7.80606 7.33333 6.33333 7.33333C4.86057 7.33333 3.66666 6.13943 3.66666 4.66667C3.66666 3.19391 4.86057 2 6.33333 2C7.80606 2 8.99999 3.19391 8.99999 4.66667Z\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M1.45835 7.00065H3.43117C3.83087 7.00065 4.19627 7.22646 4.37502 7.58398C4.55377 7.94151 4.91917 8.16732 5.31887 8.16732H8.68119C9.08089 8.16732 9.44629 7.94151 9.62502 7.58398C9.80375 7.22646 10.1692 7.00065 10.5689 7.00065H12.5417M5.23051 2.33398H8.7695C9.39769 2.33398 9.71176 2.33398 9.98908 2.42963C10.2343 2.51421 10.4577 2.65225 10.643 2.83376C10.8525 3.039 10.993 3.31993 11.2739 3.88178L12.5377 6.40944C12.648 6.62994 12.7031 6.74019 12.742 6.85569C12.7765 6.95836 12.8014 7.06394 12.8164 7.17116C12.8334 7.29185 12.8334 7.41511 12.8334 7.66162V8.86732C12.8334 9.84743 12.8334 10.3374 12.6426 10.7118C12.4748 11.0411 12.2071 11.3088 11.8779 11.4766C11.5035 11.6673 11.0135 11.6673 10.0334 11.6673H3.96669C2.98659 11.6673 2.49655 11.6673 2.1222 11.4766C1.79292 11.3088 1.5252 11.0411 1.35743 10.7118C1.16669 10.3374 1.16669 9.84743 1.16669 8.86732V7.66162C1.16669 7.41511 1.16669 7.29185 1.18359 7.17116C1.1986 7.06394 1.22353 6.95836 1.25805 6.85569C1.29692 6.74019 1.35205 6.62994 1.46229 6.40944L2.72612 3.88178C3.00705 3.31993 3.14751 3.039 3.35707 2.83376C3.54239 2.65225 3.76573 2.51421 4.01096 2.42963C4.28825 2.33398 4.60234 2.33398 5.23051 2.33398Z\\\" stroke=\\\"#FFFFFF\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M1.45835 7.00065H3.43117C3.83087 7.00065 4.19627 7.22646 4.37502 7.58398C4.55377 7.94151 4.91917 8.16732 5.31887 8.16732H8.68119C9.08089 8.16732 9.44629 7.94151 9.62502 7.58398C9.80375 7.22646 10.1692 7.00065 10.5689 7.00065H12.5417M5.23051 2.33398H8.7695C9.39769 2.33398 9.71176 2.33398 9.98908 2.42963C10.2343 2.51421 10.4577 2.65225 10.643 2.83376C10.8525 3.039 10.993 3.31993 11.2739 3.88178L12.5377 6.40944C12.648 6.62994 12.7031 6.74019 12.742 6.85569C12.7765 6.95836 12.8014 7.06394 12.8164 7.17116C12.8334 7.29185 12.8334 7.41511 12.8334 7.66162V8.86732C12.8334 9.84743 12.8334 10.3374 12.6426 10.7118C12.4748 11.0411 12.2071 11.3088 11.8779 11.4766C11.5035 11.6673 11.0135 11.6673 10.0334 11.6673H3.96669C2.98659 11.6673 2.49655 11.6673 2.1222 11.4766C1.79292 11.3088 1.5252 11.0411 1.35743 10.7118C1.16669 10.3374 1.16669 9.84743 1.16669 8.86732V7.66162C1.16669 7.41511 1.16669 7.29185 1.18359 7.17116C1.1986 7.06394 1.22353 6.95836 1.25805 6.85569C1.29692 6.74019 1.35205 6.62994 1.46229 6.40944L2.72612 3.88178C3.00705 3.31993 3.14751 3.039 3.35707 2.83376C3.54239 2.65225 3.76573 2.51421 4.01096 2.42963C4.28825 2.33398 4.60234 2.33398 5.23051 2.33398Z\\\" stroke=\\\"#64758B\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\">\\n <path d=\\\"M12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10ZM12 10V5.33333C12 4.97971 11.8595 4.64057 11.6095 4.39053C11.3594 4.14047 11.0203 4 10.6667 4H8.66667M4 6C5.10457 6 6 5.10457 6 4C6 2.89543 5.10457 2 4 2C2.89543 2 2 2.89543 2 4C2 5.10457 2.89543 6 4 6ZM4 6V14\\\" stroke=\\\"#94A3B8\\\" stroke-width=\\\"1.3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" style=\\\"flex-shrink: 0;\\\"><path d=\\\"M5 8.25L7 5.75L9 8.25\\\" stroke=\\\"#64748B\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"></path></svg>\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" style=\\\"flex-shrink: 0;\\\"><path d=\\\"M5 8.5L7 11L9 8.5\\\" stroke=\\\"#64748B\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"></path><path d=\\\"M5 5.5L7 3L9 5.5\\\" stroke=\\\"#64748B\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"></path></svg>\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path fill-rule=\\\"evenodd\\\" clip-rule=\\\"evenodd\\\" d=\\\"M14 7C14 10.866 10.866 14 7 14C3.13401 14 0 10.866 0 7C0 3.13401 3.13401 0 7 0C10.866 0 14 3.13401 14 7ZM5.16768 6.34824C5.25308 6.38493 5.33033 6.43826 5.3949 6.50511L6.3 7.41021L8.6051 5.10511C8.66967 5.03826 8.74691 4.98493 8.83231 4.94824C8.91772 4.91156 9.00957 4.89225 9.10252 4.89144C9.19546 4.89063 9.28764 4.90834 9.37367 4.94354C9.45969 4.97874 9.53785 5.03071 9.60357 5.09644C9.6693 5.16216 9.72128 5.24032 9.75647 5.32635C9.79167 5.41237 9.80938 5.50455 9.80857 5.5975C9.80777 5.69044 9.78846 5.78229 9.75177 5.8677C9.71508 5.9531 9.66176 6.03034 9.5949 6.09491L6.7949 8.89491C6.66363 9.02614 6.48561 9.09986 6.3 9.09986C6.11438 9.09986 5.93637 9.02614 5.8051 8.89491L4.4051 7.49491C4.33824 7.43034 4.28491 7.3531 4.24823 7.2677C4.21154 7.18229 4.19223 7.09044 4.19142 6.9975C4.19061 6.90455 4.20833 6.81237 4.24352 6.72635C4.27872 6.64032 4.3307 6.56216 4.39642 6.49644C4.46215 6.43071 4.5403 6.37874 4.62633 6.34354C4.71236 6.30834 4.80453 6.29063 4.89748 6.29144C4.99042 6.29225 5.08228 6.31156 5.16768 6.34824Z\\\" fill=\\\"#2DBB6D\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<circle cx=\\\"7\\\" cy=\\\"7\\\" r=\\\"6.34375\\\" stroke=\\\"#276CF0\\\" stroke-width=\\\"1.3125\\\"/>\\n<mask id=\\\"path-2-inside-1_910_38979\\\" fill=\\\"white\\\">\\n<path d=\\\"M6.99752 2.15535C8.2828 2.15535 9.51544 2.66592 10.4243 3.57475C11.3331 4.48358 11.8437 5.71622 11.8437 7.0015C11.8437 8.28678 11.3331 9.51942 10.4243 10.4282C9.51544 11.3371 8.2828 11.8477 6.99752 11.8477L6.99752 7.0015L6.99752 2.15535Z\\\"/>\\n</mask>\\n<path d=\\\"M6.99752 2.15535C8.2828 2.15535 9.51544 2.66592 10.4243 3.57475C11.3331 4.48358 11.8437 5.71622 11.8437 7.0015C11.8437 8.28678 11.3331 9.51942 10.4243 10.4282C9.51544 11.3371 8.2828 11.8477 6.99752 11.8477L6.99752 7.0015L6.99752 2.15535Z\\\" fill=\\\"#276CF0\\\" stroke=\\\"#276CF0\\\" stroke-width=\\\"2\\\" mask=\\\"url(#path-2-inside-1_910_38979)\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"18\\\" height=\\\"18\\\" viewBox=\\\"0 0 18 18\\\" fill=\\\"none\\\" style=\\\" \\\"><circle cx=\\\"9\\\" cy=\\\"9\\\" r=\\\"8\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.5\\\" style=\\\" stroke: #E3692C; \\\"/></svg>\"","export default \"<svg width=\\\"11\\\" height=\\\"11\\\" viewBox=\\\"0 0 11 11\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M0.549805 2.29999C0.549805 1.75639 0.549805 1.48459 0.638611 1.27019C0.757022 0.984326 0.984143 0.757205 1.27001 0.638794C1.48441 0.549988 1.75621 0.549988 2.2998 0.549988H8.13314C8.67675 0.549988 8.94852 0.549988 9.16296 0.638794C9.44879 0.757205 9.67594 0.984326 9.79435 1.27019C9.88314 1.48459 9.88314 1.75639 9.88314 2.29999M3.46647 9.88332H6.96647M5.21647 0.549988V9.88332\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M14.0026 2C14.3708 2 14.6693 2.29847 14.6693 2.66667V6.33333C13.7488 6.33333 13.0026 7.07954 13.0026 8.00001C13.0026 8.92047 13.7488 9.66667 14.6693 9.66667V13.3333C14.6693 13.7015 14.3708 14 14.0026 14H2.0026C1.63442 14 1.33594 13.7015 1.33594 13.3333V9.66667C2.25641 9.66667 3.0026 8.92047 3.0026 8.00001C3.0026 7.07954 2.25641 6.33333 1.33594 6.33333V2.66667C1.33594 2.29847 1.63442 2 2.0026 2H14.0026ZM13.336 3.33333H2.66927V5.312L2.7732 5.36605C3.66558 5.85403 4.28279 6.78234 4.33267 7.85881L4.33594 8.00001C4.33594 9.13614 3.70438 10.1247 2.7732 10.6339L2.66927 10.6873V12.6667H13.336V10.6873L13.232 10.6339C12.3396 10.1459 11.7224 9.21767 11.6726 8.14121L11.6693 8.00001C11.6693 6.86387 12.3008 5.87525 13.232 5.36605L13.336 5.312V3.33333Z\\\" fill=\\\"#334155\\\"/>\\n<circle cx=\\\"8\\\" cy=\\\"8\\\" r=\\\"1.5\\\" fill=\\\"#334155\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M1.16699 7C1.16699 5.067 2.73399 3.5 4.66699 3.5H9.33366C11.2667 3.5 12.8337 5.067 12.8337 7C12.8337 8.93299 11.2667 10.5 9.33366 10.5H4.66699C2.73399 10.5 1.16699 8.93299 1.16699 7Z\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n<path d=\\\"M4.66634 8.45835C5.47176 8.45835 6.12467 7.80543 6.12467 7.00002C6.12467 6.19461 5.47176 5.54169 4.66634 5.54169C3.86093 5.54169 3.20801 6.19461 3.20801 7.00002C3.20801 7.80543 3.86093 8.45835 4.66634 8.45835Z\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg\\n width=\\\"16\\\"\\n height=\\\"16\\\"\\n viewBox=\\\"0 0 24 24\\\"\\n fill=\\\"none\\\"\\n xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n aria-hidden=\\\"true\\\"\\n>\\n <path\\n d=\\\"M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6M10 11v6M14 11v6\\\"\\n stroke=\\\"currentColor\\\"\\n strokeWidth=\\\"1.5\\\"\\n strokeLinecap=\\\"round\\\"\\n strokeLinejoin=\\\"round\\\"\\n />\\n</svg>\"","export default \"<svg width=\\\"11\\\" height=\\\"12\\\" viewBox=\\\"0 0 11 12\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M9.88314 11.05C9.88314 10.2359 9.88314 9.8289 9.78269 9.49768C9.55647 8.75195 8.97285 8.16832 8.22711 7.9421C7.8959 7.84165 7.48891 7.84165 6.67481 7.84165H3.75814C2.94406 7.84165 2.53702 7.84165 2.20581 7.9421C1.46007 8.16832 0.876495 8.75195 0.650278 9.49768C0.549805 9.8289 0.549805 10.2359 0.549805 11.05M7.84147 3.17499C7.84147 4.62473 6.66623 5.79999 5.21647 5.79999C3.76672 5.79999 2.59147 4.62473 2.59147 3.17499C2.59147 1.72524 3.76672 0.549988 5.21647 0.549988C6.66623 0.549988 7.84147 1.72524 7.84147 3.17499Z\\\" stroke=\\\"#334155\\\" stroke-width=\\\"1.1\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"12\\\" height=\\\"12\\\" viewBox=\\\"0 0 12 12\\\" fill=\\\"none\\\">\\n <path d=\\\"M6 0L4.9425 1.0575L9.1275 5.25H0V6.75H9.1275L4.9425 10.9425L6 12L12 6L6 0Z\\\" fill=\\\"currentColor\\\"/>\\n</svg>\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<rect width=\\\"14\\\" height=\\\"14\\\" fill=\\\"white\\\" fill-opacity=\\\"0.01\\\"/>\\n<path fill-rule=\\\"evenodd\\\" clip-rule=\\\"evenodd\\\" d=\\\"M6.45397 2.89706C6.75497 2.3289 7.24614 2.32656 7.54831 2.89706L11.704 10.7476C12.005 11.3157 11.7302 11.7806 11.0874 11.7806H2.91489C2.27206 11.7806 1.99614 11.3181 2.29831 10.7476L6.45397 2.89706ZM6.58866 8.57879C6.69806 8.68819 6.84643 8.74965 7.00114 8.74965C7.15585 8.74965 7.30422 8.68819 7.41362 8.57879C7.52302 8.46939 7.58447 8.32102 7.58447 8.16631V5.24965C7.58447 5.09494 7.52302 4.94656 7.41362 4.83717C7.30422 4.72777 7.15585 4.66631 7.00114 4.66631C6.84643 4.66631 6.69806 4.72777 6.58866 4.83717C6.47927 4.94656 6.41781 5.09494 6.41781 5.24965V8.16631C6.41781 8.32102 6.47927 8.46939 6.58866 8.57879ZM6.58866 10.3288C6.69806 10.4382 6.84643 10.4996 7.00114 10.4996C7.15585 10.4996 7.30422 10.4382 7.41362 10.3288C7.52302 10.2194 7.58447 10.071 7.58447 9.91631C7.58447 9.7616 7.52302 9.61323 7.41362 9.50383C7.30422 9.39444 7.15585 9.33298 7.00114 9.33298C6.84643 9.33298 6.69806 9.39444 6.58866 9.50383C6.47927 9.61323 6.41781 9.7616 6.41781 9.91631C6.41781 10.071 6.47927 10.2194 6.58866 10.3288Z\\\" fill=\\\"#E3692C\\\"/>\\n</svg>\\n\"","export default \"<svg width=\\\"14\\\" height=\\\"14\\\" viewBox=\\\"0 0 14 14\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M7 0C3.13406 0 0 3.13406 0 7C0 8.27186 0.339306 9.46458 0.932167 10.4924L0 14L3.6365 13.1404C4.63478 13.6883 5.78083 14 7 14C10.8659 14 14 10.8659 14 7C14 3.13406 10.8659 0 7 0ZM7 12.7462C5.83003 12.7462 4.74192 12.3966 3.83406 11.796L1.68564 12.3431L2.28822 10.2896C1.63625 9.35764 1.25378 8.22344 1.25378 6.99981C1.25378 3.82628 3.82647 1.25358 7 1.25358C10.1735 1.25358 12.7462 3.82628 12.7462 6.99981C12.7462 10.1733 10.1735 12.746 7 12.746V12.7462Z\\\" fill=\\\"#475569\\\"/>\\n<path d=\\\"M8.64015 7.92402L10.3338 8.7224C10.4115 8.75896 10.4613 8.8379 10.4543 8.92346C10.436 9.14629 10.3466 9.59293 9.94623 9.99329C8.81612 11.1234 6.7867 9.84474 6.70407 9.79535C6.20493 9.52721 5.73068 9.16846 5.28093 8.7189C4.83137 8.26935 4.47243 7.7949 4.20429 7.29577C4.1547 7.21332 2.87604 5.1839 4.00634 4.0536C4.4067 3.65324 4.85334 3.56379 5.07618 3.54552C5.16193 3.53852 5.24068 3.58829 5.27723 3.66607L6.07582 5.35968C6.11354 5.43979 6.09701 5.53507 6.0344 5.59768L5.4392 6.19288C5.31048 6.3216 5.27276 6.52207 5.36143 6.68113C5.57862 7.0706 5.87068 7.44568 6.20901 7.79082C6.55415 8.12915 6.92923 8.4214 7.3187 8.6384C7.47776 8.72707 7.67804 8.68935 7.80695 8.56063L8.40215 7.96543C8.46476 7.90282 8.56004 7.8861 8.64015 7.92402Z\\\" fill=\\\"#475569\\\"/>\\n</svg>\\n\""],"names":["HUITheme","KitThemeProvider","HiverThemeProviderUnStyled","HUIThemeContext","createContext","HUIThemeProvider","children","theme","mode","darkAuto","jsx","TabsComponent","Tabs$1","stripSx","TabItem$1","Tab$1","Tabs","props","value","onTabChange","items","className","jsxs","event","index","t","idx","VARIANTS$1","SIZES$2","ButtonComponent","Button$1","Button","label","variant","color","size","disabled","onClick","icon","isTextStyled","baseVariant","v2Variant","SIZES$1","IconButtonComponent$1","IconButton$1","IconButton","image","alt","iconWrapperClassName","iconClassName","style","edge","ariaLabel","ariaLabelAlt","outlined","text","raised","effectiveAriaLabel","renderContent","SIZES","InputComponent","Input","renderIcon$1","TextField","onChange","placeholder","type","name","id","autoFocus","required","error","helperText","fullWidth","iconPosition","extraProps","adornment","TONES$1","mapPosition","position","ToastComponent","Toast$1","nextKey","Toast","forwardRef","ref","message","setMessage","useState","push","useCallback","next","useImperativeHandle","severity","life","closable","options","handleClose","_event","reason","MAX_WIDTHS","ModalContainer","Modal","ModalBody","ModalFooter","BoxComponent","Box","TypographyComponent$1","Typography$1","IconButtonComponent","Dialog","maskClassName","open","onClose","maxWidth","fullScreen","disableEscapeKeyDown","title","footer","onBack","showBackButton","showCloseButton","handleBack","handleCloseButton","width","renderHeader","ArrowLeft","XClose","BreadcrumbsComponent","Breadcrumbs","SLOT_PROPS","iconLabelSx","renderIcon","Breadcrumb","item","AvatarComponent","Avatar$1","Avatar","rest","TableRoot","Table","hasExplicitWidth","columns","col","TableContainer","scrollSx","scrollable","scrollHeight","TableHeader","TableBody","TableRow","HeaderCell","BodyCell","BODY_CELL_SX","CELL_LABEL_SLOT","DATATABLE_CLASS","HEADER_CELL_CLASS","ROW_CLASS","CELL_CLASS","join","parts","cellPresentation","Column","flattenElements","Children","isValidElement","child","Fragment","isColumnElement","columnsFromChildren","elements","field","header","DataTable","tableStyle","rowsPerPageProp","paginator","rowsPerPageOptions","onRowClick","emptyMessage","containerSx","page","setPage","rowsPerPage","setRowsPerPage","handleChangePage","newPage","handleChangeRowsPerPage","paginatedData","resolvedColumns","row","rowIndex","e","cellValue","cellContent","TablePagination","DropdownField","Dropdown","DropdownMenu","PopoverComponent","Popover","OPEN_KEYS","DropdownSurface","panelClassName","appendTo","onShow","onHide","fieldRef","useRef","anchor","setAnchor","triggerWidth","setTriggerWidth","show","trigger","close","Fragment$1","optionKey","indexOfOptionValue","optionValue","option","warnOnDuplicateOptionValues","component","seen","isOptionDisabled","optionDisabled","ListItem$1","Select","optionLabel","invalid","itemTemplate","valueTemplate","panelFooterTemplate","selectedIndex","selectedOption","select","nextValue","display","UNMATCHED_PREFIX","ListItem","TagComponent","Tag","MultiSelect","optionsByKey","unmatchedByKey","selectedKeys","selected","optionIndex","key","valueForKey","labelFor","emit","nextKeys","originalEvent","toggle","selectedKey","handleRemove","summary","checked","TextareaComponent","Textarea","defaultValue","rows","autoResize","maxLength","onBlur","onFocus","InputText","popperPaperSx","popperSx","OpenPickerIcon","Calendar","PICKER_COMPONENTS","MIN_TIME","MAX_TIME","DateField","readOnly","onValidityChange","dateValue","LocalizationProvider","AdapterMoment","DesktopDatePicker","time","valid","inputRef","InputProps","inputProps","params","CrmSelect","mapKey","errorMessage","optionsMap","handleChange","hasError","ToolbarComponent","Toolbar","badge","supportingText","actions","SearchComponent","Search","onClear","useRenderConfigStore","create","set","callbacks","config","isComposeEnabled","features","state","metaData","icons","Import$1","m","account_friction$1","account_sentiment$1","buildings$1","calendar$1","cfConfig$1","chev_arrow_right$1","chevron$1","close$1","compose_mail$1","contacts$1","contacts_dark$1","conversation$1","csv_icon$1","customers$1","details$1","download$1","drag_icon$1","edit$1","email$1","error$1","expand_more$1","external_link$1","field_boolean$1","field_date$1","field_dropdown$1","field_number$1","field_url$1","filter$1","google$1","green_tick$1","inbox$1","inbox_tooltip$1","info$1","alert_triangle_filled$1","check$1","factor_csat$1","factor_escalation$1","factor_friction$1","factor_query$1","factor_sentiment$1","health_plus$1","sentiment_face_negative$1","sentiment_face_neutral$1","sentiment_face_positive$1","thumb_down_filled$1","thumb_up$1","thumb_up_filled$1","trend_arrow$1","kebab$1","message$1","phone$1","plus$1","rounded_arrow_down$1","settings$1","slack$1","sm_contacts$1","sm_inboxes_light$1","sm_inboxs$1","sm_slider$1","sort_asc$1","statusResolved$1","statusSnoozed$1","status_open$1","text_icon$1","ticket$1","vector_right$1","warning_icon$1","whatsapp$1","strokeWidths","DARK_ICON_MAP","NEUTRAL_FILL_PATTERN","Icon","folder","fill","svgContent","setSvgContent","isDark","useEffect","basePath","loader","raw","sizeStr","themedColor","stroke","strokeWidth","processed","_","attrs","newAttrs","_match","rectAttrs","generateStringHash","str","hash","i","colorOptions","darkColorOptions","avatarColorKeys","getColorKeyForLabel","getColorForLabel","palette","sizeConfig","v2AvatarColors","removeEmoji","getAvatarInitials","nameToUse","letterCount","part","labelName","useMemo","colorLabel","colorKey","assignedColor","sizeStyles","Tooltip","content","triggerClassName","tooltipClassName","zIndex","offset","offsetX","positionX","isHovered","setIsHovered","triggerRef","tooltipRef","timeoutIdRef","globalMountElement","triggerRect","tooltipRect","viewportWidth","viewportHeight","leftOffset","tooltipOffset","left","top","onMouseEnter","onMouseLeave","createPortal","TruncatedText","isTruncated","setIsTruncated","tooltipText","setTooltipText","containerRef","React","checkTruncation","checkElement","truncateElement","truncated","actualText","timeoutId","setRef","node","element","hasTruncate","hasBlockDisplay","displayClass","finalClassName","cn","classes","classNames","Glyph","common","COOKIES_STORAGE","appCookies","Cookies","getAuthCookies","getSessionCookies","TIER_1_FALLBACKS","TIER_3_REQUIRED_FIELDS","TIER_3_COMPANY_ONLY_FIELDS","requiredFieldsFor","route","isPlainObject","normaliseConversationRow","path","normalised","resolve","normaliseConversationRows","ENDPOINT_GROUPS","GROUP_A_COLLECTION_KEY","isTemplateSegment","segment","toSegments","matchesTemplate","template","templateSegments","pathSegments","specificity","matchingTemplates","matches","mostSpecific","classifyPath","groupACollectionKey","match","isEnveloped","body","isBarePage","wrap","data","mapGroupA","collectionKey","results","total_results","page_number","warnFallthrough","group","status","isJsonContentType","contentType","normaliseBody","method","toTransportParams","serialised","createHostAdapter","transport","transportParams","hostResponse","cause","isAxiosError","AxiosError","response","apiClient","axios","storeConfig","hostTransport","authCookie","authData","sessionCookie","readHeader","headers","bag","entry","isAuthError","responseStatus","updatePrimaryContact","conversationId","searchIcon","useRenderConfig","ENDPOINTS","getContacts","getContactsWithFilters","getContactSummary","contactId","getContactConversations","getContactActivity","updateContact","apiResponse","createContact","searchContactsByEmails","emails","paramsSerializer","searchParams","email","useContactsStore","get","currentState","total","page_size","nextPage","existingContacts","newContacts","currentData","existingConversations","newConversations","updates","updatedContacts","contact","emailsToSearch","emailToNameMap","displayName","kebabIcon","GAINSIGHT_EVENTS","PrimaryContactsDialog","conversationMembers","onSuccess","showEditPrimaryContact","updateContactSummary","fetchContactSummary","summaries","dialogOpen","setDialogOpen","dialogState","setDialogState","searchValue","setSearchValue","selectedContact","setSelectedContact","isLoading","setIsLoading","isChangePrimaryContactOpen","setIsChangePrimaryContactOpen","searchedEmailsRef","hasMissingNames","member","emailsToFetch","handleClick","handleKebabClick","prev","currentPrimaryEmail","filteredContacts","handleContactSelect","handleChangePrimaryContact","newContactId","newContactName","newContactEmail","currentSummary","ContactItem","onSelect","indiaGateIcon","CDN_ASSETS_HOSTED_URL","CDN_ASSETS","EmptyState","subcopy","iconContent","contentClassName","iconSrc","resolvedIconContent","Loader","slackIcon","whatsappIcon","sharedMailboxLightIcon","SLATE_ICON_SUBTLE","CHARCOAL_ICON_SECONDARY","useConversationIconColor","statusConfig","conversationBoxsizeConfig","ChatIcon","iconSize","EnvelopeIcon","SlackIcon","WhatsAppIcon","TicketIcon","VoiceIcon","SharedMailboxIcon","SharedMailboxLightIcon","StatusIcon","SvgOpenInANewTab","generateRandomString","minLength","length","chars","result","generateRandomDate","now","oneYearAgo","oneDayAgo","randomTime","randomDate","month","day","hours","minutes","ampm","formattedHours","formatDuration","seconds","mins","secs","formatVoiceHeading","voice","direction","Divider","dividerHeight","ConversationBox","hasAccess","senderName","timestamp","messagePreview","heading","mailboxName","assignedAgent","smDetails","issueType","permaLink","conversation","statusInfo","displayData","displaySmDetails","firstSmDetail","remainingCount","remainingSmDetails","isClickable","blurSpaceMeta","handleActionClick","handleCardClick","cardContent","OpenInANewTabIcon","smDetail","ConversationBoxShimmer","paddingClass","NoDataImage","NoDataTransparentImage","NoDataFound","description","defaultImage","NoConversationImage","getCompanies","getCompaniesWithFilters","filterBy","getCompanySummary","companyId","getCompanyConversations","useCompaniesStore","existingCompanies","newCompanies","existingResults","newResults","FEATURES","is24HourTimeFormat","formatTimestamp","isoString","is24Hour","normalizedString","date","paddedHours","epochMillisToDateView","epochMillis","year","CONTACT_CHANNEL_TYPE","isSpaceChannelContact","channelType","UNKNOWN_CONTACT_NAME","isBlankName","formatValue","formatContactName","formatVoiceSenderName","formatFileSize","bytes","isVoiceEnabled","isSlackCustomerModuleEnabled","mapVoiceDetails","mapChannelToType","channel","inboxType","hasVoice","normalizedChannel","mapConversationToBoxProps","voiceEnabled","isVoiceConversation","lastSmDetail","resolveSignalConversationToken","permalink","resolveSignalAssigneeName","assignee","mapSignalConversationToBoxProps","detail","mapCompanyConversationToBoxProps","timestampValue","useIntersectionObserver","rootElement","onIntersect","threshold","shouldUnobserve","enabled","sentinelElement","sentinelRef","observerRef","onIntersectRef","shouldUnobserveRef","root","sentinel","shouldCleanupSentinel","retryTimeout","retrySentinel","targetElement","possibleContainers","observer","entries","hasTriggered","handleScroll","scrollTop","clientHeight","distanceFromBottom","disconnect","useConversationInfiniteScroll","wrapperRef","conversationItems","hasMorePages","scrollContainerRef","shimmerRef","scrollableElement","setScrollableElement","shimmerElement","setShimmerElement","isLoadingMore","setIsLoadingMore","findScrollableElement","preferOverflowing","hasOverflow","isOverflowing","current","parentStyle","parentHasOverflow","parentIsOverflowing","shimmerElements","lastShimmer","lastChild","handleIntersect","container","shimmerRect","containerRect","ConversationList","entityType","entityId","entityName","isContact","contacts","companies","contactData","companyData","conversationsData","fetchConversations","fetchNextPage","mappedConversations","shimmerBoxes","textFieldIcon","dateFieldIcon","numberFieldIcon","urlFieldIcon","booleanFieldIcon","dropdownFieldIcon","ENTITY_TYPES","SCOPES","CF_TYPES","CF_SOURCES","CF_TYPE_OPTIONS","INIT_DATA","BOOLEAN_OPTIONS","ContactPanel","initialContactId","setContactId","isHeaderHovered","setIsHeaderHovered","summaryLoading","summaryLoadingState","contactName","contactEmail","contactPhone","accountName","customFieldsRefCb","ContactDetailRow","AccountPanel","accountId","fetchCompanySummary","domain","contactCount","AccountDetailRow","RightPanel","ContactsTabs","activeTab","setActiveTab","tabItems","contactIdNum","accountIdNum","globalMountStyle","GlobalMount","setMeta","refCallback","HEALTH_FACTOR_META","HEALTH_INFO_FACTOR_ORDER","FEEDBACK_REASONS","HEALTH_STATUS_CHIP","DEFAULT_SENTIMENT_WINDOW","SENTIMENT_LABEL_COLORS","SENTIMENT_LABEL_FALLBACK_COLOR","HEALTH_INFO_TITLE","HEALTH_INFO_INTRO","insightsUrl","capitalize","normalizeDetailed","sentiment","health","feedbackUrl","getDetailedInsights","windowDays","getSignalConversations","pageSize","url","getHealthFeedback","postHealthFeedback","useInsightsStore","days","insights","insufficient","previous","optimistic","returned","reverted","HealthContributorRow","contributor","surface","openSignalModal","meta","highlight","highlightIndex","PANEL_WIDTH","VIEWPORT_GUTTER","HealthInfoPopover","setOpen","setPosition","panelRef","onPointerDown","target","onKeyDown","rect","factor","PrimeButton","KitTextarea","ButtonLabel","FeedbackReasonForm","submitting","initialReason","initialText","onCancel","onSubmit","setReason","setText","code","trimmed","SvgThumbUp","SvgThumbUpFilled","SvgThumbDown","SvgThumbDownFilled","thumbButtonClass","HealthFeedbackRow","healthBadge","feedback","submitFeedback","showReasonForm","setShowReasonForm","vote","submit","ok","onThumbUp","isNewPositiveVote","onThumbDown","onReasonSubmit","reasonCode","reasonText","ThumbUpFilledIcon","ThumbUpIcon","ThumbDownFilledIcon","ThumbDownIcon","SvgHealthPlus","SvgAlertTriangleFilled","AccountHealthSection","contributors","HealthPlusIcon","AlertTriangleFilledIcon","SvgSentimentSmiley","AccountSentimentSection","showSignalLink","signalLinkAtBottom","selectedDays","windowCache","loading","active","labelColor","SentimentSmileyIcon","AccountHealthSkeleton","PAGE_SIZE","SignalConversationsModal","setItems","setTotal","setLoading","failed","setFailed","pageRef","scrollRef","dialogRef","subtitleRef","subtitleExpanded","setSubtitleExpanded","subtitleOverflows","setSubtitleOverflows","el","inFlightRef","requestSeqRef","hasMore","loadNextPage","seq","previouslyFocused","onTrapKeyDown","dialog","focusables","first","last","scrollStateRef","loadNextPageRef","more","hasFailed","factorMeta","CustomerIntelligencePanel","trackDetailOpened","includeGlobalMount","showInsufficientEmptyState","sectionsLayout","detailed","errored","fetchInsights","fetchFeedback","detailOpenedFired","hasSeenLoadingRef","signalCount","cellClass","search","useFeature","feature","Layout","isSearchDialogOpen","setIsSearchDialogOpen","location","useLocation","isRootRoute","isCustomFieldsEnabled","mainStyle","updateHeight","height","IconBase","strokeAttrs","Arrange","SvgHiverLogo","BRAND_FILL","BRAND_STROKE","STROKE_WIDTH","PANEL_RADIUS","BRIEFCASE_D","USER_D","USER_FILL_D","BrandGlyph","entity","isCompany","ROOT_CLASS","NAV_ITEMS","SideNav","navigate","useNavigate","dismissed","setDismissed","handleDismiss","CF_ENTITY_PATH","cfEntity","activePath","activeIndex","isActive","HiverLogo","KitBreadcrumb","useBreadcrumb","companiesData","companiesSummaries","contactsData","contactsSummaries","getAccountName","account","acc","getContactName","cont","BreadcrumbsSection","breadcrumbItems","CustomersLayout","isDetailsPage","Header","Outlet","useTableInfiniteScroll","tableData","found","retryCount","maxRetries","retryDelay","tryFindScrollable","tryFindShimmer","tbody","lastRow","LoadErrorState","entityLabel","onRetry","SvgSentimentFacePositive","SvgSentimentFaceNegative","SvgSentimentFaceNeutral","SENTIMENT_META","PositiveFaceIcon","NeutralFaceIcon","NegativeFaceIcon","AccountSentimentCell","AccountHealthIndicator","ShimmerCell","NameCell","DomainCell","BASE_COLUMNS","ACCOUNT_SENTIMENT_COLUMN","AccountTable","ciEnabled","errorStatus","fetchCompanies","isInitialFetch","setIsInitialFetch","company","shimmerRows","showEmptyState","handleRetry","handleAccountClick","hasRows","useFiltersStore","filters","defaultSelectTargetNode","useIntersectObserver","callback","selectTargetNode","rootMargin","callbackRef","selectTargetNodeRef","targetNodeRef","parentNodeRef","startObserving","isParent","currentObserver","unobserve","parentCbRef","targetCbRef","useDelayedState","delay","delayed","setDelayed","getCFApiCallback","getCFConfigs","entity_type","scope","cfApiCallback","__BASE_QUERIES","QUERIES","useCFList","queryClient","useQueryClient","useQuery","getExcludedDomainsList","updateDomainsList","domains","deleteDomain","queryParams","useExcludedDomains","Drawer","showOverlay","closeOnOverlayClick","handleContainerClick","handleOverlayClick","getPanelClasses","SvgDownload","FilterGlyph","FilterFunnel01","ColumnsGlyph","Columns03","FieldsConfigGlyph","Rows03","SettingsGlyph","Settings01","DownloadGlyph","Download01","TabSettingsGlyph","TabActivityGlyph","Activity","SearchGlyph","SearchMd","DragHandleGlyph","DeleteGlyph","Trash01","InfoGlyph","InfoCircle","UploadGlyph","UploadCloud01","PlusGlyph","Plus","CloseGlyph","SortNeutralGlyph","ChevronSelectorVertical","SortAscGlyph","ChevronUp","SortDescGlyph","ChevronDown","DrawerHeader","titleClassName","Counter","max","hidden","valueLength","counter","HiverTextField","ScopedStyles","hoverBg","highlightBg","itemText","KitSelect","KitDateField","CFDateField","Chip","onRemove","ChipField","inputValue","setInputValue","isFocused","setIsFocused","commitChip","removeChip","handleKeyDown","handleBlur","chip","PHONE_VALIDATION_ERROR","sanitizePhoneInput","allowed","digitsOnly","validatePhoneNumber","PHONE_NAV_KEYS","handlePhoneFieldKeyDownCapture","input","start","end","isEmpty","primitiveTypes","hasChanged","stringListChanged","objectListChanged","keysToCheck","obj1","obj2","getValidationError","validations","optionsValidation","dateValidation","EMAIL_REGEX","emailValidation","DOMAIN_REGEX","checkDomain","withValue","domainValidation","valueError","getDomainsListValidation","excludedList","excluded","LABELS","CRM_SYNCED_FIELD_TOOLTIP","COMPANY_FORM_FIELDS","CONTACT_FORM_FIELDS","ENTITY_FORM_FIELDS","ENTITY_FIELD_KEYS","companyColumns","contactColumns","ENTITY_DEFAULT_COLUMNS","createFormStore","initialData","createStore","changed","values","errors","touched","FormContext","useFormStore","selector","store","useContext","useStore","FormProvider","storeRef","debounce","timeout","fn","hasSavedValue","FormField","info","disabledTooltip","checkDiff","validateOnMount","renderField","validatedRef","debouncedValidate","initValue","setChange","setTouch","setError","setDiff","isTouched","validate","onError","isRequired","DrawerFooter","PrimaryButton","SecondaryButton","useFormActions","formData","setErrors","Footer","isEdit","TYPE","saveLabel","EntityFormProvider","getCrmConfigs","getCrmFields","provider","f","updateCrmSyncConfig","payload","createCrmSyncConfig","updateFieldMappings","crmProvider","disconnectCrm","getCrmSyncRuns","getCrmSyncRunFailureFileUrl","syncRunId","getCrmSyncStatus","triggerSync","syncMode","CRM_CONFIGS_QUERY_KEY","useCrmConfigs","CRM_LOCKED_BASE_FIELDS","getCrmDisabledFieldNames","configs","syncedKey","connectedConfigs","mappedCfIds","mapping","getPlaceholder","display_name","getDropdownPayload","replaceParams","p1","createEditCompany","endpoint","useApiToasts","toastMessage","useCompanyMutate","showSuccessToast","showErrorToast","useMutation","errorData","createEditContact","useContactMutate","getCreatePayload","fieldKeys","extractData","getFilterPayload","getFilterValue","getEntityName","NumberField","number","CreateEditEntity","delayedOpen","RootCreateEditEntity","editDisabledFields","crmConfigs","forcedDisabledFields","crmDisableMessage","connectorName","capitalisedName","defaultFormFields","cfList","excludedDomains","fieldErrors","companyApiProps","contactApiProps","apiProps","isPending","formFields","baseDisabledFields","crmDisabledFieldNames","disabledFieldNames","existingFields","cfFields","cf","handleSubmit","headerTitle","domainKey","domainsListValidation","ROUTES","LIST_TAB_PARAM","ACCOUNT_LIST_TABS","ToolbarIconButton","tooltip","CFConfigButton","ExcludeListInput","maxItems","addLabel","onAdd","setValue","refValue","handleAdd","validationError","ExcludeListItem","removeAriaLabel","ExcludeListCard","hasItems","useUpdateDomains","useRemoveDomain","useExcludeList","refetchList","updateDomains","isUpdating","removeDomain","isRemoving","update","DEFAULT_MAX_DOMAINS","DRAWER_WIDTH","COPY","ExcludeDomainsDrawer","maxDomains","add","remove","SettingsButton","SvgGreenTick","SvgChevArrowRightLight","TabButton","TabBar","IMPORT_STATUS","initialState","useImportCSVStore","file","jobId","uploadProgress","validationResult","validationErrorDetail","downloadSampleCSV","mintPresignedUploadUrl","validateImportJob","commitImportJob","getImportJobs","getImportJobFailureFileUrl","uploadFileToS3","uploadUrl","onProgress","reject","xhr","usePresignedUpload","useS3Upload","isValidateErrorDetail","useValidateImport","useCommitImport","useImportCSVFlow","setFile","setJobId","setUploadProgress","setStatus","setValidationResult","setValidationErrorDetail","showToast","validateImport","err","uploadToS3","pct","mintUploadUrl","startUpload","startCommit","commit","msg","SvgCsvIcon","ProgressBar","trackColor","animated","clamped","DropZone","selectedFile","onFileSelect","isDragging","setIsDragging","fileInputRef","handleDrop","CSVIcon","GreenCheckIcon","AmberInfoIcon","RedWarningIcon","VARIANTS","ValidationResultPanel","isExpanded","setIsExpanded","isValidated","columnsToSkip","hasColumnsToSkip","missingMandatory","expandedContent","styles","isExpandable","ChevronIcon","getImportLabel","ImportCSVFooter","onImport","UploadTab","isDownloadingSample","setIsDownloadingSample","reset","handleFileSelect","handleImport","handleDownloadSample","blob","a","entityFields","SvgWarningIcon","SvgExpandMore","SvgInProgress","SvgErroricon","FALLBACK_CONFIG","STATUS_CONFIG","GreenTickIcon","WarningIcon","ErrorIcon","InProgressIcon","ts","ActivityItem","expanded","setExpanded","ExpandIcon","PaginationControls","totalPages","hasNextPage","isFetching","onPageChange","prevDisabled","nextDisabled","Shimmer","DefaultEmptyState","ActivityLog","emptyState","pagination","useImportJobHistory","formatRowCount","count","buildDescription","job","filename","succeeded","mapJobToActivityItem","renderFailureDetails","hasFailures","isFullFailure","isTerminalWithFailures","FailureFileDownloader","isDownloading","setIsDownloading","res","DownloadIcon","ActivityTab","isError","isPageMismatch","effectiveLoading","j","handlePageChange","ImportCSVDrawer","isActivityEnabled","Upload01","closeIcon","SvgVectorRight","StepProgress","percent","pinCreateOption","createOption","valueKey","useDropdownPortal","KitCrmSelect","TYPE_ICONS","FieldTypeIcon","SearchableDropdown","triggerLabel","getItemKey","isItemDisabled","filterItem","renderItem","getItemTooltip","searchPlaceholder","dropdownWidth","dropdownHeight","isOpen","setIsOpen","setSearch","dropdownRef","updatePosition","useLayoutEffect","handleMouseDown","filtered","handleTrigger","handleSelect","itemContent","tooltipContent","button","SvgError","HiverFieldItem","inner","InfoIcon","SyncSectionHeader","crmName","SyncStartedView","fieldsMapped","newFieldsCreated","SALESFORCE_TYPE","HUBSPOT_TYPE","CRM_PROVIDER_TYPES","NEW_FIELD_TYPES","FieldTypeOption","hideError","CreateNewFieldPanel","fieldTypeErrorMessage","getFieldTypeErrorMessage","onNameChange","onFieldTypeChange","onCreate","fieldTypeOptions","opt","TYPE_DISPLAY_LABELS","processHiverCFs","entityData","getDefaultHiverFieldKey","defaultHiverField","hiverOptions","normalizedDefault","formatDefaultHiverFieldLabel","word","buildFieldRows","fields","applyExistingMappings","allFields","c","entityMappings","initialKeys","r","mappingsByKey","updatedRows","extraRows","applyDefaultHiverFieldMappings","defaultFieldKey","useFieldMappingData","mappingsOverride","setMappingsOverride","hiverOptionsOverride","setHiverOptionsOverride","query","configsRes","fieldsRes","hiverCFRes","processedHiverOptions","dataKey","baseMappings","baseHiverOptions","mappings","crmFields","setMappings","updater","currentOverride","currentValue","setHiverOptions","dateTimeFormatter","DATE_FORMATTER","ENTITY_LABELS","formatDateTime","isoDate","formatDate","getEntityLabel","getLastSyncedLabel","timestamps","latestTimestamp","latest","getConnectedSinceLabel","getEntityRows","createCF","useCreateMappedCustomField","fieldType","createdField","useSaveFieldMappingsAndTriggerSync","fieldMappings","FieldMappingStep","onExit","onSync","crmLogo","creatingField","setCreatingField","syncStarted","setSyncStarted","isSyncing","setIsSyncing","syncError","setSyncError","syncStats","setSyncStats","createMappedCustomFieldMutation","saveFieldMappingsMutation","newFieldsCreatedRef","nextIdRef","getTypeMismatchMessage","hiverFieldType","crmTypeLabel","hiverTypeLabel","getSelectedTypeMismatchMessage","getNewFieldTypeMismatchMessage","normalizedFieldType","getRowOptions","usedKeys","k","getAutoCreatedHiverField","selectedValue","renderAutoCreatedHiverFieldValue","updateHiverField","hiverFieldKey","handleHiverFieldChange","handleCreateField","rowId","newOptions","newField","handleSyncNow","cancelCreateField","removeRow","addRowFromField","getTypePath","o","typePath","creating","isAutoCreated","autoCreatedHiverField","mismatchMessage","hasMismatch","hasRowDivider","newFieldTypeMismatchMessage","typeLabel","ArrowRightIcon","isDisabled","unwrapResponse","getConnectorCallback","getEnabledConnectors","getConnectorTemplates","getConnectorTemplateById","cb","postConnectorAuth","templateId","authDetails","variables","source","authType","clientId","clientSecret","scopes","authEndpointUrl","tokenEndpointUrl","refreshTokenUrl","keyName","prefix","authPath","getConnectorStatus","connectorId","POLL_INTERVAL_MS","useConnectorStatus","ENABLED_CONNECTORS_QUERY_KEY","useEnabledConnectors","hasCallback","s","useActivateCrmConfig","crmType","ciConnectorId","hasExistingConfig","useStartConnectorAuth","loginAction","findLoginConnector","connectors","connector","useCrmLoginAction","templates","CrmConnectStep","onLogin","logo","illustration","prerequisites","phase","setPhase","setConnectorId","setErrorMessage","loginActionQuery","activateCrmConfigMutation","startConnectorAuthMutation","loginActionRef","configRef","onLoginRef","oauthWindowRef","isUpdatingConfigRef","statusData","activateCrmConfig","closeOAuthWindow","oauthWindow","interval","timer","handleLoginClick","instanceId","authorizationUrl","isChecking","isSuccess","shouldCreateConfigFromAuthenticatedConnector","getButtonText","CrmConnectDrawer","crmIllustration","crmDescription","crmPrerequisites","initialStep","step","setStep","useTriggerCrmSync","useDisconnectCrm","retainData","DATA_OPTIONS","DataOptionCard","isSelected","DisconnectCrmModal","onConfirm","choice","setChoice","handleConfirm","ENTITY_ICONS","Briefcase02","User01","EntityRow","isSynced","syncedLabel","unsyncedDescription","ObjectImportSection","entityRows","onSyncEntity","ManualSyncSection","lastSyncedLabel","isManualSyncing","isManualSyncDisabled","onManualSync","ConnectionSection","connectedSince","isDisconnecting","onDisconnect","SettingsTab","crmConfig","actionError","useCrmSyncRuns","afterId","ENTITY_LABEL","mapSyncRunToActivityItem","run","cursors","setCursors","afterCursor","nextCursor","updated","runs","syncRun","DEFAULT_BASE_INTERVAL_MS","DEFAULT_MAX_INTERVAL_MS","DEFAULT_BACKOFF_FACTOR","isRunning","useCrmSyncStatus","baseInterval","maxInterval","backoffFactor","q","poll","syncingByEntity","map","useCrmSyncStatusRefetch","CrmSettingsDrawer","fieldMappingEntity","setFieldMappingEntity","setIsManualSyncing","setIsDisconnecting","showDisconnectModal","setShowDisconnectModal","setActionError","refetchConfigs","refetchStatus","triggerCrmSyncMutation","disconnectCrmMutation","useCrmSyncStore","isSalesforceConnected","isHubspotConnected","findConnectorForConfig","resolveConnection","ugAuthenticated","configActive","useCrmConnections","setConnectedStatuses","connectorsQuery","configsQuery","connectionsByType","salesforce","hubspot","SvgHubspot","SvgSalesforce","CRM_PROVIDER_CONFIGS","SalesforceLogo","HubspotDropdownLogo","ConnectedBadge","PendingAuthBadge","DisconnectingBadge","SyncingBadge","StatusBadge","getCrmDisabledTooltip","lockingCrmName","syncing","DropdownItem","ImportSyncDropdown","isM3Enabled","crmConnections","csvDrawerOpen","setCsvDrawerOpen","openCrmType","setOpenCrmType","contactSyncing","companySyncing","entitySyncing","syncEntityNoun","syncingProvider","handleClickOutside","action","selectedCrmConfig","selectedCrmState","lockingCrm","otherProvider","isProviderSyncing","HUI_BOX","DEFAULT_SIZE","MARK_RATIO","CheckMark","MinusMark","Checkbox","isFilled","MultiSelectStyles","tokenBackground","tokenText","tokenIcon","tokenIconHover","fieldBorder","optionHover","optionSelected","resolveKey","accessor","fallback","selectedValues","KitMultiSelect","optValue","optLabel","getOptionValue","getOptionLabel","FilterField","FilterFooter","onApply","FilterHeader","FilterPopover","draft","setDraft","handleFieldChange","cfId","handleApply","FilterTrigger","disableMessage","hasActiveFilters","useClickAway","initialOpen","definitiveTypes","EntityFilter","dropdownFields","Filter","setFilters","SearchInput","useSearchStore","ListingSearch","noun","EntityToolbar","rightNode","extraActions","isCustomFieldsM2Enabled","isAdmin","directions","useSortStore","isCF","sortData","currentField","nextOrder","nextIndex","order","getSortDirection","SortableHeader","setSortData","NO_DATA_RES","NO_FILTER_DATA_RES","getNextPageParam","lastData","isFilterResponse","getFilterNextPageParam","useCompanies","hasFilters","sortApiData","filterProps","useInfiniteQuery","sort","listProps","firstRecord","atRiskCount","listTotal","DEFAULT_MAX_VISIBLE","Chips","maxVisible","chipClassName","visible","safeMax","shown","nodeRef","viewCFConfigs","saveViewCFConfigs","visible_items","getCFKey","cf_id","createCFColumns","column","rowData","createCFRows","getViewConfig","getViewKey","renderCFValue","isPresent","getCFColumnsApi","defaultColumns","extraColumns","viewConfig","configsList","customFields","cfColumns","allCols","preference","preferredCols","leftovers","useCFColumns","selectTableRowNode","rowNode","CFField","useDebouncedValue","debounced","setDebounced","SEARCH_MIN_CHARS","SEARCH_DEBOUNCE_MS","useListingSearchText","searchText","CreateButton","DEFAULT_ROW_GAP_PX","DragAndDrop","getKey","onReorder","dragIcon","rowGap","itemClassName","handleClassName","draggingIndex","setDraggingIndex","dragOverIndex","setDragOverIndex","rowHeight","setRowHeight","dragSourceRef","rowRefs","resetDragState","handleMouseUp","handleDragStart","handleRowDragOver","handleContainerDragOver","commitReorder","from","moved","handleDragEnd","getRowOffset","shift","PreferenceHeader","selectAllState","onSelectAll","PreferenceRow","onToggle","isChecked","isLocked","getSelectAllState","configurables","visibleCount","PreferencePopover","PreferenceTrigger","ColumnPreference","useColumnPreferences","delayedSave","savePreferences","preferences","setPreferences","timeoutRef","saveDelayedPreferences","togglePreference","newPreferences","reorderPreferences","setAllVisible","visibleIds","getCFRows","getCFShimmer","tabs","onAtRiskCount","onAllCount","openCreate","setOpenCreate","listParams","isLoadingCompanies","refetch","isFetchingNextPage","columnsData","refetchCFColumns","columnPreferences","visibleItems","domainNames","onCreateSuccess","isNarrowed","renderTable","setTabParam","tab","TabCountChip","Accounts","customFieldsEnabled","setSearchParams","useSearchParams","hasTabParam","setAtRiskCount","allCount","setAllCount","showAtRiskTab","tabsItems","AccountTableV2","tabsNode","composeMail","phoneIconDisabled","OUTBOUND_CALLS_BLOCKED_MESSAGE","NameCellWithAvatar","avatarSize","containerClassName","textClassName","KitAvatar","EmailCellWithCompose","onCompose","baseClassName","displayValue","canCompose","handleComposeClick","PhoneCell","phone","PhoneCallCell","AccountCell","baseColumns","phoneCallColumn","accountColumn","ContactTable","fetchContacts","setData","hasFetchedRef","showPhoneCall","handleComposeEmail","handleContactClick","useContacts","isLoadingContacts","visibleColumns","phoneIndex","tableRows","Contacts","ContactTableV2","Card","AccountsConversation","useParams","conversationsLoading","fetchCompanyConversations","fetchNextPageCompanyConversations","firstConversation","DetailsCard","maxHeight","getEntityCFSummary","useEntitySummary","entity_ids","TYPE_ICON","CustomFieldRow","ROW_GAP","CustomFields","entityCustomFields","toggleExpanded","cfData","LABEL_W","DetailRow","AccountDetails","crmSyncEnabled","hasAttemptedFetch","contactsCount","CustomFieldsSummary","editIcon","EditAccount","openEdit","setOpenEdit","entityCFLoading","AccountContacts","accountContacts","AccountDetail","numericAccountId","setActiveIndex","ContactConversation","fetchContactConversations","fetchNextPageContactConversations","EditContact","updateContactInList","setFormData","toast","validateForm","newErrors","isValid","phoneError","handleInputChange","valueColor","showComposeIconOnHover","ContactDetails","ContactDetail","Converation","editCF","useCFMutate","hasChanges","mapCrmFields","useMapCrmFields","successMessage","ACTIONS","isRemoveAction","useFieldMapping","customField","actionMapping","setActionMapping","currentMapping","existing","mapFields","onRemoveMapping","onAddMapping","newMapping","updateMapping","SvgTrash","OptionsField","inputKey","createRow","initDataRef","handleEdit","handleDelete","handleReorder","lastIndex","canDelete","isTrailing","TrashIcon","TypeField","getTypeText","getDisabledData","isMapped","crmTypes","CrmMapping","connected","mappedFields","providerNameNode","getUniqueId","objectDiff","checkDropdownDiff","filteredValue","FormBody","CreateEditCF","CreateEditCFForm","onCFMutateSuccess","savedField","mutateCF","CUSTOMER_PANEL","standardiseDropdown","dropdowns","dropdown","toggleCFVisibility","currentVisibility","visibility","useCFVisibility","toggleFields","setToggleFields","DataSourceCell","iconNode","HiverIcon","VisibilityCell","TypeCell","ActionsCell","isCustomField","isLockedField","CustomFieldsListing","openDrawer","setOpenDrawer","setEditCF","isLoadingCustomFields","isFetchingCustomFields","refetchCustomFields","updateData","crmConfigData","connectorEnabledId","onToggleSuccess","isToggling","isToggleLoading","filteredRows","defaultData","sentimentRow","allData","dataTableKey","onCloseDrawer","onSubmitSuccess","rowClassName","commonClasses","navigatePath","QueryClient","App","ThemeProvider","QueryClientProvider","Routes","Route","Conversation","Navigate","API_METHODS","activeRoots","setCustomerModuleConfig","renderCustomerModule","initialEntries","rootEl","defaultEl","createRoot","StrictMode","MemoryRouter","unmounted","Import","account_friction","account_sentiment","accounts","activity_icon","at_the_rate","buildings","calendar","cfConfig","chat","chev_Arrow_RightLight","chev_arrow_left","chev_arrow_right","chevron","close_bold","company_small","compose_mail","contacts_dark","csv_icon","customers","details","download","drag_icon","edit","erroricon","expand_more","external_link","field_boolean","field_date","field_dropdown","field_input","field_number","field_url","filter","google","green_tick","hyperlink","in_progress","inbox","inbox_tooltip","alert_triangle_filled","check","chevron_down","factor_csat","factor_escalation","factor_friction","factor_query","factor_sentiment","factor_sla","factor_ticket","health_plus","sentiment_face_negative","sentiment_face_neutral","sentiment_face_positive","sentiment_smiley","thumb_down","thumb_down_filled","thumb_up","thumb_up_filled","trend_arrow","kebab","open_in_a_new_tab","phoneDisabled","plus","rounded_arrow_down","search_typing","setting","settings","slack","sm_contacts","sm_inboxes_light","sm_inboxs","sm_slider","sort_asc","sort_normal","statusResolved","statusSnoozed","status_open","text_icon","ticket","toggle_icon","trash","user","vector_right","warning_icon","whatsapp"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfw9C,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAf9vD,KAAe;AAAA;AAAA;AAAA;;;8CCAfjf,KAAe;;;8CCAfgvE,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;;;8CCAfC,KAAe;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;;;8CCAf7d,KAAe;;;8CCAf8d,KAAe;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;;;8CCAfC,KAAe;AAAA;AAAA;;;8CCAfpkC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfqkC,KAAe;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;;;8CCAfrwE,KAAe;AAAA;AAAA;AAAA;;;8CCAfuvC,KAAe;AAAA;AAAA;AAAA;;;8CCAf+gC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;;;8CCAfrP,KAAe;AAAA;AAAA;AAAA;;;8CCAfsP,KAAe;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;;;8CCAfl2C,KAAe;AAAA;AAAA;;;8CCAfm2C,KAAe;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;;;8CCAfC,KAAe;;;8CCAfC,KAAe;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;;;8CCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;;;;","x_google_ignoreList":[0,1,2,81]}
|