├── .dockerignore ├── .editorconfig ├── .firebaserc ├── .github └── workflows │ ├── build_and_deploy.yaml │ ├── check.yaml │ ├── main_push.yaml │ ├── pull_request.yaml │ └── tags_push.yaml ├── .gitignore ├── .prettierignore ├── .tool-versions ├── .vscode ├── .user-settings.sample.json ├── extensions.json ├── launch.json └── settings.json ├── Dockerfile ├── Dockerfile_local ├── LICENSE ├── README.md ├── firebase.json ├── lefthook.yml ├── package.json ├── packages-licenses.json ├── packages ├── app-builder │ ├── .env.example │ ├── .gitignore │ ├── README.md │ ├── eslint.config.mjs │ ├── package.json │ ├── postcss.config.js │ ├── public │ │ ├── favicon.ico │ │ ├── favicons │ │ │ ├── android-chrome-192x192.png │ │ │ ├── android-chrome-512x512.png │ │ │ ├── apple-touch-icon.png │ │ │ ├── favicon-16x16.png │ │ │ └── favicon-32x32.png │ │ ├── fonts │ │ │ └── Inter │ │ │ │ ├── Inter-Black.woff │ │ │ │ ├── Inter-Black.woff2 │ │ │ │ ├── Inter-BlackItalic.woff │ │ │ │ ├── Inter-BlackItalic.woff2 │ │ │ │ ├── Inter-Bold.woff │ │ │ │ ├── Inter-Bold.woff2 │ │ │ │ ├── Inter-BoldItalic.woff │ │ │ │ ├── Inter-BoldItalic.woff2 │ │ │ │ ├── Inter-ExtraBold.woff │ │ │ │ ├── Inter-ExtraBold.woff2 │ │ │ │ ├── Inter-ExtraBoldItalic.woff │ │ │ │ ├── Inter-ExtraBoldItalic.woff2 │ │ │ │ ├── Inter-ExtraLight.woff │ │ │ │ ├── Inter-ExtraLight.woff2 │ │ │ │ ├── Inter-ExtraLightItalic.woff │ │ │ │ ├── Inter-ExtraLightItalic.woff2 │ │ │ │ ├── Inter-Italic.woff │ │ │ │ ├── Inter-Italic.woff2 │ │ │ │ ├── Inter-Light.woff │ │ │ │ ├── Inter-Light.woff2 │ │ │ │ ├── Inter-LightItalic.woff │ │ │ │ ├── Inter-LightItalic.woff2 │ │ │ │ ├── Inter-Medium.woff │ │ │ │ ├── Inter-Medium.woff2 │ │ │ │ ├── Inter-MediumItalic.woff │ │ │ │ ├── Inter-MediumItalic.woff2 │ │ │ │ ├── Inter-Regular.woff │ │ │ │ ├── Inter-Regular.woff2 │ │ │ │ ├── Inter-SemiBold.woff │ │ │ │ ├── Inter-SemiBold.woff2 │ │ │ │ ├── Inter-SemiBoldItalic.woff │ │ │ │ ├── Inter-SemiBoldItalic.woff2 │ │ │ │ ├── Inter-Thin.woff │ │ │ │ ├── Inter-Thin.woff2 │ │ │ │ ├── Inter-ThinItalic.woff │ │ │ │ ├── Inter-ThinItalic.woff2 │ │ │ │ ├── Inter-italic.var.woff2 │ │ │ │ ├── Inter-roman.var.woff2 │ │ │ │ ├── Inter.var.woff2 │ │ │ │ ├── LICENSE.txt │ │ │ │ └── inter.css │ │ ├── img │ │ │ ├── home │ │ │ │ ├── api.png │ │ │ │ ├── scenario-guide.png │ │ │ │ ├── testrun.png │ │ │ │ └── workflow.png │ │ │ └── lottie │ │ │ │ └── login_hero.json │ │ └── site.webmanifest │ ├── scripts │ │ ├── generateRoutes.sh │ │ └── generateRoutes.ts │ ├── src │ │ ├── components │ │ │ ├── Annotations │ │ │ │ ├── ClientDocumentsList.tsx │ │ │ │ ├── ClientTagsList.tsx │ │ │ │ └── FileDownload.tsx │ │ │ ├── AstBuilder │ │ │ │ ├── Operand.tsx │ │ │ │ ├── OperandInfos.tsx │ │ │ │ ├── OperandTypeInfos.tsx │ │ │ │ ├── Provider.tsx │ │ │ │ ├── Root.tsx │ │ │ │ ├── edition │ │ │ │ │ ├── EditModal │ │ │ │ │ │ ├── Container.tsx │ │ │ │ │ │ ├── EditModal.tsx │ │ │ │ │ │ └── modals │ │ │ │ │ │ │ ├── Aggregation │ │ │ │ │ │ │ ├── Aggregation.tsx │ │ │ │ │ │ │ ├── EditDataModelField.tsx │ │ │ │ │ │ │ └── EditFilters.tsx │ │ │ │ │ │ │ ├── FuzzyMatchComparator │ │ │ │ │ │ │ ├── EditAlgorithm.tsx │ │ │ │ │ │ │ ├── EditLevel.tsx │ │ │ │ │ │ │ ├── EditThreshold.tsx │ │ │ │ │ │ │ ├── Examples.tsx │ │ │ │ │ │ │ ├── FuzzyMatchAggregation.tsx │ │ │ │ │ │ │ ├── FuzzyMatchComparator.tsx │ │ │ │ │ │ │ ├── InnerFuzzyMatchModal.tsx │ │ │ │ │ │ │ └── helpers.ts │ │ │ │ │ │ │ ├── IsMultipleOf │ │ │ │ │ │ │ ├── Examples.tsx │ │ │ │ │ │ │ └── IsMultipleOf.tsx │ │ │ │ │ │ │ ├── StringTemplate │ │ │ │ │ │ │ ├── StringTemplate.tsx │ │ │ │ │ │ │ ├── StringTemplateForm.tsx │ │ │ │ │ │ │ └── helpers.ts │ │ │ │ │ │ │ ├── TimeAdd │ │ │ │ │ │ │ ├── DurationUnitSelect.tsx │ │ │ │ │ │ │ ├── TimeAdd.tsx │ │ │ │ │ │ │ └── helpers.ts │ │ │ │ │ │ │ └── TimestampExtract │ │ │ │ │ │ │ ├── TimestampExtract.tsx │ │ │ │ │ │ │ └── helpers.tsx │ │ │ │ │ ├── EditionAndRoot.tsx │ │ │ │ │ ├── EditionAnyRoot.tsx │ │ │ │ │ ├── EditionNode.tsx │ │ │ │ │ ├── EditionOperand.tsx │ │ │ │ │ ├── EditionOrWithAndRoot.tsx │ │ │ │ │ ├── EvaluationErrors.tsx │ │ │ │ │ ├── OperandMenu │ │ │ │ │ │ ├── DiscoveryList.tsx │ │ │ │ │ │ ├── MenuOption.tsx │ │ │ │ │ │ ├── SearchResults.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── OperatorSelect.tsx │ │ │ │ │ ├── base-options.ts │ │ │ │ │ ├── coerceToConstantAstNode.spec.ts │ │ │ │ │ ├── coerceToConstantAstNode.ts │ │ │ │ │ ├── helpers.ts │ │ │ │ │ ├── hooks │ │ │ │ │ │ └── useRoot.ts │ │ │ │ │ └── node-store.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── styles │ │ │ │ │ ├── AddLogicalOperatorButton.tsx │ │ │ │ │ ├── LogicalOperatorLabel.tsx │ │ │ │ │ ├── NodeTypeError.tsx │ │ │ │ │ ├── OperandDisplayName.tsx │ │ │ │ │ └── RemoveButton.tsx │ │ │ │ ├── types.ts │ │ │ │ └── viewing │ │ │ │ │ ├── ViewingAndRoot.tsx │ │ │ │ │ ├── ViewingAnyRoot.tsx │ │ │ │ │ ├── ViewingEvaluationErrors.tsx │ │ │ │ │ ├── ViewingNode.tsx │ │ │ │ │ ├── ViewingOperand.tsx │ │ │ │ │ ├── ViewingOperator.tsx │ │ │ │ │ ├── ViewingOrWithAndRoot.tsx │ │ │ │ │ └── helpers.ts │ │ │ ├── Auth │ │ │ │ ├── AuthError.tsx │ │ │ │ ├── PopupBlockedError.tsx │ │ │ │ ├── ResetPassword.tsx │ │ │ │ ├── SendEmailVerification.tsx │ │ │ │ ├── SignInWithEmailAndPassword.tsx │ │ │ │ ├── SignInWithGoogle.tsx │ │ │ │ ├── SignInWithMicrosoft.tsx │ │ │ │ ├── SignUpWithEmailAndPassword.tsx │ │ │ │ └── auth-i18n.ts │ │ │ ├── Breadcrumbs.tsx │ │ │ ├── Callout.tsx │ │ │ ├── CaseManager │ │ │ │ ├── DecisionPanel │ │ │ │ │ └── DecisionPanel.tsx │ │ │ │ ├── Drawer │ │ │ │ │ ├── Drawer.tsx │ │ │ │ │ └── DrawerIcon.tsx │ │ │ │ ├── PivotsPanel │ │ │ │ │ ├── DataCard.tsx │ │ │ │ │ ├── PivotAnnotations.tsx │ │ │ │ │ ├── PivotNavigationOptions.tsx │ │ │ │ │ ├── PivotsPanel.tsx │ │ │ │ │ └── PivotsPanelContent.tsx │ │ │ │ └── SnoozePanel │ │ │ │ │ └── SnoozePanel.tsx │ │ │ ├── Cases │ │ │ │ ├── CaseAlerts.tsx │ │ │ │ ├── CaseAssignedTo.tsx │ │ │ │ ├── CaseContributors.tsx │ │ │ │ ├── CaseDetails.tsx │ │ │ │ ├── CaseEvents.tsx │ │ │ │ ├── CaseFile.tsx │ │ │ │ ├── CasePivotValues.tsx │ │ │ │ ├── CaseRightPanel.tsx │ │ │ │ ├── CaseStatus.tsx │ │ │ │ ├── CaseTags.tsx │ │ │ │ ├── CasesList.tsx │ │ │ │ ├── Events │ │ │ │ │ ├── CaseAssignedDetail.tsx │ │ │ │ │ ├── CaseCreated.tsx │ │ │ │ │ ├── CaseSnoozed.tsx │ │ │ │ │ ├── CaseUnsnoozed.tsx │ │ │ │ │ ├── CommentAdded.tsx │ │ │ │ │ ├── DecisionAdded.tsx │ │ │ │ │ ├── DecisionReviewed.tsx │ │ │ │ │ ├── FileAdded.tsx │ │ │ │ │ ├── Filters │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── InboxChanged.tsx │ │ │ │ │ ├── NameUpdated.tsx │ │ │ │ │ ├── OutcomeUpdated.tsx │ │ │ │ │ ├── RuleSnoozed.tsx │ │ │ │ │ ├── SarCreated.tsx │ │ │ │ │ ├── SarDeleted.tsx │ │ │ │ │ ├── SarFileUploaded.tsx │ │ │ │ │ ├── SarStatusChanged.tsx │ │ │ │ │ ├── StatusUpdated.tsx │ │ │ │ │ ├── TagsUpdated.tsx │ │ │ │ │ └── Time.tsx │ │ │ │ ├── Filters │ │ │ │ │ ├── CasesFiltersBar.tsx │ │ │ │ │ ├── CasesFiltersContext.tsx │ │ │ │ │ ├── CasesFiltersMenu.tsx │ │ │ │ │ ├── FilterDetail │ │ │ │ │ │ ├── CasesDateRangeFilter.tsx │ │ │ │ │ │ ├── CasesExcludeAssignedFilter.tsx │ │ │ │ │ │ ├── CasesSnoozedFilter.tsx │ │ │ │ │ │ ├── ClosedCasesFilter.tsx │ │ │ │ │ │ ├── FilterDetail.tsx │ │ │ │ │ │ ├── NameFilter.tsx │ │ │ │ │ │ ├── StatusesFilter.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── filters.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── RequiredActions.tsx │ │ │ │ ├── cases-i18n.ts │ │ │ │ └── index.ts │ │ │ ├── CopyToClipboardButton.tsx │ │ │ ├── Data │ │ │ │ ├── DataModelFlow.tsx │ │ │ │ ├── IngestedObjectDetail.tsx │ │ │ │ ├── IngestedObjectDetailModal.tsx │ │ │ │ ├── LinkToSingleEdge.tsx │ │ │ │ ├── PivotDetails.tsx │ │ │ │ ├── PivotType.tsx │ │ │ │ ├── SelectedPivot.tsx │ │ │ │ ├── TableDetails.tsx │ │ │ │ ├── TableModelNode.tsx │ │ │ │ └── data-i18n.ts │ │ │ ├── DataModelExplorer │ │ │ │ ├── ClientObjectAnnotationPopover.tsx │ │ │ │ ├── ClientObjectComments.tsx │ │ │ │ ├── ClientObjectDataList.tsx │ │ │ │ ├── DataModelExplorer.tsx │ │ │ │ ├── DataTableRender.tsx │ │ │ │ ├── Provider.tsx │ │ │ │ └── types.ts │ │ │ ├── Decisions │ │ │ │ ├── DecisionDetail.tsx │ │ │ │ ├── DecisionRightPanel.tsx │ │ │ │ ├── DecisionsList.tsx │ │ │ │ ├── Filters │ │ │ │ │ ├── DecisionFiltersBar.tsx │ │ │ │ │ ├── DecisionFiltersContext.tsx │ │ │ │ │ ├── DecisionFiltersMenu.tsx │ │ │ │ │ ├── FilterDetail │ │ │ │ │ │ ├── CaseInboxFilter.tsx │ │ │ │ │ │ ├── DecisionsDateRangeFilter.tsx │ │ │ │ │ │ ├── FilterDetail.tsx │ │ │ │ │ │ ├── HasCaseFilter.tsx │ │ │ │ │ │ ├── OutcomeAndReviewStatusFilter.tsx │ │ │ │ │ │ ├── PivotValueFilter.tsx │ │ │ │ │ │ ├── ScenarioFilter.tsx │ │ │ │ │ │ ├── ScheduledExecutionFilter.tsx │ │ │ │ │ │ ├── TriggerObjectFilter.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── filters.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── OutcomeTag.tsx │ │ │ │ ├── PivotDetail.tsx │ │ │ │ ├── ReviewStatusTag.tsx │ │ │ │ ├── RulesDetail.tsx │ │ │ │ ├── RulesExecutions │ │ │ │ │ ├── RuleExecutionStatus.tsx │ │ │ │ │ └── RulesExecutions.tsx │ │ │ │ ├── SanctionCheckDetail.tsx │ │ │ │ ├── Score.tsx │ │ │ │ ├── ScoreOutcomeThresholds.tsx │ │ │ │ ├── TriggerObjectDetail.tsx │ │ │ │ ├── decisions-i18n.ts │ │ │ │ └── index.ts │ │ │ ├── ErrorComponent.tsx │ │ │ ├── ExternalLink.tsx │ │ │ ├── Files │ │ │ │ ├── AddYourFirstFile.tsx │ │ │ │ └── FilesList.tsx │ │ │ ├── Filters │ │ │ │ ├── AddNewFilterButton.tsx │ │ │ │ ├── ClearAllFilters.tsx │ │ │ │ ├── DateRangeFilter.tsx │ │ │ │ ├── FilterPopover.tsx │ │ │ │ ├── FiltersButton.tsx │ │ │ │ ├── FiltersDropdownMenu.tsx │ │ │ │ ├── SimpleFilter.tsx │ │ │ │ ├── filters-i18n.ts │ │ │ │ └── index.ts │ │ │ ├── Form │ │ │ │ ├── AutoWidthInput.tsx │ │ │ │ ├── DateSelector.tsx │ │ │ │ └── Tanstack │ │ │ │ │ ├── FormErrorOrDescription.tsx │ │ │ │ │ ├── FormInput.tsx │ │ │ │ │ ├── FormLabel.tsx │ │ │ │ │ └── FormTextArea.tsx │ │ │ ├── FormatData.tsx │ │ │ ├── GithubBanner.tsx │ │ │ ├── HelpCenter.tsx │ │ │ ├── Highlight.tsx │ │ │ ├── Layout │ │ │ │ └── LeftSidebar.tsx │ │ │ ├── LottiePlayer.client.tsx │ │ │ ├── MarbleToaster.tsx │ │ │ ├── Navigation.tsx │ │ │ ├── Nudge.tsx │ │ │ ├── Page.tsx │ │ │ ├── PaginationButtons.tsx │ │ │ ├── Paper.tsx │ │ │ ├── Ping │ │ │ │ ├── CornerPing.tsx │ │ │ │ ├── Ping.tsx │ │ │ │ └── index.ts │ │ │ ├── ReactFlow.tsx │ │ │ ├── RightPanel.tsx │ │ │ ├── Sanctions │ │ │ │ ├── DatasetFresshnessBanner.tsx │ │ │ │ ├── DatasetTag.tsx │ │ │ │ ├── DatasetTagSelect.tsx │ │ │ │ ├── EntityProperties.tsx │ │ │ │ ├── MatchCard.tsx │ │ │ │ ├── MatchDetails.tsx │ │ │ │ ├── MatchResult.tsx │ │ │ │ ├── RefineSearchModal.tsx │ │ │ │ ├── SanctionCheckErrors.tsx │ │ │ │ ├── SanctionReview.tsx │ │ │ │ ├── SanctionStatusTag.tsx │ │ │ │ ├── SearchInput.tsx │ │ │ │ ├── StatusRadioGroup.tsx │ │ │ │ ├── StatusTag.tsx │ │ │ │ └── sanctions-i18n.ts │ │ │ ├── Scenario │ │ │ │ ├── Iteration │ │ │ │ │ └── ScenarioIterationMenu.tsx │ │ │ │ ├── Rules │ │ │ │ │ ├── Filters │ │ │ │ │ │ ├── FilterDetail │ │ │ │ │ │ │ ├── FilterDetail.tsx │ │ │ │ │ │ │ └── RuleGroupFilter.tsx │ │ │ │ │ │ ├── RulesFiltersBar.tsx │ │ │ │ │ │ ├── RulesFiltersContext.tsx │ │ │ │ │ │ ├── RulesFiltersMenu.tsx │ │ │ │ │ │ └── filters.ts │ │ │ │ │ ├── RuleGroup.tsx │ │ │ │ │ └── ScoreModifier.tsx │ │ │ │ ├── Sanction │ │ │ │ │ ├── FieldAstFormula.tsx │ │ │ │ │ ├── FieldDataset.tsx │ │ │ │ │ ├── FieldDatasetFilters.tsx │ │ │ │ │ ├── FieldNode.tsx │ │ │ │ │ ├── FieldNodeConcat.tsx │ │ │ │ │ ├── FieldOutcomes.tsx │ │ │ │ │ ├── FieldRuleGroup.tsx │ │ │ │ │ ├── FieldToolTip.tsx │ │ │ │ │ └── MatchOperand.tsx │ │ │ │ ├── ScenarioValidationError.tsx │ │ │ │ ├── ScheduledExecutionsList.tsx │ │ │ │ ├── TestRun │ │ │ │ │ ├── Filters │ │ │ │ │ │ ├── FilterDetail │ │ │ │ │ │ │ ├── CreatorsFilter.tsx │ │ │ │ │ │ │ ├── FilterDetail.tsx │ │ │ │ │ │ │ ├── StartedAfterFilter.tsx │ │ │ │ │ │ │ ├── StatusesFilter.tsx │ │ │ │ │ │ │ ├── VersionsFilter.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── TestRunsFiltersBar.tsx │ │ │ │ │ │ ├── TestRunsFiltersContext.tsx │ │ │ │ │ │ ├── TestRunsFiltersMenu.tsx │ │ │ │ │ │ ├── filters.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── Graphs │ │ │ │ │ │ ├── DistributionOfDecisionChart.tsx │ │ │ │ │ │ ├── FilterTransactionByDecision.tsx │ │ │ │ │ │ └── HamburgerGraph.tsx │ │ │ │ │ ├── Skeletons │ │ │ │ │ │ ├── DistributionOfDecicionSkeleton.tsx │ │ │ │ │ │ └── FilterTransactionByDecicionSkeleton.tsx │ │ │ │ │ ├── TestRunDetails.tsx │ │ │ │ │ ├── TestRunNudge.tsx │ │ │ │ │ ├── TestRunPeriod.tsx │ │ │ │ │ ├── TestRunSelector.tsx │ │ │ │ │ ├── TestRunStatus.tsx │ │ │ │ │ └── TestRunVersions.tsx │ │ │ │ ├── Trigger │ │ │ │ │ ├── ScheduleOption │ │ │ │ │ │ ├── ScheduleOption.tsx │ │ │ │ │ │ ├── ScheduleOptionEditor.tsx │ │ │ │ │ │ ├── ScheduleOptionViewer.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── models.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── TriggerObjectTag.tsx │ │ │ │ ├── Workflow │ │ │ │ │ ├── DetailPanel │ │ │ │ │ │ ├── AddToCaseIfPossibleNode.tsx │ │ │ │ │ │ ├── CaseNameEditor.hook.ts │ │ │ │ │ │ ├── CaseNameEditor.tsx │ │ │ │ │ │ ├── Checklist.tsx │ │ │ │ │ │ ├── CreateCaseNode.tsx │ │ │ │ │ │ ├── DecisionCreatedNode.tsx │ │ │ │ │ │ ├── DetailPanel.tsx │ │ │ │ │ │ ├── SelectInbox.tsx │ │ │ │ │ │ └── shared.ts │ │ │ │ │ ├── Nodes │ │ │ │ │ │ ├── Action.tsx │ │ │ │ │ │ ├── AddToCaseIfPossibleActionContent.tsx │ │ │ │ │ │ ├── CreateCaseActionContent.tsx │ │ │ │ │ │ ├── DecisionCreatedTriggerContent.tsx │ │ │ │ │ │ ├── EmptyNode.tsx │ │ │ │ │ │ ├── Trigger.tsx │ │ │ │ │ │ └── shared.tsx │ │ │ │ │ ├── WorkflowFlow.tsx │ │ │ │ │ ├── WorkflowNudge.tsx │ │ │ │ │ ├── WorkflowProvider.tsx │ │ │ │ │ ├── models │ │ │ │ │ │ ├── nodes.ts │ │ │ │ │ │ └── validation.ts │ │ │ │ │ ├── validate.tsx │ │ │ │ │ └── workflow-i18n.ts │ │ │ │ ├── index.ts │ │ │ │ └── scenario-i18n.ts │ │ │ ├── Schema │ │ │ │ └── SchemaMenu.tsx │ │ │ ├── SecretValue.tsx │ │ │ ├── Settings │ │ │ │ └── FormSelectTimezone.tsx │ │ │ ├── Spinner.tsx │ │ │ ├── Tags │ │ │ │ ├── ColorPreview.tsx │ │ │ │ └── ColorSelect.tsx │ │ │ ├── TransferAlerts │ │ │ │ ├── AlertData.tsx │ │ │ │ ├── AlertStatus.tsx │ │ │ │ ├── AlertsList.tsx │ │ │ │ ├── Filters │ │ │ │ │ ├── AlertsFiltersBar.tsx │ │ │ │ │ ├── AlertsFiltersContext.tsx │ │ │ │ │ ├── AlertsFiltersMenu.tsx │ │ │ │ │ ├── FilterDetail │ │ │ │ │ │ ├── AlertsDateRangeFilter.tsx │ │ │ │ │ │ ├── FilterDetail.tsx │ │ │ │ │ │ ├── MessageFilter.tsx │ │ │ │ │ │ ├── StatusesFilter.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── filters.ts │ │ │ │ │ └── index.ts │ │ │ │ └── alerts-i18n.ts │ │ │ ├── Transfers │ │ │ │ ├── TransferData.tsx │ │ │ │ ├── TransferStatus.tsx │ │ │ │ ├── TransfersList.tsx │ │ │ │ └── transfers-i18n.ts │ │ │ ├── UserInfo.tsx │ │ │ ├── Webhooks │ │ │ │ └── EventTypes.tsx │ │ │ └── index.ts │ │ ├── constants │ │ │ └── sanction-check-entity.tsx │ │ ├── entry.client.tsx │ │ ├── entry.server.tsx │ │ ├── hooks │ │ │ ├── decisions │ │ │ │ └── usePivotValues.ts │ │ │ ├── useCursorPaginatedFetcher.ts │ │ │ ├── useCursorPagination.ts │ │ │ ├── useFormDropzone.ts │ │ │ └── useIntersection.ts │ │ ├── infra │ │ │ ├── feature-access-api.ts │ │ │ ├── firebase.ts │ │ │ ├── marblecore-api.ts │ │ │ └── transfercheck-api.ts │ │ ├── locales │ │ │ ├── ar │ │ │ │ ├── api.json │ │ │ │ ├── auth.json │ │ │ │ ├── cases.json │ │ │ │ ├── common.json │ │ │ │ ├── data.json │ │ │ │ ├── decisions.json │ │ │ │ ├── filters.json │ │ │ │ ├── lists.json │ │ │ │ ├── navigation.json │ │ │ │ ├── sanctions.json │ │ │ │ ├── scenarios.json │ │ │ │ ├── settings.json │ │ │ │ ├── transfercheck.json │ │ │ │ ├── upload.json │ │ │ │ └── workflows.json │ │ │ ├── en │ │ │ │ ├── api.json │ │ │ │ ├── auth.json │ │ │ │ ├── cases.json │ │ │ │ ├── common.json │ │ │ │ ├── data.json │ │ │ │ ├── decisions.json │ │ │ │ ├── filters.json │ │ │ │ ├── lists.json │ │ │ │ ├── navigation.json │ │ │ │ ├── sanctions.json │ │ │ │ ├── scenarios.json │ │ │ │ ├── settings.json │ │ │ │ ├── transfercheck.json │ │ │ │ ├── upload.json │ │ │ │ └── workflows.json │ │ │ └── fr │ │ │ │ ├── api.json │ │ │ │ ├── auth.json │ │ │ │ ├── cases.json │ │ │ │ ├── common.json │ │ │ │ ├── data.json │ │ │ │ ├── decisions.json │ │ │ │ ├── filters.json │ │ │ │ ├── lists.json │ │ │ │ ├── navigation.json │ │ │ │ ├── sanctions.json │ │ │ │ ├── scenarios.json │ │ │ │ ├── settings.json │ │ │ │ ├── transfercheck.json │ │ │ │ ├── upload.json │ │ │ │ └── workflows.json │ │ ├── models │ │ │ ├── analytics.ts │ │ │ ├── api-keys.ts │ │ │ ├── ast-validation.ts │ │ │ ├── astNode │ │ │ │ ├── aggregation.ts │ │ │ │ ├── ast-node.ts │ │ │ │ ├── builder-ast-node-node-operator.ts │ │ │ │ ├── builder-ast-node.ts │ │ │ │ ├── constant.ts │ │ │ │ ├── custom-list.ts │ │ │ │ ├── data-accessor.ts │ │ │ │ ├── multiple-of.ts │ │ │ │ ├── strings.ts │ │ │ │ └── time.ts │ │ │ ├── auth-errors.ts │ │ │ ├── cases.ts │ │ │ ├── custom-list.ts │ │ │ ├── data-model.ts │ │ │ ├── decision.ts │ │ │ ├── duration.ts │ │ │ ├── feature-access.ts │ │ │ ├── fuzzy-match.ts │ │ │ ├── fuzzy-match │ │ │ │ ├── aggregationFuzzyMatchConfig.ts │ │ │ │ ├── baseFuzzyMatchConfig.ts │ │ │ │ └── comparatorFuzzyMatchConfig.ts │ │ │ ├── get-operator-name.ts │ │ │ ├── http-errors.ts │ │ │ ├── inbox.ts │ │ │ ├── index.ts │ │ │ ├── marble-session.ts │ │ │ ├── modale-operators.ts │ │ │ ├── node-evaluation.ts │ │ │ ├── operand-type.ts │ │ │ ├── operator-options.ts │ │ │ ├── organization.ts │ │ │ ├── outcome.ts │ │ │ ├── pagination.ts │ │ │ ├── partner.ts │ │ │ ├── rule-snooze.ts │ │ │ ├── sanction-check-config.ts │ │ │ ├── sanction-check-dataset.ts │ │ │ ├── sanction-check.ts │ │ │ ├── scenario-iteration-rule.ts │ │ │ ├── scenario-iteration.ts │ │ │ ├── scenario-publication.ts │ │ │ ├── scenario-validation.ts │ │ │ ├── scenario.ts │ │ │ ├── signup-status.ts │ │ │ ├── tags.ts │ │ │ ├── testrun.ts │ │ │ ├── toast-session.ts │ │ │ ├── transfer-alert.ts │ │ │ ├── transfer.ts │ │ │ ├── user.ts │ │ │ ├── version.ts │ │ │ └── webhook.ts │ │ ├── queries │ │ │ ├── builder-options.ts │ │ │ ├── client-object-list.ts │ │ │ ├── opensanctions-dataset-freshness-info.ts │ │ │ ├── pivot-related-cases.ts │ │ │ └── validate-ast.ts │ │ ├── repositories │ │ │ ├── AnalyticsRepository.ts │ │ │ ├── ApiKeyRepository.ts │ │ │ ├── AuthenticationRepository.ts │ │ │ ├── CaseRepository.ts │ │ │ ├── CustomListRepository.ts │ │ │ ├── DataModelRepository.ts │ │ │ ├── DecisionRepository.ts │ │ │ ├── EditorRepository.ts │ │ │ ├── FeatureAccessRepository.ts │ │ │ ├── InboxRepository.ts │ │ │ ├── OrganizationRepository.ts │ │ │ ├── PartnerRepository.ts │ │ │ ├── RuleSnoozeRepository.ts │ │ │ ├── SanctionCheckRepository.ts │ │ │ ├── ScenarioIterationRuleRepository.ts │ │ │ ├── ScenarioIterationSanctionRepository.ts │ │ │ ├── ScenarioRepository.ts │ │ │ ├── SessionStorageRepositories │ │ │ │ ├── AuthStorageRepository.ts │ │ │ │ ├── CsrfStorageRepository.ts │ │ │ │ ├── LngStorageRepository.ts │ │ │ │ ├── SessionStorageRepository.ts │ │ │ │ ├── ToastStorageRepository.ts │ │ │ │ └── index.ts │ │ │ ├── SignupStatusRepository.ts │ │ │ ├── TestRunRepository.ts │ │ │ ├── TransferAlertRepository.ts │ │ │ ├── TransferRepository.ts │ │ │ ├── UserRepository.ts │ │ │ ├── VersionRepository.ts │ │ │ ├── WebhookRepository.ts │ │ │ ├── init.client.ts │ │ │ └── init.server.ts │ │ ├── root.tsx │ │ ├── routes │ │ │ ├── $.tsx │ │ │ ├── _auth+ │ │ │ │ ├── _layout.tsx │ │ │ │ ├── email-verification.tsx │ │ │ │ ├── forgot-password.tsx │ │ │ │ ├── sign-in.tsx │ │ │ │ └── sign-up.tsx │ │ │ ├── _builder+ │ │ │ │ ├── _layout.tsx │ │ │ │ ├── analytics.tsx │ │ │ │ ├── api.tsx │ │ │ │ ├── cases+ │ │ │ │ │ ├── $caseId+ │ │ │ │ │ │ ├── _index.tsx │ │ │ │ │ │ └── sanctions.$decisionId+ │ │ │ │ │ │ │ ├── _index.tsx │ │ │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ │ │ ├── files.tsx │ │ │ │ │ │ │ └── hits.tsx │ │ │ │ │ ├── _index.tsx │ │ │ │ │ ├── inboxes.$inboxId.tsx │ │ │ │ │ └── inboxes._layout.tsx │ │ │ │ ├── data+ │ │ │ │ │ ├── _index.tsx │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ ├── list.tsx │ │ │ │ │ ├── schema.tsx │ │ │ │ │ ├── view.$tableName.$objectId.tsx │ │ │ │ │ └── view.tsx │ │ │ │ ├── decisions+ │ │ │ │ │ ├── $decisionId.tsx │ │ │ │ │ ├── _index.tsx │ │ │ │ │ └── _layout.tsx │ │ │ │ ├── lists+ │ │ │ │ │ ├── $listId.tsx │ │ │ │ │ ├── _index.tsx │ │ │ │ │ └── _layout.tsx │ │ │ │ ├── scenarios+ │ │ │ │ │ ├── $scenarioId+ │ │ │ │ │ │ ├── _index.tsx │ │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ │ ├── home.tsx │ │ │ │ │ │ ├── i+ │ │ │ │ │ │ │ └── $iterationId+ │ │ │ │ │ │ │ │ ├── _edit-view+ │ │ │ │ │ │ │ │ ├── _index.tsx │ │ │ │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ │ │ │ ├── decision.tsx │ │ │ │ │ │ │ │ ├── rules.tsx │ │ │ │ │ │ │ │ └── trigger.tsx │ │ │ │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ │ │ │ ├── rules.$ruleId.tsx │ │ │ │ │ │ │ │ └── sanction.tsx │ │ │ │ │ │ ├── scheduled-executions.tsx │ │ │ │ │ │ ├── test-run+ │ │ │ │ │ │ │ ├── $testRunId+ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ └── workflow.tsx │ │ │ │ │ ├── _index.tsx │ │ │ │ │ └── _layout.tsx │ │ │ │ ├── settings+ │ │ │ │ │ ├── _index.tsx │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ ├── api-keys.tsx │ │ │ │ │ ├── data-display.tsx │ │ │ │ │ ├── inboxes.$inboxId.tsx │ │ │ │ │ ├── inboxes._index.tsx │ │ │ │ │ ├── scenarios.tsx │ │ │ │ │ ├── tags.tsx │ │ │ │ │ ├── users.tsx │ │ │ │ │ ├── webhooks.tsx │ │ │ │ │ └── webhooks_.$webhookId.tsx │ │ │ │ └── upload+ │ │ │ │ │ └── $objectType.tsx │ │ │ ├── _index.tsx │ │ │ ├── app-router.tsx │ │ │ ├── healthcheck.ts │ │ │ ├── ressources+ │ │ │ │ ├── auth+ │ │ │ │ │ ├── logout.tsx │ │ │ │ │ └── refresh.tsx │ │ │ │ ├── cases+ │ │ │ │ │ ├── add-comment.tsx │ │ │ │ │ ├── add-rule-snooze.tsx │ │ │ │ │ ├── add-to-case.tsx │ │ │ │ │ ├── close-case.tsx │ │ │ │ │ ├── create-case.tsx │ │ │ │ │ ├── edit-assignee.tsx │ │ │ │ │ ├── edit-inbox.tsx │ │ │ │ │ ├── edit-name.tsx │ │ │ │ │ ├── edit-suspicion.tsx │ │ │ │ │ ├── edit-tags.tsx │ │ │ │ │ ├── escalate-case.tsx │ │ │ │ │ ├── open-case.tsx │ │ │ │ │ ├── pivot+ │ │ │ │ │ │ └── related+ │ │ │ │ │ │ │ └── $pivotValue._index.tsx │ │ │ │ │ ├── review-decision.tsx │ │ │ │ │ ├── review-sanction-match.tsx │ │ │ │ │ └── snooze-case.tsx │ │ │ │ ├── data+ │ │ │ │ │ ├── $tableId.createNavigationOption.tsx │ │ │ │ │ ├── $tableName.list-objects.tsx │ │ │ │ │ ├── create-annotation.tsx │ │ │ │ │ ├── create-pivot.tsx │ │ │ │ │ ├── create-pivot │ │ │ │ │ │ ├── SelectLinkPath.tsx │ │ │ │ │ │ ├── SelectTargetEntity.tsx │ │ │ │ │ │ ├── ValidateSelfPivot.tsx │ │ │ │ │ │ └── selectField.tsx │ │ │ │ │ ├── createField.tsx │ │ │ │ │ ├── createLink.tsx │ │ │ │ │ ├── createTable.tsx │ │ │ │ │ ├── delete-annotation.$annotationId.tsx │ │ │ │ │ ├── editField.tsx │ │ │ │ │ └── editTable.tsx │ │ │ │ ├── decisions+ │ │ │ │ │ └── list-scheduled-execution.tsx │ │ │ │ ├── files+ │ │ │ │ │ └── upload-file.tsx │ │ │ │ ├── lists+ │ │ │ │ │ ├── create.tsx │ │ │ │ │ ├── delete.tsx │ │ │ │ │ ├── edit.tsx │ │ │ │ │ ├── value_create.tsx │ │ │ │ │ └── value_delete.tsx │ │ │ │ ├── locales.ts │ │ │ │ ├── opensanctions+ │ │ │ │ │ └── dataset-freshness.tsx │ │ │ │ ├── rule-snoozes+ │ │ │ │ │ └── read.$ruleSnoozeId.tsx │ │ │ │ ├── sanction-check+ │ │ │ │ │ ├── enrich-match.$matchId.tsx │ │ │ │ │ ├── refine.tsx │ │ │ │ │ └── search.tsx │ │ │ │ ├── scenarios+ │ │ │ │ │ ├── $scenarioId+ │ │ │ │ │ │ ├── $iterationId+ │ │ │ │ │ │ │ ├── activate.tsx │ │ │ │ │ │ │ ├── commit.tsx │ │ │ │ │ │ │ ├── create_draft.tsx │ │ │ │ │ │ │ ├── deactivate.tsx │ │ │ │ │ │ │ ├── prepare.tsx │ │ │ │ │ │ │ ├── rules+ │ │ │ │ │ │ │ │ ├── create.tsx │ │ │ │ │ │ │ │ ├── delete.tsx │ │ │ │ │ │ │ │ └── duplicate.tsx │ │ │ │ │ │ │ ├── sanctions+ │ │ │ │ │ │ │ │ ├── create.tsx │ │ │ │ │ │ │ │ └── delete.tsx │ │ │ │ │ │ │ └── validate-with-given-trigger-or-rule.tsx │ │ │ │ │ │ ├── builder-options.tsx │ │ │ │ │ │ ├── testrun+ │ │ │ │ │ │ │ ├── $testRunId+ │ │ │ │ │ │ │ │ └── cancel.tsx │ │ │ │ │ │ │ └── create.tsx │ │ │ │ │ │ └── validate-ast.tsx │ │ │ │ │ ├── create.tsx │ │ │ │ │ └── update.tsx │ │ │ │ ├── settings+ │ │ │ │ │ ├── api-keys+ │ │ │ │ │ │ ├── create.tsx │ │ │ │ │ │ └── delete.tsx │ │ │ │ │ ├── inboxes+ │ │ │ │ │ │ ├── create.tsx │ │ │ │ │ │ ├── delete.tsx │ │ │ │ │ │ ├── inbox-users.create.tsx │ │ │ │ │ │ ├── inbox-users.delete.tsx │ │ │ │ │ │ ├── inbox-users.update.tsx │ │ │ │ │ │ └── update.tsx │ │ │ │ │ ├── tags+ │ │ │ │ │ │ ├── create.tsx │ │ │ │ │ │ ├── delete.tsx │ │ │ │ │ │ └── update.tsx │ │ │ │ │ ├── users+ │ │ │ │ │ │ ├── create.tsx │ │ │ │ │ │ ├── delete.tsx │ │ │ │ │ │ └── update.tsx │ │ │ │ │ └── webhooks+ │ │ │ │ │ │ ├── create.tsx │ │ │ │ │ │ ├── delete.tsx │ │ │ │ │ │ └── update.tsx │ │ │ │ └── user+ │ │ │ │ │ └── language.tsx │ │ │ └── transfercheck+ │ │ │ │ ├── $.tsx │ │ │ │ ├── _index.tsx │ │ │ │ ├── _layout.tsx │ │ │ │ ├── alerts+ │ │ │ │ ├── _.received.$alertId.tsx │ │ │ │ ├── _.sent.$alertId.tsx │ │ │ │ ├── _index.tsx │ │ │ │ ├── _layout.tsx │ │ │ │ ├── received.tsx │ │ │ │ └── sent.tsx │ │ │ │ ├── ressources+ │ │ │ │ ├── alert.create.tsx │ │ │ │ ├── alert.update.status.tsx │ │ │ │ └── alert.update.tsx │ │ │ │ └── transfers+ │ │ │ │ ├── $transferId.tsx │ │ │ │ └── _index.tsx │ │ ├── services │ │ │ ├── DownloadFilesService.ts │ │ │ ├── ast-node │ │ │ │ ├── formatConstant.ts │ │ │ │ ├── getAstNodeDataType.ts │ │ │ │ ├── getAstNodeDisplayName.ts │ │ │ │ ├── getAstNodeOperandType.ts │ │ │ │ ├── getCustomListAccessCustomList.ts │ │ │ │ └── getDataAccessorAstNodeField.ts │ │ │ ├── auth │ │ │ │ ├── auth.client.ts │ │ │ │ ├── auth.server.ts │ │ │ │ └── session.server.ts │ │ │ ├── data │ │ │ │ ├── data-model.tsx │ │ │ │ ├── pivot.spec.tsx │ │ │ │ └── pivot.tsx │ │ │ ├── documentation-href.ts │ │ │ ├── editor │ │ │ │ └── editor-mode.tsx │ │ │ ├── feature-access.ts │ │ │ ├── i18n │ │ │ │ ├── i18n-config.ts │ │ │ │ ├── i18next.client.ts │ │ │ │ ├── i18next.d.ts │ │ │ │ ├── i18next.server.ts │ │ │ │ ├── resources │ │ │ │ │ ├── ar.server.ts │ │ │ │ │ ├── en.server.ts │ │ │ │ │ ├── fr.server.ts │ │ │ │ │ └── resources.server.ts │ │ │ │ └── translation-keys │ │ │ │ │ └── api-key.ts │ │ │ ├── init.client.ts │ │ │ ├── init.server.ts │ │ │ ├── monitoring.ts │ │ │ ├── organization │ │ │ │ ├── organization-detail.tsx │ │ │ │ ├── organization-object-tags.tsx │ │ │ │ ├── organization-tags.tsx │ │ │ │ └── organization-users.tsx │ │ │ ├── segment │ │ │ │ ├── SegmentScript.tsx │ │ │ │ ├── getPageviewNameAndProps.ts │ │ │ │ ├── index.tsx │ │ │ │ └── segment.server.ts │ │ │ ├── user.ts │ │ │ └── validation │ │ │ │ ├── ast-node-validation.ts │ │ │ │ ├── index.ts │ │ │ │ ├── scenario-validation-error-messages.ts │ │ │ │ └── scenario-validation.ts │ │ ├── tailwind.css │ │ ├── tests │ │ │ └── setup │ │ │ │ └── i18next.ts │ │ ├── types │ │ │ └── operand-options.ts │ │ └── utils │ │ │ ├── browser.ts │ │ │ ├── create-context.tsx │ │ │ ├── currencies.ts │ │ │ ├── datetime.ts │ │ │ ├── download-file.ts │ │ │ ├── environment.ts │ │ │ ├── files.ts │ │ │ ├── form.ts │ │ │ ├── format.ts │ │ │ ├── hooks │ │ │ ├── index.ts │ │ │ ├── use-async.ts │ │ │ ├── use-callback-ref.ts │ │ │ ├── use-compose-refs.ts │ │ │ ├── use-interval.ts │ │ │ ├── use-isomorphic-layout-effect.ts │ │ │ └── use-visibility-change.ts │ │ │ ├── http │ │ │ ├── handle-errors.ts │ │ │ ├── http-responses.ts │ │ │ └── http-status-codes.ts │ │ │ ├── input-validation.ts │ │ │ ├── list.ts │ │ │ ├── parse.ts │ │ │ ├── preferences-cookies │ │ │ ├── config.ts │ │ │ ├── preferences-cookie-read.server.ts │ │ │ └── preferences-cookies-write.ts │ │ │ ├── routes │ │ │ ├── index.ts │ │ │ ├── routes.ts │ │ │ └── types.ts │ │ │ ├── schema │ │ │ ├── dataTypeSchema.ts │ │ │ ├── filterSchema.ts │ │ │ └── shortUUIDSchema.ts │ │ │ ├── search │ │ │ ├── filter.ts │ │ │ ├── highlight.ts │ │ │ └── index.ts │ │ │ ├── short-uuid.ts │ │ │ ├── sleep.ts │ │ │ ├── table-filter-fn.ts │ │ │ ├── tree.spec.ts │ │ │ ├── tree.ts │ │ │ ├── types.ts │ │ │ ├── unknown-error.ts │ │ │ ├── use-get-copy-to-clipboard.tsx │ │ │ └── validTimezones.ts │ ├── tailwind.config.ts │ ├── tsconfig.json │ ├── types │ │ └── global.d.ts │ └── vite.config.ts ├── eslint-config │ ├── README.md │ ├── default.mjs │ ├── eslint.config.mjs │ ├── package.json │ ├── react.mjs │ ├── storybook.mjs │ ├── tailwindcss.mjs │ ├── typescript.mjs │ └── vitest.mjs ├── marble-api │ ├── README.md │ ├── eslint.config.mjs │ ├── openapis │ │ ├── feature-access-api.yaml │ │ ├── marblecore-api.yaml │ │ ├── marblecore-api │ │ │ ├── _common.yml │ │ │ ├── _schemas.yml │ │ │ ├── admin.yml │ │ │ ├── annotations.yml │ │ │ ├── ast.yml │ │ │ ├── authorization.yml │ │ │ ├── cases.yml │ │ │ ├── components.yml │ │ │ ├── custom-lists.yml │ │ │ ├── data-model.yml │ │ │ ├── decisions.yml │ │ │ ├── inboxes.yml │ │ │ ├── ingestion.yml │ │ │ ├── misc.yml │ │ │ ├── rule-snoozes.yml │ │ │ ├── sanction-checks.yml │ │ │ ├── sar.yml │ │ │ ├── scenario-iteration-rules.yml │ │ │ ├── scenario-iterations.yml │ │ │ ├── scenario-publications.yml │ │ │ ├── scenario-testrun.yml │ │ │ ├── scenarios.yml │ │ │ ├── signup-status.yml │ │ │ ├── tags.yml │ │ │ ├── version.yml │ │ │ └── webhooks.yml │ │ └── transfercheck-api.yaml │ ├── package.json │ ├── scripts │ │ ├── config.ts │ │ └── generate.ts │ ├── src │ │ ├── generated │ │ │ ├── feature-access-api.ts │ │ │ ├── marblecore-api.ts │ │ │ └── transfercheck-api.ts │ │ ├── helpers │ │ │ ├── authorization.ts │ │ │ └── index.ts │ │ └── index.ts │ └── tsconfig.json ├── shared │ ├── eslint.config.mjs │ ├── package.json │ ├── src │ │ ├── component-state.ts │ │ ├── index.ts │ │ ├── simple-context.ts │ │ ├── use-callback-ref.ts │ │ └── use-ref-fn.ts │ └── tsconfig.json ├── tailwind-preset │ ├── README.md │ ├── eslint.config.mjs │ ├── package.json │ ├── src │ │ └── tailwind.config.ts │ └── tsconfig.json ├── tests │ ├── .gitignore │ ├── README.md │ ├── auth.json │ ├── e2e │ │ ├── 001-user-signin-flow.test.ts │ │ ├── 002-custom-lists.test.ts │ │ └── 003-scenario-publication.test.ts │ ├── eslint.config.mjs │ ├── fixtures │ │ ├── authentication.ts │ │ └── index.ts │ ├── package.json │ ├── page-object-models │ │ ├── auth-pages.ts │ │ ├── custom-lists.ts │ │ ├── firebase-auth-emulator.ts │ │ ├── formula-builder.ts │ │ ├── scenario-iteration-page.ts │ │ ├── scenarios-page.ts │ │ └── utils.ts │ ├── playwright.config.ts │ └── tsconfig.json ├── typescript-utils │ ├── README.md │ ├── eslint.config.mjs │ ├── package.json │ ├── src │ │ ├── assert-never.ts │ │ ├── index.ts │ │ ├── isomorphic-env.ts │ │ ├── noop.ts │ │ └── utility-types.ts │ └── tsconfig.json ├── ui-design-system │ ├── .gitignore │ ├── .storybook │ │ ├── main.ts │ │ ├── preview.ts │ │ ├── public │ │ │ └── fonts │ │ │ │ └── Inter │ │ │ │ ├── Inter-Black.woff │ │ │ │ ├── Inter-Black.woff2 │ │ │ │ ├── Inter-BlackItalic.woff │ │ │ │ ├── Inter-BlackItalic.woff2 │ │ │ │ ├── Inter-Bold.woff │ │ │ │ ├── Inter-Bold.woff2 │ │ │ │ ├── Inter-BoldItalic.woff │ │ │ │ ├── Inter-BoldItalic.woff2 │ │ │ │ ├── Inter-ExtraBold.woff │ │ │ │ ├── Inter-ExtraBold.woff2 │ │ │ │ ├── Inter-ExtraBoldItalic.woff │ │ │ │ ├── Inter-ExtraBoldItalic.woff2 │ │ │ │ ├── Inter-ExtraLight.woff │ │ │ │ ├── Inter-ExtraLight.woff2 │ │ │ │ ├── Inter-ExtraLightItalic.woff │ │ │ │ ├── Inter-ExtraLightItalic.woff2 │ │ │ │ ├── Inter-Italic.woff │ │ │ │ ├── Inter-Italic.woff2 │ │ │ │ ├── Inter-Light.woff │ │ │ │ ├── Inter-Light.woff2 │ │ │ │ ├── Inter-LightItalic.woff │ │ │ │ ├── Inter-LightItalic.woff2 │ │ │ │ ├── Inter-Medium.woff │ │ │ │ ├── Inter-Medium.woff2 │ │ │ │ ├── Inter-MediumItalic.woff │ │ │ │ ├── Inter-MediumItalic.woff2 │ │ │ │ ├── Inter-Regular.woff │ │ │ │ ├── Inter-Regular.woff2 │ │ │ │ ├── Inter-SemiBold.woff │ │ │ │ ├── Inter-SemiBold.woff2 │ │ │ │ ├── Inter-SemiBoldItalic.woff │ │ │ │ ├── Inter-SemiBoldItalic.woff2 │ │ │ │ ├── Inter-Thin.woff │ │ │ │ ├── Inter-Thin.woff2 │ │ │ │ ├── Inter-ThinItalic.woff │ │ │ │ ├── Inter-ThinItalic.woff2 │ │ │ │ ├── Inter-italic.var.woff2 │ │ │ │ ├── Inter-roman.var.woff2 │ │ │ │ ├── Inter.var.woff2 │ │ │ │ ├── LICENSE.txt │ │ │ │ └── inter.css │ │ └── tailwind-imports.css │ ├── README.md │ ├── eslint.config.mjs │ ├── package.json │ ├── postcss.config.js │ ├── src │ │ ├── Avatar │ │ │ ├── Avatar.spec.tsx │ │ │ ├── Avatar.stories.tsx │ │ │ └── Avatar.tsx │ │ ├── Button │ │ │ ├── Button.spec.tsx │ │ │ ├── Button.stories.tsx │ │ │ └── Button.tsx │ │ ├── Calendar │ │ │ ├── Calendar.stories.tsx │ │ │ └── Calendar.tsx │ │ ├── Checkbox │ │ │ ├── Checkbox.spec.tsx │ │ │ ├── Checkbox.stories.tsx │ │ │ └── Checkbox.tsx │ │ ├── Code │ │ │ ├── Code.stories.tsx │ │ │ └── Code.tsx │ │ ├── Collapsible │ │ │ ├── Collapsible.spec.tsx │ │ │ ├── Collapsible.stories.tsx │ │ │ └── Collapsible.tsx │ │ ├── Combobox │ │ │ ├── Combobox.spec.tsx │ │ │ ├── Combobox.stories.tsx │ │ │ └── Combobox.tsx │ │ ├── Command │ │ │ ├── Command.stories.tsx │ │ │ └── Command.tsx │ │ ├── HiddenInputs │ │ │ ├── HiddenInputs.spec.tsx │ │ │ ├── HiddenInputs.stories.tsx │ │ │ └── HiddenInputs.tsx │ │ ├── Input │ │ │ ├── Input.constants.tsx │ │ │ ├── Input.spec.tsx │ │ │ ├── Input.stories.tsx │ │ │ └── Input.tsx │ │ ├── Kbd │ │ │ ├── Kbd.spec.tsx │ │ │ ├── Kbd.stories.tsx │ │ │ └── Kbd.tsx │ │ ├── Menu │ │ │ ├── Menu.spec.tsx │ │ │ ├── Menu.stories.tsx │ │ │ └── Menu.tsx │ │ ├── MenuCommand │ │ │ └── MenuCommand.tsx │ │ ├── Modal │ │ │ ├── Modal.spec.tsx │ │ │ ├── Modal.stories.tsx │ │ │ └── Modal.tsx │ │ ├── Popover │ │ │ └── Popover.tsx │ │ ├── RadioGroup │ │ │ ├── RadioGroup.stories.tsx │ │ │ └── RadioGroup.tsx │ │ ├── ScrollArea │ │ │ ├── ScrollArea.spec.tsx │ │ │ ├── ScrollArea.stories.tsx │ │ │ └── ScrollArea.tsx │ │ ├── Select │ │ │ ├── Select.constants.tsx │ │ │ ├── Select.spec.tsx │ │ │ ├── Select.stories.tsx │ │ │ └── Select.tsx │ │ ├── SelectWithCombobox │ │ │ ├── SelectWithCombobox.spec.tsx │ │ │ ├── SelectWithCombobox.stories.tsx │ │ │ └── SelectWithCombobox.tsx │ │ ├── Separator │ │ │ ├── Separator.spec.tsx │ │ │ ├── Separator.stories.tsx │ │ │ └── Separator.tsx │ │ ├── Switch │ │ │ ├── Switch.spec.tsx │ │ │ ├── Switch.stories.tsx │ │ │ └── Switch.tsx │ │ ├── Table │ │ │ ├── Table.spec.tsx │ │ │ ├── Table.stories.tsx │ │ │ └── Table.tsx │ │ ├── Tabs │ │ │ ├── Tabs.stories.tsx │ │ │ └── Tabs.tsx │ │ ├── Tag │ │ │ ├── Tag.constants.tsx │ │ │ ├── Tag.spec.tsx │ │ │ ├── Tag.stories.tsx │ │ │ └── Tag.tsx │ │ ├── TextArea │ │ │ ├── TextArea.spec.tsx │ │ │ ├── TextArea.stories.tsx │ │ │ └── TextArea.tsx │ │ ├── Tooltip │ │ │ ├── Tooltip.spec.tsx │ │ │ ├── Tooltip.stories.tsx │ │ │ └── Tooltip.tsx │ │ ├── index.ts │ │ └── utils.ts │ ├── tailwind.config.ts │ ├── tsconfig.json │ ├── types │ │ └── svg.d.ts │ ├── vite.config.ts │ └── vitest-setup.ts └── ui-icons │ ├── README.md │ ├── docs │ └── extract-svg-figma.png │ ├── eslint.config.mjs │ ├── package.json │ ├── scripts │ └── generate.ts │ ├── src │ ├── Icon.tsx │ ├── Logo.tsx │ ├── generated │ │ ├── icon-names.ts │ │ ├── icons-svg-sprite.svg │ │ ├── logo-names.ts │ │ └── logos-svg-sprite.svg │ └── index.ts │ ├── svgs │ ├── icons │ │ ├── accepted.svg │ │ ├── add-alert.svg │ │ ├── add-circle.svg │ │ ├── alt-route.svg │ │ ├── analytics.svg │ │ ├── arrow-2-down.svg │ │ ├── arrow-2-up.svg │ │ ├── arrow-forward.svg │ │ ├── arrow-left.svg │ │ ├── arrow-range.svg │ │ ├── arrow-right.svg │ │ ├── arrow-top-left.svg │ │ ├── arrow-up-right.svg │ │ ├── arrow-up.svg │ │ ├── attachment.svg │ │ ├── backtest.svg │ │ ├── block_and_review.svg │ │ ├── boolean.svg │ │ ├── calendar-month.svg │ │ ├── caret-down.svg │ │ ├── case-manager.svg │ │ ├── category.svg │ │ ├── center-focus.svg │ │ ├── check-indeterminate-small.svg │ │ ├── checked.svg │ │ ├── column.svg │ │ ├── comment.svg │ │ ├── commit.svg │ │ ├── copy.svg │ │ ├── create-new-folder.svg │ │ ├── cross.svg │ │ ├── dash.svg │ │ ├── decision.svg │ │ ├── delete.svg │ │ ├── denied.svg │ │ ├── dns.svg │ │ ├── dots-three.svg │ │ ├── download.svg │ │ ├── draft.svg │ │ ├── drag.svg │ │ ├── drawer-small.svg │ │ ├── edit-square.svg │ │ ├── edit.svg │ │ ├── empty-flag.svg │ │ ├── enum.svg │ │ ├── error.svg │ │ ├── eye-slash.svg │ │ ├── eye.svg │ │ ├── field.svg │ │ ├── filters-off.svg │ │ ├── filters.svg │ │ ├── full-flag.svg │ │ ├── function.svg │ │ ├── half-flag.svg │ │ ├── harddrive.svg │ │ ├── helpcenter.svg │ │ ├── history.svg │ │ ├── in-progress.svg │ │ ├── inbox.svg │ │ ├── investigating.svg │ │ ├── left-panel-close.svg │ │ ├── left-panel-open.svg │ │ ├── lightbulb.svg │ │ ├── linked-services.svg │ │ ├── list.svg │ │ ├── lists.svg │ │ ├── lock.svg │ │ ├── logout.svg │ │ ├── manage-search.svg │ │ ├── manually_accepted.svg │ │ ├── manually_denied.svg │ │ ├── minus.svg │ │ ├── modeling.svg │ │ ├── monitor.svg │ │ ├── more-menu.svg │ │ ├── new-inbox.svg │ │ ├── news.svg │ │ ├── north-east.svg │ │ ├── notifications.svg │ │ ├── number.svg │ │ ├── openinnew.svg │ │ ├── parentheses.svg │ │ ├── paste.svg │ │ ├── percentage.svg │ │ ├── person.svg │ │ ├── play.svg │ │ ├── plus.svg │ │ ├── policy.svg │ │ ├── pushtolive.svg │ │ ├── queue-list.svg │ │ ├── radio-selected.svg │ │ ├── radio-unselected.svg │ │ ├── report.svg │ │ ├── resolved.svg │ │ ├── restart-alt.svg │ │ ├── rule-settings.svg │ │ ├── rules.svg │ │ ├── save.svg │ │ ├── scenarios.svg │ │ ├── schedule.svg │ │ ├── scheduled-execution.svg │ │ ├── search.svg │ │ ├── send.svg │ │ ├── settings.svg │ │ ├── smallarrow-up.svg │ │ ├── snooze-on.svg │ │ ├── snooze.svg │ │ ├── spinner.svg │ │ ├── status.svg │ │ ├── status_snoozed.svg │ │ ├── stop.svg │ │ ├── string.svg │ │ ├── subdirectory-arrow-right.svg │ │ ├── swap.svg │ │ ├── tick.svg │ │ ├── tip.svg │ │ ├── transfercheck.svg │ │ ├── tree-schema.svg │ │ ├── trigger.svg │ │ ├── uncheck.svg │ │ ├── unfold_less.svg │ │ ├── unfold_more.svg │ │ ├── unlock-right.svg │ │ ├── upload.svg │ │ ├── users.svg │ │ ├── version.svg │ │ ├── visibility-on.svg │ │ ├── visibility.svg │ │ ├── visibility_off.svg │ │ ├── waiting_for_action.svg │ │ ├── warning.svg │ │ └── world.svg │ └── logos │ │ ├── google-logo.svg │ │ ├── logo-favicon.svg │ │ ├── logo-standard.svg │ │ ├── logo.svg │ │ ├── marble.svg │ │ └── microsoft-logo.svg │ ├── tsconfig.json │ └── types │ └── svg.d.ts ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── prettier.config.js ├── tsconfig.base.json └── vitest.workspace.ts /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | **/.github 4 | **/.gitignore 5 | **/.vscode 6 | **/coverage 7 | **/.env 8 | **/.aws 9 | **/.ssh 10 | Dockerfile 11 | Dockerfile_local 12 | .dockerignore 13 | README.md 14 | docker-compose.yml 15 | **/.DS_Store 16 | **/venv 17 | **/env 18 | **/dist 19 | **/build -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /.github/workflows/pull_request.yaml: -------------------------------------------------------------------------------- 1 | name: Pull request CI 2 | 3 | on: [pull_request] 4 | 5 | concurrency: 6 | group: ${{ github.workflow }}-${{ github.ref }} 7 | cancel-in-progress: true 8 | 9 | jobs: 10 | check: 11 | permissions: 12 | contents: read 13 | actions: read 14 | uses: ./.github/workflows/check.yaml 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | dist 5 | tmp 6 | /out-tsc 7 | 8 | # dependencies 9 | node_modules 10 | 11 | # IDEs and editors 12 | /.idea 13 | .project 14 | .classpath 15 | .c9/ 16 | *.launch 17 | .settings/ 18 | *.sublime-workspace 19 | 20 | # IDE - VSCode 21 | .vscode/* 22 | !.vscode/settings.json 23 | !.vscode/tasks.json 24 | !.vscode/launch.json 25 | !.vscode/extensions.json 26 | !.vscode/.user-settings.sample.json 27 | 28 | # misc 29 | /.sass-cache 30 | /connect.lock 31 | /coverage 32 | /libpeerconnection.log 33 | npm-debug.log 34 | yarn-error.log 35 | testem.log 36 | /typings 37 | 38 | # System Files 39 | .DS_Store 40 | Thumbs.db 41 | 42 | 43 | # Env files 44 | **/.env 45 | 46 | # Firebase 47 | firebase-debug.log 48 | ui-debug.log 49 | # Sentry Config File 50 | .sentryclirc 51 | 52 | .jj/ 53 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # Add files here to ignore them from prettier formatting 2 | /.vscode/ 3 | pnpm-lock.yaml 4 | packages-licenses.json 5 | 6 | # app-builder 7 | /packages/app-builder/.cache/ 8 | /packages/app-builder/build/ 9 | /packages/app-builder/public/build/ 10 | /packages/app-builder/public/img/ 11 | /packages/app-builder/src/utils/routes/routes.ts 12 | 13 | # marble-api 14 | /packages/marble-api/src/generated 15 | 16 | # ui-design-system 17 | /packages/ui-design-system/storybook-static/ 18 | 19 | # tests 20 | /packages/tests/playwright-report 21 | /packages/tests/test-results -------------------------------------------------------------------------------- /.tool-versions: -------------------------------------------------------------------------------- 1 | nodejs 22.9.0 2 | pnpm 9.12.3 3 | -------------------------------------------------------------------------------- /.vscode/.user-settings.sample.json: -------------------------------------------------------------------------------- 1 | { 2 | "mise.configureExtensionsUseSymLinks": true, 3 | "debug.javascript.defaultRuntimeExecutable": { 4 | "pwa-node": "${workspaceFolder}/.vscode/mise-tools/node" 5 | } 6 | } -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "esbenp.prettier-vscode", 4 | "dbaeumer.vscode-eslint", 5 | "bradlc.vscode-tailwindcss", 6 | "lokalise.i18n-ally", 7 | "developer2006.svg-gallery", 8 | "42crunch.vscode-openapi", 9 | "hverlin.mise-vscode" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "command": "pnpm --filter app-builder run dev", 9 | "name": "Launch app-builder", 10 | "request": "launch", 11 | "type": "node-terminal" 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /Dockerfile_local: -------------------------------------------------------------------------------- 1 | FROM node:22-slim AS build 2 | ENV PNPM_HOME="/pnpm" 3 | ENV PATH="$PNPM_HOME:$PATH" 4 | RUN corepack enable 5 | 6 | COPY . /usr/src/app 7 | WORKDIR /usr/src/app 8 | RUN pnpm install --frozen-lockfile 9 | RUN pnpm --filter=app-builder run build 10 | RUN pnpm --filter=app-builder --prod deploy /prod/app-builder 11 | 12 | FROM gcr.io/distroless/nodejs22-debian12 AS app-builder 13 | ENV PORT=${PORT:-8080} 14 | COPY --from=build /prod/app-builder/node_modules /prod/app-builder/node_modules 15 | COPY --from=build /prod/app-builder/build /prod/app-builder/build 16 | WORKDIR /prod/app-builder 17 | USER nonroot 18 | EXPOSE $PORT 19 | CMD ["./node_modules/@remix-run/serve/dist/cli.js", "./build/server/index.js"] 20 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "emulators": { 3 | "auth": { 4 | "port": 9099 5 | }, 6 | "ui": { 7 | "enabled": true 8 | }, 9 | "singleProjectMode": true 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lefthook.yml: -------------------------------------------------------------------------------- 1 | # EXAMPLE USAGE: 2 | # 3 | # Refer for explanation to following link: 4 | # https://lefthook.dev/configuration/ 5 | # 6 | pre-push: 7 | jobs: 8 | - run: pnpm run -r type-check 9 | 10 | pre-commit: 11 | parallel: true 12 | commands: 13 | lint: 14 | run: pnpm run -r lint --fix 15 | stage_fixed: true 16 | format: 17 | run: pnpm run format:write 18 | stage_fixed: true 19 | -------------------------------------------------------------------------------- /packages/app-builder/.gitignore: -------------------------------------------------------------------------------- 1 | .cache 2 | build 3 | public/build 4 | .env 5 | -------------------------------------------------------------------------------- /packages/app-builder/eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import reactConfig from '@marble/eslint-config/react.mjs'; 2 | import tailwindcssConfig from '@marble/eslint-config/tailwindcss.mjs'; 3 | import vitestConfig from '@marble/eslint-config/vitest.mjs'; 4 | import { join } from 'path'; 5 | 6 | const tailwindConfigPath = join(import.meta.dirname, 'tailwind.config.ts'); 7 | 8 | export default [ 9 | ...reactConfig, 10 | ...tailwindcssConfig(tailwindConfigPath), 11 | ...vitestConfig, 12 | { ignores: ['build'] }, 13 | ]; 14 | -------------------------------------------------------------------------------- /packages/app-builder/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /packages/app-builder/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/favicon.ico -------------------------------------------------------------------------------- /packages/app-builder/public/favicons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/favicons/android-chrome-192x192.png -------------------------------------------------------------------------------- /packages/app-builder/public/favicons/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/favicons/android-chrome-512x512.png -------------------------------------------------------------------------------- /packages/app-builder/public/favicons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/favicons/apple-touch-icon.png -------------------------------------------------------------------------------- /packages/app-builder/public/favicons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/favicons/favicon-16x16.png -------------------------------------------------------------------------------- /packages/app-builder/public/favicons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/favicons/favicon-32x32.png -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-Black.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-Black.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-Black.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-BlackItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-BlackItalic.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-BlackItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-BlackItalic.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-Bold.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-Bold.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-BoldItalic.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-BoldItalic.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-ExtraBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-ExtraBold.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-ExtraBold.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-ExtraBoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-ExtraBoldItalic.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-ExtraBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-ExtraBoldItalic.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-ExtraLight.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-ExtraLight.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-ExtraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-ExtraLight.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-ExtraLightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-ExtraLightItalic.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-ExtraLightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-ExtraLightItalic.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-Italic.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-Italic.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-Light.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-Light.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-LightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-LightItalic.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-LightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-LightItalic.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-Medium.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-Medium.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-MediumItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-MediumItalic.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-MediumItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-MediumItalic.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-Regular.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-Regular.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-SemiBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-SemiBold.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-SemiBold.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-SemiBoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-SemiBoldItalic.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-SemiBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-SemiBoldItalic.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-Thin.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-Thin.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-ThinItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-ThinItalic.woff -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-ThinItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-ThinItalic.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-italic.var.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-italic.var.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter-roman.var.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter-roman.var.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/fonts/Inter/Inter.var.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/fonts/Inter/Inter.var.woff2 -------------------------------------------------------------------------------- /packages/app-builder/public/img/home/api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/img/home/api.png -------------------------------------------------------------------------------- /packages/app-builder/public/img/home/scenario-guide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/img/home/scenario-guide.png -------------------------------------------------------------------------------- /packages/app-builder/public/img/home/testrun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/img/home/testrun.png -------------------------------------------------------------------------------- /packages/app-builder/public/img/home/workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkmarble/marble-frontend/d4aefede58b0f4d2cbeca979c019b041d465a925/packages/app-builder/public/img/home/workflow.png -------------------------------------------------------------------------------- /packages/app-builder/public/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Marble", 3 | "short_name": "Marble", 4 | "icons": [ 5 | { 6 | "src": "/favicons/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/favicons/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#ffffff", 17 | "background_color": "#ffffff", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /packages/app-builder/scripts/generateRoutes.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Get the routes from the Remix CLI 4 | routes_json=$(pnpm --filter app-builder exec remix routes --json) 5 | 6 | # Write the routes to the file 7 | echo "export const routes = $routes_json as const;" > src/utils/routes/routes.ts 8 | 9 | 10 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/AstBuilder/edition/EditModal/modals/FuzzyMatchComparator/helpers.ts: -------------------------------------------------------------------------------- 1 | import { 2 | type fuzzyMatchAnyOfAstNodeName, 3 | type fuzzyMatchAstNodeName, 4 | } from '@app-builder/models/astNode/strings'; 5 | import { type ParseKeys } from 'i18next'; 6 | 7 | export const funcNameTKeys = { 8 | FuzzyMatch: 'scenarios:edit_fuzzy_match.fuzzy_match', 9 | FuzzyMatchAnyOf: 'scenarios:edit_fuzzy_match.fuzzy_match_any_of', 10 | } satisfies Record< 11 | typeof fuzzyMatchAnyOfAstNodeName | typeof fuzzyMatchAstNodeName, 12 | ParseKeys<['scenarios']> 13 | >; 14 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/AstBuilder/edition/EditModal/modals/StringTemplate/helpers.ts: -------------------------------------------------------------------------------- 1 | import { STRING_TEMPLATE_VARIABLE_REGEXP } from '@app-builder/models/astNode/strings'; 2 | 3 | export const extractVariablesNamesFromTemplate = (template: string) => { 4 | const res = template.matchAll(STRING_TEMPLATE_VARIABLE_REGEXP).toArray(); 5 | 6 | return res.reduce((acc, match) => { 7 | return match[1] && !acc.includes(match[1]) ? [...acc, match[1]] : acc; 8 | }, [] as string[]); 9 | }; 10 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/AstBuilder/edition/EditionAnyRoot.tsx: -------------------------------------------------------------------------------- 1 | import { type AstBuilderRootProps } from '@ast-builder/types'; 2 | 3 | import { EditionAstBuilderNode } from './EditionNode'; 4 | import { EditionEvaluationErrors } from './EvaluationErrors'; 5 | import { useRoot } from './hooks/useRoot'; 6 | import { AstBuilderNodeSharpFactory } from './node-store'; 7 | 8 | export function EditionAstBuilderAnyRoot(props: AstBuilderRootProps) { 9 | const nodeStore = useRoot(props); 10 | 11 | return ( 12 | 13 | 14 | 15 | 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/AstBuilder/edition/OperandMenu/types.ts: -------------------------------------------------------------------------------- 1 | import { type AstNode } from '@app-builder/models'; 2 | 3 | export type SmartMenuListProps = { 4 | onSelect: (node: AstNode) => void; 5 | }; 6 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/AstBuilder/index.tsx: -------------------------------------------------------------------------------- 1 | import { OperandEditModal } from './edition/EditModal/EditModal'; 2 | import { AstBuilderOperand } from './Operand'; 3 | import { AstBuilderProvider } from './Provider'; 4 | import { AstBuilderRoot } from './Root'; 5 | 6 | export const AstBuilder = { 7 | Root: AstBuilderRoot, 8 | Operand: AstBuilderOperand, 9 | Provider: AstBuilderProvider, 10 | EditModal: OperandEditModal, 11 | }; 12 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/AstBuilder/styles/NodeTypeError.tsx: -------------------------------------------------------------------------------- 1 | export function NodeTypeError() { 2 | return ( 3 | 4 | Wrong node type 5 | 6 | ); 7 | } 8 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/AstBuilder/viewing/ViewingAnyRoot.tsx: -------------------------------------------------------------------------------- 1 | import { type AstBuilderRootProps } from '@ast-builder/types'; 2 | import { useMemo } from 'react'; 3 | 4 | import { ViewingEvaluationErrors } from './ViewingEvaluationErrors'; 5 | import { ViewingAstBuilderNode } from './ViewingNode'; 6 | 7 | export function EditionAstBuilderAnyRoot(props: AstBuilderRootProps) { 8 | const validation = useMemo( 9 | () => props.validation ?? { errors: [], evaluation: [] }, 10 | [props.validation], 11 | ); 12 | 13 | return ( 14 |
15 | 16 | 17 |
18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Auth/auth-i18n.ts: -------------------------------------------------------------------------------- 1 | import { type Namespace } from 'i18next'; 2 | 3 | export const authI18n = ['auth', 'common'] satisfies Namespace; 4 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Cases/Filters/FilterDetail/CasesExcludeAssignedFilter.tsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable react-hooks/exhaustive-deps */ 2 | import { useMemo } from 'react'; 3 | import { useFormContext } from 'react-hook-form'; 4 | 5 | import { type CasesFiltersForm, useCasesFiltersContext } from '../CasesFiltersContext'; 6 | 7 | export function CasesExcludeAssignedFilter() { 8 | const { submitCasesFilters } = useCasesFiltersContext(); 9 | const { setValue } = useFormContext(); 10 | 11 | useMemo(() => { 12 | setValue('excludeAssigned', true); 13 | submitCasesFilters(); 14 | }, []); 15 | return null; 16 | } 17 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Cases/Filters/FilterDetail/CasesSnoozedFilter.tsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable react-hooks/exhaustive-deps */ 2 | import { useMemo } from 'react'; 3 | import { useFormContext } from 'react-hook-form'; 4 | 5 | import { type CasesFiltersForm, useCasesFiltersContext } from '../CasesFiltersContext'; 6 | 7 | export function CasesSnoozedFilter() { 8 | const { submitCasesFilters } = useCasesFiltersContext(); 9 | const { setValue } = useFormContext(); 10 | 11 | useMemo(() => { 12 | setValue('includeSnoozed', true); 13 | submitCasesFilters(); 14 | }, []); 15 | return null; 16 | } 17 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Cases/Filters/FilterDetail/ClosedCasesFilter.tsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable react-hooks/exhaustive-deps */ 2 | 3 | import { useMemo } from 'react'; 4 | import { useFormContext } from 'react-hook-form'; 5 | 6 | import { type CasesFiltersForm, useCasesFiltersContext } from '../CasesFiltersContext'; 7 | 8 | export function ClosedCasesFilter() { 9 | const { submitCasesFilters } = useCasesFiltersContext(); 10 | const { setValue } = useFormContext(); 11 | 12 | useMemo(() => { 13 | setValue('statuses', ['closed']); 14 | submitCasesFilters(); 15 | }, []); 16 | 17 | return null; 18 | } 19 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Cases/Filters/FilterDetail/FilterDetail.tsx: -------------------------------------------------------------------------------- 1 | import { match } from 'ts-pattern'; 2 | 3 | import { type CasesFilterName } from '../filters'; 4 | import { CasesDateRangeFilter } from './CasesDateRangeFilter'; 5 | import { CasesExcludeAssignedFilter } from './CasesExcludeAssignedFilter'; 6 | import { CasesSnoozedFilter } from './CasesSnoozedFilter'; 7 | import { ClosedCasesFilter } from './ClosedCasesFilter'; 8 | 9 | export const FilterDetail = ({ filterName }: { filterName: CasesFilterName }) => 10 | match(filterName) 11 | .with('dateRange', () => ) 12 | .with('statuses', () => ) 13 | .with('includeSnoozed', () => ) 14 | .with('excludeAssigned', () => ) 15 | .exhaustive(); 16 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Cases/Filters/FilterDetail/NameFilter.tsx: -------------------------------------------------------------------------------- 1 | import { Input } from 'ui-design-system'; 2 | 3 | import { useNameFilter } from '../CasesFiltersContext'; 4 | 5 | export function NameFilter() { 6 | const { name, setName } = useNameFilter(); 7 | 8 | return ( 9 |
10 | { 13 | setName(event.target.value); 14 | }} 15 | autoFocus 16 | /> 17 |
18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Cases/Filters/FilterDetail/index.ts: -------------------------------------------------------------------------------- 1 | export * from './FilterDetail'; 2 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Cases/Filters/index.ts: -------------------------------------------------------------------------------- 1 | export * from './CasesFiltersBar'; 2 | export * from './CasesFiltersContext'; 3 | export * from './CasesFiltersMenu'; 4 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Cases/cases-i18n.ts: -------------------------------------------------------------------------------- 1 | import { type Namespace } from 'i18next'; 2 | 3 | import { decisionsI18n } from '../Decisions/decisions-i18n'; 4 | import { filtersI18n } from '../Filters/filters-i18n'; 5 | import { sanctionsI18n } from '../Sanctions/sanctions-i18n'; 6 | 7 | export const casesI18n = [ 8 | 'cases', 9 | ...filtersI18n, 10 | ...decisionsI18n, 11 | ...sanctionsI18n, 12 | ] satisfies Namespace; 13 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Cases/index.ts: -------------------------------------------------------------------------------- 1 | export * from './CaseRightPanel'; 2 | export * from './cases-i18n'; 3 | export * from './CasesList'; 4 | export * from './CaseStatus'; 5 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Data/PivotType.tsx: -------------------------------------------------------------------------------- 1 | import { Tag } from 'ui-design-system'; 2 | 3 | export function PivotType({ type }: { type: 'field' | 'link' }) { 4 | return ( 5 | 11 | {type} 12 | 13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Data/data-i18n.ts: -------------------------------------------------------------------------------- 1 | import { type Namespace } from 'i18next'; 2 | 3 | export const dataI18n = ['common', 'data'] satisfies Namespace; 4 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/DataModelExplorer/types.ts: -------------------------------------------------------------------------------- 1 | import { type ClientObjectDetail } from '@app-builder/models'; 2 | import { type PivotObject } from '@app-builder/models/cases'; 3 | 4 | export type DataModelExplorerNavigationTab = { 5 | pivotObject: PivotObject; 6 | sourceObject: ClientObjectDetail['data']; 7 | sourceTableName: string; 8 | sourceFieldName: string; 9 | targetTableName: string; 10 | filterFieldName: string; 11 | orderingFieldName: string; 12 | }; 13 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Decisions/Filters/FilterDetail/index.ts: -------------------------------------------------------------------------------- 1 | export * from './FilterDetail'; 2 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Decisions/Filters/index.ts: -------------------------------------------------------------------------------- 1 | export * from './DecisionFiltersBar'; 2 | export * from './DecisionFiltersContext'; 3 | export * from './DecisionFiltersMenu'; 4 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Decisions/decisions-i18n.ts: -------------------------------------------------------------------------------- 1 | import { type Namespace } from 'i18next'; 2 | 3 | import { filtersI18n } from '../Filters/filters-i18n'; 4 | 5 | export const decisionsI18n = [ 6 | 'decisions', 7 | 'common', 8 | 'scenarios', 9 | 'cases', 10 | 'sanctions', 11 | ...filtersI18n, 12 | ] satisfies Namespace; 13 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Decisions/index.ts: -------------------------------------------------------------------------------- 1 | export * from './DecisionDetail'; 2 | export * from './DecisionRightPanel'; 3 | export * from './decisions-i18n'; 4 | export * from './DecisionsList'; 5 | export * from './Filters'; 6 | export * from './OutcomeTag'; 7 | export * from './RulesDetail'; 8 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/ExternalLink.tsx: -------------------------------------------------------------------------------- 1 | import { forwardRef } from 'react'; 2 | import { cn } from 'ui-design-system'; 3 | 4 | export const linkClasses = 5 | 'hover:text-purple-60 focus:text-purple-60 font-semibold lowercase text-purple-65 hover:underline focus:underline'; 6 | 7 | export const ExternalLink = forwardRef>( 8 | function ExternalLink({ className, children, ...otherProps }, ref) { 9 | return ( 10 | 17 | {children} 18 | 19 | ); 20 | }, 21 | ); 22 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Files/AddYourFirstFile.tsx: -------------------------------------------------------------------------------- 1 | import { UploadFile } from '@app-builder/routes/ressources+/files+/upload-file'; 2 | 3 | export function AddYourFirstFile({ 4 | children, 5 | uploadFileEndpoint, 6 | }: { 7 | children?: React.ReactNode; 8 | uploadFileEndpoint: string; 9 | }) { 10 | return ( 11 | 12 | 13 | 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Filters/AddNewFilterButton.tsx: -------------------------------------------------------------------------------- 1 | import { forwardRef } from 'react'; 2 | import { useTranslation } from 'react-i18next'; 3 | import { Button, type ButtonProps } from 'ui-design-system'; 4 | import { Icon } from 'ui-icons'; 5 | 6 | import { filtersI18n } from './filters-i18n'; 7 | 8 | type AddNewFilterButtonProps = Omit; 9 | 10 | export const AddNewFilterButton = forwardRef( 11 | function AddNewFilterButton(props, ref) { 12 | const { t } = useTranslation(filtersI18n); 13 | return ( 14 | 18 | ); 19 | }, 20 | ); 21 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Filters/SimpleFilter.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import { type ComponentPropsWithoutRef } from 'react'; 3 | 4 | export function SimpleFilter({ className, ...props }: ComponentPropsWithoutRef<'div'>) { 5 | return ( 6 |
7 |
14 |
15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Filters/filters-i18n.ts: -------------------------------------------------------------------------------- 1 | import { type Namespace } from 'i18next'; 2 | 3 | export const filtersI18n = ['filters'] satisfies Namespace; 4 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Filters/index.ts: -------------------------------------------------------------------------------- 1 | export * from './AddNewFilterButton'; 2 | export * from './ClearAllFilters'; 3 | export * from './DateRangeFilter'; 4 | export * from './FilterPopover'; 5 | export * from './FiltersButton'; 6 | export * from './FiltersDropdownMenu'; 7 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Form/Tanstack/FormLabel.tsx: -------------------------------------------------------------------------------- 1 | import * as LabelPrimitive from '@radix-ui/react-label'; 2 | import * as React from 'react'; 3 | import { cn } from 'ui-design-system'; 4 | 5 | interface FormLabelProps 6 | extends Omit, 'htmlFor'> { 7 | name: string; 8 | valid?: boolean; 9 | } 10 | 11 | export const FormLabel = React.forwardRef< 12 | React.ElementRef, 13 | FormLabelProps 14 | >(function FormLabel({ className, valid, name, ...props }, ref) { 15 | return ( 16 | 24 | ); 25 | }); 26 | -------------------------------------------------------------------------------- /packages/app-builder/src/components/Form/Tanstack/FormTextArea.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { TextArea, type TextAreaProps } from 'ui-design-system'; 3 | 4 | interface FormTextAreaProps extends Omit { 5 | valid?: boolean; 6 | } 7 | 8 | export const FormTextArea = React.forwardRef, FormTextAreaProps>( 9 | function FormTextArea(props, ref) { 10 | return ( 11 |