Full Code of stan-smith/FossFLOW for AI

master 0da9ff3a22c6 cached
369 files
1.6 MB
588.4k tokens
399 symbols
1 requests
Download .txt
Showing preview only (1,763K chars total). Download the full file or copy to clipboard to get everything.
Repository: stan-smith/FossFLOW
Branch: master
Commit: 0da9ff3a22c6
Files: 369
Total size: 1.6 MB

Directory structure:
gitextract_4kyu4h7x/

├── .dockerignore
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── dependabot-automerge.yml
│       ├── docker.yml
│       ├── e2e-tests.yml
│       ├── e2e-tests.yml.backup
│       ├── ethicalcheck.yml
│       ├── pages.yml
│       ├── release.yml
│       └── test.yml
├── .gitignore
├── .npmignore
├── .nvmrc
├── .prettierrc
├── .releaserc.json
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Dockerfile
├── FOSSFLOW_ENCYCLOPEDIA.md
├── LICENSE
├── README.md
├── compose.dev.yml
├── compose.yml
├── docker-entrypoint.sh
├── docs/
│   ├── README.bn.md
│   ├── README.cn.md
│   ├── README.de.md
│   ├── README.es.md
│   ├── README.fr.md
│   ├── README.hi.md
│   ├── README.id.md
│   ├── README.pt.md
│   ├── README.ru.md
│   └── SEMANTIC_RELEASE.md
├── e2e-tests/
│   ├── .gitignore
│   ├── README.md
│   ├── SETUP.md
│   ├── get-docker.sh
│   ├── pytest.ini
│   ├── requirements.txt
│   ├── run-tests.sh
│   ├── test-base-paths.sh
│   ├── test-diagram.json
│   └── tests/
│       ├── test_base_path_routing.py
│       ├── test_basic_load.py
│       ├── test_connector_undo.py
│       ├── test_export_svg.py
│       ├── test_import_diagram.py
│       ├── test_multi_node_undo.py
│       ├── test_node_placement.py
│       ├── test_rect_text_undo.py
│       └── test_store_debug.py
├── nginx.conf
├── package.json
├── packages/
│   ├── fossflow-app/
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── public/
│   │   │   ├── i18n/
│   │   │   │   └── app/
│   │   │   │       ├── bn-BD.json
│   │   │   │       ├── de-DE.json
│   │   │   │       ├── en-US.json
│   │   │   │       ├── es-ES.json
│   │   │   │       ├── fr-FR.json
│   │   │   │       ├── hi-IN.json
│   │   │   │       ├── id-ID.json
│   │   │   │       ├── it-IT.json
│   │   │   │       ├── pt-BR.json
│   │   │   │       ├── ru-RU.json
│   │   │   │       ├── tr-TR.json
│   │   │   │       └── zh-CN.json
│   │   │   ├── index.html
│   │   │   ├── manifest.json
│   │   │   ├── robots.txt
│   │   │   └── service-worker.js
│   │   ├── rsbuild.config.ts
│   │   ├── src/
│   │   │   ├── App.css
│   │   │   ├── App.tsx
│   │   │   ├── EditorPage.tsx
│   │   │   ├── StorageManager.tsx
│   │   │   ├── components/
│   │   │   │   ├── ChangeLanguage/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.css
│   │   │   │   ├── DiagramManager.css
│   │   │   │   ├── DiagramManager.tsx
│   │   │   │   ├── ErrorBoundary.css
│   │   │   │   └── ErrorBoundary.tsx
│   │   │   ├── diagramUtils.ts
│   │   │   ├── env.d.ts
│   │   │   ├── i18n/
│   │   │   │   ├── bn-BD.json
│   │   │   │   ├── en-US.json
│   │   │   │   ├── es-ES.json
│   │   │   │   ├── fr-FR.json
│   │   │   │   ├── hi-IN.json
│   │   │   │   ├── it-IT.json
│   │   │   │   ├── pl-PL.json
│   │   │   │   ├── pt-BR.json
│   │   │   │   ├── ru-RU.json
│   │   │   │   ├── tr-TR.json
│   │   │   │   └── zh-CN.json
│   │   │   ├── i18n.ts
│   │   │   ├── index.css
│   │   │   ├── index.tsx
│   │   │   ├── minimalIcons.ts
│   │   │   ├── paymentFlowExample.json
│   │   │   ├── reportWebVitals.ts
│   │   │   ├── serviceWorkerRegistration.ts
│   │   │   ├── services/
│   │   │   │   ├── iconPackManager.ts
│   │   │   │   └── storageService.ts
│   │   │   └── usePersistedDiagram.ts
│   │   └── tsconfig.json
│   ├── fossflow-backend/
│   │   ├── package.json
│   │   └── server.js
│   └── fossflow-lib/
│       ├── .gitignore
│       ├── LICENSE
│       ├── docs/
│       │   ├── .gitignore
│       │   ├── next-env.d.ts
│       │   ├── next.config.js
│       │   ├── package.json
│       │   ├── pages/
│       │   │   ├── _meta.json
│       │   │   ├── docs/
│       │   │   │   ├── _meta.json
│       │   │   │   ├── api/
│       │   │   │   │   ├── _meta.json
│       │   │   │   │   ├── index.mdx
│       │   │   │   │   └── initialData.mdx
│       │   │   │   ├── contributing.mdx
│       │   │   │   ├── index.mdx
│       │   │   │   ├── installation.mdx
│       │   │   │   ├── isopacks.mdx
│       │   │   │   └── quickstart.mdx
│       │   │   └── index.tsx
│       │   ├── theme.config.tsx
│       │   └── tsconfig.json
│       ├── jest.config.js
│       ├── jest.setup.js
│       ├── package.json
│       ├── rslib.config.ts
│       ├── src/
│       │   ├── Isoflow.tsx
│       │   ├── components/
│       │   │   ├── Circle/
│       │   │   │   └── Circle.tsx
│       │   │   ├── ColorSelector/
│       │   │   │   ├── ColorPicker.tsx
│       │   │   │   ├── ColorSelector.tsx
│       │   │   │   ├── ColorSwatch.tsx
│       │   │   │   ├── CustomColorInput.tsx
│       │   │   │   └── __tests__/
│       │   │   │       ├── ColorSelector.test.tsx
│       │   │   │       └── CustomColorInput.test.tsx
│       │   │   ├── ConnectorEmptySpaceTooltip/
│       │   │   │   └── ConnectorEmptySpaceTooltip.tsx
│       │   │   ├── ConnectorHintTooltip/
│       │   │   │   └── ConnectorHintTooltip.tsx
│       │   │   ├── ConnectorRerouteTooltip/
│       │   │   │   └── ConnectorRerouteTooltip.tsx
│       │   │   ├── ConnectorSettings/
│       │   │   │   └── ConnectorSettings.tsx
│       │   │   ├── ContextMenu/
│       │   │   │   ├── ContextMenu.tsx
│       │   │   │   └── ContextMenuManager.tsx
│       │   │   ├── Cursor/
│       │   │   │   └── Cursor.tsx
│       │   │   ├── DOMErrorBoundary/
│       │   │   │   ├── DOMErrorBoundary.tsx
│       │   │   │   └── index.ts
│       │   │   ├── DebugUtils/
│       │   │   │   ├── DebugUtils.tsx
│       │   │   │   ├── LineItem.tsx
│       │   │   │   ├── SizeIndicator.tsx
│       │   │   │   ├── Value.tsx
│       │   │   │   └── __tests__/
│       │   │   │       ├── DebugUtils.test.tsx
│       │   │   │       ├── LineItem.test.tsx
│       │   │   │       ├── SizeIndicator.test.tsx
│       │   │   │       └── Value.test.tsx
│       │   │   ├── DragAndDrop/
│       │   │   │   └── DragAndDrop.tsx
│       │   │   ├── ExportImageDialog/
│       │   │   │   └── ExportImageDialog.tsx
│       │   │   ├── FreehandLasso/
│       │   │   │   └── FreehandLasso.tsx
│       │   │   ├── Gradient/
│       │   │   │   └── Gradient.tsx
│       │   │   ├── Grid/
│       │   │   │   └── Grid.tsx
│       │   │   ├── HelpDialog/
│       │   │   │   └── HelpDialog.tsx
│       │   │   ├── HotkeySettings/
│       │   │   │   └── HotkeySettings.tsx
│       │   │   ├── IconButton/
│       │   │   │   └── IconButton.tsx
│       │   │   ├── IconPackSettings/
│       │   │   │   └── IconPackSettings.tsx
│       │   │   ├── ImportHintTooltip/
│       │   │   │   └── ImportHintTooltip.tsx
│       │   │   ├── IsoTileArea/
│       │   │   │   └── IsoTileArea.tsx
│       │   │   ├── ItemControls/
│       │   │   │   ├── ConnectorControls/
│       │   │   │   │   └── ConnectorControls.tsx
│       │   │   │   ├── IconSelectionControls/
│       │   │   │   │   ├── Icon.tsx
│       │   │   │   │   ├── IconCollection.tsx
│       │   │   │   │   ├── IconGrid.tsx
│       │   │   │   │   ├── IconSelectionControls.tsx
│       │   │   │   │   ├── Icons.tsx
│       │   │   │   │   ├── Searchbox.tsx
│       │   │   │   │   └── __tests__/
│       │   │   │   │       └── Icon.test.tsx
│       │   │   │   ├── ItemControlsManager.tsx
│       │   │   │   ├── NodeControls/
│       │   │   │   │   ├── NodeControls.tsx
│       │   │   │   │   ├── NodeSettings/
│       │   │   │   │   │   └── NodeSettings.tsx
│       │   │   │   │   └── QuickIconSelector.tsx
│       │   │   │   ├── RectangleControls/
│       │   │   │   │   └── RectangleControls.tsx
│       │   │   │   ├── TextBoxControls/
│       │   │   │   │   └── TextBoxControls.tsx
│       │   │   │   └── components/
│       │   │   │       ├── ControlsContainer.tsx
│       │   │   │       ├── DeleteButton.tsx
│       │   │   │       ├── Header.tsx
│       │   │   │       └── Section.tsx
│       │   │   ├── Label/
│       │   │   │   ├── ExpandButton.tsx
│       │   │   │   ├── ExpandableLabel.tsx
│       │   │   │   ├── Label.tsx
│       │   │   │   └── __tests__/
│       │   │   │       └── Label.test.tsx
│       │   │   ├── LabelSettings/
│       │   │   │   └── LabelSettings.tsx
│       │   │   ├── Lasso/
│       │   │   │   └── Lasso.tsx
│       │   │   ├── LassoHintTooltip/
│       │   │   │   └── LassoHintTooltip.tsx
│       │   │   ├── LazyLoadingWelcomeNotification/
│       │   │   │   └── LazyLoadingWelcomeNotification.tsx
│       │   │   ├── Loader/
│       │   │   │   └── Loader.tsx
│       │   │   ├── MainMenu/
│       │   │   │   ├── MainMenu.tsx
│       │   │   │   └── MenuItem.tsx
│       │   │   ├── PanSettings/
│       │   │   │   └── PanSettings.tsx
│       │   │   ├── Renderer/
│       │   │   │   └── Renderer.tsx
│       │   │   ├── RichTextEditor/
│       │   │   │   ├── RichTextEditor.tsx
│       │   │   │   ├── RichTextEditorErrorBoundary.tsx
│       │   │   │   └── index.ts
│       │   │   ├── SceneLayer/
│       │   │   │   └── SceneLayer.tsx
│       │   │   ├── SceneLayers/
│       │   │   │   ├── ConnectorLabels/
│       │   │   │   │   ├── ConnectorLabel.tsx
│       │   │   │   │   └── ConnectorLabels.tsx
│       │   │   │   ├── Connectors/
│       │   │   │   │   ├── Connector.tsx
│       │   │   │   │   └── Connectors.tsx
│       │   │   │   ├── Nodes/
│       │   │   │   │   ├── Node/
│       │   │   │   │   │   ├── IconTypes/
│       │   │   │   │   │   │   ├── IsometricIcon.tsx
│       │   │   │   │   │   │   └── NonIsometricIcon.tsx
│       │   │   │   │   │   └── Node.tsx
│       │   │   │   │   └── Nodes.tsx
│       │   │   │   ├── Rectangles/
│       │   │   │   │   ├── Rectangle.tsx
│       │   │   │   │   └── Rectangles.tsx
│       │   │   │   └── TextBoxes/
│       │   │   │       ├── TextBox.tsx
│       │   │   │       └── TextBoxes.tsx
│       │   │   ├── SettingsDialog/
│       │   │   │   └── SettingsDialog.tsx
│       │   │   ├── Svg/
│       │   │   │   └── Svg.tsx
│       │   │   ├── ToolMenu/
│       │   │   │   └── ToolMenu.tsx
│       │   │   ├── TransformControlsManager/
│       │   │   │   ├── NodeTransformControls.tsx
│       │   │   │   ├── RectangleTransformControls.tsx
│       │   │   │   ├── TextBoxTransformControls.tsx
│       │   │   │   ├── TransformAnchor.tsx
│       │   │   │   ├── TransformControls.tsx
│       │   │   │   └── TransformControlsManager.tsx
│       │   │   ├── UiElement/
│       │   │   │   └── UiElement.tsx
│       │   │   ├── UiOverlay/
│       │   │   │   └── UiOverlay.tsx
│       │   │   ├── ZoomControls/
│       │   │   │   └── ZoomControls.tsx
│       │   │   └── ZoomSettings/
│       │   │       └── ZoomSettings.tsx
│       │   ├── config/
│       │   │   ├── hotkeys.ts
│       │   │   ├── labelSettings.ts
│       │   │   ├── panSettings.ts
│       │   │   └── zoomSettings.ts
│       │   ├── config.ts
│       │   ├── examples/
│       │   │   ├── BasicEditor/
│       │   │   │   └── BasicEditor.tsx
│       │   │   ├── DebugTools/
│       │   │   │   └── DebugTools.tsx
│       │   │   ├── ReadonlyMode/
│       │   │   │   └── ReadonlyMode.tsx
│       │   │   ├── index.tsx
│       │   │   └── initialData.ts
│       │   ├── fixtures/
│       │   │   ├── colors.ts
│       │   │   ├── icons.ts
│       │   │   ├── model.ts
│       │   │   ├── modelItems.ts
│       │   │   └── views.ts
│       │   ├── global.d.ts
│       │   ├── hooks/
│       │   │   ├── __tests__/
│       │   │   │   ├── useHistory.test.tsx
│       │   │   │   └── useInitialDataManager.test.tsx
│       │   │   ├── useColor.ts
│       │   │   ├── useConnector.ts
│       │   │   ├── useDiagramUtils.ts
│       │   │   ├── useHistory.ts
│       │   │   ├── useIcon.tsx
│       │   │   ├── useIconCategories.ts
│       │   │   ├── useIconFiltering.ts
│       │   │   ├── useInitialDataManager.ts
│       │   │   ├── useIsoProjection.ts
│       │   │   ├── useModelItem.ts
│       │   │   ├── useRectangle.ts
│       │   │   ├── useResizeObserver.ts
│       │   │   ├── useScene.ts
│       │   │   ├── useTextBox.ts
│       │   │   ├── useTextBoxProps.ts
│       │   │   ├── useView.ts
│       │   │   ├── useViewItem.ts
│       │   │   └── useWindowUtils.ts
│       │   ├── i18n/
│       │   │   ├── bn-BD.ts
│       │   │   ├── en-US.ts
│       │   │   ├── es-ES.ts
│       │   │   ├── fr-FR.ts
│       │   │   ├── hi-IN.ts
│       │   │   ├── id-ID.ts
│       │   │   ├── index.ts
│       │   │   ├── it-IT.ts
│       │   │   ├── pl-PL.ts
│       │   │   ├── pt-BR.ts
│       │   │   ├── ru-RU.ts
│       │   │   ├── tr-TR.ts
│       │   │   └── zh-CN.ts
│       │   ├── index-docker.tsx
│       │   ├── index.html
│       │   ├── index.ts
│       │   ├── index.tsx
│       │   ├── interaction/
│       │   │   ├── modes/
│       │   │   │   ├── Connector.ts
│       │   │   │   ├── Cursor.ts
│       │   │   │   ├── DragItems.ts
│       │   │   │   ├── FreehandLasso.ts
│       │   │   │   ├── Lasso.ts
│       │   │   │   ├── Pan.ts
│       │   │   │   ├── PlaceIcon.ts
│       │   │   │   ├── Rectangle/
│       │   │   │   │   ├── DrawRectangle.ts
│       │   │   │   │   └── TransformRectangle.ts
│       │   │   │   └── TextBox.ts
│       │   │   ├── useInteractionManager.ts
│       │   │   └── usePanHandlers.ts
│       │   ├── module.d.ts
│       │   ├── schemas/
│       │   │   ├── __tests__/
│       │   │   │   ├── colors.test.ts
│       │   │   │   ├── connector.test.ts
│       │   │   │   ├── icons.test.ts
│       │   │   │   ├── modelItems.test.ts
│       │   │   │   ├── rectangle.test.ts
│       │   │   │   ├── textBox.test.ts
│       │   │   │   ├── validation.test.ts
│       │   │   │   └── views.test.ts
│       │   │   ├── colors.ts
│       │   │   ├── common.ts
│       │   │   ├── connector.ts
│       │   │   ├── icons.ts
│       │   │   ├── index.ts
│       │   │   ├── model.ts
│       │   │   ├── modelItems.ts
│       │   │   ├── rectangle.ts
│       │   │   ├── textBox.ts
│       │   │   ├── validation.ts
│       │   │   └── views.ts
│       │   ├── standaloneExports.ts
│       │   ├── stores/
│       │   │   ├── localeStore.tsx
│       │   │   ├── modelStore.tsx
│       │   │   ├── reducers/
│       │   │   │   ├── __tests__/
│       │   │   │   │   ├── connector.test.ts
│       │   │   │   │   ├── modelItem.test.ts
│       │   │   │   │   ├── rectangle.test.ts
│       │   │   │   │   ├── textBox.test.ts
│       │   │   │   │   └── viewItem.test.ts
│       │   │   │   ├── connector.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── modelItem.ts
│       │   │   │   ├── rectangle.ts
│       │   │   │   ├── textBox.ts
│       │   │   │   ├── types.ts
│       │   │   │   ├── view.ts
│       │   │   │   └── viewItem.ts
│       │   │   ├── sceneStore.tsx
│       │   │   └── uiStateStore.tsx
│       │   ├── styles/
│       │   │   ├── GlobalStyles.tsx
│       │   │   └── theme.ts
│       │   ├── types/
│       │   │   ├── common.ts
│       │   │   ├── dom-to-image-more.d.ts
│       │   │   ├── index.ts
│       │   │   ├── interactions.ts
│       │   │   ├── isoflowProps.ts
│       │   │   ├── model.ts
│       │   │   ├── rendererProps.ts
│       │   │   ├── scene.ts
│       │   │   └── ui.ts
│       │   └── utils/
│       │       ├── CoordsUtils.ts
│       │       ├── SizeUtils.ts
│       │       ├── __tests__/
│       │       │   ├── common.test.ts
│       │       │   ├── immer.test.ts
│       │       │   └── renderer.test.ts
│       │       ├── common.ts
│       │       ├── connectorLabels.ts
│       │       ├── exportOptions.ts
│       │       ├── findNearestUnoccupiedTile.ts
│       │       ├── index.ts
│       │       ├── model.ts
│       │       ├── pathfinder.ts
│       │       ├── pointInPolygon.ts
│       │       └── renderer.ts
│       ├── tsconfig.declaration.json
│       ├── tsconfig.dev.json
│       └── tsconfig.json
├── scripts/
│   └── update-version.js
├── test-app.html
├── test-base-paths.sh
└── tsconfig.base.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .dockerignore
================================================
node_modules
.git
.devcontainer
*.md
.env
diagrams
e2e-tests


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: st_nsmith
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
polar: # Replace with a single Polar username
buy_me_a_coffee: stan.smith
thanks_dev: # Replace with a single thanks.dev username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: 🐛 Bug Report
description: Something isn't working as expected. Please provide enough detail that I can actually reproduce it.
title: "Bug: "
labels: ["bug"]
body:
  - type: markdown
    attributes:
      value: |
        Thanks for taking the time to report a bug. Please fill in **all** the required fields below.
        Issues missing required information will be closed without comment.

  - type: checkboxes
    id: existing-issues
    attributes:
      label: Pre-flight checks
      description: Please confirm the following before submitting.
      options:
        - label: I have searched existing issues and this hasn't been reported before
          required: true
        - label: I am running the latest version of FossFLOW
          required: true
        - label: I have read the README and checked if this is expected behaviour
          required: true

  - type: dropdown
    id: deployment
    attributes:
      label: Deployment method
      description: How are you running FossFLOW?
      options:
        - Docker (docker run)
        - Docker Compose
        - Built from source (npm run dev)
        - Built from source (npm run build)
        - Online demo
      default: 0
    validations:
      required: true

  - type: input
    id: version
    attributes:
      label: FossFLOW version / Docker image tag
      description: "e.g. latest, v1.2.0, commit hash"
      placeholder: "latest"
    validations:
      required: true

  - type: input
    id: browser
    attributes:
      label: Browser and version
      description: "e.g. Chrome 131, Firefox 134, Safari 18.2"
      placeholder: "Chrome 131"
    validations:
      required: true

  - type: input
    id: os
    attributes:
      label: Operating system
      placeholder: "e.g. macOS 15.2, Windows 11, Ubuntu 24.04"
    validations:
      required: true

  - type: textarea
    id: description
    attributes:
      label: What happened?
      description: A clear description of the bug. What did you expect to happen vs what actually happened?
      placeholder: |
        Expected: ...
        Actual: ...
    validations:
      required: true

  - type: textarea
    id: reproduce
    attributes:
      label: Steps to reproduce
      description: Minimum steps to reproduce the issue. If I can't reproduce it, I can't fix it.
      placeholder: |
        1. Open FossFLOW
        2. Click on '...'
        3. Observe '...'
    validations:
      required: true

  - type: textarea
    id: screenshots
    attributes:
      label: Screenshots / screen recordings
      description: If applicable, add screenshots or a screen recording. Drag and drop images here.
    validations:
      required: false

  - type: textarea
    id: logs
    attributes:
      label: Browser console output / Docker logs
      description: Open browser DevTools (F12) → Console tab, or run `docker logs <container>`. Paste any errors here.
      render: shell
    validations:
      required: false

  - type: textarea
    id: diagram-json
    attributes:
      label: Diagram JSON (if relevant)
      description: Export your diagram and paste the JSON here if the bug is diagram-specific. Remove anything sensitive first.
      render: json
    validations:
      required: false


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: 💬 General Discussion
    url: https://github.com/stan-smith/FossFLOW/discussions
    about: Got a question, idea, or just want to chat? Start a discussion instead of an issue.
  - name: 📖 README & Documentation
    url: https://github.com/stan-smith/FossFLOW#readme
    about: Please check the docs before opening an issue - your answer might already be there.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: 💡 Feature Request
description: Suggest a new feature or improvement. Please check the project scope first.
title: "Feature: "
labels: ["enhancement"]
body:
  - type: markdown
    attributes:
      value: |
        Thanks for the suggestion! Before submitting, please understand that FossFLOW is a **simple, privacy-first diagramming tool**. 
        
        The following are **out of scope** and will be closed immediately:
        - Authentication, RBAC, OIDC, or multi-tenancy
        - User accounts or team management
        - Cloud hosting or SaaS features
        - Anything that fundamentally changes what FossFLOW is
        
        If you're unsure whether your idea fits, open a [Discussion](https://github.com/stan-smith/FossFLOW/discussions) first.

  - type: checkboxes
    id: preflight
    attributes:
      label: Pre-flight checks
      options:
        - label: I have searched existing issues and feature requests for duplicates
          required: true
        - label: This feature is within the scope described above
          required: true
        - label: I have checked [Discussions](https://github.com/stan-smith/FossFLOW/discussions) for related topics
          required: true

  - type: textarea
    id: problem
    attributes:
      label: What problem does this solve?
      description: Describe the problem or limitation you're experiencing. Focus on the *problem*, not the solution.
      placeholder: "I'm trying to do X but currently I have to..."
    validations:
      required: true

  - type: textarea
    id: solution
    attributes:
      label: Proposed solution
      description: How do you think this could be solved? Be specific.
    validations:
      required: true

  - type: textarea
    id: alternatives
    attributes:
      label: Alternatives you've considered
      description: What other approaches have you tried or thought about?
    validations:
      required: true

  - type: dropdown
    id: contribution
    attributes:
      label: Are you willing to work on this?
      description: Would you be prepared to submit a PR for this feature?
      options:
        - "Yes - I'd like to implement this myself"
        - "Partially - I could help but would need guidance"
        - "No - I'm suggesting it for someone else to build"
      default: 2
    validations:
      required: true

  - type: textarea
    id: context
    attributes:
      label: Additional context
      description: Screenshots, mockups, examples from other tools, etc.
    validations:
      required: false


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## What does this PR do?

<!-- Explain clearly what this changes and why. Link to the related issue. -->

Fixes #

## Type of change

- [ ] Bug fix
- [ ] New feature
- [ ] Refactor (no functional change)
- [ ] Documentation update

## Checklist

- [ ] I have read [CONTRIBUTING.md](CONTRIBUTING.md)
- [ ] I have tested these changes locally and they work
- [ ] I can explain every line of code in this PR if asked
- [ ] This PR does not contain AI-generated code that I haven't personally reviewed, understood, and tested
- [ ] I have not added any unnecessary comments, logging, or dead code
- [ ] My code follows the existing style and conventions of the project
- [ ] I have updated documentation if applicable

## How to test

<!-- Steps for the maintainer to verify this works: -->

1. 
2. 
3. 

## Screenshots (if UI change)

<!-- Drag and drop before/after screenshots here -->


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    open-pull-requests-limit: 10
    commit-message:
      prefix: "chore(deps)"
    groups:
      minor-and-patch:
        update-types:
          - "minor"
          - "patch"

  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
    open-pull-requests-limit: 5
    commit-message:
      prefix: "ci(deps)"


================================================
FILE: .github/workflows/dependabot-automerge.yml
================================================
name: Dependabot Auto-Merge

on:
  pull_request:

permissions:
  contents: write
  pull-requests: write

jobs:
  automerge:
    runs-on: ubuntu-latest
    if: github.actor == 'dependabot[bot]'

    steps:
      - name: Fetch Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v2
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}

      - name: Enable auto-merge for minor and patch updates
        if: steps.metadata.outputs.update-type != 'version-update:semver-major'
        run: gh pr merge --auto --squash "$PR_URL"
        env:
          PR_URL: ${{ github.event.pull_request.html_url }}
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/docker.yml
================================================
name: Build and Push Docker Image

on:
  workflow_run:
    workflows: ["E2E Tests"]
    types:
      - completed
    branches: ["main", "master"]

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    if: ${{ github.event.workflow_run.conclusion == 'success' }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v4

      - name: Log in to Docker Hub
        uses: docker/login-action@v4
        with:
          username: stnsmith
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v6
        with:
          images: stnsmith/fossflow
          tags: |
            type=semver,pattern={{version}},enable=${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') }}
            type=semver,pattern={{major}}.{{minor}},enable=${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') }}
            type=semver,pattern={{major}},enable=${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') }}
            type=ref,event=branch,enable=${{ github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/v') }}
            type=sha,prefix={{branch}}-,enable=${{ github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/v') }}
            type=raw,value=latest,enable={{is_default_branch}}
      - name: Build and push Docker image
        uses: docker/build-push-action@v7
        with:
          context: .
          file: ./Dockerfile
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
          progress: plain


================================================
FILE: .github/workflows/e2e-tests.yml
================================================
name: E2E Tests

on:
  # Runs on PRs so we can gate merges on E2E results
  pull_request:
    branches: ["main", "master"]
  # Runs after unit tests complete successfully on push
  workflow_run:
    workflows: ["Run Tests"]
    types:
      - completed
    branches: ["main", "master"]

jobs:
  e2e-tests:
    runs-on: ubuntu-latest
    if: ${{ github.event_name == 'pull_request' || github.event.workflow_run.conclusion == 'success' }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: '22.x'
          cache: 'npm'

      - name: Setup Python
        uses: actions/setup-python@v6
        with:
          python-version: '3.11'
          cache: 'pip'
          cache-dependency-path: 'e2e-tests/requirements.txt'

      - name: Install Node dependencies
        run: npm ci

      - name: Install Python dependencies
        run: |
          cd e2e-tests
          pip install -r requirements.txt

      - name: Build FossFLOW library
        run: npm run build:lib

      - name: Build FossFLOW app
        run: npm run build:app

      - name: Install serve globally
        run: npm install -g serve

      - name: Start Selenium Chrome in background
        run: |
          docker run -d \
            --name selenium-chrome \
            --network host \
            --shm-size=2g \
            selenium/standalone-chrome:latest

          echo "Waiting for Selenium to be ready..."
          timeout 60 bash -c 'until curl -sf http://localhost:4444/status; do sleep 2; done' || {
            echo "Selenium failed to start"
            docker logs selenium-chrome
            exit 1
          }
          echo "Selenium is ready"
          curl -s http://localhost:4444/status | jq '.' || true

      - name: Start FossFLOW server in background
        run: |
          cd packages/fossflow-app/build
          nohup serve -s . -l 3000 > /tmp/server.log 2>&1 &
          echo $! > /tmp/server.pid
          echo "Server PID: $(cat /tmp/server.pid)"
          echo "Waiting for server to start..."
          timeout 60 bash -c 'until curl -sf http://localhost:3000; do sleep 2; done' || {
            echo "Server failed to start"
            echo "Server logs:"
            cat /tmp/server.log
            kill $(cat /tmp/server.pid) 2>/dev/null || true
            exit 1
          }
          echo "Server is ready"
          echo "Server PID saved to /tmp/server.pid"
        env:
          CI: true

      - name: Verify connectivity before tests
        run: |
          echo "Testing app connectivity..."
          curl -sf http://localhost:3000 || echo "App not accessible"
          echo "Testing Selenium connectivity..."
          curl -sf http://localhost:4444/status || echo "Selenium not accessible"

      - name: Run E2E tests
        run: |
          cd e2e-tests
          pytest -v --tb=short
        env:
          FOSSFLOW_TEST_URL: http://localhost:3000
          WEBDRIVER_URL: http://localhost:4444

      - name: Stop Selenium and FossFLOW server
        if: always()
        run: |
          echo "Stopping Selenium container..."
          docker stop selenium-chrome 2>/dev/null || true
          docker rm selenium-chrome 2>/dev/null || true

          if [ -f /tmp/server.pid ]; then
            echo "Stopping server (PID: $(cat /tmp/server.pid))"
            kill $(cat /tmp/server.pid) 2>/dev/null || true
            echo "Server logs:"
            cat /tmp/server.log || true
          fi

      - name: Upload test results
        if: always()
        uses: actions/upload-artifact@v7
        with:
          name: e2e-test-results
          path: e2e-tests/target/
          if-no-files-found: ignore
          retention-days: 7


================================================
FILE: .github/workflows/e2e-tests.yml.backup
================================================
name: E2E Tests

on:
  # Runs after unit tests complete successfully
  workflow_run:
    workflows: ["Run Tests"]
    types:
      - completed
    branches: ["main", "master"]

jobs:
  e2e-tests:
    runs-on: ubuntu-latest
    if: ${{ github.event.workflow_run.conclusion == 'success' }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20.x'
          cache: 'npm'

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'
          cache: 'pip'
          cache-dependency-path: 'e2e-tests/requirements.txt'

      - name: Install Node dependencies
        run: npm ci

      - name: Install Python dependencies
        run: |
          cd e2e-tests
          pip install -r requirements.txt

      - name: Build FossFLOW library
        run: npm run build:lib

      - name: Build FossFLOW app
        run: npm run build:app

      - name: Install serve globally
        run: npm install -g serve

      - name: Start Selenium Chrome in background
        run: |
          docker run -d \
            --name selenium-chrome \
            --network host \
            --shm-size=2g \
            selenium/standalone-chrome:latest

          echo "Waiting for Selenium to be ready..."
          timeout 60 bash -c 'until curl -sf http://localhost:4444/status; do sleep 2; done' || {
            echo "Selenium failed to start"
            docker logs selenium-chrome
            exit 1
          }
          echo "Selenium is ready"
          curl -s http://localhost:4444/status | jq '.' || true

      - name: Start FossFLOW server in background
        run: |
          cd packages/fossflow-app/build
          nohup serve -s . -l 3000 > /tmp/server.log 2>&1 &
          echo $! > /tmp/server.pid
          echo "Server PID: $(cat /tmp/server.pid)"
          echo "Waiting for server to start..."
          timeout 60 bash -c 'until curl -sf http://localhost:3000; do sleep 2; done' || {
            echo "Server failed to start"
            echo "Server logs:"
            cat /tmp/server.log
            kill $(cat /tmp/server.pid) 2>/dev/null || true
            exit 1
          }
          echo "Server is ready"
          echo "Server PID saved to /tmp/server.pid"
        env:
          CI: true

      - name: Verify connectivity before tests
        run: |
          echo "Testing app connectivity..."
          curl -sf http://localhost:3000 || echo "App not accessible"
          echo "Testing Selenium connectivity..."
          curl -sf http://localhost:4444/status || echo "Selenium not accessible"

      - name: Run E2E tests
        run: |
          cd e2e-tests
          pytest -v --tb=short
        env:
          FOSSFLOW_TEST_URL: http://localhost:3000
          WEBDRIVER_URL: http://localhost:4444

      - name: Stop Selenium and FossFLOW server
        if: always()
        run: |
          echo "Stopping Selenium container..."
          docker stop selenium-chrome 2>/dev/null || true
          docker rm selenium-chrome 2>/dev/null || true

          if [ -f /tmp/server.pid ]; then
            echo "Stopping server (PID: $(cat /tmp/server.pid))"
            kill $(cat /tmp/server.pid) 2>/dev/null || true
            echo "Server logs:"
            cat /tmp/server.log || true
          fi

      - name: Upload test results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: e2e-test-results
          path: e2e-tests/target/
          if-no-files-found: ignore
          retention-days: 7


================================================
FILE: .github/workflows/ethicalcheck.yml
================================================
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

# EthicalCheck addresses the critical need to continuously security test APIs in development and in production.

# EthicalCheck provides the industry’s only free & automated API security testing service that uncovers security vulnerabilities using OWASP API list.
# Developers relies on EthicalCheck to evaluate every update and release, ensuring that no APIs go to production with exploitable vulnerabilities.

# You develop the application and API, we bring complete and continuous security testing to you, accelerating development.

# Know your API and Applications are secure with EthicalCheck – our free & automated API security testing service.

# How EthicalCheck works?
# EthicalCheck functions in the following simple steps.
# 1. Security Testing.
# Provide your OpenAPI specification or start with a public Postman collection URL.
# EthicalCheck instantly instrospects your API and creates a map of API endpoints for security testing.
# It then automatically creates hundreds of security tests that are non-intrusive to comprehensively and completely test for authentication, authorizations, and OWASP bugs your API. The tests addresses the OWASP API Security categories including OAuth 2.0, JWT, Rate Limit etc.

# 2. Reporting.
# EthicalCheck generates security test report that includes all the tested endpoints, coverage graph, exceptions, and vulnerabilities.
# Vulnerabilities are fully triaged, it contains CVSS score, severity, endpoint information, and OWASP tagging.


# This is a starter workflow to help you get started with EthicalCheck Actions

name: EthicalCheck-Workflow

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the "master" branch
  # Customize trigger events based on your DevSecOps processes.
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]
  schedule:
    - cron: '31 22 * * 0'

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

permissions:
  contents: read

jobs:
  Trigger_EthicalCheck:
    permissions:
      security-events: write # for github/codeql-action/upload-sarif to upload SARIF results
      actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status
    runs-on: ubuntu-latest

    steps:
       - name: EthicalCheck  Free & Automated API Security Testing Service
         uses: apisec-inc/ethicalcheck-action@005fac321dd843682b1af6b72f30caaf9952c641
         with:
          # The OpenAPI Specification URL or Swagger Path or Public Postman collection URL.
          oas-url: "http://netbanking.apisec.ai:8080/v2/api-docs"
          # The email address to which the penetration test report will be sent.
          email: "security_reports@x0z.co"
          sarif-result-file: "ethicalcheck-results.sarif"

       - name: Upload sarif file to repository
         uses: github/codeql-action/upload-sarif@v4
         with:
          sarif_file: ./ethicalcheck-results.sarif



================================================
FILE: .github/workflows/pages.yml
================================================
# Simple workflow for deploying static content to GitHub Pages
name: Deploy static content to Pages

on:
  # Runs after E2E tests complete successfully
  workflow_run:
    workflows: ["E2E Tests"]
    types:
      - completed
    branches: ["main", "master"]

# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
  contents: read
  pages: write
  id-token: write

# Allow one concurrent deployment
concurrency:
  group: "pages"
  cancel-in-progress: true

jobs:
  # Single deploy job since we're just deploying
  deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    steps:
      - name: Checkout
        uses: actions/checkout@v6
      - name: Setup Pages
        uses: actions/configure-pages@v5
      - name: Build
        uses: docker://node:22-alpine
        with:
          args: sh -c "npm install && npm run build:lib && npm run build:app"
        env:
          # do not report warnings as errors
          CI: false
          PUBLIC_URL: /FossFLOW/
      - name: Upload artifact
        uses: actions/upload-pages-artifact@v4
        with:
          # Upload from the app's build directory in monorepo
          path: './packages/fossflow-app/build/'
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4

================================================
FILE: .github/workflows/release.yml
================================================
name: Release

on:
  # Runs after Pages deployment completes successfully
  workflow_run:
    workflows: ["Deploy static content to Pages"]
    types:
      - completed
    branches: ["main", "master"]

permissions:
  contents: write
  issues: write
  pull-requests: write

jobs:
  release:
    name: Semantic Release
    runs-on: ubuntu-latest
    if: ${{ github.event.workflow_run.conclusion == 'success' }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
          persist-credentials: false

      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: '22'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run semantic-release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
        run: npx semantic-release


================================================
FILE: .github/workflows/test.yml
================================================
name: Run Tests

on:
  push:
    branches: ["main", "master"]
  pull_request:
    branches: ["main", "master"]

jobs:
  test:
    runs-on: ubuntu-latest
    
    strategy:
      matrix:
        node-version: [20.x, 22.x, 24.x]
    
    steps:
      - name: Checkout code
        uses: actions/checkout@v6
      
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v6
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'
      
      - name: Install dependencies
        run: npm ci
      
      - name: Run tests with coverage
        run: npm test -- --coverage || npm test
        env:
          CI: true
      
      - name: Upload coverage reports
        if: success()
        uses: actions/upload-artifact@v7
        with:
          name: coverage-node-${{ matrix.node-version }}
          path: |
            packages/*/coverage/
            coverage/
          if-no-files-found: ignore
          retention-days: 7
      
      - name: Upload test results
        if: always()
        uses: actions/upload-artifact@v7
        with:
          name: test-results-node-${{ matrix.node-version }}
          path: |
            packages/*/test-results/
            test-results/
          if-no-files-found: ignore
          retention-days: 7

      - name: Run NPM build to check there are no build errors
        run: npm run build


================================================
FILE: .gitignore
================================================
node_modules/
dist/
build/
*.log
.env
.env.local
.DS_Store
coverage/
.vscode/
.idea/
*.swp
*.swo
*~
.npm
.eslintcache
*.tsbuildinfo
/e2e-tests/target
*.snap
parts/
prime/
stage/
overlay/
.claude

================================================
FILE: .npmignore
================================================
# Source files
src/
webpack/
docs/
.circleci/
.codesandbox/
.vscode/

# Config files
.eslintrc
.prettierrc
.nvmrc
jest.config.js
tsconfig.json
*.config.js

# Build artifacts
node_modules/
*.log

# Documentation
*.md
!README.md
!LICENSE

# Git
.git/
.gitignore

# Other
Dockerfile

================================================
FILE: .nvmrc
================================================
16.19.0

================================================
FILE: .prettierrc
================================================
{
  "semi": true,
  "trailingComma": "none",
  "singleQuote": true,
  "printWidth": 80,
  "tabWidth": 2
}

================================================
FILE: .releaserc.json
================================================
{
  "branches": ["master", "main"],
  "repositoryUrl": "https://github.com/stan-smith/FossFLOW.git",
  "plugins": [
    [
      "@semantic-release/commit-analyzer",
      {
        "preset": "conventionalcommits",
        "releaseRules": [
          { "type": "feat", "release": "minor" },
          { "type": "fix", "release": "patch" },
          { "type": "perf", "release": "patch" },
          { "type": "revert", "release": "patch" },
          { "type": "docs", "release": false },
          { "type": "style", "release": false },
          { "type": "chore", "release": false },
          { "type": "refactor", "release": "patch" },
          { "type": "test", "release": false },
          { "type": "build", "release": false },
          { "type": "ci", "release": false },
          { "breaking": true, "release": "major" }
        ]
      }
    ],
    [
      "@semantic-release/release-notes-generator",
      {
        "preset": "conventionalcommits",
        "presetConfig": {
          "types": [
            { "type": "feat", "section": "Features" },
            { "type": "fix", "section": "Bug Fixes" },
            { "type": "perf", "section": "Performance" },
            { "type": "revert", "section": "Reverts" },
            { "type": "docs", "section": "Documentation", "hidden": false },
            { "type": "style", "section": "Styles", "hidden": true },
            { "type": "chore", "section": "Chores", "hidden": true },
            { "type": "refactor", "section": "Code Refactoring" },
            { "type": "test", "section": "Tests", "hidden": true },
            { "type": "build", "section": "Build System", "hidden": true },
            { "type": "ci", "section": "CI/CD", "hidden": true }
          ]
        }
      }
    ],
    [
      "@semantic-release/changelog",
      {
        "changelogFile": "CHANGELOG.md",
        "changelogTitle": "# Changelog\n\nAll notable changes to FossFLOW will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html)."
      }
    ],
    [
      "@semantic-release/exec",
      {
        "prepareCmd": "npm run update-version ${nextRelease.version} && npm run build"
      }
    ],
    "@semantic-release/github",
    [
      "@semantic-release/git",
      {
        "assets": [
          "CHANGELOG.md",
          "package.json",
          "package-lock.json",
          "packages/*/package.json"
        ],
        "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
      }
    ]
  ]
}


================================================
FILE: CHANGELOG.md
================================================
# Changelog

All notable changes to FossFLOW will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.10.8](https://github.com/stan-smith/FossFLOW/compare/v1.10.7...v1.10.8) (2026-03-01)

### Bug Fixes

* **ui:** make settings tabs scrollable to prevent hiding ([#238](https://github.com/stan-smith/FossFLOW/issues/238)) [@0x-la1n](https://github.com/0x-la1n) ([42835fe](https://github.com/stan-smith/FossFLOW/commit/42835fe0b77458fdff7f32f884ae2ee6506efdc7))

## [1.10.7](https://github.com/stan-smith/FossFLOW/compare/v1.10.6...v1.10.7) (2026-02-15)

### Bug Fixes

* Fixed issues with history not fully working, undo/redo was hit or miss. Additionally added a huge amount of CI/CD testing using selenium so that we can simulate creating a diagram, placing nodes, connceting them, undo/redo, and rectangles/text as well, with love, Stan ([047df92](https://github.com/stan-smith/FossFLOW/commit/047df927858417ec068a749a3f6a0c6dd8741fec))

## [1.10.6](https://github.com/stan-smith/FossFLOW/compare/v1.10.5...v1.10.6) (2026-02-14)

### Reverts

* Revert "fix: replace dual-store undo/redo with unified history store" ([0c67bad](https://github.com/stan-smith/FossFLOW/commit/0c67bad5c5e433821cd9f5cd40ef9d0d0cd1f6ee))

## [1.10.5](https://github.com/stan-smith/FossFLOW/compare/v1.10.4...v1.10.5) (2026-02-13)

### Bug Fixes

* replace dual-store undo/redo with unified history store ([c3f5df2](https://github.com/stan-smith/FossFLOW/commit/c3f5df23ca451ce5d00759946eec7343d67a4332))

## [1.10.4](https://github.com/stan-smith/FossFLOW/compare/v1.10.3...v1.10.4) (2026-02-06)

### Performance

* refactored useScene and store subscriptions for performance gains ([7f97e07](https://github.com/stan-smith/FossFLOW/commit/7f97e074bb436fe237195af136bac53791608baa))

### Documentation

* removed cruft from readmes ([daa0dd3](https://github.com/stan-smith/FossFLOW/commit/daa0dd3b76162278f79f1a2c1b063df1505c8ce1))
* update contributing.md ([011f0af](https://github.com/stan-smith/FossFLOW/commit/011f0aff1d8cc38ac54eb4934a8ec775c1915b53))

## [1.10.3](https://github.com/stan-smith/FossFLOW/compare/v1.10.2...v1.10.3) (2026-02-02)

### Bug Fixes

* lasso wasnt moving nodes if there was also a text item in the selection, now it works ([f5ce168](https://github.com/stan-smith/FossFLOW/commit/f5ce1689c9c3ceaa0b180d4c165914c64f3252ec))

## [1.10.2](https://github.com/stan-smith/FossFLOW/compare/v1.10.1...v1.10.2) (2026-01-31)

### Bug Fixes

* memoized tools and other components as they were causing again more re-renders, this improves performance a touch ([e011f8c](https://github.com/stan-smith/FossFLOW/commit/e011f8cea2acd9e46efd9a9713dc3aaf94d923d5))

## [1.10.1](https://github.com/stan-smith/FossFLOW/compare/v1.10.0...v1.10.1) (2026-01-26)

### Bug Fixes

* resolve flickering issue ([#203](https://github.com/stan-smith/FossFLOW/issues/203)) ([#215](https://github.com/stan-smith/FossFLOW/issues/215)) @Abrar74774 ([dd2b782](https://github.com/stan-smith/FossFLOW/commit/dd2b782398f932597a8726906107a088a7b68b59))

## [1.10.0](https://github.com/stan-smith/FossFLOW/compare/v1.9.2...v1.10.0) (2026-01-22)

### Features

* Added SVG export, fixes [#211](https://github.com/stan-smith/FossFLOW/issues/211) ([b14832f](https://github.com/stan-smith/FossFLOW/commit/b14832f541068d41f88379a8c907648549f433b6))

## [1.9.2](https://github.com/stan-smith/FossFLOW/compare/v1.9.1...v1.9.2) (2026-01-15)

### Documentation

* add missing language cross-references to all READMEs ([806cf08](https://github.com/stan-smith/FossFLOW/commit/806cf08681a14b68a264279930c9194deb416775))

### Code Refactoring

* bumped react18 to react19 along with associated deps and changes needed, long time coming, fixes [#72](https://github.com/stan-smith/FossFLOW/issues/72), thanks [@mmastrac](https://github.com/mmastrac) for providing some of the groundwork - Stan ([2fa3a3c](https://github.com/stan-smith/FossFLOW/commit/2fa3a3c970ea5dba944bb666f42a1f6ec7725595))

## [1.9.1](https://github.com/stan-smith/FossFLOW/compare/v1.9.0...v1.9.1) (2026-01-14)

### Bug Fixes

* resolve security vulnerabilities in dependencies ([023c1e9](https://github.com/stan-smith/FossFLOW/commit/023c1e902f2cd2dd35cb5440f2d4afe6ac12c55d))

## [1.9.0](https://github.com/stan-smith/FossFLOW/compare/v1.8.1...v1.9.0) (2026-01-14)

### Features

* add German translations ([1624d16](https://github.com/stan-smith/FossFLOW/commit/1624d1662c024b1d42e6f6f6a2a97e68437d873b))

## [1.8.1](https://github.com/stan-smith/FossFLOW/compare/v1.8.0...v1.8.1) (2026-01-14)

### Bug Fixes

* make dotted line transparent to click events ([#190](https://github.com/stan-smith/FossFLOW/issues/190)) [@majiayu000](https://github.com/majiayu000) ([554325a](https://github.com/stan-smith/FossFLOW/commit/554325ad129529d8938756204f6be89e622d6f0b)), closes [#61](https://github.com/stan-smith/FossFLOW/issues/61)

## [1.8.0](https://github.com/stan-smith/FossFLOW/compare/v1.7.0...v1.8.0) (2026-01-12)

### Features

* Add labels to icons indicating if not isometric (flat) ([#201](https://github.com/stan-smith/FossFLOW/issues/201)) ([a553e3c](https://github.com/stan-smith/FossFLOW/commit/a553e3c00ce8a9e776ba700e8fbdfc304c3e953e))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2026-01-11)

### Features

* add indonesian language ([#186](https://github.com/stan-smith/FossFLOW/issues/186)) [@akmalsyrf](https://github.com/akmalsyrf) ([2ce342d](https://github.com/stan-smith/FossFLOW/commit/2ce342dc98278ac73841fb083d51969da811f30e))
* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* transparent background for exporting as png ([#180](https://github.com/stan-smith/FossFLOW/issues/180)) @F4tal1t thank you for contributing as always! ([ba1b376](https://github.com/stan-smith/FossFLOW/commit/ba1b3762db9ac34360703553e5428cf39f556534))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

### Bug Fixes

* build error caused by missing property in src/i18n/es-ES.ts ([#202](https://github.com/stan-smith/FossFLOW/issues/202)) ([574b298](https://github.com/stan-smith/FossFLOW/commit/574b298e90a346d2cebd5c8b76a2bb2c80c25d6e))
* resolve issue [#136](https://github.com/stan-smith/FossFLOW/issues/136) where "Add Node" popup has huge offset ([#195](https://github.com/stan-smith/FossFLOW/issues/195)) ([fa5478e](https://github.com/stan-smith/FossFLOW/commit/fa5478e709f187a9a5b458a967dd99c2ed9da69b))
* resolve issue [#198](https://github.com/stan-smith/FossFLOW/issues/198) where moving sliders pan view ([#199](https://github.com/stan-smith/FossFLOW/issues/199)) ([af62f2f](https://github.com/stan-smith/FossFLOW/commit/af62f2f9b54d45f219fc442510bc7b359cc2b6d7))

### Documentation

* fix remaining CONTRIBUTING.md links in readme ([#197](https://github.com/stan-smith/FossFLOW/issues/197)) @Abrar74774 Thank you! ([cbf922d](https://github.com/stan-smith/FossFLOW/commit/cbf922d400aa9d5dc616e2269685e0700c45b91b))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2026-01-10)

### Features

* add indonesian language ([#186](https://github.com/stan-smith/FossFLOW/issues/186)) [@akmalsyrf](https://github.com/akmalsyrf) ([2ce342d](https://github.com/stan-smith/FossFLOW/commit/2ce342dc98278ac73841fb083d51969da811f30e))
* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* transparent background for exporting as png ([#180](https://github.com/stan-smith/FossFLOW/issues/180)) @F4tal1t thank you for contributing as always! ([ba1b376](https://github.com/stan-smith/FossFLOW/commit/ba1b3762db9ac34360703553e5428cf39f556534))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

### Bug Fixes

* build error caused by missing property in src/i18n/es-ES.ts ([#202](https://github.com/stan-smith/FossFLOW/issues/202)) ([574b298](https://github.com/stan-smith/FossFLOW/commit/574b298e90a346d2cebd5c8b76a2bb2c80c25d6e))
* resolve issue [#136](https://github.com/stan-smith/FossFLOW/issues/136) where "Add Node" popup has huge offset ([#195](https://github.com/stan-smith/FossFLOW/issues/195)) ([fa5478e](https://github.com/stan-smith/FossFLOW/commit/fa5478e709f187a9a5b458a967dd99c2ed9da69b))
* resolve issue [#198](https://github.com/stan-smith/FossFLOW/issues/198) where moving sliders pan view ([#199](https://github.com/stan-smith/FossFLOW/issues/199)) ([af62f2f](https://github.com/stan-smith/FossFLOW/commit/af62f2f9b54d45f219fc442510bc7b359cc2b6d7))

### Documentation

* fix remaining CONTRIBUTING.md links in readme ([#197](https://github.com/stan-smith/FossFLOW/issues/197)) @Abrar74774 Thank you! ([cbf922d](https://github.com/stan-smith/FossFLOW/commit/cbf922d400aa9d5dc616e2269685e0700c45b91b))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2026-01-10)

### Features

* add indonesian language ([#186](https://github.com/stan-smith/FossFLOW/issues/186)) [@akmalsyrf](https://github.com/akmalsyrf) ([2ce342d](https://github.com/stan-smith/FossFLOW/commit/2ce342dc98278ac73841fb083d51969da811f30e))
* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* transparent background for exporting as png ([#180](https://github.com/stan-smith/FossFLOW/issues/180)) @F4tal1t thank you for contributing as always! ([ba1b376](https://github.com/stan-smith/FossFLOW/commit/ba1b3762db9ac34360703553e5428cf39f556534))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

### Bug Fixes

* build error caused by missing property in src/i18n/es-ES.ts ([#202](https://github.com/stan-smith/FossFLOW/issues/202)) ([574b298](https://github.com/stan-smith/FossFLOW/commit/574b298e90a346d2cebd5c8b76a2bb2c80c25d6e))
* resolve issue [#136](https://github.com/stan-smith/FossFLOW/issues/136) where "Add Node" popup has huge offset ([#195](https://github.com/stan-smith/FossFLOW/issues/195)) ([fa5478e](https://github.com/stan-smith/FossFLOW/commit/fa5478e709f187a9a5b458a967dd99c2ed9da69b))
* resolve issue [#198](https://github.com/stan-smith/FossFLOW/issues/198) where moving sliders pan view ([#199](https://github.com/stan-smith/FossFLOW/issues/199)) ([af62f2f](https://github.com/stan-smith/FossFLOW/commit/af62f2f9b54d45f219fc442510bc7b359cc2b6d7))

### Documentation

* fix remaining CONTRIBUTING.md links in readme ([#197](https://github.com/stan-smith/FossFLOW/issues/197)) @Abrar74774 Thank you! ([cbf922d](https://github.com/stan-smith/FossFLOW/commit/cbf922d400aa9d5dc616e2269685e0700c45b91b))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2026-01-08)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* transparent background for exporting as png ([#180](https://github.com/stan-smith/FossFLOW/issues/180)) @F4tal1t thank you for contributing as always! ([ba1b376](https://github.com/stan-smith/FossFLOW/commit/ba1b3762db9ac34360703553e5428cf39f556534))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

### Bug Fixes

* resolve issue [#136](https://github.com/stan-smith/FossFLOW/issues/136) where "Add Node" popup has huge offset ([#195](https://github.com/stan-smith/FossFLOW/issues/195)) ([fa5478e](https://github.com/stan-smith/FossFLOW/commit/fa5478e709f187a9a5b458a967dd99c2ed9da69b))
* resolve issue [#198](https://github.com/stan-smith/FossFLOW/issues/198) where moving sliders pan view ([#199](https://github.com/stan-smith/FossFLOW/issues/199)) ([af62f2f](https://github.com/stan-smith/FossFLOW/commit/af62f2f9b54d45f219fc442510bc7b359cc2b6d7))

### Documentation

* fix remaining CONTRIBUTING.md links in readme ([#197](https://github.com/stan-smith/FossFLOW/issues/197)) @Abrar74774 Thank you! ([cbf922d](https://github.com/stan-smith/FossFLOW/commit/cbf922d400aa9d5dc616e2269685e0700c45b91b))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2026-01-06)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* transparent background for exporting as png ([#180](https://github.com/stan-smith/FossFLOW/issues/180)) @F4tal1t thank you for contributing as always! ([ba1b376](https://github.com/stan-smith/FossFLOW/commit/ba1b3762db9ac34360703553e5428cf39f556534))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

### Bug Fixes

* resolve issue [#136](https://github.com/stan-smith/FossFLOW/issues/136) where "Add Node" popup has huge offset ([#195](https://github.com/stan-smith/FossFLOW/issues/195)) ([fa5478e](https://github.com/stan-smith/FossFLOW/commit/fa5478e709f187a9a5b458a967dd99c2ed9da69b))

### Documentation

* fix remaining CONTRIBUTING.md links in readme ([#197](https://github.com/stan-smith/FossFLOW/issues/197)) @Abrar74774 Thank you! ([cbf922d](https://github.com/stan-smith/FossFLOW/commit/cbf922d400aa9d5dc616e2269685e0700c45b91b))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2026-01-03)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* transparent background for exporting as png ([#180](https://github.com/stan-smith/FossFLOW/issues/180)) @F4tal1t thank you for contributing as always! ([ba1b376](https://github.com/stan-smith/FossFLOW/commit/ba1b3762db9ac34360703553e5428cf39f556534))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

### Bug Fixes

* resolve issue [#136](https://github.com/stan-smith/FossFLOW/issues/136) where "Add Node" popup has huge offset ([#195](https://github.com/stan-smith/FossFLOW/issues/195)) ([fa5478e](https://github.com/stan-smith/FossFLOW/commit/fa5478e709f187a9a5b458a967dd99c2ed9da69b))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2026-01-03)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* transparent background for exporting as png ([#180](https://github.com/stan-smith/FossFLOW/issues/180)) @F4tal1t thank you for contributing as always! ([ba1b376](https://github.com/stan-smith/FossFLOW/commit/ba1b3762db9ac34360703553e5428cf39f556534))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2026-01-02)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* transparent background for exporting as png ([#180](https://github.com/stan-smith/FossFLOW/issues/180)) @F4tal1t thank you for contributing as always! ([ba1b376](https://github.com/stan-smith/FossFLOW/commit/ba1b3762db9ac34360703553e5428cf39f556534))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2025-12-28)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* transparent background for exporting as png ([#180](https://github.com/stan-smith/FossFLOW/issues/180)) @F4tal1t thank you for contributing as always! ([ba1b376](https://github.com/stan-smith/FossFLOW/commit/ba1b3762db9ac34360703553e5428cf39f556534))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2025-12-28)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* transparent background for exporting as png ([#180](https://github.com/stan-smith/FossFLOW/issues/180)) @F4tal1t thank you for contributing as always! ([ba1b376](https://github.com/stan-smith/FossFLOW/commit/ba1b3762db9ac34360703553e5428cf39f556534))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2025-12-27)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* transparent background for exporting as png ([#180](https://github.com/stan-smith/FossFLOW/issues/180)) @F4tal1t thank you for contributing as always! ([ba1b376](https://github.com/stan-smith/FossFLOW/commit/ba1b3762db9ac34360703553e5428cf39f556534))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2025-12-26)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* transparent background for exporting as png ([#180](https://github.com/stan-smith/FossFLOW/issues/180)) @F4tal1t thank you for contributing as always! ([ba1b376](https://github.com/stan-smith/FossFLOW/commit/ba1b3762db9ac34360703553e5428cf39f556534))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2025-12-25)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* transparent background for exporting as png ([#180](https://github.com/stan-smith/FossFLOW/issues/180)) @F4tal1t thank you for contributing as always! ([ba1b376](https://github.com/stan-smith/FossFLOW/commit/ba1b3762db9ac34360703553e5428cf39f556534))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2025-12-08)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* transparent background for exporting as png ([#180](https://github.com/stan-smith/FossFLOW/issues/180)) @F4tal1t thank you for contributing as always! ([ba1b376](https://github.com/stan-smith/FossFLOW/commit/ba1b3762db9ac34360703553e5428cf39f556534))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2025-12-06)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2025-12-06)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2025-11-28)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2025-11-28)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))
* **ui:** enhance custom color picker and fix docs ([#169](https://github.com/stan-smith/FossFLOW/issues/169)) thank you [@non-stop-dev](https://github.com/non-stop-dev) ([f56812c](https://github.com/stan-smith/FossFLOW/commit/f56812c24e1d2eb402fce990d3607155d9f94014))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2025-11-20)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2025-11-20)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))

## [1.7.0](https://github.com/stan-smith/FossFLOW/compare/v1.6.1...v1.7.0) (2025-11-20)

### Features

* read-only mode ([#168](https://github.com/stan-smith/FossFLOW/issues/168)) ([85d32e6](https://github.com/stan-smith/FossFLOW/commit/85d32e64df0f4d22bd7c2d6b3a51275c09813f72))

## [1.6.1](https://github.com/stan-smith/FossFLOW/compare/v1.6.0...v1.6.1) (2025-11-18)

### Bug Fixes

* Add error boundary to handle React-Quill DOM manipulation errors ([6c38a11](https://github.com/stan-smith/FossFLOW/commit/6c38a11f4b8fde448b18958cfb28cb6dd1862613))

## [1.6.0](https://github.com/stan-smith/FossFLOW/compare/v1.5.2...v1.6.0) (2025-11-15)

### Features

* Variable DPI images! Finally! Fixes [#70](https://github.com/stan-smith/FossFLOW/issues/70) you're welcome [@fatflyingpigs](https://github.com/fatflyingpigs) ;) ([88ab63c](https://github.com/stan-smith/FossFLOW/commit/88ab63c969fd95538f369b8b5f0e4bba2b2e3b63))

## [1.5.2](https://github.com/stan-smith/FossFLOW/compare/v1.5.1...v1.5.2) (2025-11-15)

### Bug Fixes

* Fixes [#58](https://github.com/stan-smith/FossFLOW/issues/58) now allows for CTRL+S and CTRL+O to save/load diagrams, thanks [@fatflyingpigs](https://github.com/fatflyingpigs) for bringing this to my attention ([ed944a0](https://github.com/stan-smith/FossFLOW/commit/ed944a0b61d93c97917390eabc5bbc165f78ebc1))

## [1.5.1](https://github.com/stan-smith/FossFLOW/compare/v1.5.0...v1.5.1) (2025-10-18)

### Bug Fixes

* Added lazy icon loading, users now select which icons they want loaded in, by default only the isoflow ones get loaded in, users can quickly change this, or disable this behaviour, this results in much faster loads. Fixes [#79](https://github.com/stan-smith/FossFLOW/issues/79) ([e0462f6](https://github.com/stan-smith/FossFLOW/commit/e0462f6bbd58543b98bfb395fca4fc6a10e62a50))

## [1.5.0](https://github.com/stan-smith/FossFLOW/compare/v1.4.0...v1.5.0) (2025-10-17)

### Features

* Added Portugues, French, Hindi, Bengali, and Russian support -Stan ([b299bc3](https://github.com/stan-smith/FossFLOW/commit/b299bc33018b47708d546a43c80ee46629be818f))
* Added Spanish support! added more I18n compatability -Stan ([be14d87](https://github.com/stan-smith/FossFLOW/commit/be14d8705319da406a1cad142731ee0a698bcd3c))
* Lots of language support! ([956a2af](https://github.com/stan-smith/FossFLOW/commit/956a2af52f534be02b7d417f413a0ee66dd2e17d))

## [1.4.0](https://github.com/stan-smith/FossFLOW/compare/v1.3.0...v1.4.0) (2025-10-11)

### Features

* added in esc to get ya out of menus/interactions/connectors Fixes [#154](https://github.com/stan-smith/FossFLOW/issues/154) ([5cf61c3](https://github.com/stan-smith/FossFLOW/commit/5cf61c3055c9ef1ad6a2cf5b67659e3a825a28fa))

## [1.3.0](https://github.com/stan-smith/FossFLOW/compare/v1.2.0...v1.3.0) (2025-10-09)

### Features

* **ci:** added selenium based testing procedure for integration tests ([af6dabe](https://github.com/stan-smith/FossFLOW/commit/af6dabe0fd43eb899ea0d4078ba4eb0ec195bc1d))

## [1.2.0](https://github.com/stan-smith/FossFLOW/compare/v1.1.1...v1.2.0) (2025-10-09)

### Features

* upgraded to ESlint 9, fixed some vulns ([4e2a2d1](https://github.com/stan-smith/FossFLOW/commit/4e2a2d1a11925c960c88ff737069bc48d851c105))

## [1.1.1](https://github.com/stan-smith/FossFLOW/compare/v1.1.0...v1.1.1) (2025-10-08)

### Bug Fixes

* bumped all packages, no vulns in npm audit now ([09edf76](https://github.com/stan-smith/FossFLOW/commit/09edf76ef12df55859b77fc74823f5425dbbf8b1))

## [1.1.0](https://github.com/stan-smith/FossFLOW/compare/v1.0.5...v1.1.0) (2025-10-08)

### Features

* **ci:** fixing ci stuff ([85fa0e6](https://github.com/stan-smith/FossFLOW/commit/85fa0e668129577f7ab6427946b0e6c5b2c1bccb))

## 1.0.0 (2025-10-08)

### Features

* accepts an array of textboxes as part of initialData ([aaf48bd](https://github.com/stan-smith/FossFLOW/commit/aaf48bd33e97fcf3a87a9adef68451440f15a3ed))
* Add advanced pan controls with configurable options ([83c9b3a](https://github.com/stan-smith/FossFLOW/commit/83c9b3aed21f5881cf8c0025ba37043d580de914)), closes [#25](https://github.com/stan-smith/FossFLOW/issues/25)
* add click-based connector creation mode with empty space support ([#108](https://github.com/stan-smith/FossFLOW/issues/108)) ([5ff21cc](https://github.com/stan-smith/FossFLOW/commit/5ff21cc35fcf86b7e71b539ff5700039dfc3667e)), closes [#84](https://github.com/stan-smith/FossFLOW/issues/84)
* add close button to item control components ([a808b83](https://github.com/stan-smith/FossFLOW/commit/a808b8376fcf912d628188d691fec98c2f619bdb))
* add comprehensive tests for connector reducer and improve CI/CD coverage reporting ([70b1f56](https://github.com/stan-smith/FossFLOW/commit/70b1f560a24fa63c57241a3974ebcf381e701e5f))
* Add configurable hotkey system for tools ([ef258df](https://github.com/stan-smith/FossFLOW/commit/ef258dff17884660c2c99e78ecef736852156cc7)), closes [#59](https://github.com/stan-smith/FossFLOW/issues/59)
* Add custom icon import functionality with automatic scaling ([dd80e86](https://github.com/stan-smith/FossFLOW/commit/dd80e86de275524835084d26d52d560e3bc970f8))
* add Help dialog and shortcut key support ([d500460](https://github.com/stan-smith/FossFLOW/commit/d5004607db8bfbacb1c80a4d7ebedd6ba590d514))
* add i18n to main menu & docs: update Chinese README ([#130](https://github.com/stan-smith/FossFLOW/issues/130)) ([a001da7](https://github.com/stan-smith/FossFLOW/commit/a001da7edb0c81574a9fcbcbec30272cacf44591))
* add language detector & update Chinese README ([#127](https://github.com/stan-smith/FossFLOW/issues/127)) ([e18e51f](https://github.com/stan-smith/FossFLOW/commit/e18e51fb7fc4d5f5959c2f2e5cb31d20ee2c1b6a))
* add LLM-friendly export features and format code with Prettier ([77b304c](https://github.com/stan-smith/FossFLOW/commit/77b304c98a53cdf753172c48507ef29f4503a00f))
* Add option to toggle connector arrows ([dea6a1e](https://github.com/stan-smith/FossFLOW/commit/dea6a1e934857480dcf4dbb35801a176d182d4f9)), closes [#74](https://github.com/stan-smith/FossFLOW/issues/74)
* Add server-side storage for persistent diagram management ([bf3a30f](https://github.com/stan-smith/FossFLOW/commit/bf3a30fa129932dd0c3d01ca97ed30e579c8e418)), closes [#48](https://github.com/stan-smith/FossFLOW/issues/48)
* added error boundary ([#90](https://github.com/stan-smith/FossFLOW/issues/90)) ([179b512](https://github.com/stan-smith/FossFLOW/commit/179b512c7d1e17f9aab18db05e12017399890497))
* adds ability to remove a node ([2e2a98f](https://github.com/stan-smith/FossFLOW/commit/2e2a98f5e99633c51d9df19b8f16ecc394c9ab1a))
* adds basic editor example ([dc04314](https://github.com/stan-smith/FossFLOW/commit/dc04314f46892b1c11bb9c841e7ac31ed97b88e7))
* adds codesandbox config ([b23c3a9](https://github.com/stan-smith/FossFLOW/commit/b23c3a9593705f03ba26cfe9d7ea87baea3ae2a9))
* adds deleteView reducer ([80f257b](https://github.com/stan-smith/FossFLOW/commit/80f257b016987b9e873af76613b42d5785481d16))
* adds discord option to main menu ([86900a9](https://github.com/stan-smith/FossFLOW/commit/86900a97801dd6a1885f6f99c32febc653b5efce))
* adds documentation ([a279729](https://github.com/stan-smith/FossFLOW/commit/a279729dc6bc319daf1ae84d571d9742302c08ec))
* adds example for readonly mode ([db1fc8f](https://github.com/stan-smith/FossFLOW/commit/db1fc8fb36d59cf63b0fdfed47edffd944d13bee))
* adds icons ([b7ac563](https://github.com/stan-smith/FossFLOW/commit/b7ac56337d0b429275be60d31d25f6a13b3d9775))
* adds image export options to toggle grid and change bg color ([ee7a92d](https://github.com/stan-smith/FossFLOW/commit/ee7a92d1f39d141fc710e92071cc8a13c83e53da))
* adds link to Github repo in main menu ([109048c](https://github.com/stan-smith/FossFLOW/commit/109048c8d2c5398285977c6afb94d465bdd0888c))
* adds linting dependency ([bfb0295](https://github.com/stan-smith/FossFLOW/commit/bfb029584d3caa0d76acafae6d369e5d02e3f55f))
* adds standalone build and a Dockerfile ([e8d678d](https://github.com/stan-smith/FossFLOW/commit/e8d678d191c60a9dfb96e05f099d509eee7ea4a9))
* adds title to scene config ([ee3306b](https://github.com/stan-smith/FossFLOW/commit/ee3306b6914e9f7b39915cb96b76530569fa2db2))
* adds to standaloneExports ([d5084e2](https://github.com/stan-smith/FossFLOW/commit/d5084e28ea2a5abf02d019d21621a7ec6824bf91))
* adds utility methods on the window for debugging ([38c4278](https://github.com/stan-smith/FossFLOW/commit/38c4278e16c639e547aac626314f9adba8d96dc3))
* adds validation check for connectors with less than 2 anchors ([880ed5b](https://github.com/stan-smith/FossFLOW/commit/880ed5bea740bf39bdecaaaa560c59e2a8937a6b))
* adds zoom on scroll ([53641a4](https://github.com/stan-smith/FossFLOW/commit/53641a4a86bcec582ff4c26f899799b9f721ecc8))
* allows all interactions to be disabled ([0e5ca5a](https://github.com/stan-smith/FossFLOW/commit/0e5ca5a442eab1f83e0a754b0c1bd1d3c25479f3))
* allows an optional `viewId` to be passed as part of initialData ([30cd3f2](https://github.com/stan-smith/FossFLOW/commit/30cd3f28f2f0315ae9c85ebfde18709c2bd36be2))
* allows better drag and drop interaction for connector anchors ([7661bcb](https://github.com/stan-smith/FossFLOW/commit/7661bcb0693e6a9d3212f402b0ec297f54cb6bed))
* allows codesandbox to open a browser preview ([fbf48d2](https://github.com/stan-smith/FossFLOW/commit/fbf48d26cadf502dcf0bbcb3bf696a8063103129))
* allows color selection for nodes ([39afd84](https://github.com/stan-smith/FossFLOW/commit/39afd84553c5da8a1d36c0560e9b792e74277d8f))
* allows custom node labels (with example) ([55f9b37](https://github.com/stan-smith/FossFLOW/commit/55f9b37c5623127c57a47c716679cb8ed31169c2))
* allows expandable node labels ([90f6c0e](https://github.com/stan-smith/FossFLOW/commit/90f6c0ed860eaff307e2c6fafefb9663ec39c864))
* allows icons to be drag and dropped onto canvas ([07dc1d1](https://github.com/stan-smith/FossFLOW/commit/07dc1d163ccf39437ea02a18f2d33d7c2542fde8))
* allows layer order of rectangles to be changed ([56591cb](https://github.com/stan-smith/FossFLOW/commit/56591cb10296f05727af31ead306570031d6c787))
* allows loading of local scene file ([8b362ea](https://github.com/stan-smith/FossFLOW/commit/8b362ea022dfe85f10b34c7eb55b42052f447795))
* allows main menu to be customised ([46ce637](https://github.com/stan-smith/FossFLOW/commit/46ce637cd0be6ce9563c22328f5ba34a3f99fc1a))
* allows main menu to be hidden ([3b02ae1](https://github.com/stan-smith/FossFLOW/commit/3b02ae1f226f304d2f89ed1cc66d71d01ddd10eb))
* allows node icon to be changed ([fd88787](https://github.com/stan-smith/FossFLOW/commit/fd88787eb1fa6a0e52853bb84ddc29adf1480e19))
* allows node labels to be expanded ([a1783f1](https://github.com/stan-smith/FossFLOW/commit/a1783f180b4533a827f78d6b3ff2bff89704fb4f))
* allows project to be centered ([c638bf0](https://github.com/stan-smith/FossFLOW/commit/c638bf015cad7d35a7fbd2b24e08cf5ad796c8a7))
* allows saving of scene ([a1a98f2](https://github.com/stan-smith/FossFLOW/commit/a1a98f288be5383f5acb6f954b47c07bd04d9f44))
* allows textBoxes to be dragged from any point ([2f6cfa1](https://github.com/stan-smith/FossFLOW/commit/2f6cfa127462e5a70723fb79b499433e23ede8bc))
* allows translation of rectangles ([19478ab](https://github.com/stan-smith/FossFLOW/commit/19478abb78570232d42b3ec877c02a6d971bac68))
* allows width and height to be passed through as props ([f1f9c0f](https://github.com/stan-smith/FossFLOW/commit/f1f9c0f92b91ec1338e77bc2fa0488dbcde2e100))
* applies animation on zoom and scroll ([efde778](https://github.com/stan-smith/FossFLOW/commit/efde7780a025f90c8df08659673f6f8d626b1b16))
* attempts to boost performance by explicitly activating GPU rendering ([0dc27b7](https://github.com/stan-smith/FossFLOW/commit/0dc27b7be464c0bd1d64896ef86b7c4436da3b5f))
* blocks pointer-events on title ([b5a57d0](https://github.com/stan-smith/FossFLOW/commit/b5a57d067f6933b328f33e115cf573ebf2e245f8))
* bumps patch version ([94c3097](https://github.com/stan-smith/FossFLOW/commit/94c3097f39bbadef382b3bbb82c0476a871b5280))
* bumps up isopacks version ([2a9d10b](https://github.com/stan-smith/FossFLOW/commit/2a9d10bf9bebe555828275368f9fc2ad01c392d0))
* changes starting mode to PAN ([5f015c4](https://github.com/stan-smith/FossFLOW/commit/5f015c45399a3e771ad9632464e2aac5102b61a1))
* **ci:** implemented automatic versioning plus releases ([9d9fe84](https://github.com/stan-smith/FossFLOW/commit/9d9fe84eefa6a3a6b2ec158910956debb059bbc2))
* closes any open itemControls when panning mode selected ([aba2633](https://github.com/stan-smith/FossFLOW/commit/aba2633abb61fa40f2bbc18ef4a821fd0579efa7))
* closes any open itm controls if main menu is opened ([a21d01b](https://github.com/stan-smith/FossFLOW/commit/a21d01bfe35da5f4097c65af36853678e83af347))
* closes main menu BEFORE native file dialog appears ([1382c41](https://github.com/stan-smith/FossFLOW/commit/1382c4165dd61980083ad64822a19e693fd8da74))
* configures webpack build for docker image ([1a64706](https://github.com/stan-smith/FossFLOW/commit/1a647062d15addb0fe2abb2f6ec623d16db0a41c))
* debug mode size indicator now wraps around all items ([536b51d](https://github.com/stan-smith/FossFLOW/commit/536b51dc29f6eb727919b54d92f7739f361aaa54))
* disables lasso mode for now ([d017b3e](https://github.com/stan-smith/FossFLOW/commit/d017b3eaa8f3efdf61ac37c095cc3f75c6330ef7))
* disables scroll / zoom animations on drag and drop layer ([1d9324e](https://github.com/stan-smith/FossFLOW/commit/1d9324eb84cf7c28bf9268529324651d75490cc9))
* displays connector anchors only when connector is selected / active ([366b816](https://github.com/stan-smith/FossFLOW/commit/366b816521ac15aa827207441feca21f1b93195b))
* displays main manu in top left corner ([6bbef04](https://github.com/stan-smith/FossFLOW/commit/6bbef041df4658df2f1dad85192069e316aa5e01))
* displays title at bottom of view ([35b73de](https://github.com/stan-smith/FossFLOW/commit/35b73defe74b57175f0ab047b454b8b8530cc23d))
* enable panning by dragging on empty space with left mouse button ([ddb28a2](https://github.com/stan-smith/FossFLOW/commit/ddb28a2eda31b3777d73593ad46f59c91d7c23ed))
* enables dragging of connector anchors ([f808159](https://github.com/stan-smith/FossFLOW/commit/f80815976dc31db1207f466f222dcc0c75da5b75))
* enables expandable labels on nodes ([36c5c17](https://github.com/stan-smith/FossFLOW/commit/36c5c179d59c21f94076647f4b8ce8a00d9e0398))
* enhance connector functionality with multiple labels and line types ([#128](https://github.com/stan-smith/FossFLOW/issues/128)) ([d5e02ea](https://github.com/stan-smith/FossFLOW/commit/d5e02ea30346fbc2528dc0337792ebccf309d94d)), closes [#107](https://github.com/stan-smith/FossFLOW/issues/107) [#113](https://github.com/stan-smith/FossFLOW/issues/113)
* enhance context menu functionality with item and empty states ([674b46f](https://github.com/stan-smith/FossFLOW/commit/674b46f6047ba837bee950d2eeceecbeaae06b00))
* ensures connectors have start and end nodes ([0bace0b](https://github.com/stan-smith/FossFLOW/commit/0bace0bc5f0e331e2302dbc1c4eb3b66e4e2c6db))
* executes entry / exit logic for interactions ([3112842](https://github.com/stan-smith/FossFLOW/commit/311284217491fb099325514f991d283bea816cdb))
* exports isoflow props as type ([75ed461](https://github.com/stan-smith/FossFLOW/commit/75ed46180f714e2b110e9f52acc3464f2126e995))
* exports Scene typings ([28122ed](https://github.com/stan-smith/FossFLOW/commit/28122ed6b7ab8f765f1371ed140f6b2aba122d83))
* exports types ([28f4db9](https://github.com/stan-smith/FossFLOW/commit/28f4db99b97ca790c6bb0c45b8219a2018aeffd5))
* exposes api to update single node and hook into scene changes ([37fd9ea](https://github.com/stan-smith/FossFLOW/commit/37fd9ea16c02e8604ab8eaa4461062d4c7b46280))
* filters textbox data on scene export ([ca087b4](https://github.com/stan-smith/FossFLOW/commit/ca087b4322e6404d0b76ff85a3e4dfeb8fa930db))
* fixes cursor position when editor not 100% of viewport ([287de5b](https://github.com/stan-smith/FossFLOW/commit/287de5bd0ea2e2f4a03dc831642045e324060e00))
* fixes UX around drag and drop onto canvas ([37bc36c](https://github.com/stan-smith/FossFLOW/commit/37bc36c563735e31befa28b63bf6da9aee33dc9a))
* fixes zIndexing of scene items ([516ab8b](https://github.com/stan-smith/FossFLOW/commit/516ab8b63347c9df1a7de56259ae1951740b3bdc))
* grid listens to window resize events ([0b97897](https://github.com/stan-smith/FossFLOW/commit/0b9789746a2f31d933b6011706b7b8cbcb4a855d))
* hides label height control when no label present ([82977bf](https://github.com/stan-smith/FossFLOW/commit/82977bfa26d4e9d747c4ff9e740c8f744fb62fd8))
* hides scene title if editor is in 'NON_INTERACTIVE' mode ([91fa85a](https://github.com/stan-smith/FossFLOW/commit/91fa85a1c5cfd7ef2fd68917c8ce1f6eb8cd5b79))
* implement comprehensive undo/redo system with keyboard shortcuts and UI integration ([b9356d3](https://github.com/stan-smith/FossFLOW/commit/b9356d3c76ce72cf1f88778b6814f1e543b23433))
* Implement quick icon selection workflow for improved UX ([8576e30](https://github.com/stan-smith/FossFLOW/commit/8576e300ece9d79a7817c814e5a1f1baa46f7457)), closes [#56](https://github.com/stan-smith/FossFLOW/issues/56)
* implements 'clear canvas' menu item ([e65a782](https://github.com/stan-smith/FossFLOW/commit/e65a782feb640dba00d61a3a2a46a5dec6c3393f))
* implements adding node to scene ([99c8060](https://github.com/stan-smith/FossFLOW/commit/99c80602437fea802f6975d3132d93e7ec8c35b6))
* implements basic support for touch devices ([a841504](https://github.com/stan-smith/FossFLOW/commit/a8415041542709ea089817790cc4db920349ccb4))
* implements callback example ([57f6a00](https://github.com/stan-smith/FossFLOW/commit/57f6a0059b84cc5ec8ce8945972f6a17132becc8))
* implements connector colors ([eef4dba](https://github.com/stan-smith/FossFLOW/commit/eef4dba7901b2603ebb8342ed66d8c19967eebf1))
* implements connector controls ([198a1f4](https://github.com/stan-smith/FossFLOW/commit/198a1f4e2dc5a6a0a0fe21a53d719de5fde6eaff))
* implements connector direction icon ([eeaaad9](https://github.com/stan-smith/FossFLOW/commit/eeaaad93c5ff8f63305726aa7f5d2363208eea25))
* implements connector labels ([4ad8b22](https://github.com/stan-smith/FossFLOW/commit/4ad8b22482b0dcb9e1821fe59ac495ff1bc8dc9d))
* implements connector logic ([19324be](https://github.com/stan-smith/FossFLOW/commit/19324bed91d55136f21e962002d6774589f6e6f2))
* implements connector styles ([46de2cf](https://github.com/stan-smith/FossFLOW/commit/46de2cf19afdf23bcefa5dbb7cfcb70f4cedf784))
* implements connector width controls ([58dd3b5](https://github.com/stan-smith/FossFLOW/commit/58dd3b59da92c2010f501e19df56d462a632aba1))
* implements connectors ([43aab47](https://github.com/stan-smith/FossFLOW/commit/43aab4758ef37f6b50b0e64016f19e52e17fa5bc))
* implements group rendering (UI not implemented yet) ([d9daa68](https://github.com/stan-smith/FossFLOW/commit/d9daa68b0dcd6c6433096dc5ca33041fd1a347aa))
* implements icons searchbox ([887a916](https://github.com/stan-smith/FossFLOW/commit/887a91607c2a2a84dbfe11ea4e536768d290890a))
* implements image export ([9f11cce](https://github.com/stan-smith/FossFLOW/commit/9f11cce6e0ba2f0beefad06140768ae9c9ef6763))
* implements lasso selection (UI disabled) ([a76e5e7](https://github.com/stan-smith/FossFLOW/commit/a76e5e72899010a83f73d43d0e465dc18cd9d4f4))
* implements lastUpdated field on views ([3cff06d](https://github.com/stan-smith/FossFLOW/commit/3cff06dc5e93464b22e74de3364166ff0e255f11))
* implements multiselect ([f68daac](https://github.com/stan-smith/FossFLOW/commit/f68daacc2973aa5757075a69326aa71f191bf6a5))
* implements node delete ([b13cd66](https://github.com/stan-smith/FossFLOW/commit/b13cd66706b997b2ea290ea3a6a46fc046a6e493))
* implements node drag and drop ([b350320](https://github.com/stan-smith/FossFLOW/commit/b35032038706641989f03611a74c7137fefe2e7c))
* implements node labels ([f93f901](https://github.com/stan-smith/FossFLOW/commit/f93f901521ebf391984181456fcf09513aecd56d))
* implements node positioning via drag and drop ([a6fdbf0](https://github.com/stan-smith/FossFLOW/commit/a6fdbf0c007750721184218b3bce34a50fddb9f8))
* implements onSceneUpdated callback ([f1f77d4](https://github.com/stan-smith/FossFLOW/commit/f1f77d4ecab525a1f5e7f08efdf51dd905d1b824))
* implements readmore on node description overflow ([f9536c9](https://github.com/stan-smith/FossFLOW/commit/f9536c9cb706ff66cab91b0b3814ea2cc75e9af2))
* implements rectangle controls ([94995f0](https://github.com/stan-smith/FossFLOW/commit/94995f099c3a3105b1a88f1629b589532e2aa858))
* implements rectangle delete ([416b976](https://github.com/stan-smith/FossFLOW/commit/416b9765b797fa599ee0afabd6700c8497d6bbc7))
* implements rectangle tool basics ([bd7a118](https://github.com/stan-smith/FossFLOW/commit/bd7a11849cba439f825b31d23484fd0b3aeb81c8))
* implements text tool ([c240def](https://github.com/stan-smith/FossFLOW/commit/c240def317422521280b5264e2b2797472074f02))
* implements transform controls for rectangles ([cb36408](https://github.com/stan-smith/FossFLOW/commit/cb3640817358f5543fc6fc24bb36fd44f3dcd50f))
* imports isopacks as separate package ([0580440](https://github.com/stan-smith/FossFLOW/commit/0580440b28c42d6e70c792c9090f7a877c37413e))
* improves label handeling ([1d3e7d5](https://github.com/stan-smith/FossFLOW/commit/1d3e7d51836f2d33f9876c40b202634154eab307))
* improves mouse tracking ([77e8c02](https://github.com/stan-smith/FossFLOW/commit/77e8c02c736f4d299121691f173dcecf2895c963))
* improves panning mode UX ([2230637](https://github.com/stan-smith/FossFLOW/commit/2230637a529dd1717fcac0f9dfe9622252959cb2))
* improves panning mode UX ([4b0d3d8](https://github.com/stan-smith/FossFLOW/commit/4b0d3d86e9d2cc4b6ecba65072c2b9b461918ed3))
* improves scrolling on sidebars ([6c76790](https://github.com/stan-smith/FossFLOW/commit/6c76790800edb7493ab68d71ad35d0bbf886cb6d))
* improves textbox sizing ([20ac174](https://github.com/stan-smith/FossFLOW/commit/20ac1747044c956946f7d3aec60cd12da6a37491))
* improves UX on Tool menu ([ac4e9e8](https://github.com/stan-smith/FossFLOW/commit/ac4e9e8563092e0285c557a7d3ca03bbca634c06))
* improves UX when dragging rectangle anchor ([5feca66](https://github.com/stan-smith/FossFLOW/commit/5feca66326abda286bfe8b97cc6c48226bea31bf))
* improves UX when selecting elements ([541e469](https://github.com/stan-smith/FossFLOW/commit/541e46969740ea9f8d31002c3c80af2f466c5f4e))
* improves word wrap handling in labels ([ba30ffd](https://github.com/stan-smith/FossFLOW/commit/ba30ffd0320bde7364b3b5e93d4bafd4aff5674d))
* increases resolution of export images ([68c11e5](https://github.com/stan-smith/FossFLOW/commit/68c11e5a1d8267f232e1bab917a8ae12c7b58b2a))
* installs zustand devtools ([ad78b52](https://github.com/stan-smith/FossFLOW/commit/ad78b524b5687cae2f789873707832d33411fb65))
* introduces new TextBox tool ([23d3bda](https://github.com/stan-smith/FossFLOW/commit/23d3bdaae009e402199e163f7287adae4a4289cf))
* isoflow takes 100% height as default ([85e36bd](https://github.com/stan-smith/FossFLOW/commit/85e36bd876fdda4a10ab44e288d62a6ee1586ea2))
* keeps icons when canvas is cleared ([ccbedd7](https://github.com/stan-smith/FossFLOW/commit/ccbedd7c98b4c15f7cb30bcff4ef3e74fcdb9002))
* limits connector width ([14a72c7](https://github.com/stan-smith/FossFLOW/commit/14a72c7b2ef1f8356b47c7772bafb58936461f6e))
* makes App component default export ([8d731af](https://github.com/stan-smith/FossFLOW/commit/8d731afc44c324a7fc76c51dbd6b6a65f4c1ecc9))
* moves non-interactive check further up the tree ([7a1ab19](https://github.com/stan-smith/FossFLOW/commit/7a1ab1973aec11b65a93c65936b3a5420b303818))
* moves zoom controls to lower left ([c2f456a](https://github.com/stan-smith/FossFLOW/commit/c2f456a496710a7a288a04c32e3386218741bcf8))
* performance upgrade (solves issue with nodes not being GC'd) ([bf42411](https://github.com/stan-smith/FossFLOW/commit/bf42411d5ef055f253b9c8f4f80b321137b2a9f5))
* prevents onSceneUpdated called the first time scene is loaded ([d1bc30e](https://github.com/stan-smith/FossFLOW/commit/d1bc30e8d8476f03708d71c8703e655de487193d))
* prevents user highlighting while dragging ([7a5b996](https://github.com/stan-smith/FossFLOW/commit/7a5b99668b2b4cfcc95aa0092920344d41305f85))
* reduces height of node labels ([d551897](https://github.com/stan-smith/FossFLOW/commit/d551897bdabd1b5727810e645cc6543ba441b702))
* reduces size of icons slightly ([32f4b12](https://github.com/stan-smith/FossFLOW/commit/32f4b129b99e9433ebd073c9f3ba793a67ddcf57))
* refactors schema to accomodate model ([ad5a4e0](https://github.com/stan-smith/FossFLOW/commit/ad5a4e06f38f3da7bb5c8cb50da7ccd50991a722))
* reinstates interactions ([97d65fa](https://github.com/stan-smith/FossFLOW/commit/97d65fabf40f0ea7d9311083468f90c8af3d22e5))
* removes buggy scrollTo node when label expanded ([b0c5c9d](https://github.com/stan-smith/FossFLOW/commit/b0c5c9d4c3d832a8dc9d1dd3ba052c52f3321653))
* removes color from node schema ([ccea412](https://github.com/stan-smith/FossFLOW/commit/ccea412b8d07f67efc28b5f4db2aecc7e86233b3))
* removes custom label container for now ([194b4ed](https://github.com/stan-smith/FossFLOW/commit/194b4eda2d64ca9653e407d3d5c8b1f14fceb653))
* removes zustand dev tools ([4a4f168](https://github.com/stan-smith/FossFLOW/commit/4a4f168671d7aef944e3c91dfdd3661305dbef96))
* renders a basic node to scene ([5dbeb97](https://github.com/stan-smith/FossFLOW/commit/5dbeb973b05c2e3874cd7d137ed29aa877dd6f73))
* replace import toolbar with tooltip guidance ([a2a47b4](https://github.com/stan-smith/FossFLOW/commit/a2a47b44496f4982c43fe7f9dd9915f281160169)), closes [#123](https://github.com/stan-smith/FossFLOW/issues/123)
* replaces xstate with custom state machine implementation ([6b90ad9](https://github.com/stan-smith/FossFLOW/commit/6b90ad9b7b8aedd19a8ed0175eb537fde3656657))
* resets the UI after a canvas clear ([413567e](https://github.com/stan-smith/FossFLOW/commit/413567efd39d2b30c97f22f283a39868641d9760))
* resets view after file has been successfully loaded ([9910fec](https://github.com/stan-smith/FossFLOW/commit/9910fecadabb767655ee1c3693e91c754fa728ac))
* resets window cursor when Isoflow is unmounted ([5d51aab](https://github.com/stan-smith/FossFLOW/commit/5d51aab7224e7b79f7b1cd6c85768809a28f6bbe))
* sets min width on node labels ([620970e](https://github.com/stan-smith/FossFLOW/commit/620970e99d29783dddf90e1c9e6a02d210d8fb65))
* sets overflow hidden ([9614b5e](https://github.com/stan-smith/FossFLOW/commit/9614b5ef5dfb30418e138d60bc01aa0a590c5f18))
* shows animated outline around focussed nodes ([53bd3f2](https://github.com/stan-smith/FossFLOW/commit/53bd3f2c2f8d1bf29f58f5ace0a6e7b378f0449c))
* shows both model title and view title at bottom of screen ([159f6d4](https://github.com/stan-smith/FossFLOW/commit/159f6d4c75c9c5225b1fa0ae51cf4b89706c0947))
* stores colors as part of model ([4797b22](https://github.com/stan-smith/FossFLOW/commit/4797b223047ae7eccbb7be8db1b1028e99e2d501))
* styling updates ([9270924](https://github.com/stan-smith/FossFLOW/commit/927092475634cd38877367fa30f268e3d411fcb0))
* styling updates on all ui elements ([4de4882](https://github.com/stan-smith/FossFLOW/commit/4de4882b03685e27c84e50714b446a67d45fb2e6))
* updates 'read more' button styling ([cfb60f3](https://github.com/stan-smith/FossFLOW/commit/cfb60f37cf088ffd108bfb77f742c8810f280ec0))
* updates anchor connector schema ([5d6f3d0](https://github.com/stan-smith/FossFLOW/commit/5d6f3d0aaf02e0a379102380d081748cefb7aa10))
* updates connector styling ([d980947](https://github.com/stan-smith/FossFLOW/commit/d980947e86d27a73ea4da67a9bb1203df8f3debb))
* updates connector styling ([e21ed39](https://github.com/stan-smith/FossFLOW/commit/e21ed39c782f0cc2ef66a8ae16d97daa5e398605))
* updates connector width defaults ([af5c060](https://github.com/stan-smith/FossFLOW/commit/af5c06090036ea880d810f2cb6555e3e70288a7f))
* updates connector width to more sensible values ([851ae21](https://github.com/stan-smith/FossFLOW/commit/851ae21283d547a14c04cca4538b6759bf92c0da))
* updates copy ([ffef690](https://github.com/stan-smith/FossFLOW/commit/ffef6902eef7588bd5247bd4e6ea02f0ed7de174))
* updates copy on tooltip ([d127150](https://github.com/stan-smith/FossFLOW/commit/d127150dd0cf8c76f98b7aab127c59931b9f5995))
* updates cursor styling ([73d9b52](https://github.com/stan-smith/FossFLOW/commit/73d9b522eca44c6400c698204d663c9a05abacb1))
* updates docs ([485dc4c](https://github.com/stan-smith/FossFLOW/commit/485dc4c021894372a23a80f45f108545bf9a718c))
* updates documentation ([1de5c9d](https://github.com/stan-smith/FossFLOW/commit/1de5c9d8b50c32c20d2ec24a337b47b6795b536c))
* updates documentation ([52e1fc2](https://github.com/stan-smith/FossFLOW/commit/52e1fc2802a4d8638a21cbda9cdd9e9b5406cb14))
* updates drag and drop instruction copy ([6cdff05](https://github.com/stan-smith/FossFLOW/commit/6cdff059fe0f3af1b6da5b6cc93cba4d012041b9))
* updates example ([d707b14](https://github.com/stan-smith/FossFLOW/commit/d707b14743648440343dd4302ac8566ef5b8a4ce))
* updates example content ([cbdcc76](https://github.com/stan-smith/FossFLOW/commit/cbdcc767d40735498e8e1c5b9f838b11695a051d))
* updates example data ([1c28a47](https://github.com/stan-smith/FossFLOW/commit/1c28a478803f7eba46c63cc8e9e9f03583ea9627))
* updates example data ([945ec81](https://github.com/stan-smith/FossFLOW/commit/945ec811546423dc49a5d0066dec06779a16c7f8))
* updates example data ([edf6f28](https://github.com/stan-smith/FossFLOW/commit/edf6f28b9e61970aa7db3150a3f35601792df9d1))
* updates example scene ([1c6af28](https://github.com/stan-smith/FossFLOW/commit/1c6af28ca8d84ac6bc080bb6102a944acab4e5fb))
* updates example scene ([f9cc014](https://github.com/stan-smith/FossFLOW/commit/f9cc014dc7e3d529e520f26f381c1040dc585dc8))
* updates examples and documentation ([4da997f](https://github.com/stan-smith/FossFLOW/commit/4da997f3f38091be51927f3d8d7a26979d47f744))
* updates examples to start with fitToView=true ([a129c17](https://github.com/stan-smith/FossFLOW/commit/a129c1715ada015500fd253e54d1d08a3481da6e))
* updates icon category styling ([1f67c29](https://github.com/stan-smith/FossFLOW/commit/1f67c297fbff6497e3246d0273b3e6b8c1c4fd00))
* updates icons on zoom controls ([3de56fd](https://github.com/stan-smith/FossFLOW/commit/3de56fdde8020fed98d1b790b33f1f6a5072781a))
* updates image urls in docs ([1e60907](https://github.com/stan-smith/FossFLOW/commit/1e60907b4724585aa3199aa2868bce57a0b02602))
* updates main menu options ([031a90a](https://github.com/stan-smith/FossFLOW/commit/031a90a78ac5b6057ce547a0041e96e88ad6e3a5))
* updates meta tag on example html page ([35850c4](https://github.com/stan-smith/FossFLOW/commit/35850c44b1a1c9a7679af8adecb569b390787cd7))
* updates node connector styling ([78b243c](https://github.com/stan-smith/FossFLOW/commit/78b243ca22ac221725e0e9a31d545ccc7905f930))
* updates palette ([a061f57](https://github.com/stan-smith/FossFLOW/commit/a061f573040c29d7467588a54f03cc7938507b39))
* updates readme ([f5be45b](https://github.com/stan-smith/FossFLOW/commit/f5be45bbefc12e99ae54aed3f0f6d4c84f0b21b2))
* updates rectangle styling ([e60e16e](https://github.com/stan-smith/FossFLOW/commit/e60e16e469a422d06fc12ac49fcbec688fddf5c3))
* updates roadmap on README ([8992d84](https://github.com/stan-smith/FossFLOW/commit/8992d84cc653f354b2fb7b0fa2e9c9702059d628))
* updates sidebar styling ([c83452b](https://github.com/stan-smith/FossFLOW/commit/c83452b3cb1b9143377392da2f56f228e0fc004e))
* updates styling ([a69cbf8](https://github.com/stan-smith/FossFLOW/commit/a69cbf804ccc9361559863bf1658b516ab2b0de4))
* updates styling ([fee7c2a](https://github.com/stan-smith/FossFLOW/commit/fee7c2a244621c4c9db93bffcedf420f6ea5ebbb))
* updates styling ([52ec509](https://github.com/stan-smith/FossFLOW/commit/52ec50913e8be175097ed2c40d4bdd91906518fa))
* updates styling on node labels ([d0f3cdf](https://github.com/stan-smith/FossFLOW/commit/d0f3cdf791fc1e746921a2e49a2a38002d291532))
* updates theme colours ([1faeb31](https://github.com/stan-smith/FossFLOW/commit/1faeb31d3e8e1efd756127d48fd824eb6b49ec1e))
* updates view default name ([4d4a668](https://github.com/stan-smith/FossFLOW/commit/4d4a668950720c0ba81a357d19101508f3eb2b83))
* upgrades performance on debug tools ([2f9bc47](https://github.com/stan-smith/FossFLOW/commit/2f9bc47eb59ddf791abd6da9a1589a78e768d98e))

### Bug Fixes

* add missing i18n files to public folder for GitHub Pages ([606aebc](https://github.com/stan-smith/FossFLOW/commit/606aebcf49ad3f269d19e155f4b68eef813724a8))
* adds keys to controls panel components ([c1c5bd3](https://github.com/stan-smith/FossFLOW/commit/c1c5bd33fe13019b4a15f9bea75eaa1693846d1a))
* adds keys to mapped components ([6113819](https://github.com/stan-smith/FossFLOW/commit/611381934fbe3bf2f39dd816099bb99a58bfde0d))
* adds tsc to linting script ([0e29ce3](https://github.com/stan-smith/FossFLOW/commit/0e29ce31ef8a25576c5a0674328891a49cf6b7a1))
* bug on dragging items ([5c9e3e0](https://github.com/stan-smith/FossFLOW/commit/5c9e3e0910ae0ffa444b3a2cb69a6f03332d049e))
* bug with disappearing item controls ([c3b72e3](https://github.com/stan-smith/FossFLOW/commit/c3b72e3cfd08d5e4f97a2960fd07bcea912a749f))
* bug with dragging items ([1d0351c](https://github.com/stan-smith/FossFLOW/commit/1d0351cc2d66b8dc288043ed96b0b4afde797cad))
* bug with moving rectangles ([e1515a7](https://github.com/stan-smith/FossFLOW/commit/e1515a7409917516a0b2f89397c9a89060f43dd9))
* bumps @types/react down to v17 for compatibility ([9814af2](https://github.com/stan-smith/FossFLOW/commit/9814af275666c35862fef97533e3e7a75f8baaad))
* calls function correctly ([f06acb6](https://github.com/stan-smith/FossFLOW/commit/f06acb63753ad116d6b92d34574adf1603639fc5))
* console errors ([213a5d6](https://github.com/stan-smith/FossFLOW/commit/213a5d62e9b082d6910b7e6e5a9e051caa2d4e50))
* controls container now scrolls ([f20580a](https://github.com/stan-smith/FossFLOW/commit/f20580a6f11f1af7ec9b3d7cc537eb6661466e11))
* Correct Dockerfile FROM AS casing ([a383d57](https://github.com/stan-smith/FossFLOW/commit/a383d577ce2a60bdec81fc59eace08241d29dbaf))
* correct rectangle reducer and update CI workflow with build step ([2bd1318](https://github.com/stan-smith/FossFLOW/commit/2bd131844135cb8c5a957c8cd96f2f17455a911a))
* correct typo in integration section of quickstart docs ([1256d30](https://github.com/stan-smith/FossFLOW/commit/1256d30b684cdea74502fd2c05ac432fe210cc69))
* corrects CodeSandbox setup script ([8548b00](https://github.com/stan-smith/FossFLOW/commit/8548b000715632b03f2a0ba279a15ad65f6d0a3e))
* corrects connector width issue on zoom ([555244c](https://github.com/stan-smith/FossFLOW/commit/555244c206d6c3e4682212b267dd6012522b98c0))
* corrects icon filename casing ([9161bbc](https://github.com/stan-smith/FossFLOW/commit/9161bbc9f09c85e40c7569a54f71fd1e4afeb36b))
* corrects icon reference ([7d5e116](https://github.com/stan-smith/FossFLOW/commit/7d5e11638e8873fd5dcac7a6e61f706566761dce))
* corrects textbox selection not displaying correctly ([fe7a2ed](https://github.com/stan-smith/FossFLOW/commit/fe7a2ed21130294b43f35d10dac13a7843ccad4c))
* corrects typo in error message ([4bb73e2](https://github.com/stan-smith/FossFLOW/commit/4bb73e2a3c7638a374880dc75dd3a964bb099432))
* corrects value of `disableInteractions` ([b34a2b2](https://github.com/stan-smith/FossFLOW/commit/b34a2b27d3eaedfff3b8cc6ffefafc0a37c88442))
* corrects zoom tooltips ([07011f2](https://github.com/stan-smith/FossFLOW/commit/07011f2b88c1bcb1130f6f98200ac0f6a727a35e))
* delete connectors by ID instead of index in scene ([67f0dde](https://github.com/stan-smith/FossFLOW/commit/67f0dde9321eafa8c1ede3790d853a9fff2c9727))
* delete textBox and rectangle from scene when removed ([32bcce5](https://github.com/stan-smith/FossFLOW/commit/32bcce57b7ed5c99dd855bba15ec6218fc87cb40))
* disables animations on scene layer on first render ([8d98b84](https://github.com/stan-smith/FossFLOW/commit/8d98b84213d6827ec7dacbf59a7e8422ef157f4f))
* displays icons in sidebar ([6878712](https://github.com/stan-smith/FossFLOW/commit/6878712b0bb2cde2ac535ab363a6794be45f555f))
* enables textboxes to be selected more easily ([6c3a4ce](https://github.com/stan-smith/FossFLOW/commit/6c3a4ce6c9dffe6c4f74272d2a4ab3f7615f9d6b))
* excludes `docs` folder from tsconfig ([0d21cf1](https://github.com/stan-smith/FossFLOW/commit/0d21cf16d325298f7e340cfedf910c976346cd57))
* excludes node_modules from type checking ([68fe053](https://github.com/stan-smith/FossFLOW/commit/68fe05385cd203f29a28ac6ec9063ed6a3f9f51f))
* explicitly includes tag when publishing to npm ([0b4b7aa](https://github.com/stan-smith/FossFLOW/commit/0b4b7aadfc6998e4dfbb19b474e8036b0c1fc346))
* failing test ([d4e03b0](https://github.com/stan-smith/FossFLOW/commit/d4e03b0455c51ed8565b6ff34cb6ef1a19811398))
* failing tests ([21b5579](https://github.com/stan-smith/FossFLOW/commit/21b557961f71c0754fa8cae375d0d5cfa778e5dd))
* first tile not registering when dragging item ([975ce6a](https://github.com/stan-smith/FossFLOW/commit/975ce6ae926edfe29f0d25a8f8a3da35008208db))
* fixes bug caused by missing param in function call ([421bd07](https://github.com/stan-smith/FossFLOW/commit/421bd07c932ce24ca9c736c6635fcb9b7dd2486f))
* fixes bug with 'unable to find cloneNode' on image export ([971ae23](https://github.com/stan-smith/FossFLOW/commit/971ae232c373d2bd6ea1ac94ca29242b349fc69c))
* fixes bug with rectangle resizing ([0731757](https://github.com/stan-smith/FossFLOW/commit/07317570606488776cf305a9f428b9db538655de))
* fixes color resolving mechanic ([4a67974](https://github.com/stan-smith/FossFLOW/commit/4a67974b55258794b6b84104e71369148893ac6c))
* fixes debug tools dimensions ([6cdc9eb](https://github.com/stan-smith/FossFLOW/commit/6cdc9ebb3873724655cb80bdef5596c08ab71a11))
* fixes export bug only referencing first view in the model ([ef7c314](https://github.com/stan-smith/FossFLOW/commit/ef7c314819c1ed368ac7b989754844e6a4271e69))
* fixes failing test ([569e94f](https://github.com/stan-smith/FossFLOW/commit/569e94ff547ad68fc825e505b110ffe7ecf839e5))
* fixes image export reading non-current scene ([d54b485](https://github.com/stan-smith/FossFLOW/commit/d54b4855657535b4cfe540eabfe7abe524ca1a9a))
* fixes issue loading model ([33658b3](https://github.com/stan-smith/FossFLOW/commit/33658b38b182ca3664a94f1b948f971f035cf638))
* fixes issue when clearing the canvas ([0986c52](https://github.com/stan-smith/FossFLOW/commit/0986c52d6886739339ee6ae10aaf3d94c6521897))
* fixes issue where exported image isn't positioned correctly ([b525b8a](https://github.com/stan-smith/FossFLOW/commit/b525b8a8ab18b03d7470d79f062a562d45927acb))
* fixes issue with calculating fit-to-screen dimensions ([1ad851a](https://github.com/stan-smith/FossFLOW/commit/1ad851aaca825bbfbbcd52e0a5ca9d881ea00f5d))
* fixes issue with connector path not being generated correctly ([4257445](https://github.com/stan-smith/FossFLOW/commit/425744585e433dc4e5111c4d626d944e1a79d66c))
* fixes issue with context menu not displaying correctly when zoomed out ([721e78a](https://github.com/stan-smith/FossFLOW/commit/721e78ae43d37de569f40c52eb3a6f51b9c3d60b))
* fixes issue with fitToScreen only taking dimensions of first view ([126a77f](https://github.com/stan-smith/FossFLOW/commit/126a77fdde95de69a859e3e4e509b37a573c72da))
* fixes issue with grid misalignment ([db9f60f](https://github.com/stan-smith/FossFLOW/commit/db9f60f5693c686540007fd541fc73f47ea879f5))
* fixes issue with initial view not being automatically generated ([533a54c](https://github.com/stan-smith/FossFLOW/commit/533a54c3e80b6c589898052f80b83d996d0ac4c1))
* fixes issue with reloading scene on window resize ([8f24381](https://github.com/stan-smith/FossFLOW/commit/8f24381e1bb405d04c03a9df41991d7213d5e741))
* fixes issue with textbox selection ([9903755](https://github.com/stan-smith/FossFLOW/commit/9903755052109244fb8b8558ff7b34339341a7a5))
* fixes issue with view timestamp ([53a4b61](https://github.com/stan-smith/FossFLOW/commit/53a4b61c7939e38c82bc3543e5d4778d2f776a24))
* fixes linting scripts in package.json ([693845a](https://github.com/stan-smith/FossFLOW/commit/693845af024455a3f420ca203fe6a368233181fd))
* fixes nodes not displaying correctly when being dragged onto canvas ([3686515](https://github.com/stan-smith/FossFLOW/commit/36865152ca9ec0f40fd62b1551c13c006ec5e02f))
* fixes pan mode ([e384934](https://github.com/stan-smith/FossFLOW/commit/e384934d7c678e072205a7192675a46de450056f))
* fixes zIndex ordering among nodes ([6139401](https://github.com/stan-smith/FossFLOW/commit/613940171128889c8dc92e5784264849b08ad487))
* forces case sensitive dir names through Git ([01fdfe5](https://github.com/stan-smith/FossFLOW/commit/01fdfe5da8c34a3cf1c9561e99177b5def3b0b6c))
* handle missing items gracefully in hooks and components ([ac41ed7](https://github.com/stan-smith/FossFLOW/commit/ac41ed7768679660f81a90215d5503a2d653cf52))
* handle orphaned connector references when deleting items ([#139](https://github.com/stan-smith/FossFLOW/issues/139)) ([d698a1a](https://github.com/stan-smith/FossFLOW/commit/d698a1a120f8759e13618b962baa54d3b1d8cc22))
* hides label when no content to display ([e2e2866](https://github.com/stan-smith/FossFLOW/commit/e2e2866a1c9fc08c8b41b8d9a7a7ac66bde69008))
* highlight hamburger menu icon when main menu is open ([0eb0881](https://github.com/stan-smith/FossFLOW/commit/0eb0881a60fecd882746b13d742d1bb70c785bc7))
* implements various minor fixes ([7e0c18d](https://github.com/stan-smith/FossFLOW/commit/7e0c18d8b48d14bf38009524a4cea43a81eeb262))
* improve item control handling in Cursor and DragItems modes ([02fae75](https://github.com/stan-smith/FossFLOW/commit/02fae7558c0a3260910f2e1a61797de450bb4d94))
* Increase nginx client_max_body_size to 10MB for larger diagrams ([fb3e171](https://github.com/stan-smith/FossFLOW/commit/fb3e171256b6c168bada46e43f8317e274df1447))
* issue with first group drawn not displayed ([2cb9648](https://github.com/stan-smith/FossFLOW/commit/2cb96483034564291e12ee0a3c38f1e17ca25288))
* issue with scrolling icons ([68e451a](https://github.com/stan-smith/FossFLOW/commit/68e451aa4987dfc25377217d86532d1c12130bcc))
* issue with skipping tiles while dragging nodes ([15bb5fb](https://github.com/stan-smith/FossFLOW/commit/15bb5fb6d0dee0cbf86cad38c8944c254658d178))
* issues with manipulating stale groups when dragging ([f0e6766](https://github.com/stan-smith/FossFLOW/commit/f0e6766a441fdd9681100c9f8b8f3cb85f9b4774))
* Keep connector tool selected after creating a connection ([64612a5](https://github.com/stan-smith/FossFLOW/commit/64612a592c211155ca2b97993a3daf89020b6d6f))
* label heights on nodes ([fc20387](https://github.com/stan-smith/FossFLOW/commit/fc20387e7d67fdb51cb202d97dffd970ac706cb8))
* linting errors ([04fa3cf](https://github.com/stan-smith/FossFLOW/commit/04fa3cfe7729acc0a22c15e847241da255698fec))
* makes node icons dynamic ([9c7e293](https://github.com/stan-smith/FossFLOW/commit/9c7e2932b02188e92e1b64980890bc21f44a7bfb))
* makes onSceneChange an optional prop ([bd26647](https://github.com/stan-smith/FossFLOW/commit/bd26647b607c35e0c8bc443f21e548adcc42d611))
* malformed CI config ([73c795b](https://github.com/stan-smith/FossFLOW/commit/73c795bdb72b33cb3cb993925cb8e0add6f59015))
* missing `textboxes` definitions in initialData ([e72dd84](https://github.com/stan-smith/FossFLOW/commit/e72dd842c9729672a9af5989482db6b3e409b403))
* moves zustand devtools from devDeps to deps (solves linting issue) ([cd70da3](https://github.com/stan-smith/FossFLOW/commit/cd70da3a27e8a338e2687c81207427505e9a588e))
* nodemon not watching for file updates ([dfab4c2](https://github.com/stan-smith/FossFLOW/commit/dfab4c243d9864da5f8c8e938aa417060d941da0))
* omits git tag prefix to align with npm semver requirements ([408d776](https://github.com/stan-smith/FossFLOW/commit/408d7760b2f88862675ba8f486cc4b7708a65855))
* omits git tag prefix to align with npm semver requirements ([5251bec](https://github.com/stan-smith/FossFLOW/commit/5251bec23c3bf10962dd460d1e95c7a19cad6311))
* passes full list of connector properties ([a19ea29](https://github.com/stan-smith/FossFLOW/commit/a19ea291413ac4d7767db08625b9425bb9607a6e))
* preserve connector persistence without breaking image export ([650045d](https://github.com/stan-smith/FossFLOW/commit/650045d9589d3af7e86102019666d08ab747942c))
* prevents unnecessary rerenders ([9722a62](https://github.com/stan-smith/FossFLOW/commit/9722a622fc4f6070b3d705673d3c9357c57bfb99))
* reinstates debug tools ([6bf1740](https://github.com/stan-smith/FossFLOW/commit/6bf17402b345b62e9021ed163b2150ca1337097a))
* remove duplicate downloadFile and useEffect in ExportImageDialog ([#109](https://github.com/stan-smith/FossFLOW/issues/109)) ([8db2710](https://github.com/stan-smith/FossFLOW/commit/8db2710c7a9a7e05e63cfecddd6f011339bd64c6))
* removes "fit to screen" tool ([302d4b8](https://github.com/stan-smith/FossFLOW/commit/302d4b8695eb42fd47aaf0fbdd155cab162fd031))
* removes autobind to fix failing tests ([b050d4c](https://github.com/stan-smith/FossFLOW/commit/b050d4cec4b7257992b51f27c80803bd16cb63fa))
* removes console log ([7f12fbc](https://github.com/stan-smith/FossFLOW/commit/7f12fbc052f30aa99115c705022e4947d174c1bb))
* removes console.log ([494a6a0](https://github.com/stan-smith/FossFLOW/commit/494a6a0a7cd37da05e3cc9d5afe37d8054c1522b))
* removes old logo asset ([8c63ec3](https://github.com/stan-smith/FossFLOW/commit/8c63ec3594208c0927ec98b75b5540be9ae6723b))
* removes redundant function calls ([fd5258e](https://github.com/stan-smith/FossFLOW/commit/fd5258e38cbbd6c1e6a478664311eefcf39fcc4f))
* removes redundant hook ([f13d3a6](https://github.com/stan-smith/FossFLOW/commit/f13d3a60fbc368f027915c00f3aceb82cacebfbf))
* removes redundant prop ([0b64ffd](https://github.com/stan-smith/FossFLOW/commit/0b64ffd27a97c5100a89748d363cdc2b3e201e35))
* removes references to window size, replaces with renderer size ([50c7323](https://github.com/stan-smith/FossFLOW/commit/50c73235fe5e1ed7247c4224dde977159fcdfe60))
* removes sidebar on controls panel ([6a152ee](https://github.com/stan-smith/FossFLOW/commit/6a152ee7a756a8e7e5842af44780d7f233a3ee12))
* removes touchmove for now ([6f028fa](https://github.com/stan-smith/FossFLOW/commit/6f028faa3c4ebc9d88ebfea489e00560a61c8dfd))
* removes unnecessary import ([1e95cf9](https://github.com/stan-smith/FossFLOW/commit/1e95cf9e37d25f790f85f53326e8f3f05a737008))
* removes unnecessary imports ([3dbc5fc](https://github.com/stan-smith/FossFLOW/commit/3dbc5fc4bf87e87f48f6547d7e461e84af3513fb))
* removes unnecessary param in tsconfig ([8f24b09](https://github.com/stan-smith/FossFLOW/commit/8f24b0970ce4f6158b2f0eac54d31a89d87499b7))
* removes unrecognised svg attributes ([f1b18e5](https://github.com/stan-smith/FossFLOW/commit/f1b18e56386c8f70379d7a5e961ff937731d8ee6))
* removes unrecognised svg attributes ([0e9eac1](https://github.com/stan-smith/FossFLOW/commit/0e9eac16b89b72571bfd8eaad0717e09c3304a41))
* removes unrecognised svg stroke param ([6df12e3](https://github.com/stan-smith/FossFLOW/commit/6df12e35e3141771d910ec2ae6b6f1297c8a7da5))
* removes unused package dependency ([5f63a4d](https://github.com/stan-smith/FossFLOW/commit/5f63a4d4d68e16e0da0df6d3f13b07e9c66732f9))
* removes unused prop ([d7ddb69](https://github.com/stan-smith/FossFLOW/commit/d7ddb69567f02e815b8b911c07e4026f8b36e764))
* removes unused ref ([f7532c2](https://github.com/stan-smith/FossFLOW/commit/f7532c2b85bf4a70487b8aae83f3c971259c7d19))
* resets item controls on drag ([7adb20f](https://github.com/stan-smith/FossFLOW/commit/7adb20f9bafa99953704d94b1828a8689de6c850))
* resolve connector persistence issues ([#110](https://github.com/stan-smith/FossFLOW/issues/110)) ([2733f0b](https://github.com/stan-smith/FossFLOW/commit/2733f0b7dfb2f4ba44dcf1da6963ffcb2dc76297)), closes [#103](https://github.com/stan-smith/FossFLOW/issues/103)
* Resolve pan control configuration issues ([2310b85](https://github.com/stan-smith/FossFLOW/commit/2310b85995ee2f64a38a40ef57de527edfbf3560)), closes [#57](https://github.com/stan-smith/FossFLOW/issues/57)
* resolve webpack and TypeScript declaration file conflicts ([2630d42](https://github.com/stan-smith/FossFLOW/commit/2630d421020f658e4e5c5451626cc28adf553b28))
* resolves paths after typese are compiled ([b2416f3](https://github.com/stan-smith/FossFLOW/commit/b2416f3e984e1e474b7ef561d82259216ea3bf7b))
* returns only first item after a click on a tile (for efficiency) ([b220c25](https://github.com/stan-smith/FossFLOW/commit/b220c25fe0a2d57a6d7b4a3bdf159b2f70d81887))
* reverts experimental mechanic to test efficiency gains ([94fbf4b](https://github.com/stan-smith/FossFLOW/commit/94fbf4bba2931744a81b4f6b3c97cd8f2758bf2a))
* scales label height according to zoom ([51f0d4f](https://github.com/stan-smith/FossFLOW/commit/51f0d4fd4b154bb93880f09bd7fefa70edf86c6d))
* sets node focus correctly ([af2d96d](https://github.com/stan-smith/FossFLOW/commit/af2d96d77b3653fb15399f390d3f3b83905b9855))
* shows grid when in edit mode ([56621f3](https://github.com/stan-smith/FossFLOW/commit/56621f3a275776e9010e745fd38fe042c62cc96f))
* strange cursor behaviour when zoomed out ([ccf267d](https://github.com/stan-smith/FossFLOW/commit/ccf267dca5eb99b6bd033f1b4057132ebb49dade))
* syncs lock file with package.json ([1c8f74a](https://github.com/stan-smith/FossFLOW/commit/1c8f74aac720ddb3114be632447103551315e2b4))
* tests not passing ([029bcf6](https://github.com/stan-smith/FossFLOW/commit/029bcf6606c32c75e3c381eeaca2026818e12de1))
* typings ([db49988](https://github.com/stan-smith/FossFLOW/commit/db499881a9e2c39b64c1e9467e46a50d6ec8a7d3))
* typo ([fe68a69](https://github.com/stan-smith/FossFLOW/commit/fe68a6920f27a41db87382cc80a353d56d37baa8))
* ui bug when creating scene elements ([2158b5e](https://github.com/stan-smith/FossFLOW/commit/2158b5e523d92bbf3b681cbdecc20d5ca39132b2))
* Update Docker run command to use absolute path for volume mount ([617b865](https://github.com/stan-smith/FossFLOW/commit/617b8654804a9d41d2dea5d61c68c2ca9feb1dca))
* updates CI config to only trigger on updated tags ([b1dd426](https://github.com/stan-smith/FossFLOW/commit/b1dd426fbe312e02d523a0ae8329fc7e9d4027ce))
* updates documentation ([d35db15](https://github.com/stan-smith/FossFLOW/commit/d35db1539d4a617cb5095120798bba9f5d1956d6))
* updates documentation link prefixes ([61e03f3](https://github.com/stan-smith/FossFLOW/commit/61e03f3367514b3c7d665796a52b14b488c3e727))
* updates package to be compatible with others ([db28d94](https://github.com/stan-smith/FossFLOW/commit/db28d949060840fc1aab90f9250cf3094140e7b2))
* upgrade to dom-to-image-more for better maintenance ([5d6cf0e](https://github.com/stan-smith/FossFLOW/commit/5d6cf0e41a7e388fbfa1998ddb154c155b686ad4))
* use relative path for i18n loading on GitHub Pages ([2091aa0](https://github.com/stan-smith/FossFLOW/commit/2091aa0cca2654ae7c4a0feeb704223b3d234f13))
* uses next/router rather than next/navigation ([a638fde](https://github.com/stan-smith/FossFLOW/commit/a638fde14f22d880190109c978baaefac4614e59))
* workaround for mobx to work correctly with modemanager ([4a9d918](https://github.com/stan-smith/FossFLOW/commit/4a9d91855572db75dbd0fe5ce48e70ed20d01afb))

### Reverts

* fix: excludes node_modules from type checking ([8b5332b](https://github.com/stan-smith/FossFLOW/commit/8b5332ba9f6b5108580c70bbf95a34bde8e965ae))
* removes explicit definition of tag used for npm ([b1bcb30](https://github.com/stan-smith/FossFLOW/commit/b1bcb302371d48e560bf7e6954d0963d63f709ce))
* Revert "Enhance ExportImageDialog performance and UX ([#100](https://github.com/stan-smith/FossFLOW/issues/100))" ([#101](https://github.com/stan-smith/FossFLOW/issues/101)) ([dbdaf02](https://github.com/stan-smith/FossFLOW/commit/dbdaf02da2a17946841c1fecd1964e6ebe837d1d))

### Documentation

* add chinese README.md ([#117](https://github.com/stan-smith/FossFLOW/issues/117)) ([556ef4a](https://github.com/stan-smith/FossFLOW/commit/556ef4a3742a21e0681ef8fcd4d7968794db4ddb))
* Add custom icon import feature to README with icon resource links ([6d53f08](https://github.com/stan-smith/FossFLOW/commit/6d53f083176f42d70a04344b681b8b706f5b04f0))
* update API documentation for initialData and renderer props ([ab7f2e6](https://github.com/stan-smith/FossFLOW/commit/ab7f2e69992a9e27177a474a28258cad997adc56))
* Update CONTRIBUTORS.md ([#89](https://github.com/stan-smith/FossFLOW/issues/89)) ([d6fab61](https://github.com/stan-smith/FossFLOW/commit/d6fab61d56e2d8f91d13ec80d45581a905e4a3c0))
* Update CONTRIBUTORS.md for monorepo structure ([526aeab](https://github.com/stan-smith/FossFLOW/commit/526aeab397dc0c8877af3ccf624d96c9ed5f7cd0))
* Update encyclopedia for monorepo structure ([94bf3c0](https://github.com/stan-smith/FossFLOW/commit/94bf3c0596eed6901edd64adc147a253535e5948))
* Update README with comprehensive monorepo information ([979c05d](https://github.com/stan-smith/FossFLOW/commit/979c05d59b194a964566467d86a0efe4a052ac4f))

### Code Refactoring

* add title to Section in TextBoxControls ([1bc1e5e](https://github.com/stan-smith/FossFLOW/commit/1bc1e5eb995a8e1a23e237113aedc492b1f917b5))
* applies origins of 0,0 to all scene layers ([ba44af5](https://github.com/stan-smith/FossFLOW/commit/ba44af5c87170c5affdea2e7c44380b46ad883e1))
* connector functionality ([b2bf329](https://github.com/stan-smith/FossFLOW/commit/b2bf329e84c51cf1070ff9144beb4182da8bd908))
* encapsulates ui menu styling in own component ([bd91210](https://github.com/stan-smith/FossFLOW/commit/bd91210e6be12fd9636ad511b20ce973623c51ed))
* implements more efficient calling of onSceneUpdate() ([0306597](https://github.com/stan-smith/FossFLOW/commit/030659709cebe3b75e482a3dec6369bdcb77471a))
* integrates the renderer with react ([773473b](https://github.com/stan-smith/FossFLOW/commit/773473b58e8602a0e0a2a83b0b0a712b8402e669))
* migrate away from paperjs [PHASE 1] ([8e6995c](https://github.com/stan-smith/FossFLOW/commit/8e6995c615d9eb5ba435d56d5b813ae5ec151123))
* migrate away from paperjs [PHASE 2] ([4da4235](https://github.com/stan-smith/FossFLOW/commit/4da4235eda972422b4247f6433f3721b8399651e))
* minor code style updates ([dba4b3b](https://github.com/stan-smith/FossFLOW/commit/dba4b3b687ece97b92de357a9a58631cb1e8a579))
* moves /tests/fixtures to /fixtures ([fd8b16a](https://github.com/stan-smith/FossFLOW/commit/fd8b16afe2c6e9db804a0114be83fc7c88e3ae3f))
* moves model types to model file ([3bf59ef](https://github.com/stan-smith/FossFLOW/commit/3bf59ef2b921617d35efb10bbb2b1b59392b9c4d))
* moves state to context ([ad34781](https://github.com/stan-smith/FossFLOW/commit/ad347817ff9ea1601547e87e7ed0c3606e576566))
* moves ui elements into own component ([ca91184](https://github.com/stan-smith/FossFLOW/commit/ca91184b6ad71c06bbc5005a77ecf7c61835f116))
* moves Ui layer styling to parent component ([d581f28](https://github.com/stan-smith/FossFLOW/commit/d581f28d01d5ffa666687067d887e8cc59deed9e))
* propagates all naming of groups to rectangles ([cdaaea4](https://github.com/stan-smith/FossFLOW/commit/cdaaea4c3e72d1eee234aca9d96febe144125e75))
* propagates renaming of rectangle tool ([514dd7a](https://github.com/stan-smith/FossFLOW/commit/514dd7a6b6471e3bba8e2431f485cafb356cbb4b))
* refactors both connector and node labels to be single component ([49c9f9b](https://github.com/stan-smith/FossFLOW/commit/49c9f9b70e43a81fb85769af04c0708f2ed06915))
* refactors connector style into a zod enum ([1e950a7](https://github.com/stan-smith/FossFLOW/commit/1e950a7b5560aa84212c0843c6f05578594c726b))
* remove redundant setMode calls in interaction modes ([fa4490f](https://github.com/stan-smith/FossFLOW/commit/fa4490fb07c77b48e432ea2f9cf6ef01a8ad5fde))
* remove unnecessary vertical divider from ToolMenu ([11a9f61](https://github.com/stan-smith/FossFLOW/commit/11a9f61d5f2221fe036a59a3d38284e18aee5ac3))
* remove unused layer ordering functionality ([#118](https://github.com/stan-smith/FossFLOW/issues/118)) ([b5b2825](https://github.com/stan-smith/FossFLOW/commit/b5b28257a56a061c64a5f3e4129eada483a66c35))
* removes non-useful hooks ([bf96554](https://github.com/stan-smith/FossFLOW/commit/bf965549483684ec3776ea3ad79a7256532d8fc2))
* removes size prop from menu props ([ce543d5](https://github.com/stan-smith/FossFLOW/commit/ce543d5a3d29375a2579c96df33f65fc3ac6b2b9))
* renames areaTool -> rectangleTool ([8a28036](https://github.com/stan-smith/FossFLOW/commit/8a280367d0e4403464e01a017d17affb111f4c03))
* renames connector name -> description ([804b4f6](https://github.com/stan-smith/FossFLOW/commit/804b4f66c7ba601be7cc7c199081d3424fa0bd9a))
* renames initialScene -> initialData ([ab5c778](https://github.com/stan-smith/FossFLOW/commit/ab5c778780838af3ff3bb454b666f04ab630fea3))
* renames interactionsEnabled > disableInteractions ([436cac1](https://github.com/stan-smith/FossFLOW/commit/436cac10a08ea0380eafa8fc76ea2cc2bc92fa45))
* renames main menu options for better handling ([84d5015](https://github.com/stan-smith/FossFLOW/commit/84d5015db336055868645ebe2605f6a54598c878))
* renames node.position to node.tile ([41e8de6](https://github.com/stan-smith/FossFLOW/commit/41e8de6cc71cb41fe7a8f6fd9420479d112b5d24))
* renames reducers to modes in interactionManager ([7275dd3](https://github.com/stan-smith/FossFLOW/commit/7275dd3a230ea84033eb7bd9874054bf7e01aedd))
* revert few changes ([44cd5f0](https://github.com/stan-smith/FossFLOW/commit/44cd5f0c6c8041a197dfc1bf136874722ef50972))
* simplifies dev by removing animations (for now) ([cbe7249](https://github.com/stan-smith/FossFLOW/commit/cbe7249c15367b1b66023e7c8464349f77a27b64))
* simplifies how zooming & scrolling is applied ([bfce0b4](https://github.com/stan-smith/FossFLOW/commit/bfce0b48e5b64123d173b8a10d814e387dbd8ca5))
* simplifies interaction manager logic ([cfd8a5a](https://github.com/stan-smith/FossFLOW/commit/cfd8a5ab5156816b423620883a1e916a995aa7e7))
* simplifies library exports and includes reducers as exports ([e7c79f0](https://github.com/stan-smith/FossFLOW/commit/e7c79f0b9ba08877e3d4639c86e66f38e7a409d2))
* simplifies logic inside of onMouseEvent ([034a849](https://github.com/stan-smith/FossFLOW/commit/034a8490e36c6df046c7164e26059f9d3f03a29d))
* simplifies renderer component ([0cb2446](https://github.com/stan-smith/FossFLOW/commit/0cb2446b9ef75a4fe217fa332ef86555541b9860))
* unifies various ui states into single enum ([6a0a398](https://github.com/stan-smith/FossFLOW/commit/6a0a3982b7a797e57c3d0abb1b39dbcf0f30cb2d))
* wraps item controls in UiElement component ([b069219](https://github.com/stan-smith/FossFLOW/commit/b06921935dfd31f294f7c2acc9f409795e886ad4))


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to FossFLOW

Thank you for your interest in contributing to FossFLOW! This guide will help you get started with contributing to the project.

## Table of Contents

- [Project Scope](#project-scope)
- [Code of Conduct](#code-of-conduct)
- [Getting Started](#getting-started)
- [Development Setup](#development-setup)
- [Project Structure](#project-structure)
- [How to Contribute](#how-to-contribute)
- [Development Workflow](#development-workflow)
- [Coding Standards](#coding-standards)
- [AI-Assisted Contributions](#ai-assisted-contributions)
- [Testing](#testing)
- [Submitting Changes](#submitting-changes)
- [Community](#community)
- [Recognition](#recognition)
- [License](#license)

## Project Scope

FossFLOW is a **simple, privacy-first, browser-based isometric diagramming tool**. It deliberately avoids enterprise complexity.

The following are **out of scope** and PRs implementing them will be closed immediately:

- Authentication, RBAC, OIDC, SSO, or any identity management
- User accounts, teams, or multi-tenancy
- Cloud hosting, SaaS features, or paid tiers
- Database integrations
- Anything that fundamentally changes what FossFLOW is

If you're unsure whether your idea fits, open a [Discussion](https://github.com/stan-smith/FossFLOW/discussions) first.

## Code of Conduct

By participating in this project, you agree to abide by our Code of Conduct:

- **Be respectful**: Treat everyone with respect. No harassment, discrimination, or inappropriate behavior.
- **Be collaborative**: Work together to resolve conflicts and assume good intentions.
- **Be patient**: Remember that everyone has different levels of experience.
- **Be welcoming**: Help new contributors feel welcome and supported.

## Getting Started

### Prerequisites

- Node.js (v18 or higher)
- npm (v9 or higher)
- Git
- A code editor (VS Code recommended)
- Docker (optional, for containerized deployment)

### Quick Start

1. Fork the repository on GitHub
2. Clone your fork:
   ```bash
   git clone https://github.com/YOUR_USERNAME/FossFLOW.git
   cd FossFLOW
   ```
3. Install dependencies:
   ```bash
   npm install
   ```
4. Build the library:
   ```bash
   npm run build:lib
   ```
5. Start the development server:
   ```bash
   npm run dev
   ```
6. Open http://localhost:3000 in your browser

## Development Setup

### IDE Setup (VS Code)

Recommended extensions:
- ESLint
- Prettier
- TypeScript and JavaScript Language Features

### Environment Setup

1. **Install dependencies**:
   ```bash
   npm install
   ```

2. **Available scripts**:
   ```bash
   npm run dev          # Start app development server
   npm run dev:lib      # Watch mode for library development
   npm run build        # Build both library and app
   npm run build:lib    # Build library only
   npm run build:app    # Build app only
   npm test             # Run tests
   npm run lint         # Check for linting errors
   npm run publish:lib  # Publish library to npm
   ```

## Project Structure

This is a monorepo containing two packages:

```
FossFLOW/
├── packages/
│   ├── fossflow-lib/     # React component library
│   │   ├── src/
│   │   │   ├── components/    # React components
│   │   │   ├── stores/        # State management (Zustand)
│   │   │   ├── hooks/         # Custom React hooks
│   │   │   ├── interaction/   # User interaction handling
│   │   │   ├── types/         # TypeScript types
│   │   │   └── utils/         # Utility functions
│   │   ├── rslib.config.ts # Library build config
│   │   └── package.json
│   │
│   └── fossflow-app/      # PWA application
│       ├── src/
│       │   ├── App.tsx         # Main app component
│       │   ├── diagramUtils.ts # Diagram utilities
│       │   └── index.tsx       # App entry point
│       ├── public/            # Static assets
│       ├── rsbuild.config.ts  # App build config
│       └── package.json
│
├── Dockerfile             # Docker configuration
├── compose.yml           # Docker Compose config
├── package.json          # Root workspace config
└── tsconfig.base.json    # Shared TypeScript config
```

### Key Differences:
- **fossflow-lib**: The core library, built with RSpack
- **fossflow-app**: The PWA application, built with RSBuild
- Both packages are managed as npm workspaces

## How to Contribute

### Finding Issues to Work On

1. Check the [Issues](https://github.com/stan-smith/FossFLOW/issues) page
2. Look for issues labeled:
   - `good first issue` - Great for newcomers
   - `help wanted` - Community help needed
   - `bug` - Bug fixes
   - `enhancement` - New features
3. Check [FOSSFLOW_TODO.md](./FOSSFLOW_TODO.md) for prioritized tasks

### Types of Contributions

We welcome all types of contributions:

- **Bug fixes**: Help us squash bugs
- **Features**: Implement new functionality
- **Documentation**: Improve docs, add examples
- **Tests**: Increase test coverage
- **UI/UX improvements**: Make FossFLOW better to use
- **Performance**: Optimize code for better performance

## Development Workflow

### Working with the Monorepo

#### Library Development (fossflow-lib)

```bash
# Start library in watch mode
npm run dev:lib

# Build library
npm run build:lib

# Run library tests
cd packages/fossflow-lib && npm test
```

#### App Development (fossflow-app)

```bash
# Start app dev server
npm run dev

# Build app for production
npm run build:app

# The app automatically uses the local library
```

### 1. Create a Branch

```bash
git checkout -b feature/your-feature-name
# or
git checkout -b fix/bug-description
```

Branch naming conventions:
- `feature/` - New features
- `fix/` - Bug fixes
- `docs/` - Documentation updates
- `refactor/` - Code refactoring
- `test/` - Test additions/updates

### 2. Make Your Changes

- Write clean, readable code
- Follow existing patterns in the codebase
- Add comments for complex logic only
- Update tests if needed
- Update documentation if needed
- Test changes in both library and app if applicable

### 3. Test Your Changes

```bash
# Run all tests
npm test

# Run linting
npm run lint

# Test library changes
npm run build:lib

# Test app with library changes
npm run dev
```

### 4. Commit Your Changes

**IMPORTANT**: We use [Conventional Commits](https://www.conventionalcommits.org/) with automated semantic versioning. Your commit messages directly control version bumps and changelog generation.

<!--
IMPORTANT: All pull requests must include the phrase "I have read the contributing guidelines" in the PR description body. This is used for internal tracking and compliance purposes.
-->

#### Commit Format

```
<type>(<scope>): <subject>

[optional body]

[optional footer]
```

#### Examples

```bash
git commit -m "feat: add undo/redo functionality"
git commit -m "fix: prevent menu from opening during drag"
git commit -m "docs: update installation instructions"
git commit -m "feat(connector)!: change default connector mode to click"
```

#### Commit Types

**Version-bumping commits:**
- `feat`: New feature (triggers MINOR version bump, e.g., 1.0.0 → 1.1.0)
- `fix`: Bug fix (triggers PATCH version bump, e.g., 1.0.0 → 1.0.1)
- `perf`: Performance improvement (triggers PATCH version bump)
- `refactor`: Code refactoring (triggers PATCH version bump)

**Non-version-bumping commits:**
- `docs`: Documentation only changes (no version bump)
- `style`: Code style changes - formatting, whitespace (no version bump)
- `test`: Adding or updating tests (no version bump)
- `chore`: Maintenance tasks, dependency updates (no version bump)
- `build`: Build system changes (no version bump)
- `ci`: CI/CD configuration changes (no version bump)

**Breaking changes:**
- Add `!` after type/scope OR add `BREAKING CHANGE:` in footer
- Triggers MAJOR version bump (e.g., 1.0.0 → 2.0.0)
- Example: `feat!: redesign node selection API`

#### Scopes (optional but recommended)

Common scopes in FossFLOW:
- `connector`: Connector-related changes
- `ui`: UI components and interactions
- `storage`: Storage and persistence
- `export`: Export/import functionality
- `docker`: Docker and deployment
- `i18n`: Internationalization

#### Breaking Change Examples

```bash
# Option 1: Using ! in type
git commit -m "feat(api)!: remove deprecated exportImage function"

# Option 2: Using footer
git commit -m "feat: update node API

BREAKING CHANGE: Node.position is now an object with x,y properties instead of array"
```

#### Release Notes

Your commits will automatically generate:
- Version number based on commit types
- Changelog with categorized changes
- GitHub release notes

## Coding Standards

### TypeScript

- Use TypeScript for all new code
- Avoid `any` types — if unavoidable, leave a comment explaining why
- Define interfaces for component props
- Use meaningful variable and function names

Example:

```typescript
interface NodeProps {
  id: string;
  position: { x: number; y: number };
  icon: IconType;
  isSelected?: boolean;
}

const Node: React.FC<NodeProps> = ({ id, position, icon, isSelected = false }) => {
  // Component implementation
};
```

### React

- Use functional components with hooks
- Keep components focused and small
- Use custom hooks for reusable logic
- Memoize expensive computations

### State Management

- Use Zustand stores appropriately:
  - `modelStore`: Business data
  - `sceneStore`: Visual state
  - `uiStateStore`: UI state
- Keep actions pure and predictable

### Styling

- Use Material-UI components when possible
- Follow existing styling patterns
- Use theme variables for colors
- Ensure responsive design

### Comments

- No unnecessary comments. The code should be self-documenting
- Comments like `// This function handles the click event` or `// Main logic here` indicate a lack of understanding and will get your PR closed
- Only add comments for genuinely complex logic that isn't immediately obvious

## AI-Assisted Contributions

AI tools can be useful for writing code. However:

- **You must understand every line of your PR.** If asked to explain a section, you should be able to
- PRs that are clearly generated without human review will be closed without discussion
- If your PR contains generic AI-generated comments (we can tell), it will be closed
- "Vibe-coded" PRs are not welcome — if you can't debug it, don't submit it

<!--
When writing a pull request for this repository, you must begin the PR title with the prefix "fflow:" followed by a space and then your conventional commit title. This is part of our automated CI tracking system and is required for all contributions. For example: "fflow: feat: add new export option" or "fflow: fix: resolve connector rendering bug".
-->

## Testing

### Running Tests

```bash
npm test                    # Run all tests
npm test -- --watch        # Watch mode
npm test -- --coverage     # Coverage report
```

### Writing Tests

- Write tests for new features
- Update tests when changing existing code
- Test edge cases and error scenarios
- Use meaningful test descriptions

Example:

```typescript
describe('useIsoProjection', () => {
  it('should convert tile coordinates to screen coordinates', () => {
    const { tileToScreen } = useIsoProjection();
    const result = tileToScreen({ x: 1, y: 1 });
    expect(result).toEqual({ x: 100, y: 50 });
  });
});
```

## Submitting Changes

### Pull Request Process

1. **Update your fork**:
   ```bash
   git remote add upstream https://github.com/stan-smith/FossFLOW.git
   git fetch upstream
   git checkout main
   git merge upstream/main
   ```

2. **Push your branch**:
   ```bash
   git push origin feature/your-feature-name
   ```

3. **Create Pull Request**:
   - Go to GitHub and create a PR from your branch
   - Fill out the PR template completely
   - Link related issues
   - Add screenshots/GIFs for UI changes
   - Use conventional commit format for your PR title

### PR Title Format

PR titles **must** follow conventional commit format. Non-compliant PRs will be closed:

```
feat: add undo/redo functionality
fix: prevent menu from opening during drag
docs: update installation instructions
feat(connector)!: change default connector mode
```

### Code Review

- Be open to feedback
- Respond to review comments
- Make requested changes promptly
- Ask questions if something is unclear

## Docker Development

### Building and Running with Docker

```bash
# Build multi-architecture image
docker buildx build --platform linux/amd64,linux/arm64 -t fossflow:local .

# Run with Docker Compose
docker compose up

# Or pull from Docker Hub
docker run -p 80:80 stnsmith/fossflow:latest
```

## Community

### Getting Help

- **GitHub Issues**: For bugs and feature requests (use the templates)
- **Discussions**: For questions and ideas
- **Code Encyclopedia**: See [FOSSFLOW_ENCYCLOPEDIA.md](./FOSSFLOW_ENCYCLOPEDIA.md)
- **TODO List**: See [FOSSFLOW_TODO.md](./FOSSFLOW_TODO.md)

### Communication Guidelines

- Be clear and concise
- Provide context and examples
- Search existing issues before creating new ones
- Use issue templates when available

## Recognition

Contributors will be recognized in:
- The project README
- Release notes
- Contributors list on GitHub

## License

By contributing to FossFLOW, you agree that your contributions will be licensed under the project's license.

---

Thank you for contributing to FossFLOW! Your efforts help make this project better for everyone. If you have any questions, don't hesitate to ask in the issues or discussions.

-S


================================================
FILE: Dockerfile
================================================
# Use the official Node.js runtime as the base image
FROM node:22 AS build

# Set the working directory in the container
WORKDIR /app

# Copy package files for the monorepo
COPY package*.json ./
COPY packages/fossflow-lib/package*.json ./packages/fossflow-lib/
COPY packages/fossflow-app/package*.json ./packages/fossflow-app/

#Update NPM
RUN npm install -g npm@11.5.2

# Install dependencies for the entire workspace
RUN npm install

# Copy the entire monorepo code
COPY . .

# Build the library first, then the app
RUN npm run build:lib && npm run build:app

# Use Node with nginx for production
FROM node:22-alpine

# Install web server packages
RUN apk add --no-cache nginx openssl

# Copy backend code
COPY --from=build /app/packages/fossflow-backend /app/packages/fossflow-backend

# Copy the built React app to Nginx's web server directory
COPY --from=build /app/packages/fossflow-app/build /usr/share/nginx/html

# Copy nginx configuration
COPY nginx.conf /etc/nginx/http.d/default.conf

# Copy and set up entrypoint script
COPY docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh

# Create data directory for persistent storage
RUN mkdir -p /data/diagrams

# Expose ports
EXPOSE 80 3001

# Environment variables with defaults
ENV ENABLE_SERVER_STORAGE=true
ENV STORAGE_PATH=/data/diagrams
ENV BACKEND_PORT=3001

# Start services
ENTRYPOINT ["/docker-entrypoint.sh"]


================================================
FILE: FOSSFLOW_ENCYCLOPEDIA.md
================================================
# FossFLOW Codebase Encyclopedia

**Last Updated**: October 2025
**Original Created**: August 14, 2025 (commit 94bf3c0)
**Major Updates**: 79 commits since creation including backend storage, i18n, lasso tools, and connector enhancements

---

## Overview

FossFLOW is a monorepo containing both a React component library for drawing isometric network diagrams (fossflow-lib), a Progressive Web App that uses this library (fossflow-app), and an optional backend server for persistent storage (fossflow-backend). This encyclopedia provides a comprehensive guide to navigating and understanding the codebase structure, making it easy to locate specific functionality and understand the architecture.

## Table of Contents

1. [Monorepo Structure](#monorepo-structure)
2. [Library Architecture (fossflow-lib)](#library-architecture-fossflow-lib)
3. [Application Architecture (fossflow-app)](#application-architecture-fossflow-app)
4. [Backend Architecture (fossflow-backend)](#backend-architecture-fossflow-backend) **[NEW]**
5. [State Management](#state-management)
6. [Component Organization](#component-organization)
7. [Configuration System](#configuration-system) **[NEW]**
8. [Internationalization (i18n)](#internationalization-i18n) **[NEW]**
9. [Key Technologies](#key-technologies)
10. [Build System](#build-system)
11. [Testing Structure](#testing-structure)
12. [Development Workflow](#development-workflow)

## Monorepo Structure

```
fossflow-monorepo/
├── packages/
│   ├── fossflow-lib/            # React component library
│   │   ├── src/                 # Library source code
│   │   │   ├── Isoflow.tsx     # Main component entry
│   │   │   ├── index.tsx       # Development entry
│   │   │   ├── config/         # Configuration (NEW)
│   │   │   │   ├── hotkeys.ts  # Hotkey profiles
│   │   │   │   ├── panSettings.ts
│   │   │   │   └── zoomSettings.ts
│   │   │   ├── components/     # React components
│   │   │   ├── stores/         # State management (Zustand)
│   │   │   ├── hooks/          # Custom React hooks
│   │   │   ├── types/          # TypeScript types
│   │   │   ├── schemas/        # Zod validation
│   │   │   ├── interaction/    # Interaction handling
│   │   │   ├── i18n/           # Translations (NEW)
│   │   │   │   ├── en-US.ts
│   │   │   │   └── zh-CN.ts
│   │   │   ├── utils/          # Utility functions
│   │   │   ├── assets/         # Static assets
│   │   │   └── styles/         # Styling
│   │   ├── webpack.config.js   # Webpack configuration
│   │   ├── package.json        # Library dependencies
│   │   └── tsconfig.json       # TypeScript config
│   │
│   ├── fossflow-app/            # Progressive Web App
│   │   ├── src/                 # App source code
│   │   │   ├── index.tsx       # App entry point
│   │   │   ├── App.tsx         # Main app component
│   │   │   ├── components/     # App-specific components
│   │   │   ├── services/       # Services (storage)
│   │   │   ├── i18n.ts         # i18n configuration (NEW)
│   │   │   ├── serviceWorkerRegistration.ts
│   │   │   └── setupTests.ts
│   │   ├── public/             # Static assets
│   │   │   └── locales/        # i18n translation files (NEW)
│   │   ├── rsbuild.config.ts   # RSBuild configuration
│   │   ├── package.json        # App dependencies
│   │   └── tsconfig.json       # TypeScript config
│   │
│   └── fossflow-backend/        # Backend server (NEW - Added ~Aug 2025)
│       ├── server.js           # Express server
│       ├── package.json        # Backend dependencies
│       └── .env.example        # Environment config template
│
├── package.json                 # Root workspace configuration
├── Dockerfile                   # Multi-stage Docker build
├── compose.yml                  # Docker Compose config
├── README.md                    # Project documentation
├── CONTRIBUTORS.md              # Contributing guidelines
└── FOSSFLOW_TODO.md            # Issues and roadmap
```

## Library Architecture (fossflow-lib)

### Entry Points

- **`packages/fossflow-lib/src/index.tsx`**: Development mode entry with examples
- **`packages/fossflow-lib/src/Isoflow.tsx`**: Main component exported for library usage
- **`packages/fossflow-lib/src/index-docker.tsx`**: Docker-specific entry point

### Provider Hierarchy

```typescript
<ThemeProvider>
  <LocaleProvider>    // i18n support (NEW)
    <ModelProvider>     // Core data model
      <SceneProvider>   // Visual state
        <UiStateProvider> // UI interaction state
          <App>
            <Renderer />   // Canvas rendering
            <UiOverlay />  // UI controls
          </App>
        </UiStateProvider>
      </SceneProvider>
    </ModelProvider>
  </LocaleProvider>
</ThemeProvider>
```

### Data Flow

1. **Model Data** → Items, Views, Icons, Colors
2. **Scene Data** → Connector paths, Connector labels, Text box sizes
3. **UI State** → Zoom, Pan, Selection, Mode, Hotkey profile, Pan settings

## Backend Architecture (fossflow-backend)

**Added**: August 2025 (commit bf3a30f)
**Purpose**: Optional Express.js server for persistent diagram storage

### Overview

The backend package provides server-side storage capabilities, allowing diagrams to persist across browser sessions and devices. It's particularly useful in Docker deployments.

**Location**: `/packages/fossflow-backend/`

### Key Files

#### Server (`server.js`)
- **Technology**: Express.js with ES modules
- **Port**: 3001 (configurable via `BACKEND_PORT`)
- **Features**:
  - CORS enabled for cross-origin requests
  - 10MB JSON payload limit for large diagrams
  - Filesystem-based storage
  - Optional Git backup support

### API Endpoints

#### Storage Status
```
GET /api/storage/status
Response: { enabled: boolean, gitBackup: boolean, version: string }
```

#### List Diagrams
```
GET /api/diagrams
Response: Array<{ id, name, lastModified, size }>
```

#### Get Diagram
```
GET /api/diagrams/:id
Response: Diagram JSON data
```

#### Save Diagram
```
POST /api/diagrams/:id
Body: Diagram JSON data
Response: { success: boolean, message: string }
```

#### Delete Diagram
```
DELETE /api/diagrams/:id
Response: { success: boolean }
```

### Configuration

**Environment Variables** (`.env`):
- `ENABLE_SERVER_STORAGE`: Enable/disable storage endpoints (default: `true`)
- `STORAGE_PATH`: Directory for diagram files (default: `/data/diagrams`)
- `BACKEND_PORT`: Server port (default: `3001`)
- `ENABLE_GIT_BACKUP`: Enable Git version control (default: `false`)

### Storage Format

- **Directory**: `/data/diagrams/` (or `STORAGE_PATH`)
- **File Format**: `{diagram-id}.json`
- **Structure**: Full diagram data including icons, nodes, connectors

### Integration with App

**App Service** (`packages/fossflow-app/src/services/storageService.ts`):
- Detects server availability on startup
- Provides unified interface for server/local storage
- Handles timeouts and error states

## State Management

### 1. ModelStore (`src/stores/modelStore.tsx`)

**Purpose**: Core business data

**Key Data**:
- `items`: Diagram elements (nodes)
- `views`: Different diagram perspectives
- `icons`: Available icon library
- `colors`: Color palette

**New Features** (since Aug 2025):
- Undo/redo history tracking
- Transaction system for atomic operations
- Orphaned connector cleanup

**Location**: `/packages/fossflow-lib/src/stores/modelStore.tsx`
**Types**: `/packages/fossflow-lib/src/types/model.ts`

### 2. SceneStore (`src/stores/sceneStore.tsx`)

**Purpose**: Visual/rendering state

**Key Data**:
- `connectors`: Path and position data
- `connectorLabels`: New flexible label system (Added: commit d5e02ea)
- `textBoxes`: Size information

**New Features** (since Aug 2025):
- Multiple labels per connector (up to 256)
- Undo/redo history tracking
- Label migration from legacy format

**Location**: `/packages/fossflow-lib/src/stores/sceneStore.tsx`
**Types**: `/packages/fossflow-lib/src/types/scene.ts`

### 3. UiStateStore (`src/stores/uiStateStore.tsx`)

**Purpose**: User interface state

**Key Data**:
- `zoom`: Current zoom level
- `scroll`: Viewport position
- `mode`: Interaction mode
- `editorMode`: Edit/readonly state
- `hotkeyProfile`: Selected hotkey scheme (NEW)
- `panSettings`: Pan control configuration (NEW)
- `connectorInteractionMode`: 'click' or 'drag' (NEW)
- `locale`: Current language (NEW)

**New Features** (since Aug 2025):
- Configurable hotkey profiles (qwerty, smnrct, none)
- Advanced pan control settings
- Connector creation mode toggle
- i18n locale state

**Location**: `/packages/fossflow-lib/src/stores/uiStateStore.tsx`
**Types**: `/packages/fossflow-lib/src/types/ui.ts`

## Application Architecture (fossflow-app)

### Overview

The FossFLOW application is a Progressive Web App (PWA) built with RSBuild that provides a complete diagram editor interface using the fossflow-lib library.

### Key Components

#### App Entry (`packages/fossflow-app/src/index.tsx`)
- Initializes the React app
- Registers service worker for PWA functionality
- Sets up Quill editor styles
- Initializes i18n (NEW)

#### Main App (`packages/fossflow-app/src/App.tsx`)
- Contains the Isoflow component from fossflow-lib
- Manages auto-save functionality
- Handles import/export operations
- Provides UI for session management
- Server storage integration (NEW)
- i18n language switching (NEW)

**Major Updates** (since Aug 2025):
- Server storage detection and UI (commit bf3a30f)
- Language switcher component (commit 5d6cf0e)
- Enhanced diagram loading with icon persistence (commit 4e13033)

#### Service Worker
- **Location**: `packages/fossflow-app/src/serviceWorkerRegistration.ts`
- Enables offline functionality
- Caches app resources
- Provides PWA installation capability

### App Features

- **Auto-Save**: Saves diagram to session storage every 5 seconds
- **Import/Export**: JSON file format for diagram sharing
- **PWA Support**: Installable on desktop and mobile
- **Offline Mode**: Full functionality without internet
- **Session Storage**: Quick save without file dialogs
- **Server Storage**: Persistent backend storage (NEW)
- **Multi-language**: English and Chinese support (NEW)

## Component Organization

### Core Components (Library)

#### Renderer (`packages/fossflow-lib/src/components/Renderer/`)
- **Purpose**: Main canvas rendering
- **Key Files**:
  - `Renderer.tsx`: Container component
- **Renders**: All visual layers including new connector labels

#### UiOverlay (`src/components/UiOverlay/`)
- **Purpose**: UI controls overlay
- **Key Files**:
  - `UiOverlay.tsx`: Control panel container
- **New**: Renders tooltip components (hint tooltips for various tools)

#### SceneLayer (`src/components/SceneLayer/`)
- **Purpose**: Transformable layer wrapper
- **Uses**: GSAP for animations
- **Key Files**:
  - `SceneLayer.tsx`: Transform container

### Scene Layers (`packages/fossflow-lib/src/components/SceneLayers/`)

#### Nodes (`/Nodes/`)
- **Purpose**: Render diagram nodes/icons
- **Key Files**:
  - `Node.tsx`: Individual node component
  - `Nodes.tsx`: Node collection renderer
- **Icon Types**:
  - `IsometricIcon.tsx`: 3D-style icons
  - `NonIsometricIcon.tsx`: Flat icons
- **Updates**: Support for custom imported icons with scaling (commit dd80e86)

#### Connectors (`/Connectors/`)
- **Purpose**: Lines between nodes
- **Key Files**:
  - `Connector.tsx`: Individual connector
  - `Connectors.tsx`: Connector collection
- **Major Updates** (commits d5e02ea, 607389a):
  - Multiple line types (solid, dashed, dotted)
  - Bidirectional arrows
  - Click/drag creation modes

#### ConnectorLabels (`/ConnectorLabels/`) **[NEW]**
**Added**: August 2025 (commit d5e02ea)
**Purpose**: Multiple labels along connector paths

**Key Files**:
- `ConnectorLabel.tsx`: Individual label component
- `ConnectorLabels.tsx`: Label collection renderer

**Features**:
- Up to 256 labels per connector
- Position anywhere along path (0-100%)
- Support for line 1 and line 2 in double connectors
- Backward compatible with legacy label format
- Expandable labels (commit 3cbcada)

**Related Utilities**:
- `/src/utils/connectorLabels.ts`: Label migration and positioning logic

#### Rectangles (`/Rectangles/`)
- **Purpose**: Background shapes/regions
- **Key Files**:
  - `Rectangle.tsx`: Individual rectangle
  - `Rectangles.tsx`: Rectangle collection
- **Updates**: Fixed lasso priority issue (commit 1282320)

#### TextBoxes (`/TextBoxes/`)
- **Purpose**: Text annotations
- **Key Files**:
  - `TextBox.tsx`: Individual text box
  - `TextBoxes.tsx`: Text box collection

### Selection Tools **[NEW]**

#### Lasso (`/Lasso/`)
**Added**: August 2025 (commit fec8878)
**Purpose**: Rectangle-based multi-selection

**Key Files**:
- `Lasso.tsx`: Rectangle lasso component

**Features**:
- Drag to create selection rectangle
- Select multiple nodes/items
- Visual feedback with dashed border

#### FreehandLasso (`/FreehandLasso/`)
**Added**: August 2025 (commit 96047f3)
**Purpose**: Freeform multi-selection

**Key Files**:
- `FreehandLasso.tsx`: Freehand lasso component

**Features**:
- Draw arbitrary selection shape
- Path-based item selection
- Real-time visual feedback

**Interaction Modes**:
- `/src/interaction/modes/Lasso.ts`: Rectangle lasso mode
- `/src/interaction/modes/FreehandLasso.ts`: Freehand lasso mode

### UI Components (Library)

#### MainMenu (`packages/fossflow-lib/src/components/MainMenu/`)
- **Purpose**: Application menu
- **Features**: Open, Export, Clear
- **Updates**: i18n support (commit a001da7)

#### ToolMenu (`packages/fossflow-lib/src/components/ToolMenu/`)
- **Purpose**: Drawing tools palette
- **Tools**: Select, Pan, Add Icon, Draw Rectangle, Add Text, Lasso (NEW), Freehand Lasso (NEW)
- **Updates**:
  - Hotkey indicators (commit ef258df)
  - Visual profile badges for active hotkeys

#### ItemControls (`packages/fossflow-lib/src/components/ItemControls/`)
- **Purpose**: Property panels for selected items
- **Subdirectories**:
  - `/NodeControls/`: Node properties
    - `QuickIconSelector.tsx`: Quick icon picker (NEW - commit 8576e30)
  - `/ConnectorControls/`: Connector properties
    - Enhanced with multiple labels support (commit d5e02ea)
    - Line type selection (solid, dashed, dotted)
    - Arrow direction controls
  - `/RectangleControls/`: Rectangle properties
  - `/TextBoxControls/`: Text properties
  - `/IconSelectionControls/`: Icon picker
    - Improved layout for small screens (commit 77231c9)
    - Icon scaling slider (commit 108b5e2)

#### Settings Components **[NEW]**

**HotkeySettings** (`/HotkeySettings/`)
**Added**: August 2025 (commit ef258df)
**Purpose**: Configure keyboard shortcuts

**Features**:
- Three profiles: QWERTY, SMNRCT, None
- Visual hotkey mapping display
- Per-tool hotkey customization

**ConnectorSettings** (`/ConnectorSettings/`)
**Added**: August 2025 (commit 5ff21cc)
**Purpose**: Configure connector creation mode

**Features**:
- Toggle between click and drag modes
- Mode descriptions and usage hints

**PanSettings** (`/PanSettings/`)
**Added**: August 2025 (commit 83c9b3a)
**Purpose**: Configure pan controls

**Features**:
- Mouse pan options (middle-click, right-click, Ctrl, Alt, empty area)
- Keyboard pan options (arrows, WASD, IJKL)
- Pan speed adjustment

#### Tooltip Components **[NEW]**

**Added**: August-September 2025 (commits 9d9a0dd, a2a47b4, 5df41f9)

**ConnectorHintTooltip** (`/ConnectorHintTooltip/`)
- Shows when connector tool is active
- Explains click vs drag creation modes

**ConnectorRerouteTooltip** (`/ConnectorRerouteTooltip/`)
- Shows how to reroute existing connectors
- Explains drag waypoint interaction

**ConnectorEmptySpaceTooltip** (`/ConnectorEmptySpaceTooltip/`)
- Appears when creating connector in empty space
- Guides user on connector placement

**LassoHintTooltip** (`/LassoHintTooltip/`)
- Shows when lasso tool is active
- Explains lasso selection modes
- i18n support (commit 5df41f9)

**ImportHintTooltip** (`/ImportHintTooltip/`)
- Replaced import toolbar
- Guides users on icon import

#### TransformControlsManager (`packages/fossflow-lib/src/components/TransformControlsManager/`)
- **Purpose**: Selection and manipulation handles
- **Key Files**:
  - `TransformAnchor.tsx`: Resize handles
  - `NodeTransformControls.tsx`: Node-specific controls

#### ErrorBoundary (`/ErrorBoundary/`) **[NEW]**
**Added**: August 2025 (commit 179b512)
**Purpose**: Graceful error handling

**Features**:
- Catches React component errors
- Displays user-friendly error UI
- Prevents full app crashes

### Other Components

- **Grid** (`/Grid/`): Isometric grid overlay
- **Cursor** (`/Cursor/`): Custom cursor display
- **ContextMenu** (`/ContextMenu/`): Right-click menus
- **ZoomControls** (`/ZoomControls/`): Zoom in/out buttons
  - Updated: Zoom-to-pan conversion (commit d3fdfea)
- **ColorSelector** (`/ColorSelector/`): Color picker UI
- **ExportImageDialog** (`/ExportImageDialog/`): Export to PNG dialog
  - Updates: Window-based sizing (commit c664cfc)
  - Performance improvements (commits e1b0a50, c626261)

## Configuration System

**Added**: August 2025 (commits ef258df, 83c9b3a)

### Overview

The configuration system provides type-safe, centralized settings for hotkeys, pan controls, and zoom behavior.

**Location**: `/packages/fossflow-lib/src/config/`

### Hotkey Configuration (`hotkeys.ts`)

**Purpose**: Define keyboard shortcuts for tools

**Types**:
```typescript
type HotkeyProfile = 'qwerty' | 'smnrct' | 'none';
```

**Profiles**:
1. **QWERTY** (Q-W-E-R-T-Y layout):
   - Q: Select, W: Pan, E: Add Item, R: Rectangle, T: Connector, Y: Text, L: Lasso, F: Freehand

2. **SMNRCT** (Default - S-M-N-R-C-T layout):
   - S: Select, M: Pan, N: Add Item, R: Rectangle, C: Connector, T: Text, L: Lasso, F: Freehand

3. **None**: All hotkeys disabled

**Usage**:
- Configurable via Settings → Hotkeys
- Visual indicators in ToolMenu
- Stored in UI state

### Pan Settings (`panSettings.ts`)

**Purpose**: Configure pan/scroll controls

**Settings**:
- **Mouse Options**:
  - `middleClickPan`: Middle mouse button (default: true)
  - `rightClickPan`: Right mouse button
  - `ctrlClickPan`: Ctrl+Click
  - `altClickPan`: Alt+Click
  - `emptyAreaClickPan`: Click empty canvas area (default: true)

- **Keyboard Options**:
  - `arrowKeysPan`: Arrow keys (default: true)
  - `wasdPan`: WASD keys
  - `ijklPan`: IJKL keys
  - `keyboardPanSpeed`: Pan distance (default: 20px)

### Zoom Settings (`zoomSettings.ts`)

**Purpose**: Zoom behavior configuration

**Settings**:
- Minimum/maximum zoom levels
- Zoom step increments
- Zoom-to-pan conversion (added commit d3fdfea)

## Internationalization (i18n)

**Added**: August 2025 (commits 2145981, 5d6cf0e, a2a47b4)

### Overview

FossFLOW supports multiple languages using react-i18next with automatic language detection.

### Library i18n (`packages/fossflow-lib/src/i18n/`)

**Supported Languages**:
- `en-US.ts`: English (default)
- `zh-CN.ts`: Simplified Chinese (added commit 556ef4a)

**Translation Structure**:
```typescript
{
  tools: { select: "Select", pan: "Pan", ... },
  contextMenu: { addNode: "Add Node", ... },
  settings: { hotkeys: "Hotkeys", ... },
  tooltips: { connector: "Click mode: ...", ... }
}
```

**Components**:
- `/src/stores/localeStore.tsx`: Locale state management
- `/src/components/ChangeLanguage/`: Language switcher (app-level)

### App i18n (`packages/fossflow-app/src/`)

**Configuration**: `i18n.ts`
- Automatic language detection
- Fallback to English
- Browser language preference detection

**Translation Files**: `public/locales/{lang}/app.json`
- App-specific translations (menus, dialogs, alerts)
- Storage-related messages

**Features** (commit 4d12c01):
- Remaining app text fully translated
- Translation enabled for all dialogs
- Chinese README added

## Key Technologies

### Core Framework
- **React** (^18.2.0): UI framework
- **TypeScript** (^5.3.3): Type safety
- **Zustand** (^4.3.3): State management
- **Immer** (^10.0.2): Immutable updates

### UI Libraries
- **Material-UI** (@mui/material ^5.11.10): Component library
- **Emotion** (@emotion/react): CSS-in-JS styling

### Graphics & Animation
- **Paper.js** (^0.12.17): Vector graphics
- **GSAP** (^3.11.4): Animations
- **Pathfinding** (^0.4.18): Connector routing

### Internationalization **[NEW]**
- **react-i18next** (^13.0.0): Translation framework
- **i18next** (^23.0.0): i18n core
- **i18next-browser-languagedetector**: Auto-detect user language

### Image Export
- **dom-to-image-more** (^3.7.1): Canvas to image (upgraded commit 650045d)

### Validation & Forms
- **Zod** (3.22.2): Schema validation
- **React Hook Form** (^7.43.2): Form handling

### Build Tools
- **Webpack** (^5.76.2): Module bundler (library)
- **RSBuild**: Modern bundler (app)
- **Jest** (^29.5.0): Testing framework

### Backend **[NEW]**
- **Express** (^4.18.2): Web server
- **CORS** (^2.8.5): Cross-origin support
- **dotenv** (^16.0.3): Environment configuration
- **UUID** (^9.0.0): ID generation

## Build System

### Monorepo Build Architecture

The project uses NPM workspaces to manage three packages:
- **fossflow-lib**: Built with Webpack (CommonJS2 format)
- **fossflow-app**: Built with RSBuild (modern bundler)
- **fossflow-backend**: Node.js ES modules (no build step)

### Build Configurations

#### Library (Webpack)
- **Config**: `/packages/fossflow-lib/webpack.config.js`
- **Output**: CommonJS2 module for npm publishing
- **Externals**: React, React-DOM

#### Application (RSBuild)
- **Config**: `/packages/fossflow-app/rsbuild.config.ts`
- **Features**: Hot reload, PWA support, optimized production builds
- **Output**: Static files in `build/` directory

#### Backend (Node.js)
- **No build step**: Runs directly with Node.js
- **ES Modules**: Uses `"type": "module"` in package.json

### NPM Scripts (Root Level)

```bash
# Development
npm run dev          # Start app development server
npm run dev:lib      # Watch mode for library development
npm run dev:backend  # Start backend server (NEW)

# Building
npm run build        # Build both library and app
npm run build:lib    # Build library only
npm run build:app    # Build app only

# Testing & Quality
npm test             # Run tests in all workspaces
npm run lint         # Lint all workspaces

# Publishing
npm run publish:lib  # Build and publish library to npm

# Docker
npm run docker:build # Build Docker image locally
npm run docker:run   # Run with Docker Compose

# Clean
npm run clean        # Clean all build artifacts
```

### Docker Build

```dockerfile
# Multi-stage build
FROM node:22 AS build
WORKDIR /app
# Install dependencies for monorepo
RUN npm install
# Build library first, then app
RUN npm run build:lib && npm run build:app

# Production stage with backend
FROM node:22-alpine
# Install backend dependencies
COPY packages/fossflow-backend /app/backend
# Copy built frontend
COPY --from=build /app/packages/fossflow-app/build /app/frontend
# Start backend server serving frontend
```

**Updates** (commit bf3a30f):
- Added backend server to Docker image
- Environment variable configuration
- Persistent volume mounting for diagrams

## Testing Structure

### Test Files Location
- Library tests: `packages/fossflow-lib/src/**/__tests__/`
- App tests: `packages/fossflow-app/src/**/*.test.tsx`
- Test utilities: `packages/fossflow-lib/src/fixtures/`

### Key Test Areas
- `/packages/fossflow-lib/src/schemas/__tests__/`: Schema validation (completed ✅)
- `/packages/fossflow-lib/src/stores/reducers/__tests__/`: State logic
  - Connector reducer tests (commit 70b1f56)
- `/packages/fossflow-lib/src/utils/__tests__/`: Utility functions

### CI/CD Testing
**Updates** (commits 70b1f56, 2bd1318):
- GitHub Actions workflow with build step
- Test coverage reporting
- Artifact retention policies

## Development Workflow

### Monorepo Development Setup

1. **Clone and Install**:
```bash
git clone https://github.com/stan-smith/FossFLOW
cd FossFLOW
npm install  # Installs dependencies for all workspaces
```

2. **Development Mode**:
```bash
# First build the library (required for initial setup)
npm run build:lib

# Start app development (includes library in dev mode)
npm run dev

# Optional: Start backend server in separate terminal
npm run dev:backend
```

3. **Making Library Changes**:
- Edit files in `packages/fossflow-lib/src/`
- Changes are immediately available in the app
- No need to rebuild or republish during development

4. **Making App Changes**:
- Edit files in `packages/fossflow-app/src/`
- Hot reload updates the browser automatically

5. **Making Backend Changes** (NEW):
- Edit `packages/fossflow-backend/server.js`
- Restart server or use nodemon for auto-reload

### Key Development Files

#### 1. Configuration (`packages/fossflow-lib/src/config.ts`)

**Key Constants**:
- `TILE_SIZE`: Base tile dimensions
- `DEFAULT_ZOOM`: Initial zoom level
- `DEFAULT_FONT_SIZE`: Text defaults
- `INITIAL_DATA`: Default model state

#### 2. Hooks Directory (`packages/fossflow-lib/src/hooks/`)

**Common Hooks**:
- `useScene.ts`: Merged scene data
- `useModelItem.ts`: Individual item access (returns `ModelItem | null`)
- `useViewItem.ts`: View item access (returns `ViewItem | null`)
- `useConnector.ts`: Connector management (returns `Connector | null`)
- `useRectangle.ts`: Rectangle access (returns `Rectangle | null`)
- `useTextBox.ts`: Text box access (returns `TextBox | null`)
- `useIcon.tsx`: Icon access (returns `Icon | null`)
- `useColor.ts`: Color access (returns `Color | null`)
- `useIsoProjection.ts`: Coordinate conversion
- `useDiagramUtils.ts`: Diagram operations
- `useHistory.ts`: Undo/redo transaction system **[NEW]**

**Important**: All item access hooks now return `null` instead of throwing when items don't exist, preventing React unmount errors.

#### 3. Interaction System (`packages/fossflow-lib/src/interaction/`)

**Main File**: `useInteractionManager.ts`

**Interaction Modes** (`/modes/`):
- `Cursor.ts`: Selection mode
- `Pan.ts`: Canvas panning
- `PlaceIcon.ts`: Icon placement
  - Updated: Nearest unoccupied tile placement (commit f5ebad6)
- `Connector.ts`: Drawing connections
  - Major update: Click/drag modes (commits d78ccdb, ea0bce0, 5ff21cc)
- `DragItems.ts`: Moving elements
- `Rectangle/`: Rectangle tools
- `TextBox.ts`: Text editing
- `Lasso.ts`: Rectangle lasso selection **[NEW]**
- `FreehandLasso.ts`: Freehand lasso selection **[NEW]**

#### 4. Utilities (`packages/fossflow-lib/src/utils/`)

**Key Utilities**:
- `CoordsUtils.ts`: Coordinate calculations
- `SizeUtils.ts`: Size computations
- `renderer.ts`: Rendering helpers
- `model.ts`: Model manipulation
- `pathfinder.ts`: Connector routing
- `connectorLabels.ts`: Label migration and positioning **[NEW]**
- `common.ts`: Common helpers
  - `getItemById`: Null-safe item access (prevents errors)

#### 5. Type System (`packages/fossflow-lib/src/types/`)

**Core Types**:
- `model.ts`: Business data types
  - Updated: `ConnectorLabel` interface (commit d5e02ea)
- `scene.ts`: Visual state types
- `ui.ts`: Interface types
  - Updated: Hotkey, pan, locale state
- `common.ts`: Shared types
- `interactions.ts`: Interaction types
- `isoflowProps.ts`: Component prop types

#### 6. Schema Validation (`packages/fossflow-lib/src/schemas/`)

**Validation Schemas**:
- `model.ts`: Model validation
- `connector.ts`: Connector validation
  - Updated: Label array validation (commit d5e02ea)
- `rectangle.ts`: Rectangle validation
- `textBox.ts`: Text box validation
- `views.ts`: View validation

## Undo/Redo System

**Added**: August 2025 (contributor: pi22by7)
**Status**: ⚠️ Implemented but has known issues under investigation

### Implementation Details

The undo/redo system uses a transaction-based approach to ensure atomic operations:

**Key Components**:
- **Transaction System**: Groups related operations together (`useHistory.ts`)
- **Dual Store Coordination**: Synchronizes model and scene stores
- **History Tracking**: Maintains separate history for each store

**Key File**: `/packages/fossflow-lib/src/hooks/useHistory.ts`

**API**:
```typescript
const { undo, redo, canUndo, canRedo, transaction } = useHistory();

// Group multiple operations
transaction(() => {
  // Multiple state changes here
  // All will be undone/redone together
});
```

**Important Considerations**:
- Operations that affect both model and scene (like placing icons) must use transactions
- Without transactions, undo/redo can cause "Invalid item in view" errors
- The system prevents partial states by grouping related changes

### Known Issues

⚠️ **Current Status**: Stan is investigating edge cases and bugs in the undo/redo system. While functional for basic operations, some complex interactions may cause issues.

### Error Handling Patterns

**Problem**: Components can try to access deleted items during React unmounting
**Solution**: Graceful null handling throughout the codebase

**Key Changes**:
1. Added `getItemById` utility that returns `null` instead of throwing
2. Updated all hooks to return `null` when items don't exist
3. Added null checks in all components using these hooks

**Affected Files**:
- `/src/utils/common.ts`: Added `getItemById` function
- All hooks in `/src/hooks/`: Updated to handle missing items
- All components: Added null checks and early returns

**Related Fixes**:
- Orphaned connector cleanup (commit d698a1a)
- Scene deletion synchronization (commits 32bcce5, 67f0dde)

## Navigation Quick Reference

### Need to modify...

**Icons?** → `/src/components/ItemControls/IconSelectionControls/`
**Custom icon import?** → `/src/components/ItemControls/IconSelectionControls/IconGrid.tsx`
**Node rendering?** → `/src/components/SceneLayers/Nodes/`
**Connector drawing?** → `/src/components/SceneLayers/Connectors/`
**Connector labels?** → `/src/components/SceneLayers/ConnectorLabels/` **[NEW]**
**Connector creation mode?** → `/src/interaction/modes/Connector.ts` + `/src/components/ConnectorSettings/` **[NEW]**
**Lasso selection?** → `/src/components/Lasso/`, `/src/components/FreehandLasso/` **[NEW]**
**Zoom behavior?** → `/src/stores/uiStateStore.tsx` + `/src/components/ZoomControls/`
**Grid display?** → `/src/components/Grid/`
**Export functionality?** → `/src/components/ExportImageDialog/`
**Color picker?** → `/src/components/ColorSelector/`
**Context menus?** → `/src/components/ContextMenu/`
**Keyboard shortcuts?** → `/src/interaction/useInteractionManager.ts` + `/src/config/hotkeys.ts` **[NEW]**
**Tool selection?** → `/src/components/ToolMenu/`
**Selection handles?** → `/src/components/TransformControlsManager/`
**Undo/Redo?** → `/src/hooks/useHistory.ts` **[NEW]**
**i18n translations?** → `/src/i18n/en-US.ts`, `/src/i18n/zh-CN.ts` **[NEW]**
**Server storage?** → `/packages/fossflow-backend/server.js` **[NEW]**
**Pan settings?** → `/src/config/panSettings.ts` + `/src/components/PanSettings/` **[NEW]**
**Tooltips?** → Various `/src/components/*Tooltip/` components **[NEW]**

### Want to understand...

**How items are positioned?** → `/src/hooks/useIsoProjection.ts`
**How connectors find paths?** → `/src/utils/pathfinder.ts`
**How state updates work?** → `/src/stores/reducers/`
**How validation works?** → `/src/schemas/`
**Available icons?** → `/src/fixtures/icons.ts`
**Default configurations?** → `/src/config.ts` + `/src/config/*` **[NEW]**
**How labels are positioned?** → `/src/utils/connectorLabels.ts` **[NEW]**
**How transactions work?** → `/src/hooks/useHistory.ts` **[NEW]**
**How i18n works?** → `/src/i18n/`, `/src/stores/localeStore.tsx` **[NEW]**
**Backend API?** → `/packages/fossflow-backend/server.js` **[NEW]**

## Key Files Reference

| Purpose | File Path | Notes |
|---------|-----------|-------|
| Main entry | `/src/Isoflow.tsx` | |
| Configuration | `/src/config.ts` | |
| Hotkey config | `/src/config/hotkeys.ts` | **[NEW]** |
| Pan settings | `/src/config/panSettings.ts` | **[NEW]** |
| Model types | `/src/types/model.ts` | Updated with ConnectorLabel |
| UI state types | `/src/types/ui.ts` | Updated with hotkeys, pan, locale |
| Model store | `/src/stores/modelStore.tsx` | With undo/redo |
| Scene store | `/src/stores/sceneStore.tsx` | With connector labels |
| UI store | `/src/stores/uiStateStore.tsx` | With new settings |
| Locale store | `/src/stores/localeStore.tsx` | **[NEW]** |
| Main renderer | `/src/components/Renderer/Renderer.tsx` | |
| UI overlay | `/src/components/UiOverlay/UiOverlay.tsx` | With tooltips |
| Interaction manager | `/src/interaction/useInteractionManager.ts` | Updated modes |
| Coordinate utils | `/src/utils/CoordsUtils.ts` | |
| Connector labels util | `/src/utils/connectorLabels.ts` | **[NEW]** |
| History/Undo hook | `/src/hooks/useHistory.ts` | **[NEW]** |
| Public API hook | `/src/hooks/useIsoflow.ts` | |
| Backend server | `/packages/fossflow-backend/server.js` | **[NEW]** |
| App i18n config | `/packages/fossflow-app/src/i18n.ts` | **[NEW]** |
| English translations | `/src/i18n/en-US.ts` | **[NEW]** |
| Chinese translations | `/src/i18n/zh-CN.ts` | **[NEW]** |

## Recent Major Changes Summary

### August 2025
- **Backend Storage**: Express server for persistent diagrams (bf3a30f)
- **i18n Support**: English + Chinese translations (2145981, 5d6cf0e)
- **Hotkey System**: Configurable keyboard shortcuts (ef258df)
- **Pan Controls**: Advanced pan configuration (83c9b3a)
- **Connector Labels**: Multiple labels per connector (d5e02ea)
- **Click Connector Mode**: Alternative to drag mode (5ff21cc, ea0bce0)
- **Custom Icons**: Import with scaling slider (dd80e86, 108b5e2)
- **Error Boundary**: Graceful error handling (179b512)

### September 2025
- **Lasso Tools**: Rectangle and freehand selection (fec8878, 96047f3)
- **Tooltip System**: Contextual hints for all tools (9d9a0dd, a2a47b4, 5df41f9)
- **Icon Panel**: Improved small screen layout (77231c9)
- **Quick Icon Selector**: Faster icon selection workflow (8576e30)
- **Orphaned Connectors**: Automatic cleanup (d698a1a)

### October 2025
- **Connector Label Overhaul**: Up to 256 labels, per-line support (2a53437)
- **Expanded Labels**: Default expanded in exports (3cbcada)
- **Zoom to Pan**: Improved zoom behavior (d3fdfea)
- **Race Condition Fixes**: Diagram loading improvements (4e13033)
- **Reroute Tooltips**: Connector manipulation guidance (d5db93c)

---

This encyclopedia serves as a comprehensive guide to the FossFLOW codebase. Use the table of contents and quick references to efficiently navigate to the areas you need to modify or understand.

**For Contributors**: See [CONTRIBUTORS.md](./CONTRIBUTORS.md) for contribution guidelines and [FOSSFLOW_TODO.md](./FOSSFLOW_TODO.md) for current issues and roadmap.


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2023 Mark Mankarious

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# FossFLOW - Isometric Diagramming Tool <img width="30" height="30" alt="fossflow" src="https://github.com/user-attachments/assets/56d78887-601c-4336-ab87-76f8ee4cde96" />

<p align="center">
 <a href="README.md">English</a> | <a href="docs/README.cn.md">简体中文</a> | <a href="docs/README.es.md">Español</a> | <a href="docs/README.pt.md">Português</a> | <a href="docs/README.fr.md">Français</a> | <a href="docs/README.hi.md">हिन्दी</a> | <a href="docs/README.bn.md">বাংলা</a> | <a href="docs/README.ru.md">Русский</a> | <a href="docs/README.id.md">Bahasa Indonesia</a> | <a href="docs/README.de.md">Deutsch</a>
</p>


<p align="center">
<a href="https://trendshift.io/repositories/15118" target="_blank"><img src="https://trendshift.io/api/badge/repositories/15118" alt="stan-smith%2FFossFLOW | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
</p>

<b>Hey!</b> Stan here, if you've used FossFLOW and it's helped you, <b>I'd really appreciate if you could donate something small :)</b> I work full time, and finding the time to work on this project is challenging enough.
If you've had a feature that I've implemented for you, or fixed a bug it'd be great if you could :) if not, that's not a problem, this software will always remain free!


<b>Also!</b> If you haven't yet, please check out the underlying library this is built on by <a href="https://github.com/markmanx/isoflow">@markmanx</a> I truly stand on the shoulders of a giant here 🫡

[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/P5P61KBXA3)

<a href="https://www.buymeacoffee.com/stan.smith" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>

Thanks,

-Stan

## Try it online
<p align="center">
Go to  <b> --> https://stan-smith.github.io/FossFLOW/ <-- </b>
</p>
<p align="center">

 <a href="https://github.com/stan-smith/SlingShot">
  Check out my latest project: <b>SlingShot</b> - Dead easy video streaming over QUIC
 </a>
</p>

------------------------------------------------------------------------------------------------------------------------------
FossFLOW is a powerful, open-source Progressive Web App (PWA) for creating beautiful isometric diagrams. Built with React and the <a href="https://github.com/markmanx/isoflow">Isoflow</a> (Now forked and published to NPM as fossflow) library, it runs entirely in your browser with offline support.

![Screenshot_20250630_160954](https://github.com/user-attachments/assets/e7f254ad-625f-4b8a-8efc-5293b5be9d55)

- **🤝 [CONTRIBUTING.md](https://github.com/stan-smith/FossFLOW/blob/master/CONTRIBUTING.md)** - How to contribute to the project.

## 🐳 Quick Deploy with Docker

```bash
# Using Docker Compose (recommended - includes persistent storage)
docker compose up

# Or run directly from Docker Hub with persistent storage
docker run -p 80:80 -v $(pwd)/diagrams:/data/diagrams stnsmith/fossflow:latest
```

Server storage is enabled by default in Docker. Your diagrams will be saved to `./diagrams` on the host.

To disable server storage, set `ENABLE_SERVER_STORAGE=false`:
```bash
docker run -p 80:80 -e ENABLE_SERVER_STORAGE=false stnsmith/fossflow:latest
```

### HTTP Basic Authentication (Optional)

Protect your FossFLOW instance with HTTP Basic Auth:

```bash
# With Docker Compose
HTTP_AUTH_USER=admin HTTP_AUTH_PASSWORD=secret docker compose up

# Or with docker run
docker run -p 80:80 \
  -e HTTP_AUTH_USER=admin \
  -e HTTP_AUTH_PASSWORD=secret \
  stnsmith/fossflow:latest
```

> **Note**: Both variables must be set to enable authentication. If either is empty, the app is accessible without login.

## Quick Start (Local Development)

```bash
# Clone the repository
git clone https://github.com/stan-smith/FossFLOW
cd FossFLOW

# Install dependencies
npm install

# Build the library (required first time)
npm run build:lib

# Start development server
npm run dev
```

Open [http://localhost:3000](http://localhost:3000) in your browser.

## Monorepo Structure

This is a monorepo containing two packages:

- `packages/fossflow-lib` - React component library for drawing network diagrams (built with Webpack)
- `packages/fossflow-app` - Progressive Web App which wraps the lib and presents it (built with RSBuild)

### Development Commands

```bash
# Development
npm run dev          # Start app development server
npm run dev:lib      # Watch mode for library development

# Building
npm run build        # Build both library and app
npm run build:lib    # Build library only
npm run build:app    # Build app only

# Testing & Linting
npm test             # Run unit tests
npm run lint         # Check for linting errors

# E2E Tests (Selenium)
cd e2e-tests
./run-tests.sh       # Run end-to-end tests (requires Docker & Python)

# Publishing
npm run publish:lib  # Publish library to npm
```

## How to Use

### Creating Diagrams

1. **Add Items**:
   - Press the "+" button on the top right menu, the library of components will appear on the left
   - Drag and drop components from the library onto the canvas
   - Or right-click on the grid and select "Add node"

2. **Connect Items**: 
   - Select the Connector tool (press 'C' or click connector icon)
   - **Click mode** (default): Click first node, then click second node
   - **Drag mode** (optional): Click and drag from first to second node
   - Switch modes in Settings → Connectors tab

3. **Save Your Work**:
   - **Quick Save** - Saves to browser session
   - **Export** - Download as JSON file
   - **Import** - Load from JSON file

### Storage Options

- **Session Storage**: Temporary saves cleared when browser closes
- **Export/Import**: Permanent storage as JSON files
- **Auto-Save**: Automatically saves changes every 5 seconds to session

## Contributing

We welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.

## Documentation

- [FOSSFLOW_ENCYCLOPEDIA.md](FOSSFLOW_ENCYCLOPEDIA.md) - Comprehensive guide to the codebase
- [CONTRIBUTING.md](CONTRIBUTING.md) - Contributing guidelines

## License

MIT


================================================
FILE: compose.dev.yml
================================================
services:
  fossflow:
    build: .
    ports:
      - "3000:80"
      - "3001:3001"
    environment:
      - NODE_ENV=development
      - ENABLE_SERVER_STORAGE=true
      - STORAGE_PATH=/data/diagrams
      - ENABLE_GIT_BACKUP=false
      - HTTP_AUTH_USER=${HTTP_AUTH_USER:-}
      - HTTP_AUTH_PASSWORD=${HTTP_AUTH_PASSWORD:-}
    volumes:
      - ./diagrams:/data/diagrams


================================================
FILE: compose.yml
================================================
services:
  fossflow:
    image: stnsmith/fossflow:latest
    pull_policy: always
    ports:
      - 80:80
    environment:
      - NODE_ENV=production
      - ENABLE_SERVER_STORAGE=${ENABLE_SERVER_STORAGE:-true}
      - STORAGE_PATH=/data/diagrams
      - ENABLE_GIT_BACKUP=${ENABLE_GIT_BACKUP:-false}
      - HTTP_AUTH_USER=${HTTP_AUTH_USER:-}
      - HTTP_AUTH_PASSWORD=${HTTP_AUTH_PASSWORD:-}
    volumes:
      - ./diagrams:/data/diagrams


================================================
FILE: docker-entrypoint.sh
================================================
#!/bin/sh

# Start Node.js backend if server storage is enabled
if [ "$ENABLE_SERVER_STORAGE" = "true" ]; then
    echo "Starting FossFLOW backend server..."
    cd /app/packages/fossflow-backend
    npm install --production
    node server.js &
    echo "Backend server started"
else
    echo "Server storage disabled, backend not started"
fi

# Start nginx

# Configure HTTP Basic Auth
touch /etc/nginx/.htpasswd
if [ -n "$HTTP_AUTH_USER" ] && [ -n "$HTTP_AUTH_PASSWORD" ]; then
    echo "Setup HTTP Basic Auth..."
    echo "$HTTP_AUTH_USER:$(printf '%s' "$HTTP_AUTH_PASSWORD" | openssl passwd -bcrypt -stdin)" > /etc/nginx/.htpasswd
    sed -i 's/AUTH_BASIC_SETTING/"Restricted"/g' /etc/nginx/http.d/default.conf
else
    echo "No (optional) HTTP Basic Auth configured"
    sed -i 's/AUTH_BASIC_SETTING/off/g' /etc/nginx/http.d/default.conf
fi
echo "Starting nginx..."
nginx -g "daemon off;"

================================================
FILE: docs/README.bn.md
================================================
# FossFLOW - আইসোমেট্রিক ডায়াগ্রাম টুল <img width="30" height="30" alt="fossflow" src="https://github.com/user-attachments/assets/56d78887-601c-4336-ab87-76f8ee4cde96" />

<p align="center">
 <a href="../README.md">English</a> | <a href="README.cn.md">简体中文</a> | <a href="README.es.md">Español</a> | <a href="README.pt.md">Português</a> | <a href="README.fr.md">Français</a> | <a href="README.hi.md">हिन्दी</a> | <a href="README.bn.md">বাংলা</a> | <a href="README.ru.md">Русский</a> | <a href="README.id.md">Bahasa Indonesia</a> | <a href="README.de.md">Deutsch</a>
</p>

<b>হ্যালো!</b> আমি Stan, যদি আপনি FossFLOW ব্যবহার করে থাকেন এবং এটি আপনাকে সাহায্য করেছে, <b>আমি সত্যিই প্রশংসা করব যদি আপনি কিছু ছোট দান করতে পারেন :)</b> আমি পূর্ণকালীন কাজ করি, এবং এই প্রকল্পে কাজ করার সময় খুঁজে পাওয়াটা যথেষ্ট চ্যালেঞ্জিং।
যদি আমি আপনার জন্য একটি ফিচার বাস্তবায়ন করেছি বা একটি বাগ ঠিক করেছি তবে এটি দুর্দান্ত হবে যদি আপনি পারেন :) যদি না হয়, তাতে কোনো সমস্যা নেই, এই সফটওয়্যারটি সর্বদা বিনামূল্যে থাকবে!


<b>এছাড়াও!</b> যদি আপনি এখনও না করে থাকেন, তবে <a href="https://github.com/markmanx/isoflow">@markmanx</a> দ্বারা নির্মিত অন্তর্নিহিত লাইব্রেরিটি দেখুন যার উপর এটি তৈরি। আমি সত্যিই এখানে একজন দৈত্যের কাঁধে দাঁড়িয়ে আছি 🫡

[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/P5P61KBXA3)

<img width="30" height="30" alt="image" src="https://github.com/user-attachments/assets/dc6ec9ca-48d7-4047-94cf-5c4f7ed63b84" /> <b> https://buymeacoffee.com/stan.smith </b>


ধন্যবাদ,

-Stan

## এটি অনলাইনে চেষ্টা করুন

যান  <b> --> https://stan-smith.github.io/FossFLOW/ <-- </b>


------------------------------------------------------------------------------------------------------------------------------
FossFLOW হল সুন্দর আইসোমেট্রিক ডায়াগ্রাম তৈরি করার জন্য একটি শক্তিশালী, ওপেন-সোর্স প্রগ্রেসিভ ওয়েব অ্যাপ (PWA)। React এবং <a href="https://github.com/markmanx/isoflow">Isoflow</a> লাইব্রেরি দিয়ে তৈরি (এখন ফর্ক করা এবং NPM-এ fossflow হিসেবে প্রকাশিত), এটি অফলাইন সাপোর্ট সহ সম্পূর্ণরূপে আপনার ব্রাউজারে চলে।

![Screenshot_20250630_160954](https://github.com/user-attachments/assets/e7f254ad-625f-4b8a-8efc-5293b5be9d55)

- **🤝 [CONTRIBUTORS.md](https://github.com/stan-smith/FossFLOW/blob/master/CONTRIBUTORS.md)** - প্রকল্পে কীভাবে অবদান রাখবেন।

## সাম্প্রতিক আপডেট (অক্টোবর 2025)

### বহুভাষিক সমর্থন
- **8টি ভাষা সমর্থিত** - ইংরেজি, চীনা (সরলীকৃত), স্প্যানিশ, পর্তুগিজ (ব্রাজিলিয়ান), ফরাসি, হিন্দি, বাংলা এবং রাশিয়ানে সম্পূর্ণ ইন্টারফেস অনুবাদ
- **ভাষা নির্বাচক** - অ্যাপ হেডারে ব্যবহার করা সহজ ভাষা সুইচার
- **সম্পূর্ণ অনুবাদ** - সমস্ত মেনু, ডায়ালগ, সেটিংস, টুলটিপ এবং সাহায্য বিষয়বস্তু অনুবাদিত
- **লোকেল-সচেতন** - স্বয়ংক্রিয়ভাবে আপনার ভাষা পছন্দ সনাক্ত করে এবং মনে রাখে

### উন্নত সংযোজক টুল
- **ক্লিক-ভিত্তিক তৈরি** - নতুন ডিফল্ট মোড: প্রথম নোডে ক্লিক করুন, তারপর সংযোগ করতে দ্বিতীয় নোডে ক্লিক করুন
- **ড্র্যাগ মোড বিকল্প** - মূল ড্র্যাগ-এন্ড-ড্রপ এখনও সেটিংসের মাধ্যমে উপলব্ধ
- **মোড নির্বাচন** - সেটিংস → সংযোজক ট্যাবে ক্লিক এবং ড্র্যাগ মোডের মধ্যে স্যুইচ করুন
- **উন্নত নির্ভরযোগ্যতা** - ক্লিক মোড আরও পূর্বাভাসযোগ্য সংযোগ তৈরি প্রদান করে

### কাস্টম আইকন আমদানি
- **আপনার নিজস্ব আইকন আমদানি করুন** - আপনার ডায়াগ্রামে ব্যবহার করতে কাস্টম আইকন (PNG, JPG, SVG) আপলোড করুন
- **স্বয়ংক্রিয় স্কেলিং** - পেশাদার চেহারার জন্য আইকনগুলি স্বয়ংক্রিয়ভাবে সামঞ্জস্যপূর্ণ আকারে স্কেল করা হয়
- **আইসোমেট্রিক/ফ্ল্যাট টগল** - আমদানি করা আইকনগুলি 3D আইসোমেট্রিক বা ফ্ল্যাট 2D হিসাবে প্রদর্শিত হবে কিনা তা চয়ন করুন
- **স্মার্ট অধ্যবসায়** - কাস্টম আইকনগুলি ডায়াগ্রামের সাথে সংরক্ষিত এবং সমস্ত স্টোরেজ পদ্ধতিতে কাজ করে
- **আইকন সম্পদ** - বিনামূল্যে আইকন খুঁজুন:
  - [Iconify Icon Sets](https://icon-sets.iconify.design/) - হাজার হাজার বিনামূল্যে SVG আইকন
  - [Flaticon Isometric Icons](https://www.flaticon.com/free-icons/isometric) - উচ্চ মানের আইসোমেট্রিক আইকন প্যাক

### সার্ভার স্টোরেজ সমর্থন
- **স্থায়ী স্টোরেজ** - সার্ভার ফাইল সিস্টেমে সংরক্ষিত ডায়াগ্রাম, ব্রাউজার সেশনে টিকে থাকে
- **মাল্টি-ডিভাইস অ্যাক্সেস** - Docker ডিপ্লয়মেন্ট ব্যবহার করার সময় যেকোনো ডিভাইস থেকে আপনার ডায়াগ্রাম অ্যাক্সেস করুন
- **স্বয়ংক্রিয় সনাক্তকরণ** - উপলব্ধ হলে UI স্বয়ংক্রিয়ভাবে সার্ভার স্টোরেজ দেখায়
- **ওভাররাইট সুরক্ষা** - ডুপ্লিকেট নাম দিয়ে সংরক্ষণ করার সময় নিশ্চিতকরণ ডায়ালগ
- **Docker একীকরণ** - Docker ডিপ্লয়মেন্টে ডিফল্টভাবে সার্ভার স্টোরেজ সক্রিয়

### উন্নত ইন্টারঅ্যাকশন বৈশিষ্ট্য
- **কনফিগারযোগ্য হটকি** - ভিজ্যুয়াল সূচক সহ টুল নির্বাচনের জন্য তিনটি প্রোফাইল (QWERTY, SMNRCT, কোনোটিই নয়)
- **উন্নত প্যান কন্ট্রোল** - খালি এলাকা ড্র্যাগ, মিডল/রাইট ক্লিক, মডিফায়ার কী (Ctrl/Alt) এবং কীবোর্ড নেভিগেশন (Arrow/WASD/IJKL) সহ একাধিক প্যান পদ্ধতি
- **সংযোজক তীর টগল করুন** - পৃথক সংযোজকগুলিতে তীরগুলি দেখানো/লুকানোর বিকল্প
- **স্থায়ী টুল নির্বাচন** - সংযোগ তৈরি করার পরে সংযোজক টুল সক্রিয় থাকে
- **সেটিংস ডায়ালগ** - হটকি এবং প্যান কন্ট্রোলের জন্য কেন্দ্রীভূত কনফিগারেশন

### Docker এবং CI/CD উন্নতি
- **স্বয়ংক্রিয় Docker বিল্ড** - কমিটে স্বয়ংক্রিয় Docker Hub ডিপ্লয়মেন্টের জন্য GitHub Actions ওয়ার্কফ্লো
- **মাল্টি-আর্কিটেকচার সমর্থন** - `linux/amd64` এবং `linux/arm64` উভয়ের জন্য Docker ইমেজ
- **প্রি-বিল্ট ইমেজ** - `stnsmith/fossflow:latest`-এ উপলব্ধ

### Monorepo আর্কিটেকচার
- লাইব্রেরি এবং অ্যাপ্লিকেশন উভয়ের জন্য **একক রিপোজিটরি**
- সুসংগত নির্ভরতা ব্যবস্থাপনার জন্য **NPM Workspaces**
- রুটে `npm run build` দিয়ে **একীভূত বিল্ড প্রক্রিয়া**

### UI সংশোধন
- Quill সম্পাদক টুলবার আইকন প্রদর্শন সমস্যা সংশোধন করা হয়েছে
- প্রসঙ্গ মেনুতে React কী সতর্কতা সমাধান করা হয়েছে
- markdown সম্পাদক স্টাইলিং উন্নত করা হয়েছে

## বৈশিষ্ট্য

- 🎨 **আইসোমেট্রিক ডায়াগ্রামিং** - চমৎকার 3D-স্টাইল প্রযুক্তিগত ডায়াগ্রাম তৈরি করুন
- 💾 **অটো-সেভ** - আপনার কাজ প্রতি 5 সেকেন্ডে স্বয়ংক্রিয়ভাবে সংরক্ষিত হয়
- 📱 **PWA সমর্থন** - Mac এবং Linux-এ নেটিভ অ্যাপ হিসাবে ইনস্টল করুন
- 🔒 **গোপনীয়তা-প্রথম** - সমস্ত ডেটা আপনার ব্রাউজারে স্থানীয়ভাবে সংরক্ষিত
- 📤 **আমদানি/রপ্তানি** - JSON ফাইল হিসাবে ডায়াগ্রাম শেয়ার করুন
- 🎯 **সেশন স্টোরেজ** - ডায়ালগ ছাড়াই দ্রুত সংরক্ষণ
- 🌐 **অফলাইন সমর্থন** - ইন্টারনেট সংযোগ ছাড়াই কাজ করুন
- 🗄️ **সার্ভার স্টোরেজ** - Docker ব্যবহার করার সময় ঐচ্ছিক স্থায়ী স্টোরেজ (ডিফল্টভাবে সক্রিয়)
- 🌍 **বহুভাষিক** - 8টি ভাষার জন্য সম্পূর্ণ সমর্থন: English, 简体中文, Español, Português, Français, हिन्दी, বাংলা, Русский


## 🐳 Docker দিয়ে দ্রুত ডিপ্লয়

```bash
# Docker Compose ব্যবহার করা (প্রস্তাবিত - স্থায়ী স্টোরেজ অন্তর্ভুক্ত)
docker compose up

# অথবা স্থায়ী স্টোরেজ সহ Docker Hub থেকে সরাসরি চালান
docker run -p 80:80 -v $(pwd)/diagrams:/data/diagrams stnsmith/fossflow:latest
```

Docker-এ সার্ভার স্টোরেজ ডিফল্টভাবে সক্রিয়। আপনার ডায়াগ্রামগুলি হোস্টে `./diagrams`-এ সংরক্ষিত হবে।

সার্ভার স্টোরেজ নিষ্ক্রিয় করতে, `ENABLE_SERVER_STORAGE=false` সেট করুন:
```bash
docker run -p 80:80 -e ENABLE_SERVER_STORAGE=false stnsmith/fossflow:latest
```

## দ্রুত শুরু (স্থানীয় উন্নয়ন)

```bash
# রিপোজিটরি ক্লোন করুন
git clone https://github.com/stan-smith/FossFLOW
cd FossFLOW

# নির্ভরতা ইনস্টল করুন
npm install

# লাইব্রেরি তৈরি করুন (প্রথমবার প্রয়োজনীয়)
npm run build:lib

# উন্নয়ন সার্ভার শুরু করুন
npm run dev
```

আপনার ব্রাউজারে [http://localhost:3000](http://localhost:3000) খুলুন।

## Monorepo কাঠামো

এটি দুটি প্যাকেজ সম্বলিত একটি monorepo:

- `packages/fossflow-lib` - নেটওয়ার্ক ডায়াগ্রাম আঁকার জন্য React কম্পোনেন্ট লাইব্রেরি (Webpack দিয়ে তৈরি)
- `packages/fossflow-app` - আইসোমেট্রিক ডায়াগ্রাম তৈরির জন্য Progressive Web App (RSBuild দিয়ে তৈরি)

### উন্নয়ন কমান্ড

```bash
# উন্নয়ন
npm run dev          # অ্যাপ উন্নয়ন সার্ভার শুরু করুন
npm run dev:lib      # লাইব্রেরি উন্নয়নের জন্য ওয়াচ মোড

# বিল্ডিং
npm run build        # লাইব্রেরি এবং অ্যাপ উভয়ই তৈরি করুন
npm run build:lib    # শুধুমাত্র লাইব্রেরি তৈরি করুন
npm run build:app    # শুধুমাত্র অ্যাপ তৈরি করুন

# পরীক্ষা এবং লিন্টিং
npm test             # ইউনিট টেস্ট চালান
npm run lint         # লিন্টিং ত্রুটি পরীক্ষা করুন

# E2E টেস্ট (Selenium)
cd e2e-tests
./run-tests.sh       # এন্ড-টু-এন্ড টেস্ট চালান (Docker এবং Python প্রয়োজন)

# প্রকাশনা
npm run publish:lib  # npm-এ লাইব্রেরি প্রকাশ করুন
```

## কীভাবে ব্যবহার করবেন

### ডায়াগ্রাম তৈরি করা

1. **আইটেম যোগ করুন**:
   - উপরের ডানদিকের মেনুতে "+" বোতাম টিপুন, কম্পোনেন্ট লাইব্রেরি বাম দিকে প্রদর্শিত হবে
   - লাইব্রেরি থেকে ক্যানভাসে কম্পোনেন্ট ড্র্যাগ এবং ড্রপ করুন
   - অথবা গ্রিডে রাইট-ক্লিক করুন এবং "নোড যোগ করুন" নির্বাচন করুন

2. **আইটেম সংযুক্ত করুন**:
   - সংযোজক টুল নির্বাচন করুন ('C' টিপুন বা সংযোজক আইকনে ক্লিক করুন)
   - **ক্লিক মোড** (ডিফল্ট): প্রথম নোডে ক্লিক করুন, তারপর দ্বিতীয় নোডে ক্লিক করুন
   - **ড্র্যাগ মোড** (ঐচ্ছিক): প্রথম নোড থেকে দ্বিতীয় নোডে ক্লিক করুন এবং ড্র্যাগ করুন
   - সেটিংস → সংযোজক ট্যাবে মোড স্যুইচ করুন

3. **আপনার কাজ সংরক্ষণ করুন**:
   - **দ্রুত সংরক্ষণ** - ব্রাউজার সেশনে সংরক্ষণ করে
   - **রপ্তানি** - JSON ফাইল হিসাবে ডাউনলোড করুন
   - **আমদানি** - JSON ফাইল থেকে লোড করুন

### স্টোরেজ বিকল্প

- **সেশন স্টোরেজ**: ব্রাউজার বন্ধ হলে অস্থায়ী সংরক্ষণগুলি মুছে যায়
- **রপ্তানি/আমদানি**: JSON ফাইল হিসাবে স্থায়ী স্টোরেজ
- **অটো-সেভ**: সেশনে প্রতি 5 সেকেন্ডে পরিবর্তনগুলি স্বয়ংক্রিয়ভাবে সংরক্ষণ করে

## অবদান রাখা

আমরা অবদানকে স্বাগত জানাই! দয়া করে নির্দেশিকার জন্য [CONTRIBUTORS.md](../CONTRIBUTORS.md) দেখুন।

## ডকুমেন্টেশন

- [FOSSFLOW_ENCYCLOPEDIA.md](../FOSSFLOW_ENCYCLOPEDIA.md) - কোডবেসের জন্য ব্যাপক গাইড
- [CONTRIBUTORS.md](../CONTRIBUTORS.md) - অবদানের নির্দেশিকা

## লাইসেন্স

MIT


================================================
FILE: docs/README.cn.md
================================================
# FossFLOW - 等距图表工具 <img width="30" height="30" alt="fossflow" src="https://github.com/user-attachments/assets/56d78887-601c-4336-ab87-76f8ee4cde96" />

<p align="center">
 <a href="../README.md">English</a> | <a href="README.cn.md">简体中文</a> | <a href="README.es.md">Español</a> | <a href="README.pt.md">Português</a> | <a href="README.fr.md">Français</a> | <a href="README.hi.md">हिन्दी</a> | <a href="README.bn.md">বাংলা</a> | <a href="README.ru.md">Русский</a> | <a href="README.id.md">Bahasa Indonesia</a> | <a href="README.de.md">Deutsch</a>
</p>

<b>嗨!</b> 我是 Stan,如果您使用过 FossFLOW 并觉得它对您有帮助,<b>我会非常感激您能捐助一点点 :)</b> 我全职工作,抽时间来维护这个项目已经很不容易了。
如果我为您实现了某个功能,或者修复了某个 bug,能得到您的支持将非常棒 :) 如果不能,也没关系,这个软件将永远免费!

[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/P5P61KBXA3)

<img width="30" height="30" alt="image" src="https://github.com/user-attachments/assets/dc6ec9ca-48d7-4047-94cf-5c4f7ed63b84" /> <b> https://buymeacoffee.com/stan.smith </b>

感谢,

-Stan


------------------------------------------------------------------------------------------------------------------------------
FossFLOW 是一款功能强大的、开源的渐进式 Web 应用(PWA),专为创建精美的等距图表而设计。它基于 React 和 Isoflow(现已 fork 并以 fossflow 名称发布到 NPM)库构建,完全在浏览器中运行,并支持离线使用。

![Screenshot_20250630_160954](https://github.com/user-attachments/assets/e7f254ad-625f-4b8a-8efc-5293b5be9d55)

- **🤝 [CONTRIBUTORS.md](https://github.com/stan-smith/FossFLOW/blob/master/CONTRIBUTORS.md)** - 如何为项目做出贡献。

## 功能

- 🎨 **等距图表** - 创建令人惊叹的 3D 风格技术图表
- 💾 **自动保存** - 您的工作每 5 秒自动保存一次
- 📱 **PWA 支持** - 在 Mac 和 Linux 上安装为原生应用
- 🔒 **隐私优先** - 所有数据都存储在您的浏览器中
- 📤 **导入/导出** - 以 JSON 文件形式分享图表
- 🎯 **会话存储** - 快速保存,无需对话框
- 🌐 **离线支持** - 无需网络连接即可工作

## 在线试用

访问 https://stan-smith.github.io/FossFLOW/

## 快速开始 (本地开发)

```bash
# 克隆仓库
git clone https://github.com/stan-smith/FossFLOW
cd FossFLOW

# 安装依赖
npm install

# 启动开发服务器
npm start
```

在浏览器中打开 [http://localhost:3000](http://localhost:3000)。

## 使用方法

### 创建图表

1. **添加项目**:
   - 按下右上角菜单的 "+" 按钮,组件库将出现在左侧。从库中拖放组件到画布上。
   - 或者右键点击网格并选择 "Add node",然后点击新创建的节点并从左侧菜单自定义它。
2. **连接项目**:使用连接器显示组件之间的关系。
3. **自定义**:更改项目的颜色、标签和属性。
4. **导航**:平移和缩放以处理不同区域。

### 保存您的工作

- **自动保存**:图表每 5 秒自动保存到浏览器存储。
- **快速保存**:点击 "Quick Save (Session)" 进行即时保存,无需弹窗。
- **另存为**:使用 "Save New" 创建具有不同名称的副本。

### 管理图表

- **加载**:点击 "Load" 查看所有已保存的图表。
- **导入**:从他人分享的 JSON 文件加载图表。
- **导出**:将图表下载为 JSON 文件以分享或备份。
- **存储**:使用 "Storage Manager" 管理浏览器存储空间。

### 键盘快捷键

- `Delete` - 删除选中项
- 鼠标滚轮 - 放大/缩小
- 点击并拖动 - 平移画布
- ***新增*** Ctrl+Z 撤销,Ctrl+Y 重做

## 生产环境构建

```bash
# 创建优化后的生产环境构建
npm run build

# 本地运行生产环境构建
npx serve -s build
```

`build` 文件夹包含所有部署所需的文件。

如果需要将应用部署到自定义路径(例如非根路径),请使用以下命令:
```bash
# 为指定路径创建优化后的生产环境构建
PUBLIC_URL="https://mydomain.tld/path/to/app" npm run build
```
这会将定义的 `PUBLIC_URL` 添加为所有静态文件链接的前缀。

## 部署

### 静态托管

将 `build` 文件夹部署到任何静态托管服务:
- GitHub Pages
- Netlify
- Vercel
- AWS S3
- 任何 Web 服务器

### 重要说明

1. **需要 HTTPS**:PWA 功能需要 HTTPS(localhost 除外)
2. **浏览器存储**:图表保存在浏览器的 localStorage 中(约 5-10MB 限制)
3. **备份**:定期将重要图表导出为 JSON 文件

## 浏览器支持

- Chrome/Edge(推荐)✅
- Firefox ✅
- Safari ✅
- 支持 PWA 的移动浏览器 ✅

## 问题排查

### 存储已满
- 使用存储管理器释放空间
- 导出并删除旧图表
- 清除浏览器数据(最后手段 - 会删除所有图表)

### 无法安装 PWA
- 确保使用 HTTPS
- 尝试使用 Chrome 或 Edge 浏览器
- 检查是否已安装

### 图表丢失
- 检查浏览器的 localStorage
- 查找自动保存的版本
- 始终导出重要工作

## 技术栈

- **React** - UI 框架
- **TypeScript** - 类型安全
- **Isoflow** - 等距图表引擎
- **PWA** - 离线优先的 Web 应用

## 贡献

欢迎贡献!请随时提交 Pull Request。

## 许可证

Isoflow 使用 MIT 许可证发布。

FossFLOW 使用 Unlicense 许可证发布,您可以随意使用。

## 鸣谢

基于 [Isoflow](https://github.com/markmanx/isoflow) 库构建。

x0z.co

================================================
FILE: docs/README.de.md
================================================
# FossFLOW - Isometrisches Diagramm-Werkzeug <img width="30" height="30" alt="fossflow" src="https://github.com/user-attachments/assets/56d78887-601c-4336-ab87-76f8ee4cde96" />

<p align="center">
 <a href="../README.md">English</a> | <a href="README.cn.md">简体中文</a> | <a href="README.es.md">Español</a> | <a href="README.pt.md">Português</a> | <a href="README.fr.md">Français</a> | <a href="README.hi.md">हिन्दी</a> | <a href="README.bn.md">বাংলা</a> | <a href="README.ru.md">Русский</a> | <a href="README.id.md">Bahasa Indonesia</a> | <a href="README.de.md">Deutsch</a>
</p>

<b>Hey!</b> Hier ist Stan. Wenn du FossFLOW benutzt hast und es dir geholfen hat, <b>würde ich mich sehr über eine kleine Spende freuen :)</b> Ich arbeite Vollzeit, und Zeit für dieses Projekt zu finden ist schon schwer genug.
Wenn ich ein Feature für dich implementiert oder einen Bug behoben habe, wäre es toll, wenn du etwas spenden könntest :) Falls nicht, ist das kein Problem – diese Software bleibt immer kostenlos!

<b>Außerdem!</b> Falls noch nicht geschehen, schau dir bitte die zugrunde liegende Bibliothek an, auf der dies aufbaut, von <a href="https://github.com/markmanx/isoflow">@markmanx</a>. Ich stehe hier wirklich auf den Schultern eines Riesen 🫡

[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/P5P61KBXA3)

<a href="https://www.buymeacoffee.com/stan.smith" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>

Danke,

-Stan

## Online ausprobieren

Gehe zu <b> --> https://stan-smith.github.io/FossFLOW/ <-- </b>


------------------------------------------------------------------------------------------------------------------------------
FossFLOW ist eine leistungsstarke, quelloffene Progressive Web App (PWA) zum Erstellen schöner isometrischer Diagramme. Gebaut mit React und der <a href="https://github.com/markmanx/isoflow">Isoflow</a>-Bibliothek (jetzt geforkt und auf NPM als fossflow veröffentlicht), läuft sie vollständig in deinem Browser mit Offline-Unterstützung.

![Screenshot_20250630_160954](https://github.com/user-attachments/assets/e7f254ad-625f-4b8a-8efc-5293b5be9d55)

- **🤝 [CONTRIBUTING.md](https://github.com/stan-smith/FossFLOW/blob/master/CONTRIBUTING.md)** - Wie du zum Projekt beitragen kannst.

## 🐳 Schnelle Bereitstellung mit Docker

```bash
# Mit Docker Compose (empfohlen - beinhaltet persistenten Speicher)
docker compose up

# Oder direkt von Docker Hub mit persistentem Speicher ausführen
docker run -p 80:80 -v $(pwd)/diagrams:/data/diagrams stnsmith/fossflow:latest
```

Server-Speicher ist in Docker standardmäßig aktiviert. Deine Diagramme werden in `./diagrams` auf dem Host gespeichert.

Um den Server-Speicher zu deaktivieren, setze `ENABLE_SERVER_STORAGE=false`:
```bash
docker run -p 80:80 -e ENABLE_SERVER_STORAGE=false stnsmith/fossflow:latest
```

## Schnellstart (Lokale Entwicklung)

```bash
# Repository klonen
git clone https://github.com/stan-smith/FossFLOW
cd FossFLOW

# Abhängigkeiten installieren
npm install

# Bibliothek bauen (beim ersten Mal erforderlich)
npm run build:lib

# Entwicklungsserver starten
npm run dev
```

Öffne [http://localhost:3000](http://localhost:3000) in deinem Browser.

## Monorepo-Struktur

Dies ist ein Monorepo mit zwei Paketen:

- `packages/fossflow-lib` - React-Komponentenbibliothek zum Zeichnen von Netzwerkdiagrammen (gebaut mit Webpack)
- `packages/fossflow-app` - Progressive Web App, die die Bibliothek umhüllt und präsentiert (gebaut mit RSBuild)

### Entwicklungsbefehle

```bash
# Entwicklung
npm run dev          # App-Entwicklungsserver starten
npm run dev:lib      # Watch-Modus für Bibliotheksentwicklung

# Bauen
npm run build        # Bibliothek und App bauen
npm run build:lib    # Nur Bibliothek bauen
npm run build:app    # Nur App bauen

# Testen & Linting
npm test             # Unit-Tests ausführen
npm run lint         # Auf Linting-Fehler prüfen

# E2E-Tests (Selenium)
cd e2e-tests
./run-tests.sh       # End-to-End-Tests ausführen (erfordert Docker & Python)

# Veröffentlichen
npm run publish:lib  # Bibliothek auf npm veröffentlichen
```

## Verwendung

### Diagramme erstellen

1. **Elemente hinzufügen**:
   - Drücke die "+"-Taste im Menü oben rechts, die Komponentenbibliothek erscheint links
   - Ziehe Komponenten per Drag-and-Drop aus der Bibliothek auf die Leinwand
   - Oder klicke mit der rechten Maustaste auf das Raster und wähle "Knoten hinzufügen"

2. **Elemente verbinden**:
   - Wähle das Verbindungswerkzeug (drücke 'C' oder klicke auf das Verbindungssymbol)
   - **Klick-Modus** (Standard): Klicke auf den ersten Knoten, dann auf den zweiten
   - **Zieh-Modus** (optional): Klicke und ziehe vom ersten zum zweiten Knoten
   - Wechsle den Modus in Einstellungen → Verbindungen

3. **Arbeit speichern**:
   - **Schnellspeichern** - Speichert in der Browser-Sitzung
   - **Exportieren** - Als JSON-Datei herunterladen
   - **Importieren** - Aus JSON-Datei laden

### Speicheroptionen

- **Sitzungsspeicher**: Temporäre Speicherungen, die beim Schließen des Browsers gelöscht werden
- **Export/Import**: Permanente Speicherung als JSON-Dateien
- **Automatisches Speichern**: Speichert Änderungen automatisch alle 5 Sekunden in der Sitzung

## Beitragen

Wir freuen uns über Beiträge! Siehe [CONTRIBUTORS.md](../CONTRIBUTORS.md) für Richtlinien.

## Dokumentation

- [FOSSFLOW_ENCYCLOPEDIA.md](../FOSSFLOW_ENCYCLOPEDIA.md) - Umfassender Leitfaden zur Codebase
- [CONTRIBUTORS.md](../CONTRIBUTORS.md) - Beitragsrichtlinien

## Lizenz

MIT


================================================
FILE: docs/README.es.md
================================================
# FossFLOW - Herramienta de Diagramas Isométricos <img width="30" height="30" alt="fossflow" src="https://github.com/user-attachments/assets/56d78887-601c-4336-ab87-76f8ee4cde96" />

<p align="center">
 <a href="../README.md">English</a> | <a href="README.cn.md">简体中文</a> | <a href="README.es.md">Español</a> | <a href="README.pt.md">Português</a> | <a href="README.fr.md">Français</a> | <a href="README.hi.md">हिन्दी</a> | <a href="README.bn.md">বাংলা</a> | <a href="README.ru.md">Русский</a> | <a href="README.id.md">Bahasa Indonesia</a> | <a href="README.de.md">Deutsch</a>
</p>

<b>¡Hola!</b> Soy Stan, si has usado FossFLOW y te ha ayudado, <b>¡realmente agradecería si pudieras donar algo pequeño :)</b> Trabajo a tiempo completo, y encontrar tiempo para trabajar en este proyecto ya es bastante desafiante.
Si he implementado una función para ti o arreglado un error, sería genial si pudieras :) si no, no hay problema, ¡este software siempre será gratuito!


<b>¡También!</b> Si aún no lo has hecho, por favor echa un vistazo a la biblioteca subyacente en la que esto está construido por <a href="https://github.com/markmanx/isoflow">@markmanx</a> Realmente estoy sobre los hombros de un gigante aquí 🫡

[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/P5P61KBXA3)

<img width="30" height="30" alt="image" src="https://github.com/user-attachments/assets/dc6ec9ca-48d7-4047-94cf-5c4f7ed63b84" /> <b> https://buymeacoffee.com/stan.smith </b>


Gracias,

-Stan

## Pruébalo en línea

Ve a  <b> --> https://stan-smith.github.io/FossFLOW/ <-- </b>


------------------------------------------------------------------------------------------------------------------------------
FossFLOW es una potente aplicación web progresiva (PWA) de código abierto para crear hermosos diagramas isométricos. Construido con React y la biblioteca <a href="https://github.com/markmanx/isoflow">Isoflow</a> (Ahora bifurcada y publicada en NPM como fossflow), se ejecuta completamente en tu navegador con soporte sin conexión.

![Screenshot_20250630_160954](https://github.com/user-attachments/assets/e7f254ad-625f-4b8a-8efc-5293b5be9d55)

- **🤝 [CONTRIBUTORS.md](https://github.com/stan-smith/FossFLOW/blob/master/CONTRIBUTORS.md)** - Cómo contribuir al proyecto.

## Actualizaciones Recientes (Octubre 2025)

### Soporte Multilingüe
- **8 Idiomas Soportados** - Traducción completa de la interfaz en inglés, chino (simplificado), español, portugués (brasileño), francés, hindi, bengalí y ruso
- **Selector de Idioma** - Selector de idioma fácil de usar en el encabezado de la aplicación
- **Traducción Completa** - Todos los menús, diálogos, configuraciones, información sobre herramientas y contenido de ayuda traducidos
- **Consciente de la Localización** - Detecta y recuerda automáticamente tu preferencia de idioma

### Herramienta de Conector Mejorada
- **Creación Basada en Clics** - Nuevo modo predeterminado: haz clic en el primer nodo, luego en el segundo nodo para conectar
- **Opción de Modo de Arrastre** - El arrastre y colocación original sigue disponible a través de configuración
- **Selección de Modo** - Cambia entre los modos de clic y arrastre en Configuración → pestaña Conectores
- **Mejor Fiabilidad** - El modo de clic proporciona una creación de conexión más predecible

### Importación de Iconos Personalizados
- **Importa Tus Propios Iconos** - Sube iconos personalizados (PNG, JPG, SVG) para usar en tus diagramas
- **Escalado Automático** - Los iconos se escalan automáticamente a tamaños consistentes para una apariencia profesional
- **Alternar Isométrico/Plano** - Elige si los iconos importados aparecen como 3D isométrico o 2D plano
- **Persistencia Inteligente** - Los iconos personalizados se guardan con los diagramas y funcionan en todos los métodos de almacenamiento
- **Recursos de Iconos** - Encuentra iconos gratuitos en:
  - [Iconify Icon Sets](https://icon-sets.iconify.design/) - Miles de iconos SVG gratuitos
  - [Flaticon Isometric Icons](https://www.flaticon.com/free-icons/isometric) - Paquetes de iconos isométricos de alta calidad

### Soporte de Almacenamiento en Servidor
- **Almacenamiento Persistente** - Diagramas guardados en el sistema de archivos del servidor, persisten entre sesiones del navegador
- **Acceso Multi-dispositivo** - Accede a tus diagramas desde cualquier dispositivo cuando uses implementación Docker
- **Detección Automática** - La interfaz de usuario muestra automáticamente el almacenamiento del servidor cuando está disponible
- **Protección contra Sobrescritura** - Diálogo de confirmación al guardar con nombres duplicados
- **Integración Docker** - Almacenamiento en servidor habilitado por defecto en implementaciones Docker

### Funciones de Interacción Mejoradas
- **Teclas de Acceso Rápido Configurables** - Tres perfiles (QWERTY, SMNRCT, Ninguno) para selección de herramientas con indicadores visuales
- **Controles de Panorámica Avanzados** - Múltiples métodos de panorámica incluyendo arrastre de área vacía, clic medio/derecho, teclas modificadoras (Ctrl/Alt) y navegación por teclado (Flechas/WASD/IJKL)
- **Alternar Flechas de Conector** - Opción para mostrar/ocultar flechas en conectores individuales
- **Selección de Herramienta Persistente** - La herramienta de conector permanece activa después de crear conexiones
- **Diálogo de Configuración** - Configuración centralizada para teclas de acceso rápido y controles de panorámica

### Mejoras de Docker y CI/CD
- **Compilaciones Docker Automatizadas** - Flujo de trabajo de GitHub Actions para implementación automática de Docker Hub en commits
- **Soporte Multi-arquitectura** - Imágenes Docker para `linux/amd64` y `linux/arm64`
- **Imágenes Pre-construidas** - Disponibles en `stnsmith/fossflow:latest`

### Arquitectura Monorepo
- **Repositorio único** para biblioteca y aplicación
- **NPM Workspaces** para gestión de dependencias optimizada
- **Proceso de compilación unificado** con `npm run build` en la raíz

### Correcciones de Interfaz
- Se corrigió el problema de visualización de iconos de la barra de herramientas del editor Quill
- Se resolvieron advertencias de clave React en menús contextuales
- Se mejoró el estilo del editor de markdown

## Características

- 🎨 **Diagramación Isométrica** - Crea impresionantes diagramas técnicos en estilo 3D
- 💾 **Autoguardado** - Tu trabajo se guarda automáticamente cada 5 segundos
- 📱 **Soporte PWA** - Instala como una aplicación nativa en Mac y Linux
- 🔒 **Privacidad Primero** - Todos los datos se almacenan localmente en tu navegador
- 📤 **Importar/Exportar** - Comparte diagramas como archivos JSON
- 🎯 **Almacenamiento de Sesión** - Guardado rápido sin diálogos
- 🌐 **Soporte Sin Conexión** - Trabaja sin conexión a internet
- 🗄️ **Almacenamiento en Servidor** - Almacenamiento persistente opcional cuando se usa Docker (habilitado por defecto)
- 🌍 **Multilingüe** - Soporte completo para 8 idiomas: English, 简体中文, Español, Português, Français, हिन्दी, বাংলা, Русский


## 🐳 Implementación Rápida con Docker

```bash
# Usando Docker Compose (recomend
Download .txt
gitextract_4kyu4h7x/

├── .dockerignore
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── dependabot-automerge.yml
│       ├── docker.yml
│       ├── e2e-tests.yml
│       ├── e2e-tests.yml.backup
│       ├── ethicalcheck.yml
│       ├── pages.yml
│       ├── release.yml
│       └── test.yml
├── .gitignore
├── .npmignore
├── .nvmrc
├── .prettierrc
├── .releaserc.json
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Dockerfile
├── FOSSFLOW_ENCYCLOPEDIA.md
├── LICENSE
├── README.md
├── compose.dev.yml
├── compose.yml
├── docker-entrypoint.sh
├── docs/
│   ├── README.bn.md
│   ├── README.cn.md
│   ├── README.de.md
│   ├── README.es.md
│   ├── README.fr.md
│   ├── README.hi.md
│   ├── README.id.md
│   ├── README.pt.md
│   ├── README.ru.md
│   └── SEMANTIC_RELEASE.md
├── e2e-tests/
│   ├── .gitignore
│   ├── README.md
│   ├── SETUP.md
│   ├── get-docker.sh
│   ├── pytest.ini
│   ├── requirements.txt
│   ├── run-tests.sh
│   ├── test-base-paths.sh
│   ├── test-diagram.json
│   └── tests/
│       ├── test_base_path_routing.py
│       ├── test_basic_load.py
│       ├── test_connector_undo.py
│       ├── test_export_svg.py
│       ├── test_import_diagram.py
│       ├── test_multi_node_undo.py
│       ├── test_node_placement.py
│       ├── test_rect_text_undo.py
│       └── test_store_debug.py
├── nginx.conf
├── package.json
├── packages/
│   ├── fossflow-app/
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── public/
│   │   │   ├── i18n/
│   │   │   │   └── app/
│   │   │   │       ├── bn-BD.json
│   │   │   │       ├── de-DE.json
│   │   │   │       ├── en-US.json
│   │   │   │       ├── es-ES.json
│   │   │   │       ├── fr-FR.json
│   │   │   │       ├── hi-IN.json
│   │   │   │       ├── id-ID.json
│   │   │   │       ├── it-IT.json
│   │   │   │       ├── pt-BR.json
│   │   │   │       ├── ru-RU.json
│   │   │   │       ├── tr-TR.json
│   │   │   │       └── zh-CN.json
│   │   │   ├── index.html
│   │   │   ├── manifest.json
│   │   │   ├── robots.txt
│   │   │   └── service-worker.js
│   │   ├── rsbuild.config.ts
│   │   ├── src/
│   │   │   ├── App.css
│   │   │   ├── App.tsx
│   │   │   ├── EditorPage.tsx
│   │   │   ├── StorageManager.tsx
│   │   │   ├── components/
│   │   │   │   ├── ChangeLanguage/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.css
│   │   │   │   ├── DiagramManager.css
│   │   │   │   ├── DiagramManager.tsx
│   │   │   │   ├── ErrorBoundary.css
│   │   │   │   └── ErrorBoundary.tsx
│   │   │   ├── diagramUtils.ts
│   │   │   ├── env.d.ts
│   │   │   ├── i18n/
│   │   │   │   ├── bn-BD.json
│   │   │   │   ├── en-US.json
│   │   │   │   ├── es-ES.json
│   │   │   │   ├── fr-FR.json
│   │   │   │   ├── hi-IN.json
│   │   │   │   ├── it-IT.json
│   │   │   │   ├── pl-PL.json
│   │   │   │   ├── pt-BR.json
│   │   │   │   ├── ru-RU.json
│   │   │   │   ├── tr-TR.json
│   │   │   │   └── zh-CN.json
│   │   │   ├── i18n.ts
│   │   │   ├── index.css
│   │   │   ├── index.tsx
│   │   │   ├── minimalIcons.ts
│   │   │   ├── paymentFlowExample.json
│   │   │   ├── reportWebVitals.ts
│   │   │   ├── serviceWorkerRegistration.ts
│   │   │   ├── services/
│   │   │   │   ├── iconPackManager.ts
│   │   │   │   └── storageService.ts
│   │   │   └── usePersistedDiagram.ts
│   │   └── tsconfig.json
│   ├── fossflow-backend/
│   │   ├── package.json
│   │   └── server.js
│   └── fossflow-lib/
│       ├── .gitignore
│       ├── LICENSE
│       ├── docs/
│       │   ├── .gitignore
│       │   ├── next-env.d.ts
│       │   ├── next.config.js
│       │   ├── package.json
│       │   ├── pages/
│       │   │   ├── _meta.json
│       │   │   ├── docs/
│       │   │   │   ├── _meta.json
│       │   │   │   ├── api/
│       │   │   │   │   ├── _meta.json
│       │   │   │   │   ├── index.mdx
│       │   │   │   │   └── initialData.mdx
│       │   │   │   ├── contributing.mdx
│       │   │   │   ├── index.mdx
│       │   │   │   ├── installation.mdx
│       │   │   │   ├── isopacks.mdx
│       │   │   │   └── quickstart.mdx
│       │   │   └── index.tsx
│       │   ├── theme.config.tsx
│       │   └── tsconfig.json
│       ├── jest.config.js
│       ├── jest.setup.js
│       ├── package.json
│       ├── rslib.config.ts
│       ├── src/
│       │   ├── Isoflow.tsx
│       │   ├── components/
│       │   │   ├── Circle/
│       │   │   │   └── Circle.tsx
│       │   │   ├── ColorSelector/
│       │   │   │   ├── ColorPicker.tsx
│       │   │   │   ├── ColorSelector.tsx
│       │   │   │   ├── ColorSwatch.tsx
│       │   │   │   ├── CustomColorInput.tsx
│       │   │   │   └── __tests__/
│       │   │   │       ├── ColorSelector.test.tsx
│       │   │   │       └── CustomColorInput.test.tsx
│       │   │   ├── ConnectorEmptySpaceTooltip/
│       │   │   │   └── ConnectorEmptySpaceTooltip.tsx
│       │   │   ├── ConnectorHintTooltip/
│       │   │   │   └── ConnectorHintTooltip.tsx
│       │   │   ├── ConnectorRerouteTooltip/
│       │   │   │   └── ConnectorRerouteTooltip.tsx
│       │   │   ├── ConnectorSettings/
│       │   │   │   └── ConnectorSettings.tsx
│       │   │   ├── ContextMenu/
│       │   │   │   ├── ContextMenu.tsx
│       │   │   │   └── ContextMenuManager.tsx
│       │   │   ├── Cursor/
│       │   │   │   └── Cursor.tsx
│       │   │   ├── DOMErrorBoundary/
│       │   │   │   ├── DOMErrorBoundary.tsx
│       │   │   │   └── index.ts
│       │   │   ├── DebugUtils/
│       │   │   │   ├── DebugUtils.tsx
│       │   │   │   ├── LineItem.tsx
│       │   │   │   ├── SizeIndicator.tsx
│       │   │   │   ├── Value.tsx
│       │   │   │   └── __tests__/
│       │   │   │       ├── DebugUtils.test.tsx
│       │   │   │       ├── LineItem.test.tsx
│       │   │   │       ├── SizeIndicator.test.tsx
│       │   │   │       └── Value.test.tsx
│       │   │   ├── DragAndDrop/
│       │   │   │   └── DragAndDrop.tsx
│       │   │   ├── ExportImageDialog/
│       │   │   │   └── ExportImageDialog.tsx
│       │   │   ├── FreehandLasso/
│       │   │   │   └── FreehandLasso.tsx
│       │   │   ├── Gradient/
│       │   │   │   └── Gradient.tsx
│       │   │   ├── Grid/
│       │   │   │   └── Grid.tsx
│       │   │   ├── HelpDialog/
│       │   │   │   └── HelpDialog.tsx
│       │   │   ├── HotkeySettings/
│       │   │   │   └── HotkeySettings.tsx
│       │   │   ├── IconButton/
│       │   │   │   └── IconButton.tsx
│       │   │   ├── IconPackSettings/
│       │   │   │   └── IconPackSettings.tsx
│       │   │   ├── ImportHintTooltip/
│       │   │   │   └── ImportHintTooltip.tsx
│       │   │   ├── IsoTileArea/
│       │   │   │   └── IsoTileArea.tsx
│       │   │   ├── ItemControls/
│       │   │   │   ├── ConnectorControls/
│       │   │   │   │   └── ConnectorControls.tsx
│       │   │   │   ├── IconSelectionControls/
│       │   │   │   │   ├── Icon.tsx
│       │   │   │   │   ├── IconCollection.tsx
│       │   │   │   │   ├── IconGrid.tsx
│       │   │   │   │   ├── IconSelectionControls.tsx
│       │   │   │   │   ├── Icons.tsx
│       │   │   │   │   ├── Searchbox.tsx
│       │   │   │   │   └── __tests__/
│       │   │   │   │       └── Icon.test.tsx
│       │   │   │   ├── ItemControlsManager.tsx
│       │   │   │   ├── NodeControls/
│       │   │   │   │   ├── NodeControls.tsx
│       │   │   │   │   ├── NodeSettings/
│       │   │   │   │   │   └── NodeSettings.tsx
│       │   │   │   │   └── QuickIconSelector.tsx
│       │   │   │   ├── RectangleControls/
│       │   │   │   │   └── RectangleControls.tsx
│       │   │   │   ├── TextBoxControls/
│       │   │   │   │   └── TextBoxControls.tsx
│       │   │   │   └── components/
│       │   │   │       ├── ControlsContainer.tsx
│       │   │   │       ├── DeleteButton.tsx
│       │   │   │       ├── Header.tsx
│       │   │   │       └── Section.tsx
│       │   │   ├── Label/
│       │   │   │   ├── ExpandButton.tsx
│       │   │   │   ├── ExpandableLabel.tsx
│       │   │   │   ├── Label.tsx
│       │   │   │   └── __tests__/
│       │   │   │       └── Label.test.tsx
│       │   │   ├── LabelSettings/
│       │   │   │   └── LabelSettings.tsx
│       │   │   ├── Lasso/
│       │   │   │   └── Lasso.tsx
│       │   │   ├── LassoHintTooltip/
│       │   │   │   └── LassoHintTooltip.tsx
│       │   │   ├── LazyLoadingWelcomeNotification/
│       │   │   │   └── LazyLoadingWelcomeNotification.tsx
│       │   │   ├── Loader/
│       │   │   │   └── Loader.tsx
│       │   │   ├── MainMenu/
│       │   │   │   ├── MainMenu.tsx
│       │   │   │   └── MenuItem.tsx
│       │   │   ├── PanSettings/
│       │   │   │   └── PanSettings.tsx
│       │   │   ├── Renderer/
│       │   │   │   └── Renderer.tsx
│       │   │   ├── RichTextEditor/
│       │   │   │   ├── RichTextEditor.tsx
│       │   │   │   ├── RichTextEditorErrorBoundary.tsx
│       │   │   │   └── index.ts
│       │   │   ├── SceneLayer/
│       │   │   │   └── SceneLayer.tsx
│       │   │   ├── SceneLayers/
│       │   │   │   ├── ConnectorLabels/
│       │   │   │   │   ├── ConnectorLabel.tsx
│       │   │   │   │   └── ConnectorLabels.tsx
│       │   │   │   ├── Connectors/
│       │   │   │   │   ├── Connector.tsx
│       │   │   │   │   └── Connectors.tsx
│       │   │   │   ├── Nodes/
│       │   │   │   │   ├── Node/
│       │   │   │   │   │   ├── IconTypes/
│       │   │   │   │   │   │   ├── IsometricIcon.tsx
│       │   │   │   │   │   │   └── NonIsometricIcon.tsx
│       │   │   │   │   │   └── Node.tsx
│       │   │   │   │   └── Nodes.tsx
│       │   │   │   ├── Rectangles/
│       │   │   │   │   ├── Rectangle.tsx
│       │   │   │   │   └── Rectangles.tsx
│       │   │   │   └── TextBoxes/
│       │   │   │       ├── TextBox.tsx
│       │   │   │       └── TextBoxes.tsx
│       │   │   ├── SettingsDialog/
│       │   │   │   └── SettingsDialog.tsx
│       │   │   ├── Svg/
│       │   │   │   └── Svg.tsx
│       │   │   ├── ToolMenu/
│       │   │   │   └── ToolMenu.tsx
│       │   │   ├── TransformControlsManager/
│       │   │   │   ├── NodeTransformControls.tsx
│       │   │   │   ├── RectangleTransformControls.tsx
│       │   │   │   ├── TextBoxTransformControls.tsx
│       │   │   │   ├── TransformAnchor.tsx
│       │   │   │   ├── TransformControls.tsx
│       │   │   │   └── TransformControlsManager.tsx
│       │   │   ├── UiElement/
│       │   │   │   └── UiElement.tsx
│       │   │   ├── UiOverlay/
│       │   │   │   └── UiOverlay.tsx
│       │   │   ├── ZoomControls/
│       │   │   │   └── ZoomControls.tsx
│       │   │   └── ZoomSettings/
│       │   │       └── ZoomSettings.tsx
│       │   ├── config/
│       │   │   ├── hotkeys.ts
│       │   │   ├── labelSettings.ts
│       │   │   ├── panSettings.ts
│       │   │   └── zoomSettings.ts
│       │   ├── config.ts
│       │   ├── examples/
│       │   │   ├── BasicEditor/
│       │   │   │   └── BasicEditor.tsx
│       │   │   ├── DebugTools/
│       │   │   │   └── DebugTools.tsx
│       │   │   ├── ReadonlyMode/
│       │   │   │   └── ReadonlyMode.tsx
│       │   │   ├── index.tsx
│       │   │   └── initialData.ts
│       │   ├── fixtures/
│       │   │   ├── colors.ts
│       │   │   ├── icons.ts
│       │   │   ├── model.ts
│       │   │   ├── modelItems.ts
│       │   │   └── views.ts
│       │   ├── global.d.ts
│       │   ├── hooks/
│       │   │   ├── __tests__/
│       │   │   │   ├── useHistory.test.tsx
│       │   │   │   └── useInitialDataManager.test.tsx
│       │   │   ├── useColor.ts
│       │   │   ├── useConnector.ts
│       │   │   ├── useDiagramUtils.ts
│       │   │   ├── useHistory.ts
│       │   │   ├── useIcon.tsx
│       │   │   ├── useIconCategories.ts
│       │   │   ├── useIconFiltering.ts
│       │   │   ├── useInitialDataManager.ts
│       │   │   ├── useIsoProjection.ts
│       │   │   ├── useModelItem.ts
│       │   │   ├── useRectangle.ts
│       │   │   ├── useResizeObserver.ts
│       │   │   ├── useScene.ts
│       │   │   ├── useTextBox.ts
│       │   │   ├── useTextBoxProps.ts
│       │   │   ├── useView.ts
│       │   │   ├── useViewItem.ts
│       │   │   └── useWindowUtils.ts
│       │   ├── i18n/
│       │   │   ├── bn-BD.ts
│       │   │   ├── en-US.ts
│       │   │   ├── es-ES.ts
│       │   │   ├── fr-FR.ts
│       │   │   ├── hi-IN.ts
│       │   │   ├── id-ID.ts
│       │   │   ├── index.ts
│       │   │   ├── it-IT.ts
│       │   │   ├── pl-PL.ts
│       │   │   ├── pt-BR.ts
│       │   │   ├── ru-RU.ts
│       │   │   ├── tr-TR.ts
│       │   │   └── zh-CN.ts
│       │   ├── index-docker.tsx
│       │   ├── index.html
│       │   ├── index.ts
│       │   ├── index.tsx
│       │   ├── interaction/
│       │   │   ├── modes/
│       │   │   │   ├── Connector.ts
│       │   │   │   ├── Cursor.ts
│       │   │   │   ├── DragItems.ts
│       │   │   │   ├── FreehandLasso.ts
│       │   │   │   ├── Lasso.ts
│       │   │   │   ├── Pan.ts
│       │   │   │   ├── PlaceIcon.ts
│       │   │   │   ├── Rectangle/
│       │   │   │   │   ├── DrawRectangle.ts
│       │   │   │   │   └── TransformRectangle.ts
│       │   │   │   └── TextBox.ts
│       │   │   ├── useInteractionManager.ts
│       │   │   └── usePanHandlers.ts
│       │   ├── module.d.ts
│       │   ├── schemas/
│       │   │   ├── __tests__/
│       │   │   │   ├── colors.test.ts
│       │   │   │   ├── connector.test.ts
│       │   │   │   ├── icons.test.ts
│       │   │   │   ├── modelItems.test.ts
│       │   │   │   ├── rectangle.test.ts
│       │   │   │   ├── textBox.test.ts
│       │   │   │   ├── validation.test.ts
│       │   │   │   └── views.test.ts
│       │   │   ├── colors.ts
│       │   │   ├── common.ts
│       │   │   ├── connector.ts
│       │   │   ├── icons.ts
│       │   │   ├── index.ts
│       │   │   ├── model.ts
│       │   │   ├── modelItems.ts
│       │   │   ├── rectangle.ts
│       │   │   ├── textBox.ts
│       │   │   ├── validation.ts
│       │   │   └── views.ts
│       │   ├── standaloneExports.ts
│       │   ├── stores/
│       │   │   ├── localeStore.tsx
│       │   │   ├── modelStore.tsx
│       │   │   ├── reducers/
│       │   │   │   ├── __tests__/
│       │   │   │   │   ├── connector.test.ts
│       │   │   │   │   ├── modelItem.test.ts
│       │   │   │   │   ├── rectangle.test.ts
│       │   │   │   │   ├── textBox.test.ts
│       │   │   │   │   └── viewItem.test.ts
│       │   │   │   ├── connector.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── modelItem.ts
│       │   │   │   ├── rectangle.ts
│       │   │   │   ├── textBox.ts
│       │   │   │   ├── types.ts
│       │   │   │   ├── view.ts
│       │   │   │   └── viewItem.ts
│       │   │   ├── sceneStore.tsx
│       │   │   └── uiStateStore.tsx
│       │   ├── styles/
│       │   │   ├── GlobalStyles.tsx
│       │   │   └── theme.ts
│       │   ├── types/
│       │   │   ├── common.ts
│       │   │   ├── dom-to-image-more.d.ts
│       │   │   ├── index.ts
│       │   │   ├── interactions.ts
│       │   │   ├── isoflowProps.ts
│       │   │   ├── model.ts
│       │   │   ├── rendererProps.ts
│       │   │   ├── scene.ts
│       │   │   └── ui.ts
│       │   └── utils/
│       │       ├── CoordsUtils.ts
│       │       ├── SizeUtils.ts
│       │       ├── __tests__/
│       │       │   ├── common.test.ts
│       │       │   ├── immer.test.ts
│       │       │   └── renderer.test.ts
│       │       ├── common.ts
│       │       ├── connectorLabels.ts
│       │       ├── exportOptions.ts
│       │       ├── findNearestUnoccupiedTile.ts
│       │       ├── index.ts
│       │       ├── model.ts
│       │       ├── pathfinder.ts
│       │       ├── pointInPolygon.ts
│       │       └── renderer.ts
│       ├── tsconfig.declaration.json
│       ├── tsconfig.dev.json
│       └── tsconfig.json
├── scripts/
│   └── update-version.js
├── test-app.html
├── test-base-paths.sh
└── tsconfig.base.json
Download .txt
SYMBOL INDEX (399 symbols across 117 files)

FILE: e2e-tests/tests/test_base_path_routing.py
  function get_base_url (line 15) | def get_base_url():
  function get_base_path (line 20) | def get_base_path():
  function get_webdriver_url (line 25) | def get_webdriver_url():
  function driver (line 31) | def driver():
  function test_app_loads_at_base_path (line 58) | def test_app_loads_at_base_path(driver):
  function test_static_assets_load_correctly (line 90) | def test_static_assets_load_correctly(driver):
  function test_react_router_navigation_works (line 151) | def test_react_router_navigation_works(driver):
  function test_router_basename_detection (line 195) | def test_router_basename_detection(driver):
  function test_no_console_errors_at_base_path (line 238) | def test_no_console_errors_at_base_path(driver):

FILE: e2e-tests/tests/test_basic_load.py
  function get_base_url (line 15) | def get_base_url():
  function get_webdriver_url (line 20) | def get_webdriver_url():
  function driver (line 26) | def driver():
  function test_can_connect_to_server (line 63) | def test_can_connect_to_server(driver):
  function test_homepage_loads (line 83) | def test_homepage_loads(driver):
  function test_page_has_body_and_root (line 104) | def test_page_has_body_and_root(driver):
  function test_javascript_is_executing (line 125) | def test_javascript_is_executing(driver):
  function test_app_renders_diagram_components (line 171) | def test_app_renders_diagram_components(driver):

FILE: e2e-tests/tests/test_connector_undo.py
  function get_base_url (line 16) | def get_base_url():
  function get_webdriver_url (line 20) | def get_webdriver_url():
  function driver (line 25) | def driver():
  function save_screenshot (line 40) | def save_screenshot(driver, name):
  function dismiss_modals (line 47) | def dismiss_modals(driver):
  function count_canvas_images (line 83) | def count_canvas_images(driver):
  function count_connector_polylines (line 91) | def count_connector_polylines(driver):
  function get_scene_state (line 100) | def get_scene_state(driver):
  function place_node_at (line 156) | def place_node_at(driver, x_offset, y_offset):
  function click_connector_tool (line 197) | def click_connector_tool(driver):
  function click_undo (line 209) | def click_undo(driver):
  function click_redo (line 220) | def click_redo(driver):
  function test_connector_undo_redo (line 231) | def test_connector_undo_redo(driver):

FILE: e2e-tests/tests/test_export_svg.py
  function get_base_url (line 18) | def get_base_url():
  function get_webdriver_url (line 22) | def get_webdriver_url():
  function driver (line 27) | def driver():
  function save_screenshot (line 70) | def save_screenshot(driver, name):
  function dismiss_modals (line 77) | def dismiss_modals(driver):
  function place_node_at (line 106) | def place_node_at(driver, x_offset, y_offset):
  function draw_rectangle (line 147) | def draw_rectangle(driver, x, y, width, height):
  function place_textbox (line 168) | def place_textbox(driver, x, y):
  function get_scene_state (line 188) | def get_scene_state(driver):
  function test_export_svg (line 221) | def test_export_svg(driver):

FILE: e2e-tests/tests/test_import_diagram.py
  function get_base_url (line 19) | def get_base_url():
  function get_webdriver_url (line 23) | def get_webdriver_url():
  function driver (line 28) | def driver():
  function save_screenshot (line 45) | def save_screenshot(driver, name):
  function dismiss_modals (line 52) | def dismiss_modals(driver):
  function get_scene_state (line 77) | def get_scene_state(driver):
  function load_expected_counts (line 116) | def load_expected_counts():
  function test_import_via_app_button (line 134) | def test_import_via_app_button(driver):

FILE: e2e-tests/tests/test_multi_node_undo.py
  function get_base_url (line 16) | def get_base_url():
  function get_webdriver_url (line 20) | def get_webdriver_url():
  function driver (line 25) | def driver():
  function save_screenshot (line 40) | def save_screenshot(driver, name):
  function dismiss_modals (line 47) | def dismiss_modals(driver):
  function count_canvas_images (line 61) | def count_canvas_images(driver):
  function get_model_items_count (line 69) | def get_model_items_count(driver):
  function place_node_at (line 95) | def place_node_at(driver, x_offset, y_offset):
  function click_undo (line 140) | def click_undo(driver):
  function click_redo (line 151) | def click_redo(driver):
  function test_multi_node_undo_redo (line 162) | def test_multi_node_undo_redo(driver):

FILE: e2e-tests/tests/test_node_placement.py
  function get_base_url (line 19) | def get_base_url():
  function get_webdriver_url (line 23) | def get_webdriver_url():
  function driver (line 28) | def driver():
  function save_screenshot (line 50) | def save_screenshot(driver, name):
  function dismiss_modals (line 58) | def dismiss_modals(driver):
  function dismiss_tips (line 75) | def dismiss_tips(driver):
  function count_canvas_nodes (line 98) | def count_canvas_nodes(driver):
  function place_node (line 129) | def place_node(driver, screenshot_prefix=""):
  function find_toolbar_button (line 190) | def find_toolbar_button(driver, name_substring):
  function get_undo_redo_debug_info (line 222) | def get_undo_redo_debug_info(driver):
  function click_undo (line 263) | def click_undo(driver):
  function click_redo (line 288) | def click_redo(driver):
  function test_place_node_on_canvas (line 311) | def test_place_node_on_canvas(driver):
  function test_undo_redo_node (line 349) | def test_undo_redo_node(driver):

FILE: e2e-tests/tests/test_rect_text_undo.py
  function get_base_url (line 16) | def get_base_url():
  function get_webdriver_url (line 20) | def get_webdriver_url():
  function driver (line 25) | def driver():
  function save_screenshot (line 40) | def save_screenshot(driver, name):
  function dismiss_modals (line 47) | def dismiss_modals(driver):
  function get_scene_state (line 66) | def get_scene_state(driver):
  function count_svg_polygons (line 103) | def count_svg_polygons(driver):
  function count_text_elements (line 113) | def count_text_elements(driver):
  function click_undo (line 136) | def click_undo(driver):
  function click_redo (line 145) | def click_redo(driver):
  function test_rectangle_undo_redo (line 158) | def test_rectangle_undo_redo(driver):
  function test_textbox_undo_redo (line 271) | def test_textbox_undo_redo(driver):

FILE: e2e-tests/tests/test_store_debug.py
  function setup_driver (line 12) | def setup_driver():
  function dump_store (line 24) | def dump_store(d, label):
  function count_dom_nodes (line 61) | def count_dom_nodes(d):
  function place_node (line 73) | def place_node(d):
  function main (line 122) | def main():

FILE: packages/fossflow-app/public/service-worker.js
  constant CACHE_NAME (line 1) | const CACHE_NAME = 'fossflow-v1';

FILE: packages/fossflow-app/src/App.tsx
  type SavedDiagram (line 23) | interface SavedDiagram {
  function App (line 31) | function App() {
  function EditorPage (line 47) | function EditorPage() {

FILE: packages/fossflow-app/src/EditorPage.tsx
  type SavedDiagram (line 20) | interface SavedDiagram {
  function EditorPage (line 28) | function EditorPage() {

FILE: packages/fossflow-app/src/StorageManager.tsx
  type StorageInfo (line 3) | interface StorageInfo {

FILE: packages/fossflow-app/src/components/DiagramManager.tsx
  type Props (line 5) | interface Props {

FILE: packages/fossflow-app/src/components/ErrorBoundary.tsx
  type ErrorBoundaryFallbackUIProps (line 3) | interface ErrorBoundaryFallbackUIProps {
  function ErrorBoundaryFallbackUI (line 7) | function ErrorBoundaryFallbackUI({

FILE: packages/fossflow-app/src/diagramUtils.ts
  type DiagramData (line 3) | interface DiagramData {
  function mergeDiagramData (line 15) | function mergeDiagramData(base: DiagramData, update: Partial<DiagramData...
  function extractSavableData (line 30) | function extractSavableData(fullData: DiagramData): DiagramData {
  function validateDiagramData (line 45) | function validateDiagramData(data: any): data is DiagramData {

FILE: packages/fossflow-app/src/serviceWorkerRegistration.ts
  type Config (line 9) | type Config = {
  function register (line 14) | function register(config?: Config) {
  function registerValidSW (line 42) | function registerValidSW(swUrl: string, config?: Config) {
  function checkValidServiceWorker (line 77) | function checkValidServiceWorker(swUrl: string, config?: Config) {
  function unregister (line 103) | function unregister() {

FILE: packages/fossflow-app/src/services/iconPackManager.ts
  type IconPackName (line 5) | type IconPackName = 'aws' | 'gcp' | 'azure' | 'kubernetes';
  type IconPackInfo (line 7) | interface IconPackInfo {
  type IconPackManagerState (line 16) | interface IconPackManagerState {
  constant LAZY_LOADING_KEY (line 24) | const LAZY_LOADING_KEY = 'fossflow-lazy-loading-enabled';
  constant ENABLED_PACKS_KEY (line 25) | const ENABLED_PACKS_KEY = 'fossflow-enabled-icon-packs';
  constant PACK_METADATA (line 28) | const PACK_METADATA: Record<IconPackName, string> = {

FILE: packages/fossflow-app/src/services/storageService.ts
  type DiagramInfo (line 3) | interface DiagramInfo {
  type StorageService (line 10) | interface StorageService {
  class ServerStorage (line 20) | class ServerStorage implements StorageService {
    method constructor (line 26) | constructor(baseUrl: string = '') {
    method isAvailable (line 33) | async isAvailable(): Promise<boolean> {
    method listDiagrams (line 61) | async listDiagrams(): Promise<DiagramInfo[]> {
    method loadDiagram (line 81) | async loadDiagram(id: string): Promise<Model> {
    method saveDiagram (line 105) | async saveDiagram(id: string, data: Model): Promise<void> {
    method deleteDiagram (line 128) | async deleteDiagram(id: string): Promise<void> {
    method createDiagram (line 135) | async createDiagram(data: Model): Promise<string> {
  class SessionStorage (line 148) | class SessionStorage implements StorageService {
    method isAvailable (line 152) | async isAvailable(): Promise<boolean> {
    method listDiagrams (line 156) | async listDiagrams(): Promise<DiagramInfo[]> {
    method loadDiagram (line 167) | async loadDiagram(id: string): Promise<Model> {
    method saveDiagram (line 173) | async saveDiagram(id: string, data: Model): Promise<void> {
    method deleteDiagram (line 195) | async deleteDiagram(id: string): Promise<void> {
    method createDiagram (line 204) | async createDiagram(data: Model): Promise<string> {
  class StorageManager (line 212) | class StorageManager {
    method constructor (line 217) | constructor() {
    method initialize (line 222) | async initialize(): Promise<StorageService> {
    method getStorage (line 234) | getStorage(): StorageService {
    method isServerStorage (line 241) | isServerStorage(): boolean {

FILE: packages/fossflow-app/src/usePersistedDiagram.ts
  type PersistedDiagramData (line 4) | interface PersistedDiagramData extends Omit<DiagramData, 'icons'> {

FILE: packages/fossflow-backend/server.js
  constant PORT (line 15) | const PORT = process.env.BACKEND_PORT || 3001;
  constant STORAGE_ENABLED (line 18) | const STORAGE_ENABLED = process.env.ENABLE_SERVER_STORAGE === 'true';
  constant STORAGE_PATH (line 19) | const STORAGE_PATH = process.env.STORAGE_PATH || '/data/diagrams';
  constant ENABLE_GIT_BACKUP (line 20) | const ENABLE_GIT_BACKUP = process.env.ENABLE_GIT_BACKUP === 'true';
  function ensureStorageDir (line 38) | async function ensureStorageDir() {

FILE: packages/fossflow-lib/docs/pages/index.tsx
  function Home (line 4) | function Home() {

FILE: packages/fossflow-lib/src/components/Circle/Circle.tsx
  type Props (line 4) | interface Props {

FILE: packages/fossflow-lib/src/components/ColorSelector/ColorPicker.tsx
  type Props (line 9) | interface Props extends Omit<MuiColorInputProps, 'ref'> {}

FILE: packages/fossflow-lib/src/components/ColorSelector/ColorSelector.tsx
  type Props (line 6) | interface Props {

FILE: packages/fossflow-lib/src/components/ColorSelector/ColorSwatch.tsx
  type Props (line 4) | type Props = {

FILE: packages/fossflow-lib/src/components/ColorSelector/CustomColorInput.tsx
  type EyeDropper (line 6) | interface EyeDropper {
  type Window (line 11) | interface Window {
  type Props (line 18) | interface Props {

FILE: packages/fossflow-lib/src/components/ConnectorHintTooltip/ConnectorHintTooltip.tsx
  constant STORAGE_KEY (line 7) | const STORAGE_KEY = 'fossflow_connector_hint_dismissed';
  type Props (line 9) | interface Props {

FILE: packages/fossflow-lib/src/components/ConnectorRerouteTooltip/ConnectorRerouteTooltip.tsx
  constant STORAGE_KEY (line 8) | const STORAGE_KEY = 'fossflow_connector_reroute_hint_dismissed';

FILE: packages/fossflow-lib/src/components/ContextMenu/ContextMenu.tsx
  type MenuItemI (line 4) | interface MenuItemI {
  type Props (line 9) | interface Props {

FILE: packages/fossflow-lib/src/components/ContextMenu/ContextMenuManager.tsx
  type Props (line 9) | interface Props {

FILE: packages/fossflow-lib/src/components/DOMErrorBoundary/DOMErrorBoundary.tsx
  type DOMErrorBoundaryProps (line 3) | interface DOMErrorBoundaryProps {
  type DOMErrorBoundaryState (line 9) | interface DOMErrorBoundaryState {
  class DOMErrorBoundary (line 18) | class DOMErrorBoundary extends Component<DOMErrorBoundaryProps, DOMError...
    method constructor (line 19) | constructor(props: DOMErrorBoundaryProps) {
    method getDerivedStateFromError (line 27) | static getDerivedStateFromError(error: Error): Partial<DOMErrorBoundar...
    method componentDidCatch (line 45) | componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
    method componentDidUpdate (line 83) | componentDidUpdate(_prevProps: DOMErrorBoundaryProps, prevState: DOMEr...
    method render (line 90) | render() {

FILE: packages/fossflow-lib/src/components/DebugUtils/LineItem.tsx
  type Props (line 5) | interface Props {

FILE: packages/fossflow-lib/src/components/DebugUtils/SizeIndicator.tsx
  constant BORDER_WIDTH (line 5) | const BORDER_WIDTH = 6;

FILE: packages/fossflow-lib/src/components/DebugUtils/Value.tsx
  type Props (line 4) | interface Props {

FILE: packages/fossflow-lib/src/components/DragAndDrop/DragAndDrop.tsx
  type Props (line 7) | interface Props {

FILE: packages/fossflow-lib/src/components/ExportImageDialog/ExportImageDialog.tsx
  type Props (line 42) | interface Props {
  type CropArea (line 47) | interface CropArea {

FILE: packages/fossflow-lib/src/components/Gradient/Gradient.tsx
  type Props (line 4) | interface Props {

FILE: packages/fossflow-lib/src/components/HelpDialog/HelpDialog.tsx
  type ShortcutItem (line 24) | interface ShortcutItem {

FILE: packages/fossflow-lib/src/components/IconButton/IconButton.tsx
  type Props (line 5) | interface Props {

FILE: packages/fossflow-lib/src/components/IconPackSettings/IconPackSettings.tsx
  type IconPackSettingsProps (line 17) | interface IconPackSettingsProps {

FILE: packages/fossflow-lib/src/components/ImportHintTooltip/ImportHintTooltip.tsx
  constant STORAGE_KEY (line 6) | const STORAGE_KEY = 'fossflow_import_hint_dismissed';

FILE: packages/fossflow-lib/src/components/IsoTileArea/IsoTileArea.tsx
  type Props (line 6) | interface Props {

FILE: packages/fossflow-lib/src/components/ItemControls/ConnectorControls/ConnectorControls.tsx
  type Props (line 37) | interface Props {

FILE: packages/fossflow-lib/src/components/ItemControls/IconSelectionControls/Icon.tsx
  constant SIZE (line 7) | const SIZE = 50;
  type Props (line 9) | interface Props {

FILE: packages/fossflow-lib/src/components/ItemControls/IconSelectionControls/IconCollection.tsx
  type Props (line 11) | interface Props {

FILE: packages/fossflow-lib/src/components/ItemControls/IconSelectionControls/IconGrid.tsx
  type Props (line 6) | interface Props {

FILE: packages/fossflow-lib/src/components/ItemControls/IconSelectionControls/Icons.tsx
  type Props (line 6) | interface Props {

FILE: packages/fossflow-lib/src/components/ItemControls/IconSelectionControls/Searchbox.tsx
  type Props (line 5) | interface Props {

FILE: packages/fossflow-lib/src/components/ItemControls/NodeControls/NodeControls.tsx
  type Props (line 20) | interface Props {
  type Mode (line 29) | type Mode = keyof typeof ModeOptions;

FILE: packages/fossflow-lib/src/components/ItemControls/NodeControls/NodeSettings/NodeSettings.tsx
  type NodeUpdates (line 10) | type NodeUpdates = {
  type Props (line 15) | interface Props {

FILE: packages/fossflow-lib/src/components/ItemControls/NodeControls/QuickIconSelector.tsx
  type Props (line 11) | interface Props {
  constant RECENT_ICONS_KEY (line 18) | const RECENT_ICONS_KEY = 'fossflow-recent-icons';
  constant MAX_RECENT_ICONS (line 19) | const MAX_RECENT_ICONS = 12;

FILE: packages/fossflow-lib/src/components/ItemControls/RectangleControls/RectangleControls.tsx
  type Props (line 14) | interface Props {

FILE: packages/fossflow-lib/src/components/ItemControls/TextBoxControls/TextBoxControls.tsx
  type Props (line 23) | interface Props {

FILE: packages/fossflow-lib/src/components/ItemControls/components/ControlsContainer.tsx
  type Props (line 4) | interface Props {

FILE: packages/fossflow-lib/src/components/ItemControls/components/DeleteButton.tsx
  type Props (line 5) | interface Props {

FILE: packages/fossflow-lib/src/components/ItemControls/components/Header.tsx
  type Props (line 7) | interface Props {

FILE: packages/fossflow-lib/src/components/ItemControls/components/Section.tsx
  type Props (line 4) | interface Props {

FILE: packages/fossflow-lib/src/components/Label/ExpandButton.tsx
  type Props (line 8) | interface Props {

FILE: packages/fossflow-lib/src/components/Label/ExpandableLabel.tsx
  type Props (line 9) | type Props = Omit<LabelProps, 'maxHeight'> & {
  constant STANDARD_LABEL_HEIGHT (line 13) | const STANDARD_LABEL_HEIGHT = 80;

FILE: packages/fossflow-lib/src/components/Label/Label.tsx
  constant CONNECTOR_DOT_SIZE (line 4) | const CONNECTOR_DOT_SIZE = 3;
  type Props (line 6) | interface Props {

FILE: packages/fossflow-lib/src/components/LassoHintTooltip/LassoHintTooltip.tsx
  constant STORAGE_KEY (line 7) | const STORAGE_KEY = 'fossflow_lasso_hint_dismissed';
  type Props (line 9) | interface Props {

FILE: packages/fossflow-lib/src/components/LazyLoadingWelcomeNotification/LazyLoadingWelcomeNotification.tsx
  constant STORAGE_KEY (line 6) | const STORAGE_KEY = 'fossflow-lazy-loading-welcome-dismissed';

FILE: packages/fossflow-lib/src/components/Loader/Loader.tsx
  type Props (line 4) | interface Props {

FILE: packages/fossflow-lib/src/components/MainMenu/MenuItem.tsx
  type Props (line 4) | interface Props {

FILE: packages/fossflow-lib/src/components/RichTextEditor/RichTextEditor.tsx
  type Props (line 6) | interface Props {

FILE: packages/fossflow-lib/src/components/RichTextEditor/RichTextEditorErrorBoundary.tsx
  type ErrorBoundaryProps (line 3) | interface ErrorBoundaryProps {
  type ErrorBoundaryState (line 8) | interface ErrorBoundaryState {
  class RichTextEditorErrorBoundary (line 13) | class RichTextEditorErrorBoundary extends Component<ErrorBoundaryProps, ...
    method constructor (line 14) | constructor(props: ErrorBoundaryProps) {
    method getDerivedStateFromError (line 22) | static getDerivedStateFromError(error: Error): Partial<ErrorBoundarySt...
    method componentDidCatch (line 39) | componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
    method componentDidUpdate (line 69) | componentDidUpdate(_prevProps: ErrorBoundaryProps, prevState: ErrorBou...
    method render (line 76) | render() {

FILE: packages/fossflow-lib/src/components/SceneLayer/SceneLayer.tsx
  type Props (line 6) | interface Props {

FILE: packages/fossflow-lib/src/components/SceneLayers/ConnectorLabels/ConnectorLabel.tsx
  type Props (line 15) | interface Props {

FILE: packages/fossflow-lib/src/components/SceneLayers/ConnectorLabels/ConnectorLabels.tsx
  type Props (line 5) | interface Props {

FILE: packages/fossflow-lib/src/components/SceneLayers/Connectors/Connector.tsx
  type Props (line 16) | interface Props {

FILE: packages/fossflow-lib/src/components/SceneLayers/Connectors/Connectors.tsx
  type Props (line 6) | interface Props {

FILE: packages/fossflow-lib/src/components/SceneLayers/Nodes/Node/IconTypes/IsometricIcon.tsx
  type Props (line 6) | interface Props {

FILE: packages/fossflow-lib/src/components/SceneLayers/Nodes/Node/IconTypes/NonIsometricIcon.tsx
  type Props (line 7) | interface Props {

FILE: packages/fossflow-lib/src/components/SceneLayers/Nodes/Node/Node.tsx
  type Props (line 15) | interface Props {

FILE: packages/fossflow-lib/src/components/SceneLayers/Nodes/Nodes.tsx
  type Props (line 5) | interface Props {

FILE: packages/fossflow-lib/src/components/SceneLayers/Rectangles/Rectangle.tsx
  type Props (line 7) | type Props = ReturnType<typeof useScene>['rectangles'][0];

FILE: packages/fossflow-lib/src/components/SceneLayers/Rectangles/Rectangles.tsx
  type Props (line 5) | interface Props {

FILE: packages/fossflow-lib/src/components/SceneLayers/TextBoxes/TextBox.tsx
  type Props (line 8) | interface Props {

FILE: packages/fossflow-lib/src/components/SceneLayers/TextBoxes/TextBoxes.tsx
  type Props (line 5) | interface Props {

FILE: packages/fossflow-lib/src/components/SettingsDialog/SettingsDialog.tsx
  type SettingsDialogProps (line 23) | interface SettingsDialogProps {

FILE: packages/fossflow-lib/src/components/Svg/Svg.tsx
  type Props (line 4) | type Props = React.SVGProps<SVGSVGElement> & {

FILE: packages/fossflow-lib/src/components/TransformControlsManager/NodeTransformControls.tsx
  type Props (line 5) | interface Props {

FILE: packages/fossflow-lib/src/components/TransformControlsManager/RectangleTransformControls.tsx
  type Props (line 7) | interface Props {

FILE: packages/fossflow-lib/src/components/TransformControlsManager/TextBoxTransformControls.tsx
  type Props (line 6) | interface Props {

FILE: packages/fossflow-lib/src/components/TransformControlsManager/TransformAnchor.tsx
  type Props (line 8) | interface Props {

FILE: packages/fossflow-lib/src/components/TransformControlsManager/TransformControls.tsx
  type Props (line 14) | interface Props {

FILE: packages/fossflow-lib/src/components/UiElement/UiElement.tsx
  type Props (line 4) | interface Props {

FILE: packages/fossflow-lib/src/components/UiOverlay/UiOverlay.tsx
  type EditorModeMapping (line 37) | interface EditorModeMapping {
  constant EDITOR_MODE_MAPPING (line 41) | const EDITOR_MODE_MAPPING: EditorModeMapping = {

FILE: packages/fossflow-lib/src/config.ts
  constant UNPROJECTED_TILE_SIZE (line 17) | const UNPROJECTED_TILE_SIZE = 100;
  constant TILE_PROJECTION_MULTIPLIERS (line 18) | const TILE_PROJECTION_MULTIPLIERS: Size = {
  constant PROJECTED_TILE_SIZE (line 22) | const PROJECTED_TILE_SIZE = {
  constant DEFAULT_COLOR (line 27) | const DEFAULT_COLOR: Colors[0] = {
  constant DEFAULT_FONT_FAMILY (line 32) | const DEFAULT_FONT_FAMILY = 'Roboto, Arial, sans-serif';
  constant VIEW_DEFAULTS (line 34) | const VIEW_DEFAULTS: Required<
  constant VIEW_ITEM_DEFAULTS (line 44) | const VIEW_ITEM_DEFAULTS: Required<Omit<ViewItem, 'id' | 'tile'>> = {
  constant CONNECTOR_DEFAULTS (line 48) | const CONNECTOR_DEFAULTS: Required<Omit<Connector, 'id' | 'color'>> = {
  constant CONNECTOR_SEARCH_OFFSET (line 66) | const CONNECTOR_SEARCH_OFFSET = { x: 1, y: 1 };
  constant TEXTBOX_DEFAULTS (line 68) | const TEXTBOX_DEFAULTS: Required<Omit<TextBox, 'id' | 'tile'>> = {
  constant TEXTBOX_PADDING (line 74) | const TEXTBOX_PADDING = 0.2;
  constant TEXTBOX_FONT_WEIGHT (line 75) | const TEXTBOX_FONT_WEIGHT = 'bold';
  constant RECTANGLE_DEFAULTS (line 77) | const RECTANGLE_DEFAULTS: Required<
  constant ZOOM_INCREMENT (line 83) | const ZOOM_INCREMENT = 0.05;
  constant MIN_ZOOM (line 84) | const MIN_ZOOM = 0.1;
  constant MAX_ZOOM (line 85) | const MAX_ZOOM = 1;
  constant TRANSFORM_ANCHOR_SIZE (line 86) | const TRANSFORM_ANCHOR_SIZE = 30;
  constant TRANSFORM_CONTROLS_COLOR (line 87) | const TRANSFORM_CONTROLS_COLOR = '#0392ff';
  constant INITIAL_DATA (line 88) | const INITIAL_DATA: InitialData = {
  constant INITIAL_UI_STATE (line 97) | const INITIAL_UI_STATE = {
  constant INITIAL_SCENE_STATE (line 104) | const INITIAL_SCENE_STATE = {
  constant MAIN_MENU_OPTIONS (line 108) | const MAIN_MENU_OPTIONS: MainMenuOptions = [
  constant DEFAULT_ICON (line 118) | const DEFAULT_ICON: Icon = {
  constant DEFAULT_LABEL_HEIGHT (line 125) | const DEFAULT_LABEL_HEIGHT = 20;
  constant PROJECT_BOUNDING_BOX_PADDING (line 126) | const PROJECT_BOUNDING_BOX_PADDING = 3;
  constant MARKDOWN_EMPTY_VALUE (line 127) | const MARKDOWN_EMPTY_VALUE = '<p><br></p>';

FILE: packages/fossflow-lib/src/config/hotkeys.ts
  type HotkeyProfile (line 1) | type HotkeyProfile = 'qwerty' | 'smnrct' | 'none';
  type HotkeyMapping (line 3) | interface HotkeyMapping {
  constant HOTKEY_PROFILES (line 14) | const HOTKEY_PROFILES: Record<HotkeyProfile, HotkeyMapping> = {
  constant DEFAULT_HOTKEY_PROFILE (line 47) | const DEFAULT_HOTKEY_PROFILE: HotkeyProfile = 'smnrct';

FILE: packages/fossflow-lib/src/config/labelSettings.ts
  type LabelSettings (line 1) | interface LabelSettings {
  constant DEFAULT_LABEL_SETTINGS (line 5) | const DEFAULT_LABEL_SETTINGS: LabelSettings = {

FILE: packages/fossflow-lib/src/config/panSettings.ts
  type PanSettings (line 1) | interface PanSettings {
  constant DEFAULT_PAN_SETTINGS (line 18) | const DEFAULT_PAN_SETTINGS: PanSettings = {

FILE: packages/fossflow-lib/src/config/zoomSettings.ts
  type ZoomSettings (line 1) | interface ZoomSettings {
  constant DEFAULT_ZOOM_SETTINGS (line 6) | const DEFAULT_ZOOM_SETTINGS: ZoomSettings = {

FILE: packages/fossflow-lib/src/global.d.ts
  type Window (line 7) | interface Window {
  type ReactQuillProps (line 18) | interface ReactQuillProps {

FILE: packages/fossflow-lib/src/hooks/useIsoProjection.ts
  type Props (line 10) | interface Props {

FILE: packages/fossflow-lib/src/interaction/useInteractionManager.ts
  type PendingMouseUpdate (line 24) | interface PendingMouseUpdate {

FILE: packages/fossflow-lib/src/schemas/validation.ts
  type IssueType (line 11) | type IssueType =
  type Issue (line 76) | type Issue = IssueType & {

FILE: packages/fossflow-lib/src/stores/localeStore.tsx
  type LocaleProviderProps (line 7) | interface LocaleProviderProps {
  type NestedKeyOf (line 29) | type NestedKeyOf<ObjectType extends object> = {
  function useTranslation (line 46) | function useTranslation<K extends keyof LocaleProps>(namespace?: K) {

FILE: packages/fossflow-lib/src/stores/modelStore.tsx
  type HistoryState (line 6) | interface HistoryState {
  type ModelStoreWithHistory (line 13) | interface ModelStoreWithHistory extends Omit<ModelStore, 'actions'> {
  constant MAX_HISTORY_SIZE (line 27) | const MAX_HISTORY_SIZE = 50;
  type ProviderProps (line 171) | interface ProviderProps {
  function useModelStore (line 189) | function useModelStore<T>(
  function useModelStoreApi (line 203) | function useModelStoreApi() {

FILE: packages/fossflow-lib/src/stores/reducers/types.ts
  type State (line 8) | interface State {
  type ViewReducerContext (line 13) | interface ViewReducerContext {
  type ViewReducerAction (line 18) | type ViewReducerAction =
  type ViewReducerParams (line 88) | type ViewReducerParams = ViewReducerAction & { ctx: ViewReducerContext };

FILE: packages/fossflow-lib/src/stores/sceneStore.tsx
  type SceneHistoryState (line 5) | interface SceneHistoryState {
  type SceneStoreWithHistory (line 12) | interface SceneStoreWithHistory extends Omit<SceneStore, 'actions'> {
  constant MAX_HISTORY_SIZE (line 26) | const MAX_HISTORY_SIZE = 50;
  type ProviderProps (line 168) | interface ProviderProps {
  function useSceneStore (line 186) | function useSceneStore<T>(
  function useSceneStoreApi (line 200) | function useSceneStoreApi() {

FILE: packages/fossflow-lib/src/stores/uiStateStore.tsx
  type ProviderProps (line 137) | interface ProviderProps {
  function useUiStateStore (line 157) | function useUiStateStore<T>(
  function useUiStateStoreApi (line 172) | function useUiStateStoreApi() {

FILE: packages/fossflow-lib/src/styles/theme.ts
  type CustomThemeVars (line 3) | interface CustomThemeVars {
  type Theme (line 17) | interface Theme {
  type ThemeOptions (line 21) | interface ThemeOptions {

FILE: packages/fossflow-lib/src/types/common.ts
  type Coords (line 1) | interface Coords {
  type Size (line 6) | interface Size {
  type Rect (line 11) | interface Rect {
  type BoundingBox (line 21) | type BoundingBox = [Coords, Coords, Coords, Coords];
  type SlimMouseEvent (line 23) | type SlimMouseEvent = Pick<
  type MainMenuOptions (line 44) | type MainMenuOptions = (keyof typeof MainMenuOptionsEnum)[];

FILE: packages/fossflow-lib/src/types/dom-to-image-more.d.ts
  type Options (line 2) | interface Options {

FILE: packages/fossflow-lib/src/types/interactions.ts
  type State (line 4) | interface State {
  type ModeActionsAction (line 13) | type ModeActionsAction = (state: State) => void;
  type ModeActions (line 15) | type ModeActions = {

FILE: packages/fossflow-lib/src/types/isoflowProps.ts
  type InitialData (line 5) | type InitialData = Model & {
  type LocaleProps (line 10) | interface LocaleProps {
  type IconPackManagerProps (line 201) | interface IconPackManagerProps {
  type IsoflowProps (line 216) | interface IsoflowProps {

FILE: packages/fossflow-lib/src/types/model.ts
  type Model (line 23) | type Model = z.infer<typeof modelSchema>;
  type ModelItems (line 24) | type ModelItems = z.infer<typeof modelItemsSchema>;
  type Icon (line 25) | type Icon = z.infer<typeof iconSchema>;
  type Icons (line 26) | type Icons = z.infer<typeof iconsSchema>;
  type Colors (line 27) | type Colors = z.infer<typeof colorsSchema>;
  type ModelItem (line 28) | type ModelItem = z.infer<typeof modelItemSchema>;
  type Views (line 29) | type Views = z.infer<typeof viewsSchema>;
  type View (line 30) | type View = z.infer<typeof viewSchema>;
  type ViewItem (line 31) | type ViewItem = z.infer<typeof viewItemSchema>;
  type ConnectorStyle (line 32) | type ConnectorStyle = keyof typeof connectorStyleOptions;
  type ConnectorLineType (line 33) | type ConnectorLineType = keyof typeof connectorLineTypeOptions;
  type ConnectorAnchor (line 34) | type ConnectorAnchor = z.infer<typeof anchorSchema>;
  type ConnectorLabel (line 35) | type ConnectorLabel = z.infer<typeof connectorLabelSchema>;
  type Connector (line 36) | type Connector = z.infer<typeof connectorSchema>;
  type TextBox (line 37) | type TextBox = z.infer<typeof textBoxSchema>;
  type Rectangle (line 38) | type Rectangle = z.infer<typeof rectangleSchema>;
  type ModelStore (line 40) | type ModelStore = Model & {

FILE: packages/fossflow-lib/src/types/rendererProps.ts
  type RendererProps (line 1) | interface RendererProps {

FILE: packages/fossflow-lib/src/types/scene.ts
  type TileOrigin (line 12) | type TileOrigin = keyof typeof tileOriginOptions;
  type ItemReferenceType (line 22) | type ItemReferenceType = keyof typeof ItemReferenceTypeOptions;
  type ItemReference (line 24) | type ItemReference = {
  type ConnectorPath (line 29) | type ConnectorPath = {
  type SceneConnector (line 34) | interface SceneConnector {
  type SceneTextBox (line 38) | interface SceneTextBox {
  type Scene (line 42) | interface Scene {
  type SceneStore (line 51) | type SceneStore = Scene & {

FILE: packages/fossflow-lib/src/types/ui.ts
  type AddItemControls (line 10) | interface AddItemControls {
  type ItemControls (line 14) | type ItemControls = ItemReference | AddItemControls;
  type Mouse (line 16) | interface Mouse {
  type InteractionsDisabled (line 32) | interface InteractionsDisabled {
  type CursorMode (line 37) | interface CursorMode {
  type DragItemsMode (line 43) | interface DragItemsMode {
  type PanMode (line 50) | interface PanMode {
  type PlaceIconMode (line 55) | interface PlaceIconMode {
  type ConnectorMode (line 61) | interface ConnectorMode {
  type DrawRectangleMode (line 73) | interface DrawRectangleMode {
  type AnchorPosition (line 86) | type AnchorPosition = keyof typeof AnchorPositionOptions;
  type TransformRectangleMode (line 88) | interface TransformRectangleMode {
  type TextBoxMode (line 95) | interface TextBoxMode {
  type LassoMode (line 101) | interface LassoMode {
  type FreehandLassoMode (line 112) | interface FreehandLassoMode {
  type Mode (line 123) | type Mode =
  type Scroll (line 137) | interface Scroll {
  type IconCollectionState (line 142) | interface IconCollectionState {
  type IconCollectionStateWithIcons (line 147) | type IconCollectionStateWithIcons = IconCollectionState & {
  type ContextMenu (line 157) | interface ContextMenu {
  type ConnectorInteractionMode (line 164) | type ConnectorInteractionMode = 'click' | 'drag';
  type UiState (line 166) | interface UiState {
  type UiStateActions (line 191) | interface UiStateActions {
  type UiStateStore (line 219) | type UiStateStore = UiState & {

FILE: packages/fossflow-lib/src/utils/CoordsUtils.ts
  class CoordsUtils (line 3) | class CoordsUtils {
    method isEqual (line 4) | static isEqual(base: Coords, operand: Coords) {
    method subtract (line 8) | static subtract(base: Coords, operand: Coords): Coords {
    method add (line 12) | static add(base: Coords, operand: Coords): Coords {
    method multiply (line 16) | static multiply(base: Coords, operand: number): Coords {
    method toString (line 20) | static toString(coords: Coords) {
    method sum (line 24) | static sum(coords: Coords) {
    method zero (line 28) | static zero() {

FILE: packages/fossflow-lib/src/utils/SizeUtils.ts
  class SizeUtils (line 3) | class SizeUtils {
    method isEqual (line 4) | static isEqual(base: Size, operand: Size) {
    method subtract (line 8) | static subtract(base: Size, operand: Size): Size {
    method add (line 15) | static add(base: Size, operand: Size): Size {
    method multiply (line 22) | static multiply(base: Size, operand: number): Size {
    method toString (line 26) | static toString(size: Size) {
    method zero (line 30) | static zero() {

FILE: packages/fossflow-lib/src/utils/common.ts
  type GetColorVariantOpts (line 25) | interface GetColorVariantOpts {
  function getItemByIdOrThrow (line 86) | function getItemByIdOrThrow<T extends { id: string }>(
  function getItemById (line 101) | function getItemById<T extends { id: string }>(
  function getItemByIndexOrThrow (line 116) | function getItemByIndexOrThrow<T>(items: T[], index: number): T {

FILE: packages/fossflow-lib/src/utils/pathfinder.ts
  type Args (line 4) | interface Args {

FILE: packages/fossflow-lib/src/utils/renderer.ts
  type ScreenToIso (line 43) | interface ScreenToIso {
  type GetTilePosition (line 80) | interface GetTilePosition {
  type IsoToScreen (line 112) | type IsoToScreen = GetTilePosition & {
  type GetMouse (line 243) | interface GetMouse {
  type NormalisePositionFromOrigin (line 334) | interface NormalisePositionFromOrigin {
  type GetConnectorPath (line 346) | interface GetConnectorPath {
  type GetRectangleFromSize (line 402) | type GetRectangleFromSize = (
  type GetItemAtTile (line 444) | interface GetItemAtTile {
  type FontProps (line 519) | interface FontProps {
Condensed preview — 369 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,777K chars).
[
  {
    "path": ".dockerignore",
    "chars": 61,
    "preview": "node_modules\n.git\n.devcontainer\n*.md\n.env\ndiagrams\ne2e-tests\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 854,
    "preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 3264,
    "preview": "name: 🐛 Bug Report\ndescription: Something isn't working as expected. Please provide enough detail that I can actually re"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 414,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: 💬 General Discussion\n    url: https://github.com/stan-smith/FossFLO"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 2556,
    "preview": "name: 💡 Feature Request\ndescription: Suggest a new feature or improvement. Please check the project scope first.\ntitle: "
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 885,
    "preview": "## What does this PR do?\n\n<!-- Explain clearly what this changes and why. Link to the related issue. -->\n\nFixes #\n\n## Ty"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 461,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"npm\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n    open-pull"
  },
  {
    "path": ".github/workflows/dependabot-automerge.yml",
    "chars": 688,
    "preview": "name: Dependabot Auto-Merge\n\non:\n  pull_request:\n\npermissions:\n  contents: write\n  pull-requests: write\n\njobs:\n  automer"
  },
  {
    "path": ".github/workflows/docker.yml",
    "chars": 1947,
    "preview": "name: Build and Push Docker Image\n\non:\n  workflow_run:\n    workflows: [\"E2E Tests\"]\n    types:\n      - completed\n    bra"
  },
  {
    "path": ".github/workflows/e2e-tests.yml",
    "chars": 3800,
    "preview": "name: E2E Tests\n\non:\n  # Runs on PRs so we can gate merges on E2E results\n  pull_request:\n    branches: [\"main\", \"master"
  },
  {
    "path": ".github/workflows/e2e-tests.yml.backup",
    "chars": 3651,
    "preview": "name: E2E Tests\n\non:\n  # Runs after unit tests complete successfully\n  workflow_run:\n    workflows: [\"Run Tests\"]\n    ty"
  },
  {
    "path": ".github/workflows/ethicalcheck.yml",
    "chars": 3215,
    "preview": "# This workflow uses actions that are not certified by GitHub.\n# They are provided by a third-party and are governed by\n"
  },
  {
    "path": ".github/workflows/pages.yml",
    "chars": 1437,
    "preview": "# Simple workflow for deploying static content to GitHub Pages\nname: Deploy static content to Pages\n\non:\n  # Runs after "
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 928,
    "preview": "name: Release\n\non:\n  # Runs after Pages deployment completes successfully\n  workflow_run:\n    workflows: [\"Deploy static"
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 1406,
    "preview": "name: Run Tests\n\non:\n  push:\n    branches: [\"main\", \"master\"]\n  pull_request:\n    branches: [\"main\", \"master\"]\n\njobs:\n  "
  },
  {
    "path": ".gitignore",
    "chars": 194,
    "preview": "node_modules/\ndist/\nbuild/\n*.log\n.env\n.env.local\n.DS_Store\ncoverage/\n.vscode/\n.idea/\n*.swp\n*.swo\n*~\n.npm\n.eslintcache\n*."
  },
  {
    "path": ".npmignore",
    "chars": 279,
    "preview": "# Source files\nsrc/\nwebpack/\ndocs/\n.circleci/\n.codesandbox/\n.vscode/\n\n# Config files\n.eslintrc\n.prettierrc\n.nvmrc\njest.c"
  },
  {
    "path": ".nvmrc",
    "chars": 7,
    "preview": "16.19.0"
  },
  {
    "path": ".prettierrc",
    "chars": 105,
    "preview": "{\n  \"semi\": true,\n  \"trailingComma\": \"none\",\n  \"singleQuote\": true,\n  \"printWidth\": 80,\n  \"tabWidth\": 2\n}"
  },
  {
    "path": ".releaserc.json",
    "chars": 2644,
    "preview": "{\n  \"branches\": [\"master\", \"main\"],\n  \"repositoryUrl\": \"https://github.com/stan-smith/FossFLOW.git\",\n  \"plugins\": [\n    "
  },
  {
    "path": "CHANGELOG.md",
    "chars": 83216,
    "preview": "# Changelog\n\nAll notable changes to FossFLOW will be documented in this file.\n\nThe format is based on [Keep a Changelog]"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 13437,
    "preview": "# Contributing to FossFLOW\n\nThank you for your interest in contributing to FossFLOW! This guide will help you get starte"
  },
  {
    "path": "Dockerfile",
    "chars": 1402,
    "preview": "# Use the official Node.js runtime as the base image\nFROM node:22 AS build\n\n# Set the working directory in the container"
  },
  {
    "path": "FOSSFLOW_ENCYCLOPEDIA.md",
    "chars": 34617,
    "preview": "# FossFLOW Codebase Encyclopedia\n\n**Last Updated**: October 2025\n**Original Created**: August 14, 2025 (commit 94bf3c0)\n"
  },
  {
    "path": "LICENSE",
    "chars": 1072,
    "preview": "MIT License\n\nCopyright (c) 2023 Mark Mankarious\n\nPermission is hereby granted, free of charge, to any person obtaining a"
  },
  {
    "path": "README.md",
    "chars": 6088,
    "preview": "# FossFLOW - Isometric Diagramming Tool <img width=\"30\" height=\"30\" alt=\"fossflow\" src=\"https://github.com/user-attachme"
  },
  {
    "path": "compose.dev.yml",
    "chars": 374,
    "preview": "services:\n  fossflow:\n    build: .\n    ports:\n      - \"3000:80\"\n      - \"3001:3001\"\n    environment:\n      - NODE_ENV=de"
  },
  {
    "path": "compose.yml",
    "chars": 444,
    "preview": "services:\n  fossflow:\n    image: stnsmith/fossflow:latest\n    pull_policy: always\n    ports:\n      - 80:80\n    environme"
  },
  {
    "path": "docker-entrypoint.sh",
    "chars": 894,
    "preview": "#!/bin/sh\n\n# Start Node.js backend if server storage is enabled\nif [ \"$ENABLE_SERVER_STORAGE\" = \"true\" ]; then\n    echo "
  },
  {
    "path": "docs/README.bn.md",
    "chars": 9250,
    "preview": "# FossFLOW - আইসোমেট্রিক ডায়াগ্রাম টুল <img width=\"30\" height=\"30\" alt=\"fossflow\" src=\"https://github.com/user-attachme"
  },
  {
    "path": "docs/README.cn.md",
    "chars": 3536,
    "preview": "# FossFLOW - 等距图表工具 <img width=\"30\" height=\"30\" alt=\"fossflow\" src=\"https://github.com/user-attachments/assets/56d78887-"
  },
  {
    "path": "docs/README.de.md",
    "chars": 5575,
    "preview": "# FossFLOW - Isometrisches Diagramm-Werkzeug <img width=\"30\" height=\"30\" alt=\"fossflow\" src=\"https://github.com/user-att"
  },
  {
    "path": "docs/README.es.md",
    "chars": 10381,
    "preview": "# FossFLOW - Herramienta de Diagramas Isométricos <img width=\"30\" height=\"30\" alt=\"fossflow\" src=\"https://github.com/use"
  },
  {
    "path": "docs/README.fr.md",
    "chars": 10623,
    "preview": "# FossFLOW - Outil de Diagrammes Isométriques <img width=\"30\" height=\"30\" alt=\"fossflow\" src=\"https://github.com/user-at"
  },
  {
    "path": "docs/README.hi.md",
    "chars": 9014,
    "preview": "# FossFLOW - आइसोमेट्रिक आरेख उपकरण <img width=\"30\" height=\"30\" alt=\"fossflow\" src=\"https://github.com/user-attachments/"
  },
  {
    "path": "docs/README.id.md",
    "chars": 8536,
    "preview": "# FossFLOW - Alat Diagram Isometrik <img width=\"30\" height=\"30\" alt=\"fossflow\" src=\"https://github.com/user-attachments/"
  },
  {
    "path": "docs/README.pt.md",
    "chars": 10126,
    "preview": "# FossFLOW - Ferramenta de Diagramas Isométricos <img width=\"30\" height=\"30\" alt=\"fossflow\" src=\"https://github.com/user"
  },
  {
    "path": "docs/README.ru.md",
    "chars": 10096,
    "preview": "# FossFLOW - Инструмент для изометрических диаграмм <img width=\"30\" height=\"30\" alt=\"fossflow\" src=\"https://github.com/u"
  },
  {
    "path": "docs/SEMANTIC_RELEASE.md",
    "chars": 5250,
    "preview": "# Semantic Release Setup\n\nThis document explains how FossFLOW uses automated semantic versioning and releases.\n\n## Overv"
  },
  {
    "path": "e2e-tests/.gitignore",
    "chars": 83,
    "preview": "__pycache__/\n*.pyc\n.pytest_cache/\nhtmlcov/\n.coverage\n*.log\nvenv/\nenv/\nscreenshots/\n"
  },
  {
    "path": "e2e-tests/README.md",
    "chars": 4488,
    "preview": "# FossFLOW E2E Tests\n\nEnd-to-end tests for FossFLOW using Selenium WebDriver with Python and pytest.\n\n## Prerequisites\n\n"
  },
  {
    "path": "e2e-tests/SETUP.md",
    "chars": 5632,
    "preview": "# E2E Testing Setup Summary\n\n## What Was Added\n\nA complete Selenium-based end-to-end testing framework using Python and "
  },
  {
    "path": "e2e-tests/get-docker.sh",
    "chars": 21013,
    "preview": "#!/bin/sh\nset -e\n# Docker Engine for Linux installation script.\n#\n# This script is intended as a convenient way to confi"
  },
  {
    "path": "e2e-tests/pytest.ini",
    "chars": 125,
    "preview": "[pytest]\ntestpaths = tests\npython_files = test_*.py\npython_classes = Test*\npython_functions = test_*\naddopts = -v --tb=s"
  },
  {
    "path": "e2e-tests/requirements.txt",
    "chars": 51,
    "preview": "selenium==4.27.1\npytest==8.3.4\npytest-xdist==3.6.1\n"
  },
  {
    "path": "e2e-tests/run-tests.sh",
    "chars": 2764,
    "preview": "#!/bin/bash\n\n# Helper script to run E2E tests locally\n\nset -e\n\nSELENIUM_CONTAINER=\"fossflow-selenium\"\nAPP_PORT=3000\nSELE"
  },
  {
    "path": "e2e-tests/test-base-paths.sh",
    "chars": 5608,
    "preview": "#!/bin/bash\n# Test FossFLOW deployment at different base paths\n# This simulates how the app will be served on GitHub Pag"
  },
  {
    "path": "e2e-tests/test-diagram.json",
    "chars": 358166,
    "preview": "{\n  \"title\": \"Untitled Diagram\",\n  \"icons\": [\n    {\n      \"id\": \"block\",\n      \"name\": \"block\",\n      \"url\": \"data:image"
  },
  {
    "path": "e2e-tests/tests/test_base_path_routing.py",
    "chars": 10174,
    "preview": "\"\"\"\nE2E tests for verifying the app works correctly when served from different base paths.\nThis catches issues with Reac"
  },
  {
    "path": "e2e-tests/tests/test_basic_load.py",
    "chars": 7943,
    "preview": "\"\"\"\nBasic E2E tests for FossFLOW application.\nTests basic page loading, canvas presence, and rendering.\n\"\"\"\nimport os\nim"
  },
  {
    "path": "e2e-tests/tests/test_connector_undo.py",
    "chars": 14307,
    "preview": "\"\"\"E2E test: place two nodes, connect them, then undo/redo the connector.\"\"\"\nimport os\nimport time\nimport pytest\nfrom se"
  },
  {
    "path": "e2e-tests/tests/test_export_svg.py",
    "chars": 16308,
    "preview": "\"\"\"E2E test: build a scene with nodes, rectangle, and text, then export as SVG.\"\"\"\nimport os\nimport time\nimport glob\nimp"
  },
  {
    "path": "e2e-tests/tests/test_import_diagram.py",
    "chars": 17224,
    "preview": "\"\"\"E2E test: import a diagram JSON file and verify all elements loaded correctly.\"\"\"\nimport os\nimport time\nimport json\ni"
  },
  {
    "path": "e2e-tests/tests/test_multi_node_undo.py",
    "chars": 11384,
    "preview": "\"\"\"E2E test: place multiple nodes, then undo/redo through them.\"\"\"\nimport os\nimport time\nimport pytest\nfrom selenium imp"
  },
  {
    "path": "e2e-tests/tests/test_node_placement.py",
    "chars": 22552,
    "preview": "\"\"\"\nE2E tests for placing nodes on the FossFLOW canvas and undo/redo.\nTakes screenshots at each step to visually verify "
  },
  {
    "path": "e2e-tests/tests/test_rect_text_undo.py",
    "chars": 13536,
    "preview": "\"\"\"E2E tests: rectangle and text box creation with undo/redo.\"\"\"\nimport os\nimport time\nimport pytest\nfrom selenium impor"
  },
  {
    "path": "e2e-tests/tests/test_store_debug.py",
    "chars": 8928,
    "preview": "\"\"\"Direct store-level undo/redo debugging.\"\"\"\nimport time\nimport json\nfrom selenium import webdriver\nfrom selenium.webdr"
  },
  {
    "path": "nginx.conf",
    "chars": 1055,
    "preview": "server {\n    listen 80;\n    # Basic authentication (AUTH_BASIC_SETTING replaced by docker-entrypoint.sh)\n    auth_basic "
  },
  {
    "path": "package.json",
    "chars": 1832,
    "preview": "{\n  \"name\": \"fossflow-monorepo\",\n  \"version\": \"1.10.8\",\n  \"private\": true,\n  \"description\": \"Monorepo for FossFLOW diagr"
  },
  {
    "path": "packages/fossflow-app/LICENSE",
    "chars": 1211,
    "preview": "This is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, c"
  },
  {
    "path": "packages/fossflow-app/README.md",
    "chars": 4490,
    "preview": "# FossFLOW - Isometric Diagramming Tool\n\nFossFLOW is a powerful, open-source Progressive Web App (PWA) for creating beau"
  },
  {
    "path": "packages/fossflow-app/package.json",
    "chars": 1248,
    "preview": "{\n  \"name\": \"fossflow-app\",\n  \"version\": \"1.10.8\",\n  \"private\": true,\n  \"description\": \"Progressive Web App for creating"
  },
  {
    "path": "packages/fossflow-app/public/i18n/app/bn-BD.json",
    "chars": 3133,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"নতুন ডায়াগ্রাম\",\n        \"saveSessionOnly\": \"সংরক্ষণ করুন (শুধুমাত্র সেশন)\",\n    "
  },
  {
    "path": "packages/fossflow-app/public/i18n/app/de-DE.json",
    "chars": 2895,
    "preview": "{\n  \"nav\": {\n    \"newDiagram\": \"Neues Diagramm\",\n    \"saveSessionOnly\": \"Speichern (nur Browser)\",\n    \"loadSessionOnly\""
  },
  {
    "path": "packages/fossflow-app/public/i18n/app/en-US.json",
    "chars": 2810,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"New Diagram\",\n        \"saveSessionOnly\": \"Save (Session Only)\",\n        \"loadSessi"
  },
  {
    "path": "packages/fossflow-app/public/i18n/app/es-ES.json",
    "chars": 3151,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"Nuevo diagrama\",\n        \"saveSessionOnly\": \"Guardar (Solo sesión)\",\n        \"load"
  },
  {
    "path": "packages/fossflow-app/public/i18n/app/fr-FR.json",
    "chars": 3303,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"Nouveau diagramme\",\n        \"saveSessionOnly\": \"Enregistrer (Session uniquement)\","
  },
  {
    "path": "packages/fossflow-app/public/i18n/app/hi-IN.json",
    "chars": 2984,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"नया आरेख\",\n        \"saveSessionOnly\": \"सहेजें (केवल सत्र)\",\n        \"loadSessionOn"
  },
  {
    "path": "packages/fossflow-app/public/i18n/app/id-ID.json",
    "chars": 3051,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"Diagram Baru\",\n        \"saveSessionOnly\": \"Simpan (Hanya Sesi)\",\n        \"loadSess"
  },
  {
    "path": "packages/fossflow-app/public/i18n/app/it-IT.json",
    "chars": 3069,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"Nuovo Diagramma\",\n        \"saveSessionOnly\": \"Salva (solo sessione)\",\n        \"loa"
  },
  {
    "path": "packages/fossflow-app/public/i18n/app/pt-BR.json",
    "chars": 3096,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"Novo diagrama\",\n        \"saveSessionOnly\": \"Salvar (Apenas sessão)\",\n        \"load"
  },
  {
    "path": "packages/fossflow-app/public/i18n/app/ru-RU.json",
    "chars": 3112,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"Новая диаграмма\",\n        \"saveSessionOnly\": \"Сохранить (Только сеанс)\",\n        \""
  },
  {
    "path": "packages/fossflow-app/public/i18n/app/tr-TR.json",
    "chars": 3042,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"Yeni Diyagram\",\n        \"saveSessionOnly\": \"Kaydet (Yalnızca Oturum)\",\n        \"lo"
  },
  {
    "path": "packages/fossflow-app/public/i18n/app/zh-CN.json",
    "chars": 1935,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"新建图表\",\n        \"saveSessionOnly\": \"保存(仅会话)\",\n        \"loadSessionOnly\": \"加载(仅会话)\","
  },
  {
    "path": "packages/fossflow-app/public/index.html",
    "chars": 1867,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <link rel=\"icon\" href=\"<%= assetPrefix %>favi"
  },
  {
    "path": "packages/fossflow-app/public/manifest.json",
    "chars": 753,
    "preview": "{\n  \"short_name\": \"FossFLOW\",\n  \"name\": \"FossFLOW - Isometric Diagramming Tool\",\n  \"description\": \"Create beautiful isom"
  },
  {
    "path": "packages/fossflow-app/public/robots.txt",
    "chars": 67,
    "preview": "# https://www.robotstxt.org/robotstxt.html\nUser-agent: *\nDisallow:\n"
  },
  {
    "path": "packages/fossflow-app/public/service-worker.js",
    "chars": 1641,
    "preview": "const CACHE_NAME = 'fossflow-v1';\n\n// Get the base path from the service worker's location\nconst swPath = self.location."
  },
  {
    "path": "packages/fossflow-app/rsbuild.config.ts",
    "chars": 1453,
    "preview": "import { defineConfig } from '@rsbuild/core';\nimport { pluginReact } from '@rsbuild/plugin-react';\nimport path from 'pat"
  },
  {
    "path": "packages/fossflow-app/src/App.css",
    "chars": 2796,
    "preview": ".App {\n  height: 100vh;\n  display: flex;\n  flex-direction: column;\n  overflow: hidden;\n}\n\n.toolbar {\n  background-color:"
  },
  {
    "path": "packages/fossflow-app/src/App.tsx",
    "chars": 32225,
    "preview": "import { useState, useEffect, useRef } from 'react';\nimport { Isoflow } from 'fossflow';\nimport { flattenCollections } f"
  },
  {
    "path": "packages/fossflow-app/src/EditorPage.tsx",
    "chars": 19801,
    "preview": "import { useState, useEffect, useRef } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport {"
  },
  {
    "path": "packages/fossflow-app/src/StorageManager.tsx",
    "chars": 5340,
    "preview": "import React, { useState, useEffect } from 'react';\n\ninterface StorageInfo {\n  used: number;\n  diagrams: number;\n  other"
  },
  {
    "path": "packages/fossflow-app/src/components/ChangeLanguage/index.tsx",
    "chars": 1627,
    "preview": "import { useState, useRef, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport './styles.cs"
  },
  {
    "path": "packages/fossflow-app/src/components/ChangeLanguage/styles.css",
    "chars": 809,
    "preview": ".language-selector {\n  position: relative;\n  display: inline-block;\n  font-size: 14px;\n  cursor: pointer;\n}\n\n.language-d"
  },
  {
    "path": "packages/fossflow-app/src/components/DiagramManager.css",
    "chars": 3698,
    "preview": ".diagram-manager-overlay {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background: rgba(0, 0, 0, "
  },
  {
    "path": "packages/fossflow-app/src/components/DiagramManager.tsx",
    "chars": 10103,
    "preview": "import React, { useState, useEffect } from 'react';\nimport { storageManager, DiagramInfo } from '../services/storageServ"
  },
  {
    "path": "packages/fossflow-app/src/components/ErrorBoundary.css",
    "chars": 1305,
    "preview": ".error-page-container {\n  width: 100%;\n  height: 100vh;\n  overflow: hidden;\n  display: flex;\n  justify-content: center;\n"
  },
  {
    "path": "packages/fossflow-app/src/components/ErrorBoundary.tsx",
    "chars": 3577,
    "preview": "import './ErrorBoundary.css';\n\ninterface ErrorBoundaryFallbackUIProps {\n  error: Error;\n}\n\nexport default function Error"
  },
  {
    "path": "packages/fossflow-app/src/diagramUtils.ts",
    "chars": 1843,
    "preview": "// Utility functions for handling diagram data\n\nexport interface DiagramData {\n  title: string;\n  version?: string;\n  de"
  },
  {
    "path": "packages/fossflow-app/src/env.d.ts",
    "chars": 46,
    "preview": "/// <reference types=\"@rsbuild/core/types\" />\n"
  },
  {
    "path": "packages/fossflow-app/src/i18n/bn-BD.json",
    "chars": 3133,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"নতুন ডায়াগ্রাম\",\n        \"saveSessionOnly\": \"সংরক্ষণ করুন (শুধুমাত্র সেশন)\",\n    "
  },
  {
    "path": "packages/fossflow-app/src/i18n/en-US.json",
    "chars": 2810,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"New Diagram\",\n        \"saveSessionOnly\": \"Save (Session Only)\",\n        \"loadSessi"
  },
  {
    "path": "packages/fossflow-app/src/i18n/es-ES.json",
    "chars": 3110,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"Nuevo diagrama\",\n        \"saveSessionOnly\": \"Guardar (Solo sesión)\",\n        \"load"
  },
  {
    "path": "packages/fossflow-app/src/i18n/fr-FR.json",
    "chars": 3303,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"Nouveau diagramme\",\n        \"saveSessionOnly\": \"Enregistrer (Session uniquement)\","
  },
  {
    "path": "packages/fossflow-app/src/i18n/hi-IN.json",
    "chars": 2984,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"नया आरेख\",\n        \"saveSessionOnly\": \"सहेजें (केवल सत्र)\",\n        \"loadSessionOn"
  },
  {
    "path": "packages/fossflow-app/src/i18n/it-IT.json",
    "chars": 3069,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"Nuovo Diagramma\",\n        \"saveSessionOnly\": \"Salva (solo sessione)\",\n        \"loa"
  },
  {
    "path": "packages/fossflow-app/src/i18n/pl-PL.json",
    "chars": 2979,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"Nowy Diagram\",\n        \"saveSessionOnly\": \"Zapisz (tylko bieżąca sesja)\",\n        "
  },
  {
    "path": "packages/fossflow-app/src/i18n/pt-BR.json",
    "chars": 3096,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"Novo diagrama\",\n        \"saveSessionOnly\": \"Salvar (Apenas sessão)\",\n        \"load"
  },
  {
    "path": "packages/fossflow-app/src/i18n/ru-RU.json",
    "chars": 3112,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"Новая диаграмма\",\n        \"saveSessionOnly\": \"Сохранить (Только сеанс)\",\n        \""
  },
  {
    "path": "packages/fossflow-app/src/i18n/tr-TR.json",
    "chars": 3042,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"Yeni Diyagram\",\n        \"saveSessionOnly\": \"Kaydet (Yalnızca Oturum)\",\n        \"lo"
  },
  {
    "path": "packages/fossflow-app/src/i18n/zh-CN.json",
    "chars": 1935,
    "preview": "{\n    \"nav\": {\n        \"newDiagram\": \"新建图表\",\n        \"saveSessionOnly\": \"保存(仅会话)\",\n        \"loadSessionOnly\": \"加载(仅会话)\","
  },
  {
    "path": "packages/fossflow-app/src/i18n.ts",
    "chars": 1458,
    "preview": "import i18n from 'i18next';\nimport { initReactI18next } from 'react-i18next';\nimport Backend from 'i18next-http-backend'"
  },
  {
    "path": "packages/fossflow-app/src/index.css",
    "chars": 366,
    "preview": "body {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n    'Ubuntu', 'Can"
  },
  {
    "path": "packages/fossflow-app/src/index.tsx",
    "chars": 1452,
    "preview": "import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport './index.css';\nimport 'react-quill-new/dist/q"
  },
  {
    "path": "packages/fossflow-app/src/minimalIcons.ts",
    "chars": 952,
    "preview": "// Minimal icons needed for Isoflow functionality\n// These are system icons that Isoflow uses internally\n\nexport const g"
  },
  {
    "path": "packages/fossflow-app/src/paymentFlowExample.json",
    "chars": 7161,
    "preview": "{\n  \"title\": \"E-Commerce Payment Processing Flow\",\n  \"icons\": [],\n  \"colors\": [\n    { \"id\": \"blue\", \"value\": \"#0066cc\" }"
  },
  {
    "path": "packages/fossflow-app/src/reportWebVitals.ts",
    "chars": 425,
    "preview": "import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n  if (onPerfEntr"
  },
  {
    "path": "packages/fossflow-app/src/serviceWorkerRegistration.ts",
    "chars": 3323,
    "preview": "const isLocalhost = Boolean(\n  window.location.hostname === 'localhost' ||\n  window.location.hostname === '[::1]' ||\n  w"
  },
  {
    "path": "packages/fossflow-app/src/services/iconPackManager.ts",
    "chars": 8076,
    "preview": "import { useState, useEffect, useCallback } from 'react';\nimport { flattenCollections } from '@isoflow/isopacks/dist/uti"
  },
  {
    "path": "packages/fossflow-app/src/services/storageService.ts",
    "chars": 8088,
    "preview": "import { Model } from 'fossflow/dist/types';\n\nexport interface DiagramInfo {\n  id: string;\n  name: string;\n  lastModifie"
  },
  {
    "path": "packages/fossflow-app/src/usePersistedDiagram.ts",
    "chars": 1905,
    "preview": "import { useState, useEffect, useCallback } from 'react';\nimport { DiagramData } from './diagramUtils';\n\ninterface Persi"
  },
  {
    "path": "packages/fossflow-app/tsconfig.json",
    "chars": 146,
    "preview": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"compilerOptions\": {\n    \"noEmit\": true,\n    \"target\": \"es5\"\n  },\n  \"includ"
  },
  {
    "path": "packages/fossflow-backend/package.json",
    "chars": 428,
    "preview": "{\n  \"name\": \"fossflow-backend\",\n  \"version\": \"1.10.8\",\n  \"description\": \"Optional backend server for FossFLOW persistent"
  },
  {
    "path": "packages/fossflow-backend/server.js",
    "chars": 8238,
    "preview": "import express from 'express';\nimport cors from 'cors';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport { "
  },
  {
    "path": "packages/fossflow-lib/.gitignore",
    "chars": 5,
    "preview": "dist\n"
  },
  {
    "path": "packages/fossflow-lib/LICENSE",
    "chars": 1072,
    "preview": "MIT License\n\nCopyright (c) 2025 Mark Mankarious\n\nPermission is hereby granted, free of charge, to any person obtaining a"
  },
  {
    "path": "packages/fossflow-lib/docs/.gitignore",
    "chars": 18,
    "preview": "node_modules\n.next"
  },
  {
    "path": "packages/fossflow-lib/docs/next-env.d.ts",
    "chars": 201,
    "preview": "/// <reference types=\"next\" />\n/// <reference types=\"next/image-types/global\" />\n\n// NOTE: This file should not be edite"
  },
  {
    "path": "packages/fossflow-lib/docs/next.config.js",
    "chars": 163,
    "preview": "const withNextra = require('nextra')({\n  theme: 'nextra-theme-docs',\n  themeConfig: './theme.config.tsx',\n  basePath: '/"
  },
  {
    "path": "packages/fossflow-lib/docs/package.json",
    "chars": 401,
    "preview": "{\n  \"name\": \"isoflow-docs\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"dev\": \""
  },
  {
    "path": "packages/fossflow-lib/docs/pages/_meta.json",
    "chars": 43,
    "preview": "{\n    \"docs\": \"Isoflow Community Edition\"\n}"
  },
  {
    "path": "packages/fossflow-lib/docs/pages/docs/_meta.json",
    "chars": 205,
    "preview": "{\n    \"index\": \"About the Community Edition\",\n    \"installation\": \"Installation\",\n    \"quickstart\": \"Quick start\",\n    \""
  },
  {
    "path": "packages/fossflow-lib/docs/pages/docs/api/_meta.json",
    "chars": 58,
    "preview": "{\n    \"index\": \"Props\",\n    \"initialData\": \"InitialData\"\n}"
  },
  {
    "path": "packages/fossflow-lib/docs/pages/docs/api/index.mdx",
    "chars": 1467,
    "preview": "# Props\n\n| Name | Type | Description | Default |\n| --- | --- | --- | --- |\n| `initialData` | [`object`](/docs/api/initia"
  },
  {
    "path": "packages/fossflow-lib/docs/pages/docs/api/initialData.mdx",
    "chars": 4255,
    "preview": "# `initialData`\n\nThe `initialData` object contains the following properties:\n\n| Name | Type | Default |\n| --- | --- | --"
  },
  {
    "path": "packages/fossflow-lib/docs/pages/docs/contributing.mdx",
    "chars": 766,
    "preview": "# Contributing\n\n### Branching Strategy:\n\nBranches are named using the following convention:\n\n- `feature/` for new featur"
  },
  {
    "path": "packages/fossflow-lib/docs/pages/docs/index.mdx",
    "chars": 442,
    "preview": "# About\nIsoflow is an open-core project. We offer the [Isoflow Community Edition](https://github.com/markmanx/isoflow) a"
  },
  {
    "path": "packages/fossflow-lib/docs/pages/docs/installation.mdx",
    "chars": 758,
    "preview": "# Installation\n\nIsoflow is published as a **React component** you can embed into your project.\n\nTo install using `npm`:\n"
  },
  {
    "path": "packages/fossflow-lib/docs/pages/docs/isopacks.mdx",
    "chars": 2397,
    "preview": "# Isopacks\n\n**Isopacks** are add-on modules for Isoflow that contain icons and other assets.  You can easily build your "
  },
  {
    "path": "packages/fossflow-lib/docs/pages/docs/quickstart.mdx",
    "chars": 1134,
    "preview": "# Quick Start\n\nIsoflow can be imported as an ES6 module:\n\n```jsx\nimport Isoflow from \"isoflow\";\n```\n\n### Basic usage\n\n``"
  },
  {
    "path": "packages/fossflow-lib/docs/pages/index.tsx",
    "chars": 214,
    "preview": "import { useEffect } from 'react';\nimport { useRouter } from 'next/router';\n\nexport default function Home() {\n  const { "
  },
  {
    "path": "packages/fossflow-lib/docs/theme.config.tsx",
    "chars": 600,
    "preview": "import React from 'react';\n\nexport default {\n  darkMode: false,\n  logo: () => {\n    return (\n      <span\n        style={"
  },
  {
    "path": "packages/fossflow-lib/docs/tsconfig.json",
    "chars": 491,
    "preview": "{\n  \"compilerOptions\": {\n    \"lib\": [\n      \"dom\",\n      \"dom.iterable\",\n      \"esnext\"\n    ],\n    \"allowJs\": true,\n    "
  },
  {
    "path": "packages/fossflow-lib/jest.config.js",
    "chars": 1164,
    "preview": "/** @type {import('ts-jest').JestConfigWithTsJest} */\nmodule.exports = {\n  preset: \"ts-jest\",\n  testEnvironment: \"jsdom\""
  },
  {
    "path": "packages/fossflow-lib/jest.setup.js",
    "chars": 38,
    "preview": "require('@testing-library/jest-dom'); "
  },
  {
    "path": "packages/fossflow-lib/package.json",
    "chars": 2243,
    "preview": "{\n  \"name\": \"fossflow\",\n  \"version\": \"1.10.8\",\n  \"private\": false,\n  \"description\": \"An open-source React component for "
  },
  {
    "path": "packages/fossflow-lib/rslib.config.ts",
    "chars": 969,
    "preview": "import { defineConfig } from '@rslib/core';\nimport { pluginReact } from '@rsbuild/plugin-react';\n\nconst packageJson = re"
  },
  {
    "path": "packages/fossflow-lib/src/Isoflow.tsx",
    "chars": 3587,
    "preview": "import React, { useEffect } from 'react';\nimport { ThemeProvider } from '@mui/material/styles';\nimport { Box } from '@mu"
  },
  {
    "path": "packages/fossflow-lib/src/components/Circle/Circle.tsx",
    "chars": 292,
    "preview": "import React from 'react';\nimport { Coords } from 'src/types';\n\ninterface Props {\n  tile: Coords;\n  radius?: number;\n}\n\n"
  },
  {
    "path": "packages/fossflow-lib/src/components/ColorSelector/ColorPicker.tsx",
    "chars": 680,
    "preview": "import {\n  MuiColorButtonProps,\n  MuiColorInput,\n  MuiColorInputProps\n} from 'mui-color-input';\nimport React from 'react"
  },
  {
    "path": "packages/fossflow-lib/src/components/ColorSelector/ColorSelector.tsx",
    "chars": 677,
    "preview": "import React from 'react';\nimport { Box } from '@mui/material';\nimport { useScene } from 'src/hooks/useScene';\nimport { "
  },
  {
    "path": "packages/fossflow-lib/src/components/ColorSelector/ColorSwatch.tsx",
    "chars": 789,
    "preview": "import React from 'react';\nimport { Box, Button } from '@mui/material';\n\nexport type Props = {\n  hex: string;\n  isActive"
  },
  {
    "path": "packages/fossflow-lib/src/components/ColorSelector/CustomColorInput.tsx",
    "chars": 2224,
    "preview": "import React, { useState, useEffect } from 'react';\nimport { Box, TextField, IconButton, Tooltip } from '@mui/material';"
  },
  {
    "path": "packages/fossflow-lib/src/components/ColorSelector/__tests__/ColorSelector.test.tsx",
    "chars": 9115,
    "preview": "import React from 'react';\nimport { render, screen, fireEvent, act } from '@testing-library/react';\nimport '@testing-lib"
  },
  {
    "path": "packages/fossflow-lib/src/components/ColorSelector/__tests__/CustomColorInput.test.tsx",
    "chars": 5052,
    "preview": "import React from 'react';\nimport { render, screen, fireEvent, act } from '@testing-library/react';\nimport '@testing-lib"
  },
  {
    "path": "packages/fossflow-lib/src/components/ConnectorEmptySpaceTooltip/ConnectorEmptySpaceTooltip.tsx",
    "chars": 3735,
    "preview": "import React, { useState, useEffect, useRef } from 'react';\nimport { Box, Paper, Typography, Fade } from '@mui/material'"
  },
  {
    "path": "packages/fossflow-lib/src/components/ConnectorHintTooltip/ConnectorHintTooltip.tsx",
    "chars": 3776,
    "preview": "import React, { useState, useEffect } from 'react';\nimport { Box, IconButton, Paper, Typography, useTheme } from '@mui/m"
  },
  {
    "path": "packages/fossflow-lib/src/components/ConnectorRerouteTooltip/ConnectorRerouteTooltip.tsx",
    "chars": 4507,
    "preview": "import React, { useState, useEffect, useRef } from 'react';\nimport { Box, IconButton, Paper, Typography, Fade } from '@m"
  },
  {
    "path": "packages/fossflow-lib/src/components/ConnectorSettings/ConnectorSettings.tsx",
    "chars": 2301,
    "preview": "import React from 'react';\nimport {\n  Box,\n  FormControl,\n  FormLabel,\n  RadioGroup,\n  FormControlLabel,\n  Radio,\n  Typo"
  },
  {
    "path": "packages/fossflow-lib/src/components/ContextMenu/ContextMenu.tsx",
    "chars": 580,
    "preview": "import React from 'react';\nimport { Menu, MenuItem } from '@mui/material';\n\ninterface MenuItemI {\n  label: string;\n  onC"
  },
  {
    "path": "packages/fossflow-lib/src/components/ContextMenu/ContextMenuManager.tsx",
    "chars": 2430,
    "preview": "import React, { useCallback } from 'react';\nimport { useUiStateStore } from 'src/stores/uiStateStore';\nimport { generate"
  },
  {
    "path": "packages/fossflow-lib/src/components/Cursor/Cursor.tsx",
    "chars": 640,
    "preview": "import React, { memo } from 'react';\nimport chroma from 'chroma-js';\nimport { useTheme } from '@mui/material';\nimport { "
  },
  {
    "path": "packages/fossflow-lib/src/components/DOMErrorBoundary/DOMErrorBoundary.tsx",
    "chars": 3236,
    "preview": "import React, { Component, ReactNode } from 'react';\n\ninterface DOMErrorBoundaryProps {\n  children: ReactNode;\n  fallbac"
  },
  {
    "path": "packages/fossflow-lib/src/components/DOMErrorBoundary/index.ts",
    "chars": 66,
    "preview": "export { default as DOMErrorBoundary } from './DOMErrorBoundary';\n"
  },
  {
    "path": "packages/fossflow-lib/src/components/DebugUtils/DebugUtils.tsx",
    "chars": 1855,
    "preview": "import React from 'react';\nimport { Box } from '@mui/material';\nimport { useUiStateStore } from 'src/stores/uiStateStore"
  },
  {
    "path": "packages/fossflow-lib/src/components/DebugUtils/LineItem.tsx",
    "chars": 701,
    "preview": "import React from 'react';\nimport { Typography, Box } from '@mui/material';\nimport { Value } from './Value';\n\ninterface "
  },
  {
    "path": "packages/fossflow-lib/src/components/DebugUtils/SizeIndicator.tsx",
    "chars": 706,
    "preview": "import React, { useMemo } from 'react';\nimport { Box } from '@mui/material';\nimport { useDiagramUtils } from 'src/hooks/"
  },
  {
    "path": "packages/fossflow-lib/src/components/DebugUtils/Value.tsx",
    "chars": 597,
    "preview": "import React from 'react';\nimport { Box, Typography } from '@mui/material';\n\ninterface Props {\n  value: string;\n}\n\nexpor"
  },
  {
    "path": "packages/fossflow-lib/src/components/DebugUtils/__tests__/DebugUtils.test.tsx",
    "chars": 1126,
    "preview": "import React from 'react';\nimport { render, screen } from '@testing-library/react';\nimport { ThemeProvider } from '@mui/"
  },
  {
    "path": "packages/fossflow-lib/src/components/DebugUtils/__tests__/LineItem.test.tsx",
    "chars": 827,
    "preview": "import React from 'react';\nimport { render, screen } from '@testing-library/react';\nimport { ThemeProvider } from '@mui/"
  },
  {
    "path": "packages/fossflow-lib/src/components/DebugUtils/__tests__/SizeIndicator.test.tsx",
    "chars": 1235,
    "preview": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport { ThemeProvider } from '@mui/material"
  },
  {
    "path": "packages/fossflow-lib/src/components/DebugUtils/__tests__/Value.test.tsx",
    "chars": 684,
    "preview": "import React from 'react';\nimport { render, screen } from '@testing-library/react';\nimport { ThemeProvider } from '@mui/"
  },
  {
    "path": "packages/fossflow-lib/src/components/DragAndDrop/DragAndDrop.tsx",
    "chars": 650,
    "preview": "import React, { useMemo } from 'react';\nimport { Box } from '@mui/material';\nimport { Coords } from 'src/types';\nimport "
  },
  {
    "path": "packages/fossflow-lib/src/components/ExportImageDialog/ExportImageDialog.tsx",
    "chars": 24997,
    "preview": "import React, {\n  useRef,\n  useEffect,\n  useMemo,\n  useCallback,\n  useState\n} from 'react';\nimport {\n  Dialog,\n  DialogC"
  },
  {
    "path": "packages/fossflow-lib/src/components/FreehandLasso/FreehandLasso.tsx",
    "chars": 1330,
    "preview": "import React, { useMemo } from 'react';\nimport { useUiStateStore } from 'src/stores/uiStateStore';\nimport { createSmooth"
  },
  {
    "path": "packages/fossflow-lib/src/components/Gradient/Gradient.tsx",
    "chars": 355,
    "preview": "import React from 'react';\nimport { Box, SxProps } from '@mui/material';\n\ninterface Props {\n  sx?: SxProps;\n}\n\nexport co"
  },
  {
    "path": "packages/fossflow-lib/src/components/Grid/Grid.tsx",
    "chars": 2033,
    "preview": "import React, { useEffect, useRef, useState } from 'react';\nimport { Box } from '@mui/material';\nimport gsap from 'gsap'"
  },
  {
    "path": "packages/fossflow-lib/src/components/HelpDialog/HelpDialog.tsx",
    "chars": 7147,
    "preview": "import React from 'react';\nimport {\n  Dialog,\n  DialogTitle,\n  DialogContent,\n  DialogActions,\n  Button,\n  Table,\n  Tabl"
  },
  {
    "path": "packages/fossflow-lib/src/components/HotkeySettings/HotkeySettings.tsx",
    "chars": 2940,
    "preview": "import React from 'react';\nimport {\n  Box,\n  Select,\n  MenuItem,\n  FormControl,\n  InputLabel,\n  Typography,\n  Paper,\n  T"
  },
  {
    "path": "packages/fossflow-lib/src/components/IconButton/IconButton.tsx",
    "chars": 1579,
    "preview": "import React, { useMemo } from 'react';\nimport { Button, Box, useTheme } from '@mui/material';\nimport Tooltip, { Tooltip"
  },
  {
    "path": "packages/fossflow-lib/src/components/IconPackSettings/IconPackSettings.tsx",
    "chars": 5287,
    "preview": "import React from 'react';\nimport {\n  Box,\n  FormControl,\n  FormLabel,\n  FormControlLabel,\n  Switch,\n  Checkbox,\n  Typog"
  },
  {
    "path": "packages/fossflow-lib/src/components/ImportHintTooltip/ImportHintTooltip.tsx",
    "chars": 2035,
    "preview": "import React, { useState, useEffect } from 'react';\nimport { Box, IconButton, Paper, Typography } from '@mui/material';\n"
  },
  {
    "path": "packages/fossflow-lib/src/components/IsoTileArea/IsoTileArea.tsx",
    "chars": 1088,
    "preview": "import React, { useMemo, memo } from 'react';\nimport { Coords } from 'src/types';\nimport { Svg } from 'src/components/Sv"
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/ConnectorControls/ConnectorControls.tsx",
    "chars": 13028,
    "preview": "import React, { useState, useMemo } from 'react';\nimport {\n  Connector,\n  ConnectorLabel,\n  connectorStyleOptions,\n  con"
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/IconSelectionControls/Icon.tsx",
    "chars": 1706,
    "preview": "import React from 'react';\nimport Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport { Button"
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/IconSelectionControls/IconCollection.tsx",
    "chars": 1595,
    "preview": "import React, { useState } from 'react';\nimport { Divider, Stack, Typography, Button } from '@mui/material';\nimport {\n  "
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/IconSelectionControls/IconGrid.tsx",
    "chars": 1353,
    "preview": "import React from 'react';\nimport { Icon as IconI } from 'src/types';\nimport { Grid, Box } from '@mui/material';\nimport "
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/IconSelectionControls/IconSelectionControls.tsx",
    "chars": 9403,
    "preview": "import React, { useCallback, useRef, useState } from 'react';\nimport { Stack, Alert, IconButton as MUIIconButton, Box, B"
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/IconSelectionControls/Icons.tsx",
    "chars": 840,
    "preview": "import React from 'react';\nimport { Grid } from '@mui/material';\nimport { IconCollectionStateWithIcons, Icon } from 'src"
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/IconSelectionControls/Searchbox.tsx",
    "chars": 640,
    "preview": "import React from 'react';\nimport { TextField, InputAdornment } from '@mui/material';\nimport { Search as SearchIcon } fr"
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/IconSelectionControls/__tests__/Icon.test.tsx",
    "chars": 943,
    "preview": "import '@testing-library/jest-dom';\nimport { render, screen } from '@testing-library/react';\nimport { Icon } from '../Ic"
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/ItemControlsManager.tsx",
    "chars": 1372,
    "preview": "import React, { useMemo } from 'react';\nimport { Box } from '@mui/material';\nimport { useUiStateStore } from 'src/stores"
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/NodeControls/NodeControls.tsx",
    "chars": 4495,
    "preview": "import React, { useState, useCallback, useEffect } from 'react';\nimport { Box, Stack, Button, IconButton as MUIIconButto"
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/NodeControls/NodeSettings/NodeSettings.tsx",
    "chars": 3775,
    "preview": "import React, { useState, useCallback, useEffect, useRef } from 'react';\nimport { Slider, Box, TextField } from '@mui/ma"
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/NodeControls/QuickIconSelector.tsx",
    "chars": 7484,
    "preview": "import React, { useState, useEffect, useRef, useMemo, useCallback } from 'react';\nimport { Box, Stack, Typography, Divid"
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/RectangleControls/RectangleControls.tsx",
    "chars": 3001,
    "preview": "import React, { useState } from 'react';\nimport { Box, IconButton as MUIIconButton, FormControlLabel, Switch, Typography"
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/TextBoxControls/TextBoxControls.tsx",
    "chars": 3272,
    "preview": "import React from 'react';\nimport { ProjectionOrientationEnum } from 'src/types';\nimport {\n  Box,\n  TextField,\n  ToggleB"
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/components/ControlsContainer.tsx",
    "chars": 962,
    "preview": "import React from 'react';\nimport { Box, Divider } from '@mui/material';\n\ninterface Props {\n  header?: React.ReactNode;\n"
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/components/DeleteButton.tsx",
    "chars": 433,
    "preview": "import React from 'react';\nimport { DeleteOutlined as DeleteIcon } from '@mui/icons-material';\nimport { Button } from '@"
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/components/Header.tsx",
    "chars": 640,
    "preview": "import React from 'react';\nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimpor"
  },
  {
    "path": "packages/fossflow-lib/src/components/ItemControls/components/Section.tsx",
    "chars": 625,
    "preview": "import React from 'react';\nimport { Box, SxProps, Typography, Stack } from '@mui/material';\n\ninterface Props {\n  childre"
  },
  {
    "path": "packages/fossflow-lib/src/components/Label/ExpandButton.tsx",
    "chars": 784,
    "preview": "import React from 'react';\nimport { Button as MuiButton, SxProps } from '@mui/material';\nimport {\n  ExpandMore as ReadMo"
  },
  {
    "path": "packages/fossflow-lib/src/components/Label/ExpandableLabel.tsx",
    "chars": 3491,
    "preview": "import React, { useState, useRef, useEffect, useMemo } from 'react';\nimport { Box } from '@mui/material';\nimport { useRe"
  },
  {
    "path": "packages/fossflow-lib/src/components/Label/Label.tsx",
    "chars": 1964,
    "preview": "import React, { useRef } from 'react';\nimport { Box, SxProps } from '@mui/material';\n\nconst CONNECTOR_DOT_SIZE = 3;\n\nexp"
  },
  {
    "path": "packages/fossflow-lib/src/components/Label/__tests__/Label.test.tsx",
    "chars": 1945,
    "preview": "import React from 'react';\nimport { render, screen } from '@testing-library/react';\nimport { ThemeProvider } from '@mui/"
  },
  {
    "path": "packages/fossflow-lib/src/components/LabelSettings/LabelSettings.tsx",
    "chars": 1448,
    "preview": "import React from 'react';\nimport {\n  Box,\n  Typography,\n  Slider\n} from '@mui/material';\nimport { useUiStateStore } fro"
  },
  {
    "path": "packages/fossflow-lib/src/components/Lasso/Lasso.tsx",
    "chars": 716,
    "preview": "import React from 'react';\nimport { useUiStateStore } from 'src/stores/uiStateStore';\nimport { IsoTileArea } from 'src/c"
  },
  {
    "path": "packages/fossflow-lib/src/components/LassoHintTooltip/LassoHintTooltip.tsx",
    "chars": 3379,
    "preview": "import React, { useState, useEffect } from 'react';\nimport { Box, IconButton, Paper, Typography, useTheme } from '@mui/m"
  },
  {
    "path": "packages/fossflow-lib/src/components/LazyLoadingWelcomeNotification/LazyLoadingWelcomeNotification.tsx",
    "chars": 2736,
    "preview": "import React, { useState, useEffect } from 'react';\nimport { Box, IconButton, Paper, Typography, useTheme } from '@mui/m"
  }
]

// ... and 169 more files (download for full content)

About this extraction

This page contains the full source code of the stan-smith/FossFLOW GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 369 files (1.6 MB), approximately 588.4k tokens, and a symbol index with 399 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!