collabmd 0.1.44 → 0.1.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -19
- package/bin/collabmd.js +27 -1
- package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-CYM5nxUi.js +1 -0
- package/dist/client/assets/browser-utils--H_DkyEF.js +1 -0
- package/dist/client/assets/chunk-ERSWUTIN-hHdvnhaY.js +41 -0
- package/dist/client/assets/{chunk-CZQZEIFA-DT3N9fo7.js → chunk-YGJVY4SA-CjSe7Bx7.js} +2 -2
- package/dist/client/assets/comment-thread-store-CdcwrObc.js +1 -0
- package/dist/client/assets/comment-threads-9J6Em-_y.js +4 -0
- package/dist/client/assets/comment-ui-shared-BC4pt4w8.js +7 -0
- package/dist/client/assets/dist-B5HTH2BO.js +1 -0
- package/dist/client/assets/{dist-DhLvC8DS.js → dist-B5Jf1SLZ.js} +2 -2
- package/dist/client/assets/{dist-CnL7Y2sM.js → dist-BDt3rz7l.js} +1 -1
- package/dist/client/assets/dist-BEwK4csK.js +1 -0
- package/dist/client/assets/dist-BKW4PALF.js +1 -0
- package/dist/client/assets/dist-BWcHHOx-.js +1 -0
- package/dist/client/assets/{dist-CYZmbokb.js → dist-BalScOwZ.js} +9 -9
- package/dist/client/assets/dist-Bf8f4HmM.js +6 -0
- package/dist/client/assets/dist-BjHJDtyU.js +1 -0
- package/dist/client/assets/dist-Bm6pf9Bl.js +1 -0
- package/dist/client/assets/dist-BoVBdSjk.js +1 -0
- package/dist/client/assets/dist-CC5IrQMG.js +1 -0
- package/dist/client/assets/{dist-C11hHqv_.js → dist-CCP_AKPG.js} +12 -12
- package/dist/client/assets/dist-CZgOmxK6.js +1 -0
- package/dist/client/assets/{dist-D2AQ-76g.js → dist-Cqhv5LAk.js} +1 -1
- package/dist/client/assets/{dist-MvcV4190.js → dist-D-Z6FLem.js} +1 -1
- package/dist/client/assets/dist-DLMiIsNC.js +11 -0
- package/dist/client/assets/{dist-3bgCp7iY.js → dist-DZKu9Cs8.js} +1 -1
- package/dist/client/assets/dist-DaYdhcVs.js +1 -0
- package/dist/client/assets/dist-FWJsgGYI.js +1 -0
- package/dist/client/assets/dist-Kh2COra_.js +1 -0
- package/dist/client/assets/{dist-JYEDRrPT.js → dist-PDZ3bSqm.js} +1 -1
- package/dist/client/assets/{dist-Drp8uu5J.js → dist-TjMh8n1u.js} +1 -1
- package/dist/client/assets/{dist-DGb27Dl6.js → dist-dtAdgL39.js} +1 -1
- package/dist/client/assets/dist-jv4WdPnK.js +9 -0
- package/dist/client/assets/{dist-DK5Gs2wa.js → dist-rGBmqxC7.js} +1 -1
- package/dist/client/assets/{dist-DCzuX1AF.js → dist-shrl6K_0.js} +1 -1
- package/dist/client/assets/dist-tOaegDYS2.js +1 -0
- package/dist/client/assets/dist-ule2n6ak.js +1 -0
- package/dist/client/assets/dist-xElaxbia.js +1 -0
- package/dist/client/assets/drawio-editor-FzY1cVw8.js +9 -0
- package/dist/client/assets/drawioEditor-BjiKJqlc.js +2 -0
- package/dist/client/assets/editor-session-Cm9ekeNo.js +54 -0
- package/dist/client/assets/embedded-editor-base-CwTkk911.css +1 -0
- package/dist/client/assets/{en-GADW4C6J-DQ6zyCEM.js → en-7NFCYGKX-BrgYZAEe.js} +1 -1
- package/dist/client/assets/{preview-render-profile-BZzGSg6K.js → es-DXGV3RHd.js} +13 -13
- package/dist/client/assets/excalidraw-editor-B46zsTFI.js +9 -0
- package/dist/client/assets/excalidraw-editor-Bt7gMSoh.css +1 -0
- package/dist/client/assets/excalidraw-scene-BOben2gr.js +1 -0
- package/dist/client/assets/excalidrawEditor-CT2pHq7e.js +2 -0
- package/dist/client/assets/export-page-A7NHawJY.js +39 -0
- package/dist/client/assets/exportDocument-B2L8fe34.css +1 -0
- package/dist/client/assets/exportDocument-BaqcOAAW.js +2 -0
- package/dist/client/assets/file-icon-svg-CQAjlWjK.js +1 -0
- package/dist/client/assets/file-kind-BbqgGzpc.js +1 -0
- package/dist/client/assets/image-QXRYHUNP-SWEV8H0J.js +1 -0
- package/dist/client/assets/index-ClbjMBVt.js +2 -0
- package/dist/client/assets/index-Pum8ET-5.css +1 -0
- package/dist/client/assets/main-B3uPyqic.js +893 -0
- package/dist/client/assets/modulepreload-polyfill-P2Xu9kJm.js +1 -0
- package/dist/client/assets/pdf-BL9Pr2D5.js +54 -0
- package/dist/client/assets/pdf.worker-CLesOks4.mjs +64857 -0
- package/dist/client/assets/pdf_viewer-FVkkThnz.js +551 -0
- package/dist/client/assets/preview-diagram-utils-txBCoW8d.js +1 -0
- package/dist/client/assets/{preview-render-compiler-BSaQO_p3.js → preview-render-compiler-BD-XhkS2.js} +2 -2
- package/dist/client/assets/preview-render-compiler-BKedaMxx.js +1 -0
- package/dist/client/assets/preview-render-profile-CE-5rVTC.js +1 -0
- package/dist/client/assets/{preview-render-worker-B42LWvrD.js → preview-render-worker-CiPqc9n6.js} +20 -20
- package/dist/client/assets/prod-Dy20X7eT.js +1 -0
- package/dist/client/assets/prod-hnwh7wRM.js +177 -0
- package/dist/client/assets/quick-switcher-controller-fqOYR7qR.js +12 -0
- package/dist/client/assets/runtime-config-BLrEKVO1.js +1 -0
- package/dist/client/assets/vault-api-client-_LpV1aIn.js +6 -0
- package/dist/client/assets/{yjs-provider-reset-guard-Cox4nxwu.js → yjs-provider-reset-guard-DE0vINDP.js} +1 -1
- package/dist/client/drawio-editor.html +3 -2
- package/dist/client/excalidraw-editor.html +3 -2
- package/dist/client/export-document.html +4 -3
- package/dist/client/index.html +109 -27
- package/docker-compose.yml +42 -0
- package/package.json +26 -15
- package/scripts/local-structurizr-compose.mjs +101 -0
- package/src/client/app/drawio-editor-entry.js +0 -3
- package/src/client/app/drawio-editor.html +1 -0
- package/src/client/app/excalidraw-editor-entry.js +0 -3
- package/src/client/app/excalidraw-editor.html +1 -0
- package/src/client/app/export-document-entry.js +0 -3
- package/src/client/app/export-document.html +1 -0
- package/src/client/app/index.html +106 -24
- package/src/client/app/main-entry.js +0 -5
- package/src/client/application/app-shell/chat-feature.js +180 -124
- package/src/client/application/app-shell/comments-feature.js +20 -11
- package/src/client/application/app-shell/git-feature.js +16 -9
- package/src/client/application/app-shell/presence-feature.js +18 -11
- package/src/client/application/app-shell/ui-feature-shell.js +78 -17
- package/src/client/application/app-shell/ui-feature-sidebar.js +74 -1
- package/src/client/application/app-shell/ui-feature-tab-activity.js +2 -2
- package/src/client/application/app-shell/ui-feature-toolbar.js +2 -52
- package/src/client/application/app-shell/workspace-feature.js +27 -84
- package/src/client/application/app-shell-elements.js +9 -1
- package/src/client/application/diagram-chrome.js +161 -166
- package/src/client/application/diagram-preview-export.js +7 -34
- package/src/client/application/diagram-preview-hydrator.js +1 -19
- package/src/client/application/markdown-frontmatter.js +0 -2
- package/src/client/application/mermaid-preview-hydrator.js +1 -14
- package/src/client/application/pdf-preview-controller.js +992 -0
- package/src/client/application/plantuml-preview-hydrator.js +0 -10
- package/src/client/application/preview-diagram-utils.js +31 -2
- package/src/client/application/preview-render-compiler.js +2 -1
- package/src/client/application/preview-renderer.js +2 -2
- package/src/client/application/quick-switcher-loader.js +3 -1
- package/src/client/application/structurizr-preview-controller.js +395 -0
- package/src/client/application/workspace-coordinator.js +25 -3
- package/src/client/application/workspace-preview-controller.js +91 -5
- package/src/client/bootstrap/collabmd-app-shell.js +155 -43
- package/src/client/browser-utils.js +44 -0
- package/src/client/domain/excalidraw-collaboration.js +0 -2
- package/src/client/domain/room.js +38 -0
- package/src/client/domain/runtime-paths.js +26 -5
- package/src/client/domain/structurizr-language.js +99 -0
- package/src/client/domain/vault-paths.js +48 -0
- package/src/client/excalidraw-editor.js +833 -51
- package/src/client/export/export-pipeline.js +6 -34
- package/src/client/infrastructure/auth-client.js +4 -10
- package/src/client/infrastructure/browser-notification-port.js +33 -20
- package/src/client/infrastructure/browser-preferences-port.js +46 -9
- package/src/client/infrastructure/comment-thread-store.js +34 -13
- package/src/client/infrastructure/editor-session.js +10 -0
- package/src/client/infrastructure/editor-view-adapter.js +133 -5
- package/src/client/infrastructure/excalidraw-room-client.js +103 -14
- package/src/client/infrastructure/git-api-client.js +5 -0
- package/src/client/infrastructure/lobby-presence.js +1 -0
- package/src/client/infrastructure/vault-api-client.js +51 -0
- package/src/client/infrastructure/workspace-sync-client.js +13 -1
- package/src/client/presentation/comment-overview-controller.js +18 -53
- package/src/client/presentation/comment-ui/comment-ui-card.js +1 -12
- package/src/client/presentation/comment-ui/comment-ui-layout.js +242 -219
- package/src/client/presentation/comment-ui/comment-ui-render.js +32 -45
- package/src/client/presentation/comment-ui/comment-ui-shared.js +68 -13
- package/src/client/presentation/comment-ui-controller.js +5 -1
- package/src/client/presentation/drawio-embed-controller.js +9 -102
- package/src/client/presentation/drawio-viewer.js +118 -0
- package/src/client/presentation/excalidraw-embed-controller.js +74 -8
- package/src/client/presentation/file-action-controller.js +134 -0
- package/src/client/presentation/file-explorer-controller.js +33 -3
- package/src/client/presentation/file-explorer-view.js +59 -34
- package/src/client/presentation/file-icon-svg.js +40 -0
- package/src/client/presentation/file-tree-state.js +12 -4
- package/src/client/presentation/git-diff-view-controller.js +731 -3
- package/src/client/presentation/outline-controller.js +86 -0
- package/src/client/presentation/quick-switcher-controller.js +257 -74
- package/src/client/presentation/quick-switcher-text-search.js +3 -3
- package/src/client/presentation/toast-controller.js +3 -0
- package/src/client/styles/components/feedback.css +6 -0
- package/src/client/styles/components/navigation.css +11 -1
- package/src/client/styles/features/collaboration-chat.css +49 -53
- package/src/client/styles/features/collaboration-presence.css +9 -7
- package/src/client/styles/features/comment-card.css +25 -11
- package/src/client/styles/features/comment-overlays.css +0 -4
- package/src/client/styles/features/comment-overview.css +44 -21
- package/src/client/styles/features/comments-drawer.css +2 -100
- package/src/client/styles/features/diagram-preview.css +81 -18
- package/src/client/styles/features/diff-special.css +309 -0
- package/src/client/styles/features/embedded-preview.css +8 -33
- package/src/client/styles/features/quick-switcher.css +8 -0
- package/src/client/styles/foundation/themes.css +6 -0
- package/src/client/styles/foundation/tokens.css +1 -0
- package/src/client/styles/layout/editor-page.css +40 -0
- package/src/client/styles/layout/responsive.css +31 -1
- package/src/client/styles/layout/shell.css +383 -7
- package/src/client/styles/layout/sidebar.css +47 -15
- package/src/client/styles/layout/view-modes.css +1 -0
- package/src/client/styles/overrides/codemirror.css +217 -15
- package/src/client/styles/style.css +1 -0
- package/src/client/styles/surfaces/excalidraw-editor.css +294 -0
- package/src/domain/comment-threads.js +63 -5
- package/src/domain/excalidraw-room-codec.js +6 -4
- package/src/domain/file-kind.js +35 -3
- package/src/server/application/workspace-reconciliation.js +1 -1
- package/src/server/config/env.js +79 -0
- package/src/server/create-app-server.js +14 -3
- package/src/server/domain/bases/base-definition.js +1 -1
- package/src/server/domain/bases/base-expression-runtime.js +1 -4
- package/src/server/domain/bases/base-index-snapshot-store.js +1 -4
- package/src/server/domain/bases/base-query-service.js +1 -77
- package/src/server/domain/bases/base-transform.js +1 -4
- package/src/server/domain/collaboration/collaboration-room.js +55 -21
- package/src/server/domain/comment-overview.js +25 -8
- package/src/server/domain/docx-exporter.js +24 -33
- package/src/server/domain/ripgrep-search-service.js +7 -1
- package/src/server/domain/workspace-state.js +32 -11
- package/src/server/infrastructure/git/diff-service.js +29 -13
- package/src/server/infrastructure/git/git-service.js +61 -10
- package/src/server/infrastructure/git/history-service.js +96 -29
- package/src/server/infrastructure/git/image-mime.js +14 -0
- package/src/server/infrastructure/git/path-utils.js +1 -1
- package/src/server/infrastructure/git/responses.js +0 -95
- package/src/server/infrastructure/git/untracked-files.js +28 -1
- package/src/server/infrastructure/github/github-app-client.js +22 -15
- package/src/server/infrastructure/http/create-git-api-query-handler.js +31 -1
- package/src/server/infrastructure/http/create-request-handler.js +18 -31
- package/src/server/infrastructure/http/create-static-handler.js +5 -2
- package/src/server/infrastructure/http/create-structurizr-api-handler.js +145 -0
- package/src/server/infrastructure/http/create-vault-api-command-handler.js +70 -8
- package/src/server/infrastructure/http/create-vault-api-query-handler.js +51 -3
- package/src/server/infrastructure/http/http-errors.js +7 -1
- package/src/server/infrastructure/http/http-request-helpers.js +22 -0
- package/src/server/infrastructure/persistence/path-utils.js +1 -1
- package/src/server/infrastructure/persistence/vault-file-store.js +3 -0
- package/src/server/infrastructure/structurizr/structurizr-embed.css +43 -0
- package/src/server/infrastructure/structurizr/structurizr-workspace-service.js +374 -0
- package/src/server/infrastructure/websocket/attach-collaboration-gateway.js +4 -22
- package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-CbSISC1w.js +0 -1
- package/dist/client/assets/bases-preview-controller-2pLHk0uk.js +0 -143
- package/dist/client/assets/browser-utils-CKtI_rZl.js +0 -1
- package/dist/client/assets/button-BCEiw4Rw.js +0 -1
- package/dist/client/assets/chunk-AXR3VHVW-0GTk_evH.js +0 -41
- package/dist/client/assets/comment-threads-D-iKphIp.js +0 -4
- package/dist/client/assets/diagram-action-icons-aa_KOv9h.js +0 -36
- package/dist/client/assets/dist-BH87JoHx.js +0 -11
- package/dist/client/assets/dist-BIkPRZO7.js +0 -6
- package/dist/client/assets/dist-BqCsFpx4.js +0 -1
- package/dist/client/assets/dist-C2JHCt8U.js +0 -1
- package/dist/client/assets/dist-CZjTtmTu.js +0 -1
- package/dist/client/assets/dist-Cig4Ov_X.js +0 -1
- package/dist/client/assets/dist-CqQEC8gR.js +0 -1
- package/dist/client/assets/dist-D4Rzqod1.js +0 -1
- package/dist/client/assets/dist-D5sn-mwk.js +0 -9
- package/dist/client/assets/dist-D7G-n87v.js +0 -1
- package/dist/client/assets/dist-DRqOrNgN.js +0 -1
- package/dist/client/assets/dist-DetkMS_4.js +0 -1
- package/dist/client/assets/dist-Dp6FVkQ1.js +0 -1
- package/dist/client/assets/dist-DtbjNB28.js +0 -1
- package/dist/client/assets/dist-DyrYcvpo2.js +0 -1
- package/dist/client/assets/dist-GrygD2zE.js +0 -1
- package/dist/client/assets/dist-HmEpWUow.js +0 -1
- package/dist/client/assets/dist-RTa81Km7.js +0 -1
- package/dist/client/assets/drawio-editor-DDvFoarP.js +0 -9
- package/dist/client/assets/drawio-embed-controller-BD1GTRwn.js +0 -1
- package/dist/client/assets/drawioEditor-Bu5grlH5.js +0 -2
- package/dist/client/assets/editor-session-DGlpiAsK.js +0 -16
- package/dist/client/assets/embedded-editor-base-C9roKYpW.css +0 -1
- package/dist/client/assets/excalidraw-editor-BHu6k8d4.js +0 -9
- package/dist/client/assets/excalidraw-editor-Cr_184EF.css +0 -1
- package/dist/client/assets/excalidraw-embed-controller-y2fenN_g.js +0 -1
- package/dist/client/assets/excalidraw-embed-reconciler-DGiagExg.js +0 -1
- package/dist/client/assets/excalidraw-scene-BvsQ6mLP.js +0 -176
- package/dist/client/assets/excalidrawEditor-4vFE--Uw.js +0 -2
- package/dist/client/assets/export-page-Cby8JzPO.js +0 -39
- package/dist/client/assets/exportDocument-C9v-bc7I.css +0 -1
- package/dist/client/assets/exportDocument-CRHCfsdo.js +0 -2
- package/dist/client/assets/file-history-view-controller-BDjEV9xJ.js +0 -112
- package/dist/client/assets/file-kind-BKPOIRPE.js +0 -1
- package/dist/client/assets/git-diff-view-controller-DgdM1aqb.js +0 -150
- package/dist/client/assets/git-panel-controller-BDTR2HVp.js +0 -207
- package/dist/client/assets/image-XGD7JQR6-XDUWHRpO.js +0 -1
- package/dist/client/assets/index-7xOyXDhP.css +0 -1
- package/dist/client/assets/index-Bz1KuQ6y.js +0 -2
- package/dist/client/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/dist/client/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/dist/client/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/dist/client/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/dist/client/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/dist/client/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/dist/client/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
- package/dist/client/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
- package/dist/client/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
- package/dist/client/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
- package/dist/client/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
- package/dist/client/assets/main-Ci07m9oP.js +0 -152
- package/dist/client/assets/preview-diagram-utils-n_bbJA9V.js +0 -1
- package/dist/client/assets/preview-render-compiler-csGM5ZFz.js +0 -1
- package/dist/client/assets/quick-switcher-controller-CoiYvllm.js +0 -12
- package/dist/client/assets/room-CDrmIdDt.js +0 -1
- package/dist/client/assets/runtime-config-CDgeuPWN.js +0 -1
- package/dist/client/assets/runtime-config-loader-BHGniHP5.js +0 -1
- package/dist/client/assets/runtime-paths-DvpihCEq.js +0 -1
- package/dist/client/assets/segmented-control-DJrHSz8M.js +0 -1
- package/dist/client/assets/vault-api-client-sLB2bo56.js +0 -1
- package/dist/client/assets/vault-paths-CVkuh0j-.js +0 -5
- package/src/client/bootstrap/lazy-controller-feature.js +0 -433
- package/src/client/infrastructure/backlinks-api-client.js +0 -16
- package/src/client/infrastructure/plantuml-api-client.js +0 -19
- package/src/client/infrastructure/runtime-config-loader.js +0 -56
- package/src/server/domain/collaboration/room-persistence-controller.js +0 -80
- package/src/server/infrastructure/git/command-runner.js +0 -49
- package/src/server/infrastructure/git/errors.js +0 -8
- package/src/server/infrastructure/http/create-esm-proxy-handler.js +0 -130
|
@@ -9,6 +9,32 @@ const USER_COLORS = [
|
|
|
9
9
|
];
|
|
10
10
|
export const USER_NAME_MAX_LENGTH = 24;
|
|
11
11
|
const LOCAL_USER_ID_STORAGE_KEY = 'collabmd-user-id';
|
|
12
|
+
const HEX_COLOR_RE = /^#(?:[\da-f]{3}|[\da-f]{6})$/iu;
|
|
13
|
+
|
|
14
|
+
function colorChannelToLinear(value) {
|
|
15
|
+
const channel = value / 255;
|
|
16
|
+
return channel <= 0.04045
|
|
17
|
+
? channel / 12.92
|
|
18
|
+
: ((channel + 0.055) / 1.055) ** 2.4;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function getColorLuminance(color) {
|
|
22
|
+
const hex = color.length === 4
|
|
23
|
+
? color.slice(1).split('').map((channel) => channel.repeat(2)).join('')
|
|
24
|
+
: color.slice(1);
|
|
25
|
+
const [red, green, blue] = hex.match(/../gu).map((channel) => parseInt(channel, 16));
|
|
26
|
+
return (
|
|
27
|
+
0.2126 * colorChannelToLinear(red)
|
|
28
|
+
+ 0.7152 * colorChannelToLinear(green)
|
|
29
|
+
+ 0.0722 * colorChannelToLinear(blue)
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function getContrastRatio(firstLuminance, secondLuminance) {
|
|
34
|
+
const lighter = Math.max(firstLuminance, secondLuminance);
|
|
35
|
+
const darker = Math.min(firstLuminance, secondLuminance);
|
|
36
|
+
return (lighter + 0.05) / (darker + 0.05);
|
|
37
|
+
}
|
|
12
38
|
|
|
13
39
|
function pickRandom(items) {
|
|
14
40
|
return items[Math.floor(Math.random() * items.length)];
|
|
@@ -73,6 +99,18 @@ export function normalizeUserName(value) {
|
|
|
73
99
|
return normalized || null;
|
|
74
100
|
}
|
|
75
101
|
|
|
102
|
+
export function getUserAvatarTextColor(value) {
|
|
103
|
+
const color = String(value ?? '').trim();
|
|
104
|
+
if (!HEX_COLOR_RE.test(color)) {
|
|
105
|
+
return '#fff';
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const luminance = getColorLuminance(color.toLowerCase());
|
|
109
|
+
const whiteContrast = getContrastRatio(1, luminance);
|
|
110
|
+
const inkContrast = getContrastRatio(0, luminance);
|
|
111
|
+
return inkContrast >= whiteContrast ? '#000' : '#fff';
|
|
112
|
+
}
|
|
113
|
+
|
|
76
114
|
export function createRandomUser(preferredName = null) {
|
|
77
115
|
const color = pickRandom(USER_COLORS);
|
|
78
116
|
|
|
@@ -86,6 +86,7 @@ export function getClientRuntimeConfig() {
|
|
|
86
86
|
unavailableReason: 'ripgrep search is unavailable',
|
|
87
87
|
version: '',
|
|
88
88
|
},
|
|
89
|
+
structurizrEnabled: false,
|
|
89
90
|
wikiLinkAutoCreate: true,
|
|
90
91
|
wsBasePath: '/ws',
|
|
91
92
|
...(window.__COLLABMD_CONFIG__ ?? {}),
|
|
@@ -143,12 +144,32 @@ export function resolveApiUrl(pathValue = '/', config = getClientRuntimeConfig()
|
|
|
143
144
|
return resolveAppPath(`/api${normalizedPath.startsWith('/') ? normalizedPath : `/${normalizedPath}`}`, config);
|
|
144
145
|
}
|
|
145
146
|
|
|
146
|
-
export function
|
|
147
|
-
|
|
148
|
-
|
|
147
|
+
export function resolveWsServerOverride(config = getClientRuntimeConfig()) {
|
|
148
|
+
if (!['development', 'test'].includes(config.environment)) {
|
|
149
|
+
return '';
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const customServerUrl = new URLSearchParams(window.location.search).get('server');
|
|
153
|
+
if (!customServerUrl) {
|
|
154
|
+
return '';
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
try {
|
|
158
|
+
const parsedUrl = new URL(customServerUrl, window.location.origin);
|
|
159
|
+
if (!['http:', 'https:', 'ws:', 'wss:'].includes(parsedUrl.protocol)) {
|
|
160
|
+
return '';
|
|
161
|
+
}
|
|
149
162
|
|
|
150
|
-
|
|
151
|
-
|
|
163
|
+
return trimTrailingSlash(parsedUrl.toString());
|
|
164
|
+
} catch {
|
|
165
|
+
return '';
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export function resolveWsBaseUrl(config = getClientRuntimeConfig()) {
|
|
170
|
+
const serverOverride = resolveWsServerOverride(config);
|
|
171
|
+
if (serverOverride) {
|
|
172
|
+
return serverOverride;
|
|
152
173
|
}
|
|
153
174
|
|
|
154
175
|
if (config.publicWsBaseUrl) {
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { LanguageDescription, LanguageSupport, StreamLanguage } from '@codemirror/language';
|
|
2
|
+
|
|
3
|
+
const KEYWORDS = new Set([
|
|
4
|
+
'animation',
|
|
5
|
+
'autoLayout',
|
|
6
|
+
'component',
|
|
7
|
+
'configuration',
|
|
8
|
+
'container',
|
|
9
|
+
'custom',
|
|
10
|
+
'decisions',
|
|
11
|
+
'deployment',
|
|
12
|
+
'description',
|
|
13
|
+
'dynamic',
|
|
14
|
+
'element',
|
|
15
|
+
'filtered',
|
|
16
|
+
'group',
|
|
17
|
+
'include',
|
|
18
|
+
'image',
|
|
19
|
+
'model',
|
|
20
|
+
'person',
|
|
21
|
+
'perspectives',
|
|
22
|
+
'properties',
|
|
23
|
+
'relationship',
|
|
24
|
+
'relationships',
|
|
25
|
+
'styles',
|
|
26
|
+
'systemContext',
|
|
27
|
+
'systemLandscape',
|
|
28
|
+
'system',
|
|
29
|
+
'theme',
|
|
30
|
+
'views',
|
|
31
|
+
'workspace',
|
|
32
|
+
]);
|
|
33
|
+
|
|
34
|
+
function readWord(stream) {
|
|
35
|
+
const match = stream.match(/[A-Za-z_][\w.-]*/u, false);
|
|
36
|
+
if (!match) {
|
|
37
|
+
return '';
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
stream.match(/[A-Za-z_][\w.-]*/u);
|
|
41
|
+
return match[0];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const structurizrStreamLanguage = StreamLanguage.define({
|
|
45
|
+
languageData: {
|
|
46
|
+
commentTokens: { line: '//' },
|
|
47
|
+
},
|
|
48
|
+
token(stream) {
|
|
49
|
+
if (stream.eatSpace()) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (stream.match('//')) {
|
|
54
|
+
stream.skipToEnd();
|
|
55
|
+
return 'comment';
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (stream.match(/!\w+/u)) {
|
|
59
|
+
return 'meta';
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (stream.match(/"(?:[^"\\]|\\.)*"?/u)) {
|
|
63
|
+
return 'string';
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (stream.match(/\b\d+(?:\.\d+)?\b/u)) {
|
|
67
|
+
return 'number';
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (stream.match(/[-=]?>|[{}[\]():,=]/u)) {
|
|
71
|
+
return 'operator';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const word = readWord(stream);
|
|
75
|
+
if (word) {
|
|
76
|
+
if (KEYWORDS.has(word)) {
|
|
77
|
+
return 'keyword';
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (/^[A-Z][A-Z0-9_]*$/u.test(word)) {
|
|
81
|
+
return 'typeName';
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return 'variableName';
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
stream.next();
|
|
88
|
+
return null;
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
export const structurizrLanguage = new LanguageSupport(structurizrStreamLanguage);
|
|
93
|
+
|
|
94
|
+
export const structurizrLanguageDescription = LanguageDescription.of({
|
|
95
|
+
alias: ['structurizr', 'structurizr-dsl'],
|
|
96
|
+
extensions: ['dsl'],
|
|
97
|
+
name: 'Structurizr DSL',
|
|
98
|
+
support: structurizrLanguage,
|
|
99
|
+
});
|
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
isDrawioFilePath,
|
|
4
4
|
isMermaidFilePath,
|
|
5
5
|
isPlantUmlFilePath,
|
|
6
|
+
isStructurizrFilePath,
|
|
6
7
|
stripVaultFileExtension,
|
|
7
8
|
} from '../../domain/file-kind.js';
|
|
8
9
|
|
|
@@ -135,3 +136,50 @@ export function createPlantUmlStarter(filePath) {
|
|
|
135
136
|
path: nextPath,
|
|
136
137
|
};
|
|
137
138
|
}
|
|
139
|
+
|
|
140
|
+
export function createStructurizrStarter(filePath) {
|
|
141
|
+
const normalizedPath = normalizeVaultPathInput(filePath);
|
|
142
|
+
const nextPath = isStructurizrFilePath(normalizedPath)
|
|
143
|
+
? normalizedPath
|
|
144
|
+
: `${normalizedPath}.dsl`;
|
|
145
|
+
return {
|
|
146
|
+
content: [
|
|
147
|
+
'workspace "CollabMD Example" "A small Structurizr workspace" {',
|
|
148
|
+
' model {',
|
|
149
|
+
' user = person "User" "Uses the system"',
|
|
150
|
+
' system = softwareSystem "Example System" "The system being documented" {',
|
|
151
|
+
' web = container "Web Application" "Serves the user interface" "JavaScript" {',
|
|
152
|
+
' home = component "Home Page" "Shows the landing page" "React"',
|
|
153
|
+
' editor = component "Editor" "Edits workspace content" "React"',
|
|
154
|
+
' }',
|
|
155
|
+
' api = container "API" "Handles requests" "Node.js"',
|
|
156
|
+
' }',
|
|
157
|
+
' user -> system "Uses"',
|
|
158
|
+
' web -> api "Calls" "HTTPS/JSON"',
|
|
159
|
+
' home -> editor "Links to"',
|
|
160
|
+
' }',
|
|
161
|
+
' views {',
|
|
162
|
+
' systemContext system "Context" {',
|
|
163
|
+
' include *',
|
|
164
|
+
' autoLayout',
|
|
165
|
+
' }',
|
|
166
|
+
' container system "Containers" {',
|
|
167
|
+
' include *',
|
|
168
|
+
' autoLayout',
|
|
169
|
+
' }',
|
|
170
|
+
' component web "Components" {',
|
|
171
|
+
' include *',
|
|
172
|
+
' autoLayout',
|
|
173
|
+
' }',
|
|
174
|
+
' styles {',
|
|
175
|
+
' element "Person" {',
|
|
176
|
+
' shape person',
|
|
177
|
+
' }',
|
|
178
|
+
' }',
|
|
179
|
+
' }',
|
|
180
|
+
'}',
|
|
181
|
+
'',
|
|
182
|
+
].join('\n'),
|
|
183
|
+
path: nextPath,
|
|
184
|
+
};
|
|
185
|
+
}
|