@tight-embedded/react 1.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +11 -0
  2. package/dist/duplet.css +60 -0
  3. package/dist/duplet.css.gz +0 -0
  4. package/dist/fonts/Duplet-Bold.woff +0 -0
  5. package/dist/fonts/Duplet-Bold.woff.gz +0 -0
  6. package/dist/fonts/Duplet-Bold.woff2 +0 -0
  7. package/dist/fonts/Duplet-BoldItalic.woff +0 -0
  8. package/dist/fonts/Duplet-BoldItalic.woff.gz +0 -0
  9. package/dist/fonts/Duplet-BoldItalic.woff2 +0 -0
  10. package/dist/fonts/Duplet-BoldItalic.woff2.gz +0 -0
  11. package/dist/fonts/Duplet-Italic.woff +0 -0
  12. package/dist/fonts/Duplet-Italic.woff.gz +0 -0
  13. package/dist/fonts/Duplet-Italic.woff2 +0 -0
  14. package/dist/fonts/Duplet-Regular.woff +0 -0
  15. package/dist/fonts/Duplet-Regular.woff.gz +0 -0
  16. package/dist/fonts/Duplet-Regular.woff2 +0 -0
  17. package/dist/fonts/Duplet-Semibold.woff +0 -0
  18. package/dist/fonts/Duplet-Semibold.woff.gz +0 -0
  19. package/dist/fonts/Duplet-Semibold.woff2 +0 -0
  20. package/dist/fonts/Duplet-SemiboldItalic.woff +0 -0
  21. package/dist/fonts/Duplet-SemiboldItalic.woff.gz +0 -0
  22. package/dist/fonts/Duplet-SemiboldItalic.woff2 +0 -0
  23. package/dist/fonts/Inter-Bold.ttf +0 -0
  24. package/dist/fonts/Inter-Bold.ttf.gz +0 -0
  25. package/dist/fonts/Inter-ExtraLight.ttf +0 -0
  26. package/dist/fonts/Inter-ExtraLight.ttf.gz +0 -0
  27. package/dist/fonts/Inter-Light.ttf +0 -0
  28. package/dist/fonts/Inter-Light.ttf.gz +0 -0
  29. package/dist/fonts/Inter-Medium.ttf +0 -0
  30. package/dist/fonts/Inter-Medium.ttf.gz +0 -0
  31. package/dist/fonts/Inter-Regular.ttf +0 -0
  32. package/dist/fonts/Inter-Regular.ttf.gz +0 -0
  33. package/dist/fonts/Inter-SemiBold.ttf +0 -0
  34. package/dist/fonts/Inter-SemiBold.ttf.gz +0 -0
  35. package/dist/index.css +2974 -0
  36. package/dist/index.css.gz +0 -0
  37. package/dist/index.d.ts +81 -0
  38. package/dist/index.js +3285 -0
  39. package/dist/index.js.gz +0 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/index.js.map.gz +0 -0
  42. package/dist/inter.css +36 -0
  43. package/dist/inter.css.gz +0 -0
  44. package/package.json +110 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/utils/store/storeUtils.ts","../src/store/featureFlags.ts","../src/store/drawerNavigation.ts","../src/store/componentOptions/externalOptionsSlice.ts","../src/utils/array/array.ts","../src/store/dashFilters/transactionDashFiltersSlice.ts","../src/store/globalStore.ts","../src/components/tables/transactionsTable/config/transactionsTableConfig.ts","../src/components/tables/config/columnConfig.ts","../src/store/componentOptions/transactionsDashOptionsSanitizer.ts","../src/store/componentOptions/accessTokenSanitizer.ts","../src/store/componentOptions/dataVisualizationColorsSanitizer.ts","../src/store/componentOptions/componentOptions.ts","../src/hooks/useOptions.ts","../styled-system/helpers.mjs","../styled-system/css/conditions.mjs","../styled-system/css/css.mjs","../styled-system/css/cx.mjs","../styled-system/css/cva.mjs","../src/style/validClassNames.ts","../src/style/stylist.ts","../src/components/dashboards/BusinessOwnerDashboard/DashHeaderLayout.tsx","../src/style/mergeStylists.ts","../src/style/recipes/fontRecipes.ts","../src/components/typography/Heading.tsx","../src/utils/date/date.ts","../src/query/fetches/utils/queryKey.ts","../src/utils/typeUtils.ts","../src/utils/string/stringUtils.ts","../src/auth/AuthContext.tsx","../src/query/http/useAccessToken.ts","../src/auth/useAuthContext.ts","../src/query/fetches/utils/queryUtils.ts","../src/query/queryClient.ts","../src/environment/Environment.ts","../src/environment/useEnvironment.ts","../src/query/fetches/utils/useEntity.ts","../src/bugsnag/fetch-delivery.ts","../src/bugsnag/safe-filter.ts","../src/bugsnag/is-error.ts","../src/bugsnag/is-object.ts","../src/bugsnag/parse-stack.ts","../src/bugsnag/to-exceptions.ts","../src/utils/devConsole.ts","../src/bugsnag/browser-unhandled-exceptions.ts","../src/bugsnag/browser-unhandled-rejections.ts","../src/bugsnag/error-breadcrumbs.ts","../src/bugsnag/app-duration.ts","../src/bugsnag/simple-ua-parser.ts","../src/bugsnag/browser-context.ts","../src/utils/rateLimiter/rateLimiter.ts","../src/bugsnag/react/react-plugin.tsx","../src/bugsnag/bugsnag.ts","../src/utils/logging.ts","../src/bugsnag/limit-events.ts","../src/query/http/http.ts","../src/query/http/post.ts","../src/query/endpointManager.ts","../src/utils/traxEnvironmentVariables.ts","../src/query/versions/v5/v5EndpointManager.ts","../src/query/fetches/report/profitAndLoss.ts","../src/components/tiles/ExpandedProfitAndLoss/useExpandedPLSummary.ts","../src/utils/grouping.ts","../src/components/tiles/TileHeader.tsx","../src/components/tiles/TileBody.tsx","../src/components/tiles/Tile.tsx","../src/style/text.ts","../src/components/typography/LabelContent.tsx","../src/components/typography/MetricXL.tsx","../src/components/typography/Summation.tsx","../src/components/tiles/TileGraphs.tsx","../src/utils/math/number.ts","../src/utils/money/smartNumber.ts","../src/components/typography/Text.tsx","../src/components/typography/StrongLabel.tsx","../src/components/typography/SubLabel.tsx","../src/components/tiles/ExpandedProfitAndLoss/Tooltip.tsx","../styled-system/tokens/index.mjs","../src/components/charts/Bullet.tsx","../src/components/tiles/ExpandedProfitAndLoss/Legend.tsx","../src/components/tiles/ExpandedProfitAndLoss/Chart.tsx","../src/components/loading/ShimmerBlock.tsx","../src/components/tiles/TileShimmer.tsx","../src/components/dashboards/loading/BarChartShimmer.tsx","../src/components/tiles/ExpandedProfitAndLoss/ExpandedPLTile.tsx","../src/components/banners/TaskBannerLayout.tsx","../src/components/dashboards/BusinessOwnerDashboard/config/businessOwnerDashConfig.ts","../src/components/icon/MediumIcon.tsx","../src/assets/icons/message.svg?react","../src/components/icon/createIcon.tsx","../src/components/icon/icons/Comment.tsx","../src/components/icon/icons/Attention.tsx","../src/assets/icons/attention.svg?react","../src/style/transition.ts","../src/style/buttons.ts","../src/components/inputs/ButtonBase.tsx","../src/components/inputs/ButtonWarning.tsx","../src/assets/icons/flag.svg?react","../src/components/icon/icons/Flag.tsx","../src/components/icon/icons/category/Bank.tsx","../src/assets/icons/bank.svg?react","../src/components/inputs/ButtonDanger.tsx","../src/components/inputs/ButtonAction.tsx","../src/components/banners/bannerVariant.ts","../src/components/banners/BannerTitle.tsx","../src/components/banners/BannerHeader.tsx","../src/components/icon/SmallIcon.tsx","../src/assets/icons/arrow-right.svg?react","../src/components/icon/icons/ArrowRight.tsx","../src/components/banners/BannerActionButton.tsx","../src/components/banners/Banner.tsx","../src/query/versions/v6/v6EndpointManager.ts","../src/query/fetches/tasks/tasks.ts","../src/assets/icons/arrow-left.svg?react","../src/components/icon/icons/ArrowLeft.tsx","../src/components/dashboards/pagination/paginationContext.ts","../src/components/tables/TablePagination.tsx","../src/components/dashboards/loading/PlaceholderRow.tsx","../src/components/dashboards/loading/PlaceholderTable.tsx","../src/query/fetches/utils/usePrefetch.ts","../src/query/fetches/utils/usePaginatedEntity.ts","../src/query/http/get.ts","../src/utils/callback/delayedCallback.ts","../src/query/fetches/utils/useHoverPrefetch.ts","../src/query/fetches/conversations/conversations.ts","../src/components/tables/columnHeaders/columnSize.ts","../src/components/tables/columnHeaders/ColumnHeader.tsx","../src/components/tables/TableHeader.tsx","../src/components/tables/TableBody.tsx","../src/components/layout/Divider.tsx","../src/components/tables/cells/CellDivider.tsx","../src/components/tables/cells/TableCell.tsx","../src/components/tables/TableSubRow.tsx","../src/components/tables/TableRow.tsx","../src/components/drawer/drawer.ts","../src/query/fetches/transactions/bankTransactionQueries.ts","../src/entities/entityIdPrefixMap.ts","../src/query/fetches/conversations/messages.ts","../src/components/tables/conversationsTable/ConversationsTableRow.tsx","../src/assets/icons/plus.svg?react","../src/components/icon/icons/Plus.tsx","../src/components/inputs/ButtonPrimary.tsx","../src/components/tables/conversationsTable/AddConversationButton.tsx","../src/components/tables/conversationsTable/hooks/ConversationControlsLayout.tsx","../src/components/tables/tableStyles.ts","../src/components/tables/TableLayout.tsx","../src/components/tables/tableSortContext.tsx","../src/components/tables/conversationsTable/config/conversationsTableConfig.ts","../src/components/typography/Label.tsx","../src/components/typography/EmphasisLabel.tsx","../src/components/dashboards/cells/conversations/ConversationTextCell.tsx","../src/components/tables/cells/TableCellLayout.tsx","../src/components/dashboards/cells/conversations/ConversationDateCell.tsx","../src/components/typography/StrongSubLabel.tsx","../src/components/popup/PopupContext.tsx","../src/components/popup/config/popupStyles.ts","../src/utils/hooks/controlled/useControlledState.ts","../src/components/popup/PopupTree.tsx","../src/components/popup/PopupManager.tsx","../src/components/popup/hooks/usePopup.ts","../src/components/popup/hooks/usePopupContext.ts","../src/components/popup/PopupTrigger.tsx","../src/assets/icons/cross.svg?react","../src/components/icon/icons/Cross.tsx","../src/components/icon/TinyIcon.tsx","../src/assets/icons/menu.svg?react","../src/components/icon/icons/Sort.tsx","../src/components/tables/columnHeaders/columnSort/ColumnSorterCompoundButton.tsx","../src/components/popup/Popup.tsx","../src/components/popup/rows/PopupSortRow.tsx","../src/components/tables/columnHeaders/columnSort/ColumnSortList.tsx","../src/components/inputs/ButtonDiscreteSmall.tsx","../src/components/tables/columnHeaders/columnSort/ColumnSorter.tsx","../src/components/tables/columnHeaders/columnSort/ColumnSorterLayout.tsx","../src/components/tables/conversationsTable/hooks/useConversationSort.ts","../src/components/tables/conversationsTable/ConversationTableColumns.tsx","../src/components/tables/conversationsTable/hooks/useConversationsTable.ts","../src/components/zero-states/zeroStateStyles.ts","../src/components/zero-states/ZeroStateLayout.tsx","../src/components/icon/LargeIcon.tsx","../src/assets/icons/paperplane.svg?react","../src/components/icon/icons/Paperplane.tsx","../src/components/dashboards/BusinessOwnerDashboard/zero-states/ConversationsOnboardingZeroState.tsx","../src/components/dashboards/BusinessOwnerDashboard/zero-states/ConversationsAllCaughtUpZeroState.tsx","../src/components/dashboards/BusinessOwnerDashboard/BusinessOwnerConversationsTableSection.tsx","../src/query/fetches/summary/financialSummary.ts","../src/components/typography/Body.tsx","../src/components/zero-states/SampleOverlay.tsx","../src/components/dashboards/BusinessOwnerDashboard/summary/FinancialSummaryShimmer.tsx","../src/components/dashboards/BusinessOwnerDashboard/summary/FinancialSummaryLayout.tsx","../src/entities/task/tasks.ts","../src/query/versions/v1/v1EndpointManager.ts","../src/query/fetches/plaid/plaid.ts","../src/components/inputs/ButtonTertiary.tsx","../src/components/dialogs/AlertDialog.tsx","../src/components/dialogs/alertDialog.ts","../src/components/typography/textTransformers.ts","../src/components/plaid/hooks/usePlaidSdk.ts","../src/components/plaid/PlaidLinkBanner.tsx","../src/query/fetches/plaidItems/plaidItems.ts","../src/query/fetches/banks/bankAccounts.ts","../src/components/dashboards/pagination/MonthPicker.tsx","../src/components/tiles/TileLayout.tsx","../src/components/charts/Bar.tsx","../src/components/typography/MetricMD.tsx","../src/components/tiles/TileBar.tsx","../src/components/tiles/useProfitAndLossSummary.ts","../src/assets/icons/recurring.svg?react","../src/components/icon/icons/Sync.tsx","../src/components/tiles/TilePlaidLinkButton.tsx","../src/components/tiles/TileGraphShimmer.tsx","../src/components/tiles/ProfitLoss/ProfitAndLossTile.tsx","../src/query/fetches/report/cashflow.ts","../src/components/tiles/CashFlow/CashFlowTile.tsx","../src/components/tiles/TileBullet.tsx","../src/components/tiles/Expense/useExpenseSummary.ts","../src/components/dashboards/loading/PlaceholderBullets.tsx","../src/components/tiles/Expense/ExpenseTile.tsx","../src/components/tiles/ReviewReportsButton.tsx","../src/components/tiles/BusinessOwnerMonthlyReviewSection.tsx","../src/components/banners/BannerShimmer.tsx","../src/components/tables/transactionsTable/hooks/useTransactionSort.ts","../src/assets/icons/check.svg?react","../src/components/icon/icons/Check.tsx","../src/components/inputs/CheckboxInput.tsx","../src/components/dashboards/cells/CheckboxCell.tsx","../src/components/typography/SubContent.tsx","../src/components/dashboards/cells/DateCell.tsx","../src/utils/transactions/typeLabel.ts","../src/components/tables/transactionsTable/cells/TransactionDateCell.tsx","../src/components/dashboards/cells/SourceCell.tsx","../src/components/tables/transactionsTable/cells/TransactionSourceCell.tsx","../src/utils/money/convertCentsToDollars.ts","../src/utils/transactions/transactionUtils.ts","../src/components/dashboards/cells/AmountCell.tsx","../src/components/dashboards/cells/BankAccountCell.tsx","../src/utils/generalLedger/generalLedgerUtils.ts","../src/components/inputs/CellButton.tsx","../src/components/popup/list/PopupListContext.tsx","../src/utils/dom/useVerticalListNavigation.ts","../src/utils/dom/useListData.ts","../src/components/popup/PopupCascadeContext.tsx","../src/components/popup/list/PopupList.tsx","../src/components/popup/hooks/usePopupCascadeManager.ts","../src/utils/dom/list/useListRow.ts","../src/components/popup/list/ListRow.tsx","../src/components/popup/rows/PopupRow.tsx","../src/components/typography/StrongContent.tsx","../src/components/popup/placeholder/PlaceholderPopupRow.tsx","../src/components/popup/placeholder/PlaceholderPopupList.tsx","../src/entities/transaction/glAccounts.ts","../src/query/fetches/generalLedger/glAccounts.ts","../src/components/dashboards/cells/category/GlAccountSearchList.tsx","../src/components/popup/CascadeTrigger.tsx","../src/components/popup/rows/CascadeRow.tsx","../src/components/popup/rows/ExpandableRow.tsx","../src/components/dashboards/cells/category/GlAccountCascadingList.tsx","../src/components/popup/PopupSearch.tsx","../src/components/dashboards/cells/category/GlAccountPopupList.tsx","../src/query/mutations/useEntityMutation.ts","../src/query/mutations/transactions/bankTransactionMutations.ts","../src/components/dashboards/cells/category/GlAccountSelector.tsx","../src/query/fetches/transactions/transactionCategories.ts","../src/entities/expense/expenseCategories.ts","../src/components/dashboards/cells/category/ExpenseCategorySearchList.tsx","../src/components/dashboards/cells/category/ExpenseCategoryCascadingList.tsx","../src/components/dashboards/cells/category/ExpenseCategoryPopupList.tsx","../src/components/icon/icons/category/Advertising.tsx","../src/assets/icons/megaphone.svg?react","../src/components/icon/icons/category/Uncategorized.tsx","../src/assets/icons/question.svg?react","../src/components/icon/icons/category/Meals.tsx","../src/assets/icons/eating-utensils.svg?react","../src/components/icon/icons/category/Sports.tsx","../src/assets/icons/shoe.svg?react","../src/components/icon/icons/category/Bedding.tsx","../src/assets/icons/bed.svg?react","../src/components/icon/icons/category/Airplane.tsx","../src/assets/icons/airplane.svg?react","../src/components/icon/icons/category/Vehicle.tsx","../src/assets/icons/car.svg?react","../src/components/icon/CategoryIcon.tsx","../src/components/dashboards/cells/category/ExpenseCategorySelector.tsx","../src/assets/icons/split.svg?react","../src/components/icon/icons/Split.tsx","../src/components/dashboards/cells/category/ParentExpenseCategoryCell.tsx","../src/components/dashboards/cells/category/ExpenseCategoryCell.tsx","../src/entities/bankAccount/accountNameFormatter.ts","../src/entities/bankAccounts.ts","../src/components/dashboards/cells/category/CategoryCell.tsx","../src/components/dashboards/cells/ClassSegmentCell.tsx","../src/entities/transaction/reviewStatus.ts","../src/components/icon/icons/CircleCheck.tsx","../src/assets/icons/circle-check.svg?react","../src/components/icon/icons/Processing.tsx","../src/assets/icons/processing.svg?react","../src/components/inputs/Badge.tsx","../src/userContext/userContext.ts","../src/components/dashboards/cells/reviewStatus/ReviewStatusPopup.tsx","../src/components/dashboards/cells/reviewStatus/ReviewStatusSelector.tsx","../src/components/dashboards/cells/ReviewStatusCell.tsx","../src/assets/icons/arrow-up.svg?react","../src/components/icon/icons/ArrowUp.tsx","../src/components/icon/icons/ArrowDown.tsx","../src/assets/icons/arrow-down.svg?react","../src/components/dashboards/cells/ExpanderCell.tsx","../src/components/tables/transactionsTable/cells/TransactionExpanderCell.tsx","../src/assets/icons/minus.svg?react","../src/components/icon/icons/Dash.tsx","../src/components/dashboards/cells/CommentCell.tsx","../src/components/dashboards/cells/conversations/TransactionCommentCell.tsx","../src/components/tables/transactionsTable/TransactionTableColumns.tsx","../src/components/tables/transactionsTable/hooks/useTransactionsTable.ts","../src/components/dashboards/BusinessOwnerDashboard/hooks/useBusinessOwnerDashTransactionsTable.ts","../src/components/tables/transactionsTable/TransactionsTableRow.tsx","../src/components/dashboards/BusinessOwnerDashboard/zero-states/TransactionsAllCaughtUpZeroState.tsx","../src/components/plaid/PlaidLinkButton.tsx","../src/components/tables/transactionsTable/zero-states/NoBankAccountsZeroState.tsx","../src/components/dashboards/BusinessOwnerDashboard/transactions/BusinessOwnerTransactionTableSection.tsx","../src/components/dashboards/BusinessOwnerDashboard/transactions/BusinessOwnerTransactionsData.tsx","../src/components/dashboards/BusinessOwnerDashboard/BusinessOwnerDashboardInternal.tsx","../src/components/dashboards/BusinessOwnerDashboard/index.tsx","../src/query/persistence/indexDb.ts","../src/query/QueryProvider.tsx","../src/query/persistence/queryPersister.ts","../src/components/error/ErrorBoundary.tsx","../src/components/drawer/DrawerOverlay.tsx","../src/components/drawer/DrawerContext.tsx","../src/components/drawer/DrawerRouter.tsx","../src/components/drawer/DrawerRoute.tsx","../src/components/dashboards/forms/ErrorLabel.tsx","../src/components/inputs/FormInput.tsx","../src/utils/dom/cursorPosition.ts","../src/components/dashboards/forms/createFormHookContext.ts","../src/components/inputs/EditableFormInput.tsx","../src/components/inputs/ButtonSecondary.tsx","../src/components/dashboards/forms/expenseForm/splitExpense/AddSplitButton.tsx","../src/components/dashboards/forms/expenseForm/ExpenseCategoryField.tsx","../src/components/inputs/DiscreteFormInput.tsx","../src/components/inputs/datePicker/DropdownContent.tsx","../src/components/inputs/datePicker/DropdownSelector.tsx","../src/components/inputs/datePicker/MonthYearSelector.tsx","../src/components/inputs/datePicker/DatePickerCalendar.tsx","../src/components/inputs/datePicker/DateInput.tsx","../src/components/inputs/TextAreaInput.tsx","../src/components/dashboards/forms/expenseForm/splitExpense/SplitExpenseCategoryField.tsx","../src/components/dashboards/forms/handleKeyDownUtils.ts","../src/utils/platform.ts","../src/components/inputs/AmountInput.tsx","../src/components/dashboards/forms/expenseForm/splitExpense/SplitExpenseAmountField.tsx","../src/components/dashboards/forms/transactionFormSchema.ts","../src/components/dashboards/forms/expenseForm/expenseFormSchema.ts","../src/components/dashboards/forms/bankTransferForm/bankTransferFormSchema.ts","../src/entities/transaction/transactions.ts","../src/components/dashboards/cells/bankAccount/BankAccountPopupList.tsx","../src/components/dashboards/forms/BankAccountSelector.tsx","../src/components/dashboards/forms/bankTransferForm/BankTransferPopupList.tsx","../src/components/dashboards/forms/bankTransferForm/MatchingBankTransferField.tsx","../src/components/dashboards/forms/revenueForm/revenueFormSchema.ts","../src/entities/transaction/taxInfo.ts","../src/components/dashboards/forms/taxPaymentForm/taxPaymentFormSchema.ts","../src/components/dashboards/forms/revenueForm/GlAccountField.tsx","../src/components/inputs/buttonGroup/ButtonGridLayout.tsx","../src/components/inputs/buttonGroup/ButtonGroupButton.tsx","../src/components/inputs/buttonGroup/ButtonGrid.tsx","../src/components/dashboards/forms/GenericSelectorFieldPopup.tsx","../src/components/dashboards/forms/GenericSelectorField.tsx","../src/components/dashboards/forms/useBankTransactionForm.ts","../src/components/dashboards/forms/SaveButton.tsx","../src/components/dashboards/forms/DiscreteAmountField.tsx","../src/components/dashboards/forms/BankAccountField.tsx","../src/components/dashboards/forms/bankTransferForm/BankGlAccountField.tsx","../src/components/dashboards/forms/ButtonGroupField.tsx","../src/assets/icons/trash.svg?react","../src/components/icon/icons/Delete.tsx","../src/components/dashboards/forms/expenseForm/splitExpense/SplitExpenseRow.tsx","../src/components/dashboards/forms/expenseForm/splitExpense/SplitExpenseSection.tsx","../src/components/dashboards/forms/expenseForm/ExpenseCategorySection.tsx","../src/components/drawer/Drawer.tsx","../src/components/dashboards/forms/formNavigation/FormSidePanelNavigation.tsx","../src/components/dashboards/forms/formNavigation/FormNavigationButton.tsx","../src/components/conversations/ConversationContainer.tsx","../src/components/conversations/reactions/toEmoji.ts","../src/assets/icons/thumbs-up.svg?react","../src/components/icon/icons/category/ThumbsUp.tsx","../src/components/conversations/reactions/Reaction.tsx","../src/components/conversations/reactions/ReactionContainer.tsx","../src/query/fetches/conversations/reactions.ts","../src/query/mutations/conversations/reactionsMutations.ts","../src/components/conversations/reactions/AddReactionButton.tsx","../src/components/conversations/useMessageInteractions.ts","../src/components/conversations/reactions/AppliedReactionContainer.tsx","../src/components/conversations/Message.tsx","../src/components/conversations/MessageGroup.tsx","../src/components/conversations/MessageLog.tsx","../src/components/conversations/messageFormSchema.ts","../src/components/inputs/messageArea/MessageAreaInput.tsx","../src/components/conversations/useMessageForm.ts","../src/components/conversations/MessageForm.tsx","../src/query/mutations/conversations/messagesMutation.ts","../src/components/dashboards/loading/PlaceholderMessage.tsx","../src/query/mutations/conversations/conversationMutation.ts","../src/components/conversations/ResolutionMessage.tsx","../src/components/conversations/Conversation.tsx","../src/components/drawer/header/DrawerHeaderBorder.tsx","../src/components/drawer/header/DrawerHeader.tsx","../src/components/conversations/ConversationPanel.tsx","../src/components/dashboards/forms/BankTransactionForm.tsx","../src/components/dashboards/forms/FormInfoCell.tsx","../src/components/dashboards/forms/CloseButton.tsx","../src/assets/icons/dots.svg?react","../src/components/icon/icons/Dots.tsx","../src/components/dashboards/forms/ActionMenu.tsx","../src/entities/transaction/transactionStatus.ts","../src/components/dashboards/forms/DeleteActionRow.tsx","../src/components/dashboards/forms/RestoreActionRow.tsx","../src/components/drawer/header/DrawerHeaderGroup.tsx","../src/components/dashboards/forms/TransactionFormHeader.tsx","../src/components/dashboards/forms/useTransactionFormData.ts","../src/components/dashboards/forms/expenseForm/ExpenseForm.tsx","../src/components/dashboards/forms/bankTransferForm/BankTransferForm.tsx","../src/components/dashboards/forms/revenueForm/RevenueForm.tsx","../src/components/dashboards/forms/taxPaymentForm/TaxPaymentForm.tsx","../src/components/dashboards/forms/BankTransactionFormRouter.tsx","../src/components/conversations/ConversationHeader.tsx","../src/components/conversations/ConversationDrawer.tsx","../src/components/drawer/Drawers.tsx","../src/environment/EnvironmentProvider.tsx","../src/query/fetches/sdk/introspect.ts","../src/userContext/UserContextProvider.tsx","../src/tightProvider/Tight.tsx"],"sourcesContent":["function createActionName(slice: string, action: string) {\n return `${slice.trim()}:${action.trim()}`;\n}\n\nexport {\n createActionName,\n};\n","import { StateCreator } from \"zustand\";\nimport { createActionName } from \"../utils/store/storeUtils.ts\";\n\ntype FeatureFlags = {\n hasBulkSelect: boolean;\n};\n\ntype FeatureFlagsSlice = FeatureFlags & {\n updateFlags: (updatedFlags: Partial<FeatureFlags>) => void;\n};\n\nconst SLICE_NAME = \"featureFlags\";\n\nconst createFeatureFlagsSlice: StateCreator<\n FeatureFlagsSlice,\n [[\"zustand/devtools\", never]], // put devtools last\n [],\n FeatureFlagsSlice\n> = set => ({\n hasBulkSelect: false,\n updateFlags: (updatedFlags: Partial<FeatureFlags>) => set(currentFlags => ({ ...currentFlags, ...updatedFlags }), undefined, createActionName(SLICE_NAME, \"updateFlags\")),\n});\n\nexport {\n createFeatureFlagsSlice,\n};\n\nexport type {\n FeatureFlags,\n FeatureFlagsSlice,\n};\n","import { StateCreator } from \"zustand\";\nimport { cloneDeep } from \"lodash-es\";\nimport { DrawerProps, DrawerRouteNames } from \"../components/drawer/drawerProps.ts\";\nimport { createActionName } from \"../utils/store/storeUtils.ts\";\n\ntype DrawerHistoryEntry = {\n [key in keyof Partial<DrawerProps>]: { routeProps: DrawerProps[key] };\n};\n\ntype DrawerNavigation = {\n drawerHistory: DrawerHistoryEntry[];\n};\n\ntype DrawerNavigationSlice = DrawerNavigation & {\n openDrawer: <Key extends DrawerRouteNames>(name: Key, options?: DrawerNavigationOptions<Key>) => void;\n closeAllDrawers: () => void;\n closeDrawer: () => void;\n};\n\ntype DrawerNavigationOptions<Key extends DrawerRouteNames> = {\n replaceHistory?: boolean;\n routeProps?: DrawerProps[Key];\n};\n\n// for future iteration\n// function setHiddenState(entry: DrawerHistoryEntry, hidden: boolean) {\n// const entryDetails = Object.values(entry)[0];\n// entryDetails.hidden = hidden;\n// }\n// return entry;\n// }\n\nconst SLICE_NAME = \"drawerNavigation\";\n\nconst createDrawerNavigationSlice: StateCreator<\n DrawerNavigationSlice,\n [[\"zustand/devtools\", never]], // put devtools last\n [],\n DrawerNavigationSlice\n> = set => ({\n drawerHistory: [],\n openDrawer: (name, options = {}) => set((drawerNavigation) => {\n const { replaceHistory, routeProps } = options;\n const historyEntry = { [name]: { routeProps } };\n if (replaceHistory || drawerNavigation.drawerHistory.length === 0) {\n return { drawerHistory: [historyEntry] };\n } else {\n const drawers = cloneDeep(drawerNavigation.drawerHistory);\n // for future iteration\n // const lastEntry = drawers.at(-1);\n // if (lastEntry) {\n // setHiddenState(lastEntry, !layered);\n // }\n drawers.push(historyEntry);\n return { drawerHistory: drawers };\n }\n }, undefined, createActionName(SLICE_NAME, \"openDrawer\")),\n closeDrawer: () => set((drawerNavigation) => {\n const oldDrawers = drawerNavigation.drawerHistory;\n const drawers = oldDrawers.slice(0, oldDrawers.length - 1);\n return { drawerHistory: drawers };\n }, undefined, createActionName(SLICE_NAME, \"closeDrawer\")),\n closeAllDrawers: () => set(() => {\n return { drawerHistory: [] };\n }, undefined, createActionName(SLICE_NAME, \"closeAllDrawers\")),\n});\n\nexport {\n createDrawerNavigationSlice,\n};\n\nexport type {\n DrawerNavigation,\n DrawerHistoryEntry,\n DrawerNavigationOptions,\n DrawerNavigationSlice,\n};\n","import { TransactionsDashboardOptions } from \"./transactionsDashOptionsSanitizer.ts\";\nimport { StateCreator } from \"zustand\";\nimport { AnyObject } from \"../../utils/object/objTypes.ts\";\nimport { createActionName } from \"../../utils/store/storeUtils.ts\";\n\n// add more slices keyed on component name as needed\ntype ExternalOptions = {\n /** @internal TODO: Remove Internal annotation once TransactionDash is released publicly */ transactionsDashboard?: TransactionsDashboardOptions;\n dataVisualizationColors?: string[];\n};\n\n/* options are exposed to partners through Tight.setOptions so we can't control inputs.\n * we intersect the options with AnyObject to represent potentially invalid key/value pairs\n */\ntype UnsanitizedOptions<T> = T & AnyObject;\n\n// optimistically we assume correct input\ntype OptionSetter = (options: Partial<ExternalOptions>, replace?: boolean) => void;\n\ntype ExternalOptionsState = {\n externalOptions: ExternalOptions;\n};\n\ntype ExternalOptionsActions = {\n setOptions: OptionSetter;\n};\n\ntype ExternalOptionsSlice = ExternalOptionsState & ExternalOptionsActions;\n\nconst SLICE_NAME = \"externalOptions\";\n\nconst createExternalOptionsSlice: StateCreator<\n ExternalOptionsSlice,\n [[\"zustand/devtools\", never]], // put devtools last\n [],\n ExternalOptionsSlice\n> = set => ({\n externalOptions: {},\n setOptions: (newOptions: Partial<ExternalOptions>, replace = false) => set((currentOptions) => {\n if (replace) {\n return {\n externalOptions: { ...newOptions },\n };\n }\n\n return {\n // shallow merge. We want newOptions.transactionsDash to overwrite current, regardless of contents\n externalOptions: {\n ...currentOptions.externalOptions,\n ...newOptions,\n },\n };\n }, undefined, createActionName(SLICE_NAME, \"setOptions\")),\n});\n\nexport { createExternalOptionsSlice };\n\nexport type { ExternalOptionsSlice, ExternalOptions, OptionSetter, UnsanitizedOptions };\n","function remove<T>(array: T[], index: number) {\n if (index > -1 && index <= array.length - 1) {\n const first = array.slice(0, index); // 2nd parameter means remove one item only\n const second = array.slice(index + 1);\n return [...first, ...second];\n }\n return [...array];\n}\n\n/**\n * Takes an array of objects with a 'children' field and returns a new array\n * where the children are moved to the top level, ordered after their parents.\n * @param arr Array of objects with optional children field\n * @returns Flattened array with children at the top level\n */\nfunction flattenChildren<T extends { children?: T[] }>(arr: T[]): T[] {\n if (!arr || arr.length === 0) {\n return [];\n }\n\n const result: T[] = [];\n\n for (const item of arr) {\n // Add the parent item to the result\n const itemWithoutChildren = { ...item };\n delete itemWithoutChildren.children;\n result.push(itemWithoutChildren);\n\n // If the item has children, recursively flatten them and add to result\n if (item.children && item.children.length > 0) {\n const flattenedChildren = flattenChildren(item.children);\n result.push(...flattenedChildren);\n }\n }\n\n return result;\n}\n\n/**\n * Shallowly compares two arrays\n * @param a optional first array\n * @param b optional second array\n * @returns true iff a and b have the same length and same elements at each index\n */\nfunction shallowCompare<T>(a?: T[], b?: T[]): boolean {\n if (!Array.isArray(a) || !Array.isArray(b)) {\n return false;\n }\n\n if (a.length !== b.length) {\n return false;\n }\n\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction getLast<T>(array: T[]): T | undefined {\n // TODO: use array.at(-1) when we upgrade to targeting ES2022\n return array[array.length - 1];\n}\n\nexport {\n remove,\n flattenChildren,\n shallowCompare,\n getLast,\n};\n","import { StateCreator } from \"zustand\";\nimport { createActionName } from \"../../utils/store/storeUtils.ts\";\nimport { TransactionFilter } from \"../../components/dashboards/TransactionsDashboard/hooks/useTransactionFilters.ts\";\nimport { remove } from \"../../utils/array/array.ts\";\n\ntype TransactionsDashFilterState = {\n transactionsDashFilters: TransactionFilter[];\n};\n\ntype AddTransactionsDashFilters = (filters: TransactionFilter[]) => void;\ntype RemoveTransactionsDashFilter = (index: number) => void;\n\ntype TransactionsDashFilterActions = {\n setTransactionsDashFilters: (filters: TransactionFilter[]) => void;\n addTransactionsDashFilters: AddTransactionsDashFilters;\n removeTransactionsDashFilter: RemoveTransactionsDashFilter;\n};\n\ntype TransactionsDashFilterSlice = TransactionsDashFilterState & TransactionsDashFilterActions;\n\nconst SLICE_NAME = \"transactionsDashFilters\";\n\nconst createTransactionsDashFilterSlice: StateCreator<\n TransactionsDashFilterSlice,\n [[\"zustand/devtools\", never]],\n [],\n TransactionsDashFilterSlice\n> = set => ({\n transactionsDashFilters: [] as TransactionFilter[],\n\n addTransactionsDashFilters: (filters: TransactionFilter[]) => set((slice): TransactionsDashFilterSlice => {\n return {\n ...slice,\n transactionsDashFilters: [...slice.transactionsDashFilters, ...filters],\n };\n }, undefined, createActionName(SLICE_NAME, \"addFilter\")),\n\n removeTransactionsDashFilter: (index: number) => set((slice): TransactionsDashFilterSlice => {\n return ({\n ...slice,\n transactionsDashFilters: remove(slice.transactionsDashFilters, index),\n });\n }, undefined, createActionName(SLICE_NAME, \"removeFilter\")),\n\n setTransactionsDashFilters: (filters: TransactionFilter[]) => set((slice): TransactionsDashFilterSlice => {\n return {\n ...slice,\n transactionsDashFilters: filters,\n };\n }, undefined, createActionName(SLICE_NAME, \"setFilters\")),\n});\n\nexport { createTransactionsDashFilterSlice };\n\nexport type { TransactionsDashFilterSlice, AddTransactionsDashFilters, RemoveTransactionsDashFilter };\n","import { create } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport { createFeatureFlagsSlice, FeatureFlagsSlice } from \"./featureFlags\";\nimport { createDrawerNavigationSlice, DrawerNavigationSlice } from \"./drawerNavigation.ts\";\nimport { ExternalOptionsSlice, createExternalOptionsSlice } from \"./componentOptions/externalOptionsSlice.ts\";\nimport { createTransactionsDashFilterSlice, TransactionsDashFilterSlice } from \"./dashFilters/transactionDashFiltersSlice.ts\";\n\n// add more slices with an intersection\ntype GlobalStore = FeatureFlagsSlice\n & DrawerNavigationSlice\n & ExternalOptionsSlice\n & TransactionsDashFilterSlice\n ;\n\nconst useGlobalStore = create<GlobalStore>()(\n devtools((...args) => ({\n ...createFeatureFlagsSlice(...args),\n ...createDrawerNavigationSlice(...args),\n ...createExternalOptionsSlice(...args),\n ...createTransactionsDashFilterSlice(...args),\n }), { name: \"globalStore\", enabled: process.env.NODE_ENV === \"development\", store: \"globalStore\" }));\n\nexport {\n useGlobalStore,\n};\n\nexport type {\n GlobalStore,\n};\n","import { ValueOf } from \"../../../../utils/utilityTypes.ts\";\nimport { COMMON_COLS } from \"../../config/columnConfig.ts\";\n\nconst TRANSACTIONS_TABLE_COLS = {\n ...COMMON_COLS,\n DATE: \"date\",\n DESCRIPTION: \"description\",\n AMOUNT: \"amount\",\n CATEGORY: \"category\",\n CLASS_SEGMENT: \"classSegment\",\n REVIEW_STATUS: \"reviewStatus\",\n COMMENTS: \"comments\",\n} as const;\n\ntype TransactionsTableColumn = ValueOf<typeof TRANSACTIONS_TABLE_COLS>;\n\n// We do not expose select or expand as partner options. Instead, we set these on a per-table basis\ntype TransactionsTableColumnOption = Exclude<TransactionsTableColumn, \"select\" | \"expand\">;\n\nconst ALL_COLUMN_OPTIONS: TransactionsTableColumnOption[] = [\n TRANSACTIONS_TABLE_COLS.DATE,\n TRANSACTIONS_TABLE_COLS.DESCRIPTION,\n TRANSACTIONS_TABLE_COLS.AMOUNT,\n TRANSACTIONS_TABLE_COLS.CATEGORY,\n TRANSACTIONS_TABLE_COLS.REVIEW_STATUS,\n TRANSACTIONS_TABLE_COLS.CLASS_SEGMENT,\n TRANSACTIONS_TABLE_COLS.COMMENTS,\n] as const;\n\nexport {\n ALL_COLUMN_OPTIONS,\n TRANSACTIONS_TABLE_COLS,\n};\n\nexport type { TransactionsTableColumnOption, TransactionsTableColumn };\n","export const COMMON_COLS = {\n SELECT: \"select\",\n EXPAND: \"expand\",\n} as const;\n","import { Sanitizer } from \"./componentOptions.ts\";\nimport * as z from \"zod\";\n\nimport {\n ALL_COLUMN_OPTIONS,\n TransactionsTableColumnOption,\n} from \"../../components/tables/transactionsTable/config/transactionsTableConfig.ts\";\n\ntype TransactionsDashboardOptions = {\n columns?: TransactionsTableColumnOption[];\n pageSize?: number;\n};\n\nconst optionsSchema = z.object({\n pageSize: z.optional(z.int32().positive()),\n columns: z.optional(z.array(z.enum(ALL_COLUMN_OPTIONS))),\n});\n\nconst transactionsDashOptionSanitizer: Sanitizer<TransactionsDashboardOptions> = (newOptions) => {\n const result = optionsSchema.safeParse(newOptions);\n return result.success ? result.data : undefined;\n};\n\nexport { transactionsDashOptionSanitizer };\nexport type { TransactionsDashboardOptions };\n","import { Sanitizer } from \"./componentOptions.ts\";\nimport * as z from \"zod\";\n\nconst optionsSchema = z.optional(z.string().trim());\n\n/**\n * ensure that the accessToken passed in by partners can only be a string\n * @param token\n */\nconst accessTokenSanitizer: Sanitizer<string> = (token: unknown) => {\n const result = optionsSchema.safeParse(token);\n return result.success ? result.data : undefined;\n};\n\nexport { accessTokenSanitizer };\n","import { Sanitizer } from \"./componentOptions.ts\";\nimport * as z from \"zod\";\n\nconst hexColorRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\n\nconst optionsSchema = z.optional(\n z.array(\n z.string()\n .trim(),\n ),\n);\n\n/**\n * ensure that the dataVisualizationColors passed in by partners can only be an array of colors in Hex represented\n * by strings\n * @param colors\n */\nconst dataVisualizationColorsSanitizer: Sanitizer<string[]> = (colors) => {\n const result = optionsSchema.safeParse(colors);\n if (!result.success || result.data === undefined) {\n return undefined;\n }\n\n const unsanitizedColors = result.data;\n const sanitizedColors = unsanitizedColors.filter(color => hexColorRegex.test(color));\n\n return sanitizedColors.length > 0 ? sanitizedColors : undefined;\n};\n\nexport { dataVisualizationColorsSanitizer };\n","import { ExternalOptions, UnsanitizedOptions } from \"./externalOptionsSlice.ts\";\nimport { TransactionsDashboardOptions, transactionsDashOptionSanitizer } from \"./transactionsDashOptionsSanitizer.ts\";\nimport { accessTokenSanitizer } from \"./accessTokenSanitizer.ts\";\nimport { entries } from \"lodash-es\";\nimport { dataVisualizationColorsSanitizer } from \"./dataVisualizationColorsSanitizer.ts\";\n\ntype Sanitizer<T> = (options: UnsanitizedOptions<T> | unknown) => T | undefined;\n\ntype SanitizerMap = {\n transactionsDashboard: Sanitizer<TransactionsDashboardOptions>;\n accessToken: Sanitizer<string>;\n dataVisualizationColors: Sanitizer<string[]>;\n};\n\nconst sanitizerMap: Readonly<SanitizerMap> = {\n transactionsDashboard: transactionsDashOptionSanitizer,\n accessToken: accessTokenSanitizer,\n dataVisualizationColors: dataVisualizationColorsSanitizer,\n};\n\nfunction isValidSanitizerKey(key: string): key is keyof SanitizerMap {\n return sanitizerMap[key as keyof SanitizerMap] !== undefined;\n}\n\n/**\n * Sanitizes options using the appropriate sanitizer for the given key\n * in the exported function we assume options are at least somewhat typed correctly for better DX\n * however, since these are exported and could be called from JS casting we handle as a true unknown here\n *\n * @param optionKey - The key identifying which sanitizer to use/options to set\n * @param options - The options to sanitize\n * @returns The sanitized options or undefined if no sanitizer exists for the key\n */\nconst sanitizeOptions = (optionKey: string, options: unknown) => {\n if (!isValidSanitizerKey(optionKey)) {\n return undefined;\n }\n const sanitizer = sanitizerMap[optionKey];\n return sanitizer(options);\n};\n\nfunction cleanOptions(options: UnsanitizedOptions<Partial<ExternalOptions>>) {\n let cleanedOptions = {};\n for (const [key, value] of entries(options)) {\n const sanitizedOptions = sanitizeOptions(key, value);\n if (sanitizedOptions !== undefined) {\n cleanedOptions = { ...cleanedOptions, [key]: sanitizedOptions };\n }\n }\n return cleanedOptions;\n}\n\nexport { cleanOptions };\n\nexport type { Sanitizer, SanitizerMap };\n","import { ExternalOptions } from \"../store/componentOptions/externalOptionsSlice.ts\";\nimport { useGlobalStore } from \"../store/globalStore.ts\";\nimport { cloneDeep } from \"lodash-es\";\nimport { cleanOptions } from \"../store/componentOptions/componentOptions.ts\";\nimport { useMemo, useRef } from \"react\";\n\n/**\n * Set library-wide options for various components.\n *\n * For Developers:\n * This hook subscribes a component to Tight Embedded's option store, which is shared across all Tight Components\n * The initial options passed into the hook will be set as the value of options on the hook's first render.\n * When a component modifies these options by calling setOptions, all subscribed components will re-render with the new options\n *\n * @param initialOptions - options to pass into the store on first render of this hook.\n *\n * @example\n * ```TypeScript\n * const { options, setOptions } = useOptions({ accessToken: \"my-token\" })\n *\n * <button onClick={() => setOptions(someValue)} />\n * ```\n */\nexport function useOptions(initialOptions?: Partial<ExternalOptions>) {\n const hasInitialized = useRef(false);\n const setOptions = useGlobalStore(state => state.setOptions);\n\n if (initialOptions && !hasInitialized.current) {\n const cleanedOptions = cleanOptions(initialOptions);\n setOptions(cleanedOptions); // TODO: determine if we want to pass replace flag here\n hasInitialized.current = true;\n }\n\n const storeOptions = useGlobalStore(state => state.externalOptions);\n\n // prevent direct reference of store but maintain referential stability when options don't change\n const options = useMemo(() => cloneDeep(storeOptions), [storeOptions]);\n return { options, setOptions };\n}\n","// src/assert.ts\nfunction isObject(value) {\n return typeof value === \"object\" && value != null && !Array.isArray(value);\n}\nvar isObjectOrArray = (obj) => typeof obj === \"object\" && obj !== null;\n\n// src/compact.ts\nfunction compact(value) {\n return Object.fromEntries(Object.entries(value ?? {}).filter(([_, value2]) => value2 !== void 0));\n}\n\n// src/condition.ts\nvar isBaseCondition = (v) => v === \"base\";\nfunction filterBaseConditions(c) {\n return c.slice().filter((v) => !isBaseCondition(v));\n}\n\n// src/hash.ts\nfunction toChar(code) {\n return String.fromCharCode(code + (code > 25 ? 39 : 97));\n}\nfunction toName(code) {\n let name = \"\";\n let x;\n for (x = Math.abs(code); x > 52; x = x / 52 | 0) name = toChar(x % 52) + name;\n return toChar(x % 52) + name;\n}\nfunction toPhash(h, x) {\n let i = x.length;\n while (i) h = h * 33 ^ x.charCodeAt(--i);\n return h;\n}\nfunction toHash(value) {\n return toName(toPhash(5381, value) >>> 0);\n}\n\n// src/important.ts\nvar importantRegex = /\\s*!(important)?/i;\nfunction isImportant(value) {\n return typeof value === \"string\" ? importantRegex.test(value) : false;\n}\nfunction withoutImportant(value) {\n return typeof value === \"string\" ? value.replace(importantRegex, \"\").trim() : value;\n}\nfunction withoutSpace(str) {\n return typeof str === \"string\" ? str.replaceAll(\" \", \"_\") : str;\n}\n\n// src/memo.ts\nvar memo = (fn) => {\n const cache = /* @__PURE__ */ new Map();\n const get = (...args) => {\n const key = JSON.stringify(args);\n if (cache.has(key)) {\n return cache.get(key);\n }\n const result = fn(...args);\n cache.set(key, result);\n return result;\n };\n return get;\n};\n\n// src/merge-props.ts\nvar MERGE_OMIT = /* @__PURE__ */ new Set([\"__proto__\", \"constructor\", \"prototype\"]);\nfunction mergeProps(...sources) {\n return sources.reduce((prev, obj) => {\n if (!obj) return prev;\n Object.keys(obj).forEach((key) => {\n if (MERGE_OMIT.has(key)) return;\n const prevValue = prev[key];\n const value = obj[key];\n if (isObject(prevValue) && isObject(value)) {\n prev[key] = mergeProps(prevValue, value);\n } else {\n prev[key] = value;\n }\n });\n return prev;\n }, {});\n}\n\n// src/walk-object.ts\nvar isNotNullish = (element) => element != null;\nfunction walkObject(target, predicate, options = {}) {\n const { stop, getKey } = options;\n function inner(value, path = []) {\n if (isObjectOrArray(value)) {\n const result = {};\n for (const [prop, child] of Object.entries(value)) {\n const key = getKey?.(prop, child) ?? prop;\n const childPath = [...path, key];\n if (stop?.(value, childPath)) {\n return predicate(value, path);\n }\n const next = inner(child, childPath);\n if (isNotNullish(next)) {\n result[key] = next;\n }\n }\n return result;\n }\n return predicate(value, path);\n }\n return inner(target);\n}\nfunction mapObject(obj, fn) {\n if (Array.isArray(obj)) return obj.map((value) => fn(value));\n if (!isObject(obj)) return fn(obj);\n return walkObject(obj, (value) => fn(value));\n}\n\n// src/normalize-style-object.ts\nfunction toResponsiveObject(values, breakpoints) {\n return values.reduce(\n (acc, current, index) => {\n const key = breakpoints[index];\n if (current != null) {\n acc[key] = current;\n }\n return acc;\n },\n {}\n );\n}\nfunction normalizeStyleObject(styles, context, shorthand = true) {\n const { utility, conditions } = context;\n const { hasShorthand, resolveShorthand } = utility;\n return walkObject(\n styles,\n (value) => {\n return Array.isArray(value) ? toResponsiveObject(value, conditions.breakpoints.keys) : value;\n },\n {\n stop: (value) => Array.isArray(value),\n getKey: shorthand ? (prop) => hasShorthand ? resolveShorthand(prop) : prop : void 0\n }\n );\n}\n\n// src/classname.ts\nvar fallbackCondition = {\n shift: (v) => v,\n finalize: (v) => v,\n breakpoints: { keys: [] }\n};\nvar sanitize = (value) => typeof value === \"string\" ? value.replaceAll(/[\\n\\s]+/g, \" \") : value;\nfunction createCss(context) {\n const { utility, hash, conditions: conds = fallbackCondition } = context;\n const formatClassName = (str) => [utility.prefix, str].filter(Boolean).join(\"-\");\n const hashFn = (conditions, className) => {\n let result;\n if (hash) {\n const baseArray = [...conds.finalize(conditions), className];\n result = formatClassName(utility.toHash(baseArray, toHash));\n } else {\n const baseArray = [...conds.finalize(conditions), formatClassName(className)];\n result = baseArray.join(\":\");\n }\n return result;\n };\n return memo(({ base, ...styles } = {}) => {\n const styleObject = Object.assign(styles, base);\n const normalizedObject = normalizeStyleObject(styleObject, context);\n const classNames = /* @__PURE__ */ new Set();\n walkObject(normalizedObject, (value, paths) => {\n if (value == null) return;\n const important = isImportant(value);\n const [prop, ...allConditions] = conds.shift(paths);\n const conditions = filterBaseConditions(allConditions);\n const transformed = utility.transform(prop, withoutImportant(sanitize(value)));\n let className = hashFn(conditions, transformed.className);\n if (important) className = `${className}!`;\n classNames.add(className);\n });\n return Array.from(classNames).join(\" \");\n });\n}\nfunction compactStyles(...styles) {\n return styles.flat().filter((style) => isObject(style) && Object.keys(compact(style)).length > 0);\n}\nfunction createMergeCss(context) {\n function resolve(styles) {\n const allStyles = compactStyles(...styles);\n if (allStyles.length === 1) return allStyles;\n return allStyles.map((style) => normalizeStyleObject(style, context));\n }\n function mergeCss(...styles) {\n return mergeProps(...resolve(styles));\n }\n function assignCss(...styles) {\n return Object.assign({}, ...resolve(styles));\n }\n return { mergeCss: memo(mergeCss), assignCss };\n}\n\n// src/hypenate-property.ts\nvar wordRegex = /([A-Z])/g;\nvar msRegex = /^ms-/;\nvar hypenateProperty = memo((property) => {\n if (property.startsWith(\"--\")) return property;\n return property.replace(wordRegex, \"-$1\").replace(msRegex, \"-ms-\").toLowerCase();\n});\n\n// src/is-css-function.ts\nvar fns = [\"min\", \"max\", \"clamp\", \"calc\"];\nvar fnRegExp = new RegExp(`^(${fns.join(\"|\")})\\\\(.*\\\\)`);\nvar isCssFunction = (v) => typeof v === \"string\" && fnRegExp.test(v);\n\n// src/is-css-unit.ts\nvar lengthUnits = \"cm,mm,Q,in,pc,pt,px,em,ex,ch,rem,lh,rlh,vw,vh,vmin,vmax,vb,vi,svw,svh,lvw,lvh,dvw,dvh,cqw,cqh,cqi,cqb,cqmin,cqmax,%\";\nvar lengthUnitsPattern = `(?:${lengthUnits.split(\",\").join(\"|\")})`;\nvar lengthRegExp = new RegExp(`^[+-]?[0-9]*.?[0-9]+(?:[eE][+-]?[0-9]+)?${lengthUnitsPattern}$`);\nvar isCssUnit = (v) => typeof v === \"string\" && lengthRegExp.test(v);\n\n// src/is-css-var.ts\nvar isCssVar = (v) => typeof v === \"string\" && /^var\\(--.+\\)$/.test(v);\n\n// src/pattern-fns.ts\nvar patternFns = {\n map: mapObject,\n isCssFunction,\n isCssVar,\n isCssUnit\n};\nvar getPatternStyles = (pattern, styles) => {\n if (!pattern?.defaultValues) return styles;\n const defaults = typeof pattern.defaultValues === \"function\" ? pattern.defaultValues(styles) : pattern.defaultValues;\n return Object.assign({}, defaults, compact(styles));\n};\n\n// src/slot.ts\nvar getSlotRecipes = (recipe = {}) => {\n const init = (slot) => ({\n className: [recipe.className, slot].filter(Boolean).join(\"__\"),\n base: recipe.base?.[slot] ?? {},\n variants: {},\n defaultVariants: recipe.defaultVariants ?? {},\n compoundVariants: recipe.compoundVariants ? getSlotCompoundVariant(recipe.compoundVariants, slot) : []\n });\n const slots = recipe.slots ?? [];\n const recipeParts = slots.map((slot) => [slot, init(slot)]);\n for (const [variantsKey, variantsSpec] of Object.entries(recipe.variants ?? {})) {\n for (const [variantKey, variantSpec] of Object.entries(variantsSpec)) {\n recipeParts.forEach(([slot, slotRecipe]) => {\n slotRecipe.variants[variantsKey] ??= {};\n slotRecipe.variants[variantsKey][variantKey] = variantSpec[slot] ?? {};\n });\n }\n }\n return Object.fromEntries(recipeParts);\n};\nvar getSlotCompoundVariant = (compoundVariants, slotName) => compoundVariants.filter((compoundVariant) => compoundVariant.css[slotName]).map((compoundVariant) => ({ ...compoundVariant, css: compoundVariant.css[slotName] }));\n\n// src/split-props.ts\nfunction splitProps(props, ...keys) {\n const descriptors = Object.getOwnPropertyDescriptors(props);\n const dKeys = Object.keys(descriptors);\n const split = (k) => {\n const clone = {};\n for (let i = 0; i < k.length; i++) {\n const key = k[i];\n if (descriptors[key]) {\n Object.defineProperty(clone, key, descriptors[key]);\n delete descriptors[key];\n }\n }\n return clone;\n };\n const fn = (key) => split(Array.isArray(key) ? key : dKeys.filter(key));\n return keys.map(fn).concat(split(dKeys));\n}\n\n// src/uniq.ts\nvar uniq = (...items) => {\n const set = items.reduce((acc, currItems) => {\n if (currItems) {\n currItems.forEach((item) => acc.add(item));\n }\n return acc;\n }, /* @__PURE__ */ new Set([]));\n return Array.from(set);\n};\nexport {\n compact,\n createCss,\n createMergeCss,\n filterBaseConditions,\n getPatternStyles,\n getSlotCompoundVariant,\n getSlotRecipes,\n hypenateProperty,\n isBaseCondition,\n isObject,\n mapObject,\n memo,\n mergeProps,\n patternFns,\n splitProps,\n toHash,\n uniq,\n walkObject,\n withoutSpace\n};\n\n\n\n// src/normalize-html.ts\nvar htmlProps = [\"htmlSize\", \"htmlTranslate\", \"htmlWidth\", \"htmlHeight\"];\nfunction convert(key) {\n return htmlProps.includes(key) ? key.replace(\"html\", \"\").toLowerCase() : key;\n}\nfunction normalizeHTMLProps(props) {\n return Object.fromEntries(Object.entries(props).map(([key, value]) => [convert(key), value]));\n}\nnormalizeHTMLProps.keys = htmlProps;\nexport {\n normalizeHTMLProps\n};\n\n\nexport function __spreadValues(a, b) {\n return { ...a, ...b }\n}\n\nexport function __objRest(source, exclude) {\n return Object.fromEntries(Object.entries(source).filter(([key]) => !exclude.includes(key)))\n}","import { withoutSpace } from '../helpers.mjs';\n\nconst conditionsStr = \"_hover,_focus,_focusWithin,_focusVisible,_disabled,_active,_visited,_target,_readOnly,_readWrite,_empty,_checked,_enabled,_expanded,_highlighted,_complete,_incomplete,_dragging,_before,_after,_firstLetter,_firstLine,_marker,_selection,_file,_backdrop,_first,_last,_only,_even,_odd,_firstOfType,_lastOfType,_onlyOfType,_peerFocus,_peerHover,_peerActive,_peerFocusWithin,_peerFocusVisible,_peerDisabled,_peerChecked,_peerInvalid,_peerExpanded,_peerPlaceholderShown,_groupFocus,_groupHover,_groupActive,_groupFocusWithin,_groupFocusVisible,_groupDisabled,_groupChecked,_groupExpanded,_groupInvalid,_indeterminate,_required,_valid,_invalid,_autofill,_inRange,_outOfRange,_placeholder,_placeholderShown,_pressed,_selected,_grabbed,_underValue,_overValue,_atValue,_default,_optional,_open,_closed,_fullscreen,_loading,_hidden,_current,_currentPage,_currentStep,_today,_unavailable,_rangeStart,_rangeEnd,_now,_topmost,_motionReduce,_motionSafe,_print,_landscape,_portrait,_dark,_light,_osDark,_osLight,_highContrast,_lessContrast,_moreContrast,_ltr,_rtl,_scrollbar,_scrollbarThumb,_scrollbarTrack,_horizontal,_vertical,_icon,_starting,_noscript,_invertedColors,sm,smOnly,smDown,md,mdOnly,mdDown,lg,lgOnly,lgDown,xl,xlOnly,xlDown,1.5xl,1.5xlOnly,1.5xlDown,2xl,2xlOnly,2xlDown,smToMd,smToLg,smToXl,smTo1.5xl,smTo2xl,mdToLg,mdToXl,mdTo1.5xl,mdTo2xl,lgToXl,lgTo1.5xl,lgTo2xl,xlTo1.5xl,xlTo2xl,1.5xlTo2xl,base\"\nconst conditions = new Set(conditionsStr.split(','))\n\nconst conditionRegex = /^@|&|&$/\n\nexport function isCondition(value){\n return conditions.has(value) || conditionRegex.test(value)\n}\n\nconst underscoreRegex = /^_/\nconst conditionsSelectorRegex = /&|@/\n\nexport function finalizeConditions(paths){\n return paths.map((path) => {\n if (conditions.has(path)){\n return path.replace(underscoreRegex, '')\n }\n\n if (conditionsSelectorRegex.test(path)){\n return `[${withoutSpace(path.trim())}]`\n }\n\n return path\n })}\n\n export function sortConditions(paths){\n return paths.sort((a, b) => {\n const aa = isCondition(a)\n const bb = isCondition(b)\n if (aa && !bb) return 1\n if (!aa && bb) return -1\n return 0\n })\n }","import { createCss, createMergeCss, hypenateProperty, withoutSpace } from '../helpers.mjs';\nimport { sortConditions, finalizeConditions } from './conditions.mjs';\n\nconst utilities = \"aspectRatio:asp,boxDecorationBreak:bx-db,zIndex:z,boxSizing:bx-s,objectPosition:obj-p,objectFit:obj-f,overscrollBehavior:ovs-b,overscrollBehaviorX:ovs-bx,overscrollBehaviorY:ovs-by,position:pos,top:top,left:left,inset:inset,insetInline:inset-x,insetBlock:inset-y,insetBlockEnd:inset-be,insetBlockStart:inset-bs,insetInlineEnd:inset-e,insetInlineStart:inset-s,right:right,bottom:bottom,float:float,visibility:vis,display:d,hideFrom:hide,hideBelow:show,flexBasis:flex-b,flex:flex,flexDirection:flex-d,flexGrow:flex-g,flexShrink:flex-sh,gridTemplateColumns:grid-tc,gridTemplateRows:grid-tr,gridColumn:grid-c,gridRow:grid-r,gridColumnStart:grid-cs,gridColumnEnd:grid-ce,gridAutoFlow:grid-af,gridAutoColumns:grid-ac,gridAutoRows:grid-ar,gap:gap,gridGap:grid-g,gridRowGap:grid-rg,gridColumnGap:grid-cg,rowGap:rg,columnGap:cg,justifyContent:jc,alignContent:ac,alignItems:ai,alignSelf:as,padding:p,paddingLeft:pl,paddingRight:pr,paddingTop:pt,paddingBottom:pb,paddingBlock:py,paddingBlockEnd:pbe,paddingBlockStart:pbs,paddingInline:px,paddingInlineEnd:pe,paddingInlineStart:ps,marginLeft:ml,marginRight:mr,marginTop:mt,marginBottom:mb,margin:m,marginBlock:my,marginBlockEnd:mbe,marginBlockStart:mbs,marginInline:mx,marginInlineEnd:me,marginInlineStart:ms,spaceX:sx,spaceY:sy,outlineWidth:ring-w,outlineColor:ring-c,outline:ring,outlineOffset:ring-o,divideX:dvd-x,divideY:dvd-y,divideColor:dvd-c,divideStyle:dvd-s,width:w,inlineSize:w-is,minWidth:min-w,minInlineSize:min-w-is,maxWidth:max-w,maxInlineSize:max-w-is,height:h,blockSize:h-bs,minHeight:min-h,minBlockSize:min-h-bs,maxHeight:max-h,maxBlockSize:max-b,boxSize:size,color:c,fontFamily:ff,fontSize:fs,fontSizeAdjust:fs-a,fontPalette:fp,fontKerning:fk,fontFeatureSettings:ff-s,fontWeight:fw,fontSmoothing:fsmt,fontVariant:fv,fontVariantAlternates:fv-alt,fontVariantCaps:fv-caps,fontVariationSettings:fv-s,fontVariantNumeric:fv-num,letterSpacing:ls,lineHeight:lh,textAlign:ta,textDecoration:td,textDecorationColor:td-c,textEmphasisColor:te-c,textDecorationStyle:td-s,textDecorationThickness:td-t,textUnderlineOffset:tu-o,textTransform:tt,textIndent:ti,textShadow:tsh,textShadowColor:tsh-c,textOverflow:tov,verticalAlign:va,wordBreak:wb,textWrap:tw,truncate:trunc,lineClamp:lc,listStyleType:li-t,listStylePosition:li-pos,listStyleImage:li-img,listStyle:li-s,backgroundPosition:bg-p,backgroundPositionX:bg-p-x,backgroundPositionY:bg-p-y,backgroundAttachment:bg-a,backgroundClip:bg-cp,background:bg,backgroundColor:bg-c,backgroundOrigin:bg-o,backgroundImage:bg-i,backgroundRepeat:bg-r,backgroundBlendMode:bg-bm,backgroundSize:bg-s,backgroundGradient:bg-grad,backgroundLinear:bg-linear,backgroundRadial:bg-radial,backgroundConic:bg-conic,textGradient:txt-grad,gradientFromPosition:grad-from-pos,gradientToPosition:grad-to-pos,gradientFrom:grad-from,gradientTo:grad-to,gradientVia:grad-via,gradientViaPosition:grad-via-pos,borderRadius:bdr,borderTopLeftRadius:bdr-tl,borderTopRightRadius:bdr-tr,borderBottomRightRadius:bdr-br,borderBottomLeftRadius:bdr-bl,borderTopRadius:bdr-t,borderRightRadius:bdr-r,borderBottomRadius:bdr-b,borderLeftRadius:bdr-l,borderStartStartRadius:bdr-ss,borderStartEndRadius:bdr-se,borderStartRadius:bdr-s,borderEndStartRadius:bdr-es,borderEndEndRadius:bdr-ee,borderEndRadius:bdr-e,border:bd,borderWidth:bd-w,borderTopWidth:bd-t-w,borderLeftWidth:bd-l-w,borderRightWidth:bd-r-w,borderBottomWidth:bd-b-w,borderBlockStartWidth:bd-bs-w,borderBlockEndWidth:bd-be-w,borderColor:bd-c,borderInline:bd-x,borderInlineWidth:bd-x-w,borderInlineColor:bd-x-c,borderBlock:bd-y,borderBlockWidth:bd-y-w,borderBlockColor:bd-y-c,borderLeft:bd-l,borderLeftColor:bd-l-c,borderInlineStart:bd-s,borderInlineStartWidth:bd-s-w,borderInlineStartColor:bd-s-c,borderRight:bd-r,borderRightColor:bd-r-c,borderInlineEnd:bd-e,borderInlineEndWidth:bd-e-w,borderInlineEndColor:bd-e-c,borderTop:bd-t,borderTopColor:bd-t-c,borderBottom:bd-b,borderBottomColor:bd-b-c,borderBlockEnd:bd-be,borderBlockEndColor:bd-be-c,borderBlockStart:bd-bs,borderBlockStartColor:bd-bs-c,opacity:op,boxShadow:bx-sh,boxShadowColor:bx-sh-c,mixBlendMode:mix-bm,filter:filter,brightness:brightness,contrast:contrast,grayscale:grayscale,hueRotate:hue-rotate,invert:invert,saturate:saturate,sepia:sepia,dropShadow:drop-shadow,blur:blur,backdropFilter:bkdp,backdropBlur:bkdp-blur,backdropBrightness:bkdp-brightness,backdropContrast:bkdp-contrast,backdropGrayscale:bkdp-grayscale,backdropHueRotate:bkdp-hue-rotate,backdropInvert:bkdp-invert,backdropOpacity:bkdp-opacity,backdropSaturate:bkdp-saturate,backdropSepia:bkdp-sepia,borderCollapse:bd-cl,borderSpacing:bd-sp,borderSpacingX:bd-sx,borderSpacingY:bd-sy,tableLayout:tbl,transitionTimingFunction:trs-tmf,transitionDelay:trs-dly,transitionDuration:trs-dur,transitionProperty:trs-prop,transition:trs,animation:anim,animationName:anim-n,animationTimingFunction:anim-tmf,animationDuration:anim-dur,animationDelay:anim-dly,animationPlayState:anim-ps,animationComposition:anim-comp,animationFillMode:anim-fm,animationDirection:anim-dir,animationIterationCount:anim-ic,animationRange:anim-r,animationState:anim-s,animationRangeStart:anim-rs,animationRangeEnd:anim-re,animationTimeline:anim-tl,transformOrigin:trf-o,transformBox:trf-b,transformStyle:trf-s,transform:trf,rotate:rotate,rotateX:rotate-x,rotateY:rotate-y,rotateZ:rotate-z,scale:scale,scaleX:scale-x,scaleY:scale-y,translate:translate,translateX:translate-x,translateY:translate-y,translateZ:translate-z,accentColor:ac-c,caretColor:ca-c,scrollBehavior:scr-bhv,scrollbar:scr-bar,scrollbarColor:scr-bar-c,scrollbarGutter:scr-bar-g,scrollbarWidth:scr-bar-w,scrollMargin:scr-m,scrollMarginLeft:scr-ml,scrollMarginRight:scr-mr,scrollMarginTop:scr-mt,scrollMarginBottom:scr-mb,scrollMarginBlock:scr-my,scrollMarginBlockEnd:scr-mbe,scrollMarginBlockStart:scr-mbt,scrollMarginInline:scr-mx,scrollMarginInlineEnd:scr-me,scrollMarginInlineStart:scr-ms,scrollPadding:scr-p,scrollPaddingBlock:scr-py,scrollPaddingBlockStart:scr-pbs,scrollPaddingBlockEnd:scr-pbe,scrollPaddingInline:scr-px,scrollPaddingInlineEnd:scr-pe,scrollPaddingInlineStart:scr-ps,scrollPaddingLeft:scr-pl,scrollPaddingRight:scr-pr,scrollPaddingTop:scr-pt,scrollPaddingBottom:scr-pb,scrollSnapAlign:scr-sa,scrollSnapStop:scrs-s,scrollSnapType:scrs-t,scrollSnapStrictness:scrs-strt,scrollSnapMargin:scrs-m,scrollSnapMarginTop:scrs-mt,scrollSnapMarginBottom:scrs-mb,scrollSnapMarginLeft:scrs-ml,scrollSnapMarginRight:scrs-mr,scrollSnapCoordinate:scrs-c,scrollSnapDestination:scrs-d,scrollSnapPointsX:scrs-px,scrollSnapPointsY:scrs-py,scrollSnapTypeX:scrs-tx,scrollSnapTypeY:scrs-ty,scrollTimeline:scrtl,scrollTimelineAxis:scrtl-a,scrollTimelineName:scrtl-n,touchAction:tch-a,userSelect:us,overflow:ov,overflowWrap:ov-wrap,overflowX:ov-x,overflowY:ov-y,overflowAnchor:ov-a,overflowBlock:ov-b,overflowInline:ov-i,overflowClipBox:ovcp-bx,overflowClipMargin:ovcp-m,overscrollBehaviorBlock:ovs-bb,overscrollBehaviorInline:ovs-bi,fill:fill,stroke:stk,strokeWidth:stk-w,strokeDasharray:stk-dsh,strokeDashoffset:stk-do,strokeLinecap:stk-lc,strokeLinejoin:stk-lj,strokeMiterlimit:stk-ml,strokeOpacity:stk-op,srOnly:sr,debug:debug,appearance:ap,backfaceVisibility:bfv,clipPath:cp-path,hyphens:hy,mask:msk,maskImage:msk-i,maskSize:msk-s,textSizeAdjust:txt-adj,container:cq,containerName:cq-n,containerType:cq-t,cursor:cursor\"\n\nconst classNameByProp = new Map()\nutilities.split(',').forEach((utility) => {\n const [prop, className] = utility.split(':')\n classNameByProp.set(prop, className)\n})\n\nconst context = {\n \n conditions: {\n shift: sortConditions,\n finalize: finalizeConditions,\n breakpoints: { keys: [\"base\",\"sm\",\"md\",\"lg\",\"xl\",\"1.5xl\",\"2xl\"] }\n },\n utility: {\n prefix: \"tsystem\",\n transform: (key, value) => ({ className: `${classNameByProp.get(key) || hypenateProperty(key)}_${withoutSpace(value)}` }),\n \n toHash: (path, hashFn) => hashFn(path.join(\":\")),\n resolveShorthand: prop => prop,\n }\n}\n\nconst cssFn = createCss(context)\nexport const css = (...styles) => cssFn(mergeCss(...styles))\ncss.raw = (...styles) => mergeCss(...styles)\n\nexport const { mergeCss, assignCss } = createMergeCss(context)","function cx() {\n let str = '',\n i = 0,\n arg\n\n for (; i < arguments.length; ) {\n if ((arg = arguments[i++]) && typeof arg === 'string') {\n str && (str += ' ')\n str += arg\n }\n }\n return str\n}\n\nexport { cx }","import { compact, mergeProps, memo, splitProps, uniq } from '../helpers.mjs';\nimport { css, mergeCss } from './css.mjs';\n\nconst defaults = (conf) => ({\n base: {},\n variants: {},\n defaultVariants: {},\n compoundVariants: [],\n ...conf,\n})\n\nexport function cva(config) {\n const { base, variants, defaultVariants, compoundVariants } = defaults(config)\n const getVariantProps = (variants) => ({ ...defaultVariants, ...compact(variants) })\n\n function resolve(props = {}) {\n const computedVariants = getVariantProps(props)\n let variantCss = { ...base }\n for (const [key, value] of Object.entries(computedVariants)) {\n if (variants[key]?.[value]) {\n variantCss = mergeCss(variantCss, variants[key][value])\n }\n }\n const compoundVariantCss = getCompoundVariantCss(compoundVariants, computedVariants)\n return mergeCss(variantCss, compoundVariantCss)\n }\n\n function merge(__cva) {\n const override = defaults(__cva.config)\n const variantKeys = uniq(__cva.variantKeys, Object.keys(variants))\n return cva({\n base: mergeCss(base, override.base),\n variants: Object.fromEntries(\n variantKeys.map((key) => [key, mergeCss(variants[key], override.variants[key])]),\n ),\n defaultVariants: mergeProps(defaultVariants, override.defaultVariants),\n compoundVariants: [...compoundVariants, ...override.compoundVariants],\n })\n }\n\n function cvaFn(props) {\n return css(resolve(props))\n }\n\n const variantKeys = Object.keys(variants)\n\n function splitVariantProps(props) {\n return splitProps(props, variantKeys)\n }\n\n const variantMap = Object.fromEntries(Object.entries(variants).map(([key, value]) => [key, Object.keys(value)]))\n\n return Object.assign(memo(cvaFn), {\n __cva__: true,\n variantMap,\n variantKeys,\n raw: resolve,\n config,\n merge,\n splitVariantProps,\n getVariantProps\n })\n}\n\nexport function getCompoundVariantCss(compoundVariants, variantMap) {\n let result = {}\n compoundVariants.forEach((compoundVariant) => {\n const isMatching = Object.entries(compoundVariant).every(([key, value]) => {\n if (key === 'css') return true\n\n const values = Array.isArray(value) ? value : [value]\n return values.some((value) => variantMap[key] === value)\n })\n\n if (isMatching) {\n result = mergeCss(result, compoundVariant.css)\n }\n })\n\n return result\n}\n\nexport function assertCompoundVariant(name, compoundVariants, variants, prop) {\n if (compoundVariants.length > 0 && typeof variants?.[prop] === 'object') {\n throw new Error(`[recipe:${name}:${prop}] Conditions are not supported when using compound variants.`)\n }\n}\n","/**\n * All currently publicly exposed class names.\n * Updates to this list are considered public API changes.\n * Therefore, they need to be reviewed and documented by upper management.\n * Figma should be updated as well.\n * If new class names are added, they should be added to the list below.\n * IF THE NAME OF THIS CLASS IS CHANGED, YOU MUST UPDATE THE EXPECTATION IN THE GULP TASK\n */\nenum ValidClassName {\n component = \"component\",\n \"dashboard-placeholder-table\" = \"dashboard-placeholder-table\",\n \"dashboard-header\" = \"dashboard-header\",\n \"dashboard-table\" = \"dashboard-table\",\n \"dashboard-table-body\" = \"dashboard-table-body\",\n \"dashboard-table-cell\" = \"dashboard-table-cell\",\n \"dashboard-table-column-header\" = \"dashboard-table-column-header\",\n \"dashboard-table-header\" = \"dashboard-table-header\",\n label = \"label\",\n popup = \"popup\",\n \"popup-sort-row\" = \"popup-sort-row\",\n \"progress-bar\" = \"progress-bar\",\n \"progress-bar-fill\" = \"progress-bar-fill\",\n summation = \"summation\",\n \"table-parent-row\" = \"table-parent-row\",\n \"table-row\" = \"table-row\",\n \"table-sub-row\" = \"table-sub-row\",\n tile = \"tile\",\n \"tile-bar-label\" = \"tile-bar-label\",\n \"tile-body\" = \"tile-body\",\n \"tile-filter-button\" = \"tile-filter-button\",\n \"tile-filter-list\" = \"tile-filter-list\",\n \"tile-filter-row\" = \"tile-filter-row\",\n \"tile-header\" = \"tile-header\",\n \"tile-title\" = \"tile-title\",\n title = \"title\",\n \"business-owner-dashboard\" = \"business-owner-dashboard\",\n \"business-owner-dashboard-header\" = \"business-owner-dashboard-header\",\n \"business-owner-table\" = \"business-owner-table\",\n \"transaction-type-label\" = \"transaction-type-label\", // label above Transaction Date Cell\n \"selector-row\" = \"selector-row\", // options on popup selectors\n \"popup-list\" = \"popup-list\", // container for popup selector\n badge = \"badge\", // text badge with background color and border\n \"date-cell\" = \"date-cell\", // date cell in transaction table\n \"expander-cell\" = \"expander-cell\",\n \"vertical-divider\" = \"vertical-divider\",\n \"horizontal-divider\" = \"horizontal-divider\",\n \"table-cell-divider\" = \"table-cell-divider\",\n \"checkbox-input\" = \"checkbox-input\",\n \"bulk-select\" = \"bulk-select\",\n \"button-base\" = \"button-base\",\n \"button-discrete-small\" = \"button-discrete-small\", // small button with border and background and hover\n \"button-primary\" = \"button-primary\", // primary button with foreground colors\n \"button-secondary\" = \"button-secondary\", // secondary button with brand colors\n \"button-tertiary\" = \"button-tertiary\", // tertiary button with secondary brand colors\n \"button-danger\" = \"button-danger\", // danger button with danger colors\n \"button-warning\" = \"button-warning\", // warning button with warning colors\n \"button-action\" = \"button-action\", // action button with action colors\n text = \"text\", // generic text component\n \"cell-button\" = \"cell-button\", // button that is an entire table cell\n \"month-picker-left-button\" = \"month-picker-left-button\",\n \"month-picker-right-button\" = \"month-picker-right-button\",\n \"filter-bar\" = \"filter-bar\",\n \"filter-search-bar\" = \"filter-search-bar\", // search bar for dashboards\n \"filter-pill\" = \"filter-pill\", // pill that displays active filters on dashboards\n \"discrete-form-input\" = \"discrete-form-input\", // discrete form inputs\n \"editable-form-input\" = \"editable-form-input\", // editable form inputs\n \"category-text\" = \"category-text\",\n \"amount-input-container\" = \"amount-input-container\",\n \"amount-input\" = \"amount-input\", // amount input\n \"modal-popup\" = \"modal-popup\", // container for modals\n \"drawer-header\" = \"drawer-header\",\n \"drawer-header-border\" = \"drawer-header-border\", // border at the base of drawer form headers\n \"transaction-form-body\" = \"transaction-form-body\",\n body = \"body\",\n heading = \"heading\",\n \"sub-label\" = \"sub-label\",\n \"strong-label\" = \"strong-label\",\n \"strong-sub-label\" = \"strong-sub-label\",\n \"metric-xl\" = \"metric-xl\",\n \"metric-md\" = \"metric-md\",\n \"large-icon\" = \"large-icon\",\n \"medium-icon\" = \"medium-icon\",\n \"small-icon\" = \"small-icon\",\n \"tiny-icon\" = \"tiny-icon\",\n \"neutral-badge\" = \"neutral-badge\",\n \"highlight-badge\" = \"highlight-badge\",\n \"success-badge\" = \"success-badge\",\n \"warning-badge\" = \"warning-badge\",\n \"critical-badge\" = \"critical-badge\",\n \"button-group\" = \"button-group\", // button group\n \"alert-dialog\" = \"alert-dialog\", // actual dialog\n \"emphasis-label\" = \"emphasis-label\", // bolder text\n \"profit-loss-graph\" = \"profit-loss-graph\",\n banner = \"banner\",\n \"banner-high\" = \"banner-high\",\n \"banner-medium\" = \"banner-medium\",\n \"banner-low\" = \"banner-low\",\n \"banner-urgent\" = \"banner-urgent\",\n \"banner-button\" = \"banner-button\",\n \"banner-button-text\" = \"banner-button-text\",\n \"banner-button-icon\" = \"banner-button-icon\",\n \"empty-dashboard-layout\" = \"empty-dashboard-layout\", // layout for zero state components for transactions\n \"zero-state-layout\" = \"zero-state-layout\", // layout for zero state components for transactions\n}\n\nexport { ValidClassName };\n","import { css, cx } from \"../../styled-system/css\";\nimport { ValidClassName } from \"./validClassNames\";\n\ntype SystemClassPrefix = \"css\";\ntype GeneratedClassName = `${SystemClassPrefix}_${string}`;\n\ntype CssReturn = ReturnType<typeof css>;\n\ntype PublicClassNamePrefix = \"Tight-\";\n\nconst publicClassNamePrefix: PublicClassNamePrefix = \"Tight-\";\n\ntype PublicClass = `${PublicClassNamePrefix}${ValidClassName}`;\n/**\n * Generates a public classname to be used for style overrides.\n * @param className The name of the class to be prefixed into a public class\n */\nconst publicClassName = (className: ValidClassName): PublicClass => `${publicClassNamePrefix}${className}`;\n\ntype Stylist = (primaryClass: ValidClassName | null, ...styles: (ValidClassName | string | undefined)[]) => (\n { className: string }\n);\n\nfunction isValidClassName(className: string): className is keyof typeof ValidClassName {\n return className in ValidClassName;\n}\n\nfunction isPublicClassName(className: string): className is PublicClass {\n const splitIndex = className.indexOf(\"-\");\n const prefix = className.slice(0, splitIndex + 1);\n const suffix = className.slice(splitIndex + 1);\n return prefix === publicClassNamePrefix && suffix in ValidClassName;\n}\n\nfunction isGeneratedClassName(className: string): className is GeneratedClassName {\n return !isValidClassName(className) && !isPublicClassName(className);\n}\n\n/**\n * A function for creating both public classnames and internal Panda classes.\n *\n * Usage:\n * ```typescript\n * const myCss = css`\n * border-radius: 4;\n * background-color: blue;\n * `;\n *\n * const blueRoundedRectangle = stylist(\"rectangle-blue-rounded\", myCss, \"another-classname\");\n *\n * ...\n *\n * <div {...blueRoundedRectangleStylist}>\n *\n * ...\n * ```\n *\n * @param primaryClass The primary public classname for the style. If no public classname should be exposed,\n * must explicitly be `null`.\n * @param styles Any number of CSS styles or classname strings. Classname strings will be made into public classnames,\n * any CSS styles will be passed in as internal CSS.\n */\nconst stylist: Stylist = (primaryClass, ...styles) => {\n const publicClassNames: PublicClass[] = []; // public classnames\n const generatedClassNames: GeneratedClassName[] = [];\n\n if (primaryClass !== null) { // primaryClass intentionally null if no public classname\n // add primary public class, if it exists\n publicClassNames.push(publicClassName(primaryClass));\n }\n\n styles.forEach((style) => {\n if (style === undefined) {\n return;\n }\n if (isGeneratedClassName(style)) {\n generatedClassNames.push(style);\n } else if (isValidClassName(style)) {\n // if style is a classname, make a public classname\n publicClassNames.push(publicClassName(style as ValidClassName));\n }\n return;\n });\n\n return {\n className: cx(...[...publicClassNames, ...generatedClassNames]),\n };\n};\n\ntype StylistReturn = ReturnType<Stylist>;\n\nexport {\n stylist,\n publicClassName,\n isGeneratedClassName,\n isValidClassName,\n isPublicClassName,\n};\n\nexport type {\n CssReturn,\n StylistReturn,\n};\n","import { PropsWithChildren } from \"react\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\n\n// TODO: If we end up using this elsewhere, move it to a more general folder\n\nconst dashHeaderLayoutStylist = stylist(ValidClassName[\"business-owner-dashboard-header\"], css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n height: 80,\n}));\n\ntype DashHeaderLayoutProps = PropsWithChildren;\n\nfunction DashHeaderLayout({ children }: DashHeaderLayoutProps) {\n return (\n <div {...dashHeaderLayoutStylist}>\n {children}\n </div>\n );\n}\nexport { DashHeaderLayout };\n","import { cx } from \"../../styled-system/css\";\nimport { isGeneratedClassName, isPublicClassName, StylistReturn } from \"./stylist.ts\";\n\nfunction extractPublicClassNames(className: string) {\n const names = className.split(\" \");\n return names.reduce<string[]>((accumulator, current) => {\n if (isPublicClassName(current)) {\n accumulator.push(current);\n }\n return accumulator;\n }, []);\n}\n\nfunction mergePublicClassNames(classNames: StylistReturn[]) {\n return classNames.reduce<string[]>((accumulator, current) => {\n const publicNames = extractPublicClassNames(current.className);\n return [...accumulator, ...publicNames];\n }, []);\n}\n\nfunction extractGeneratedClassNames(className: string) {\n const names = className.split(\" \");\n return names.reduce<string[]>((accumulator, current) => {\n if (isGeneratedClassName(current)) {\n accumulator.push(current);\n }\n return accumulator;\n }, []);\n}\n\nfunction mergeGeneratedClassNames(classNames: StylistReturn[]) {\n return classNames.reduce<string[]>((accumulator, current) => {\n const generatedNames = extractGeneratedClassNames(current.className);\n return [...accumulator, ...generatedNames];\n }, []);\n}\n\n/**\n * Function to merge multiple stylist returns into a single stylist object.\n * This is useful when a component needs to pass merged styles to child components.\n *\n * @param stylists Array of StylistReturn objects to merge\n * @returns A single merged StylistReturn object that can be spread onto elements\n *\n * @example\n * ```typescript\n * const buttonStyles = stylist(\"button\", baseCss);\n * const hoverStyles = stylist(null, hoverCss);\n * const customStyles = stylist(\"overwritten-class\", customCss);\n *\n * const mergedStyles = mergeStylists([buttonStyles, hoverStyles, customStyles]);\n *\n * return <button {...mergedStyles}>Click me</button>;\n * ```\n */\nfunction mergeStylists(stylists: (StylistReturn | StylistReturn[])): StylistReturn {\n const stylistArray = Array.isArray(stylists) ? stylists : [stylists];\n const publicClassNames = mergePublicClassNames(stylistArray);\n const generatedClassNames = mergeGeneratedClassNames(stylistArray);\n\n return {\n className: cx(...[...publicClassNames, ...generatedClassNames]),\n };\n};\n\nexport { mergeStylists };\n","import { cva } from \"../../../styled-system/css\";\n\nexport const fontRecipes = cva({\n base: {},\n variants: {\n body: {\n default: { fontWeight: \"body\", fontSize: \"body\", fontFamily: \"body\", color: \"typography.base\", lineHeight: \"16px\", letterSpacing: \"0.84px\" },\n },\n label: {\n subLabel: { fontWeight: \"label.sub\", fontSize: \"label.sub\", fontFamily: \"label\", color: \"typography.label.sub\", lineHeight: \"14px\", letterSpacing: \"0.66px\" },\n strongLabel: { fontWeight: \"label.strong\", fontSize: \"label.strong\", fontFamily: \"label\", color: \"typography.label.strong\", lineHeight: \"16px\", letterSpacing: \"0.84px\" },\n strongSubLabel: { fontWeight: \"label.strongSub\", fontSize: \"label.strongSub\", fontFamily: \"label\", color: \"typography.label.strongSub\", lineHeight: \"14px\", letterSpacing: \"0.84px\" },\n },\n heading: {\n default: { fontWeight: \"heading\", fontSize: \"heading\", fontFamily: \"heading\", color: \"typography.heading\", lineHeight: \"25px\", letterSpacing: \"2px\" },\n },\n metric: {\n sm: { fontWeight: \"metric.sm\", fontSize: \"metric.sm\", fontFamily: \"metric\", color: \"typography.metric.sm\" },\n md: { fontWeight: \"metric.md\", fontSize: \"metric.md\", fontFamily: \"metric\", color: \"typography.metric.md\" },\n lg: { fontWeight: \"metric.lg\", fontSize: \"metric.lg\", fontFamily: \"metric\", color: \"typography.metric.lg\" },\n xl: { fontWeight: \"metric.xl\", fontSize: \"metric.xl\", fontFamily: \"metric\", color: \"typography.metric.xl\" },\n },\n },\n});\n","import { stylist, StylistReturn } from \"../../style/stylist.ts\";\nimport { mergeStylists } from \"../../style/mergeStylists.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { fontRecipes } from \"../../style/recipes/fontRecipes.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\ntype HeadingProps = {\n children?: string;\n stylists?: StylistReturn[];\n};\n\nconst headingStylist = stylist(ValidClassName.heading,\n fontRecipes({ heading: \"default\" }),\n css({\n whiteSpace: \"nowrap\",\n }),\n);\n\nfunction Heading({ children, stylists = [] }: HeadingProps) {\n const mergedHeadingStylists = mergeStylists([headingStylist, ...stylists]);\n return (\n <div {...mergedHeadingStylists}>\n {children}\n </div>\n );\n}\n\nexport {\n Heading,\n};\n","import { Nullable, ValueOf } from \"../utilityTypes.ts\";\n\n/**\n * A string representing a moment in the format `yyyy-MM-ddTHH:mm:ss.SSSX`\n *\n * Ex: ```2025-02-13T15:00:30.948Z```\n */\ntype TimeStamp = `${number}-${number}-${number}T${number}:${number}:${number}.${number}${string}`;\n\n/**\n * A string representing a day in the format `yyyy-MM-dd`\n *\n * Ex: ```2025-02-13```\n */\ntype SimpleDate = `${number}-${number}-${number}`;\n\nfunction formatSimpleDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\nfunction createDate(year: number, month: number, day: number): Date {\n return new Date(year, month, day);\n}\n\nfunction getBeginningOfThisYear(): string {\n const now = new Date();\n const beginningOfThisYear = createDate(now.getFullYear(), 0, 1);\n return formatSimpleDate(beginningOfThisYear);\n}\n\nfunction getEndOfThisYear(): string {\n const now = new Date();\n const endOfThisYear = createDate(now.getFullYear() + 1, 0, 0);\n return formatSimpleDate(endOfThisYear);\n}\n\nfunction getBeginningOfMonth(month: number, year: number): string {\n const date = createDate(year, month, 1);\n return formatSimpleDate(date);\n}\n\nfunction getBeginningOfThisMonth(): string {\n const now = new Date();\n return getBeginningOfMonth(now.getMonth(), now.getFullYear());\n}\n\nfunction getEndOfThisMonth(): string {\n const now = new Date();\n const endOfThisMonth = createDate(now.getFullYear(), now.getMonth() + 1, 0);\n return formatSimpleDate(endOfThisMonth);\n}\n\nfunction getBeginningOfLastYear(): string {\n const now = new Date();\n const beginningOfLastYear = createDate(now.getFullYear() - 1, 0, 1);\n return formatSimpleDate(beginningOfLastYear);\n}\n\nfunction getEndOfLastYear(): string {\n const now = new Date();\n const endOfLastYear = createDate(now.getFullYear(), 0, 0);\n return formatSimpleDate(endOfLastYear);\n}\n\nfunction getBeginningOfLastMonth(): string {\n const now = new Date();\n const beginningOfLastMonth = createDate(now.getFullYear(), now.getMonth() - 1, 1);\n return formatSimpleDate(beginningOfLastMonth);\n}\n\nfunction getEndOfLastMonth(): string {\n const now = new Date();\n const endOfLastMonth = createDate(now.getFullYear(), now.getMonth(), 0);\n return formatSimpleDate(endOfLastMonth);\n}\n\n// Returns the date at the beginning of the same month from one year ago.\nfunction getBeginningOfPastYear(): string {\n const now = new Date();\n const pastYear = createDate(now.getFullYear() - 1, now.getMonth(), 1);\n return formatSimpleDate(pastYear);\n}\n\nconst DateFilters = {\n THIS_YEAR: \"THIS_YEAR\",\n THIS_MONTH: \"THIS_MONTH\",\n LAST_YEAR: \"LAST_YEAR\",\n LAST_MONTH: \"LAST_MONTH\",\n PAST_YEAR: \"PAST_YEAR\",\n} as const;\n\ntype DateFilter = ValueOf<typeof DateFilters>;\ntype DateRange = { beginDate: Date; endDate: Date };\n\nfunction getMonthRange(month: number, year: number): DateRange {\n const beginDate = createDate(year, month, 1);\n const endDate = createDate(year, month + 1, 0);\n\n return {\n beginDate,\n endDate,\n };\n}\n\nfunction getTrailingTwelveMonths(monthIndex: number, year: number): DateRange {\n const beginDate = createDate(year - 1, monthIndex + 1, 1);\n const endDate = createDate(year, monthIndex + 1, 0);\n\n return {\n beginDate,\n endDate,\n };\n}\n\ntype DateOptions = DateFilter | DateRange;\n\nconst isDateFilter = (input: unknown): input is DateFilter => (\n Object.values(DateFilters).includes(input as DateFilter)\n);\n\nconst getBeginDate = (filter: DateFilter) => {\n switch (filter) {\n case DateFilters.THIS_YEAR:\n return getBeginningOfThisYear();\n case DateFilters.THIS_MONTH:\n return getBeginningOfThisMonth();\n case DateFilters.LAST_YEAR:\n return getBeginningOfLastYear();\n case DateFilters.LAST_MONTH:\n return getBeginningOfLastMonth();\n case DateFilters.PAST_YEAR:\n return getBeginningOfPastYear();\n default:\n return \"\";\n }\n};\n\nconst getEndDate = (filter: DateFilter) => {\n switch (filter) {\n case DateFilters.THIS_YEAR:\n return getEndOfThisYear();\n case DateFilters.THIS_MONTH:\n return getEndOfThisMonth();\n case DateFilters.LAST_YEAR:\n return getEndOfLastYear();\n case DateFilters.PAST_YEAR:\n case DateFilters.LAST_MONTH:\n return getEndOfLastMonth(); // replace with actual logic\n default:\n return \"\";\n }\n};\n\ntype DateStringRange = { beginDate: string; endDate: string };\n\nconst convertDateRangeToDateStringRange = (dateRange: DateRange): DateStringRange => {\n return {\n beginDate: formatSimpleDate(dateRange.beginDate),\n endDate: formatSimpleDate(dateRange.endDate),\n };\n};\n\nconst getDateRange = (filter: DateOptions): DateStringRange => {\n if (isDateFilter(filter)) {\n return {\n beginDate: getBeginDate(filter),\n endDate: getEndDate(filter),\n };\n }\n return convertDateRangeToDateStringRange(filter);\n};\n\n/**\n * Constants for date picker components\n */\nconst DAY_HEADERS = [\"SUN\", \"MON\", \"TUE\", \"WED\", \"THU\", \"FRI\", \"SAT\"];\nconst DATE_FORMAT_PLACEHOLDER = \"MM/DD/YYYY\";\nconst DATE_INPUT_MAX_LENGTH = 10; // Length of \"MM/DD/YYYY\"\nconst MONTH_NAMES = [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\",\n];\n\n/**\n * Generate calendar days for a given month (6 weeks = 42 days)\n * @param year - The year (e.g., 2024)\n * @param month - The month (0-11, where 0 = January, 11 = December)\n * @returns Array of 42 Date objects representing the calendar grid\n */\nfunction generateCalendarDays(year: number, month: number): Date[] {\n // Get the first day of the target month\n const firstDay = createDate(year, month, 1);\n\n // Find the Sunday that starts the calendar week containing the first day\n // firstDay.getDay() returns 0-6 (Sun-Sat), so we subtract that many days\n const startDate = new Date(firstDay);\n startDate.setDate(startDate.getDate() - firstDay.getDay());\n\n // Generate 42 consecutive days starting from that Sunday\n // This gives us exactly 6 weeks (6 × 7 = 42 days) for the calendar grid\n return Array.from({ length: 42 }, (_, i) => {\n const date = new Date(startDate);\n date.setDate(startDate.getDate() + i);\n return date;\n });\n}\n\n/**\n * Generate year options for a date picker (current year + past years)\n * @param yearsBack - Number of years to go back from current year (default: 10)\n * @param startYear - Year to start from\n * @returns Array of year numbers in descending order\n */\nfunction generateYearOptions({ yearsBack = 10, startYear }: { yearsBack?: number; startYear?: number }): number[] {\n const currentYear = startYear ?? new Date().getFullYear();\n const yearOptions = [currentYear];\n\n // Add years before current year (in descending order)\n for (let i = currentYear - 1; i >= currentYear - yearsBack; i--) {\n yearOptions.push(i);\n }\n\n return yearOptions;\n}\n\n/**\n * Check if two dates are the same day\n * @param date1 - First date to compare\n * @param date2 - Second date to compare\n * @returns True if both dates represent the same calendar day\n */\nfunction isSameDay(date1: Date, date2: Date): boolean {\n return date1.toDateString() === date2.toDateString();\n}\n\ntype Period = {\n month: number;\n year: number;\n};\n\n/**\n * Creates a period object\n * @param month - Month of the period object\n * @param year - Year of the period object\n * @returns Period object\n */\nfunction createPeriod(month: number, year: number): Period {\n return {\n month,\n year,\n };\n}\n\n/**\n * Check if two dates have the same month\n * @param month1 - First date to compare\n * @param month2 - Second date to compare\n * @returns True if both dates have the same month\n */\nfunction isSameMonth(month1: number, month2: number): boolean {\n return month1 === month2;\n}\n\n/**\n * Check if two dates have the same year\n * @param year1 - First date to compare\n * @param year2 - Second date to compare\n * @returns True if both dates have the same year\n */\nfunction isSameYear(year1: number, year2: number): boolean {\n return year1 === year2;\n}\n\n/**\n * Check if two periods are the same\n * @param period1 - First period to compare\n * @param period2 - Second period to compare\n * @returns True if both periods have the same month and year\n */\nfunction isSamePeriod(period1: Period, period2: Period): boolean {\n return isSameMonth(period1.month, period2.month) && isSameYear(period1.year, period2.year);\n}\n\n/**\n * Check if period2 is after period1\n * @param period1 - First period to compare\n * @param period2 - Second period to compare\n * @returns True if period1 is before period2\n */\nfunction isPeriodAfter(period1: Period, period2: Period): boolean {\n return (period1.year === period2.year && period2.month > period1.month) || period2.year > period1.year;\n}\n\n/**\n * Check if a date is today\n * @param date - The date to check\n * @returns True if the date is today's date\n */\nfunction isToday(date: Date): boolean {\n return isSameDay(date, new Date());\n}\n\n/**\n * Check if a date is after another date\n * @param a - First date to compare\n * @param b - Second date to compare\n * @returns True if a is after b\n */\nfunction isDateAfter(a: Date, b: Date): boolean {\n const aDate = createDate(a.getFullYear(), a.getMonth(), a.getDate());\n const bDate = createDate(b.getFullYear(), b.getMonth(), b.getDate());\n return aDate.getTime() > bDate.getTime();\n}\n\n/**\n * Check if a date is before another date\n * @param a - First date to compare\n * @param b - Second date to compare\n * @returns True if a is before b\n */\nfunction isDateBefore(a: Date, b: Date): boolean {\n const aDate = createDate(a.getFullYear(), a.getMonth(), a.getDate());\n const bDate = createDate(b.getFullYear(), b.getMonth(), b.getDate());\n return aDate.getTime() < bDate.getTime();\n}\n\n/**\n * Format Date object to MM/DD/YYYY string. Used to format Date object for display.\n * @param date - The Date object to format (can be null)\n * @returns Formatted date string or empty string if date is null\n */\nfunction formatDateToMMDDYYYY(date: Date | null): string {\n if (!date || !(date instanceof Date) || isNaN(date.getTime())) {\n return \"\";\n }\n\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const year = date.getFullYear();\n return `${month}/${day}/${year}`;\n}\n\n/**\n * Apply MM/DD/YYYY mask to input string. Used to format user input string for display.\n * @param value - Raw input string to apply mask to\n * @returns Formatted string with forward slashes inserted at appropriate positions\n */\nfunction applyDateMask(value: string): string {\n const digits = value.replace(/\\D/g, \"\");\n\n if (digits.length <= 2) {\n return digits;\n }\n if (digits.length <= 4) {\n return `${digits.slice(0, 2)}/${digits.slice(2)}`;\n }\n return `${digits.slice(0, 2)}/${digits.slice(2, 4)}/${digits.slice(4, 8)}`;\n}\n\nfunction validateDateComponents(month: number, day: number, year: number): boolean {\n if (month < 1 || month > 12 || day < 1 || day > 31) {\n return false;\n }\n\n const date = createDate(year, month - 1, day);\n return !(date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day);\n}\n\n/**\n * Parse MM/DD/YYYY string to Date. Used to convert user input string to Date object.\n * @param dateString - Date string in MM/DD/YYYY format\n * @returns Date object if valid, null if invalid or malformed\n */\nfunction parseMMDDYYYY(dateString: string): Nullable<Date> {\n if (!dateString.trim()) {\n return null;\n }\n\n const match = dateString.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{1,4})$/);\n if (!match) {\n return null;\n }\n\n const [, monthStr, dayStr, yearStr] = match;\n const month = parseInt(monthStr, 10);\n const day = parseInt(dayStr, 10);\n const year = parseInt(yearStr, 10);\n\n if (!validateDateComponents(month, day, year)) {\n return null;\n }\n\n return createDate(year, month - 1, day);\n}\n\n/**\n * Parse YYYY-MM-DD string to Date. Used to convert YYYY-MM-DD string to Date object.\n * @param dateString - Date string in YYYY-MM-DD format\n * @returns Date object representing the local date, or null if invalid\n */\nfunction parseLocalDate(dateString: string): Date | null {\n if (!dateString.trim()) {\n return null;\n }\n\n // Validate format: YYYY-MM-DD (with optional single digits for month/day)\n const match = dateString.match(/^(\\d{1,4})-(\\d{1,2})-(\\d{1,2})$/);\n if (!match) {\n return null;\n }\n\n const [, yearStr, monthStr, dayStr] = match;\n const year = parseInt(yearStr, 10);\n const month = parseInt(monthStr, 10);\n const day = parseInt(dayStr, 10);\n\n if (!validateDateComponents(month, day, year)) {\n return null;\n }\n\n return createDate(year, month - 1, day);\n}\n\n/**\n * Convert Date object to ISO date string (YYYY-MM-DD format) without timezone issues\n * This is the inverse of parseLocalDate - it converts a Date back to the same format\n * that parseLocalDate expects as input. Format used for API requests.\n * @param date - The Date object to convert\n * @returns ISO date string in YYYY-MM-DD format, or empty string if date is invalid\n */\nfunction toISODateString(date: Date): string {\n if (!date || !(date instanceof Date) || isNaN(date.getTime())) {\n return \"\";\n }\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\"); // month is 0-indexed, so add 1\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Return the minimum of two dates. If the dates are the same day, return the first date.\n * @param a - First date\n * @param b - Second date\n * @returns The minimum of the two dates\n */\nfunction minDate(a: Date, b: Date): Date {\n return isDateAfter(a, b) ? b : a;\n}\n\n/**\n * Return the maximum of two dates. If the dates are the same day, return the first date.\n * @param a - First date\n * @param b - Second date\n * @returns The maximum of the two dates\n */\nfunction maxDate(a: Date, b: Date): Date {\n return isDateAfter(b, a) ? b : a;\n}\n\n/**\n * Return the month and day of a given Date.\n * @param date - The Date object to convert\n * @param options - object that determines if month should be returned in short format\n * @returns String representation of the month and day\n */\nconst getMonthAndDay = (date: Date, options: { abbreviateMonth: boolean }) => {\n return date.toLocaleString(\"default\", { month: options.abbreviateMonth ? \"short\" : \"long\" }) + \" \" + date.getDate();\n};\n\n/**\n * Return the month and year of a given Date.\n * @param date - The Date object to convert\n * @param options - object that determines if month should be returned in short format\n * @returns String representation of the month and year\n */\nconst getMonthAndYear = (date: Date, options: { abbreviateMonth?: boolean; abbreviateYear?: boolean }) => {\n const formatOptions: Intl.DateTimeFormatOptions = {\n month: options.abbreviateMonth ? \"short\" : \"long\",\n year: options.abbreviateYear ? \"2-digit\" : \"numeric\",\n };\n\n return date.toLocaleString(\"default\", formatOptions);\n};\n\n/**\n * Return locale time of a given Date. Defaults to 12-hour format.\n * @param date - Date object to convert\n * @returns String representation of the locale time\n */\nconst getLocaleTimeString = (date: Date) => {\n return date.toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\" });\n};\n\n/**\n * Return different representations of a given Date depending on the current time. If the date is today, return locale time.\n * If the date is in the same year as the current date, return month and day. Otherwise, return month and year.\n * @param date - The Date object to convert\n * @returns String representation of a given Date\n */\nconst getConversationDateTimeString = (date: string) => {\n const dateTime = new Date(date);\n const userLocalDate = new Date();\n\n if (isToday(dateTime)) {\n return getLocaleTimeString(dateTime);\n } else if (dateTime.getFullYear() === userLocalDate.getFullYear()) {\n return getMonthAndDay(dateTime, { abbreviateMonth: true });\n } else {\n return getMonthAndYear(dateTime, { abbreviateMonth: true, abbreviateYear: false });\n }\n};\n\nexport {\n getBeginningOfThisYear,\n getEndOfThisYear,\n getBeginningOfMonth,\n getBeginningOfThisMonth,\n getEndOfThisMonth,\n getBeginningOfLastYear,\n getEndOfLastYear,\n getBeginningOfLastMonth,\n getEndOfLastMonth,\n getBeginningOfPastYear,\n DateFilters,\n isDateFilter,\n getDateRange,\n createDate,\n generateCalendarDays,\n isSameDay,\n isSameMonth,\n isSameYear,\n createPeriod,\n isSamePeriod,\n isPeriodAfter,\n isToday,\n isDateAfter,\n isDateBefore,\n formatDateToMMDDYYYY,\n applyDateMask,\n parseMMDDYYYY,\n parseLocalDate,\n toISODateString,\n generateYearOptions,\n DAY_HEADERS,\n DATE_FORMAT_PLACEHOLDER,\n DATE_INPUT_MAX_LENGTH,\n MONTH_NAMES,\n minDate,\n maxDate,\n getMonthAndDay,\n getMonthAndYear,\n getLocaleTimeString,\n getConversationDateTimeString,\n getMonthRange,\n getTrailingTwelveMonths,\n};\n\nexport type {\n DateFilter,\n DateRange,\n DateOptions,\n DateStringRange,\n TimeStamp,\n SimpleDate,\n Period,\n};\n","import { QueryKey } from \"@tanstack/react-query\";\nimport { RequestCursor } from \"./apiTypes.ts\";\nimport { TightEnvironment } from \"../../../utils/traxEnvironmentVariables.ts\";\n\ntype QueryKeyWithInjectedParams<TQueryKey extends QueryKey = QueryKey> = [...TQueryKey, { accessToken: string; environment: TightEnvironment }];\ntype QueryKeyFn<Params, TQueryKey> = (params: Params) => TQueryKey;\ntype PaginatedQueryKey<TQueryKey extends QueryKey> = [...TQueryKey, RequestCursor];\n\nfunction getInjectedParamsQueryKey<TQueryKey extends QueryKey>(queryKey: TQueryKey, accessToken: string, environment: TightEnvironment): QueryKeyWithInjectedParams<TQueryKey> {\n return [...queryKey, { accessToken, environment }];\n}\n\n/**\n * Creates a paginated query key\n * @param baseQueryKey - The base query key to extend\n * @param cursor - Cursor string used to make this request\n * @returns A new query key with the appropriate cursor parameter\n */\nfunction getPaginatedQueryKey<TQueryKey extends QueryKey>(\n baseQueryKey: TQueryKey,\n cursor: RequestCursor,\n): PaginatedQueryKey<TQueryKey> {\n return [...baseQueryKey, cursor];\n}\n\nexport {\n getInjectedParamsQueryKey,\n getPaginatedQueryKey,\n};\n\nexport type {\n QueryKeyWithInjectedParams,\n QueryKeyFn,\n PaginatedQueryKey,\n};\n","const isNullish = (value: unknown): value is null | undefined => {\n return value === null || value === undefined;\n};\n\nconst isNotNullish = <T>(value: T | null | undefined): value is T => {\n return !isNullish(value);\n};\n\nexport {\n isNullish,\n isNotNullish,\n};\n","import { isNullish } from \"../typeUtils\";\n\nfunction isEmpty(value: string): boolean {\n return value === \"\";\n}\n\nfunction isEmptyOrBlank(value: string): boolean {\n return value.trim() === \"\";\n}\n\nconst isNumeric = (input: string) => {\n const castNumber = Number(input);\n return !Number.isNaN(castNumber);\n};\n\n// slightly incomplete type guard since we don't check for whitespace but should work in most cases\nfunction isNullishOrEmptyOrBlank(value: string | null | undefined): value is null | undefined | \"\" {\n return isNullish(value) || isEmptyOrBlank(value);\n}\n\nfunction isNotNullishOrEmptyOrBlank(value: string | null | undefined): value is string {\n return !isNullishOrEmptyOrBlank(value);\n}\n\n/**\n * Returns an array containing two parts of a string split at a given index\n * @param input - The string to split\n * @param index - The index at which to split the string. The character at this index will be excluded from the first output string\n * and included in the second output string\n */\nconst splitAt = (input: string, index: number) => [input.substring(0, index), input.substring(index)];\n\nexport {\n isEmpty,\n isEmptyOrBlank,\n isNumeric,\n isNullishOrEmptyOrBlank,\n isNotNullishOrEmptyOrBlank,\n splitAt,\n};\n","import { createContext } from \"react\";\n\ntype AuthContextValue = {\n activeToken: string | undefined;\n accountantToken: string | undefined;\n};\n\nconst defaultContextValue: AuthContextValue = {\n activeToken: undefined,\n accountantToken: undefined,\n};\n\nconst AuthContext = createContext<AuthContextValue>(defaultContextValue);\n\nexport type {\n AuthContextValue,\n};\n\nexport {\n AuthContext,\n};\n","import { useAuthContext } from \"../../auth/useAuthContext.ts\";\n\nfunction useAccessToken(): string | undefined {\n const { activeToken } = useAuthContext();\n return activeToken;\n}\n\nexport {\n useAccessToken,\n};\n","import { useContext } from \"react\";\nimport { AuthContext, AuthContextValue } from \"./AuthContext\";\n\n/**\n * @returns The current auth context value. If called outside an AuthContext, will return { activeToken: undefined, accountantToken: undefined }\n */\nfunction useAuthContext(): AuthContextValue {\n return useContext(AuthContext);\n}\n\nexport {\n useAuthContext,\n};\n","/**\n * Small utility functions for react-query hooks.\n */\n\n/**\n * Passed as `queryFn` to `useQuery` or `mutationFn` to `useMutation` if no access token is available.\n * Puts the query/mutation in an error state, which the caller is responsible for handling.\n */\nconst errorFnNoToken = () => {\n throw new Error(\"No access token provided\");\n};\n\nexport {\n errorFnNoToken,\n};\n","import { QueryClient } from \"@tanstack/react-query\";\n\nconst gcTime = 1000 * 60 * 60 * 2; // clear the persisted query client after 2 hours\nconst staleTime = 1000 * 30; // stale an active query after 30 seconds\nconst refetchInterval = 1000 * 60; // refetch all active queries each minute\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n gcTime,\n staleTime,\n refetchInterval,\n },\n },\n});\n\nexport { queryClient, gcTime };\n","import { createContext } from \"react\";\nimport { ValueOf } from \"../utils/utilityTypes.ts\";\n\n// Public environments for external consumers\nconst Environments = {\n PRODUCTION: \"PRODUCTION\",\n SANDBOX: \"SANDBOX\",\n} as const;\n\ntype Environment = ValueOf<typeof Environments>;\n\nconst EnvironmentContext = createContext<Environment>(\"SANDBOX\");\n\nexport { EnvironmentContext, Environments };\n\nexport type { Environment };\n","import { EnvironmentContext } from \"./Environment.ts\";\nimport { useContext } from \"react\";\n\nfunction useEnvironment() {\n return useContext(EnvironmentContext);\n}\n\nexport { useEnvironment };\n","import {\n QueryFunction,\n QueryKey,\n useIsRestoring,\n useQuery,\n keepPreviousData,\n UseQueryResult,\n UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { getInjectedParamsQueryKey, QueryKeyWithInjectedParams } from \"./queryKey.ts\";\nimport { isNotNullishOrEmptyOrBlank } from \"../../../utils/string/stringUtils.ts\";\nimport { useAccessToken } from \"../../http/useAccessToken.ts\";\nimport { errorFnNoToken } from \"./queryUtils.ts\";\nimport { queryClient } from \"../../queryClient.ts\";\nimport { useEnvironment } from \"../../../environment/useEnvironment.ts\";\n\ntype EntityFetchFn<TQueryData, TQueryKey extends QueryKey> = QueryFunction<TQueryData, QueryKeyWithInjectedParams<TQueryKey>>;\n\ntype UseEntityResult<TData> = {\n /**\n * Whether the query caches are still rehydrating from persisted storage.\n */\n isRehydrating: boolean;\n /**\n * Whether the query caches are still rehydrating from persisted storage or loading for the first time.\n * Equivalent to `isRehydrating || isLoading`.\n */\n isFilling: boolean;\n query: UseQueryResult<TData>;\n};\n\n// override useQuery options with our custom logic/extensions\ntype OptionOverrides<TQueryData, TQueryKey extends QueryKey> = {\n queryKey: TQueryKey;\n queryFn: EntityFetchFn<TQueryData, TQueryKey>;\n};\n\n// add options to useEntity that do not exist on useQuery\ntype AddedOptions = {\n keepPreviousDataPlaceholder?: boolean;\n};\n\ntype UseEntityOptions<TQueryData, TQueryKey extends QueryKey, TData = TQueryData> = Omit<UseQueryOptions<TQueryData, Error, TData, QueryKeyWithInjectedParams<TQueryKey>>, keyof OptionOverrides<TQueryData, TQueryKey>>\n & OptionOverrides<TQueryData, TQueryKey>\n & AddedOptions\n ;\n\n/**\n * Do not use this to fetch with a specific query key! Only compose this function to write new variations.\n * This is a near copy of [useQuery from TanStackQuery](https://tanstack.com/query/latest/docs/framework/react/reference/useQuery#usequery).\n * If no access token is available, the query will be put in an error state, which the caller is responsible for handling.\n *\n * It adds two additional fields on the return, `isRehydrating` and `isFilling`.\n * `isRehydrating` is provided by [useIsRestoring](https://tanstack.com/query/latest/docs/framework/react/plugins/persistQueryClient#useisrestoring), and describes whether we are still\n * rehydrating query data. `isFilling` is a convenience equivalent to `isRehydrating || isLoading`\n * @param queryKey\n * @param queryFn - {@link EntityFetchFn}\n * @param keepOldDataAsPlaceholder - If true, the query will use the previous placeholder data while fetching. Default is false.\n * @returns The query result. See usage and the result of [useQuery](https://tanstack.com/query/latest/docs/framework/react/reference/useQuery)\n */\nfunction useEntity<\n TQueryData = unknown,\n TQueryKey extends QueryKey = QueryKey,\n TData = TQueryData,\n>({\n queryKey,\n queryFn,\n ...options\n}: UseEntityOptions<TQueryData, TQueryKey, TData>): UseEntityResult<TData> {\n const accessToken = useAccessToken();\n const environment = useEnvironment();\n const hasAccessToken = isNotNullishOrEmptyOrBlank(accessToken);\n const queryKeyWithToken: QueryKeyWithInjectedParams<TQueryKey> = getInjectedParamsQueryKey(queryKey, accessToken ?? \"\", environment);\n const isRehydrating = useIsRestoring();\n\n const query = useQuery<TQueryData, Error, TData, QueryKeyWithInjectedParams<TQueryKey>>({\n ...options,\n queryKey: queryKeyWithToken,\n queryFn: hasAccessToken ? queryFn : errorFnNoToken, // force query error state if no auth\n placeholderData: options.keepPreviousDataPlaceholder ? keepPreviousData : undefined, // if passed, use previous data as a placeholder to prevent flickering\n ...(hasAccessToken\n ? {}\n : { // if no token available, keep error state until token provided\n retry: false,\n staleTime: Infinity,\n }),\n }, queryClient); // don't accidentally use a partner's queryClient if their provider nested within ours\n return {\n isRehydrating,\n isFilling: isRehydrating || query.isLoading,\n query,\n };\n}\n\nexport {\n useEntity,\n};\n\nexport type {\n EntityFetchFn,\n UseEntityResult,\n UseEntityOptions,\n};\n","import { Delivery, EventForDelivery, ExtendedClientApi } from \"./client\";\nimport { Notifier } from \"./notifier\";\n\nexport class FetchDelivery implements Delivery {\n constructor(private client: ExtendedClientApi) {}\n\n async sendEvent({\n apiKey,\n events,\n notifier,\n payloadVersion,\n }: {\n apiKey: string;\n events: Array<EventForDelivery>;\n notifier: Notifier;\n payloadVersion: string;\n }): Promise<void> {\n const sentAt = new Date().toISOString();\n\n const body = JSON.stringify({\n apiKey,\n payloadVersion,\n notifier,\n events,\n });\n\n await fetch(this.client.endpoints.notify, {\n method: \"POST\",\n mode: \"cors\",\n credentials: \"omit\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Bugsnag-Api-Key\": apiKey,\n \"Bugsnag-Payload-Version\": payloadVersion,\n \"Bugsnag-Sent-At\": sentAt,\n },\n referrerPolicy: \"no-referrer\",\n body,\n });\n }\n}\n","export type Replacer = (key: string | number, value: unknown) => unknown;\n\nexport const CircularReference = Symbol(\"Circular\");\nexport const AccessError = Symbol(\"AccessError\");\n\n/**\n * Iterate through an object's properties and return a copy with the values\n * replaced by the result of the replacer function.\n *\n * Detects circular references and replaces them with the `CircularReference`\n * symbol.\n *\n * Detects errors accessing properties and replaces them with the `AccessError`\n * symbol.\n *\n * For any objects with a `toJSON` function, it will be called instead of\n * traversing the object's properties.\n */\nexport function safeFilter(\n input: unknown,\n replacer?: Replacer | null,\n options?: { depthLimit?: number; edgesLimit?: number },\n): unknown {\n return filter({\n key: \"\",\n value: input,\n replacer,\n seen: [],\n depth: 0,\n depthLimit: options?.depthLimit,\n edgeIndex: 0,\n edgesLimit: options?.edgesLimit,\n });\n}\n\nfunction filter({\n key,\n value,\n replacer,\n seen,\n depthLimit = Infinity,\n depth,\n edgeIndex,\n edgesLimit = Infinity,\n}: {\n key: string | number;\n value: unknown;\n replacer?: Replacer | null;\n seen: unknown[];\n depth: number;\n depthLimit?: number;\n edgeIndex: number;\n edgesLimit?: number;\n}): unknown {\n let replacement = value;\n\n if (seen.includes(replacement)) {\n replacement = CircularReference;\n }\n\n if (replacer) {\n replacement = replacer(key, replacement);\n }\n\n if (hasToJson(replacement)) {\n replacement = safeAccess(() =>\n (replacement as withToJson).toJSON(String(key)),\n );\n }\n\n // TODO: We really should re-run our cyclic dependency check at this point in\n // case the replacer or toJSON has created a new cyclic dependency.\n //\n // Surely no-one would do that though, right?\n\n if (replacement === null || typeof replacement !== \"object\") {\n return replacement;\n }\n\n if (depth > depthLimit || edgeIndex + 1 > edgesLimit) {\n return \"[...]\";\n }\n\n seen.push(value);\n\n if (Array.isArray(replacement)) {\n const copy: unknown[] = [];\n const limit = Math.min(replacement.length, edgesLimit);\n\n for (let i = 0; i < limit; i++) {\n const item = safeAccess(() => (replacement as unknown[])[i]);\n\n copy.push(\n filter({\n key: i,\n value: item,\n replacer,\n seen,\n depth,\n depthLimit,\n edgeIndex: i,\n edgesLimit,\n }),\n );\n }\n\n if (limit < replacement.length) {\n copy.push(\"[...]\");\n }\n\n replacement = copy;\n } else {\n const copy: Record<string, unknown> = {};\n\n const keys = Object.keys(replacement as object);\n for (let i = 0; i < keys.length; i++) {\n const currentKey = keys[i];\n const value = safeAccess(\n () => (replacement as Record<string, unknown>)[currentKey],\n );\n\n copy[currentKey] = filter({\n key: currentKey,\n value,\n replacer,\n seen,\n depth,\n depthLimit,\n edgeIndex: i,\n edgesLimit,\n });\n }\n\n replacement = copy;\n }\n\n seen.pop();\n\n return replacement;\n}\n\nexport function safeAccess<T>(accessor: () => T): T | typeof AccessError {\n try {\n return accessor();\n } catch {\n return AccessError;\n }\n}\n\ntype withToJson = { toJSON: (key?: string) => unknown };\n\nfunction hasToJson(value: unknown): value is withToJson {\n return (\n typeof value === \"object\"\n && value !== null\n && \"toJSON\" in value\n && typeof (value as { toJSON: unknown }).toJSON === \"function\"\n );\n}\n","const objectToString = Object.prototype.toString;\nconst getPrototypeOf = Object.getPrototypeOf;\nconst ERROR_TYPE = \"[object Error]\";\n\nexport function isError(a: unknown): a is Error {\n if (a instanceof Error) {\n return true;\n }\n\n let err = a;\n // climbs prototype chain to verify if type extends the base Error class\n while (err) {\n if (objectToString.call(err) === ERROR_TYPE) {\n return true;\n }\n err = getPrototypeOf(err);\n }\n\n return false;\n}\n","export function isObject(a: unknown): a is Record<string, unknown> {\n return typeof a === \"object\" && a !== null && !Array.isArray(a);\n}\n","import { StackFrame } from \"./event\";\n\n// The following code is based on:\n//\n// https://github.com/stacktracejs/error-stack-parser/blob/master/error-stack-parser.js\n//\n// which is released under the MIT license. Its copyright and license terms\n// are as follows:\n//\n// Copyright (c) 2017 Eric Wendelin and other contributors\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n//\n// It has been modified to match Bugsnag's stackframe format, remove unneeded\n// Opera stackframe handling, and use TypeScript and more modern JavaScript.\n\nconst CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+:\\d+|\\(native\\))/m;\nconst SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code])?$/;\n\nexport function parseStack(stackString: string): Array<StackFrame> {\n const partialResult = stackString.match(CHROME_IE_STACK_REGEXP)\n ? parseV8OrIE(stackString)\n : parseFFOrSafari(stackString);\n\n return partialResult.reduce<StackFrame[]>((result, stack) => {\n // Drop empty stack frames\n if (JSON.stringify(stack) === \"{}\") {\n return result;\n }\n\n // If we have no file or method but we _do_ have a line number, it must be\n // global code.\n let file\n = !stack.file && !stack.method && typeof stack.lineNumber === \"number\"\n ? \"global code\"\n : stack.file || \"(unknown file)\";\n\n // Strip the query string / fragment from filenames\n file = file.replace(/\\?.*$/, \"\").replace(/#.*$/, \"\");\n\n // Case normalize \"global code\" function names\n let method = stack.method || \"(unknown function)\";\n method = /^global code$/i.test(method) ? \"global code\" : method;\n\n return result.concat([\n {\n file,\n lineNumber: stack.lineNumber,\n columnNumber: stack.columnNumber,\n method,\n },\n ]);\n }, []);\n}\n\nfunction parseV8OrIE(stackString: string): Array<Partial<StackFrame>> {\n const filtered = stackString\n .split(\"\\n\")\n .filter(line => !!line.match(CHROME_IE_STACK_REGEXP));\n\n return filtered.map((line) => {\n // Bugsnag stack frames don't have a way of representing eval origins\n // so we just throw that information away for now.\n //\n // stacktrace.js can represent this but it still throws this information\n // away.\n if (line.indexOf(\"(eval \") > -1) {\n line = line\n .replace(/eval code/g, \"eval\")\n .replace(/(\\(eval at [^()]*)|(\\),.*$)/g, \"\");\n }\n let sanitizedLine = line.replace(/^\\s+/, \"\").replace(/\\(eval code/g, \"(\");\n\n // Capture and preserve the parenthesized location \"(/foo/my bar.js:12:87)\"\n // in case it has spaces in it, as the string is split on \\s+ later on.\n const location = sanitizedLine.match(/ (\\((.+):(\\d+):(\\d+)\\)$)/);\n\n // Remove the parenthesized location from the line, if it was matched.\n sanitizedLine = location\n ? sanitizedLine.replace(location[0], \"\")\n : sanitizedLine;\n\n const tokens = sanitizedLine.split(/\\s+/).slice(1);\n\n // If a location was matched, pass it to extractLocation(), otherwise pop\n // the last token.\n const locationParts = extractLocation(\n location ? location[1] : tokens.pop() || \"(no location)\",\n );\n\n const method = tokens.join(\" \") || undefined;\n const file\n = [\"eval\", \"<anonymous>\"].indexOf(locationParts[0]) > -1\n ? undefined\n : locationParts[0];\n\n return {\n file,\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n method,\n };\n });\n}\n\nfunction parseFFOrSafari(stackString: string): Array<Partial<StackFrame>> {\n const filtered = stackString\n .split(\"\\n\")\n .filter(line => !line.match(SAFARI_NATIVE_CODE_REGEXP));\n\n return filtered.map((line) => {\n // Bugsnag stack frames don't have a way of representing eval origins\n // so we just throw that information away for now.\n //\n // stacktrace.js can represent this but it still throws this information\n // away.\n if (line.indexOf(\" > eval\") > -1) {\n line = line.replace(\n / line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g,\n \":$1\",\n );\n }\n\n if (line.indexOf(\"@\") === -1 && line.indexOf(\":\") === -1) {\n // Safari eval frames only have function names and nothing else\n return {\n method: line,\n };\n } else {\n const functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\n const matches = line.match(functionNameRegex);\n const method = matches && matches[1] ? matches[1] : undefined;\n const locationParts = extractLocation(\n line.replace(functionNameRegex, \"\"),\n );\n\n return {\n file: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n method,\n };\n }\n });\n}\n\n// Separate line and column numbers from a string of the form: (URI:Line:Column)\nfunction extractLocation(\n urlLike: string,\n): [uri: string, line?: number | undefined, col?: number | undefined] {\n // Fail-fast but return locations like \"(native)\"\n if (urlLike.indexOf(\":\") === -1) {\n return [urlLike];\n }\n\n const regExp = /(.+?)(?::(\\d+))?(?::(\\d+))?$/;\n const parts = regExp.exec(urlLike.replace(/[()]/g, \"\"));\n if (!parts) {\n return [urlLike];\n }\n\n const line = parts[2] ? parseInt(parts[2], 10) : undefined;\n const col = parts[3] ? parseInt(parts[3], 10) : undefined;\n\n return [parts[1], line, col];\n}\n","import type { BugsnagException, StackFrame } from \"./event\";\nimport { isError } from \"./is-error\";\nimport { isObject } from \"./is-object\";\nimport { parseStack } from \"./parse-stack\";\nimport { NonEmptyArray } from \"./type-helpers\";\nimport { AnyObject } from \"../utils/object/objTypes.ts\";\n\nexport function toExceptions(\n maybeError: unknown | AnyObject | Error,\n component: string,\n): {\n exceptions: NonEmptyArray<BugsnagException>;\n metadata?: Record<string, unknown>;\n } {\n const error = normalizeError(maybeError, component);\n\n // Add metadata for non-errors\n let metadata: Record<string, unknown> | undefined;\n if (error.name === \"InvalidError\") {\n metadata = {\n [component]: {\n \"non-error parameter\": maybeError,\n },\n };\n }\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n /*\n Frankly, don't know what the original library author was cooking by accessing Error.metadata.\n Error.metadata is not included in ES spec, so this is custom extension.\n I am not touching the magic code.\n */\n // Merge any metadata defined on the object itself\n if (\n typeof (error as any).metadata !== \"undefined\"\n && isObject((error as any).metadata)\n ) {\n metadata = { ...metadata, [error.name]: (error as any).metadata };\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n const exceptions: NonEmptyArray<BugsnagException> = [makeException(error)];\n\n // Add any causes\n exceptions.push(\n ...getCauses(error).map(cause =>\n makeException(cause, { backtrace: false }),\n ),\n );\n\n return { exceptions, metadata };\n}\n\n/**\n * Take anything and ensure that it becomes an explicit Error\n * @param maybeError - Hopefully an `Object` or `Error`, although it can be `unknown`, since we need to handle cases from\n * built-ins like `Error.cause` that are typed as `any`.\n * @param component A string\n */\nfunction normalizeError(maybeError: unknown | AnyObject | Error, component: string): Error {\n if (isError(maybeError)) {\n return maybeError;\n }\n\n let error = fromSimpleError(maybeError);\n if (error) {\n return error;\n }\n\n switch (typeof error) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return new Error(String(maybeError));\n\n default: {\n error = new Error(\n `${component} received a non-error. See \"${component}\" tab for more detail.`,\n );\n error.name = \"InvalidError\";\n return error;\n }\n }\n}\n\nfunction fromSimpleError(error: unknown): Error | null {\n if (!isObject(error)) {\n return null;\n }\n\n const getStringMember = (field: string): string | undefined => {\n const stringMember = error[field];\n if (typeof stringMember === \"string\" && error[field.length]) {\n return stringMember;\n }\n return undefined;\n };\n\n const name = getStringMember(\"name\") || getStringMember(\"errorClass\");\n const message = getStringMember(\"message\") || getStringMember(\"errorMessage\");\n if (!name || !message) {\n return null;\n }\n\n const newError = new Error(message);\n newError.name = name;\n return newError;\n}\n\nfunction makeException(\n error: Error,\n stackOptions: { backtrace: boolean } = { backtrace: false },\n): BugsnagException {\n return {\n errorClass: error.name,\n message: error.message,\n stacktrace: getStacktrace(error, stackOptions),\n type:\n typeof self === \"object\" && (self as Window).navigator\n ? \"browserjs\"\n : \"nodejs\",\n };\n}\n\nfunction getStacktrace(\n error: Error,\n { backtrace }: { backtrace: boolean },\n): Array<StackFrame> {\n const stackString = getStackString(error);\n if (stackString) {\n return parseStack(stackString);\n } else if (backtrace) {\n // TODO: We'll probably want to trim this to remove some of our own\n // frames from it but let's wait until we actually have some examples of\n // that to work with.\n return generateBacktrace();\n } else {\n return [];\n }\n}\n\nfunction getStackString(error: Error): string | undefined {\n let stack = error.stack;\n if (stack === undefined) {\n // piece of magic code from original library author\n const nonStandardError = error as Error & { stacktrace: string };\n stack = nonStandardError.stacktrace;\n }\n return typeof stack === \"string\"\n && stack.length\n && stack !== `${error.name}: ${error.message}`\n ? stack\n : undefined;\n}\n\nconst MAX_STACK_SIZE = 20;\n\n// The following is based on\n//\n// https://github.com/stacktracejs/stack-generator/blob/master/stack-generator.js\n//\n// which is licensed to the Public Domain.\nfunction generateBacktrace(): Array<StackFrame> {\n const stack: Array<StackFrame> = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n let curr: Function; // arguments.callee is a Function, disable the lint rule here\n try {\n curr = arguments.callee;\n } catch {\n // arguments.callee cannot be accessed in strict mode.\n return [];\n }\n\n while (curr && stack.length < MAX_STACK_SIZE) {\n if (curr.name) {\n stack.push({ method: curr.name, file: \"(unknown file)\" });\n } else if (/function(?:\\s+([\\w$]+))+\\s*\\(/.test(curr.toString())) {\n stack.push({ method: RegExp.$1, file: \"(unknown file)\" });\n }\n\n try {\n curr = curr.caller;\n } catch {\n break;\n }\n }\n\n return stack;\n}\n\n/*\n * We are targeting ES2020, but this package will provide cause information if it is available in the browser.\n * Therefore we have extended the ES2022 error. This code can and should be removed when upgrading to ES2022 or above.\n */\ninterface ErrorES2022 extends Error {\n // cause is literally any\n cause?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\nfunction getCauses(error: Error): Array<Error> {\n const extendedError = error as ErrorES2022;\n if (extendedError.cause) {\n const cause = normalizeError(extendedError.cause, \"cause\");\n if (cause.name === \"InvalidError\") {\n return [];\n }\n return [cause].concat(getCauses(cause));\n } else {\n return [];\n }\n}\n","/**\n * A function for logging issues and errors when in a dev environment. This should NOT be used to replace console.logs when doing local development.\n * Only use this function for persistent logs.\n * @param consoleMethod - The console function to be called\n * @param data - Any number of serializable parameters\n */\nfunction devConsole(consoleMethod: (...data: unknown[]) => void, ...data: unknown[]) {\n if (process.env.NODE_ENV === \"development\") {\n consoleMethod(data);\n }\n}\n\nfunction devLog(...data: unknown[]) {\n return devConsole(console.log, data); // eslint-disable-line no-console\n}\n\nfunction devWarn(...data: unknown[]) {\n return devConsole(console.warn, data); // eslint-disable-line no-console\n}\n\nfunction devError(...data: unknown[]) {\n return devConsole(console.error, data); // eslint-disable-line no-console\n}\n\nfunction devInfo(...data: unknown[]) {\n return devConsole(console.info, data); // eslint-disable-line no-console\n}\n\nexport {\n devInfo,\n devError,\n devWarn,\n devLog,\n};\n","import type { ExtendedClientApi, Plugin } from \"./client\";\nimport type { BugsnagException } from \"./event\";\nimport { toExceptions } from \"./to-exceptions\";\nimport { NonEmptyArray } from \"./type-helpers\";\nimport { devLog } from \"../utils/devConsole.ts\";\n\nexport const browserNotifyUnhandledExceptions: Plugin = {\n name: \"browserNotifyUnhandledExceptions\",\n load(client: ExtendedClientApi) {\n self.addEventListener(\"error\", (evt: ErrorEvent | Event) => {\n let exceptions: NonEmptyArray<BugsnagException>;\n let metadata: Record<string, unknown> | undefined;\n\n if (evt instanceof ErrorEvent) {\n const { message, filename: file, lineno, colno, error } = evt;\n const lineNumber = Number.isSafeInteger(lineno) ? lineno : undefined;\n if (lineNumber === 0 && /Script error\\.?/.test(message)) {\n devLog(\"Ignoring cross-domain or eval script error.\");\n return;\n }\n\n ({ exceptions, metadata } = toExceptions(error, \"window onerror\"));\n\n // Augment first stacktrace if we have more info in the ErrorEvent than\n // the stack trace we got.\n const columnNumber = Number.isSafeInteger(colno) ? colno : undefined;\n const { stacktrace } = exceptions[0];\n if (!stacktrace.length) {\n stacktrace.push({\n file,\n lineNumber,\n columnNumber,\n method: \"(unknown file)\",\n });\n } else {\n const firstStackFrame = stacktrace[0];\n firstStackFrame.file = firstStackFrame.file || file;\n firstStackFrame.lineNumber = firstStackFrame.lineNumber ?? lineNumber;\n firstStackFrame.columnNumber = firstStackFrame.columnNumber ?? columnNumber;\n }\n } else {\n ({ exceptions, metadata } = toExceptions(evt, \"window onerror\"));\n }\n\n client.notifyEvent(\n {\n exceptions,\n unhandled: true,\n severity: \"error\",\n severityReason: {\n type: \"unhandledException\",\n },\n metadata,\n },\n evt,\n );\n });\n },\n};\n","import { ExtendedClientApi, Plugin } from \"./client\";\nimport { toExceptions } from \"./to-exceptions\";\n\nexport const browserNotifyUnhandledRejections: Plugin = {\n name: \"browserNotifyUnhandledRejections\",\n load(client: ExtendedClientApi) {\n self.addEventListener(\n \"unhandledrejection\",\n (evt: PromiseRejectionEvent) => {\n const error = evt.reason;\n\n const { exceptions, metadata } = toExceptions(\n error,\n \"unhandledrejection\",\n );\n\n // The official bugsnag client digs into `error` and, if it has no\n // stack, but is an Error object, it pulls out the name, message, code\n // and adds them to a metadata tab called 'unhandledRejection handler'.\n //\n // I don't understand this. Surely we'll have the same information in\n // our exception object already?\n\n client.notifyEvent(\n {\n exceptions,\n unhandled: true,\n severity: \"error\",\n severityReason: {\n type: \"unhandledPromiseRejection\",\n },\n metadata,\n },\n error,\n );\n },\n );\n },\n};\n","import { ExtendedClientApi, Plugin } from \"./client\";\nimport { BugsnagEvent } from \"./event\";\n\nexport const errorBreadcrumbs: Plugin = {\n name: \"errorBreadcrumbs\",\n load(client: ExtendedClientApi) {\n client.addOnPostError((event: BugsnagEvent) => {\n client.leaveBreadcrumb(\n event.exceptions[0].errorClass,\n {\n errorClass: event.exceptions[0].errorClass,\n errorMessage: event.exceptions[0].message,\n severity: event.severity,\n },\n \"error\",\n );\n });\n },\n};\n","import { ExtendedClientApi, Plugin } from \"./client\";\nimport { BugsnagEvent } from \"./event\";\n\nlet appStart = Date.now();\nconst reset = () => {\n appStart = Date.now();\n};\n\nexport const appDuration: Plugin = {\n name: \"appDuration\",\n load(client: ExtendedClientApi) {\n client.addOnError((event: BugsnagEvent) => {\n const now = Date.now();\n event.app = event.app || {};\n event.app.duration = now - appStart;\n return true;\n });\n\n return { reset };\n },\n};\n","import type { UserAgentInfo } from \"./user-agent-types\";\n\n// The Bugsnag v5 API requires doing your own UA string parsing, requiring a\n// `browserName`, `browserVersion`, `osName`, `osVersion`, etc.\n//\n// That's very unfriendly and probably why the official client still uses the v4\n// API which takes a `userAgent` parameter and appears to parse it on the\n// server.\n//\n// Nevertheless, we're using the v5 API for now so we should do the parsing\n// ourselves.\n//\n// Note that UA parser libraries typically are very heavyweight since they try\n// to cover every user agent that ever existed including various bots etc.\n//\n// However, all we really care about is differentiating between the most common\n// _browsers_ and their respective platforms / OSes.\n//\n// Furthermore, we want this to be as lightweight as possible so this is very\n// deliberately a very barebones approach. We can add other user agents if and\n// when they become interesting.\n//\n// This is based on\n// https://github.com/DamonOehlman/detect-browser/blob/master/src/index.ts but\n// adapted quite heavily.\n\nexport function parseUserAgent(userAgent: string): UserAgentInfo {\n const matchedRule: UserAgentMatch = matchUserAgent(userAgent);\n\n if (!matchedRule) {\n return {};\n }\n\n const [name, match] = matchedRule;\n const os = detectOS(userAgent);\n const device = os?.osName === \"iOS\" ? detectAppleDevice(userAgent) : {};\n\n return {\n browserName: name,\n browserVersion: match[1],\n osName: os?.osName,\n osVersion: os?.osVersion,\n manufacturer: device?.manufacturer,\n model: device?.model,\n };\n}\n\ntype UserAgentRule = [string, RegExp];\nconst userAgentRules: UserAgentRule[] = [\n [\"Edge (EdgeHTML)\", /Edge\\/([0-9._]+)/],\n [\"Edge (iOS)\", /EdgiOS\\/([0-9._]+)/],\n [\"Yandex\", /YaBrowser\\/([0-9._]+)/],\n [\"KakaoTalk\", /KAKAOTALK\\s([0-9.]+)/],\n [\"Samsung\", /SamsungBrowser\\/([0-9.]+)/],\n [\"Silk\", /\\bSilk\\/([0-9._-]+)\\b/],\n [\"MIUI\", /MiuiBrowser\\/([0-9.]+)$/],\n [\"Beaker\", /BeakerBrowser\\/([0-9.]+)/],\n [\"Edge (Chromium)\", /EdgA?\\/([0-9.]+)/],\n [\"Chromium WebView\", /(?!Chrom.*OPR)wv\\).*Chrom(?:e|ium)\\/([0-9.]+)(:?\\s|$)/],\n [\"Chrome\", /(?!Chrom.*OPR)Chrom(?:e|ium)\\/([0-9.]+)(:?\\s|$)/],\n [\"Chrome (iOS)\", /CriOS\\/([0-9.]+)(:?\\s|$)/],\n [\"Firefox\", /Firefox\\/([0-9.]+)(?:\\s|$)/],\n [\"Firefox (iOS)\", /FxiOS\\/([0-9.]+)/],\n [\"Opera Mini\", /Opera Mini.*Version\\/([0-9.]+)/],\n [\"Opera\", /Opera\\/([0-9.]+)(?:\\s|$)/],\n [\"Opera\", /OPR\\/([0-9.]+)(:?\\s|$)/],\n [\"Internet Explorer\", /Trident\\/7\\.0.*rv:([0-9.]+).*\\).*Gecko$/],\n [\"Internet Explorer\", /MSIE\\s([0-9.]+);.*Trident\\/[4-7].0/],\n [\"Internet Explorer\", /MSIE\\s(7\\.0)/],\n [\"Blackberry\", /BB10;\\sTouch.*Version\\/([0-9.]+)/],\n [\"Android\", /Android\\s([0-9.]+)/],\n [\"Safari (iOS)\", /Version\\/([0-9._]+).*Mobile.*Safari.*/],\n [\"Safari\", /Version\\/([0-9._]+).*Safari/],\n [\"Facebook\", /FB[AS]V\\/([0-9.]+)/],\n [\"Instagram\", /Instagram\\s([0-9.]+)/],\n [\"iOS WebView\", /AppleWebKit\\/([0-9.]+).*Mobile/],\n [\"iOS WebView\", /AppleWebKit\\/([0-9.]+).*Gecko\\)$/],\n];\n\ntype UserAgentMatch = [string, RegExpExecArray] | false;\n\nfunction matchUserAgent(userAgent: string): UserAgentMatch {\n return (\n userAgent !== \"\"\n && userAgentRules.reduce<UserAgentMatch>(\n (matched: UserAgentMatch, [browser, regex]) => {\n if (matched) {\n return matched;\n }\n\n const uaMatch = regex.exec(userAgent);\n return !!uaMatch && [browser, uaMatch];\n },\n false,\n )\n );\n}\n\ntype OperatingSystemRule = [string, string | undefined, RegExp];\n\nconst operatingSystemRules: OperatingSystemRule[] = [\n [\"iOS\", undefined, /iP(hone|od|ad)/],\n [\"Android\", undefined, /Android/],\n [\"BlackBerry\", undefined, /BlackBerry|BB10/],\n [\"Windows Mobile\", undefined, /IEMobile/],\n [\"Kindle\", undefined, /Kindle/],\n [\"Windows\", \"3.11\", /Win16/],\n [\"Windows\", \"95\", /(Windows 95)|(Win95)|(Windows_95)/],\n [\"Windows\", \"98\", /(Windows 98)|(Win98)/],\n [\"Windows\", \"2000\", /(Windows NT 5.0)|(Windows 2000)/],\n [\"Windows\", \"XP\", /(Windows NT 5.1)|(Windows XP)/],\n [\"Windows\", \"Server 2003\", /(Windows NT 5.2)/],\n [\"Windows\", \"Vista\", /(Windows NT 6.0)/],\n [\"Windows\", \"7\", /(Windows NT 6.1)/],\n [\"Windows\", \"8\", /(Windows NT 6.2)/],\n [\"Windows\", \"8.1\", /(Windows NT 6.3)/],\n [\"Windows\", \"10+\", /(Windows NT 10.0)/],\n [\"Windows\", \"ME\", /Windows ME/],\n [\"Open BSD\", undefined, /OpenBSD/],\n [\"Sun OS\", undefined, /SunOS/],\n [\"Chrome OS\", undefined, /CrOS/],\n [\"Linux\", undefined, /(Linux)|(X11)/],\n [\"Mac OS\", undefined, /(Mac_PowerPC)|(Macintosh)/],\n [\"QNX\", undefined, /QNX/],\n [\"BeOS\", undefined, /BeOS/],\n [\"OS/2\", undefined, /OS\\/2/],\n];\n\nfunction detectOS(\n userAgent: string,\n): { osName: string; osVersion?: string } | null {\n for (const [osName, osVersion, regex] of operatingSystemRules) {\n const match = regex.exec(userAgent);\n if (match) {\n return { osName, osVersion };\n }\n }\n\n return null;\n}\n\nfunction detectAppleDevice(userAgent: string): {\n manufacturer?: string;\n model?: string;\n} | null {\n const matches = /iPad|iPhone|iPod/.exec(userAgent);\n if (matches) {\n return { manufacturer: \"Apple\", model: matches[0] };\n }\n\n if (\n /MacIntel/.test(userAgent)\n && self.navigator\n && self.navigator.maxTouchPoints\n && self.navigator.maxTouchPoints > 2\n ) {\n return { manufacturer: \"Apple\", model: \"iPad\" };\n }\n\n return null;\n}\n","import { ExtendedClientApi, Plugin } from \"./client\";\nimport { BugsnagEvent } from \"./event\";\nimport { parseUserAgent } from \"./simple-ua-parser\";\nimport type { UserAgentParserFn } from \"./user-agent-types\";\n\nexport const browserContextWithUaParser = (\n uaParser: UserAgentParserFn,\n): Plugin => {\n return {\n name: \"browserContext\",\n load(client: ExtendedClientApi) {\n client.addOnError((event: BugsnagEvent) => {\n event.request = { ...event.request, url: self.location.href };\n event.context = event.context || self.location.pathname;\n\n event.device = {\n ...event.device,\n ...uaParser(self.navigator.userAgent),\n locale: self.navigator.language,\n userAgent: self.navigator.userAgent,\n };\n\n let languages: ReadonlyArray<string> = [\"n/a\"];\n try {\n languages = self.navigator.languages;\n } catch {\n /* Ignore */\n }\n\n event.metaData = {\n ...event.metaData,\n language: {\n language: self.navigator.language,\n languages,\n },\n };\n return true;\n });\n },\n };\n};\n\nexport const browserContext: Plugin\n = browserContextWithUaParser(parseUserAgent);\n","import { Queue } from \"../array/queue.ts\";\n\nclass RateLimiter {\n readonly limit: number;\n readonly period?: number;\n private events: Queue<number>;\n\n /**\n * Utility to manage rate limits for arbitrary events.\n * The same RateLimit should be incremented every time the event occurs.\n *\n * In order to prevent asynchronous behavior, the tracking window defined by `period` will only run queue\n * cleanup when `increment` is called.\n * Even if the `period` has passed, the `size` of the RateLimiter will remain the same until `increment`\n * is called. This is EXPECTED behavior. Do not attempt to use `size` as a means of determining if an event should\n * be limited.\n *\n * ```typescript\n * const rateLimit = new RateLimit(1);\n * while (rateLimit.increment()) {\n * console.log(\"Have not hit the rate limit\");\n * }\n * console.log(\"The rate limit has been hit\")\n * ```\n * @param limit The number of permitted events\n * @param period The size of the sliding tracking window, in milliseconds. If no `period` is provided, it is expected that\n * the caller uses `RateLimit.reset()` if they need to reset the event queue.\n */\n constructor(limit: number, period?: number) {\n this.limit = limit;\n this.period = period;\n this.events = new Queue();\n }\n\n /**\n * Clear out the queue of events.\n */\n reset() {\n this.events.clear();\n }\n\n /**\n * Test if a new event would be rate limited.\n * A rate limited event is not added to the tracked queue, as it is assumed you do not want to commit the event action.\n * If the rate limit has not been hit, it will be added to the queue of events.\n * @returns `true` if the rate limit has not been hit, `false` otherwise\n */\n increment(): boolean {\n const time = new Date().getTime();\n if (this.period !== undefined) {\n // dequeue any events outside the sliding time window\n let oldestTimestamp = this.events.peek();\n while (oldestTimestamp !== undefined && time - this.period > oldestTimestamp) {\n this.events.dequeue();\n oldestTimestamp = this.events.peek();\n }\n }\n const newEventPermitted = this.events.size + 1 <= this.limit;\n if (newEventPermitted) {\n this.events.enqueue(time);\n }\n return newEventPermitted;\n }\n\n get size() {\n return this.events.size;\n }\n}\n\nexport {\n RateLimiter,\n};\n","import { ExtendedClientApi, OnErrorCallback, Plugin } from \"../client\";\nimport { Component, PropsWithChildren, ErrorInfo, ComponentType, ReactNode } from \"react\";\nimport { toExceptions } from \"../to-exceptions.ts\";\n\nfunction formatComponentStack(str: string): string {\n const lines = str.split(/\\s*\\n\\s*/g);\n let ret = \"\";\n for (let line = 0, len = lines.length; line < len; line++) {\n if (lines[line].length) {\n ret += `${ret.length ? \"\\n\" : \"\"}${lines[line]}`;\n }\n }\n return ret;\n}\n\nexport type FallbackComponentProps = {\n error?: Error;\n errorInfo?: ErrorInfo;\n clearError: () => void;\n};\n\nexport type FallbackComponent = ComponentType<FallbackComponentProps>;\n\ntype ClientErrorBoundaryProps = PropsWithChildren<{\n client: ExtendedClientApi;\n onError?: OnErrorCallback;\n FallbackComponent?: FallbackComponent;\n}>;\n\ntype ClientErrorBoundaryState = { error: Error | undefined; errorInfo: ErrorInfo | undefined };\n\n/**\n * Internal ErrorBoundary that has a reference to the entire Bugsnag client instance. If the React tree crashes, it will opt to render\n * the `FallbackComponent`, if it exists\n */\nclass ClientErrorBoundary extends Component<ClientErrorBoundaryProps, ClientErrorBoundaryState> {\n constructor(props: ClientErrorBoundaryProps) {\n super(props);\n this.state = {\n error: undefined,\n errorInfo: undefined,\n };\n }\n\n handleClearError() {\n this.setState({ error: undefined, errorInfo: undefined });\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n override componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n const { exceptions, metadata } = toExceptions(error, \"notify\");\n if (errorInfo && errorInfo.componentStack) {\n errorInfo.componentStack = formatComponentStack(errorInfo.componentStack);\n }\n const { onError, client } = this.props;\n client.notifyEvent(\n {\n exceptions,\n unhandled: true,\n severity: \"error\",\n severityReason: {\n type: \"unhandledException\",\n },\n metadata: { ...metadata, react: errorInfo },\n onError,\n },\n error,\n );\n this.setState({ errorInfo });\n }\n\n override render() {\n const { error } = this.state;\n if (error) {\n const { FallbackComponent } = this.props;\n if (FallbackComponent) {\n return (\n <FallbackComponent\n error={this.state.error}\n errorInfo={this.state.errorInfo}\n clearError={() => this.handleClearError()}\n />\n );\n }\n }\n\n return (<>{this.props.children}</>);\n }\n}\n\ntype ErrorBoundaryProps = PropsWithChildren<{\n onError?: OnErrorCallback;\n fallbackComponent?: FallbackComponent;\n}>;\n\ntype BugsnagErrorBoundary = (props: ErrorBoundaryProps) => ReactNode;\n\ntype ReactPluginResult = {\n BugsnagErrorBoundary: BugsnagErrorBoundary;\n};\n\n/**\n * Bugsnag plugin that provides an ErrorBoundary.\n * This ensures automatic reporting whenever the React tree crashes,\n * and allows for a fallback component when a crash occurs.\n */\nconst ReactPlugin: Plugin = {\n name: \"react\",\n load(client: ExtendedClientApi): ReactPluginResult {\n return {\n BugsnagErrorBoundary: ({ onError, fallbackComponent, children }: ErrorBoundaryProps) => (\n <ClientErrorBoundary client={client} onError={onError} FallbackComponent={fallbackComponent}>\n {children}\n </ClientErrorBoundary>\n ),\n };\n },\n};\n\nexport {\n ReactPlugin,\n};\n\nexport type {\n ReactPluginResult,\n ErrorBoundaryProps,\n};\n","import {\n Delivery,\n EventForDelivery,\n ExtendedClientApi,\n OnErrorCallback,\n OnPostErrorCallback,\n PartialEvent,\n} from \"./client\";\nimport { Config } from \"./config\";\nimport { Breadcrumb, BreadcrumbType, BugsnagEvent, User } from \"./event\";\nimport { FetchDelivery } from \"./fetch-delivery\";\nimport { Notifier } from \"./notifier\";\nimport { safeFilter } from \"./safe-filter\";\nimport { toExceptions } from \"./to-exceptions\";\nimport { ReactPluginResult } from \"./react/react-plugin.tsx\";\nimport { RedactKeysPluginResult } from \"./redact-keys\";\nimport { devError } from \"../utils/devConsole.ts\";\n\nclass BugsnagStatic implements ExtendedClientApi {\n private breadcrumbs: Array<Breadcrumb> = [];\n private config: Config | undefined;\n private delivery: Delivery = new FetchDelivery(this);\n private errorCallbacks: Set<OnErrorCallback> = new Set();\n private postErrorCallbacks: Set<OnPostErrorCallback> = new Set();\n private plugins: Array<{ name: string; plugin: unknown }> = [];\n\n start(config: Config): BugsnagStatic {\n if (this.config) {\n devError(\"Bugsnag.start called multiple times. Subsequent invocations will be ignored\");\n return this;\n }\n\n this.config = config;\n\n let errorCallbacks: Array<OnErrorCallback> | undefined = undefined;\n if (this.config.onError) {\n errorCallbacks = Array.isArray(this.config.onError)\n ? this.config.onError\n : [this.config.onError];\n }\n this.errorCallbacks = new Set(errorCallbacks);\n\n for (const plugin of this.config.plugins || []) {\n this.plugins.push({\n name: plugin.name || \"unknown\",\n plugin: plugin.load(this),\n });\n }\n\n // this.leaveBreadcrumb('Bugsnag loaded', {}, 'state');\n\n return this;\n }\n\n get endpoints() {\n return {\n notify: this.config?.endpoints?.notify || \"https://notify.bugsnag.com/\",\n };\n }\n\n notify<ErrorType = unknown>(\n error: ErrorType,\n options:\n | {\n metadata?: Record<string, unknown>;\n severity?: BugsnagEvent[\"severity\"];\n }\n | OnErrorCallback = {},\n ): Promise<void> {\n const { exceptions, metadata } = toExceptions(error, \"notify\");\n let eventMetadata = metadata;\n\n let onError: OnErrorCallback | undefined;\n let severity: BugsnagEvent[\"severity\"] | undefined;\n\n if (typeof options === \"function\") {\n onError = options;\n } else {\n severity = options.severity;\n if (options.metadata) {\n eventMetadata = { ...metadata, ...options.metadata };\n }\n }\n\n return this.notifyEvent(\n {\n exceptions,\n metadata: eventMetadata,\n severity,\n onError,\n },\n error,\n );\n }\n\n leaveBreadcrumb(\n message: string,\n metadata?: Record<string, unknown>,\n type?: BreadcrumbType,\n ): void {\n if (!this.config) {\n // The official bugsnag client will produce a console eror in this case\n // but that's annoying since often unit tests will exercise code that\n // calls notify/leaveBreadcrumb and we don't want to have to either:\n //\n // (a) wrap each call to bugsnag in an \"isTest\" conditional, or\n // (b) ensure the bugsnag client is initialized at the start of each\n // test\n return;\n }\n\n // It appears we sometimes get non-string `message` values here.\n if (typeof message !== \"string\") {\n try {\n message = String(message);\n } catch {\n message = \"Unable to stringify breadcrumb message\";\n }\n }\n\n if (!message.length) {\n return;\n }\n\n this.breadcrumbs.push({\n name: message,\n metaData: metadata,\n type: type || \"manual\",\n timestamp: new Date().toISOString(),\n });\n\n const { maxBreadcrumbs = 25 } = this.config;\n if (this.breadcrumbs.length > maxBreadcrumbs) {\n this.breadcrumbs.splice(0, this.breadcrumbs.length - maxBreadcrumbs);\n }\n }\n\n async notifyEvent(\n {\n exceptions,\n unhandled,\n severity,\n severityReason,\n metadata,\n onError,\n }: PartialEvent,\n originalError: unknown,\n ): Promise<void> {\n if (!this.config) {\n // The official bugsnag client will produce a console eror in this case\n // but that's annoying since often unit tests will exercise code that\n // calls notify/leaveBreadcrumb and we don't want to have to either:\n //\n // (a) wrap each call to bugsnag in an \"isTest\" conditional, or\n // (b) ensure the bugsnag client is initialized at the start of each\n // test\n return;\n }\n\n // Check if the current release stage is enabled\n const releaseStage = this.config.releaseStage || \"production\";\n if (\n this.config.enabledReleaseStages\n && !this.config.enabledReleaseStages.includes(releaseStage)\n ) {\n return;\n }\n\n const event: BugsnagEvent = {\n exceptions,\n breadcrumbs: this.breadcrumbs.length ? this.breadcrumbs : undefined,\n originalError,\n unhandled: typeof unhandled !== \"boolean\" ? false : unhandled,\n severity: severity || \"warning\",\n severityReason,\n user: this.config.user || undefined,\n app: {\n releaseStage,\n version: this.config.appVersion,\n type:\n this.config.appType\n || (typeof window === \"object\" ? \"browser\" : \"node\"),\n },\n device: { time: new Date().toISOString() },\n metaData: metadata || {},\n };\n\n // Error callback\n\n const errorCallbacks = [...this.errorCallbacks];\n if (onError) {\n errorCallbacks.push(onError);\n }\n\n // Make sure the redact and stringifyValues callback come last\n const sortLast = [\"stringifyValues\", \"redact\"];\n errorCallbacks.sort((a, b) => {\n if (sortLast.includes(a.name) && sortLast.includes(b.name)) {\n return 0;\n } else if (sortLast.includes(a.name)) {\n return 1;\n } else if (sortLast.includes(b.name)) {\n return -1;\n } else {\n return 0;\n }\n });\n\n for (const callback of errorCallbacks) {\n const callbackResult = await callback(event);\n if (typeof callbackResult === \"boolean\" && !callbackResult) {\n return;\n }\n }\n\n const notifier: Notifier = {\n name: \"Tight Components\",\n version: \"1\",\n url: \"https://github.com/Hurdlr/TraxComponents/tree/dev/src/bugsnag/README.md\",\n };\n\n const eventForDelivery = safeFilter(\n event,\n (key, value) => {\n if (key === \"originalError\") {\n return undefined;\n }\n return value;\n },\n { depthLimit: 20, edgesLimit: 500 },\n ) as EventForDelivery;\n\n let body: string;\n const payload = {\n apiKey: this.config.apiKey,\n payloadVersion: \"5\",\n notifier,\n events: [eventForDelivery],\n };\n\n try {\n body = JSON.stringify(payload);\n } catch {\n eventForDelivery.metaData = {\n notifier: \"Unable to serialize metadata\",\n };\n\n body = JSON.stringify(payload);\n }\n\n // Check the size of the payload\n if (body.length > 10e5) {\n eventForDelivery.metaData = {\n notifier: `Payload was ${body.length / 10e5}Mb. Metadata removed.`,\n };\n body = JSON.stringify(payload);\n if (body.length > 10e5) {\n throw new Error(\"Payload exceeded 1Mb limit\");\n }\n }\n\n // Although it's called \"post error\" we run these callback before we\n // actually send the event over the network since sending is async and if\n // the callback is logging the fact that an error was recorded then we want\n // that log entry to appear in the correct sequence, particularly if other\n // things take place while the fetch is still happenning.\n for (const callback of this.postErrorCallbacks) {\n callback(event);\n }\n\n try {\n await this.delivery.sendEvent(payload);\n } catch (e) {\n devError(\"Failed to post report to Bugsnag\", e);\n }\n }\n\n getUser(): User {\n return this.config?.user || {};\n }\n\n setUser(id?: string, email?: string, name?: string): void {\n if (!this.config) {\n return;\n }\n\n this.config.user = { id, email, name };\n }\n\n setProperties(bugSnagReleaseStage: string): void {\n if (!this.config) {\n return;\n }\n this.config.releaseStage = bugSnagReleaseStage;\n }\n\n addOnError(fn: OnErrorCallback): void {\n this.errorCallbacks.add(fn);\n }\n\n removeOnError(fn: OnErrorCallback): void {\n this.errorCallbacks.delete(fn);\n }\n\n addOnPostError(fn: OnPostErrorCallback): void {\n this.postErrorCallbacks.add(fn);\n }\n\n removeOnPostError(fn: OnPostErrorCallback): void {\n this.postErrorCallbacks.delete(fn);\n }\n\n getPlugin(name: \"react\"): ReactPluginResult | undefined;\n getPlugin(name: \"redactKeys\"): RedactKeysPluginResult | undefined;\n getPlugin(name: string): ReactPluginResult | RedactKeysPluginResult | unknown | undefined {\n return this.plugins.find(plugin => plugin.name === name)?.plugin;\n }\n\n setDelivery(delivery: Delivery) {\n this.delivery = delivery;\n }\n}\n\nconst Bugsnag = new BugsnagStatic();\nexport default Bugsnag;\n\nexport type {\n Client,\n Delivery,\n ExtendedClientApi,\n NotifiableError,\n Plugin,\n} from \"./client\";\nexport type { Config } from \"./config\";\nexport { fromLegacyConfig } from \"./legacy-config\";\nexport type { LegacyConfig } from \"./legacy-config\";\nexport type { BugsnagEvent as Event } from \"./event\";\nexport type { Notifier } from \"./notifier\";\n\n// Breadcrumb loggers\nexport { consoleBreadcrumbs } from \"./console-breadcrumbs\";\nexport { errorBreadcrumbs } from \"./error-breadcrumbs\";\nexport { fetchBreadcrumbs } from \"./fetch-breadcrumbs\";\nexport { interactionBreadcrumbs } from \"./interaction-breadcrumbs\";\nexport { navigationBreadcrumbs } from \"./navigation-breadcrumbs\";\nexport { browserHandledRejectionBreadcrumbs } from \"./browser-handled-rejection-breadcrumbs\";\n\n// Error notifiers\nexport { browserNotifyUnhandledExceptions } from \"./browser-unhandled-exceptions\";\nexport { browserNotifyUnhandledRejections } from \"./browser-unhandled-rejections\";\nexport { nodeNotifyUnhandledRejections } from \"./node-unhandled-rejections\";\nexport { nodeNotifyUnhandledExceptions } from \"./node-unhandled-exceptions\";\n\n// Other plugins\nexport { appDuration } from \"./app-duration\";\nexport { browserContext, browserContextWithUaParser } from \"./browser-context\";\nexport { deviceOrientation } from \"./deviceorientation\";\nexport { limitEvents } from \"./limit-events\";\nexport {\n ReactPlugin,\n} from \"./react/react-plugin.tsx\";\nexport type {\n ReactPluginResult,\n ErrorBoundaryProps,\n} from \"./react/react-plugin.tsx\";\nexport {\n redactEvent,\n redactKeys,\n redactObject,\n} from \"./redact-keys\";\nexport type {\n RedactKeysPluginResult,\n} from \"./redact-keys\";\nexport { stringifyValues } from \"./stringify-values\";\nexport type { UserAgentParserFn, UserAgentInfo } from \"./user-agent-types\";\n\n// Delivery plugins\nexport { FetchDelivery } from \"./fetch-delivery\";\n","import Bugsnag, {\n appDuration,\n browserContext,\n browserNotifyUnhandledExceptions,\n browserNotifyUnhandledRejections,\n errorBreadcrumbs, limitEvents,\n ReactPlugin,\n} from \"../bugsnag/bugsnag.ts\";\nimport type { ExtendedClientApi } from \"../bugsnag/client.ts\";\nimport type { ReactPluginResult } from \"../bugsnag/react/react-plugin.tsx\";\nimport { AnyObject } from \"./object/objTypes.ts\";\nimport { devWarn } from \"./devConsole.ts\";\nimport { version as appVersion } from \"../../package.json\";\n\ntype UserData = {\n accessToken: string;\n userId: string | null;\n email: string | null;\n firstName: string | null;\n lastName: string | null;\n};\n\ntype NotifyParams = {\n error: Error;\n groupingHash?: string;\n extraData?: AnyObject;\n severity: \"error\" | \"warning\" | \"info\";\n};\n\nlet accessToken = \"\";\nlet userEnvironment = \"\";\nconst EVENT_LIMIT = 15;\nconst EVENT_LIMIT_PERIOD = 1000; // one second\nconst releaseStage = process.env.NODE_ENV == \"development\" ? \"DEV\" : \"prod\";\n\nconst bugsnagClient: ExtendedClientApi = Bugsnag.start({\n apiKey: \"899aec02393ac236377b73b483800d2c\",\n appVersion,\n appType: \"browser\",\n releaseStage: releaseStage,\n plugins: [\n appDuration,\n browserContext,\n errorBreadcrumbs,\n limitEvents(EVENT_LIMIT, EVENT_LIMIT_PERIOD),\n ReactPlugin,\n browserNotifyUnhandledExceptions,\n browserNotifyUnhandledRejections,\n ],\n});\n\nconst breadcrumb = (message: string, metadata?: AnyObject) => {\n try {\n Bugsnag.leaveBreadcrumb(message, metadata);\n } catch (e: unknown) {\n // We don't ever want logging.breadcrumb to break\n if (e instanceof Error) {\n notify({ error: e, severity: \"error\" });\n } else {\n notify({\n error: new Error(\"Unknown error in logging.breadcrumb\"),\n severity: \"error\",\n extraData: { originalError: e },\n });\n }\n }\n};\n\nconst notify = async (params: NotifyParams) => {\n try {\n await Bugsnag.notify(params.error, (event) => {\n event.severity = params.severity;\n if (params.groupingHash) {\n event.groupingHash = params.groupingHash;\n }\n event.metaData = {\n ...event.metaData,\n custom: { ...params.extraData, accessToken: accessToken, environment: userEnvironment }, // TODO: add buildNumber\n };\n return true;\n });\n devWarn(params.error, params.error.message, params.extraData);\n } catch (e: unknown) {\n // We don't ever want logging.notify to break\n if (e instanceof Error) {\n await notify({ error: e, severity: \"error\" });\n } else {\n await notify({\n error: new Error(\"Unknown error in logging.notify\"),\n severity: \"error\",\n extraData: { originalError: e },\n });\n }\n }\n};\n\nconst setBugsnagUser = (userInfo: UserData) => {\n Bugsnag.setUser(userInfo.userId as string, userInfo.email as string, `${userInfo.firstName} ${userInfo.lastName}`);\n accessToken = userInfo.accessToken;\n};\n\nconst setBugsnagProperties = (environment: string) => {\n Bugsnag.setProperties(releaseStage);\n userEnvironment = environment;\n};\n\nconst reactPlugin = bugsnagClient.getPlugin(\"react\") as ReactPluginResult | undefined;\nconst BugsnagErrorBoundary = reactPlugin?.BugsnagErrorBoundary;\n\nexport {\n breadcrumb,\n bugsnagClient,\n BugsnagErrorBoundary,\n notify,\n setBugsnagUser,\n setBugsnagProperties,\n\n};\n","import { ExtendedClientApi, Plugin } from \"./client\";\nimport { RateLimiter } from \"../utils/rateLimiter/rateLimiter.ts\";\n\n/**\n * Limit the amount of events fired to Bugsnag. Helpful for reducing logs that occur in loops.\n * @param limit The number of events to allow\n * @param period The sliding window of time to observe, in milliseconds\n */\nexport const limitEvents = (limit: number, period?: number): Plugin => {\n const limiter = new RateLimiter(limit, period);\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"popstate\", limiter.reset);\n }\n\n return {\n name: \"limitEvents\",\n load(client: ExtendedClientApi) {\n client.addOnError(function throttle() {\n return limiter.increment();\n });\n\n return { reset: limiter.reset };\n },\n };\n};\n","import { Nullable, ValueOf } from \"../../utils/utilityTypes.ts\";\nimport { isEmpty } from \"../../utils/string/stringUtils.ts\";\nimport { mapValues } from \"lodash-es\";\nimport { ArrayUnion } from \"../../utils/array/arrayTypes.ts\";\nimport { AnyObject } from \"../../utils/object/objTypes.ts\";\nimport { PaginationHeader } from \"./pagination.ts\";\nimport { EndpointManager } from \"../endpointManager.ts\";\n\nconst HttpMethods = {\n GET: \"GET\",\n POST: \"POST\",\n DELETE: \"DELETE\",\n} as const;\n\ntype HttpMethod = ValueOf<typeof HttpMethods>;\n\nconst Credentials: Record<string, RequestCredentials> = {\n SAME_ORIGIN: \"same-origin\",\n INCLUDE: \"include\",\n OMIT: \"omit\",\n} as const;\n\ntype UriComponent = string | number | boolean;\n\ntype QueryParams = Record<string, UriComponent | ArrayUnion<UriComponent>> | undefined;\ntype PathParams = Record<string, string> | undefined;\ntype BodyParams = AnyObject | AnyObject[] | undefined;\n\nconst encodeQueryParam = (key: string, value: UriComponent) => (\n `${encodeURIComponent(key)}=${encodeURIComponent(value)}`\n);\n\nconst buildQueryString = (params?: Nullable<QueryParams>): string => {\n if (params === null || params === undefined) {\n return \"\";\n }\n const entries = Object.entries(params); // cannot use new URLSearchParams because it does not accept arrays\n const queryComponents = entries.map(([key, value]) => {\n let component;\n if (Array.isArray(value)) {\n component = value.map(subValue => encodeQueryParam(key, subValue)).join(\"&\");\n } else {\n component = encodeQueryParam(key, value);\n }\n return component;\n });\n return queryComponents.join(\"&\");\n};\n\nconst buildUri = ({ url, params }: { url: string; params?: Nullable<QueryParams> }) => {\n let uri = url;\n const queryParams = buildQueryString(params);\n if (!isEmpty(queryParams)) {\n uri = uri + `?${queryParams}`;\n }\n return uri;\n};\n\ntype InternalApiHeaders = {\n Accept: \"application/json\";\n \"Content-Type\": \"application/json\";\n Authorization: `Bearer ${string}`;\n [extraHeader: string]: string;\n};\n\n/**\n * Function to generate the Hurdlr request headers. If any `extraHeaders` collide with the necessary headers, the `extraHeaders` will be overwritten.\n * @param accessToken A necessary access token to form the Authorization columnHeaders\n * @param extraHeaders An object of strings mapped to any value. These values will be stringified, but not deeply.\n * For example, a JSON object would be serialized as `[object Object]`.\n */\nconst getRequestHeaders = ({ accessToken, extraHeaders }: { accessToken: string; extraHeaders?: Record<string, unknown> }): InternalApiHeaders => {\n const baseHeaders: InternalApiHeaders = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${accessToken}`,\n };\n if (extraHeaders !== undefined) {\n const stringHeaders = mapValues(extraHeaders, value => `${value}`);\n return { ...stringHeaders, ...baseHeaders };\n }\n return baseHeaders;\n};\n\nconst handleExtraHeaders = ({ extraHeaders, authorization }: { extraHeaders?: Record<string, string>; authorization?: string }) => {\n const headers = { ...extraHeaders };\n if (authorization !== undefined) {\n // overwrite Authorization in extraHeaders if passed on arguments instead\n headers.Authorization = authorization;\n }\n return headers;\n};\n\nconst handleHttpResponse = async (response: Response) => {\n const res = await response.json();\n if (response.ok) {\n return res;\n }\n return Promise.reject(res);\n};\n\n/**\n * Given a URL and a set of path parameters, replace the path parameters in the URL with their corresponding values.\n * Expects path parameters to be in the format `{paramName}` in the URL.\n * If no path parameters are provided, return the URL unchanged.\n * @param url\n * @param pathParams\n */\nconst handlePathParams = (url: string, pathParams: PathParams): string => {\n if (pathParams !== undefined) {\n Object.entries(pathParams).forEach(([key, value]) => {\n url = url.replace(`{${key}}`, value);\n });\n }\n return url;\n};\n\nconst getCredentials = (includeCredentials?: boolean) => {\n return includeCredentials ? Credentials.INCLUDE : Credentials.OMIT;\n};\n\n// should be included on all v5 requests, manage session caching on trax server\nconst v5ApiHeaders = {\n \"hurdlr-cache-session\": true,\n \"hurdlr-auto-refresh-token\": true,\n};\n\ntype BuildEntityRequestParams<Paths extends string, PParams extends PathParams = undefined> = {\n path: Paths;\n pathParams?: PParams;\n accessToken: string;\n extraHeaders?: Record<string, string>;\n pagination?: PaginationHeader;\n endpointManager: EndpointManager<Paths>;\n};\n\nfunction buildEntityRequest<\n Paths extends string,\n PParams extends PathParams = undefined,\n>(entityRequest: BuildEntityRequestParams<Paths, PParams>) {\n const headers = getRequestHeaders({\n accessToken: entityRequest.accessToken,\n extraHeaders: {\n ...entityRequest.extraHeaders,\n ...entityRequest.pagination,\n ...(entityRequest.endpointManager.apiVersion === \"v5\" ? v5ApiHeaders : {}) },\n });\n const baseUrl = entityRequest.endpointManager.getUrl(entityRequest.path);\n const url = handlePathParams(baseUrl, entityRequest.pathParams);\n\n return {\n url,\n headers,\n };\n};\n\nexport {\n Credentials,\n HttpMethods,\n handlePathParams,\n buildUri,\n buildQueryString,\n getRequestHeaders,\n handleHttpResponse,\n handleExtraHeaders,\n getCredentials,\n buildEntityRequest,\n};\n\nexport type {\n HttpMethod,\n InternalApiHeaders,\n QueryParams,\n PathParams,\n BodyParams,\n};\n","import { breadcrumb } from \"../../utils/logging.ts\";\nimport {\n handleHttpResponse,\n HttpMethods,\n type HttpMethod,\n type PathParams,\n type BodyParams, handleExtraHeaders, getCredentials, buildEntityRequest,\n} from \"./http.ts\";\nimport { type PaginationHeader } from \"./pagination.ts\";\nimport { type EndpointManager } from \"../endpointManager.ts\";\nimport { paths } from \"../versions/v6/v6Schema.ts\";\n\ntype PostRequest<BParams extends BodyParams> = {\n url: string;\n authorization?: string; // caller expected to handle adding \"Bearer\", etc\n params?: BParams;\n showErrorAlert?: boolean;\n includeCredentials?: boolean;\n method?: HttpMethod;\n extraHeaders?: Record<string, string>;\n};\n\nasync function post<BParams extends BodyParams, PostResponse>({\n authorization,\n extraHeaders,\n includeCredentials,\n method = HttpMethods.POST,\n params,\n url,\n}: PostRequest<BParams>): Promise<PostResponse> {\n // TODO: block post calls for readonly\n const headers = handleExtraHeaders({ extraHeaders, authorization });\n const credentials = getCredentials(includeCredentials);\n breadcrumb(\"HTTP POST Request\", { url, accessToken: authorization });\n try {\n const response = await fetch(url, {\n method,\n headers,\n credentials,\n body: JSON.stringify(params),\n });\n breadcrumb(\"HTTP POST Response\", { url: url, status: response.status, statusText: response.statusText });\n return handleHttpResponse(response);\n } catch (error) {\n // caller should handle promise rejection\n return Promise.reject(error);\n }\n}\n\n/*\n * Extend as needed for other API versions. This was written with v5 and v6 in mind.\n */\ntype EntityPostRequestBase<Paths extends string, PParams extends PathParams, BParams extends BodyParams> = {\n path: Paths;\n pathParams?: PParams;\n bodyParams?: BParams;\n accessToken: string;\n method: HttpMethod;\n pagination?: PaginationHeader;\n extraHeaders?: Record<string, string>;\n endpointManager: EndpointManager<Paths>;\n};\n\ntype V5EntityPostRequest<\n Paths extends string,\n BParams extends BodyParams,\n> = EntityPostRequestBase<Paths, undefined, BParams>;\n\ntype V6EntityPostRequest<\n BParams extends BodyParams = undefined,\n PParams extends PathParams = undefined,\n> = EntityPostRequestBase<keyof paths, PParams, BParams>;\n\n/**\n * Function to make a POST request to the Tight API. This function is used for all entity post requests.\n * @param entityPostRequest {V6EntityPostRequest} The request object containing the path, body parameters, and access token.\n */\nasync function entityPost<\n PostResponse,\n Paths extends string,\n PParams extends PathParams = undefined,\n BParams extends BodyParams = undefined,\n>(entityPostRequest: EntityPostRequestBase<Paths, PParams, BParams>): Promise<PostResponse> {\n const { url, headers } = buildEntityRequest(entityPostRequest);\n\n return post({\n url,\n params: entityPostRequest.bodyParams,\n includeCredentials: true,\n showErrorAlert: true,\n extraHeaders: headers,\n method: entityPostRequest.method, // TODO: remove (used for deletion case for reactions) and create an entityDelete method instead\n });\n}\n\nasync function v6EntityPost<\n PostResponse,\n BParams extends BodyParams = undefined,\n PParams extends PathParams = undefined,\n>(entityPostRequest: V6EntityPostRequest<BParams, PParams>): Promise<PostResponse> {\n return entityPost(entityPostRequest);\n}\n\nasync function v5EntityPost<\n PostResponse,\n Paths extends string,\n BParams extends BodyParams = undefined,\n>(entityPostRequest: V5EntityPostRequest<Paths, BParams>): Promise<PostResponse> {\n return entityPost(entityPostRequest);\n}\n\nexport {\n post,\n v5EntityPost,\n v6EntityPost,\n};\n\nexport type {\n PostRequest,\n V5EntityPostRequest,\n V6EntityPostRequest,\n};\n","const buildUrl = (baseUrl: string, path: string) => { // eventually type to use endpoints\n let cleanPath: string = path;\n while (cleanPath.length > 0 && cleanPath.charAt(0) === \"/\") {\n cleanPath = cleanPath.slice(1);\n }\n return `${baseUrl}/${cleanPath}`;\n};\n\ntype ApiVersion = \"v1\" | \"v5\" | \"v6\";\n\ntype EndpointManager<Paths extends string = string> = {\n readonly getUrl: (path: Paths) => string;\n readonly baseUrl: string;\n readonly apiVersion: ApiVersion;\n};\n\nconst createEndpointManager = <Paths extends string = string>(baseUrl: string, apiVersion: ApiVersion): EndpointManager<Paths> => {\n const getUrl = (path: Paths) => buildUrl(baseUrl, path);\n return {\n getUrl,\n baseUrl,\n apiVersion,\n };\n};\n\nexport {\n createEndpointManager,\n};\n\nexport type {\n EndpointManager,\n};\n","import { ValueOf } from \"./utilityTypes.ts\";\nimport { Environments } from \"../environment/Environment.ts\";\n\nconst TightEnvironments = {\n ...Environments,\n DEVELOPMENT: \"DEVELOPMENT\",\n LOCAL: \"LOCAL\",\n} as const;\n\ntype TightEnvironment = ValueOf<typeof TightEnvironments>;\n\n// TODO: remove v5 when converted\nconst V5ApiUrls = {\n DEVELOPMENT: \"https://dev.hurdlr.com/rest\",\n PRODUCTION: \"https://prod.hurdlr.com/rest\",\n SANDBOX: \"https://sandbox.hurdlr.com/rest\",\n LOCAL: \"http://localhost:8081/TraxAngular/rest\",\n} as const;\ntype V5ApiUrl = ValueOf<typeof V5ApiUrls>;\n\nconst V6ApiUrls = {\n DEVELOPMENT: \"https://dev.tight.com\",\n PRODUCTION: \"https://prod.tight.com\",\n SANDBOX: \"https://sandbox.tight.com\",\n LOCAL: \"http://localhost:8080\",\n};\ntype V6ApiUrl = ValueOf<typeof V6ApiUrls>;\n\nfunction getV1ApiUrl(environment: TightEnvironment): V5ApiUrl {\n return V5ApiUrls[environment];\n}\n\nfunction getV5ApiUrl(environment: TightEnvironment): V5ApiUrl {\n return V5ApiUrls[environment];\n}\n\nfunction getV6ApiUrl(environment: TightEnvironment): V6ApiUrl {\n return V6ApiUrls[environment];\n}\n\nexport {\n TightEnvironments,\n V5ApiUrls,\n V6ApiUrls,\n getV1ApiUrl,\n getV5ApiUrl,\n getV6ApiUrl,\n};\n\nexport type {\n TightEnvironment,\n V5ApiUrl,\n V6ApiUrl,\n};\n","import { createEndpointManager } from \"../../endpointManager.ts\";\nimport { getV5ApiUrl, TightEnvironment } from \"../../../utils/traxEnvironmentVariables.ts\";\n\nfunction getV5EndpointManager(environment: TightEnvironment) {\n return createEndpointManager(`${getV5ApiUrl(environment)}/v5`, \"v5\");\n}\n\nexport {\n getV5EndpointManager,\n};\n","import { EntityFetchFn, useEntity } from \"../utils/useEntity.ts\";\nimport { DateOptions, DateStringRange, getDateRange } from \"../../../utils/date/date.ts\";\nimport { v5EntityPost, V5EntityPostRequest } from \"../../http/post.ts\";\nimport { getV5EndpointManager } from \"../../versions/v5/v5EndpointManager.ts\";\nimport { GroupingFilter } from \"../../../utils/grouping.ts\";\nimport { components } from \"../../versions/v5/v5Schema.ts\";\n\ntype ProfitAndLossParams = { exportType: \"JSON\" } & DateStringRange;\n\ntype ProfitAndLossKey = [\n \"reports\",\n \"profitAndLoss\",\n {\n filter: DateOptions;\n grouping?: GroupingFilter;\n },\n];\n\nconst profitAndLossKeys = {\n of: ({ filter, grouping }: { filter: DateOptions; grouping?: GroupingFilter }): ProfitAndLossKey => ([\n \"reports\",\n \"profitAndLoss\",\n {\n filter,\n ...(grouping && { grouping }),\n },\n ]),\n};\n\ntype ProfitAndLossResponse = components[\"schemas\"][\"ProfitAndLossReportRetVal\"];\ntype ExpenseChildDTO = components[\"schemas\"][\"ProfitAndLossDTOWithChildren\"];\ntype ProfitAndLossData = components[\"schemas\"][\"ProfitAndLossDTOChild0Data\"];\n\nconst getProfitAndLoss: EntityFetchFn<ProfitAndLossResponse, ProfitAndLossKey> = async (queryContext) => {\n const queryKey = queryContext.queryKey;\n const queryParams = queryKey[2];\n const accessToken = queryKey[3].accessToken;\n const environment = queryKey[3].environment;\n const params: V5EntityPostRequest<string, ProfitAndLossParams> = {\n path: \"/reports/profitAndLoss\",\n bodyParams: {\n exportType: \"JSON\",\n ...getDateRange(queryParams.filter),\n ...(queryParams.grouping && { grouping: queryParams.grouping }),\n },\n method: \"POST\",\n accessToken: accessToken,\n endpointManager: getV5EndpointManager(environment),\n };\n return await v5EntityPost<ProfitAndLossResponse, string, ProfitAndLossParams>(params);\n};\n\ntype ProfitAndLossProps<TSummary> = {\n filter: DateOptions;\n grouping?: GroupingFilter;\n select: (data: ProfitAndLossResponse) => TSummary;\n};\n\nfunction useProfitAndLoss<TSummary>({ filter, grouping, select }: ProfitAndLossProps<TSummary>) {\n return useEntity({ queryKey: profitAndLossKeys.of({ filter, grouping }), queryFn: getProfitAndLoss, select });\n}\n\nexport {\n useProfitAndLoss,\n};\n\nexport type {\n ProfitAndLossResponse,\n ExpenseChildDTO,\n ProfitAndLossData,\n};\n","import {\n ProfitAndLossData,\n ProfitAndLossResponse,\n useProfitAndLoss,\n} from \"../../../query/fetches/report/profitAndLoss.ts\";\nimport { DateOptions, getMonthAndYear, parseLocalDate } from \"../../../utils/date/date.ts\";\nimport { GroupingFilter } from \"../../../utils/grouping.ts\";\nimport { isNullish } from \"../../../utils/typeUtils.ts\";\nimport Big from \"big.js\";\n\nconst NO_DATA_HEIGHT_PERCENTAGE = 0.03; // using percentage so height stays the same independent of domain size\nconst FALLBACK_NO_DATA_HEIGHT = 3; // fallback height for no data in any of the months\n\ntype MonthlySummary = {\n month: string;\n income: number;\n expenses: number;\n profit: number;\n loss: number;\n netIncome: number;\n hasNoData: boolean;\n noDataHeight?: number;\n};\n\n// used as keys for chart elements\ntype dataKeys = keyof Omit<MonthlySummary, \"month\" | \"hasNoData\">;\nconst DataKeyMap: Record<dataKeys, string> = {\n income: \"income\",\n expenses: \"expenses\",\n profit: \"profit\",\n loss: \"loss\",\n netIncome: \"netIncome\",\n noDataHeight: \"noDataHeight\",\n};\n\nfunction getFormattedMonth(dateStr: string | undefined) {\n const date = parseLocalDate(dateStr ?? \"\");\n return date !== null ? getMonthAndYear(date, { abbreviateMonth: true, abbreviateYear: true }) : \"\";\n}\n\nfunction calculateMonthlySummary(\n netIncome: number,\n dataIncome: number | undefined,\n dataExpenses: number | undefined,\n) {\n const profit = netIncome > 0 ? netIncome : 0;\n const remainingIncome = dataIncome !== undefined ? Big(dataIncome).minus(profit).toNumber() : 0;\n const loss = netIncome < 0 ? netIncome : 0;\n const remainingExpenses = dataExpenses !== undefined ? Big(dataExpenses).plus(loss).toNumber() : 0;\n\n return {\n profit,\n remainingIncome,\n loss,\n remainingExpenses,\n };\n}\n\nfunction hasNoDataForMonth(netIncome: number, remainingIncome: number, remainingExpenses: number) {\n return netIncome === 0 && remainingIncome === 0 && remainingExpenses === 0;\n}\n\nfunction calculateNoDataHeight(domainMin: number, domainMax: number) {\n const domainRange = domainMax - domainMin;\n return domainRange > 0\n ? domainRange * NO_DATA_HEIGHT_PERCENTAGE\n : FALLBACK_NO_DATA_HEIGHT;\n}\n\nfunction processMonthData(monthData: ProfitAndLossData) {\n const monthName = getFormattedMonth(monthData.period?.beginDate);\n const netIncome = monthData.netIncome ?? 0;\n const { profit, remainingIncome, loss, remainingExpenses } = calculateMonthlySummary(netIncome, monthData.income?.total, monthData.expenses?.total);\n\n const hasNoData = hasNoDataForMonth(netIncome, remainingIncome, remainingExpenses);\n const month: MonthlySummary = {\n month: monthName,\n income: remainingIncome,\n expenses: -remainingExpenses, // inverting bc currently expenses are positive from API (need negative values for graph)\n profit,\n loss,\n netIncome,\n hasNoData,\n };\n\n return {\n month,\n netIncome,\n };\n}\n\ntype DomainBounds = {\n domainMin: number;\n domainMax: number;\n};\n\nfunction calculateDomainBounds(data: ProfitAndLossData[]): DomainBounds {\n return data.reduce((acc, child) => {\n return {\n domainMin: Math.min(acc.domainMin, -(child.expenses?.total ?? 0)),\n domainMax: Math.max(acc.domainMax, child.income?.total ?? 0),\n };\n }, { domainMin: 0, domainMax: 0 });\n}\n\ntype ExpandedPLSummary = {\n total: number;\n domain: number[];\n months: MonthlySummary[];\n hasAnyData: boolean;\n};\n\nfunction processResponse(response: ProfitAndLossResponse): ExpandedPLSummary {\n const plSummary: ExpandedPLSummary = {\n total: 0,\n domain: [],\n months: [],\n hasAnyData: false,\n };\n if (response.result === \"FAILURE_NO_DATA\") {\n return plSummary;\n }\n const data = response.json?.data;\n if (isNullish(data)) {\n return plSummary;\n }\n\n for (const child of data) {\n const { month, netIncome } = processMonthData(child);\n plSummary.total = Big(netIncome).plus(plSummary.total).toNumber();\n plSummary.months.push(month);\n }\n\n const { domainMin, domainMax } = calculateDomainBounds(data);\n plSummary.domain = [domainMin, domainMax];\n plSummary.hasAnyData = plSummary.months.some(month => !month.hasNoData);\n\n // calculate height for noData bar\n const noDataHeight = calculateNoDataHeight(domainMin, domainMax);\n plSummary.months = plSummary.months.map((month) => {\n if (month.hasNoData) {\n return { ...month, noDataHeight };\n }\n return month;\n });\n\n return plSummary;\n}\n\ntype ExpandedPLSummaryProps = {\n filter: DateOptions;\n grouping: GroupingFilter;\n};\n\nfunction useExpandedPLSummary({ filter, grouping }: ExpandedPLSummaryProps) {\n return useProfitAndLoss<ExpandedPLSummary>({ filter, grouping, select: processResponse });\n}\n\nexport { useExpandedPLSummary, DataKeyMap };\nexport type {\n ExpandedPLSummary,\n MonthlySummary,\n};\n","import { ValueOf } from \"./utilityTypes.ts\";\n\nconst GroupingFilters = {\n DAILY: \"DAILY\",\n MONTHLY: \"MONTHLY\",\n QUARTERLY: \"QUARTERLY\",\n YEARLY: \"YEARLY\",\n} as const;\n\ntype GroupingFilter = ValueOf<typeof GroupingFilters>;\n\nexport { GroupingFilters };\n\nexport type { GroupingFilter };\n","import { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { Heading } from \"../typography/Heading.tsx\";\n\nconst tileHeader = stylist(ValidClassName[\"tile-header\"], css({\n backgroundColor: \"surface.foreground\",\n border: \"{borderWidths.lg} solid {colors.border.layout.strong}\",\n borderTopRadius: \"lg\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"15px\",\n}));\n\ntype TileHeaderProps = {\n title: string;\n};\n\nfunction TileHeader({ title }: TileHeaderProps) {\n return (\n <div {...tileHeader}>\n <Heading>{title}</Heading>\n {/* TODO: add dropdown with date filter options */}\n </div>\n );\n}\n\nexport { TileHeader };\n","import { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { PropsWithChildren } from \"react\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\nconst tileBodyStylist = stylist(ValidClassName[\"tile-body\"], css({\n display: \"flex\",\n justifyContent: \"start\",\n alignItems: \"start\",\n flexDirection: \"column\",\n gap: \"20px\",\n height: \"100%\",\n padding: \"20px 15px\",\n backgroundColor: \"surface.foreground\",\n border: \"{borderWidths.lg} solid {colors.border.layout.strong}\",\n borderBottomRadius: \"lg\",\n borderTop: \"hidden\",\n}));\n\ntype TileBodyProps = PropsWithChildren;\n\nfunction TileBody({ children }: TileBodyProps) {\n return (\n <div {...tileBodyStylist}>\n {children}\n </div>\n );\n}\n\nexport { TileBody };\n","import { cva, RecipeVariant } from \"../../../styled-system/css\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { PropsWithChildren } from \"react\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\nconst tileCss = cva({\n base: {\n display: \"flex\",\n flexDirection: \"column\",\n boxShadow: \"box-shadow\",\n transition: \"height 0.5s, width 0.5s\",\n position: \"relative\",\n },\n variants: {\n type: {\n default: {\n width: \"400px\",\n flexShrink: 0,\n height: \"300px\",\n },\n chart: {\n minWidth: \"900px\",\n maxWidth: \"1440px\",\n height: \"481px\",\n },\n },\n isSample: {\n true: {\n pointerEvents: \"none\",\n },\n false: {},\n },\n },\n defaultVariants: {\n type: \"default\",\n },\n});\n\ntype TileProps = PropsWithChildren<{\n type?: RecipeVariant<typeof tileCss>[\"type\"];\n isSample?: boolean;\n}>;\n\nfunction Tile({ children, type, isSample = false }: TileProps) {\n const tileStylist = stylist(ValidClassName[\"tile\"], tileCss({ type, isSample }));\n\n return (\n <div {...tileStylist}>\n {children}\n </div>\n );\n}\n\nexport { Tile };\n","import { css } from \"../../styled-system/css\";\n\nexport const ellipsisText = css({ overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" });\nexport const ellipsisTextRaw = css.raw({ overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" });\n\nexport const small = css({\n fontSize: \"sm\",\n fontStyle: \"normal\",\n fontWeight: \"sm\",\n lineHeight: \"12px\",\n letterSpacing: \"0.66px\",\n});\n","import { PropsWithChildren } from \"react\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { ellipsisText } from \"../../style/text.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\nconst textStylist = stylist(ValidClassName.text, css({\n fontSize: \"md\",\n fontWeight: \"sm\",\n color: \"typography.base\",\n fontStyle: \"normal\",\n letterSpacing: \"0.84px\",\n maxWidth: \"100%\",\n}), ellipsisText);\n\nfunction LabelContent({ children }: PropsWithChildren) {\n return <div {...textStylist}>{children}</div>;\n}\n\nexport { LabelContent };\n","import { stylist } from \"../../style/stylist.ts\";\nimport { PropsWithChildren } from \"react\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { fontRecipes } from \"../../style/recipes/fontRecipes.ts\";\n\ntype MetricXLProps = PropsWithChildren;\n\nconst metricXLStylist = stylist(ValidClassName[\"metric-xl\"], fontRecipes({ metric: \"xl\" }));\n\nfunction MetricXL(props: MetricXLProps) {\n return (\n <div {...metricXLStylist}>\n {props.children}\n </div>\n );\n}\n\nexport { MetricXL };\n","import { css } from \"../../../styled-system/css\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { LabelContent } from \"./LabelContent.tsx\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { MetricXL } from \"./MetricXL.tsx\";\n\ntype SummationProps = {\n title: string;\n label: string;\n};\n\nconst summationStylist = stylist(ValidClassName.summation, css({\n display: \"flex\",\n flexDirection: \"column\",\n flexShrink: 1,\n alignItems: \"flex-start\",\n justifyContent: \"space-between\",\n}));\n\nfunction Summation({ title, label }: SummationProps) {\n return (\n <div {...summationStylist}>\n <MetricXL>{title}</MetricXL>\n <LabelContent>{label}</LabelContent>\n </div>\n );\n}\n\nexport { Summation };\n","import { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { PropsWithChildren } from \"react\";\n\nconst tileGraphsStylist = stylist(\n null,\n css({\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"space-evenly\",\n alignItems: \"start\",\n height: \"100%\",\n width: \"100%\",\n }),\n);\n\ntype TileGraphsProps = PropsWithChildren;\n\nfunction TileGraphs({ children }: TileGraphsProps) {\n return (\n <div {...tileGraphsStylist}>{children}</div>\n );\n}\n\nexport { TileGraphs };\n","/* Maximum value of a Java int */\nconst INT32_MAX = 2147483647;\n/**\n * Given a value and a range, normalize the number. Normalizes to 0 - 100 by default.\n * @param value The value to normalize\n * @param min The minimum amount in the range\n * @param max The maximum amount in the range\n * @param targetMin The minimum amount in the desired range\n * @param targetMax The maximum amount in the desired range\n */\nfunction normalize(value: number, min: number, max: number, targetMin: number = 0, targetMax: number = 100): number {\n const dividend = (value - min) * (targetMax - targetMin);\n const divisor = (max - min);\n return targetMin + (dividend / divisor);\n}\n\n/**\n * Performs a log operation on `argument` with the provided `base`\n * @param base The base of the logarithm\n * @param argument The number to perform the operation on\n */\nfunction logBase(base: number, argument: number) {\n return Math.log(argument) / Math.log(base);\n}\n\n/**\n * Floors the provided number towards 0.\n *\n * Example:\n * ```\n * smartFloor(3.5); // 3\n * smartFloor(-3.5); // -3\n * ```\n * @param value\n */\nconst smartFloor = (value: number): number => Math.sign(value) * Math.floor(Math.abs(value));\n\n/**\n * Rounds the provided number away from 0.\n *\n * Example:\n * ```\n * smartRound(5.3); // 5\n * smartRound(5.8); // 6\n * smartRound(-5.3); // -5\n * smartRound(-5.8); // -6\n * ```\n * @param value The number to round\n * @param decimalPoints The number of decimal digits to round to. Must be >= 0\n */\nconst smartRound = (value: number, decimalPoints: number = 0): number => {\n const absVal = Math.abs(value);\n let rounded: number;\n if (decimalPoints <= 0) {\n rounded = Math.round(absVal);\n } else {\n const stringNum = absVal.toFixed(decimalPoints);\n rounded = parseFloat(stringNum);\n }\n return Math.sign(value) * rounded;\n};\n\nexport {\n INT32_MAX,\n logBase,\n normalize,\n smartRound,\n smartFloor,\n};\n","import { logBase, smartFloor, smartRound } from \"../math/number.ts\";\n\nconst formatNumberLocale = (value: number, minFractions = 0, maxFractions = 2) => {\n return value.toLocaleString(undefined, {\n useGrouping: true,\n minimumFractionDigits: minFractions,\n maximumFractionDigits: maxFractions,\n });\n};\n\n/**\n * `off` - never show signage\n *\n * `default` - show a negative sign, only when negative\n *\n * `parens` - show parenthesis around negative values\n *\n * `always` - show `+` or `-`, depending on positive or negative\n */\ntype SignageOption = \"off\" | \"default\" | \"parens\" | \"always\";\n\n/**\n * `floor` - Truncate any cents\n *\n * `round` - Round to the nearest integer\n *\n * `default` - Show cents IFF the value is not an integer\n *\n * `always` - Always show cents. For integers, this will be `.00`.\n */\ntype CentsOptions = \"floor\" | \"round\" | \"default\" | \"always\";\n\ntype SmartNumberOptions = {\n cents?: CentsOptions;\n condense?: boolean;\n dollarSign?: boolean;\n signage?: SignageOption;\n};\n\nconst BILLION = 1000000000;\nconst MILLION = 1000000;\n\n/**\n * A function that returns a formated number for display purposes\n * @param value The value to format\n * @param cents How to display cents. See `CentsOptions` for more details on usage.\n * @param condense Whether to condense large numbers. For example, when set to `true`, 10,000,000 would become 10M.\n * @param dollarSign Whether to display a dollar sign in front of the formatted number. Will appear after a negative sign, but outside parenthesis\n * @param signage How to display signage on the value. See `SignageOptions` for more details on usage.\n */\nfunction smartNumber(\n value: string | number,\n {\n cents = \"default\",\n condense = false,\n dollarSign = false,\n signage = \"default\",\n }: SmartNumberOptions = {},\n): string | \"\" {\n const numVal: number = typeof value === \"string\" ? parseFloat(value) : value;\n\n if (Number.isNaN(numVal)) {\n return \"\";\n }\n\n let condensedStr: string;\n const absVal = Math.abs(numVal);\n let negativeAfterRound: boolean;\n\n if (condense && absVal > 99999) { // large numbers in the format 10K, 1M, 1B\n negativeAfterRound = Math.sign(numVal) < 0;\n\n const grouping = Math.floor(logBase(1000, absVal)) - 1;\n const divisor = Math.pow(1000, grouping);\n const shrunk = Math.round(absVal / divisor);\n const rounded = shrunk * divisor; // rounded through floating point\n\n let magnitude = shrunk / 1000.0;\n if (absVal < BILLION && magnitude >= 1000) { // bump to next cutoff\n magnitude /= 1000;\n }\n\n let suffix: string;\n if (rounded >= BILLION) {\n suffix = \"B\";\n } else if (rounded >= MILLION) {\n suffix = \"M\";\n } else {\n magnitude = Math.round(magnitude); // no decimal points for thousands\n suffix = \"K\";\n }\n\n const formatted = formatNumberLocale(magnitude, 0, 1);\n condensedStr = `${formatted}${suffix}`;\n } else { // handle cents rounding for smaller numbers\n let rounded: number;\n const CENTS_PRECISION = 2;\n const INT_PRECISION = 0;\n let precision;\n let minPrecision;\n if (cents === \"floor\") {\n precision = INT_PRECISION;\n minPrecision = INT_PRECISION;\n rounded = smartFloor(numVal);\n } else if (cents === \"round\") {\n precision = INT_PRECISION;\n minPrecision = INT_PRECISION;\n rounded = smartRound(numVal, precision);\n } else if (cents === \"always\") {\n precision = CENTS_PRECISION;\n minPrecision = CENTS_PRECISION;\n rounded = smartRound(numVal, precision);\n } else if (cents === \"default\" && Math.abs(numVal) >= 1000) {\n // input >= 1000 gets rounded to integer\n precision = INT_PRECISION;\n minPrecision = INT_PRECISION;\n rounded = smartRound(numVal, precision);\n } else {\n precision = CENTS_PRECISION;\n rounded = smartRound(numVal, precision);\n // if cents included, use minimum cents precision\n minPrecision = rounded % 1 === 0 ? INT_PRECISION : CENTS_PRECISION;\n }\n negativeAfterRound = Math.sign(rounded) < 0;\n const roundedStr = Math.abs(rounded);\n condensedStr = formatNumberLocale(roundedStr, minPrecision, precision);\n }\n\n let signedString = condensedStr;\n const dollar = dollarSign ? \"$\" : \"\";\n if (signage === undefined || signage === \"off\") {\n signedString = condensedStr;\n } else if (signage === \"parens\") {\n const numberWithParens = negativeAfterRound ? `(${condensedStr})` : condensedStr;\n signedString = `${dollar}${numberWithParens}`;\n } else if (signage === \"always\") {\n const sign = negativeAfterRound ? \"-\" : \"+\";\n signedString = `${sign}${dollar}${condensedStr}`;\n } else if (signage === \"default\") {\n const sign = negativeAfterRound ? \"-\" : \"\";\n signedString = `${sign}${dollar}${condensedStr}`;\n }\n return signedString;\n}\n\nfunction smartMoneySummary(value: string | number) {\n return smartNumber(value, { condense: true, dollarSign: true });\n}\n\nfunction formatMoney(amount: string | number) {\n return smartNumber(amount, { cents: \"always\", condense: false, dollarSign: true, signage: \"always\" });\n}\n\nexport {\n smartNumber,\n smartMoneySummary,\n formatMoney,\n};\n","import { css } from \"../../../styled-system/css\";\nimport { stylist, StylistReturn } from \"../../style/stylist.ts\";\nimport { ellipsisText } from \"../../style/text.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { mergeStylists } from \"../../style/mergeStylists.ts\";\n\ntype FontStyleOption = \"sm\" | \"med\" | \"lg\";\n\ntype TextProps = {\n children?: string;\n size: FontStyleOption;\n weight: FontStyleOption;\n stylists?: StylistReturn[];\n};\n\nconst stylistMap: Record<string, StylistReturn> = {\n \"sm-sm\": stylist(\n ValidClassName.text,\n css({\n fontSize: \"sm\",\n fontWeight: \"sm\",\n color: \"typography.base\",\n fontStyle: \"normal\",\n letterSpacing: \"0.84px\",\n maxWidth: \"100%\",\n }),\n ellipsisText,\n ),\n \"sm-med\": stylist(\n ValidClassName.text,\n css({\n fontSize: \"sm\",\n fontWeight: \"md\",\n color: \"typography.base\",\n fontStyle: \"normal\",\n letterSpacing: \"0.84px\",\n maxWidth: \"100%\",\n }),\n ellipsisText,\n ),\n \"med-sm\": stylist(\n ValidClassName.text,\n css({\n fontSize: \"md\",\n fontWeight: \"sm\",\n color: \"typography.base\",\n fontStyle: \"normal\",\n letterSpacing: \"0.84px\",\n maxWidth: \"100%\",\n }),\n ellipsisText,\n ),\n \"med-med\": stylist(\n ValidClassName.text,\n css({\n fontSize: \"md\",\n fontWeight: \"md\",\n color: \"typography.base\",\n fontStyle: \"normal\",\n letterSpacing: \"0.84px\",\n maxWidth: \"100%\",\n }),\n ellipsisText,\n ),\n \"med-lg\": stylist(\n ValidClassName.text,\n css({\n fontSize: \"md\",\n fontWeight: \"lg\",\n color: \"typography.base\",\n fontStyle: \"normal\",\n letterSpacing: \"0.84px\",\n maxWidth: \"100%\",\n }),\n ellipsisText,\n ),\n};\n\nfunction Text({ children, size, weight, stylists = [] }: TextProps) {\n const localStylist = stylistMap[`${size}-${weight}`];\n const textStylist = mergeStylists([localStylist, ...stylists]);\n\n return <div title={children} {...textStylist}>{children}</div>;\n}\n\nexport { Text };\n","import { Text } from \"./Text.tsx\";\nimport { stylist, StylistReturn } from \"../../style/stylist.ts\";\nimport { isNullishOrEmptyOrBlank } from \"../../utils/string/stringUtils.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { fontRecipes } from \"../../style/recipes/fontRecipes.ts\";\n\nconst strongLabelStylist = stylist(ValidClassName[\"strong-label\"],\n fontRecipes({ label: \"strongLabel\" }),\n);\n\nfunction StrongLabel({ children, stylists = [] }: { children?: string; stylists?: StylistReturn[] }) {\n if (isNullishOrEmptyOrBlank(children)) {\n return null;\n }\n return (\n <Text size=\"med\" weight=\"med\" stylists={[strongLabelStylist, ...stylists]}>\n {children}\n </Text>\n );\n}\n\nexport { StrongLabel };\n","import { Text } from \"./Text.tsx\";\nimport { css } from \"../../../styled-system/css\";\nimport { stylist, StylistReturn } from \"../../style/stylist.ts\";\nimport { isNullishOrEmptyOrBlank } from \"../../utils/string/stringUtils.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { fontRecipes } from \"../../style/recipes/fontRecipes.ts\";\n\ntype SubLabelProps = {\n children?: string;\n stylists?: StylistReturn[];\n};\n\nconst subLabelStylist = stylist(ValidClassName[\"sub-label\"],\n fontRecipes({ label: \"subLabel\" }),\n css({\n fontStyle: \"normal\",\n }),\n);\n\nfunction SubLabel({ children, stylists = [] }: SubLabelProps) {\n if (isNullishOrEmptyOrBlank(children)) {\n return null;\n }\n return (\n <Text size=\"sm\" weight=\"sm\" stylists={[subLabelStylist, ...stylists]}>\n {children}\n </Text>\n );\n}\n\nexport { SubLabel };\n","import { Payload } from \"recharts/types/component/DefaultTooltipContent\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { smartMoneySummary } from \"../../../utils/money/smartNumber.ts\";\nimport { StrongLabel } from \"../../typography/StrongLabel.tsx\";\nimport { SubLabel } from \"../../typography/SubLabel.tsx\";\nimport { DataKeyMap } from \"./useExpandedPLSummary.ts\";\n\ntype TooltipProps = {\n active: boolean;\n payload: Payload<number, string>[];\n\n};\n\nconst tooltipContainerStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n border: \"1px solid {colors.border.layout}\",\n borderRadius: \"sm\",\n backgroundColor: \"surface.background\",\n boxShadow: \"box-shadow\",\n padding: \"10px\",\n width: \"fit-content\",\n height: \"fit-content\",\n}));\n\nfunction Tooltip({ active, payload }: TooltipProps) {\n if (payload.length <= 0 || !active || payload[0].dataKey === DataKeyMap.noDataHeight) {\n return null;\n }\n\n let total = payload[0].value ?? 0;\n if (payload[0].dataKey === \"expenses\") {\n total += payload[0].payload.loss;\n } else if (payload[0].dataKey === \"income\") {\n total += payload[0].payload.profit;\n }\n\n return (\n <div {...tooltipContainerStylist}>\n <StrongLabel>{payload[0].name ?? \"\"}</StrongLabel>\n <SubLabel>{smartMoneySummary(Number(total))}</SubLabel>\n </div>\n );\n}\n\nexport { Tooltip };\n","const tokens = {\n \"colors.white100\": {\n \"value\": \"#FFFFFF\",\n \"variable\": \"var(--Tight-colors-white100)\"\n },\n \"colors.white200\": {\n \"value\": \"#F9F9F9\",\n \"variable\": \"var(--Tight-colors-white200)\"\n },\n \"colors.white300\": {\n \"value\": \"#EDEDED\",\n \"variable\": \"var(--Tight-colors-white300)\"\n },\n \"colors.white600\": {\n \"value\": \"#E7E8E9\",\n \"variable\": \"var(--Tight-colors-white600)\"\n },\n \"colors.black100\": {\n \"value\": \"#CED1D2\",\n \"variable\": \"var(--Tight-colors-black100)\"\n },\n \"colors.black400\": {\n \"value\": \"#6F7576\",\n \"variable\": \"var(--Tight-colors-black400)\"\n },\n \"colors.black600\": {\n \"value\": \"#50595C\",\n \"variable\": \"var(--Tight-colors-black600)\"\n },\n \"colors.black700\": {\n \"value\": \"#182428\",\n \"variable\": \"var(--Tight-colors-black700)\"\n },\n \"colors.blue300\": {\n \"value\": \"#DAF4FA\",\n \"variable\": \"var(--Tight-colors-blue300)\"\n },\n \"colors.blue400\": {\n \"value\": \"#CAECF3\",\n \"variable\": \"var(--Tight-colors-blue400)\"\n },\n \"colors.blue500\": {\n \"value\": \"#94D8E8\",\n \"variable\": \"var(--Tight-colors-blue500)\"\n },\n \"colors.blue700\": {\n \"value\": \"#2AB2D1\",\n \"variable\": \"var(--Tight-colors-blue700)\"\n },\n \"colors.blue900\": {\n \"value\": \"#177F96\",\n \"variable\": \"var(--Tight-colors-blue900)\"\n },\n \"colors.green300\": {\n \"value\": \"#B8F3D5\",\n \"variable\": \"var(--Tight-colors-green300)\"\n },\n \"colors.green400\": {\n \"value\": \"#94E8BD\",\n \"variable\": \"var(--Tight-colors-green400)\"\n },\n \"colors.green500\": {\n \"value\": \"#5FDD9C\",\n \"variable\": \"var(--Tight-colors-green500)\"\n },\n \"colors.green700\": {\n \"value\": \"#009C75\",\n \"variable\": \"var(--Tight-colors-green700)\"\n },\n \"colors.yellow300\": {\n \"value\": \"#FFE787\",\n \"variable\": \"var(--Tight-colors-yellow300)\"\n },\n \"colors.yellow400\": {\n \"value\": \"#FCD34D\",\n \"variable\": \"var(--Tight-colors-yellow400)\"\n },\n \"colors.yellow500\": {\n \"value\": \"#FBBF24\",\n \"variable\": \"var(--Tight-colors-yellow500)\"\n },\n \"colors.red300\": {\n \"value\": \"#FF9797\",\n \"variable\": \"var(--Tight-colors-red300)\"\n },\n \"colors.red400\": {\n \"value\": \"#F45C5C\",\n \"variable\": \"var(--Tight-colors-red400)\"\n },\n \"colors.red500\": {\n \"value\": \"#E84747\",\n \"variable\": \"var(--Tight-colors-red500)\"\n },\n \"colors.red700\": {\n \"value\": \"#E42525\",\n \"variable\": \"var(--Tight-colors-red700)\"\n },\n \"fonts.base\": {\n \"value\": \"Duplet Regular, sans-serif\",\n \"variable\": \"var(--Tight-fonts-base)\"\n },\n \"fontSizes.sm\": {\n \"value\": \"11px\",\n \"variable\": \"var(--Tight-fontSizes-sm)\"\n },\n \"fontSizes.md\": {\n \"value\": \"14px\",\n \"variable\": \"var(--Tight-fontSizes-md)\"\n },\n \"fontSizes.lg\": {\n \"value\": \"20px\",\n \"variable\": \"var(--Tight-fontSizes-lg)\"\n },\n \"fontSizes.xl\": {\n \"value\": \"36px\",\n \"variable\": \"var(--Tight-fontSizes-xl)\"\n },\n \"fontWeights.sm\": {\n \"value\": \"400\",\n \"variable\": \"var(--Tight-fontWeights-sm)\"\n },\n \"fontWeights.md\": {\n \"value\": \"600\",\n \"variable\": \"var(--Tight-fontWeights-md)\"\n },\n \"fontWeights.lg\": {\n \"value\": \"900\",\n \"variable\": \"var(--Tight-fontWeights-lg)\"\n },\n \"radii.zero\": {\n \"value\": \"0\",\n \"variable\": \"var(--Tight-radii-zero)\"\n },\n \"radii.sm\": {\n \"value\": \"1px\",\n \"variable\": \"var(--Tight-radii-sm)\"\n },\n \"radii.md\": {\n \"value\": \"2px\",\n \"variable\": \"var(--Tight-radii-md)\"\n },\n \"radii.lg\": {\n \"value\": \"4px\",\n \"variable\": \"var(--Tight-radii-lg)\"\n },\n \"borderWidths.sm\": {\n \"value\": \"0.5px\",\n \"variable\": \"var(--Tight-borderWidths-sm)\"\n },\n \"borderWidths.md\": {\n \"value\": \"0.75px\",\n \"variable\": \"var(--Tight-borderWidths-md)\"\n },\n \"borderWidths.lg\": {\n \"value\": \"1px\",\n \"variable\": \"var(--Tight-borderWidths-lg)\"\n },\n \"borderWidths.xl\": {\n \"value\": \"2px\",\n \"variable\": \"var(--Tight-borderWidths-xl)\"\n },\n \"animations.appear.instant\": {\n \"value\": \"0.25s linear fade-in\",\n \"variable\": \"var(--Tight-animations-appear-instant)\"\n },\n \"animations.appear.delay\": {\n \"value\": \"0.25s linear both 1.5s fade-in\",\n \"variable\": \"var(--Tight-animations-appear-delay)\"\n },\n \"animations.shimmer\": {\n \"value\": \"2s ease-in-out infinite shimmer\",\n \"variable\": \"var(--Tight-animations-shimmer)\"\n },\n \"shadows.box-shadow\": {\n \"value\": \"0px 10px 30px 0px rgba(24, 36, 40, 0.10)\",\n \"variable\": \"var(--Tight-shadows-box-shadow)\"\n },\n \"breakpoints.sm\": {\n \"value\": \"640px\",\n \"variable\": \"var(--Tight-breakpoints-sm)\"\n },\n \"breakpoints.md\": {\n \"value\": \"850px\",\n \"variable\": \"var(--Tight-breakpoints-md)\"\n },\n \"breakpoints.lg\": {\n \"value\": \"1024px\",\n \"variable\": \"var(--Tight-breakpoints-lg)\"\n },\n \"breakpoints.xl\": {\n \"value\": \"1280px\",\n \"variable\": \"var(--Tight-breakpoints-xl)\"\n },\n \"breakpoints.1.5xl\": {\n \"value\": \"1400px\",\n \"variable\": \"var(--Tight-breakpoints-1.5xl)\"\n },\n \"breakpoints.2xl\": {\n \"value\": \"1536px\",\n \"variable\": \"var(--Tight-breakpoints-2xl)\"\n },\n \"sizes.breakpoint-sm\": {\n \"value\": \"640px\",\n \"variable\": \"var(--Tight-sizes-breakpoint-sm)\"\n },\n \"sizes.breakpoint-md\": {\n \"value\": \"850px\",\n \"variable\": \"var(--Tight-sizes-breakpoint-md)\"\n },\n \"sizes.breakpoint-lg\": {\n \"value\": \"1024px\",\n \"variable\": \"var(--Tight-sizes-breakpoint-lg)\"\n },\n \"sizes.breakpoint-xl\": {\n \"value\": \"1280px\",\n \"variable\": \"var(--Tight-sizes-breakpoint-xl)\"\n },\n \"sizes.breakpoint-1.5xl\": {\n \"value\": \"1400px\",\n \"variable\": \"var(--Tight-sizes-breakpoint-1.5xl)\"\n },\n \"sizes.breakpoint-2xl\": {\n \"value\": \"1536px\",\n \"variable\": \"var(--Tight-sizes-breakpoint-2xl)\"\n },\n \"colors.brand.primary.weak\": {\n \"value\": \"var(--Tight-colors-black400)\",\n \"variable\": \"var(--Tight-colors-brand-primary-weak)\"\n },\n \"colors.brand.primary\": {\n \"value\": \"var(--Tight-colors-black600)\",\n \"variable\": \"var(--Tight-colors-brand-primary)\"\n },\n \"colors.brand.primary.strong\": {\n \"value\": \"var(--Tight-colors-black700)\",\n \"variable\": \"var(--Tight-colors-brand-primary-strong)\"\n },\n \"colors.brand.secondary.weak\": {\n \"value\": \"var(--Tight-colors-white200)\",\n \"variable\": \"var(--Tight-colors-brand-secondary-weak)\"\n },\n \"colors.brand.secondary\": {\n \"value\": \"var(--Tight-colors-white600)\",\n \"variable\": \"var(--Tight-colors-brand-secondary)\"\n },\n \"colors.brand.secondary.strong\": {\n \"value\": \"var(--Tight-colors-black100)\",\n \"variable\": \"var(--Tight-colors-brand-secondary-strong)\"\n },\n \"colors.brand.action.weak\": {\n \"value\": \"var(--Tight-colors-blue300)\",\n \"variable\": \"var(--Tight-colors-brand-action-weak)\"\n },\n \"colors.brand.action\": {\n \"value\": \"var(--Tight-colors-blue400)\",\n \"variable\": \"var(--Tight-colors-brand-action)\"\n },\n \"colors.brand.action.strong\": {\n \"value\": \"var(--Tight-colors-blue500)\",\n \"variable\": \"var(--Tight-colors-brand-action-strong)\"\n },\n \"colors.brand.action.stronger\": {\n \"value\": \"var(--Tight-colors-blue700)\",\n \"variable\": \"var(--Tight-colors-brand-action-stronger)\"\n },\n \"colors.brand.action.strongest\": {\n \"value\": \"var(--Tight-colors-blue900)\",\n \"variable\": \"var(--Tight-colors-brand-action-strongest)\"\n },\n \"colors.brand.success.weak\": {\n \"value\": \"var(--Tight-colors-green300)\",\n \"variable\": \"var(--Tight-colors-brand-success-weak)\"\n },\n \"colors.brand.success\": {\n \"value\": \"var(--Tight-colors-green400)\",\n \"variable\": \"var(--Tight-colors-brand-success)\"\n },\n \"colors.brand.success.strong\": {\n \"value\": \"var(--Tight-colors-green500)\",\n \"variable\": \"var(--Tight-colors-brand-success-strong)\"\n },\n \"colors.brand.warning.weak\": {\n \"value\": \"var(--Tight-colors-yellow300)\",\n \"variable\": \"var(--Tight-colors-brand-warning-weak)\"\n },\n \"colors.brand.warning\": {\n \"value\": \"var(--Tight-colors-yellow400)\",\n \"variable\": \"var(--Tight-colors-brand-warning)\"\n },\n \"colors.brand.warning.strong\": {\n \"value\": \"var(--Tight-colors-yellow500)\",\n \"variable\": \"var(--Tight-colors-brand-warning-strong)\"\n },\n \"colors.brand.danger.weak\": {\n \"value\": \"var(--Tight-colors-red300)\",\n \"variable\": \"var(--Tight-colors-brand-danger-weak)\"\n },\n \"colors.brand.danger\": {\n \"value\": \"var(--Tight-colors-red400)\",\n \"variable\": \"var(--Tight-colors-brand-danger)\"\n },\n \"colors.brand.danger.strong\": {\n \"value\": \"var(--Tight-colors-red500)\",\n \"variable\": \"var(--Tight-colors-brand-danger-strong)\"\n },\n \"colors.surface.background\": {\n \"value\": \"var(--Tight-colors-white200)\",\n \"variable\": \"var(--Tight-colors-surface-background)\"\n },\n \"colors.surface.background.hover\": {\n \"value\": \"var(--Tight-colors-white300)\",\n \"variable\": \"var(--Tight-colors-surface-background-hover)\"\n },\n \"colors.surface.foreground\": {\n \"value\": \"var(--Tight-colors-white100)\",\n \"variable\": \"var(--Tight-colors-surface-foreground)\"\n },\n \"colors.surface.foreground.hover\": {\n \"value\": \"var(--Tight-colors-white200)\",\n \"variable\": \"var(--Tight-colors-surface-foreground-hover)\"\n },\n \"colors.surface.foreground.disabled\": {\n \"value\": \"var(--Tight-colors-white600)\",\n \"variable\": \"var(--Tight-colors-surface-foreground-disabled)\"\n },\n \"colors.surface.elevated\": {\n \"value\": \"var(--Tight-colors-white300)\",\n \"variable\": \"var(--Tight-colors-surface-elevated)\"\n },\n \"colors.surface.elevated.hover\": {\n \"value\": \"var(--Tight-colors-white600)\",\n \"variable\": \"var(--Tight-colors-surface-elevated-hover)\"\n },\n \"colors.surface.intent.primary\": {\n \"value\": \"var(--Tight-colors-brand-primary-weak)\",\n \"variable\": \"var(--Tight-colors-surface-intent-primary)\"\n },\n \"colors.surface.intent.primary.hover\": {\n \"value\": \"var(--Tight-colors-brand-primary)\",\n \"variable\": \"var(--Tight-colors-surface-intent-primary-hover)\"\n },\n \"colors.surface.intent.primary.active\": {\n \"value\": \"var(--Tight-colors-brand-primary-strong)\",\n \"variable\": \"var(--Tight-colors-surface-intent-primary-active)\"\n },\n \"colors.surface.intent.primary.disabled\": {\n \"value\": \"var(--Tight-colors-surface-foreground-disabled)\",\n \"variable\": \"var(--Tight-colors-surface-intent-primary-disabled)\"\n },\n \"colors.surface.intent.secondary\": {\n \"value\": \"var(--Tight-colors-brand-secondary-weak)\",\n \"variable\": \"var(--Tight-colors-surface-intent-secondary)\"\n },\n \"colors.surface.intent.secondary.hover\": {\n \"value\": \"var(--Tight-colors-brand-secondary)\",\n \"variable\": \"var(--Tight-colors-surface-intent-secondary-hover)\"\n },\n \"colors.surface.intent.secondary.active\": {\n \"value\": \"var(--Tight-colors-brand-secondary-strong)\",\n \"variable\": \"var(--Tight-colors-surface-intent-secondary-active)\"\n },\n \"colors.surface.intent.secondary.disabled\": {\n \"value\": \"var(--Tight-colors-surface-foreground-disabled)\",\n \"variable\": \"var(--Tight-colors-surface-intent-secondary-disabled)\"\n },\n \"colors.surface.intent.action\": {\n \"value\": \"var(--Tight-colors-brand-action-weak)\",\n \"variable\": \"var(--Tight-colors-surface-intent-action)\"\n },\n \"colors.surface.intent.action.hover\": {\n \"value\": \"var(--Tight-colors-brand-action)\",\n \"variable\": \"var(--Tight-colors-surface-intent-action-hover)\"\n },\n \"colors.surface.intent.action.active\": {\n \"value\": \"var(--Tight-colors-brand-action-strong)\",\n \"variable\": \"var(--Tight-colors-surface-intent-action-active)\"\n },\n \"colors.surface.intent.action.disabled\": {\n \"value\": \"var(--Tight-colors-surface-foreground-disabled)\",\n \"variable\": \"var(--Tight-colors-surface-intent-action-disabled)\"\n },\n \"colors.surface.intent.action.discrete\": {\n \"value\": \"transparent\",\n \"variable\": \"var(--Tight-colors-surface-intent-action-discrete)\"\n },\n \"colors.surface.intent.action.discrete.hover\": {\n \"value\": \"var(--Tight-colors-brand-action-weak)\",\n \"variable\": \"var(--Tight-colors-surface-intent-action-discrete-hover)\"\n },\n \"colors.surface.intent.action.discrete.active\": {\n \"value\": \"var(--Tight-colors-brand-action)\",\n \"variable\": \"var(--Tight-colors-surface-intent-action-discrete-active)\"\n },\n \"colors.surface.intent.success\": {\n \"value\": \"var(--Tight-colors-brand-success-weak)\",\n \"variable\": \"var(--Tight-colors-surface-intent-success)\"\n },\n \"colors.surface.intent.success.hover\": {\n \"value\": \"var(--Tight-colors-brand-success)\",\n \"variable\": \"var(--Tight-colors-surface-intent-success-hover)\"\n },\n \"colors.surface.intent.success.active\": {\n \"value\": \"var(--Tight-colors-brand-success-strong)\",\n \"variable\": \"var(--Tight-colors-surface-intent-success-active)\"\n },\n \"colors.surface.intent.success.disabled\": {\n \"value\": \"var(--Tight-colors-surface-foreground-disabled)\",\n \"variable\": \"var(--Tight-colors-surface-intent-success-disabled)\"\n },\n \"colors.surface.intent.warning\": {\n \"value\": \"var(--Tight-colors-brand-warning-weak)\",\n \"variable\": \"var(--Tight-colors-surface-intent-warning)\"\n },\n \"colors.surface.intent.warning.hover\": {\n \"value\": \"var(--Tight-colors-brand-warning)\",\n \"variable\": \"var(--Tight-colors-surface-intent-warning-hover)\"\n },\n \"colors.surface.intent.warning.active\": {\n \"value\": \"var(--Tight-colors-brand-warning-strong)\",\n \"variable\": \"var(--Tight-colors-surface-intent-warning-active)\"\n },\n \"colors.surface.intent.warning.disabled\": {\n \"value\": \"var(--Tight-colors-surface-foreground-disabled)\",\n \"variable\": \"var(--Tight-colors-surface-intent-warning-disabled)\"\n },\n \"colors.surface.intent.danger\": {\n \"value\": \"var(--Tight-colors-brand-danger-weak)\",\n \"variable\": \"var(--Tight-colors-surface-intent-danger)\"\n },\n \"colors.surface.intent.danger.hover\": {\n \"value\": \"var(--Tight-colors-brand-danger)\",\n \"variable\": \"var(--Tight-colors-surface-intent-danger-hover)\"\n },\n \"colors.surface.intent.danger.active\": {\n \"value\": \"var(--Tight-colors-brand-danger-strong)\",\n \"variable\": \"var(--Tight-colors-surface-intent-danger-active)\"\n },\n \"colors.surface.intent.danger.disabled\": {\n \"value\": \"var(--Tight-colors-surface-foreground-disabled)\",\n \"variable\": \"var(--Tight-colors-surface-intent-danger-disabled)\"\n },\n \"colors.typography.base\": {\n \"value\": \"var(--Tight-colors-black700)\",\n \"variable\": \"var(--Tight-colors-typography-base)\"\n },\n \"colors.typography.base.weak\": {\n \"value\": \"var(--Tight-colors-black400)\",\n \"variable\": \"var(--Tight-colors-typography-base-weak)\"\n },\n \"colors.typography.contrast\": {\n \"value\": \"var(--Tight-colors-white100)\",\n \"variable\": \"var(--Tight-colors-typography-contrast)\"\n },\n \"colors.typography.contrast.weak\": {\n \"value\": \"var(--Tight-colors-black100)\",\n \"variable\": \"var(--Tight-colors-typography-contrast-weak)\"\n },\n \"colors.typography.intent.primary\": {\n \"value\": \"var(--Tight-colors-white100)\",\n \"variable\": \"var(--Tight-colors-typography-intent-primary)\"\n },\n \"colors.typography.intent.primary.hover\": {\n \"value\": \"var(--Tight-colors-white100)\",\n \"variable\": \"var(--Tight-colors-typography-intent-primary-hover)\"\n },\n \"colors.typography.intent.primary.active\": {\n \"value\": \"var(--Tight-colors-white100)\",\n \"variable\": \"var(--Tight-colors-typography-intent-primary-active)\"\n },\n \"colors.typography.intent.secondary\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-intent-secondary)\"\n },\n \"colors.typography.intent.secondary.hover\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-intent-secondary-hover)\"\n },\n \"colors.typography.intent.secondary.active\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-intent-secondary-active)\"\n },\n \"colors.typography.intent.action\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-intent-action)\"\n },\n \"colors.typography.intent.action.hover\": {\n \"value\": \"var(--Tight-colors-brand-action)\",\n \"variable\": \"var(--Tight-colors-typography-intent-action-hover)\"\n },\n \"colors.typography.intent.action.active\": {\n \"value\": \"var(--Tight-colors-brand-action-strong)\",\n \"variable\": \"var(--Tight-colors-typography-intent-action-active)\"\n },\n \"colors.typography.intent.success\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-intent-success)\"\n },\n \"colors.typography.intent.success.hover\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-intent-success-hover)\"\n },\n \"colors.typography.intent.success.active\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-intent-success-active)\"\n },\n \"colors.typography.intent.warning\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-intent-warning)\"\n },\n \"colors.typography.intent.warning.hover\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-intent-warning-hover)\"\n },\n \"colors.typography.intent.warning.active\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-intent-warning-active)\"\n },\n \"colors.typography.intent.danger\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-intent-danger)\"\n },\n \"colors.typography.intent.danger.hover\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-intent-danger-hover)\"\n },\n \"colors.typography.intent.danger.active\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-intent-danger-active)\"\n },\n \"colors.typography.accent.success\": {\n \"value\": \"var(--Tight-colors-brand-success-strong)\",\n \"variable\": \"var(--Tight-colors-typography-accent-success)\"\n },\n \"colors.typography.accent.warning\": {\n \"value\": \"var(--Tight-colors-brand-warning-strong)\",\n \"variable\": \"var(--Tight-colors-typography-accent-warning)\"\n },\n \"colors.typography.accent.danger\": {\n \"value\": \"var(--Tight-colors-brand-danger-strong)\",\n \"variable\": \"var(--Tight-colors-typography-accent-danger)\"\n },\n \"colors.typography.body\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-body)\"\n },\n \"colors.typography.label\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-label)\"\n },\n \"colors.typography.label.sub\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-label-sub)\"\n },\n \"colors.typography.label.strong\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-label-strong)\"\n },\n \"colors.typography.label.strongSub\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-label-strongSub)\"\n },\n \"colors.typography.heading\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-heading)\"\n },\n \"colors.typography.metric.sm\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-metric-sm)\"\n },\n \"colors.typography.metric.md\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-metric-md)\"\n },\n \"colors.typography.metric.lg\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-metric-lg)\"\n },\n \"colors.typography.metric.xl\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-typography-metric-xl)\"\n },\n \"colors.icon.base\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-icon-base)\"\n },\n \"colors.icon.base.weak\": {\n \"value\": \"var(--Tight-colors-typography-base-weak)\",\n \"variable\": \"var(--Tight-colors-icon-base-weak)\"\n },\n \"colors.icon.contrast\": {\n \"value\": \"var(--Tight-colors-typography-contrast)\",\n \"variable\": \"var(--Tight-colors-icon-contrast)\"\n },\n \"colors.icon.contrast.weak\": {\n \"value\": \"var(--Tight-colors-typography-contrast-weak)\",\n \"variable\": \"var(--Tight-colors-icon-contrast-weak)\"\n },\n \"colors.icon.intent.primary\": {\n \"value\": \"var(--Tight-colors-typography-intent-primary)\",\n \"variable\": \"var(--Tight-colors-icon-intent-primary)\"\n },\n \"colors.icon.intent.primary.hover\": {\n \"value\": \"var(--Tight-colors-typography-intent-primary-hover)\",\n \"variable\": \"var(--Tight-colors-icon-intent-primary-hover)\"\n },\n \"colors.icon.intent.primary.active\": {\n \"value\": \"var(--Tight-colors-typography-intent-primary-active)\",\n \"variable\": \"var(--Tight-colors-icon-intent-primary-active)\"\n },\n \"colors.icon.intent.secondary\": {\n \"value\": \"var(--Tight-colors-typography-intent-secondary)\",\n \"variable\": \"var(--Tight-colors-icon-intent-secondary)\"\n },\n \"colors.icon.intent.secondary.hover\": {\n \"value\": \"var(--Tight-colors-typography-intent-secondary-hover)\",\n \"variable\": \"var(--Tight-colors-icon-intent-secondary-hover)\"\n },\n \"colors.icon.intent.secondary.active\": {\n \"value\": \"var(--Tight-colors-typography-intent-secondary-active)\",\n \"variable\": \"var(--Tight-colors-icon-intent-secondary-active)\"\n },\n \"colors.icon.intent.action\": {\n \"value\": \"var(--Tight-colors-typography-intent-action)\",\n \"variable\": \"var(--Tight-colors-icon-intent-action)\"\n },\n \"colors.icon.intent.action.hover\": {\n \"value\": \"var(--Tight-colors-typography-intent-action-hover)\",\n \"variable\": \"var(--Tight-colors-icon-intent-action-hover)\"\n },\n \"colors.icon.intent.action.active\": {\n \"value\": \"var(--Tight-colors-typography-intent-action-active)\",\n \"variable\": \"var(--Tight-colors-icon-intent-action-active)\"\n },\n \"colors.icon.intent.success\": {\n \"value\": \"var(--Tight-colors-typography-intent-success)\",\n \"variable\": \"var(--Tight-colors-icon-intent-success)\"\n },\n \"colors.icon.intent.success.hover\": {\n \"value\": \"var(--Tight-colors-typography-intent-success-hover)\",\n \"variable\": \"var(--Tight-colors-icon-intent-success-hover)\"\n },\n \"colors.icon.intent.success.active\": {\n \"value\": \"var(--Tight-colors-typography-intent-success-active)\",\n \"variable\": \"var(--Tight-colors-icon-intent-success-active)\"\n },\n \"colors.icon.intent.warning\": {\n \"value\": \"var(--Tight-colors-typography-intent-warning)\",\n \"variable\": \"var(--Tight-colors-icon-intent-warning)\"\n },\n \"colors.icon.intent.warning.hover\": {\n \"value\": \"var(--Tight-colors-typography-intent-warning-hover)\",\n \"variable\": \"var(--Tight-colors-icon-intent-warning-hover)\"\n },\n \"colors.icon.intent.warning.active\": {\n \"value\": \"var(--Tight-colors-typography-intent-warning-active)\",\n \"variable\": \"var(--Tight-colors-icon-intent-warning-active)\"\n },\n \"colors.icon.intent.danger\": {\n \"value\": \"var(--Tight-colors-typography-intent-danger)\",\n \"variable\": \"var(--Tight-colors-icon-intent-danger)\"\n },\n \"colors.icon.intent.danger.hover\": {\n \"value\": \"var(--Tight-colors-typography-intent-danger-hover)\",\n \"variable\": \"var(--Tight-colors-icon-intent-danger-hover)\"\n },\n \"colors.icon.intent.danger.active\": {\n \"value\": \"var(--Tight-colors-typography-intent-danger-active)\",\n \"variable\": \"var(--Tight-colors-icon-intent-danger-active)\"\n },\n \"colors.icon.accent.success\": {\n \"value\": \"var(--Tight-colors-typography-accent-success)\",\n \"variable\": \"var(--Tight-colors-icon-accent-success)\"\n },\n \"colors.icon.accent.warning\": {\n \"value\": \"var(--Tight-colors-typography-accent-warning)\",\n \"variable\": \"var(--Tight-colors-icon-accent-warning)\"\n },\n \"colors.icon.accent.danger\": {\n \"value\": \"var(--Tight-colors-typography-accent-danger)\",\n \"variable\": \"var(--Tight-colors-icon-accent-danger)\"\n },\n \"colors.border.layout.weak\": {\n \"value\": \"var(--Tight-colors-white300)\",\n \"variable\": \"var(--Tight-colors-border-layout-weak)\"\n },\n \"colors.border.layout\": {\n \"value\": \"var(--Tight-colors-black100)\",\n \"variable\": \"var(--Tight-colors-border-layout)\"\n },\n \"colors.border.layout.strong\": {\n \"value\": \"var(--Tight-colors-black600)\",\n \"variable\": \"var(--Tight-colors-border-layout-strong)\"\n },\n \"colors.border.intent.primary.hover\": {\n \"value\": \"var(--Tight-colors-brand-primary-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-primary-hover)\"\n },\n \"colors.border.intent.primary\": {\n \"value\": \"var(--Tight-colors-brand-primary-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-primary)\"\n },\n \"colors.border.intent.primary.active\": {\n \"value\": \"var(--Tight-colors-brand-primary-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-primary-active)\"\n },\n \"colors.border.intent.primary.disabled\": {\n \"value\": \"var(--Tight-colors-border-layout)\",\n \"variable\": \"var(--Tight-colors-border-intent-primary-disabled)\"\n },\n \"colors.border.intent.secondary.hover\": {\n \"value\": \"var(--Tight-colors-brand-secondary-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-secondary-hover)\"\n },\n \"colors.border.intent.secondary\": {\n \"value\": \"var(--Tight-colors-brand-secondary-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-secondary)\"\n },\n \"colors.border.intent.secondary.active\": {\n \"value\": \"var(--Tight-colors-brand-secondary-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-secondary-active)\"\n },\n \"colors.border.intent.secondary.disabled\": {\n \"value\": \"var(--Tight-colors-border-layout)\",\n \"variable\": \"var(--Tight-colors-border-intent-secondary-disabled)\"\n },\n \"colors.border.intent.danger.hover\": {\n \"value\": \"var(--Tight-colors-brand-danger-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-danger-hover)\"\n },\n \"colors.border.intent.danger\": {\n \"value\": \"var(--Tight-colors-brand-danger-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-danger)\"\n },\n \"colors.border.intent.danger.active\": {\n \"value\": \"var(--Tight-colors-brand-danger-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-danger-active)\"\n },\n \"colors.border.intent.danger.disabled\": {\n \"value\": \"var(--Tight-colors-border-layout)\",\n \"variable\": \"var(--Tight-colors-border-intent-danger-disabled)\"\n },\n \"colors.border.intent.warning.hover\": {\n \"value\": \"var(--Tight-colors-brand-warning-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-warning-hover)\"\n },\n \"colors.border.intent.warning\": {\n \"value\": \"var(--Tight-colors-brand-warning-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-warning)\"\n },\n \"colors.border.intent.warning.active\": {\n \"value\": \"var(--Tight-colors-brand-warning-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-warning-active)\"\n },\n \"colors.border.intent.warning.disabled\": {\n \"value\": \"var(--Tight-colors-border-layout)\",\n \"variable\": \"var(--Tight-colors-border-intent-warning-disabled)\"\n },\n \"colors.border.intent.success.hover\": {\n \"value\": \"var(--Tight-colors-brand-success-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-success-hover)\"\n },\n \"colors.border.intent.success\": {\n \"value\": \"var(--Tight-colors-brand-success-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-success)\"\n },\n \"colors.border.intent.success.active\": {\n \"value\": \"var(--Tight-colors-brand-success-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-success-active)\"\n },\n \"colors.border.intent.success.disabled\": {\n \"value\": \"var(--Tight-colors-border-layout)\",\n \"variable\": \"var(--Tight-colors-border-intent-success-disabled)\"\n },\n \"colors.border.intent.action.hover\": {\n \"value\": \"var(--Tight-colors-brand-action-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-action-hover)\"\n },\n \"colors.border.intent.action\": {\n \"value\": \"var(--Tight-colors-brand-action-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-action)\"\n },\n \"colors.border.intent.action.active\": {\n \"value\": \"var(--Tight-colors-brand-action-strong)\",\n \"variable\": \"var(--Tight-colors-border-intent-action-active)\"\n },\n \"colors.border.intent.action.disabled\": {\n \"value\": \"var(--Tight-colors-border-layout)\",\n \"variable\": \"var(--Tight-colors-border-intent-action-disabled)\"\n },\n \"colors.money\": {\n \"value\": \"var(--Tight-colors-typography-base)\",\n \"variable\": \"var(--Tight-colors-money)\"\n },\n \"colors.money.positive\": {\n \"value\": \"var(--Tight-colors-green700)\",\n \"variable\": \"var(--Tight-colors-money-positive)\"\n },\n \"colors.money.positive.weak\": {\n \"value\": \"var(--Tight-colors-green500)\",\n \"variable\": \"var(--Tight-colors-money-positive-weak)\"\n },\n \"colors.money.negative\": {\n \"value\": \"var(--Tight-colors-red700)\",\n \"variable\": \"var(--Tight-colors-money-negative)\"\n },\n \"colors.money.negative.weak\": {\n \"value\": \"var(--Tight-colors-red300)\",\n \"variable\": \"var(--Tight-colors-money-negative-weak)\"\n },\n \"colors.overlay\": {\n \"value\": \"rgba(0, 0, 0, 0.5)\",\n \"variable\": \"var(--Tight-colors-overlay)\"\n },\n \"colors.transparent\": {\n \"value\": \"transparent\",\n \"variable\": \"var(--Tight-colors-transparent)\"\n },\n \"colors.none\": {\n \"value\": \"none\",\n \"variable\": \"var(--Tight-colors-none)\"\n },\n \"colors.inherit\": {\n \"value\": \"inherit\",\n \"variable\": \"var(--Tight-colors-inherit)\"\n },\n \"colors.currentColor\": {\n \"value\": \"currentColor\",\n \"variable\": \"var(--Tight-colors-currentColor)\"\n },\n \"fonts.body\": {\n \"value\": \"var(--Tight-fonts-base)\",\n \"variable\": \"var(--Tight-fonts-body)\"\n },\n \"fonts.label\": {\n \"value\": \"var(--Tight-fonts-base)\",\n \"variable\": \"var(--Tight-fonts-label)\"\n },\n \"fonts.heading\": {\n \"value\": \"var(--Tight-fonts-base)\",\n \"variable\": \"var(--Tight-fonts-heading)\"\n },\n \"fonts.metric\": {\n \"value\": \"var(--Tight-fonts-base)\",\n \"variable\": \"var(--Tight-fonts-metric)\"\n },\n \"fontWeights.global\": {\n \"value\": \"var(--Tight-fontWeights-sm)\",\n \"variable\": \"var(--Tight-fontWeights-global)\"\n },\n \"fontWeights.body\": {\n \"value\": \"var(--Tight-fontWeights-md)\",\n \"variable\": \"var(--Tight-fontWeights-body)\"\n },\n \"fontWeights.label\": {\n \"value\": \"var(--Tight-fontWeights-sm)\",\n \"variable\": \"var(--Tight-fontWeights-label)\"\n },\n \"fontWeights.label.strong\": {\n \"value\": \"var(--Tight-fontWeights-md)\",\n \"variable\": \"var(--Tight-fontWeights-label-strong)\"\n },\n \"fontWeights.label.sub\": {\n \"value\": \"var(--Tight-fontWeights-sm)\",\n \"variable\": \"var(--Tight-fontWeights-label-sub)\"\n },\n \"fontWeights.label.strongSub\": {\n \"value\": \"var(--Tight-fontWeights-md)\",\n \"variable\": \"var(--Tight-fontWeights-label-strongSub)\"\n },\n \"fontWeights.heading\": {\n \"value\": \"var(--Tight-fontWeights-md)\",\n \"variable\": \"var(--Tight-fontWeights-heading)\"\n },\n \"fontWeights.title\": {\n \"value\": \"var(--Tight-fontWeights-sm)\",\n \"variable\": \"var(--Tight-fontWeights-title)\"\n },\n \"fontWeights.metric.sm\": {\n \"value\": \"var(--Tight-fontWeights-sm)\",\n \"variable\": \"var(--Tight-fontWeights-metric-sm)\"\n },\n \"fontWeights.metric.md\": {\n \"value\": \"var(--Tight-fontWeights-sm)\",\n \"variable\": \"var(--Tight-fontWeights-metric-md)\"\n },\n \"fontWeights.metric.lg\": {\n \"value\": \"var(--Tight-fontWeights-sm)\",\n \"variable\": \"var(--Tight-fontWeights-metric-lg)\"\n },\n \"fontWeights.metric.xl\": {\n \"value\": \"var(--Tight-fontWeights-sm)\",\n \"variable\": \"var(--Tight-fontWeights-metric-xl)\"\n },\n \"fontSizes.title\": {\n \"value\": \"var(--Tight-fontSizes-xl)\",\n \"variable\": \"var(--Tight-fontSizes-title)\"\n },\n \"fontSizes.body\": {\n \"value\": \"var(--Tight-fontSizes-md)\",\n \"variable\": \"var(--Tight-fontSizes-body)\"\n },\n \"fontSizes.label\": {\n \"value\": \"var(--Tight-fontSizes-md)\",\n \"variable\": \"var(--Tight-fontSizes-label)\"\n },\n \"fontSizes.label.strong\": {\n \"value\": \"var(--Tight-fontSizes-md)\",\n \"variable\": \"var(--Tight-fontSizes-label-strong)\"\n },\n \"fontSizes.label.sub\": {\n \"value\": \"var(--Tight-fontSizes-sm)\",\n \"variable\": \"var(--Tight-fontSizes-label-sub)\"\n },\n \"fontSizes.label.strongSub\": {\n \"value\": \"var(--Tight-fontSizes-sm)\",\n \"variable\": \"var(--Tight-fontSizes-label-strongSub)\"\n },\n \"fontSizes.heading\": {\n \"value\": \"var(--Tight-fontSizes-lg)\",\n \"variable\": \"var(--Tight-fontSizes-heading)\"\n },\n \"fontSizes.metric.sm\": {\n \"value\": \"var(--Tight-fontSizes-sm)\",\n \"variable\": \"var(--Tight-fontSizes-metric-sm)\"\n },\n \"fontSizes.metric.md\": {\n \"value\": \"var(--Tight-fontSizes-md)\",\n \"variable\": \"var(--Tight-fontSizes-metric-md)\"\n },\n \"fontSizes.metric.lg\": {\n \"value\": \"var(--Tight-fontSizes-lg)\",\n \"variable\": \"var(--Tight-fontSizes-metric-lg)\"\n },\n \"fontSizes.metric.xl\": {\n \"value\": \"var(--Tight-fontSizes-xl)\",\n \"variable\": \"var(--Tight-fontSizes-metric-xl)\"\n },\n \"colors.colorPalette\": {\n \"value\": \"var(--Tight-colors-colorPalette)\",\n \"variable\": \"var(--Tight-colors-colorPalette)\"\n },\n \"colors.colorPalette.primary.weak\": {\n \"value\": \"var(--Tight-colors-colorPalette-primary-weak)\",\n \"variable\": \"var(--Tight-colors-colorPalette-primary-weak)\"\n },\n \"colors.colorPalette.weak\": {\n \"value\": \"var(--Tight-colors-colorPalette-weak)\",\n \"variable\": \"var(--Tight-colors-colorPalette-weak)\"\n },\n \"colors.colorPalette.primary\": {\n \"value\": \"var(--Tight-colors-colorPalette-primary)\",\n \"variable\": \"var(--Tight-colors-colorPalette-primary)\"\n },\n \"colors.colorPalette.primary.strong\": {\n \"value\": \"var(--Tight-colors-colorPalette-primary-strong)\",\n \"variable\": \"var(--Tight-colors-colorPalette-primary-strong)\"\n },\n \"colors.colorPalette.strong\": {\n \"value\": \"var(--Tight-colors-colorPalette-strong)\",\n \"variable\": \"var(--Tight-colors-colorPalette-strong)\"\n },\n \"colors.colorPalette.secondary.weak\": {\n \"value\": \"var(--Tight-colors-colorPalette-secondary-weak)\",\n \"variable\": \"var(--Tight-colors-colorPalette-secondary-weak)\"\n },\n \"colors.colorPalette.secondary\": {\n \"value\": \"var(--Tight-colors-colorPalette-secondary)\",\n \"variable\": \"var(--Tight-colors-colorPalette-secondary)\"\n },\n \"colors.colorPalette.secondary.strong\": {\n \"value\": \"var(--Tight-colors-colorPalette-secondary-strong)\",\n \"variable\": \"var(--Tight-colors-colorPalette-secondary-strong)\"\n },\n \"colors.colorPalette.action.weak\": {\n \"value\": \"var(--Tight-colors-colorPalette-action-weak)\",\n \"variable\": \"var(--Tight-colors-colorPalette-action-weak)\"\n },\n \"colors.colorPalette.action\": {\n \"value\": \"var(--Tight-colors-colorPalette-action)\",\n \"variable\": \"var(--Tight-colors-colorPalette-action)\"\n },\n \"colors.colorPalette.action.strong\": {\n \"value\": \"var(--Tight-colors-colorPalette-action-strong)\",\n \"variable\": \"var(--Tight-colors-colorPalette-action-strong)\"\n },\n \"colors.colorPalette.action.stronger\": {\n \"value\": \"var(--Tight-colors-colorPalette-action-stronger)\",\n \"variable\": \"var(--Tight-colors-colorPalette-action-stronger)\"\n },\n \"colors.colorPalette.stronger\": {\n \"value\": \"var(--Tight-colors-colorPalette-stronger)\",\n \"variable\": \"var(--Tight-colors-colorPalette-stronger)\"\n },\n \"colors.colorPalette.action.strongest\": {\n \"value\": \"var(--Tight-colors-colorPalette-action-strongest)\",\n \"variable\": \"var(--Tight-colors-colorPalette-action-strongest)\"\n },\n \"colors.colorPalette.strongest\": {\n \"value\": \"var(--Tight-colors-colorPalette-strongest)\",\n \"variable\": \"var(--Tight-colors-colorPalette-strongest)\"\n },\n \"colors.colorPalette.success.weak\": {\n \"value\": \"var(--Tight-colors-colorPalette-success-weak)\",\n \"variable\": \"var(--Tight-colors-colorPalette-success-weak)\"\n },\n \"colors.colorPalette.success\": {\n \"value\": \"var(--Tight-colors-colorPalette-success)\",\n \"variable\": \"var(--Tight-colors-colorPalette-success)\"\n },\n \"colors.colorPalette.success.strong\": {\n \"value\": \"var(--Tight-colors-colorPalette-success-strong)\",\n \"variable\": \"var(--Tight-colors-colorPalette-success-strong)\"\n },\n \"colors.colorPalette.warning.weak\": {\n \"value\": \"var(--Tight-colors-colorPalette-warning-weak)\",\n \"variable\": \"var(--Tight-colors-colorPalette-warning-weak)\"\n },\n \"colors.colorPalette.warning\": {\n \"value\": \"var(--Tight-colors-colorPalette-warning)\",\n \"variable\": \"var(--Tight-colors-colorPalette-warning)\"\n },\n \"colors.colorPalette.warning.strong\": {\n \"value\": \"var(--Tight-colors-colorPalette-warning-strong)\",\n \"variable\": \"var(--Tight-colors-colorPalette-warning-strong)\"\n },\n \"colors.colorPalette.danger.weak\": {\n \"value\": \"var(--Tight-colors-colorPalette-danger-weak)\",\n \"variable\": \"var(--Tight-colors-colorPalette-danger-weak)\"\n },\n \"colors.colorPalette.danger\": {\n \"value\": \"var(--Tight-colors-colorPalette-danger)\",\n \"variable\": \"var(--Tight-colors-colorPalette-danger)\"\n },\n \"colors.colorPalette.danger.strong\": {\n \"value\": \"var(--Tight-colors-colorPalette-danger-strong)\",\n \"variable\": \"var(--Tight-colors-colorPalette-danger-strong)\"\n },\n \"colors.colorPalette.background\": {\n \"value\": \"var(--Tight-colors-colorPalette-background)\",\n \"variable\": \"var(--Tight-colors-colorPalette-background)\"\n },\n \"colors.colorPalette.background.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-background-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-background-hover)\"\n },\n \"colors.colorPalette.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-hover)\"\n },\n \"colors.colorPalette.foreground\": {\n \"value\": \"var(--Tight-colors-colorPalette-foreground)\",\n \"variable\": \"var(--Tight-colors-colorPalette-foreground)\"\n },\n \"colors.colorPalette.foreground.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-foreground-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-foreground-hover)\"\n },\n \"colors.colorPalette.foreground.disabled\": {\n \"value\": \"var(--Tight-colors-colorPalette-foreground-disabled)\",\n \"variable\": \"var(--Tight-colors-colorPalette-foreground-disabled)\"\n },\n \"colors.colorPalette.disabled\": {\n \"value\": \"var(--Tight-colors-colorPalette-disabled)\",\n \"variable\": \"var(--Tight-colors-colorPalette-disabled)\"\n },\n \"colors.colorPalette.elevated\": {\n \"value\": \"var(--Tight-colors-colorPalette-elevated)\",\n \"variable\": \"var(--Tight-colors-colorPalette-elevated)\"\n },\n \"colors.colorPalette.elevated.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-elevated-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-elevated-hover)\"\n },\n \"colors.colorPalette.intent.primary\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-primary)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-primary)\"\n },\n \"colors.colorPalette.intent.primary.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-primary-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-primary-hover)\"\n },\n \"colors.colorPalette.primary.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-primary-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-primary-hover)\"\n },\n \"colors.colorPalette.intent.primary.active\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-primary-active)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-primary-active)\"\n },\n \"colors.colorPalette.primary.active\": {\n \"value\": \"var(--Tight-colors-colorPalette-primary-active)\",\n \"variable\": \"var(--Tight-colors-colorPalette-primary-active)\"\n },\n \"colors.colorPalette.active\": {\n \"value\": \"var(--Tight-colors-colorPalette-active)\",\n \"variable\": \"var(--Tight-colors-colorPalette-active)\"\n },\n \"colors.colorPalette.intent.primary.disabled\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-primary-disabled)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-primary-disabled)\"\n },\n \"colors.colorPalette.primary.disabled\": {\n \"value\": \"var(--Tight-colors-colorPalette-primary-disabled)\",\n \"variable\": \"var(--Tight-colors-colorPalette-primary-disabled)\"\n },\n \"colors.colorPalette.intent.secondary\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-secondary)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-secondary)\"\n },\n \"colors.colorPalette.intent.secondary.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-secondary-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-secondary-hover)\"\n },\n \"colors.colorPalette.secondary.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-secondary-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-secondary-hover)\"\n },\n \"colors.colorPalette.intent.secondary.active\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-secondary-active)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-secondary-active)\"\n },\n \"colors.colorPalette.secondary.active\": {\n \"value\": \"var(--Tight-colors-colorPalette-secondary-active)\",\n \"variable\": \"var(--Tight-colors-colorPalette-secondary-active)\"\n },\n \"colors.colorPalette.intent.secondary.disabled\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-secondary-disabled)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-secondary-disabled)\"\n },\n \"colors.colorPalette.secondary.disabled\": {\n \"value\": \"var(--Tight-colors-colorPalette-secondary-disabled)\",\n \"variable\": \"var(--Tight-colors-colorPalette-secondary-disabled)\"\n },\n \"colors.colorPalette.intent.action\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-action)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-action)\"\n },\n \"colors.colorPalette.intent.action.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-action-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-action-hover)\"\n },\n \"colors.colorPalette.action.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-action-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-action-hover)\"\n },\n \"colors.colorPalette.intent.action.active\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-action-active)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-action-active)\"\n },\n \"colors.colorPalette.action.active\": {\n \"value\": \"var(--Tight-colors-colorPalette-action-active)\",\n \"variable\": \"var(--Tight-colors-colorPalette-action-active)\"\n },\n \"colors.colorPalette.intent.action.disabled\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-action-disabled)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-action-disabled)\"\n },\n \"colors.colorPalette.action.disabled\": {\n \"value\": \"var(--Tight-colors-colorPalette-action-disabled)\",\n \"variable\": \"var(--Tight-colors-colorPalette-action-disabled)\"\n },\n \"colors.colorPalette.intent.action.discrete\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-action-discrete)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-action-discrete)\"\n },\n \"colors.colorPalette.action.discrete\": {\n \"value\": \"var(--Tight-colors-colorPalette-action-discrete)\",\n \"variable\": \"var(--Tight-colors-colorPalette-action-discrete)\"\n },\n \"colors.colorPalette.discrete\": {\n \"value\": \"var(--Tight-colors-colorPalette-discrete)\",\n \"variable\": \"var(--Tight-colors-colorPalette-discrete)\"\n },\n \"colors.colorPalette.intent.action.discrete.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-action-discrete-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-action-discrete-hover)\"\n },\n \"colors.colorPalette.action.discrete.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-action-discrete-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-action-discrete-hover)\"\n },\n \"colors.colorPalette.discrete.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-discrete-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-discrete-hover)\"\n },\n \"colors.colorPalette.intent.action.discrete.active\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-action-discrete-active)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-action-discrete-active)\"\n },\n \"colors.colorPalette.action.discrete.active\": {\n \"value\": \"var(--Tight-colors-colorPalette-action-discrete-active)\",\n \"variable\": \"var(--Tight-colors-colorPalette-action-discrete-active)\"\n },\n \"colors.colorPalette.discrete.active\": {\n \"value\": \"var(--Tight-colors-colorPalette-discrete-active)\",\n \"variable\": \"var(--Tight-colors-colorPalette-discrete-active)\"\n },\n \"colors.colorPalette.intent.success\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-success)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-success)\"\n },\n \"colors.colorPalette.intent.success.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-success-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-success-hover)\"\n },\n \"colors.colorPalette.success.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-success-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-success-hover)\"\n },\n \"colors.colorPalette.intent.success.active\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-success-active)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-success-active)\"\n },\n \"colors.colorPalette.success.active\": {\n \"value\": \"var(--Tight-colors-colorPalette-success-active)\",\n \"variable\": \"var(--Tight-colors-colorPalette-success-active)\"\n },\n \"colors.colorPalette.intent.success.disabled\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-success-disabled)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-success-disabled)\"\n },\n \"colors.colorPalette.success.disabled\": {\n \"value\": \"var(--Tight-colors-colorPalette-success-disabled)\",\n \"variable\": \"var(--Tight-colors-colorPalette-success-disabled)\"\n },\n \"colors.colorPalette.intent.warning\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-warning)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-warning)\"\n },\n \"colors.colorPalette.intent.warning.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-warning-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-warning-hover)\"\n },\n \"colors.colorPalette.warning.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-warning-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-warning-hover)\"\n },\n \"colors.colorPalette.intent.warning.active\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-warning-active)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-warning-active)\"\n },\n \"colors.colorPalette.warning.active\": {\n \"value\": \"var(--Tight-colors-colorPalette-warning-active)\",\n \"variable\": \"var(--Tight-colors-colorPalette-warning-active)\"\n },\n \"colors.colorPalette.intent.warning.disabled\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-warning-disabled)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-warning-disabled)\"\n },\n \"colors.colorPalette.warning.disabled\": {\n \"value\": \"var(--Tight-colors-colorPalette-warning-disabled)\",\n \"variable\": \"var(--Tight-colors-colorPalette-warning-disabled)\"\n },\n \"colors.colorPalette.intent.danger\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-danger)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-danger)\"\n },\n \"colors.colorPalette.intent.danger.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-danger-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-danger-hover)\"\n },\n \"colors.colorPalette.danger.hover\": {\n \"value\": \"var(--Tight-colors-colorPalette-danger-hover)\",\n \"variable\": \"var(--Tight-colors-colorPalette-danger-hover)\"\n },\n \"colors.colorPalette.intent.danger.active\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-danger-active)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-danger-active)\"\n },\n \"colors.colorPalette.danger.active\": {\n \"value\": \"var(--Tight-colors-colorPalette-danger-active)\",\n \"variable\": \"var(--Tight-colors-colorPalette-danger-active)\"\n },\n \"colors.colorPalette.intent.danger.disabled\": {\n \"value\": \"var(--Tight-colors-colorPalette-intent-danger-disabled)\",\n \"variable\": \"var(--Tight-colors-colorPalette-intent-danger-disabled)\"\n },\n \"colors.colorPalette.danger.disabled\": {\n \"value\": \"var(--Tight-colors-colorPalette-danger-disabled)\",\n \"variable\": \"var(--Tight-colors-colorPalette-danger-disabled)\"\n },\n \"colors.colorPalette.base\": {\n \"value\": \"var(--Tight-colors-colorPalette-base)\",\n \"variable\": \"var(--Tight-colors-colorPalette-base)\"\n },\n \"colors.colorPalette.base.weak\": {\n \"value\": \"var(--Tight-colors-colorPalette-base-weak)\",\n \"variable\": \"var(--Tight-colors-colorPalette-base-weak)\"\n },\n \"colors.colorPalette.contrast\": {\n \"value\": \"var(--Tight-colors-colorPalette-contrast)\",\n \"variable\": \"var(--Tight-colors-colorPalette-contrast)\"\n },\n \"colors.colorPalette.contrast.weak\": {\n \"value\": \"var(--Tight-colors-colorPalette-contrast-weak)\",\n \"variable\": \"var(--Tight-colors-colorPalette-contrast-weak)\"\n },\n \"colors.colorPalette.accent.success\": {\n \"value\": \"var(--Tight-colors-colorPalette-accent-success)\",\n \"variable\": \"var(--Tight-colors-colorPalette-accent-success)\"\n },\n \"colors.colorPalette.accent.warning\": {\n \"value\": \"var(--Tight-colors-colorPalette-accent-warning)\",\n \"variable\": \"var(--Tight-colors-colorPalette-accent-warning)\"\n },\n \"colors.colorPalette.accent.danger\": {\n \"value\": \"var(--Tight-colors-colorPalette-accent-danger)\",\n \"variable\": \"var(--Tight-colors-colorPalette-accent-danger)\"\n },\n \"colors.colorPalette.body\": {\n \"value\": \"var(--Tight-colors-colorPalette-body)\",\n \"variable\": \"var(--Tight-colors-colorPalette-body)\"\n },\n \"colors.colorPalette.label\": {\n \"value\": \"var(--Tight-colors-colorPalette-label)\",\n \"variable\": \"var(--Tight-colors-colorPalette-label)\"\n },\n \"colors.colorPalette.label.sub\": {\n \"value\": \"var(--Tight-colors-colorPalette-label-sub)\",\n \"variable\": \"var(--Tight-colors-colorPalette-label-sub)\"\n },\n \"colors.colorPalette.sub\": {\n \"value\": \"var(--Tight-colors-colorPalette-sub)\",\n \"variable\": \"var(--Tight-colors-colorPalette-sub)\"\n },\n \"colors.colorPalette.label.strong\": {\n \"value\": \"var(--Tight-colors-colorPalette-label-strong)\",\n \"variable\": \"var(--Tight-colors-colorPalette-label-strong)\"\n },\n \"colors.colorPalette.label.strongSub\": {\n \"value\": \"var(--Tight-colors-colorPalette-label-strongSub)\",\n \"variable\": \"var(--Tight-colors-colorPalette-label-strongSub)\"\n },\n \"colors.colorPalette.strongSub\": {\n \"value\": \"var(--Tight-colors-colorPalette-strongSub)\",\n \"variable\": \"var(--Tight-colors-colorPalette-strongSub)\"\n },\n \"colors.colorPalette.heading\": {\n \"value\": \"var(--Tight-colors-colorPalette-heading)\",\n \"variable\": \"var(--Tight-colors-colorPalette-heading)\"\n },\n \"colors.colorPalette.metric.sm\": {\n \"value\": \"var(--Tight-colors-colorPalette-metric-sm)\",\n \"variable\": \"var(--Tight-colors-colorPalette-metric-sm)\"\n },\n \"colors.colorPalette.sm\": {\n \"value\": \"var(--Tight-colors-colorPalette-sm)\",\n \"variable\": \"var(--Tight-colors-colorPalette-sm)\"\n },\n \"colors.colorPalette.metric.md\": {\n \"value\": \"var(--Tight-colors-colorPalette-metric-md)\",\n \"variable\": \"var(--Tight-colors-colorPalette-metric-md)\"\n },\n \"colors.colorPalette.md\": {\n \"value\": \"var(--Tight-colors-colorPalette-md)\",\n \"variable\": \"var(--Tight-colors-colorPalette-md)\"\n },\n \"colors.colorPalette.metric.lg\": {\n \"value\": \"var(--Tight-colors-colorPalette-metric-lg)\",\n \"variable\": \"var(--Tight-colors-colorPalette-metric-lg)\"\n },\n \"colors.colorPalette.lg\": {\n \"value\": \"var(--Tight-colors-colorPalette-lg)\",\n \"variable\": \"var(--Tight-colors-colorPalette-lg)\"\n },\n \"colors.colorPalette.metric.xl\": {\n \"value\": \"var(--Tight-colors-colorPalette-metric-xl)\",\n \"variable\": \"var(--Tight-colors-colorPalette-metric-xl)\"\n },\n \"colors.colorPalette.xl\": {\n \"value\": \"var(--Tight-colors-colorPalette-xl)\",\n \"variable\": \"var(--Tight-colors-colorPalette-xl)\"\n },\n \"colors.colorPalette.layout.weak\": {\n \"value\": \"var(--Tight-colors-colorPalette-layout-weak)\",\n \"variable\": \"var(--Tight-colors-colorPalette-layout-weak)\"\n },\n \"colors.colorPalette.layout\": {\n \"value\": \"var(--Tight-colors-colorPalette-layout)\",\n \"variable\": \"var(--Tight-colors-colorPalette-layout)\"\n },\n \"colors.colorPalette.layout.strong\": {\n \"value\": \"var(--Tight-colors-colorPalette-layout-strong)\",\n \"variable\": \"var(--Tight-colors-colorPalette-layout-strong)\"\n },\n \"colors.colorPalette.positive\": {\n \"value\": \"var(--Tight-colors-colorPalette-positive)\",\n \"variable\": \"var(--Tight-colors-colorPalette-positive)\"\n },\n \"colors.colorPalette.positive.weak\": {\n \"value\": \"var(--Tight-colors-colorPalette-positive-weak)\",\n \"variable\": \"var(--Tight-colors-colorPalette-positive-weak)\"\n },\n \"colors.colorPalette.negative\": {\n \"value\": \"var(--Tight-colors-colorPalette-negative)\",\n \"variable\": \"var(--Tight-colors-colorPalette-negative)\"\n },\n \"colors.colorPalette.negative.weak\": {\n \"value\": \"var(--Tight-colors-colorPalette-negative-weak)\",\n \"variable\": \"var(--Tight-colors-colorPalette-negative-weak)\"\n }\n}\n\nexport function token(path, fallback) {\n return tokens[path]?.value || fallback\n}\n\nfunction tokenVar(path, fallback) {\n return tokens[path]?.variable || fallback\n}\n\ntoken.var = tokenVar","import { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { SubLabel } from \"../typography/SubLabel.tsx\";\nimport { token } from \"../../../styled-system/tokens\";\nimport { ellipsisText } from \"../../style/text.ts\";\n\nconst bulletStylist = stylist(null, css({\n borderRadius: \"50%\",\n flexShrink: 0,\n}));\n\nconst bulletRowStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n gap: \"10px\",\n alignItems: \"center\",\n minWidth: 0,\n}));\n\nconst labelStylist = stylist(null, ellipsisText);\n\ntype BulletProps = {\n color?: string;\n diameter?: number;\n label?: string;\n};\n\nconst DEFAULT_COLOR = token.var(\"colors.surface.foreground.disabled\");\n\nfunction Bullet({ color = DEFAULT_COLOR, diameter = 17, label }: BulletProps) {\n const style = {\n backgroundColor: color,\n width: `${diameter}px`,\n height: `${diameter}px`,\n };\n\n return (\n <div {...bulletRowStylist} data-testid=\"bullet-row\">\n <div {...bulletStylist} style={style} data-testid=\"bullet\" />\n {label && <SubLabel stylists={[labelStylist]}>{label}</SubLabel>}\n </div>\n );\n}\n\nexport { Bullet };\n","import { LegendPayload } from \"recharts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { Bullet } from \"../../charts/Bullet.tsx\";\n\ntype LegendProps = {\n payload: readonly LegendPayload[] | undefined;\n};\n\nconst legendContainerStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: \"30px\",\n}));\n\nfunction Legend({ payload }: LegendProps) {\n if (payload === undefined) {\n return null;\n }\n\n return (\n <div {...legendContainerStylist}>\n {payload.map((item, index) => item.type !== \"none\" && (\n <Bullet key={index} color={item.color} label={item.value} diameter={17} />\n ))}\n </div>\n );\n}\n\nexport { Legend };\n","import { DataKeyMap, ExpandedPLSummary } from \"./useExpandedPLSummary.ts\";\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Legend as RechartsLegend,\n LegendPayload,\n Line,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip as RechartsTooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport { Tooltip } from \"./Tooltip.tsx\";\nimport { ComponentPropsWithoutRef, useState } from \"react\";\nimport { token } from \"../../../../styled-system/tokens\";\nimport { Legend } from \"./Legend.tsx\";\nimport { smartMoneySummary } from \"../../../utils/money/smartNumber.ts\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\nimport { AxisDomain } from \"recharts/types/util/types\";\n\ntype ChartProps = {\n data: ExpandedPLSummary | undefined;\n};\n\nconst barChartMarginStyles = {\n right: 20,\n left: 20,\n};\n\nconst legendOrder = [\"income\", \"profit\", \"expenses\", \"loss\"];\nconst legendSorter = (item: LegendPayload) => (\n legendOrder.findIndex(legendItem => legendItem === item.dataKey)\n);\n\nconst legendStyles = {\n paddingBottom: \"20px\",\n marginLeft: \"-20px\",\n};\n\nconst barProps: ComponentPropsWithoutRef<typeof Bar> = {\n stackId: \"stack\",\n isAnimationActive: false,\n};\n\nconst barChartStylist = stylist(ValidClassName[\"profit-loss-graph\"], css({\n \"& .recharts-surface\": {\n outline: \"none\",\n },\n}));\n\nconst LINE_COLOR = token.var(\"colors.money\");\nconst BORDER_COLOR = token.var(\"colors.border.layout\");\nconst REFERENCE_LINE_COLOR = token.var(\"colors.border.layout.strong\");\nconst AXIS_TICK = {\n fill: token.var(\"colors.typography.base\"),\n fontSize: token.var(\"fontSizes.metric.sm\"),\n};\nconst BAR_COLOR = {\n profit: token.var(\"colors.money.positive\"),\n income: token.var(\"colors.money.positive.weak\"),\n loss: token.var(\"colors.money.negative\"),\n expenses: token.var(\"colors.money.negative.weak\"),\n};\n\nconst noDataDomain = [0, 100];\nconst autoDomain: AxisDomain = [\"auto\", \"auto\"];\n\nfunction Chart({ data }: ChartProps) {\n const [animate, setAnimate] = useState(true);\n\n if (data === undefined) {\n return null;\n }\n\n const domain = data.hasAnyData ? autoDomain : noDataDomain;\n\n return (\n <ResponsiveContainer width=\"100%\" height=\"100%\" {...barChartStylist}>\n <BarChart\n data={data.months}\n stackOffset=\"sign\"\n accessibilityLayer\n barSize={35}\n margin={barChartMarginStyles}\n >\n <RechartsLegend\n verticalAlign=\"top\"\n itemSorter={legendSorter}\n wrapperStyle={legendStyles}\n content={({ payload }) => <Legend payload={payload} />}\n />\n\n <CartesianGrid\n strokeDasharray=\"0\"\n vertical={false}\n stroke={BORDER_COLOR}\n />\n\n <XAxis\n dataKey=\"month\"\n interval={0}\n tickLine={false}\n stroke={BORDER_COLOR}\n tick={AXIS_TICK}\n />\n\n <YAxis\n type=\"number\"\n tickCount={7}\n domain={domain}\n axisLine={false}\n tickLine={false}\n stroke={BORDER_COLOR}\n tick={AXIS_TICK}\n tickFormatter={value => smartMoneySummary(value)}\n />\n\n <RechartsTooltip\n content={({ active, payload }) => (\n <Tooltip active={active} payload={payload} />\n )}\n isAnimationActive={false}\n shared={false}\n />\n\n <Bar name=\"Profit\" dataKey={DataKeyMap.profit} fill={BAR_COLOR.profit} {...barProps} />\n <Bar name=\"Income\" dataKey={DataKeyMap.income} fill={BAR_COLOR.income} {...barProps} />\n <Bar name=\"Loss\" dataKey={DataKeyMap.loss} fill={BAR_COLOR.loss} {...barProps} />\n <Bar name=\"Expenses\" dataKey={DataKeyMap.expenses} fill={BAR_COLOR.expenses} {...barProps} />\n\n <Bar dataKey={DataKeyMap.noDataHeight} fill={BORDER_COLOR} legendType=\"none\" {...barProps} />\n\n <ReferenceLine y={0} stroke={REFERENCE_LINE_COLOR} />\n\n <Line\n dataKey={DataKeyMap.netIncome}\n fill={LINE_COLOR}\n stroke={LINE_COLOR}\n strokeWidth={1}\n legendType=\"none\"\n activeDot={false}\n isAnimationActive={animate}\n onAnimationStart={() => setAnimate(true)} // required to prevent onAnimationEnd from immediately disabling animations on multiple renders\n onAnimationEnd={() => setAnimate(false)}\n />\n\n </BarChart>\n </ResponsiveContainer>\n );\n};\n\nexport { Chart };\n","import { css } from \"../../../styled-system/css\";\nimport { stylist } from \"../../style/stylist.ts\";\n\ntype ShimmerBlockProps = {\n styles: string;\n};\n\nconst shimmerBaseStyle = css({\n backgroundColor: \"surface.elevated\",\n borderRadius: \"sm\",\n backgroundImage: \"linear-gradient(90deg, {colors.surface.elevated} 30%, {colors.surface.foreground} 50%, {colors.surface.elevated} 70%)\",\n backgroundSize: \"400%\",\n backgroundPosition: \"100% 0\",\n animation: \"shimmer\",\n});\n\nfunction ShimmerBlock({ styles }: ShimmerBlockProps) {\n const shimmerStylist = stylist(null, shimmerBaseStyle, styles);\n return <div {...shimmerStylist} />;\n}\n\nexport { ShimmerBlock };\n","import { TileGraphs } from \"./TileGraphs.tsx\";\nimport { ShimmerBlock } from \"../loading/ShimmerBlock.tsx\";\nimport { css } from \"../../../styled-system/css\";\nimport { PropsWithChildren } from \"react\";\n\nconst tileShimmerCss = css({ width: \"40%\", minHeight: 65 });\n\nfunction TileShimmer({ children }: PropsWithChildren) {\n return (\n <>\n <ShimmerBlock styles={tileShimmerCss} />\n <TileGraphs>\n {children}\n </TileGraphs>\n </>\n );\n}\n\nexport { TileShimmer };\n","import { stylist } from \"../../../style/stylist.ts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { ShimmerBlock } from \"../../loading/ShimmerBlock.tsx\";\n\nconst legendContainerStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 16,\n}));\n\nconst legendStyles = css({ width: \"80px\", height: \"17px\", marginBottom: \"10px\" });\n\nconst chartStyles = css({ width: \"100%\", height: \"100%\" });\n\nfunction BarChartShimmer() {\n return (\n <>\n <div {...legendContainerStylist}>\n <ShimmerBlock styles={legendStyles} />\n <ShimmerBlock styles={legendStyles} />\n <ShimmerBlock styles={legendStyles} />\n <ShimmerBlock styles={legendStyles} />\n </div>\n <ShimmerBlock styles={chartStyles} />\n </>\n );\n}\n\nexport { BarChartShimmer };\n","import { DateFilters, DateOptions } from \"../../../utils/date/date.ts\";\nimport { useExpandedPLSummary } from \"./useExpandedPLSummary.ts\";\nimport { GroupingFilters } from \"../../../utils/grouping.ts\";\nimport { TileHeader } from \"../TileHeader.tsx\";\nimport { TileBody } from \"../TileBody.tsx\";\nimport { Tile } from \"../Tile.tsx\";\nimport { Summation } from \"../../typography/Summation.tsx\";\nimport { TileGraphs } from \"../TileGraphs.tsx\";\nimport { Chart } from \"./Chart.tsx\";\nimport { smartMoneySummary } from \"../../../utils/money/smartNumber.ts\";\nimport { TileShimmer } from \"../TileShimmer.tsx\";\nimport { BarChartShimmer } from \"../../dashboards/loading/BarChartShimmer.tsx\";\n\ntype ExpandedPLTileProps = {\n filter?: DateOptions;\n};\n\nfunction ExpandedPLTile({ filter = DateFilters.PAST_YEAR }: ExpandedPLTileProps) {\n const { query: { data }, isFilling } = useExpandedPLSummary({ filter, grouping: GroupingFilters.MONTHLY });\n\n return (\n <Tile type=\"chart\">\n <TileHeader title=\"Profit + Loss\" />\n <TileBody>\n {isFilling\n ? (\n <TileShimmer>\n <BarChartShimmer />\n </TileShimmer>\n )\n : (\n <>\n <Summation title={smartMoneySummary(data?.total ?? 0)} label=\"Profit\" />\n <TileGraphs>\n <Chart data={data} />\n </TileGraphs>\n </>\n )}\n </TileBody>\n </Tile>\n );\n}\n\nexport { ExpandedPLTile };\n","import { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { PropsWithChildren } from \"react\";\n\nconst bannersStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n gap: \"10px\",\n alignSelf: \"stretch\",\n}));\n\ntype TaskBannersProps = PropsWithChildren;\n\nfunction TaskBannerLayout({ children }: TaskBannersProps) {\n return (\n <div {...bannersStylist}>\n {children}\n </div>\n );\n}\n\nexport { TaskBannerLayout };\n","import {\n BankTransaction,\n QueryBankTransactionsFilters,\n} from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { TaskType } from \"../../../../query/fetches/tasks/tasks.ts\";\nimport { ConversationGetDto, QueryConversationsFilters } from \"../../../../query/fetches/conversations/conversations.ts\";\n\nconst CONVERSATIONS_SECTION = \"conversations-section\";\nconst TRANSACTIONS_SECTION = \"transactions-section\";\n\nconst taskTypeToSectionMap: Record<TaskType, string> = {\n MESSAGE_REVIEW: CONVERSATIONS_SECTION,\n TRANSACTION_REVIEW: TRANSACTIONS_SECTION,\n // Does not route to a section\n LINK_BANK: \"\",\n // TODO: add when api gets updated\n RULE_REVIEW: \"\",\n BANK_ERROR: \"\",\n CSV_IMPORT_REVIEW: \"\",\n};\n\n// TODO: add unread message filter\nconst bankTransactionsFilter: QueryBankTransactionsFilters = {\n reviewStatus: {\n values: [\"USER_REVIEW_REQUIRED\"],\n operator: \"IN\",\n },\n status: {\n values: [\"ACTIVE\"],\n operator: \"IN\",\n },\n category: {\n expand: true,\n },\n glAccount: {\n expand: true,\n },\n bankAccount: {\n expand: true,\n },\n};\n\nconst conversationFilter: QueryConversationsFilters = {\n resolutionStatus: {\n operator: \"IN\",\n values: [\"OPEN\"],\n },\n};\n\nconst limit = 10; // we want to keep this table small\n\nconst PLACEHOLDER_TRANSACTIONS: BankTransaction[] = [];\nconst PLACEHOLDER_CONVERSATIONS: ConversationGetDto[] = [];\n\nexport {\n CONVERSATIONS_SECTION,\n TRANSACTIONS_SECTION,\n taskTypeToSectionMap,\n bankTransactionsFilter,\n conversationFilter,\n limit,\n PLACEHOLDER_TRANSACTIONS,\n PLACEHOLDER_CONVERSATIONS,\n};\n","import { createIcon } from \"./createIcon\";\nimport { stylist, StylistReturn } from \"../../style/stylist.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\ntype MediumIconProps = {\n Component: ReturnType<typeof createIcon>;\n stylists?: StylistReturn[];\n};\n/**\n * Utility component to resize an existing icon component to a medium size (15px).\n * @param Component - the icon component to resize\n * @param style - optional Styles to apply to the icon\n */\nfunction MediumIcon({ Component, stylists }: MediumIconProps) {\n return <Component stylists={[stylist(ValidClassName[\"medium-icon\"]), ...(stylists ?? [])]} size={15} />;\n}\n\nexport type { MediumIconProps };\nexport { MediumIcon };\n","import * as React from \"react\";\nconst SvgMessage = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 25, height: 24, viewBox: \"0 0 25 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M12 1.47998C6.2 1.47998 1.5 5.74998 1.5 11C1.52866 13.0153 2.23294 14.9626 3.5 16.53L2.5 21.53L9.16 20.2C10.1031 20.4499 11.0744 20.5776 12.05 20.58C17.85 20.58 22.55 16.3 22.55 11.03C22.55 5.75998 17.8 1.47998 12 1.47998Z\", strokeWidth: 1.5, strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M11.05 11.02H12.95\", strokeWidth: 1.5, strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M15.82 11.02H17.73\", strokeWidth: 1.5, strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M6.27 11.02H8.18\", strokeWidth: 1.5, strokeMiterlimit: 10 }));\nexport default SvgMessage;\n","import { ComponentType, SVGProps } from \"react\";\nimport { stylist, StylistReturn } from \"../../style/stylist.ts\";\nimport { mergeStylists } from \"../../style/mergeStylists.ts\";\nimport { cva } from \"../../../styled-system/css\";\n\ntype CreateIconProps = {\n size?: number;\n fill?: string;\n stroke?: string;\n stylists: StylistReturn[];\n};\n\nconst iconVariantStyles = cva({\n base: { stroke: \"currentColor\" },\n variants: {\n primary: {\n DEFAULT: { stroke: \"icon.intent.primary\" },\n hover: { stroke: \"icon.intent.primary.hover\" },\n active: { stroke: \"icon.intent.primary.active\" },\n },\n secondary: {\n DEFAULT: { stroke: \"icon.intent.secondary\" },\n hover: { stroke: \"icon.intent.secondary.hover\" },\n active: { stroke: \"icon.intent.secondary.active\" },\n },\n success: {\n DEFAULT: { stroke: \"icon.intent.success\" },\n hover: { stroke: \"icon.intent.success.hover\" },\n active: { stroke: \"icon.intent.success.active\" },\n },\n warning: {\n DEFAULT: { stroke: \"icon.intent.warning\" },\n hover: { stroke: \"icon.intent.warning.hover\" },\n active: { stroke: \"icon.intent.warning.active\" },\n },\n danger: {\n DEFAULT: { stroke: \"icon.intent.danger\" },\n hover: { stroke: \"icon.intent.danger.hover\" },\n active: { stroke: \"icon.intent.danger.active\" },\n },\n action: {\n DEFAULT: { stroke: \"icon.intent.action\" },\n hover: { stroke: \"icon.intent.action.hover\" },\n active: { stroke: \"icon.intent.action.active\" },\n },\n },\n});\n\n/**\n * Utility function to create an icon component from an SVG. Use this to create individual icons with adjusted size, fill, and stroke, see ArrowUp.tsx and ArrowDown.tsx for examples\n * @param Icon - the SVG (converted to a React component via vite-plugin-svgr) to be used as an icon\n * @param displayName - the name of the icon, used to set the displayName of the created component for use in React DevTools\n */\nfunction createIcon(Icon: ComponentType<SVGProps<SVGSVGElement>>, displayName: string) {\n const IconComponent = ({ size = 24, fill = \"transparent\", stylists }: CreateIconProps) => {\n const iconVariantStylist = stylist(null, iconVariantStyles());\n // TODO: go through each usage of icons and if needed pass in an object determining a variant, then get rid of stylists prop\n const iconStylist = mergeStylists([iconVariantStylist, ...stylists]);\n return (\n <Icon\n {...iconStylist}\n style={{ minHeight: size, minWidth: size }}\n width={size}\n height={size}\n fill={fill}\n />\n );\n };\n IconComponent.displayName = displayName;\n return IconComponent;\n}\n\ntype CreateIconReturn = ReturnType<typeof createIcon>;\n\nexport { createIcon };\n\nexport type { CreateIconReturn };\n","import IconComponent from \"../../../assets/icons/message.svg?react\";\nimport { createIcon } from \"../createIcon\";\n\nconst Comment = createIcon(IconComponent, \"Comment\");\n\nexport { Comment };\n","import IconComponent from \"../../../assets/icons/attention.svg?react\";\nimport { createIcon } from \"../createIcon\";\n\nconst Attention = createIcon(IconComponent, \"Attention\");\n\nexport { Attention };\n","import * as React from \"react\";\nconst SvgAttention = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 16, viewBox: \"0 0 16 16\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M8.54708 2.09833H8.37602C8.21004 2.09808 8.04676 2.14026 7.90167 2.22087C7.75657 2.30147 7.6345 2.41783 7.54702 2.55888L1.70458 11.9081C1.60602 12.0636 1.55355 12.2438 1.55325 12.4279C1.55324 12.5569 1.57886 12.6846 1.62861 12.8036C1.67837 12.9226 1.75127 13.0305 1.84309 13.1211C1.93491 13.2117 2.04381 13.2832 2.16348 13.3313C2.28314 13.3795 2.41118 13.4034 2.54015 13.4016H14.3829C14.6412 13.4016 14.8889 13.299 15.0715 13.1164C15.2541 12.9338 15.3567 12.6861 15.3567 12.4279C15.3564 12.2438 15.3039 12.0636 15.2054 11.9081L9.37608 2.55888C9.2886 2.41783 9.16652 2.30147 9.02143 2.22087C8.87634 2.14026 8.71306 2.09808 8.54708 2.09833Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M8.46158 5.23663V9.00659\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M8.46158 10.2632V11.5199\", stroke: \"#182428\", strokeMiterlimit: 10 }));\nexport default SvgAttention;\n","import { css } from \"../../styled-system/css\";\n\nconst fadeBackgroundBorder = css({\n transition: \"background 300ms ease-out, background-color 300ms ease-out, border-color 300ms ease-out, box-shadow 0ms\",\n \"&:hover\": {\n transition: \"background 100ms ease-out, background-color 100ms ease-out, border-color 100ms ease-out, box-shadow 0ms\",\n },\n});\n\nconst fadeBackground = css({\n transition: \"background 300ms ease-out, box-shadow 0ms\",\n \"&:hover\": {\n transition: \"background 100ms ease-out, box-shadow 0ms\",\n },\n});\n\nconst fadeColor = css({\n transition: \"color 300ms ease-out\",\n \"&:hover\": {\n transition: \"color 100ms ease-out\",\n },\n});\n\nconst fadeInnerText = css({\n \"& > .Tight-text\": {\n transition: \"color 300ms ease-out\",\n },\n \"&:hover > .Tight-text\": {\n transition: \"color 100ms ease-out\",\n },\n});\n\nconst fadeIcon = css({\n \"& path\": {\n transition: \"stroke 300ms ease-out\",\n },\n \"&:hover path\": {\n transition: \"stroke 100ms ease-out\",\n },\n});\n\nexport { fadeBackground, fadeBackgroundBorder, fadeColor, fadeInnerText, fadeIcon };\n","import { css } from \"../../styled-system/css\";\n\nconst buttonBaseStyle = css({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n outline: \"none\",\n cursor: \"pointer\",\n borderRadius: \"md\",\n\n \"&:focus-visible\": {\n outline: \"4px solid\",\n outlineColor: \"border.layout\",\n outlineOffset: \"-1px\",\n },\n\n \"&:disabled\": {\n cursor: \"not-allowed\",\n opacity: 0.6,\n },\n});\n\nconst buttonPrimaryStyle = css({\n color: \"typography.intent.secondary\",\n border: \"{borderWidths.md} solid\",\n borderColor: \"border.layout\",\n backgroundColor: \"surface.intent.action.discrete\",\n\n \"&:hover:not(:disabled)\": {\n backgroundColor: \"surface.intent.action.discrete.hover\",\n borderColor: \"border.layout\",\n \"& .Tight-text\": {\n color: \"typography.intent.secondary.hover\",\n },\n },\n\n \"&:active:enabled, &[data-active='true']:enabled\": {\n backgroundColor: \"surface.intent.action.discrete.active\",\n \"& .Tight-text\": {\n color: \"typography.intent.secondary.active\",\n },\n },\n\n \"& .Tight-text\": {\n color: \"typography.intent.secondary\",\n },\n});\n\nconst defaultButtonText = css({\n padding: \"10px\",\n fontSize: \"md\",\n fontWeight: \"md\",\n gap: \"9px\",\n});\n\nconst smallButtonText = css({\n padding: \"6px\",\n fontSize: \"sm\",\n fontWeight: \"sm\",\n gap: \"5px\",\n});\n\nexport {\n buttonBaseStyle,\n buttonPrimaryStyle,\n defaultButtonText,\n smallButtonText,\n};\n","import { MouseEvent, PropsWithChildren } from \"react\";\nimport { stylist, StylistReturn } from \"../../style/stylist\";\nimport { css } from \"../../../styled-system/css\";\nimport { fadeBackgroundBorder } from \"../../style/transition\";\nimport { mergeStylists } from \"../../style/mergeStylists.ts\";\nimport { buttonBaseStyle, defaultButtonText, smallButtonText } from \"../../style/buttons.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\ntype ButtonSize = \"default\" | \"small\";\n\ntype ButtonBaseWrapperProps = PropsWithChildren<{\n type?: \"button\" | \"submit\";\n onClick?: ((e: MouseEvent<HTMLButtonElement>) => void) | (() => void);\n disabled?: boolean;\n size?: ButtonSize;\n active?: boolean;\n stylists?: StylistReturn[];\n}>;\n\nconst sizeStyles = {\n default: defaultButtonText,\n small: smallButtonText,\n} as const;\n\nconst createBaseButtonStylist = (size: ButtonSize): StylistReturn => {\n const styles = sizeStyles[size];\n return stylist(\n ValidClassName[\"button-base\"],\n css({\n width: \"fit-content\",\n }),\n styles,\n buttonBaseStyle,\n fadeBackgroundBorder,\n );\n};\n\nconst sizes: ButtonSize[] = [\"default\", \"small\"];\nconst stylistMap: Record<ButtonSize, StylistReturn> = {\n default: { className: \"\" },\n small: { className: \"\" },\n};\nfor (const size of sizes) {\n stylistMap[size] = createBaseButtonStylist(size);\n}\n\nfunction ButtonBase({ children, stylists = [], type = \"button\", onClick, disabled, size = \"default\", active = false }: ButtonBaseWrapperProps) {\n const baseButtonStylist = stylistMap[size];\n\n const stylistsToMerge = [baseButtonStylist, ...stylists];\n\n const buttonStylist = mergeStylists(stylistsToMerge);\n\n return (\n <button\n {...buttonStylist}\n type={type}\n onClick={onClick}\n disabled={disabled}\n data-active={active}\n >\n {children}\n </button>\n );\n}\n\nexport type {\n ButtonBaseWrapperProps,\n};\n\nexport {\n ButtonBase,\n};\n","import { ButtonBase, ButtonBaseWrapperProps } from \"./ButtonBase\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\nconst buttonWarningStylist = stylist(ValidClassName[\"button-warning\"], css({\n color: \"typography.intent.warning\",\n border: \"1px solid {colors.border.intent.warning}\",\n backgroundColor: \"surface.intent.warning\",\n\n \"&:hover:not(:disabled)\": {\n backgroundColor: \"surface.intent.warning.hover\",\n borderColor: \"border.intent.warning.hover\",\n \"& .Tight-text\": {\n color: \"typography.intent.warning.hover\",\n },\n },\n\n \"&:active:enabled, &[data-active='true']:enabled\": {\n backgroundColor: \"surface.intent.warning.active\",\n borderColor: \"border.intent.warning.active\",\n \"& .Tight-text\": {\n color: \"typography.intent.warning.active\",\n },\n },\n\n \"& .Tight-text\": {\n color: \"typography.intent.warning\",\n },\n}));\n\nfunction ButtonWarning({ children, stylists = [], ...props }: ButtonBaseWrapperProps) {\n return (\n <ButtonBase\n stylists={[buttonWarningStylist, ...stylists]}\n {...props}\n >\n {children}\n </ButtonBase>\n );\n}\n\nexport { ButtonWarning };\n","import * as React from \"react\";\nconst SvgFlag = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 13, height: 15, viewBox: \"0 0 13 15\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M0.743464 14.9687V0.96875H11.6465L9.22218 4.59886L11.6465 8.24166H0.743464\", stroke: \"#182428\", strokeMiterlimit: 10 }));\nexport default SvgFlag;\n","import IconComponent from \"../../../assets/icons/flag.svg?react\";\nimport { createIcon } from \"../createIcon\";\n\nconst Flag = createIcon(IconComponent, \"Flag\");\n\nexport { Flag };\n","import IconComponent from \"../../../../assets/icons/bank.svg?react\";\nimport { createIcon } from \"../../createIcon.tsx\";\n\nconst Bank = createIcon(IconComponent, \"Bank\");\n\nexport { Bank };\n","import * as React from \"react\";\nconst SvgBank = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 16, viewBox: \"0 0 16 16\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M14.9092 4.60259V6.39635H1.78418V4.60259L8.34669 1.62134L14.9092 4.60259Z\", strokeMiterlimit: 10, strokeLinecap: \"square\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M14.9092 12.3589H1.78418V14.7464H14.9092V12.3589Z\", strokeMiterlimit: 10, strokeLinecap: \"square\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M2.97803 6.39648V12.359\", strokeMiterlimit: 10, strokeLinecap: \"square\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M6.55908 6.39648V12.359\", strokeMiterlimit: 10, strokeLinecap: \"square\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M10.1343 6.39648V12.359\", strokeMiterlimit: 10, strokeLinecap: \"square\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M13.7153 6.39648V12.359\", strokeMiterlimit: 10, strokeLinecap: \"square\" }));\nexport default SvgBank;\n","import { ButtonBase, ButtonBaseWrapperProps } from \"./ButtonBase\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\nconst buttonDangerStylist = stylist(ValidClassName[\"button-danger\"], css({\n color: \"typography.intent.danger\",\n border: \"{borderWidths.md} solid\",\n borderColor: \"border.intent.danger\",\n backgroundColor: \"surface.intent.danger\",\n\n \"&:hover:not(:disabled)\": {\n backgroundColor: \"surface.intent.danger.hover\",\n borderColor: \"border.intent.danger.hover\",\n \"& .Tight-text\": {\n color: \"typography.intent.danger.hover\",\n },\n },\n\n \"&:active:enabled, &[data-active='true']:enabled\": {\n backgroundColor: \"surface.intent.danger.active\",\n borderColor: \"border.intent.danger.active\",\n \"& .Tight-text\": {\n color: \"typography.intent.danger.active\",\n },\n },\n\n \"& .Tight-text\": {\n color: \"typography.intent.danger\",\n },\n}));\n\nfunction ButtonDanger({ children, stylists = [], ...props }: ButtonBaseWrapperProps) {\n return (\n <ButtonBase\n stylists={[buttonDangerStylist, ...stylists]}\n {...props}\n >\n {children}\n </ButtonBase>\n );\n}\n\nexport { ButtonDanger };\n","import { ButtonBase, ButtonBaseWrapperProps } from \"./ButtonBase\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\nconst buttonActionStylist = stylist(ValidClassName[\"button-action\"], css({\n color: \"typography.intent.action\",\n border: \"1px solid {colors.border.intent.action}\",\n backgroundColor: \"surface.intent.action\",\n\n \"&:hover:not(:disabled)\": {\n backgroundColor: \"surface.intent.action.hover\",\n borderColor: \"border.intent.action.hover\",\n \"& .Tight-text\": {\n color: \"typography.intent.action.hover\",\n },\n },\n\n \"&:active:enabled, &[data-active='true']:enabled\": {\n backgroundColor: \"surface.intent.action.active\",\n borderColor: \"border.intent.action.active\",\n \"& .Tight-text\": {\n color: \"typography.intent.action.active\",\n },\n },\n\n \"& .Tight-text\": {\n color: \"typography.intent.action\",\n },\n}));\n\nfunction ButtonAction({ children, stylists = [], ...props }: ButtonBaseWrapperProps) {\n return (\n <ButtonBase\n stylists={[buttonActionStylist, ...stylists]}\n {...props}\n >\n {children}\n </ButtonBase>\n );\n}\n\nexport { ButtonAction };\n","import { Comment } from \"../icon/icons/Comment.tsx\";\nimport { Attention } from \"../icon/icons/Attention.tsx\";\nimport { ButtonWarning } from \"../inputs/ButtonWarning.tsx\";\nimport { ButtonBase, ButtonBaseWrapperProps } from \"../inputs/ButtonBase.tsx\";\nimport { ComponentType } from \"react\";\nimport { Flag } from \"../icon/icons/Flag.tsx\";\nimport { createIcon } from \"../icon/createIcon.tsx\";\nimport { TaskPriority, TaskType } from \"../../query/fetches/tasks/tasks.ts\";\nimport { Bank } from \"../icon/icons/category/Bank.tsx\";\nimport { ButtonDanger } from \"../inputs/ButtonDanger.tsx\";\nimport { ButtonAction } from \"../inputs/ButtonAction.tsx\";\n\n// Variants based on Priority\ntype BannerPriorityVariant = {\n Button: ComponentType<ButtonBaseWrapperProps>;\n};\n\nconst getPriorityVariant = (priority: TaskPriority): BannerPriorityVariant => {\n // TODO: add other priorities when we have UX for them\n switch (priority) {\n case \"URGENT\":\n return { Button: ButtonDanger };\n case \"HIGH\":\n return { Button: ButtonWarning };\n case \"MEDIUM\":\n return { Button: ButtonAction };\n default:\n return { Button: ButtonBase };\n }\n};\n\n// Variants based on Type\ntype BannerTypeVariant = {\n Icon: ReturnType<typeof createIcon>;\n buttonText: string;\n};\n\nconst getTypeVariant = (type: TaskType): BannerTypeVariant => {\n // TODO: add other types when we have UX for them\n switch (type) {\n case \"MESSAGE_REVIEW\":\n return { Icon: Comment, buttonText: \"Respond Now\" };\n case \"TRANSACTION_REVIEW\":\n return { Icon: Flag, buttonText: \"Review\" };\n case \"LINK_BANK\":\n return { Icon: Bank, buttonText: \"Link your bank\" };\n case \"BANK_ERROR\":\n return { Icon: Attention, buttonText: \"Relink\" };\n default:\n return { Icon: Attention, buttonText: \"\" };\n }\n};\n\nexport { getPriorityVariant, getTypeVariant };\n","import { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { StrongLabel } from \"../typography/StrongLabel.tsx\";\nimport { MediumIcon } from \"../icon/MediumIcon.tsx\";\nimport { getTypeVariant } from \"./bannerVariant.ts\";\nimport { TaskType } from \"../../query/fetches/tasks/tasks.ts\";\n\nconst bannerTitleStylist = stylist(null, css({\n display: \"flex\",\n alignItems: \"center\",\n gap: \"15px\",\n}));\n\nconst iconStylist = stylist(null, css({ width: \"20px\", height: \"20px\" }));\n\ntype BannerTitleProps = {\n title: string;\n type: TaskType;\n};\n\nfunction BannerTitle({ title, type }: BannerTitleProps) {\n const { Icon } = getTypeVariant(type);\n\n return (\n <div {...bannerTitleStylist}>\n <MediumIcon Component={Icon} stylists={[iconStylist]} />\n <StrongLabel>{title}</StrongLabel>\n </div>\n );\n}\n\nexport { BannerTitle };\n","import { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { SubLabel } from \"../typography/SubLabel.tsx\";\nimport { BannerTitle } from \"./BannerTitle.tsx\";\nimport { TaskType } from \"../../query/fetches/tasks/tasks.ts\";\n\nconst bannerHeaderStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n gap: \"5px\",\n flex: \"1 1 0\",\n minWidth: \"200px\",\n}));\n\ntype BannerHeaderProps = {\n title: string;\n description: string;\n type: TaskType;\n};\n\nfunction BannerHeader({ title, description, type }: BannerHeaderProps) {\n return (\n <div {...bannerHeaderStylist}>\n <BannerTitle title={title} type={type} />\n <SubLabel>{description}</SubLabel>\n </div>\n );\n}\n\nexport { BannerHeader };\n","import { createIcon } from \"./createIcon\";\nimport { stylist, StylistReturn } from \"../../style/stylist.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\ntype SmallIconProps = {\n Component: ReturnType<typeof createIcon>;\n stylists?: StylistReturn[];\n};\n/**\n * Utility component to resize an existing icon component to a small size (12px).\n * @param Component - the icon component to resize\n * @param style - optional Styles to apply to the icon\n */\nfunction SmallIcon({ Component, stylists }: SmallIconProps) {\n return <Component stylists={[stylist(ValidClassName[\"small-icon\"]), ...(stylists ?? [])]} size={12} />;\n}\n\nexport type { SmallIconProps };\nexport { SmallIcon };\n","import * as React from \"react\";\nconst SvgArrowRight = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 13, height: 12, viewBox: \"0 0 13 12\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M4.31472 11.6L9.91473 5.99997L4.31472 0.399959\", stroke: \"#182428\", strokeMiterlimit: 10 }));\nexport default SvgArrowRight;\n","import IconComponent from \"../../../assets/icons/arrow-right.svg?react\";\nimport { createIcon } from \"../createIcon.tsx\";\n\nconst ArrowRight = createIcon(IconComponent, \"ArrowRight\");\n\nexport { ArrowRight };\n","import { SmallIcon } from \"../icon/SmallIcon.tsx\";\nimport { ArrowRight } from \"../icon/icons/ArrowRight.tsx\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { StrongLabel } from \"../typography/StrongLabel.tsx\";\nimport { getPriorityVariant, getTypeVariant } from \"./bannerVariant.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { TaskPriority, TaskType } from \"../../query/fetches/tasks/tasks.ts\";\n\nconst bannerActionButtonStylist = stylist(ValidClassName[\"banner-button\"], css({\n display: \"flex\",\n width: \"202px\",\n justifyContent: \"flex-end\",\n alignItems: \"center\",\n gap: \"15px\",\n flexShrink: \"0\",\n}));\n\nconst bannerButtonTextStylist = stylist(ValidClassName[\"banner-button-text\"]);\n\nconst bannerButtonIconStylist = stylist(ValidClassName[\"banner-button-icon\"]);\n\ntype BannerActionProps = {\n priority: TaskPriority;\n type: TaskType;\n handleClick?: () => void;\n};\n\nfunction BannerActionButton({ priority, type, handleClick }: BannerActionProps) {\n const { buttonText } = getTypeVariant(type);\n const { Button } = getPriorityVariant(priority);\n\n return (\n <Button onClick={handleClick} stylists={[bannerActionButtonStylist]}>\n <StrongLabel stylists={[bannerButtonTextStylist]}>{buttonText}</StrongLabel>\n <SmallIcon stylists={[bannerButtonIconStylist]} Component={ArrowRight} />\n </Button>\n );\n}\n\nexport { BannerActionButton };\n","import { cva } from \"../../../styled-system/css\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { BannerHeader } from \"./BannerHeader.tsx\";\nimport { BannerActionButton } from \"./BannerActionButton.tsx\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { TaskDTOWithMeta, TaskPriority } from \"../../query/fetches/tasks/tasks.ts\";\n\ntype BannerProps = {\n task: TaskDTOWithMeta;\n handleClick?: () => void;\n};\n\nconst bannerContainerCss = cva({\n base: {\n display: \"flex\",\n padding: \"15px\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n alignSelf: \"stretch\",\n flexWrap: \"wrap\",\n minWidth: \"300px\",\n gap: \"15px\",\n borderRadius: \"lg\",\n border: \"1px solid\",\n backgroundColor: \"surface.foreground\",\n },\n variants: {\n priority: {\n HIGH: {\n borderColor: \"border.intent.warning\",\n },\n MEDIUM: {\n borderColor: \"border.intent.action\",\n },\n LOW: {}, // TODO: add when we have design\n URGENT: {\n borderColor: \"border.intent.danger\",\n },\n },\n },\n});\n\nconst classNameMap: Record<TaskPriority, ValidClassName> = {\n HIGH: ValidClassName[\"banner-high\"],\n MEDIUM: ValidClassName[\"banner-medium\"],\n LOW: ValidClassName[\"banner-low\"],\n URGENT: ValidClassName[\"banner-urgent\"],\n} as const;\n\nfunction Banner({ task, handleClick }: BannerProps) {\n const { name, description, type, priority } = task;\n const bannerContainerStylist = stylist(ValidClassName.banner, classNameMap[priority], bannerContainerCss({ priority }));\n\n return (\n <div {...bannerContainerStylist}>\n <BannerHeader title={name} description={description} type={type} />\n <BannerActionButton priority={priority} type={type} handleClick={handleClick} />\n </div>\n );\n}\n\nexport { Banner };\nexport type { BannerProps };\n","import { createEndpointManager } from \"../../endpointManager.ts\";\nimport { getV6ApiUrl, TightEnvironment } from \"../../../utils/traxEnvironmentVariables.ts\";\nimport { paths } from \"./v6Schema.ts\";\n\nfunction getV6EndpointManager(environment: TightEnvironment) {\n return createEndpointManager<keyof paths>(`${getV6ApiUrl(environment)}`, \"v6\");\n}\n\nexport {\n getV6EndpointManager,\n};\n","import { components, operations } from \"../../versions/v6/v6Schema.ts\";\nimport { EntityFetchFn, useEntity } from \"../utils/useEntity.ts\";\nimport { v6EntityPost, V6EntityPostRequest } from \"../../http/post.ts\";\nimport { getV6EndpointManager } from \"../../versions/v6/v6EndpointManager.ts\";\nimport { isNullish } from \"../../../utils/typeUtils.ts\";\n\ntype QueryTaskParams = components[\"schemas\"][\"TaskGetParam\"];\ntype QueryTaskResponse = operations[\"queryTasks\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\ntype QueryTaskSuccessResponse = Omit<QueryTaskResponse, \"result\">;\n\n// TODO: remove \"LINK_BANK\" type when corresponding task is available from api\ntype TaskType = components[\"schemas\"][\"TaskGetDto\"][\"type\"] | \"LINK_BANK\";\ntype TaskDTO = Omit<components[\"schemas\"][\"TaskGetDto\"], \"type\"> & { type: TaskType };\ntype TaskPriority = TaskDTO[\"priority\"];\n\ntype TaskDTOWithMeta = TaskDTO & { meta?: { plaidItemId?: number } };\n\ntype TaskBaseKey = [\"tasks\", QueryTaskParams];\nconst taskKeys = {\n all: (): TaskBaseKey => [\"tasks\", {}],\n of: (params: QueryTaskParams): TaskBaseKey => [\"tasks\", params ?? {}],\n};\n\nconst priorityOrder: Record<TaskPriority, number> = {\n URGENT: 0,\n HIGH: 1,\n MEDIUM: 2,\n LOW: 3,\n};\n\nfunction sortTasks(data: QueryTaskSuccessResponse) {\n if (isNullish(data) || isNullish(data.data)) {\n return [];\n }\n\n return [...data.data].sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);\n}\n\nconst getTaskFetch: EntityFetchFn<QueryTaskSuccessResponse, TaskBaseKey> = async (queryContext) => {\n const queryKey = queryContext.queryKey;\n const queryParams = queryKey[1];\n const accessToken = queryKey[2].accessToken;\n const environment = queryKey[2].environment;\n\n const params: V6EntityPostRequest<QueryTaskParams> = {\n path: \"/v6/tasks/query\",\n method: \"POST\",\n accessToken,\n bodyParams: {\n ...queryParams,\n },\n endpointManager: getV6EndpointManager(environment),\n };\n\n const res = await v6EntityPost<QueryTaskResponse, QueryTaskParams>(params);\n return res.result === \"SUCCESS\" && res.data !== undefined\n ? { data: res.data }\n : { data: undefined };\n};\n\n// TODO: convert to usePaginatedEntity once other banners are implemented\nfunction useTasks(params?: QueryTaskParams) {\n const queryKey = params ? taskKeys.of(params) : taskKeys.all();\n return useEntity({ queryKey, queryFn: getTaskFetch, select: sortTasks });\n}\n\nexport {\n useTasks,\n taskKeys,\n};\n\nexport type {\n TaskDTO,\n TaskDTOWithMeta,\n TaskPriority,\n TaskType,\n};\n","import * as React from \"react\";\nconst SvgArrowLeft = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 13, height: 12, viewBox: \"0 0 13 12\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M8.31473 0.399963L2.71472 5.99997L8.31473 11.6\", stroke: \"#182428\", strokeMiterlimit: 10 }));\nexport default SvgArrowLeft;\n","import IconComponent from \"../../../assets/icons/arrow-left.svg?react\";\nimport { createIcon } from \"../createIcon.tsx\";\n\nconst ArrowLeft = createIcon(IconComponent, \"ArrowLeft\");\n\nexport { ArrowLeft };\n","import { useContext, createContext } from \"react\";\nimport { PaginationControls } from \"../../../query/fetches/utils/usePaginatedEntity.ts\";\n\n// disable pagination by setting hasNext and hasPrev to false\nconst defaultVal: PaginationControls = {\n hasNextPage: false,\n hasPreviousPage: false,\n getFirstPage: () => {},\n getLastPage: () => {},\n pageBackwards: () => {},\n pageForwards: () => {},\n};\n\nconst PaginationContext = createContext<PaginationControls>(defaultVal);\n\nfunction usePaginationContext() {\n const context = useContext(PaginationContext);\n if (context === undefined) {\n throw new Error(\"usePaginationContext must be used within a PaginationProvider\");\n }\n return context;\n}\n\nexport {\n PaginationContext,\n usePaginationContext,\n};\n","import { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { ArrowLeft } from \"../icon/icons/ArrowLeft.tsx\";\nimport { ArrowRight } from \"../icon/icons/ArrowRight.tsx\";\nimport { fadeBackground } from \"../../style/transition.ts\";\n// import { ArrowDoubleLeft } from \"../icon/icons/ArrowDoubleLeft.tsx\";\n// import { ArrowDoubleRight } from \"../icon/icons/ArrowDoubleRight.tsx\";\nimport { usePaginationContext } from \"../dashboards/pagination/paginationContext.ts\";\nimport { SmallIcon } from \"../icon/SmallIcon.tsx\";\n\n// height is same as FilterBar for visual consistency\nconst arrowButtonContainerStylist = stylist(null, css({\n backgroundColor: \"surface.foreground\",\n border: \"{borderWidths.lg} solid\",\n borderRadius: \"md\",\n borderColor: \"border.layout\",\n color: \"typography.base\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"35px\",\n}));\n\nconst arrowButtonStylist = stylist(null, css({\n border: \"none\",\n borderRadius: \"sm\",\n backgroundColor: \"surface.intent.action.discrete\",\n padding: \"4px\",\n margin: 0,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n outline: \"none\",\n boxShadow: \"0 0 0 0 transparent\",\n \"&:focus-visible\": {\n outline: \"4px solid\",\n outlineColor: \"border.layout\",\n },\n \"&:disabled\": {\n opacity: 0.6,\n pointerEvents: \"none\",\n },\n \"&:hover\": {\n backgroundColor: \"surface.intent.action.discrete.hover\",\n },\n}), fadeBackground);\n\nconst arrowButtonInnerStylist = stylist(null, css({\n display: \"flex\",\n gap: \"9px\",\n padding: \"10px\",\n justifyContent: \"center\",\n alignItems: \"center\",\n}));\n\nfunction TablePagination() {\n const { hasNextPage, hasPreviousPage, pageForwards, pageBackwards } = usePaginationContext();\n\n return (\n <div {...arrowButtonContainerStylist}>\n <div {...arrowButtonInnerStylist}>\n {/* TODO: uncomment when last page API is ready. This looks terrible without last page button */}\n {/* <button */}\n {/* {...arrowButtonStylist} */}\n {/* disabled={!hasPreviousPage} */}\n {/* onClick={getFirstPage} */}\n {/* > */}\n {/* <SmallIcon Component={ArrowDoubleLeft} /> */}\n {/* </button> */}\n <button\n {...arrowButtonStylist}\n onClick={pageBackwards}\n disabled={!hasPreviousPage}\n >\n <SmallIcon Component={ArrowLeft} />\n </button>\n </div>\n <div {...arrowButtonInnerStylist}>\n <button\n {...arrowButtonStylist}\n onClick={pageForwards}\n disabled={!hasNextPage}\n >\n <SmallIcon Component={ArrowRight} />\n </button>\n {/* TODO: uncomment when last page API is ready */}\n {/* <button */}\n {/* {...arrowButtonStylist} */}\n {/* disabled={!hasNextPage} */}\n {/* // onClick={getLastPage} */}\n {/* > */}\n {/* <SmallIcon Component={ArrowDoubleRight} /> */}\n {/* </button> */}\n </div>\n </div>\n );\n}\n\nexport {\n TablePagination,\n};\n","import { ShimmerBlock } from \"../../loading/ShimmerBlock.tsx\";\nimport { css } from \"../../../../styled-system/css\";\n\nconst tableRowCss = css({\n width: \"100%\",\n height: \"50px\",\n});\n\nfunction PlaceholderRow() {\n return <ShimmerBlock styles={tableRowCss} />;\n}\n\nexport { PlaceholderRow };\n","import { PlaceholderRow } from \"./PlaceholderRow.tsx\";\nimport { ShimmerBlock } from \"../../loading/ShimmerBlock.tsx\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\n\nconst placeholderTableStylist = stylist(ValidClassName[\"dashboard-placeholder-table\"], css({\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"4px\",\n}));\n\nconst headerStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n height: \"52px\",\n paddingLeft: \"64px\",\n paddingRight: \"64px\",\n}));\n\nconst headerColumnCss = css({\n width: \"100px\",\n height: \"20px\",\n});\n\ntype PlaceholderTableProps = {\n numColumns?: number;\n};\n\nfunction PlaceholderTable({ numColumns = 6 }: PlaceholderTableProps) {\n return (\n <div {...placeholderTableStylist}>\n <div {...headerStylist}>\n {Array.from({ length: numColumns }, (_, index) => (\n <ShimmerBlock key={index} styles={headerColumnCss} />\n ))}\n </div>\n <PlaceholderRow />\n <PlaceholderRow />\n <PlaceholderRow />\n <PlaceholderRow />\n <PlaceholderRow />\n <PlaceholderRow />\n </div>\n );\n}\n\nexport { PlaceholderTable };\n","import { QueryFunction, QueryKey } from \"@tanstack/react-query\";\nimport { useAccessToken } from \"../../http/useAccessToken.ts\";\nimport { getInjectedParamsQueryKey, QueryKeyFn, QueryKeyWithInjectedParams } from \"./queryKey.ts\";\nimport { isNotNullishOrEmptyOrBlank } from \"../../../utils/string/stringUtils.ts\";\nimport { errorFnNoToken } from \"./queryUtils.ts\";\nimport { useCallback } from \"react\";\nimport { queryClient } from \"../../queryClient.ts\"; // don't accidentally use a partner's queryClient if their provider nested within ours\nimport { useEnvironment } from \"../../../environment/useEnvironment.ts\";\n\nfunction usePrefetch<QK extends QueryKey, TParams>(queryKeyFn: QueryKeyFn<TParams, QK>, queryFn: QueryFunction<unknown, QueryKeyWithInjectedParams<QK>>) {\n const accessToken = useAccessToken();\n const environment = useEnvironment();\n\n return useCallback((params: TParams) => {\n const hasAccessToken = isNotNullishOrEmptyOrBlank(accessToken);\n const prefetchOptions = hasAccessToken ? {} : { retry: false, staleTime: Infinity }; // queries with no AT stay in error state until AT provided\n\n return queryClient.prefetchQuery({\n queryKey: getInjectedParamsQueryKey(queryKeyFn(params), accessToken ?? \"\", environment),\n queryFn: hasAccessToken ? queryFn : errorFnNoToken,\n ...prefetchOptions,\n });\n }, [queryKeyFn, queryFn, accessToken, environment]);\n}\n\nexport {\n usePrefetch,\n};\n","import { QueryKey } from \"@tanstack/react-query\";\nimport { RequestCursor, ResponseCursor } from \"./apiTypes.ts\";\nimport { useState, useMemo, useCallback, useEffect, useRef, Dispatch, SetStateAction } from \"react\";\nimport { isNotNullish } from \"../../../utils/typeUtils.ts\";\nimport { EntityFetchFn, useEntity, UseEntityOptions, UseEntityResult } from \"./useEntity.ts\";\nimport { getPaginatedQueryKey, PaginatedQueryKey } from \"./queryKey.ts\";\nimport { usePrefetch } from \"./usePrefetch.ts\";\nimport { notify } from \"../../../utils/logging.ts\";\nimport { isEqual } from \"lodash-es\";\n\ntype PaginationControls = {\n pageForwards: () => void;\n pageBackwards: () => void;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n getFirstPage: () => void;\n getLastPage: () => void;\n};\n\ntype UsePaginatedEntityResult<TData> = UseEntityResult<TData> & {\n /**\n * Object containing pagination state and navigation functions, see {@link usePaginatedEntity}.\n */\n paginationControls: PaginationControls;\n};\n\nconst FIRST_PAGE_CURSOR: RequestCursor = Object.freeze({}); // passing no cursor gives us the first page\nconst LAST_PAGE_CURSOR: RequestCursor = Object.freeze({ cursor: \"FINAL_PAGE\" });\n\ntype UseBaseEntityOptions<TQueryData, TQueryKey extends QueryKey, TData> =\n Omit<UseEntityOptions<TQueryData, PaginatedQueryKey<TQueryKey>, TData>, // base options with correct QK type\n \"queryKey\" | \"queryFn\" | \"keepPreviousDataPlaceholder\">; // exclude types that need to be overwritten for pagination-specific, where we always keep previous data\n\ntype UsePaginatedEntityParams<\n TQueryData extends { cursor?: ResponseCursor },\n TQueryKey extends QueryKey,\n TData = TQueryData,\n> = UseBaseEntityOptions<TQueryData, TQueryKey, TData> & {\n queryKey: TQueryKey;\n queryFn: EntityFetchFn<TQueryData, PaginatedQueryKey<TQueryKey>>;\n};\n\n/**\n * Do not use this to fetch with a specific query key! Compose this into use<entityName>, see {@link useBankTransactions}.\n * Wrapper of {@link useEntity} that adds pagination state and navigation functions.\n * Queries created with this hook will automatically prefetch the next and previous pages if available.\n * CHANGES REQUIRE PERFORMANCE TESTING!\n * @param queryKey\n * @param queryFn\n * @param options - all other non-enumerated options from tanstack query\n * @returns: { ...UseEntityResult, pagination: PaginationObject }\n */\nfunction usePaginatedEntity<\n TQueryData extends { cursor?: ResponseCursor },\n TQueryKey extends QueryKey = QueryKey,\n TData extends { cursor?: ResponseCursor } = TQueryData,\n>({\n queryKey,\n queryFn,\n ...options\n}: UsePaginatedEntityParams<TQueryData, TQueryKey, TData>): UsePaginatedEntityResult<TData> {\n const [cursorParam, setCursorParam] = useState<RequestCursor>(FIRST_PAGE_CURSOR);\n const prevBaseKey = useRef(queryKey);\n\n // reset pagination when the base query key changes\n if (!isEqual(prevBaseKey.current, queryKey)) { // lodash for deep equality\n prevBaseKey.current = queryKey;\n setCursorParam(FIRST_PAGE_CURSOR);\n }\n\n const queryKeyWithCursor = getPaginatedQueryKey(queryKey, cursorParam);\n const entityQuery = useEntity({\n ...options,\n queryKey: queryKeyWithCursor,\n queryFn,\n keepPreviousDataPlaceholder: true, // prevent table flickering\n });\n\n const paginationControls = useMemo(() => (\n createPaginationControls(entityQuery.query.data?.cursor, setCursorParam)\n ), [entityQuery.query.data?.cursor]);\n\n // page prefetching, hidden from the caller and executed on cursor change\n const prefetchNextPage = usePrefetch(\n useCallback((cursor: RequestCursor) => getPaginatedQueryKey(queryKey, cursor), [queryKey]),\n queryFn,\n );\n\n const prefetchPreviousPage = usePrefetch(\n useCallback((cursor: RequestCursor) => getPaginatedQueryKey(queryKey, cursor), [queryKey]),\n queryFn,\n );\n\n // prefetch pages n+1 and n-1 on cursor change\n useEffect(() => {\n const cursor = entityQuery.query.data?.cursor;\n // avoid unnecessary fetches\n if (entityQuery.query.isFetching || !cursor) {\n return;\n }\n\n if (cursor.after) {\n prefetchNextPage({ cursor: cursor.after }).catch((error: Error) => {\n notify({ error, severity: \"error\" });\n });\n }\n\n if (cursor.before) {\n prefetchPreviousPage({ cursor: cursor.before }).catch((error: Error) => {\n notify({ error, severity: \"error\" });\n });\n }\n }, [entityQuery.query.data?.cursor, entityQuery.query.isFetching, prefetchNextPage, prefetchPreviousPage]);\n\n return { ...entityQuery, paginationControls };\n}\n\nfunction createPaginationControls(cursor: ResponseCursor | undefined, setCursor: Dispatch<SetStateAction<RequestCursor>>): PaginationControls {\n return {\n getFirstPage: () => setCursor(FIRST_PAGE_CURSOR),\n getLastPage: () => setCursor(LAST_PAGE_CURSOR),\n hasNextPage: isNotNullish(cursor?.after),\n hasPreviousPage: isNotNullish(cursor?.before),\n pageForwards: () => {\n if (cursor?.after) {\n setCursor({ cursor: cursor.after });\n }\n },\n pageBackwards: () => {\n if (cursor?.before) {\n setCursor({ cursor: cursor.before });\n }\n },\n };\n}\n\nexport {\n usePaginatedEntity,\n};\n\nexport type {\n PaginationControls,\n PaginatedQueryKey,\n UsePaginatedEntityResult,\n};\n","import { breadcrumb } from \"../../utils/logging.ts\";\nimport {\n buildUri,\n handleHttpResponse,\n QueryParams,\n PathParams,\n handleExtraHeaders,\n getCredentials,\n buildEntityRequest,\n} from \"./http.ts\";\nimport { EndpointManager } from \"../endpointManager.ts\";\nimport { PaginationHeader } from \"./pagination.ts\";\nimport { paths } from \"../versions/v6/v6Schema.ts\";\nimport { getV6EndpointManager } from \"../versions/v6/v6EndpointManager.ts\";\nimport { getV5EndpointManager } from \"../versions/v5/v5EndpointManager.ts\";\nimport { TightEnvironment } from \"../../utils/traxEnvironmentVariables.ts\";\n\n/*\n * Extend as needed for other API versions. This was written with v5 and v6 in mind.\n */\ntype EntityGetRequestBase<Paths extends string, PParams extends PathParams = undefined> = {\n path: Paths;\n pathParams?: PParams;\n params?: QueryParams;\n accessToken: string;\n pagination?: PaginationHeader;\n extraHeaders?: Record<string, string>;\n endpointManager: EndpointManager<Paths>;\n};\n\ntype V5EntityGetRequest<Paths extends string = string> = Omit<EntityGetRequestBase<Paths>, \"endpointManager\"> & {\n environment: TightEnvironment;\n};\ntype V6EntityGetRequest<PParams extends PathParams = undefined> = Omit<EntityGetRequestBase<keyof paths, PParams>, \"endpointManager\"> & {\n environment: TightEnvironment;\n};\n\ntype GetRequest<QParams extends QueryParams> = {\n url: string;\n authorization?: string; // caller expected to handle adding \"Bearer\", etc\n params?: QParams;\n showErrorAlert?: boolean;\n includeCredentials?: boolean;\n extraHeaders?: Record<string, string>;\n cache?: RequestCache;\n};\n\nasync function get<GetResponse, QParams extends QueryParams = undefined>({\n authorization,\n extraHeaders,\n includeCredentials,\n params,\n url,\n cache,\n}: GetRequest<QParams>): Promise<GetResponse> {\n const headers = handleExtraHeaders({ extraHeaders, authorization });\n const uri = buildUri({ url, params });\n const credentials = getCredentials(includeCredentials);\n\n breadcrumb(\"HTTP GET Request\", { url, accessToken: authorization });\n try {\n const response = await fetch(uri, {\n method: \"GET\",\n headers,\n credentials,\n cache,\n });\n breadcrumb(\"HTTP GET Response\", { url, status: response.status, statusText: response.statusText });\n return handleHttpResponse(response);\n } catch (error) {\n // caller should handle promise rejection\n return Promise.reject(error);\n }\n}\n\nasync function entityGet<\n GetResponse,\n Paths extends string,\n PParams extends PathParams = undefined,\n>(entityGetRequest: EntityGetRequestBase<Paths, PParams>): Promise<GetResponse> {\n const { url, headers } = buildEntityRequest(entityGetRequest);\n\n return get({\n url,\n params: entityGetRequest.params,\n includeCredentials: true,\n showErrorAlert: true,\n extraHeaders: headers,\n });\n}\n\nasync function v6EntityGet<\n GetResponse,\n PParams extends PathParams = undefined,\n>(entityGetRequest: V6EntityGetRequest<PParams>): Promise<GetResponse> {\n return entityGet({ ...entityGetRequest, endpointManager: getV6EndpointManager(entityGetRequest.environment) });\n}\n\nasync function v5EntityGet<\n GetResponse,\n Paths extends string = string,\n>(entityGetRequest: V5EntityGetRequest<Paths>): Promise<GetResponse> {\n return entityGet({ ...entityGetRequest, endpointManager: getV5EndpointManager(entityGetRequest.environment) });\n}\n\nexport {\n get,\n v5EntityGet,\n v6EntityGet,\n};\n\nexport type {\n V5EntityGetRequest,\n V6EntityGetRequest,\n};\n","import { useCallback, useMemo, useEffect } from \"react\";\n\ntype DelayedCallbackProps<T> = {\n delay: number;\n callback: (params: T) => void;\n};\n\ntype DelayedCallbackControls<T> = {\n startCallback: (params: T) => void;\n cancelCallback: () => void;\n};\n\n/**\n * Creates a delayed callback function with cleanup capabilities\n * Useful for executing callback after a delay with proper cleanup\n * @template T - The type of parameters passed to the callback\n * @param delay - Delay in milliseconds before triggering the callback\n * @param callback - Function to execute after the delay\n * @returns Object containing methods to start or cancel the delayed callback\n */\nfunction createDelayedCallback<T>({ delay, callback }: DelayedCallbackProps<T>): DelayedCallbackControls<T> {\n let timeoutId: NodeJS.Timeout | undefined;\n\n const clearPendingTimeout = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n };\n\n const startCallback = (params: T) => {\n clearPendingTimeout();\n timeoutId = setTimeout(() => {\n callback(params);\n }, delay);\n };\n\n const cancelCallback = () => clearPendingTimeout();\n\n return {\n startCallback,\n cancelCallback,\n };\n}\n\ntype UseDelayedCallbackProps<T> = {\n delay: number;\n callback: (params: T) => void;\n};\n\n/**\n * A React hook that wraps createDelayedCallback for use in React components\n * @template T - The type of parameters passed to the callback\n * @param delay - Delay in milliseconds before triggering the callback\n * @param callback - Function to execute after the delay.\n * @returns Object containing methods to start or cancel the delayed callback\n */\nfunction useDelayedCallback<T>({ delay, callback }: UseDelayedCallbackProps<T>): DelayedCallbackControls<T> {\n const delayedCallback = useMemo(\n () => createDelayedCallback({ delay, callback }),\n [delay, callback],\n );\n\n // stop any pending callback on unmount\n useEffect(() => {\n return () => {\n delayedCallback.cancelCallback();\n };\n }, [delayedCallback]);\n\n const startCallback = useCallback((params: T) => {\n delayedCallback.startCallback(params);\n }, [delayedCallback]);\n\n const cancelCallback = useCallback(() => {\n delayedCallback.cancelCallback();\n }, [delayedCallback]);\n\n return {\n startCallback,\n cancelCallback,\n };\n}\n\nexport {\n createDelayedCallback,\n useDelayedCallback,\n};\n\nexport type {\n UseDelayedCallbackProps,\n DelayedCallbackProps,\n DelayedCallbackControls,\n};\n","import { useDelayedCallback } from \"../../../utils/callback/delayedCallback.ts\";\n\ntype UseHoverPrefetchProps<T> = {\n prefetchFn: (params: T) => void;\n};\n\n/**\n * Use this hook to prefetch data when a user hovers over an element for 100ms.\n * @param param prefetchFn - The function to prefetch the data.\n * @returns a function to start the prefetch, and a function to cancel the prefetch.\n */\nfunction useHoverPrefetch<T>({ prefetchFn }: UseHoverPrefetchProps<T>) {\n const { startCallback, cancelCallback } = useDelayedCallback({\n delay: 250,\n callback: prefetchFn,\n });\n\n return {\n startPrefetch: startCallback,\n cancelPrefetch: cancelCallback,\n };\n}\n\nexport {\n useHoverPrefetch,\n};\n\nexport type {\n UseHoverPrefetchProps,\n};\n","import { components, operations } from \"../../versions/v6/v6Schema.ts\";\nimport { EntityFetchFn, useEntity } from \"../utils/useEntity.ts\";\nimport { v6EntityPost, V6EntityPostRequest } from \"../../http/post.ts\";\nimport { getV6EndpointManager } from \"../../versions/v6/v6EndpointManager.ts\";\nimport { PaginatedQueryKey, usePaginatedEntity } from \"../utils/usePaginatedEntity.ts\";\nimport { Nullable, ValueOf } from \"../../../utils/utilityTypes.ts\";\nimport { v6EntityGet, V6EntityGetRequest } from \"../../http/get.ts\";\nimport { usePrefetch } from \"../utils/usePrefetch.ts\";\nimport { useHoverPrefetch } from \"../utils/useHoverPrefetch.ts\";\nimport { EntityMutationFn } from \"../../mutations/useEntityMutation.ts\";\nimport { isNotNullish } from \"../../../utils/typeUtils.ts\";\n\n/** IMPORTANT:\n * This is the only place you should reference the API schema directly for conversation GETs/QUERY and POSTs.\n * Alias any types you need in this file, then export them.\n * This will make it easier to refactor as the API changes.\n */\n\ntype ConversationGetDto = components[\"schemas\"][\"ConversationGetDto\"];\ntype QueryConversationsParams = components[\"schemas\"][\"ConversationQueryParam\"];\ntype QueryConversationParamsNoCursor = Omit<QueryConversationsParams, \"cursor\">;\ntype QueryConversationsFilters = components[\"schemas\"][\"ConversationFilterParam\"];\ntype QueryConversationsSortParams = components[\"schemas\"][\"ConversationSort\"];\ntype QueryConversationsSortOrderByParams = components[\"schemas\"][\"ConversationSort\"][\"orderBy\"];\ntype QueryConversationsSortDirectionParams = components[\"schemas\"][\"ConversationSort\"][\"direction\"];\ntype QueryConversationsResponse = operations[\"queryConversations\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\ntype QueryConversationsSuccessResponse = Omit<QueryConversationsResponse, \"result\">;\n\ntype ConversationPostDto = components[\"schemas\"][\"ConversationPostDto\"];\ntype PostConversationResponse = operations[\"postConversations\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\ntype PostConversationParamsDto = components[\"schemas\"][\"MultiParamConversationPostDto\"];\ntype PostConversationParams = { data: Array<Partial<ValueOf<PostConversationParamsDto[\"data\"]>>> }; // don't export this, use DTO wrapper types\n\ntype ConversationsParentKey = [\"conversations\"];\ntype ConversationsBaseKey = [...ConversationsParentKey, QueryConversationParamsNoCursor];\ntype ConversationsKey = PaginatedQueryKey<ConversationsBaseKey>;\n\nconst ConversationOrderByParams: Record<NonNullable<QueryConversationsSortOrderByParams>, string> = {\n CREATED_DATE_TIME: \"CREATED_DATE_TIME\",\n SUBJECT: \"SUBJECT\",\n EMAIL: \"EMAIL\",\n LAST_MESSAGE_CREATED_DATE_TIME: \"LAST_MESSAGE_CREATED_DATE_TIME\",\n LAST_MESSAGE_TEXT: \"LAST_MESSAGE_TEXT\",\n};\n\nconst ConversationDirectionParams: Record<NonNullable<QueryConversationsSortDirectionParams>, string> = {\n ASC: \"ASC\",\n DESC: \"DESC\",\n};\n\nconst conversationsKeys = {\n base: (): ConversationsParentKey => [\"conversations\"],\n all: (): ConversationsBaseKey => [\"conversations\", {}],\n of: (params: QueryConversationParamsNoCursor): ConversationsBaseKey => [\"conversations\", params ?? {}],\n conversation: (params: GetConversationParams): ConversationKey => [\"conversations\", \"conversation\", params],\n};\n\nconst getConversations: EntityFetchFn<QueryConversationsSuccessResponse, ConversationsKey> = async (queryContext) => {\n const queryKey = queryContext.queryKey;\n const queryParams = queryKey[1];\n const cursor = queryKey[2].cursor;\n const accessToken = queryKey[3].accessToken;\n const environment = queryKey[3].environment;\n\n const params: V6EntityPostRequest<QueryConversationsParams> = {\n path: \"/v6/conversations/query\",\n bodyParams: {\n ...queryParams,\n cursor,\n },\n accessToken,\n method: \"POST\",\n endpointManager: getV6EndpointManager(environment),\n };\n\n const res = await v6EntityPost<QueryConversationsResponse, QueryConversationsParams>(params);\n return res.result === \"SUCCESS\" && res.data !== undefined\n ? { data: res.data, cursor: res.cursor }\n : { data: undefined, cursor: undefined };\n};\n\nfunction useConversations(params?: QueryConversationParamsNoCursor) {\n const queryKey = params ? conversationsKeys.of(params) : conversationsKeys.all();\n return usePaginatedEntity({ queryKey, queryFn: getConversations });\n}\n\nfunction useGetAnySingleConversation() {\n const filter: QueryConversationsFilters = {\n resolutionStatus: {\n values: [\"OPEN\", \"CLOSED\"],\n },\n };\n\n const params = {\n limit: 1,\n filter: filter,\n };\n\n return useConversations(params);\n}\n\n/** ****** Conversation singular get ****** **/\ntype GetConversationParams = operations[\"getConversation\"][\"parameters\"][\"path\"];\ntype GetConversationResponse = operations[\"getConversation\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype ConversationKey = [\"conversations\", \"conversation\", GetConversationParams];\n\ntype useSingleConversationParams = {\n id: string;\n};\n\nconst getConversation: EntityFetchFn<Nullable<ConversationGetDto>, ConversationKey> = async (queryContext) => {\n const queryKey = queryContext.queryKey;\n const { id } = queryKey[2];\n const accessToken = queryKey[3].accessToken;\n const environment = queryKey[3].environment;\n const params: V6EntityGetRequest<GetConversationParams> = {\n path: \"/v6/conversations/{id}\",\n pathParams: { id },\n accessToken,\n environment,\n };\n const res = await v6EntityGet<GetConversationResponse, GetConversationParams>(params);\n return res.result === \"SUCCESS\" && res.data !== undefined ? res.data : null;\n};\n\n/**\n * Use this hook to get the details for a single conversation.\n * @param id - The id of conversation.\n * @returns tanstack query instance with the conversation data. Does not include messages for the conversation.\n */\nfunction useSingleConversation(id: Nullable<useSingleConversationParams[\"id\"]>) {\n const hasConversationId = isNotNullish(id); // id might be null when creating a new conversation\n\n const params: GetConversationParams = { id: id ?? \"\" };\n const queryKey = conversationsKeys.conversation(params);\n return useEntity({ queryKey, queryFn: getConversation, enabled: hasConversationId });\n}\n\n/** ****** Create conversation post ****** **/\n\n/**\n * Creates a new conversation\n * @param data The conversation data\n * @param accessToken The access token for authentication\n * @param environment The environment for endpointManager\n */\nconst postConversations: EntityMutationFn<PostConversationResponse, PostConversationParams> = async ({ data, accessToken, environment }) => {\n const request: V6EntityPostRequest<PostConversationParams> = {\n path: \"/v6/conversations\",\n bodyParams: data,\n method: \"POST\",\n accessToken,\n endpointManager: getV6EndpointManager(environment),\n };\n return await v6EntityPost<PostConversationResponse, PostConversationParams>(request);\n};\n\n/**\n * Use this hook to prefetch a single conversation immediately.\n * @returns A function to start the prefetch for a single conversation given a conversation id.\n */\nfunction useInstantConversationPrefetch() {\n return usePrefetch(conversationsKeys.conversation, getConversation);\n}\n\n/**\n * Use this hook to prefetch a single conversation after a delay\n * example use: prefetch a single conversation on row hover\n * see {@link useHoverPrefetch} for more details.\n * @returns A function to start the prefetch for a single conversation given a conversation id, and a function to cancel the prefetch before the delay is over.\n */\nfunction useConversationPrefetch() {\n const prefetchFn = useInstantConversationPrefetch();\n return useHoverPrefetch<GetConversationParams>({ prefetchFn });\n}\n\nexport {\n useConversations,\n useSingleConversation,\n useGetAnySingleConversation,\n useInstantConversationPrefetch,\n useConversationPrefetch,\n ConversationOrderByParams,\n ConversationDirectionParams,\n postConversations,\n conversationsKeys,\n};\n\nexport type {\n ConversationGetDto,\n ConversationPostDto,\n QueryConversationsParams,\n QueryConversationsFilters,\n QueryConversationsSortParams,\n QueryConversationsSortOrderByParams,\n QueryConversationsSortDirectionParams,\n QueryConversationsResponse,\n PostConversationResponse,\n};\n","import { Column } from \"@tanstack/react-table\";\nimport { CSSProperties } from \"react\";\n\nfunction createColumnSizeCss<TData, TValue>(column: Column<TData, TValue>): CSSProperties {\n const size = column.getSize();\n const maxSize = column.columnDef.maxSize;\n const maxWidth = maxSize !== undefined ? `${maxSize}px` : \"auto\";\n return {\n flex: `${size} 0 auto`,\n width: size,\n maxWidth: maxWidth,\n };\n}\n\nexport {\n createColumnSizeCss,\n};\n","import { flexRender, Header } from \"@tanstack/react-table\";\nimport { createColumnSizeCss } from \"./columnSize.ts\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\n\ntype ColumnHeaderProps<TData, TValue> = {\n header: Header<TData, TValue>;\n};\n\nfunction ColumnHeader<TData, TValue>({ header }: ColumnHeaderProps<TData, TValue>) {\n const sizeStyle = createColumnSizeCss(header.column);\n return (\n <div {...stylist(ValidClassName[\"dashboard-table-column-header\"])} style={sizeStyle}>\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </div>\n );\n}\n\nexport { ColumnHeader };\n","import { HeaderGroup } from \"@tanstack/react-table\";\nimport { ColumnHeader } from \"./columnHeaders/ColumnHeader.tsx\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\nconst tableHeaderStylist = stylist(ValidClassName[\"dashboard-table-header\"], css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n paddingBlock: \"10px\",\n}));\n\ntype TableHeaderProps<TData> = {\n headerGroups: HeaderGroup<TData>[];\n};\n\nfunction TableHeader<TData>({ headerGroups }: TableHeaderProps<TData>) {\n return (\n <div>\n {headerGroups.map(headerGroup => (\n <div {...tableHeaderStylist} key={headerGroup.id}>\n {headerGroup.headers.map(header => (\n <ColumnHeader header={header} key={header.id} />\n ))}\n </div>\n ))}\n </div>\n );\n}\n\nexport { TableHeader };\n","import { PropsWithChildren } from \"react\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\nconst tableBodyStylist = stylist(ValidClassName[\"dashboard-table-body\"], css({\n display: \"flex\",\n flexDirection: \"column\",\n}));\n\ntype TableBodyProps = PropsWithChildren;\n\nfunction TableBody({ children }: TableBodyProps) {\n return (\n <div {...tableBodyStylist}>\n {children}\n </div>\n );\n}\n\nexport { TableBody };\n","import { stylist, StylistReturn } from \"../../style/stylist.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { mergeStylists } from \"../../style/mergeStylists.ts\";\n\ntype Alignment = \"vertical\" | \"horizontal\";\n\ntype DividerProps = {\n alignment?: Alignment;\n stylists?: StylistReturn[];\n};\n\nconst stylistMap: Record<Alignment, StylistReturn> = {\n /*\n tokens in panda are scoped pretty narrowly so you can only apply a borderWidths token to a border. in the case of\n this divider component, we do want to use these tokens here bc it should mimic our border styles\n */\n vertical: stylist(ValidClassName[\"vertical-divider\"], css({\n width: \"{borderWidths.md}\", // eslint-disable-line @pandacss/no-unsafe-token-fn-usage\n minWidth: \"{borderWidths.md}\", // eslint-disable-line @pandacss/no-unsafe-token-fn-usage\n height: \"100%\",\n backgroundColor: \"border.layout\",\n })),\n horizontal: stylist(ValidClassName[\"horizontal-divider\"], css({\n width: \"100%\",\n height: \"{borderWidths.md}\", // eslint-disable-line @pandacss/no-unsafe-token-fn-usage\n minHeight: \"{borderWidths.md}\", // eslint-disable-line @pandacss/no-unsafe-token-fn-usage\n backgroundColor: \"border.layout\",\n })),\n};\n\nfunction Divider({ alignment = \"vertical\", stylists = [] }: DividerProps) {\n const dividerStylist = mergeStylists([stylistMap[alignment], ...stylists]);\n return (<div {...dividerStylist} />);\n}\n\nexport { Divider };\n","import { stylist } from \"../../../style/stylist.ts\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\nimport { Divider } from \"../../layout/Divider.tsx\";\n\nconst cellDividerStylist = stylist(ValidClassName[\"table-cell-divider\"]);\n\nfunction CellDivider() {\n return <Divider stylists={[cellDividerStylist]} />;\n}\n\nexport { CellDivider };\n","import { stylist } from \"../../../style/stylist.ts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { Cell, flexRender } from \"@tanstack/react-table\";\nimport { createColumnSizeCss } from \"../columnHeaders/columnSize.ts\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\nimport { CellDivider } from \"./CellDivider.tsx\";\n\ntype TableCellProps<TData> = {\n cell: Cell<TData, unknown>;\n index: number;\n onCellClick: (cell: Cell<TData, unknown>) => void;\n isChild?: boolean;\n shouldDisplayDivider: (index: number) => boolean;\n};\n\nfunction TableCell<TData>({ cell, index, onCellClick, shouldDisplayDivider }: TableCellProps<TData>) {\n const sizeStyle = createColumnSizeCss(cell.column);\n\n const tableCellStylist = stylist(ValidClassName[\"dashboard-table-cell\"], css({\n height: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n flexDirection: \"column\",\n }));\n\n const tableCellContainerStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n height: \"100%\",\n }));\n\n const displayDivider = shouldDisplayDivider(index);\n\n const onClickHandler = () => {\n onCellClick(cell);\n };\n\n return (\n <div\n {...tableCellContainerStylist}\n style={sizeStyle}\n onClick={() => onClickHandler()}\n >\n {displayDivider && <CellDivider />}\n <div style={sizeStyle} {...tableCellStylist}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </div>\n </div>\n );\n}\n\nexport { TableCell };\n","import { Cell, Row } from \"@tanstack/react-table\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { TableCell } from \"./cells/TableCell.tsx\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\nconst tableSubRowStylist = stylist(ValidClassName[\"table-sub-row\"], css({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-start\",\n height: \"60px\",\n overflow: \"hidden\",\n minWidth: \"fit-content\",\n borderRadius: \"zero\",\n}));\n\ntype TableSubRowProps<TData> = {\n rowData: Row<TData>;\n onCellClick: (cell: Cell<TData, unknown>) => void;\n shouldDisplayDivider: (index: number) => boolean;\n};\n\nfunction TableSubRow<TData>({ rowData, onCellClick, shouldDisplayDivider }: TableSubRowProps<TData>) {\n const cellData = rowData.getVisibleCells();\n return (\n <div {...tableSubRowStylist}>\n {cellData.map((cell, index) => {\n return (\n <TableCell<TData>\n cell={cell}\n key={cell.id}\n index={index}\n onCellClick={onCellClick}\n shouldDisplayDivider={shouldDisplayDivider}\n isChild\n />\n );\n })}\n </div>\n );\n}\n\nexport { TableSubRow };\n","import { Cell, Row } from \"@tanstack/react-table\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { TableCell } from \"./cells/TableCell.tsx\";\nimport { TableSubRow } from \"./TableSubRow.tsx\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\nconst parentTableRowCss = css({\n display: \"flex\",\n flexDirection: \"column\",\n borderRadius: \"zero\",\n cursor: \"pointer\",\n minWidth: \"fit-content\",\n});\n\nconst evenTableRowCss = css({\n background: \"surface.background\",\n});\n\nconst tableRowStylist = stylist(ValidClassName[\"table-row\"], css({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-start\",\n height: \"60px\",\n minWidth: \"fit-content\",\n}));\n\ntype TableRowProps<TData> = {\n rowData: Row<TData>;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n onCellClick: (cell: Cell<TData, unknown>) => void;\n shouldDisplayDivider: (index: number) => boolean;\n};\n\nfunction TableRow<TData>({ rowData, onMouseEnter, onMouseLeave, onCellClick, shouldDisplayDivider }: TableRowProps<TData>) {\n const isExpanded = rowData.getIsExpanded();\n const tableParentRowStylist = stylist(ValidClassName[\"table-parent-row\"], parentTableRowCss, rowData.index % 2 === 0 ? evenTableRowCss : undefined);\n const cellData = rowData.getVisibleCells();\n return (\n <div\n {...tableParentRowStylist}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n <div {...tableRowStylist}>\n {cellData.map((cell, index) => (\n <TableCell<TData>\n cell={cell}\n key={cell.id}\n index={index}\n onCellClick={onCellClick}\n shouldDisplayDivider={shouldDisplayDivider}\n />\n ))}\n </div>\n {isExpanded && (\n <div>\n {rowData.subRows.map(subRow => (\n <TableSubRow<TData>\n rowData={subRow}\n key={subRow.id}\n onCellClick={onCellClick}\n shouldDisplayDivider={shouldDisplayDivider}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport { TableRow };\n","import { useGlobalStore } from \"../../store/globalStore.ts\";\nimport { DrawerNavigationSlice } from \"../../store/drawerNavigation.ts\";\n\nconst openDrawer: DrawerNavigationSlice[\"openDrawer\"] = (name, options = {}) => {\n useGlobalStore.getState().openDrawer(name, options);\n};\n\nconst closeAllDrawers: DrawerNavigationSlice[\"closeAllDrawers\"] = () => {\n useGlobalStore.getState().closeAllDrawers();\n};\n\nconst closeDrawer: DrawerNavigationSlice[\"closeDrawer\"] = () => {\n useGlobalStore.getState().closeDrawer();\n};\n\nexport {\n openDrawer,\n closeAllDrawers,\n closeDrawer,\n};\n","import { EntityFetchFn, useEntity } from \"../utils/useEntity.ts\";\nimport { PaginatedQueryKey, usePaginatedEntity } from \"../utils/usePaginatedEntity.ts\";\nimport { v6EntityPost, V6EntityPostRequest } from \"../../http/post.ts\";\nimport { v6EntityGet, V6EntityGetRequest } from \"../../http/get.ts\";\nimport { components, operations } from \"../../versions/v6/v6Schema.ts\";\nimport { getV6EndpointManager } from \"../../versions/v6/v6EndpointManager.ts\";\nimport { Nullable } from \"../../../utils/utilityTypes.ts\";\nimport { usePrefetch } from \"../utils/usePrefetch.ts\";\nimport { useHoverPrefetch } from \"../utils/useHoverPrefetch.ts\";\n\n/** IMPORTANT:\n * This is the only place you should reference the API schema directly for bank transaction GETs/QUERY.\n * Alias any types you need in this file, then export them.\n * This will make it easier to refactor as the API changes.\n */\n\ntype ChildBankTransaction = components[\"schemas\"][\"BankTransactionChildGetDto\"];\ntype BankTransaction = components[\"schemas\"][\"BankTransactionGetDto\"];\n\n/** QUERIES **/\n\n/** ****** Bank transaction plural get ****** **/\ntype QueryBankTransactionsParams = components[\"schemas\"][\"BankTransactionsGetParam\"];\ntype QueryBankTransactionParamsNoCursor = Omit<QueryBankTransactionsParams, \"cursor\">;\ntype QueryBankTransactionsResponse = components[\"schemas\"][\"PaginatedResponseBankTransactionGetDto\"];\ntype QueryBankTransactionsSuccessResponse = Omit<QueryBankTransactionsResponse, \"result\" | \"error\">;\ntype QueryBankTransactionsFilters = components[\"schemas\"][\"BankTransactionsFilterParam\"];\ntype QueryBankTransactionsSortParams = QueryBankTransactionsParams[\"sort\"];\ntype QueryBankTransactionsSortOrderByParams = components[\"schemas\"][\"BankTransactionsSort\"][\"orderBy\"];\ntype QueryBankTransactionsSortDirectionParams = components[\"schemas\"][\"BankTransactionsSort\"][\"direction\"];\n\ntype CategoryExpanded = components[\"schemas\"][\"CategoryExpanded\"];\ntype BankAccountExpanded = components[\"schemas\"][\"BankAccountExpanded\"];\ntype GlAccountExpanded = components[\"schemas\"][\"GlAccountExpanded\"];\ntype MatchingBankTransactionExpanded = components[\"schemas\"][\"MatchingBankTransactionExpanded\"];\ntype MatchingBankTransactionApiName = Extract<NonNullable<MatchingBankTransactionExpanded>[\"apiName\"], string>;\ntype BankTransactionTaxInfo = NonNullable<components[\"schemas\"][\"TaxPaymentFields\"]>;\n\nconst BankTransactionOrderByParams: Record<NonNullable<QueryBankTransactionsSortOrderByParams>, string> = {\n DATE: \"DATE\",\n DESCRIPTION: \"DESCRIPTION\",\n AMOUNT: \"AMOUNT\",\n STATUS: \"STATUS\",\n REVIEW_STATUS: \"REVIEW_STATUS\",\n};\n\nconst BankTransactionDirectionParams: Record<NonNullable<QueryBankTransactionsSortDirectionParams>, string> = {\n ASC: \"ASC\",\n DESC: \"DESC\",\n};\n\ntype QueryBankTransactionsParentKey = [\n \"banks\",\n \"transactions\",\n];\n\ntype QueryBankTransactionsBaseKey = [\n \"banks\",\n \"transactions\",\n QueryBankTransactionParamsNoCursor,\n];\n\nconst bankTransactionKeys = {\n base: (): QueryBankTransactionsParentKey => [\"banks\", \"transactions\"],\n all: (): QueryBankTransactionsBaseKey => [\"banks\", \"transactions\", {}],\n of: (params: QueryBankTransactionParamsNoCursor): QueryBankTransactionsBaseKey => [\"banks\", \"transactions\", params ?? {}],\n single: (params: GetBankTransactionParams): GetBankTransactionKey => [\"banks\", \"transactions\", params.id],\n};\n\ntype BankTransactionsKey = PaginatedQueryKey<QueryBankTransactionsBaseKey>;\n\nconst queryBankTransactions: EntityFetchFn<QueryBankTransactionsSuccessResponse, BankTransactionsKey> = async (queryContext) => {\n const queryKey = queryContext.queryKey;\n const queryParams = queryKey[2];\n const cursor = queryKey[3].cursor;\n const accessToken = queryKey[4].accessToken;\n const environment = queryKey[4].environment;\n const params: V6EntityPostRequest<QueryBankTransactionsParams> = {\n path: \"/v6/banks/transactions/query\",\n bodyParams: {\n ...queryParams,\n cursor,\n },\n method: \"POST\",\n accessToken,\n endpointManager: getV6EndpointManager(environment),\n };\n const res = await v6EntityPost<QueryBankTransactionsResponse, QueryBankTransactionsParams>(params);\n return res.result === \"SUCCESS\" && res.data !== undefined\n ? { data: res.data, cursor: res.cursor }\n : { data: undefined, cursor: undefined };\n};\n\nfunction useBankTransactions(params: QueryBankTransactionParamsNoCursor) {\n const queryKey = bankTransactionKeys.of(params);\n return usePaginatedEntity({ queryKey, queryFn: queryBankTransactions });\n}\n\n/** ****** Bank transaction singular get ****** **/\ntype GetBankTransactionParams = operations[\"getBankTransaction\"][\"parameters\"][\"path\"];\ntype GetBankTransactionResponse = operations[\"getBankTransaction\"][\"responses\"][200][\"content\"][\"application/json\"];\n\ntype GetBankTransactionKey = [\n \"banks\",\n \"transactions\",\n bankTransactionId: string,\n];\n\nconst getBankTransaction: EntityFetchFn<Nullable<BankTransaction>, GetBankTransactionKey> = async (queryContext) => {\n const queryKey = queryContext.queryKey;\n const bankTransactionId = queryKey[2];\n const accessToken = queryKey[3].accessToken;\n const environment = queryKey[3].environment;\n const params: V6EntityGetRequest<GetBankTransactionParams> = {\n path: \"/v6/banks/transactions/{id}\",\n pathParams: { id: bankTransactionId },\n accessToken,\n environment,\n };\n const res = await v6EntityGet<GetBankTransactionResponse, GetBankTransactionParams>(params);\n return res.result === \"SUCCESS\" && res.data !== undefined ? res.data : null;\n};\n\ntype useSingleBankTransactionParams = {\n id: string;\n};\n\n/**\n * Use this hook to get a single bank transaction.\n * @param id - The id of the bank transaction to get.\n * @param enabled - Whether to execute a query.\n * @returns tanstack query instance with the bank transaction data.\n */\nfunction useSingleBankTransaction({ id }: useSingleBankTransactionParams) {\n const queryKey = bankTransactionKeys.single({ id });\n return useEntity({ queryKey, queryFn: getBankTransaction });\n}\n\n/**\n * Use this hook to prefetch a single bank transaction immediately.\n * @returns A function to start the prefetch for a single bank transaction given a bank transaction id.\n */\nfunction useInstantBankTransactionPrefetch() {\n return usePrefetch(bankTransactionKeys.single, getBankTransaction);\n}\n\n/**\n * Use this hook to prefetch a single bank transaction after a delay\n * example use: prefetch a single bank transaction on row hover\n * see {@link useHoverPrefetch} for more details.\n * @returns A function to start the prefetch for a single bank transaction given a bank transaction id, and a function to cancel the prefetch before the delay is over.\n */\nfunction useBankTransactionPrefetch() {\n const prefetchFn = useInstantBankTransactionPrefetch();\n return useHoverPrefetch<GetBankTransactionParams>({ prefetchFn });\n}\n\nexport {\n useBankTransactions,\n useSingleBankTransaction,\n useInstantBankTransactionPrefetch,\n useBankTransactionPrefetch,\n bankTransactionKeys,\n BankTransactionOrderByParams,\n BankTransactionDirectionParams,\n};\n\nexport type {\n BankTransaction,\n ChildBankTransaction,\n QueryBankTransactionsParams,\n QueryBankTransactionsFilters,\n QueryBankTransactionsSortParams,\n QueryBankTransactionsSortOrderByParams,\n QueryBankTransactionsSortDirectionParams,\n QueryBankTransactionParamsNoCursor,\n GetBankTransactionParams,\n CategoryExpanded,\n BankAccountExpanded,\n GlAccountExpanded,\n MatchingBankTransactionExpanded,\n MatchingBankTransactionApiName,\n BankTransactionTaxInfo,\n};\n","import { Nullable, ValueOf } from \"../utils/utilityTypes.ts\";\nimport { isNullishOrEmptyOrBlank } from \"../utils/string/stringUtils.ts\";\n\nconst EntityIdPrefixMap = {\n COMPANY: \"co\",\n EMPLOYEE: \"emp\",\n CLASS_SEGMENT: \"cls\",\n CLASS_LABEL: \"cll\",\n CUSTOMER: \"cus\",\n BANK_ACCOUNT: \"bka\",\n GL_ACCOUNT: \"gla\",\n TRANSACTION_CATEGORY: \"ctg\",\n BANK_TRANSACTION: \"btxn\",\n PROCESSOR_TRANSACTION: \"ptxn\",\n TRANSACTION_LINE_ITEM: \"tli\",\n VENDOR: \"vnd\",\n TRANSACTION_RULE: \"trl\",\n INVOICE: \"inv\",\n INVOICE_LINE_ITEM: \"ili\",\n BILL: \"bll\",\n BILL_LINE_ITEM: \"bli\",\n PAYROLL: \"prl\",\n PAYROLL_LINE_ITEM: \"pli\",\n FINANCIAL_SUMMARY: \"fsm\",\n TASK: \"tsk\",\n CONVERSATION: \"cnv\",\n MESSAGE: \"msg\",\n REACTION: \"rct\",\n BUSINESS_TYPE: \"bzt\",\n TEMPLATE_CLASS_LABEL: \"tcll\",\n TEMPLATE_COA: \"tcoa\",\n TEMPLATE_GL_ACCOUNT: \"tgla\",\n TEMPLATE_TRANSACTION_RULES: \"ttrl\",\n MANUAL_JOURNAL_ENTRY: \"mje\",\n ASSET: \"ast\",\n ASSET_DEPRECIATION: \"asd\",\n EXPENSE_AMORTIZATION: \"exa\",\n REVENUE_RECOGNITION: \"rvr\",\n GL_TRANSACTION: \"glt\",\n ATTACHMENT: \"att\",\n CAR: \"car\",\n MILEAGE: \"mlg\",\n INTEGRATION: \"int\",\n TIME: \"tme\",\n TIME_TYPE: \"tmt\",\n TAX_RETURN: \"txr\",\n} as const;\n\ntype EntityIdPrefixMap = ValueOf<typeof EntityIdPrefixMap>;\nfunction checkEntityPrefix(entityId: Nullable<string>, prefix: EntityIdPrefixMap): boolean {\n if (isNullishOrEmptyOrBlank(entityId)) {\n return false;\n }\n return entityId.startsWith(prefix);\n}\nexport { EntityIdPrefixMap, checkEntityPrefix };\n","import { components, operations } from \"../../versions/v6/v6Schema.ts\";\nimport { EntityFetchFn, useEntity } from \"../utils/useEntity.ts\";\nimport { v6EntityGet, V6EntityGetRequest } from \"../../http/get.ts\";\nimport { Nullable } from \"../../../utils/utilityTypes.ts\";\nimport { EntityMutationFn } from \"../../mutations/useEntityMutation.ts\";\nimport { isNotNullish, isNullish } from \"../../../utils/typeUtils.ts\";\nimport { v6EntityPost, V6EntityPostRequest } from \"../../http/post.ts\";\nimport { getV6EndpointManager } from \"../../versions/v6/v6EndpointManager.ts\";\nimport { usePrefetch } from \"../utils/usePrefetch.ts\";\nimport { useHoverPrefetch } from \"../utils/useHoverPrefetch.ts\";\n\n/** IMPORTANT:\n * This is the only place you should reference the API schema directly for message GETs/QUERY and POSTs.\n * Alias any types you need in this file, then export them.\n * This will make it easier to refactor as the API changes.\n */\n\ntype QueryMessagesResponse = components[\"schemas\"][\"PaginatedResponseMessageGetDto\"];\ntype MessageGetDto = components[\"schemas\"][\"MessageGetDto\"];\n\ntype GetMessagesParam = operations[\"getMessages\"][\"parameters\"][\"path\"];\ntype MessageParentKey = [\"messages\"];\ntype MessageKey = [...MessageParentKey, GetMessagesParam];\n\ntype MessagePostDto = components[\"schemas\"][\"MessagePostDto\"];\ntype CreateMessageResponse = components[\"schemas\"][\"MultiResponseMessageGetDto\"];\ntype CreateMessageParams = components[\"schemas\"][\"MultiParamMessagePostDto\"];\n\n// TODO: Add paginated key once true API available\nconst messagesKeys = {\n all: (): MessageParentKey => [\"messages\"],\n of: (params: GetMessagesParam): MessageKey => [\"messages\", params],\n};\n\nfunction groupMessages(messages: Nullable<MessageGetDto[]>) {\n if (isNullish(messages) || messages.length === 0) {\n return null;\n }\n\n const groupedMessages: MessageGetDto[][] = [[messages[0]]];\n\n for (let i = 1; i < messages.length; i++) {\n const currentMessage = messages[i];\n const lastGroup = groupedMessages[groupedMessages.length - 1];\n const lastGroupUserId = lastGroup[0].author.userId;\n\n if (currentMessage.author.userId === lastGroupUserId) {\n lastGroup.push(currentMessage);\n } else {\n groupedMessages.push([currentMessage]);\n }\n }\n\n return groupedMessages;\n}\n\nconst getMessages: EntityFetchFn<Nullable<MessageGetDto[]>, MessageKey> = async (queryContext) => {\n const queryKey = queryContext.queryKey;\n const { id } = queryKey[1];\n const accessToken = queryKey[2].accessToken;\n const environment = queryKey[2].environment;\n\n const params: V6EntityGetRequest<GetMessagesParam> = {\n path: \"/v6/conversations/{id}/messages\",\n pathParams: { id },\n accessToken,\n environment,\n };\n\n const res = await v6EntityGet<QueryMessagesResponse, GetMessagesParam>(params);\n return res.result === \"SUCCESS\" && res.data !== undefined ? res.data : null;\n};\n\nfunction useMessages(conversationId: Nullable<GetMessagesParam[\"id\"]>) {\n const hasConversationId = isNotNullish(conversationId); // id might be null when creating a new conversation\n\n const queryKey = messagesKeys.of({ id: conversationId ?? \"\" });\n return useEntity({ queryKey, queryFn: getMessages, select: groupMessages, enabled: hasConversationId });\n}\n\n/**\n * Creates a new message in a conversation\n * @param data The message data containing conversationId and text\n * @param accessToken The access token for authentication\n * @param environment The environment used for the endpoint manager\n */\nconst createMessage: EntityMutationFn<CreateMessageResponse, MessagePostDto> = async ({ data, accessToken, environment }) => {\n const request: V6EntityPostRequest<CreateMessageParams> = {\n path: \"/v6/messages\",\n bodyParams: { data: [data] },\n method: \"POST\",\n endpointManager: getV6EndpointManager(environment),\n accessToken,\n };\n return await v6EntityPost<CreateMessageResponse, CreateMessageParams>(request);\n};\n\n/**\n * Use this hook to prefetch messages from a conversation immediately.\n * @returns A function to start the prefetch for messages given a conversation id.\n */\nfunction useInstantMessagePrefetch() {\n return usePrefetch(messagesKeys.of, getMessages);\n}\n\n/**\n * Use this hook to prefetch messages for a specific conversation after a delay\n * example use: prefetch messages for a single conversation on row hover\n * see {@link useHoverPrefetch} for more details.\n * @returns A function to start the prefetch for messages given a conversation id, and a function to cancel the prefetch before the delay is over.\n */\nfunction useMessagesPrefetch() {\n const prefetchFn = useInstantMessagePrefetch();\n return useHoverPrefetch<GetMessagesParam>({ prefetchFn });\n}\n\nexport {\n useMessages,\n createMessage,\n useMessagesPrefetch,\n messagesKeys,\n};\n\nexport type {\n MessageGetDto,\n MessagePostDto,\n CreateMessageResponse,\n};\n","import { TableRow } from \"../TableRow.tsx\";\nimport { Row } from \"@tanstack/react-table\";\nimport { ConversationGetDto, useConversationPrefetch } from \"../../../query/fetches/conversations/conversations.ts\";\nimport { openDrawer } from \"../../drawer/drawer.ts\";\nimport { isNotNullish } from \"../../../utils/typeUtils.ts\";\nimport {\n useBankTransactionPrefetch,\n} from \"../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { useCallback } from \"react\";\nimport { Nullable } from \"../../../utils/utilityTypes.ts\";\nimport { checkEntityPrefix, EntityIdPrefixMap } from \"../../../entities/entityIdPrefixMap.ts\";\nimport { useMessagesPrefetch } from \"../../../query/fetches/conversations/messages.ts\";\n\ntype ConversationsTableRowProps = {\n rowData: Row<ConversationGetDto>;\n};\n\nfunction openConversationDrawer(conversationId: ConversationGetDto[\"id\"]) {\n openDrawer(\n \"Conversation\",\n { routeProps: { conversationId: conversationId } },\n );\n}\n\nfunction openBankTransactionDrawer(bankTransactionId: string) {\n openDrawer(\n \"BankTransactionFormRouter\",\n { routeProps: { transactionId: bankTransactionId, initialTab: \"conversation\" } },\n );\n}\n\nconst onCellClickHandler = (id: ConversationGetDto[\"id\"], attachedEntityId: Nullable<string>, hasBankTransactionPrefix: boolean) => {\n if (isNotNullish(attachedEntityId) && hasBankTransactionPrefix) {\n openBankTransactionDrawer(attachedEntityId);\n } else {\n openConversationDrawer(id);\n }\n};\n\nfunction ConversationsTableRow({ rowData }: ConversationsTableRowProps) {\n const { startPrefetch: conversationStartPrefetch, cancelPrefetch: conversationCancelPrefetch } = useConversationPrefetch();\n const { startPrefetch: messagesStartPrefetch, cancelPrefetch: messagesCancelPrefetch } = useMessagesPrefetch();\n const { startPrefetch: bankTransactionStartPrefetch, cancelPrefetch: bankTransactionCancelPrefetch } = useBankTransactionPrefetch();\n const hasBankTransactionPrefix = checkEntityPrefix(rowData.original.attachedEntityId, EntityIdPrefixMap.BANK_TRANSACTION);\n\n const onMouseEnter = useCallback(() => {\n if (isNotNullish(rowData.original.attachedEntityId) && hasBankTransactionPrefix) {\n bankTransactionStartPrefetch({ id: rowData.original.attachedEntityId });\n }\n messagesStartPrefetch({ id: rowData.original.id });\n conversationStartPrefetch({ id: rowData.original.id });\n }, [rowData.original.attachedEntityId, rowData.original.id, hasBankTransactionPrefix, messagesStartPrefetch, conversationStartPrefetch, bankTransactionStartPrefetch]);\n\n const onMouseLeave = useCallback(() => {\n if (isNotNullish(rowData.original.attachedEntityId) && hasBankTransactionPrefix) {\n bankTransactionCancelPrefetch();\n }\n messagesCancelPrefetch();\n conversationCancelPrefetch();\n }, [bankTransactionCancelPrefetch, conversationCancelPrefetch, hasBankTransactionPrefix, messagesCancelPrefetch, rowData.original.attachedEntityId]);\n\n return (\n <TableRow<ConversationGetDto>\n rowData={rowData}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n shouldDisplayDivider={index => index !== 0}\n onCellClick={() => onCellClickHandler(rowData.original.id, rowData.original.attachedEntityId, hasBankTransactionPrefix)}\n />\n );\n}\n\nexport { ConversationsTableRow };\n","import * as React from \"react\";\nconst SvgPlus = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 15, height: 15, viewBox: \"0 0 15 15\", fill: \"none\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M0.328064 7.5H14.6719\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M7.5 0.328064V14.6719\", strokeMiterlimit: 10 }));\nexport default SvgPlus;\n","import IconComponent from \"../../../assets/icons/plus.svg?react\";\nimport { createIcon } from \"../createIcon\";\n\nconst Plus = createIcon(IconComponent, \"Plus\");\n\nexport { Plus };\n","import { ButtonBase, ButtonBaseWrapperProps } from \"./ButtonBase\";\nimport { stylist } from \"../../style/stylist\";\nimport { ValidClassName } from \"../../style/validClassNames\";\nimport { buttonPrimaryStyle } from \"../../style/buttons.ts\";\n\nconst primaryButtonStylist = stylist(\n ValidClassName[\"button-primary\"],\n buttonPrimaryStyle,\n);\n\nfunction ButtonPrimary({ children, active, stylists = [], ...props }: ButtonBaseWrapperProps) {\n return (\n <ButtonBase\n stylists={[primaryButtonStylist, ...stylists]}\n active={active}\n {...props}\n >\n {children}\n </ButtonBase>\n );\n}\n\nexport { ButtonPrimary };\n","import { SmallIcon } from \"../../icon/SmallIcon.tsx\";\nimport { Plus } from \"../../icon/icons/Plus.tsx\";\nimport { ButtonPrimary } from \"../../inputs/ButtonPrimary.tsx\";\nimport { openDrawer } from \"../../drawer/drawer.ts\";\n\nconst handleClick = () => {\n openDrawer(\n \"Conversation\",\n { routeProps: { conversationId: null } },\n );\n};\n\nfunction AddConversationButton() {\n return (\n <ButtonPrimary onClick={handleClick}>\n <SmallIcon Component={Plus} />\n </ButtonPrimary>\n );\n}\n\nexport { AddConversationButton };\n","import { PropsWithChildren } from \"react\";\nimport { css } from \"../../../../../styled-system/css\";\nimport { stylist } from \"../../../../style/stylist.ts\";\n\ntype ConversationControlsLayoutProps = PropsWithChildren;\n\nconst controlsLayoutStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n gap: \"5px\",\n}));\n\nfunction ConversationControlsLayout({ children }: ConversationControlsLayoutProps) {\n return (\n <div {...controlsLayoutStylist}>\n {children}\n </div>\n );\n}\n\nexport { ConversationControlsLayout };\n","import { cva, RecipeVariant } from \"../../../styled-system/css\";\n\nconst tableCss = cva({\n base: {\n display: \"flex\",\n flexDirection: \"column\",\n flexGrow: 1,\n animation: \"appear.instant\",\n overflow: \"hidden\",\n },\n variants: {\n dashboard: {\n transactionDashboard: {\n border: \"none\",\n },\n businessOwnerDashboard: {\n marginTop: \"10px\",\n border: \"{borderWidths.lg} solid {colors.border.layout.strong}\",\n borderRadius: \"lg\",\n },\n },\n },\n});\n\ntype DashboardTableVariant = RecipeVariant<typeof tableCss>[\"dashboard\"];\n\nexport { tableCss };\nexport type { DashboardTableVariant };\n","import { stylist } from \"../../style/stylist.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { DashboardTableVariant, tableCss } from \"./tableStyles.ts\";\nimport { PropsWithChildren } from \"react\";\n\ntype TransactionsTableLayoutProps = PropsWithChildren<{\n dashboard: DashboardTableVariant;\n}>;\n\nfunction TableLayout({ children, dashboard }: TransactionsTableLayoutProps) {\n const tableStylist = stylist(ValidClassName[\"dashboard-table\"], tableCss({ dashboard }));\n return (\n <div {...tableStylist}>\n {children}\n </div>\n );\n}\n\nexport { TableLayout };\n","import { createContext, PropsWithChildren } from \"react\";\nimport { QueryBankTransactionsSortParams } from \"../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { Nullable } from \"../../utils/utilityTypes.ts\";\nimport { QueryConversationsSortParams } from \"../../query/fetches/conversations/conversations.ts\";\n\ntype QuerySortParams = QueryConversationsSortParams | QueryBankTransactionsSortParams | undefined;\n\ntype SortingContextValue = PropsWithChildren<{\n sortInstance: QuerySortParams;\n setSortInstance: (sort: QuerySortParams) => void;\n}>;\n\nconst SortingContext = createContext<Nullable<SortingContextValue>>(null);\n\nexport { SortingContext };\n\nexport type { QuerySortParams };\n","const CONVERSATIONS_TABLE_COLS = {\n FROM: \"from\",\n SUBJECT: \"subject\",\n MESSAGE: \"message\",\n DATE: \"date\",\n} as const;\n\nexport {\n CONVERSATIONS_TABLE_COLS,\n};\n","import { isNullishOrEmptyOrBlank } from \"../../utils/string/stringUtils.ts\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { ellipsisTextRaw } from \"../../style/text.ts\";\nimport { cva } from \"../../../styled-system/css\";\n\ntype LabelProps = {\n children?: string;\n intent?: \"default\" | \"primary\" | \"contrast\";\n wrap?: \"ellipsis\" | \"wrap\";\n};\n\nconst labelRecipe = cva({\n base: { fontWeight: \"label\", fontSize: \"label\", fontFamily: \"label\", lineHeight: \"16px\", letterSpacing: \"0.84px\", maxWidth: \"100%\" },\n variants: {\n intent: {\n default: { color: \"typography.label\" },\n primary: { color: \"typography.intent.primary\" },\n contrast: { color: \"typography.contrast\" },\n },\n wrap: {\n ellipsis: ellipsisTextRaw,\n wrap: { whiteSpace: \"normal\", overflowWrap: \"break-word\" },\n },\n },\n});\n\nfunction Label({ children, intent = \"default\", wrap = \"ellipsis\" }: LabelProps) {\n const labelStylist = stylist(ValidClassName[\"label\"], labelRecipe({ intent, wrap }));\n if (isNullishOrEmptyOrBlank(children)) {\n return null;\n }\n return (\n <div {...labelStylist}>\n {children}\n </div>\n );\n}\n\nexport { Label };\n","import { Text } from \"./Text.tsx\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\nconst emphasisLabelStylist = stylist(ValidClassName[\"emphasis-label\"], css({\n lineHeight: \"16px\",\n}));\n\nfunction EmphasisLabel({ children }: { children?: string }) {\n return (\n <Text size=\"med\" weight=\"lg\" stylists={[emphasisLabelStylist]}>\n {children}\n </Text>\n );\n}\n\nexport { EmphasisLabel };\n","import { Label } from \"../../../typography/Label.tsx\";\nimport { EmphasisLabel } from \"../../../typography/EmphasisLabel.tsx\";\n\ntype ConversationTextCellProps = {\n text: string;\n isRead: boolean;\n};\n\nfunction ConversationTextCell({ text, isRead }: ConversationTextCellProps) {\n return (isRead\n ? <Label>{text}</Label>\n : <EmphasisLabel>{text}</EmphasisLabel>\n );\n}\n\nexport { ConversationTextCell };\n","import { PropsWithChildren } from \"react\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { cva } from \"../../../../styled-system/css\";\n\ntype TableCellLayoutProps = PropsWithChildren<{\n alignVariant?: \"flexStart\" | \"center\";\n}>;\n\nconst tableCellLayoutRecipe = cva({\n base: {\n padding: \"0 25px\",\n height: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n flexDirection: \"column\",\n width: \"100%\",\n },\n variants: {\n alignVariant: {\n flexStart: { alignItems: \"flex-start\" },\n center: { alignItems: \"center\" },\n },\n },\n defaultVariants: {\n alignVariant: \"flexStart\",\n },\n});\n\nfunction TableCellLayout({ children, alignVariant = \"flexStart\" }: TableCellLayoutProps) {\n const tableCellLayoutStylist = stylist(null, tableCellLayoutRecipe({ alignVariant }));\n\n return (\n <div {...tableCellLayoutStylist}>\n {children}\n </div>\n );\n}\n\nexport { TableCellLayout };\n","import { getConversationDateTimeString } from \"../../../../utils/date/date.ts\";\nimport { ConversationTextCell } from \"./ConversationTextCell.tsx\";\n\ntype ConversationDateCellProps = {\n date: string;\n isRead?: boolean;\n};\n\nfunction ConversationDateCell({ date, isRead = false }: ConversationDateCellProps) {\n const dateTimeString = getConversationDateTimeString(date);\n return <ConversationTextCell text={dateTimeString} isRead={isRead} />;\n}\n\nexport { ConversationDateCell };\n","import { Text } from \"./Text.tsx\";\nimport { stylist, StylistReturn } from \"../../style/stylist.ts\";\nimport { isNullishOrEmptyOrBlank } from \"../../utils/string/stringUtils.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { fontRecipes } from \"../../style/recipes/fontRecipes.ts\";\n\nconst strongSubLabelStylist = stylist(ValidClassName[\"strong-sub-label\"],\n fontRecipes({ label: \"strongSubLabel\" }),\n);\n\nfunction StrongSubLabel({ children, stylists = [] }: { children?: string; stylists?: StylistReturn[] }) {\n if (isNullishOrEmptyOrBlank(children)) {\n return null;\n }\n return (\n <Text size=\"sm\" weight=\"med\" stylists={[strongSubLabelStylist, ...stylists]}>\n {children}\n </Text>\n );\n}\n\nexport { StrongSubLabel };\n","import { UsePopupReturn } from \"./hooks/usePopup.ts\";\nimport { createContext } from \"react\";\nimport { Nullable } from \"../../utils/utilityTypes.ts\";\n\ntype TPopupContext = Nullable<(UsePopupReturn & {\n blockInteraction: boolean;\n popupParentNodeId: Nullable<string>;\n})>;\n\nconst PopupContext = createContext<TPopupContext>(null);\n\nexport {\n PopupContext,\n};\n","import { css } from \"../../../../styled-system/css\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\n\nconst POPUP_LIST_MAX_HEIGHT = 314;\nconst popupListCss = css({\n overflow: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n width: \"325px\",\n // eslint-disable-next-line @pandacss/no-dynamic-styling\n maxHeight: `${POPUP_LIST_MAX_HEIGHT}px`, // TODO: handle without JS var\n minWidth: \"325px\",\n \"&:focus, &:focus-within\": {\n outline: \"none\", // none prevents browser-default from appearing on focus\n },\n scrollbar: \"hidden\",\n});\n\nconst POPUP_ROW_MIN_HEIGHT = 35;\nconst popupRowStylist = stylist(ValidClassName[\"selector-row\"], css({\n borderRadius: \"zero\",\n backgroundColor: \"surface.intent.action.discrete\",\n boxShadow: \"none\",\n border: \"{borderWidths.md} solid\",\n borderColor: \"border.layout\",\n display: \"flex\",\n width: \"100%\",\n // eslint-disable-next-line @pandacss/no-dynamic-styling\n minHeight: `${POPUP_ROW_MIN_HEIGHT}px`, // TODO: handle without JS var\n height: \"fit-content\",\n padding: \"10px\",\n alignItems: \"flex-start\",\n gap: \"9px\",\n flexShrink: 0,\n textAlign: \"start\",\n cursor: \"pointer\",\n\n \"&[data-focused='true']\": {\n boxShadow: \"none\",\n outline: \"none\",\n backgroundColor: \"surface.intent.action.discrete.hover\",\n },\n}));\n\nexport {\n popupRowStylist,\n popupListCss,\n POPUP_LIST_MAX_HEIGHT,\n POPUP_ROW_MIN_HEIGHT,\n};\n","import { useState } from \"react\";\n\ntype ControlledReturn<S> = [S, (value: S) => void];\n\nfunction useControlledState<S>(initialValue: (() => S) | S, controlledValue?: S, handleControlledValueChange?: (value: S) => void): ControlledReturn<S> {\n const [uncontrolledValue, setUncontrolledValue] = useState(initialValue);\n\n const value = controlledValue ?? uncontrolledValue;\n const handleValueChange = handleControlledValueChange ?? setUncontrolledValue;\n\n return [value, handleValueChange];\n}\n\nexport {\n useControlledState,\n};\n","import type { PropsWithChildren } from \"react\";\nimport { FloatingTree, useFloatingParentNodeId } from \"@floating-ui/react\";\n\n/**\n * A utility component for automatically creating cascading popup trees.\n * This should not be used to create a new popup. Use {@link PopupManager} instead.\n * @param children - The popup content\n * @constructor\n */\nfunction PopupTree({ children }: PropsWithChildren) {\n const parentNodeId = useFloatingParentNodeId();\n\n // if not within a parent node already, this is a popup root, and a tree should be created\n if (parentNodeId === null) {\n return (\n <FloatingTree>\n {children}\n </FloatingTree>\n );\n }\n return children;\n}\n\nexport { PopupTree };\n","import { PropsWithChildren } from \"react\";\nimport { PopupContext } from \"./PopupContext.tsx\";\nimport { PopupOptions } from \"./config/popupOptions.ts\";\nimport { usePopup } from \"./hooks/usePopup.ts\";\nimport { FloatingNode, useFloatingParentNodeId } from \"@floating-ui/react\";\nimport { PopupTree } from \"./PopupTree.tsx\";\n\ntype PopupManagerProps = PropsWithChildren<PopupOptions>;\n\n/**\n * A controller for a {@link Popup} and its {@link PopupTrigger}.\n * Must have a {@link PopupTrigger} and {@link Popup} as children. Other nodes are accepted in children, but they will not interact\n * with the popup system.\n *\n * See {@link usePopup} and {@link PopupOptions} for documentation on the available options.\n *\n * ```\n * <PopupManager>\n * <PopupTrigger>\n * {props => (<button {...props}>Trigger Button</button>)}\n* </PopupTrigger>\n * <Popup>\n * <h2>This is the columnHeaders of the popup</h2>\n * <div>This is the body of a popup!</div>\n * </Popup>\n * </PopupManager>\n * ```\n *\n * Additionally, PopupManager may be nested within each other to create \"cascading\" popups.\n * ```\n * <PopupManager>\n * <PopupTrigger>\n * {props => (<button {...props}>Parent Trigger Button</button>)}\n * </PopupTrigger>\n * <Popup>\n * <PopupManager>\n * <PopupTrigger>\n * {props => (<button {...props>Cascading Popup Trigger</button>)}\n * </PopupTrigger>\n * <Popup>\n * Content inside the cascading child!\n * </Popup>\n * </PopupManager\n * </Popup>\n * </PopupManager>\n * ```\n */\n\nfunction PopupManager({\n children,\n modal = false,\n initialOpen,\n placement,\n offsetPx,\n open,\n onOpenChange,\n blockInteraction = true,\n enableClickMiddleware = true,\n}: PopupManagerProps) {\n const popupInfo = usePopup({\n modal,\n initialOpen,\n placement,\n offsetPx,\n open,\n onOpenChange,\n enableClickMiddleware,\n });\n\n const parentNodeId = useFloatingParentNodeId();\n // don't allow child popups to block interaction with tree root\n const blockCascadeInteraction = blockInteraction && parentNodeId === null;\n\n const popupNodeId = popupInfo.nodeId;\n\n return (\n <PopupTree>\n <FloatingNode id={popupNodeId}>\n <PopupContext.Provider value={{\n ...popupInfo,\n popupParentNodeId: parentNodeId,\n blockInteraction: blockCascadeInteraction,\n }}\n >\n {children}\n </PopupContext.Provider>\n </FloatingNode>\n </PopupTree>\n );\n}\n\nexport {\n PopupManager,\n};\n","import { useMemo, useState } from \"react\";\nimport {\n autoUpdate,\n flip,\n offset,\n shift,\n size,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useInteractions,\n useRole,\n} from \"@floating-ui/react\";\nimport type { UseFloatingReturn, UseInteractionsReturn } from \"@floating-ui/react\";\nimport { PopupOptions } from \"../config/popupOptions.ts\";\nimport { POPUP_LIST_MAX_HEIGHT, POPUP_ROW_MIN_HEIGHT } from \"../config/popupStyles.ts\";\nimport { useControlledState } from \"../../../utils/hooks/controlled/useControlledState.ts\";\n\ntype UsePopupReturn = UseFloatingReturn & UseInteractionsReturn & {\n open: boolean;\n setOpen: (open: boolean) => void;\n modal: boolean | undefined;\n labelId: string | undefined;\n descriptionId: string | undefined;\n setLabelId: (id: string | undefined) => void;\n setDescriptionId: (id: string | undefined) => void;\n nodeId: string | undefined;\n};\n\n/**\n * Generate the necessary FloatingUI data for a PopupManager. See {@link PopupOptions} for documentation on the available options.\n */\nfunction usePopup({\n initialOpen = false,\n placement = \"bottom\",\n offsetPx = 0,\n modal,\n open: controlledOpen,\n onOpenChange: setControlledOpen,\n enableClickMiddleware = true,\n}: PopupOptions = {}): UsePopupReturn {\n // uncontrolled === open state not controlled by parent\n const [labelId, setLabelId] = useState<string | undefined>();\n const [descriptionId, setDescriptionId] = useState<string | undefined>();\n const [open, setOpen] = useControlledState<boolean>(initialOpen, controlledOpen, setControlledOpen);\n\n const boundarySafeOnOpenChange = (newOpen: boolean, event?: Event) => {\n if (!newOpen && event instanceof MouseEvent) {\n if (event.clientX < 0\n || event.clientY < 0\n || event.clientX > window.innerWidth\n || event.clientY > window.innerHeight) {\n return;\n }\n }\n setOpen(newOpen);\n };\n\n // generate a FloatingNode ID if within a cascading popup\n const nodeId = useFloatingNodeId();\n\n // floating ui has a bug where if the padding on flip and size are different, the floating element can get caught\n // in the wrong position https://floating-ui.com/docs/size#using-with-flip:~:text=If%20you%E2%80%99re%20using%20the%20padding%20option%20in%20either%20middleware%2C%20ensure%20they%20share%20the%20same%20value.\n const MIDDLEWARE_PADDING = 8;\n\n const rowHeight = POPUP_ROW_MIN_HEIGHT + 2;\n const minHeight = rowHeight * 1.5;\n\n const data = useFloating({\n placement,\n open,\n nodeId,\n onOpenChange: boundarySafeOnOpenChange,\n whileElementsMounted: autoUpdate, // maintains position on popup element on screen\n middleware: [\n offset(offsetPx), // offset Popup from its PopupTrigger\n flip({ // keeps Popup on the page if PopupTrigger is close to the edge by flipping it to the opposite side\n crossAxis: placement.includes(\"-\"),\n fallbackStrategy: \"bestFit\",\n fallbackAxisSideDirection: \"none\", // keep Popup from covering parent list\n padding: MIDDLEWARE_PADDING,\n }),\n shift({ padding: MIDDLEWARE_PADDING }), // prevent going offscreen by shifting the popup along axis\n size({ // ensures popup does not overflow the viewport\n apply({ availableHeight, elements }) {\n let targetHeight = availableHeight;\n if (availableHeight < POPUP_LIST_MAX_HEIGHT) {\n const completeRows = Math.floor(availableHeight / rowHeight);\n const partialRowHeight = (completeRows * rowHeight) - (rowHeight / 2);\n targetHeight = Math.max(partialRowHeight, minHeight);\n }\n\n Object.assign(elements.floating.style, {\n maxHeight: `${targetHeight}px`,\n overflowY: \"auto\",\n });\n },\n padding: MIDDLEWARE_PADDING,\n }),\n ],\n });\n\n const context = data.context;\n\n const click = useClick(context, {\n enabled: enableClickMiddleware,\n });\n const dismiss = useDismiss(context, { bubbles: { escapeKey: true } }); // allow FloatingUI to manage dismissal, backdrop click, etc\n const role = useRole(context); // aria roles for accessibility\n // generate DOM attribute-fetching functions for popup interactions\n const interactions = useInteractions([click, dismiss, role]);\n\n return useMemo(\n () => ({\n open,\n setOpen,\n ...interactions,\n ...data,\n modal,\n labelId,\n descriptionId,\n setLabelId,\n setDescriptionId,\n nodeId,\n }),\n [open, setOpen, interactions, data, modal, labelId, descriptionId, nodeId],\n );\n}\n\nexport {\n usePopup,\n};\n\nexport type {\n UsePopupReturn,\n};\n","import { useContext } from \"react\";\nimport { PopupContext } from \"../PopupContext.tsx\";\nimport { UsePopupReturn } from \"./usePopup.ts\";\nimport { Nullable } from \"../../../utils/utilityTypes.ts\";\n\ntype UsePopupContextReturn = UsePopupReturn & {\n blockInteraction: boolean;\n popupParentNodeId: Nullable<string>;\n};\n\n/**\n * Retrieve the context of the current popup. Should not be used outside the popup ecosystem.\n */\nfunction usePopupContext(): UsePopupContextReturn {\n const context = useContext(PopupContext);\n\n if (context == null) {\n throw new Error(\"Popup components must be wrapped in <PopupManager />\");\n }\n\n return context;\n}\n\nexport {\n usePopupContext,\n};\n\nexport type {\n UsePopupContextReturn,\n};\n","import type { ReactNode } from \"react\";\nimport { usePopupContext } from \"./hooks/usePopupContext.ts\";\nimport type { UsePopupContextReturn } from \"./hooks/usePopupContext.ts\";\n\n/**\n * Element attribute so FloatingUI can determine whether to show a popup in the portal\n */\ntype PopupOpenState = \"open\" | \"closed\";\n\n/**\n * DOM Attribute props to set on the element that serves as the PopupTrigger.\n * Should not be mutated, and should be spread onto the element\n *\n * ```\n * <PopupManager>\n * <PopupTrigger>\n* {(triggerProps) => <button {...triggerProps}>\n* </PopTrigger>\n * </PopupManager>\n *\n * ```\n */\ntype PopupTriggerChildrenProps = {\n ref: UsePopupContextReturn[\"refs\"][\"setReference\"];\n \"data-state\": PopupOpenState;\n} & ReturnType<UsePopupContextReturn[\"getReferenceProps\"]>;\n\ntype PopupTriggerProps = {\n children: (props: PopupTriggerChildrenProps) => ReactNode;\n asChild?: boolean;\n};\n\n/**\n * ```\n * <PopupManager>\n * <PopupTrigger>\n * {(triggerProps) => <button type={\"button\"} {...triggerProps}>Triggers Popup</button>\n * </PopTrigger>\n * </PopupManager>\n * ```\n *\n * @param children\n * @constructor\n */\nfunction PopupTrigger({ children }: PopupTriggerProps) {\n const context = usePopupContext();\n const ref = context.refs.setReference;\n const openState: PopupOpenState = context.open ? \"open\" : \"closed\";\n const triggerChildProps = {\n ...context.getReferenceProps(),\n ref,\n \"data-state\": openState,\n };\n\n return (\n <>\n {children(triggerChildProps)}\n </>\n );\n}\n\nexport {\n PopupTrigger,\n};\n\nexport type {\n PopupTriggerChildrenProps,\n};\n","import * as React from \"react\";\nconst SvgCross = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 10, height: 10, viewBox: \"0 0 10 10\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M1.23712 1.23718L8.76283 8.76289\", stroke: \"#182428\", strokeWidth: 0.8, strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M8.76288 1.23718L1.23717 8.76289\", stroke: \"#182428\", strokeWidth: 0.8, strokeMiterlimit: 10 }));\nexport default SvgCross;\n","import IconComponent from \"../../../assets/icons/cross.svg?react\";\nimport { createIcon } from \"../createIcon\";\n\nconst Cross = createIcon(IconComponent, \"Cross\");\n\nexport { Cross };\n","import { createIcon } from \"./createIcon\";\nimport { stylist, StylistReturn } from \"../../style/stylist.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\ntype TinyIconProps = {\n Component: ReturnType<typeof createIcon>;\n stylists?: StylistReturn[];\n};\n/**\n * Utility component to resize an existing icon component to a smaller size (9px).\n * @param Component - the icon component to resize\n * @param style - optional Styles to apply to the icon\n */\nfunction TinyIcon({ Component, stylists }: TinyIconProps) {\n return <Component stylists={[stylist(ValidClassName[\"tiny-icon\"]), ...(stylists ?? [])]} size={9} />;\n}\n\nexport type { TinyIconProps };\nexport { TinyIcon };\n","import * as React from \"react\";\nconst SvgMenu = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 11, height: 10, viewBox: \"0 0 11 10\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M1.03625 2.20312H9.96378\", stroke: \"#182428\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M1.03625 5H9.96378\", stroke: \"#182428\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M1.03625 7.79688H7.24223\", stroke: \"#182428\" }));\nexport default SvgMenu;\n","import IconComponent from \"../../../assets/icons/menu.svg?react\";\nimport { createIcon } from \"../createIcon\";\n\nconst Sort = createIcon(IconComponent, \"Sort\");\n\nexport { Sort };\n","import { StrongSubLabel } from \"../../../typography/StrongSubLabel.tsx\";\nimport { Cross } from \"../../../icon/icons/Cross.tsx\";\nimport { TinyIcon } from \"../../../icon/TinyIcon.tsx\";\nimport { Sort } from \"../../../icon/icons/Sort.tsx\";\nimport { stylist } from \"../../../../style/stylist.ts\";\nimport { css } from \"../../../../../styled-system/css\";\nimport { fadeBackgroundBorder } from \"../../../../style/transition.ts\";\nimport { PopupTriggerChildrenProps } from \"../../../popup/PopupTrigger.tsx\";\n\ntype ColumnSorterCompoundButtonProps = {\n onClearClick: () => void;\n columnName: string;\n active?: boolean;\n popupTriggerProps: PopupTriggerChildrenProps;\n};\n\nconst compoundButtonWrapperStylist = stylist(null, css({\n display: \"flex\",\n alignItems: \"center\",\n borderRadius: \"md\",\n border: \"{borderWidths.lg} solid transparent\",\n maxWidth: \"fit-content\",\n justifyContent: \"center\",\n\n \"&:hover\": {\n borderColor: \"border.intent.action.hover\",\n backgroundColor: \"surface.intent.action.discrete.hover\",\n },\n\n \"&[data-active='true']\": {\n backgroundColor: \"surface.intent.action.discrete.active\",\n borderColor: \"border.intent.action.active\",\n },\n\n \"&:has(> .Tight-component:focus-visible)\": {\n outline: \"4px solid\",\n outlineColor: \"border.layout\",\n },\n}), fadeBackgroundBorder);\n\nconst mainButtonStylist = stylist(null, css({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"5px\",\n backgroundColor: \"transparent\",\n padding: \"6px 0 6px 6px\",\n border: \"none\",\n outline: \"none\",\n cursor: \"pointer\",\n}));\n\nconst clearButtonStylist = stylist(null, css({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"transparent\",\n padding: 0,\n margin: \"6px 6px 6px 5px\",\n border: \"none\",\n outline: \"none\",\n position: \"relative\",\n cursor: \"pointer\",\n\n \"&::before\": {\n content: \"''\",\n position: \"absolute\",\n top: \"-9px\",\n right: \"-7px\",\n bottom: \"-9px\",\n left: \"-5px\",\n },\n\n \"&:focus-visible\": {\n borderRadius: \"sm\",\n outline: \"4px solid\",\n outlineColor: \"border.layout\",\n },\n}));\n\nconst sortIconStylist = stylist(null, css({\n padding: \"0 6px 0 0\",\n display: \"flex\",\n alignItems: \"center\",\n}));\n\nfunction ColumnSorterCompoundButton({\n onClearClick,\n columnName,\n active,\n popupTriggerProps,\n}: ColumnSorterCompoundButtonProps) {\n const isActive = active || popupTriggerProps?.[\"data-state\"] === \"open\";\n return (\n <div {...compoundButtonWrapperStylist} data-active={isActive}>\n <button {...mainButtonStylist} {...popupTriggerProps}>\n <StrongSubLabel>{columnName}</StrongSubLabel>\n {!isActive\n && (\n <div {...sortIconStylist}>\n <TinyIcon Component={Sort} />\n </div>\n )}\n </button>\n {isActive\n && (\n <button {...clearButtonStylist} onClick={onClearClick}>\n <TinyIcon Component={Cross} />\n </button>\n )}\n </div>\n );\n}\n\nexport { ColumnSorterCompoundButton };\n","import { stylist } from \"../../style/stylist.ts\";\nimport { cva, RecipeVariant } from \"../../../styled-system/css\";\nimport { type CSSProperties, type HTMLProps, RefObject } from \"react\";\nimport { FloatingFocusManager, FloatingOverlay, FloatingPortal, useMergeRefs } from \"@floating-ui/react\";\nimport { usePopupContext } from \"./hooks/usePopupContext.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\nconst popupVariants = cva({\n base: {\n border: \"{borderWidths.md} solid\",\n borderColor: \"border.layout\",\n background: \"surface.background\",\n borderRadius: \"zero\",\n boxShadow: \"box-shadow\",\n animation: \"appear.instant\",\n display: \"flex\",\n flexShrink: 1,\n width: \"max-content\",\n position: \"absolute\",\n top: 0,\n left: 0,\n \"& *\": {\n boxSizing: \"border-box\",\n },\n },\n variants: {\n type: {\n reaction: { borderRadius: \"sm\" },\n },\n },\n});\n\ntype PopupProps = HTMLProps<HTMLDivElement> & {\n initialFocus?: boolean;\n style?: CSSProperties;\n ref?: RefObject<HTMLDivElement>;\n type?: RecipeVariant<typeof popupVariants>[\"type\"];\n};\n\n/**\n * The main body / container of a popup. Expects `children` for the popup's content\n * Must be rendered inside a PopupManager, and be a sibling of a PopupTrigger.\n *\n * ```\n * <PopupManager>\n * <PopupTrigger {...props} />\n * <Popup>\n * <h2>This is the columnHeaders of the popup</h2>\n * <div>This is the body of a popup!</div>\n * </Popup>\n * </PopupManager>\n * ```\n */\nfunction Popup({ initialFocus = true, style, ref, type, ...props }: PopupProps) {\n const { context: floatingContext, blockInteraction, ...popupContext } = usePopupContext();\n // need to merge refs so FloatingPortal can exist at a different point in the DOM tree\n const mergedRef = useMergeRefs([popupContext.refs.setFloating, ref]);\n const popupStylist = stylist(ValidClassName[\"popup\"], popupVariants({ type }));\n\n if (!floatingContext.open) {\n return null;\n }\n\n return (\n // FloatingPortal exists at page root so it is unaffected by overflow: hidden, etc.\n <>\n {blockInteraction && <FloatingOverlay lockScroll={true} />}\n <FloatingPortal>\n {/* FloatingFocusManager locks the focus inside the popup for keyboard navigation */}\n <FloatingFocusManager context={floatingContext} modal={popupContext.modal} initialFocus={initialFocus ? undefined : -1}>\n <div\n ref={mergedRef}\n {...popupStylist}\n style={{ ...popupContext.floatingStyles, ...style }} // position style provided by FloatingUI\n {...popupContext.getFloatingProps(props)} // props provided by FloatingUI, handles floating state\n aria-labelledby={popupContext.labelId} // accessibility\n aria-describedby={popupContext.descriptionId} // accessibility\n >\n {props.children}\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n </>\n );\n};\n\nexport { Popup };\n","import { stylist } from \"../../../style/stylist.ts\";\nimport { css, cva } from \"../../../../styled-system/css\";\nimport { SubLabel } from \"../../typography/SubLabel.tsx\";\nimport { fadeInnerText } from \"../../../style/transition.ts\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\n\nconst activeRecipe = cva({\n base: {\n border: \"none\",\n background: \"none\",\n paddingLeft: \"10px\",\n paddingRight: \"10px\",\n paddingTop: 0,\n paddingBottom: \"8px\",\n margin: 0,\n cursor: \"pointer\",\n display: \"flex\",\n width: \"100%\",\n outline: \"none\",\n\n \"& > .Tight-text\": {\n color: \"typography.intent.action\",\n },\n \"&:hover > .Tight-text\": {\n color: \"typography.intent.action.hover\",\n },\n \"&:focus-visible > .Tight-text\": {\n color: \"typography.intent.action.active\",\n },\n },\n variants: {\n active: {\n true: {\n \"& > .Tight-text\": {\n color: \"typography.intent.action.active\",\n },\n },\n },\n },\n});\n\nconst popupSortRowLabelStylist = stylist(null, css({\n display: \"flex\",\n justifyContent: \"flex-start\",\n}));\n\nfunction PopupSortRow({ onClick, children, active }: { onClick: () => void; children: string; active: boolean }) {\n const popupSortRowStylist = stylist(ValidClassName[\"popup-sort-row\"], activeRecipe({ active }), fadeInnerText);\n return (\n <button onClick={onClick} {...popupSortRowStylist}>\n <SubLabel stylists={[popupSortRowLabelStylist]}>{children}</SubLabel>\n </button>\n );\n}\n\nexport { PopupSortRow };\n","import { StrongSubLabel } from \"../../../typography/StrongSubLabel.tsx\";\nimport { PopupSortRow } from \"../../../popup/rows/PopupSortRow.tsx\";\nimport { stylist } from \"../../../../style/stylist.ts\";\nimport { css } from \"../../../../../styled-system/css\";\nimport { usePopupContext } from \"../../../popup/hooks/usePopupContext.ts\";\nimport { QuerySortParams } from \"../../tableSortContext.tsx\";\n\ntype ColumnSortListProps = {\n sortDef: NonNullable<QuerySortParams>[\"orderBy\"];\n sortAscDisplay: string;\n sortDescDisplay: string;\n handleSortClick: (sortParams: QuerySortParams) => void;\n sortInstance: QuerySortParams | undefined;\n};\n\nconst ColumnSortListStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n width: \"100%\",\n}));\n\nconst sortListStylist = stylist(null, css({\n paddingTop: \"10px\",\n paddingLeft: \"10px\",\n paddingRight: \"10px\",\n paddingBottom: \"8px\",\n color: \"typography.base.weak\",\n}));\n\nfunction ColumnSortList({ sortDef, sortAscDisplay, sortDescDisplay, handleSortClick, sortInstance }: ColumnSortListProps) {\n const popupContext = usePopupContext();\n\n const handleClick = (sortParams: QuerySortParams) => {\n handleSortClick(sortParams);\n popupContext?.setOpen(false);\n };\n\n return (\n <div {...ColumnSortListStylist}>\n <StrongSubLabel stylists={[sortListStylist]}>Sort by:</StrongSubLabel>\n <PopupSortRow onClick={() => handleClick({ orderBy: sortDef, direction: \"ASC\" })} active={sortInstance?.direction === \"ASC\"}>\n {sortAscDisplay}\n </PopupSortRow>\n <PopupSortRow onClick={() => handleClick({ orderBy: sortDef, direction: \"DESC\" })} active={sortInstance?.direction === \"DESC\"}>\n {sortDescDisplay}\n </PopupSortRow>\n </div>\n );\n}\n\nexport { ColumnSortList };\n","import { MouseEvent, PropsWithChildren, useState } from \"react\";\nimport { stylist } from \"../../style/stylist\";\nimport { css } from \"../../../styled-system/css\";\nimport { fadeBackgroundBorder } from \"../../style/transition\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { PopupTriggerChildrenProps } from \"../popup/PopupTrigger.tsx\";\n\ntype ButtonDiscreteSmallProps = PropsWithChildren<{\n active?: boolean;\n disabled?: boolean;\n onClick?: (event: MouseEvent<HTMLButtonElement>) => void;\n popupTriggerProps?: PopupTriggerChildrenProps;\n ariaLabel?: string;\n ariaExpanded?: boolean;\n}>;\n\n// ::before adds hit slop\nconst buttonDiscreteSmallCss = css({\n display: \"flex\",\n alignItems: \"center\",\n gap: \"5px\",\n backgroundColor: \"surface.intent.action.discrete\",\n padding: \"6px\",\n borderRadius: \"md\",\n border: \"{borderWidths.md} solid transparent\",\n outline: \"none\",\n boxShadow: \"0 0 0 0 transparent\",\n width: \"fit-content\",\n position: \"relative\",\n cursor: \"pointer\",\n\n \"&:focus-visible\": {\n outline: \"4px solid\",\n outlineColor: \"border.layout\",\n },\n\n \"&:disabled\": {\n cursor: \"default\",\n },\n\n \"&:enabled:hover\": {\n borderColor: \"border.intent.action.hover\",\n backgroundColor: \"surface.intent.action.discrete.hover\",\n },\n\n \"&:active:enabled, &[data-active='true']:enabled\": {\n backgroundColor: \"surface.intent.action.discrete.active\",\n borderColor: \"transparent\",\n },\n\n \"&::before\": {\n content: \"''\",\n position: \"absolute\",\n top: \"-11px\",\n left: \"-11px\",\n right: \"-11px\",\n bottom: \"-11px\",\n },\n});\n\nconst buttonDiscreteSmallStylist = stylist(ValidClassName[\"button-discrete-small\"], buttonDiscreteSmallCss, fadeBackgroundBorder);\n\nfunction isPopupOpenState(state: PopupTriggerChildrenProps[\"data-state\"] | undefined) {\n switch (state) {\n case \"open\":\n return true;\n case \"closed\":\n return false;\n case undefined:\n return undefined;\n }\n}\n\nfunction ButtonDiscreteSmall({\n children,\n active,\n disabled,\n onClick,\n popupTriggerProps,\n ariaLabel,\n ariaExpanded,\n}: ButtonDiscreteSmallProps) {\n const [internalActive, setInternalActive] = useState(false);\n // allow active to be automatically set when the discrete button is a trigger for a popup\n const controlledActive = active ?? isPopupOpenState(popupTriggerProps?.[\"data-state\"]);\n const isActive = controlledActive ?? internalActive;\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (controlledActive === undefined) {\n setInternalActive(!internalActive);\n }\n if (onClick) {\n onClick(event);\n }\n };\n\n return (\n <button\n type=\"button\"\n {...buttonDiscreteSmallStylist}\n onClick={handleClick}\n data-active={isActive}\n disabled={disabled}\n {...popupTriggerProps}\n aria-label={ariaLabel}\n aria-expanded={ariaExpanded}\n >\n {children}\n </button>\n );\n}\n\nexport { ButtonDiscreteSmall };\n","import { ColumnSorterProps } from \"./ColumnSorterLayout.tsx\";\nimport { PopupManager } from \"../../../popup/PopupManager.tsx\";\nimport { PopupTrigger } from \"../../../popup/PopupTrigger.tsx\";\nimport { ColumnSorterCompoundButton } from \"./ColumnSorterCompoundButton.tsx\";\nimport { Popup } from \"../../../popup/Popup.tsx\";\nimport { ColumnSortList } from \"./ColumnSortList.tsx\";\nimport { ButtonDiscreteSmall } from \"../../../inputs/ButtonDiscreteSmall.tsx\";\nimport { StrongSubLabel } from \"../../../typography/StrongSubLabel.tsx\";\nimport { QuerySortParams, SortingContext } from \"../../tableSortContext.tsx\";\nimport { useContext } from \"react\";\n\nconst popupStyle = {\n minWidth: \"140px\",\n};\n\nfunction ColumnSorter({\n columnName,\n sortDef,\n sortAscDisplay,\n sortDescDisplay,\n}: ColumnSorterProps) {\n const sortingContext = useContext(SortingContext);\n if (!sortingContext) {\n return null;\n }\n const { sortInstance, setSortInstance } = sortingContext;\n\n const isSortActive = sortInstance?.orderBy === sortDef;\n\n const handleSortClick = (sortParams: QuerySortParams) => {\n setSortInstance(sortParams);\n };\n\n const handleClearSort = () => {\n setSortInstance(undefined);\n };\n\n return (\n sortDef && sortAscDisplay && sortDescDisplay\n ? (\n <PopupManager placement=\"bottom-start\">\n <PopupTrigger>\n {props => (\n <ColumnSorterCompoundButton\n active={isSortActive}\n onClearClick={handleClearSort}\n columnName={columnName}\n popupTriggerProps={props}\n />\n )}\n </PopupTrigger>\n <Popup style={popupStyle}>\n <ColumnSortList sortDef={sortDef} sortAscDisplay={sortAscDisplay} sortDescDisplay={sortDescDisplay} handleSortClick={handleSortClick} sortInstance={sortInstance} />\n </Popup>\n </PopupManager>\n )\n : (\n <ButtonDiscreteSmall disabled>\n <StrongSubLabel>{columnName}</StrongSubLabel>\n </ButtonDiscreteSmall>\n )\n );\n}\n\nexport { ColumnSorter };\n","import { stylist } from \"../../../../style/stylist.ts\";\nimport { css } from \"../../../../../styled-system/css\";\nimport { ColumnSorter } from \"./ColumnSorter.tsx\";\nimport { QuerySortParams } from \"../../tableSortContext.tsx\";\n\ntype ColumnSorterProps = {\n columnName: string;\n sortDef?: NonNullable<QuerySortParams>[\"orderBy\"];\n sortAscDisplay?: string;\n sortDescDisplay?: string;\n};\n\nconst columnSorterLayoutStylist = stylist(null, css({\n paddingLeft: \"19px\",\n}));\n\nfunction ColumnSorterLayout({\n columnName,\n sortDef,\n sortAscDisplay,\n sortDescDisplay,\n}: ColumnSorterProps) {\n return (\n <div {...columnSorterLayoutStylist}>\n <ColumnSorter columnName={columnName} sortDef={sortDef} sortAscDisplay={sortAscDisplay} sortDescDisplay={sortDescDisplay} />\n </div>\n );\n}\n\nexport type {\n ColumnSorterProps,\n};\n\nexport { ColumnSorterLayout };\n","import {\n ConversationDirectionParams,\n ConversationOrderByParams,\n QueryConversationsSortOrderByParams,\n QueryConversationsSortParams,\n} from \"../../../../query/fetches/conversations/conversations.ts\";\nimport { useCallback, useState } from \"react\";\nimport { QuerySortParams } from \"../../tableSortContext.tsx\";\n\nconst conversationSortDefs: Record<NonNullable<QueryConversationsSortOrderByParams>, {\n ASC: string;\n DESC: string;\n}> = {\n LAST_MESSAGE_CREATED_DATE_TIME: {\n ASC: \"Oldest to Newest\",\n DESC: \"Newest to Oldest\",\n },\n CREATED_DATE_TIME: {\n ASC: \"Oldest to Newest\",\n DESC: \"Newest to Oldest\",\n },\n SUBJECT: {\n ASC: \"A-Z\",\n DESC: \"Z-A\",\n },\n EMAIL: {\n ASC: \"A-Z\",\n DESC: \"Z-A\",\n },\n LAST_MESSAGE_TEXT: {\n ASC: \"A-Z\",\n DESC: \"Z-A\",\n },\n};\n\nfunction isConversationSort(sort: QuerySortParams): sort is QueryConversationsSortParams {\n if (sort === undefined) {\n return true;\n }\n\n const correctOrderBy = (sort.orderBy && sort.orderBy in ConversationOrderByParams) ?? false;\n const correctDirection = (sort.direction && sort.direction in ConversationDirectionParams) ?? false;\n\n return correctOrderBy && correctDirection;\n}\n\nfunction useConversationSort() {\n const [sortInstance, setSortInstance] = useState<QueryConversationsSortParams | undefined>(undefined);\n\n const setSortInstanceWrapper = useCallback((sort: QuerySortParams) => {\n if (!isConversationSort(sort)) {\n setSortInstance(undefined);\n return;\n }\n setSortInstance(sort);\n }, [setSortInstance]);\n\n return { sortInstance, setSortInstance: setSortInstanceWrapper, apiSort: sortInstance };\n}\n\nexport { conversationSortDefs, useConversationSort };\n","import { createColumnHelper } from \"@tanstack/react-table\";\nimport { ConversationGetDto } from \"../../../query/fetches/conversations/conversations.ts\";\nimport { CONVERSATIONS_TABLE_COLS } from \"./config/conversationsTableConfig.ts\";\nimport { ConversationTextCell } from \"../../dashboards/cells/conversations/ConversationTextCell.tsx\";\nimport { TableCellLayout } from \"../cells/TableCellLayout.tsx\";\nimport { ConversationDateCell } from \"../../dashboards/cells/conversations/ConversationDateCell.tsx\";\nimport { StrongSubLabel } from \"../../typography/StrongSubLabel.tsx\";\nimport { css } from \"../../../../styled-system/css\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { ColumnSorterLayout } from \"../columnHeaders/columnSort/ColumnSorterLayout.tsx\";\nimport { conversationSortDefs } from \"./hooks/useConversationSort.ts\";\n\nconst columnHelper = createColumnHelper<ConversationGetDto>();\nconst headerStylist = stylist(null, css({\n paddingLeft: \"25px\",\n}));\n\nconst conversationTableColumns = [\n columnHelper.accessor(\"latestMessage.author.userId\", {\n id: CONVERSATIONS_TABLE_COLS.FROM,\n cell: ({ row }) => (\n <TableCellLayout>\n <ConversationTextCell text={row.original.latestMessage.author.userId} isRead={row.original.readStatus === \"READ\"} />\n </TableCellLayout>\n ),\n header: () => <StrongSubLabel stylists={[headerStylist]}>From</StrongSubLabel>,\n size: 150,\n maxSize: 150,\n }),\n columnHelper.accessor(\"subject\", {\n id: CONVERSATIONS_TABLE_COLS.SUBJECT,\n cell: ({ row }) => (\n <TableCellLayout>\n <ConversationTextCell text={row.original.subject} isRead={row.original.readStatus === \"READ\"} />\n </TableCellLayout>\n ),\n header: () => <StrongSubLabel stylists={[headerStylist]}>Subject</StrongSubLabel>,\n size: 150,\n }),\n columnHelper.accessor(\"latestMessage.text\", {\n id: CONVERSATIONS_TABLE_COLS.MESSAGE,\n cell: ({ row }) => (\n <TableCellLayout>\n <ConversationTextCell text={row.original.latestMessage.text} isRead={row.original.readStatus === \"READ\"} />\n </TableCellLayout>\n ),\n header: () => <StrongSubLabel stylists={[headerStylist]}>Message</StrongSubLabel>,\n size: 200,\n }),\n columnHelper.accessor(\"lastUpdatedDateTime\", {\n id: CONVERSATIONS_TABLE_COLS.DATE,\n cell: ({ row }) => (\n <TableCellLayout>\n <ConversationDateCell date={row.original.lastUpdatedDateTime} isRead={row.original.readStatus === \"READ\"} />\n </TableCellLayout>\n ),\n header: () => <ColumnSorterLayout columnName=\"Date\" sortDef=\"LAST_MESSAGE_CREATED_DATE_TIME\" sortDescDisplay={conversationSortDefs.LAST_MESSAGE_CREATED_DATE_TIME.DESC} sortAscDisplay={conversationSortDefs.LAST_MESSAGE_CREATED_DATE_TIME.ASC} />,\n size: 130,\n maxSize: 130,\n }),\n];\n\nfunction getConversationColumns() {\n return conversationTableColumns;\n}\n\nexport {\n getConversationColumns,\n};\n","import { ConversationGetDto } from \"../../../../query/fetches/conversations/conversations.ts\";\nimport { getCoreRowModel, Table, useReactTable } from \"@tanstack/react-table\";\nimport { getConversationColumns } from \"../ConversationTableColumns.tsx\";\n\ntype UseConversationsTableBaseProps = {\n conversations: ConversationGetDto[] | undefined;\n};\n\n/* Stable reference to placeholder data. Unstable reference causes infinite renders.\n * https://tanstack.com/table/v8/docs/faq#how-do-i-stop-infinite-rendering-loops\n */\nconst PLACEHOLDER_DATA: ConversationGetDto[] = []; // NEVER MODIFY THIS, NEED STABLE EMPTY ARRAY;\n\n/**\n * Generates a table setup for displaying a list of conversations.\n *\n * @param {Object} params - The input parameters for configuring the conversation table.\n * @param {ConversationGetDto[]} params.conversations - The list of conversation to be displayed in the table. If not provided, placeholder data will be used.\n *\n * @return {Table<Conversation>} Tanstack table instance configured for our uses\n */\nfunction useConversationsTable({ conversations }: UseConversationsTableBaseProps): Table<ConversationGetDto> {\n return useReactTable<ConversationGetDto>({\n data: conversations ?? PLACEHOLDER_DATA,\n manualPagination: true,\n manualSorting: true,\n manualFiltering: true,\n manualGrouping: true,\n rowCount: conversations?.length ?? PLACEHOLDER_DATA.length,\n columns: getConversationColumns(),\n getCoreRowModel: getCoreRowModel(),\n getRowId: row => row.id,\n });\n}\n\nexport { useConversationsTable };\nexport type { UseConversationsTableBaseProps };\n","import { css } from \"../../../styled-system/css\";\n\nconst zeroStateLayoutCss = css({\n display: \"flex\",\n flexDirection: \"column\",\n height: \"250px\",\n width: \"100%\",\n paddingBottom: \"20px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxSizing: \"border-box\",\n textAlign: \"center\",\n minWidth: \"900px\",\n backgroundColor: \"surface.background\",\n gap: \"10px\",\n});\n\nexport {\n zeroStateLayoutCss,\n};\n","import { stylist } from \"../../style/stylist.ts\";\nimport { PropsWithChildren } from \"react\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { zeroStateLayoutCss } from \"./zeroStateStyles.ts\";\n\ntype ZeroStateLayoutProps = PropsWithChildren;\n\nconst ZeroStateLayoutStylist = stylist(ValidClassName[\"empty-dashboard-layout\"], zeroStateLayoutCss);\n\nfunction ZeroStateLayout({ children }: ZeroStateLayoutProps) {\n return (\n <div {...ZeroStateLayoutStylist} data-testid=\"empty-dashboard-layout\">\n {children}\n </div>\n );\n}\n\nexport { ZeroStateLayout };\n","import { createIcon } from \"./createIcon\";\nimport { stylist, StylistReturn } from \"../../style/stylist.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\ntype LargeIconProps = {\n Component: ReturnType<typeof createIcon>;\n stylists?: StylistReturn[];\n};\n/**\n * Utility component to resize an existing icon component to a large size (25px).\n * @param Component - the icon component to resize\n * @param stylists - optional Stylists to apply to the icon\n */\nfunction LargeIcon({ Component, stylists }: LargeIconProps) {\n return <Component stylists={[stylist(ValidClassName[\"large-icon\"]), ...(stylists ?? [])]} size={25} />;\n}\n\nexport type { LargeIconProps };\nexport { LargeIcon };\n","import * as React from \"react\";\nconst SvgPaperplane = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 15, height: 15, viewBox: \"0 0 15 15\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M14.0625 2.14374L1.5625 6.90624L11.6813 12.8562L14.0625 2.14374Z\", strokeWidth: 0.9375, strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M8.25624 10.8375L5.73124 12.8562L5.33749 9.12499L13.4687 2.73749\", strokeWidth: 0.9375, strokeMiterlimit: 10 }));\nexport default SvgPaperplane;\n","import IconComponent from \"../../../assets/icons/paperplane.svg?react\";\nimport { createIcon } from \"../createIcon.tsx\";\n\nconst Paperplane = createIcon(IconComponent, \"Paperplane\");\n\nexport { Paperplane };\n","import { LargeIcon } from \"../../../icon/LargeIcon.tsx\";\nimport { StrongLabel } from \"../../../typography/StrongLabel.tsx\";\nimport { ButtonPrimary } from \"../../../inputs/ButtonPrimary.tsx\";\nimport { Paperplane } from \"../../../icon/icons/Paperplane.tsx\";\nimport { openDrawer } from \"../../../drawer/drawer.ts\";\n\nconst handleClick = () => {\n openDrawer(\n \"Conversation\",\n { routeProps: { conversationId: null } },\n );\n};\n\nconst conversationsOnboardingStrongText = \"Need help with your financials?\";\nconst conversationsOnboardingButtonText = \"Talk to a bookkeeper\";\nfunction ConversationsOnboardingZeroState() {\n return (\n <>\n <LargeIcon Component={Paperplane} />\n <StrongLabel>{conversationsOnboardingStrongText}</StrongLabel>\n <ButtonPrimary onClick={handleClick}>\n <StrongLabel>{conversationsOnboardingButtonText}</StrongLabel>\n </ButtonPrimary>\n </>\n );\n}\n\nexport { ConversationsOnboardingZeroState };\n","import { LargeIcon } from \"../../../icon/LargeIcon.tsx\";\nimport { StrongLabel } from \"../../../typography/StrongLabel.tsx\";\nimport { SubLabel } from \"../../../typography/SubLabel.tsx\";\nimport { Paperplane } from \"../../../icon/icons/Paperplane.tsx\";\n\nconst allCaughtUpStrongText = \"All caught up\";\nconst allCaughtUpWeakText = \"We'll let you know if something comes up.\";\nfunction ConversationsAllCaughtUpZeroState() {\n return (\n <>\n <LargeIcon Component={Paperplane} />\n <StrongLabel>{allCaughtUpStrongText}</StrongLabel>\n <SubLabel>{allCaughtUpWeakText}</SubLabel>\n </>\n );\n}\n\nexport { ConversationsAllCaughtUpZeroState };\n","import { DashHeaderLayout } from \"./DashHeaderLayout.tsx\";\nimport { TablePagination } from \"../../tables/TablePagination.tsx\";\nimport { PlaceholderTable } from \"../loading/PlaceholderTable.tsx\";\nimport { PaginationContext } from \"../pagination/paginationContext.ts\";\nimport { Heading } from \"../../typography/Heading.tsx\";\nimport { ConversationGetDto, useGetAnySingleConversation } from \"../../../query/fetches/conversations/conversations.ts\";\nimport { TableHeader } from \"../../tables/TableHeader.tsx\";\nimport { TableBody } from \"../../tables/TableBody.tsx\";\nimport { ConversationsTableRow } from \"../../tables/conversationsTable/ConversationsTableRow.tsx\";\nimport { AddConversationButton } from \"../../tables/conversationsTable/AddConversationButton.tsx\";\nimport { ConversationControlsLayout } from \"../../tables/conversationsTable/hooks/ConversationControlsLayout.tsx\";\nimport { PaginationControls } from \"../../../query/fetches/utils/usePaginatedEntity.ts\";\nimport { TableLayout } from \"../../tables/TableLayout.tsx\";\nimport { QuerySortParams, SortingContext } from \"../../tables/tableSortContext.tsx\";\nimport { useConversationsTable } from \"../../tables/conversationsTable/hooks/useConversationsTable.ts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { ZeroStateLayout } from \"../../zero-states/ZeroStateLayout.tsx\";\nimport { ConversationsOnboardingZeroState } from \"./zero-states/ConversationsOnboardingZeroState.tsx\";\nimport { ConversationsAllCaughtUpZeroState } from \"./zero-states/ConversationsAllCaughtUpZeroState.tsx\";\nimport { isNullish } from \"../../../utils/typeUtils.ts\";\nimport { CONVERSATIONS_SECTION } from \"./config/businessOwnerDashConfig.ts\";\n\nconst businessOwnerConversationsTableSectionCss = css({\n minWidth: \"900px\",\n});\n\ntype BusinessOwnerConversationsTableSectionProps = {\n sortInstance: QuerySortParams;\n setSortInstance: (sort: QuerySortParams) => void;\n conversations: ConversationGetDto[];\n isFilling: boolean;\n paginationControls: PaginationControls;\n};\n\nfunction getZeroState(hasHadAnyConversation: boolean) {\n if (!hasHadAnyConversation) {\n return <ConversationsOnboardingZeroState />;\n } else {\n return <ConversationsAllCaughtUpZeroState />;\n }\n}\nfunction BusinessOwnerConversationsTableSection({ sortInstance, setSortInstance, conversations, paginationControls, isFilling }: BusinessOwnerConversationsTableSectionProps) {\n const table = useConversationsTable({ conversations });\n const { query: { data: singleConversationRes }, isFilling: singleConversationIsFilling } = useGetAnySingleConversation();\n const hasHadAnyConversation = !isNullish(singleConversationRes?.data?.[0]) && !singleConversationIsFilling;\n\n return (\n <div className={businessOwnerConversationsTableSectionCss}>\n <div id={CONVERSATIONS_SECTION}>{/* dummy div, for auto-scrolling */}</div>\n <PaginationContext.Provider value={paginationControls}>\n <DashHeaderLayout>\n <Heading>Conversations</Heading>\n <ConversationControlsLayout>\n <TablePagination />\n <AddConversationButton />\n </ConversationControlsLayout>\n </DashHeaderLayout>\n <TableLayout dashboard=\"businessOwnerDashboard\">\n {isFilling\n ? <PlaceholderTable numColumns={4} />\n : (\n <>\n <SortingContext.Provider value={{ sortInstance, setSortInstance }}>\n <TableHeader headerGroups={table.getHeaderGroups()} />\n </SortingContext.Provider>\n {conversations.length > 0\n ? (\n <TableBody>\n {table.getRowModel().rows.map(row => (\n <ConversationsTableRow key={row.id} rowData={row} />\n ))}\n </TableBody>\n )\n : (\n <ZeroStateLayout>\n {getZeroState(hasHadAnyConversation)}\n </ZeroStateLayout>\n )}\n </>\n )}\n </TableLayout>\n </PaginationContext.Provider>\n </div>\n );\n}\n\nexport { BusinessOwnerConversationsTableSection };\n","import { components, operations } from \"../../versions/v6/v6Schema.ts\";\nimport { EntityFetchFn, useEntity, UseEntityOptions } from \"../utils/useEntity.ts\";\nimport { v6EntityPost, V6EntityPostRequest } from \"../../http/post.ts\";\nimport { getV6EndpointManager } from \"../../versions/v6/v6EndpointManager.ts\";\nimport { getBeginningOfMonth, Period } from \"../../../utils/date/date.ts\";\n\ntype Summary = components[\"schemas\"][\"SummaryGetDto\"];\ntype QuerySummaryParams = components[\"schemas\"][\"SummariesGetParam\"];\ntype QuerySummarySort = components[\"schemas\"][\"SummarySort\"];\ntype QuerySummaryFilter = components[\"schemas\"][\"SummaryFilter\"];\ntype QuerySummaryResponse = operations[\"querySummaries\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\ntype QuerySummariesSuccessResponse = Omit<QuerySummaryResponse, \"result\">;\n\ntype UseSummaryOptions<TData> = Partial<UseEntityOptions<QuerySummariesSuccessResponse, SummariesBaseKey, TData>>;\n\ntype SummariesBaseKey = [\"summaries\", QuerySummaryParams];\n\nconst summariesKeys = {\n all: (): SummariesBaseKey => [\"summaries\", {}],\n of: (params: QuerySummaryParams): SummariesBaseKey => [\"summaries\", params ?? {}],\n};\n\nconst getSummaries: EntityFetchFn<QuerySummariesSuccessResponse, SummariesBaseKey> = async (queryContext) => {\n const queryKey = queryContext.queryKey;\n const queryParams = queryKey[1];\n const accessToken = queryKey[2].accessToken;\n const environment = queryKey[2].environment;\n\n const params: V6EntityPostRequest<QuerySummaryParams> = {\n path: \"/v6/summaries/query\",\n bodyParams: {\n ...queryParams,\n },\n accessToken,\n method: \"POST\",\n endpointManager: getV6EndpointManager(environment),\n };\n\n const res = await v6EntityPost<QuerySummaryResponse, QuerySummaryParams>(params);\n return res.result === \"SUCCESS\" && res.data !== undefined\n ? { data: res.data }\n : { data: undefined };\n};\n\nfunction useSummaries<TData>(params?: QuerySummaryParams, options?: UseSummaryOptions<TData>) {\n const queryKey = params ? summariesKeys.of(params) : summariesKeys.all();\n return useEntity({ queryKey, queryFn: getSummaries, ...options });\n}\n\nfunction useSingleMonthlySummary(period: Period) {\n const firstOfMonth = getBeginningOfMonth(period.month, period.year);\n const summaryFilter: QuerySummaryFilter = {\n date: {\n value: firstOfMonth,\n operator: \"EQUALS\",\n },\n status: {\n values: [\"ACTIVE\"],\n operator: \"IN\",\n },\n };\n\n const summarySort: QuerySummarySort = {\n direction: \"DESC\",\n orderBy: \"DATE\",\n };\n\n const summaryOptions = {\n select: (summaryData: QuerySummariesSuccessResponse) => summaryData?.data?.[0]?.summary,\n };\n\n const summaryParams = {\n limit: 1,\n filter: summaryFilter,\n sort: summarySort,\n };\n\n return useSummaries(summaryParams, summaryOptions);\n}\n\nexport {\n useSummaries,\n useSingleMonthlySummary,\n};\n\nexport type {\n Summary,\n QuerySummaryParams,\n QuerySummaryResponse,\n};\n","import { stylist, StylistReturn } from \"../../style/stylist.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { fontRecipes } from \"../../style/recipes/fontRecipes.ts\";\nimport { isNullishOrEmptyOrBlank } from \"../../utils/string/stringUtils.ts\";\nimport { Text } from \"./Text.tsx\";\n\nconst bodyStylist = stylist(ValidClassName[\"body\"],\n fontRecipes({ body: \"default\" }),\n);\n\nfunction Body({ children, stylists = [] }: { children?: string; stylists?: StylistReturn[] }) {\n if (isNullishOrEmptyOrBlank(children)) {\n return null;\n }\n return (\n <Text size=\"med\" weight=\"med\" stylists={[bodyStylist, ...stylists]}>\n {children}\n </Text>\n );\n}\n\nexport { Body };\n","import { stylist } from \"../../style/stylist.ts\";\nimport { cva, RecipeVariant } from \"../../../styled-system/css\";\n\nconst sampleOverlayCss = cva({\n base: {\n color: \"typography.base.weak\",\n boxSizing: \"border-box\",\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n right: \"0\",\n top: \"0\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n pointerEvents: \"none\",\n margin: \"0 auto\",\n transform: \"rotate(-20deg)\",\n opacity: \"80%\",\n },\n variants: {\n size: {\n sm: {\n fontSize: \"4em\",\n },\n lg: {\n fontSize: \"7em\",\n },\n },\n },\n defaultVariants: {\n size: \"lg\",\n },\n});\n\ntype SampleOverlayProps = {\n size?: RecipeVariant<typeof sampleOverlayCss>[\"size\"];\n};\n\nfunction SampleOverlay({ size }: SampleOverlayProps) {\n const sampleOverlayStylist = stylist(null, sampleOverlayCss({ size }));\n\n return (\n <div {...sampleOverlayStylist}>\n Sample\n </div>\n );\n}\n\nexport {\n SampleOverlay,\n};\n","import { ShimmerBlock } from \"../../../loading/ShimmerBlock.tsx\";\nimport { css, cva, RecipeVariantProps } from \"../../../../../styled-system/css\";\nimport { stylist } from \"../../../../style/stylist.ts\";\n\nconst shimmerContainerStyle = stylist(null, css({\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"6px\",\n width: \"100%\",\n}));\n\nconst shimmerBlockStyle = cva({\n base: {\n height: 16,\n },\n variants: {\n width: {\n w92: { width: \"92%\" },\n w90: { width: \"90%\" },\n w88: { width: \"88%\" },\n w87: { width: \"87%\" },\n w85: { width: \"85%\" },\n w70: { width: \"70%\" },\n },\n },\n});\ntype WidthVariants = RecipeVariantProps<typeof shimmerBlockStyle>;\n\nconst shimmerWidthVariants: WidthVariants[] = [\n { width: \"w85\" },\n { width: \"w90\" },\n { width: \"w88\" },\n { width: \"w85\" },\n { width: \"w92\" },\n { width: \"w87\" },\n { width: \"w90\" },\n { width: \"w85\" },\n { width: \"w88\" },\n { width: \"w90\" },\n { width: \"w87\" },\n { width: \"w85\" },\n { width: \"w70\" },\n];\n\nfunction FinancialSummaryShimmer() {\n return (\n <div {...shimmerContainerStyle}>\n {shimmerWidthVariants.map((variant, index) => (\n <ShimmerBlock key={index} styles={shimmerBlockStyle({ width: variant?.width })} />\n ))}\n </div>\n );\n}\n\nexport { FinancialSummaryShimmer };\n","import { stylist, StylistReturn } from \"../../../../style/stylist.ts\";\nimport { mergeStylists } from \"../../../../style/mergeStylists.ts\";\nimport { Body } from \"../../../typography/Body.tsx\";\nimport { css, cva } from \"../../../../../styled-system/css\";\nimport { SampleOverlay } from \"../../../zero-states/SampleOverlay.tsx\";\nimport { FinancialSummaryShimmer } from \"./FinancialSummaryShimmer.tsx\";\n\ntype FinancialSummaryLayoutProps = {\n children?: string;\n stylists?: StylistReturn[];\n isSample: boolean;\n isFilling: boolean;\n};\n\nconst FinancialSummaryLayoutRecipe = cva({\n base: {\n display: \"flex\",\n flex: \"1 1 0\",\n maxHeight: \"247px\",\n minHeight: \"247px\",\n background: \"surface.foreground\",\n border: \"{borderWidths.lg} solid {colors.border.layout.strong}\",\n borderRadius: \"lg\",\n padding: \"10px\",\n gap: \"10px\",\n alignItems: \"flex-start\",\n boxSizing: \"border-box\",\n position: \"relative\",\n minWidth: \"900px\",\n overflow: \"auto\",\n marginBottom: 10,\n },\n variants: {\n isSample: {\n true: {\n pointerEvents: \"none\",\n },\n false: {},\n },\n },\n});\n\nconst FinancialSummaryTextBoxStylist = stylist(null, css({\n whiteSpace: \"pre-wrap\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"10px\",\n height: \"100%\",\n}));\n\nfunction FinancialSummaryLayout({ children, stylists = [], isSample, isFilling }: FinancialSummaryLayoutProps) {\n const FinancialSummaryLayoutStylist = stylist(null, FinancialSummaryLayoutRecipe({ isSample }));\n return (\n <div data-testid=\"financial-summary-layout\" {...mergeStylists([FinancialSummaryLayoutStylist, ...stylists])}>\n {isFilling\n ? <FinancialSummaryShimmer />\n : (\n <>\n <Body stylists={[FinancialSummaryTextBoxStylist]}>{children}</Body>\n {isSample && <SampleOverlay />}\n </>\n )}\n </div>\n );\n}\n\nexport { FinancialSummaryLayout };\n","import { TaskDTO, TaskDTOWithMeta } from \"../../query/fetches/tasks/tasks.ts\";\nimport { PlaidItem } from \"../../query/fetches/plaidItems/plaidItems.ts\";\n\nconst LINK_BANK_MOCK_TASK: TaskDTO = {\n id: \"mock_task_link_bank\",\n priority: \"HIGH\",\n name: \"Link your bank account\",\n description: \"Effortlessly track every dollar by linking your bank account\",\n type: \"LINK_BANK\",\n dismissable: \"DISMISSABLE\",\n status: \"ACTIVE\",\n};\n\nfunction getBankErrorMockTask(institutionName: string, plaidItemId: PlaidItem[\"id\"]): TaskDTOWithMeta {\n return {\n id: `${institutionName}_bank_error_task`,\n priority: \"URGENT\",\n name: \"Fix your bank connection\",\n description: `Please relink your ${institutionName} bank using your latest credentials`,\n type: \"BANK_ERROR\",\n dismissable: \"DISMISSABLE\",\n status: \"ACTIVE\",\n meta: { plaidItemId },\n }\n ;\n}\n\nexport { LINK_BANK_MOCK_TASK, getBankErrorMockTask };\n","import { createEndpointManager } from \"../../endpointManager.ts\";\nimport { getV1ApiUrl, TightEnvironment } from \"../../../utils/traxEnvironmentVariables.ts\";\n\nfunction getV1EndpointManager(environment: TightEnvironment) {\n return createEndpointManager(`${getV1ApiUrl(environment)}/v1`, \"v1\");\n}\n\nexport {\n getV1EndpointManager,\n};\n","import { get } from \"../../http/get.ts\";\nimport { buildEntityRequest } from \"../../http/http.ts\";\nimport { getV1EndpointManager } from \"../../versions/v1/v1EndpointManager.ts\";\nimport { post } from \"../../http/post.ts\";\nimport { PlaidLinkOnSuccessMetadata } from \"react-plaid-link\";\nimport { components } from \"../../versions/v5/v5Schema.ts\";\nimport { BankAccount } from \"../banks/bankAccounts.ts\";\nimport { TightEnvironment } from \"../../../utils/traxEnvironmentVariables.ts\";\n\n// This is based on the /plaidItems endpoint, which is NOT technically same response type as /webPlaidPublicToken endpoint\ntype PlaidItem = components[\"schemas\"][\"PlaidItemDTOV4\"];\n\ntype CreatePlaidLinkTokenParams = {\n accessToken?: string;\n plaidItemId?: PlaidItem[\"id\"];\n environment: TightEnvironment;\n};\n\ntype CreatePlaidLinkTokenResponse = {\n link_token: string;\n};\n\ntype ExchangePlaidPublicTokenResponse = {\n plaidItem: PlaidItem & { plaidItemAccounts: BankAccount[] };\n};\n\nasync function createPlaidLinkToken({ accessToken, plaidItemId, environment }: CreatePlaidLinkTokenParams): Promise<CreatePlaidLinkTokenResponse> {\n if (!accessToken) {\n throw new Error(\"Access token is required to create Plaid link token\");\n }\n const params = {\n path: \"/banks2/createPlaidLinkToken\",\n accessToken,\n endpointManager: getV1EndpointManager(environment),\n };\n const { url, headers } = buildEntityRequest(params);\n\n return get({\n url,\n includeCredentials: true,\n showErrorAlert: true,\n extraHeaders: headers,\n params: plaidItemId ? { plaidItemId } : undefined,\n });\n}\n\ntype ExchangePlaidPublicTokenParams = {\n publicToken: string;\n metadata: PlaidLinkOnSuccessMetadata;\n accessToken: string | undefined;\n environment: TightEnvironment;\n};\n\nasync function exchangePlaidPublicToken({ publicToken, metadata, accessToken, environment }: ExchangePlaidPublicTokenParams): Promise<ExchangePlaidPublicTokenResponse> {\n if (!accessToken) {\n throw new Error(\"Access token is required to create Plaid link token\");\n }\n const params = {\n path: \"/banks2/webPlaidPublicToken\",\n accessToken,\n endpointManager: getV1EndpointManager(environment),\n };\n const { url, headers } = buildEntityRequest(params);\n\n return await post({\n url,\n params: { publicToken, plaidMetadata: metadata },\n includeCredentials: true,\n showErrorAlert: true,\n extraHeaders: headers,\n });\n}\n\nconst BANK_ERRORS = [\"INVALID_CREDENTIALS\", \"INSUFFICIENT_CREDENTIALS\", \"INVALID_MFA\", \"ITEM_LOGIN_REQUIRED\", \"NO_ACCOUNTS\", \"OAUTH_ERROR\", \"PENDING_DISCONNECT\", \"ADDITIONAL_CONSENT_REQUIRED\"];\n\nexport { createPlaidLinkToken, exchangePlaidPublicToken, BANK_ERRORS };\n","import { ButtonBase, ButtonBaseWrapperProps } from \"./ButtonBase\";\nimport { css } from \"../../../styled-system/css\";\nimport { stylist } from \"../../style/stylist\";\nimport { ValidClassName } from \"../../style/validClassNames\";\n\nconst tertiaryButtonStylist = stylist(\n ValidClassName[\"button-tertiary\"],\n css({\n color: \"typography.intent.success\",\n border: \"{borderWidths.md} solid\",\n borderColor: \"border.intent.success\",\n backgroundColor: \"surface.intent.success\",\n\n \"& .Tight-text\": {\n color: \"typography.intent.success\",\n },\n\n \"& path\": {\n stroke: \"icon.intent.success\",\n },\n\n \"&:hover:not(:disabled)\": {\n backgroundColor: \"surface.intent.success.hover\",\n borderColor: \"border.intent.success.hover\",\n \"& .Tight-text\": {\n color: \"typography.intent.success.hover\",\n },\n \"& path\": {\n stroke: \"icon.intent.success.hover\",\n },\n },\n\n \"&:active:enabled, &[data-active='true']:enabled\": {\n backgroundColor: \"surface.intent.success.active\",\n borderColor: \"border.intent.success.active\",\n \"& .Tight-text\": {\n color: \"typography.intent.success.active\",\n },\n \"& path\": {\n stroke: \"icon.intent.success.active\",\n },\n },\n }),\n);\n\nfunction ButtonTertiary({ children, stylists = [], ...props }: ButtonBaseWrapperProps) {\n return (\n <ButtonBase\n stylists={[tertiaryButtonStylist, ...stylists]}\n {...props}\n >\n {children}\n </ButtonBase>\n );\n}\n\nexport { ButtonTertiary };\n","import { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport type { ConfirmDialogProps } from \"react-confirm\";\nimport {\n FloatingFocusManager,\n FloatingOverlay,\n FloatingPortal,\n useDismiss,\n useFloating,\n useInteractions,\n useRole,\n} from \"@floating-ui/react\";\nimport { StrongLabel } from \"../typography/StrongLabel.tsx\";\nimport { Label } from \"../typography/Label.tsx\";\nimport { ButtonPrimary } from \"../inputs/ButtonPrimary.tsx\";\nimport { ReactNode } from \"react\";\nimport { ButtonDanger } from \"../inputs/ButtonDanger.tsx\";\nimport { ButtonTertiary } from \"../inputs/ButtonTertiary.tsx\";\n\nconst alertOverlayStylist = stylist(null, css({\n position: \"fixed\",\n inset: 0,\n minHeight: \"100dvh\",\n display: \"grid\",\n placeItems: \"center\",\n backgroundColor: \"overlay\",\n}));\n\nconst alertDialogStylist = stylist(ValidClassName[\"alert-dialog\"], css({\n background: \"surface.background\",\n borderRadius: \"md\",\n display: \"flex\",\n flexDirection: \"column\",\n padding: \"16px\",\n maxWidth: \"360px\",\n width: \"100%\",\n gap: \"16px\",\n}));\n\nconst alertButtonContainerStylist = stylist(null, css({\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: \"8px\",\n}));\n\ntype AlertButton<T> = {\n key: string;\n label: string;\n onClick?: () => T;\n};\n\ntype AlertProps<T> = {\n title: string;\n body?: ReactNode;\n buttons?: AlertButton<T>[];\n};\n\nconst getButtonType = (key: string) => {\n switch (key) {\n case \"delete\":\n return ButtonDanger;\n case \"success\":\n return ButtonTertiary;\n default:\n return ButtonPrimary;\n }\n};\n\nfunction AlertDialogComponent<T>({\n show,\n proceed,\n title,\n body,\n buttons = [{ key: \"ok\", label: \"OK\" }],\n}: ConfirmDialogProps<AlertProps<T>, T | string>) {\n const { context } = useFloating({\n open: show,\n strategy: \"fixed\",\n });\n\n const dismiss = useDismiss(context, { outsidePress: false, escapeKey: true });\n const role = useRole(context, { role: \"alertdialog\" });\n const { getFloatingProps } = useInteractions([dismiss, role]);\n\n if (!show) {\n return null;\n }\n\n return (\n <FloatingPortal>\n <FloatingOverlay\n lockScroll\n {...alertOverlayStylist}\n >\n <FloatingFocusManager context={context} modal returnFocus>\n <div\n {...getFloatingProps()}\n {...alertDialogStylist}\n >\n <StrongLabel>{title}</StrongLabel>\n {body && typeof body === \"string\"\n ? <Label wrap=\"wrap\">{body}</Label>\n : <>{body}</>}\n <div {...alertButtonContainerStylist}>\n {buttons.map((button) => {\n const ButtonComponent = getButtonType(button.key);\n return (\n <ButtonComponent\n key={button.key}\n onClick={() => button.onClick ? proceed(button.onClick()) : proceed(button.key)}\n >\n <StrongLabel>{button.label}</StrongLabel>\n </ButtonComponent>\n );\n })}\n </div>\n </div>\n </FloatingFocusManager>\n </FloatingOverlay>\n </FloatingPortal>\n );\n}\n\nexport type { AlertButton };\n\nexport { AlertDialogComponent };\n","import { confirmable, ContextAwareConfirmation } from \"react-confirm\";\nimport { AlertDialogComponent } from \"./AlertDialog.tsx\";\n\nconst AlertDialog = ContextAwareConfirmation.createConfirmation(confirmable(AlertDialogComponent));\n\nexport { AlertDialog };\n","export function pluralize(text: string, plural: string, amount: number, includeAmount?: boolean): string {\n const pluralizedText = amount === 1 ? text : plural;\n if (includeAmount) {\n return `${amount} ${pluralizedText}`;\n }\n return pluralizedText;\n}\n","import { useEffect, useState } from \"react\";\nimport { usePlaidLink } from \"react-plaid-link\";\nimport { createPlaidLinkToken, exchangePlaidPublicToken } from \"../../../query/fetches/plaid/plaid.ts\";\nimport { useAccessToken } from \"../../../query/http/useAccessToken.ts\";\nimport { AlertDialog } from \"../../dialogs/alertDialog.ts\";\nimport { pluralize } from \"../../typography/textTransformers.ts\";\nimport { useEnvironment } from \"../../../environment/useEnvironment.ts\";\nimport { Environment } from \"../../../environment/Environment.ts\";\nimport { queryClient } from \"../../../query/queryClient.ts\";\n\nconst failedAlert = (institutionName?: string) => {\n AlertDialog({\n title: \"Uh oh!\",\n body: `${institutionName ? `${institutionName} failed to link.` : \"Something went wrong.\"} Please try again later.`,\n });\n};\n\nconst successAlert = (institutionName: string, numAccounts: number) => {\n return AlertDialog({\n title: \"Success!\",\n body: `Successfully linked ${numAccounts} ${institutionName} ${pluralize(\"account\", \"accounts\", numAccounts)}. Your transactions should begin appearing in a few minutes.`,\n buttons: [{ key: \"success\", label: \"Get started\" }],\n });\n};\n\nfunction useOpenPlaidLink(token: string, accessToken: string | undefined, environment: Environment) {\n return usePlaidLink({\n token,\n onSuccess: async (publicToken, metadata) => {\n try {\n const { plaidItem } = await exchangePlaidPublicToken({ publicToken, metadata, accessToken, environment });\n await successAlert(plaidItem.apiInstitutionName, plaidItem.plaidItemAccounts.length);\n await queryClient.invalidateQueries();\n } catch {\n failedAlert();\n }\n },\n onExit: (error, metadata) => {\n if (error) {\n failedAlert(metadata?.institution?.name);\n }\n },\n });\n}\n\nfunction usePlaidSdk(plaidItemId?: number) {\n const accessToken = useAccessToken();\n const environment = useEnvironment();\n const [linkToken, setLinkToken] = useState(\"\");\n const { open, ready } = useOpenPlaidLink(linkToken, accessToken, environment);\n\n useEffect(() => {\n if (ready && linkToken) {\n open();\n }\n }, [ready, open, linkToken]);\n\n const linkPlaid = async () => {\n try {\n const response = await createPlaidLinkToken({ accessToken, plaidItemId, environment });\n setLinkToken(response.link_token);\n } catch {\n failedAlert();\n }\n };\n\n return { linkPlaid };\n}\n\nexport { usePlaidSdk };\n","import { Banner, BannerProps } from \"../banners/Banner.tsx\";\nimport { usePlaidSdk } from \"./hooks/usePlaidSdk.ts\";\n\ntype PlaidLinkBannerProps = Pick<BannerProps, \"task\">; // onClick handled internally\n\nfunction PlaidLinkBanner({ task }: PlaidLinkBannerProps) {\n const { linkPlaid } = usePlaidSdk(task?.meta?.plaidItemId);\n return (\n <Banner\n task={task}\n handleClick={linkPlaid}\n />\n );\n}\n\nexport {\n PlaidLinkBanner,\n};\n","import { components, operations } from \"../../versions/v5/v5Schema.ts\";\nimport { EntityFetchFn, useEntity, UseEntityOptions, UseEntityResult } from \"../utils/useEntity.ts\";\nimport { v5EntityGet, V5EntityGetRequest } from \"../../http/get.ts\";\nimport { BANK_ERRORS } from \"../plaid/plaid.ts\";\n\ntype GetPlaidItemsResponse = operations[\"getPlaidItems_1\"][\"responses\"][\"200\"][\"content\"][\"application/json\"][\"data\"];\ntype PlaidItem = components[\"schemas\"][\"PlaidItemDTOV4\"];\n\ntype PlaidItemsKey = [\"banks\", \"plaidItems\"];\n\nconst plaidItemsKey = {\n all: (): PlaidItemsKey => [\"banks\", \"plaidItems\"],\n};\n\nconst getPlaidItems: EntityFetchFn<GetPlaidItemsResponse, PlaidItemsKey> = async (queryContext) => {\n const queryKey = queryContext.queryKey;\n const accessToken = queryKey[2].accessToken;\n const environment = queryKey[2].environment;\n\n const params: V5EntityGetRequest = {\n path: \"/banks/plaidItems\",\n accessToken,\n environment,\n };\n\n return await v5EntityGet<GetPlaidItemsResponse>(params);\n};\n\ntype UsePlaidItemsOptions<TData> = Partial<UseEntityOptions<GetPlaidItemsResponse, PlaidItemsKey, TData>>;\n\nfunction usePlaidItems<TData = GetPlaidItemsResponse>(options?: UsePlaidItemsOptions<TData>): UseEntityResult<TData> {\n return useEntity<GetPlaidItemsResponse, PlaidItemsKey, TData>({\n ...options,\n queryKey: plaidItemsKey.all(),\n queryFn: getPlaidItems,\n });\n}\n\nfunction findPlaidItemsWithErrors(plaidItems: GetPlaidItemsResponse) {\n return plaidItems?.filter((item) => {\n return BANK_ERRORS.includes(item.apiErrorCode || \"\");\n });\n}\n\nfunction usePlaidItemsWithErrors() {\n return usePlaidItems({ select: data => findPlaidItemsWithErrors(data) });\n}\n\nexport { usePlaidItemsWithErrors };\n\nexport type { PlaidItem };\n","import { components, operations } from \"../../versions/v5/v5Schema.ts\";\nimport { EntityFetchFn, useEntity, UseEntityOptions, UseEntityResult } from \"../utils/useEntity.ts\";\nimport { v5EntityGet, V5EntityGetRequest } from \"../../http/get.ts\";\nimport { EntityIdPrefixMap } from \"../../../entities/entityIdPrefixMap.ts\";\n\n/** IMPORTANT:\n * This is the only place you should reference the API schema directly for bank accounts.\n * Alias any types you need in this file, then export them.\n * This will make it easier to refactor as the API changes.\n *\n * TODO: Currently this consumes V5 bank account API. This should be refactored to use the V6 API when it becomes available\n */\n\ntype UnprocessedBankAccount = components[\"schemas\"][\"BankAccountGetDTOV5\"];\ntype BankAccount = Omit<UnprocessedBankAccount, \"id\"> & { id: string };\n\ntype GetBankAccountsResponse = operations[\"getBankAccounts\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\ntype ProcessedGetBankAccountsResponse = Omit<GetBankAccountsResponse, \"data\"> & { data?: BankAccount[] };\ntype BankAccountsKey = [\"banks\", \"bankAccounts\"];\n\nconst bankAccountsKeys = {\n all: (): BankAccountsKey => [\"banks\", \"bankAccounts\"],\n};\n\nfunction prefixBankAccountIds(accounts: UnprocessedBankAccount[]): BankAccount[] {\n return accounts.map(account => ({\n ...account,\n id: `${EntityIdPrefixMap.BANK_ACCOUNT}_${account.id}`,\n }));\n}\n\nconst getBankAccounts: EntityFetchFn<ProcessedGetBankAccountsResponse, BankAccountsKey> = async (queryContext) => {\n const queryKey = queryContext.queryKey;\n const accessToken = queryKey[2].accessToken;\n const environment = queryKey[2].environment;\n\n const params: V5EntityGetRequest = {\n path: \"/banks/accounts\",\n accessToken,\n environment,\n };\n\n const res = await v5EntityGet<GetBankAccountsResponse>(params);\n const prefixedAccounts = res.data !== undefined ? prefixBankAccountIds(res.data) : [];\n\n return {\n ...res,\n data: prefixedAccounts,\n };\n};\n\ntype UseBankAccountsOptions<TData> = Partial<UseEntityOptions<ProcessedGetBankAccountsResponse, BankAccountsKey, TData>>;\n\nfunction useBankAccounts<TData = ProcessedGetBankAccountsResponse>(options?: UseBankAccountsOptions<TData>): UseEntityResult<TData> {\n return useEntity<ProcessedGetBankAccountsResponse, BankAccountsKey, TData>({\n ...options,\n queryKey: bankAccountsKeys.all(),\n queryFn: getBankAccounts,\n });\n}\n\nconst findBankAccountByGlAccountId = (bankAccounts: BankAccount[] | undefined, glAccountId: string) => {\n // TODO: do not need to split glAccountId if we use the V6 API\n const splitId = Number(glAccountId.split(\"_\")[1]);\n return bankAccounts?.find(account => Number(account.glAccountId) === splitId);\n};\n\nfunction useSingleBankAccountByGlAccountId(glAccountId: string) {\n return useBankAccounts({ select: bankAccounts => findBankAccountByGlAccountId(bankAccounts.data, glAccountId) });\n}\n\nfunction findBankAccountById(bankAccounts: BankAccount[] | undefined, id: string | undefined) {\n return bankAccounts?.find(account => account.id === id);\n}\n\nconst useSingleBankAccount = (bankAccountId: string | undefined) => {\n const { query: { data: bankAccount } } = useBankAccounts({\n select: data => findBankAccountById(data?.data, bankAccountId),\n });\n return bankAccount;\n};\n\nconst hasPlaidLinkedBankAccount = (bankAccounts: BankAccount[] | undefined) => {\n return bankAccounts?.find(account => account.apiName === \"PLAID\") !== undefined;\n};\n\nconst useHasPlaidLinkedBankAccount = () => {\n return useBankAccounts({ select: data => hasPlaidLinkedBankAccount(data?.data) });\n};\n\nexport {\n bankAccountsKeys,\n useBankAccounts,\n useSingleBankAccount,\n useSingleBankAccountByGlAccountId,\n useHasPlaidLinkedBankAccount,\n};\n\nexport type {\n BankAccount,\n};\n","import { stylist } from \"../../../style/stylist.ts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { ButtonPrimary } from \"../../inputs/ButtonPrimary.tsx\";\nimport { ArrowLeft } from \"../../icon/icons/ArrowLeft.tsx\";\nimport { ArrowRight } from \"../../icon/icons/ArrowRight.tsx\";\nimport { StrongLabel } from \"../../typography/StrongLabel.tsx\";\nimport { createDate, getMonthAndYear, Period } from \"../../../utils/date/date.ts\";\nimport { SmallIcon } from \"../../icon/SmallIcon.tsx\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\n\nconst pickerStylist = stylist(null, css({\n display: \"flex\",\n alignItems: \"center\",\n gap: \"15px\",\n borderRadius: \"md\",\n border: \"1px solid {colors.border.layout}\",\n background: \"surface.foreground\",\n width: \"fit-content\",\n}));\n\nconst leftButtonStylist = stylist(ValidClassName[\"month-picker-left-button\"], css({\n border: \"none\",\n borderRight: \"1px solid {colors.border.layout}\",\n _disabled: {\n cursor: \"default\",\n },\n}));\n\nconst rightButtonStylist = stylist(ValidClassName[\"month-picker-right-button\"], css({\n border: \"none\",\n borderLeft: \"1px solid {colors.border.layout}\",\n _disabled: {\n cursor: \"default\",\n },\n}));\n\nconst labelStylist = stylist(null, css({\n cursor: \"default\",\n display: \"flex\",\n justifyContent: \"center\",\n}));\n\nconst prevMonthHandler = (period: Period): Period => {\n if (period.month === 0) {\n return { month: 11, year: period.year - 1 };\n }\n return { month: period.month - 1, year: period.year };\n};\n\nconst nextMonthHandler = (period: Period): Period => {\n if (period.month === 11) {\n return { month: 0, year: period.year + 1 };\n }\n return { month: period.month + 1, year: period.year };\n};\n\ntype MonthPickerProps = {\n period: Period;\n setPeriod: (period: Period) => void;\n disableNext?: boolean;\n disablePrev?: boolean;\n};\n\nfunction MonthPicker({ period, setPeriod, disableNext = false, disablePrev = false }: MonthPickerProps) {\n const monthYearDate = createDate(period.year, period.month, 1);\n const monthYearLabel = getMonthAndYear(monthYearDate, { abbreviateMonth: true });\n\n return (\n <div {...pickerStylist}>\n <ButtonPrimary stylists={[leftButtonStylist]} onClick={() => setPeriod(prevMonthHandler(period))} disabled={disablePrev}>\n <SmallIcon Component={ArrowLeft} />\n </ButtonPrimary>\n\n <StrongLabel stylists={[labelStylist]}>{monthYearLabel}</StrongLabel>\n\n <ButtonPrimary stylists={[rightButtonStylist]} onClick={() => setPeriod(nextMonthHandler(period))} disabled={disableNext}>\n <SmallIcon Component={ArrowRight} />\n </ButtonPrimary>\n </div>\n );\n}\n\nexport { MonthPicker };\n","import { PropsWithChildren } from \"react\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\n\ntype TileLayoutProps = PropsWithChildren;\n\nconst tileLayoutStylist = stylist(null, css({\n display: \"grid\",\n justifyContent: \"space-evenly\",\n gridTemplateColumns: {\n base: \"repeat(1, 400px)\",\n md: \"repeat(2, 400px)\",\n \"1.5xl\": \"400px 400px 400px minmax(150px, 400px)\",\n },\n gap: \"10px\",\n maxWidth: \"1440px\",\n}));\n\nfunction TileLayout({ children }: TileLayoutProps) {\n return (\n <div {...tileLayoutStylist}>\n {children}\n </div>\n );\n}\n\nexport { TileLayout };\n","import { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { mergeStylists } from \"../../style/mergeStylists.ts\";\nimport { Label } from \"../typography/Label.tsx\";\n\nconst outerBarStylist = stylist(ValidClassName[\"progress-bar\"], css({\n height: \"32px\",\n backgroundColor: \"surface.intent.secondary\",\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n border: \"{borderWidths.lg} solid {colors.border.layout.weak}\",\n borderRadius: \"sm\",\n}));\n\nconst innerBarStylist = stylist(ValidClassName[\"progress-bar-fill\"], css({\n borderRadius: \"sm\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n}));\n\nconst barLabelStylist = stylist(ValidClassName[\"tile-bar-label\"], css({\n paddingLeft: \"10px\",\n}));\n\ntype ProgressBarProps = {\n label?: string;\n percentage: number;\n color: string;\n width?: number;\n};\n\nfunction Bar({ label = \"\", percentage, color, width }: ProgressBarProps) {\n const styleWidth = width === undefined ? \"100%\" : `${width}px`;\n const isInside = percentage >= 50;\n const mergedInnerBarStylist = mergeStylists([innerBarStylist, stylist(null, color)]);\n\n return (\n <div {...outerBarStylist} style={{ width: styleWidth }}>\n <div {...mergedInnerBarStylist} style={{ width: `${percentage}%` }}>\n {isInside && (\n <div {...barLabelStylist}>\n <Label>{label}</Label>\n </div>\n )}\n </div>\n {!isInside && (\n <div {...barLabelStylist}>\n <Label>{label}</Label>\n </div>\n )}\n </div>\n );\n}\n\nexport { Bar };\n","import { stylist } from \"../../style/stylist.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { fontRecipes } from \"../../style/recipes/fontRecipes.ts\";\nimport { PropsWithChildren } from \"react\";\n\ntype MetricMDProps = PropsWithChildren;\n\nconst metricMDStylist = stylist(ValidClassName[\"metric-md\"], fontRecipes({ metric: \"md\" }));\n\nfunction MetricMD(props: MetricMDProps) {\n return (\n <div {...metricMDStylist}>\n {props.children}\n </div>\n );\n}\n\nexport { MetricMD };\n","import { smartMoneySummary } from \"../../utils/money/smartNumber.ts\";\nimport { normalize } from \"../../utils/math/number.ts\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { Bar } from \"../charts/Bar.tsx\";\nimport { MetricMD } from \"../typography/MetricMD.tsx\";\n\nconst rowStylist = stylist(\n null,\n css({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"45px\",\n width: \"100%\",\n }),\n);\n\nconst tileBarLabelStylist = stylist(null, css({\n overflow: \"visible\",\n width: \"80px\",\n display: \"flex\",\n justifyContent: \"end\",\n}));\n\ntype TileBarProps = {\n label?: string;\n amount: number;\n total: number;\n colorCss: string;\n};\n\nconst TileBar = ({ label, amount, total, colorCss }: TileBarProps) => {\n const percent = total > 0 ? normalize(amount, 0, total) : 0;\n\n return (\n <div {...rowStylist}>\n <Bar label={label} percentage={percent} color={colorCss} />\n <div {...tileBarLabelStylist}>\n <MetricMD>{smartMoneySummary(amount)}</MetricMD>\n </div>\n </div>\n );\n};\n\nexport { TileBar };\n","import { ProfitAndLossResponse, useProfitAndLoss } from \"../../query/fetches/report/profitAndLoss.ts\";\nimport { DateOptions } from \"../../utils/date/date.ts\";\nimport { isNullish } from \"../../utils/typeUtils.ts\";\nimport Big from \"big.js\";\n\n// TODO: move to profit loss tile directory when created\n\ntype ProfitAndLossSummary = {\n netIncome: number;\n income: number;\n expenses: number;\n absoluteSum: number;\n};\n\nconst placeholderSummary: ProfitAndLossSummary = {\n netIncome: 0,\n income: 0,\n expenses: 0,\n absoluteSum: 0,\n};\n\nconst processResponse = (response: ProfitAndLossResponse): ProfitAndLossSummary => {\n if (response.result === undefined || response.result === \"FAILURE_NO_DATA\") {\n return placeholderSummary;\n }\n const data = response.json?.data?.[0];\n if (isNullish(data)) {\n return placeholderSummary;\n }\n\n const income = data.income?.total ?? 0;\n const expenses = data.expenses?.total ?? 0;\n const absoluteSum = Big(income)\n .plus(expenses)\n .toNumber();\n\n return {\n netIncome: data.netIncome ?? 0,\n income,\n expenses,\n absoluteSum,\n };\n};\n\nfunction useProfitAndLossSummary({ filter }: { filter: DateOptions }) {\n return useProfitAndLoss<ProfitAndLossSummary>({ filter, select: processResponse });\n}\n\nexport { useProfitAndLossSummary };\n","import * as React from \"react\";\nconst SvgRecurring = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 16, viewBox: \"0 0 16 16\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M13.3131 0.489685V4.15097H9.65182\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M2.32925 15.1348V11.4735H5.99054\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M1.34228 9.57602C1.18256 9.00181 1.10327 8.40823 1.10669 7.81223C1.1074 6.38654 1.56211 4.99811 2.4049 3.8482C3.2477 2.69828 4.4348 1.84664 5.79412 1.41671C7.15345 0.986775 8.61437 1.00089 9.96513 1.45702C11.3159 1.91314 12.4863 2.78757 13.3067 3.95356\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M14.2937 6.04849C14.4534 6.6227 14.5327 7.21628 14.5293 7.81228C14.5286 9.23797 14.0739 10.6264 13.2311 11.7763C12.3883 12.9262 11.2012 13.7779 9.84185 14.2078C8.48253 14.6377 7.02161 14.6236 5.67085 14.1675C4.32008 13.7114 3.14967 12.8369 2.32925 11.671\", strokeMiterlimit: 10 }));\nexport default SvgRecurring;\n","import IconComponent from \"../../../assets/icons/recurring.svg?react\";\nimport { createIcon } from \"../createIcon\";\n\nconst Sync = createIcon(IconComponent, \"Sync\");\n\nexport { Sync };\n","import { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { Sync } from \"../icon/icons/Sync.tsx\";\nimport { MediumIcon } from \"../icon/MediumIcon.tsx\";\nimport { Label } from \"../typography/Label.tsx\";\nimport { usePlaidSdk } from \"../plaid/hooks/usePlaidSdk.ts\";\nimport { fadeBackgroundBorder } from \"../../style/transition.ts\";\nimport { buttonBaseStyle } from \"../../style/buttons.ts\";\n\nconst tilePlaidLinkButtonStylist = stylist(\n null,\n buttonBaseStyle,\n css({\n position: \"absolute\",\n left: 1,\n right: 1,\n bottom: 1,\n width: \"calc(100% - 2)\",\n height: \"44px\",\n background: \"surface.intent.primary\",\n border: \"none\",\n borderRadius: 0,\n gap: 9,\n color: \"icon.intent.primary\",\n pointerEvents: \"all\",\n\n \"&:hover:not(:disabled)\": {\n backgroundColor: \"surface.intent.primary.hover\",\n borderColor: \"border.intent.primary.hover\",\n \"& .Tight-text\": {\n color: \"typography.intent.primary.hover\",\n },\n },\n }),\n fadeBackgroundBorder,\n);\n\nfunction TilePlaidLinkButton() {\n const { linkPlaid } = usePlaidSdk();\n return (\n <button onClick={linkPlaid} {...tilePlaidLinkButtonStylist}>\n <MediumIcon Component={Sync} />\n <Label intent=\"primary\">Link Account</Label>\n </button>\n );\n}\n\nexport { TilePlaidLinkButton };\n","import { ShimmerBlock } from \"../loading/ShimmerBlock.tsx\";\nimport { css } from \"../../../styled-system/css\";\n\nconst tileGraphShimmerStyle = css({ width: 266, minHeight: 32 });\n\nfunction TileGraphShimmer() {\n return <ShimmerBlock styles={tileGraphShimmerStyle} />;\n}\n\nexport { TileGraphShimmer };\n","import { smartMoneySummary } from \"../../../utils/money/smartNumber.ts\";\nimport { TileBar } from \"../TileBar.tsx\";\nimport { DateFilters, DateOptions } from \"../../../utils/date/date.ts\";\nimport { TileHeader } from \"../TileHeader.tsx\";\nimport { TileBody } from \"../TileBody.tsx\";\nimport { Summation } from \"../../typography/Summation.tsx\";\nimport { Tile } from \"../Tile.tsx\";\nimport { css } from \"../../../../styled-system/css\";\nimport { TileGraphs } from \"../TileGraphs.tsx\";\nimport { useProfitAndLossSummary } from \"../useProfitAndLossSummary.ts\";\nimport { TilePlaidLinkButton } from \"../TilePlaidLinkButton.tsx\";\nimport { SampleOverlay } from \"../../zero-states/SampleOverlay.tsx\";\nimport { TileShimmer } from \"../TileShimmer.tsx\";\nimport { TileGraphShimmer } from \"../TileGraphShimmer.tsx\";\n\nconst moneyInCss = css({\n backgroundColor: \"money.positive.weak\",\n});\nconst moneyOutCss = css({\n backgroundColor: \"money.negative.weak\",\n});\n\ntype ProfitAndLossTileProps = {\n defaultRange?: DateOptions;\n isSample?: boolean;\n};\n\nconst sampleData = Object.freeze({\n income: 20200,\n expenses: 5043,\n netIncome: 20200 - 5043, // income - expenses\n absoluteSum: Math.abs(20200) + Math.abs(5043),\n});\n\nconst placeHolderData = Object.freeze({ income: 0, expenses: 0, netIncome: 0, absoluteSum: 0 });\nconst ProfitAndLossTile = ({ defaultRange = DateFilters.THIS_YEAR, isSample = false }: ProfitAndLossTileProps) => {\n // TODO: add date filter options to TileHeader\n const { query: { data }, isFilling } = useProfitAndLossSummary({ filter: defaultRange });\n let profitLossData;\n if (isSample) {\n profitLossData = sampleData;\n } else {\n profitLossData = data ?? placeHolderData;\n }\n\n return (\n <Tile isSample={isSample}>\n <TileHeader\n title=\"Profit + Loss\"\n />\n <TileBody>\n {isFilling\n ? (\n <TileShimmer>\n <TileGraphShimmer />\n <TileGraphShimmer />\n </TileShimmer>\n )\n : (\n <>\n <Summation title={smartMoneySummary(profitLossData.netIncome)} label=\"Profit\" />\n <TileGraphs>\n <TileBar\n amount={profitLossData.income}\n total={profitLossData.absoluteSum}\n colorCss={moneyInCss}\n label=\"Income\"\n />\n <TileBar\n amount={profitLossData.expenses}\n total={profitLossData.absoluteSum}\n colorCss={moneyOutCss}\n label=\"Expenses\"\n />\n </TileGraphs>\n </>\n )}\n </TileBody>\n {isSample && <SampleOverlay size=\"sm\" />}\n {isSample && <TilePlaidLinkButton />}\n </Tile>\n );\n};\n\nexport { ProfitAndLossTile };\nexport type { ProfitAndLossTileProps };\n","import { DateOptions, DateStringRange, getDateRange } from \"../../../utils/date/date.ts\";\nimport { v5EntityPost, V5EntityPostRequest } from \"../../http/post.ts\";\nimport { EntityFetchFn, useEntity } from \"../utils/useEntity.ts\";\nimport { usePrefetch } from \"../utils/usePrefetch.ts\";\nimport { JsonReportV5, ReportParent } from \"../../versions/v5/jsonReportV5.ts\";\nimport { getV5EndpointManager } from \"../../versions/v5/v5EndpointManager.ts\";\nimport { isNullish } from \"../../../utils/typeUtils.ts\";\nimport Big from \"big.js\";\n\ntype CashFlowParams = { exportType: \"JSON\" } & DateStringRange;\n\ntype CashFlowKey = [\n \"reports\",\n \"cashflow\",\n { filter: DateOptions },\n];\n\nconst getCashFlowQueryKey = ({ filter }: { filter: DateOptions }): CashFlowKey => ([\n \"reports\",\n \"cashflow\",\n { filter },\n]);\n\ntype CashFlowSummary = {\n moneyIn: number;\n moneyOut: number;\n netMoneyIn: number;\n};\n\ntype CashFlowResponse = JsonReportV5<[{\n beginCashBalance: number;\n endCashBalance: number;\n financingActivities: ReportParent;\n investingActivities: ReportParent;\n name: string;\n netCashChange: number;\n operatingActivities: ReportParent;\n period: DateStringRange;\n}]>;\n\nfunction calculateCashFlowSummary(operatingActivities: ReportParent): CashFlowSummary {\n let moneyIn = new Big(0);\n let moneyOut = new Big(0);\n\n for (const child of operatingActivities.children) {\n if (child.total < 0) {\n moneyOut = moneyOut.plus(Big(child.total).abs());\n } else {\n moneyIn = moneyIn.plus(child.total);\n }\n }\n\n return {\n moneyIn: moneyIn.toNumber(),\n moneyOut: moneyOut.toNumber(),\n netMoneyIn: operatingActivities.total,\n };\n}\n\nconst placeholderSummary: CashFlowSummary = {\n moneyIn: 0,\n moneyOut: 0,\n netMoneyIn: 0,\n};\n\nfunction processResponse(response: CashFlowResponse): CashFlowSummary {\n const requestFailed = response.result === undefined || response.result === \"FAILURE_NO_DATA\";\n const data = response.json?.data[0];\n\n if (requestFailed || isNullish(data) || isNullish(data.operatingActivities) || !data.operatingActivities.children) {\n return placeholderSummary;\n }\n\n return calculateCashFlowSummary(data.operatingActivities);\n}\n\nconst getCashFlow: EntityFetchFn<CashFlowSummary, CashFlowKey> = async (queryContext) => {\n const queryKey = queryContext.queryKey;\n const queryParams = queryKey[2];\n const accessToken = queryKey[3].accessToken;\n const environment = queryKey[3].environment;\n const params: V5EntityPostRequest<string, CashFlowParams> = {\n path: \"/reports/cashFlowStatementDirect\",\n bodyParams: {\n exportType: \"JSON\",\n ...getDateRange(queryParams.filter),\n },\n method: \"POST\",\n accessToken: accessToken,\n endpointManager: getV5EndpointManager(environment),\n };\n const res = await v5EntityPost<CashFlowResponse, string, CashFlowParams>(params);\n return processResponse(res);\n};\n\nfunction useCashFlow({ filter }: { filter: DateOptions }) {\n return useEntity({ queryKey: getCashFlowQueryKey({ filter }), queryFn: getCashFlow });\n}\n\nfunction useCashFlowPrefetch() {\n return usePrefetch(getCashFlowQueryKey, getCashFlow);\n}\n\nexport {\n useCashFlow,\n getCashFlowQueryKey,\n useCashFlowPrefetch,\n};\n\nexport type {\n CashFlowSummary,\n};\n","import { smartMoneySummary } from \"../../../utils/money/smartNumber.ts\";\nimport { TileBar } from \"../TileBar.tsx\";\nimport { DateFilters, DateOptions } from \"../../../utils/date/date.ts\";\nimport { TileHeader } from \"../TileHeader.tsx\";\nimport { TileBody } from \"../TileBody.tsx\";\nimport { Summation } from \"../../typography/Summation.tsx\";\nimport { Tile } from \"../Tile.tsx\";\nimport { css } from \"../../../../styled-system/css\";\nimport { TileGraphs } from \"../TileGraphs.tsx\";\nimport { useCashFlow } from \"../../../query/fetches/report/cashflow.ts\";\nimport { TilePlaidLinkButton } from \"../TilePlaidLinkButton.tsx\";\nimport { SampleOverlay } from \"../../zero-states/SampleOverlay.tsx\";\nimport { TileGraphShimmer } from \"../TileGraphShimmer.tsx\";\nimport { TileShimmer } from \"../TileShimmer.tsx\";\n\nconst moneyInCss = css({\n backgroundColor: \"money.positive.weak\",\n});\nconst moneyOutCss = css({\n backgroundColor: \"money.negative.weak\",\n});\n\ntype CashFlowTileProps = {\n defaultRange?: DateOptions;\n isSample?: boolean;\n};\n\nconst sampleData = Object.freeze({\n moneyIn: 25300,\n moneyOut: 8150,\n netMoneyIn: 25300 - 8150, // moneyIn - moneyOut\n});\n\nconst placeHolderData = Object.freeze({ moneyIn: 0, moneyOut: 0, netMoneyIn: 0 });\n\nconst CashFlowTile = ({ defaultRange = DateFilters.THIS_YEAR, isSample = false }: CashFlowTileProps) => {\n // TODO: add date filter options to TileHeader\n const { query: { data, isFetched }, isFilling } = useCashFlow({ filter: defaultRange });\n let cashFlowData;\n if (isSample) {\n cashFlowData = sampleData;\n } else {\n cashFlowData = data ?? placeHolderData;\n }\n\n let absoluteSum = 0;\n if (isSample || isFetched) {\n absoluteSum = Math.abs(cashFlowData.moneyIn) + Math.abs(cashFlowData.moneyOut);\n }\n\n return (\n <Tile isSample={isSample}>\n <TileHeader\n title=\"Cash Flow\"\n />\n <TileBody>\n {isFilling\n ? (\n <TileShimmer>\n <TileGraphShimmer />\n <TileGraphShimmer />\n </TileShimmer>\n )\n : (\n <>\n <Summation title={smartMoneySummary(cashFlowData.netMoneyIn)} label=\"Change in Cash\" />\n <TileGraphs>\n <TileBar amount={cashFlowData.moneyIn} total={absoluteSum} colorCss={moneyInCss} label=\"Money In\" />\n <TileBar amount={cashFlowData.moneyOut} total={absoluteSum} colorCss={moneyOutCss} label=\"Money Out\" />\n </TileGraphs>\n </>\n )}\n </TileBody>\n {isSample && <SampleOverlay size=\"sm\" />}\n {isSample && <TilePlaidLinkButton />}\n </Tile>\n );\n};\n\nexport { CashFlowTile };\nexport type { CashFlowTileProps };\n","import { Bullet } from \"../charts/Bullet.tsx\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { Label } from \"../typography/Label.tsx\";\n\nconst tileBulletStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"10px\",\n width: \"100%\",\n}));\n\nconst tileBulletLabelStylist = stylist(null, css({\n display: \"flex\",\n justifyContent: \"end\",\n}));\n\ntype TileBulletProps = {\n color: string;\n bulletLabel: string;\n moneySummary: string;\n};\n\nfunction TileBullet({ color, bulletLabel, moneySummary }: TileBulletProps) {\n return (\n <div {...tileBulletStylist}>\n <Bullet color={color} label={bulletLabel} />\n <div {...tileBulletLabelStylist}>\n <Label>{moneySummary}</Label>\n </div>\n </div>\n );\n}\n\nexport { TileBullet };\n","import { ExpenseChildDTO, ProfitAndLossResponse, useProfitAndLoss } from \"../../../query/fetches/report/profitAndLoss.ts\";\nimport { DateOptions } from \"../../../utils/date/date.ts\";\nimport { isNullish } from \"../../../utils/typeUtils.ts\";\n\ntype ExpenseChild = {\n name: string;\n total: number;\n};\n\ntype ExpenseSummary = {\n total: number;\n children: ExpenseChild[];\n};\n\nconst getTopThreeExpenses = (expenses: ExpenseChildDTO[]): ExpenseChild[] => {\n const sortedExpenses = expenses.sort((a, b) => (\n (b.total ?? 0) - (a.total ?? 0)\n ));\n\n return sortedExpenses\n .slice(0, 3)\n .map(expense => ({\n name: expense.name ?? \"\",\n total: expense.total ?? 0,\n }));\n};\n\nconst placeholderSummary = {\n total: 0,\n children: [],\n};\n\nconst processResponse = (response: ProfitAndLossResponse): ExpenseSummary => {\n const requestFailed = response.result === undefined || response.result === \"FAILURE_NO_DATA\";\n const data = response.json?.data?.[0];\n\n if (requestFailed || isNullish(data) || isNullish(data.expenses) || !data.expenses.children) {\n return placeholderSummary;\n }\n\n return {\n total: data.expenses.total ?? 0,\n children: getTopThreeExpenses(data.expenses.children),\n };\n};\n\nfunction useExpenseSummary({ filter }: { filter: DateOptions }) {\n return useProfitAndLoss<ExpenseSummary>({ filter, select: processResponse });\n}\n\nexport { useExpenseSummary };\n","import { Bullet } from \"../../charts/Bullet.tsx\";\nimport { token } from \"../../../../styled-system/tokens\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { ShimmerBlock } from \"../../loading/ShimmerBlock.tsx\";\n\nconst placeholderBulletsStylist = stylist(null, css({\n display: \"flex\",\n gap: \"10px\",\n alignItems: \"center\",\n}));\n\nconst placeholderLabelCss = css({\n width: \"200px\",\n height: \"16px\",\n backgroundColor: \"brand.secondary\",\n});\n\nconst placeholderLabelStylist = stylist(null, placeholderLabelCss);\n\ntype PlaceholderBulletsProps = {\n bulletAmount?: number;\n shimmer?: boolean;\n};\n\nfunction PlaceholderBullets({ bulletAmount = 3, shimmer = false }: PlaceholderBulletsProps) {\n return (\n <>\n {Array.from({ length: bulletAmount }, (_, index) => (\n <div key={index} {...placeholderBulletsStylist}>\n <Bullet\n color={token.var(\"colors.brand.secondary\")}\n />\n {shimmer ? <ShimmerBlock styles={placeholderLabelCss} /> : <div {...placeholderLabelStylist} />}\n </div>\n ))}\n </>\n\n );\n}\n\nexport { PlaceholderBullets };\n","import { Tile } from \"../Tile.tsx\";\nimport { TileHeader } from \"../TileHeader.tsx\";\nimport { TileBody } from \"../TileBody.tsx\";\nimport { TileGraphs } from \"../TileGraphs.tsx\";\nimport { TileBullet } from \"../TileBullet.tsx\";\nimport { Summation } from \"../../typography/Summation.tsx\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { DateFilters, DateOptions, MONTH_NAMES } from \"../../../utils/date/date.ts\";\nimport { useExpenseSummary } from \"./useExpenseSummary.ts\";\nimport { smartMoneySummary } from \"../../../utils/money/smartNumber.ts\";\nimport { token } from \"../../../../styled-system/tokens\";\nimport { useGlobalStore } from \"../../../store/globalStore.ts\";\nimport { PlaceholderBullets } from \"../../dashboards/loading/PlaceholderBullets.tsx\";\nimport { TilePlaidLinkButton } from \"../TilePlaidLinkButton.tsx\";\nimport { SampleOverlay } from \"../../zero-states/SampleOverlay.tsx\";\nimport { TileShimmer } from \"../TileShimmer.tsx\";\n\nconst summationsStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n width: \"100%\",\n}));\n\nconst DEFAULT_TILE_COLORS = [\n token.var(\"colors.brand.primary\"),\n token.var(\"colors.brand.success\"),\n token.var(\"colors.brand.action\"),\n];\n\nconst sampleData = Object.freeze({\n total: 5043,\n children: [\n { name: \"Plane/Train/Bus\", total: 2500 },\n { name: \"Business Meals\", total: 1800 },\n { name: \"Employee Entertainment\", total: 743 },\n ],\n});\n\nconst placeholderData = Object.freeze({\n total: 0,\n children: [],\n});\n\ntype ExpenseTileProps = {\n defaultRange?: DateOptions;\n monthIndex?: number; // TODO: consider changing\n isSample?: boolean;\n};\n\nfunction ExpenseTile({ defaultRange = DateFilters.THIS_YEAR, monthIndex, isSample = false }: ExpenseTileProps) {\n const options = useGlobalStore(state => state.externalOptions);\n const tileColors = options.dataVisualizationColors ?? DEFAULT_TILE_COLORS;\n\n const { query: { data }, isFilling } = useExpenseSummary({ filter: defaultRange });\n let expenseData;\n if (isSample) {\n expenseData = sampleData;\n } else {\n expenseData = data ?? placeholderData;\n }\n\n const summationLabel = monthIndex === undefined ? \"Total Expenses\" : `${MONTH_NAMES[monthIndex]} Total`;\n const hasExpenses = expenseData.children.length > 0;\n\n return (\n <Tile isSample={isSample}>\n <TileHeader title=\"Expenses\" />\n <TileBody>\n {isFilling\n ? (\n <TileShimmer>\n <PlaceholderBullets shimmer />\n </TileShimmer>\n )\n : (\n <>\n <div {...summationsStylist}>\n <Summation title={smartMoneySummary(expenseData.total)} label={summationLabel} />\n </div>\n <TileGraphs>\n {hasExpenses\n ? expenseData.children.map((child, index) => (\n <TileBullet\n key={index}\n color={tileColors[index]}\n bulletLabel={child.name}\n moneySummary={smartMoneySummary(child.total)}\n />\n ))\n : <PlaceholderBullets />}\n </TileGraphs>\n </>\n )}\n </TileBody>\n {isSample && <SampleOverlay size=\"sm\" />}\n {isSample && <TilePlaidLinkButton />}\n </Tile>\n );\n}\n\nexport { ExpenseTile };\n","import { Label } from \"../typography/Label.tsx\";\nimport { css } from \"../../../styled-system/css\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { SubLabel } from \"../typography/SubLabel.tsx\";\nimport { LargeIcon } from \"../icon/LargeIcon.tsx\";\nimport { ArrowRight } from \"../icon/icons/ArrowRight.tsx\";\n\nconst reviewReportsButtonStylist = stylist(null, css({\n minWidth: \"150px\",\n width: \"100%\",\n height: \"300px\",\n opacity: 0.6,\n background: \"surface.intent.action.disabled\",\n cursor: \"not-allowed\",\n border: \"1px solid {colors.border.intent.action.disabled}\",\n gap: \"8px\",\n}));\n\nfunction ReviewReportsButton() {\n return (\n <button disabled={true} {...reviewReportsButtonStylist}>\n <LargeIcon Component={ArrowRight} />\n <Label>Review Reports</Label>\n <SubLabel>Coming soon</SubLabel>\n </button>\n );\n}\n\nexport { ReviewReportsButton };\n","import { DashHeaderLayout } from \"../dashboards/BusinessOwnerDashboard/DashHeaderLayout.tsx\";\nimport { MonthPicker } from \"../dashboards/pagination/MonthPicker.tsx\";\nimport { getMonthRange, isSamePeriod, Period } from \"../../utils/date/date.ts\";\nimport { TileLayout } from \"./TileLayout.tsx\";\nimport { ProfitAndLossTile } from \"./ProfitLoss/ProfitAndLossTile.tsx\";\nimport { CashFlowTile } from \"./CashFlow/CashFlowTile.tsx\";\nimport { ExpenseTile } from \"./Expense/ExpenseTile.tsx\";\nimport { ReviewReportsButton } from \"./ReviewReportsButton.tsx\";\nimport { Heading } from \"../typography/Heading.tsx\";\nimport { css } from \"../../../styled-system/css\";\nimport { stylist } from \"../../style/stylist.ts\";\n\ntype BusinessOwnerMonthlyReviewSectionProps = {\n period: Period;\n todayPeriod: Period;\n handleDateChange: (newPeriod: Period) => void;\n showSamples: boolean;\n};\n\nconst monthlyReviewSectionStylist = stylist(null, css({ display: \"flex\", flexDirection: \"column\", gap: \"10px\", maxWidth: \"1440px\" }));\n\nfunction BusinessOwnerMonthlyReviewSection({ period, handleDateChange, todayPeriod, showSamples }: BusinessOwnerMonthlyReviewSectionProps) {\n const monthRange = getMonthRange(period.month, period.year);\n\n return (\n <div {...monthlyReviewSectionStylist}>\n <DashHeaderLayout>\n <Heading>Monthly Review</Heading>\n <MonthPicker\n period={period}\n setPeriod={handleDateChange}\n disableNext={isSamePeriod(period, todayPeriod)}\n />\n </DashHeaderLayout>\n {/* TODO: add test cases for styling and labels when isSample is true -- hiting upstack */}\n <TileLayout>\n <ProfitAndLossTile defaultRange={monthRange} isSample={showSamples} />\n <CashFlowTile defaultRange={monthRange} isSample={showSamples} />\n <ExpenseTile defaultRange={monthRange} monthIndex={period.month} isSample={showSamples} />\n <ReviewReportsButton />\n </TileLayout>\n </div>\n );\n}\n\nexport { BusinessOwnerMonthlyReviewSection };\n","import { css } from \"../../../styled-system/css\";\nimport { ShimmerBlock } from \"../loading/ShimmerBlock.tsx\";\n\nconst bannerShimmerStyle = css({\n width: \"100%\",\n height: 72,\n minWidth: \"300px\",\n});\n\nfunction BannerShimmer() {\n return (\n <>\n <ShimmerBlock styles={bannerShimmerStyle} />\n <ShimmerBlock styles={bannerShimmerStyle} />\n <ShimmerBlock styles={bannerShimmerStyle} />\n </>\n );\n}\n\nexport { BannerShimmer };\n","import { useState, useMemo } from \"react\";\nimport {\n BankTransactionDirectionParams,\n BankTransactionOrderByParams,\n QueryBankTransactionsSortOrderByParams,\n QueryBankTransactionsSortParams,\n} from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { QuerySortParams } from \"../../tableSortContext.tsx\";\n\nconst transactionSortDefs: Record<NonNullable<QueryBankTransactionsSortOrderByParams>, {\n ASC: string;\n DESC: string;\n}> = {\n DATE: {\n ASC: \"Oldest to Newest\",\n DESC: \"Newest to Oldest\",\n },\n DESCRIPTION: {\n ASC: \"A-Z\",\n DESC: \"Z-A\",\n },\n AMOUNT: {\n ASC: \"Lowest to Highest\",\n DESC: \"Highest to Lowest\",\n },\n STATUS: {\n ASC: \"A-Z\",\n DESC: \"Z-A\",\n },\n REVIEW_STATUS: {\n ASC: \"A-Z\",\n DESC: \"Z-A\",\n },\n};\n\nfunction isBankTransactionSort(sort: QuerySortParams): sort is QueryBankTransactionsSortParams {\n if (sort === undefined) {\n return true;\n }\n\n const correctOrderBy = (sort.orderBy && sort.orderBy in BankTransactionOrderByParams) ?? false;\n const correctDirection = (sort.direction && sort.direction in BankTransactionDirectionParams) ?? false;\n\n return correctOrderBy && correctDirection;\n}\n\nfunction useTransactionSort() {\n const [sortInstance, setSortInstance] = useState<QueryBankTransactionsSortParams | undefined>(undefined);\n\n const setSortInstanceWrapper = (sort: QuerySortParams) => {\n if (!isBankTransactionSort(sort)) {\n return;\n }\n setSortInstance(sort);\n };\n\n const apiSort = useMemo(() => {\n // Only return sort if it has meaningful values\n if (!sortInstance || (!sortInstance.orderBy && !sortInstance.direction)) {\n return undefined;\n }\n return sortInstance;\n }, [sortInstance]);\n\n return { sortInstance, setSortInstance: setSortInstanceWrapper, apiSort };\n}\n\nexport { transactionSortDefs, useTransactionSort };\n","import * as React from \"react\";\nconst SvgCheck = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 10, height: 10, viewBox: \"0 0 10 10\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { id: \"icon/check\" }, /* @__PURE__ */ React.createElement(\"path\", { id: \"Vector\", d: \"M0.986511 5L3.66217 7.67566L9.01349 2.32434\", stroke: \"white\", strokeWidth: 1.25, strokeMiterlimit: 10 })));\nexport default SvgCheck;\n","import IconComponent from \"../../../assets/icons/check.svg?react\";\nimport { createIcon } from \"../createIcon\";\n\nconst Check = createIcon(IconComponent, \"Check\");\n\nexport { Check };\n","import { MouseEvent, useState } from \"react\";\nimport { stylist } from \"../../style/stylist\";\nimport { css } from \"../../../styled-system/css\";\nimport { Check } from \"../icon/icons/Check\";\nimport { TinyIcon } from \"../icon/TinyIcon\";\nimport { fadeBackground } from \"../../style/transition\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\ntype CheckboxInputProps = {\n checked?: boolean;\n onClick?: (event: MouseEvent<HTMLButtonElement>) => void;\n};\n\nconst checkboxCss = css({\n width: \"15px\",\n height: \"15px\",\n borderRadius: \"sm\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0,\n margin: 0,\n position: \"relative\",\n\n \"&::before\": {\n content: \"''\",\n position: \"absolute\",\n top: \"-10px\",\n left: \"-10px\",\n right: \"-10px\",\n bottom: \"-10px\",\n },\n\n \"&[data-is-checked='false']:hover\": {\n backgroundColor: \"surface.background.hover\",\n },\n});\n\nconst uncheckedCss = css({\n border: \"{borderWidths.lg} solid\",\n borderColor: \"border.layout.strong\",\n background: \"surface.foreground\",\n});\n\nconst checkedCss = css({\n background: \"brand.primary.strong\",\n border: \"none\",\n});\n\nfunction CheckboxInput({ checked, onClick }: CheckboxInputProps) {\n const [uncontrolledChecked, setUncontrolledChecked] = useState(checked ?? false);\n const isChecked = checked === undefined ? uncontrolledChecked : checked;\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (checked === undefined) {\n setUncontrolledChecked(!uncontrolledChecked);\n }\n if (onClick) {\n onClick(event);\n }\n };\n\n return (\n <button\n {...stylist(ValidClassName[\"checkbox-input\"], checkboxCss, isChecked ? checkedCss : uncheckedCss, fadeBackground)}\n type=\"button\"\n onClick={handleClick}\n data-is-checked={isChecked}\n >\n {isChecked && <TinyIcon Component={Check} />}\n </button>\n );\n}\n\nexport type { CheckboxInputProps };\nexport { CheckboxInput };\n","import { MouseEvent } from \"react\";\nimport { CheckboxInput } from \"../../inputs/CheckboxInput.tsx\";\nimport { css } from \"../../../../styled-system/css\";\nimport { stylist } from \"../../../style/stylist.ts\";\n\ntype CheckboxCellProps = {\n checked: boolean;\n onClick: (event: MouseEvent<HTMLButtonElement>) => void;\n};\n\nconst checkboxCellStylist = stylist(null, css({\n paddingLeft: \"20px\",\n paddingRight: \"5px\",\n}));\n\nfunction CheckboxCell({ checked, onClick }: CheckboxCellProps) {\n return (\n <div {...checkboxCellStylist}>\n <CheckboxInput checked={checked} onClick={onClick} />\n </div>\n );\n}\n\nexport { CheckboxCell };\n\nexport type { CheckboxCellProps };\n","import { PropsWithChildren } from \"react\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { ellipsisText } from \"../../style/text.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\nconst textStylist = stylist(ValidClassName.text, css({\n fontSize: \"sm\",\n fontWeight: \"sm\",\n color: \"typography.base\",\n fontStyle: \"normal\",\n letterSpacing: \"0.66px\",\n maxWidth: \"100%\",\n}), ellipsisText);\n\nfunction SubContent({ children }: PropsWithChildren) {\n return <div {...textStylist}>{children}</div>;\n}\n\nexport { SubContent };\n","import { Label } from \"../../typography/Label.tsx\";\nimport { SubContent } from \"../../typography/SubContent.tsx\";\nimport { ReactNode } from \"react\";\nimport { css } from \"../../../../styled-system/css\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\n\ntype DateCellProps = {\n date: string;\n annotation?: ReactNode;\n};\n\nconst dateCellStylist = stylist(ValidClassName[\"date-cell\"], css({\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n justifyContent: \"center\",\n}));\n\nfunction DateCell({ date, annotation }: DateCellProps) {\n return (\n <div {...dateCellStylist}>\n {annotation && (\n <SubContent>{annotation}</SubContent>\n )}\n <Label>{date}</Label>\n </div>\n );\n}\n\nexport { DateCell };\n","import { BankTransaction } from \"../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { CssReturn } from \"../../style/stylist.ts\";\n\ntype TransactionTypeLabel = {\n type: BankTransaction[\"type\"];\n displayName: string;\n css: CssReturn;\n};\n\ntype TypeLabelGetter = (transaction: BankTransaction) => TransactionTypeLabel;\n\nconst withdrawalCss = css({ color: \"money.negative\" });\nconst depositCss = css({ color: \"money.positive\" });\n\nconst expenseTypeLabel: TypeLabelGetter = (transaction) => {\n const isRefund = transaction.amount > 0;\n let displayName: string;\n if (isRefund) {\n displayName = \"Expense Refund\";\n } else if (transaction.children?.length > 0) {\n displayName = \"Split Expense\";\n } else {\n displayName = \"Expense\";\n }\n const colorCss = isRefund ? depositCss : withdrawalCss;\n // TODO: handle bills\n // TODO: handle payroll expenses\n return {\n type: \"EXPENSE\",\n displayName,\n css: colorCss,\n };\n};\n\nconst revenueTypeLabel: TypeLabelGetter = (transaction) => {\n const isRefund = transaction.amount < 0;\n const displayName = isRefund ? \"Income Refund\" : \"Income\";\n const colorCss = isRefund ? withdrawalCss : depositCss;\n return {\n type: \"REVENUE\",\n displayName,\n css: colorCss,\n };\n};\n\nconst transferTypeLabel: TypeLabelGetter = (transaction) => {\n let displayName = \"Bank Transfer\";\n if (transaction.children?.length > 0) {\n displayName = \"Payout\";\n }\n return {\n type: \"BANK_TRANSFER\",\n displayName,\n css: transaction.amount < 0 ? withdrawalCss : depositCss,\n };\n};\n\nconst taxPaymentTypeLabel: TypeLabelGetter = () => {\n return {\n type: \"TAX_PAYMENT\",\n displayName: \"Tax Payment\",\n css: withdrawalCss,\n };\n};\n\nconst invoicePaymentTypeLabel: TypeLabelGetter = (transaction: BankTransaction) => {\n let displayName = \"Invoice Payment\";\n let css = depositCss;\n if (transaction.amount < 0) {\n displayName = \"Invoice Payment Refund\";\n css = withdrawalCss;\n }\n return {\n type: \"INVOICE_PAYMENT\",\n displayName,\n css,\n };\n};\n\nconst transactionTypeLabel: TypeLabelGetter = (transaction) => {\n let labelData: TransactionTypeLabel | undefined;\n switch (transaction.type) {\n case \"EXPENSE\":\n labelData = expenseTypeLabel(transaction);\n break;\n case \"REVENUE\":\n labelData = revenueTypeLabel(transaction);\n break;\n case \"BANK_TRANSFER\":\n labelData = transferTypeLabel(transaction);\n break;\n case \"TAX_PAYMENT\":\n labelData = taxPaymentTypeLabel(transaction);\n break;\n case \"INVOICE_PAYMENT\":\n labelData = invoicePaymentTypeLabel(transaction);\n break;\n }\n return labelData;\n};\n\nexport {\n transactionTypeLabel,\n};\n","import { DateCell } from \"../../../dashboards/cells/DateCell.tsx\";\nimport { transactionTypeLabel } from \"../../../../utils/transactions/typeLabel.ts\";\nimport { BankTransaction } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { stylist } from \"../../../../style/stylist.ts\";\nimport { ValidClassName } from \"../../../../style/validClassNames.ts\";\n\ntype TransactionDateCellProps = {\n transaction: BankTransaction;\n};\n\nfunction TransactionDateCell({ transaction }: TransactionDateCellProps) {\n const typeLabel = transactionTypeLabel(transaction);\n const typeLabelStylist = stylist(ValidClassName[\"transaction-type-label\"], typeLabel.css);\n const annotation = <span {...typeLabelStylist}>{typeLabel.displayName}</span>;\n return (\n <DateCell date={transaction.date} annotation={annotation} />\n );\n}\n\nexport { TransactionDateCell };\n","import { SubLabel } from \"../../typography/SubLabel.tsx\";\nimport { StrongLabel } from \"../../typography/StrongLabel.tsx\";\n\ntype SourceCellProps = {\n label: string;\n subLabel?: string;\n};\n\nfunction SourceCell({ label, subLabel }: SourceCellProps) {\n return (\n <>\n <StrongLabel>{label}</StrongLabel>\n <SubLabel>{subLabel}</SubLabel>\n </>\n );\n}\n\nexport {\n SourceCell,\n};\n\nexport type {\n SourceCellProps,\n};\n","import { BankTransaction } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { SourceCell } from \"../../../dashboards/cells/SourceCell.tsx\";\n\ntype TransactionSourceCellProps = {\n bankTransaction: BankTransaction;\n};\n\nfunction TransactionSourceCell({ bankTransaction }: TransactionSourceCellProps) {\n return (\n <SourceCell\n label={bankTransaction.description}\n subLabel={bankTransaction.bankAccount?.name}\n />\n );\n}\n\nexport { TransactionSourceCell };\n","import Big from \"big.js\";\n/**\n * Given an amount of cents, returns a dollar amount with precision.\n * @param cents - The amount of cents to convert to a dollar amount\n */\nfunction convertCentsToDollars(cents: number): number {\n return new Big(cents).div(100).toNumber();\n}\n\nfunction convertDollarsToCents(dollars: number): number {\n return new Big(dollars).times(100).toNumber();\n}\n\nexport { convertCentsToDollars, convertDollarsToCents };\n","import { BankTransaction, ChildBankTransaction } from \"../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { convertCentsToDollars } from \"../money/convertCentsToDollars.ts\";\nimport { formatMoney } from \"../money/smartNumber.ts\";\n/**\n * Maps a child bank transaction to a full bank transaction, with all the newly added fields set to null or empty array.\n * This allows us to leverage tanstack table subrows, which expect subrows to have the same shape as their parents.\n * This is api-safe, when posted the backend ignores the new fields.\n * @param child child bank transaction to convert into a full bank transaction\n * @param parentId\n * @param children\n */\nfunction convertChildToBankTransaction(child: ChildBankTransaction, parentId: BankTransaction[\"id\"], children: ChildBankTransaction[]) {\n return {\n parentId: parentId,\n parentsChildren: children,\n ...child,\n matchingBankTransaction: null,\n rule: null,\n tax: { paymentInfo: null },\n customData: null,\n children: [],\n conversation: null,\n } as BankTransaction;\n}\n\n/**\n * Returns the dollar amount of a bank transaction, truncated to the nearest 100th of a cent.\n * @param transaction\n */\nfunction getSignedAmount(transaction: BankTransaction): string {\n const dollars = convertCentsToDollars(transaction.amount);\n return formatMoney(dollars);\n}\n\nexport {\n convertChildToBankTransaction,\n getSignedAmount,\n};\n","import { Label } from \"../../typography/Label.tsx\";\nimport { BankTransaction } from \"../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { getSignedAmount } from \"../../../utils/transactions/transactionUtils.ts\";\n\ntype AmountCellProps = {\n transaction: BankTransaction;\n};\n\nfunction AmountCell({ transaction }: AmountCellProps) {\n return (\n <Label>{getSignedAmount(transaction)}</Label>\n );\n}\n\nexport { AmountCell };\n","import { css } from \"../../../../styled-system/css\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { StrongLabel } from \"../../typography/StrongLabel.tsx\";\nimport { SubLabel } from \"../../typography/SubLabel.tsx\";\n\ntype BankAccountCellProps = {\n annotation?: string;\n accountName?: string;\n};\n\nconst bankAccountCellStylist = stylist(null, css({\n padding: \"0 25px\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n justifyContent: \"center\",\n gap: \"4px\",\n}));\n\nfunction BankAccountCell({ annotation, accountName }: BankAccountCellProps) {\n return (\n // TODO: replace with a CellButton if and when bank accounts are updateable in rows\n <div {...bankAccountCellStylist}>\n {annotation && <SubLabel>{annotation}</SubLabel>}\n {accountName && <StrongLabel>{accountName}</StrongLabel>}\n </div>\n );\n}\n\nexport { BankAccountCell };\n","function formatGlAccount(accountNo?: string, accountName?: string) {\n const accountNumber = accountNo ? `#${accountNo}` : \"\";\n const name = accountName ?? \"\";\n return `${accountNumber} ${name}`.trim();\n}\n\nexport {\n formatGlAccount,\n};\n","import { forwardRef, PropsWithChildren } from \"react\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { fadeBackground } from \"../../style/transition.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\ntype CellButtonProps = PropsWithChildren<{ onMouseEnter?: (params: unknown) => void; onMouseLeave?: (params: unknown) => void }>;\n\nconst cellButtonStylist = stylist(ValidClassName[\"cell-button\"], css({\n border: \"none\",\n backgroundColor: \"transparent\",\n padding: \"0 25px\",\n gap: \"10px\",\n margin: 0,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-start\",\n flexDirection: \"row\",\n flex: 1,\n outline: \"none\",\n borderRadius: \"md\",\n boxShadow: \"0 0 0 0 transparent\",\n\n \"&:focus-visible\": {\n transition: \"none\",\n position: \"relative\",\n },\n\n \"&:focus-visible::before\": {\n content: \"''\",\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"md\",\n outline: \"4px solid\",\n outlineColor: \"border.layout\",\n pointerEvents: \"none\",\n },\n\n \"&:hover\": {\n backgroundColor: \"surface.intent.action.hover\",\n },\n\n \"&[data-state='open']\": {\n backgroundColor: \"surface.intent.action.active\",\n },\n\n \"& .Tight-text\": {\n position: \"relative\",\n },\n\n \"& .Tight-text::after\": {\n content: \"''\",\n position: \"absolute\",\n bottom: 0,\n left: 0,\n width: 0,\n height: \"1px\",\n backgroundColor: \"currentColor\",\n transition: \"width 100ms ease-out\",\n },\n\n \"&:hover .Tight-text::after, &[data-state='open'] > .Tight-text::after\": {\n width: \"100%\",\n transition: \"width 300ms ease-out\",\n },\n}), fadeBackground);\n\nconst CellButton = forwardRef<HTMLButtonElement, CellButtonProps>(\n function CellButton({ children, ...props }, ref) {\n return (\n <button ref={ref} {...cellButtonStylist} {...props}>\n {children}\n </button>\n );\n });\n\nexport { CellButton };\n","import { createContext, RefObject } from \"react\";\nimport { ItemData, RegisterListItem, UnregisterListItem } from \"../../../utils/dom/useListData.ts\";\nimport { Nullable } from \"../../../utils/utilityTypes.ts\";\n\ntype PopupListContextValue = {\n readonly map: Map<Element, ItemData>;\n readonly register: RegisterListItem;\n readonly unregister: UnregisterListItem;\n readonly focusedIndex: Nullable<number>;\n readonly isMousing: boolean;\n readonly isScrolling: boolean;\n readonly listRef: RefObject<Nullable<HTMLDivElement>> | undefined;\n readonly popupNodeId: string | undefined;\n};\n\nconst defaultValue = Object.freeze({\n map: new Map(),\n register: () => {},\n unregister: () => {},\n focusedIndex: null,\n isMousing: true,\n isScrolling: false,\n listRef: undefined,\n popupNodeId: undefined,\n});\n\nconst PopupListContext = createContext<PopupListContextValue>(defaultValue);\n\nexport {\n PopupListContext,\n};\n","import { Nullable } from \"../utilityTypes.ts\";\nimport { useContext, useEffect, useReducer, useRef, useState } from \"react\";\nimport { PopupListContext } from \"../../components/popup/list/PopupListContext.tsx\";\nimport { UsePopupCascadeManagerReturn } from \"../../components/popup/hooks/usePopupCascadeManager.ts\";\n\ntype FocusedState = {\n focusedIndex: Nullable<number>;\n maxIndex: number;\n};\n\ntype ArrowNavigationAction = { type: \"increment\" | \"decrement\"; repeat: boolean };\ntype HoverNavigationAction = { type: \"set\"; focusedIndex: number };\ntype SizeAdjustNavigationAction = { type: \"max\"; max: number };\ntype ListNavigationAction = ArrowNavigationAction | HoverNavigationAction | SizeAdjustNavigationAction;\n\nconst incrementFocusedState = (state: FocusedState, action: ArrowNavigationAction) => {\n let newIndex: number;\n if (state.focusedIndex === null) {\n newIndex = 0;\n } else {\n const next = state.focusedIndex + 1;\n // if button is being held, don't jump back to top of list\n if (!action.repeat && next > state.maxIndex) {\n newIndex = 0;\n } else {\n newIndex = Math.min(next, state.maxIndex);\n }\n }\n return { ...state, focusedIndex: newIndex };\n};\n\nconst decrementFocusedState = (state: FocusedState, action: ArrowNavigationAction) => {\n let newIndex: number;\n if (state.focusedIndex === null) {\n // start at bottom of list if first interaction is to decrement\n newIndex = state.maxIndex;\n } else {\n const prev = state.focusedIndex - 1;\n // if button is being held, don't jump back to bottom of list\n if (!action.repeat && prev < 0) {\n newIndex = state.maxIndex;\n } else {\n newIndex = Math.max (prev, 0);\n }\n }\n return { ...state, focusedIndex: newIndex };\n};\n\nfunction reducer(state: FocusedState, action: ListNavigationAction): FocusedState {\n switch (action.type) {\n case \"increment\":\n return incrementFocusedState(state, action);\n case \"decrement\":\n return decrementFocusedState(state, action);\n case \"set\":\n // directly set index to any value < the provided max\n return { ...state, focusedIndex: Math.min(action.focusedIndex, state.maxIndex) };\n case \"max\":\n return { ...state, maxIndex: action.max };\n }\n}\n\nfunction useVerticalListNavigation(max: number, cascadeManager: UsePopupCascadeManagerReturn) {\n const listRef = useRef<HTMLDivElement | null>(null);\n const [isMousing, setIsMousing] = useState(true);\n const [isScrolling, setIsScrolling] = useState(false);\n\n const parentListContext = useContext(PopupListContext);\n\n // if inside a cascading popup, automatically highlight the first item when using keyboard\n // this makes list navigation more intuitive\n const [focusedState, setFocusedState] = useReducer(reducer, { focusedIndex: null, maxIndex: max });\n\n useEffect(() => {\n const listElement = listRef.current;\n\n const onFocus = () => {\n if (focusedState.focusedIndex == null && parentListContext?.popupNodeId !== undefined) {\n setFocusedState({ type: \"set\", focusedIndex: 0 });\n }\n };\n\n listElement?.addEventListener(\"focus\", onFocus);\n return () => {\n listElement?.removeEventListener(\"focus\", onFocus);\n };\n }, [listRef, focusedState.focusedIndex, setFocusedState, parentListContext?.popupNodeId]);\n\n // keep reference to mouseTarget to compare mousemove event target\n // useRef so the useEffect to mount listeners doesn't need to rerun;\n const mouseTarget = useRef<Nullable<HTMLElement>>(null);\n\n useEffect(() => {\n setFocusedState({ type: \"max\", max: max });\n }, [max]);\n\n useEffect(() => {\n const element = listRef.current;\n if (element !== null) {\n // set focused index on hover\n const hoverNav = (event: MouseEvent) => {\n setIsScrolling(false);\n // make sure hovered element is a list item\n const targetingListItem = event.target instanceof HTMLElement && event.target.getAttribute(\"data-listitem\");\n if (!targetingListItem) {\n return;\n }\n const index = Number(event.target.getAttribute(\"data-index\"));\n\n if (focusedState.focusedIndex === index && mouseTarget.current === event.target) {\n // don't trigger state changes if user continues to mousemove the same element\n return;\n }\n\n // ensure user moved the mouse, don't trigger for page scroll or DOM updates\n const hasVelocity = event.movementX !== 0 || event.movementY !== 0;\n\n if (hasVelocity && targetingListItem) {\n setIsMousing(true);\n mouseTarget.current = event.target;\n setFocusedState({ type: \"set\", focusedIndex: index });\n\n // floating-ui already executed setIsOpen immediately after scroll ended but was blocked, so need to manually trigger\n cascadeManager.setCascadeState(true, index);\n }\n };\n\n // set focused index on arrow or tab navigation\n const keyboardNav = (event: KeyboardEvent) => {\n const isIncrement = event.key === \"ArrowDown\" || (event.key === \"Tab\" && !event.shiftKey);\n const isDecrement = event.key === \"ArrowUp\" || (event.key === \"Tab\" && event.shiftKey);\n setIsMousing(false);\n setIsScrolling(false);\n if (isIncrement) {\n event.preventDefault();\n setFocusedState({ type: \"increment\", repeat: event.repeat });\n } else if (isDecrement) {\n event.preventDefault();\n setFocusedState({ type: \"decrement\", repeat: event.repeat });\n }\n };\n\n const scrollingNav = () => setIsScrolling(true);\n\n // use mousemove instead of mouseover so we can measure mouse velocity\n element.addEventListener(\"mousemove\", hoverNav);\n element.addEventListener(\"keydown\", keyboardNav);\n element.addEventListener(\"scroll\", scrollingNav);\n return () => {\n element.removeEventListener(\"mousemove\", hoverNav);\n element.removeEventListener(\"keydown\", keyboardNav);\n element.removeEventListener(\"scroll\", scrollingNav);\n };\n }\n }, [cascadeManager, focusedState.focusedIndex]);\n\n return {\n listRef,\n focusedState,\n isMousing,\n isScrolling,\n };\n}\n\nexport {\n useVerticalListNavigation,\n};\n","import { RefObject, useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Nullable } from \"../utilityTypes.ts\";\nimport { useVerticalListNavigation } from \"./useVerticalListNavigation.ts\";\nimport { usePopupContext, UsePopupContextReturn } from \"../../components/popup/hooks/usePopupContext.ts\";\nimport { UsePopupCascadeManagerReturn } from \"../../components/popup/hooks/usePopupCascadeManager.ts\";\nimport { useDelayedCallback } from \"../callback/delayedCallback.ts\";\n\ntype ItemData = {\n index: number;\n /**\n * Whether a given row is a trigger for a cascading popup.\n * This ONLY enables the functionality where pressing RightArrow opens the cascading list, and does NOT\n * enable the cascading popup itself. It is possible to have stacked popups WITHOUT using this field.\n */\n hasCascading: boolean;\n};\n\n// adjusts keyboard navigation based on the order of items in the list\nfunction sortByDocumentPosition(a: Element, b: Element) {\n const position = a.compareDocumentPosition(b);\n\n if (\n position & Node.DOCUMENT_POSITION_FOLLOWING\n || position & Node.DOCUMENT_POSITION_CONTAINED_BY\n ) {\n return -1;\n }\n\n if (position & Node.DOCUMENT_POSITION_PRECEDING || position & Node.DOCUMENT_POSITION_CONTAINS) {\n return 1;\n }\n\n return 0;\n}\n\nfunction isElementVisible(element: Element, container: HTMLElement): boolean {\n const containerRect = container.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n\n return (\n elementRect.top >= containerRect.top\n && elementRect.bottom <= containerRect.bottom\n && elementRect.left >= containerRect.left\n && elementRect.right <= containerRect.right\n );\n}\n\nfunction arrowNavigationAction(popupInfo: UsePopupContextReturn, event: KeyboardEvent, metadata: ItemData | undefined) {\n const isLeftPlaced = popupInfo.placement.includes(\"left\");\n const inCascade = popupInfo?.popupParentNodeId;\n\n // if a cascading popup is placed to the left of its parent, the semantics change\n const openKey = inCascade && metadata?.hasCascading && isLeftPlaced ? \"ArrowLeft\" : \"ArrowRight\";\n const closeKey = isLeftPlaced ? \"ArrowRight\" : \"ArrowLeft\";\n\n const shouldOpenCascade = metadata?.hasCascading && event.key === openKey;\n const shouldCloseCascade = inCascade && event.key === closeKey;\n\n return { shouldOpenCascade, shouldCloseCascade };\n}\n\nfunction getFocusedRowData(focusedIndex: number | null, sortedNodes: Element[], sortedMap: Map<Element, ItemData>) {\n if (focusedIndex === null) {\n return { node: undefined, metadata: undefined };\n }\n\n const node = sortedNodes[focusedIndex];\n const metadata = sortedMap.get(node);\n\n return { node, metadata };\n}\n\nfunction handleKeyboardCascadeAction(\n metadata: ItemData | undefined,\n focusedIndex: number | null,\n node: Element | undefined,\n listElement: HTMLElement | null,\n cascadeManager: UsePopupCascadeManagerReturn,\n): boolean {\n if (!metadata || !metadata.hasCascading || focusedIndex === null) {\n return false;\n }\n\n const isVisible = node && listElement ? isElementVisible(node, listElement) : false;\n if (isVisible) {\n cascadeManager.setCascadeState(true, focusedIndex);\n cascadeManager.setFocus(true);\n return true;\n }\n\n return true; // prevents fallback to click action, no operation when not visible\n}\n\nfunction handleKeyboardClickAction(node: Element | undefined): void {\n const clickEvent = new MouseEvent(\"click\", {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n node?.dispatchEvent(clickEvent);\n}\n\nfunction useSortedListData(itemMap: Map<Element, Nullable<ItemData>>, listRef: RefObject<HTMLElement | null>) {\n const sortedNodes = useMemo(() => {\n let sortedNodes: Element[] = [];\n if (listRef.current !== null) {\n // get DOM children of list element\n // const domChildren = Array.from(listRef.current.children);\n sortedNodes = Array.from(itemMap.keys()).sort(sortByDocumentPosition);\n }\n return sortedNodes;\n }, [itemMap, listRef]);\n\n // move sorted nodes into map\n const sortedMap = useMemo(() => {\n const newMap = new Map<Element, ItemData>();\n\n sortedNodes.forEach((node, index) => {\n const metadata = itemMap.get(node) ?? ({} as ItemData);\n newMap.set(node, { ...metadata, index });\n });\n\n return newMap;\n }, [sortedNodes, itemMap]);\n\n return { sortedNodes, sortedMap };\n}\n\nfunction useKeyboardNavigation(\n listRef: RefObject<HTMLElement | null>,\n sortedNodes: Element[],\n sortedMap: Map<Element, ItemData>,\n focusedIndex: number | null,\n popupInfo: UsePopupContextReturn,\n cascadeManager: UsePopupCascadeManagerReturn,\n) {\n useEffect(() => {\n const listElement = listRef.current;\n if (!listElement) {\n return;\n }\n const onKeyboardSelect = (event: KeyboardEvent) => {\n const { node, metadata } = getFocusedRowData(focusedIndex, sortedNodes, sortedMap);\n const { shouldOpenCascade, shouldCloseCascade } = arrowNavigationAction(popupInfo, event, metadata);\n const isTyping = event.target instanceof HTMLInputElement && event.target.value !== \"\";\n const allowSpaceClick = !isTyping && event.key === \" \";\n\n if (shouldOpenCascade || event.key === \"Enter\" || allowSpaceClick) {\n const cascadeHandled = handleKeyboardCascadeAction(metadata, focusedIndex, node, listElement, cascadeManager);\n\n if (!cascadeHandled) {\n handleKeyboardClickAction(node);\n }\n\n event.preventDefault();\n } else if (shouldCloseCascade) {\n event.preventDefault();\n popupInfo.setOpen(false);\n }\n };\n\n listElement.addEventListener(\"keydown\", onKeyboardSelect);\n return () => {\n listElement.removeEventListener(\"keydown\", onKeyboardSelect);\n };\n }, [listRef, sortedNodes, focusedIndex, sortedMap, popupInfo, cascadeManager]);\n}\n\nfunction useCascadeOpen(\n focusedIndex: number | null,\n isMousing: boolean,\n sortedNodes: Element[],\n sortedMap: Map<Element, ItemData>,\n listRef: RefObject<HTMLElement | null>,\n cascadeManager: UsePopupCascadeManagerReturn,\n startDelay: ({ focusedIndex, node, listElement }: { focusedIndex: number; node: Element | undefined; listElement: HTMLElement | null }) => void,\n cancelDelay: () => void,\n) {\n useEffect(() => {\n const listElement = listRef.current;\n\n if (focusedIndex === null || isMousing) {\n return;\n }\n const { node, metadata } = getFocusedRowData(focusedIndex, sortedNodes, sortedMap);\n\n if (cascadeManager.lastOpenedIndex !== focusedIndex && metadata?.hasCascading) {\n cascadeManager.closeCurrentCascade();\n startDelay({ focusedIndex, node, listElement });\n }\n\n return () => cancelDelay();\n }, [focusedIndex, isMousing, listRef, cascadeManager, cancelDelay, sortedNodes, sortedMap, startDelay]);\n}\n\nfunction useCascadeClose(\n focusedIndex: number | null,\n sortedNodes: Element[],\n sortedMap: Map<Element, ItemData>,\n cascadeManager: UsePopupCascadeManagerReturn,\n) {\n useEffect(() => {\n const { metadata } = getFocusedRowData(focusedIndex, sortedNodes, sortedMap);\n\n if (focusedIndex !== null && !metadata?.hasCascading) {\n cascadeManager.closeCurrentCascade();\n }\n }, [cascadeManager, focusedIndex, sortedMap, sortedNodes]);\n}\n\ntype RegisterListItem = (node: HTMLElement, metadata: ItemData) => void;\ntype UnregisterListItem = (node: HTMLElement) => void;\n\nfunction useListData(cascadeManager: UsePopupCascadeManagerReturn) {\n // unsorted map of items, used for quickly inserting\n const [itemMap, setItemMap] = useState(\n () => new Map<Element, Nullable<ItemData>>(),\n );\n\n const { listRef, focusedState, isMousing, isScrolling } = useVerticalListNavigation(itemMap.size - 1, cascadeManager);\n const popupInfo = usePopupContext();\n\n // each list item registers its DOM element before paint\n const register = useCallback<RegisterListItem>((node, metadata) => {\n setItemMap(prevMap => new Map(prevMap).set(node, metadata ?? null));\n }, []);\n\n // each list item unregisters itself before it unmounts from the DOM\n const unregister = useCallback<UnregisterListItem>((node: Element) => {\n setItemMap((prevMap) => {\n const nextMap = new Map(prevMap);\n nextMap.delete(node);\n return nextMap;\n });\n }, []);\n\n const { sortedNodes, sortedMap } = useSortedListData(itemMap, listRef);\n useKeyboardNavigation(listRef, sortedNodes, sortedMap, focusedState.focusedIndex, popupInfo, cascadeManager);\n\n const { startCallback: startDelay, cancelCallback: cancelDelay } = useDelayedCallback({\n delay: 200,\n callback: ({ focusedIndex, node, listElement }: { focusedIndex: number; node: Element | undefined; listElement: HTMLElement | null }) => {\n const isVisible = node && listElement ? isElementVisible(node, listElement) : false;\n if (isVisible) {\n cascadeManager.setCascadeState(true, focusedIndex);\n } else {\n cascadeManager.closeCurrentCascade();\n }\n },\n });\n useCascadeOpen(focusedState.focusedIndex, isMousing, sortedNodes, sortedMap, listRef, cascadeManager, startDelay, cancelDelay);\n useCascadeClose(focusedState.focusedIndex, sortedNodes, sortedMap, cascadeManager);\n\n return useMemo(() => ({\n register,\n unregister,\n map: sortedMap,\n focusedIndex: focusedState.focusedIndex,\n listRef,\n isMousing,\n isScrolling,\n popupNodeId: popupInfo?.nodeId,\n }), [register, unregister, sortedMap, focusedState.focusedIndex, listRef, isMousing, isScrolling, popupInfo?.nodeId]);\n}\n\nexport {\n useListData,\n};\n\nexport type {\n ItemData,\n RegisterListItem,\n UnregisterListItem,\n};\n","import { createContext } from \"react\";\nimport { UsePopupCascadeManagerReturn } from \"./hooks/usePopupCascadeManager.ts\";\n\ntype PopupCascadeValue = UsePopupCascadeManagerReturn;\n\nconst defaultValue: UsePopupCascadeManagerReturn = Object.freeze({\n cascadeIndex: null,\n setCascadeState: () => {},\n onScroll: () => {},\n focus: false,\n setFocus: () => {},\n lastOpenedIndex: null,\n closeCurrentCascade: () => {},\n});\n\nconst PopupCascadeContext = createContext<PopupCascadeValue>(defaultValue);\n\nexport {\n PopupCascadeContext,\n};\n","import { PropsWithChildren } from \"react\";\nimport { PopupListContext } from \"./PopupListContext.tsx\";\nimport { useListData } from \"../../../utils/dom/useListData.ts\";\nimport { popupListCss } from \"../config/popupStyles.ts\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\nimport { PopupCascadeContext } from \"../PopupCascadeContext.tsx\";\nimport { usePopupCascadeManager } from \"../hooks/usePopupCascadeManager.ts\";\n\ntype PopupListProps = PropsWithChildren<{\n style?: string;\n}>;\n\nfunction PopupList({ style, children }: PopupListProps) {\n const popupListStylist = stylist(ValidClassName[\"popup-list\"], popupListCss, style);\n const cascadeManager = usePopupCascadeManager();\n const listData = useListData(cascadeManager);\n\n return (\n // tabIndex 0 makes sure that the focus doesn't move to the row elements\n <div\n {...popupListStylist}\n onScroll={cascadeManager.onScroll}\n ref={listData.listRef}\n tabIndex={0}\n >\n <PopupListContext.Provider value={listData}>\n <PopupCascadeContext.Provider value={cascadeManager}>\n {children}\n </PopupCascadeContext.Provider>\n </PopupListContext.Provider>\n </div>\n );\n}\n\nexport { PopupList };\n","import { useCallback, useState } from \"react\";\nimport { Nullable } from \"../../../utils/utilityTypes.ts\";\n\nfunction usePopupCascadeManager() {\n const [cascadeIndex, setCascadeIndex] = useState<Nullable<number>>(null);\n const [focus, setFocus] = useState(false);\n const [lastOpenedIndex, setLastOpenedIndex] = useState<Nullable<number>>(null);\n\n const setCascadeState = useCallback((open: boolean, index: number) => {\n if (open && cascadeIndex !== index) {\n setLastOpenedIndex(index);\n setCascadeIndex(index);\n } else if (!open && cascadeIndex === index) {\n setFocus(false);\n setCascadeIndex(null);\n }\n }, [cascadeIndex, setFocus]);\n\n const onScroll = useCallback(() => {\n setCascadeIndex(null);\n setLastOpenedIndex(null);\n setFocus(false);\n }, [setCascadeIndex, setLastOpenedIndex, setFocus]);\n\n const closeCurrentCascade = useCallback(() => {\n setCascadeIndex(null);\n setLastOpenedIndex(null);\n setFocus(false);\n }, []);\n\n return {\n cascadeIndex,\n setCascadeState,\n onScroll,\n focus,\n setFocus,\n lastOpenedIndex,\n closeCurrentCascade,\n };\n}\n\ntype UsePopupCascadeManagerReturn = ReturnType<typeof usePopupCascadeManager>;\n\nexport {\n usePopupCascadeManager,\n};\n\nexport type {\n UsePopupCascadeManagerReturn,\n};\n","import { useContext, useCallback, useLayoutEffect, useMemo, useRef } from \"react\";\nimport { Nullable } from \"../../utilityTypes.ts\";\nimport { PopupListContext } from \"../../../components/popup/list/PopupListContext.tsx\";\n\ntype ListRowProps = {\n hasCascading?: boolean;\n};\n\nfunction useListRow<T extends HTMLElement>({ hasCascading = false }: ListRowProps = {}) {\n // provides a ref to be used on the row itself\n const itemRef = useRef<Nullable<T>>(null);\n\n // separate variables allow us to use individual fields as hook dependencies\n // rather than using the entire context as a dependency\n const { register, unregister, map, focusedIndex, isMousing, listRef } = useContext(PopupListContext);\n\n // before paint, register item in the list\n useLayoutEffect(() => {\n const node = itemRef.current;\n if (node) {\n // 0 index is a placeholder for proper typing, this is overwritten when it's registered\n register(node, { index: 0, hasCascading });\n return () => {\n unregister(node);\n };\n }\n }, [register, unregister, hasCascading]);\n\n // calculate the index of the item within all currently selectable items, -1 if not found\n const index = useMemo(() => {\n if (map !== undefined && itemRef.current !== null) {\n return map.get(itemRef.current)?.index ?? -1;\n }\n return -1;\n }, [map]);\n\n const isActive = index === focusedIndex;\n\n // make sure item focuses itself\n // could be done from list parent, but this allows for unique behavior if necessary\n useLayoutEffect(() => {\n if (isActive) {\n // Only scroll item into view if user is keying list\n if (!isMousing) {\n itemRef.current?.scrollIntoView({\n behavior: \"instant\", // no scroll smoothing\n block: \"nearest\", // Minimize scrolling - only enough to make it visible\n inline: \"nearest\", // Same for horizontal scrolling\n });\n }\n }\n }, [isActive, isMousing]);\n\n const onFocus = useCallback(() => {\n listRef?.current?.focus();\n }, [listRef]);\n\n const itemProps = useMemo(() => {\n return {\n onFocus,\n \"data-focused\": isActive,\n };\n }, [onFocus, isActive]);\n\n return { itemRef, isActive, index, itemProps };\n}\n\nexport {\n useListRow,\n};\n","import { popupRowStylist } from \"../config/popupStyles.ts\";\nimport { forwardRef, PropsWithChildren } from \"react\";\nimport { PopupTriggerChildrenProps } from \"../PopupTrigger.tsx\";\n\ntype ListRowProps = PropsWithChildren<{\n onClick?: () => void;\n popupTriggerProps?: PopupTriggerChildrenProps;\n index: number;\n itemProps: {\n onFocus: () => void;\n \"data-focused\": boolean;\n };\n}>;\n\nconst ListRow = forwardRef<HTMLButtonElement, ListRowProps>(function ListRow({ onClick, index, children, itemProps, popupTriggerProps }, ref) {\n return (\n <button\n {...popupRowStylist}\n onClick={onClick}\n data-listitem={true}\n data-index={index}\n {...popupTriggerProps}\n {...itemProps}\n ref={ref}\n >\n {children}\n </button>\n );\n});\n\nexport { ListRow };\n","import { forwardRef, PropsWithChildren } from \"react\";\nimport { useListRow } from \"../../../utils/dom/list/useListRow.ts\";\nimport { PopupTriggerChildrenProps } from \"../PopupTrigger.tsx\";\nimport { useMergeRefs } from \"@floating-ui/react\";\nimport { popupRowStylist } from \"../config/popupStyles.ts\";\nimport { ListRow } from \"../list/ListRow.tsx\";\n\ntype PopupRowProps = PropsWithChildren<{\n onClick?: () => void;\n popupTriggerProps?: PopupTriggerChildrenProps;\n}>;\n\nconst PopupRow = forwardRef<HTMLButtonElement, PopupRowProps>(function PopupRow({ onClick, children, popupTriggerProps }, ref) {\n const { index, itemProps, itemRef } = useListRow<HTMLButtonElement>();\n // combine refs so that a row can serve as a PopupRow and a Trigger\n const refs = [itemRef, ref];\n const mergedRef = useMergeRefs(refs);\n\n return (\n <ListRow\n {...popupRowStylist}\n onClick={onClick}\n index={index}\n {...popupTriggerProps}\n itemProps={itemProps}\n ref={mergedRef}\n >\n {children}\n </ListRow>\n );\n});\n\nexport { PopupRow };\n","import { PropsWithChildren } from \"react\";\nimport { stylist, StylistReturn } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { ellipsisText } from \"../../style/text.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { mergeStylists } from \"../../style/mergeStylists.ts\";\n\ntype StrongContentProps = PropsWithChildren<{\n stylists?: StylistReturn[];\n}>;\n\nconst textStylist = stylist(ValidClassName.text, css({\n fontSize: \"md\",\n fontWeight: \"md\",\n color: \"typography.base\",\n fontStyle: \"normal\",\n letterSpacing: \"0.84px\",\n lineHeight: \"16px\",\n maxWidth: \"100%\",\n fontFamily: \"label\",\n}), ellipsisText);\n\nfunction StrongContent({ children, stylists = [] }: StrongContentProps) {\n const contentStylist = mergeStylists([textStylist, ...stylists]);\n return <div {...contentStylist}>{children}</div>;\n}\n\nexport { StrongContent };\n","import { popupRowStylist } from \"../config/popupStyles.ts\";\nimport { StrongLabel } from \"../../typography/StrongLabel.tsx\";\nimport { ShimmerBlock } from \"../../loading/ShimmerBlock.tsx\";\nimport { css } from \"../../../../styled-system/css\";\n\ntype PlaceholderPopupRowProps = {\n text?: string;\n};\n\nfunction PlaceholderPopupRow({ text }: PlaceholderPopupRowProps) {\n return (\n <div {...popupRowStylist}>\n {text\n ? <StrongLabel>{text}</StrongLabel>\n : (\n <ShimmerBlock styles={css({\n width: \"100%\",\n height: \"16px\",\n })}\n />\n )}\n </div>\n );\n}\n\nexport {\n PlaceholderPopupRow,\n};\n","import { stylist } from \"../../../style/stylist.ts\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\nimport { PlaceholderPopupRow } from \"./PlaceholderPopupRow.tsx\";\nimport { popupListCss } from \"../config/popupStyles.ts\";\n\nconst popupListStylist = stylist(ValidClassName[\"popup-list\"], popupListCss);\n\nconst PlaceholderPopupList = () => {\n return (\n <div {...popupListStylist}>\n <PlaceholderPopupRow />\n <PlaceholderPopupRow />\n <PlaceholderPopupRow />\n <PlaceholderPopupRow />\n <PlaceholderPopupRow />\n </div>\n );\n};\n\nexport {\n PlaceholderPopupList,\n};\n","import { components } from \"../../query/versions/v5/v5Schema\";\nimport { GlAccount, GlAccountWithChildren } from \"../../query/fetches/generalLedger/glAccounts.ts\";\nimport { useMemo } from \"react\";\nimport { GlAccountExpanded } from \"../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { BankAccount } from \"../../query/fetches/banks/bankAccounts.ts\";\n\ntype GlAccountType = components[\"schemas\"][\"FlatGlAccountDTOV5\"][\"type\"];\ntype CreditGlAccountTypes = Extract<GlAccountType, \"LIABILITY\" | \"EQUITY\" | \"INCOME\" | \"OTHER_INCOME\">;\n\nconst creditGlAccountTypes: CreditGlAccountTypes[] = [\"LIABILITY\", \"EQUITY\", \"INCOME\", \"OTHER_INCOME\"];\n\nfunction useFilterGlAccountsByType(glAccounts: GlAccountWithChildren[] | undefined, types: GlAccountType[]) {\n return useMemo(() => glAccounts?.filter(account => types.includes(account.type)) ?? [], [glAccounts, types]);\n}\n\nexport type {\n GlAccountType,\n};\n\nconst getExpandedGlAccountFromFullGlAccount = (glAccount: GlAccount): GlAccountExpanded => {\n return {\n id: glAccount.id || \"\",\n name: glAccount.name,\n accountNo: glAccount.accountNo,\n };\n};\n\nconst findGlAccountByBankAccount = (glAccounts: GlAccountWithChildren[] | undefined, bankAccount: BankAccount) => {\n return glAccounts?.flatMap(parent => [parent, ...(parent.children ?? [])])\n .find(gl => Number(gl.id?.split(\"_\")[1]) === bankAccount.glAccountId);\n};\n\nexport { creditGlAccountTypes, useFilterGlAccountsByType, getExpandedGlAccountFromFullGlAccount, findGlAccountByBankAccount };\n","import { usePrefetch } from \"../utils/usePrefetch.ts\";\nimport { useHoverPrefetch } from \"../utils/useHoverPrefetch.ts\";\nimport { EntityIdPrefixMap } from \"../../../entities/entityIdPrefixMap.ts\";\nimport { components } from \"../../versions/v5/v5Schema.ts\";\nimport { EntityFetchFn, useEntity, UseEntityResult, UseEntityOptions } from \"../utils/useEntity.ts\";\nimport { v5EntityGet, V5EntityGetRequest } from \"../../http/get.ts\";\n\n// TODO: update type definition to no longer manually account for prefixed string ids when consuming V6 gl account API\ntype V5GlAccount = components[\"schemas\"][\"FlatGlAccountDTOV5\"];\ntype GlAccount = Omit<V5GlAccount, \"id\"> & { id: string };\ntype GlAccountWithChildren = GlAccount & { children: GlAccountWithChildren[] };\n// TODO: use the operations response type once typing is resolved\ntype GetGlAccountsResponse = components[\"schemas\"][\"FlatGlAccountDTOV5\"][];\n\ntype GlAccountsKey = [\"accounting\", \"glAccounts\"];\n\nconst glAccountsKeys = {\n all: (): GlAccountsKey => [\"accounting\", \"glAccounts\"],\n};\n\nconst getGlAccounts: EntityFetchFn<GlAccount[], GlAccountsKey> = async (queryContext) => {\n const queryKey = queryContext.queryKey;\n const accessToken = queryKey[2].accessToken;\n const environment = queryKey[2].environment;\n\n const params: V5EntityGetRequest = {\n path: \"/accounting/glAccounts\",\n params: { leavesOnly: \"false\" },\n accessToken,\n environment,\n };\n\n const glAccounts = await v5EntityGet<GetGlAccountsResponse>(params);\n return prefixEntityIds(glAccounts); // TODO: remove this when consuming V6 gl account API\n};\n\ntype UseGlAccountsOptions<TData> = Partial<UseEntityOptions<GlAccount[], GlAccountsKey, TData>>;\n\nfunction useGlAccounts<TData = GlAccount[]>(options?: UseGlAccountsOptions<TData>): UseEntityResult<TData> {\n return useEntity<GlAccount[], GlAccountsKey, TData>({\n ...options,\n queryKey: glAccountsKeys.all(),\n queryFn: getGlAccounts,\n });\n}\n\nfunction useNestedGlAccountsWithLeaves(): UseEntityResult<GlAccountWithChildren[]> {\n return useGlAccounts<GlAccountWithChildren[]>({\n select: buildGlAccountsWithLeaves,\n });\n}\n\nfunction useFlatGlAccountsWithLeaves(): UseEntityResult<GlAccountWithChildren[]> {\n return useGlAccounts<GlAccountWithChildren[]>({\n select: buildFlatGlAccountsWithLeaves,\n });\n}\n\nfunction useGlAccountsPrefetch() {\n const prefetchFn = usePrefetch(glAccountsKeys.all, getGlAccounts);\n return useHoverPrefetch({ prefetchFn });\n}\n\n// TODO: remove this when consuming V6 gl account API\nconst prefixEntityIds = (glAccounts: V5GlAccount[]): GlAccount[] => {\n return glAccounts.map(glAccount => ({\n ...glAccount,\n id: `${EntityIdPrefixMap.GL_ACCOUNT}_${glAccount.id}`,\n }));\n};\n\nfunction groupByParentAccountNo(glAccounts: GlAccount[]): Map<string, GlAccount[]> {\n const childrenMap = new Map<string, GlAccount[]>();\n for (const glAccount of glAccounts) {\n if (glAccount.parentAccountNo) {\n const children = childrenMap.get(glAccount.parentAccountNo) ?? [];\n children.push(glAccount);\n childrenMap.set(glAccount.parentAccountNo, children);\n }\n }\n return childrenMap;\n}\n\nfunction collectLeafAccounts(glAccount: GlAccount, childrenByParentAccountNo: Map<string, GlAccount[]>): GlAccountWithChildren[] {\n const directChildren = childrenByParentAccountNo.get(glAccount.accountNo) ?? [];\n\n // If this account has no children, it's a leaf\n if (directChildren.length === 0) {\n return [{ ...glAccount, children: [] }];\n }\n\n // Otherwise, recursively collect leaf accounts from all children\n return directChildren.flatMap(child => collectLeafAccounts(child, childrenByParentAccountNo));\n}\n\nconst isRootGlAccount = (account: GlAccount) => !account.parentAccountNo;\n\nfunction buildGlAccountsWithLeaves(glAccounts: GlAccount[]): GlAccountWithChildren[] {\n const childrenByParentAccountNo = groupByParentAccountNo(glAccounts);\n return glAccounts\n .filter(isRootGlAccount)\n .map(rootAccount => ({\n ...rootAccount,\n children: collectLeafAccounts(rootAccount, childrenByParentAccountNo),\n }));\n}\n\nfunction buildFlatGlAccountsWithLeaves(glAccounts: GlAccount[]): GlAccountWithChildren[] {\n return buildGlAccountsWithLeaves(glAccounts)\n .flatMap(rootAccount => [rootAccount, ...rootAccount.children]);\n}\n\nexport type {\n GlAccount,\n GlAccountWithChildren,\n};\n\nexport {\n useNestedGlAccountsWithLeaves,\n useFlatGlAccountsWithLeaves,\n useGlAccountsPrefetch,\n};\n","import { PopupRow } from \"../../../popup/rows/PopupRow.tsx\";\nimport { StrongContent } from \"../../../typography/StrongContent.tsx\";\nimport { formatGlAccount } from \"../../../../utils/generalLedger/generalLedgerUtils.ts\";\nimport { SmallIcon } from \"../../../icon/SmallIcon.tsx\";\nimport { ArrowRight } from \"../../../icon/icons/ArrowRight.tsx\";\nimport { css } from \"../../../../../styled-system/css\";\nimport { stylist } from \"../../../../style/stylist.ts\";\nimport { useMemo } from \"react\";\nimport Fuse, { FuseResult } from \"fuse.js\";\nimport { PlaceholderPopupList } from \"../../../popup/placeholder/PlaceholderPopupList.tsx\";\nimport { GlAccountType, useFilterGlAccountsByType } from \"../../../../entities/transaction/glAccounts.ts\";\nimport {\n GlAccount,\n GlAccountWithChildren,\n useFlatGlAccountsWithLeaves,\n} from \"../../../../query/fetches/generalLedger/glAccounts.ts\";\n\ntype GlAccountSearchListProps = {\n types: GlAccountType[];\n onClick: (glAccount: GlAccount) => void;\n searchTerm: string;\n};\n\ntype SearchResults = Array<{ parent: GlAccountWithChildren; child: GlAccountWithChildren }>;\n\nconst iconStyles = [stylist(null, css({ marginLeft: \"6px\", marginRight: \"6px\" }))];\n\nconst textStylist = stylist(null, css({\n whiteSpace: \"normal\",\n}));\n\nconst fuseOptions = {\n keys: [\n { name: \"accountNo\", weight: 0.3 },\n { name: \"name\", weight: 0.7 },\n ],\n threshold: 0.3,\n includeScore: true,\n minMatchCharLength: 1,\n};\n\nfunction findParentAccount(\n matchingAccount: GlAccountWithChildren,\n filteredGlAccounts: GlAccountWithChildren[],\n): GlAccountWithChildren | undefined {\n return filteredGlAccounts.find(parent =>\n parent.accountNo === matchingAccount.accountNo\n || parent.children.some(child => child.accountNo === matchingAccount.accountNo),\n );\n}\n\nfunction isChildAlreadyAdded(\n child: GlAccountWithChildren,\n matchingChildren: SearchResults,\n): boolean {\n return matchingChildren.some(({ child: c }) => c.accountNo === child.accountNo);\n}\n\nfunction addChildToSearchResults(\n parent: GlAccountWithChildren,\n child: GlAccountWithChildren,\n matchingChildren: SearchResults,\n): void {\n if (!isChildAlreadyAdded(child, matchingChildren)) {\n matchingChildren.push({ parent, child });\n }\n}\n\nfunction addAllChildrenToResults(\n parent: GlAccountWithChildren,\n matchingChildren: SearchResults,\n): void {\n parent.children.forEach((child) => {\n addChildToSearchResults(parent, child, matchingChildren);\n });\n}\n\nfunction processSearchResults(\n searchResults: FuseResult<GlAccountWithChildren>[],\n filteredGlAccounts: GlAccountWithChildren[],\n): SearchResults {\n const matchingChildren: SearchResults = [];\n\n searchResults.forEach((result) => {\n const matchingAccount = result.item;\n const parentAccount = findParentAccount(matchingAccount, filteredGlAccounts);\n\n if (!parentAccount) {\n return;\n }\n\n const isParentMatch = parentAccount.accountNo === matchingAccount.accountNo;\n if (isParentMatch) {\n addAllChildrenToResults(parentAccount, matchingChildren);\n } else {\n addChildToSearchResults(parentAccount, matchingAccount, matchingChildren);\n }\n });\n\n return matchingChildren;\n}\n\nfunction GlAccountSearchList({ types, onClick, searchTerm }: GlAccountSearchListProps) {\n const { query: { data: glAccounts }, isFilling } = useFlatGlAccountsWithLeaves();\n\n const filteredGlAccounts = useFilterGlAccountsByType(glAccounts, types);\n\n const fuse = useMemo(() => new Fuse(filteredGlAccounts, fuseOptions), [filteredGlAccounts]);\n\n const processedSearchResults = useMemo(() => {\n const searchResults = fuse.search(searchTerm);\n return processSearchResults(searchResults, filteredGlAccounts);\n }, [filteredGlAccounts, searchTerm, fuse]);\n\n if (isFilling) {\n return <PlaceholderPopupList />;\n }\n\n return processedSearchResults.map(({ parent, child }) => (\n <PopupRow\n key={`${child.accountNo}`}\n onClick={() => onClick(child)}\n >\n <StrongContent stylists={[textStylist]}>\n {formatGlAccount(parent.accountNo, parent.name)}\n <SmallIcon Component={ArrowRight} stylists={iconStyles} />\n {formatGlAccount(child.accountNo, child.name)}\n </StrongContent>\n </PopupRow>\n ));\n}\n\nexport { GlAccountSearchList };\n","import { useMergeRefs } from \"@floating-ui/react\";\nimport { PopupTriggerChildrenProps } from \"./PopupTrigger.tsx\";\nimport { forwardRef, PropsWithChildren } from \"react\";\nimport { ListRow } from \"./list/ListRow.tsx\";\n\ntype CascadeTriggerProps = PropsWithChildren<{\n index: number;\n popupTriggerProps: PopupTriggerChildrenProps;\n itemProps: {\n onFocus: () => void;\n \"data-focused\": boolean;\n };\n}>;\n\nconst CascadeTrigger = forwardRef<HTMLButtonElement, CascadeTriggerProps>(function CascadeTrigger({ index, popupTriggerProps, children, itemProps }, ref) {\n const refs = [ref, popupTriggerProps?.ref];\n const mergedRef = useMergeRefs(refs);\n return (\n <ListRow index={index} ref={mergedRef} itemProps={itemProps} popupTriggerProps={popupTriggerProps}>\n {children}\n </ListRow>\n );\n});\n\nexport { CascadeTrigger };\n\nexport type { CascadeTriggerProps };\n","import { ReactNode, useContext } from \"react\";\nimport { PopupManager } from \"../PopupManager.tsx\";\nimport { PopupTrigger } from \"../PopupTrigger.tsx\";\nimport { Popup } from \"../Popup.tsx\";\nimport { PopupCascadeContext } from \"../PopupCascadeContext.tsx\";\nimport { useListRow } from \"../../../utils/dom/list/useListRow.ts\";\nimport { CascadeTrigger } from \"../CascadeTrigger.tsx\";\nimport { PopupListContext } from \"../list/PopupListContext.tsx\";\n\ntype CascadeRowProps = {\n triggerChildren: ReactNode;\n popupChildren: ReactNode;\n};\n\nfunction CascadeRow({ triggerChildren, popupChildren }: CascadeRowProps) {\n const { cascadeIndex, setCascadeState, focus } = useContext(PopupCascadeContext);\n const { itemRef, index, itemProps } = useListRow<HTMLButtonElement>({ hasCascading: true });\n const { isScrolling } = useContext(PopupListContext);\n\n const isOpen = cascadeIndex === index;\n const setIsOpen = (open: boolean) => {\n if (!isScrolling) {\n setCascadeState(open, index);\n }\n };\n return (\n <PopupManager open={isOpen} onOpenChange={setIsOpen} placement=\"right-start\">\n <PopupTrigger>\n {triggerProps => (\n <CascadeTrigger itemProps={itemProps} index={index} ref={itemRef} popupTriggerProps={triggerProps}>\n {triggerChildren}\n </CascadeTrigger>\n )}\n </PopupTrigger>\n <Popup initialFocus={focus}>\n {popupChildren}\n </Popup>\n\n </PopupManager>\n );\n}\n\nexport { CascadeRow };\n","import { ReactNode } from \"react\";\nimport { StrongLabel } from \"../../typography/StrongLabel.tsx\";\nimport { SmallIcon } from \"../../icon/SmallIcon.tsx\";\nimport { ArrowRight } from \"../../icon/icons/ArrowRight.tsx\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { css } from \"../../../../styled-system/css\";\n\nconst expandableRowStylist = stylist(null, css({\n display: \"flex\",\n width: \"100%\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n}));\n\nconst textStylist = stylist(null, css({\n whiteSpace: \"normal\",\n}));\n\ntype ExpandableRowProps = {\n icon?: ReactNode;\n displayLabel?: string;\n};\n\nfunction ExpandableRow({ icon, displayLabel }: ExpandableRowProps) {\n return (\n <div {...expandableRowStylist}>\n {icon}\n <StrongLabel stylists={[textStylist]}>{displayLabel}</StrongLabel>\n <SmallIcon Component={ArrowRight} />\n </div>\n );\n}\n\nexport { ExpandableRow };\n","import { PopupRow } from \"../../../popup/rows/PopupRow.tsx\";\nimport { StrongLabel } from \"../../../typography/StrongLabel.tsx\";\nimport { formatGlAccount } from \"../../../../utils/generalLedger/generalLedgerUtils.ts\";\nimport { PopupList } from \"../../../popup/list/PopupList.tsx\";\nimport { CascadeRow } from \"../../../popup/rows/CascadeRow.tsx\";\nimport { GlAccountType, useFilterGlAccountsByType } from \"../../../../entities/transaction/glAccounts.ts\";\nimport { PlaceholderPopupList } from \"../../../popup/placeholder/PlaceholderPopupList.tsx\";\nimport {\n GlAccount,\n GlAccountWithChildren,\n useNestedGlAccountsWithLeaves,\n} from \"../../../../query/fetches/generalLedger/glAccounts.ts\";\nimport { ExpandableRow } from \"../../../popup/rows/ExpandableRow.tsx\";\nimport { PlaceholderPopupRow } from \"../../../popup/placeholder/PlaceholderPopupRow.tsx\";\n\ntype GlAccountCascadingListProps = {\n types: GlAccountType[];\n onClick: (glAccount: GlAccount) => void;\n};\n\nfunction GlAccountCascadingList({ types, onClick }: GlAccountCascadingListProps) {\n const { query: { data: glAccounts, isFetching }, isFilling } = useNestedGlAccountsWithLeaves();\n\n const filteredGlAccounts = useFilterGlAccountsByType(glAccounts, types);\n\n if (isFilling) {\n return <PlaceholderPopupList />;\n }\n\n if (!isFilling && !isFetching && glAccounts === undefined) {\n return <PlaceholderPopupRow text=\"No data\" />;\n }\n\n return filteredGlAccounts.map((glAccount) => {\n const displayLabel = formatGlAccount(glAccount.accountNo, glAccount.name);\n return (\n <CascadeRow\n key={glAccount.accountNo}\n triggerChildren={<ExpandableRow displayLabel={displayLabel} />}\n popupChildren={<GlAccountCascadeRowPopup glAccount={glAccount} onClick={onClick} />}\n />\n );\n },\n );\n}\n\n/* Helper components, should not be exported */\n\ntype GlAccountCascadeRowPopupProps = {\n glAccount: GlAccountWithChildren;\n onClick: (glAccount: GlAccount) => void;\n};\n\nfunction GlAccountCascadeRowPopup({ glAccount, onClick }: GlAccountCascadeRowPopupProps) {\n return (\n <PopupList>\n {glAccount.children.map(child => (\n <PopupRow key={child.accountNo} onClick={() => onClick(child)}>\n <StrongLabel>{formatGlAccount(child.accountNo, child.name)}</StrongLabel>\n </PopupRow>\n ))}\n </PopupList>\n );\n}\n\nexport { GlAccountCascadingList };\n","import { stylist } from \"../../style/stylist\";\nimport { css } from \"../../../styled-system/css\";\nimport { useEffect, useRef } from \"react\";\n\ntype PopupSearchProps = {\n searchTerm: string;\n setSearchTerm: (searchTerm: string) => void;\n placeholder: string;\n};\n\nconst searchInputStylist = stylist(null, css({\n display: \"flex\",\n alignItems: \"center\",\n padding: \"10px\",\n flex: 1,\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n fontSize: \"sm\",\n fontWeight: \"sm\",\n\n \"&::placeholder\": {\n color: \"typography.base.weak\",\n },\n}));\n\nfunction PopupSearch({ searchTerm, setSearchTerm, placeholder }: PopupSearchProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n inputRef.current?.focus({ preventScroll: true });\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n inputRef.current\n && document.activeElement !== inputRef.current\n && (\n // Handle regular typing (no modifiers)\n (event.key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey)\n // Handle backspace (includes shortcuts)\n || (event.key === \"Backspace\")\n )\n ) {\n inputRef.current.focus();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, []);\n\n return (\n <input\n ref={inputRef}\n type=\"text\"\n placeholder={placeholder}\n value={searchTerm}\n onChange={e => setSearchTerm(e.target.value)}\n {...searchInputStylist}\n />\n );\n}\n\nexport { PopupSearch };\n","import { PopupList } from \"../../../popup/list/PopupList.tsx\";\nimport { GlAccountType } from \"../../../../entities/transaction/glAccounts.ts\";\nimport { useState } from \"react\";\nimport { css } from \"../../../../../styled-system/css\";\nimport { usePopupContext } from \"../../../popup/hooks/usePopupContext.ts\";\nimport { isNotNullishOrEmptyOrBlank } from \"../../../../utils/string/stringUtils.ts\";\nimport { GlAccountSearchList } from \"./GlAccountSearchList.tsx\";\nimport { GlAccountCascadingList } from \"./GlAccountCascadingList.tsx\";\nimport { PopupSearch } from \"../../../popup/PopupSearch.tsx\";\nimport { Popup } from \"../../../popup/Popup.tsx\";\nimport { GlAccount } from \"../../../../query/fetches/generalLedger/glAccounts.ts\";\n\ntype GlAccountListProps = {\n onClick: (glAccount: GlAccount) => void;\n types: GlAccountType[];\n};\n\nconst placeholder = \"Search revenue accounts...\";\n\nfunction GlAccountPopupList({ onClick, types }: GlAccountListProps) {\n const popupContext = usePopupContext();\n const [searchTerm, setSearchTerm] = useState(\"\");\n\n const popupListWidthCss = isNotNullishOrEmptyOrBlank(searchTerm)\n ? css({ maxWidth: \"420px\", width: \"fit-content\" })\n : undefined;\n\n const handleGlAccountChange = (glAccount: GlAccount) => {\n onClick(glAccount);\n popupContext?.setOpen(false); // Close the popup after selection\n };\n\n return (\n <Popup>\n <PopupList style={popupListWidthCss}>\n <PopupSearch searchTerm={searchTerm} setSearchTerm={setSearchTerm} placeholder={placeholder} />\n {isNotNullishOrEmptyOrBlank(searchTerm)\n ? <GlAccountSearchList types={types} onClick={handleGlAccountChange} searchTerm={searchTerm} />\n : <GlAccountCascadingList types={types} onClick={handleGlAccountChange} />}\n </PopupList>\n </Popup>\n );\n}\n\nexport { GlAccountPopupList };\n","import {\n MutationFunction,\n useMutation,\n UseMutationResult,\n UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { useAccessToken } from \"../http/useAccessToken\";\nimport { errorFnNoToken } from \"../fetches/utils/queryUtils.ts\";\nimport { isNullishOrEmptyOrBlank } from \"../../utils/string/stringUtils.ts\";\nimport { useEnvironment } from \"../../environment/useEnvironment.ts\";\nimport { queryClient } from \"../queryClient.ts\"; // don't accidentally use a partner's queryClient if their provider nested within ours\nimport { isNotNullish } from \"../../utils/typeUtils.ts\";\nimport { TightEnvironment } from \"../../utils/traxEnvironmentVariables.ts\";\n\n// override base mutation types, always expect a mutationFn that takes data, accessToken, and environment as arguments\ntype EntityMutationFn<TData, TVariables> = MutationFunction<TData, { data: TVariables; accessToken: string; environment: TightEnvironment }>;\ntype EntityOnMutateFn<TVariables, TContext> = ({ data, accessToken, environment }: { data: TVariables; accessToken: string; environment: TightEnvironment }) => Promise<TContext | undefined> | TContext | undefined;\n// note we change the ordering of generics here. We always want the caller to specify data and variables, we're fine with default error and unknown context as those are more advanced use cases\ntype UseEntityMutationOptions<TData, TVariables, TError = Error, TContext = unknown> = Omit<UseMutationOptions<TData, TError, TVariables, TContext>, \"mutationFn\" | \"onMutate\"> & {\n mutationFn: EntityMutationFn<TData, TVariables>;\n onMutateFn?: EntityOnMutateFn<TVariables, TContext>;\n};\n\n/**\n * Use this hook to create a mutation object for an entity.\n * @param mutationFn - The mutation function to use. This function should accept a data object (the entities), an accessToken, and the environment\n * @param onMutateFn - The onMutate function to use for optimistic updates. This function should accept a data object (the new data) and an accessToken.\n * @param options - Additional options to pass to tanstack query's useMutation [useMutation](https://tanstack.com/query/latest/docs/framework/react/reference/useMutation)\n * @returns A tanstack query mutation object, see [useMutation](https://tanstack.com/query/latest/docs/framework/react/reference/useMutation)\n * and [related blog post](https://tkdodo.eu/blog/mastering-mutations-in-react-query)\n */\nfunction useEntityMutation<TData, TVariables, TContext>({\n mutationFn,\n onMutateFn,\n ...options\n}: UseEntityMutationOptions<TData, TVariables, Error, TContext>): UseMutationResult<TData, Error, TVariables, TContext> {\n const accessToken = useAccessToken();\n const environment = useEnvironment();\n const hasAccessToken = !isNullishOrEmptyOrBlank(accessToken);\n\n return useMutation({\n ...options,\n mutationFn: hasAccessToken\n ? (data: TVariables) => (mutationFn({ data, accessToken, environment }))\n : errorFnNoToken,\n onMutate: hasAccessToken && isNotNullish(onMutateFn)\n ? (data: TVariables) => (onMutateFn({ data, accessToken, environment }))\n : undefined,\n }, queryClient); // don't accidentally use a partner's queryClient if their provider nested within ours\n}\n\nexport {\n useEntityMutation,\n};\n\nexport type {\n EntityMutationFn,\n UseEntityMutationOptions,\n};\n","import { components } from \"../../versions/v6/v6Schema.ts\";\nimport { RequireAtLeastOne, ValueOf } from \"../../../utils/utilityTypes.ts\";\nimport { EntityMutationFn, useEntityMutation, UseEntityMutationOptions } from \"../useEntityMutation.ts\";\nimport { v6EntityPost, V6EntityPostRequest } from \"../../http/post.ts\";\nimport { getV6EndpointManager } from \"../../versions/v6/v6EndpointManager.ts\";\nimport { queryClient } from \"../../queryClient.ts\";\nimport { bankTransactionKeys } from \"../../fetches/transactions/bankTransactionQueries.ts\";\nimport { breadcrumb, notify } from \"../../../utils/logging.ts\";\nimport { taskKeys } from \"../../fetches/tasks/tasks.ts\";\n\n/** IMPORTANT:\n * This is the only place you should reference the API schema directly for bank transaction POSTs.\n * Alias any types you need in this file, then export them.\n * This will make it easier to refactor as the API changes.\n */\n\ntype PostBankTransactionDto = components[\"schemas\"][\"BankTransactionPostDto\"];\ntype PostBankTransactionsResponse = components[\"schemas\"][\"MultiStatusResponseListMultiResponseBankTransactionGetDto\"];\ntype PostTransactionsParams = components[\"schemas\"][\"MultiParamBankTransactionPostDto\"];\ntype PostBankTransactionsParams = { data: Array<Partial<ValueOf<PostTransactionsParams[\"data\"]>>> }; // don't export this, use DTO wrapper types\ntype CreateBankTransactionDto = Omit<PostBankTransactionDto, \"id\">;\ntype UpdateBankTransactionDto = { id: PostBankTransactionDto[\"id\"] } & RequireAtLeastOne<Partial<Omit<CreateBankTransactionDto, \"id\">>>; // id and one or more other fields\n\n/**\n * Type-safe wrapper of postBankTransactions to create new bank transactions\n * @param data an array of bank transactions with the fields the API expects when creating a new bank transaction\n * @param accessToken\n * @param environment\n */\nconst postNewBankTransactions: EntityMutationFn<PostBankTransactionsResponse, CreateBankTransactionDto[]> = async ({ data, accessToken, environment }) => {\n return postBankTransactions({ data: { data }, accessToken, environment });\n};\n\n/**\n * Simple wrapper of postNewBankTransactions that expects a single bank transaction. Handles the array internally so devs don't have to\n * @param data a single CreateBankTransactionDto\n * @param accessToken\n * @param environment\n */\nconst postNewSingleBankTransaction: EntityMutationFn<PostBankTransactionsResponse, CreateBankTransactionDto> = async ({ data, accessToken, environment }) => {\n return postNewBankTransactions({ data: [data], accessToken, environment });\n};\n\n/**\n * Type-safe wrapper of postBankTransactions to update existing bank transactions\n * @param data an array of bank transactions with the fields the API expects when updating an existing bank transaction\n * @param accessToken\n * @param environment\n */\nconst updateBankTransactions: EntityMutationFn<PostBankTransactionsResponse, UpdateBankTransactionDto[]> = async ({ data, accessToken, environment }) => {\n return postBankTransactions({ data: { data }, accessToken, environment });\n};\n\n/**\n * Simple wrapper of updateBankTransaction that expects a single bank transaction. Handles the array internally so devs don't have to\n * @param data a single UpdateBankTransactionDto\n * @param accessToken\n * @param environment\n */\nconst updateSingleBankTransaction: EntityMutationFn<PostBankTransactionsResponse, UpdateBankTransactionDto> = async ({ data, accessToken, environment }) => {\n return updateBankTransactions({ data: [data], accessToken, environment });\n};\n\n/**\n * Base function to post bank transactions. Can be used in the create or edit case.\n * Note that this function is not itself type safe-- the Partial<params> allows us to use it for both create and edit.\n * Use the wrapper functions for create and edit, and their corresponding mutation hooks.\n * TODO: handle errors (200 code but result is not SUCCESS) waiting for API here, all error cases currently returning 400 JSON_ERROR\n * @param data\n * @param accessToken\n * @param environment\n */\nconst postBankTransactions: EntityMutationFn<PostBankTransactionsResponse, PostBankTransactionsParams> = async ({ data, accessToken, environment }) => {\n const request: V6EntityPostRequest<PostBankTransactionsParams> = {\n path: \"/v6/banks/transactions\",\n bodyParams: data,\n method: \"POST\",\n accessToken,\n endpointManager: getV6EndpointManager(environment),\n };\n return await v6EntityPost<PostBankTransactionsResponse, PostBankTransactionsParams>(request);\n};\n\n/* Wrapper hooks of useEntityMutation to create and edit bank transactions. All exported hooks return a tanstack query mutation object.\n * We expose multiple separate hooks to allow devs to set different options for different use cases\n * If at all possible, avoid using the base useBankTransactionsBaseMutation hook since it is less type safe\n */\n\n/**\n * Hook to create multiple new bank transactions.\n * Developers can define options that will apply to all plural bank transaction create mutations here\n * @returns A tanstack query mutation object for posting bank transactions\n */\nfunction useCreateBankTransactionsMutation() {\n const options: UseEntityMutationOptions<PostBankTransactionsResponse, CreateBankTransactionDto[]> = {\n mutationFn: postNewBankTransactions,\n };\n return useBankTransactionsBaseMutation(options);\n}\n\n/**\n * Hook to edit multiple bank transactions.\n * Developers can define options that will apply to all plural bank transaction edit mutations here\n * @returns A tanstack query mutation object for editing bank transactions\n */\nfunction useBankTransactionsMutation() {\n const options: UseEntityMutationOptions<PostBankTransactionsResponse, UpdateBankTransactionDto[]> = {\n mutationFn: updateBankTransactions,\n };\n return useBankTransactionsBaseMutation(options);\n}\n\n/**\n * Hook to create a single new bank transaction.\n * Developers can define options that will apply to all singular bank transaction create mutations here\n * @returns A tanstack query mutation object for posting a single bank transaction\n */\nfunction useCreateSingleBankTransactionMutation() {\n const options: UseEntityMutationOptions<PostBankTransactionsResponse, CreateBankTransactionDto> = {\n mutationFn: postNewSingleBankTransaction,\n };\n return useSingleBankTransactionBaseMutation(options);\n}\n\n/**\n * Hook to edit a single bank transaction.\n * Developers can define options that will apply to all singular bank transaction edit mutations here\n * @returns A tanstack query mutation object for editing a single bank transaction\n */\nfunction useSingleBankTransactionMutation() {\n const options: UseEntityMutationOptions<PostBankTransactionsResponse, UpdateBankTransactionDto> = {\n mutationFn: updateSingleBankTransaction,\n };\n return useSingleBankTransactionBaseMutation(options);\n}\n\n/**\n * Base hook for mutating multiple bank transactions. Use the wrapper hooks for create and edit if you can.\n * Developers can define options that will apply to all plural bank transaction mutations here\n * @param options UseEntityMutationOptions to pass to useEntityMutation, wrapper type of UseMutationOptions that expects an EntityMutationFn for access token injection\n */\nfunction useBankTransactionsBaseMutation<T extends Partial<PostBankTransactionDto>[]>(options: UseEntityMutationOptions<PostBankTransactionsResponse, T>) {\n return useEntityMutation({\n onSuccess: async () => {\n const keysToInvalidate = bankTransactionKeys.base();\n breadcrumb(\"mutation successful, invalidating BT queries\");\n // on a plural BT mutation, we have to assume that this could affect any cache entry so invalidate the entire BT cache\n return queryClient.invalidateQueries({ queryKey: keysToInvalidate }).catch(error => notify({ error, severity: \"error\" }));\n },\n ...options,\n });\n}\n\n/**\n * Base hook for mutating a single bank transaction. Use the wrapper hooks for create and edit if you can.\n * Developers can define options that will apply to all singular bank transaction mutations here\n * @param options UseEntityMutationOptions to pass to useEntityMutation, wrapper type of UseMutationOptions that expects an EntityMutationFn for access token injection\n */\nfunction useSingleBankTransactionBaseMutation<T extends Partial<PostBankTransactionDto>>(options: UseEntityMutationOptions<PostBankTransactionsResponse, T>) {\n return useEntityMutation({\n onSuccess: async () => {\n breadcrumb(\"mutation successful, invalidating BT queries\");\n // on a singular BT mutation, we have to assume that this could affect any plural cache entry so invalidate the entire BT cache. TODO: maybe scope single query invalidations to just the entry for this ID, any any matching transaction IDs?\n return queryClient.invalidateQueries({\n predicate: query =>\n query.queryKey.includes(taskKeys.all()[0])\n || bankTransactionKeys.base().every(key => query.queryKey.includes(key))\n || (query.queryKey.includes(\"reports\")),\n }).catch(error => notify({ error, severity: \"error\" }));\n },\n ...options,\n });\n}\n\nexport {\n useCreateBankTransactionsMutation,\n useCreateSingleBankTransactionMutation,\n useBankTransactionsMutation,\n useSingleBankTransactionMutation,\n};\n\nexport type {\n UpdateBankTransactionDto,\n CreateBankTransactionDto,\n};\n","import { formatGlAccount } from \"../../../../utils/generalLedger/generalLedgerUtils.ts\";\nimport { PopupManager } from \"../../../popup/PopupManager.tsx\";\nimport { PopupTrigger } from \"../../../popup/PopupTrigger.tsx\";\nimport { StrongLabel } from \"../../../typography/StrongLabel.tsx\";\nimport { CellButton } from \"../../../inputs/CellButton.tsx\";\nimport { GlAccountPopupList } from \"./GlAccountPopupList.tsx\";\nimport { useSingleBankTransactionMutation } from \"../../../../query/mutations/transactions/bankTransactionMutations.ts\";\nimport { creditGlAccountTypes } from \"../../../../entities/transaction/glAccounts.ts\";\nimport { GlAccount, useGlAccountsPrefetch } from \"../../../../query/fetches/generalLedger/glAccounts.ts\";\nimport { checkEntityPrefix, EntityIdPrefixMap } from \"../../../../entities/entityIdPrefixMap.ts\";\nimport {\n BankTransaction,\n ChildBankTransaction, GlAccountExpanded,\n} from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\n\ntype AccountCellProps = {\n transaction: BankTransaction;\n accountNo?: string;\n accountName?: string;\n};\n\nfunction GlAccountSelector({ transaction, accountNo, accountName }: AccountCellProps) {\n const { startPrefetch, cancelPrefetch } = useGlAccountsPrefetch();\n const { mutate } = useSingleBankTransactionMutation();\n\n const updateGlAccount = (glAccount: GlAccount) => {\n mutate({ id: transaction.id, glAccountId: glAccount.id });\n };\n\n const updateChildGlAccount = (glAccountExpanded: GlAccountExpanded) => {\n if (glAccountExpanded?.id) {\n // @ts-expect-error - TODO: FIX PLS!\n const { parentId, parentsChildren, ...childTransaction } = transaction;\n const updatedChildren: ChildBankTransaction[] = parentsChildren.map((child: ChildBankTransaction) =>\n child.id === transaction.id ? { ...childTransaction, glAccountId: glAccountExpanded.id.toString() } : child);\n\n mutate({ id: parentId, children: updatedChildren });\n }\n };\n\n return (\n <PopupManager placement=\"bottom-start\">\n <PopupTrigger>\n {props => (\n <CellButton {...props} onMouseEnter={startPrefetch} onMouseLeave={cancelPrefetch}>\n <StrongLabel>{formatGlAccount(accountNo, accountName)}</StrongLabel>\n </CellButton>\n )}\n </PopupTrigger>\n <GlAccountPopupList\n onClick={checkEntityPrefix(transaction.id, EntityIdPrefixMap.TRANSACTION_LINE_ITEM) || checkEntityPrefix(transaction.id, EntityIdPrefixMap.PROCESSOR_TRANSACTION) ? updateChildGlAccount : updateGlAccount}\n types={creditGlAccountTypes}\n />\n </PopupManager>\n );\n}\n\nexport { GlAccountSelector };\n","import { operations, components } from \"../../versions/v5/v5Schema.ts\";\nimport { EntityFetchFn, useEntity, UseEntityResult, UseEntityOptions } from \"../utils/useEntity.ts\";\nimport { v5EntityGet, V5EntityGetRequest } from \"../../http/get.ts\";\nimport { usePrefetch } from \"../utils/usePrefetch.ts\";\nimport { useHoverPrefetch } from \"../utils/useHoverPrefetch.ts\";\nimport { EntityIdPrefixMap } from \"../../../entities/entityIdPrefixMap.ts\";\n\n/** IMPORTANT:\n * This is the only place you should reference the API schema directly for transaction categories.\n * Alias any types you need in this file, then export them.\n * This will make it easier to refactor as the API changes.\n *\n * TODO: Currently this consumes V5 expense category API. This should be refactored to use the V6 API when it becomes available\n */\n\ntype TransactionCategory = components[\"schemas\"][\"ExpenseCategoryDTOV5\"]; // raw DTO\n// type TransactionCategoryWithChildren = TransactionCategory & { children?: TransactionCategory[] }; // what we actually use, so we can use categories in a sane way\n// TODO: remove these types once we have the V6 API and ids are prefixed on response\ntype TransactionCategoryWithPrefixedId = Omit<TransactionCategory, \"id\" | \"parentCategoryId\"> & { id: string; parentCategoryId?: string };\ntype TransactionCategoryWithChildrenWithPrefixedIds = TransactionCategoryWithPrefixedId & { children?: TransactionCategoryWithPrefixedId[] };\ntype GetExpenseCategoriesResponse = operations[\"getCategories\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\ntype ExpenseCategoryKey = [\"transactions\", \"expenseCategories\"];\n\nconst expenseCategoryKeys = {\n all: (): ExpenseCategoryKey => [\"transactions\", \"expenseCategories\"],\n};\n\ntype FlatExpenseCategoriesResponse = Omit<GetExpenseCategoriesResponse, \"data\"> & {\n data?: TransactionCategoryWithPrefixedId[];\n};\n\ntype NestedExpenseCategoriesResponse = Omit<GetExpenseCategoriesResponse, \"data\"> & {\n data?: TransactionCategoryWithChildrenWithPrefixedIds[];\n};\n\nconst prefixEntityIds = (categories: TransactionCategory[]): TransactionCategoryWithPrefixedId[] => {\n return categories.map(category => ({\n ...category,\n id: `${EntityIdPrefixMap.TRANSACTION_CATEGORY}_${category.id}`,\n parentCategoryId: category.parentCategoryId ? `${EntityIdPrefixMap.TRANSACTION_CATEGORY}_${category.parentCategoryId}` : undefined,\n }));\n};\n\nconst getTransactionCategories: EntityFetchFn<FlatExpenseCategoriesResponse, ExpenseCategoryKey> = async (queryContext) => {\n const queryKey = queryContext.queryKey;\n const accessToken = queryKey[2].accessToken;\n const environment = queryKey[2].environment;\n\n const params: V5EntityGetRequest = {\n path: \"/expenses/categories\",\n accessToken,\n environment,\n };\n\n const res = await v5EntityGet<GetExpenseCategoriesResponse>(params);\n return {\n ...res,\n data: res.data ? prefixEntityIds(res.data) : undefined,\n };\n};\n\ntype UseExpenseCategoriesOptions<TData> = Partial<UseEntityOptions<FlatExpenseCategoriesResponse, ExpenseCategoryKey, TData>>;\nfunction useExpenseCategories<TData = FlatExpenseCategoriesResponse>(options?: UseExpenseCategoriesOptions<TData>): UseEntityResult<TData> {\n return useEntity<FlatExpenseCategoriesResponse, ExpenseCategoryKey, TData>({\n ...options,\n queryKey: expenseCategoryKeys.all(),\n queryFn: getTransactionCategories,\n });\n}\n\nfunction useNestedExpenseCategories(): UseEntityResult<NestedExpenseCategoriesResponse> {\n return useExpenseCategories<NestedExpenseCategoriesResponse>({\n select: data => ({\n ...data,\n data: data.data ? buildNestedExpenseCategories(data.data) : undefined,\n }),\n });\n}\n\nfunction useFlatExpenseCategories(): UseEntityResult<FlatExpenseCategoriesResponse> {\n return useExpenseCategories();\n}\n\nfunction buildChildrenMap(categories: TransactionCategoryWithPrefixedId[]): Map<string, TransactionCategoryWithPrefixedId[]> {\n const childrenMap = new Map<string, TransactionCategoryWithPrefixedId[]>();\n for (const category of categories) {\n if (category.parentCategoryId) {\n const children = childrenMap.get(category.parentCategoryId) ?? [];\n children.push(category);\n childrenMap.set(category.parentCategoryId, children);\n }\n }\n return childrenMap;\n}\n\ntype FlatExpenseCategoriesWithChildrenResponse = Omit<GetExpenseCategoriesResponse, \"data\"> & {\n data?: TransactionCategoryWithChildrenWithPrefixedIds[];\n};\n\nfunction buildFlatExpenseCategoriesWithChildren(categories: TransactionCategoryWithPrefixedId[]): TransactionCategoryWithChildrenWithPrefixedIds[] {\n if (categories.length === 0) {\n return [];\n }\n\n const childrenMap = buildChildrenMap(categories);\n\n // Return all categories at top level, with children populated for parents\n return categories.map(category => ({\n ...category,\n children: category.id ? childrenMap.get(category.id) : undefined,\n }));\n}\n\nfunction useFlatExpenseCategoriesWithChildren(): UseEntityResult<FlatExpenseCategoriesWithChildrenResponse> {\n return useExpenseCategories<FlatExpenseCategoriesWithChildrenResponse>({\n select: data => ({\n ...data,\n data: data.data ? buildFlatExpenseCategoriesWithChildren(data.data) : undefined,\n }),\n });\n}\n\nfunction buildNestedExpenseCategories(categories: TransactionCategoryWithPrefixedId[]): TransactionCategoryWithChildrenWithPrefixedIds[] {\n if (categories.length === 0) {\n return [];\n }\n\n const childrenMap = buildChildrenMap(categories);\n\n // return categories, where all child categories are nested in their parent category instead of in the top level array\n return categories\n .filter(category => !category.parentCategoryId)\n .map(category => ({\n ...category,\n children: category.id ? childrenMap.get(category.id) : undefined,\n }));\n}\n\nfunction useExpenseCategoryPrefetch() {\n const prefetchFn = usePrefetch(expenseCategoryKeys.all, getTransactionCategories);\n return useHoverPrefetch({ prefetchFn });\n}\n\nconst getCategoryName = (category: TransactionCategoryWithPrefixedId | TransactionCategoryWithChildrenWithPrefixedIds) => (category.name ?? \"Uncategorized\");\nconst getCategoryId = (category: TransactionCategoryWithPrefixedId | TransactionCategoryWithChildrenWithPrefixedIds) => (category.id ? category.id.toString() : \"\");\n\nexport {\n useExpenseCategories,\n useNestedExpenseCategories,\n useFlatExpenseCategories,\n useFlatExpenseCategoriesWithChildren,\n useExpenseCategoryPrefetch,\n getCategoryName,\n getCategoryId,\n expenseCategoryKeys,\n};\n\nexport type {\n TransactionCategoryWithPrefixedId,\n TransactionCategoryWithChildrenWithPrefixedIds,\n};\n","import {\n TransactionCategoryWithChildrenWithPrefixedIds,\n} from \"../../query/fetches/transactions/transactionCategories.ts\";\nimport { CategoryExpanded } from \"../../query/fetches/transactions/bankTransactionQueries.ts\";\n\nconst getExpandedCategoryFromFullCategory = (category: TransactionCategoryWithChildrenWithPrefixedIds): CategoryExpanded => {\n return {\n id: category.id,\n name: category.name,\n };\n};\n\nexport { getExpandedCategoryFromFullCategory };\n","import {\n TransactionCategoryWithChildrenWithPrefixedIds,\n useFlatExpenseCategoriesWithChildren,\n} from \"../../../../query/fetches/transactions/transactionCategories.ts\";\nimport { PopupRow } from \"../../../popup/rows/PopupRow.tsx\";\nimport { stylist } from \"../../../../style/stylist.ts\";\nimport { css } from \"../../../../../styled-system/css\";\nimport { CategoryExpanded } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { getExpandedCategoryFromFullCategory } from \"../../../../entities/expense/expenseCategories.ts\";\nimport { PlaceholderPopupList } from \"../../../popup/placeholder/PlaceholderPopupList.tsx\";\nimport { PlaceholderPopupRow } from \"../../../popup/placeholder/PlaceholderPopupRow.tsx\";\nimport { StrongContent } from \"../../../typography/StrongContent.tsx\";\nimport { SmallIcon } from \"../../../icon/SmallIcon.tsx\";\nimport { ArrowRight } from \"../../../icon/icons/ArrowRight.tsx\";\nimport { useMemo } from \"react\";\nimport Fuse, { FuseResult } from \"fuse.js\";\n\ntype ExpenseCategorySearchListProps = {\n searchTerm: string;\n onClick: (category: CategoryExpanded) => void;\n};\n\ntype SearchResult = {\n parent: TransactionCategoryWithChildrenWithPrefixedIds;\n child: TransactionCategoryWithChildrenWithPrefixedIds;\n};\n\ntype SearchResults = SearchResult[];\n\nconst textStylist = stylist(null, css({\n whiteSpace: \"normal\",\n}));\n\nconst iconStyles = [stylist(null, css({ marginLeft: \"6px\", marginRight: \"6px\" }))];\n\nconst fuseOptions = {\n keys: [\n { name: \"name\" },\n ],\n threshold: 0.2,\n includeScore: true,\n minMatchCharLength: 1,\n};\n\nfunction findParentCategory(\n matchingCategory: TransactionCategoryWithChildrenWithPrefixedIds,\n categories: TransactionCategoryWithChildrenWithPrefixedIds[],\n): TransactionCategoryWithChildrenWithPrefixedIds | undefined {\n return categories.find(parent =>\n parent.id === matchingCategory.id\n || parent.children?.some(child => child.id === matchingCategory.id),\n );\n}\n\nfunction isChildAlreadyAdded(\n child: TransactionCategoryWithChildrenWithPrefixedIds,\n matchingChildren: SearchResults,\n): boolean {\n return matchingChildren.some(result => result.child.id === child.id);\n}\n\nfunction addChildToSearchResults(\n parent: TransactionCategoryWithChildrenWithPrefixedIds,\n child: TransactionCategoryWithChildrenWithPrefixedIds,\n matchingChildren: SearchResults,\n): void {\n if (!isChildAlreadyAdded(child, matchingChildren)) {\n matchingChildren.push({ parent, child });\n }\n}\n\nfunction addAllChildrenToResults(\n parent: TransactionCategoryWithChildrenWithPrefixedIds,\n matchingChildren: SearchResults,\n): void {\n if (parent.children) {\n parent.children.forEach((child) => {\n addChildToSearchResults(parent, child, matchingChildren);\n });\n }\n}\n\nfunction processSearchResults(\n searchResults: FuseResult<TransactionCategoryWithChildrenWithPrefixedIds>[],\n categories: TransactionCategoryWithChildrenWithPrefixedIds[],\n): SearchResults {\n const matchingChildren: SearchResults = [];\n\n searchResults.forEach((result) => {\n const matchingCategory = result.item;\n const parentCategory = findParentCategory(matchingCategory, categories);\n\n if (!parentCategory) {\n return;\n }\n\n const isParentMatch = parentCategory.id === matchingCategory.id;\n\n if (isParentMatch) {\n if (parentCategory.children && parentCategory.children.length > 0) {\n addAllChildrenToResults(parentCategory, matchingChildren);\n } else {\n matchingChildren.push({ parent: parentCategory, child: parentCategory });\n }\n } else {\n addChildToSearchResults(parentCategory, matchingCategory, matchingChildren);\n }\n });\n\n return matchingChildren;\n}\n\nfunction ExpenseCategorySearchList({ searchTerm, onClick }: ExpenseCategorySearchListProps) {\n const { query: { data: categoryRes, isFetched }, isFilling } = useFlatExpenseCategoriesWithChildren();\n const categories = categoryRes?.data;\n\n const isEmpty = !isFilling && isFetched && (categories === undefined || categories.length === 0);\n\n const fuse = useMemo(() => new Fuse(categories ?? [], fuseOptions), [categories]);\n\n const processedSearchResults = useMemo(() => {\n if (!categories) {\n return [];\n }\n const fuseResults = fuse.search(searchTerm);\n return processSearchResults(fuseResults, categories);\n }, [categories, searchTerm, fuse]);\n\n if (isFilling) {\n return <PlaceholderPopupList />;\n }\n\n if (isEmpty) {\n return <PlaceholderPopupRow text=\"No data\" />;\n }\n\n if (processedSearchResults.length === 0) {\n return <PlaceholderPopupRow text=\"No results found\" />;\n }\n\n return (\n <>\n {processedSearchResults.map(({ parent, child }) => {\n const isParentOnly = parent.id === child.id;\n\n return (\n <PopupRow key={`${parent.id}_${child.id}`} onClick={() => onClick(getExpandedCategoryFromFullCategory(child))}>\n <StrongContent stylists={[textStylist]}>\n {isParentOnly\n ? child.name\n : (\n <>\n {parent.name}\n <SmallIcon Component={ArrowRight} stylists={iconStyles} />\n {child.name}\n </>\n )}\n </StrongContent>\n </PopupRow>\n );\n })}\n </>\n );\n}\n\nexport { ExpenseCategorySearchList };\n","import {\n TransactionCategoryWithChildrenWithPrefixedIds,\n useNestedExpenseCategories,\n} from \"../../../../query/fetches/transactions/transactionCategories.ts\";\nimport { PopupRow } from \"../../../popup/rows/PopupRow.tsx\";\nimport { StrongLabel } from \"../../../typography/StrongLabel.tsx\";\nimport { stylist } from \"../../../../style/stylist.ts\";\nimport { css } from \"../../../../../styled-system/css\";\nimport { CategoryExpanded } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { CascadeRow } from \"../../../popup/rows/CascadeRow.tsx\";\nimport { getExpandedCategoryFromFullCategory } from \"../../../../entities/expense/expenseCategories.ts\";\nimport { ExpandableRow } from \"../../../popup/rows/ExpandableRow.tsx\";\nimport { PlaceholderPopupList } from \"../../../popup/placeholder/PlaceholderPopupList.tsx\";\nimport { PlaceholderPopupRow } from \"../../../popup/placeholder/PlaceholderPopupRow.tsx\";\nimport { PopupList } from \"../../../popup/list/PopupList.tsx\";\n\ntype ExpenseCategoryCascadingListProps = {\n onClick: (category: CategoryExpanded) => void;\n};\n\ntype ExpenseCascadeRowPopupProps = {\n category: TransactionCategoryWithChildrenWithPrefixedIds;\n handleCategoryChange: (category: CategoryExpanded) => void;\n};\n\nconst textStylist = stylist(null, css({\n whiteSpace: \"normal\",\n}));\n\nfunction ExpenseCascadeRowPopup({ category, handleCategoryChange }: ExpenseCascadeRowPopupProps) {\n return (\n <PopupList>\n {category.children?.map(child => (\n <PopupRow key={child.id} onClick={() => handleCategoryChange(getExpandedCategoryFromFullCategory(child))}>\n <StrongLabel stylists={[textStylist]}>{child.name}</StrongLabel>\n </PopupRow>\n ))}\n </PopupList>\n );\n}\n\nfunction ExpenseCategoryCascadingList({ onClick }: ExpenseCategoryCascadingListProps) {\n const { query: { data: categoryRes, isFetched }, isFilling } = useNestedExpenseCategories();\n const categories = categoryRes?.data;\n\n const isEmpty = !isFilling && isFetched && categories === undefined;\n\n if (isFilling) {\n return <PlaceholderPopupList />;\n }\n\n if (isEmpty) {\n return <PlaceholderPopupRow text=\"No data\" />;\n }\n\n return (\n <>\n {categories?.map((category) => {\n if (category.hasChilds) {\n return (\n <CascadeRow\n key={category.id}\n triggerChildren={<ExpandableRow displayLabel={category.name} />}\n popupChildren={<ExpenseCascadeRowPopup category={category} handleCategoryChange={onClick} />}\n />\n );\n }\n return (\n <PopupRow key={category?.id} onClick={() => onClick(getExpandedCategoryFromFullCategory(category))}>\n <StrongLabel stylists={[textStylist]}>{category.name}</StrongLabel>\n </PopupRow>\n );\n })}\n </>\n );\n}\n\nexport { ExpenseCategoryCascadingList };\n","import { usePopupContext } from \"../../../popup/hooks/usePopupContext.ts\";\nimport { CategoryExpanded } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { Popup } from \"../../../popup/Popup.tsx\";\nimport { useState } from \"react\";\nimport { PopupSearch } from \"../../../popup/PopupSearch.tsx\";\nimport { isNotNullishOrEmptyOrBlank } from \"../../../../utils/string/stringUtils.ts\";\nimport { PopupList } from \"../../../popup/list/PopupList.tsx\";\nimport { ExpenseCategorySearchList } from \"./ExpenseCategorySearchList.tsx\";\nimport { ExpenseCategoryCascadingList } from \"./ExpenseCategoryCascadingList.tsx\";\n\ntype ExpenseCategoryListProps = {\n onClick?: (category: CategoryExpanded) => void;\n};\n\nconst placeholder = \"Search expense categories...\";\n\n/**\n * Should be rendered inside a {@link PopupManager} as a sibling of a {@link PopupTrigger}\n */\nconst ExpenseCategoryPopupList = ({ onClick }: ExpenseCategoryListProps) => {\n const parentPopupContext = usePopupContext();\n const [searchTerm, setSearchTerm] = useState(\"\");\n\n const handleCategoryChange = (category: CategoryExpanded) => {\n if (onClick !== undefined) {\n onClick(category);\n }\n parentPopupContext.setOpen(false);\n };\n\n return (\n <Popup>\n <PopupList>\n <PopupSearch searchTerm={searchTerm} setSearchTerm={setSearchTerm} placeholder={placeholder} />\n {isNotNullishOrEmptyOrBlank(searchTerm)\n ? <ExpenseCategorySearchList searchTerm={searchTerm} onClick={handleCategoryChange} />\n : <ExpenseCategoryCascadingList onClick={handleCategoryChange} />}\n </PopupList>\n </Popup>\n );\n};\n\nexport {\n ExpenseCategoryPopupList,\n};\n","import IconComponent from \"../../../../assets/icons/megaphone.svg?react\";\nimport { createIcon } from \"../../createIcon.tsx\";\n\nconst Advertising = createIcon(IconComponent, \"Advertising\");\n\nexport { Advertising };\n","import * as React from \"react\";\nconst SvgMegaphone = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 16, viewBox: \"0 0 16 16\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M12.6809 12.4781H12.0645L6.49121 9.38327V4.42636L12.0645 1.33154H12.6809V12.4781Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M4.01263 4.42627H6.49108V9.38317H4.01263C3.35531 9.38317 2.7249 9.12205 2.2601 8.65725C1.7953 8.19245 1.53418 7.56205 1.53418 6.90472C1.53418 6.2474 1.7953 5.61699 2.2601 5.15219C2.7249 4.68739 3.35531 4.42627 4.01263 4.42627Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M4.0127 9.3833H6.49115L7.72389 14.9566H5.25192L4.0127 9.3833Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M12.6807 5.66553H13.9199C14.2486 5.66553 14.5638 5.79609 14.7962 6.02849C15.0286 6.26089 15.1591 6.57609 15.1591 6.90475C15.1591 7.06749 15.1271 7.22864 15.0648 7.37898C15.0025 7.52933 14.9112 7.66595 14.7962 7.78102C14.6811 7.89609 14.5445 7.98737 14.3941 8.04965C14.2438 8.11193 14.0826 8.14398 13.9199 8.14398H12.6807V5.66553Z\", stroke: \"#182428\", strokeMiterlimit: 10 }));\nexport default SvgMegaphone;\n","import IconComponent from \"../../../../assets/icons/question.svg?react\";\nimport { createIcon } from \"../../createIcon.tsx\";\n\nconst Uncategorized = createIcon(IconComponent, \"Uncategorized\");\n\nexport { Uncategorized };\n","import * as React from \"react\";\nconst SvgQuestion = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: \"16px\", height: \"16px\", viewBox: \"0 0 16 16\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M7.84644 15.0764C11.6751 15.0764 14.7788 11.9727 14.7788 8.14405C14.7788 4.3154 11.6751 1.21167 7.84644 1.21167C4.0178 1.21167 0.914062 4.3154 0.914062 8.14405C0.914062 11.9727 4.0178 15.0764 7.84644 15.0764Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M7.79217 9.6784V8.95116C7.79192 8.79114 7.82335 8.63265 7.88467 8.48484C7.94598 8.33703 8.03596 8.20282 8.14941 8.08996L8.65337 7.586C8.88132 7.35726 9.00972 7.04774 9.01061 6.7248V6.61636C9.00892 6.29431 8.8798 5.98603 8.65149 5.75891C8.42317 5.53179 8.11422 5.40429 7.79217 5.4043C7.47012 5.40429 7.16117 5.53179 6.93285 5.75891C6.70453 5.98603 6.57542 6.29431 6.57373 6.61636\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M7.18604 10.8838H8.39809\", stroke: \"#182428\", strokeMiterlimit: 10 }));\nexport default SvgQuestion;\n","import IconComponent from \"../../../../assets/icons/eating-utensils.svg?react\";\nimport { createIcon } from \"../../createIcon.tsx\";\n\nconst Meals = createIcon(IconComponent, \"Meals\");\n\nexport { Meals };\n","import * as React from \"react\";\nconst SvgEatingUtensils = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 16, viewBox: \"0 0 16 16\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M7.71472 0.800293V4.79785C7.71535 5.25195 7.58889 5.69716 7.34964 6.08313C7.11039 6.46909 6.7679 6.78039 6.36091 6.98182C6.02094 7.15207 5.64596 7.24072 5.26574 7.24072C4.88552 7.24072 4.51053 7.15207 4.17056 6.98182C3.76928 6.77569 3.43283 6.4626 3.19841 6.07716C2.964 5.69173 2.84075 5.24897 2.8423 4.79785V0.800293\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M5.29443 0.800293V15.4878\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M10.1861 15.4879V1.43896C10.668 1.43896 11.1451 1.53399 11.5903 1.71859C12.0354 1.9032 12.4398 2.17377 12.7802 2.51482C13.1207 2.85587 13.3905 3.2607 13.5744 3.70616C13.7582 4.15161 13.8524 4.62894 13.8516 5.11084V8.78271L10.1797 10.6155\", stroke: \"#182428\", strokeMiterlimit: 10 }));\nexport default SvgEatingUtensils;\n","import IconComponent from \"../../../../assets/icons/shoe.svg?react\";\nimport { createIcon } from \"../../createIcon.tsx\";\n\nconst Sports = createIcon(IconComponent, \"Sports\");\n\nexport { Sports };\n","import * as React from \"react\";\nconst SvgShoe = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 16, viewBox: \"0 0 16 16\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M13.7665 10.8572H2.9268C2.60718 10.8572 2.30065 10.7302 2.07465 10.5042C1.84865 10.2782 1.72168 9.9717 1.72168 9.65208V4.97673C1.72168 4.87842 1.74114 4.78109 1.77895 4.69035C1.81676 4.5996 1.87217 4.51725 1.94197 4.44803C2.01178 4.37881 2.0946 4.3241 2.18566 4.28706C2.27672 4.25001 2.37421 4.23137 2.47251 4.2322C2.598 4.23423 2.7211 4.2669 2.83107 4.32739C2.94104 4.38787 3.03455 4.47433 3.10346 4.57923C4.03096 5.93577 7.14155 5.34899 7.14155 4.2322L13.3312 7.08411C13.8209 7.31135 14.2355 7.67379 14.5261 8.12874C14.8167 8.5837 14.9713 9.11222 14.9717 9.65208C14.9717 9.9717 14.8447 10.2782 14.6187 10.5042C14.3927 10.7302 14.0862 10.8572 13.7665 10.8572Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M14.9717 9.6521V10.8572C14.97 11.4954 14.7153 12.1068 14.2635 12.5574C13.8117 13.0081 13.1996 13.2611 12.5614 13.2611H2.92681C2.76832 13.262 2.61124 13.2314 2.46465 13.1711C2.31806 13.1108 2.18487 13.0221 2.0728 12.91C1.96073 12.798 1.87199 12.6648 1.81173 12.5182C1.75146 12.3716 1.72086 12.2145 1.7217 12.056V9.6521\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M6.54199 3.0271L7.1414 4.23222\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M8.34668 7.24174L9.5518 5.43091\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M10.1514 8.44706L11.3565 6.63623\", stroke: \"#182428\", strokeMiterlimit: 10 }));\nexport default SvgShoe;\n","import IconComponent from \"../../../../assets/icons/bed.svg?react\";\nimport { createIcon } from \"../../createIcon.tsx\";\n\nconst Bedding = createIcon(IconComponent, \"Bedding\");\n\nexport { Bedding };\n","import * as React from \"react\";\nconst SvgBed = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 16, viewBox: \"0 0 16 16\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M2.64551 15.0589V13.3516\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M14.6148 10.5042H2.07861V13.3517H14.6148V10.5042Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M5.07515 7.62671H11.6417C12.2861 7.62671 12.9041 7.88269 13.3598 8.33833C13.8154 8.79398 14.0714 9.41197 14.0714 10.0563V10.4742H2.64551V10.0563C2.64551 9.41197 2.90149 8.79398 3.35713 8.33833C3.81278 7.88269 4.43077 7.62671 5.07515 7.62671Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M5.49942 5.37623H6.63962C6.86383 5.37623 7.08584 5.42039 7.29298 5.50619C7.50012 5.59199 7.68833 5.71775 7.84687 5.87629C8.00541 6.03483 8.13117 6.22304 8.21697 6.43018C8.30277 6.63733 8.34693 6.85934 8.34693 7.08355V7.68051H3.78613V7.08355C3.78613 6.85884 3.83049 6.63633 3.91666 6.4288C4.00284 6.22127 4.12913 6.03279 4.2883 5.87418C4.44747 5.71556 4.63639 5.58992 4.84422 5.50448C5.05205 5.41903 5.27471 5.37545 5.49942 5.37623Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M10.054 5.37622H11.1942C11.647 5.37622 12.0813 5.5561 12.4014 5.87628C12.7216 6.19647 12.9015 6.63073 12.9015 7.08354V7.6805H8.34668V7.08354C8.34668 6.63073 8.52656 6.19647 8.84674 5.87628C9.16692 5.5561 9.60119 5.37622 10.054 5.37622Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M12.9018 3.0957H3.78613V7.6565H12.9018V3.0957Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M14.0479 15.0589V13.3516\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M3.78613 1.38843V3.09574\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M12.9077 1.38843V3.09574\", stroke: \"#182428\", strokeMiterlimit: 10 }));\nexport default SvgBed;\n","import IconComponent from \"../../../../assets/icons/airplane.svg?react\";\nimport { createIcon } from \"../../createIcon.tsx\";\n\nconst Airplane = createIcon(IconComponent, \"Airplane\");\n\nexport { Airplane };\n","import * as React from \"react\";\nconst SvgAirplane = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 16, viewBox: \"0 0 16 16\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M3.58312 11.8285C3.40778 11.6564 3.29681 11.4294 3.26874 11.1854C3.24068 10.9414 3.29723 10.6951 3.42894 10.4878L6.01648 6.34502L10.8698 1.4917C11.2763 1.0884 11.8256 0.861929 12.3982 0.861572C12.6808 0.861572 12.9606 0.917231 13.2217 1.02537C13.4827 1.13351 13.7199 1.29201 13.9198 1.49183C14.1196 1.69164 14.2781 1.92885 14.3862 2.18992C14.4944 2.451 14.55 2.73081 14.55 3.01339C14.5497 3.586 14.3232 4.1353 13.9199 4.54178L9.06657 9.3951L4.92381 11.9826C4.71647 12.1144 4.47021 12.1709 4.22618 12.1428C3.98215 12.1148 3.75515 12.0038 3.58312 11.8285Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M12.1101 6.34497L9.67676 8.78504L12.7201 14.2685L14.5502 13.0485L12.1101 6.34497Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M9.06658 3.30164L6.62651 5.735L1.14307 2.69162L2.3631 0.861572L9.06658 3.30164Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M4.49481 8.78516H1.75308L1.14307 10.6152L3.58313 11.8285L4.80317 14.2686L6.62651 13.6586V10.9169\", stroke: \"#182428\", strokeMiterlimit: 10 }));\nexport default SvgAirplane;\n","import IconComponent from \"../../../../assets/icons/car.svg?react\";\nimport { createIcon } from \"../../createIcon.tsx\";\n\nconst Vehicle = createIcon(IconComponent, \"Vehicle\");\n\nexport { Vehicle };\n","import * as React from \"react\";\nconst SvgCar = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 15, height: 11, viewBox: \"0 0 15 11\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M8.58591 0.969731H4.86823C4.67602 0.970222 4.4865 1.01495 4.31436 1.10046C4.14222 1.18597 3.99207 1.30996 3.87555 1.46283L2.38978 3.44818L0.53418 4.06455V8.3986H2.38978C2.38978 8.06994 2.52034 7.75473 2.75274 7.52233C2.98514 7.28993 3.30034 7.15937 3.629 7.15937C3.95766 7.15937 4.27287 7.28993 4.50527 7.52233C4.73767 7.75473 4.86823 8.06994 4.86823 8.3986H9.20228C9.20228 8.06994 9.33284 7.75473 9.56524 7.52233C9.79764 7.28993 10.1128 7.15937 10.4415 7.15937C10.7702 7.15937 11.0854 7.28993 11.3178 7.52233C11.5502 7.75473 11.6807 8.06994 11.6807 8.3986H14.1592V5.52437C14.1588 5.27713 14.0844 5.03565 13.9457 4.831C13.8069 4.62636 13.6101 4.46789 13.3806 4.37598L11.0644 3.44818L9.57858 1.46283C9.46275 1.30922 9.31275 1.18469 9.14045 1.09911C8.96815 1.01352 8.77829 0.969227 8.58591 0.969731Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M10.4414 9.63788C11.1258 9.63788 11.6806 9.08306 11.6806 8.39865C11.6806 7.71424 11.1258 7.15942 10.4414 7.15942C9.75697 7.15942 9.20215 7.71424 9.20215 8.39865C9.20215 9.08306 9.75697 9.63788 10.4414 9.63788Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M3.62887 9.63788C4.31328 9.63788 4.8681 9.08306 4.8681 8.39865C4.8681 7.71424 4.31328 7.15942 3.62887 7.15942C2.94447 7.15942 2.38965 7.71424 2.38965 8.39865C2.38965 9.08306 2.94447 9.63788 3.62887 9.63788Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M12.6021 4.06445H4.25195\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M12.9199 6.54297H14.1591\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M7.34668 2.20898V4.06458\", stroke: \"#182428\", strokeMiterlimit: 10 }));\nexport default SvgCar;\n","import { Advertising } from \"./icons/category/Advertising.tsx\";\nimport { Uncategorized } from \"./icons/category/Uncategorized.tsx\";\nimport { Meals } from \"./icons/category/Meals.tsx\";\nimport { Bank } from \"./icons/category/Bank.tsx\";\nimport { Sports } from \"./icons/category/Sports.tsx\";\nimport { Bedding } from \"./icons/category/Bedding.tsx\";\nimport { Airplane } from \"./icons/category/Airplane.tsx\";\nimport { Vehicle } from \"./icons/category/Vehicle.tsx\";\n\nfunction CategoryIcon(name: string | undefined) {\n switch (name) {\n case \"Advertising\":\n case \"Advertising and Marketing\":\n return Advertising;\n case \"Bank Fees\":\n case \"Bank Charges & Fees\":\n case \"College Loans\":\n case \"Merchant Processing Fees\":\n return Bank;\n case \"Health & Fitness\":\n case \"Sports\":\n case \"Sporting Goods\":\n return Sports;\n case \"Linen/Key Service\":\n case \"Linens (sheets, towels, etc.)\":\n case \"Hotel\":\n case \"Hotels\":\n return Bedding;\n case \"Plane / Train / Bus\":\n case \"Airlines\":\n case \"Airfare\":\n return Airplane;\n case \"Vehicle\":\n case \"Taxi\":\n case \"Rental Car\":\n case \"Rental Cars\":\n case \"Car Payment\":\n case \"Auto Insurance\":\n case \"Other Vehicle Expenses\":\n case \"Parking and Tolls\":\n case \"Parking & Tolls\":\n case \"Transportation (Taxi, Rideshare, Train)\":\n return Vehicle;\n // case \"Commissions & Fees\":\n // case \"Commissions Expense\":\n // return Coins;\n // case \"Contractors\":\n // return Contractor;\n // case \"Depreciation\":\n // return Depreciation;\n // case \"Employee Benefits\":\n // case \"Payroll - Benefits\":\n // return Benefits;\n // case \"Home & Property\":\n // case \"Property Taxes\":\n // return Home;\n // case \"Interest\":\n // case \"Interest Paid\":\n // return Interest;\n case \"Meals & Entertainment\":\n case \"Meals\":\n case \"Business Meals\":\n case \"Food & Dining\":\n case \"Groceries\":\n case \"Restaurants\":\n case \"Other Food & Dining\":\n case \"Lead Gen - Meals\":\n case \"PAX Food & Drink\":\n return Meals;\n // case \"Office Expenses\":\n // case \"Office Expenses & Software/Subscriptions\":\n // return OfficeExpenses;\n // case \"Other\":\n // return Tags;\n // case \"Other Equipment & Property\":\n // return Printer;\n // case \"Payroll\":\n // return Payroll;\n // case \"Professional Services\":\n // case \"Legal & Professional Services\":\n // return ProfessionalServices;\n // case \"Taxes & Licenses\":\n // return isCanada ? Leaf : Taxes;\n // case \"Travel\":\n // case \"Travel (excl. Meals)\":\n // return Travel;\n // case \"Utilities\":\n // return Utilities;\n // case \"Vehicle\":\n // return Car;\n // // REA Categories BELOW\n // case \"Automobile\":\n // case \"Automobile Expenses (not deductible if taking Mileage Deduction)\":\n // case \"Automobile Expenses (deductible even if taking Mileage Deduction)\":\n // return Car;\n // case \"Commissions Paid Out\":\n // return Coins;\n case \"Uncategorized\":\n case \"Ask Member\":\n case \"Suspense (TBD by Accountant)\":\n case \"Uncategorized Expenses\":\n default:\n return Uncategorized;\n }\n}\n\nexport {\n CategoryIcon,\n};\n","import { PopupManager } from \"../../../popup/PopupManager.tsx\";\nimport { PopupTrigger } from \"../../../popup/PopupTrigger.tsx\";\nimport { ExpenseCategoryPopupList } from \"./ExpenseCategoryPopupList.tsx\";\nimport { useExpenseCategoryPrefetch } from \"../../../../query/fetches/transactions/transactionCategories.ts\";\nimport {\n BankTransaction,\n CategoryExpanded, ChildBankTransaction,\n} from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { StrongLabel } from \"../../../typography/StrongLabel.tsx\";\nimport { CellButton } from \"../../../inputs/CellButton.tsx\";\nimport { CategoryIcon } from \"../../../icon/CategoryIcon.tsx\";\nimport { MediumIcon } from \"../../../icon/MediumIcon.tsx\";\nimport { useSingleBankTransactionMutation } from \"../../../../query/mutations/transactions/bankTransactionMutations.ts\";\nimport { checkEntityPrefix, EntityIdPrefixMap } from \"../../../../entities/entityIdPrefixMap.ts\";\n\ntype CategorySelectorProps = {\n transaction: BankTransaction;\n};\n\nfunction ExpenseCategorySelector({ transaction }: CategorySelectorProps) {\n const { startPrefetch, cancelPrefetch } = useExpenseCategoryPrefetch();\n const category = transaction.category?.name ?? \"Uncategorized\";\n const { mutate } = useSingleBankTransactionMutation();\n\n const updateCategory = (category: CategoryExpanded) => {\n if (category?.id) {\n mutate({ id: transaction.id, categoryId: category.id.toString() });\n }\n };\n\n const updateChildCategory = (category: CategoryExpanded) => {\n if (category?.id) {\n // @ts-expect-error - TODO: FIX PLS!\n const { parentId, parentsChildren, ...childTransaction } = transaction;\n const updatedChildren: ChildBankTransaction[] = parentsChildren.map((child: ChildBankTransaction) =>\n child.id === transaction.id ? { ...childTransaction, categoryId: category.id.toString() } : child);\n\n mutate({ id: parentId, children: updatedChildren });\n }\n };\n\n return (\n <PopupManager placement=\"bottom-start\">\n <PopupTrigger>\n {props => (\n <CellButton {...props} onMouseEnter={startPrefetch} onMouseLeave={cancelPrefetch}>\n <MediumIcon Component={CategoryIcon(category)} />\n <StrongLabel>{category}</StrongLabel>\n </CellButton>\n )}\n </PopupTrigger>\n <ExpenseCategoryPopupList onClick={checkEntityPrefix(transaction.id, EntityIdPrefixMap.TRANSACTION_LINE_ITEM) ? updateChildCategory : updateCategory} />\n </PopupManager>\n );\n}\n\nexport { ExpenseCategorySelector };\n","import * as React from \"react\";\nconst SvgSplit = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 16, viewBox: \"0 0 16 16\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M4.31676 1.37476L1.67926 4.01226L4.31676 6.64976\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M12.2292 6.64976L14.8667 4.01226L12.2292 1.37476\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M8.27301 14.5623V7.96852C8.27301 6.91926 7.85619 5.91297 7.11425 5.17103C6.37231 4.42909 5.36602 4.01227 4.31676 4.01227H1.67926\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M8.27301 14.5623V7.96852C8.27301 6.91926 8.68983 5.91297 9.43177 5.17103C10.1737 4.42909 11.18 4.01227 12.2293 4.01227H14.8668\", stroke: \"#182428\", strokeMiterlimit: 10 }));\nexport default SvgSplit;\n","import IconComponent from \"../../../assets/icons/split.svg?react\";\nimport { createIcon } from \"../createIcon.tsx\";\n\nconst Split = createIcon(IconComponent, \"Split\");\n\nexport { Split };\n","import { BankTransaction } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { StrongLabel } from \"../../../typography/StrongLabel.tsx\";\nimport { stylist } from \"../../../../style/stylist.ts\";\nimport { css } from \"../../../../../styled-system/css\";\nimport { SubLabel } from \"../../../typography/SubLabel.tsx\";\nimport { TableCellLayout } from \"../../../tables/cells/TableCellLayout.tsx\";\nimport { Split } from \"../../../icon/icons/Split.tsx\";\nimport { pluralize } from \"../../../typography/textTransformers.ts\";\nimport { MediumIcon } from \"../../../icon/MediumIcon.tsx\";\n\ntype CategorySelectorProps = {\n transaction: BankTransaction;\n};\n\nconst buttonTextContainer = stylist(null, css({\n flexDirection: \"column\",\n textAlign: \"start\",\n width: \"100%\",\n overflow: \"hidden\",\n}));\nconst buttonContentContainer = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"100%\",\n gap: \"10px\",\n}));\n\nfunction ParentExpenseCategoryCell({ transaction }: CategorySelectorProps) {\n const childCategories = transaction.children\n .map(child => child?.category?.name)\n .filter(categoryName => categoryName !== undefined);\n const categorySet = new Set<string>(childCategories);\n const categoryList = [...categorySet].join(\", \");\n const mainLabel = pluralize(\"Category\", \"Categories\", categorySet.size, true);\n\n return (\n <TableCellLayout>\n <div {...buttonContentContainer}>\n <MediumIcon Component={Split} />\n <div {...buttonTextContainer}>\n <StrongLabel>{mainLabel}</StrongLabel>\n <SubLabel>{categoryList}</SubLabel>\n </div>\n </div>\n </TableCellLayout>\n );\n}\n\nexport { ParentExpenseCategoryCell };\n","import { BankTransaction } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { ExpenseCategorySelector } from \"./ExpenseCategorySelector.tsx\";\nimport { ParentExpenseCategoryCell } from \"./ParentExpenseCategoryCell.tsx\";\n\ntype ExpenseCategoryCellProps = {\n transaction: BankTransaction;\n};\n\nfunction ExpenseCategoryCell({ transaction }: ExpenseCategoryCellProps) {\n if (transaction.children?.length > 0) {\n return (<ParentExpenseCategoryCell transaction={transaction} />);\n }\n return (<ExpenseCategorySelector transaction={transaction} />);\n};\n\nexport { ExpenseCategoryCell };\n","import { BankAccount } from \"../../query/fetches/banks/bankAccounts.ts\";\n\n// TODO: these should be non nullable once api correctly reflects that\ntype ApiAccountNo = BankAccount[\"apiAccountNo\"];\ntype ApiAccountName = BankAccount[\"apiAccountName\"];\n\nconst TARGET_ACC_NO_LEN = 4;\n\nfunction padAccountNo(accountNo: NonNullable<ApiAccountNo>) {\n const paddingNeeded = Math.max(TARGET_ACC_NO_LEN - accountNo.length, 0);\n return `${accountNo + \"*\".repeat(paddingNeeded)}`;\n}\n\nfunction formatAccountName(accountName: ApiAccountName, accountNo: ApiAccountNo) {\n if (!accountNo) {\n return accountName ?? \"\";\n }\n return `${accountName} *${padAccountNo(accountNo)}`;\n}\n\nexport {\n formatAccountName,\n};\n","import { BankAccount } from \"../query/fetches/banks/bankAccounts.ts\";\nimport { BankAccountExpanded, BankTransaction } from \"../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { formatAccountName } from \"./bankAccount/accountNameFormatter.ts\";\n\nconst getExpandedBankAccountFromFullBankAccount = (bankAccount: BankAccount): BankAccountExpanded => {\n return {\n id: bankAccount.id,\n name: bankAccount.apiAccountName,\n };\n};\n\nconst getBankTransferDirection = (amount: number) => {\n return amount > 0 ? \"Deposited to\" : \"Withdrawn from\";\n};\n\nconst getFormBankAccountDescription = (bankAccount: BankAccount, transaction: BankTransaction) => {\n const isBankTransfer = transaction.type === \"BANK_TRANSFER\";\n const direction = getBankTransferDirection(transaction.amount);\n return `${isBankTransfer ? `${direction} ` : \"\"}${formatAccountName(bankAccount.apiAccountName, bankAccount.apiAccountNo)}`;\n};\n\nexport { getExpandedBankAccountFromFullBankAccount, getBankTransferDirection, getFormBankAccountDescription };\n","import { BankTransaction } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { BankAccountCell } from \"../BankAccountCell.tsx\";\nimport { GlAccountSelector } from \"./GlAccountSelector.tsx\";\nimport { ExpenseCategoryCell } from \"./ExpenseCategoryCell.tsx\";\nimport { getBankTransferDirection } from \"../../../../entities/bankAccounts.ts\";\n\ntype CategoryCellProps = {\n transaction: BankTransaction;\n};\n\nfunction CategoryCell({ transaction }: CategoryCellProps) {\n switch (transaction.type) {\n case \"EXPENSE\":\n return <ExpenseCategoryCell transaction={transaction} />;\n case \"BANK_TRANSFER\":\n return <BankAccountCell annotation={getBankTransferDirection(transaction.amount)} accountName={transaction.bankAccount?.name} />;\n case \"REVENUE\":\n case \"INVOICE_PAYMENT\":\n case \"TAX_PAYMENT\":\n default:\n return (\n <GlAccountSelector\n transaction={transaction}\n accountNo={transaction.glAccount?.accountNo}\n accountName={transaction.glAccount?.name}\n />\n );\n }\n}\n\nexport { CategoryCell };\n","import { Label } from \"../../typography/Label.tsx\";\n\ntype ClassSegmentCellProps = {\n name?: string;\n};\n\nfunction ClassSegmentCell({ name }: ClassSegmentCellProps) {\n return (\n <>\n {name && <Label>{name}</Label>}\n </>\n );\n}\n\nexport {\n ClassSegmentCell,\n};\n","import { BankTransaction } from \"../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { UpdateBankTransactionDto } from \"../../query/mutations/transactions/bankTransactionMutations.ts\";\nimport { UserRole } from \"../../userContext/userContext.ts\";\n\ntype ReviewStatus = BankTransaction[\"reviewStatus\"];\n\ntype LabeledReviewStatus = {\n name: string;\n value: ReviewStatus;\n};\n\n// make all values available at runtime\nconst REVIEW_STATUSES = {\n PARTNER_REVIEW_REQUIRED: \"PARTNER_REVIEW_REQUIRED\",\n USER_REVIEW_REQUIRED: \"USER_REVIEW_REQUIRED\",\n ACCOUNTANT_REVIEW_REQUIRED: \"ACCOUNTANT_REVIEW_REQUIRED\",\n RECONCILIATION_STAGED: \"RECONCILIATION_STAGED\",\n RECONCILED: \"RECONCILED\",\n RECONCILIATION_DISCREPANCY: \"RECONCILIATION_DISCREPANCY\",\n} as const satisfies Record<ReviewStatus, ReviewStatus>;\n\nconst reviewStatuses: LabeledReviewStatus[] = [\n { name: \"Partner Review Required\", value: REVIEW_STATUSES.PARTNER_REVIEW_REQUIRED },\n { name: \"User Review Required\", value: REVIEW_STATUSES.USER_REVIEW_REQUIRED },\n { name: \"Accountant Review Required\", value: REVIEW_STATUSES.ACCOUNTANT_REVIEW_REQUIRED },\n { name: \"Reconciliation Staged\", value: REVIEW_STATUSES.RECONCILIATION_STAGED },\n { name: \"Reconciled\", value: REVIEW_STATUSES.RECONCILED },\n { name: \"Reconciliation Discrepancy\", value: REVIEW_STATUSES.RECONCILIATION_DISCREPANCY },\n];\n\n// Validates that the incoming string id is a valid ReviewStatus value\nfunction isReviewStatus(status: string): status is ReviewStatus {\n return status in REVIEW_STATUSES; // checks on the keys not values\n}\n\nconst needsReview = (status: ReviewStatus, userRole: UserRole) => {\n switch (userRole) {\n case \"ACCOUNTANT\":\n return status === REVIEW_STATUSES.ACCOUNTANT_REVIEW_REQUIRED;\n case \"OWNER\":\n return status === REVIEW_STATUSES.USER_REVIEW_REQUIRED;\n }\n};\n\nconst pendingReview = (status: ReviewStatus, userRole: UserRole) => {\n return userRole === \"OWNER\" && status === REVIEW_STATUSES.ACCOUNTANT_REVIEW_REQUIRED;\n};\n\nconst pendingUserReview = (status: ReviewStatus, userRole: UserRole) => {\n return userRole === \"ACCOUNTANT\" && status === REVIEW_STATUSES.USER_REVIEW_REQUIRED;\n};\n\nconst isDiscrepancy = (status: ReviewStatus) => {\n return status === \"RECONCILIATION_DISCREPANCY\";\n};\n\nconst isReconciled = (status: ReviewStatus) => {\n return status === \"RECONCILED\";\n};\n\n/**\n * Takes an array of transactions and a review status to update with, and returns the array of updateDTOs for the operation\n * @param transactions Array<{@link BankTransaction}>\n * @param status {@link ReviewStatus}\n */\nconst bulkUpdateReviewStatus = (transactions: BankTransaction[], status: ReviewStatus): UpdateBankTransactionDto[] => (\n transactions.map(transaction => ({\n id: transaction.id,\n reviewStatus: status,\n }))\n);\n\nexport {\n reviewStatuses,\n isReviewStatus,\n needsReview,\n pendingReview,\n pendingUserReview,\n isDiscrepancy,\n isReconciled,\n bulkUpdateReviewStatus,\n};\n\nexport type {\n ReviewStatus,\n LabeledReviewStatus,\n};\n","import IconComponent from \"../../../assets/icons/circle-check.svg?react\";\nimport { createIcon } from \"../createIcon\";\n\nconst CircleCheck = createIcon(IconComponent, \"CircleCheck\");\n\nexport { CircleCheck };\n","import * as React from \"react\";\nconst SvgCircleCheck = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 16, viewBox: \"0 0 16 16\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M8.32497 15.1744C12.1492 15.1744 15.2494 12.0742 15.2494 8.24998C15.2494 4.42573 12.1492 1.32556 8.32497 1.32556C4.50071 1.32556 1.40054 4.42573 1.40054 8.24998C1.40054 12.0742 4.50071 15.1744 8.32497 15.1744Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M4.54623 8.25001L7.06541 10.7692L12.1037 5.73083\", stroke: \"#182428\", strokeMiterlimit: 10 }));\nexport default SvgCircleCheck;\n","import IconComponent from \"../../../assets/icons/processing.svg?react\";\nimport { createIcon } from \"../createIcon\";\n\nconst Processing = createIcon(IconComponent, \"Processing\");\n\nexport { Processing };\n","import * as React from \"react\";\nconst SvgProcessing = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 16, viewBox: \"0 0 16 16\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M7.81985 0.464722V3.49919\", stroke: \"black\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M7.81985 12.0008V15.0353\", stroke: \"black\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M15.1051 7.75H12.0706\", stroke: \"black\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M3.56907 7.75H0.534607\", stroke: \"black\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M12.9702 2.59967L10.8227 4.74724\", stroke: \"black\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M4.81706 10.7528L2.66949 12.9004\", stroke: \"black\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M12.9702 12.9004L10.8227 10.7528\", stroke: \"black\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M4.81706 4.74724L2.66949 2.59967\", stroke: \"black\", strokeMiterlimit: 10 }));\nexport default SvgProcessing;\n","import { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { MouseEventHandler, PropsWithChildren } from \"react\";\nimport { small } from \"../../style/text.ts\";\nimport { fadeBackground } from \"../../style/transition.ts\";\nimport { PopupTriggerChildrenProps } from \"../popup/PopupTrigger.tsx\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\nimport { mergeStylists } from \"../../style/mergeStylists.ts\";\n\ntype BadgeProps = PropsWithChildren<{\n type: \"critical\" | \"warning\" | \"neutral\" | \"success\" | \"highlight\";\n onClick?: MouseEventHandler<HTMLButtonElement>;\n popupTriggerProps?: PopupTriggerChildrenProps;\n}>;\n\n// data-state=closed resets the active state when the popup closes\nconst badgeCss = css({\n maxWidth: \"100%\",\n width: \"fit-content\",\n display: \"inline-flex\",\n padding: \"4px 5px\",\n justifyContent: \"center\",\n alignItems: \"center\",\n gap: \"5px\",\n borderRadius: \"sm\",\n border: \"{borderWidths.md} solid\",\n borderColor: \"border.layout\",\n background: \"surface.background\",\n cursor: \"pointer\",\n \"&:focus\": {\n outline: \"none\",\n },\n \"&[data-state='closed']\": {},\n \"& .Tight-sub-label\": {\n color: \"typography.base\",\n },\n \"& .Tight-medium-icon > path\": {\n stroke: \"icon.base\",\n },\n});\n\nconst neutral = css({\n background: \"surface.intent.secondary\",\n border: \"{borderWidths.sm} solid\",\n borderColor: \"border.intent.secondary\",\n \"& .Tight-sub-label\": {\n color: \"typography.intent.secondary\",\n },\n \"& .Tight-medium-icon > path\": {\n stroke: \"icon.intent.secondary\",\n },\n \"&:hover, &:focus-visible, &[data-state='open']\": {\n background: \"surface.intent.secondary.hover\",\n borderColor: \"border.intent.secondary.hover\",\n \"& .Tight-sub-label\": {\n color: \"typography.intent.secondary.hover\",\n },\n \"& .Tight-medium-icon > path\": {\n stroke: \"icon.intent.secondary.hover\",\n },\n },\n});\n\nconst highlight = css({\n borderRadius: \"sm\",\n border: \"{borderWidths.md} solid\",\n borderColor: \"border.intent.action\",\n background: \"surface.intent.action\",\n \"& .Tight-sub-label\": {\n color: \"typography.intent.action\",\n },\n \"& .Tight-medium-icon > path\": {\n stroke: \"icon.intent.action\",\n },\n \"&:hover, &:focus-visible, &[data-state='open']\": {\n background: \"surface.intent.action.hover\",\n borderColor: \"border.intent.action.hover\",\n \"& .Tight-sub-label\": {\n color: \"typography.intent.action.hover\",\n },\n \"& .Tight-medium-icon > path\": {\n stroke: \"icon.intent.action.hover\",\n },\n },\n});\n\nconst success = css({\n borderRadius: \"sm\",\n border: \"{borderWidths.md} solid\",\n borderColor: \"border.intent.success\",\n background: \"surface.intent.success\",\n \"& .Tight-sub-label\": {\n color: \"typography.intent.success\",\n },\n \"& .Tight-medium-icon > path\": {\n stroke: \"icon.intent.success\",\n },\n \"&:hover, &:focus-visible, &[data-state='open']\": {\n background: \"surface.intent.success.hover\",\n borderColor: \"border.intent.success.hover\",\n \"& .Tight-sub-label\": {\n color: \"typography.intent.success.hover\",\n },\n \"& .Tight-medium-icon > path\": {\n stroke: \"icon.intent.success.hover\",\n },\n },\n});\n\nconst warning = css({\n background: \"surface.intent.warning\",\n border: \"{borderWidths.sm} solid\",\n borderColor: \"border.intent.warning\",\n \"& .Tight-sub-label\": {\n color: \"typography.intent.warning\",\n },\n \"& .Tight-medium-icon > path\": {\n stroke: \"icon.intent.warning\",\n },\n \"&:hover, &:focus-visible, &[data-state='open']\": {\n background: \"surface.intent.warning.hover\",\n borderColor: \"border.intent.warning.hover\",\n \"& .Tight-sub-label\": {\n color: \"typography.intent.warning.hover\",\n },\n \"& .Tight-medium-icon > path\": {\n stroke: \"icon.intent.warning.hover\",\n },\n },\n});\n\nconst critical = css({\n background: \"surface.intent.danger\",\n border: \"{borderWidths.sm} solid\",\n borderColor: \"border.intent.danger\",\n \"& .Tight-sub-label\": {\n color: \"typography.intent.danger\",\n },\n \"& .Tight-medium-icon > path\": {\n stroke: \"icon.intent.danger\",\n },\n \"&:hover, &:focus-visible, &[data-state='open']\": {\n background: \"surface.intent.danger.hover\",\n borderColor: \"border.intent.danger.hover\",\n \"& .Tight-sub-label\": {\n color: \"typography.intent.danger.hover\",\n },\n \"& .Tight-medium-icon > path\": {\n stroke: \"icon.intent.danger.hover\",\n },\n },\n});\n\nconst baseBadgeStylist = stylist(ValidClassName[\"badge\"], badgeCss);\nconst textStylist = stylist(null, small);\nconst transitionStylist = stylist(null, fadeBackground);\n\nconst neutralStylist = stylist(ValidClassName[\"neutral-badge\"], neutral);\nconst highlightStylist = stylist(ValidClassName[\"highlight-badge\"], highlight);\nconst successStylist = stylist(ValidClassName[\"success-badge\"], success);\nconst warningStylist = stylist(ValidClassName[\"warning-badge\"], warning);\nconst criticalStylist = stylist(ValidClassName[\"critical-badge\"], critical);\n\nfunction Badge({ type, children, onClick, popupTriggerProps }: BadgeProps) {\n let colorStylist;\n switch (type) {\n case \"critical\":\n colorStylist = criticalStylist;\n break;\n case \"warning\":\n colorStylist = warningStylist;\n break;\n case \"neutral\":\n colorStylist = neutralStylist;\n break;\n case \"success\":\n colorStylist = successStylist;\n break;\n case \"highlight\":\n colorStylist = highlightStylist;\n }\n\n const badgeStylist = mergeStylists([baseBadgeStylist, textStylist, colorStylist, transitionStylist]);\n\n return (\n <button {...badgeStylist} onClick={onClick} {...popupTriggerProps}>\n {children}\n </button>\n );\n}\n\nexport { Badge };\n\nexport type { BadgeProps };\n","import { createContext } from \"react\";\nimport { UserInfoGetDto } from \"../query/fetches/userInfo/userInfo.ts\";\n\ntype UserRole = UserInfoGetDto[\"userRole\"] | \"ACCOUNTANT\";\n\ntype UserContextValue = {\n userId: string | undefined;\n userRole: UserRole;\n userEmail: string | undefined;\n};\n\nconst defaultContextValue: UserContextValue = {\n userId: undefined,\n userRole: undefined,\n userEmail: undefined,\n};\n\nconst UserContext = createContext<UserContextValue>(defaultContextValue);\n\nexport type {\n UserRole,\n UserContextValue,\n};\n\nexport {\n UserContext,\n};\n","import { Popup } from \"../../../popup/Popup.tsx\";\nimport { PopupList } from \"../../../popup/list/PopupList.tsx\";\nimport { PopupRow } from \"../../../popup/rows/PopupRow.tsx\";\nimport { ReviewStatus } from \"../../../../entities/transaction/reviewStatus.ts\";\nimport { usePopupContext } from \"../../../popup/hooks/usePopupContext.ts\";\nimport { UserContext } from \"../../../../userContext/userContext.ts\";\nimport { useContext } from \"react\";\n\ntype DisplayedReviewStatus = {\n status: ReviewStatus;\n displayName: string;\n};\n\nconst ownerDisplayedStatuses: DisplayedReviewStatus[] = [\n { status: \"USER_REVIEW_REQUIRED\", displayName: \"Needs Review\" },\n { status: \"RECONCILED\", displayName: \"Reconciled\" },\n { status: \"ACCOUNTANT_REVIEW_REQUIRED\", displayName: \"Flag to Accountant\" },\n];\n\nconst accountantDisplayedStatuses: DisplayedReviewStatus[] = [\n { status: \"ACCOUNTANT_REVIEW_REQUIRED\", displayName: \"Needs Review\" },\n { status: \"RECONCILIATION_DISCREPANCY\", displayName: \"Discrepancy\" },\n { status: \"RECONCILED\", displayName: \"Reconciled\" },\n { status: \"USER_REVIEW_REQUIRED\", displayName: \"Flag to User\" },\n];\n\nconst getDisplayedStatuses = (userRole: string | undefined): DisplayedReviewStatus[] => {\n switch (userRole) {\n case \"OWNER\":\n return ownerDisplayedStatuses;\n case \"ACCOUNTANT\":\n return accountantDisplayedStatuses;\n default:\n return ownerDisplayedStatuses;\n }\n};\n\ntype ReviewStatusPopupProps = {\n onClick: (status: ReviewStatus) => void;\n};\n\nfunction ReviewStatusPopup({ onClick }: ReviewStatusPopupProps) {\n const parentPopupContext = usePopupContext();\n const { userRole } = useContext(UserContext);\n const displayedStatuses = getDisplayedStatuses(userRole) || [];\n\n const setStatus = (status: ReviewStatus) => {\n onClick(status);\n parentPopupContext.setOpen(false);\n };\n\n return (\n <Popup>\n <PopupList>\n {displayedStatuses.map(({ status, displayName }) => (\n <PopupRow key={status} onClick={() => setStatus(status)}>\n {displayName}\n </PopupRow>\n ))}\n </PopupList>\n </Popup>\n );\n}\n\nexport { ReviewStatusPopup };\n\nexport type {\n ReviewStatusPopupProps,\n};\n","import {\n isDiscrepancy,\n isReconciled,\n needsReview, pendingReview, pendingUserReview,\n ReviewStatus,\n} from \"../../../../entities/transaction/reviewStatus.ts\";\nimport { PopupManager } from \"../../../popup/PopupManager.tsx\";\nimport { PopupTrigger } from \"../../../popup/PopupTrigger.tsx\";\nimport { Flag } from \"../../../icon/icons/Flag.tsx\";\nimport { Attention } from \"../../../icon/icons/Attention.tsx\";\nimport { CircleCheck } from \"../../../icon/icons/CircleCheck.tsx\";\nimport { Processing } from \"../../../icon/icons/Processing.tsx\";\nimport { Badge, BadgeProps } from \"../../../inputs/Badge.tsx\";\nimport { ReactElement, useContext, useState } from \"react\";\nimport { ReviewStatusPopup } from \"./ReviewStatusPopup.tsx\";\nimport { BankTransaction } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { SubLabel } from \"../../../typography/SubLabel.tsx\";\nimport { MediumIcon } from \"../../../icon/MediumIcon.tsx\";\nimport { useSingleBankTransactionMutation } from \"../../../../query/mutations/transactions/bankTransactionMutations.ts\";\nimport { UserContext, UserRole } from \"../../../../userContext/userContext.ts\";\nimport { EntityIdPrefixMap } from \"../../../../entities/entityIdPrefixMap.ts\";\n\ntype ReviewStatusSelectorProps = {\n status: ReviewStatus;\n transactionId: BankTransaction[\"id\"];\n};\n\n// todo kill this it sucks\nfunction shouldHideReviewStatusBadge(transactionId: string) {\n return transactionId.startsWith(EntityIdPrefixMap.TRANSACTION_LINE_ITEM)\n || transactionId.startsWith(EntityIdPrefixMap.PROCESSOR_TRANSACTION);\n}\n\nconst getBadgeInfo = (status: ReviewStatus, userRole: UserRole) => {\n const reviewNeeded = needsReview(status, userRole);\n const reviewPending = pendingReview(status, userRole);\n const reviewPendingUser = pendingUserReview(status, userRole);\n const discrepancy = isDiscrepancy(status);\n const reconciled = isReconciled(status);\n\n let text: string;\n let Icon: ReactElement;\n let type: BadgeProps[\"type\"] = \"neutral\";\n\n if (reviewPending) {\n text = \"Pending Review\";\n Icon = <MediumIcon Component={Processing} />;\n type = \"neutral\";\n } else if (reviewPendingUser) {\n text = \"Pending User Review\";\n Icon = <MediumIcon Component={Processing} />;\n type = \"neutral\";\n } else if (reviewNeeded) {\n text = \"Needs Review\";\n Icon = <MediumIcon Component={Flag} />;\n type = \"warning\";\n } else if (discrepancy) {\n text = \"Discrepancy\";\n Icon = <MediumIcon Component={Attention} />;\n type = \"critical\";\n } else if (reconciled) {\n text = \"Reconciled\";\n Icon = <MediumIcon Component={CircleCheck} />;\n type = \"success\";\n } else {\n text = \"Processing\";\n Icon = <MediumIcon Component={Processing} />;\n type = \"neutral\";\n }\n\n return { text, type, Icon };\n};\n\nfunction ReviewStatusSelector({ status, transactionId }: ReviewStatusSelectorProps) {\n const [showPopup, setShowPopup] = useState(false);\n const { mutate } = useSingleBankTransactionMutation();\n\n const closePopup = () => {\n setShowPopup(false);\n };\n\n const handleListItemClick = (status: ReviewStatus) => {\n mutate({ id: transactionId, reviewStatus: status });\n closePopup();\n };\n\n const handleBadgeClick = () => {\n setShowPopup(!showPopup);\n };\n const { userRole } = useContext(UserContext);\n const { text, type, Icon } = getBadgeInfo(status, userRole);\n\n return (transactionId && !shouldHideReviewStatusBadge(transactionId)\n ? (\n\n <PopupManager open={showPopup} blockInteraction={false} onOpenChange={closePopup} enableClickMiddleware={false}>\n <PopupTrigger>\n {props => (\n <Badge type={type} popupTriggerProps={props} onClick={handleBadgeClick}>\n {Icon}\n <SubLabel>{text}</SubLabel>\n </Badge>\n )}\n </PopupTrigger>\n <ReviewStatusPopup onClick={handleListItemClick} />\n </PopupManager>\n )\n : null\n );\n}\n\nexport { ReviewStatusSelector };\n\nexport type { ReviewStatusSelectorProps };\n","import { ReviewStatus } from \"../../../entities/transaction/reviewStatus.ts\";\nimport { ReviewStatusSelector } from \"./reviewStatus/ReviewStatusSelector.tsx\";\nimport { BankTransaction } from \"../../../query/fetches/transactions/bankTransactionQueries.ts\";\n\ntype ReviewStatusCellProps = {\n status: ReviewStatus;\n transactionId: BankTransaction[\"id\"];\n};\n\nfunction ReviewStatusCell({ status, transactionId }: ReviewStatusCellProps) {\n return (\n <ReviewStatusSelector key={transactionId} status={status} transactionId={transactionId} />\n );\n}\n\nexport { ReviewStatusCell };\n","import * as React from \"react\";\nconst SvgArrowUp = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 13, height: 12, viewBox: \"0 0 13 12\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip0_9779_2940)\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M11.9147 7.99997L6.31472 2.39996L0.714716 7.99997\", stroke: \"#182428\", strokeMiterlimit: 10 })), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"clipPath\", { id: \"clip0_9779_2940\" }, /* @__PURE__ */ React.createElement(\"rect\", { width: 12, height: 12, fill: \"white\", transform: \"translate(0.314728)\" }))));\nexport default SvgArrowUp;\n","import IconComponent from \"../../../assets/icons/arrow-up.svg?react\";\nimport { createIcon } from \"../createIcon.tsx\";\n\nconst ArrowUp = createIcon(IconComponent, \"ArrowUp\");\n\nexport { ArrowUp };\n","import IconComponent from \"../../../assets/icons/arrow-down.svg?react\";\nimport { createIcon } from \"../createIcon.tsx\";\n\nconst ArrowDown = createIcon(IconComponent, \"ArrowDown\");\n\nexport { ArrowDown };\n","import * as React from \"react\";\nconst SvgArrowDown = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 13, height: 12, viewBox: \"0 0 13 12\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip0_9779_2922)\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M0.714706 3.99996L6.31472 9.59998L11.9147 3.99996\", stroke: \"#182428\", strokeMiterlimit: 10 })), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"clipPath\", { id: \"clip0_9779_2922\" }, /* @__PURE__ */ React.createElement(\"rect\", { width: 12, height: 12, fill: \"white\", transform: \"translate(0.314728)\" }))));\nexport default SvgArrowDown;\n","import { Row } from \"@tanstack/react-table\";\nimport { ArrowUp } from \"../../icon/icons/ArrowUp.tsx\";\nimport { ArrowDown } from \"../../icon/icons/ArrowDown.tsx\";\nimport { SmallIcon } from \"../../icon/SmallIcon.tsx\";\nimport { ArrowRight } from \"../../icon/icons/ArrowRight.tsx\";\nimport { ButtonDiscreteSmall } from \"../../inputs/ButtonDiscreteSmall.tsx\";\n\ntype ExpanderCellProps<TData> = {\n row: Row<TData>;\n};\n\nfunction ExpanderCell<TData>({ row }: ExpanderCellProps<TData>) {\n const isExpanded = row.getIsExpanded();\n if (row.getCanExpand()) {\n return (\n <ButtonDiscreteSmall\n aria-label={isExpanded ? \"Collapse row\" : \"Expand row\"}\n aria-expanded={isExpanded}\n >\n <SmallIcon Component={isExpanded ? ArrowUp : ArrowDown} />\n </ButtonDiscreteSmall>\n );\n } else {\n return (\n <ButtonDiscreteSmall\n active={false}\n >\n <SmallIcon Component={ArrowRight} />\n </ButtonDiscreteSmall>\n );\n }\n}\n\nexport {\n ExpanderCell,\n};\n\nexport type {\n ExpanderCellProps,\n};\n","import { ExpanderCell } from \"../../../dashboards/cells/ExpanderCell.tsx\";\nimport { BankTransaction } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { Row } from \"@tanstack/react-table\";\n\ntype TransactionExpanderCellProps = {\n row: Row<BankTransaction>;\n};\n\nfunction TransactionExpanderCell({ row }: TransactionExpanderCellProps) {\n return <ExpanderCell<BankTransaction> row={row} />;\n}\n\nexport { TransactionExpanderCell };\n","import * as React from \"react\";\nconst SvgMinus = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 16, viewBox: \"0 0 16 16\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M0.495239 8.15601H14.7767\", strokeMiterlimit: 10 }));\nexport default SvgMinus;\n","import IconComponent from \"../../../assets/icons/minus.svg?react\";\nimport { createIcon } from \"../createIcon.tsx\";\n\nconst Dash = createIcon(IconComponent, \"Dash\");\n\nexport { Dash };\n","import { Comment } from \"../../icon/icons/Comment.tsx\";\nimport { LargeIcon } from \"../../icon/LargeIcon.tsx\";\nimport { Dash } from \"../../icon/icons/Dash.tsx\";\nimport { TinyIcon } from \"../../icon/TinyIcon.tsx\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { css } from \"../../../../styled-system/css\";\n\ntype CommentCellProps = {\n hasConversation: boolean;\n hasRead?: boolean;\n};\n\nconst commentIconBadgeStylist = stylist(null, css({\n position: \"absolute\",\n top: \"-1\",\n right: \"-1\",\n width: \"10\",\n height: \"10\",\n borderRadius: \"999px\",\n backgroundColor: \"surface.intent.warning\",\n boxShadow: \"0 0 0 1px {colors.border.intent.warning}\",\n}));\n\nconst commentStylist = stylist(null, css({\n position: \"relative\",\n display: \"inline-block\",\n}));\n\nconst commentIconStylist = stylist(null, css({\n stroke: \"icon.base\",\n}));\n\nconst dashIconStylist = stylist(null, css({\n stroke: \"icon.base.weak\",\n}));\n\nfunction CommentCell({ hasConversation, hasRead = false }: CommentCellProps) {\n return (\n <>\n {hasConversation\n ? (\n <div {...commentStylist}>\n <LargeIcon Component={Comment} stylists={[commentIconStylist]} />\n {!hasRead && (\n // div below is used to create a small badge that appears over the comment icon\n <div\n data-testid=\"unread-comment-badge\"\n {...commentIconBadgeStylist}\n aria-hidden=\"true\"\n >\n </div>\n )}\n </div>\n )\n : (\n <div data-testid=\"no-conversations-dash\">\n <TinyIcon Component={Dash} stylists={[dashIconStylist]} />\n </div>\n )}\n </>\n );\n}\n\nexport { CommentCell };\n","import { CommentCell } from \"../CommentCell.tsx\";\nimport { ConversationGetDto, useSingleConversation, useConversationPrefetch } from \"../../../../query/fetches/conversations/conversations.ts\";\nimport { isNotNullish } from \"../../../../utils/typeUtils.ts\";\nimport { useMessagesPrefetch } from \"../../../../query/fetches/conversations/messages.ts\";\nimport { useCallback } from \"react\";\n\ntype TransactionCommentCellProps = {\n conversationId?: ConversationGetDto[\"id\"];\n};\n\nfunction TransactionCommentCell({ conversationId }: TransactionCommentCellProps) {\n const { query: { data: conversationRes } } = useSingleConversation(conversationId ?? null);\n const { startPrefetch: conversationStartPrefetch, cancelPrefetch: conversationCancelPrefetch } = useConversationPrefetch();\n const { startPrefetch: messagesStartPrefetch, cancelPrefetch: messagesCancelPrefetch } = useMessagesPrefetch();\n\n const hasConversation = isNotNullish(conversationRes);\n const hasRead = hasConversation && conversationRes?.readStatus == \"READ\";\n\n const onMouseEnter = useCallback(() => {\n if (isNotNullish(conversationId)) {\n conversationStartPrefetch({ id: conversationId });\n messagesStartPrefetch({ id: conversationId });\n }\n }, [conversationId, conversationStartPrefetch, messagesStartPrefetch]);\n\n const onMouseLeave = useCallback(() => {\n if (isNotNullish(conversationId)) {\n conversationCancelPrefetch();\n messagesCancelPrefetch();\n }\n }, [conversationId, conversationCancelPrefetch, messagesCancelPrefetch]);\n\n return (\n <div onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}>\n <CommentCell hasConversation={hasConversation} hasRead={hasRead} />\n </div>\n );\n}\n\nexport { TransactionCommentCell };\n","import { createColumnHelper } from \"@tanstack/react-table\";\nimport { BankTransaction } from \"../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { CheckboxCell } from \"../../dashboards/cells/CheckboxCell.tsx\";\nimport { TransactionDateCell } from \"./cells/TransactionDateCell.tsx\";\nimport { TransactionSourceCell } from \"./cells/TransactionSourceCell.tsx\";\nimport { AmountCell } from \"../../dashboards/cells/AmountCell.tsx\";\nimport { CategoryCell } from \"../../dashboards/cells/category/CategoryCell.tsx\";\nimport { ClassSegmentCell } from \"../../dashboards/cells/ClassSegmentCell.tsx\";\nimport { ReviewStatusCell } from \"../../dashboards/cells/ReviewStatusCell.tsx\";\nimport { ColumnSorterLayout } from \"../columnHeaders/columnSort/ColumnSorterLayout.tsx\";\nimport { TableCellLayout } from \"../cells/TableCellLayout.tsx\";\nimport { transactionSortDefs } from \"./hooks/useTransactionSort.ts\";\nimport { TransactionExpanderCell } from \"./cells/TransactionExpanderCell.tsx\";\nimport { TransactionsTableColumn, TRANSACTIONS_TABLE_COLS } from \"./config/transactionsTableConfig.ts\";\nimport { TransactionCommentCell } from \"../../dashboards/cells/conversations/TransactionCommentCell.tsx\";\n\nconst columnHelper = createColumnHelper<BankTransaction>();\n\nconst transactionsTableColumns = [\n columnHelper.display({\n id: TRANSACTIONS_TABLE_COLS.SELECT,\n header: () => null,\n cell: ({ row }) => {\n if (row.getParentRow() === undefined) {\n return <CheckboxCell key={row.original.id} checked={row.getIsSelected()} onClick={row.getToggleSelectedHandler()} />;\n }\n return null;\n },\n maxSize: 35,\n meta: {\n clickable: true,\n },\n }),\n columnHelper.accessor(\"date\", {\n id: TRANSACTIONS_TABLE_COLS.DATE,\n cell: info => (\n <TableCellLayout>\n <TransactionDateCell transaction={info.row.original} />\n </TableCellLayout>\n ),\n header: () => <ColumnSorterLayout columnName=\"Date\" sortDef=\"DATE\" sortAscDisplay={transactionSortDefs.DATE.ASC} sortDescDisplay={transactionSortDefs.DATE.DESC} />,\n size: 130,\n maxSize: 144,\n }),\n columnHelper.accessor(\"description\", {\n id: TRANSACTIONS_TABLE_COLS.DESCRIPTION,\n cell: info => (\n <TableCellLayout>\n <TransactionSourceCell bankTransaction={info.row.original} />\n </TableCellLayout>\n ),\n header: () => <ColumnSorterLayout columnName=\"Source\" sortDef=\"DESCRIPTION\" sortAscDisplay={transactionSortDefs.DESCRIPTION.ASC} sortDescDisplay={transactionSortDefs.DESCRIPTION.DESC} />,\n size: 180,\n }),\n columnHelper.accessor(\"amount\", {\n id: TRANSACTIONS_TABLE_COLS.AMOUNT,\n cell: info => (\n <TableCellLayout>\n <AmountCell transaction={info.row.original} />\n </TableCellLayout>\n ),\n header: () => <ColumnSorterLayout columnName=\"Amount\" sortDef=\"AMOUNT\" sortAscDisplay={transactionSortDefs.AMOUNT.ASC} sortDescDisplay={transactionSortDefs.AMOUNT.DESC} />,\n size: 130,\n maxSize: 180,\n }),\n columnHelper.accessor(\"category.id\", {\n id: TRANSACTIONS_TABLE_COLS.CATEGORY,\n cell: info => <CategoryCell transaction={info.row.original} />,\n header: () => <ColumnSorterLayout columnName=\"Category\" />,\n size: 130,\n meta: {\n clickable: true,\n },\n }),\n columnHelper.accessor(row => row.classSegments[0]?.id, {\n id: TRANSACTIONS_TABLE_COLS.CLASS_SEGMENT,\n cell: info => (\n <TableCellLayout>\n <ClassSegmentCell name={info.row.original.classSegments[0]?.name} />\n </TableCellLayout>\n ),\n header: () => <ColumnSorterLayout columnName=\"Business\" />,\n size: 130,\n }),\n columnHelper.accessor(\"reviewStatus\", {\n id: TRANSACTIONS_TABLE_COLS.REVIEW_STATUS,\n cell: info => (\n <TableCellLayout>\n <ReviewStatusCell status={info.getValue()} transactionId={info.row.original.id} />\n </TableCellLayout>\n ),\n header: () => <ColumnSorterLayout columnName=\"Reviewed\" sortDef=\"REVIEW_STATUS\" sortAscDisplay={transactionSortDefs.REVIEW_STATUS.ASC} sortDescDisplay={transactionSortDefs.REVIEW_STATUS.DESC} />,\n size: 130,\n maxSize: 160,\n meta: {\n clickable: true,\n },\n }),\n columnHelper.display({\n id: TRANSACTIONS_TABLE_COLS.COMMENTS,\n cell: (info) => {\n const transaction = info.row.original;\n return (\n <TableCellLayout alignVariant=\"center\">\n <TransactionCommentCell conversationId={transaction.conversation?.id} />\n </TableCellLayout>\n );\n },\n header: () => <ColumnSorterLayout columnName=\"Comments\" />,\n size: 110,\n maxSize: 110,\n meta: {\n clickable: true,\n },\n }),\n columnHelper.display({\n id: TRANSACTIONS_TABLE_COLS.EXPAND,\n cell: info => <TransactionExpanderCell row={info.row} />,\n size: 40,\n maxSize: 60,\n }),\n];\n\n/**\n * Given an array of column IDs, return the corresponding table columns\n * @param columns array of column IDs that should be included in the output\n */\nfunction getColumns(columns?: TransactionsTableColumn[]) {\n if (!columns) {\n return transactionsTableColumns;\n }\n return transactionsTableColumns.filter(column => columns.includes(column.id as TransactionsTableColumn));\n}\n\n/**\n * Given an array of column ids, return a mapping over all columns where the provided columns are visible and non provided columns are not\n * @param columns\n */\nfunction getColumnVisibility(columns: TransactionsTableColumn[] | undefined) {\n if (!columns) {\n return undefined;\n }\n\n return Object.values(TRANSACTIONS_TABLE_COLS).reduce((acc, id) => {\n acc[id] = columns.includes(id);\n return acc;\n }, {} as Record<TransactionsTableColumn, boolean>);\n}\n\nexport {\n getColumns,\n getColumnVisibility,\n};\n","import {\n TRANSACTIONS_TABLE_COLS,\n TransactionsTableColumn,\n TransactionsTableColumnOption,\n} from \"../config/transactionsTableConfig.ts\";\nimport { getCoreRowModel, getExpandedRowModel, Table, useReactTable } from \"@tanstack/react-table\";\nimport { BankTransaction } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { getColumns, getColumnVisibility } from \"../TransactionTableColumns.tsx\";\nimport { convertChildToBankTransaction } from \"../../../../utils/transactions/transactionUtils.ts\";\nimport { useRowReselection } from \"../../hooks/useRowReselection.ts\";\n\ntype UseTransactionsTableProps = Omit<UseTransactionsTableBaseProps, \"columns\"> &\n {\n columns?: TransactionsTableColumnOption[];\n };\n\n/**\n * Creates a tanstack table of {@link BankTransaction}.\n * If columns are passed as an argument, will create a table with column order select, ...cols, expand\n * If columns are not passed as an argument, will create a table with default columns in default order\n */\nfunction useSelectableTransactionsTable({ transactions, columns }: UseTransactionsTableProps) {\n const enhancedCols = columns ? [TRANSACTIONS_TABLE_COLS.SELECT, ...columns, TRANSACTIONS_TABLE_COLS.EXPAND] : undefined;\n const table = useTransactionsTable({ transactions, columns: enhancedCols });\n useRowReselection(transactions, table);\n return table;\n}\n\n/**\n * Creates a tanstack table of {@link BankTransaction}.\n * If columns are passed as an argument, will create a table with column order: ...cols, expand\n * If columns are not passed as an argument, will create a table with default columns (except select) in default order\n */\nfunction useUnselectableTransactionsTable({ transactions, columns }: UseTransactionsTableProps) {\n const enhancedCols = columns ? [...columns, TRANSACTIONS_TABLE_COLS.EXPAND] : undefined;\n return useTransactionsTable({ transactions, columns: enhancedCols });\n}\n\ntype UseTransactionsTableBaseProps = {\n transactions: BankTransaction[] | undefined;\n columns?: TransactionsTableColumn[];\n};\n\n/* Stable reference to placeholder data. Unstable reference causes infinite renders.\n * https://tanstack.com/table/v8/docs/faq#how-do-i-stop-infinite-rendering-loops\n */\nconst PLACEHOLDER_DATA: BankTransaction[] = []; // NEVER EDIT THIS! THIS SHOULD REMAIN AN EMPTY ARRAY ALWAYS\n\n/**\n * Generates a table setup using a customizable configuration for displaying and interacting with a list of bank transactions.\n * Will automatically preserve selection state if table data changes\n *\n * Compose as needed\n *\n * @param {Object} params - The input parameters for configuring the transactions table.\n * @param {BankTransaction[]} params.transactions - The list of transactions to be displayed in the table. If not provided, placeholder data will be used.\n * @param {TransactionsTableColumn[]} params.columns - The list of column identifiers to be included in the table. Determines the visible columns and their order.\n *\n * @return {Table<BankTransaction>} Tanstack table instance configured for our uses\n */\nfunction useTransactionsTable({ transactions, columns }: UseTransactionsTableBaseProps): Table<BankTransaction> {\n return useReactTable<BankTransaction>({\n data: transactions ?? PLACEHOLDER_DATA,\n manualPagination: true,\n manualSorting: true,\n manualFiltering: true,\n manualGrouping: true,\n rowCount: transactions?.length ?? PLACEHOLDER_DATA.length,\n columns: getColumns(columns),\n getCoreRowModel: getCoreRowModel(),\n getRowCanExpand: row => row.original.children.length > 0,\n getSubRows: originalRow => originalRow.children.map(child => convertChildToBankTransaction(child, originalRow.id, originalRow.children)), // subrows expect same data shape as parent\n getExpandedRowModel: getExpandedRowModel(),\n paginateExpandedRows: false,\n getRowId: row => row.id,\n state: {\n columnOrder: columns,\n columnVisibility: getColumnVisibility(columns),\n },\n });\n}\n\nexport { useSelectableTransactionsTable, useUnselectableTransactionsTable };\nexport type { UseTransactionsTableProps };\n","import {\n UseTransactionsTableProps,\n useUnselectableTransactionsTable,\n} from \"../../../tables/transactionsTable/hooks/useTransactionsTable.ts\";\nimport {\n TRANSACTIONS_TABLE_COLS,\n TransactionsTableColumnOption,\n} from \"../../../tables/transactionsTable/config/transactionsTableConfig.ts\";\n\nconst columns: TransactionsTableColumnOption[] = [\n TRANSACTIONS_TABLE_COLS.COMMENTS,\n TRANSACTIONS_TABLE_COLS.DATE,\n TRANSACTIONS_TABLE_COLS.DESCRIPTION,\n TRANSACTIONS_TABLE_COLS.AMOUNT,\n TRANSACTIONS_TABLE_COLS.CATEGORY,\n TRANSACTIONS_TABLE_COLS.REVIEW_STATUS,\n];\n\nfunction useBusinessOwnerDashTransactionsTable({ transactions }: UseTransactionsTableProps) {\n return useUnselectableTransactionsTable({ transactions, columns });\n}\n\nexport { useBusinessOwnerDashTransactionsTable };\n","import { TableRow } from \"../TableRow.tsx\";\nimport { Cell, Row } from \"@tanstack/react-table\";\nimport { openDrawer } from \"../../drawer/drawer.ts\";\nimport {\n BankTransaction,\n useBankTransactionPrefetch,\n} from \"../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { useCallback } from \"react\";\nimport { FormTab } from \"../../dashboards/forms/BankTransactionForm.tsx\";\n\ntype TransactionsTableRowProps = {\n rowData: Row<BankTransaction>;\n hasSelect?: boolean;\n};\n\nfunction openTransactionForm(transactionToEditId: string, initialTab?: FormTab) {\n return openDrawer(\n \"BankTransactionFormRouter\",\n { routeProps: { transactionId: transactionToEditId, initialTab } },\n );\n}\n\nfunction onCellClickHandler(cell: Cell<BankTransaction, unknown>) {\n const row = cell.row;\n const clickable = cell.column.columnDef.meta?.clickable;\n const hasChildren = row.getCanExpand();\n const isBankTransfer = row.original.type === \"BANK_TRANSFER\";\n const isStaticCategoryCell = cell.column.id === \"category\" && (hasChildren || isBankTransfer);\n const isCommentsCell = cell.column.id === \"comments\";\n\n if (isCommentsCell) {\n const parentRow = row.getParentRow();\n openTransactionForm(parentRow?.original.id ?? row.original.id, \"conversation\");\n } else if (!clickable || isStaticCategoryCell) {\n if (hasChildren) {\n row.toggleExpanded();\n } else {\n const parentRow = row.getParentRow();\n openTransactionForm(parentRow?.original.id ?? row.original.id);\n }\n }\n}\n\nfunction shouldDisplayDivider(index: number, hasSelect: boolean, totalVisibleCells: number): boolean {\n const isNotFirstCell = index !== 0;\n const isNotSelectCell = !hasSelect || index !== 1; // divider for between checkbox and date columns on transaction dash\n const isNotLastCell = index !== totalVisibleCells - 1;\n const isNotSecondCell = !hasSelect && index !== 1;\n\n return isNotFirstCell && isNotSelectCell && isNotLastCell && isNotSecondCell;\n}\n\nfunction TransactionsTableRow({ rowData, hasSelect = true }: TransactionsTableRowProps) {\n const { startPrefetch, cancelPrefetch } = useBankTransactionPrefetch();\n\n const onMouseEnter = useCallback(() => {\n return startPrefetch({ id: rowData.original.id });\n }, [startPrefetch, rowData.original]);\n return (\n <TableRow<BankTransaction>\n rowData={rowData}\n onMouseEnter={onMouseEnter}\n onMouseLeave={cancelPrefetch}\n onCellClick={onCellClickHandler}\n shouldDisplayDivider={index => shouldDisplayDivider(index, hasSelect, rowData.getVisibleCells().length)}\n />\n );\n}\n\nexport { TransactionsTableRow };\n","import { LargeIcon } from \"../../../icon/LargeIcon.tsx\";\nimport { StrongLabel } from \"../../../typography/StrongLabel.tsx\";\nimport { SubLabel } from \"../../../typography/SubLabel.tsx\";\nimport { CircleCheck } from \"../../../icon/icons/CircleCheck.tsx\";\n\nconst allCaughtUpStrongText = \"All caught up\";\nconst allCaughtUpWeakText = \"We'll let you know if something comes up.\";\nfunction TransactionsAllCaughtUpZeroState() {\n return (\n <>\n <LargeIcon Component={CircleCheck} />\n <StrongLabel>{allCaughtUpStrongText}</StrongLabel>\n <SubLabel>{allCaughtUpWeakText}</SubLabel>\n </>\n );\n}\n\nexport { TransactionsAllCaughtUpZeroState };\n","import { ButtonWarning } from \"../inputs/ButtonWarning.tsx\";\nimport { usePlaidSdk } from \"./hooks/usePlaidSdk.ts\";\nimport { StrongLabel } from \"../typography/StrongLabel.tsx\";\n\nfunction PlaidLinkButton() {\n const { linkPlaid } = usePlaidSdk();\n\n return (\n <ButtonWarning onClick={linkPlaid}>\n <StrongLabel>Link your bank</StrongLabel>\n </ButtonWarning>\n );\n}\n\nexport {\n PlaidLinkButton,\n};\n","import { LargeIcon } from \"../../../icon/LargeIcon.tsx\";\nimport { Bank } from \"../../../icon/icons/category/Bank.tsx\";\nimport { StrongLabel } from \"../../../typography/StrongLabel.tsx\";\nimport { SubLabel } from \"../../../typography/SubLabel.tsx\";\nimport { PlaidLinkButton } from \"../../../plaid/PlaidLinkButton.tsx\";\n\nconst noBankAccountsText = \"Your bank transactions will be categorized for you\";\nconst noBankAccountSubText = \"If any require your review, they'll be flagged here.\";\nfunction NoBankAccountsZeroState() {\n return (\n <>\n <LargeIcon Component={Bank} />\n <StrongLabel>{noBankAccountsText}</StrongLabel>\n <SubLabel>{noBankAccountSubText}</SubLabel>\n <PlaidLinkButton />\n </>\n );\n}\n\nexport { NoBankAccountsZeroState };\n","import { TableLayout } from \"../../../tables/TableLayout.tsx\";\nimport { QuerySortParams, SortingContext } from \"../../../tables/tableSortContext.tsx\";\nimport { BankTransaction } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { isNullish } from \"../../../../utils/typeUtils.ts\";\nimport { PlaceholderTable } from \"../../loading/PlaceholderTable.tsx\";\nimport { useBusinessOwnerDashTransactionsTable } from \"../hooks/useBusinessOwnerDashTransactionsTable.ts\";\nimport { DashHeaderLayout } from \"../DashHeaderLayout.tsx\";\nimport { TablePagination } from \"../../../tables/TablePagination.tsx\";\nimport { PaginationContext } from \"../../pagination/paginationContext.ts\";\nimport { TableBody } from \"../../../tables/TableBody.tsx\";\nimport { TransactionsTableRow } from \"../../../tables/transactionsTable/TransactionsTableRow.tsx\";\nimport { TableHeader } from \"../../../tables/TableHeader.tsx\";\nimport { ReactNode } from \"react\";\nimport { PaginationControls } from \"../../../../query/fetches/utils/usePaginatedEntity.ts\";\nimport { ZeroStateLayout } from \"../../../zero-states/ZeroStateLayout.tsx\";\nimport { stylist } from \"../../../../style/stylist.ts\";\nimport { css } from \"../../../../../styled-system/css\";\nimport { TransactionsAllCaughtUpZeroState } from \"../zero-states/TransactionsAllCaughtUpZeroState.tsx\";\nimport { Heading } from \"../../../typography/Heading.tsx\";\nimport { NoBankAccountsZeroState } from \"../../../tables/transactionsTable/zero-states/NoBankAccountsZeroState.tsx\";\nimport { TRANSACTIONS_SECTION } from \"../config/businessOwnerDashConfig.ts\";\n\nconst businessOwnerTransactionTableSectionLayout = stylist(null, css({\n minWidth: \"900px\",\n}));\n\ntype BusinessOwnerTransactionTableSectionProps = {\n sortInstance: QuerySortParams;\n setSortInstance: (sort: QuerySortParams) => void;\n isFilling: boolean;\n paginationControls: PaginationControls;\n transactions: BankTransaction[];\n hasLinkedAccount: boolean;\n};\n\nfunction getZeroState(hasSomeLinkedBankAccount: boolean, allTransactionsReviewed: boolean) {\n let ZeroState: ReactNode = undefined;\n if (!hasSomeLinkedBankAccount) {\n ZeroState = <NoBankAccountsZeroState />;\n } else if (allTransactionsReviewed) {\n ZeroState = <TransactionsAllCaughtUpZeroState />;\n }\n\n return ZeroState;\n}\n\nfunction BusinessOwnerTransactionTableSection({ hasLinkedAccount, sortInstance, setSortInstance, isFilling, paginationControls, transactions }: BusinessOwnerTransactionTableSectionProps) {\n const table = useBusinessOwnerDashTransactionsTable({ transactions });\n\n const hasTransactions = transactions.length > 0;\n const ZeroState = getZeroState(hasLinkedAccount ?? false, !hasTransactions);\n\n return (\n <div {...businessOwnerTransactionTableSectionLayout}>\n <div id={TRANSACTIONS_SECTION}>{/* dummy div, for auto-scrolling */}</div>\n <PaginationContext.Provider value={paginationControls}>\n <DashHeaderLayout>\n <Heading>Transactions For Your Review</Heading>\n <TablePagination />\n </DashHeaderLayout>\n <TableLayout dashboard=\"businessOwnerDashboard\">\n {isFilling\n ? <PlaceholderTable />\n : (\n <>\n <SortingContext.Provider value={{ sortInstance, setSortInstance }}>\n <TableHeader headerGroups={table.getHeaderGroups()} />\n </SortingContext.Provider>\n {!isNullish(ZeroState)\n ? (\n <ZeroStateLayout>\n {ZeroState}\n </ZeroStateLayout>\n )\n : (\n <TableBody>\n {table.getRowModel().rows.map(row => (\n <TransactionsTableRow\n key={row.id}\n rowData={row}\n hasSelect={false}\n />\n ))}\n </TableBody>\n )}\n </>\n )}\n </TableLayout>\n </PaginationContext.Provider>\n </div>\n );\n}\n\nexport {\n BusinessOwnerTransactionTableSection,\n};\n\nexport type {\n BusinessOwnerTransactionTableSectionProps,\n};\n","import { useHasPlaidLinkedBankAccount } from \"../../../../query/fetches/banks/bankAccounts.ts\";\nimport { useBankTransactions } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { useTransactionSort } from \"../../../tables/transactionsTable/hooks/useTransactionSort.ts\";\nimport { bankTransactionsFilter, limit, PLACEHOLDER_TRANSACTIONS } from \"../config/businessOwnerDashConfig.ts\";\nimport { BusinessOwnerTransactionTableSection } from \"./BusinessOwnerTransactionTableSection.tsx\";\n\nfunction BusinessOwnerTransactionsData() {\n const { sortInstance, setSortInstance, apiSort: transactionApiSort } = useTransactionSort();\n const { query: { data: transactionRes }, isFilling: transactionIsFilling, paginationControls } = useBankTransactions({ filter: bankTransactionsFilter, sort: transactionApiSort, limit });\n const transactions = transactionRes?.data ?? PLACEHOLDER_TRANSACTIONS;\n\n const { query: { data: hasLinkedAccount }, isFilling: isBankAccountsFilling } = useHasPlaidLinkedBankAccount();\n\n const isFilling = transactionIsFilling || isBankAccountsFilling;\n\n return (\n <BusinessOwnerTransactionTableSection\n sortInstance={sortInstance}\n setSortInstance={setSortInstance}\n isFilling={isFilling}\n paginationControls={paginationControls}\n transactions={transactions}\n hasLinkedAccount={hasLinkedAccount ?? false}\n />\n );\n}\n\nexport { BusinessOwnerTransactionsData };\n","import { DashHeaderLayout } from \"./DashHeaderLayout.tsx\";\nimport { Heading } from \"../../typography/Heading.tsx\";\nimport { ExpandedPLTile } from \"../../tiles/ExpandedProfitAndLoss/ExpandedPLTile.tsx\";\nimport { TaskBannerLayout } from \"../../banners/TaskBannerLayout.tsx\";\nimport {\n conversationFilter,\n limit,\n PLACEHOLDER_CONVERSATIONS,\n taskTypeToSectionMap,\n} from \"./config/businessOwnerDashConfig.ts\";\nimport { createPeriod, getTrailingTwelveMonths, isPeriodAfter, Period } from \"../../../utils/date/date.ts\";\nimport { Banner } from \"../../banners/Banner.tsx\";\nimport { TaskDTOWithMeta, TaskType, useTasks } from \"../../../query/fetches/tasks/tasks.ts\";\nimport { BusinessOwnerConversationsTableSection } from \"./BusinessOwnerConversationsTableSection.tsx\";\nimport { useConversations } from \"../../../query/fetches/conversations/conversations.ts\";\nimport { useSingleMonthlySummary } from \"../../../query/fetches/summary/financialSummary.ts\";\nimport { FinancialSummaryLayout } from \"./summary/FinancialSummaryLayout.tsx\";\nimport { useControlledState } from \"../../../utils/hooks/controlled/useControlledState.ts\";\nimport { getBankErrorMockTask, LINK_BANK_MOCK_TASK } from \"../../../entities/task/tasks.ts\";\nimport { PlaidLinkBanner } from \"../../plaid/PlaidLinkBanner.tsx\";\nimport { usePlaidItemsWithErrors } from \"../../../query/fetches/plaidItems/plaidItems.ts\";\nimport { useHasPlaidLinkedBankAccount } from \"../../../query/fetches/banks/bankAccounts.ts\";\nimport { useConversationSort } from \"../../tables/conversationsTable/hooks/useConversationSort.ts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\nimport { BusinessOwnerMonthlyReviewSection } from \"../../tiles/BusinessOwnerMonthlyReviewSection.tsx\";\nimport { BannerShimmer } from \"../../banners/BannerShimmer.tsx\";\nimport { BusinessOwnerTransactionsData } from \"./transactions/BusinessOwnerTransactionsData.tsx\";\nimport {\n QueryBankTransactionsFilters,\n useBankTransactions,\n} from \"../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { useMemo } from \"react\";\n\nconst dashboardCSS = stylist(ValidClassName[\"business-owner-dashboard\"], css({\n gap: 10,\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n maxWidth: 1440,\n}));\nconst dashboardWrapperCSS = stylist(null, css({\n display: \"flex\",\n width: \"100%\",\n justifyContent: \"center\",\n}));\n\nconst sampleText = \"In April 2025, your total income increased significantly to $7,500, up from $5,000 the previous month, reflecting strong revenue growth. However, expenses also rose slightly to $2,677.99, compared to $2,400 last month, which slightly narrowed your net profit margin despite a healthy $4,822.01 net profit. \\n\"\n + \"\\n\"\n + \"A key area for improvement is transaction categorization; with one transaction remaining uncategorized and only two user-categorized, enhancing categorization accuracy will improve financial tracking and insights. To maintain positive momentum, consider reviewing variable expenses to identify any controllable cost increases.\\n\"\n + \"\\n\"\n + \"Going forward, continue focusing on revenue growth while keeping a close eye on expense management, and aim to fully categorize all transactions to gain more precise financial visibility. \";\n\nconst noSummaryForThisMonthText = \"A summary of this month's financials will appear here once more data is available.\";\n\nconst handleScrollAction = (taskType: TaskType) => {\n const sectionId = taskTypeToSectionMap[taskType];\n const section = document.getElementById(sectionId);\n if (section) {\n section.scrollIntoView({ behavior: \"smooth\" });\n }\n};\n\nconst hasSingleTransctionFilter: QueryBankTransactionsFilters = {\n status: {\n operator: \"IN\",\n values: [\"ACTIVE\", \"INACTIVE\"],\n },\n};\n\n// TODO: have this pass a select to useBankTransactions, which does not accept at time of writing\nfunction useHasSingleTransaction() {\n const { query: { data } } = useBankTransactions({ filter: hasSingleTransctionFilter, limit: 1 });\n return (data?.data?.length ?? 0) > 0;\n}\n\ntype BusinessOwnerDashboardProps = {\n period?: Period;\n onChangePeriod?: (period: Period) => void;\n};\n\nfunction BusinessOwnerDashboardInternal({ period: controlledPeriod, onChangePeriod }: BusinessOwnerDashboardProps) {\n const { sortInstance: conversationSortInstance, setSortInstance: setConversationSortInstance, apiSort: conversationApiSort } = useConversationSort();\n const { query: { data: conversationRes }, isFilling: conversationIsFilling, paginationControls: conversationPaginationControls } = useConversations({ limit, sort: conversationApiSort, filter: conversationFilter });\n const conversations = conversationRes?.data ?? PLACEHOLDER_CONVERSATIONS;\n\n const { query: { data: taskData }, isFilling: isTasksFilling } = useTasks();\n const { query: { data: hasPlaidLinkedBank } } = useHasPlaidLinkedBankAccount();\n const { query: { data: plaidItemsWithErrors } } = usePlaidItemsWithErrors();\n\n const taskBanners: TaskDTOWithMeta[] = useMemo(() => {\n let plaidErrorBanners: TaskDTOWithMeta[] = [];\n if (plaidItemsWithErrors) {\n plaidErrorBanners = plaidItemsWithErrors.map((item) => {\n return getBankErrorMockTask(item.apiInstitutionName, item.id);\n });\n }\n\n let plaidLinkBanners: TaskDTOWithMeta[] = [];\n if (!hasPlaidLinkedBank) {\n plaidLinkBanners = [LINK_BANK_MOCK_TASK];\n }\n\n const tasks: TaskDTOWithMeta[] = taskData ?? [];\n\n return [...plaidErrorBanners, ...plaidLinkBanners, ...tasks];\n }, [taskData, hasPlaidLinkedBank, plaidItemsWithErrors]);\n\n const hasTransactions = useHasSingleTransaction();\n\n const showSamples = hasPlaidLinkedBank === false && !hasTransactions;\n\n const todayDate = new Date();\n const todayPeriod = createPeriod(todayDate.getMonth(), todayDate.getFullYear());\n const [period, setPeriod] = useControlledState(todayPeriod, controlledPeriod, onChangePeriod);\n\n const yearRange = getTrailingTwelveMonths(period.month, period.year);\n\n const handleDateChange = (newPeriod: Period) => {\n if (!isPeriodAfter(todayPeriod, newPeriod)) {\n setPeriod(newPeriod);\n }\n };\n\n const { query: { data: summaryText }, isFilling } = useSingleMonthlySummary(period);\n\n const financialSummaryText = showSamples && !hasTransactions ? sampleText : (summaryText ?? noSummaryForThisMonthText);\n\n return (\n <div {...dashboardWrapperCSS}>\n <div {...dashboardCSS}>\n <DashHeaderLayout>\n <Heading>Action Items</Heading>\n </DashHeaderLayout>\n <TaskBannerLayout>\n {isTasksFilling\n ? (<BannerShimmer />)\n : taskBanners.map((task) => {\n return task.type === \"LINK_BANK\" || task.type === \"BANK_ERROR\"\n ? <PlaidLinkBanner key={task.id} task={task} />\n : (\n <Banner\n key={task.id}\n task={task}\n handleClick={() => handleScrollAction(task.type)}\n />\n );\n })}\n </TaskBannerLayout>\n\n <BusinessOwnerMonthlyReviewSection period={period} handleDateChange={handleDateChange} todayPeriod={todayPeriod} showSamples={showSamples} />\n\n <DashHeaderLayout>\n <Heading>Financial Summary</Heading>\n </DashHeaderLayout>\n <FinancialSummaryLayout isSample={showSamples} isFilling={isFilling}>\n {financialSummaryText}\n </FinancialSummaryLayout>\n <ExpandedPLTile filter={yearRange} />\n\n <BusinessOwnerConversationsTableSection sortInstance={conversationSortInstance} setSortInstance={setConversationSortInstance} conversations={conversations} paginationControls={conversationPaginationControls} isFilling={conversationIsFilling} />\n\n <BusinessOwnerTransactionsData />\n </div>\n </div>\n );\n}\n\nexport { BusinessOwnerDashboardInternal };\n","import { BusinessOwnerDashboardInternal } from \"./BusinessOwnerDashboardInternal.tsx\";\nimport { publicClassName } from \"../../../style/stylist.ts\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\nimport { Period } from \"../../../utils/date/date.ts\";\n\ntype BusinessOwnerDashboardProps = {\n period?: Period;\n onChangePeriod?: (period: Period) => void;\n};\n\nfunction BusinessOwnerDashboardComponent(props: BusinessOwnerDashboardProps) {\n return (\n <div className={publicClassName(ValidClassName.component)}>\n <BusinessOwnerDashboardInternal {...props} />\n </div>\n );\n}\n\nexport default BusinessOwnerDashboardComponent;\n","import { DBSchema, openDB } from \"idb\";\nimport { PersistedClient } from \"@tanstack/react-query-persist-client\";\n\n/**\n * Wrapper around IndexedDB via the IDB package, used to persist data to browser storage\n * Add schemas to the TightDB interface to add new store slices as needed\n * If creating a new DB instance, be sure to prefix the name with \"tight-\" to avoid collisions with partner implementations\n * (if creating different store slices within this DB you don't need to prefix the name, see `queryClient`)\n *\n * Docs:\n * https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API\n * https://github.com/jakearchibald/idb\n */\n\ninterface ComponentsDBSchema extends DBSchema {\n queryClient: {\n key: IDBValidKey;\n value: PersistedClient;\n };\n}\n\nconst dbPromise = openDB<ComponentsDBSchema>(\"tight-component-store\", 1, {\n upgrade(db) {\n db.createObjectStore(\"queryClient\");\n },\n});\n\nasync function getQueryClient(key: IDBKeyRange | IDBValidKey) {\n return (await dbPromise).get(\"queryClient\", key);\n}\n\nasync function setQueryClient(key: IDBKeyRange | IDBValidKey, val: PersistedClient) {\n return (await dbPromise).put(\"queryClient\", val, key);\n}\n\nasync function deleteQueryClient(key: IDBKeyRange | IDBValidKey) {\n return (await dbPromise).delete(\"queryClient\", key);\n}\n\nasync function clearQueryClient() {\n return (await dbPromise).clear(\"queryClient\");\n}\n\nasync function queryClientKeys() {\n return (await dbPromise).getAllKeys(\"queryClient\");\n}\n\nexport {\n getQueryClient,\n setQueryClient,\n deleteQueryClient,\n clearQueryClient,\n queryClientKeys,\n};\n","import { queryClient, gcTime } from \"./queryClient.ts\";\nimport { createQueryPersister } from \"./persistence/queryPersister.ts\";\nimport { PropsWithChildren } from \"react\";\nimport { PersistQueryClientOptions, PersistQueryClientProvider } from \"@tanstack/react-query-persist-client\";\n\nconst persistOptions: PersistQueryClientOptions = {\n queryClient,\n persister: createQueryPersister(),\n maxAge: gcTime,\n // buster: \"build_version\", // discards all queries whose key does not contain this string\n dehydrateOptions: {\n shouldDehydrateQuery: query => (!query.isStale()),\n },\n};\n\ntype QueryProviderProps = PropsWithChildren;\n\nfunction QueryProvider({ children }: QueryProviderProps) {\n return (\n <PersistQueryClientProvider client={queryClient} persistOptions={persistOptions}>\n {children}\n </PersistQueryClientProvider>\n );\n}\n\nexport { QueryProvider };\n","import { getQueryClient, setQueryClient, deleteQueryClient } from \"./indexDb.ts\";\nimport {\n PersistedClient,\n Persister,\n} from \"@tanstack/react-query-persist-client\";\n\nfunction createQueryPersister(key: IDBValidKey = \"reactQuery\") {\n return {\n persistClient: async (client: PersistedClient) => {\n await setQueryClient(key, client);\n },\n restoreClient: async () => {\n return await getQueryClient(key);\n },\n removeClient: async () => {\n await deleteQueryClient(key);\n },\n } satisfies Persister;\n}\n\nexport {\n createQueryPersister,\n};\n","import { BugsnagErrorBoundary } from \"../../utils/logging.ts\";\nimport { PropsWithChildren } from \"react\";\n\ntype ErrorBoundaryProps = PropsWithChildren;\n\nfunction ErrorBoundary(props: ErrorBoundaryProps) {\n if (BugsnagErrorBoundary) {\n return (\n // contained in separate if statement so TypeScript can tell it is not undefined\n <BugsnagErrorBoundary>\n {props.children}\n </BugsnagErrorBoundary>\n );\n }\n return (\n <>{props.children}</>\n );\n}\n\nexport { ErrorBoundary };\n","import { FloatingOverlay } from \"@floating-ui/react\";\nimport { MouseEventHandler, PropsWithChildren, useRef } from \"react\";\nimport { closeAllDrawers } from \"./drawer.ts\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { Nullable } from \"../../utils/utilityTypes.ts\";\nimport { ValidClassName } from \"../../style/validClassNames.ts\";\n\nconst overlayCss = css({\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100dvw\",\n height: \"100dvh\",\n minWidth: \"100dvw\",\n minHeight: \"100dvh\",\n maxHeight: \"100dvh\",\n maxWidth: \"100dvw\",\n overflow: \"hidden\",\n});\n\nconst backdropCss = css({\n backgroundColor: \"overlay\",\n});\n\nconst backdropStylist = stylist(null, overlayCss, backdropCss);\nconst drawerContainerStylist = stylist(null, ValidClassName.component, overlayCss);\n\ntype DrawerOverlayProps = PropsWithChildren;\n\nfunction DrawerOverlay({ children }: DrawerOverlayProps) {\n const ref = useRef<HTMLDivElement>(null);\n const clickStartTarget = useRef<Nullable<EventTarget>>(null);\n\n const onClick: MouseEventHandler = (event) => {\n const clickStartedOnBackdrop = clickStartTarget.current === ref.current;\n const clickEndedOnBackdrop = event.target === ref.current;\n if (clickStartedOnBackdrop && clickEndedOnBackdrop) {\n clickStartTarget.current = null;\n closeAllDrawers();\n }\n };\n\n const onMouseDown: MouseEventHandler = (event) => {\n clickStartTarget.current = event.target;\n };\n\n return (\n <FloatingOverlay lockScroll={true}>\n <div {...backdropStylist} />\n <div onMouseDown={onMouseDown} onClick={onClick} ref={ref} {...drawerContainerStylist}>\n {children}\n </div>\n </FloatingOverlay>\n );\n}\n\nexport { DrawerOverlay };\n","import { createContext } from \"react\";\nimport { DrawerNavigation } from \"../../store/drawerNavigation.ts\";\n\nconst DrawerContext = createContext<DrawerNavigation>({ drawerHistory: [] });\n\nexport { DrawerContext };\n","import { PropsWithChildren, useMemo } from \"react\";\nimport { useGlobalStore } from \"../../store/globalStore.ts\";\nimport { DrawerOverlay } from \"./DrawerOverlay.tsx\";\nimport { DrawerContext } from \"./DrawerContext.tsx\";\n\ntype DrawerRouterProps = PropsWithChildren;\n\nfunction DrawerRouter({ children }: DrawerRouterProps) {\n const drawerHistory = useGlobalStore(state => state.drawerHistory);\n const value = useMemo(() => ({ drawerHistory }), [drawerHistory]);\n\n return (\n <DrawerContext.Provider value={value}>\n {drawerHistory.length > 0 && (\n <DrawerOverlay>\n {children}\n </DrawerOverlay>\n )}\n </DrawerContext.Provider>\n );\n}\n\nexport { DrawerRouter, DrawerContext };\n","import { DrawerContext } from \"./DrawerRouter.tsx\";\nimport { ComponentType, useContext } from \"react\";\nimport { DrawerProps, DrawerRouteNames } from \"./drawerProps.ts\";\n\ntype DrawerRouteProps<Key extends DrawerRouteNames> = {\n name: Key;\n Component: ComponentType<DrawerProps[Key]>;\n};\n\nfunction DrawerRoute<Key extends DrawerRouteNames>({ Component, name }: DrawerRouteProps<Key>) {\n const { drawerHistory } = useContext(DrawerContext);\n const activeHistory = drawerHistory.at(-1);\n if (activeHistory === undefined) {\n return null;\n }\n const activeDrawer = activeHistory[name];\n if (activeDrawer !== undefined) {\n return (\n <Component {...activeDrawer.routeProps} />\n );\n }\n}\n\nexport { DrawerRoute };\n","import { MediumIcon } from \"../../icon/MediumIcon.tsx\";\nimport { Attention } from \"../../icon/icons/Attention.tsx\";\nimport { SubLabel } from \"../../typography/SubLabel.tsx\";\nimport { css } from \"../../../../styled-system/css\";\nimport { stylist } from \"../../../style/stylist.ts\";\n\nconst errorSubLabelStylist = stylist(null, css({\n color: \"typography.accent.danger\",\n}));\n\nconst errorIconStyles = [stylist(null, css({\n color: \"icon.accent.danger\",\n \"& path\": {\n stroke: \"icon.accent.danger\",\n },\n}))];\n\nconst errorContainerStylist = stylist(null, css({\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n}));\n\nfunction ErrorLabel({ errorMessage }: { errorMessage: string }) {\n return (\n <div {...errorContainerStylist}>\n <MediumIcon Component={Attention} stylists={errorIconStyles} />\n <SubLabel stylists={[errorSubLabelStylist]}>{errorMessage}</SubLabel>\n </div>\n );\n}\n\nexport { ErrorLabel };\n","import { css } from \"../../../styled-system/css\";\nimport { stylist } from \"../../style/stylist\";\nimport { fadeBackground } from \"../../style/transition\";\nimport { MouseEvent, PropsWithChildren, RefObject, useState } from \"react\";\nimport { Nullable } from \"../../utils/utilityTypes\";\nimport { SubLabel } from \"../typography/SubLabel\";\nimport { PopupTriggerChildrenProps } from \"../popup/PopupTrigger\";\nimport { ValidClassName } from \"../../style/validClassNames\";\nimport { setCursorToEnd } from \"../../utils/dom/cursorPosition\";\nimport { ErrorLabel } from \"../dashboards/forms/ErrorLabel.tsx\";\n\ntype FormInputProps = PropsWithChildren<{\n label?: string;\n inputRef?: RefObject<Nullable<HTMLInputElement | HTMLTextAreaElement>>;\n popupTriggerProps?: PopupTriggerChildrenProps;\n isDefaultValue?: boolean;\n className?: typeof ValidClassName[\"discrete-form-input\"] | typeof ValidClassName[\"editable-form-input\"];\n additionalStyles?: ReturnType<typeof css>;\n onClick?: () => void;\n onBlur?: () => void;\n errorMessage?: string;\n disableHover?: boolean;\n}>;\n\nconst baseFormInputStyles = css({\n display: \"flex\",\n flexDirection: \"column\",\n padding: \"12px 16px\",\n cursor: \"pointer\",\n outline: \"none\",\n gap: \"8px\",\n borderRadius: \"md\",\n backgroundColor: \"surface.intent.action.discrete\",\n\n \"&[data-state='closed'][data-disablehover='false']:hover, &:not([data-state])[data-disablehover='false']:hover:not(:focus-within)\": {\n backgroundColor: \"surface.intent.action.discrete.hover\",\n },\n\n \"&[data-state='open']\": {\n backgroundColor: \"surface.intent.action.discrete.active\",\n },\n\n \"&[data-clicked='false']:has(:focus-visible)\": {\n outline: \"4px solid\",\n outlineColor: \"border.layout\",\n },\n});\n\nconst errorFormInputStyles = css({\n \"&[data-haserror='true']\": {\n border: \"{borderWidths.lg} solid\",\n borderColor: \"border.intent.danger\",\n },\n});\n\nfunction FormInput({\n children,\n inputRef,\n popupTriggerProps,\n label,\n isDefaultValue,\n className,\n additionalStyles,\n onClick,\n onBlur,\n errorMessage,\n disableHover = false,\n}: FormInputProps) {\n const baseStyles = stylist(className || null, baseFormInputStyles, additionalStyles, errorFormInputStyles, fadeBackground);\n\n const [isClicked, setIsClicked] = useState(true);\n\n const handleContainerMouseDown = (e: MouseEvent<HTMLDivElement>) => {\n setIsClicked(true);\n if (inputRef && inputRef.current && e.target !== inputRef.current) {\n e.preventDefault();\n inputRef.current.focus();\n }\n };\n\n const handleContainerFocus = () => {\n if (inputRef && inputRef.current) {\n setCursorToEnd(inputRef.current);\n }\n };\n\n const handleContainerBlur = () => {\n setIsClicked(false);\n onBlur?.();\n };\n\n return (\n <>\n <div\n {...baseStyles}\n onClick={onClick}\n {...popupTriggerProps}\n onMouseDown={handleContainerMouseDown}\n onFocus={handleContainerFocus}\n onBlur={handleContainerBlur}\n data-clicked={isClicked}\n data-isdefaultvalue={isDefaultValue}\n data-haserror={errorMessage !== undefined}\n data-disablehover={disableHover}\n >\n {label !== undefined && <SubLabel>{label}</SubLabel>}\n {children}\n </div>\n {errorMessage && <ErrorLabel errorMessage={errorMessage} />}\n </>\n );\n}\n\nexport { FormInput };\nexport type { FormInputProps };\n","function setCursorToEnd(input: HTMLInputElement | HTMLTextAreaElement) {\n if (\"setSelectionRange\" in input) {\n const length = input.value.length;\n input.setSelectionRange(length, length);\n }\n}\n\nexport {\n setCursorToEnd,\n};\n","import { createFormHookContexts } from \"@tanstack/react-form\";\n\nconst { formContext, fieldContext, useFieldContext, useFormContext } = createFormHookContexts();\n\nexport { formContext, fieldContext, useFieldContext, useFormContext };\n","import { css, cva, RecipeVariant } from \"../../../styled-system/css\";\nimport { PropsWithChildren, RefObject } from \"react\";\nimport { PopupTriggerChildrenProps } from \"../popup/PopupTrigger\";\nimport { Nullable } from \"../../utils/utilityTypes\";\nimport { FormInput } from \"./FormInput\";\nimport { ValidClassName } from \"../../style/validClassNames\";\nimport { useFieldContext } from \"../dashboards/forms/createFormHookContext.ts\";\nimport { useStore } from \"@tanstack/react-form\";\n\ntype StyleVariants = RecipeVariant<typeof normalClassName>;\n\ntype EditableFormInputProps = PropsWithChildren<{\n label?: string;\n inputRef?: RefObject<Nullable<HTMLTextAreaElement | HTMLInputElement>>;\n disabled?: boolean;\n popupTriggerProps?: PopupTriggerChildrenProps;\n onClick?: () => void;\n disableHover?: boolean;\n kind?: StyleVariants[\"kind\"];\n}>;\n\nconst disabledClassName = css({\n backgroundColor: \"surface.foreground.disabled\",\n pointerEvents: \"none\",\n border: \"{borderWidths.lg} solid\",\n borderColor: \"border.layout.strong\",\n});\n\nconst normalClassName = cva({\n base: {\n backgroundColor: \"surface.foreground\",\n border: \"{borderWidths.lg} solid\",\n borderColor: \"border.layout.strong\",\n },\n variants: {\n kind: {\n text: {\n cursor: \"text\",\n },\n button: {\n cursor: \"pointer\",\n },\n container: {\n cursor: \"default\",\n },\n },\n },\n});\n\nfunction EditableFormInput({ kind, label, children, inputRef, disabled, popupTriggerProps, onClick, disableHover = false }: EditableFormInputProps) {\n const field = useFieldContext();\n const errorMessage = useStore(field.store, state => state.meta.errors[0]?.message);\n\n const additionalStyles = disabled\n ? disabledClassName\n : normalClassName({ kind });\n\n return (\n <FormInput\n label={label}\n inputRef={inputRef}\n popupTriggerProps={popupTriggerProps}\n className={ValidClassName[\"editable-form-input\"]}\n additionalStyles={additionalStyles}\n errorMessage={errorMessage}\n onBlur={field.handleBlur}\n disableHover={disableHover}\n onClick={onClick}\n >\n {children}\n </FormInput>\n );\n}\n\nexport { EditableFormInput };\n","import { ButtonBase, ButtonBaseWrapperProps } from \"./ButtonBase\";\nimport { stylist } from \"../../style/stylist\";\nimport { css } from \"../../../styled-system/css\";\nimport { ValidClassName } from \"../../style/validClassNames\";\n\nconst secondaryButtonStylist = stylist(\n ValidClassName[\"button-secondary\"],\n css({\n color: \"typography.intent.primary\",\n border: \"{borderWidths.md} solid\",\n borderColor: \"border.intent.primary\",\n backgroundColor: \"surface.intent.primary\",\n\n \"& .Tight-text\": {\n color: \"typography.intent.primary\",\n },\n\n \"& path\": {\n stroke: \"icon.intent.primary\",\n },\n\n \"&:hover:not(:disabled)\": {\n backgroundColor: \"surface.intent.primary.hover\",\n borderColor: \"border.intent.primary.hover\",\n \"& .Tight-text\": {\n color: \"typography.intent.primary.hover\",\n },\n \"& path\": {\n stroke: \"icon.intent.primary.hover\",\n },\n },\n\n \"&:active:enabled, &[data-active='true']:enabled\": {\n backgroundColor: \"surface.intent.primary.active\",\n borderColor: \"border.intent.primary.active\",\n \"& .Tight-text\": {\n color: \"typography.intent.primary.active\",\n },\n \"& path\": {\n stroke: \"icon.intent.primary.active\",\n },\n },\n }),\n);\n\nfunction ButtonSecondary({ children, stylists = [], ...props }: ButtonBaseWrapperProps) {\n return (\n <ButtonBase\n stylists={[secondaryButtonStylist, ...stylists]}\n {...props}\n >\n {children}\n </ButtonBase>\n );\n}\n\nexport { ButtonSecondary };\n","import { SubLabel } from \"../../../../typography/SubLabel\";\nimport { stylist } from \"../../../../../style/stylist\";\nimport { css } from \"../../../../../../styled-system/css\";\nimport { Split } from \"../../../../icon/icons/Split\";\nimport { SmallIcon } from \"../../../../icon/SmallIcon\";\nimport { ButtonSecondary } from \"../../../../inputs/ButtonSecondary\";\n\ntype AddSplitButtonProps = {\n onClick: () => void;\n};\n\nconst splitIconStylist = [stylist(null, css({\n \"& path\": {\n stroke: \"surface.foreground\",\n },\n}))];\n\nfunction AddSplitButton({ onClick }: AddSplitButtonProps) {\n return (\n <ButtonSecondary\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onClick();\n }}\n >\n <SmallIcon\n stylists={splitIconStylist}\n Component={Split}\n />\n <SubLabel>Add Split</SubLabel>\n </ButtonSecondary>\n );\n}\n\nexport { AddSplitButton };\n","import { PopupManager } from \"../../../popup/PopupManager.tsx\";\nimport { PopupTrigger } from \"../../../popup/PopupTrigger.tsx\";\nimport { ExpenseCategoryPopupList } from \"../../cells/category/ExpenseCategoryPopupList.tsx\";\nimport { stylist } from \"../../../../style/stylist.ts\";\nimport { css } from \"../../../../../styled-system/css\";\nimport { StrongLabel } from \"../../../typography/StrongLabel.tsx\";\nimport { CategoryIcon } from \"../../../icon/CategoryIcon.tsx\";\nimport { EditableFormInput } from \"../../../inputs/EditableFormInput.tsx\";\nimport { CategoryExpanded, GlAccountExpanded } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { AddSplitButton } from \"./splitExpense/AddSplitButton.tsx\";\nimport { ExpenseChild } from \"../useBankTransactionForm\";\nimport { MediumIcon } from \"../../../icon/MediumIcon.tsx\";\n\ntype CategoryFieldProps = {\n category: CategoryExpanded;\n onClick: (category: CategoryExpanded) => void;\n childrenField?: {\n pushValue: (value: ExpenseChild) => void;\n };\n totalAmount: number;\n glAccount: GlAccountExpanded;\n};\n\nconst categoryStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: \"10px\",\n outline: \"none\",\n border: \"none\",\n background: \"none\",\n height: \"39px\",\n padding: 0,\n}));\n\nfunction ExpenseCategoryField({ category, onClick, childrenField, totalAmount, glAccount }: CategoryFieldProps) {\n const handleAddSplit = () => {\n const firstHalf = Math.floor(totalAmount / 2 * 100) / 100;\n const secondHalf = totalAmount - firstHalf;\n childrenField?.pushValue({\n amount: firstHalf,\n category: category,\n classSegments: [],\n glAccount,\n });\n childrenField?.pushValue({\n amount: secondHalf,\n category: category,\n classSegments: [],\n glAccount,\n });\n };\n\n return (\n <PopupManager placement=\"bottom-start\">\n <PopupTrigger>\n {props => (\n <EditableFormInput label=\"Category\" popupTriggerProps={props}>\n <button {...categoryStylist} type=\"button\">\n <MediumIcon Component={CategoryIcon(category?.name)} />\n <StrongLabel>{category?.name || \"Uncategorized\"}</StrongLabel>\n </button>\n {childrenField && (\n <AddSplitButton onClick={handleAddSplit} />\n )}\n </EditableFormInput>\n )}\n </PopupTrigger>\n <ExpenseCategoryPopupList onClick={onClick} />\n </PopupManager>\n );\n}\n\nexport { ExpenseCategoryField };\n","import { css } from \"../../../styled-system/css\";\nimport { ValidClassName } from \"../../style/validClassNames\";\nimport { PropsWithChildren, RefObject } from \"react\";\nimport { Nullable } from \"../../utils/utilityTypes\";\nimport { PopupTriggerChildrenProps } from \"../popup/PopupTrigger\";\nimport { FormInput } from \"./FormInput\";\nimport { useFieldContext } from \"../dashboards/forms/createFormHookContext.ts\";\nimport { useStore } from \"@tanstack/react-form\";\n\ntype DiscreteFormInputProps = PropsWithChildren<{\n inputRef: RefObject<Nullable<HTMLInputElement>>;\n popupTriggerProps?: PopupTriggerChildrenProps;\n label: string;\n onClick?: () => void;\n}>;\n\nconst discreteFormInputStyles = css({\n border: \"{borderWidths.lg} solid transparent\",\n\n \"&:focus-within, &[data-isdefaultvalue='false']\": {\n backgroundColor: \"surface.foreground\",\n border: \"{borderWidths.lg} solid\",\n borderColor: \"border.layout.strong\",\n },\n\n \"&:focus-within\": {\n cursor: \"text\",\n },\n});\n\nfunction DiscreteFormInput({ children, inputRef, popupTriggerProps, label, onClick }: DiscreteFormInputProps) {\n const field = useFieldContext();\n const errorMessage = useStore(field.store, state => state.meta.errors[0]?.message);\n const isDefaultValue = useStore(field.store, state => state.meta.isDefaultValue);\n\n return (\n <FormInput\n label={label}\n inputRef={inputRef}\n popupTriggerProps={popupTriggerProps}\n isDefaultValue={isDefaultValue}\n className={ValidClassName[\"discrete-form-input\"]}\n additionalStyles={discreteFormInputStyles}\n errorMessage={errorMessage}\n onClick={onClick}\n onBlur={field.handleBlur}\n >\n {children}\n </FormInput>\n );\n}\n\nexport { DiscreteFormInput };\n","import { stylist } from \"../../../style/stylist\";\nimport { css } from \"../../../../styled-system/css\";\nimport { PopupSortRow } from \"../../popup/rows/PopupSortRow.tsx\";\nimport { usePopupContext } from \"../../popup/hooks/usePopupContext.ts\";\nimport { LabeledValue } from \"../../../utils/object/objTypes.ts\";\n\ntype DropdownContentProps = {\n options: LabeledValue[];\n onSelect: (value: number) => void;\n selectedLabel: string;\n};\n\nconst popupContentStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"column\",\n maxHeight: \"200px\",\n overflowY: \"auto\",\n minWidth: \"120px\",\n}));\n\nfunction DropdownContent({ options, onSelect, selectedLabel }: DropdownContentProps) {\n const popupContext = usePopupContext();\n\n const onClick = (value: number) => {\n popupContext?.setOpen(false);\n onSelect(value);\n };\n\n return (\n <div {...popupContentStylist}>\n {options.map(option => (\n <PopupSortRow\n key={option.value}\n onClick={() => onClick(Number(option.value))}\n active={selectedLabel === option.label}\n >\n {option.label}\n </PopupSortRow>\n ))}\n </div>\n );\n}\n\nexport { DropdownContent };\n","import { stylist } from \"../../../style/stylist\";\nimport { css } from \"../../../../styled-system/css\";\nimport { PopupManager } from \"../../popup/PopupManager\";\nimport { PopupTrigger } from \"../../popup/PopupTrigger\";\nimport { Popup } from \"../../popup/Popup\";\nimport { StrongLabel } from \"../../typography/StrongLabel\";\nimport { DropdownContent } from \"./DropdownContent\";\nimport { TinyIcon } from \"../../icon/TinyIcon\";\nimport { ArrowDown } from \"../../icon/icons/ArrowDown\";\nimport { fadeBackgroundBorder } from \"../../../style/transition.ts\";\nimport { LabeledValue } from \"../../../utils/object/objTypes.ts\";\n\ntype DropdownSelectorProps = {\n selectedLabel: string;\n options: LabeledValue[];\n onSelect: (value: number) => void;\n};\n\nconst clickableLabelStylist = stylist(null, css({\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px\",\n borderRadius: \"sm\",\n gap: \"7px\",\n backgroundColor: \"surface.intent.action.discrete\",\n border: \"{borderWidths.lg} solid transparent\",\n\n \"&:hover\": {\n backgroundColor: \"surface.intent.action.discrete.hover\",\n border: \"{borderWidths.lg} solid\",\n borderColor: \"border.intent.action.hover\",\n },\n}), fadeBackgroundBorder);\n\nfunction DropdownSelector({\n selectedLabel,\n options,\n onSelect,\n}: DropdownSelectorProps) {\n return (\n <PopupManager placement=\"bottom-start\">\n <PopupTrigger>\n {popupProps => (\n <div {...clickableLabelStylist} {...popupProps}>\n <StrongLabel>{selectedLabel}</StrongLabel>\n <TinyIcon Component={ArrowDown} />\n </div>\n )}\n </PopupTrigger>\n <Popup>\n <DropdownContent options={options} onSelect={onSelect} selectedLabel={selectedLabel} />\n </Popup>\n </PopupManager>\n );\n}\n\nexport { DropdownSelector };\n","import { stylist } from \"../../../style/stylist\";\nimport { css } from \"../../../../styled-system/css\";\nimport { MONTH_NAMES, generateYearOptions } from \"../../../utils/date/date\";\nimport { DropdownSelector } from \"./DropdownSelector\";\n\ntype MonthYearSelectorProps = {\n currentMonthYear: Date;\n onMonthYearChange: (newDate: Date) => void;\n};\n\nconst selectorContainerStylist = stylist(null, css({\n display: \"flex\",\n alignItems: \"center\",\n gap: \"15px\",\n}));\n\nconst monthOptions = MONTH_NAMES.map((name, index) => ({\n value: index,\n label: name,\n}));\n\nconst yearOptions = generateYearOptions({}).map(year => ({\n value: year,\n label: String(year),\n}));\n\nfunction MonthYearSelector({ currentMonthYear, onMonthYearChange }: MonthYearSelectorProps) {\n const currentYear = currentMonthYear.getFullYear();\n const currentMonth = currentMonthYear.getMonth();\n\n const handleMonthYearChange = (\n year: number,\n month: number,\n ) => {\n const newDate = new Date(year, month, 1);\n onMonthYearChange(newDate);\n };\n\n return (\n <div {...selectorContainerStylist}>\n <DropdownSelector\n selectedLabel={MONTH_NAMES[currentMonth]}\n options={monthOptions}\n onSelect={month => handleMonthYearChange(currentYear, month)}\n />\n <DropdownSelector\n selectedLabel={String(currentYear)}\n options={yearOptions}\n onSelect={year => handleMonthYearChange(year, currentMonth)}\n />\n </div>\n );\n}\n\nexport { MonthYearSelector };\n","import { stylist } from \"../../../style/stylist\";\nimport { css } from \"../../../../styled-system/css\";\nimport { MonthYearSelector } from \"./MonthYearSelector\";\nimport { DAY_HEADERS, generateCalendarDays, isDateAfter, isSameDay, isToday } from \"../../../utils/date/date\";\nimport { ArrowLeft } from \"../../icon/icons/ArrowLeft\";\nimport { ArrowRight } from \"../../icon/icons/ArrowRight\";\nimport { SmallIcon } from \"../../icon/SmallIcon\";\nimport { SubLabel } from \"../../typography/SubLabel\";\nimport { StrongLabel } from \"../../typography/StrongLabel\";\nimport { usePopupContext } from \"../../popup/hooks/usePopupContext.ts\";\nimport { fadeBackgroundBorder } from \"../../../style/transition\";\nimport { getLast } from \"../../../utils/array/array\";\n\ntype DatePickerCalendarProps = {\n selectedDate: Date | null;\n onDateSelect: (date: Date) => void;\n viewDate: Date | null;\n onViewDateChange: (date: Date) => void;\n maxDate?: Date;\n};\n\nconst calendarContainerStylist = stylist(null, css({\n background: \"surface.foreground\",\n padding: \"25px\",\n gap: \"15px\",\n}));\n\nconst headerStylist = stylist(null, css({\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"8px\",\n alignSelf: \"stretch\",\n marginBottom: \"30px\",\n}));\n\nconst navButtonStylist = stylist(null, css({\n backgroundColor: \"surface.intent.action.discrete\",\n border: \"{borderWidths.lg} solid transparent\",\n padding: \"8px\",\n borderRadius: \"sm\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n\n \"&:hover\": {\n backgroundColor: \"surface.intent.action.discrete.hover\",\n border: \"{borderWidths.lg} solid\",\n borderColor: \"border.intent.action.hover\",\n },\n\n \"&:disabled\": {\n opacity: 0.6,\n pointerEvents: \"none\",\n },\n}), fadeBackgroundBorder);\n\nconst gridStylist = stylist(null, css({\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, 1fr)\",\n gap: \"2px 2px\",\n}));\n\nconst dayHeaderStylist = stylist(null, css({\n padding: \"8px\",\n textAlign: \"center\",\n}));\n\nconst dayButtonStylist = stylist(null, css({\n backgroundColor: \"surface.intent.action.discrete\",\n border: \"{borderWidths.lg} solid transparent\",\n padding: \"6px\",\n width: \"36px\",\n height: \"36px\",\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"sm\",\n cursor: \"pointer\",\n\n \"&:hover:not(:disabled)\": {\n backgroundColor: \"surface.intent.action.discrete.hover\",\n border: \"{borderWidths.lg} solid\",\n borderColor: \"border.intent.action.hover\",\n },\n\n \"&[data-selected='true']\": {\n backgroundColor: \"surface.intent.action.discrete.active\",\n border: \"{borderWidths.lg} solid\",\n borderColor: \"border.intent.action.active\",\n },\n\n \"&[data-today='true']::after\": {\n content: \"''\",\n position: \"absolute\",\n bottom: \"3px\",\n width: \"4px\",\n height: \"4px\",\n borderRadius: \"50%\",\n backgroundColor: \"brand.primary\",\n },\n\n \"&:disabled\": {\n cursor: \"default\",\n },\n}), fadeBackgroundBorder);\n\nconst otherMonthLabelStylist = stylist(null, css({\n color: \"typography.base\",\n}));\n\ntype DaySelectButtonProps = {\n date: Date;\n selectedDate: Date | null;\n currentMonth: number;\n onClick: (date: Date) => void;\n maxDate?: Date;\n};\n\nfunction DaySelectButton({ date, selectedDate, currentMonth, onClick, maxDate }: DaySelectButtonProps) {\n const isSelected = selectedDate && isSameDay(date, selectedDate);\n const isTodayDate = isToday(date);\n const isOtherMonth = date.getMonth() !== currentMonth;\n const isAfterMax = maxDate ? isDateAfter(date, maxDate) : false;\n const labelStylists = isOtherMonth || isAfterMax ? [otherMonthLabelStylist] : [];\n\n return (\n <button\n {...dayButtonStylist}\n onClick={() => onClick(date)}\n data-selected={isSelected}\n data-today={isTodayDate}\n disabled={isAfterMax}\n >\n <StrongLabel stylists={labelStylists}>{date.getDate().toString()}</StrongLabel>\n </button>\n );\n}\n\nfunction DatePickerCalendar({ selectedDate, onDateSelect, viewDate, onViewDateChange, maxDate }: DatePickerCalendarProps) {\n const popupContext = usePopupContext();\n const currentViewDate = viewDate || new Date();\n\n const year = currentViewDate.getFullYear();\n const month = currentViewDate.getMonth();\n const calendarDays = generateCalendarDays(year, month);\n\n const lastCalendarDay = getLast(calendarDays);\n const showMonthNext = maxDate === undefined || (lastCalendarDay && isDateAfter(maxDate, lastCalendarDay));\n\n const handleDateClick = (date: Date) => {\n onDateSelect(date);\n popupContext.setOpen(false);\n };\n\n const navigateMonth = (monthOffset: number) => {\n const newDate = new Date(currentViewDate);\n newDate.setMonth(currentViewDate.getMonth() + monthOffset);\n onViewDateChange(newDate);\n };\n\n return (\n <div {...calendarContainerStylist}>\n <div {...headerStylist}>\n <button {...navButtonStylist} onClick={() => navigateMonth(-1)}>\n <SmallIcon Component={ArrowLeft} />\n </button>\n <MonthYearSelector\n currentMonthYear={currentViewDate}\n onMonthYearChange={onViewDateChange}\n />\n <button {...navButtonStylist} onClick={() => navigateMonth(1)} disabled={!showMonthNext}>\n <SmallIcon Component={ArrowRight} />\n </button>\n </div>\n\n <div {...gridStylist}>\n {DAY_HEADERS.map(day => (\n <div key={day} {...dayHeaderStylist}>\n <SubLabel>{day}</SubLabel>\n </div>\n ))}\n\n {calendarDays.map(date => (\n <DaySelectButton\n key={date.toISOString()}\n date={date}\n selectedDate={selectedDate}\n currentMonth={month}\n onClick={handleDateClick}\n maxDate={maxDate}\n />\n ))}\n </div>\n </div>\n );\n}\n\nexport { DatePickerCalendar };\n","import { stylist } from \"../../../style/stylist\";\nimport { css } from \"../../../../styled-system/css\";\nimport { fontRecipes } from \"../../../style/recipes/fontRecipes\";\nimport { useFieldContext } from \"../../dashboards/forms/createFormHookContext.ts\";\nimport { DiscreteFormInput } from \"../DiscreteFormInput\";\nimport { KeyboardEvent, useRef, useState } from \"react\";\nimport { PopupManager } from \"../../popup/PopupManager\";\nimport { PopupTrigger } from \"../../popup/PopupTrigger\";\nimport { Popup } from \"../../popup/Popup\";\nimport { DatePickerCalendar } from \"./DatePickerCalendar\";\nimport {\n applyDateMask,\n DATE_FORMAT_PLACEHOLDER,\n DATE_INPUT_MAX_LENGTH,\n formatDateToMMDDYYYY,\n isDateAfter,\n minDate,\n parseLocalDate,\n parseMMDDYYYY,\n toISODateString,\n} from \"../../../utils/date/date\";\nimport { Nullable } from \"../../../utils/utilityTypes.ts\";\nimport { useStore } from \"@tanstack/react-form\";\nimport { EditableFormInput } from \"../EditableFormInput.tsx\";\n\ntype DateInputProps = {\n label: string;\n maxDate?: Date;\n autofocus?: boolean;\n editable?: boolean;\n};\n\nconst dateInputStylist = stylist(null,\n fontRecipes({ body: \"default\" }),\n css({\n outline: \"none\",\n border: \"none\",\n padding: 0,\n backgroundColor: \"transparent\",\n flex: 1,\n cursor: \"pointer\",\n\n \"&:focus\": {\n cursor: \"text\",\n },\n }),\n);\n\nfunction DateInput({ label, maxDate, autofocus = false, editable = false }: DateInputProps) {\n const field = useFieldContext<Nullable<string>>();\n const isDefaultValue = useStore(field.store, state => state.meta.isDefaultValue);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Date on which picker is open for\n const [viewDate, setViewDate] = useState(() => field.state.value ? parseLocalDate(field.state.value) : new Date());\n // Currently selected date\n const selectedDate = field.state.value ? parseLocalDate(field.state.value) : null;\n // Date displayed in input\n const [inputValue, setInputValue] = useState(\"\");\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const maskedValue = applyDateMask(e.target.value);\n setInputValue(maskedValue);\n\n const parsedDate = parseMMDDYYYY(maskedValue);\n if (parsedDate) {\n const finalDate = maxDate ? minDate(parsedDate, maxDate) : parsedDate;\n field.handleChange(toISODateString(finalDate));\n setViewDate(finalDate);\n } else {\n field.handleChange(\"\");\n }\n };\n\n const handleDateSelect = (date: Date) => {\n field.handleChange(toISODateString(date));\n setInputValue(formatDateToMMDDYYYY(date));\n setViewDate(date);\n };\n\n const displayValue = inputValue || (selectedDate ? formatDateToMMDDYYYY(selectedDate) : \"\");\n\n const [popupOpen, setPopupOpen] = useState(false);\n\n const setInputValueToLatestAllowedDate = () => {\n if (maxDate && selectedDate && !isDefaultValue) {\n const inputDate = parseMMDDYYYY(inputValue);\n if (inputDate && isDateAfter(inputDate, maxDate)) {\n setInputValue(formatDateToMMDDYYYY(selectedDate));\n }\n }\n };\n\n const handlePopupOpenChange = (open: boolean) => {\n if (popupOpen) {\n setInputValueToLatestAllowedDate();\n }\n setPopupOpen(open);\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handlePopupOpenChange(!popupOpen);\n }\n };\n\n const FormInputWrapper = editable ? EditableFormInput : DiscreteFormInput;\n\n return (\n <PopupManager placement=\"bottom-start\" onOpenChange={handlePopupOpenChange} open={popupOpen}>\n <PopupTrigger>\n {popupProps => (\n <FormInputWrapper\n label={label}\n inputRef={inputRef}\n popupTriggerProps={popupProps}\n onClick={() => setPopupOpen(true)}\n >\n <input\n {...dateInputStylist}\n ref={inputRef}\n type=\"text\"\n id={field.name}\n value={displayValue}\n onChange={handleInputChange}\n placeholder={DATE_FORMAT_PLACEHOLDER}\n maxLength={DATE_INPUT_MAX_LENGTH}\n autoFocus={autofocus}\n onKeyDown={handleKeyDown}\n autoComplete=\"off\"\n />\n </FormInputWrapper>\n )}\n </PopupTrigger>\n <Popup initialFocus={false}>\n <DatePickerCalendar\n selectedDate={selectedDate}\n onDateSelect={handleDateSelect}\n viewDate={viewDate}\n onViewDateChange={setViewDate}\n maxDate={maxDate}\n />\n </Popup>\n </PopupManager>\n );\n}\n\nexport { DateInput };\n","import { stylist } from \"../../style/stylist\";\nimport { css } from \"../../../styled-system/css\";\nimport { fontRecipes } from \"../../style/recipes/fontRecipes\";\nimport { useFieldContext } from \"../dashboards/forms/createFormHookContext.ts\";\nimport { EditableFormInput } from \"./EditableFormInput\";\nimport { useRef } from \"react\";\n\ntype NoteInputProps = {\n label: string;\n placeholder?: string;\n autofocus?: boolean;\n resizeable?: boolean;\n};\n\nconst textareaStylist = stylist(null,\n fontRecipes({ body: \"default\" }),\n css({\n outline: \"none\",\n border: \"none\",\n padding: 0,\n backgroundColor: \"transparent\",\n cursor: \"text\",\n overflowWrap: \"break-word\",\n minWidth: \"100%\",\n maxWidth: \"100%\",\n\n \"&::placeholder\": {\n color: \"typography.base.weak\",\n },\n\n \"&:focus\": {\n outline: \"none\",\n },\n }),\n);\n\nfunction TextAreaInput({ label, placeholder, autofocus = false, resizeable = true }: NoteInputProps) {\n const field = useFieldContext<string>();\n const inputRef = useRef<HTMLTextAreaElement>(null);\n\n return (\n <EditableFormInput label={label} inputRef={inputRef}>\n <textarea\n {...textareaStylist}\n ref={inputRef}\n value={field.state.value || \"\"}\n onChange={e => field.handleChange(e.target.value)}\n placeholder={placeholder ?? \"Add note...\"}\n rows={4}\n style={{ resize: resizeable ? \"both\" : \"none\" }}\n autoFocus={autofocus}\n />\n </EditableFormInput>\n );\n}\n\nexport { TextAreaInput };\n","import { PopupManager } from \"../../../../popup/PopupManager\";\nimport { PopupTrigger } from \"../../../../popup/PopupTrigger\";\nimport { ExpenseCategoryPopupList } from \"../../../cells/category/ExpenseCategoryPopupList.tsx\";\nimport { stylist } from \"../../../../../style/stylist\";\nimport { css } from \"../../../../../../styled-system/css\";\nimport { StrongLabel } from \"../../../../typography/StrongLabel\";\nimport { CategoryIcon } from \"../../../../icon/CategoryIcon\";\nimport { CategoryExpanded } from \"../../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { fadeColor } from \"../../../../../style/transition\";\nimport { MediumIcon } from \"../../../../icon/MediumIcon.tsx\";\nimport { ValidClassName } from \"../../../../../style/validClassNames.ts\";\n\ntype Props = {\n value: CategoryExpanded | null;\n onChange: (category: CategoryExpanded) => void;\n};\n\nconst categoryStylist = stylist(ValidClassName[\"category-text\"], css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: \"10px\",\n padding: 0,\n outline: \"none\",\n border: \"none\",\n background: \"none\",\n borderRadius: \"md\",\n color: \"typography.intent.action\",\n flex: \"1 1 0\",\n minWidth: 0,\n cursor: \"pointer\",\n \"&:hover\": {\n color: \"typography.intent.action.hover\",\n },\n \"&:focus-visible\": {\n outline: \"4px solid\",\n outlineOffset: \"2px\",\n outlineColor: \"border.layout\",\n },\n \"&:hover > .Tight-medium-icon > path\": {\n stroke: \"typography.intent.action.hover\",\n },\n}), fadeColor);\n\nconst labelStylist = stylist(null, css({\n color: \"inherit\",\n}));\n\nexport function SplitExpenseCategoryField({ value, onChange }: Props) {\n return (\n <PopupManager placement=\"bottom-start\">\n <PopupTrigger>\n {props => (\n <button {...categoryStylist} {...props} type=\"button\">\n <MediumIcon Component={CategoryIcon(value?.name)} />\n <StrongLabel stylists={[labelStylist]}>{value?.name || \"Uncategorized\"}</StrongLabel>\n </button>\n )}\n </PopupTrigger>\n <ExpenseCategoryPopupList onClick={onChange} />\n </PopupManager>\n );\n}\n","import { KeyboardEvent } from \"react\";\nimport { isMac } from \"../../../utils/platform.ts\";\n\nfunction handleSubmitShortcut(e: KeyboardEvent<HTMLFormElement>) {\n // Mac uses Meta (cmd) key, all others will use Ctrl key\n const metaOrCtrl = isMac() ? e.metaKey : e.ctrlKey;\n\n if (metaOrCtrl && e.key === \"Enter\") {\n e.preventDefault();\n e.currentTarget.requestSubmit();\n }\n}\n\nfunction handleEscapeBlur(e: KeyboardEvent) {\n if (e.key === \"Escape\" && e.target instanceof HTMLElement) {\n e.target.blur();\n }\n}\n\nfunction blurInputOnEnterKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === \"Enter\") {\n e.currentTarget.blur();\n }\n}\n\nexport {\n handleSubmitShortcut,\n handleEscapeBlur,\n blurInputOnEnterKeyDown,\n};\n","function isMac() {\n if (navigator.userAgent) {\n return navigator.userAgent.toLowerCase().includes(\"mac\");\n }\n\n // deprecated, used only as a fallback\n return navigator.platform.toLowerCase().includes(\"mac\");\n}\n\nexport { isMac };\n","import { stylist } from \"../../style/stylist\";\nimport { css } from \"../../../styled-system/css\";\nimport { ComponentPropsWithoutRef, RefObject } from \"react\";\nimport { NumericFormat } from \"react-number-format\";\nimport { ValidClassName } from \"../../style/validClassNames\";\nimport { Nullable } from \"../../utils/utilityTypes.ts\";\nimport { fontRecipes } from \"../../style/recipes/fontRecipes.ts\";\nimport { blurInputOnEnterKeyDown } from \"../dashboards/forms/handleKeyDownUtils.ts\";\nimport { Body } from \"../typography/Body.tsx\";\n\ntype AmountInputProps = {\n value: Nullable<number>;\n onChange: (value: Nullable<number>) => void;\n inputRef?: RefObject<HTMLInputElement | null>;\n onClick?: () => void;\n onBlur?: () => void;\n autofocus?: boolean;\n};\n\nconst amountInputStylist = stylist(ValidClassName[\"amount-input\"],\n fontRecipes({ body: \"default\" }),\n css({\n outline: \"none\",\n border: \"none\",\n padding: 0,\n backgroundColor: \"transparent\",\n flex: 1,\n cursor: \"pointer\",\n width: \"100%\",\n \"&:focus\": {\n cursor: \"text\",\n },\n }),\n);\n\nconst inputContainerStylist = stylist(null, css({\n display: \"flex\",\n alignItems: \"center\",\n gap: \"2px\",\n}));\n\nfunction AmountInput({ value, onChange, inputRef, onClick, onBlur, autofocus = false }: AmountInputProps) {\n return (\n <div {...inputContainerStylist}>\n <Body>$</Body>\n {/* type Omit is required for react-number-format in TS 19 */}\n {/* https://github.com/s-yadav/react-number-format/issues/880#issuecomment-2820498554 */}\n <NumericFormat<Omit<ComponentPropsWithoutRef<\"input\">, \"defaultValue\" | \"value\" | \"children\">>\n {...amountInputStylist}\n getInputRef={inputRef}\n thousandSeparator\n decimalScale={2}\n value={value}\n onValueChange={(values) => {\n onChange(values.floatValue === undefined ? null : values.floatValue);\n }}\n fixedDecimalScale\n onClick={onClick}\n onBlur={onBlur}\n onKeyDown={blurInputOnEnterKeyDown}\n autoFocus={autofocus}\n />\n </div>\n );\n}\n\nexport { AmountInput };\n","import { useState } from \"react\";\nimport { stylist } from \"../../../../../style/stylist\";\nimport { css } from \"../../../../../../styled-system/css\";\nimport { fadeColor } from \"../../../../../style/transition\";\nimport { AmountInput } from \"../../../../inputs/AmountInput\";\nimport { ValidClassName } from \"../../../../../style/validClassNames.ts\";\nimport { Nullable } from \"../../../../../utils/utilityTypes.ts\";\n\nconst amountStylist = stylist(ValidClassName[\"amount-input-container\"], css({\n borderRadius: \"md\",\n border: \"none\",\n background: \"transparent\",\n color: \"typography.intent.action\",\n maxWidth: \"120px\",\n \"&:hover:not(:focus-within)\": {\n color: \"typography.intent.action.hover\",\n },\n \"& .Tight-amount-input, & .Tight-text\": {\n color: \"inherit\",\n },\n \"&[data-clicked='true']:focus-within\": {\n outline: \"1px solid\",\n outlineOffset: \"2px\",\n outlineColor: \"border.layout.strong\",\n },\n \"&[data-clicked='false']:has(:focus-visible)\": {\n outline: \"4px solid\",\n outlineOffset: \"2px\",\n outlineColor: \"border.layout\",\n },\n}), fadeColor);\n\ntype SplitExpenseAmountFieldProps = {\n value: Nullable<number>;\n onChange: (value: Nullable<number>) => void;\n onBlur: () => void;\n};\n\nfunction SplitExpenseAmountField({ value, onChange, onBlur }: SplitExpenseAmountFieldProps) {\n const [clicked, setClicked] = useState(false);\n\n const handleBlur = () => {\n setClicked(false);\n onBlur();\n };\n\n return (\n <div {...amountStylist} data-clicked={clicked}>\n <AmountInput\n value={value}\n onChange={onChange}\n onClick={() => setClicked(true)}\n onBlur={() => handleBlur()}\n />\n </div>\n );\n}\n\nexport { SplitExpenseAmountField };\n","import { z } from \"zod\";\nimport { isDateAfter, isDateBefore, isSameDay } from \"../../../utils/date/date.ts\";\n\nconst transactionFormSchema = z.object({\n amount: z.number({\n message: \"Required\",\n })\n .refine(amount => amount !== 0, {\n message: \"Amount must not be 0\",\n }),\n date: z.string(\"Required\")\n .refine(date => (\n isDateBefore(new Date(date), new Date())\n || isSameDay(new Date(date), new Date())\n // TODO: should be based on user's closed years\n ) && isDateAfter(new Date(date), new Date(\"2000-01-01\")), {\n message: \"Invalid date\",\n }),\n category: z.object({\n id: z.string(),\n name: z.string().optional(),\n }, {\n message: \"Required\", // unlikely to be hit because can't not select a category\n }).nullable(),\n classSegments: z.array(z.object({\n id: z.string(),\n name: z.string().optional(),\n })),\n bankAccount: z.object({\n id: z.string(),\n name: z.string().optional(),\n }, {\n message: \"Required\",\n }),\n glAccount: z.object({\n id: z.string(),\n name: z.string().optional(),\n accountNo: z.string().optional(),\n }, {\n message: \"Required\",\n }),\n notes: z.string().nullable(),\n children: z.array(z.object({\n amount: z.number().refine(amount => amount !== 0, {\n message: \"Child expense amounts must not be 0\",\n }),\n category: z.object({\n id: z.string(),\n name: z.string().optional(),\n }, {\n message: \"Required\",\n }),\n glAccount: z.object({\n id: z.string(),\n }, {\n message: \"Required\",\n }),\n classSegments: z.array(z.object({\n id: z.string(),\n name: z.string().optional(),\n })),\n })),\n});\n\nexport { transactionFormSchema };\n","import { transactionFormSchema } from \"../transactionFormSchema.ts\";\nimport { isEmpty } from \"lodash-es\";\n\nconst expenseFormSchema = transactionFormSchema.extend({})\n .check((schema) => {\n const sum = schema.value?.children?.reduce((acc, child) => acc + child.amount, 0);\n if (!isEmpty(schema.value?.children) && sum !== schema.value.amount) {\n schema.issues.push({\n code: \"custom\",\n message: \"Sum of children amounts must equal total amount\",\n input: schema.value,\n path: [\"children\"],\n });\n }\n });\n\nexport { expenseFormSchema };\n","import { z } from \"zod\";\nimport { transactionFormSchema } from \"../transactionFormSchema.ts\";\nimport { MatchingBankTransactionApiName } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { isNullish } from \"../../../../utils/typeUtils.ts\";\n\nconst matchingBankTransactionApiNameEnum = {\n BOX: \"BOX\",\n CLOVER: \"CLOVER\",\n STRIPE: \"STRIPE\",\n PLAID: \"PLAID\",\n KNOX: \"KNOX\",\n UBER: \"UBER\",\n FRESHBOOKS: \"FRESHBOOKS\",\n HARVEST: \"HARVEST\",\n KW: \"KW\",\n FRESHBOOKS2: \"FRESHBOOKS2\",\n CAPITAL_ONE: \"CAPITAL_ONE\",\n SQUARE: \"SQUARE\",\n DOTLOOP: \"DOTLOOP\",\n REALOGY: \"REALOGY\",\n UPWORK: \"UPWORK\",\n SHOPIFY: \"SHOPIFY\",\n DEDUCTR: \"DEDUCTR\",\n ENTERPRISE: \"ENTERPRISE\",\n MOXIWORKS: \"MOXIWORKS\",\n APPDIRECT: \"APPDIRECT\",\n LONEWOLF: \"LONEWOLF\",\n LONEWOLF_TRANSACTIONDESK: \"LONEWOLF_TRANSACTIONDESK\",\n SAMPLE_BANK: \"SAMPLE_BANK\",\n TAXBOT: \"TAXBOT\",\n GUSTO: \"GUSTO\",\n XERO: \"XERO\",\n UNIT: \"UNIT\",\n MOOV: \"MOOV\",\n QBO: \"QBO\",\n QUALPAY: \"QUALPAY\",\n BENCH: \"BENCH\",\n PARTNER_IMPLEMENTATION: \"PARTNER_IMPLEMENTATION\",\n CHECK: \"CHECK\",\n RUTTER: \"RUTTER\",\n WAVE: \"WAVE\",\n MANUAL_ENTRY: \"MANUAL_ENTRY\",\n CSV_IMPORT: \"CSV_IMPORT\",\n} as const satisfies Record<MatchingBankTransactionApiName, MatchingBankTransactionApiName>;\n\nconst bankTransferFormSchema = transactionFormSchema.extend({\n matchingBankTransaction: z.object({\n id: z.string(),\n description: z.string().optional(),\n amount: z.number().optional(),\n date: z.string().optional(),\n bankAccountId: z.string().optional(),\n apiName: z.enum(matchingBankTransactionApiNameEnum).optional(),\n }).nullish(),\n}).refine((data) => {\n const matchingAmount = data.matchingBankTransaction?.amount;\n const amount = data.amount;\n return isNullish(matchingAmount) ? true : matchingAmount === amount;\n}, {\n message: \"Transfer amount must equal the matching bank transaction amount\",\n path: [\"matchingBankTransaction\"],\n when(payload) {\n return bankTransferFormSchema.pick({ amount: true, matchingBankTransaction: true }).safeParse(payload.value).success;\n },\n});\n\nexport { bankTransferFormSchema };\n","import { BankTransaction, MatchingBankTransactionExpanded } from \"../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { smartNumber } from \"../../utils/money/smartNumber.ts\";\nimport { formatDateToMMDDYYYY, parseLocalDate } from \"../../utils/date/date.ts\";\n\nconst isManualTransaction = (transaction: BankTransaction) => transaction.apiName === \"MANUAL_ENTRY\" || transaction.apiName === \"CSV_IMPORT\";\n\nconst getMatchingBankTransactionExpandedFromFullTransaction = (transaction: BankTransaction): MatchingBankTransactionExpanded => {\n return {\n id: transaction.id,\n description: transaction?.description,\n amount: transaction?.amount,\n date: transaction?.date,\n bankAccountId: transaction?.bankAccount?.id,\n apiName: transaction?.apiName,\n };\n};\n\nconst createTransactionOptionLabel = (transaction: BankTransaction | MatchingBankTransactionExpanded): string => {\n const description = transaction?.description;\n const amount = smartNumber(Number(transaction?.amount), { dollarSign: true });\n const date = formatDateToMMDDYYYY(parseLocalDate(transaction?.date || \"\"));\n return `${description} | ${amount} | ${date}`;\n};\n\nexport { isManualTransaction, getMatchingBankTransactionExpandedFromFullTransaction, createTransactionOptionLabel };\n","import { PlaceholderPopupList } from \"../../../popup/placeholder/PlaceholderPopupList.tsx\";\nimport { PopupRow } from \"../../../popup/rows/PopupRow.tsx\";\nimport { PopupList } from \"../../../popup/list/PopupList.tsx\";\nimport { StrongLabel } from \"../../../typography/StrongLabel.tsx\";\nimport { stylist } from \"../../../../style/stylist.ts\";\nimport { css } from \"../../../../../styled-system/css\";\nimport { usePopupContext } from \"../../../popup/hooks/usePopupContext.ts\";\nimport { BankAccount, useBankAccounts } from \"../../../../query/fetches/banks/bankAccounts.ts\";\nimport { Popup } from \"../../../popup/Popup.tsx\";\nimport { BankAccountExpanded } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\n\ntype BankAccountListProps = {\n onClick?: (bankAccount: BankAccountExpanded) => void;\n};\n\nconst textStylist = stylist(null, css({\n whiteSpace: \"normal\",\n}));\n\n/**\n * Should be rendered inside a {@link PopupManager} as a sibling of a {@link PopupTrigger}\n */\nconst BankAccountPopupList = ({ onClick }: BankAccountListProps) => {\n const { query: { data }, isFilling } = useBankAccounts();\n const bankAccounts = data?.data?.filter(bankAccount => bankAccount.glAccountId && bankAccount.status === \"ACTIVE\");\n\n const parentPopupContext = usePopupContext();\n\n const handleBankAccountChange = (bankAccount: BankAccount) => {\n if (onClick !== undefined) {\n onClick(bankAccount);\n }\n parentPopupContext.setOpen(false);\n };\n\n return (\n <Popup>\n <PopupList>\n {isFilling\n ? <PlaceholderPopupList />\n : bankAccounts?.map((bankAccount) => {\n return (\n <PopupRow key={bankAccount?.id} onClick={() => handleBankAccountChange(bankAccount)}>\n <StrongLabel stylists={[textStylist]}>\n {`${bankAccount?.apiAccountName} *${bankAccount?.apiAccountNo}`}\n </StrongLabel>\n </PopupRow>\n );\n })}\n </PopupList>\n </Popup>\n );\n};\n\nexport {\n BankAccountPopupList,\n};\n","import { PopupManager } from \"../../popup/PopupManager.tsx\";\nimport { PopupTrigger } from \"../../popup/PopupTrigger.tsx\";\nimport { EditableFormInput } from \"../../inputs/EditableFormInput.tsx\";\nimport { StrongLabel } from \"../../typography/StrongLabel.tsx\";\nimport { BankAccountPopupList } from \"../cells/bankAccount/BankAccountPopupList.tsx\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { BankAccount } from \"../../../query/fetches/banks/bankAccounts.ts\";\nimport { Nullable } from \"../../../utils/utilityTypes.ts\";\nimport { formatAccountName } from \"../../../entities/bankAccount/accountNameFormatter.ts\";\n\ntype BankAccountSelectorProps = {\n label: string;\n disabled?: boolean;\n bankAccount: Nullable<BankAccount> | undefined;\n onClick?: (bankAccount: BankAccount) => void;\n};\n\nconst bankAccountStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: \"10px\",\n outline: \"none\",\n border: \"none\",\n background: \"none\",\n padding: 0,\n cursor: \"pointer\",\n}));\n\nfunction BankAccountSelector({ label, disabled, bankAccount, onClick }: BankAccountSelectorProps) {\n return (\n <PopupManager placement=\"bottom-start\">\n <PopupTrigger>\n {props => (\n <EditableFormInput label={label} popupTriggerProps={props} disabled={disabled}>\n <button {...bankAccountStylist} type=\"button\" disabled={disabled}>\n <StrongLabel>{formatAccountName(bankAccount?.apiAccountName, bankAccount?.apiAccountNo)}</StrongLabel>\n </button>\n </EditableFormInput>\n )}\n </PopupTrigger>\n <BankAccountPopupList onClick={onClick} />\n </PopupManager>\n );\n}\n\nexport { BankAccountSelector };\n","import { PopupList } from \"../../../popup/list/PopupList.tsx\";\nimport { PlaceholderPopupList } from \"../../../popup/placeholder/PlaceholderPopupList.tsx\";\nimport { PopupRow } from \"../../../popup/rows/PopupRow.tsx\";\nimport { Popup } from \"../../../popup/Popup.tsx\";\nimport {\n BankTransaction,\n QueryBankTransactionParamsNoCursor,\n useBankTransactions,\n} from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { usePopupContext } from \"../../../popup/hooks/usePopupContext.ts\";\nimport { createTransactionOptionLabel } from \"../../../../entities/transaction/transactions.ts\";\nimport { StrongLabel } from \"../../../typography/StrongLabel.tsx\";\nimport { stylist } from \"../../../../style/stylist.ts\";\nimport { css } from \"../../../../../styled-system/css\";\n\ntype BankTransferPopupListProps = {\n onClick: (transfer: BankTransaction) => void;\n transactionId: string | undefined;\n};\n\nconst fetchParams = {\n filter: {\n type: {\n values: [\"BANK_TRANSFER\"],\n operator: \"IN\",\n },\n },\n} satisfies QueryBankTransactionParamsNoCursor;\n\nconst textStylist = stylist(null, css({\n whiteSpace: \"normal\",\n}));\n\nfunction BankTransferPopupList({ onClick, transactionId }: BankTransferPopupListProps) {\n const { query: { data }, isFilling } = useBankTransactions(fetchParams);\n const bankTransfers = data?.data?.filter(transfer => transfer.id !== transactionId);\n const popupContext = usePopupContext();\n\n const handleBankTransferChange = (transfer: BankTransaction) => {\n onClick(transfer);\n popupContext?.setOpen(false);\n };\n\n return (\n <Popup>\n <PopupList>\n {isFilling\n ? <PlaceholderPopupList />\n : bankTransfers?.map(transfer => (\n <PopupRow key={transfer.id} onClick={() => handleBankTransferChange(transfer)}>\n <StrongLabel stylists={[textStylist]}>{createTransactionOptionLabel(transfer)}</StrongLabel>\n </PopupRow>\n ))}\n </PopupList>\n </Popup>\n );\n}\n\nexport { BankTransferPopupList };\n","import {\n BankTransaction,\n MatchingBankTransactionExpanded,\n} from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { PopupManager } from \"../../../popup/PopupManager.tsx\";\nimport { PopupTrigger } from \"../../../popup/PopupTrigger.tsx\";\nimport { EditableFormInput } from \"../../../inputs/EditableFormInput.tsx\";\nimport { stylist } from \"../../../../style/stylist.ts\";\nimport { css } from \"../../../../../styled-system/css\";\nimport { useFieldContext } from \"../createFormHookContext.ts\";\nimport { StrongLabel } from \"../../../typography/StrongLabel.tsx\";\nimport {\n createTransactionOptionLabel,\n getMatchingBankTransactionExpandedFromFullTransaction,\n} from \"../../../../entities/transaction/transactions.ts\";\nimport { BankTransferPopupList } from \"./BankTransferPopupList.tsx\";\nimport { Nullable } from \"../../../../utils/utilityTypes.ts\";\n\ntype MatchingBankTransactionFieldProps = {\n transaction: Nullable<BankTransaction> | undefined;\n};\n\nconst buttonStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: \"10px\",\n outline: \"none\",\n border: \"none\",\n background: \"none\",\n padding: 0,\n cursor: \"pointer\",\n}));\n\nconst placeholderTextStylist = stylist(null, css({ color: \"typography.base.weak\" }));\n\nfunction MatchingBankTransferField({ transaction }: MatchingBankTransactionFieldProps) {\n const field = useFieldContext<MatchingBankTransactionExpanded>();\n\n const handleBankTransferChange = (transaction: BankTransaction) => {\n const matchingBankTransfer: MatchingBankTransactionExpanded = getMatchingBankTransactionExpandedFromFullTransaction(transaction);\n field.handleChange(matchingBankTransfer);\n field.handleBlur();\n };\n\n const value = field.state.value;\n const selected = value ? createTransactionOptionLabel(value) : \"Select\";\n const textStylists = value\n ? []\n : [placeholderTextStylist];\n\n return (\n <PopupManager placement=\"bottom-start\">\n <PopupTrigger>\n {props => (\n <EditableFormInput label=\"Matching Bank Transfer\" popupTriggerProps={props}>\n <button {...buttonStylist}>\n <StrongLabel stylists={textStylists}>{selected}</StrongLabel>\n </button>\n </EditableFormInput>\n )}\n </PopupTrigger>\n <BankTransferPopupList onClick={handleBankTransferChange} transactionId={transaction?.id} />\n </PopupManager>\n );\n}\n\nexport { MatchingBankTransferField };\n","import { transactionFormSchema } from \"../transactionFormSchema.ts\";\n\nconst revenueFormSchema = transactionFormSchema.extend({});\n\nexport { revenueFormSchema };\n","import { BankTransactionTaxInfo } from \"../../query/fetches/transactions/bankTransactionQueries.ts\";\n\ntype TaxRegion = BankTransactionTaxInfo[\"region\"];\nconst TAX_REGIONS = {\n FEDERAL: \"Federal\",\n STATE: \"State\",\n SALES: \"Sales\",\n} satisfies Record<NonNullable<TaxRegion>, Capitalize<Lowercase<NonNullable<TaxRegion>>>>;\n\ntype TaxQuarter = BankTransactionTaxInfo[\"quarter\"];\nconst TAX_QUARTERS = {\n Q1: \"Q1\",\n Q2: \"Q2\",\n Q3: \"Q3\",\n Q4: \"Q4\",\n} satisfies Record<NonNullable<TaxQuarter>, TaxQuarter>;\n\ntype TaxRegionOption = {\n value: NonNullable<TaxRegion>;\n label: Capitalize<Lowercase<NonNullable<TaxRegion>>>;\n};\n\nconst TAX_REGION_OPTIONS: TaxRegionOption[] = [\n { value: \"FEDERAL\", label: \"Federal\" },\n { value: \"STATE\", label: \"State\" },\n { value: \"SALES\", label: \"Sales\" },\n];\n\ntype TaxQuarterOption = {\n value: NonNullable<TaxQuarter>;\n label: NonNullable<TaxQuarter>;\n};\n\nconst TAX_QUARTER_OPTIONS: TaxQuarterOption[] = [\n { value: \"Q1\", label: \"Q1\" },\n { value: \"Q2\", label: \"Q2\" },\n { value: \"Q3\", label: \"Q3\" },\n { value: \"Q4\", label: \"Q4\" },\n];\n\nconst TAX_REGION_ARRAY = [\n \"FEDERAL\", \"STATE\", \"SALES\",\n] as const satisfies readonly NonNullable<TaxRegion>[];\n\nconst TAX_QUARTER_ARRAY = [\n \"Q1\", \"Q2\", \"Q3\", \"Q4\",\n] as const satisfies readonly NonNullable<TaxQuarter>[];\n\nexport {\n TAX_REGIONS,\n TAX_QUARTERS,\n TAX_REGION_OPTIONS,\n TAX_QUARTER_OPTIONS,\n TAX_REGION_ARRAY,\n TAX_QUARTER_ARRAY,\n};\n\nexport type {\n TaxRegion,\n TaxQuarter,\n};\n","import { z } from \"zod\";\nimport { transactionFormSchema } from \"../transactionFormSchema.ts\";\nimport { TAX_REGION_ARRAY, TAX_QUARTER_ARRAY } from \"../../../../entities/transaction/taxInfo.ts\";\n\nconst taxPaymentFormSchema = transactionFormSchema.extend({\n tax: z.object({\n paymentInfo: z\n .object({\n region: z.enum(TAX_REGION_ARRAY, {\n message: `Tax region must be one of: ${TAX_REGION_ARRAY.join(\", \")}`,\n }),\n quarter: z.enum(TAX_QUARTER_ARRAY, {\n message: `Tax quarter must be one of: ${TAX_QUARTER_ARRAY.join(\", \")}`,\n }),\n year: z.number({\n message: \"Tax year is required\",\n }),\n })\n .nullable(),\n }),\n}).superRefine((val, ctx) => {\n if (!val.tax?.paymentInfo) {\n ctx.addIssue({\n path: [\"tax\", \"paymentInfo\", \"region\"],\n code: \"custom\",\n message: `Tax region must be one of: ${TAX_REGION_ARRAY.join(\", \")}`,\n });\n ctx.addIssue({\n path: [\"tax\", \"paymentInfo\", \"quarter\"],\n code: \"custom\",\n message: `Tax quarter must be one of: ${TAX_QUARTER_ARRAY.join(\", \")}`,\n });\n ctx.addIssue({\n path: [\"tax\", \"paymentInfo\", \"year\"],\n code: \"custom\",\n message: \"Tax year is required\",\n });\n }\n});\n\nexport { taxPaymentFormSchema };\n","import { PopupManager } from \"../../../popup/PopupManager.tsx\";\nimport { PopupTrigger } from \"../../../popup/PopupTrigger.tsx\";\nimport { stylist } from \"../../../../style/stylist.ts\";\nimport { css } from \"../../../../../styled-system/css\";\nimport { StrongLabel } from \"../../../typography/StrongLabel.tsx\";\nimport { EditableFormInput } from \"../../../inputs/EditableFormInput.tsx\";\nimport { GlAccountPopupList } from \"../../cells/category/GlAccountPopupList.tsx\";\nimport {\n creditGlAccountTypes,\n getExpandedGlAccountFromFullGlAccount,\n} from \"../../../../entities/transaction/glAccounts.ts\";\nimport { useFieldContext } from \"../createFormHookContext.ts\";\nimport { GlAccountExpanded } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { GlAccount } from \"../../../../query/fetches/generalLedger/glAccounts.ts\";\nimport { formatGlAccount } from \"../../../../utils/generalLedger/generalLedgerUtils.ts\";\n\nconst glAccountStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: \"10px\",\n outline: \"none\",\n border: \"none\",\n background: \"none\",\n height: \"39px\",\n padding: 0,\n cursor: \"pointer\",\n}));\n\nfunction GlAccountField() {\n const field = useFieldContext<GlAccountExpanded>();\n const glAccount = field.state.value;\n\n const handleClick = (glAccount: GlAccount) => {\n const glAccountExpanded = getExpandedGlAccountFromFullGlAccount(glAccount);\n field.handleChange(glAccountExpanded);\n };\n\n return (\n <PopupManager placement=\"bottom-start\">\n <PopupTrigger>\n {props => (\n <EditableFormInput label=\"Account\" popupTriggerProps={props}>\n <button {...glAccountStylist} type=\"button\">\n <StrongLabel>{formatGlAccount(glAccount.accountNo, glAccount.name)}</StrongLabel>\n </button>\n </EditableFormInput>\n )}\n </PopupTrigger>\n <GlAccountPopupList onClick={handleClick} types={creditGlAccountTypes} />\n </PopupManager>\n );\n}\n\nexport { GlAccountField };\n","import { PropsWithChildren } from \"react\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { css } from \"../../../../styled-system/css\";\n\ntype ButtonGroupGridLayoutProps = PropsWithChildren<{\n rows: number;\n cols: number;\n}>;\n\nconst gridStylist = stylist(null, css({\n display: \"grid\",\n textWrap: \"nowrap\",\n}));\n\nfunction ButtonGridLayout({ children, rows, cols }: ButtonGroupGridLayoutProps) {\n const style = {\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n gridTemplateRows: `repeat(${rows}, 1fr)`,\n };\n\n return (\n <div {...gridStylist} style={style}>\n {children}\n </div>\n );\n}\n\nexport { ButtonGridLayout };\n","import { stylist } from \"../../../style/stylist.ts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { fadeBackgroundBorder } from \"../../../style/transition.ts\";\nimport { buttonBaseStyle, buttonPrimaryStyle, defaultButtonText } from \"../../../style/buttons.ts\";\nimport { LabeledValue } from \"../../../utils/object/objTypes.ts\";\nimport { Label } from \"../../typography/Label.tsx\";\n\n// z-index: Ensures focused button's outline appears above adjacent buttons\nconst groupButtonStylist = stylist(null, css({\n minWidth: 0,\n \"&:focus\": {\n zIndex: 1,\n },\n}),\ndefaultButtonText,\nbuttonBaseStyle,\nbuttonPrimaryStyle,\nfadeBackgroundBorder,\n);\n\ntype ButtonGroupButtonsProps<TOption extends LabeledValue> = {\n option: TOption | undefined;\n handleClick: (option: TOption) => void;\n selected: TOption | undefined;\n};\n\nfunction ButtonGroupButton<TOption extends LabeledValue>({ option, handleClick, selected }: ButtonGroupButtonsProps<TOption>) {\n if (option === undefined) {\n return null;\n }\n\n return (\n <button\n type=\"button\"\n {...groupButtonStylist}\n onClick={() => handleClick(option)}\n data-active={selected === option}\n >\n <Label>{option.label}</Label>\n </button>\n );\n}\n\nexport { ButtonGroupButton };\n","import { ButtonGridLayout } from \"./ButtonGridLayout.tsx\";\nimport { ButtonGroupButton } from \"./ButtonGroupButton.tsx\";\nimport { LabeledValue } from \"../../../utils/object/objTypes.ts\";\n\ntype ButtonGroupGridProps<TOption extends LabeledValue> = {\n rows: number;\n cols: number;\n options: TOption[] | undefined;\n handleClick: (option: TOption) => void;\n selected: TOption | undefined;\n};\n\nfunction ButtonGrid<TOption extends LabeledValue>({ options, handleClick, selected, rows, cols }: ButtonGroupGridProps<TOption>) {\n return (\n <ButtonGridLayout rows={rows} cols={cols}>\n {options?.map(option => (\n <ButtonGroupButton key={option.value} option={option} handleClick={handleClick} selected={selected} />\n ))}\n </ButtonGridLayout>\n );\n}\n\nexport { ButtonGrid };\n","import { PopupList } from \"../../popup/list/PopupList.tsx\";\nimport { usePopupContext } from \"../../popup/hooks/usePopupContext.ts\";\nimport { PopupRow } from \"../../popup/rows/PopupRow.tsx\";\nimport { Label } from \"../../typography/Label.tsx\";\nimport { Popup } from \"../../popup/Popup.tsx\";\nimport { useFieldContext } from \"./createFormHookContext.ts\";\nimport { LabeledValue } from \"../../../utils/object/objTypes.ts\";\n\ntype GenericSelectorFieldPopupProps = {\n options: LabeledValue[];\n};\n\nfunction GenericSelectorFieldPopup({ options }: GenericSelectorFieldPopupProps) {\n const popupContext = usePopupContext();\n const field = useFieldContext<string | number>();\n return (\n <Popup>\n <PopupList>\n {options.map((option) => {\n const handleClick = () => {\n field.handleChange(option.value);\n field.handleBlur();\n popupContext.setOpen(false);\n };\n return (\n <PopupRow key={option.value} onClick={handleClick}>\n <Label>{option.label}</Label>\n </PopupRow>\n );\n })}\n </PopupList>\n </Popup>\n );\n}\n\nexport { GenericSelectorFieldPopup };\n","import { PopupManager } from \"../../popup/PopupManager.tsx\";\nimport { EditableFormInput } from \"../../inputs/EditableFormInput.tsx\";\nimport { useFieldContext } from \"./createFormHookContext.ts\";\nimport { StrongLabel } from \"../../typography/StrongLabel.tsx\";\nimport { PopupTrigger } from \"../../popup/PopupTrigger.tsx\";\nimport { GenericSelectorFieldPopup } from \"./GenericSelectorFieldPopup.tsx\";\nimport { css } from \"../../../../styled-system/css\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { LabeledValue } from \"../../../utils/object/objTypes.ts\";\n\nconst buttonStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: \"10px\",\n outline: \"none\",\n border: \"none\",\n background: \"none\",\n padding: 0,\n cursor: \"pointer\",\n}));\n\ntype GenericSelectorFieldProps = {\n label: string;\n options: LabeledValue[];\n};\n\nconst placeholderCss = stylist(null, css({\n color: \"typography.base.weak\",\n}));\n\nfunction GenericSelectorField({ options, label }: GenericSelectorFieldProps) {\n const field = useFieldContext<string>();\n return (\n <PopupManager placement=\"bottom-start\">\n <PopupTrigger>\n {popupTriggerProps => (\n <EditableFormInput label={label} popupTriggerProps={popupTriggerProps}>\n <button {...buttonStylist} type=\"button\">\n {field.state.value\n ? <StrongLabel>{field.state.value.toString()}</StrongLabel>\n : <StrongLabel stylists={[placeholderCss]}>{`Select ${label}...`}</StrongLabel>}\n </button>\n </EditableFormInput>\n )}\n </PopupTrigger>\n <GenericSelectorFieldPopup options={options} />\n </PopupManager>\n );\n}\n\nexport { GenericSelectorField };\n","import { createFormHook } from \"@tanstack/react-form\";\nimport { SaveButton } from \"./SaveButton.tsx\";\nimport { ExpenseCategoryField } from \"./expenseForm/ExpenseCategoryField.tsx\";\nimport { DateInput } from \"../../inputs/datePicker/DateInput\";\nimport { TextAreaInput } from \"../../inputs/TextAreaInput.tsx\";\nimport { SplitExpenseCategoryField } from \"./expenseForm/splitExpense/SplitExpenseCategoryField.tsx\";\nimport { SplitExpenseAmountField } from \"./expenseForm/splitExpense/SplitExpenseAmountField.tsx\";\nimport { DiscreteAmountField } from \"./DiscreteAmountField.tsx\";\nimport {\n BankAccountExpanded,\n BankTransaction,\n CategoryExpanded,\n GlAccountExpanded,\n MatchingBankTransactionExpanded,\n} from \"../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { Nullable } from \"../../../utils/utilityTypes.ts\";\nimport { expenseFormSchema } from \"./expenseForm/expenseFormSchema.ts\";\nimport { bankTransferFormSchema } from \"./bankTransferForm/bankTransferFormSchema.ts\";\nimport { BankAccountField } from \"./BankAccountField.tsx\";\nimport { MatchingBankTransferField } from \"./bankTransferForm/MatchingBankTransferField.tsx\";\nimport { revenueFormSchema } from \"./revenueForm/revenueFormSchema.ts\";\nimport { taxPaymentFormSchema } from \"./taxPaymentForm/taxPaymentFormSchema.ts\";\nimport {\n UpdateBankTransactionDto,\n useSingleBankTransactionMutation,\n} from \"../../../query/mutations/transactions/bankTransactionMutations.ts\";\nimport { GlAccountField } from \"./revenueForm/GlAccountField.tsx\";\nimport { formContext, fieldContext } from \"./createFormHookContext.ts\";\nimport { BankGlAccountField } from \"./bankTransferForm/BankGlAccountField.tsx\";\nimport { convertCentsToDollars, convertDollarsToCents } from \"../../../utils/money/convertCentsToDollars.ts\";\nimport { ButtonGroupField } from \"./ButtonGroupField.tsx\";\nimport { GenericSelectorField } from \"./GenericSelectorField.tsx\";\n\n// TODO: replace with ChildBankTransaction when form is ready to create fully fledged children\ntype ExpenseChild = {\n amount: Nullable<BankTransaction[\"amount\"]>;\n category: CategoryExpanded;\n classSegments: BankTransaction[\"classSegments\"];\n glAccount: GlAccountExpanded;\n};\n\n// TODO: replace with BankTransaction once form is ready for all fields\ntype BankTransactionFormDefaultValues = {\n amount: Nullable<BankTransaction[\"amount\"]>;\n category: CategoryExpanded;\n date: BankTransaction[\"date\"];\n bankAccount: BankAccountExpanded;\n glAccount: GlAccountExpanded;\n notes: BankTransaction[\"notes\"];\n classSegments: BankTransaction[\"classSegments\"];\n children: ExpenseChild[];\n matchingBankTransaction?: MatchingBankTransactionExpanded;\n tax?: BankTransaction[\"tax\"];\n};\n\nconst bankTransactionFormEmptyDefaultValues: BankTransactionFormDefaultValues = {\n amount: null,\n category: { id: \"\", name: \"\" },\n bankAccount: { id: \"\", name: \"\" },\n glAccount: { id: \"\", name: \"\", accountNo: \"\" },\n date: \"\",\n notes: null,\n classSegments: [],\n children: [],\n matchingBankTransaction: { id: \"\", description: \"\", amount: 0, date: \"\", bankAccountId: \"\", apiName: undefined },\n tax: {\n paymentInfo: null,\n },\n};\n\nconst { useAppForm, withForm } = createFormHook({\n formContext,\n fieldContext,\n formComponents: {\n SaveButton,\n },\n fieldComponents: {\n DiscreteAmountField,\n ExpenseCategoryField,\n DateInput,\n TextAreaInput,\n SplitExpenseCategoryField,\n SplitExpenseAmountField,\n BankAccountField,\n GlAccountField,\n BankGlAccountField,\n MatchingBankTransferField,\n ButtonGroupField,\n GenericSelectorField,\n },\n});\n\nfunction getDefaultValues(transaction: BankTransaction): BankTransactionFormDefaultValues {\n return {\n amount: convertCentsToDollars(transaction.amount),\n category: transaction.category,\n date: transaction.date,\n bankAccount: transaction.bankAccount,\n glAccount: transaction.glAccount,\n notes: transaction.notes,\n classSegments: transaction.classSegments,\n children: transaction.children.map(child => ({\n amount: convertCentsToDollars(child.amount),\n category: child.category,\n glAccount: child.glAccount,\n classSegments: child.classSegments,\n })),\n matchingBankTransaction: transaction.matchingBankTransaction,\n tax: transaction.tax,\n };\n}\n\nfunction createTransactionMutateObject(transactionId: BankTransaction[\"id\"], value: BankTransactionFormDefaultValues): UpdateBankTransactionDto {\n return {\n id: transactionId,\n amount: value.amount ? convertDollarsToCents(value.amount) : 0,\n categoryId: value.category?.id,\n bankAccountId: value.bankAccount.id,\n glAccountId: value.glAccount?.id,\n date: value.date,\n notes: value.notes,\n classSegmentIds: value.classSegments.map(segment => segment.id),\n children: value.children.map(child => ({\n amount: child.amount ? convertDollarsToCents(child.amount) : 0,\n categoryId: child.category?.id,\n glAccountId: child.glAccount?.id,\n classSegmentIds: value.classSegments.map(segment => segment.id),\n })),\n matchingBankTransactionId: value.matchingBankTransaction?.id,\n tax: value.tax,\n };\n}\n\nfunction getSchemaForTransactionType(transaction: BankTransaction) {\n switch (transaction.type) {\n case \"EXPENSE\":\n return expenseFormSchema;\n case \"BANK_TRANSFER\":\n return bankTransferFormSchema;\n case \"REVENUE\":\n return revenueFormSchema;\n case \"TAX_PAYMENT\":\n return taxPaymentFormSchema;\n default:\n return undefined;\n }\n}\n\nfunction useBankTransactionForm(transaction: Nullable<BankTransaction> | undefined) {\n const { mutate } = useSingleBankTransactionMutation();\n\n const defaultValues = transaction ? getDefaultValues(transaction) : bankTransactionFormEmptyDefaultValues;\n const schema = transaction ? getSchemaForTransactionType(transaction) : undefined;\n\n return useAppForm({\n defaultValues,\n validators: {\n onBlur: schema,\n },\n onSubmit: (data) => {\n // TODO: make sure this works with new manual transactions\n if (!transaction) {\n return;\n }\n mutate(createTransactionMutateObject(transaction.id, data.value));\n data.formApi.reset(data.value, { keepDefaultValues: true });\n },\n onSubmitInvalid: () => {},\n });\n}\n\nexport type { BankTransactionFormDefaultValues, ExpenseChild };\n\nexport { useBankTransactionForm, withForm, bankTransactionFormEmptyDefaultValues, useAppForm };\n","import { SmallIcon } from \"../../icon/SmallIcon.tsx\";\nimport { Check } from \"../../icon/icons/Check.tsx\";\nimport { ButtonTertiary } from \"../../inputs/ButtonTertiary.tsx\";\nimport { StrongLabel } from \"../../typography/StrongLabel.tsx\";\n\ntype SaveButtonProps = {\n showIcon?: boolean;\n textContent?: string;\n};\n\nfunction SaveButton({ showIcon = true, textContent = \"Save\" }: SaveButtonProps) {\n return (\n <ButtonTertiary type=\"submit\">\n {showIcon && (\n <SmallIcon\n Component={Check}\n />\n )}\n <StrongLabel>{textContent}</StrongLabel>\n </ButtonTertiary>\n );\n}\n\nexport {\n SaveButton,\n};\n","import { useRef } from \"react\";\nimport { useFieldContext } from \"./createFormHookContext.ts\";\nimport { DiscreteFormInput } from \"../../inputs/DiscreteFormInput\";\nimport { AmountInput } from \"../../inputs/AmountInput\";\nimport { Nullable } from \"../../../utils/utilityTypes.ts\";\n\ntype DiscreteAmountFieldProps = {\n label: string;\n};\n\nfunction DiscreteAmountField({ label }: DiscreteAmountFieldProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const field = useFieldContext<Nullable<number>>();\n return (\n <DiscreteFormInput inputRef={inputRef} label={label}>\n <AmountInput\n value={field.state.value}\n onChange={field.handleChange}\n inputRef={inputRef}\n />\n </DiscreteFormInput>\n );\n}\n\nexport { DiscreteAmountField };\n","import { BankAccount, useSingleBankAccount } from \"../../../query/fetches/banks/bankAccounts.ts\";\nimport {\n BankAccountExpanded,\n BankTransaction,\n GlAccountExpanded,\n} from \"../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { Nullable } from \"../../../utils/utilityTypes.ts\";\nimport { isManualTransaction } from \"../../../entities/transaction/transactions.ts\";\nimport { isNullish } from \"../../../utils/typeUtils.ts\";\nimport {\n getExpandedBankAccountFromFullBankAccount,\n} from \"../../../entities/bankAccounts.ts\";\nimport { BankAccountSelector } from \"./BankAccountSelector.tsx\";\nimport { useFieldContext } from \"./createFormHookContext.ts\";\n\ntype BankAccountProps = {\n transaction?: Nullable<BankTransaction>;\n};\n\nfunction BankAccountField({ transaction }: BankAccountProps) {\n const { state: { value }, handleChange } = useFieldContext<BankAccountExpanded | GlAccountExpanded>();\n\n const handleBankAccountChange = (bankAccount: BankAccount) => {\n handleChange(getExpandedBankAccountFromFullBankAccount(bankAccount));\n };\n\n const fullBankAccount = useSingleBankAccount(value.id);\n\n const disabled = isNullish(transaction) || !isManualTransaction(transaction);\n\n return (\n <BankAccountSelector\n label=\"Bank Account\"\n disabled={disabled}\n onClick={handleBankAccountChange}\n bankAccount={fullBankAccount}\n />\n );\n}\n\nexport { BankAccountField };\n","import { Nullable } from \"../../../../utils/utilityTypes.ts\";\nimport { useFlatGlAccountsWithLeaves } from \"../../../../query/fetches/generalLedger/glAccounts.ts\";\nimport {\n BankAccount,\n useSingleBankAccountByGlAccountId,\n} from \"../../../../query/fetches/banks/bankAccounts.ts\";\nimport {\n findGlAccountByBankAccount,\n getExpandedGlAccountFromFullGlAccount,\n} from \"../../../../entities/transaction/glAccounts.ts\";\nimport { BankAccountSelector } from \"../BankAccountSelector.tsx\";\nimport {\n BankAccountExpanded,\n BankTransaction,\n GlAccountExpanded,\n} from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { useFieldContext } from \"../createFormHookContext.ts\";\nimport { getBankTransferDirection } from \"../../../../entities/bankAccounts.ts\";\n\ntype BankAccountProps = {\n transaction?: Nullable<BankTransaction>;\n};\n\nfunction BankGlAccountField({ transaction }: BankAccountProps) {\n const { state: { value }, handleChange } = useFieldContext<BankAccountExpanded | GlAccountExpanded>();\n const { query: { data: glAccounts } } = useFlatGlAccountsWithLeaves();\n\n const handleGlAccountChange = (bankAccount: BankAccount) => {\n const glAccountFromBankAccount = findGlAccountByBankAccount(glAccounts, bankAccount);\n if (glAccountFromBankAccount) {\n handleChange(getExpandedGlAccountFromFullGlAccount(glAccountFromBankAccount));\n }\n };\n // TODO: For payouts, value can be null here which causes a crash. Investigate and fix this.\n const { query: { data: fullBankAccount } } = useSingleBankAccountByGlAccountId(value?.id);\n\n // TODO: label direction should be based on transaction type (withdrawal or deposit) once available from API\n const label = transaction ? getBankTransferDirection(transaction.amount) : \"\";\n\n return (\n <BankAccountSelector\n label={label}\n onClick={handleGlAccountChange}\n bankAccount={fullBankAccount}\n />\n );\n}\n\nexport { BankGlAccountField };\n","import { EditableFormInput } from \"../../inputs/EditableFormInput.tsx\";\nimport { LabeledValue } from \"../../../utils/object/objTypes.ts\";\nimport { useFieldContext } from \"./createFormHookContext.ts\";\nimport { ButtonGrid } from \"../../inputs/buttonGroup/ButtonGrid.tsx\";\n\nfunction ButtonGroupField({ label, options }: { label: string; options: LabeledValue[] }) {\n const field = useFieldContext<string>();\n const handleClick = (option: LabeledValue) => {\n field.handleChange(option.value.toString());\n };\n const selected = options.find(option => option.value === field.state.value);\n return (\n <EditableFormInput label={label} disableHover>\n <ButtonGrid\n options={options}\n selected={selected}\n handleClick={handleClick}\n rows={1}\n cols={options.length}\n />\n </EditableFormInput>\n );\n}\n\nexport { ButtonGroupField };\n","import * as React from \"react\";\nconst SvgTrash = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 16, viewBox: \"0 0 15 15\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M10.6196 14.2124H4.3803C4.06894 14.2128 3.7693 14.0937 3.54327 13.8795C3.31724 13.6654 3.18207 13.3726 3.16568 13.0617L2.61591 3.22968H12.384L11.8342 13.0617C11.8179 13.3726 11.6827 13.6654 11.4567 13.8795C11.2306 14.0937 10.931 14.2128 10.6196 14.2124Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M1.3949 3.22968H13.605\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M6.27894 0.787598H8.72097C9.0448 0.787598 9.35537 0.91624 9.58435 1.14522C9.81334 1.37421 9.94198 1.68478 9.94198 2.00861V3.22963H5.05792V2.00861C5.05792 1.68478 5.18656 1.37421 5.41555 1.14522C5.64453 0.91624 5.9551 0.787598 6.27894 0.787598Z\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M9.09821 5.05792V12.384\", stroke: \"#182428\", strokeMiterlimit: 10 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M5.90167 5.05792V12.384\", stroke: \"#182428\", strokeMiterlimit: 10 }));\nexport default SvgTrash;\n","import IconComponent from \"../../../assets/icons/trash.svg?react\";\nimport { createIcon } from \"../createIcon.tsx\";\n\nconst Delete = createIcon(IconComponent, \"Delete\");\n\nexport { Delete };\n","import { bankTransactionFormEmptyDefaultValues, withForm } from \"../../useBankTransactionForm.ts\";\nimport { MediumIcon } from \"../../../../icon/MediumIcon.tsx\";\nimport { Delete } from \"../../../../icon/icons/Delete.tsx\";\nimport { stylist } from \"../../../../../style/stylist.ts\";\nimport { css } from \"../../../../../../styled-system/css\";\nimport { fadeIcon } from \"../../../../../style/transition.ts\";\n\nconst splitRowStylist = stylist(null, css({\n position: \"relative\",\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n outline: \"none\",\n border: \"none\",\n background: \"none\",\n padding: \"15px 0px\",\n gap: \"15px\",\n width: \"100%\",\n}));\n\nconst dividerStylist = stylist(null, css({\n backgroundColor: \"border.layout\",\n height: \"25px\",\n width: \"1px\",\n margin: 0,\n}));\n\nconst horizontalDividerStylist = stylist(null, css({\n backgroundColor: \"border.layout\",\n height: \"1px\",\n width: \"100%\",\n}));\n\nconst removeButtonStylist = stylist(null, css({\n background: \"none\",\n border: \"none\",\n outline: \"none\",\n marginLeft: \"auto\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"4px\",\n borderRadius: \"md\",\n cursor: \"pointer\",\n \"&:focus-visible\": {\n outline: \"4px solid\",\n outlineColor: \"border.layout\",\n },\n \"&:hover\": {\n \"& svg\": {\n \"& path\": {\n stroke: \"icon.accent.danger\",\n },\n },\n },\n}), fadeIcon);\n\nconst amountContainerStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: \"15px\",\n}));\n\ntype SplitExpenseRowProps = {\n index: number;\n numRows: number;\n removeSplit: (index: number) => void;\n};\n\nconst defaultProps: SplitExpenseRowProps = {\n index: 0,\n numRows: 1,\n removeSplit: () => {},\n};\n\nconst SplitExpenseRow = withForm({\n defaultValues: bankTransactionFormEmptyDefaultValues,\n props: defaultProps,\n render: function SplitExpenseRowRender({ form, index, numRows, removeSplit }) {\n return (\n <>\n <div {...splitRowStylist}>\n <form.AppField name={`children[${index}].category`}>\n {subField => (\n // TODO: determine if theres any difference between passing field fields as props or using useFieldContext\n <subField.SplitExpenseCategoryField\n value={subField.state.value}\n onChange={subField.handleChange}\n />\n )}\n </form.AppField>\n <div {...amountContainerStylist}>\n <div {...dividerStylist} />\n <form.AppField name={`children[${index}].amount`}>\n {subField => (\n <subField.SplitExpenseAmountField\n value={subField.state.value}\n onChange={subField.handleChange}\n onBlur={subField.handleBlur}\n />\n )}\n </form.AppField>\n <button onClick={() => removeSplit(index)} {...removeButtonStylist}><MediumIcon Component={Delete} /></button>\n </div>\n </div>\n {index < numRows - 1 && <div {...horizontalDividerStylist} />}\n </>\n );\n },\n});\n\nexport { SplitExpenseRow };\n","import { stylist } from \"../../../../../style/stylist\";\nimport { css } from \"../../../../../../styled-system/css\";\nimport { bankTransactionFormEmptyDefaultValues, withForm } from \"../../useBankTransactionForm\";\nimport { SubLabel } from \"../../../../typography/SubLabel\";\nimport { ErrorLabel } from \"../../ErrorLabel.tsx\";\nimport { useStore } from \"@tanstack/react-form\";\nimport { SplitExpenseRow } from \"./SplitExpenseRow.tsx\";\nimport { AddSplitButton } from \"./AddSplitButton.tsx\";\nimport { getLast } from \"../../../../../utils/array/array.ts\";\n\nconst splitRowContainerStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n outline: \"none\",\n border: \"none\",\n background: \"none\",\n}));\n\nconst splitContainerClassName = css({\n backgroundColor: \"surface.foreground\",\n border: \"{borderWidths.lg} solid\",\n borderRadius: \"md\",\n borderColor: \"border.layout.strong\",\n display: \"flex\",\n flexDirection: \"column\",\n padding: \"12px 16px\",\n cursor: \"pointer\",\n outline: \"none\",\n});\n\nconst borderClassName = css({ borderColor: \"border.intent.danger\" });\n\nconst SplitExpenseSection = withForm({\n defaultValues: bankTransactionFormEmptyDefaultValues,\n render: function SplitExpenseSectionRender({ form }) {\n const errorMessage = useStore(form.store, (state) => {\n const errorObjects = state.errors?.[0] ?? {};\n const allErrors = Object.values(errorObjects).flat();\n\n const validErrors = allErrors.filter((error): error is { message: string } =>\n typeof error === \"object\" && error !== null && \"message\" in error,\n );\n\n return validErrors[0]?.message;\n });\n const splitContainerStylist = stylist(\n null,\n splitContainerClassName,\n errorMessage ? borderClassName : undefined,\n );\n return (\n <>\n <div {...splitContainerStylist}>\n <SubLabel>Category</SubLabel>\n <form.AppField name=\"children\" mode=\"array\">\n {(field) => {\n const removeSplit = (index: number) => {\n field.removeValue(index);\n if (field.state.value.length === 1) {\n form.setFieldValue(\"category\", field.state.value[0].category);\n field.removeValue(0);\n }\n form.validate(\"blur\");\n };\n return (\n <div {...splitRowContainerStylist}>\n {field.state.value.map((expenseChild, i: number) => (\n <SplitExpenseRow\n form={form}\n index={i}\n key={`${expenseChild?.category?.id}-${i}`}\n numRows={field.state.value.length}\n removeSplit={removeSplit}\n />\n ))}\n <AddSplitButton\n onClick={() => {\n const lastSplitCategory = getLast(field.state.value)?.category;\n const lastSplitClassSegments = getLast(field.state.value)?.classSegments;\n const lastGlAccount = getLast(field.state.value)?.glAccount;\n field.pushValue({\n amount: 0,\n category: lastSplitCategory || { id: \"\", name: \"\" },\n glAccount: lastGlAccount || { id: \"\" },\n classSegments: lastSplitClassSegments || [],\n });\n }}\n />\n </div>\n );\n }}\n </form.AppField>\n </div>\n {errorMessage && <ErrorLabel errorMessage={errorMessage} />}\n </>\n );\n },\n});\n\nexport { SplitExpenseSection };\n","import { bankTransactionFormEmptyDefaultValues, withForm } from \"../useBankTransactionForm\";\nimport { SplitExpenseSection } from \"./splitExpense/SplitExpenseSection\";\nimport { useStore } from \"@tanstack/react-form\";\n\nconst ExpenseCategorySection = withForm({\n defaultValues: bankTransactionFormEmptyDefaultValues,\n render: function ExpenseCategorySectionRender({ form }) {\n const totalAmount = useStore(form.store, state => state.values.amount) ?? 0;\n return (\n <form.Subscribe selector={state => state.values.children}>\n {(children) => {\n return !Array.isArray(children) || children.length === 0\n ? (\n <form.AppField name=\"children\" mode=\"array\">\n {childrenField => (\n <form.AppField name=\"category\">\n {field => (\n <field.ExpenseCategoryField\n category={field.state.value}\n glAccount={form.state.values.glAccount}\n onClick={field.handleChange}\n childrenField={childrenField}\n totalAmount={totalAmount}\n />\n )}\n </form.AppField>\n )}\n </form.AppField>\n )\n : <SplitExpenseSection form={form} />;\n }}\n </form.Subscribe>\n );\n },\n});\n\nexport { ExpenseCategorySection };\n","import { PropsWithChildren, useEffect, useRef } from \"react\";\nimport { css } from \"../../../styled-system/css\";\nimport { stylist } from \"../../style/stylist.ts\";\n\ntype DrawerProps = PropsWithChildren;\n\nconst drawerStylist = stylist(null, css({\n position: \"absolute\",\n right: 0,\n top: 0,\n height: \"100%\",\n maxHeight: \"100%\",\n maxWidth: \"100%\",\n backgroundColor: \"surface.background\",\n width: \"512px\",\n minWidth: \"fit-content\",\n display: \"flex\",\n _focus: {\n outline: \"none\", // prevents the blue border from appearing when form mounts\n },\n}));\n\nfunction Drawer({ children }: DrawerProps) {\n const focusRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n focusRef.current?.focus();\n }, []);\n\n return (\n <div ref={focusRef} tabIndex={-1} {...drawerStylist}>\n {children}\n </div>\n );\n}\n\nexport { Drawer };\n","import { stylist } from \"../../../../style/stylist.ts\";\nimport { css } from \"../../../../../styled-system/css\";\nimport { PropsWithChildren } from \"react\";\n\ntype FormSidePanelNavigationProps = PropsWithChildren;\n\nconst sidePanelStylist = stylist(null, css({\n display: \"flex\",\n backgroundColor: \"surface.foreground\",\n flexDirection: \"column\",\n height: \"100%\",\n maxHeight: \"100%\",\n overflowY: \"auto\",\n overflowX: \"hidden\",\n minWidth: \"fit-content\",\n borderLeft: \"1px solid {colors.border.layout.strong}\",\n justifyContent: \"flex-start\",\n alignItems: \"center\",\n padding: 5,\n gap: \"10px\",\n}));\n\nfunction FormSidePanelNavigation({ children }: FormSidePanelNavigationProps) {\n return (\n <div tabIndex={-1} {...sidePanelStylist}>\n {children}\n </div>\n );\n}\n\nexport { FormSidePanelNavigation };\n","import { LargeIcon } from \"../../../icon/LargeIcon.tsx\";\nimport { ButtonDiscreteSmall } from \"../../../inputs/ButtonDiscreteSmall.tsx\";\nimport type { CreateIconReturn } from \"../../../icon/createIcon.tsx\";\nimport { MouseEvent } from \"react\";\n\ntype FormNavigationButtonProps = {\n icon: CreateIconReturn;\n active?: boolean;\n onClick?: (event: MouseEvent<HTMLButtonElement>) => void;\n ariaLabel?: string;\n};\n\nfunction FormNavigationButton({ active, icon, onClick, ariaLabel }: FormNavigationButtonProps) {\n return (\n <ButtonDiscreteSmall ariaLabel={ariaLabel} onClick={onClick} active={active}>\n <LargeIcon Component={icon} />\n </ButtonDiscreteSmall>\n );\n}\n\nexport { FormNavigationButton };\n","import { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { PropsWithChildren } from \"react\";\n\ntype ConversationContainerProps = PropsWithChildren;\n\nconst conversationContainerStylist = stylist(null, css({\n display: \"flex\",\n height: \"100%\",\n maxHeight: \"100%\",\n minHeight: 0,\n flexDirection: \"column\",\n width: \"512px\",\n overflow: \"hidden\",\n}));\n\n/**\n * A column layout component for a conversation\n * @param children\n * @constructor\n */\nfunction ConversationContainer({ children }: ConversationContainerProps) {\n return (\n <div {...conversationContainerStylist}>\n { children }\n </div>\n );\n};\n\nexport { ConversationContainer };\n","import { ValueOf } from \"../../../utils/utilityTypes.ts\";\n\n// uses unicode to ensure consistency across encodings, etc\nconst emojiMap = Object.freeze({\n thumbs_up: \"\\u{1F44D}\", // 👍\n thumbs_down: \"\\u{1F44E}\", // 👎\n red_heart: \"\\u{2764}\\u{FE0F}\", // ❤️\n hundred_points: \"\\u{1F4AF}\", // 💯\n eyes: \"\\u{1F440}\", // 👀\n} as const);\n\ntype CldrShortName = keyof typeof emojiMap;\ntype ReactionEmoji = ValueOf<typeof emojiMap>;\n\nfunction isCldrShortName(cldrShortName: string): cldrShortName is CldrShortName {\n return emojiMap[cldrShortName as CldrShortName] !== undefined;\n}\n\n/**\n * Provides a partial mapping of [CLDR Short Names](https://unicode-org.github.io/emoji/emoji/format.html#col-name) to\n * a Unicode Emoji.\n * @param cldrShortName\n */\nfunction toEmoji(cldrShortName: CldrShortName): ReactionEmoji {\n return emojiMap[cldrShortName];\n}\n\nexport {\n isCldrShortName,\n toEmoji,\n emojiMap,\n};\n\nexport type {\n CldrShortName,\n ReactionEmoji,\n};\n","import * as React from \"react\";\nconst SvgThumbsUp = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Layer_1\", \"data-name\": \"Layer 1\", xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 24 24\", strokeWidth: 1.5, width: 24, height: 24, ...props }, /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"style\", null, \".cls-63ce7444ea57ea6c838005ed-1{fill:none;stroke:currentColor;stroke-miterlimit:10;}\")), /* @__PURE__ */ React.createElement(\"path\", { className: \"cls-63ce7444ea57ea6c838005ed-1\", d: \"M6.27,21.55H8.5l2.33.95h7.92a2.86,2.86,0,0,0,2.85-2.59l.88-9.13c0-.14,0-.28,0-.42h0a2.18,2.18,0,0,0-2.18-2.18H15.63l.52-1.09a6.27,6.27,0,0,0,.62-2.73h0A2.86,2.86,0,0,0,13.91,1.5h0A1.9,1.9,0,0,0,12,3.41h0a6,6,0,0,1-1.25,3.66l-2.33,3H6.27\" }), /* @__PURE__ */ React.createElement(\"rect\", { className: \"cls-63ce7444ea57ea6c838005ed-1\", x: 1.5, y: 9.14, width: 4.77, height: 13.36 }));\nexport default SvgThumbsUp;\n","import IconComponent from \"../../../../assets/icons/thumbs-up.svg?react\";\nimport { createIcon } from \"../../createIcon.tsx\";\n\nconst ThumbsUp = createIcon(IconComponent, \"ThumbsUp\");\n\nexport { ThumbsUp };\n","import { CldrShortName, toEmoji } from \"./toEmoji.ts\";\nimport { css } from \"../../../../styled-system/css\";\n\nconst reactionCss = css({\n fontSize: \"26px\",\n lineHeight: \"26px\",\n width: \"26px\",\n userSelect: \"none\",\n});\n\ntype ReactionProps = {\n cldrShortName: CldrShortName;\n};\n\nfunction Reaction({ cldrShortName }: ReactionProps) {\n return (\n <div className={reactionCss}>\n {toEmoji(cldrShortName)}\n </div>\n );\n}\n\nexport { Reaction };\n","import { css, cva, RecipeVariant } from \"../../../../styled-system/css\";\nimport { Reaction } from \"./Reaction.tsx\";\nimport { CldrShortName } from \"./toEmoji.ts\";\nimport { ReactionSummaryDto } from \"../../../query/fetches/conversations/reactions.ts\";\n\ntype ReactionContainerProps = {\n reactions: ReactionSummaryDto[];\n type: RecipeVariant<typeof buttonCss>[\"type\"];\n handleClick: (cldrShortName: CldrShortName) => void;\n};\n\nconst buttonCss = cva({\n base: {\n padding: 0,\n border: \"none\",\n outline: \"none\",\n },\n variants: {\n type: {\n sent: {\n cursor: \"default\",\n },\n received: {\n cursor: \"pointer\",\n },\n },\n },\n});\n\nconst reactionsCss = css({\n display: \"flex\",\n gap: \"4px\",\n backgroundColor: \"surface.elevated\",\n borderRadius: \"sm\",\n borderWidth: \"sm\",\n borderColor: \"border.layout\",\n borderStyle: \"solid\",\n padding: \"4px 8px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n scrollbar: \"hidden\",\n overflow: \"hidden\",\n});\n\nfunction ReactionContainer({ reactions, type, handleClick }: ReactionContainerProps) {\n return (\n <div className={reactionsCss}>\n {reactions.map((reaction, index) => (\n <button\n className={buttonCss({ type })}\n key={`${reaction.emojiCode}_${index}`}\n onClick={type === \"received\" ? () => handleClick(reaction.emojiCode) : undefined}\n >\n <Reaction cldrShortName={reaction.emojiCode} />\n </button>\n ))}\n </div>\n );\n}\n\nexport { ReactionContainer };\n\nexport type { ReactionContainerProps };\n","import { v6EntityPost, V6EntityPostRequest } from \"../../http/post.ts\";\nimport { getV6EndpointManager } from \"../../versions/v6/v6EndpointManager.ts\";\nimport { EntityMutationFn } from \"../../mutations/useEntityMutation.ts\";\nimport { components, operations } from \"../../versions/v6/v6Schema.ts\";\n\n/** IMPORTANT:\n * This is the only place you should reference the API schema directly for reaction mutations.\n * Alias any types you need in this file, then export them.\n * This will make it easier to refactor as the API changes.\n */\n\ntype ReactionSummaryDto = components[\"schemas\"][\"ReactionSummaryDto\"];\ntype ReactionResponse = components[\"schemas\"][\"ResponseReactionDto\"];\ntype ReactionSuccessResponse = NonNullable<ReactionResponse[\"data\"]>;\n\ntype AddReactionParams = operations[\"addReaction\"][\"parameters\"][\"path\"];\n\nconst createReaction: EntityMutationFn<ReactionSuccessResponse, AddReactionParams> = async ({ data, accessToken, environment }) => {\n const { id, emojiCode } = data;\n\n const params: V6EntityPostRequest<undefined, AddReactionParams> = {\n path: \"/v6/messages/{id}/reactions/{emojiCode}\",\n pathParams: { id, emojiCode },\n accessToken,\n method: \"POST\",\n endpointManager: getV6EndpointManager(environment),\n };\n\n return await v6EntityPost<ReactionSuccessResponse, undefined, AddReactionParams>(params);\n};\n\ntype RemoveReactionParams = operations[\"removeReaction\"][\"parameters\"][\"path\"];\n\nconst deleteReaction: EntityMutationFn<ReactionSuccessResponse, RemoveReactionParams> = async ({ data, accessToken, environment }) => {\n const { id, emojiCode } = data;\n\n const params: V6EntityPostRequest<undefined, RemoveReactionParams> = {\n path: \"/v6/messages/{id}/reactions/{emojiCode}\",\n pathParams: { id, emojiCode },\n accessToken,\n method: \"DELETE\",\n endpointManager: getV6EndpointManager(environment),\n };\n\n return await v6EntityPost<ReactionSuccessResponse, undefined, RemoveReactionParams>(params);\n};\n\nexport {\n createReaction,\n deleteReaction,\n};\n\nexport type {\n ReactionSuccessResponse,\n ReactionSummaryDto,\n AddReactionParams,\n RemoveReactionParams,\n};\n","import { TightEnvironment } from \"../../../utils/traxEnvironmentVariables.ts\";\nimport { MessageGetDto, messagesKeys } from \"../../fetches/conversations/messages.ts\";\nimport { getInjectedParamsQueryKey } from \"../../fetches/utils/queryKey.ts\";\nimport { queryClient } from \"../../queryClient.ts\";\nimport { useContext } from \"react\";\nimport { UserContext } from \"../../../userContext/userContext.ts\";\nimport { useEntityMutation, UseEntityMutationOptions } from \"../useEntityMutation.ts\";\nimport { breadcrumb, notify } from \"../../../utils/logging.ts\";\nimport {\n createReaction, deleteReaction,\n AddReactionParams, RemoveReactionParams,\n ReactionSuccessResponse,\n} from \"../../fetches/conversations/reactions.ts\";\nimport { isNullish } from \"../../../utils/typeUtils.ts\";\nimport { ConversationGetDto } from \"../../fetches/conversations/conversations.ts\";\nimport { UserInfoGetDto } from \"../../fetches/userInfo/userInfo.ts\";\n\nfunction getMessageQueryKey(conversationId: ConversationGetDto[\"id\"], accessToken: string, environment: TightEnvironment) {\n const baseQueryKey = messagesKeys.of({ id: conversationId });\n return getInjectedParamsQueryKey(baseQueryKey, accessToken, environment);\n}\n\nasync function invalidateQueriesOnSuccess(conversationId: ConversationGetDto[\"id\"]) {\n const keysToInvalidate = messagesKeys.of({ id: conversationId });\n breadcrumb(\"mutation successful, invalidating messages queries\");\n return queryClient.invalidateQueries({ queryKey: keysToInvalidate })\n .catch(error => notify({ error, severity: \"error\" }));\n}\n\nfunction getCopyOfUpdatedMessages(messages: MessageGetDto[], message: MessageGetDto, messageIndex: number) {\n const newMessages = [...messages];\n newMessages[messageIndex] = message;\n return newMessages;\n}\n\nfunction addReactionToMessage(message: MessageGetDto, data: AddReactionParams, userId: string, userEmail: string) {\n return {\n ...message,\n reactions: [\n ...(message.reactions),\n {\n emojiCode: data.emojiCode,\n authorInfo: [{ userId: userId, email: userEmail }],\n },\n ],\n };\n}\n\ntype CreateReactionOnMutateProps = {\n data: AddReactionParams;\n accessToken: string;\n conversationId: ConversationGetDto[\"id\"];\n environment: TightEnvironment;\n userId: NonNullable<UserInfoGetDto[\"userId\"]>;\n userEmail: NonNullable<UserInfoGetDto[\"email\"]>;\n};\n\nasync function createReactionOnMutate({ data, accessToken, conversationId, environment, userId, userEmail }: CreateReactionOnMutateProps) {\n const queryKey = getMessageQueryKey(conversationId, accessToken, environment);\n\n await queryClient.cancelQueries({ queryKey });\n const oldMessages = queryClient.getQueryData<MessageGetDto[]>(queryKey);\n\n queryClient.setQueryData(queryKey, (currentMessages: MessageGetDto[]) => {\n const messageIndex = currentMessages.findIndex(message => message.id === data.id);\n\n if (messageIndex === -1) {\n return currentMessages;\n }\n\n const message = currentMessages[messageIndex];\n const newMessage = addReactionToMessage(message, data, userId, userEmail);\n return getCopyOfUpdatedMessages(currentMessages, newMessage, messageIndex);\n });\n\n return { oldMessages };\n}\n\n/**\n * Use this hook to create a reaction on a message.\n * @returns A tanstack mutation object for creating reactions\n */\nfunction useCreateReactionMutation(conversationId: ConversationGetDto[\"id\"]) {\n const { userId, userEmail } = useContext(UserContext);\n\n const options: UseEntityMutationOptions<ReactionSuccessResponse, AddReactionParams> = {\n mutationFn: createReaction,\n onMutateFn: ({ data, accessToken, environment }) => {\n if (userId === undefined) {\n return;\n }\n // @ts-expect-error OAS generated with backend is out of sync with backend code for userEmail\n return createReactionOnMutate({ data, accessToken, conversationId, environment, userId: userId, userEmail: userEmail });\n },\n onSettled: () => invalidateQueriesOnSuccess(conversationId),\n };\n\n return useEntityMutation(options);\n}\n\nfunction removeReactionFromMessage(message: MessageGetDto, emojiCode: string, userId: string) {\n const modifiedReactions = message.reactions.filter(reaction => (\n reaction.emojiCode !== emojiCode || !reaction.authorInfo.some(author => author.userId === userId)\n ));\n return {\n ...message,\n reactions: modifiedReactions,\n };\n}\n\nasync function deleteReactionOnMutate({ data, accessToken, conversationId, environment, userId }: { data: RemoveReactionParams; accessToken: string; conversationId: ConversationGetDto[\"id\"]; environment: TightEnvironment; userId: string }) {\n const queryKey = getMessageQueryKey(conversationId, accessToken, environment);\n\n await queryClient.cancelQueries({ queryKey });\n const oldMessages = queryClient.getQueryData<MessageGetDto[]>(queryKey);\n\n queryClient.setQueryData(queryKey, (currentMessages: MessageGetDto[]) => {\n const messageIndex = currentMessages.findIndex(message => message.id === data.id);\n const message = currentMessages[messageIndex];\n const hasNoReactions = isNullish(message) || message.reactions.length === 0;\n\n if (hasNoReactions) {\n return currentMessages;\n }\n\n const newMessage = removeReactionFromMessage(message, data.emojiCode, userId);\n return getCopyOfUpdatedMessages(currentMessages, newMessage, messageIndex);\n });\n\n return { oldMessages };\n}\n\n/**\n * Use this hook to delete a reaction from a message.\n * @returns A tanstack mutation object for deleting reactions\n */\nfunction useDeleteReactionMutation(conversationId: ConversationGetDto[\"id\"]) {\n const { userId } = useContext(UserContext);\n\n return useEntityMutation({\n mutationFn: deleteReaction,\n onMutateFn: ({ data, accessToken, environment }) => {\n if (userId === undefined) {\n return;\n }\n\n return deleteReactionOnMutate({ data, accessToken, conversationId, environment, userId });\n },\n onSettled: () => invalidateQueriesOnSuccess(conversationId),\n });\n}\n\nexport {\n useCreateReactionMutation,\n useDeleteReactionMutation,\n};\n","import { MediumIcon } from \"../../icon/MediumIcon.tsx\";\nimport { css } from \"../../../../styled-system/css\";\nimport { ThumbsUp } from \"../../icon/icons/category/ThumbsUp.tsx\";\nimport { PopupManager } from \"../../popup/PopupManager.tsx\";\nimport { PopupTrigger } from \"../../popup/PopupTrigger.tsx\";\nimport { Popup } from \"../../popup/Popup.tsx\";\nimport { ReactionContainer, ReactionContainerProps } from \"./ReactionContainer.tsx\";\nimport { Dispatch, SetStateAction, useContext } from \"react\";\nimport { ReactionSummaryDto } from \"../../../query/fetches/conversations/reactions.ts\";\nimport { UserContext } from \"../../../userContext/userContext.ts\";\nimport { CldrShortName, emojiMap, isCldrShortName } from \"./toEmoji.ts\";\nimport { ConversationGetDto } from \"../../../query/fetches/conversations/conversations.ts\";\nimport { MessageGetDto } from \"../../../query/fetches/conversations/messages.ts\";\nimport { useCreateReactionMutation } from \"../../../query/mutations/conversations/reactionsMutations.ts\";\n\nconst reactionButtonCss = css({\n backgroundColor: \"surface.elevated\",\n borderRadius: \"sm\",\n borderWidth: \"sm\",\n borderColor: \"border.layout\",\n borderStyle: \"solid\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: \"8px\",\n cursor: \"pointer\",\n});\n\ntype AddReactionButtonProps = {\n conversationId: ConversationGetDto[\"id\"];\n messageId: MessageGetDto[\"id\"];\n type: ReactionContainerProps[\"type\"];\n reactions: ReactionSummaryDto[];\n reactionIsOpen: boolean;\n setReactionIsOpen: Dispatch<SetStateAction<boolean>>;\n};\n\nconst allReactions: ReactionSummaryDto[] = Object.keys(emojiMap).filter(isCldrShortName).map(emoji => ({\n emojiCode: emoji,\n authorInfo: [],\n}));\n\nfunction AddReactionButton({ conversationId, messageId, type, reactions, reactionIsOpen, setReactionIsOpen }: AddReactionButtonProps) {\n const { userId } = useContext(UserContext);\n const { mutate } = useCreateReactionMutation(conversationId);\n\n const handleClick = (cldrShortName: CldrShortName) => {\n const userAlreadyHasChosenReaction = reactions.some((reaction) => {\n const isSameEmoji = reaction.emojiCode === cldrShortName;\n const isSameUser = reaction.authorInfo.some(author => author.userId === userId);\n return isSameEmoji && isSameUser;\n });\n\n if (userAlreadyHasChosenReaction) {\n return;\n }\n mutate({ id: messageId, emojiCode: cldrShortName });\n setReactionIsOpen(false);\n };\n\n return (\n <PopupManager placement=\"top-end\" open={reactionIsOpen} onOpenChange={setReactionIsOpen} blockInteraction>\n <PopupTrigger>\n {props => (\n <button className={reactionButtonCss} {...props}>\n <MediumIcon Component={ThumbsUp} />\n </button>\n )}\n\n </PopupTrigger>\n <Popup type=\"reaction\">\n <ReactionContainer reactions={allReactions} type={type} handleClick={handleClick} />\n </Popup>\n </PopupManager>\n );\n};\n\nexport { AddReactionButton };\n","import { Dispatch, RefObject, SetStateAction, useEffect, useState } from \"react\";\n\nfunction useReactionPopupListener(containerRef: RefObject<HTMLDivElement>, isHover: boolean, setIsHover: Dispatch<SetStateAction<boolean>>, reactionIsOpen: boolean) {\n useEffect(() => {\n if (containerRef.current === null || !isHover || reactionIsOpen) {\n return;\n }\n\n const element = containerRef.current;\n\n const hidePopup = (e: MouseEvent) => {\n if (e.target !== element && !element.contains(e.target as Node)) {\n setIsHover(false);\n }\n };\n\n window.addEventListener(\"mousemove\", hidePopup);\n return () => {\n window.removeEventListener(\"mousemove\", hidePopup);\n };\n }, [isHover, containerRef, reactionIsOpen, setIsHover]);\n}\n\nfunction useMessageInteractions(containerRef: RefObject<HTMLDivElement>) {\n const [isHover, setIsHover] = useState(false);\n const [reactionIsOpen, setReactionIsOpen] = useState(false);\n useReactionPopupListener(containerRef, isHover, setIsHover, reactionIsOpen);\n\n return {\n isHover,\n reactionIsOpen,\n setIsHover,\n setReactionIsOpen,\n };\n}\n\nexport {\n useMessageInteractions,\n};\n","import { cva } from \"../../../../styled-system/css\";\nimport { ReactionContainer, ReactionContainerProps } from \"./ReactionContainer.tsx\";\n\nconst appliedReactionRecipe = cva({\n base: {\n position: \"absolute\",\n bottom: \"-25px\",\n },\n variants: {\n type: {\n sent: {\n right: \"2px\",\n },\n received: {\n left: \"2px\",\n },\n },\n },\n});\n\ntype AppliedReactionContainerProps = ReactionContainerProps;\n\nfunction AppliedReactionContainer({ reactions, type, handleClick }: AppliedReactionContainerProps) {\n const appliedReactionCss = appliedReactionRecipe({ type });\n return (\n <div className={appliedReactionCss}>\n <ReactionContainer reactions={reactions} handleClick={handleClick} type={type} />\n </div>\n );\n}\n\nexport { AppliedReactionContainer };\n","import { css, cva } from \"../../../styled-system/css\";\nimport { PropsWithChildren, useRef } from \"react\";\nimport { isCldrShortName } from \"./reactions/toEmoji.ts\";\nimport { AddReactionButton } from \"./reactions/AddReactionButton.tsx\";\nimport { useMessageInteractions } from \"./useMessageInteractions.ts\";\nimport { ReactionSummaryDto } from \"../../query/fetches/conversations/reactions.ts\";\nimport { useDeleteReactionMutation } from \"../../query/mutations/conversations/reactionsMutations.ts\";\nimport { ConversationGetDto } from \"../../query/fetches/conversations/conversations.ts\";\nimport { MessageGetDto } from \"../../query/fetches/conversations/messages.ts\";\nimport { AppliedReactionContainer } from \"./reactions/AppliedReactionContainer.tsx\";\n\ntype MessageProps = PropsWithChildren<{\n conversationId: ConversationGetDto[\"id\"];\n messageId: MessageGetDto[\"id\"];\n sentByCurrentUser: boolean;\n reactions?: ReactionSummaryDto[];\n}>;\n\nconst messagePositionCss = cva({\n base: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"10px\",\n },\n variants: {\n type: {\n sent: {\n flexDirection: \"row-reverse\",\n },\n received: {\n flexDirection: \"row\",\n },\n },\n hasReactionsOnMessage: {\n true: {\n marginBottom: \"18px\",\n },\n },\n },\n});\n\nconst messageCss = cva({\n base: {\n position: \"static\",\n display: \"flex\",\n maxWidth: 325,\n padding: \"12px 16px\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n borderRadius: \"md\",\n borderWidth: 1,\n borderStyle: \"solid\",\n flexShrink: 1,\n overflow: \"wrap\",\n wordBreak: \"break-word\",\n whiteSpace: \"pre-wrap\",\n },\n variants: {\n type: {\n sent: {\n color: \"typography.intent.primary\",\n borderColor: \"border.intent.primary\",\n backgroundColor: \"surface.intent.primary\",\n },\n received: {\n color: \"typography.base\",\n borderColor: \"border.layout\",\n backgroundColor: \"surface.foreground\",\n },\n },\n },\n});\n\nconst messageContainerCss = css({\n position: \"relative\",\n display: \"flex\",\n flexDirection: \"column\",\n});\n\nfunction Message({ conversationId, messageId, sentByCurrentUser, children, reactions = [] }: MessageProps) {\n const messageWithReactionRef = useRef<HTMLDivElement>(null);\n const { isHover, setIsHover, reactionIsOpen, setReactionIsOpen } = useMessageInteractions(messageWithReactionRef);\n const { mutate } = useDeleteReactionMutation(conversationId);\n\n const type = sentByCurrentUser ? \"sent\" : \"received\";\n const allowedReactions = reactions.filter(reaction => isCldrShortName(reaction.emojiCode));\n const hasReactionsOnMessage = allowedReactions.length > 0;\n\n return (\n <div\n className={messagePositionCss({ type, hasReactionsOnMessage })}\n ref={messageWithReactionRef}\n onMouseEnter={() => type === \"received\" && setIsHover(true)}\n >\n\n <div className={messageContainerCss}>\n <div className={messageCss({ type })}>\n {children}\n </div>\n\n {hasReactionsOnMessage && (\n <AppliedReactionContainer\n reactions={allowedReactions}\n type={type}\n handleClick={cldrShortName => mutate({ id: messageId, emojiCode: cldrShortName })}\n />\n )}\n </div>\n\n {isHover && (\n <AddReactionButton\n conversationId={conversationId}\n messageId={messageId}\n type={type}\n reactions={allowedReactions}\n reactionIsOpen={reactionIsOpen}\n setReactionIsOpen={setReactionIsOpen}\n />\n )}\n\n </div>\n );\n}\n\nexport { Message };\n","import { PropsWithChildren } from \"react\";\nimport { css } from \"../../../styled-system/css\";\nimport { stylist } from \"../../style/stylist.ts\";\n\ntype MessageGroupProps = PropsWithChildren;\n\nconst messageGroupStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"column-reverse\",\n justifyContent: \"center\",\n gap: \"10px\",\n alignSelf: \"stretch\",\n}));\n\nfunction MessageGroup({ children }: MessageGroupProps) {\n return (\n <div {...messageGroupStylist}>\n {children}\n </div>\n );\n}\n\nexport { MessageGroup };\n","import { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { PropsWithChildren, useEffect, useRef } from \"react\";\nimport { MessageGetDto } from \"../../query/fetches/conversations/messages.ts\";\n\ntype MessageLogProps = PropsWithChildren<{\n messageGroups: Array<MessageGetDto[]>;\n}>;\n\nconst messageLogStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"column-reverse\",\n alignItems: \"flex-start\",\n gap: \"26px\",\n flex: \"1 1 0%\",\n alignSelf: \"stretch\",\n overflow: \"scroll\",\n overflowX: \"hidden\",\n flexFlow: \"column\",\n padding: 15,\n scrollbarWidth: \"thin\",\n // maxHeight and marginBottom allow for the affect of scrolling behind the input\n maxHeight: \"calc(100% + 15px)\",\n marginBottom: \"-15px\",\n}));\n\nconst scrollReferenceCss = css({\n minHeight: 1, // necessary so that `gap` on parent applies at the bottom of the message log\n width: \"100%\",\n});\n\nconst scrollAttribute = \"data-hasscrolled\";\n\nfunction MessageLog({ messageGroups, children }: MessageLogProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (scrollRef.current !== null) {\n const isInitial = scrollRef.current.getAttribute(scrollAttribute) === null;\n const behavior = isInitial ? \"instant\" : \"smooth\";\n scrollRef.current.scrollIntoView({ behavior });\n scrollRef.current.setAttribute(scrollAttribute, \"true\");\n }\n }, [messageGroups]);\n\n return (\n <>\n <div tabIndex={-1} {...messageLogStylist}>\n <div className={scrollReferenceCss} ref={scrollRef}>{/* dummy div, for auto-scrolling */}</div>\n {children}\n </div>\n </>\n );\n}\n\nexport { MessageLog };\n","import { z } from \"zod\";\n\nconst messageFormSchema = z.object({\n message: z.string().refine(message => message !== \"\", {\n message: \"Required\",\n }),\n});\n\nexport { messageFormSchema };\n","import { useRef } from \"react\";\nimport { css } from \"../../../../styled-system/css\";\nimport { EditableFormInput } from \"../EditableFormInput.tsx\";\nimport { ButtonPrimary } from \"../ButtonPrimary.tsx\";\nimport { useFieldContext } from \"../../dashboards/forms/createFormHookContext.ts\";\nimport { messageFormSchema } from \"../../conversations/messageFormSchema.ts\";\nimport { MediumIcon } from \"../../icon/MediumIcon.tsx\";\nimport { Paperplane } from \"../../icon/icons/Paperplane.tsx\";\n\nconst sharedStyles = css.raw({\n maxHeight: 150,\n maxWidth: \"100%\",\n whiteSpace: \"pre-wrap\",\n overflowWrap: \"break-word\",\n width: \"100%\",\n boxSizing: \"border-box\",\n margin: 0,\n padding: 0,\n fontFamily: \"body\",\n});\n\nconst preRaw = css.raw({\n visibility: \"hidden\", // Hides the text in the pre element\n // Resets the default styles applied to <pre> to match those of a textarea\n fontSizeAdjust: \"none\",\n fontSize: \"100%\",\n fontStyle: \"normal\",\n letterSpacing: \"normal\",\n fontStretch: \"normal\",\n fontVariant: \"normal\",\n fontWeight: \"normal\",\n textAlign: \"left\",\n textAlignLast: \"initial\",\n textDecoration: \"none\",\n textEmphasis: \"none\",\n textIndent: \"0px\",\n textJustify: \"auto\",\n textShadow: \"none\",\n textTransform: \"none\",\n});\n\nconst preStyles = css(preRaw, sharedStyles);\n\nconst textAreaRaw = css.raw({\n resize: \"none\",\n inset: 0,\n outline: \"none\",\n overflow: \"auto\",\n position: \"absolute\",\n appearance: \"none\",\n border: \"none\",\n backgroundColor: \"transparent\",\n});\n\nconst textAreaCss = css(textAreaRaw, sharedStyles);\n\nconst inputWrapperCss = css({ display: \"block\", width: \"100%\" });\n\nconst referenceElementCss = css({ position: \"relative\" });\n\nconst footerCss = css({ display: \"flex\", justifyContent: \"flex-end\" });\n\nconst sendButtonCss = css({ paddingInline: \"8px\", display: \"flex\", alignItems: \"start\", justifyContent: \"center\" });\n\n/**\n * A form input that grows as you type inside it, to a max height.\n *\n * Implementation Note:\n * This input works by using a `<textarea>` to accept input and display text, and a `<pre>` element that invisibly\n * duplicates that text to set the layout. This is because `<textarea>` cannot automatically resize based on input.\n * In the event we need to support rich text, we can replace it with a `contenteditable`-based implementation instead.\n * @constructor\n */\nfunction MessageAreaInput({ blockSubmit = false }: { blockSubmit?: boolean }) {\n const field = useFieldContext<string>();\n const inputRef = useRef<HTMLTextAreaElement>(null);\n\n const canSubmit = !blockSubmit && messageFormSchema.safeParse(field.form.state.values).success;\n\n return (\n <EditableFormInput kind=\"text\" inputRef={inputRef} disableHover={true}>\n <div className={inputWrapperCss}>\n <div className={referenceElementCss}>\n <pre className={preStyles}>\n {field.state.value}\n {/* br accounts for blank newlines */}\n <br />\n </pre>\n <textarea\n ref={inputRef}\n placeholder=\"Message...\"\n value={field.state.value}\n className={textAreaCss}\n onChange={e => field.handleChange(e.target.value)}\n />\n </div>\n <div className={footerCss}>\n {/* TODO @nrfq: this will be updated to match the Figma styles on a future PR */}\n <ButtonPrimary disabled={!canSubmit} type=\"submit\">\n <span className={sendButtonCss}>\n <MediumIcon Component={Paperplane} />\n </span>\n </ButtonPrimary>\n </div>\n </div>\n </EditableFormInput>\n );\n}\n\nexport { MessageAreaInput };\n","import { createFormHook } from \"@tanstack/react-form\";\nimport { fieldContext, formContext } from \"../dashboards/forms/createFormHookContext.ts\";\nimport { MessageAreaInput } from \"../inputs/messageArea/MessageAreaInput.tsx\";\nimport { messageFormSchema } from \"./messageFormSchema.ts\";\nimport { Nullable } from \"../../utils/utilityTypes.ts\";\nimport { ConversationGetDto } from \"../../query/fetches/conversations/conversations.ts\";\n\ntype MessageFormValues = {\n message: string;\n // attachments: []\n};\n\nconst defaultValues: MessageFormValues = Object.freeze({\n message: \"\",\n});\n\nconst { useAppForm } = createFormHook({\n formContext,\n fieldContext,\n formComponents: {},\n fieldComponents: {\n MessageAreaInput,\n },\n});\n\ntype MessageFormOnSubmit = ({ value }: { value: MessageFormValues }) => void;\n\ntype UseConversationMessageFormOptions = {\n onSubmit: MessageFormOnSubmit;\n conversationId: Nullable<ConversationGetDto[\"id\"]>;\n};\n\nfunction useConversationMessageForm({ onSubmit }: UseConversationMessageFormOptions) {\n const form = useAppForm({\n defaultValues,\n onSubmit: (props) => {\n const canSubmit = messageFormSchema.safeParse(props.value).success;\n if (!canSubmit) {\n // instead of validators, returns early so that we don't show an error state\n return;\n }\n onSubmit(props);\n props.formApi.reset();\n },\n });\n\n return {\n form,\n };\n}\n\nexport type {\n MessageFormOnSubmit,\n};\n\nexport {\n useConversationMessageForm,\n};\n","import { KeyboardEvent } from \"react\";\nimport { MessageFormOnSubmit, useConversationMessageForm } from \"./useMessageForm.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { useRef } from \"react\";\nimport { Nullable } from \"../../utils/utilityTypes.ts\";\nimport { ConversationGetDto } from \"../../query/fetches/conversations/conversations.ts\";\n\ntype MessageFormProps = {\n addMessage: MessageFormOnSubmit;\n conversationId: Nullable<ConversationGetDto[\"id\"]>;\n blockSubmit: boolean;\n};\n\nconst messageFormCss = css({\n width: \"100%\",\n});\n\nfunction submitFormOnEnter(e: KeyboardEvent<HTMLFormElement>, formElement: Nullable<HTMLFormElement>, isConversationLoading: boolean) {\n if (!e.shiftKey && e.key === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n if (formElement !== null && !isConversationLoading) {\n const submitEvent = new SubmitEvent(\"submit\", { bubbles: true, cancelable: true });\n formElement.dispatchEvent(submitEvent);\n }\n }\n}\n\nfunction MessageForm({ conversationId, addMessage, blockSubmit }: MessageFormProps) {\n // TODO: add mutation when ready on backend\n const { form } = useConversationMessageForm({ onSubmit: addMessage, conversationId });\n const formRef = useRef<HTMLFormElement>(null);\n\n return (\n <form\n className={messageFormCss}\n ref={formRef}\n onKeyDown={e => submitFormOnEnter(e, formRef.current, blockSubmit)}\n onSubmit={(e) => {\n if (blockSubmit) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n return form.handleSubmit();\n }}\n >\n <form.AppField name=\"message\">\n {field => <field.MessageAreaInput blockSubmit={blockSubmit} />}\n </form.AppField>\n </form>\n );\n}\n\nexport { MessageForm };\n","import { TightEnvironment } from \"../../../utils/traxEnvironmentVariables.ts\";\nimport { getInjectedParamsQueryKey } from \"../../fetches/utils/queryKey.ts\";\nimport { queryClient } from \"../../queryClient.ts\";\nimport { useContext } from \"react\";\nimport { UserContext } from \"../../../userContext/userContext.ts\";\nimport { useEntityMutation, UseEntityMutationOptions } from \"../useEntityMutation.ts\";\nimport { breadcrumb, notify } from \"../../../utils/logging.ts\";\nimport {\n createMessage,\n CreateMessageResponse,\n MessageGetDto,\n MessagePostDto,\n messagesKeys,\n} from \"../../fetches/conversations/messages.ts\";\n\nfunction createPlaceholderMessage(message: MessagePostDto, userId: string | undefined): MessageGetDto {\n return {\n id: `placeholder_${message.conversationId}_${Date.now()}`,\n conversationId: message.conversationId,\n author: {\n userId: userId ?? \"placeholderUserId\",\n email: \"placeholderEmail\",\n },\n status: \"ACTIVE\",\n createdDateTime: \"\",\n lastUpdatedDateTime: \"\",\n text: message.text,\n reactions: [],\n };\n}\n\nasync function createMessageOnMutate({ data, accessToken, environment, userId }: { data: MessagePostDto; accessToken: string; environment: TightEnvironment; userId: string | undefined }) {\n const baseQueryKey = messagesKeys.of({ id: data.conversationId });\n const queryKey = getInjectedParamsQueryKey(baseQueryKey, accessToken, environment);\n\n await queryClient.cancelQueries({ queryKey });\n const oldMessages = queryClient.getQueryData<MessageGetDto[]>(queryKey);\n\n queryClient.setQueryData(queryKey, (old: MessageGetDto[]) => {\n return [createPlaceholderMessage(data, userId), ...old];\n });\n return { oldMessages };\n}\n\nasync function invalidateQueriesOnSuccess() {\n const keysToInvalidate = messagesKeys.all();\n breadcrumb(\"mutation successful, invalidating messages queries\");\n return queryClient.invalidateQueries({ queryKey: keysToInvalidate })\n .catch(error => notify({ error, severity: \"error\" }));\n}\n\n/**\n * Hook to create a new message in a conversation\n * @returns A tanstack query mutation object for creating messages\n */\nfunction useCreateMessageMutation() {\n const { userId } = useContext(UserContext);\n\n const options: UseEntityMutationOptions<CreateMessageResponse, MessagePostDto> = {\n mutationFn: createMessage,\n onMutateFn: ({ data, accessToken, environment }) => createMessageOnMutate({ data, accessToken, environment, userId }),\n onSettled: invalidateQueriesOnSuccess,\n };\n return useEntityMutation(options);\n}\n\nexport {\n useCreateMessageMutation,\n};\n","import { MessageLog } from \"../../conversations/MessageLog.tsx\";\nimport { MessageGroup } from \"../../conversations/MessageGroup.tsx\";\nimport { Message } from \"../../conversations/Message.tsx\";\n\ntype PlaceholderMessageProps = {\n isConversationLoading: boolean;\n message?: string;\n};\n\nfunction PlaceholderMessage({ isConversationLoading, message }: PlaceholderMessageProps) {\n return (\n <MessageLog messageGroups={[]}>\n {isConversationLoading && (\n <MessageGroup>\n <Message conversationId=\"\" messageId=\"\" sentByCurrentUser={true}>\n {message}\n </Message>\n </MessageGroup>\n )}\n </MessageLog>\n );\n}\n\nexport { PlaceholderMessage };\n","import { Dispatch, SetStateAction } from \"react\";\nimport { Nullable, RequireAtLeastOne } from \"../../../utils/utilityTypes.ts\";\nimport { EntityMutationFn, useEntityMutation, UseEntityMutationOptions } from \"../useEntityMutation.ts\";\nimport { isNotNullish, isNullish } from \"../../../utils/typeUtils.ts\";\nimport { breadcrumb, notify } from \"../../../utils/logging.ts\";\nimport { queryClient } from \"../../queryClient.ts\";\nimport {\n ConversationGetDto,\n ConversationPostDto,\n conversationsKeys,\n postConversations,\n PostConversationResponse,\n} from \"../../fetches/conversations/conversations.ts\";\nimport { BankTransaction, bankTransactionKeys } from \"../../fetches/transactions/bankTransactionQueries.ts\";\n\ntype UpdateConversationDto = { id: ConversationPostDto[\"id\"] } & RequireAtLeastOne<Partial<Omit<ConversationPostDto, \"id\">>>; // id and one or more other fields\n\nconst updateConversation: EntityMutationFn<PostConversationResponse, UpdateConversationDto[]> = async ({ data, accessToken, environment }) => {\n return postConversations({ data: { data }, accessToken, environment });\n};\n\n/**\n * Simple wrapper of updateConversations that expects a single conversation. Handles the array internally so devs don't have to\n * @param data a single UpdateConversationDto\n * @param accessToken\n * @param environment\n */\nconst updateSingleConversation: EntityMutationFn<PostConversationResponse, UpdateConversationDto> = async ({ data, accessToken, environment }) => {\n return updateConversation({ data: [data], accessToken, environment });\n};\n\n/**\n * Hook to update a single conversation.\n * Developers can define options that will apply to all singular conversation update mutations here\n * @returns A tanstack query mutation object for updating a single conversation\n */\nfunction useUpdateSingleConversationMutation() {\n const options: UseEntityMutationOptions<PostConversationResponse, UpdateConversationDto> = {\n mutationFn: updateSingleConversation,\n onSuccess: async () => {\n const keysToInvalidate = conversationsKeys.base();\n breadcrumb(\"mutation successful, invalidating conversations queries\");\n return queryClient.invalidateQueries({ queryKey: keysToInvalidate }).catch(error => notify({ error, severity: \"error\" }));\n },\n };\n return useEntityMutation(options);\n}\n\nconst postSingleConversation: EntityMutationFn<PostConversationResponse, ConversationPostDto> = async ({ data, accessToken, environment }) => {\n return postConversations({ data: { data: [data] }, accessToken, environment });\n};\n\n/**\n * Hook to create a new conversation\n * @returns A tanstack query mutation object for creating conversations\n */\nfunction useCreateSingleConversationMutation(setConversationId: Dispatch<SetStateAction<Nullable<ConversationGetDto[\"id\"]>>>, bankTransactionId?: BankTransaction[\"id\"]) {\n const options: UseEntityMutationOptions<PostConversationResponse, ConversationPostDto> = {\n mutationFn: postSingleConversation,\n onSuccess: (data) => {\n const conversationId = data.data?.[0]?.data?.id; // api is plural, we only post one, take the first response\n if (isNullish(data) || isNullish(conversationId)) {\n return;\n }\n\n setConversationId(conversationId);\n\n const conversationKeysToInvalidate = conversationsKeys.base();\n const allBankTransactionKeysToInvalidate = bankTransactionKeys.all();\n const btnInvalidate = async () => {\n if (isNotNullish(bankTransactionId)) {\n const btnKeyParams = { id: bankTransactionId };\n const singleBankTransactionKeysToInvalidate = bankTransactionKeys.single(btnKeyParams);\n return await queryClient.invalidateQueries({ queryKey: singleBankTransactionKeysToInvalidate });\n }\n return;\n };\n\n breadcrumb(\"mutation successful, invalidating conversation, bank transaction, and message queries\");\n return Promise.all([\n queryClient.invalidateQueries({ queryKey: conversationKeysToInvalidate }),\n queryClient.invalidateQueries({ queryKey: allBankTransactionKeysToInvalidate }),\n btnInvalidate(),\n ]).catch(error => notify({ error, severity: \"error\" }));\n },\n };\n return useEntityMutation(options);\n}\n\nexport {\n useCreateSingleConversationMutation,\n useUpdateSingleConversationMutation,\n};\n\nexport type {\n UpdateConversationDto,\n};\n","import { css } from \"../../../styled-system/css\";\n\nconst separatorCss = css({\n /*\n Panda ESLint has an issue, as this is the valid usage of these tokens. We cannot use the shorthand syntax\n because heights do not map to `borderWidths` tokens\n */\n minHeight: \"{borderWidths.lg}\", // eslint-disable-line @pandacss/no-unsafe-token-fn-usage\n maxHeight: \"{borderWidths.lg}\", // eslint-disable-line @pandacss/no-unsafe-token-fn-usage\n width: \"100%\",\n backgroundColor: \"border.layout\",\n flex: \"1 1 0\",\n display: \"flex\",\n});\n\nconst layoutCss = css({\n display: \"flex\",\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n width: \"100%\",\n gap: 5,\n paddingLeft: 15,\n paddingRight: 15,\n});\n\nconst messageCss = css({\n wordBreak: \"break-word\",\n maxWidth: 250,\n textAlign: \"center\",\n});\n\ntype ResolutionMessageProps = {\n resolver?: string;\n};\n\nconst resolvedMessage = \"Marked As Resolved\";\n\nfunction ResolutionMessage({ resolver }: ResolutionMessageProps) {\n const resolverMessage = resolver ? `${resolver} ${resolvedMessage}` : resolvedMessage;\n\n return (\n <div className={layoutCss}>\n <div className={separatorCss} />\n <div className={messageCss}>{resolverMessage}</div>\n <div className={separatorCss} />\n </div>\n );\n}\n\nexport { ResolutionMessage };\n","import { Message } from \"./Message.tsx\";\nimport { MessageGroup } from \"./MessageGroup.tsx\";\nimport { MessageLog } from \"./MessageLog.tsx\";\nimport { stylist } from \"../../style/stylist.ts\";\nimport { css } from \"../../../styled-system/css\";\nimport { useContext, useEffect } from \"react\";\nimport { useMessages } from \"../../query/fetches/conversations/messages.ts\";\nimport { isNullish } from \"../../utils/typeUtils.ts\";\nimport { UserContext } from \"../../userContext/userContext.ts\";\nimport { Dispatch, SetStateAction } from \"react\";\nimport { MessageForm } from \"./MessageForm.tsx\";\nimport { useCreateMessageMutation } from \"../../query/mutations/conversations/messagesMutation.ts\";\nimport { Nullable } from \"../../utils/utilityTypes.ts\";\nimport { ConversationGetDto } from \"../../query/fetches/conversations/conversations.ts\";\nimport { MessageFormOnSubmit } from \"./useMessageForm.ts\";\nimport { ConversationPostDto } from \"../../query/fetches/conversations/conversations.ts\";\nimport { PlaceholderMessage } from \"../dashboards/loading/PlaceholderMessage.tsx\";\nimport { useCreateSingleConversationMutation, useUpdateSingleConversationMutation } from \"../../query/mutations/conversations/conversationMutation.ts\";\nimport { ResolutionMessage } from \"./ResolutionMessage.tsx\";\n\ntype ConversationProps = {\n conversationId: Nullable<ConversationGetDto[\"id\"]>;\n setConversationId: Dispatch<SetStateAction<Nullable<ConversationGetDto[\"id\"]>>>;\n isResolved: boolean;\n isUnread: boolean;\n transactionId?: string;\n};\n\nconst conversationFooterStylist = stylist(null, css({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n maxWidth: \"100%\",\n minHeight: 0,\n height: \"auto\",\n padding: \"0 15px 15px\",\n flexDirection: \"column\",\n position: \"relative\",\n}));\n\nconst createConversationObject = (message: string, transactionId?: string): ConversationPostDto => {\n const MAX_SUBJECT_LENGTH = 40;\n return {\n subject: message.slice(0, MAX_SUBJECT_LENGTH),\n status: \"ACTIVE\",\n readStatus: \"READ\",\n resolutionStatus: \"OPEN\",\n ...(transactionId && { attachedEntityId: transactionId }),\n message: {\n text: message,\n },\n };\n};\n\nfunction Conversation({ conversationId, setConversationId, isResolved, isUnread, transactionId }: ConversationProps) {\n const { userId } = useContext(UserContext);\n const { mutate: createMessage } = useCreateMessageMutation();\n const { query: { data: groupedMessages }, isFilling } = useMessages(conversationId);\n const { mutate: createConversation, isPending, variables } = useCreateSingleConversationMutation(setConversationId, transactionId);\n const { mutate: markConversationAsRead } = useUpdateSingleConversationMutation();\n\n useEffect(() => {\n if (isResolved && isUnread && conversationId) {\n markConversationAsRead({ id: conversationId, readStatus: \"READ\" });\n }\n }, [isResolved, isUnread, conversationId, markConversationAsRead]);\n\n const handleSubmit: MessageFormOnSubmit = ({ value }) => {\n if (isNullish(conversationId)) {\n const newConvoObject = createConversationObject(value.message, transactionId);\n createConversation(newConvoObject);\n } else {\n createMessage({ conversationId, text: value.message });\n }\n };\n\n const isNewConversation = isNullish(conversationId) || isNullish(groupedMessages) || isFilling;\n\n return (\n <>\n {!isNewConversation\n ? (\n <MessageLog messageGroups={groupedMessages}>\n {isResolved && <ResolutionMessage resolver=\"Bookkeeper\" />}\n {groupedMessages.map((groups, groupIndex) => {\n const isSent = groups[0].author.userId === userId;\n\n return (\n <MessageGroup key={groupIndex}>\n {groups.map((message) => {\n return (\n <Message\n key={message.id}\n conversationId={conversationId}\n messageId={message.id}\n sentByCurrentUser={isSent}\n reactions={message.reactions}\n >\n {message.text}\n </Message>\n );\n })}\n </MessageGroup>\n );\n })}\n </MessageLog>\n )\n : <PlaceholderMessage isConversationLoading={isPending} message={variables?.message?.text} /> }\n <div {...conversationFooterStylist}>\n <MessageForm conversationId={conversationId} addMessage={handleSubmit} blockSubmit={isPending} />\n </div>\n </>\n );\n}\n\nexport { Conversation };\n","import { stylist } from \"../../../style/stylist.ts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\n\nconst borderStylist = stylist(ValidClassName[\"drawer-header-border\"], css({\n height: \"1px\",\n backgroundColor: \"border.layout.strong\",\n}));\n\nexport function DrawerHeaderBorder() {\n return (\n <div {...borderStylist} />\n );\n};\n","import { PropsWithChildren } from \"react\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { DrawerHeaderBorder } from \"./DrawerHeaderBorder.tsx\";\n\ntype DrawerHeaderProps = PropsWithChildren;\n\nconst headerStylist = stylist(ValidClassName[\"drawer-header\"], css({\n display: \"flex\",\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"10px 25px 10px 15px\",\n backgroundColor: \"surface.foreground\",\n height: \"55px\",\n minHeight: \"55px\",\n}));\n\nfunction DrawerHeader({ children }: DrawerHeaderProps) {\n return (\n <>\n <div {...headerStylist}>\n {children}\n </div>\n <DrawerHeaderBorder />\n </>\n );\n}\n\nexport { DrawerHeader };\n","import { ConversationContainer } from \"./ConversationContainer.tsx\";\nimport { Conversation } from \"./Conversation.tsx\";\nimport { DrawerHeader } from \"../drawer/header/DrawerHeader.tsx\";\nimport { useState } from \"react\";\nimport { Nullable } from \"../../utils/utilityTypes.ts\";\nimport { ConversationGetDto } from \"../../query/fetches/conversations/conversations.ts\";\nimport { useSingleConversation } from \"../../query/fetches/conversations/conversations.ts\";\n\ntype ConversationPanelProps = {\n conversationId: Nullable<ConversationGetDto[\"id\"]>;\n transactionId?: string;\n};\n\n/**\n * A panel for a conversation attached to an entity. Meant to be shown as a side-panel along side the form for the\n * entity itself\n * @constructor\n */\nfunction ConversationPanel({ conversationId, transactionId }: ConversationPanelProps) {\n const [id, setId] = useState(conversationId);\n const { query: { data: conversationData } } = useSingleConversation(id);\n const isResolved = conversationData?.resolutionStatus === \"CLOSED\";\n\n return (\n <ConversationContainer>\n <DrawerHeader />\n <Conversation conversationId={id} setConversationId={setId} isResolved={isResolved} isUnread={conversationData?.readStatus === \"UNREAD\"} transactionId={transactionId} />\n </ConversationContainer>\n );\n}\n\nexport { ConversationPanel };\n","import { KeyboardEvent, PropsWithChildren, ReactNode, useState } from \"react\";\nimport { Drawer } from \"../../drawer/Drawer.tsx\";\nimport { css } from \"../../../../styled-system/css\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { ValidClassName } from \"../../../style/validClassNames.ts\";\nimport { handleEscapeBlur, handleSubmitShortcut } from \"./handleKeyDownUtils.ts\";\nimport { FormSidePanelNavigation } from \"./formNavigation/FormSidePanelNavigation.tsx\";\nimport { Comment } from \"../../icon/icons/Comment.tsx\";\nimport { FormNavigationButton } from \"./formNavigation/FormNavigationButton.tsx\";\nimport { Nullable } from \"../../../utils/utilityTypes.ts\";\nimport { ConversationPanel } from \"../../conversations/ConversationPanel.tsx\";\nimport { ConversationGetDto } from \"../../../query/fetches/conversations/conversations.ts\";\n\ntype BankTransactionFormContainerProps = PropsWithChildren<{\n onSubmit: () => void;\n Header: ReactNode;\n initialTab?: FormTab;\n conversationId: Nullable<ConversationGetDto[\"id\"]>;\n transactionId: string;\n}>;\n\nconst containerStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n maxHeight: \"100%\",\n flexGrow: 1,\n}));\n\nconst panelRowStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n maxHeight: \"100%\",\n overflow: \"hidden\",\n flexShrink: 1,\n flexGrow: 1,\n}));\n\nconst formStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"column\",\n flex: 1,\n backgroundColor: \"surface.background\",\n maxHeight: \"100%\",\n}));\n\nconst mainFormBodyStylist = stylist(ValidClassName[\"transaction-form-body\"], css({\n display: \"flex\",\n flexDirection: \"column\",\n flex: 1,\n padding: \"15px\",\n gap: \"8px\",\n overflow: \"auto\",\n width: \"512px\",\n}));\n\nconst dividerCss = css({\n maxWidth: 1,\n width: 1,\n display: \"flex\",\n flexGrow: 1,\n backgroundColor: \"border.layout.strong\",\n});\n\nconst handleKeyDown = (e: KeyboardEvent<HTMLFormElement>) => {\n handleSubmitShortcut(e);\n handleEscapeBlur(e);\n};\n\ntype FormTab = \"conversation\" | \"audit trail\";\n\nconst BankTransactionForm = ({ children, onSubmit, Header, initialTab, conversationId, transactionId }: BankTransactionFormContainerProps) => {\n const [activeTab, setActiveTab] = useState<Nullable<FormTab>>(initialTab ?? null);\n const tabOnClick = (tab: FormTab) => {\n if (tab === activeTab) {\n return setActiveTab(null);\n }\n return setActiveTab(tab);\n };\n\n return (\n <Drawer>\n <div {...containerStylist}>\n <div {...panelRowStylist}>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n onSubmit();\n }}\n onKeyDown={handleKeyDown}\n {...formStylist}\n >\n {Header}\n <div {...mainFormBodyStylist}>\n {children}\n </div>\n </form>\n {activeTab !== null && <div className={dividerCss}></div>}\n {activeTab === \"conversation\" && (\n <ConversationPanel conversationId={conversationId} transactionId={transactionId} />\n )}\n <FormSidePanelNavigation>\n <FormNavigationButton\n active={activeTab === \"conversation\"}\n onClick={() => tabOnClick(\"conversation\")}\n icon={Comment}\n ariaLabel=\"conversation-tab\"\n />\n </FormSidePanelNavigation>\n </div>\n </div>\n </Drawer>\n );\n};\n\nexport { BankTransactionForm };\nexport type { FormTab };\n","import { css } from \"../../../../styled-system/css\";\nimport { stylist } from \"../../../style/stylist.ts\";\nimport { StrongLabel } from \"../../typography/StrongLabel.tsx\";\nimport { SubLabel } from \"../../typography/SubLabel.tsx\";\nimport { BankAccount } from \"../../../query/fetches/banks/bankAccounts.ts\";\nimport { isNullish } from \"../../../utils/typeUtils.ts\";\nimport { getFormBankAccountDescription } from \"../../../entities/bankAccounts.ts\";\nimport { BankTransaction } from \"../../../query/fetches/transactions/bankTransactionQueries.ts\";\n\nconst formDescriptionCellStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"column\",\n margin: \"0 0 7px 0\",\n padding: 0,\n justifyContent: \"center\",\n minHeight: \"36px\",\n backgroundColor: \"surface.background\",\n gap: \"4px\",\n}));\n\nconst formDescriptionCellTextStylist = stylist(null, css({\n textWrap: \"wrap\",\n}));\n\ntype FormInfoCellProps = {\n transaction: BankTransaction;\n bankAccount: BankAccount | undefined;\n};\n\nfunction FormInfoCell({ transaction, bankAccount }: FormInfoCellProps) {\n const transactionDescription = transaction ? transaction.description : \"\";\n const bankAccountDescription = !isNullish(bankAccount) && !isNullish(transaction)\n ? getFormBankAccountDescription(bankAccount, transaction)\n : \"\";\n\n return (\n <div {...formDescriptionCellStylist}>\n <StrongLabel stylists={[formDescriptionCellTextStylist]}>{transactionDescription}</StrongLabel>\n {bankAccount && <SubLabel>{bankAccountDescription}</SubLabel>}\n </div>\n );\n}\n\nexport { FormInfoCell };\n","import { stylist } from \"../../../style/stylist\";\nimport { css } from \"../../../../styled-system/css\";\nimport { fadeBackground } from \"../../../style/transition\";\nimport { closeDrawer } from \"../../drawer/drawer\";\nimport { Cross } from \"../../icon/icons/Cross\";\nimport { MediumIcon } from \"../../icon/MediumIcon\";\n\nconst closeButtonStylist = stylist(null, css({\n display: \"flex\",\n backgroundColor: \"surface.intent.action.discrete\",\n border: \"none\",\n padding: \"6px\",\n margin: 0,\n borderRadius: \"sm\",\n outline: \"none\",\n cursor: \"pointer\",\n \"&:hover\": {\n backgroundColor: \"surface.intent.action.discrete.hover\",\n },\n \"&:focus-visible\": {\n outline: \"4px solid\",\n outlineColor: \"border.layout\",\n },\n}), fadeBackground);\n\nfunction CloseButton() {\n return (\n <button {...closeButtonStylist} onClick={() => closeDrawer()} type=\"button\">\n <MediumIcon Component={Cross} {...closeButtonStylist} />\n </button>\n );\n}\n\nexport { CloseButton };\n","import * as React from \"react\";\nconst SvgDots = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 16, viewBox: \"0 0 16 15\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip0_9779_2768)\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M2.70654 9.12132C3.60197 9.12132 4.32787 8.39543 4.32787 7.49999C4.32787 6.60456 3.60197 5.87866 2.70654 5.87866C1.8111 5.87866 1.08521 6.60456 1.08521 7.49999C1.08521 8.39543 1.8111 9.12132 2.70654 9.12132Z\", fill: \"#182428\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M8.32496 9.12132C9.22039 9.12132 9.94629 8.39543 9.94629 7.49999C9.94629 6.60456 9.22039 5.87866 8.32496 5.87866C7.42952 5.87866 6.70363 6.60456 6.70363 7.49999C6.70363 8.39543 7.42952 9.12132 8.32496 9.12132Z\", fill: \"#182428\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M13.9434 9.12132C14.8388 9.12132 15.5647 8.39543 15.5647 7.49999C15.5647 6.60456 14.8388 5.87866 13.9434 5.87866C13.048 5.87866 12.3221 6.60456 12.3221 7.49999C12.3221 8.39543 13.048 9.12132 13.9434 9.12132Z\", fill: \"#182428\" })));\nexport default SvgDots;\n","import IconComponent from \"../../../assets/icons/dots.svg?react\";\nimport { createIcon } from \"../createIcon.tsx\";\n\nconst Dots = createIcon(IconComponent, \"Dots\");\n\nexport { Dots };\n","import { Dots } from \"../../icon/icons/Dots\";\nimport { SmallIcon } from \"../../icon/SmallIcon\";\nimport { ButtonDiscreteSmall } from \"../../inputs/ButtonDiscreteSmall\";\nimport { Popup } from \"../../popup/Popup\";\nimport { PopupManager } from \"../../popup/PopupManager\";\nimport { PopupTrigger } from \"../../popup/PopupTrigger\";\nimport { PropsWithChildren } from \"react\";\n\nfunction ActionMenu({ children }: PropsWithChildren) {\n return (\n <PopupManager placement=\"bottom-start\">\n <PopupTrigger>\n {props => (\n <ButtonDiscreteSmall popupTriggerProps={props}>\n <SmallIcon Component={Dots} />\n </ButtonDiscreteSmall>\n )}\n </PopupTrigger>\n <Popup>\n {children}\n </Popup>\n </PopupManager>\n );\n}\n\nexport { ActionMenu };\n","import { BankTransaction } from \"../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { UpdateBankTransactionDto } from \"../../query/mutations/transactions/bankTransactionMutations.ts\";\n\ntype TransactionStatus = BankTransaction[\"status\"];\n\ntype LabeledTransactionStatus = {\n name: string;\n value: TransactionStatus;\n};\n\n// make all values available at runtime\nconst TRANSACTION_STATUSES = {\n ACTIVE: \"ACTIVE\",\n INACTIVE: \"INACTIVE\",\n REMOVED: \"REMOVED\",\n} as const satisfies Record<TransactionStatus, TransactionStatus>;\n\nconst transactionStatuses: LabeledTransactionStatus[] = [\n { name: \"Active\", value: TRANSACTION_STATUSES.ACTIVE },\n { name: \"Inactive\", value: TRANSACTION_STATUSES.INACTIVE },\n { name: \"Removed\", value: TRANSACTION_STATUSES.REMOVED },\n];\n\nconst setTransactionsInactive = (transactions: BankTransaction[]): UpdateBankTransactionDto[] => (\n transactions.map(transaction => ({\n id: transaction.id,\n status: TRANSACTION_STATUSES.INACTIVE,\n }))\n);\n\nconst setTransactionsActive = (transactions: BankTransaction[]): UpdateBankTransactionDto[] => (\n transactions.map(transaction => ({\n id: transaction.id,\n status: TRANSACTION_STATUSES.ACTIVE,\n }))\n);\n\nexport {\n transactionStatuses,\n setTransactionsInactive,\n setTransactionsActive,\n TRANSACTION_STATUSES,\n};\n\nexport type {\n TransactionStatus,\n LabeledTransactionStatus,\n};\n","import { BankTransaction } from \"../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { PopupRow } from \"../../popup/rows/PopupRow.tsx\";\nimport { StrongLabel } from \"../../typography/StrongLabel\";\nimport { AlertDialog } from \"../../dialogs/alertDialog.ts\";\nimport { setTransactionsInactive } from \"../../../entities/transaction/transactionStatus.ts\";\nimport { useBankTransactionsMutation } from \"../../../query/mutations/transactions/bankTransactionMutations.ts\";\n\nconst deleteTransaction = (handleDelete: () => void) => {\n AlertDialog({\n title: \"Delete transaction\",\n body: \"Are you sure you want to delete this transaction?\",\n buttons: [{ key: \"cancel\", label: \"Cancel\" }, { key: \"delete\", label: \"Delete\" }],\n }).then((res) => {\n if (res === \"delete\") {\n handleDelete();\n }\n });\n};\n\nfunction DeleteActionRow({ transaction }: { transaction: BankTransaction }) {\n const { mutate } = useBankTransactionsMutation();\n const handleDelete = () => mutate(setTransactionsInactive([transaction]));\n return (\n <PopupRow onClick={() => deleteTransaction(handleDelete)}>\n <StrongLabel>Delete</StrongLabel>\n </PopupRow>\n );\n}\n\nexport { DeleteActionRow };\n","import { setTransactionsActive } from \"../../../entities/transaction/transactionStatus\";\nimport { BankTransaction } from \"../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { PopupRow } from \"../../popup/rows/PopupRow.tsx\";\nimport { StrongLabel } from \"../../typography/StrongLabel\";\nimport { useBankTransactionsMutation } from \"../../../query/mutations/transactions/bankTransactionMutations.ts\";\n\nfunction RestoreActionRow({ transaction }: { transaction: BankTransaction }) {\n const { mutate } = useBankTransactionsMutation();\n\n const restoreTransaction = () => {\n mutate(setTransactionsActive([transaction]));\n };\n\n return (\n <PopupRow onClick={() => restoreTransaction()}>\n <StrongLabel>Restore</StrongLabel>\n </PopupRow>\n );\n}\n\nexport { RestoreActionRow };\n","import { stylist } from \"../../../style/stylist.ts\";\nimport { css } from \"../../../../styled-system/css\";\nimport { PropsWithChildren } from \"react\";\n\nconst headerLeftStylist = stylist(null, css({\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: \"15px\",\n flexShrink: 1,\n}));\n\ntype DrawerHeaderGroupProps = PropsWithChildren;\n\nfunction DrawerHeaderGroup({ children }: DrawerHeaderGroupProps) {\n return (\n <div {...headerLeftStylist}>\n {children}\n </div>\n );\n}\n\nexport { DrawerHeaderGroup };\n","import { bankTransactionFormEmptyDefaultValues, withForm } from \"./useBankTransactionForm\";\nimport { CloseButton } from \"./CloseButton\";\nimport { StrongLabel } from \"../../typography/StrongLabel\";\nimport { ActionMenu } from \"./ActionMenu\";\nimport { PopupList } from \"../../popup/list/PopupList.tsx\";\nimport { TRANSACTION_STATUSES } from \"../../../entities/transaction/transactionStatus\";\nimport { BankTransaction } from \"../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { DeleteActionRow } from \"./DeleteActionRow\";\nimport { RestoreActionRow } from \"./RestoreActionRow\";\nimport { Nullable } from \"../../../utils/utilityTypes.ts\";\nimport { DrawerHeader } from \"../../drawer/header/DrawerHeader.tsx\";\nimport { DrawerHeaderGroup } from \"../../drawer/header/DrawerHeaderGroup.tsx\";\n\ntype FormHeaderProps = {\n title: string;\n transaction?: Nullable<BankTransaction>;\n};\n\nconst defaultFormHeaderProps: FormHeaderProps = {\n title: \"Transaction\",\n transaction: null,\n};\n\nconst TransactionFormHeader = withForm({\n defaultValues: bankTransactionFormEmptyDefaultValues,\n props: defaultFormHeaderProps,\n render: function FormHeaderRender({ form, title, transaction }) {\n return (\n <DrawerHeader>\n <DrawerHeaderGroup>\n <CloseButton />\n <StrongLabel>{title}</StrongLabel>\n <ActionMenu>\n <PopupList>\n {transaction?.status === TRANSACTION_STATUSES.ACTIVE && (\n <DeleteActionRow transaction={transaction} />\n )}\n {transaction?.status === TRANSACTION_STATUSES.INACTIVE && (\n <RestoreActionRow transaction={transaction} />\n )}\n </PopupList>\n </ActionMenu>\n </DrawerHeaderGroup>\n <form.Subscribe selector={state => state.isDefaultValue}>\n {(isDefaultValue) => {\n return isDefaultValue ? null : <form.SaveButton />;\n }}\n </form.Subscribe>\n </DrawerHeader>\n );\n },\n});\n\nexport type { FormHeaderProps };\n\nexport { TransactionFormHeader };\n","import { BankTransaction, useSingleBankTransaction } from \"../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { useBankTransactionForm } from \"./useBankTransactionForm\";\nimport { isManualTransaction } from \"../../../entities/transaction/transactions.ts\";\nimport { isNullish } from \"../../../utils/typeUtils.ts\";\nimport { useSingleBankAccount } from \"../../../query/fetches/banks/bankAccounts.ts\";\n\ntype UseTransactionFormDataProps = {\n transactionId: BankTransaction[\"id\"];\n};\n\nfunction useTransactionFormData({ transactionId }: UseTransactionFormDataProps) {\n const { query: { data: transaction, isFetching }, isFilling } = useSingleBankTransaction({ id: transactionId });\n const form = useBankTransactionForm(transaction);\n const bankAccount = useSingleBankAccount(transaction?.bankAccount.id);\n\n const showBankAccountField = !isNullish(transaction) && isManualTransaction(transaction);\n const isLoading = isFilling || (isFetching && !transaction);\n\n return {\n transaction,\n form,\n bankAccount,\n showBankAccountField,\n isLoading,\n };\n}\n\nexport { useTransactionFormData };\n","import { BankTransaction } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { ExpenseCategorySection } from \"./ExpenseCategorySection.tsx\";\nimport { BankTransactionForm, FormTab } from \"../BankTransactionForm.tsx\";\nimport { FormInfoCell } from \"../FormInfoCell.tsx\";\nimport { TransactionFormHeader } from \"../TransactionFormHeader.tsx\";\nimport { useTransactionFormData } from \"../useTransactionFormData.ts\";\n\ntype ExpenseFormProps = {\n transactionId: BankTransaction[\"id\"];\n initialTab?: FormTab;\n};\n\nfunction ExpenseForm({ transactionId, initialTab }: ExpenseFormProps) {\n const { transaction, form, bankAccount, showBankAccountField, isLoading } = useTransactionFormData({ transactionId });\n\n if (isLoading) {\n return null;\n }\n\n const ExpenseFormHeader = <TransactionFormHeader form={form} transaction={transaction} title=\"Expense\" />;\n\n const conversationId = transaction?.conversation?.id ?? null;\n\n return (\n <BankTransactionForm onSubmit={form.handleSubmit} Header={ExpenseFormHeader} initialTab={initialTab} conversationId={conversationId} transactionId={transactionId}>\n {transaction?.description && <FormInfoCell transaction={transaction} bankAccount={bankAccount} />}\n <form.AppField name=\"amount\">\n {field => <field.DiscreteAmountField label=\"Total\" />}\n </form.AppField>\n <form.AppField name=\"date\">\n {field => <field.DateInput label=\"Transaction Date\" maxDate={new Date()} />}\n </form.AppField>\n <ExpenseCategorySection form={form} />\n {showBankAccountField && (\n <form.AppField name=\"bankAccount\">\n {field => <field.BankAccountField transaction={transaction} />}\n </form.AppField>\n )}\n <form.AppField name=\"notes\">\n {field => <field.TextAreaInput label=\"Note\" />}\n </form.AppField>\n </BankTransactionForm>\n );\n}\n\nexport { ExpenseForm };\n","import {\n BankTransaction,\n} from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { BankTransactionForm, FormTab } from \"../BankTransactionForm.tsx\";\nimport { FormInfoCell } from \"../FormInfoCell.tsx\";\nimport { TransactionFormHeader } from \"../TransactionFormHeader.tsx\";\nimport { useTransactionFormData } from \"../useTransactionFormData.ts\";\n\ntype BankTransferFormProps = {\n transactionId: BankTransaction[\"id\"];\n initialTab?: FormTab;\n};\n\nfunction BankTransferForm({ transactionId, initialTab }: BankTransferFormProps) {\n const { transaction, form, bankAccount, isLoading } = useTransactionFormData({ transactionId });\n\n if (isLoading) {\n return null;\n }\n\n const BankTransferFormHeader = <TransactionFormHeader form={form} transaction={transaction} title=\"Bank Transfer\" />;\n\n const conversationId = transaction?.conversation?.id ?? null;\n\n return (\n <BankTransactionForm onSubmit={form.handleSubmit} Header={BankTransferFormHeader} initialTab={initialTab} conversationId={conversationId} transactionId={transactionId}>\n {transaction?.description\n && <FormInfoCell transaction={transaction} bankAccount={bankAccount} />}\n <form.AppField name=\"amount\">\n {field => <field.DiscreteAmountField label=\"Total\" />}\n </form.AppField>\n <form.AppField name=\"date\">\n {field => <field.DateInput label=\"Transaction Date\" maxDate={new Date()} />}\n </form.AppField>\n <form.AppField name=\"bankAccount\">\n {field => <field.BankAccountField transaction={transaction} />}\n </form.AppField>\n <form.AppField name=\"glAccount\">\n {field => <field.BankGlAccountField transaction={transaction} />}\n </form.AppField>\n <form.AppField name=\"matchingBankTransaction\">\n {field => <field.MatchingBankTransferField transaction={transaction} />}\n </form.AppField>\n <form.AppField name=\"notes\">\n {field => <field.TextAreaInput label=\"Note\" />}\n </form.AppField>\n </BankTransactionForm>\n );\n}\n\nexport { BankTransferForm };\n","import {\n BankTransaction,\n} from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { BankTransactionForm, FormTab } from \"../BankTransactionForm.tsx\";\nimport { FormInfoCell } from \"../FormInfoCell.tsx\";\nimport { TransactionFormHeader } from \"../TransactionFormHeader.tsx\";\nimport { useTransactionFormData } from \"../useTransactionFormData.ts\";\n\ntype RevenueFormProps = {\n transactionId: BankTransaction[\"id\"];\n initialTab?: FormTab;\n};\n\nfunction RevenueForm({ transactionId, initialTab }: RevenueFormProps) {\n const { transaction, form, bankAccount, showBankAccountField, isLoading } = useTransactionFormData({ transactionId });\n if (isLoading) {\n return null;\n }\n const RevenueFormHeader = <TransactionFormHeader form={form} transaction={transaction} title=\"Income\" />;\n\n const conversationId = transaction?.conversation?.id ?? null;\n\n return (\n <BankTransactionForm onSubmit={form.handleSubmit} Header={RevenueFormHeader} initialTab={initialTab} conversationId={conversationId} transactionId={transactionId}>\n {transaction?.description && <FormInfoCell transaction={transaction} bankAccount={bankAccount} />}\n <form.AppField name=\"amount\">\n {field => <field.DiscreteAmountField label=\"Total\" />}\n </form.AppField>\n <form.AppField name=\"date\">\n {field => <field.DateInput label=\"Transaction Date\" maxDate={new Date()} />}\n </form.AppField>\n <form.AppField name=\"glAccount\">\n {field => <field.GlAccountField />}\n </form.AppField>\n {showBankAccountField && (\n <form.AppField name=\"bankAccount\">\n {field => <field.BankAccountField transaction={transaction} />}\n </form.AppField>\n )}\n <form.AppField name=\"notes\">\n {field => <field.TextAreaInput label=\"Note\" />}\n </form.AppField>\n </BankTransactionForm>\n );\n}\n\nexport { RevenueForm };\n","import { BankTransaction } from \"../../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { TransactionFormHeader } from \"../TransactionFormHeader.tsx\";\nimport { BankTransactionForm, FormTab } from \"../BankTransactionForm.tsx\";\nimport { FormInfoCell } from \"../FormInfoCell.tsx\";\nimport { useTransactionFormData } from \"../useTransactionFormData.ts\";\nimport { TAX_REGION_OPTIONS, TAX_QUARTER_OPTIONS } from \"../../../../entities/transaction/taxInfo.ts\";\nimport { generateYearOptions } from \"../../../../utils/date/date.ts\";\n\ntype TaxPaymentFormProps = {\n transactionId: BankTransaction[\"id\"];\n initialTab?: FormTab;\n};\n\nfunction TaxPaymentForm({ transactionId, initialTab }: TaxPaymentFormProps) {\n const { transaction, form, bankAccount, showBankAccountField, isLoading } = useTransactionFormData({ transactionId });\n\n if (isLoading) {\n return null;\n }\n\n const TaxPaymentFormHeader = <TransactionFormHeader form={form} transaction={transaction} title=\"Tax Payment\" />;\n\n const conversationId = transaction?.conversation?.id ?? null;\n\n return (\n <BankTransactionForm Header={TaxPaymentFormHeader} onSubmit={form.handleSubmit} initialTab={initialTab} conversationId={conversationId} transactionId={transactionId}>\n {transaction?.description && <FormInfoCell transaction={transaction} bankAccount={bankAccount} />}\n <form.AppField name=\"amount\">\n {field => <field.DiscreteAmountField label=\"Total\" />}\n </form.AppField>\n <form.AppField name=\"date\">\n {field => <field.DateInput label=\"Transaction Date\" maxDate={new Date()} />}\n </form.AppField>\n <form.AppField name=\"tax.paymentInfo.region\">\n {field => <field.ButtonGroupField label=\"Region\" options={TAX_REGION_OPTIONS} />}\n </form.AppField>\n <form.AppField name=\"tax.paymentInfo.quarter\">\n {field => <field.ButtonGroupField label=\"Quarter\" options={TAX_QUARTER_OPTIONS} />}\n </form.AppField>\n <form.AppField name=\"tax.paymentInfo.year\">\n {field => (\n <field.GenericSelectorField\n label=\"Year\"\n options={generateYearOptions({ startYear: new Date().getFullYear() + 1 }).map(year => ({\n value: year,\n label: String(year),\n }))}\n />\n )}\n </form.AppField>\n {showBankAccountField && (\n <form.AppField name=\"bankAccount\">\n {field => <field.BankAccountField transaction={transaction} />}\n </form.AppField>\n )}\n <form.AppField name=\"notes\">\n {field => <field.TextAreaInput label=\"Note\" />}\n </form.AppField>\n </BankTransactionForm>\n );\n}\n\nexport {\n TaxPaymentForm,\n};\n","import { ExpenseForm } from \"./expenseForm/ExpenseForm.tsx\";\nimport { BankTransferForm } from \"./bankTransferForm/BankTransferForm.tsx\";\nimport { RevenueForm } from \"./revenueForm/RevenueForm.tsx\";\nimport { TaxPaymentForm } from \"./taxPaymentForm/TaxPaymentForm.tsx\";\nimport { useSingleBankTransaction } from \"../../../query/fetches/transactions/bankTransactionQueries.ts\";\nimport { isNullish } from \"../../../utils/typeUtils.ts\";\nimport { closeDrawer } from \"../../drawer/drawer.ts\";\nimport { useEffect } from \"react\";\nimport { FormTab } from \"./BankTransactionForm.tsx\";\n\ntype BankTransactionFormRouterProps = {\n transactionId: string;\n initialTab?: FormTab;\n};\n\nfunction BankTransactionFormRouter({ transactionId, initialTab }: BankTransactionFormRouterProps) {\n const { query: { data: bankTransaction }, isFilling } = useSingleBankTransaction({ id: transactionId });\n\n useEffect(() => {\n if (!isFilling && isNullish(bankTransaction)) {\n closeDrawer();\n }\n }, [bankTransaction, isFilling]);\n\n if (isNullish(bankTransaction)) {\n return null;\n }\n\n switch (bankTransaction.type) {\n case \"EXPENSE\":\n return <ExpenseForm transactionId={transactionId} initialTab={initialTab} />;\n case \"BANK_TRANSFER\":\n return <BankTransferForm transactionId={transactionId} initialTab={initialTab} />;\n case \"REVENUE\":\n return <RevenueForm transactionId={transactionId} initialTab={initialTab} />;\n case \"TAX_PAYMENT\":\n return <TaxPaymentForm transactionId={transactionId} initialTab={initialTab} />;\n }\n}\n\nexport { BankTransactionFormRouter };\n","import { DrawerHeaderGroup } from \"../drawer/header/DrawerHeaderGroup.tsx\";\nimport { CloseButton } from \"../dashboards/forms/CloseButton.tsx\";\nimport { StrongLabel } from \"../typography/StrongLabel.tsx\";\nimport { DrawerHeader } from \"../drawer/header/DrawerHeader.tsx\";\n\ntype ConversationHeaderProps = {\n subject: string;\n};\n\nfunction ConversationHeader({ subject }: ConversationHeaderProps) {\n return (\n <DrawerHeader>\n <DrawerHeaderGroup>\n <CloseButton />\n <StrongLabel>{subject}</StrongLabel>\n </DrawerHeaderGroup>\n </DrawerHeader>\n );\n}\n\nexport { ConversationHeader };\n","import { Drawer } from \"../drawer/Drawer.tsx\";\nimport { Conversation } from \"./Conversation.tsx\";\nimport { ConversationHeader } from \"./ConversationHeader.tsx\";\nimport { ConversationContainer } from \"./ConversationContainer.tsx\";\nimport { Nullable } from \"../../utils/utilityTypes.ts\";\nimport { useState } from \"react\";\nimport { ConversationGetDto } from \"../../query/fetches/conversations/conversations.ts\";\nimport { useSingleConversation } from \"../../query/fetches/conversations/conversations.ts\";\n\ntype ConversationDrawerProps = {\n conversationId: Nullable<ConversationGetDto[\"id\"]>;\n};\n\n/**\n * A standalone drawer for rendering a conversation that is not attached to an entity.\n * @param conversationId\n * @constructor\n */\nfunction ConversationDrawer({ conversationId }: ConversationDrawerProps) {\n const [id, setId] = useState(conversationId);\n const { query: { data: conversationData } } = useSingleConversation(id);\n const isResolved = conversationData?.resolutionStatus === \"CLOSED\";\n\n return (\n <Drawer>\n <ConversationContainer>\n <ConversationHeader subject={conversationData?.subject ?? \"Conversation\"} />\n <Conversation conversationId={id} setConversationId={setId} isResolved={isResolved} isUnread={conversationData?.readStatus === \"UNREAD\"} />\n </ConversationContainer>\n </Drawer>\n );\n}\n\nexport { ConversationDrawer };\n","import { DrawerRoute } from \"./DrawerRoute.tsx\";\nimport { DrawerRouter } from \"./DrawerRouter.tsx\";\nimport { BankTransactionFormRouter } from \"../dashboards/forms/BankTransactionFormRouter.tsx\";\nimport { ConversationDrawer } from \"../conversations/ConversationDrawer.tsx\";\n\nfunction Drawers() {\n return (\n <DrawerRouter>\n <DrawerRoute name=\"BankTransactionFormRouter\" Component={BankTransactionFormRouter} />\n <DrawerRoute name=\"Conversation\" Component={ConversationDrawer} />\n </DrawerRouter>\n\n );\n}\n\nexport { Drawers };\n","import { PropsWithChildren } from \"react\";\nimport { Environment, EnvironmentContext } from \"./Environment.ts\";\n\ntype EnvironmentProviderProps = PropsWithChildren<{\n environment: Environment;\n}>;\n\nconst EnvironmentProvider = ({ environment, children }: EnvironmentProviderProps) => {\n return (\n <EnvironmentContext.Provider value={environment}>\n {children}\n </EnvironmentContext.Provider>\n );\n};\n\nexport {\n EnvironmentProvider,\n};\n","import { EntityFetchFn, useEntity } from \"../utils/useEntity.ts\";\nimport { v5EntityGet, V5EntityGetRequest } from \"../../http/get.ts\";\nimport { UserRole } from \"../../../userContext/userContext.ts\";\n\ntype SdkIntrospectResponse = {\n userId: string;\n userRole: UserRole;\n email: string;\n};\n\ntype SdkIntrospectKeys = [\"sdk\", \"introspect\"];\n\nconst sdkIntrospectKeys = {\n all: (): SdkIntrospectKeys => [\"sdk\", \"introspect\"],\n};\n\nconst getUserInfo: EntityFetchFn<SdkIntrospectResponse, SdkIntrospectKeys> = async (queryContext) => {\n const queryKey = queryContext.queryKey;\n const accessToken = queryKey[2].accessToken;\n const environment = queryKey[2].environment;\n const params: V5EntityGetRequest = {\n path: \"/sdk/introspect\",\n accessToken: accessToken,\n environment,\n };\n return await v5EntityGet<SdkIntrospectResponse>(params);\n};\n\nfunction useCurrentUserInfo() {\n return useEntity({ queryKey: sdkIntrospectKeys.all(), queryFn: getUserInfo });\n}\n\nexport { useCurrentUserInfo };\n","import { PropsWithChildren } from \"react\";\nimport { UserContext } from \"./userContext.ts\";\nimport { useCurrentUserInfo } from \"../query/fetches/sdk/introspect.ts\";\n\ntype UserContextProviderProps = PropsWithChildren;\n\nfunction UserContextProvider({ children }: UserContextProviderProps) {\n const { query: { data } } = useCurrentUserInfo();\n\n return (\n <UserContext.Provider value={{ userId: data?.userId, userRole: data?.userRole || \"OWNER\", userEmail: data?.email }}>\n {children}\n </UserContext.Provider>\n );\n}\n\nexport { UserContextProvider };\n","import { PropsWithChildren, useEffect } from \"react\";\nimport { QueryProvider } from \"../query/QueryProvider.tsx\";\nimport { AuthContext } from \"../auth/AuthContext.tsx\";\nimport { ErrorBoundary } from \"../components/error/ErrorBoundary.tsx\";\nimport { ContextAwareConfirmation } from \"react-confirm\";\nimport { Drawers } from \"../components/drawer/Drawers.tsx\";\nimport { EnvironmentProvider } from \"../environment/EnvironmentProvider.tsx\";\nimport { Environment } from \"../environment/Environment.ts\";\nimport { UserContextProvider } from \"../userContext/UserContextProvider.tsx\";\nimport { setBugsnagProperties } from \"../utils/logging.ts\";\n\ntype TightProps = PropsWithChildren<{\n environment: Environment;\n accessToken: string;\n}>;\n\nfunction Tight({ children, environment, accessToken }: TightProps) {\n const authContextValue = { activeToken: accessToken, accountantToken: undefined };\n\n useEffect(() => {\n setBugsnagProperties(environment);\n }, [environment]);\n\n return (\n <ErrorBoundary>\n <EnvironmentProvider environment={environment}>\n <QueryProvider>\n <AuthContext.Provider value={authContextValue}>\n <UserContextProvider>\n <ContextAwareConfirmation.ConfirmationRoot />\n { children }\n <Drawers />\n </UserContextProvider>\n </AuthContext.Provider>\n </QueryProvider>\n </EnvironmentProvider>\n </ErrorBoundary>\n );\n}\n\nexport {\n Tight,\n};\n"],"names":["createActionName","slice","action","trim","createFeatureFlagsSlice","set","hasBulkSelect","updateFlags","updatedFlags","currentFlags","SLICE_NAME","createDrawerNavigationSlice","drawerHistory","openDrawer","name","options","drawerNavigation","replaceHistory","routeProps","historyEntry","length","drawers","cloneDeep","push","closeDrawer","oldDrawers","closeAllDrawers","createExternalOptionsSlice","externalOptions","setOptions","newOptions","replace","currentOptions","remove","array","index","getLast","createTransactionsDashFilterSlice","transactionsDashFilters","addTransactionsDashFilters","filters","removeTransactionsDashFilter","setTransactionsDashFilters","useGlobalStore","create","devtools","args","enabled","store","TRANSACTIONS_TABLE_COLS","SELECT","EXPAND","DATE","DESCRIPTION","AMOUNT","CATEGORY","CLASS_SEGMENT","REVIEW_STATUS","COMMENTS","ALL_COLUMN_OPTIONS","optionsSchema","z","object","pageSize","optional","int32","positive","columns","enum","string","hexColorRegex","sanitizerMap","transactionsDashboard","result","safeParse","success","data","accessToken","token","dataVisualizationColors","colors","sanitizedColors","filter","test","color","sanitizeOptions","optionKey","sanitizer","useOptions","initialOptions","hasInitialized","useRef","state","current","cleanedOptions","key","value","entries","sanitizedOptions","storeOptions","useMemo","o","isObject","Array","isArray","isObjectOrArray","obj","compact","Object","fromEntries","_","value2","isBaseCondition","v","toChar","code","String","fromCharCode","toHash","x","Math","abs","h","i","charCodeAt","importantRegex","withoutSpace","str","replaceAll","memo","fn","cache","Map","JSON","stringify","has","get","MERGE_OMIT","Set","mergeProps","sources","reduce","prev","keys","forEach","prevValue","isNotNullish","element","walkObject","target","predicate","stop","getKey","inner","path","prop","child","childPath","next","normalizeStyleObject","styles","context","shorthand","utility","conditions","hasShorthand","resolveShorthand","values","breakpoints","acc","fallbackCondition","shift","finalize","wordRegex","msRegex","hypenateProperty","property","startsWith","toLowerCase","split","join","conditionRegex","isCondition","underscoreRegex","conditionsSelectorRegex","classNameByProp","className","paths","sort","a","b","aa","bb","map","prefix","transform","hashFn","cssFn","hash","conds","formatClassName","Boolean","base","normalizedObject","assign","classNames","important","allConditions","transformed","baseArray","add","from","css","mergeCss","raw","resolve","allStyles","flat","style","assignCss","cx","arg","arguments","defaults","conf","variants","defaultVariants","compoundVariants","cva","config","getVariantProps","props","computedVariants","variantCss","compoundVariantCss","variantMap","compoundVariant","every","some","variantKeys","__cva__","merge","__cva","override","items","currItems","item","splitVariantProps","descriptors","getOwnPropertyDescriptors","dKeys","k","clone","defineProperty","concat","ValidClassName","publicClassNamePrefix","publicClassName","isValidClassName","isPublicClassName","splitIndex","indexOf","suffix","isGeneratedClassName","stylist","primaryClass","publicClassNames","generatedClassNames","dashHeaderLayoutStylist","display","flexDirection","alignItems","justifyContent","height","DashHeaderLayout","children","jsx","mergePublicClassNames","accumulator","publicNames","mergeGeneratedClassNames","generatedNames","mergeStylists","stylists","stylistArray","fontRecipes","body","default","fontWeight","fontSize","fontFamily","lineHeight","letterSpacing","label","subLabel","strongLabel","strongSubLabel","heading","metric","sm","md","lg","xl","headingStylist","whiteSpace","Heading","mergedHeadingStylists","formatSimpleDate","date","getFullYear","getMonth","padStart","getDate","createDate","year","month","day","Date","getBeginningOfMonth","DateFilters","THIS_YEAR","THIS_MONTH","LAST_YEAR","LAST_MONTH","PAST_YEAR","getBeginDate","now","getBeginningOfThisMonth","getEndDate","getEndOfThisMonth","getDateRange","input","includes","beginDate","endDate","dateRange","DAY_HEADERS","MONTH_NAMES","generateYearOptions","yearsBack","startYear","currentYear","yearOptions","isSameDay","date1","date2","toDateString","isToday","isDateAfter","aDate","bDate","getTime","formatDateToMMDDYYYY","isNaN","validateDateComponents","parseMMDDYYYY","dateString","match","monthStr","dayStr","yearStr","parseInt","parseLocalDate","toISODateString","getMonthAndYear","formatOptions","abbreviateMonth","abbreviateYear","toLocaleString","getInjectedParamsQueryKey","queryKey","environment","r","getPaginatedQueryKey","baseQueryKey","cursor","isNullish","isNullishOrEmptyOrBlank","isNotNullishOrEmptyOrBlank","AuthContext","createContext","activeToken","accountantToken","useAccessToken","useContext","errorFnNoToken","Error","gcTime","queryClient","QueryClient","defaultOptions","queries","staleTime","refetchInterval","EnvironmentContext","useEnvironment","useEntity","queryFn","hasAccessToken","queryKeyWithToken","isRehydrating","useIsRestoring","query","useQuery","placeholderData","keepPreviousDataPlaceholder","keepPreviousData","retry","Infinity","isFilling","isLoading","FetchDelivery","client","this","apiKey","events","notifier","payloadVersion","sentAt","toISOString","fetch","endpoints","notify","method","mode","credentials","headers","referrerPolicy","CircularReference","Symbol","AccessError","safeFilter","replacer","seen","depth","depthLimit","edgeIndex","edgesLimit","replacement","toJSON","safeAccess","copy","limit","min","currentKey","l","pop","accessor","objectToString","prototype","toString","getPrototypeOf","ERROR_TYPE","CHROME_IE_STACK_REGEXP","SAFARI_NATIVE_CODE_REGEXP","parseStack","stackString","partialResult","filtered","line","sanitizedLine","location","tokens","locationParts","extractLocation","file","lineNumber","columnNumber","functionNameRegex","matches","n","stack","urlLike","parts","exec","col","toExceptions","maybeError","component","error","normalizeError","metadata","exceptions","makeException","getCauses","cause","backtrace","err","call","getStringMember","field","stringMember","message","newError","stackOptions","errorClass","stacktrace","getStacktrace","type","self","navigator","curr","callee","MAX_STACK_SIZE","RegExp","$1","caller","extendedError","devError","console","browserNotifyUnhandledExceptions","addEventListener","evt","ErrorEvent","filename","lineno","colno","Number","isSafeInteger","log","firstStackFrame","notifyEvent","unhandled","severity","severityReason","browserNotifyUnhandledRejections","reason","errorBreadcrumbs","addOnPostError","event","leaveBreadcrumb","errorMessage","appStart","reset","appDuration","load","addOnError","app","duration","userAgentRules","operatingSystemRules","browserContext","uaParser","userAgent","matchedRule","matched","browser","regex","uaMatch","os","osName","osVersion","device","manufacturer","model","maxTouchPoints","browserName","browserVersion","request","url","href","pathname","locale","language","languages","metaData","RateLimiter","period","Queue","clear","time","oldestTimestamp","peek","dequeue","newEventPermitted","size","enqueue","ClientErrorBoundary","Component","super","errorInfo","setState","getDerivedStateFromError","componentStack","lines","ret","len","onError","react","t","render","FallbackComponent","clearError","handleClearError","Fragment","ReactPlugin","BugsnagErrorBoundary","fallbackComponent","Bugsnag","breadcrumbs","delivery","errorCallbacks","postErrorCallbacks","plugins","plugin","eventMetadata","timestamp","maxBreadcrumbs","splice","originalError","releaseStage","enabledReleaseStages","user","version","appVersion","appType","window","sortLast","callback","callbackResult","eventForDelivery","payload","sendEvent","e","id","email","bugSnagReleaseStage","delete","find","userEnvironment","bugsnagClient","start","limiter","increment","breadcrumb","extraData","async","params","groupingHash","custom","warn","reactPlugin","getPlugin","HttpMethods","POST","Credentials","encodeQueryParam","encodeURIComponent","buildUri","uri","queryParams","subValue","getRequestHeaders","extraHeaders","baseHeaders","Accept","Authorization","mapValues","handleExtraHeaders","authorization","handleHttpResponse","response","res","json","ok","Promise","reject","handlePathParams","pathParams","getCredentials","includeCredentials","v5ApiHeaders","buildEntityRequest","entityRequest","pagination","endpointManager","apiVersion","baseUrl","getUrl","post","status","statusText","entityPost","entityPostRequest","bodyParams","v6EntityPost","v5EntityPost","createEndpointManager","cleanPath","charAt","V5ApiUrls","DEVELOPMENT","PRODUCTION","SANDBOX","LOCAL","V6ApiUrls","getV5EndpointManager","profitAndLossKeys","of","grouping","getProfitAndLoss","queryContext","exportType","useProfitAndLoss","select","NO_DATA_HEIGHT_PERCENTAGE","FALLBACK_NO_DATA_HEIGHT","DataKeyMap","income","expenses","profit","loss","netIncome","noDataHeight","processMonthData","monthData","monthName","dateStr","remainingIncome","remainingExpenses","dataIncome","dataExpenses","Big","minus","toNumber","plus","total","hasNoData","processResponse","plSummary","domain","months","hasAnyData","domainMin","domainMax","max","domainRange","GroupingFilters","MONTHLY","tileHeader","backgroundColor","border","borderTopRadius","padding","TileHeader","title","tileBodyStylist","gap","borderBottomRadius","borderTop","TileBody","tileCss","boxShadow","transition","position","width","flexShrink","chart","minWidth","maxWidth","isSample","true","pointerEvents","false","Tile","tileStylist","ellipsisText","overflow","textOverflow","ellipsisTextRaw","small","fontStyle","textStylist","text","LabelContent","metricXLStylist","MetricXL","summationStylist","summation","Summation","jsxs","tileGraphsStylist","TileGraphs","smartFloor","sign","floor","smartRound","decimalPoints","absVal","rounded","round","stringNum","toFixed","parseFloat","formatNumberLocale","minFractions","maxFractions","useGrouping","minimumFractionDigits","maximumFractionDigits","BILLION","MILLION","smartNumber","cents","condense","dollarSign","signage","numVal","condensedStr","negativeAfterRound","argument","divisor","pow","shrunk","magnitude","CENTS_PRECISION","INT_PRECISION","precision","minPrecision","roundedStr","signedString","dollar","smartMoneySummary","stylistMap","Text","weight","strongLabelStylist","StrongLabel","subLabelStylist","SubLabel","tooltipContainerStylist","borderRadius","Tooltip","active","dataKey","variable","fallback","var","bulletStylist","bulletRowStylist","labelStylist","DEFAULT_COLOR","Bullet","diameter","legendContainerStylist","Legend","barChartMarginStyles","right","left","legendOrder","legendSorter","findIndex","legendItem","legendStyles","paddingBottom","marginLeft","barProps","stackId","isAnimationActive","barChartStylist","outline","LINE_COLOR","BORDER_COLOR","REFERENCE_LINE_COLOR","AXIS_TICK","fill","BAR_COLOR","noDataDomain","autoDomain","Chart","animate","setAnimate","useState","ResponsiveContainer","BarChart","stackOffset","accessibilityLayer","barSize","margin","RechartsLegend","verticalAlign","itemSorter","wrapperStyle","content","CartesianGrid","strokeDasharray","vertical","stroke","XAxis","interval","tickLine","tick","YAxis","tickCount","axisLine","tickFormatter","RechartsTooltip","shared","Bar","legendType","ReferenceLine","y","Line","strokeWidth","activeDot","onAnimationStart","onAnimationEnd","shimmerBaseStyle","backgroundImage","backgroundSize","backgroundPosition","animation","ShimmerBlock","shimmerStylist","tileShimmerCss","minHeight","TileShimmer","marginBottom","chartStyles","BarChartShimmer","ExpandedPLTile","bannersStylist","alignSelf","TaskBannerLayout","CONVERSATIONS_SECTION","TRANSACTIONS_SECTION","taskTypeToSectionMap","MESSAGE_REVIEW","TRANSACTION_REVIEW","LINK_BANK","RULE_REVIEW","BANK_ERROR","CSV_IMPORT_REVIEW","bankTransactionsFilter","reviewStatus","operator","category","expand","glAccount","bankAccount","conversationFilter","resolutionStatus","PLACEHOLDER_TRANSACTIONS","PLACEHOLDER_CONVERSATIONS","MediumIcon","iconVariantStyles","primary","DEFAULT","hover","secondary","warning","danger","createIcon","Icon","displayName","IconComponent","iconStylist","Comment","React","createElement","viewBox","xmlns","d","strokeMiterlimit","Attention","fadeBackgroundBorder","fadeBackground","fadeColor","fadeInnerText","fadeIcon","buttonBaseStyle","outlineColor","outlineOffset","opacity","buttonPrimaryStyle","borderColor","defaultButtonText","sizeStyles","createBaseButtonStylist","sizes","ButtonBase","onClick","disabled","buttonStylist","buttonWarningStylist","ButtonWarning","Flag","Bank","strokeLinecap","buttonDangerStylist","ButtonDanger","buttonActionStylist","ButtonAction","getPriorityVariant","priority","Button","getTypeVariant","buttonText","bannerTitleStylist","BannerTitle","bannerHeaderStylist","flex","BannerHeader","description","SmallIcon","ArrowRight","bannerActionButtonStylist","bannerButtonTextStylist","bannerButtonIconStylist","BannerActionButton","handleClick","bannerContainerCss","flexWrap","HIGH","MEDIUM","LOW","URGENT","classNameMap","Banner","task","bannerContainerStylist","banner","getV6EndpointManager","taskKeys","all","priorityOrder","sortTasks","getTaskFetch","ArrowLeft","PaginationContext","hasNextPage","hasPreviousPage","getFirstPage","getLastPage","pageBackwards","pageForwards","arrowButtonContainerStylist","arrowButtonStylist","arrowButtonInnerStylist","TablePagination","tableRowCss","PlaceholderRow","placeholderTableStylist","headerStylist","paddingLeft","paddingRight","headerColumnCss","PlaceholderTable","numColumns","usePrefetch","queryKeyFn","useCallback","prefetchOptions","prefetchQuery","FIRST_PAGE_CURSOR","freeze","LAST_PAGE_CURSOR","usePaginatedEntity","cursorParam","setCursorParam","prevBaseKey","isEqual","entityQuery","paginationControls","createPaginationControls","setCursor","after","before","prefetchNextPage","prefetchPreviousPage","useEffect","isFetching","catch","entityGet","entityGetRequest","v6EntityGet","v5EntityGet","useDelayedCallback","delay","delayedCallback","timeoutId","clearPendingTimeout","clearTimeout","startCallback","setTimeout","cancelCallback","useHoverPrefetch","prefetchFn","startPrefetch","cancelPrefetch","ConversationOrderByParams","CREATED_DATE_TIME","SUBJECT","EMAIL","LAST_MESSAGE_CREATED_DATE_TIME","LAST_MESSAGE_TEXT","ConversationDirectionParams","ASC","DESC","conversationsKeys","conversation","getConversations","useConversations","getConversation","useSingleConversation","hasConversationId","postConversations","useConversationPrefetch","createColumnSizeCss","column","getSize","maxSize","columnDef","ColumnHeader","header","sizeStyle","isPlaceholder","flexRender","getContext","tableHeaderStylist","paddingBlock","TableHeader","headerGroups","headerGroup","tableBodyStylist","TableBody","horizontal","Divider","alignment","dividerStylist","cellDividerStylist","CellDivider","TableCell","cell","onCellClick","shouldDisplayDivider","tableCellStylist","tableCellContainerStylist","displayDivider","tableSubRowStylist","TableSubRow","rowData","cellData","getVisibleCells","isChild","parentTableRowCss","evenTableRowCss","background","tableRowStylist","TableRow","onMouseEnter","onMouseLeave","isExpanded","getIsExpanded","tableParentRowStylist","subRows","subRow","getState","BankTransactionOrderByParams","STATUS","BankTransactionDirectionParams","bankTransactionKeys","single","queryBankTransactions","useBankTransactions","getBankTransaction","useSingleBankTransaction","useBankTransactionPrefetch","EntityIdPrefixMap","BANK_ACCOUNT","GL_ACCOUNT","TRANSACTION_CATEGORY","BANK_TRANSACTION","PROCESSOR_TRANSACTION","TRANSACTION_LINE_ITEM","checkEntityPrefix","entityId","messagesKeys","groupMessages","messages","groupedMessages","currentMessage","lastGroup","lastGroupUserId","author","userId","getMessages","createMessage","useMessagesPrefetch","onCellClickHandler","attachedEntityId","hasBankTransactionPrefix","transactionId","initialTab","conversationId","ConversationsTableRow","conversationStartPrefetch","conversationCancelPrefetch","messagesStartPrefetch","messagesCancelPrefetch","bankTransactionStartPrefetch","bankTransactionCancelPrefetch","original","Plus","primaryButtonStylist","ButtonPrimary","AddConversationButton","controlsLayoutStylist","ConversationControlsLayout","tableCss","flexGrow","dashboard","transactionDashboard","businessOwnerDashboard","marginTop","TableLayout","tableStylist","SortingContext","CONVERSATIONS_TABLE_COLS","labelRecipe","intent","contrast","wrap","ellipsis","overflowWrap","Label","emphasisLabelStylist","EmphasisLabel","ConversationTextCell","isRead","tableCellLayoutRecipe","alignVariant","flexStart","center","TableCellLayout","tableCellLayoutStylist","ConversationDateCell","dateTimeString","dateTime","userLocalDate","toLocaleTimeString","hour","minute","getLocaleTimeString","strongSubLabelStylist","StrongSubLabel","PopupContext","POPUP_LIST_MAX_HEIGHT","popupListCss","maxHeight","scrollbar","POPUP_ROW_MIN_HEIGHT","popupRowStylist","textAlign","useControlledState","initialValue","controlledValue","handleControlledValueChange","uncontrolledValue","setUncontrolledValue","PopupTree","useFloatingParentNodeId","FloatingTree","PopupManager","modal","initialOpen","placement","offsetPx","open","onOpenChange","blockInteraction","enableClickMiddleware","popupInfo","controlledOpen","setControlledOpen","labelId","setLabelId","descriptionId","setDescriptionId","setOpen","nodeId","useFloatingNodeId","rowHeight","useFloating","newOpen","MouseEvent","clientX","clientY","innerWidth","innerHeight","whileElementsMounted","autoUpdate","middleware","offset","flip","crossAxis","fallbackStrategy","fallbackAxisSideDirection","availableHeight","elements","targetHeight","partialRowHeight","floating","overflowY","click","useClick","dismiss","useDismiss","bubbles","escapeKey","role","useRole","interactions","useInteractions","p","parentNodeId","blockCascadeInteraction","popupNodeId","FloatingNode","Provider","popupParentNodeId","usePopupContext","PopupTrigger","ref","refs","setReference","openState","triggerChildProps","getReferenceProps","Cross","TinyIcon","Sort","compoundButtonWrapperStylist","mainButtonStylist","clearButtonStylist","top","bottom","sortIconStylist","ColumnSorterCompoundButton","onClearClick","columnName","popupTriggerProps","isActive","popupVariants","boxSizing","reaction","Popup","initialFocus","floatingContext","popupContext","mergedRef","useMergeRefs","setFloating","popupStylist","FloatingOverlay","lockScroll","FloatingPortal","FloatingFocusManager","floatingStyles","getFloatingProps","activeRecipe","paddingTop","popupSortRowLabelStylist","PopupSortRow","popupSortRowStylist","ColumnSortListStylist","sortListStylist","ColumnSortList","sortDef","sortAscDisplay","sortDescDisplay","handleSortClick","sortInstance","sortParams","orderBy","direction","buttonDiscreteSmallCss","buttonDiscreteSmallStylist","ButtonDiscreteSmall","ariaLabel","ariaExpanded","internalActive","setInternalActive","controlledActive","popupStyle","ColumnSorter","sortingContext","setSortInstance","isSortActive","handleClearSort","columnSorterLayoutStylist","ColumnSorterLayout","conversationSortDefs","useConversationSort","correctOrderBy","correctDirection","apiSort","columnHelper","createColumnHelper","conversationTableColumns","row","latestMessage","readStatus","subject","lastUpdatedDateTime","PLACEHOLDER_DATA","zeroStateLayoutCss","ZeroStateLayoutStylist","ZeroStateLayout","LargeIcon","Paperplane","conversationsOnboardingStrongText","conversationsOnboardingButtonText","ConversationsOnboardingZeroState","allCaughtUpStrongText","allCaughtUpWeakText","ConversationsAllCaughtUpZeroState","businessOwnerConversationsTableSectionCss","getZeroState","hasHadAnyConversation","BusinessOwnerConversationsTableSection","conversations","table","useReactTable","manualPagination","manualSorting","manualFiltering","manualGrouping","rowCount","getCoreRowModel","getRowId","singleConversationRes","singleConversationIsFilling","getHeaderGroups","getRowModel","rows","summariesKeys","getSummaries","useSingleMonthlySummary","firstOfMonth","summaryData","summary","bodyStylist","Body","sampleOverlayCss","SampleOverlay","sampleOverlayStylist","shimmerContainerStyle","shimmerBlockStyle","w92","w90","w88","w87","w85","w70","shimmerWidthVariants","FinancialSummaryShimmer","variant","FinancialSummaryLayoutRecipe","FinancialSummaryTextBoxStylist","FinancialSummaryLayout","FinancialSummaryLayoutStylist","LINK_BANK_MOCK_TASK","dismissable","getV1EndpointManager","BANK_ERRORS","tertiaryButtonStylist","ButtonTertiary","alertOverlayStylist","inset","placeItems","alertDialogStylist","alertButtonContainerStylist","AlertDialog","ContextAwareConfirmation","createConfirmation","confirmable","show","proceed","buttons","strategy","outsidePress","returnFocus","button","ButtonComponent","pluralize","plural","amount","includeAmount","pluralizedText","failedAlert","institutionName","successAlert","numAccounts","useOpenPlaidLink","usePlaidLink","onSuccess","publicToken","plaidItem","plaidMetadata","apiInstitutionName","plaidItemAccounts","invalidateQueries","onExit","institution","usePlaidSdk","plaidItemId","linkToken","setLinkToken","ready","linkPlaid","link_token","PlaidLinkBanner","meta","plaidItemsKey","getPlaidItems","usePlaidItemsWithErrors","findPlaidItemsWithErrors","plaidItems","apiErrorCode","bankAccountsKeys","getBankAccounts","prefixedAccounts","account","useBankAccounts","findBankAccountByGlAccountId","bankAccounts","glAccountId","splitId","useSingleBankAccount","bankAccountId","findBankAccountById","useHasPlaidLinkedBankAccount","hasPlaidLinkedBankAccount","apiName","pickerStylist","leftButtonStylist","borderRight","_disabled","rightButtonStylist","borderLeft","prevMonthHandler","nextMonthHandler","MonthPicker","setPeriod","disableNext","disablePrev","monthYearDate","monthYearLabel","tileLayoutStylist","gridTemplateColumns","TileLayout","outerBarStylist","innerBarStylist","barLabelStylist","percentage","styleWidth","isInside","mergedInnerBarStylist","metricMDStylist","MetricMD","rowStylist","tileBarLabelStylist","TileBar","colorCss","percent","targetMin","targetMax","placeholderSummary","absoluteSum","Sync","tilePlaidLinkButtonStylist","TilePlaidLinkButton","tileGraphShimmerStyle","TileGraphShimmer","moneyInCss","moneyOutCss","sampleData","placeHolderData","ProfitAndLossTile","defaultRange","profitLossData","getCashFlowQueryKey","moneyIn","moneyOut","netMoneyIn","requestFailed","operatingActivities","getCashFlow","CashFlowTile","isFetched","cashFlowData","tileBulletStylist","tileBulletLabelStylist","TileBullet","bulletLabel","moneySummary","expense","placeholderBulletsStylist","placeholderLabelCss","placeholderLabelStylist","PlaceholderBullets","bulletAmount","shimmer","summationsStylist","DEFAULT_TILE_COLORS","ExpenseTile","monthIndex","tileColors","expenseData","summationLabel","hasExpenses","reviewReportsButtonStylist","ReviewReportsButton","monthlyReviewSectionStylist","BusinessOwnerMonthlyReviewSection","handleDateChange","todayPeriod","showSamples","monthRange","period1","period2","year1","year2","month1","month2","bannerShimmerStyle","BannerShimmer","transactionSortDefs","useTransactionSort","Check","checkboxCss","uncheckedCss","checkedCss","CheckboxInput","checked","uncontrolledChecked","setUncontrolledChecked","isChecked","checkboxCellStylist","CheckboxCell","SubContent","dateCellStylist","DateCell","annotation","withdrawalCss","depositCss","transactionTypeLabel","transaction","labelData","isRefund","TransactionDateCell","typeLabel","typeLabelStylist","SourceCell","TransactionSourceCell","bankTransaction","convertCentsToDollars","div","convertDollarsToCents","dollars","times","getSignedAmount","AmountCell","bankAccountCellStylist","BankAccountCell","accountName","formatGlAccount","accountNo","cellButtonStylist","CellButton","forwardRef","PopupListContext","register","unregister","focusedIndex","isMousing","isScrolling","listRef","incrementFocusedState","newIndex","repeat","maxIndex","decrementFocusedState","reducer","sortByDocumentPosition","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_CONTAINED_BY","DOCUMENT_POSITION_PRECEDING","DOCUMENT_POSITION_CONTAINS","isElementVisible","container","containerRect","getBoundingClientRect","elementRect","getFocusedRowData","sortedNodes","sortedMap","node","useKeyboardNavigation","cascadeManager","listElement","onKeyboardSelect","shouldOpenCascade","shouldCloseCascade","isLeftPlaced","inCascade","openKey","hasCascading","closeKey","allowSpaceClick","HTMLInputElement","cascadeHandled","setCascadeState","setFocus","clickEvent","view","cancelable","dispatchEvent","preventDefault","removeEventListener","useListData","itemMap","setItemMap","focusedState","setIsMousing","setIsScrolling","parentListContext","setFocusedState","useReducer","onFocus","mouseTarget","hoverNav","targetingListItem","HTMLElement","getAttribute","movementX","movementY","keyboardNav","isIncrement","shiftKey","isDecrement","scrollingNav","prevMap","nextMap","newMap","startDelay","cancelDelay","closeCurrentCascade","lastOpenedIndex","PopupCascadeContext","cascadeIndex","onScroll","focus","PopupList","popupListStylist","setCascadeIndex","setLastOpenedIndex","usePopupCascadeManager","listData","tabIndex","useListRow","itemRef","useLayoutEffect","scrollIntoView","behavior","block","inline","itemProps","ListRow","PopupRow","StrongContent","contentStylist","PlaceholderPopupRow","PlaceholderPopupList","creditGlAccountTypes","useFilterGlAccountsByType","glAccounts","types","getExpandedGlAccountFromFullGlAccount","glAccountsKeys","getGlAccounts","leavesOnly","prefixEntityIds","useGlAccounts","useFlatGlAccountsWithLeaves","buildFlatGlAccountsWithLeaves","collectLeafAccounts","childrenByParentAccountNo","directChildren","flatMap","isRootGlAccount","parentAccountNo","buildGlAccountsWithLeaves","childrenMap","rootAccount","iconStyles","marginRight","fuseOptions","threshold","includeScore","minMatchCharLength","addChildToSearchResults","parent","matchingChildren","c","processSearchResults","searchResults","filteredGlAccounts","matchingAccount","parentAccount","GlAccountSearchList","searchTerm","fuse","Fuse","processedSearchResults","search","CascadeTrigger","CascadeRow","triggerChildren","popupChildren","triggerProps","expandableRowStylist","ExpandableRow","icon","displayLabel","GlAccountCascadingList","GlAccountCascadeRowPopup","searchInputStylist","PopupSearch","setSearchTerm","placeholder","inputRef","preventScroll","handleKeyDown","document","activeElement","ctrlKey","altKey","metaKey","onChange","GlAccountPopupList","popupListWidthCss","handleGlAccountChange","useEntityMutation","mutationFn","onMutateFn","useMutation","onMutate","updateBankTransactions","postBankTransactions","updateSingleBankTransaction","useBankTransactionsMutation","keysToInvalidate","useSingleBankTransactionMutation","GlAccountSelector","mutate","glAccountExpanded","parentId","parentsChildren","childTransaction","updatedChildren","expenseCategoryKeys","getTransactionCategories","categories","parentCategoryId","useExpenseCategories","buildChildrenMap","buildFlatExpenseCategoriesWithChildren","buildNestedExpenseCategories","getExpandedCategoryFromFullCategory","matchingCategory","parentCategory","ExpenseCategorySearchList","categoryRes","isEmpty","isParentOnly","ExpenseCascadeRowPopup","handleCategoryChange","ExpenseCategoryCascadingList","hasChilds","ExpenseCategoryPopupList","parentPopupContext","Advertising","Uncategorized","Meals","Sports","Bedding","Airplane","Vehicle","CategoryIcon","ExpenseCategorySelector","categoryId","Split","buttonTextContainer","buttonContentContainer","ParentExpenseCategoryCell","childCategories","categoryName","categorySet","categoryList","mainLabel","ExpenseCategoryCell","TARGET_ACC_NO_LEN","formatAccountName","paddingNeeded","getBankTransferDirection","getFormBankAccountDescription","isBankTransfer","apiAccountName","apiAccountNo","CategoryCell","ClassSegmentCell","REVIEW_STATUSES","CircleCheck","Processing","badgeCss","neutral","highlight","critical","baseBadgeStylist","transitionStylist","neutralStylist","highlightStylist","successStylist","warningStylist","criticalStylist","Badge","colorStylist","badgeStylist","UserContext","userRole","userEmail","ownerDisplayedStatuses","accountantDisplayedStatuses","getDisplayedStatuses","ReviewStatusPopup","displayedStatuses","getBadgeInfo","reviewNeeded","reviewPending","reviewPendingUser","discrepancy","reconciled","ReviewStatusSelector","showPopup","setShowPopup","closePopup","handleBadgeClick","ReviewStatusCell","ArrowUp","clipPath","ArrowDown","ExpanderCell","getCanExpand","TransactionExpanderCell","Dash","commentIconBadgeStylist","commentStylist","commentIconStylist","dashIconStylist","CommentCell","hasConversation","hasRead","TransactionCommentCell","conversationRes","transactionsTableColumns","getParentRow","getIsSelected","getToggleSelectedHandler","clickable","info","classSegments","getValue","getColumns","getColumnVisibility","useUnselectableTransactionsTable","transactions","getRowCanExpand","getSubRows","originalRow","matchingBankTransaction","rule","tax","paymentInfo","customData","getExpandedRowModel","paginateExpandedRows","columnOrder","columnVisibility","openTransactionForm","transactionToEditId","hasChildren","isStaticCategoryCell","parentRow","toggleExpanded","TransactionsTableRow","hasSelect","totalVisibleCells","TransactionsAllCaughtUpZeroState","PlaidLinkButton","noBankAccountsText","noBankAccountSubText","NoBankAccountsZeroState","businessOwnerTransactionTableSectionLayout","BusinessOwnerTransactionTableSection","hasLinkedAccount","ZeroState","hasSomeLinkedBankAccount","allTransactionsReviewed","BusinessOwnerTransactionsData","transactionApiSort","transactionRes","transactionIsFilling","isBankAccountsFilling","dashboardCSS","dashboardWrapperCSS","sampleText","noSummaryForThisMonthText","handleScrollAction","taskType","sectionId","section","getElementById","hasSingleTransctionFilter","BusinessOwnerDashboardInternal","controlledPeriod","onChangePeriod","conversationSortInstance","setConversationSortInstance","conversationApiSort","conversationIsFilling","conversationPaginationControls","taskData","isTasksFilling","hasPlaidLinkedBank","plaidItemsWithErrors","taskBanners","plaidErrorBanners","plaidLinkBanners","tasks","hasTransactions","todayDate","yearRange","summaryText","financialSummaryText","newPeriod","BusinessOwnerDashboardComponent","dbPromise","openDB","db","createObjectStore","persistOptions","persister","persistClient","val","put","restoreClient","removeClient","createQueryPersister","maxAge","dehydrateOptions","shouldDehydrateQuery","isStale","QueryProvider","PersistQueryClientProvider","ErrorBoundary","overlayCss","backdropCss","backdropStylist","drawerContainerStylist","DrawerOverlay","clickStartTarget","onMouseDown","clickStartedOnBackdrop","clickEndedOnBackdrop","DrawerContext","DrawerRouter","DrawerRoute","activeHistory","at","activeDrawer","errorSubLabelStylist","errorIconStyles","errorContainerStylist","ErrorLabel","baseFormInputStyles","errorFormInputStyles","FormInput","isDefaultValue","additionalStyles","onBlur","disableHover","baseStyles","isClicked","setIsClicked","setSelectionRange","formContext","fieldContext","useFieldContext","useFormContext","createFormHookContexts","disabledClassName","normalClassName","kind","EditableFormInput","useStore","errors","handleBlur","secondaryButtonStylist","ButtonSecondary","splitIconStylist","AddSplitButton","stopPropagation","categoryStylist","discreteFormInputStyles","DiscreteFormInput","popupContentStylist","DropdownContent","onSelect","selectedLabel","option","clickableLabelStylist","DropdownSelector","popupProps","selectorContainerStylist","monthOptions","MonthYearSelector","currentMonthYear","onMonthYearChange","currentMonth","handleMonthYearChange","newDate","calendarContainerStylist","navButtonStylist","gridStylist","dayHeaderStylist","dayButtonStylist","otherMonthLabelStylist","DaySelectButton","selectedDate","maxDate","isSelected","isTodayDate","isOtherMonth","isAfterMax","DatePickerCalendar","onDateSelect","viewDate","onViewDateChange","currentViewDate","calendarDays","firstDay","startDate","setDate","getDay","lastCalendarDay","showMonthNext","handleDateClick","navigateMonth","monthOffset","setMonth","dateInputStylist","textareaStylist","handleSubmitShortcut","platform","currentTarget","requestSubmit","blurInputOnEnterKeyDown","blur","amountInputStylist","inputContainerStylist","AmountInput","autofocus","NumericFormat","getInputRef","thousandSeparator","decimalScale","onValueChange","floatValue","fixedDecimalScale","onKeyDown","autoFocus","amountStylist","transactionFormSchema","number","refine","nullable","notes","expenseFormSchema","extend","check","schema","sum","issues","bankTransferFormSchema","BOX","CLOVER","STRIPE","PLAID","KNOX","UBER","FRESHBOOKS","HARVEST","KW","FRESHBOOKS2","CAPITAL_ONE","SQUARE","DOTLOOP","REALOGY","UPWORK","SHOPIFY","DEDUCTR","ENTERPRISE","MOXIWORKS","APPDIRECT","LONEWOLF","LONEWOLF_TRANSACTIONDESK","SAMPLE_BANK","TAXBOT","GUSTO","XERO","UNIT","MOOV","QBO","QUALPAY","BENCH","PARTNER_IMPLEMENTATION","CHECK","RUTTER","WAVE","MANUAL_ENTRY","CSV_IMPORT","nullish","matchingAmount","when","pick","isManualTransaction","createTransactionOptionLabel","BankAccountPopupList","bankAccountStylist","BankAccountSelector","fetchParams","BankTransferPopupList","bankTransfers","transfer","placeholderTextStylist","revenueFormSchema","TAX_REGION_OPTIONS","TAX_QUARTER_OPTIONS","TAX_REGION_ARRAY","TAX_QUARTER_ARRAY","taxPaymentFormSchema","region","quarter","superRefine","ctx","addIssue","glAccountStylist","textWrap","ButtonGridLayout","cols","gridTemplateRows","groupButtonStylist","zIndex","ButtonGroupButton","selected","ButtonGrid","GenericSelectorFieldPopup","handleChange","placeholderCss","bankTransactionFormEmptyDefaultValues","useAppForm","withForm","createFormHook","formComponents","SaveButton","showIcon","textContent","fieldComponents","DiscreteAmountField","ExpenseCategoryField","childrenField","totalAmount","handleAddSplit","firstHalf","secondHalf","pushValue","DateInput","editable","setViewDate","inputValue","setInputValue","handleInputChange","maskedValue","digits","parsedDate","finalDate","displayValue","popupOpen","setPopupOpen","handlePopupOpenChange","inputDate","setInputValueToLatestAllowedDate","FormInputWrapper","maxLength","autoComplete","TextAreaInput","resizeable","resize","SplitExpenseCategoryField","SplitExpenseAmountField","clicked","setClicked","BankAccountField","fullBankAccount","GlAccountField","BankGlAccountField","glAccountFromBankAccount","gl","MatchingBankTransferField","textStylists","matchingBankTransfer","ButtonGroupField","GenericSelectorField","useBankTransactionForm","defaultValues","validators","onSubmit","classSegmentIds","segment","matchingBankTransactionId","formApi","keepDefaultValues","onSubmitInvalid","Delete","splitRowStylist","horizontalDividerStylist","removeButtonStylist","amountContainerStylist","SplitExpenseRow","numRows","removeSplit","form","AppField","subField","splitRowContainerStylist","splitContainerClassName","borderClassName","SplitExpenseSection","errorObjects","validErrors","splitContainerStylist","removeValue","setFieldValue","validate","expenseChild","lastSplitCategory","lastSplitClassSegments","lastGlAccount","ExpenseCategorySection","Subscribe","selector","drawerStylist","_focus","Drawer","focusRef","sidePanelStylist","overflowX","FormSidePanelNavigation","FormNavigationButton","conversationContainerStylist","ConversationContainer","emojiMap","thumbs_up","thumbs_down","red_heart","hundred_points","eyes","isCldrShortName","cldrShortName","toEmoji","ThumbsUp","reactionCss","userSelect","Reaction","buttonCss","sent","received","reactionsCss","borderWidth","borderStyle","ReactionContainer","reactions","emojiCode","createReaction","deleteReaction","getMessageQueryKey","invalidateQueriesOnSuccess","getCopyOfUpdatedMessages","messageIndex","newMessages","useCreateReactionMutation","cancelQueries","oldMessages","getQueryData","setQueryData","currentMessages","newMessage","authorInfo","onSettled","useDeleteReactionMutation","modifiedReactions","reactionButtonCss","allReactions","emoji","AddReactionButton","messageId","reactionIsOpen","setReactionIsOpen","isSameEmoji","isSameUser","useMessageInteractions","containerRef","isHover","setIsHover","hidePopup","contains","appliedReactionRecipe","AppliedReactionContainer","appliedReactionCss","messagePositionCss","hasReactionsOnMessage","messageCss","wordBreak","messageContainerCss","Message","sentByCurrentUser","messageWithReactionRef","allowedReactions","messageGroupStylist","MessageGroup","messageLogStylist","flexFlow","scrollbarWidth","scrollReferenceCss","scrollAttribute","MessageLog","messageGroups","scrollRef","setAttribute","messageFormSchema","sharedStyles","preRaw","visibility","fontSizeAdjust","fontStretch","fontVariant","textAlignLast","textDecoration","textEmphasis","textIndent","textJustify","textShadow","textTransform","preStyles","textAreaRaw","appearance","textAreaCss","inputWrapperCss","referenceElementCss","footerCss","sendButtonCss","paddingInline","MessageAreaInput","blockSubmit","canSubmit","messageFormCss","MessageForm","addMessage","formRef","formElement","isConversationLoading","submitEvent","SubmitEvent","handleSubmit","createPlaceholderMessage","createdDateTime","useCreateMessageMutation","old","PlaceholderMessage","updateSingleConversation","updateConversation","postSingleConversation","separatorCss","layoutCss","resolvedMessage","ResolutionMessage","resolver","resolverMessage","conversationFooterStylist","createConversationObject","Conversation","setConversationId","isResolved","isUnread","createConversation","isPending","variables","bankTransactionId","conversationKeysToInvalidate","allBankTransactionKeysToInvalidate","btnKeyParams","singleBankTransactionKeysToInvalidate","btnInvalidate","markConversationAsRead","isNewConversation","groups","groupIndex","isSent","newConvoObject","borderStylist","DrawerHeaderBorder","DrawerHeader","ConversationPanel","setId","conversationData","containerStylist","panelRowStylist","formStylist","mainFormBodyStylist","dividerCss","BankTransactionForm","Header","activeTab","setActiveTab","tabOnClick","tab","formDescriptionCellStylist","formDescriptionCellTextStylist","FormInfoCell","transactionDescription","bankAccountDescription","closeButtonStylist","CloseButton","Dots","ActionMenu","TRANSACTION_STATUSES","DeleteActionRow","handleDelete","then","RestoreActionRow","restoreTransaction","headerLeftStylist","DrawerHeaderGroup","TransactionFormHeader","useTransactionFormData","showBankAccountField","ExpenseForm","ExpenseFormHeader","BankTransferForm","BankTransferFormHeader","RevenueForm","RevenueFormHeader","TaxPaymentForm","TaxPaymentFormHeader","BankTransactionFormRouter","ConversationHeader","ConversationDrawer","Drawers","EnvironmentProvider","sdkIntrospectKeys","getUserInfo","UserContextProvider","Tight","authContextValue","setProperties","ConfirmationRoot"],"mappings":"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"}