kritzel-stencil 0.4.20 → 0.4.22
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/LICENSE +21 -21
- package/LICENSE.md +49 -49
- package/dist/cjs/{index-Dn19mGl-.js → index-Xav9JFHg.js} +11 -47
- package/dist/cjs/index.cjs.js +51 -2
- package/dist/cjs/kritzel-active-users_47.cjs.entry.js +268 -139
- package/dist/cjs/kritzel-brush-style.cjs.entry.js +2 -2
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/{schema.constants-CY0WWJYd.js → schema.constants-CjN-B633.js} +20 -44
- package/dist/cjs/stencil.cjs.js +2 -2
- package/dist/collection/classes/providers/sync/hocuspocus-sync-provider.class.js +21 -0
- package/dist/collection/classes/providers/sync/websocket-sync-provider.class.js +29 -1
- package/dist/collection/classes/structures/app-state-map.structure.js +19 -6
- package/dist/collection/classes/structures/object-map.structure.js +66 -4
- package/dist/collection/collection-manifest.json +1 -1
- package/dist/collection/components/core/kritzel-awareness-cursors/kritzel-awareness-cursors.css +115 -115
- package/dist/collection/components/core/kritzel-awareness-cursors/kritzel-awareness-cursors.js +1 -1
- package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.css +10 -10
- package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.js +1 -1
- package/dist/collection/components/core/kritzel-editor/kritzel-editor.css +160 -160
- package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +51 -18
- package/dist/collection/components/core/kritzel-engine/kritzel-engine.css +80 -80
- package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +87 -38
- package/dist/collection/components/core/kritzel-watermark/kritzel-watermark.css +29 -29
- package/dist/collection/components/core/kritzel-watermark/kritzel-watermark.js +2 -2
- package/dist/collection/components/shared/kritzel-avatar/kritzel-avatar.css +58 -58
- package/dist/collection/components/shared/kritzel-avatar/kritzel-avatar.js +3 -3
- package/dist/collection/components/shared/kritzel-brush-style/kritzel-brush-style.css +42 -42
- package/dist/collection/components/shared/kritzel-brush-style/kritzel-brush-style.js +3 -3
- package/dist/collection/components/shared/kritzel-button/kritzel-button.css +73 -73
- package/dist/collection/components/shared/kritzel-button/kritzel-button.js +2 -2
- package/dist/collection/components/shared/kritzel-color/kritzel-color.css +24 -24
- package/dist/collection/components/shared/kritzel-color/kritzel-color.js +2 -2
- package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.css +46 -46
- package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js +1 -1
- package/dist/collection/components/shared/kritzel-dialog/kritzel-dialog.css +209 -209
- package/dist/collection/components/shared/kritzel-dropdown/kritzel-dropdown.css +190 -190
- package/dist/collection/components/shared/kritzel-dropdown/kritzel-dropdown.js +2 -2
- package/dist/collection/components/shared/kritzel-font/kritzel-font.css +10 -10
- package/dist/collection/components/shared/kritzel-font/kritzel-font.js +1 -1
- package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.css +48 -48
- package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.js +2 -2
- package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.css +30 -30
- package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js +1 -1
- package/dist/collection/components/shared/kritzel-icon/kritzel-icon.css +18 -18
- package/dist/collection/components/shared/kritzel-input/kritzel-input.css +69 -69
- package/dist/collection/components/shared/kritzel-input/kritzel-input.js +1 -1
- package/dist/collection/components/shared/kritzel-line-endings/kritzel-line-endings.css +60 -60
- package/dist/collection/components/shared/kritzel-line-endings/kritzel-line-endings.js +3 -3
- package/dist/collection/components/shared/kritzel-master-detail/kritzel-master-detail.css +190 -190
- package/dist/collection/components/shared/kritzel-master-detail/kritzel-master-detail.js +3 -3
- package/dist/collection/components/shared/kritzel-menu/kritzel-menu.css +34 -34
- package/dist/collection/components/shared/kritzel-menu/kritzel-menu.js +1 -1
- package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.css +166 -166
- package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.js +2 -2
- package/dist/collection/components/shared/kritzel-numeric-input/kritzel-numeric-input.css +102 -102
- package/dist/collection/components/shared/kritzel-numeric-input/kritzel-numeric-input.js +1 -1
- package/dist/collection/components/shared/kritzel-opacity-slider/kritzel-opacity-slider.css +85 -85
- package/dist/collection/components/shared/kritzel-opacity-slider/kritzel-opacity-slider.js +1 -1
- package/dist/collection/components/shared/kritzel-pill-tabs/kritzel-pill-tabs.css +68 -68
- package/dist/collection/components/shared/kritzel-pill-tabs/kritzel-pill-tabs.js +2 -2
- package/dist/collection/components/shared/kritzel-portal/kritzel-portal.js +1 -1
- package/dist/collection/components/shared/kritzel-shape-fill/kritzel-shape-fill.css +47 -47
- package/dist/collection/components/shared/kritzel-shape-fill/kritzel-shape-fill.js +4 -4
- package/dist/collection/components/shared/kritzel-slide-toggle/kritzel-slide-toggle.css +48 -48
- package/dist/collection/components/shared/kritzel-slide-toggle/kritzel-slide-toggle.js +1 -1
- package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.css +78 -78
- package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.js +1 -1
- package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.css +37 -37
- package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js +1 -1
- package/dist/collection/components/shared/kritzel-sync-indicator/kritzel-sync-indicator.css +50 -50
- package/dist/collection/components/shared/kritzel-sync-indicator/kritzel-sync-indicator.js +1 -1
- package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.css +18 -18
- package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js +2 -2
- package/dist/collection/components/ui/kritzel-active-users/kritzel-active-users.css +65 -65
- package/dist/collection/components/ui/kritzel-back-to-content/kritzel-back-to-content.css +42 -42
- package/dist/collection/components/ui/kritzel-back-to-content/kritzel-back-to-content.js +1 -1
- package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.css +112 -112
- package/dist/collection/components/ui/kritzel-controls/kritzel-controls.css +331 -331
- package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +6 -6
- package/dist/collection/components/ui/kritzel-current-user/kritzel-current-user.css +11 -11
- package/dist/collection/components/ui/kritzel-current-user/kritzel-current-user.js +1 -1
- package/dist/collection/components/ui/kritzel-current-user-dialog/kritzel-current-user-dialog.css +39 -39
- package/dist/collection/components/ui/kritzel-current-user-dialog/kritzel-current-user-dialog.js +1 -1
- package/dist/collection/components/ui/kritzel-export/kritzel-export.css +89 -89
- package/dist/collection/components/ui/kritzel-export/kritzel-export.js +1 -1
- package/dist/collection/components/ui/kritzel-loading-overlay/kritzel-loading-overlay.css +50 -50
- package/dist/collection/components/ui/kritzel-loading-overlay/kritzel-loading-overlay.js +1 -1
- package/dist/collection/components/ui/kritzel-login-dialog/kritzel-login-dialog.css +98 -98
- package/dist/collection/components/ui/kritzel-login-dialog/kritzel-login-dialog.js +1 -1
- package/dist/collection/components/ui/kritzel-more-menu/kritzel-more-menu.css +58 -58
- package/dist/collection/components/ui/kritzel-more-menu/kritzel-more-menu.js +2 -2
- package/dist/collection/components/ui/kritzel-notification-card/kritzel-notification-card.css +101 -101
- package/dist/collection/components/ui/kritzel-settings/kritzel-settings.css +137 -137
- package/dist/collection/components/ui/kritzel-settings/kritzel-settings.js +1 -1
- package/dist/collection/components/ui/kritzel-share-dialog/kritzel-share-dialog.css +150 -150
- package/dist/collection/components/ui/kritzel-share-dialog/kritzel-share-dialog.js +2 -2
- package/dist/collection/components/ui/kritzel-tool-config/kritzel-tool-config.css +38 -38
- package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.css +45 -45
- package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +1 -1
- package/dist/collection/components/ui/kritzel-workspace-manager/kritzel-workspace-manager.css +16 -16
- package/dist/collection/components/ui/kritzel-zoom-panel/kritzel-zoom-panel.css +72 -72
- package/dist/collection/components/ui/kritzel-zoom-panel/kritzel-zoom-panel.js +1 -1
- package/dist/collection/constants/version.js +1 -1
- package/dist/collection/helpers/cursor.helper.js +6 -6
- package/dist/collection/helpers/svg-export.helper.js +41 -41
- package/dist/components/index.js +53 -4
- package/dist/components/kritzel-active-users.js +1 -1
- package/dist/components/kritzel-avatar.js +1 -1
- package/dist/components/kritzel-awareness-cursors.js +1 -1
- package/dist/components/kritzel-back-to-content.js +1 -1
- package/dist/components/kritzel-brush-style.js +4 -4
- package/dist/components/kritzel-button.js +1 -1
- package/dist/components/kritzel-color-palette.js +1 -1
- package/dist/components/kritzel-color.js +1 -1
- package/dist/components/kritzel-context-menu.js +1 -1
- package/dist/components/kritzel-controls.js +1 -1
- package/dist/components/kritzel-current-user-dialog.js +1 -1
- package/dist/components/kritzel-current-user.js +1 -1
- package/dist/components/kritzel-cursor-trail.js +1 -1
- package/dist/components/kritzel-dialog.js +1 -1
- package/dist/components/kritzel-dropdown.js +1 -1
- package/dist/components/kritzel-editor.js +61 -56
- package/dist/components/kritzel-engine.js +1 -1
- package/dist/components/kritzel-export.js +1 -1
- package/dist/components/kritzel-font-family.js +1 -1
- package/dist/components/kritzel-font-size.js +1 -1
- package/dist/components/kritzel-font.js +1 -1
- package/dist/components/kritzel-icon.js +1 -1
- package/dist/components/kritzel-input.js +1 -1
- package/dist/components/kritzel-line-endings.js +1 -1
- package/dist/components/kritzel-loading-overlay.js +1 -1
- package/dist/components/kritzel-login-dialog.js +1 -1
- package/dist/components/kritzel-master-detail.js +1 -1
- package/dist/components/kritzel-menu-item.js +1 -1
- package/dist/components/kritzel-menu.js +1 -1
- package/dist/components/kritzel-more-menu.js +1 -1
- package/dist/components/kritzel-notification-card.js +1 -1
- package/dist/components/kritzel-numeric-input.js +1 -1
- package/dist/components/kritzel-opacity-slider.js +1 -1
- package/dist/components/kritzel-pill-tabs.js +1 -1
- package/dist/components/kritzel-portal.js +1 -1
- package/dist/components/kritzel-settings.js +1 -1
- package/dist/components/kritzel-shape-fill.js +1 -1
- package/dist/components/kritzel-share-dialog.js +1 -1
- package/dist/components/kritzel-slide-toggle.js +1 -1
- package/dist/components/kritzel-split-button.js +1 -1
- package/dist/components/kritzel-stroke-size.js +1 -1
- package/dist/components/kritzel-sync-indicator.js +1 -1
- package/dist/components/kritzel-tool-config.js +1 -1
- package/dist/components/kritzel-tooltip.js +1 -1
- package/dist/components/kritzel-utility-panel.js +1 -1
- package/dist/components/kritzel-watermark.js +1 -1
- package/dist/components/kritzel-workspace-manager.js +1 -1
- package/dist/components/kritzel-zoom-panel.js +1 -1
- package/dist/components/{p-CLAz6RJc.js → p-2WiGyky4.js} +3 -3
- package/dist/components/{p-zG-WUBGF.js → p-4SPnZZkH.js} +4 -4
- package/dist/components/{p-MhQxGUvY.js → p-B-585egz.js} +3 -3
- package/dist/components/{p-C9_yBEoX.js → p-B43upypT.js} +10 -30
- package/dist/components/{p-CSKToqUl.js → p-B5SWPDuq.js} +4 -4
- package/dist/components/{p-Covorf4C.js → p-BFYtCsZu.js} +3 -3
- package/dist/components/{p-Csxx9TbU.js → p-BNeE3SiZ.js} +216 -116
- package/dist/components/{p-DYPA7jpg.js → p-BPsKYMH6.js} +2 -2
- package/dist/components/{p-Cx-L_28S.js → p-BoN700-O.js} +3 -3
- package/dist/components/{p-ME1sDz3f.js → p-BozrueXV.js} +2 -2
- package/dist/components/{p-D2VcPEtL.js → p-BrNsOp2v.js} +6 -6
- package/dist/components/{p-BXUx_C0N.js → p-BsLI_BWq.js} +2 -2
- package/dist/components/{p-dAXnRkjA.js → p-C98Eb3_R.js} +5 -5
- package/dist/components/{p-Bxi-Bm49.js → p-CAoN_STZ.js} +2 -2
- package/dist/components/{p-CSWCmyzb.js → p-CF8pLc07.js} +5 -5
- package/dist/components/{p-D3BzgkIE.js → p-CSPYkLLH.js} +2 -2
- package/dist/components/{p-Ck-87E2G.js → p-CSuU8frA.js} +1 -1
- package/dist/components/{p-Di--2boB.js → p-CXpv9Rxe.js} +3 -3
- package/dist/components/{p-o3NYKrVL.js → p-CaBbajU2.js} +3 -3
- package/dist/components/{p-3tBE7SyG.js → p-Cm33td2O.js} +2 -2
- package/dist/components/{p-vDCa_ZDm.js → p-CrHvaLRV.js} +3 -3
- package/dist/components/{p-DT_WBwsw.js → p-CwZ3KKFq.js} +6 -6
- package/dist/components/{p-BZZ3KRPk.js → p-CzW58DHM.js} +3 -3
- package/dist/components/{p-BrqSjRJN.js → p-Czhdc844.js} +3 -3
- package/dist/components/{p-BkXQL5Dl.js → p-D1rjfWgJ.js} +5 -5
- package/dist/components/{p-DPsbNStn.js → p-DB58Oa5V.js} +2 -2
- package/dist/components/{p-DafP9PAA.js → p-DBqoPgev.js} +2 -2
- package/dist/components/{p-BrA9NBEE.js → p-DDTMGbtA.js} +21 -21
- package/dist/components/{p-Dznwo6oc.js → p-DKGg-76-.js} +2 -2
- package/dist/components/{p-Dp1CD4gK.js → p-DVXTPI71.js} +2 -2
- package/dist/components/{p-QSyeAy8R.js → p-DX2nriaq.js} +2 -2
- package/dist/components/{p-CHoOe3FD.js → p-Df3BwVGy.js} +3 -3
- package/dist/components/{p-DcUIO14-.js → p-Dt7-I2Xz.js} +4 -4
- package/dist/components/{p-BShrnlam.js → p-DtnMdWWB.js} +2 -2
- package/dist/components/{p-Ch-KG9To.js → p-DwMqCX2P.js} +3 -3
- package/dist/components/{p-25ExYYPf.js → p-Dx5NfJ0U.js} +9 -9
- package/dist/components/{p-fSV6KVTC.js → p-GKmqCI8r.js} +3 -3
- package/dist/components/{p-CWAChRD5.js → p-HoO86l1o.js} +12 -12
- package/dist/components/{p-Qdo3E8dr.js → p-PjPPCHVL.js} +2 -2
- package/dist/components/{p-D6JycG-I.js → p-bAacqNHq.js} +3 -3
- package/dist/components/{p-DjXQxw9R.js → p-djJSnjAX.js} +3 -3
- package/dist/components/{p-b0J2ktAm.js → p-dsxHDlQ3.js} +7 -7
- package/dist/components/{p-BppcoKoo.js → p-eZXIu4yK.js} +5 -5
- package/dist/components/{p-BFYT03fw.js → p-fL9rl200.js} +3 -3
- package/dist/components/{p-1Q4VnThv.js → p-jIKskj3S.js} +3 -3
- package/dist/components/{p-D0Trc3IQ.js → p-vqEUQ-4Q.js} +5 -5
- package/dist/esm/{index-2va1Pk9z.js → index-Dhio9uis.js} +11 -47
- package/dist/esm/index.js +52 -3
- package/dist/esm/kritzel-active-users_47.entry.js +268 -139
- package/dist/esm/kritzel-brush-style.entry.js +2 -2
- package/dist/esm/loader.js +2 -2
- package/dist/esm/{schema.constants-DBvUmuDH.js → schema.constants-DfvqHmxc.js} +20 -44
- package/dist/esm/stencil.js +3 -3
- package/dist/stencil/index.esm.js +52 -3
- package/dist/stencil/{p-DBvUmuDH.js → p-DfvqHmxc.js} +20 -44
- package/dist/stencil/{p-2va1Pk9z.js → p-Dhio9uis.js} +11 -47
- package/dist/stencil/{p-d19d1b82.entry.js → p-ab5c4292.entry.js} +268 -139
- package/dist/stencil/{p-df06ca3a.entry.js → p-fb32cd8f.entry.js} +2 -2
- package/dist/stencil/stencil.esm.js +4 -4
- package/dist/types/classes/providers/sync/hocuspocus-sync-provider.class.d.ts +5 -0
- package/dist/types/classes/providers/sync/websocket-sync-provider.class.d.ts +6 -0
- package/dist/types/classes/structures/app-state-map.structure.d.ts +6 -0
- package/dist/types/classes/structures/object-map.structure.d.ts +26 -2
- package/dist/types/components/core/kritzel-editor/kritzel-editor.d.ts +3 -0
- package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +14 -1
- package/dist/types/components.d.ts +8 -1
- package/dist/types/constants/version.d.ts +1 -1
- package/dist/types/interfaces/sync-provider.interface.d.ts +13 -0
- package/dist/types/stencil-public-runtime.d.ts +0 -12
- package/loader/index.d.ts +1 -1
- package/package.json +1 -1
- package/readme.md +10 -10
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { r as registerInstance, h, H as Host, c as createEvent, g as getElement } from './p-
|
|
2
|
-
import { c as KritzelPath, e as KritzelLine, U as KritzelColorHelper, V as KritzelDevicesHelper, X as KritzelMouseButton, Y as KritzelHTMLHelper, Z as DEFAULT_STROKE_SIZES, _ as DEFAULT_COLOR_PALETTE, S as ShapeType, q as KritzelSelectionTool, D as DEFAULT_BRUSH_CONFIG, j as KritzelBrushTool, l as KritzelEraserTool, C as DEFAULT_LINE_TOOL_CONFIG, k as KritzelLineTool, o as KritzelShapeTool, B as DEFAULT_TEXT_CONFIG, n as KritzelTextTool, m as KritzelImageTool, N as KritzelAlignment, z as hasRemoteSyncProvider, E as DEFAULT_ASSET_STORAGE_CONFIG, $ as ObjectHelper, a0 as resolveTextToolAvailableFonts, a1 as ThemeHelper, G as darkTheme, F as lightTheme, a2 as KritzelSelectionGroup, a3 as KritzelSelectionBox, a4 as KritzelIconRegistry, y as KritzelFontRegistry, a5 as KritzelKeyboardHelper, a6 as KritzelBaseHandler, s as KritzelWorkspace, f as KritzelGroup, h as KritzelCustomElement, d as KritzelImage, g as KritzelShape, b as KritzelText, O as runMigrations, T as CURRENT_WORKSPACE_SCHEMA_VERSION, Q as WORKSPACE_MIGRATIONS, a7 as KritzelClassHelper, R as CURRENT_APP_STATE_SCHEMA_VERSION, P as APP_STATE_MIGRATIONS, p as KritzelCursorHelper, a8 as KritzelImageFileHelper, a9 as imageCompression, t as KritzelAnchorManager, u as KritzelThemeManager, v as KritzelLocalizationManager, w as KritzelLicenseManager, r as KritzelAssetResolver, aa as KritzelEventHelper, W as WORKSPACE_EXPORT_VERSION, i as KritzelBaseTool } from './p-
|
|
1
|
+
import { r as registerInstance, h, H as Host, c as createEvent, g as getElement } from './p-Dhio9uis.js';
|
|
2
|
+
import { c as KritzelPath, e as KritzelLine, U as KritzelColorHelper, V as KritzelDevicesHelper, X as KritzelMouseButton, Y as KritzelHTMLHelper, Z as DEFAULT_STROKE_SIZES, _ as DEFAULT_COLOR_PALETTE, S as ShapeType, q as KritzelSelectionTool, D as DEFAULT_BRUSH_CONFIG, j as KritzelBrushTool, l as KritzelEraserTool, C as DEFAULT_LINE_TOOL_CONFIG, k as KritzelLineTool, o as KritzelShapeTool, B as DEFAULT_TEXT_CONFIG, n as KritzelTextTool, m as KritzelImageTool, N as KritzelAlignment, z as hasRemoteSyncProvider, E as DEFAULT_ASSET_STORAGE_CONFIG, $ as ObjectHelper, a0 as resolveTextToolAvailableFonts, a1 as ThemeHelper, G as darkTheme, F as lightTheme, a2 as KritzelSelectionGroup, a3 as KritzelSelectionBox, a4 as KritzelIconRegistry, y as KritzelFontRegistry, a5 as KritzelKeyboardHelper, a6 as KritzelBaseHandler, s as KritzelWorkspace, f as KritzelGroup, h as KritzelCustomElement, d as KritzelImage, g as KritzelShape, b as KritzelText, O as runMigrations, T as CURRENT_WORKSPACE_SCHEMA_VERSION, Q as WORKSPACE_MIGRATIONS, a7 as KritzelClassHelper, R as CURRENT_APP_STATE_SCHEMA_VERSION, P as APP_STATE_MIGRATIONS, p as KritzelCursorHelper, a8 as KritzelImageFileHelper, a9 as imageCompression, t as KritzelAnchorManager, u as KritzelThemeManager, v as KritzelLocalizationManager, w as KritzelLicenseManager, r as KritzelAssetResolver, aa as KritzelEventHelper, W as WORKSPACE_EXPORT_VERSION, i as KritzelBaseTool } from './p-DfvqHmxc.js';
|
|
3
3
|
import * as Y from 'yjs';
|
|
4
4
|
import 'y-indexeddb';
|
|
5
5
|
import 'y-websocket';
|
|
@@ -136,16 +136,16 @@ const KritzelAvatar = class {
|
|
|
136
136
|
height: `${this.size}px`,
|
|
137
137
|
fontSize: `${Math.round(this.size * 0.4)}px`,
|
|
138
138
|
};
|
|
139
|
-
return (h(Host, { key: '
|
|
139
|
+
return (h(Host, { key: '90ce966bb2a374e68c544906c8c746df6cc01038', style: containerStyles, class: {
|
|
140
140
|
'has-image': !!showImage,
|
|
141
141
|
'has-initials': !!showInitials,
|
|
142
142
|
'has-default': !!showDefaultIcon,
|
|
143
|
-
}, role: "img", "aria-label": this.getDisplayName() || 'User avatar' }, showImage && (h("img", { key: '
|
|
143
|
+
}, role: "img", "aria-label": this.getDisplayName() || 'User avatar' }, showImage && (h("img", { key: '6799f4ad45c7d40ebaf640f191171ed6a5f14ae9', src: imageUrl, alt: "", class: "avatar-image", ref: (el) => {
|
|
144
144
|
if (el) {
|
|
145
145
|
el.referrerPolicy = 'no-referrer';
|
|
146
146
|
el.crossOrigin = 'anonymous';
|
|
147
147
|
}
|
|
148
|
-
}, onError: this.handleImageError })), showInitials && (h("span", { key: '
|
|
148
|
+
}, onError: this.handleImageError })), showInitials && (h("span", { key: '98cdcda64b900994b61a03179be9f2af17c489e8', class: "avatar-initials", style: { backgroundColor: this.getBackgroundColor() } }, initials)), showDefaultIcon && (h("span", { key: '64e6a6ee67017c927dce0b51810a5bb02fc0d6d1', class: "avatar-default" }, h("svg", { key: '42f99637a3c23aaf10fa7c99753347ede1d518c0', viewBox: "0 0 24 24", fill: "currentColor" }, h("path", { key: '28b52a68b36e98b0e14891fd225457be65f1bb46', d: "M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" }))))));
|
|
149
149
|
}
|
|
150
150
|
static get watchers() { return {
|
|
151
151
|
"user": [{
|
|
@@ -158,7 +158,7 @@ const KritzelAvatar = class {
|
|
|
158
158
|
};
|
|
159
159
|
KritzelAvatar.style = kritzelAvatarCss();
|
|
160
160
|
|
|
161
|
-
const kritzelAwarenessCursorsCss = () => `:host{display:block;position:fixed;top:0;left:0;width:100vw;height:100vh;pointer-events:none;z-index:1}.awareness-cursor{position:absolute;top:0;left:0;transition:transform var(--kritzel-awareness-cursor-transition-duration, 100ms) ease-out,
|
|
161
|
+
const kritzelAwarenessCursorsCss = () => `:host{display:block;position:fixed;top:0;left:0;width:100vw;height:100vh;pointer-events:none;z-index:1}.awareness-cursor{position:absolute;top:0;left:0;transition:transform var(--kritzel-awareness-cursor-transition-duration, 100ms) ease-out, opacity 300ms ease;will-change:transform}.awareness-cursor.stale{opacity:0}.awareness-cursor.tracking-object{transition-duration:0ms}.cursor-arrow{filter:drop-shadow(0 1px 2px rgba(0, 0, 0, 0.3))}.cursor-label{position:absolute;left:16px;top:16px;white-space:nowrap;font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;font-size:var(--kritzel-awareness-cursor-label-font-size, 12px);color:var(--kritzel-awareness-cursor-label-text-color, #ffffff);padding:2px 8px;border-radius:4px;line-height:1.4;font-weight:500;pointer-events:none;user-select:none}.edge-indicator{position:absolute;top:-12px;left:-12px;width:24px;height:24px;display:flex;align-items:center;justify-content:center;transition:transform var(--kritzel-awareness-cursor-transition-duration, 100ms) ease-out, opacity 300ms ease;will-change:transform;pointer-events:auto;user-select:none;cursor:pointer}.edge-indicator.stale{opacity:0}.edge-indicator.tracking-object{transition-duration:0ms}.edge-arrow{position:absolute;filter:drop-shadow(0 1px 3px rgba(0, 0, 0, 0.3));transition:opacity 300ms ease}.edge-arrow.stale{opacity:0}.edge-label{position:absolute;white-space:nowrap;font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;font-size:var(--kritzel-awareness-cursor-label-font-size, 12px);color:var(--kritzel-awareness-cursor-label-text-color, #ffffff);padding:2px 8px;border-radius:4px;line-height:1.4;font-weight:500;pointer-events:none;opacity:0;transform-origin:center;transition:opacity 150ms ease}.edge-indicator:hover .edge-label{opacity:1}.remote-selection-box{position:absolute;top:0;left:0;border-width:2px;border-style:solid;pointer-events:none;will-change:transform, width, height;transition:transform var(--kritzel-awareness-cursor-transition-duration, 100ms) ease-out, width var(--kritzel-awareness-cursor-transition-duration, 100ms) ease-out, height var(--kritzel-awareness-cursor-transition-duration, 100ms) ease-out}`;
|
|
162
162
|
|
|
163
163
|
const STALE_THRESHOLD_MS = 10_000;
|
|
164
164
|
const REMOVE_THRESHOLD_MS = 30_000;
|
|
@@ -363,7 +363,7 @@ const KritzelAwarenessCursors = class {
|
|
|
363
363
|
}
|
|
364
364
|
render() {
|
|
365
365
|
const cursors = Array.from(this.remoteCursors.values());
|
|
366
|
-
return (h(Host, { key: '
|
|
366
|
+
return (h(Host, { key: '9be6694250bafe011be27301d1c7a53fc7957657' }, cursors.map(remoteCursor => {
|
|
367
367
|
if (!remoteCursor.cursor)
|
|
368
368
|
return null;
|
|
369
369
|
// When a remote user is actively drawing, derive cursor position from
|
|
@@ -470,7 +470,7 @@ const KritzelBackToContent = class {
|
|
|
470
470
|
this.backToContent.emit();
|
|
471
471
|
};
|
|
472
472
|
render() {
|
|
473
|
-
return (h(Host, { key: '
|
|
473
|
+
return (h(Host, { key: '2576489b9f97c77d1931e7c8496bae968d998f9d' }, h("button", { key: 'da891543ce8a9b5ccd2f4a461bdcdc7f3f9ad266', class: { 'back-to-content-button': true, visible: this.visible }, onClick: this.handleClick, "aria-label": this.text }, h("kritzel-icon", { key: '4559cc932918707d5961c6237f3c5e23c9e4cc9d', name: "chevrons-left" }))));
|
|
474
474
|
}
|
|
475
475
|
};
|
|
476
476
|
KritzelBackToContent.style = kritzelBackToContentCss();
|
|
@@ -497,16 +497,16 @@ const KritzelButton = class {
|
|
|
497
497
|
this.buttonClick.emit();
|
|
498
498
|
};
|
|
499
499
|
render() {
|
|
500
|
-
return (h(Host, { key: '
|
|
500
|
+
return (h(Host, { key: '51621006f6b085db2b43accf52192f0674d2c50c' }, h("button", { key: '01ab2d96abe5ad34285e59f6fec66f6b21e91849', type: this.type, class: {
|
|
501
501
|
'kritzel-button': true,
|
|
502
502
|
[this.variant]: true,
|
|
503
503
|
'disabled': this.disabled,
|
|
504
|
-
}, disabled: this.disabled, onClick: this.handleClick }, h("slot", { key: '
|
|
504
|
+
}, disabled: this.disabled, onClick: this.handleClick }, h("slot", { key: '4b085139ea85ad9f836059f4cf2dde15b948e0e2' }))));
|
|
505
505
|
}
|
|
506
506
|
};
|
|
507
507
|
KritzelButton.style = kritzelButtonCss();
|
|
508
508
|
|
|
509
|
-
const kritzelColorCss = () => `:host{display:flex}.checkerboard-bg{background:repeating-conic-gradient(
|
|
509
|
+
const kritzelColorCss = () => `:host{display:flex}.checkerboard-bg{background:repeating-conic-gradient( var(--kritzel-checkerboard-color-dark, #ccc) 0% 25%, var(--kritzel-checkerboard-color-light, #fff) 0% 50% ) 50% / 8px 8px;position:relative;overflow:hidden}.color-circle{width:24px;height:24px;border-radius:50%;box-sizing:border-box;display:block}.color-circle.white{border:1px solid var(--kritzel-color-palette-circle-border-color, #dddcdc)}`;
|
|
510
510
|
|
|
511
511
|
const KritzelColorComponent = class {
|
|
512
512
|
constructor(hostRef) {
|
|
@@ -549,13 +549,13 @@ const KritzelColorComponent = class {
|
|
|
549
549
|
render() {
|
|
550
550
|
const resolvedColor = this.resolveColor();
|
|
551
551
|
const isColorVeryLight = this.isLightColor(resolvedColor);
|
|
552
|
-
return (h(Host, { key: '
|
|
552
|
+
return (h(Host, { key: 'e797bfa6a2aed82d1913ec2f02f8b25a063564e5' }, h("div", { key: '5b62fcdbb2985b90fe0d7c7b65b507ec1c55e240', class: "checkerboard-bg", style: {
|
|
553
553
|
width: `${this.size}px`,
|
|
554
554
|
height: `${this.size}px`,
|
|
555
555
|
borderRadius: '50%',
|
|
556
556
|
display: 'inline-block',
|
|
557
557
|
position: 'relative',
|
|
558
|
-
} }, h("div", { key: '
|
|
558
|
+
} }, h("div", { key: '2d62717ebf81be93219ebda7071c0ba992d7441a', class: {
|
|
559
559
|
'color-circle': true,
|
|
560
560
|
'white': isColorVeryLight,
|
|
561
561
|
}, style: {
|
|
@@ -611,7 +611,7 @@ const KritzelColorPalette = class {
|
|
|
611
611
|
render() {
|
|
612
612
|
const displayedColors = this.isExpanded ? this.colors : this.colors.slice(0, 6);
|
|
613
613
|
const expandedHeight = this.isExpanded ? this.calculateHeight() : '32px';
|
|
614
|
-
return (h(Host, { key: '
|
|
614
|
+
return (h(Host, { key: '9a637b3a6946384a889f54dc3a635da7ff014439' }, h("div", { key: '4db8bbc7a234bfed26b60ed306a5f999875e2195', class: {
|
|
615
615
|
'color-grid': true,
|
|
616
616
|
'expanded': this.isExpanded,
|
|
617
617
|
}, style: {
|
|
@@ -1180,13 +1180,13 @@ const KritzelControls = class {
|
|
|
1180
1180
|
// Separate tool controls from config control
|
|
1181
1181
|
const toolControls = this.internalControls.filter(c => c.type === 'tool' || c.type === 'separator');
|
|
1182
1182
|
const configControl = this.internalControls.find(c => c.type === 'config' && c.name === this.firstConfig?.name);
|
|
1183
|
-
return (h(Host, { key: '
|
|
1183
|
+
return (h(Host, { key: '2a7595b72594df3e8ff9a103c3ff7dd70f0a8045', style: { display: this.visible ? '' : 'none' }, class: {
|
|
1184
1184
|
mobile: this.isTouchDevice,
|
|
1185
|
-
} }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: '
|
|
1185
|
+
} }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: '1c2d9f14c53944f291cf49cbcd1bf282ad8a8683', style: {
|
|
1186
1186
|
position: 'absolute',
|
|
1187
1187
|
bottom: '56px',
|
|
1188
1188
|
left: '12px',
|
|
1189
|
-
}, undoState: this.undoState, terms: this.terms, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: '
|
|
1189
|
+
}, undoState: this.undoState, terms: this.terms, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: '8ac30e183885bc106033ca163aa7e5927802e67c', class: "kritzel-controls" }, h("div", { key: '74b2808a506e671682aed91107c7c9e27aa4b2c7', class: { 'scroll-indicator-left': true, 'visible': this.canScrollLeft } }), h("div", { key: '3fd693c993d5b11eadd2eec7481214fbc1550301', class: "kritzel-tools-scroll", ref: el => (this.toolsScrollRef = el), onScroll: this.handleToolsScroll }, toolControls.map(control => {
|
|
1190
1190
|
// Check if this control has sub-options (split-button)
|
|
1191
1191
|
if (control.subOptions?.length) {
|
|
1192
1192
|
const selectedSubOption = this.getSelectedSubOption(control);
|
|
@@ -1216,10 +1216,10 @@ const KritzelControls = class {
|
|
|
1216
1216
|
'kritzel-control': true,
|
|
1217
1217
|
'selected': this.activeControl?.name === control?.name,
|
|
1218
1218
|
}, key: control.name, "data-testid": `tool-${control.name}`, onClick: _event => this.handleControlClick?.(control), "aria-label": control.name.charAt(0).toUpperCase() + control.name.slice(1) }, h("kritzel-icon", { name: control.icon })));
|
|
1219
|
-
})), h("div", { key: '
|
|
1219
|
+
})), h("div", { key: '6f16a8332dc6a082f2e6aedbec3e31398f2a8b66', class: { 'scroll-indicator-right': true, 'visible': this.canScrollRight && !(configControl && this.activeControl && hasConfigUI) } }), configControl && this.activeControl && (h("div", { class: {
|
|
1220
1220
|
'kritzel-config-container': true,
|
|
1221
1221
|
'visible': hasConfigUI,
|
|
1222
|
-
}, key: configControl.name }, h("div", { key: '
|
|
1222
|
+
}, key: configControl.name }, h("div", { key: '554d743fccfb62d8c368f2a5cdca232ae9842b7f', class: { 'config-gradient-left': true, 'visible': this.needsScrolling } }), h("kritzel-tooltip", { key: 'af97d986d82c961d66c910f7edabd6e597ec59ab', anchorElement: this.host.shadowRoot?.querySelector('.kritzel-config-container'), triggerElement: this.configTriggerRef }, h("kritzel-tool-config", { key: '3721e5463a85881c7e806d69c0a9524f44732978', tool: this.activeControl.tool, theme: this.theme, engine: this.kritzelEngine, terms: this.terms, onToolChange: event => this.handleToolChange?.(event), onDisplayValuesChange: this.handleDisplayValuesChange, style: { width: '100%', height: '100%' } })), h("div", { key: 'c6e3fe4a4a9b781db394073c8f929533487be760', tabIndex: hasConfigUI ? 0 : -1, class: "kritzel-config", "data-testid": "tool-config", ref: el => {
|
|
1223
1223
|
if (el)
|
|
1224
1224
|
this.configTriggerRef = el;
|
|
1225
1225
|
}, onKeyDown: event => {
|
|
@@ -1228,7 +1228,7 @@ const KritzelControls = class {
|
|
|
1228
1228
|
}
|
|
1229
1229
|
}, style: {
|
|
1230
1230
|
cursor: 'pointer',
|
|
1231
|
-
} }, this.displayValues && (h("div", { key: '
|
|
1231
|
+
} }, this.displayValues && (h("div", { key: '9eeb3a9fc29f4848ee9f325d50b4cbfc5bfe5f1c', class: "color-container" }, h("kritzel-color", { key: '1d45edb7ed07a8d12ab55e374ea456b8e95c8d41', value: this.displayValues.color, theme: this.theme, size: 18, style: {
|
|
1232
1232
|
borderRadius: '50%',
|
|
1233
1233
|
border: 'none',
|
|
1234
1234
|
} })))))))));
|
|
@@ -1262,7 +1262,7 @@ const KritzelCurrentUser = class {
|
|
|
1262
1262
|
/** Resolved localized strings keyed by term key, supplied by the editor. */
|
|
1263
1263
|
terms = {};
|
|
1264
1264
|
render() {
|
|
1265
|
-
return (h(Host, { key: '
|
|
1265
|
+
return (h(Host, { key: '19551eb12507f1384aedf3ca4ce5212eca509c24' }, h("kritzel-avatar", { key: 'e39405e8e6c2e77a8acf5f286fa3890e28e8ab17', user: this.user, size: this.avatarSize })));
|
|
1266
1266
|
}
|
|
1267
1267
|
};
|
|
1268
1268
|
KritzelCurrentUser.style = kritzelCurrentUserCss();
|
|
@@ -1303,7 +1303,7 @@ const KritzelCurrentUserDialog = class {
|
|
|
1303
1303
|
}
|
|
1304
1304
|
render() {
|
|
1305
1305
|
const displayName = this.getDisplayName();
|
|
1306
|
-
return (h(Host, { key: '
|
|
1306
|
+
return (h(Host, { key: '8f8e63ac6f789f2d0ee43b8b7439634411a91ac9' }, h("kritzel-dialog", { key: '4022a7251881f669f290e0a8beb9a39ef6242b19', dialogTitle: this.terms['currentUser.dialogTitle'] ?? 'Account', isOpen: this.isDialogOpen, onDialogClose: this.closeDialog, size: "small", contained: true }, h("div", { key: '4671f884c121cfaefdd8a47bd52b30acc2d7b345', class: "user-info" }, h("kritzel-avatar", { key: 'a1847b4b67302f3b7179e4e2b751f7f2106b76d4', user: this.user, size: 80 }), displayName && h("div", { key: 'b3d09b4c99d76014a2e36260edce52c39f1081e1', class: "user-name" }, displayName), this.user?.email && h("div", { key: 'a76ce19cbd24ad536b022264dab6a83f4d1b36c2', class: "user-email" }, this.user.email), h("kritzel-button", { key: 'f125164a9d9362eedfbfff4fc2629f7ec055fc14', class: "logout-button", variant: "primary", onButtonClick: this.handleLogout }, this.terms['menu.logout'] ?? 'Logout')))));
|
|
1307
1307
|
}
|
|
1308
1308
|
};
|
|
1309
1309
|
KritzelCurrentUserDialog.style = kritzelCurrentUserDialogCss();
|
|
@@ -1376,7 +1376,7 @@ const KritzelCursorTrail = class {
|
|
|
1376
1376
|
}
|
|
1377
1377
|
}
|
|
1378
1378
|
render() {
|
|
1379
|
-
return (h(Host, { key: '
|
|
1379
|
+
return (h(Host, { key: 'b427550b19a3e172cb25d05e34635121b82a61c5' }, this.cursorTrailPoints.length > 1 && (h("svg", { key: '9685b563497e110f36c0feffbfde04ebeb38024b', class: "cursor-trail-svg", xmlns: "http://www.w3.org/2000/svg", style: {
|
|
1380
1380
|
position: 'absolute',
|
|
1381
1381
|
left: '0',
|
|
1382
1382
|
top: '0',
|
|
@@ -1399,7 +1399,7 @@ const KritzelCursorTrail = class {
|
|
|
1399
1399
|
};
|
|
1400
1400
|
KritzelCursorTrail.style = kritzelCursorTrailCss();
|
|
1401
1401
|
|
|
1402
|
-
const kritzelDialogCss = () => `:host{display:contents}.dialog-content{text-align:start;line-height:normal}.backdrop{position:fixed;top:0;left:0;right:0;bottom:0;z-index:10002;display:flex;align-items:center;justify-content:center;background-color:var(--kritzel-dialog-backdrop-color, rgba(0, 0, 0, 0.5));opacity:1;transition:opacity 150ms ease-out}.backdrop.is-animating{opacity:0}.dialog-content{position:relative;display:flex;flex-direction:column;background-color:var(--kritzel-dialog-background-color, #ffffff);border-radius:var(--kritzel-dialog-border-radius, 12px);box-shadow:var(--kritzel-dialog-box-shadow, 0 4px 20px rgba(0, 0, 0, 0.15));border:var(--kritzel-dialog-border, 1px solid #ebebeb);max-height:var(--kritzel-dialog-max-height, 90vh);max-width:var(--kritzel-dialog-max-width, 90vw);overflow:hidden;transform:scale(1);opacity:1;transition:transform 200ms ease-out,
|
|
1402
|
+
const kritzelDialogCss = () => `:host{display:contents}.dialog-content{text-align:start;line-height:normal}.backdrop{position:fixed;top:0;left:0;right:0;bottom:0;z-index:10002;display:flex;align-items:center;justify-content:center;background-color:var(--kritzel-dialog-backdrop-color, rgba(0, 0, 0, 0.5));opacity:1;transition:opacity 150ms ease-out}.backdrop.is-animating{opacity:0}.dialog-content{position:relative;display:flex;flex-direction:column;background-color:var(--kritzel-dialog-background-color, #ffffff);border-radius:var(--kritzel-dialog-border-radius, 12px);box-shadow:var(--kritzel-dialog-box-shadow, 0 4px 20px rgba(0, 0, 0, 0.15));border:var(--kritzel-dialog-border, 1px solid #ebebeb);max-height:var(--kritzel-dialog-max-height, 90vh);max-width:var(--kritzel-dialog-max-width, 90vw);overflow:hidden;transform:scale(1);opacity:1;transition:transform 200ms ease-out, opacity 200ms ease-out;font-family:var(--kritzel-dialog-font-family, sans-serif)}.dialog-content.is-animating{transform:scale(0.95);opacity:0}.dialog-content.size-small{width:var(--kritzel-dialog-width-small, 320px);height:var(--kritzel-dialog-height-small, auto)}.dialog-content.size-medium{width:var(--kritzel-dialog-width-medium, 480px);height:var(--kritzel-dialog-height-medium, auto)}.dialog-content.size-large{width:var(--kritzel-dialog-width-large, 640px);height:var(--kritzel-dialog-height-large, auto)}.dialog-content.size-fullscreen{width:100vw;height:100vh;height:100dvh;max-width:100vw;max-height:100vh;max-height:100dvh;border-radius:0}.backdrop.contained-fullscreen{background-color:transparent}.dialog-content.contained-fullscreen{border-radius:0}.dialog-content.contained-fullscreen .dialog-body{display:flex;flex-direction:column}.dialog-content.contained-fullscreen .dialog-body ::slotted(*){flex:1;min-height:0}@media (max-width: 576px), (max-height: 576px) and (orientation: landscape){.backdrop:has(.fullscreen-on-mobile){background-color:transparent}.dialog-content.fullscreen-on-mobile{width:100vw;height:100vh;height:100dvh;max-width:100vw;max-height:100vh;max-height:100dvh;border-radius:0}.dialog-content.fullscreen-on-mobile .dialog-body{display:flex;flex-direction:column}.dialog-content.fullscreen-on-mobile .dialog-body ::slotted(*){flex:1;min-height:0}}.dialog-header{display:flex;align-items:center;justify-content:space-between;padding:var(--kritzel-dialog-header-padding, 16px 20px);border-bottom:var(--kritzel-dialog-header-border, 1px solid #ebebeb);gap:12px}.dialog-title{margin:0;font-size:var(--kritzel-dialog-title-font-size, 18px);font-weight:var(--kritzel-dialog-title-font-weight, 600);color:var(--kritzel-dialog-title-color, #1a1a1a);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.close-button{display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:var(--kritzel-dialog-close-button-border-radius, 6px);background-color:var(--kritzel-dialog-close-button-background, transparent);color:var(--kritzel-dialog-close-button-color, #666666);cursor:var(--kritzel-global-pointer-cursor, pointer);transition:background-color 150ms ease, color 150ms ease;flex-shrink:0;-webkit-tap-highlight-color:transparent}.close-button:hover{background-color:var(--kritzel-dialog-close-button-hover-background, #f5f5f5);color:var(--kritzel-dialog-close-button-hover-color, #1a1a1a)}.close-button:active{background-color:var(--kritzel-dialog-close-button-active-background, #ebebeb)}.close-button:focus-visible{outline:revert;outline-offset:revert}.dialog-body{padding:var(--kritzel-dialog-body-padding, 20px);overflow-y:auto;flex:1;min-height:0;scrollbar-color:var(--kritzel-global-scrollbar-thumb-color, #ebebeb) transparent;scrollbar-width:thin}.dialog-footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--kritzel-dialog-footer-gap, 8px);padding:var(--kritzel-dialog-footer-padding, 16px 20px);border-top:var(--kritzel-dialog-footer-border, 1px solid #ebebeb)}::slotted([slot='header']){flex:1}::slotted([slot='footer']){display:contents}`;
|
|
1403
1403
|
|
|
1404
1404
|
const KritzelDialog = class {
|
|
1405
1405
|
constructor(hostRef) {
|
|
@@ -1842,7 +1842,7 @@ const KritzelDialog = class {
|
|
|
1842
1842
|
};
|
|
1843
1843
|
KritzelDialog.style = kritzelDialogCss();
|
|
1844
1844
|
|
|
1845
|
-
const kritzelDropdownCss = () => `:host{display:inline-flex;vertical-align:middle;width:100%;position:relative}.dropdown-wrapper{display:flex;align-items:center;border:1px solid var(--kritzel-dropdown-border-color, #ebebeb);border-radius:var(--kritzel-dropdown-border-radius, 6px);overflow:visible;height:38px;width:100%;position:relative}.dropdown-wrapper:hover:not(:focus-within){border-color:var(--kritzel-dropdown-hover-border-color, #cccccc)}.dropdown-container{flex:1;height:100%;min-width:0}.dropdown-trigger{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 8px;height:100%;width:100%;box-sizing:border-box;border-radius:var(--kritzel-dropdown-border-radius, 6px);border:none;background-color:var(--kritzel-dropdown-background, #ffffff);cursor:var(--kritzel-global-pointer-cursor, pointer);outline:none;font-size:inherit;font-family:inherit;color:var(--kritzel-dropdown-text-color, #333333);-webkit-tap-highlight-color:transparent;text-align:left}.dropdown-trigger:focus-visible{outline:revert}.dropdown-trigger.has-suffix-border{border-right:1px solid var(--kritzel-global-border-color, #ebebeb);border-top-right-radius:0;border-bottom-right-radius:0}.dropdown-trigger.has-prefix-border{border-left:1px solid var(--kritzel-global-border-color, #ebebeb);border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-trigger-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.dropdown-trigger-arrow{display:flex;align-items:center;justify-content:center;width:16px;height:16px;flex-shrink:0;transition:transform 0.2s ease}.dropdown-trigger-arrow svg{width:100%;height:100%}.dropdown-trigger.is-open .dropdown-trigger-arrow{transform:rotate(180deg)}.dropdown-trigger.is-open.open-up .dropdown-trigger-arrow{transform:rotate(0deg)}.dropdown-menu{position:absolute;left:0;right:0;margin:0;padding:4px 0;list-style:none;background-color:var(--kritzel-dropdown-background, #ffffff);border:1px solid var(--kritzel-global-border-color, #ebebeb);border-radius:var(--kritzel-dropdown-menu-border-radius, var(--kritzel-dropdown-border-radius, 6px));box-shadow:var(--kritzel-controls-box-shadow, 0 4px 12px rgba(0, 0, 0, 0.15));z-index:1000;max-height:240px;overflow-y:auto;opacity:0;visibility:hidden;transition:opacity 0.15s ease,
|
|
1845
|
+
const kritzelDropdownCss = () => `:host{display:inline-flex;vertical-align:middle;width:100%;position:relative}.dropdown-wrapper{display:flex;align-items:center;border:1px solid var(--kritzel-dropdown-border-color, #ebebeb);border-radius:var(--kritzel-dropdown-border-radius, 6px);overflow:visible;height:38px;width:100%;position:relative}.dropdown-wrapper:hover:not(:focus-within){border-color:var(--kritzel-dropdown-hover-border-color, #cccccc)}.dropdown-container{flex:1;height:100%;min-width:0}.dropdown-trigger{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 8px;height:100%;width:100%;box-sizing:border-box;border-radius:var(--kritzel-dropdown-border-radius, 6px);border:none;background-color:var(--kritzel-dropdown-background, #ffffff);cursor:var(--kritzel-global-pointer-cursor, pointer);outline:none;font-size:inherit;font-family:inherit;color:var(--kritzel-dropdown-text-color, #333333);-webkit-tap-highlight-color:transparent;text-align:left}.dropdown-trigger:focus-visible{outline:revert}.dropdown-trigger.has-suffix-border{border-right:1px solid var(--kritzel-global-border-color, #ebebeb);border-top-right-radius:0;border-bottom-right-radius:0}.dropdown-trigger.has-prefix-border{border-left:1px solid var(--kritzel-global-border-color, #ebebeb);border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-trigger-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.dropdown-trigger-arrow{display:flex;align-items:center;justify-content:center;width:16px;height:16px;flex-shrink:0;transition:transform 0.2s ease}.dropdown-trigger-arrow svg{width:100%;height:100%}.dropdown-trigger.is-open .dropdown-trigger-arrow{transform:rotate(180deg)}.dropdown-trigger.is-open.open-up .dropdown-trigger-arrow{transform:rotate(0deg)}.dropdown-menu{position:absolute;left:0;right:0;margin:0;padding:4px 0;list-style:none;background-color:var(--kritzel-dropdown-background, #ffffff);border:1px solid var(--kritzel-global-border-color, #ebebeb);border-radius:var(--kritzel-dropdown-menu-border-radius, var(--kritzel-dropdown-border-radius, 6px));box-shadow:var(--kritzel-controls-box-shadow, 0 4px 12px rgba(0, 0, 0, 0.15));z-index:1000;max-height:240px;overflow-y:auto;opacity:0;visibility:hidden;transition:opacity 0.15s ease, transform 0.15s ease, visibility 0.15s;outline:none}.dropdown-menu.open-down{top:calc(100% + 4px);bottom:auto;transform:translateY(-8px)}.dropdown-menu.open-up{bottom:calc(100% + 4px);top:auto;transform:translateY(8px)}.dropdown-menu.is-open{opacity:1;visibility:inherit;transform:translateY(0)}.dropdown-menu.open-up{box-shadow:var(--kritzel-controls-box-shadow, 0 -4px 12px rgba(0, 0, 0, 0.15))}.dropdown-option{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 12px;cursor:var(--kritzel-global-pointer-cursor, pointer);color:var(--kritzel-dropdown-text-color, #333333);transition:background-color 0.1s ease;-webkit-tap-highlight-color:transparent}.dropdown-option.is-focused{background-color:var(--kritzel-dropdown-hover-background-color, #f0f0f0)}.dropdown-option.is-selected{font-weight:600;background-color:var(--kritzel-dropdown-selected-background-color, #007bff1a)}.dropdown-option-check{display:flex;align-items:center;justify-content:center;width:16px;height:16px;flex-shrink:0;color:var(--kritzel-dropdown-accent-color, #007bff)}.dropdown-option-check svg{width:100%;height:100%}.dropdown-menu{scrollbar-color:var(--kritzel-global-scrollbar-thumb-color, #ebebeb) transparent;scrollbar-width:thin}::slotted(*){height:100%;box-sizing:border-box}`;
|
|
1846
1846
|
|
|
1847
1847
|
const KritzelDropdown = class {
|
|
1848
1848
|
constructor(hostRef) {
|
|
@@ -2080,7 +2080,7 @@ const KritzelDropdown = class {
|
|
|
2080
2080
|
'open-up': this.openDirection === 'up',
|
|
2081
2081
|
'open-down': this.openDirection === 'down',
|
|
2082
2082
|
};
|
|
2083
|
-
return (h(Host, { key: '
|
|
2083
|
+
return (h(Host, { key: 'c606b338e55dc66396105fa7b4fbdf372f3866e6' }, h("div", { key: 'aa32b73cac337fa4142ecc124cf039a59e3b3118', class: "dropdown-wrapper", ref: el => (this.wrapperElement = el) }, h("slot", { key: '2cd8e9ef246a24c49d58f76f227f36aed4786178', name: "prefix", ref: el => (this.prefixSlotElement = el), onSlotchange: this.evaluatePrefixContent }), h("div", { key: '80df8155e1907017d508e92f155bab5ae12dffab', class: "dropdown-container", style: { width: this.width } }, h("button", { key: 'd86463de7ec58248f1611d6b5d46f0eafc117f36', type: "button", class: triggerClasses, style: { ...this.selectStyles, ...this.getSelectedStyle() }, onClick: this.toggleMenu, onKeyDown: this.handleTriggerKeyDown, "aria-haspopup": "listbox", "aria-expanded": this.isOpen ? 'true' : 'false', ref: el => (this.triggerElement = el) }, h("span", { key: '4ef6a997f7a781fb409e97ed5bd6843d0eaff0bb', class: "dropdown-trigger-label" }, this.getSelectedLabel()), h("span", { key: '6601efcd69d84af1f022d14ede628bac743cc1f1', class: "dropdown-trigger-arrow", "aria-hidden": "true" }, h("svg", { key: '6cb2efe7b4ca890562c10b0e24eb1dfdad90ec24', xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }, h("polyline", { key: 'a340af5a61dccf5bc29c8a473726b58055c2e9db', points: "6 9 12 15 18 9" }))))), h("slot", { key: '5bd4e5ad4cc4642c7769ecac2106ba82bae626f2', name: "suffix", ref: el => (this.suffixSlotElement = el), onSlotchange: this.evaluateSuffixContent }), h("ul", { key: 'e7a2be8ac261bc5fa1450940e2a57090d6be3315', class: menuClasses, role: "listbox", tabindex: "-1", onKeyDown: this.handleMenuKeyDown, ref: el => (this.menuElement = el) }, this.options.map((option, index) => {
|
|
2084
2084
|
const isSelected = option.value === this.internalValue;
|
|
2085
2085
|
const isFocused = index === this.focusedIndex;
|
|
2086
2086
|
const optionClasses = {
|
|
@@ -2127,7 +2127,7 @@ const DEFAULT_SYNC_CONFIG = {
|
|
|
2127
2127
|
providers: [],
|
|
2128
2128
|
};
|
|
2129
2129
|
|
|
2130
|
-
const kritzelEditorCss = () => `kritzel-editor{display:flex;margin:0;position:relative;container-type:inline-size;overflow:hidden;width:100%;height:100%;align-items:center;justify-content:center;touch-action:manipulation;user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:start;line-height:normal}.editor-content{position:absolute;inset:0}.editor-content>kritzel-engine{position:absolute;inset:0;z-index:0}kritzel-controls{position:absolute;z-index:1;left:0;right:0;margin-inline:auto;width:max-content;max-width:calc(100% - 16px);bottom:var(--kritzel-editor-controls-bottom, 14px);transition:transform var(--kritzel-editor-controls-transition-duration, 0.1s) var(--kritzel-editor-controls-transition, ease-in-out)}kritzel-controls.keyboard-open{transform:var(--kritzel-editor-controls-transform, translateY(300%))}.top-left-buttons{position:absolute;z-index:1;top:var(--kritzel-editor-top-left-buttons-top, 14px);left:var(--kritzel-editor-top-left-buttons-left, 14px);display:flex;align-items:flex-start;gap:8px}.top-center-notification-layer{position:absolute;top:var(--kritzel-editor-top-center-notification-top, 14px);left:0;right:0;z-index:var(--kritzel-editor-top-center-notification-z-index, 10001);display:flex;justify-content:center;pointer-events:none}.top-center-notification-container{width:min(90vw, 420px);pointer-events:auto;animation:kritzel-notification-slide-in var(--kritzel-editor-notification-animation-duration, 220ms)
|
|
2130
|
+
const kritzelEditorCss = () => `kritzel-editor{display:flex;margin:0;position:relative;container-type:inline-size;overflow:hidden;width:100%;height:100%;align-items:center;justify-content:center;touch-action:manipulation;user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:start;line-height:normal}.editor-content{position:absolute;inset:0}.editor-content>kritzel-engine{position:absolute;inset:0;z-index:0}kritzel-controls{position:absolute;z-index:1;left:0;right:0;margin-inline:auto;width:max-content;max-width:calc(100% - 16px);bottom:var(--kritzel-editor-controls-bottom, 14px);transition:transform var(--kritzel-editor-controls-transition-duration, 0.1s) var(--kritzel-editor-controls-transition, ease-in-out)}kritzel-controls.keyboard-open{transform:var(--kritzel-editor-controls-transform, translateY(300%))}.top-left-buttons{position:absolute;z-index:1;top:var(--kritzel-editor-top-left-buttons-top, 14px);left:var(--kritzel-editor-top-left-buttons-left, 14px);display:flex;align-items:flex-start;gap:8px}.top-center-notification-layer{position:absolute;top:var(--kritzel-editor-top-center-notification-top, 14px);left:0;right:0;z-index:var(--kritzel-editor-top-center-notification-z-index, 10001);display:flex;justify-content:center;pointer-events:none}.top-center-notification-container{width:min(90vw, 420px);pointer-events:auto;animation:kritzel-notification-slide-in var(--kritzel-editor-notification-animation-duration, 220ms) var(--kritzel-editor-notification-animation-easing, cubic-bezier(0.22, 1, 0.36, 1))}.top-center-notification-container.is-dismissing{animation:kritzel-notification-fade-out var(--kritzel-editor-notification-dismiss-animation-duration, 180ms) var(--kritzel-editor-notification-dismiss-animation-easing, ease-in) forwards}@keyframes kritzel-notification-slide-in{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes kritzel-notification-fade-out{from{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-6px)}}@media (prefers-reduced-motion: reduce){.top-center-notification-container{animation:none}}.top-right-buttons{position:absolute;z-index:1;top:var(--kritzel-editor-top-right-buttons-top, 14px);right:var(--kritzel-editor-top-right-buttons-right, 14px);display:flex;align-items:center;gap:8px}.bottom-left-buttons{position:absolute;z-index:1;left:var(--kritzel-editor-top-left-buttons-left, 14px);bottom:var(--kritzel-editor-controls-bottom, 14px);display:flex;align-items:flex-end}@container (max-width: 767px){.bottom-left-buttons{display:none}}.top-right-button{display:flex;align-items:center;justify-content:center;width:50px;height:50px;padding:0;border:var(--kritzel-split-button-border, 1px solid #ebebeb);border-radius:var(--kritzel-split-button-border-radius, 12px);background-color:var(--kritzel-split-button-background-color, #ffffff);cursor:var(--kritzel-global-pointer-cursor, pointer);box-shadow:var(--kritzel-split-button-box-shadow, 0 0 3px rgba(0, 0, 0, 0.08));transition:background-color 150ms ease;-webkit-tap-highlight-color:transparent}.top-right-button:hover{background-color:#f5f5f5}.top-right-button:active{background-color:#ebebeb}`;
|
|
2131
2131
|
|
|
2132
2132
|
const KritzelEditor = class {
|
|
2133
2133
|
constructor(hostRef) {
|
|
@@ -2146,6 +2146,8 @@ const KritzelEditor = class {
|
|
|
2146
2146
|
this.login = createEvent(this, "login");
|
|
2147
2147
|
this.isPublicChange = createEvent(this, "isPublicChange");
|
|
2148
2148
|
this.awarenessChange = createEvent(this, "awarenessChange");
|
|
2149
|
+
this.syncingChange = createEvent(this, "syncingChange");
|
|
2150
|
+
this.loadingChange = createEvent(this, "loadingChange");
|
|
2149
2151
|
}
|
|
2150
2152
|
get host() { return getElement(this); }
|
|
2151
2153
|
scaleMax = ABSOLUTE_SCALE_MAX;
|
|
@@ -2385,6 +2387,9 @@ const KritzelEditor = class {
|
|
|
2385
2387
|
login;
|
|
2386
2388
|
isPublicChange;
|
|
2387
2389
|
awarenessChange;
|
|
2390
|
+
/** Emitted while remote changes are being applied to the active workspace. Stays silent when the remote holds nothing new. */
|
|
2391
|
+
syncingChange;
|
|
2392
|
+
loadingChange;
|
|
2388
2393
|
isEngineReady = false;
|
|
2389
2394
|
isControlsReady = false;
|
|
2390
2395
|
isWorkspaceManagerReady = false;
|
|
@@ -3203,40 +3208,40 @@ const KritzelEditor = class {
|
|
|
3203
3208
|
const isLoggedIn = this.isLoggedIn;
|
|
3204
3209
|
const shouldShowCurrentUser = isLoggedIn;
|
|
3205
3210
|
const shouldShowLoginButton = this.isReady && !!this.loginConfig && !isLoggedIn;
|
|
3206
|
-
return (h(Host, { key: '
|
|
3211
|
+
return (h(Host, { key: 'ff7d505697bd4c4bd840dadcb04a934b7e243a01' }, h("div", { key: 'b40076c3c79ad3f879e80c58b412b79266de2ea8', class: "editor-content", style: {
|
|
3207
3212
|
opacity: this.isEditorVisible ? '1' : '0',
|
|
3208
3213
|
visibility: this.isEditorVisible ? 'visible' : 'hidden',
|
|
3209
3214
|
transition: 'opacity 0.2s ease-in-out, visibility 0.2s ease-in-out',
|
|
3210
|
-
} }, h("div", { key: '
|
|
3215
|
+
} }, h("div", { key: '1b1171eea60a36ad06da55a3da564bc356526266', class: "top-left-buttons" }, h("kritzel-workspace-manager", { key: '48b59f3f57ace57debc19a295d4fb642e8c3b23d', visible: this.isWorkspaceManagerVisible, workspaces: this.workspaces, activeWorkspace: this.activeWorkspace, terms: this.resolvedTerms, onWorkspaceChange: event => (this.activeWorkspace = event.detail), onIsWorkspaceManagerReady: () => (this.isWorkspaceManagerReady = true) }), h("kritzel-back-to-content", { key: 'c66a6faae8bf7115dcce47630ad820af9ba76eb0', visible: this.isBackToContentButtonVisible, text: this.resolvedTerms['backToContent.label'] ?? 'Back to content', onBackToContent: () => this.backToContent() })), this.activeNotification && (h("div", { key: '834baedc5f20328deb4ee586f693313306895a71', class: "top-center-notification-layer", role: "presentation" }, h("div", { key: 'f800508a2e076ee3e89820ffff4df81842b175b3', class: { 'top-center-notification-container': true, 'is-dismissing': this.isNotificationDismissing }, role: "presentation" }, h("kritzel-notification-card", { key: '2835ea84e8fa92c41637adaa29d9005f209b2da9', notification: this.activeNotification, locale: this.locale, onDismiss: this.dismissNotification, onHoverChange: event => this.handleNotificationHoverChange(event) })))), this.contextMenuState && this.contextMenuState.items.length > 0 && (h("kritzel-context-menu", { key: '6c49e899b7f933d3f06cd1f8696a590d542214a7', class: "context-menu", items: this.contextMenuState.items, objects: this.contextMenuState.objects, style: {
|
|
3211
3216
|
position: 'absolute',
|
|
3212
3217
|
left: `${this.contextMenuState.position.x}px`,
|
|
3213
3218
|
top: `${this.contextMenuState.position.y}px`,
|
|
3214
3219
|
zIndex: '10002',
|
|
3215
|
-
}, onActionSelected: event => this.handleContextMenuActionSelected(event), onClose: () => this.hideContextMenu() })), h("kritzel-sync-indicator", { key: '
|
|
3220
|
+
}, onActionSelected: event => this.handleContextMenuActionSelected(event), onClose: () => this.hideContextMenu() })), h("kritzel-sync-indicator", { key: '9622af1634a939d6689d5a133496d536f5d7865f', visible: this.isSyncing, text: "Syncing..." }), h("kritzel-loading-overlay", { key: '00f142a3eb8b23fbd0bdb6ec53ae95855434516c', visible: this.isLoadingOverlayVisible, text: this.resolvedTerms['editor.loading'] ?? 'Loading...' }), h("kritzel-engine", { key: '39b1d7bfce0a5347fec60cd135d6db8fb4250bfa', ref: el => {
|
|
3216
3221
|
if (el) {
|
|
3217
3222
|
this.engineRef = el;
|
|
3218
3223
|
}
|
|
3219
|
-
}, workspace: this.activeWorkspace, activeWorkspaceId: this.activeWorkspaceId, editorId: this.editorId, syncConfig: this.syncConfig, assetStorageConfig: this.assetStorageConfig, user: this.user, scaleMax: this.scaleMax, lockDrawingScale: this.lockDrawingScale, isObjectDistanceFadingActive: this.isObjectDistanceFadingActive, scaleMin: this.scaleMin, cursorTarget: this.cursorTarget, isLoading: this.isLoading, viewportBoundaryLeft: this.viewportBoundaryLeft, viewportBoundaryRight: this.viewportBoundaryRight, viewportBoundaryTop: this.viewportBoundaryTop, viewportBoundaryBottom: this.viewportBoundaryBottom, isPanningEnabled: this.isPanningEnabled, isZoomingEnabled: this.isZoomingEnabled, theme: this.theme, themes: this.themes, licenseKey: this.licenseKey, locale: this.locale, locales: this.locales, fallbackLocale: this.fallbackLocale, debugInfo: this.debugInfo, globalContextMenuItems: this.globalContextMenuItems, objectContextMenuItems: this.objectContextMenuItems, onIsEngineReady: event => this.onEngineReady(event), onWorkspacesChange: event => this.handleWorkspacesChange(event), onActiveWorkspaceChange: event => this.handleActiveWorkspaceChange(event), onObjectsChange: event => this.handleObjectsChange(event), onObjectsAdded: event => this.handleObjectsAdded(event), onObjectsRemoved: event => this.handleObjectsRemoved(event), onObjectsUpdated: event => this.handleObjectsUpdated(event), onUndoStateChange: event => this.handleUndoStateChange(event), onObjectsInViewportChange: event => this.handleObjectsInViewportChange(event), onViewportChange: event => this.handleViewportChange(event), onAwarenessChange: event => this.handleAwarenessChange(event), onNotificationsChange: event => this.handleNotificationsChange(event), onContextMenuStateChange: event => this.handleContextMenuStateChange(event), onSyncingChange: event => (this.isSyncing = event.detail), onLoadingChange: event => (this.isLoadingOverlayVisible = event.detail) }), h("kritzel-controls", { key: '
|
|
3224
|
+
}, workspace: this.activeWorkspace, activeWorkspaceId: this.activeWorkspaceId, editorId: this.editorId, syncConfig: this.syncConfig, assetStorageConfig: this.assetStorageConfig, user: this.user, scaleMax: this.scaleMax, lockDrawingScale: this.lockDrawingScale, isObjectDistanceFadingActive: this.isObjectDistanceFadingActive, scaleMin: this.scaleMin, cursorTarget: this.cursorTarget, isLoading: this.isLoading, viewportBoundaryLeft: this.viewportBoundaryLeft, viewportBoundaryRight: this.viewportBoundaryRight, viewportBoundaryTop: this.viewportBoundaryTop, viewportBoundaryBottom: this.viewportBoundaryBottom, isPanningEnabled: this.isPanningEnabled, isZoomingEnabled: this.isZoomingEnabled, theme: this.theme, themes: this.themes, licenseKey: this.licenseKey, locale: this.locale, locales: this.locales, fallbackLocale: this.fallbackLocale, debugInfo: this.debugInfo, globalContextMenuItems: this.globalContextMenuItems, objectContextMenuItems: this.objectContextMenuItems, onIsEngineReady: event => this.onEngineReady(event), onWorkspacesChange: event => this.handleWorkspacesChange(event), onActiveWorkspaceChange: event => this.handleActiveWorkspaceChange(event), onObjectsChange: event => this.handleObjectsChange(event), onObjectsAdded: event => this.handleObjectsAdded(event), onObjectsRemoved: event => this.handleObjectsRemoved(event), onObjectsUpdated: event => this.handleObjectsUpdated(event), onUndoStateChange: event => this.handleUndoStateChange(event), onObjectsInViewportChange: event => this.handleObjectsInViewportChange(event), onViewportChange: event => this.handleViewportChange(event), onAwarenessChange: event => this.handleAwarenessChange(event), onNotificationsChange: event => this.handleNotificationsChange(event), onContextMenuStateChange: event => this.handleContextMenuStateChange(event), onSyncingChange: event => (this.isSyncing = event.detail), onLoadingChange: event => (this.isLoadingOverlayVisible = event.detail) }), h("kritzel-controls", { key: '9a708f21ab92ecc6953a35f5db8001b2403f330e', visible: this.isControlsVisible, class: { 'keyboard-open': this.isVirtualKeyboardOpen }, ref: el => {
|
|
3220
3225
|
if (el) {
|
|
3221
3226
|
this.controlsRef = el;
|
|
3222
3227
|
}
|
|
3223
|
-
}, controls: this.normalizedControls, isUtilityPanelVisible: this.isUtilityPanelVisible, undoState: this.undoState ?? undefined, theme: this.theme, terms: this.resolvedTerms, onIsControlsReady: () => (this.isControlsReady = true) }), h("div", { key: '
|
|
3228
|
+
}, controls: this.normalizedControls, isUtilityPanelVisible: this.isUtilityPanelVisible, undoState: this.undoState ?? undefined, theme: this.theme, terms: this.resolvedTerms, onIsControlsReady: () => (this.isControlsReady = true) }), h("div", { key: '6a2b1cd72099db86952ac31aad9655693d0a6a0d', class: "bottom-left-buttons" }, h("kritzel-zoom-panel", { key: 'b3756514bf8de6de8ac7586c626f9759da7f231d', visible: this.isZoomPanelVisible, disabled: !this.isZoomingEnabled, zoomPercent: this.currentZoomPercent, terms: this.resolvedTerms, onZoomIn: () => this.zoomIn(), onZoomOut: () => this.zoomOut() })), h("div", { key: 'd5e118bc4d60b867006bac287c5516baf3aa890e', class: "top-right-buttons" }, h("kritzel-settings", { key: 'e4065d36beb9283cdbbf3ae9800f4f8011c0b4f0', ref: el => {
|
|
3224
3229
|
if (el) {
|
|
3225
3230
|
this.settingsRef = el;
|
|
3226
3231
|
}
|
|
3227
|
-
}, shortcuts: this.shortcuts, availableThemes: this.themes && this.themes.length > 0 ? this.themes.map(t => t.name) : ['light', 'dark'], availableLocales: this.availableLocaleOptions, settings: this.currentSettingsConfig, terms: this.resolvedTerms, onSettingsChange: event => this.handleSettingsChange(event) }), h("kritzel-export", { key: '
|
|
3232
|
+
}, shortcuts: this.shortcuts, availableThemes: this.themes && this.themes.length > 0 ? this.themes.map(t => t.name) : ['light', 'dark'], availableLocales: this.availableLocaleOptions, settings: this.currentSettingsConfig, terms: this.resolvedTerms, onSettingsChange: event => this.handleSettingsChange(event) }), h("kritzel-export", { key: '4e18d9b42c9e7fef9433577b983c508559461da2', ref: el => {
|
|
3228
3233
|
if (el) {
|
|
3229
3234
|
this.exportRef = el;
|
|
3230
3235
|
}
|
|
3231
|
-
}, workspaceName: this.activeWorkspace?.name || 'workspace', terms: this.resolvedTerms, onExportPng: () => this.engineRef.exportViewportAsPng(), onExportSvg: () => this.engineRef.exportViewportAsSvg(), onExportJson: event => this.engineRef.downloadAsJson(event.detail) }), h("kritzel-active-users", { key: '
|
|
3236
|
+
}, workspaceName: this.activeWorkspace?.name || 'workspace', terms: this.resolvedTerms, onExportPng: () => this.engineRef.exportViewportAsPng(), onExportSvg: () => this.engineRef.exportViewportAsSvg(), onExportJson: event => this.engineRef.downloadAsJson(event.detail) }), h("kritzel-active-users", { key: '56e6b29c9c3dcd7b68af4a1ef7d34224d592ce34', users: this.activeUsers }), shouldShowCurrentUser && h("kritzel-current-user", { key: '3b90bcc7e583fcf3c6845d222ad181ccf234a423', user: this.user, terms: this.resolvedTerms, onClick: () => this.currentUserDialogRef?.open() }), shouldShowCurrentUser && (h("kritzel-current-user-dialog", { key: 'f87702c5a708b6afdb2bc3760895e3e3650a4cb5', ref: el => {
|
|
3232
3237
|
if (el) {
|
|
3233
3238
|
this.currentUserDialogRef = el;
|
|
3234
3239
|
}
|
|
3235
|
-
}, user: this.user, terms: this.resolvedTerms, onLogoutRequest: this.handleCurrentUserLogout })), shouldShowLoginButton && h("kritzel-button", { key: '
|
|
3240
|
+
}, user: this.user, terms: this.resolvedTerms, onLogoutRequest: this.handleCurrentUserLogout })), shouldShowLoginButton && h("kritzel-button", { key: '015bc0f4c66352136de66d35d28c20070366933f', onButtonClick: () => this.loginDialogRef?.open() }, this.resolvedTerms['login.dialogTitle'] ?? 'Sign in'), h("kritzel-more-menu", { key: 'b3fdf9fdb2a34508002e82dfdef9e9bdbbe57ecc', items: this.resolvedMoreMenuItems, visible: this.isMoreMenuVisible, terms: this.resolvedTerms }), h("kritzel-share-dialog", { key: 'bac4fbbfa04c261e2b128e766cc43c1062aec2ff', ref: el => {
|
|
3236
3241
|
if (el) {
|
|
3237
3242
|
this.shareDialogRef = el;
|
|
3238
3243
|
}
|
|
3239
|
-
}, isPublic: this.currentIsPublic, workspaceId: this.activeWorkspace?.id, terms: this.resolvedTerms, onToggleIsPublic: this.handleToggleIsPublic }), this.loginConfig && (h("kritzel-login-dialog", { key: '
|
|
3244
|
+
}, isPublic: this.currentIsPublic, workspaceId: this.activeWorkspace?.id, terms: this.resolvedTerms, onToggleIsPublic: this.handleToggleIsPublic }), this.loginConfig && (h("kritzel-login-dialog", { key: 'a7d52bad9e752ad546adf80d257c6a46de031e76', ref: el => {
|
|
3240
3245
|
if (el) {
|
|
3241
3246
|
this.loginDialogRef = el;
|
|
3242
3247
|
}
|
|
@@ -22279,6 +22284,10 @@ class KritzelObjectMap {
|
|
|
22279
22284
|
_awarenessChangeHandler = null;
|
|
22280
22285
|
_awarenessChangeCallbacks = [];
|
|
22281
22286
|
_objectsChangeCallbacks = [];
|
|
22287
|
+
_remoteChangesCallbacks = [];
|
|
22288
|
+
_docUpdateHandler = null;
|
|
22289
|
+
_remoteOrigins = new Set();
|
|
22290
|
+
_appliedRemoteChanges = false;
|
|
22282
22291
|
_lastAwarenessEmitTime = 0;
|
|
22283
22292
|
_awarenessEmitTimeout = null;
|
|
22284
22293
|
AWARENESS_THROTTLE_INTERVAL = 100; // milliseconds
|
|
@@ -22302,12 +22311,44 @@ class KritzelObjectMap {
|
|
|
22302
22311
|
return this._isReady;
|
|
22303
22312
|
}
|
|
22304
22313
|
/**
|
|
22305
|
-
* Promise that settles when network providers finish connecting
|
|
22306
|
-
* Resolves immediately if no network providers.
|
|
22314
|
+
* Promise that settles when network providers finish connecting and complete
|
|
22315
|
+
* their Yjs sync handshake. Resolves immediately if no network providers.
|
|
22307
22316
|
*/
|
|
22308
22317
|
whenNetworkSynced() {
|
|
22309
22318
|
return this._networkSyncPromise ?? Promise.resolve();
|
|
22310
22319
|
}
|
|
22320
|
+
/**
|
|
22321
|
+
* Whether any configured provider synchronizes over the network.
|
|
22322
|
+
*/
|
|
22323
|
+
get hasNetworkSyncProvider() {
|
|
22324
|
+
return this._providers.some(provider => provider.type === 'network');
|
|
22325
|
+
}
|
|
22326
|
+
/**
|
|
22327
|
+
* Whether remote-originated changes can be told apart from local writes.
|
|
22328
|
+
* Requires every network provider to expose its Yjs update origin.
|
|
22329
|
+
*/
|
|
22330
|
+
get supportsRemoteChangeDetection() {
|
|
22331
|
+
const networkProviders = this._providers.filter(provider => provider.type === 'network');
|
|
22332
|
+
return networkProviders.length > 0 && networkProviders.every(provider => provider.updateOrigin !== undefined);
|
|
22333
|
+
}
|
|
22334
|
+
/**
|
|
22335
|
+
* Whether at least one update originating from a network provider has been
|
|
22336
|
+
* applied to this document. Stays `false` when the remote held no data the
|
|
22337
|
+
* local document was missing, because Yjs suppresses empty updates.
|
|
22338
|
+
*/
|
|
22339
|
+
get hasAppliedRemoteChanges() {
|
|
22340
|
+
return this._appliedRemoteChanges;
|
|
22341
|
+
}
|
|
22342
|
+
/**
|
|
22343
|
+
* Registers a callback invoked whenever a network provider applies changes to this document.
|
|
22344
|
+
* @returns A function that unregisters the callback.
|
|
22345
|
+
*/
|
|
22346
|
+
onRemoteChangesApplied(callback) {
|
|
22347
|
+
this._remoteChangesCallbacks.push(callback);
|
|
22348
|
+
return () => {
|
|
22349
|
+
this._remoteChangesCallbacks = this._remoteChangesCallbacks.filter(registered => registered !== callback);
|
|
22350
|
+
};
|
|
22351
|
+
}
|
|
22311
22352
|
/**
|
|
22312
22353
|
* Returns the Yjs Awareness instance, if a network provider is available.
|
|
22313
22354
|
*/
|
|
@@ -22550,6 +22591,22 @@ class KritzelObjectMap {
|
|
|
22550
22591
|
const providerList = this._providers.map(p => `${p.constructor.name} (${p.type})`).join(', ');
|
|
22551
22592
|
console.info(`[Kritzel] Workspace sync providers initialized for ${docName}: ${providerList || 'none'}`);
|
|
22552
22593
|
}
|
|
22594
|
+
// Registered before any provider connects so no remote update can be missed.
|
|
22595
|
+
for (const provider of this._providers) {
|
|
22596
|
+
if (provider.type === 'network' && provider.updateOrigin !== undefined) {
|
|
22597
|
+
this._remoteOrigins.add(provider.updateOrigin);
|
|
22598
|
+
}
|
|
22599
|
+
}
|
|
22600
|
+
this._docUpdateHandler = (_update, origin) => {
|
|
22601
|
+
if (!this._remoteOrigins.has(origin)) {
|
|
22602
|
+
return;
|
|
22603
|
+
}
|
|
22604
|
+
this._appliedRemoteChanges = true;
|
|
22605
|
+
for (const callback of [...this._remoteChangesCallbacks]) {
|
|
22606
|
+
callback();
|
|
22607
|
+
}
|
|
22608
|
+
};
|
|
22609
|
+
this._ydoc.on('update', this._docUpdateHandler);
|
|
22553
22610
|
// captureTimeout is effectively infinite — undo-step boundaries are
|
|
22554
22611
|
// marked explicitly via markUndoBoundary() in insert/remove/reset and
|
|
22555
22612
|
// at stroke/gesture boundaries in the tools. This prevents a single
|
|
@@ -22603,12 +22660,15 @@ class KritzelObjectMap {
|
|
|
22603
22660
|
if (showSyncProviderInfo && networkProviders.length > 0) {
|
|
22604
22661
|
console.info(`[Kritzel] Workspace network providers connecting in background: ${networkProviders.length}`);
|
|
22605
22662
|
}
|
|
22606
|
-
const networkConnectPromises = networkProviders.map(provider => provider
|
|
22663
|
+
const networkConnectPromises = networkProviders.map(provider => provider
|
|
22664
|
+
.connect()
|
|
22665
|
+
.then(() => provider.whenSynced?.())
|
|
22666
|
+
.catch(err => {
|
|
22607
22667
|
if (showSyncProviderInfo) {
|
|
22608
22668
|
console.error(`[Kritzel] Network sync provider "${provider.constructor.name}" failed to connect:`, err);
|
|
22609
22669
|
}
|
|
22610
22670
|
}));
|
|
22611
|
-
//
|
|
22671
|
+
// Settles once remote data has been reconciled, not merely once the transport connected
|
|
22612
22672
|
this._networkSyncPromise = networkConnectPromises.length > 0 ? Promise.allSettled(networkConnectPromises).then(() => undefined) : null;
|
|
22613
22673
|
this._isReady = true;
|
|
22614
22674
|
// Find the first provider that exposes awareness (network providers)
|
|
@@ -23266,6 +23326,13 @@ class KritzelObjectMap {
|
|
|
23266
23326
|
this._objectsMap.unobserve(this._objectsObserver);
|
|
23267
23327
|
this._objectsObserver = null;
|
|
23268
23328
|
}
|
|
23329
|
+
if (this._ydoc && this._docUpdateHandler) {
|
|
23330
|
+
this._ydoc.off('update', this._docUpdateHandler);
|
|
23331
|
+
}
|
|
23332
|
+
this._docUpdateHandler = null;
|
|
23333
|
+
this._remoteOrigins.clear();
|
|
23334
|
+
this._remoteChangesCallbacks = [];
|
|
23335
|
+
this._appliedRemoteChanges = false;
|
|
23269
23336
|
// Remove undo manager event listeners
|
|
23270
23337
|
if (this._undoManager) {
|
|
23271
23338
|
if (this._stackItemAddedHandler) {
|
|
@@ -23662,6 +23729,7 @@ class KritzelAppStateMap {
|
|
|
23662
23729
|
_isReady = false;
|
|
23663
23730
|
_onRemoteChangeCallback = null;
|
|
23664
23731
|
_workspacesObserver = null;
|
|
23732
|
+
_networkSyncPromise = null;
|
|
23665
23733
|
/**
|
|
23666
23734
|
* Indicates whether the app state map has been initialized and is ready for use.
|
|
23667
23735
|
* @returns True if initialized and all providers are connected, false otherwise.
|
|
@@ -23669,6 +23737,13 @@ class KritzelAppStateMap {
|
|
|
23669
23737
|
get isReady() {
|
|
23670
23738
|
return this._isReady;
|
|
23671
23739
|
}
|
|
23740
|
+
/**
|
|
23741
|
+
* Settles when network providers finish their initial sync (or fail/time out).
|
|
23742
|
+
* Resolves immediately when no network providers are configured.
|
|
23743
|
+
*/
|
|
23744
|
+
whenNetworkSynced() {
|
|
23745
|
+
return this._networkSyncPromise ?? Promise.resolve();
|
|
23746
|
+
}
|
|
23672
23747
|
/**
|
|
23673
23748
|
* Indicates whether any configured sync provider replicates over the network.
|
|
23674
23749
|
* Used by the engine to warn when a matching remote asset storage
|
|
@@ -23753,12 +23828,16 @@ class KritzelAppStateMap {
|
|
|
23753
23828
|
if (showSyncProviderInfo && networkProviders.length > 0) {
|
|
23754
23829
|
console.info(`[Kritzel] App-state network providers connecting in background: ${networkProviders.length}`);
|
|
23755
23830
|
}
|
|
23756
|
-
|
|
23757
|
-
|
|
23758
|
-
|
|
23759
|
-
|
|
23760
|
-
|
|
23761
|
-
|
|
23831
|
+
const networkConnectPromises = networkProviders.map(provider => provider
|
|
23832
|
+
.connect()
|
|
23833
|
+
.then(() => provider.whenSynced?.())
|
|
23834
|
+
.catch(err => {
|
|
23835
|
+
if (showSyncProviderInfo) {
|
|
23836
|
+
console.error(`[Kritzel] Network sync provider "${provider.constructor.name}" failed to connect:`, err);
|
|
23837
|
+
}
|
|
23838
|
+
}));
|
|
23839
|
+
if (networkConnectPromises.length > 0) {
|
|
23840
|
+
this._networkSyncPromise = Promise.allSettled(networkConnectPromises).then(() => undefined);
|
|
23762
23841
|
}
|
|
23763
23842
|
this._isReady = true;
|
|
23764
23843
|
// Run any pending schema migrations before loading data
|
|
@@ -24083,6 +24162,7 @@ class KritzelAppStateMap {
|
|
|
24083
24162
|
// Clear remaining references
|
|
24084
24163
|
this._core = null;
|
|
24085
24164
|
this._onRemoteChangeCallback = null;
|
|
24165
|
+
this._networkSyncPromise = null;
|
|
24086
24166
|
this._isReady = false;
|
|
24087
24167
|
}
|
|
24088
24168
|
}
|
|
@@ -27035,8 +27115,8 @@ class KritzelSvgExportHelper {
|
|
|
27035
27115
|
.join('\n ');
|
|
27036
27116
|
const xmlDecl = includeXmlDeclaration ? '<?xml version="1.0" encoding="UTF-8"?>\n' : '';
|
|
27037
27117
|
const defsContent = defs.length > 0 ? `\n <defs>\n ${defs.join('\n ')}\n </defs>` : '';
|
|
27038
|
-
return `${xmlDecl}<svg xmlns="http://www.w3.org/2000/svg" viewBox="${viewBoxX} ${viewBoxY} ${viewBoxWidth} ${viewBoxHeight}" width="${viewBoxWidth}" height="${viewBoxHeight}">${defsContent}
|
|
27039
|
-
${elements}
|
|
27118
|
+
return `${xmlDecl}<svg xmlns="http://www.w3.org/2000/svg" viewBox="${viewBoxX} ${viewBoxY} ${viewBoxWidth} ${viewBoxHeight}" width="${viewBoxWidth}" height="${viewBoxHeight}">${defsContent}
|
|
27119
|
+
${elements}
|
|
27040
27120
|
</svg>`;
|
|
27041
27121
|
}
|
|
27042
27122
|
/**
|
|
@@ -27188,8 +27268,8 @@ class KritzelSvgExportHelper {
|
|
|
27188
27268
|
const orient = end === 'start' ? 'auto-start-reverse' : 'auto';
|
|
27189
27269
|
const refX = 0;
|
|
27190
27270
|
const refY = size / 2;
|
|
27191
|
-
return `<marker id="${markerId}" markerWidth="${size}" markerHeight="${size}" refX="${refX}" refY="${refY}" orient="${orient}" markerUnits="userSpaceOnUse">
|
|
27192
|
-
<path d="${path}" fill="${fill}" transform="scale(${size / 10})"/>
|
|
27271
|
+
return `<marker id="${markerId}" markerWidth="${size}" markerHeight="${size}" refX="${refX}" refY="${refY}" orient="${orient}" markerUnits="userSpaceOnUse">
|
|
27272
|
+
<path d="${path}" fill="${fill}" transform="scale(${size / 10})"/>
|
|
27193
27273
|
</marker>`;
|
|
27194
27274
|
}
|
|
27195
27275
|
/**
|
|
@@ -27236,10 +27316,10 @@ class KritzelSvgExportHelper {
|
|
|
27236
27316
|
const opacity = path.opacity !== 1 ? ` opacity="${path.opacity}"` : '';
|
|
27237
27317
|
const scale = this.getObjectScale(path);
|
|
27238
27318
|
// Path needs to be wrapped in a g with translation since path.d uses local coordinates
|
|
27239
|
-
return `<g transform="${transform}"${opacity}>
|
|
27240
|
-
<svg viewBox="${path.viewBox}" width="${path.totalWidth / scale}" height="${path.totalHeight / scale}" overflow="visible">
|
|
27241
|
-
<path d="${path.d}" fill="${fill || 'none'}" stroke="${stroke || 'none'}"${path.strokeWidth ? ` stroke-width="${path.strokeWidth}"` : ''}/>
|
|
27242
|
-
</svg>
|
|
27319
|
+
return `<g transform="${transform}"${opacity}>
|
|
27320
|
+
<svg viewBox="${path.viewBox}" width="${path.totalWidth / scale}" height="${path.totalHeight / scale}" overflow="visible">
|
|
27321
|
+
<path d="${path.d}" fill="${fill || 'none'}" stroke="${stroke || 'none'}"${path.strokeWidth ? ` stroke-width="${path.strokeWidth}"` : ''}/>
|
|
27322
|
+
</svg>
|
|
27243
27323
|
</g>`;
|
|
27244
27324
|
}
|
|
27245
27325
|
/**
|
|
@@ -27255,10 +27335,10 @@ class KritzelSvgExportHelper {
|
|
|
27255
27335
|
const scale = this.getObjectScale(line);
|
|
27256
27336
|
const markerStart = line.hasStartArrow ? ` marker-start="url(#${line.startMarkerId})"` : '';
|
|
27257
27337
|
const markerEnd = line.hasEndArrow ? ` marker-end="url(#${line.endMarkerId})"` : '';
|
|
27258
|
-
return `<g transform="${transform}"${opacity}>
|
|
27259
|
-
<svg viewBox="${line.viewBox}" width="${line.totalWidth / scale}" height="${line.totalHeight / scale}" overflow="visible">
|
|
27260
|
-
<path d="${line.d}" fill="none" stroke="${stroke}" stroke-width="${line.strokeWidth}" stroke-linecap="round"${markerStart}${markerEnd}/>
|
|
27261
|
-
</svg>
|
|
27338
|
+
return `<g transform="${transform}"${opacity}>
|
|
27339
|
+
<svg viewBox="${line.viewBox}" width="${line.totalWidth / scale}" height="${line.totalHeight / scale}" overflow="visible">
|
|
27340
|
+
<path d="${line.d}" fill="none" stroke="${stroke}" stroke-width="${line.strokeWidth}" stroke-linecap="round"${markerStart}${markerEnd}/>
|
|
27341
|
+
</svg>
|
|
27262
27342
|
</g>`;
|
|
27263
27343
|
}
|
|
27264
27344
|
/**
|
|
@@ -27282,18 +27362,18 @@ class KritzelSvgExportHelper {
|
|
|
27282
27362
|
const textHtml = this.prosemirrorToHtml(shape.content, shape, theme);
|
|
27283
27363
|
if (textHtml) {
|
|
27284
27364
|
const fontColor = KritzelColorHelper.resolveThemeColor(shape.fontColor, theme);
|
|
27285
|
-
textContent = `
|
|
27286
|
-
<foreignObject x="${shape.x}" y="${shape.y}" width="${shape.width}" height="${shape.height}">
|
|
27287
|
-
<div xmlns="http://www.w3.org/1999/xhtml" style="width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; text-align: center; font-family: ${shape.fontFamily}; font-size: ${shape.fontSize}px; color: ${fontColor}; overflow: hidden;">
|
|
27288
|
-
${textHtml}
|
|
27289
|
-
</div>
|
|
27365
|
+
textContent = `
|
|
27366
|
+
<foreignObject x="${shape.x}" y="${shape.y}" width="${shape.width}" height="${shape.height}">
|
|
27367
|
+
<div xmlns="http://www.w3.org/1999/xhtml" style="width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; text-align: center; font-family: ${shape.fontFamily}; font-size: ${shape.fontSize}px; color: ${fontColor}; overflow: hidden;">
|
|
27368
|
+
${textHtml}
|
|
27369
|
+
</div>
|
|
27290
27370
|
</foreignObject>`;
|
|
27291
27371
|
}
|
|
27292
27372
|
}
|
|
27293
|
-
return `<g transform="${transform}"${opacity}>
|
|
27294
|
-
<svg viewBox="${shape.viewBox}" width="${shape.totalWidth / scale}" height="${shape.totalHeight / scale}" overflow="visible" preserveAspectRatio="none">
|
|
27295
|
-
<path d="${pathD}" fill="${fill || 'transparent'}" stroke="${stroke}" stroke-width="${shape.strokeWidth}"/>${textContent}
|
|
27296
|
-
</svg>
|
|
27373
|
+
return `<g transform="${transform}"${opacity}>
|
|
27374
|
+
<svg viewBox="${shape.viewBox}" width="${shape.totalWidth / scale}" height="${shape.totalHeight / scale}" overflow="visible" preserveAspectRatio="none">
|
|
27375
|
+
<path d="${pathD}" fill="${fill || 'transparent'}" stroke="${stroke}" stroke-width="${shape.strokeWidth}"/>${textContent}
|
|
27376
|
+
</svg>
|
|
27297
27377
|
</g>`;
|
|
27298
27378
|
}
|
|
27299
27379
|
/**
|
|
@@ -27324,10 +27404,10 @@ class KritzelSvgExportHelper {
|
|
|
27324
27404
|
// adjusted font-size already accounts for it – keeping both would double-scale
|
|
27325
27405
|
// the content and overflow the foreignObject.
|
|
27326
27406
|
const svgFontSizePx = (text.fontSize * (4 / 3) * (text.scaleFactor || 1) / scale).toFixed(4);
|
|
27327
|
-
return `<g transform="${transform}"${opacity}>
|
|
27328
|
-
<foreignObject x="0" y="0" width="${width}" height="${height}" overflow="visible">
|
|
27329
|
-
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: ${text.fontFamily}; font-size: ${svgFontSizePx}px; color: ${fontColor}; background-color: ${bgColor || 'transparent'}; white-space: pre-wrap; word-wrap: break-word; width: 100%; margin: 0; padding: 0; box-sizing: border-box;">${htmlContent.trim()}</div>
|
|
27330
|
-
</foreignObject>
|
|
27407
|
+
return `<g transform="${transform}"${opacity}>
|
|
27408
|
+
<foreignObject x="0" y="0" width="${width}" height="${height}" overflow="visible">
|
|
27409
|
+
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: ${text.fontFamily}; font-size: ${svgFontSizePx}px; color: ${fontColor}; background-color: ${bgColor || 'transparent'}; white-space: pre-wrap; word-wrap: break-word; width: 100%; margin: 0; padding: 0; box-sizing: border-box;">${htmlContent.trim()}</div>
|
|
27410
|
+
</foreignObject>
|
|
27331
27411
|
</g>`;
|
|
27332
27412
|
}
|
|
27333
27413
|
/**
|
|
@@ -27361,9 +27441,9 @@ class KritzelSvgExportHelper {
|
|
|
27361
27441
|
return `<tspan x="0" y="${y}" xml:space="preserve">${this.escapeHtml(line)}</tspan>`;
|
|
27362
27442
|
})
|
|
27363
27443
|
.join('');
|
|
27364
|
-
return `<g transform="${transform}"${opacity}>
|
|
27365
|
-
${bgRect}
|
|
27366
|
-
<text font-family="${this.escapeHtml(text.fontFamily)}" font-size="${resolvedFontSizePx}" fill="${fontColor}">${tspans}</text>
|
|
27444
|
+
return `<g transform="${transform}"${opacity}>
|
|
27445
|
+
${bgRect}
|
|
27446
|
+
<text font-family="${this.escapeHtml(text.fontFamily)}" font-size="${resolvedFontSizePx}" fill="${fontColor}">${tspans}</text>
|
|
27367
27447
|
</g>`;
|
|
27368
27448
|
}
|
|
27369
27449
|
/**
|
|
@@ -27391,8 +27471,8 @@ class KritzelSvgExportHelper {
|
|
|
27391
27471
|
const width = image.totalWidth / scale;
|
|
27392
27472
|
const height = image.totalHeight / scale;
|
|
27393
27473
|
const href = imageDataUrls?.get(image.id) || image.resolvedSrc || image.src || '';
|
|
27394
|
-
return `<g transform="${transform}"${opacity}>
|
|
27395
|
-
<image href="${href}" x="0" y="0" width="${width}" height="${height}" preserveAspectRatio="xMidYMid meet"/>
|
|
27474
|
+
return `<g transform="${transform}"${opacity}>
|
|
27475
|
+
<image href="${href}" x="0" y="0" width="${width}" height="${height}" preserveAspectRatio="xMidYMid meet"/>
|
|
27396
27476
|
</g>`;
|
|
27397
27477
|
}
|
|
27398
27478
|
/**
|
|
@@ -27412,19 +27492,19 @@ class KritzelSvgExportHelper {
|
|
|
27412
27492
|
if (rasterSafeForCanvas) {
|
|
27413
27493
|
// PNG export: render placeholder rect (foreignObject doesn't rasterize to PNG well)
|
|
27414
27494
|
console.warn('[KritzelCustomElement SVG Export] Custom elements do not serialize well to PNG. Use SVG export or screenshot instead.');
|
|
27415
|
-
return `<g transform="${transform}"${opacity}>
|
|
27416
|
-
<rect x="0" y="0" width="${width}" height="${height}" fill="#f0f0f0" stroke="#999" stroke-width="1" />
|
|
27417
|
-
<text x="${width / 2}" y="${height / 2}" text-anchor="middle" dominant-baseline="middle" font-size="12" fill="#999">[Custom Element]</text>
|
|
27495
|
+
return `<g transform="${transform}"${opacity}>
|
|
27496
|
+
<rect x="0" y="0" width="${width}" height="${height}" fill="#f0f0f0" stroke="#999" stroke-width="1" />
|
|
27497
|
+
<text x="${width / 2}" y="${height / 2}" text-anchor="middle" dominant-baseline="middle" font-size="12" fill="#999">[Custom Element]</text>
|
|
27418
27498
|
</g>`;
|
|
27419
27499
|
}
|
|
27420
27500
|
// SVG export: use foreignObject to embed HTML
|
|
27421
27501
|
const html = obj.element?.outerHTML || '<div style="border:1px dashed #ccc">Empty</div>';
|
|
27422
|
-
return `<g transform="${transform}"${opacity}>
|
|
27423
|
-
<foreignObject x="0" y="0" width="${width}" height="${height}">
|
|
27424
|
-
<div xmlns="http://www.w3.org/1999/xhtml" style="width:100%;height:100%;overflow:hidden;">
|
|
27425
|
-
${html}
|
|
27426
|
-
</div>
|
|
27427
|
-
</foreignObject>
|
|
27502
|
+
return `<g transform="${transform}"${opacity}>
|
|
27503
|
+
<foreignObject x="0" y="0" width="${width}" height="${height}">
|
|
27504
|
+
<div xmlns="http://www.w3.org/1999/xhtml" style="width:100%;height:100%;overflow:hidden;">
|
|
27505
|
+
${html}
|
|
27506
|
+
</div>
|
|
27507
|
+
</foreignObject>
|
|
27428
27508
|
</g>`;
|
|
27429
27509
|
}
|
|
27430
27510
|
/**
|
|
@@ -27444,8 +27524,8 @@ class KritzelSvgExportHelper {
|
|
|
27444
27524
|
return '';
|
|
27445
27525
|
}
|
|
27446
27526
|
const opacity = group.opacity !== 1 ? ` opacity="${group.opacity}"` : '';
|
|
27447
|
-
return `<g${opacity}>
|
|
27448
|
-
${children}
|
|
27527
|
+
return `<g${opacity}>
|
|
27528
|
+
${children}
|
|
27449
27529
|
</g>`;
|
|
27450
27530
|
}
|
|
27451
27531
|
/**
|
|
@@ -27855,7 +27935,7 @@ const KritzelEngine = class {
|
|
|
27855
27935
|
contextMenuStateChange;
|
|
27856
27936
|
/** Emitted when the combined loading state (external `isLoading` prop or internal workspace loading) changes. */
|
|
27857
27937
|
loadingChange;
|
|
27858
|
-
/** Emitted
|
|
27938
|
+
/** Emitted while remote changes are being applied to the active workspace. Stays silent when the remote holds nothing new. */
|
|
27859
27939
|
syncingChange;
|
|
27860
27940
|
forceUpdate = 0;
|
|
27861
27941
|
isSyncing = false;
|
|
@@ -29442,6 +29522,7 @@ const KritzelEngine = class {
|
|
|
29442
29522
|
_sceneBootstrapOpacity = 1;
|
|
29443
29523
|
_sceneBootstrapTransitionEnabled = false;
|
|
29444
29524
|
_sceneBootstrapTransitionTimer = null;
|
|
29525
|
+
_remoteChangesUnsubscribe = null;
|
|
29445
29526
|
_defaultUndoState = {
|
|
29446
29527
|
canUndo: false,
|
|
29447
29528
|
canRedo: false,
|
|
@@ -29459,9 +29540,16 @@ const KritzelEngine = class {
|
|
|
29459
29540
|
this.loadingChange.emit(this.core.store.state.isLoading);
|
|
29460
29541
|
}
|
|
29461
29542
|
syncSyncingState(isSyncing) {
|
|
29543
|
+
if (this.isSyncing === isSyncing) {
|
|
29544
|
+
return;
|
|
29545
|
+
}
|
|
29462
29546
|
this.isSyncing = isSyncing;
|
|
29463
29547
|
this.syncingChange.emit(isSyncing);
|
|
29464
29548
|
}
|
|
29549
|
+
clearRemoteChangesSubscription() {
|
|
29550
|
+
this._remoteChangesUnsubscribe?.();
|
|
29551
|
+
this._remoteChangesUnsubscribe = null;
|
|
29552
|
+
}
|
|
29465
29553
|
isNetworkAvailable() {
|
|
29466
29554
|
return typeof navigator !== 'undefined' && navigator.onLine;
|
|
29467
29555
|
}
|
|
@@ -29573,6 +29661,7 @@ const KritzelEngine = class {
|
|
|
29573
29661
|
disconnectedCallback() {
|
|
29574
29662
|
this.throttledPointerMoveMulti.cancel();
|
|
29575
29663
|
this._revealedImageKeys.clear();
|
|
29664
|
+
this.clearRemoteChangesSubscription();
|
|
29576
29665
|
if (this._sceneBootstrapTransitionTimer !== null) {
|
|
29577
29666
|
clearTimeout(this._sceneBootstrapTransitionTimer);
|
|
29578
29667
|
this._sceneBootstrapTransitionTimer = null;
|
|
@@ -29719,6 +29808,7 @@ const KritzelEngine = class {
|
|
|
29719
29808
|
if (!this._isAssetStorageInitialized && this.assetStorageConfig) {
|
|
29720
29809
|
await this.initializeAssetStorage();
|
|
29721
29810
|
}
|
|
29811
|
+
await this.waitForRemoteAppStateIfEmpty();
|
|
29722
29812
|
if (this.activeWorkspaceId) {
|
|
29723
29813
|
const startupWorkspace = this.core.getWorkspaces().find(ws => ws.id === this.activeWorkspaceId);
|
|
29724
29814
|
if (startupWorkspace) {
|
|
@@ -29751,6 +29841,27 @@ const KritzelEngine = class {
|
|
|
29751
29841
|
}
|
|
29752
29842
|
this.tryResolveActiveWorkspaceFromId();
|
|
29753
29843
|
}
|
|
29844
|
+
/**
|
|
29845
|
+
* On a cold start the remote workspace list may still be in flight; creating a
|
|
29846
|
+
* fallback workspace before it arrives would pollute the synced app state.
|
|
29847
|
+
*/
|
|
29848
|
+
async waitForRemoteAppStateIfEmpty() {
|
|
29849
|
+
if (this.core.getWorkspaces().length > 0) {
|
|
29850
|
+
return;
|
|
29851
|
+
}
|
|
29852
|
+
if (!this.core.appStateMap.hasNetworkSyncProvider || !this.isNetworkAvailable()) {
|
|
29853
|
+
return;
|
|
29854
|
+
}
|
|
29855
|
+
this._isWorkspaceLoading = true;
|
|
29856
|
+
this.syncLoadingState();
|
|
29857
|
+
try {
|
|
29858
|
+
await this.core.appStateMap.whenNetworkSynced();
|
|
29859
|
+
}
|
|
29860
|
+
finally {
|
|
29861
|
+
this._isWorkspaceLoading = false;
|
|
29862
|
+
this.syncLoadingState();
|
|
29863
|
+
}
|
|
29864
|
+
}
|
|
29754
29865
|
resolveStartupWorkspace() {
|
|
29755
29866
|
if (this.activeWorkspaceId) {
|
|
29756
29867
|
const workspaceById = this.core.getWorkspaces().find(ws => ws.id === this.activeWorkspaceId);
|
|
@@ -29805,21 +29916,7 @@ const KritzelEngine = class {
|
|
|
29805
29916
|
this._workspaceInitializationTargetKey = targetKey;
|
|
29806
29917
|
try {
|
|
29807
29918
|
await initializationPromise;
|
|
29808
|
-
|
|
29809
|
-
const initializedObjects = this.core.store.objects;
|
|
29810
|
-
const networkSyncPromise = initializedObjects?.whenNetworkSynced();
|
|
29811
|
-
if (networkSyncPromise && this.isNetworkAvailable()) {
|
|
29812
|
-
this.syncSyncingState(true);
|
|
29813
|
-
void networkSyncPromise.finally(() => {
|
|
29814
|
-
// Only clear syncing for the currently active object map.
|
|
29815
|
-
if (this.core.store.objects === initializedObjects) {
|
|
29816
|
-
this.syncSyncingState(false);
|
|
29817
|
-
}
|
|
29818
|
-
});
|
|
29819
|
-
}
|
|
29820
|
-
else {
|
|
29821
|
-
this.syncSyncingState(false);
|
|
29822
|
-
}
|
|
29919
|
+
this.trackRemoteSynchronization();
|
|
29823
29920
|
}
|
|
29824
29921
|
finally {
|
|
29825
29922
|
// Only the most recent init clears loading state to prevent race conditions
|
|
@@ -29831,6 +29928,38 @@ const KritzelEngine = class {
|
|
|
29831
29928
|
}
|
|
29832
29929
|
}
|
|
29833
29930
|
}
|
|
29931
|
+
/**
|
|
29932
|
+
* Reports syncing only while remote data is actually being reconciled into the
|
|
29933
|
+
* active workspace. Yjs suppresses updates that carry nothing new, so a workspace
|
|
29934
|
+
* that already matches the remote never reports syncing at all.
|
|
29935
|
+
*/
|
|
29936
|
+
trackRemoteSynchronization() {
|
|
29937
|
+
this.clearRemoteChangesSubscription();
|
|
29938
|
+
this.syncSyncingState(false);
|
|
29939
|
+
const initializedObjects = this.core.store.objects;
|
|
29940
|
+
if (!initializedObjects?.hasNetworkSyncProvider || !this.isNetworkAvailable()) {
|
|
29941
|
+
return;
|
|
29942
|
+
}
|
|
29943
|
+
if (initializedObjects.supportsRemoteChangeDetection) {
|
|
29944
|
+
this._remoteChangesUnsubscribe = initializedObjects.onRemoteChangesApplied(() => {
|
|
29945
|
+
if (this.core.store.objects !== initializedObjects) {
|
|
29946
|
+
return;
|
|
29947
|
+
}
|
|
29948
|
+
this.syncSyncingState(true);
|
|
29949
|
+
});
|
|
29950
|
+
}
|
|
29951
|
+
else {
|
|
29952
|
+
// Custom providers without an update origin cannot be diffed, so fall back to reporting the whole handshake.
|
|
29953
|
+
this.syncSyncingState(true);
|
|
29954
|
+
}
|
|
29955
|
+
void initializedObjects.whenNetworkSynced().finally(() => {
|
|
29956
|
+
if (this.core.store.objects !== initializedObjects) {
|
|
29957
|
+
return;
|
|
29958
|
+
}
|
|
29959
|
+
this.clearRemoteChangesSubscription();
|
|
29960
|
+
this.syncSyncingState(false);
|
|
29961
|
+
});
|
|
29962
|
+
}
|
|
29834
29963
|
emitObjectsChange() {
|
|
29835
29964
|
const objectsMap = this.core.store.objects;
|
|
29836
29965
|
if (!objectsMap) {
|
|
@@ -30622,7 +30751,7 @@ const KritzelExport = class {
|
|
|
30622
30751
|
return (h("div", { class: "export-tab-content" }, h("kritzel-input", { label: this.terms['export.filename.label'] ?? 'Filename', value: this.exportFilename, placeholder: this.terms['export.filename.placeholder'] ?? 'Enter filename', suffix: ".json", onValueChange: this.handleFilenameChange })));
|
|
30623
30752
|
}
|
|
30624
30753
|
render() {
|
|
30625
|
-
return (h(Host, { key: '
|
|
30754
|
+
return (h(Host, { key: '64a9957ef87799215f9274213ead958a895dd8ef' }, h("kritzel-dialog", { key: '59ad70cc7d2834f5ecac3a659189390015cd26cb', isOpen: this.isDialogOpen, dialogTitle: this.terms['export.dialogTitle'] ?? 'Export', closable: true, contained: true, onDialogClose: this.closeDialog }, h("div", { key: 'fc9247f5b3848def87e6f6a6044d3fb1e63594ac', class: "export-content" }, h("kritzel-pill-tabs", { key: '54da74bbbd206b5e596865081cc5fe65bf8a776f', tabs: this.tabs, value: this.activeTab, onValueChange: this.handleTabChange }), this.activeTab === 'viewport' && this.renderViewportExport(), this.activeTab === 'workspace' && this.renderWorkspaceExport()), h("div", { key: 'b8e748034496936bf000a8eb111f52d58bf28d20', slot: "footer" }, h("button", { key: 'b7a59f3882146b45a0eb8395ea1c45cb41af0f34', class: "export-primary-button", onClick: this.handleExport }, this.terms['export.exportButton'] ?? 'Export')))));
|
|
30626
30755
|
}
|
|
30627
30756
|
};
|
|
30628
30757
|
KritzelExport.style = kritzelExportCss();
|
|
@@ -30637,7 +30766,7 @@ const KritzelFont = class {
|
|
|
30637
30766
|
size = 24;
|
|
30638
30767
|
color = '#000000';
|
|
30639
30768
|
render() {
|
|
30640
|
-
return (h(Host, { key: '
|
|
30769
|
+
return (h(Host, { key: '42f058426e2afcc49c788f2385e23a5ff153e77c' }, h("div", { key: '962dfc48ba84c5f5d2b98eb2464c69c04764ab0f', class: "font-preview", style: {
|
|
30641
30770
|
fontFamily: this.fontFamily,
|
|
30642
30771
|
fontSize: `${this.size}px`,
|
|
30643
30772
|
color: this.color
|
|
@@ -30687,7 +30816,7 @@ const KritzelFontFamily = class {
|
|
|
30687
30816
|
label: option.label,
|
|
30688
30817
|
style: { fontFamily: option.cssFontFamily ?? option.value },
|
|
30689
30818
|
}));
|
|
30690
|
-
return (h(Host, { key: '
|
|
30819
|
+
return (h(Host, { key: '059350f34370f7a291f47a42721ca5d9bb82df49' }, h("kritzel-dropdown", { key: 'fbd8cf1ae463c7e9b76d0ac754a41de54397058e', options: dropdownOptions, value: this.selectedFontFamily, onValueChanged: this.handleDropdownValueChange, selectStyles: { fontFamily: selectedFontFamily } })));
|
|
30691
30820
|
}
|
|
30692
30821
|
static get watchers() { return {
|
|
30693
30822
|
"fontOptions": [{
|
|
@@ -30721,7 +30850,7 @@ const KritzelFontSize = class {
|
|
|
30721
30850
|
render() {
|
|
30722
30851
|
const color = 'var(--kritzel-global-text-primary)';
|
|
30723
30852
|
const sizes = this.sizes ?? [];
|
|
30724
|
-
return (h(Host, { key: '
|
|
30853
|
+
return (h(Host, { key: '9d6592f049c25e9dfa2f6f3a270feb2440aa7f35' }, sizes.map(size => (h("div", { tabIndex: 0, class: {
|
|
30725
30854
|
'size-container': true,
|
|
30726
30855
|
'selected': this.selectedSize === size,
|
|
30727
30856
|
}, onClick: () => this.handleSizeClick(size), onKeyDown: event => this.handleKeyDown(event, size) }, h("kritzel-font", { fontFamily: this.fontFamily, size: size, color: color }))))));
|
|
@@ -30788,7 +30917,7 @@ const KritzelInput = class {
|
|
|
30788
30917
|
this.valueChange.emit(input.value);
|
|
30789
30918
|
};
|
|
30790
30919
|
render() {
|
|
30791
|
-
return (h(Host, { key: '
|
|
30920
|
+
return (h(Host, { key: 'a4d86101322da32c87a62ac8bb05edb7015ede2a' }, h("div", { key: 'abc5b007af0f6f9353e0b680636c92813ee1ef49', class: "input-container" }, this.label && h("label", { key: 'f79e02a925aa6bd1b6cd48fc4225e441695ff893', class: "input-label" }, this.label), h("div", { key: 'e2937d2ad1def996e1937a9dd711578a3f9b6494', class: { 'input-wrapper': true, 'has-suffix': !!this.suffix } }, h("input", { key: '8bc45cc6f2603bec30f2299286d03beacd8c07fb', type: this.type, class: "text-input", value: this.inputValue, placeholder: this.placeholder, disabled: this.disabled, onInput: this.handleInput }), this.suffix && h("span", { key: '917fb6fa6c5fe62ab0f1e5c83f09aedd22623353', class: "input-suffix" }, this.suffix)))));
|
|
30792
30921
|
}
|
|
30793
30922
|
static get watchers() { return {
|
|
30794
30923
|
"value": [{
|
|
@@ -30870,10 +30999,10 @@ const KritzelLineEndings = class {
|
|
|
30870
30999
|
render() {
|
|
30871
31000
|
const startEnding = this.getStartEnding();
|
|
30872
31001
|
const endEnding = this.getEndEnding();
|
|
30873
|
-
return (h(Host, { key: '
|
|
31002
|
+
return (h(Host, { key: '60115b8a2840ffe21e0846fdc2678c6ba24b22c0' }, h("div", { key: '3b63aa05ca78699172c645fdd404efdc55bc4536', class: "endings-section" }, h("div", { key: '9538369e8d2bb26600d6054ddbbc13d6c960bd56', class: "endings-row" }, this.styles.map(type => (h("button", { class: {
|
|
30874
31003
|
'ending-option': true,
|
|
30875
31004
|
'selected': startEnding === type,
|
|
30876
|
-
}, onClick: () => this.handleStartChange(type), title: type === 'none' ? 'No start arrow' : `${type} start arrow` }, this.renderEndingIcon(type, true)))))), h("div", { key: '
|
|
31005
|
+
}, onClick: () => this.handleStartChange(type), title: type === 'none' ? 'No start arrow' : `${type} start arrow` }, this.renderEndingIcon(type, true)))))), h("div", { key: 'ecec29740c09a61190938bab4955ccde6b84cfa2', class: "endings-section" }, h("div", { key: 'ea054597c3e3566e7921f2c04c07d74e4f4331a1', class: "endings-row" }, this.styles.map(type => (h("button", { class: {
|
|
30877
31006
|
'ending-option': true,
|
|
30878
31007
|
'selected': endEnding === type,
|
|
30879
31008
|
}, onClick: () => this.handleEndChange(type), title: type === 'none' ? 'No end arrow' : `${type} end arrow` }, this.renderEndingIcon(type, false))))))));
|
|
@@ -30896,7 +31025,7 @@ const KritzelLoadingOverlay = class {
|
|
|
30896
31025
|
*/
|
|
30897
31026
|
text = 'Loading...';
|
|
30898
31027
|
render() {
|
|
30899
|
-
return (h(Host, { key: '
|
|
31028
|
+
return (h(Host, { key: '6fc1886217516966fa3599473989748151d93efd' }, h("div", { key: 'c6f2aa1c7f81bbab65411292934d185b4bf69e5a', class: { 'loading-overlay': true, visible: this.visible }, "aria-hidden": this.visible ? 'false' : 'true' }, h("span", { key: '21bae0b6f9b9a08f814aec7e6635a904018ab839', class: "loading-spinner" }), this.text)));
|
|
30900
31029
|
}
|
|
30901
31030
|
};
|
|
30902
31031
|
KritzelLoadingOverlay.style = kritzelLoadingOverlayCss();
|
|
@@ -30948,7 +31077,7 @@ const KritzelLoginDialog = class {
|
|
|
30948
31077
|
this.dialogClosed.emit();
|
|
30949
31078
|
};
|
|
30950
31079
|
render() {
|
|
30951
|
-
return (h(Host, { key: '
|
|
31080
|
+
return (h(Host, { key: '97532a2eeb125a2692117228ec3c77907c90d021' }, h("kritzel-dialog", { key: '60597c3d75f532a3c73aab983bed683bea243eac', dialogTitle: this.dialogTitle, isOpen: this.isDialogOpen, onDialogClose: this.closeDialog, size: "small", contained: true }, h("div", { key: 'cb086e90c5981f8c3d5fc65e7b94675884a255dc', class: "login-content" }, this.subtitle && (h("p", { key: '0ac0e31a5bf8d8a3e24b7df1d388f1cdc6951bd7', class: "login-subtitle" }, this.subtitle)), h("div", { key: '6057615670a1758581d0c518bb2809b88af0672e', class: "login-providers" }, this.providers.map(provider => (h("button", { key: provider.name, class: {
|
|
30952
31081
|
'provider-button': true,
|
|
30953
31082
|
'is-loading': this.loadingProvider === provider.name,
|
|
30954
31083
|
'is-disabled': this.loadingProvider !== null && this.loadingProvider !== provider.name,
|
|
@@ -31054,15 +31183,15 @@ const KritzelMasterDetail = class {
|
|
|
31054
31183
|
const selectedItem = this.items.find(item => item.id === this.selectedItemId);
|
|
31055
31184
|
const panelId = 'master-detail-panel';
|
|
31056
31185
|
const selectedTabId = selectedItem ? `tab-${selectedItem.id}` : undefined;
|
|
31057
|
-
return (h(Host, { key: '
|
|
31186
|
+
return (h(Host, { key: '0166376f16ebb098049cd2ef5539a86086a5570e' }, h("div", { key: 'f5091fe672bc4751c8f66d43baa5c1fc86fca034', class: {
|
|
31058
31187
|
'master-detail-container': true,
|
|
31059
31188
|
'is-mobile-detail-visible': this.showMobileDetail,
|
|
31060
|
-
} }, h("nav", { key: '
|
|
31189
|
+
} }, h("nav", { key: '66f5c61ea0308ea9ae1339526e86dcf1ee51fc0a', class: "master-menu", role: "tablist", "aria-orientation": "vertical", "aria-label": "Settings categories" }, this.items.map((item, index) => (h("button", { key: item.id, id: `tab-${item.id}`, ref: el => this.setTabRef(el, index), class: {
|
|
31061
31190
|
'menu-item': true,
|
|
31062
31191
|
'is-selected': item.id === this.selectedItemId,
|
|
31063
31192
|
'is-disabled': !!item.disabled,
|
|
31064
31193
|
'is-focused': index === this.focusedIndex,
|
|
31065
|
-
}, role: "tab", "aria-selected": item.id === this.selectedItemId ? 'true' : 'false', "aria-controls": panelId, "aria-disabled": item.disabled ? 'true' : undefined, tabIndex: this.getTabIndex(item, index), disabled: item.disabled, onClick: () => this.handleItemClick(item), onKeyDown: e => this.handleKeyDown(e, item, index), onFocus: () => this.handleFocus(index), onBlur: this.handleBlur }, item.icon && (h("kritzel-icon", { name: item.icon, size: 20, class: "menu-item-icon" })), h("span", { class: "menu-item-label" }, item.label), h("span", { class: "menu-item-chevron", "aria-hidden": "true" }, h("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round", "stroke-linejoin": "round" }, h("path", { d: "m9 18 6-6-6-6" }))))))), h("div", { key: '
|
|
31194
|
+
}, role: "tab", "aria-selected": item.id === this.selectedItemId ? 'true' : 'false', "aria-controls": panelId, "aria-disabled": item.disabled ? 'true' : undefined, tabIndex: this.getTabIndex(item, index), disabled: item.disabled, onClick: () => this.handleItemClick(item), onKeyDown: e => this.handleKeyDown(e, item, index), onFocus: () => this.handleFocus(index), onBlur: this.handleBlur }, item.icon && (h("kritzel-icon", { name: item.icon, size: 20, class: "menu-item-icon" })), h("span", { class: "menu-item-label" }, item.label), h("span", { class: "menu-item-chevron", "aria-hidden": "true" }, h("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round", "stroke-linejoin": "round" }, h("path", { d: "m9 18 6-6-6-6" }))))))), h("div", { key: 'e8f762ad87fdcf401ec717538bf1e979b22a9f15', id: panelId, class: "detail-panel", role: "tabpanel", "aria-labelledby": selectedTabId }, h("button", { key: '958360d57a1fad0953bc3865503e86c1d8aa24e3', class: "mobile-back-button", onClick: this.handleBackClick, "aria-label": "Back to menu" }, h("kritzel-icon", { key: 'c65eb947f80aafec99b367dae7ea72b1a77acdac', name: "chevron-left", size: 20, class: "mobile-back-icon" }), "Back"), h("slot", { key: '44557fddf513fffd86c7a1b28b71a41fef7701f1' })))));
|
|
31066
31195
|
}
|
|
31067
31196
|
static get watchers() { return {
|
|
31068
31197
|
"selectedItemId": [{
|
|
@@ -31135,7 +31264,7 @@ const KritzelMenu = class {
|
|
|
31135
31264
|
this.itemCloseChildMenu.emit(event.detail);
|
|
31136
31265
|
};
|
|
31137
31266
|
render() {
|
|
31138
|
-
return (h(Host, { key: '
|
|
31267
|
+
return (h(Host, { key: '804ed34eb5340ecc1611ada01f608f7a0cf2f619', tabIndex: 0, onClick: e => e.stopPropagation() }, this.openChildMenuItem && h("div", { key: '6de5954a05b7f28961fa33cf8d34df3a81aae5f8', class: "has-open-child-overlay", onClick: this.onOverlayClick }), this.items.map(item => (h("kritzel-menu-item", { key: item.id, "data-testid": `menu-item-${item.id}`, item: item, parent: this.parent, style: { pointerEvents: this.editingMenuItem && !item.isEditing ? 'none' : 'auto' }, onItemSelect: this.handleItemSelect, onItemSave: this.handleSave, onItemCancel: this.handleCancel, onItemToggleChildMenu: this.handleToggleChildMenu, onItemCloseChildMenu: this.handleCloseChildMenu })))));
|
|
31139
31268
|
}
|
|
31140
31269
|
};
|
|
31141
31270
|
KritzelMenu.style = kritzelMenuCss();
|
|
@@ -31240,12 +31369,12 @@ const KritzelMenuItem = class {
|
|
|
31240
31369
|
];
|
|
31241
31370
|
}
|
|
31242
31371
|
render() {
|
|
31243
|
-
return (h(Host, { key: '
|
|
31372
|
+
return (h(Host, { key: '9b35e5631cfa14aca391636f06598ef6f2f26550', tabIndex: this.item.isDisabled ? -1 : 0, class: {
|
|
31244
31373
|
'selected': this.item.isSelected,
|
|
31245
31374
|
'editing': this.item.isEditing,
|
|
31246
31375
|
'disabled': this.item.isDisabled,
|
|
31247
31376
|
'child-open': this.item.isChildMenuOpen,
|
|
31248
|
-
}, onClick: this.handleItemSelect }, h("div", { key: '
|
|
31377
|
+
}, onClick: this.handleItemSelect }, h("div", { key: '175258699f76fdad5dcf3c7481e7882c6765bf33', class: "menu-item-overlay" }), this.item.isEditing ? this.renderEditMode() : this.renderViewMode()));
|
|
31249
31378
|
}
|
|
31250
31379
|
static get watchers() { return {
|
|
31251
31380
|
"item": [{
|
|
@@ -31397,7 +31526,7 @@ const KritzelMoreMenu = class {
|
|
|
31397
31526
|
this.closeMenu();
|
|
31398
31527
|
};
|
|
31399
31528
|
render() {
|
|
31400
|
-
return (h(Host, { key: '
|
|
31529
|
+
return (h(Host, { key: '3eaf5dac0beb1f08100c9f57f63a2bdbef6e592d', class: { mobile: this.isTouchDevice }, style: { display: this.visible ? '' : 'none' } }, h("div", { key: '30e4426b7d3a06ec45f0159f6403862bf4106723', class: { 'more-menu-wrapper': true, visible: this.visible } }, h("button", { key: '037b715fadad3b674f07bd9225acc4075b2d41b3', class: "more-menu-button", "data-testid": "more-menu-button", onClick: this.toggleMenu, "aria-label": this.terms['moreMenu.ariaLabel'] ?? 'More options' }, h("kritzel-icon", { key: 'b68b306b5b913ff36d220604a70626aa8468215c', name: this.icon, size: this.iconSize })), h("kritzel-portal", { key: 'dc86c2679956f2dfc66d000b183d99865291b6d3', anchor: this.menuAnchor, offsetY: this.offsetY, onClose: this.closeMenu }, h("kritzel-menu", { key: '9bd661fceea95df4d307e497d64365fcb854e8ce', items: this.resolveMenuLabels(this.visibleItems), onItemSelect: this.handleMenuItemSelect })))));
|
|
31401
31530
|
}
|
|
31402
31531
|
static get watchers() { return {
|
|
31403
31532
|
"items": [{
|
|
@@ -31569,7 +31698,7 @@ const KritzelNumericInput = class {
|
|
|
31569
31698
|
this.valueChange.emit(newValue);
|
|
31570
31699
|
};
|
|
31571
31700
|
render() {
|
|
31572
|
-
return (h(Host, { key: '
|
|
31701
|
+
return (h(Host, { key: '68e6fecd79c3c970d1742b1a0bb8667ca2d31729' }, h("div", { key: 'efcf623186d221690bbb956088ec51343de07f3a', class: "input-container" }, this.label && h("label", { key: '300de793f02008ad037da021003b46fc34fc5239', class: "input-label" }, this.label), h("div", { key: '9ff424901fddfcbdac4835e2b2089df2e0966d0f', class: "input-wrapper" }, h("input", { key: 'fc77e6ad1c0b15e3dd3f960b6448ddab1a9beeb1', type: "number", class: "numeric-input", title: "", min: this.min === Number.MIN_SAFE_INTEGER ? undefined : this.min, max: this.max === Number.MAX_SAFE_INTEGER ? undefined : this.max, step: this.step, value: this.inputValue, placeholder: this.placeholder, onInput: this.handleInput, onBlur: this.handleBlur, onKeyDown: this.handleKeyDown, onInvalid: this.handleInvalid }), h("div", { key: 'c286606fa0617cc3acbbe40a27e40b154002e01d', class: "spinner-buttons" }, h("button", { key: 'e3a65a327975918fe604cd196ffb087fc4d3ca47', type: "button", class: "spinner-button spinner-up", onClick: this.handleIncrement, tabIndex: -1, "aria-label": "Increase value" }, h("svg", { key: '62b2ff4ed67ca8b6fc220ff9c63ceca90f75baea', viewBox: "0 0 10 6", class: "spinner-icon" }, h("path", { key: '803d5c30826d40d95f282071f3f88356366a9faf', d: "M1 5L5 1L9 5", stroke: "currentColor", "stroke-width": "1.5", fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round" }))), h("button", { key: '3c54a48e7082f5aaa9ed923357d0cc4a722018b5', type: "button", class: "spinner-button spinner-down", onClick: this.handleDecrement, tabIndex: -1, "aria-label": "Decrease value" }, h("svg", { key: '9f6cb5f34bbb0e70b5773aecec519b7d8b742712', viewBox: "0 0 10 6", class: "spinner-icon" }, h("path", { key: '6539b0d4f4bd26e463fa9152cf58757497355cf6', d: "M1 1L5 5L9 1", stroke: "currentColor", "stroke-width": "1.5", fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round" }))))))));
|
|
31573
31702
|
}
|
|
31574
31703
|
static get watchers() { return {
|
|
31575
31704
|
"value": [{
|
|
@@ -31579,7 +31708,7 @@ const KritzelNumericInput = class {
|
|
|
31579
31708
|
};
|
|
31580
31709
|
KritzelNumericInput.style = kritzelNumericInputCss();
|
|
31581
31710
|
|
|
31582
|
-
const kritzelOpacitySliderCss = () => `:host{display:flex;flex-direction:column;padding:0;box-sizing:border-box}.opacity-container{display:flex;align-items:center;width:232px}.slider-wrapper{flex:1;display:flex;align-items:center}.opacity-slider{-webkit-appearance:none;appearance:none;width:100%;height:6px;border-radius:3px;background:linear-gradient(
|
|
31711
|
+
const kritzelOpacitySliderCss = () => `:host{display:flex;flex-direction:column;padding:0;box-sizing:border-box}.opacity-container{display:flex;align-items:center;width:232px}.slider-wrapper{flex:1;display:flex;align-items:center}.opacity-slider{-webkit-appearance:none;appearance:none;width:100%;height:6px;border-radius:3px;background:linear-gradient( to right, var(--kritzel-opacity-slider-active-color, #007AFF) 0%, var(--kritzel-opacity-slider-active-color, #007AFF) var(--slider-progress, 100%), var(--kritzel-opacity-slider-track-color, #e0e0e0) var(--slider-progress, 100%), var(--kritzel-opacity-slider-track-color, #e0e0e0) 100% );outline:none;cursor:var(--kritzel-global-pointer-cursor, pointer)}.opacity-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:16px;height:16px;border-radius:50%;background:var(--kritzel-opacity-slider-thumb-color, #ffffff);border:2px solid var(--kritzel-opacity-slider-thumb-border-color, #007AFF);cursor:var(--kritzel-global-pointer-cursor, pointer);box-shadow:0 1px 3px rgba(0, 0, 0, 0.2);transition:transform 0.1s ease}.opacity-slider::-webkit-slider-thumb:hover{transform:scale(1.1)}.opacity-slider::-moz-range-thumb{width:16px;height:16px;border-radius:50%;background:var(--kritzel-opacity-slider-thumb-color, #ffffff);border:2px solid var(--kritzel-opacity-slider-thumb-border-color, #007AFF);cursor:var(--kritzel-global-pointer-cursor, pointer);box-shadow:0 1px 3px rgba(0, 0, 0, 0.2);transition:transform 0.1s ease}.opacity-slider::-moz-range-thumb:hover{transform:scale(1.1)}.opacity-slider::-moz-range-track{height:6px;border-radius:3px;background:transparent}.opacity-slider:focus{outline:none}.opacity-slider:focus::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--kritzel-global-focus-ring-color, rgba(0, 122, 255, 0.3))}.opacity-slider:focus::-moz-range-thumb{box-shadow:0 0 0 2px var(--kritzel-global-focus-ring-color, rgba(0, 122, 255, 0.3))}`;
|
|
31583
31712
|
|
|
31584
31713
|
const KritzelOpacitySlider = class {
|
|
31585
31714
|
constructor(hostRef) {
|
|
@@ -31608,7 +31737,7 @@ const KritzelOpacitySlider = class {
|
|
|
31608
31737
|
}
|
|
31609
31738
|
render() {
|
|
31610
31739
|
const percentage = this.getPercentage();
|
|
31611
|
-
return (h(Host, { key: '
|
|
31740
|
+
return (h(Host, { key: '895ae10ad71e846a1bc62b794751332816650727' }, h("div", { key: '22ea167ce0d6eb17c733d789cde10477c48a2a0e', class: "opacity-container" }, h("div", { key: '2be4fbf8c1f8ddb1fde8f9da727ed0947d21646c', class: "slider-wrapper" }, h("input", { key: 'ed3621baf0adc54aa513a0296ede2f413378a06f', type: "range", class: "opacity-slider", min: this.min, max: this.max, step: this.step, value: this.value, onInput: (e) => this.handleInput(e), style: {
|
|
31612
31741
|
'--slider-progress': `${percentage}%`,
|
|
31613
31742
|
'--kritzel-opacity-slider-thumb-border-color': this.previewColor,
|
|
31614
31743
|
} })))));
|
|
@@ -31673,7 +31802,7 @@ const KritzelPillTabs = class {
|
|
|
31673
31802
|
buttons?.[newIndex]?.focus();
|
|
31674
31803
|
}
|
|
31675
31804
|
render() {
|
|
31676
|
-
return (h(Host, { key: '
|
|
31805
|
+
return (h(Host, { key: 'f02f93ada5ec002695b62f511c847de201a8cbe4' }, h("div", { key: 'bb08ae773f1b993cb330556a5778d71fc5e91ce1', class: "pill-tabs-container", role: "tablist" }, this.tabs.map((tab, index) => (h("button", { key: tab.id, class: {
|
|
31677
31806
|
'pill-tab': true,
|
|
31678
31807
|
'selected': this.value === tab.id,
|
|
31679
31808
|
}, role: "tab", "aria-selected": this.value === tab.id ? 'true' : 'false', tabIndex: this.value === tab.id ? 0 : -1, onClick: () => this.handleTabClick(tab.id), onKeyDown: (e) => this.handleKeyDown(e, index) }, tab.icon && h("kritzel-icon", { name: tab.icon, size: 16 }), h("span", { class: "pill-tab-label" }, tab.label)))))));
|
|
@@ -31961,7 +32090,7 @@ const KritzelPortal = class {
|
|
|
31961
32090
|
this.portal.style.visibility = 'visible';
|
|
31962
32091
|
}
|
|
31963
32092
|
render() {
|
|
31964
|
-
return (h(Host, { key: '
|
|
32093
|
+
return (h(Host, { key: '489a752e48d96c2607defa40a39477675685b60a', style: { display: this.anchor ? 'block' : 'none' } }, h("slot", { key: '13c6b7567039b8c8c78de27e3d9aeda30a798de1' })));
|
|
31965
32094
|
}
|
|
31966
32095
|
static get watchers() { return {
|
|
31967
32096
|
"anchor": [{
|
|
@@ -31975,7 +32104,7 @@ const KritzelPortal = class {
|
|
|
31975
32104
|
* This file is auto-generated by the version bump scripts.
|
|
31976
32105
|
* Do not modify manually.
|
|
31977
32106
|
*/
|
|
31978
|
-
const KRITZEL_VERSION = '0.4.
|
|
32107
|
+
const KRITZEL_VERSION = '0.4.22';
|
|
31979
32108
|
|
|
31980
32109
|
const kritzelSettingsCss = () => `:host{display:contents}kritzel-dialog{--kritzel-dialog-body-padding:0;--kritzel-dialog-width-large:800px;--kritzel-dialog-height-large:500px}.footer-button{padding:8px 16px;border-radius:6px;cursor:pointer;font-size:14px}.cancel-button{border:1px solid #ebebeb;background:#fff;color:inherit}.cancel-button:hover{background:#f5f5f5}.settings-tab-panel{display:none}.settings-tab-panel.is-active{display:block}.settings-content{padding:0}.settings-content h3{margin:0 0 16px 0;font-size:18px;font-weight:600;color:var(--kritzel-settings-content-heading-color, #333333)}.settings-content p{margin:0;font-size:14px;color:var(--kritzel-settings-content-text-color, #666666);line-height:1.5}.settings-group{display:flex;flex-direction:column;gap:24px}.settings-item{display:flex;flex-direction:column;gap:8px}.settings-row{display:flex;align-items:center;justify-content:space-between;gap:16px}.settings-label{font-size:14px;font-weight:600;color:var(--kritzel-settings-label-color, #333333);margin:0 0 4px 0}.settings-description{font-size:12px;color:var(--kritzel-settings-description-color, #888888);margin:0;line-height:1.4}.shortcuts-list{display:flex;flex-direction:column;gap:24px}.shortcuts-category{display:flex;flex-direction:column;gap:8px}.shortcuts-category-title{font-size:14px;font-weight:600;color:var(--kritzel-settings-label-color, #333333);margin:0 0 4px 0}.shortcuts-group{display:flex;flex-direction:column;gap:4px}.shortcut-item{display:flex;justify-content:space-between;align-items:center;padding:6px 8px;border-radius:4px;background:var(--kritzel-settings-shortcut-item-bg, rgba(0, 0, 0, 0.02))}.shortcut-label{font-size:14px;color:var(--kritzel-settings-content-text-color, #666666)}.shortcut-key{font-family:monospace;font-size:12px;padding:2px 8px;border-radius:4px;background:var(--kritzel-settings-shortcut-key-bg, #f0f0f0);color:var(--kritzel-settings-shortcut-key-color, #333333);border:1px solid var(--kritzel-settings-shortcut-key-border, #ddd)}`;
|
|
31981
32110
|
|
|
@@ -32187,7 +32316,7 @@ const KritzelSettings = class {
|
|
|
32187
32316
|
return (h("div", { class: "settings-categories-wrapper" }, h("div", { class: { 'settings-tab-panel': true, 'is-active': this.selectedCategoryId === 'general' } }, h("div", { class: "settings-content" }, h("h3", null, this.t('settings.general.title', 'General Settings')), h("div", { class: "settings-group" }, h("div", { class: "settings-item" }, h("label", { class: "settings-label" }, this.t('settings.general.theme.label', 'Theme')), h("p", { class: "settings-description" }, this.t('settings.general.theme.description', 'Select a registered color theme for the editor interface.')), h("kritzel-dropdown", { options: this.availableThemes.map(t => ({ value: t, label: t })), value: this.theme, onValueChanged: this.handleThemeChange })), this.availableLocales.length > 0 && (h("div", { class: "settings-item" }, h("label", { class: "settings-label" }, this.t('settings.general.language.label', 'Language')), h("p", { class: "settings-description" }, this.t('settings.general.language.description', 'Select the display language for the editor interface.')), h("kritzel-dropdown", { options: this.availableLocales.map(l => ({ value: l.code, label: l.label })), value: this.locale, onValueChanged: this.handleLocaleChange }))), h("div", { class: "settings-item" }, h("label", { class: "settings-label" }, this.t('settings.general.lockDrawingScale.label', 'Lock Drawing Scale')), h("p", { class: "settings-description" }, this.t('settings.general.lockDrawingScale.description', 'When enabled, drawn objects maintain a fixed visual size regardless of the current zoom level.')), h("kritzel-slide-toggle", { checked: this.lockDrawingScale, label: this.t('settings.general.lockDrawingScale.label', 'Lock Drawing Scale'), onCheckedChange: this.handleLockDrawingScaleChange }))))), h("div", { class: { 'settings-tab-panel': true, 'is-active': this.selectedCategoryId === 'viewport' } }, h("div", { class: "settings-content" }, h("h3", null, this.t('settings.viewport.title', 'Viewport Settings')), h("div", { class: "settings-group" }, h("div", { class: "settings-item" }, h("label", { class: "settings-label" }, this.t('settings.viewport.minZoom.label', 'Minimum Zoom Level')), h("p", { class: "settings-description" }, this.t('settings.viewport.minZoom.description', 'Sets the minimum zoom level. Lower values allow zooming out further to see more of the canvas.')), h("kritzel-numeric-input", { value: this.scaleMin, min: 0.0001, max: 1, step: 0.0001, onValueChange: this.handleScaleMinChange })), h("div", { class: "settings-item" }, h("label", { class: "settings-label" }, this.t('settings.viewport.maxZoom.label', 'Maximum Zoom Level')), h("p", { class: "settings-description" }, this.t('settings.viewport.maxZoom.description', 'Sets the maximum zoom level. Higher values allow zooming in closer for detailed work.')), h("kritzel-numeric-input", { value: this.scaleMax, min: 1, max: 1000, step: 1, onValueChange: this.handleScaleMaxChange })), h("div", { class: "settings-item" }, h("label", { class: "settings-label" }, this.t('settings.viewport.boundaryLeft.label', 'Viewport Boundary Left')), h("p", { class: "settings-description" }, this.t('settings.viewport.boundaryLeft.description', 'Left boundary in world coordinates. Set to limit how far left the viewport can pan.')), h("kritzel-numeric-input", { value: this.viewportBoundaryLeft, step: 100, placeholder: this.t('settings.viewport.boundaryPlaceholder', 'Infinite'), onValueChange: this.handleViewportBoundaryLeftChange })), h("div", { class: "settings-item" }, h("label", { class: "settings-label" }, this.t('settings.viewport.boundaryRight.label', 'Viewport Boundary Right')), h("p", { class: "settings-description" }, this.t('settings.viewport.boundaryRight.description', 'Right boundary in world coordinates. Set to limit how far right the viewport can pan.')), h("kritzel-numeric-input", { value: this.viewportBoundaryRight, step: 100, placeholder: this.t('settings.viewport.boundaryPlaceholder', 'Infinite'), onValueChange: this.handleViewportBoundaryRightChange })), h("div", { class: "settings-item" }, h("label", { class: "settings-label" }, this.t('settings.viewport.boundaryTop.label', 'Viewport Boundary Top')), h("p", { class: "settings-description" }, this.t('settings.viewport.boundaryTop.description', 'Top boundary in world coordinates. Set to limit how far up the viewport can pan.')), h("kritzel-numeric-input", { value: this.viewportBoundaryTop, step: 100, placeholder: this.t('settings.viewport.boundaryPlaceholder', 'Infinite'), onValueChange: this.handleViewportBoundaryTopChange })), h("div", { class: "settings-item" }, h("label", { class: "settings-label" }, this.t('settings.viewport.boundaryBottom.label', 'Viewport Boundary Bottom')), h("p", { class: "settings-description" }, this.t('settings.viewport.boundaryBottom.description', 'Bottom boundary in world coordinates. Set to limit how far down the viewport can pan.')), h("kritzel-numeric-input", { value: this.viewportBoundaryBottom, step: 100, placeholder: this.t('settings.viewport.boundaryPlaceholder', 'Infinite'), onValueChange: this.handleViewportBoundaryBottomChange }))))), h("div", { class: { 'settings-tab-panel': true, 'is-active': this.selectedCategoryId === 'shortcuts' } }, h("div", { class: "settings-content" }, h("h3", null, this.t('settings.shortcuts.title', 'Keyboard Shortcuts')), h("div", { class: "shortcuts-list" }, Array.from(this.groupShortcutsByCategory()).map(([category, shortcuts]) => (h("div", { class: "shortcuts-category", key: category }, h("h4", { class: "shortcuts-category-title" }, category), h("div", { class: "shortcuts-group" }, shortcuts.map(shortcut => (h("div", { class: "shortcut-item", key: shortcut.key + shortcut.label }, h("span", { class: "shortcut-label" }, shortcut.label), h("kbd", { class: "shortcut-key" }, this.formatKeyCombo(shortcut)))))))))))), h("div", { class: { 'settings-tab-panel': true, 'is-active': this.selectedCategoryId === 'developer' } }, h("div", { class: "settings-content" }, h("h3", null, this.t('settings.developer.title', 'Developer Options')), h("div", { class: "settings-group" }, h("div", { class: "settings-item" }, h("label", { class: "settings-label" }, this.t('settings.developer.showViewportInfo.label', 'Show Viewport Info')), h("p", { class: "settings-description" }, this.t('settings.developer.showViewportInfo.description', 'Display viewport debug information such as position, zoom level, and boundaries.')), h("kritzel-slide-toggle", { checked: this.debugInfo.showViewportInfo, label: this.t('settings.developer.showViewportInfo.label', 'Show Viewport Info'), onCheckedChange: this.handleDebugInfoChange('showViewportInfo') })), h("div", { class: "settings-item" }, h("label", { class: "settings-label" }, this.t('settings.developer.showObjectInfo.label', 'Show Object Info')), h("p", { class: "settings-description" }, this.t('settings.developer.showObjectInfo.description', 'Display debug information about objects on the canvas.')), h("kritzel-slide-toggle", { checked: this.debugInfo.showObjectInfo, label: this.t('settings.developer.showObjectInfo.label', 'Show Object Info'), onCheckedChange: this.handleDebugInfoChange('showObjectInfo') })), h("div", { class: "settings-item" }, h("label", { class: "settings-label" }, this.t('settings.developer.showSyncProviderInfo.label', 'Show Sync Provider Info')), h("p", { class: "settings-description" }, this.t('settings.developer.showSyncProviderInfo.description', 'Display debug information about the sync provider connection status.')), h("kritzel-slide-toggle", { checked: this.debugInfo.showSyncProviderInfo, label: this.t('settings.developer.showSyncProviderInfo.label', 'Show Sync Provider Info'), onCheckedChange: this.handleDebugInfoChange('showSyncProviderInfo') })), h("div", { class: "settings-item" }, h("label", { class: "settings-label" }, this.t('settings.developer.showMigrationInfo.label', 'Show Migration Info')), h("p", { class: "settings-description" }, this.t('settings.developer.showMigrationInfo.description', 'Display debug information about data migrations.')), h("kritzel-slide-toggle", { checked: this.debugInfo.showMigrationInfo, label: this.t('settings.developer.showMigrationInfo.label', 'Show Migration Info'), onCheckedChange: this.handleDebugInfoChange('showMigrationInfo') }))))), h("div", { class: { 'settings-tab-panel': true, 'is-active': this.selectedCategoryId === 'about' } }, h("div", { class: "settings-content" }, h("h3", null, this.t('settings.about.title', 'About')), h("p", null, this.t('settings.about.description', 'Kritzel - A drawing application')), h("p", { class: "version-info" }, "Version ", KRITZEL_VERSION), h("p", { class: "version-info" }, "App-State Schema v", CURRENT_APP_STATE_SCHEMA_VERSION), h("p", { class: "version-info" }, "Workspace Schema v", CURRENT_WORKSPACE_SCHEMA_VERSION)))));
|
|
32188
32317
|
}
|
|
32189
32318
|
render() {
|
|
32190
|
-
return (h(Host, { key: '
|
|
32319
|
+
return (h(Host, { key: '71f8a12325a781212dd6f2c8b794563fcb4eee64' }, h("kritzel-dialog", { key: '1abe7c1dedcf79433a95d60dadce342f46e62c3a', isOpen: this.isDialogOpen, dialogTitle: this.t('settings.dialogTitle', 'Settings'), size: "large", contained: true, onDialogClose: this.closeDialog }, h("kritzel-master-detail", { key: '9e8b3a11d97c1a10c6693434eb2e8bfc1d3fda7d', items: this.categories, selectedItemId: this.selectedCategoryId, onItemSelect: this.handleCategorySelect }, this.renderCategoryContent()))));
|
|
32191
32320
|
}
|
|
32192
32321
|
static get watchers() { return {
|
|
32193
32322
|
"settings": [{
|
|
@@ -32220,10 +32349,10 @@ const KritzelShapeFill = class {
|
|
|
32220
32349
|
return (h("svg", { viewBox: "0 0 24 24", class: "fill-icon" }, h("rect", { x: "4", y: "4", width: "16", height: "16", rx: "2", fill: strokeColor, stroke: strokeColor, "stroke-width": "2" })));
|
|
32221
32350
|
}
|
|
32222
32351
|
render() {
|
|
32223
|
-
return (h(Host, { key: '
|
|
32352
|
+
return (h(Host, { key: '6d38a9af2e4c4c7f86ab994c63fc074007c86b48' }, h("div", { key: 'cf58f26cb0e56e274873d11024209c6908d317bb', class: "fill-row" }, h("button", { key: 'c75eed70fe0c2fcbf0fd136bb6fce75b2dbfb45d', class: {
|
|
32224
32353
|
'fill-option': true,
|
|
32225
32354
|
'selected': this.value === 'transparent',
|
|
32226
|
-
}, onClick: () => this.handleFillChange('transparent'), title: "Transparent background" }, this.renderFillIcon('transparent')), h("button", { key: '
|
|
32355
|
+
}, onClick: () => this.handleFillChange('transparent'), title: "Transparent background" }, this.renderFillIcon('transparent')), h("button", { key: '5d6ede439b5d5e55598cd8c20b5851fb9f210463', class: {
|
|
32227
32356
|
'fill-option': true,
|
|
32228
32357
|
'selected': this.value === 'filled',
|
|
32229
32358
|
}, onClick: () => this.handleFillChange('filled'), title: "Filled background" }, this.renderFillIcon('filled')))));
|
|
@@ -35427,9 +35556,9 @@ const KritzelShareDialog = class {
|
|
|
35427
35556
|
this.dialogClosed.emit();
|
|
35428
35557
|
};
|
|
35429
35558
|
render() {
|
|
35430
|
-
return (h(Host, { key: '
|
|
35559
|
+
return (h(Host, { key: 'f6028ad618f04e3be65c816f4b53c4ccaa93fc71' }, h("kritzel-dialog", { key: '7dabab65955f287650de4ba484e37f4ccdd7c57e', dialogTitle: this.terms['share.dialogTitle'] ?? 'Share Workspace', size: "small", isOpen: this.isDialogOpen, onDialogClose: this.closeDialog, contained: true }, h("div", { key: '321e2b17048dea20528c0f34f39a462548c64689', class: "share-content" }, h("div", { key: 'b31bbe2f686f5fe2fdc03189ffb98082683fff63', class: "share-section" }, h("div", { key: '2c864e00aa4c2da0a7f8ee6c83f149e6e93610a5', class: "share-row" }, h("div", { key: 'cbee03ac7ec9ee82f22c77d3681d4a540a0780a3', class: "share-label-group" }, h("label", { key: '3be7c8dc2ac2f7dbfe6458a902b14a887895fdc3', class: "share-label" }, this.terms['share.linkSharing.label'] ?? 'Link sharing'), h("p", { key: 'c7401bc76fdccbafc6c7c4e37380fc75f35b3a99', class: "share-description" }, this.internalIsPublic
|
|
35431
35560
|
? (this.terms['share.linkSharing.enabledDescription'] ?? 'Anyone with the link can access this workspace.')
|
|
35432
|
-
: (this.terms['share.linkSharing.disabledDescription'] ?? 'Link sharing is disabled. Only you can access this workspace.'))), h("kritzel-slide-toggle", { key: '
|
|
35561
|
+
: (this.terms['share.linkSharing.disabledDescription'] ?? 'Link sharing is disabled. Only you can access this workspace.'))), h("kritzel-slide-toggle", { key: '52ae14da0d79797e9ad73f1ffbac003fd1395f47', checked: this.internalIsPublic, onCheckedChange: this.handleToggleChange, label: this.terms['share.linkSharing.toggleLabel'] ?? 'Enable link sharing' }))), this.internalIsPublic && (h("div", { key: 'bd44618680db14d7d95f0c1bbc4441a103e9f15a', class: "share-section" }, h("div", { key: '659cd6b2e2e719d76f692a8dc5a8c0855e5d246d', class: "share-url-container" }, h("input", { key: '76be432ecaad753cb7043aad912d8aa1770afb61', type: "text", class: "share-url-input", value: this.getShareUrl(), readOnly: true, onClick: (e) => e.target.select() }), h("button", { key: 'ef75a04964fb481fae2f6e924497eb2adedc100d', class: { 'copy-button': true, 'copy-success': this.copySuccess }, onClick: this.handleCopyUrl, title: this.copySuccess ? (this.terms['share.copyLink.copied'] ?? 'Copied!') : (this.terms['share.copyLink.title'] ?? 'Copy link') }, h("kritzel-icon", { key: '06bbdc32d4348ca6d75dbbe11ba74d94e1c86882', name: this.copySuccess ? 'check' : 'copy', size: 18 }))), this.qrCodeDataUrl && (h("div", { key: '9246e86b26a9794738a29e6a6bfe6c4812339449', class: "share-qr-container" }, h("img", { key: '90e18eee230c23e0bfd773c9b8a6967803ae10dc', class: "share-qr-image", src: this.qrCodeDataUrl, alt: "QR code for share link" })))))))));
|
|
35433
35562
|
}
|
|
35434
35563
|
static get watchers() { return {
|
|
35435
35564
|
"isPublic": [{
|
|
@@ -35470,7 +35599,7 @@ const KritzelSlideToggle = class {
|
|
|
35470
35599
|
}
|
|
35471
35600
|
};
|
|
35472
35601
|
render() {
|
|
35473
|
-
return (h(Host, { key: '
|
|
35602
|
+
return (h(Host, { key: 'e310e7bc8c115feadaa2494a6a543719f1b25245', class: { checked: this.checked, disabled: this.disabled }, tabIndex: this.disabled ? -1 : 0, role: "switch", "aria-checked": this.checked ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.label, onClick: this.handleToggle, onKeyDown: this.handleKeyDown }, h("div", { key: 'fef37a1b373bf438cbacbf6537640269c2ab6b59', class: "toggle-track" }, h("div", { key: '4e140f83a8802e04c0b42e76f5e5719efd5a1cbc', class: "toggle-thumb" }))));
|
|
35474
35603
|
}
|
|
35475
35604
|
};
|
|
35476
35605
|
KritzelSlideToggle.style = kritzelSlideToggleCss();
|
|
@@ -35570,7 +35699,7 @@ const KritzelSplitButton = class {
|
|
|
35570
35699
|
this.menuScrollTop = event.target.scrollTop;
|
|
35571
35700
|
};
|
|
35572
35701
|
render() {
|
|
35573
|
-
return (h(Host, { key: '
|
|
35702
|
+
return (h(Host, { key: 'f7f5019b32f4514a4ccf5bd07742658e3d05020a', class: { mobile: this.isTouchDevice } }, h("button", { key: '361007b4281edfe2bf18f28f7c4f19ba1f251b49', class: "split-main-button", tabIndex: 0, onClick: this.handleButtonClick, disabled: this.mainButtonDisabled, "aria-label": "Main action" }, this.buttonIcon && h("kritzel-icon", { key: '17d4fad6cfa070225daa67dfc648d4ac64091e90', name: this.buttonIcon })), h("div", { key: 'c18107b7d557525092c28ff5d7336ebb3648b672', class: "split-divider" }), h("button", { key: 'c7a9a67d832f026fa8e21eff7ea5935cd72862ed', ref: el => (this.splitMenuButtonRef = el), class: "split-menu-button", tabIndex: 0, onClick: this.toggleMenu, disabled: this.menuButtonDisabled, "aria-label": "Open menu" }, h("kritzel-icon", { key: '5b40284c8f04fba80ca606b0af201040efe53880', name: this.dropdownIcon })), h("kritzel-portal", { key: '62bd7f26c020497f2131759d0d1ef9d18e817b37', anchor: this.anchorElement, offsetY: 4, onClose: this.closeMenu }, h("kritzel-menu", { key: 'a1a11a0ae33f9626db3cd56fbb881c613f1ab78c', ref: el => (this.menuRef = el), items: this.items, onItemSelect: this.handleItemSelect, onItemSave: this.handleItemSave, onItemCancel: this.handleItemCancel, onItemToggleChildMenu: this.handleItemToggleChildMenu, onItemCloseChildMenu: this.handleItemCloseChildMenu, onClose: this.closeMenu, onScroll: this.handleScroll }))));
|
|
35574
35703
|
}
|
|
35575
35704
|
};
|
|
35576
35705
|
KritzelSplitButton.style = kritzelSplitButtonCss();
|
|
@@ -35591,7 +35720,7 @@ const KritzelStrokeSize = class {
|
|
|
35591
35720
|
}
|
|
35592
35721
|
render() {
|
|
35593
35722
|
const sizes = this.sizes ?? [];
|
|
35594
|
-
return (h(Host, { key: '
|
|
35723
|
+
return (h(Host, { key: 'c0307e527e6f9d5d663ae3f8f605162cdde2a339' }, h("div", { key: '9533e0486f8078d25b7e8fc3323126d77700ac72', class: "size-grid" }, sizes.map(size => (h("div", { tabIndex: 0, class: {
|
|
35595
35724
|
'size-container': true,
|
|
35596
35725
|
'selected': this.selectedSize === size,
|
|
35597
35726
|
}, onClick: () => this.handleSizeClick(size) }, h("kritzel-color", { value: 'var(--kritzel-global-text-primary)', size: size })))))));
|
|
@@ -35610,7 +35739,7 @@ const KritzelSyncIndicator = class {
|
|
|
35610
35739
|
/** The text displayed next to the spinner. */
|
|
35611
35740
|
text = 'Syncing...';
|
|
35612
35741
|
render() {
|
|
35613
|
-
return (h(Host, { key: '
|
|
35742
|
+
return (h(Host, { key: '05e825ee1c08fe02008b8e1adfe9e09a7996f221' }, h("div", { key: 'ea1635896f643c16713d35d6efd3abf486b1fbe2', class: { indicator: true, visible: this.visible }, role: "status", "aria-live": "polite", "aria-label": "Synchronizing workspace" }, h("span", { key: '7b57ea67d6f2c40dc74e966c16ebe9d95c75394a', class: "spinner", "aria-hidden": "true" }), h("span", { key: 'fc16405b02d96213d0025239b6e863883192ada5' }, this.text))));
|
|
35614
35743
|
}
|
|
35615
35744
|
};
|
|
35616
35745
|
KritzelSyncIndicator.style = kritzelSyncIndicatorCss();
|
|
@@ -36023,14 +36152,14 @@ const KritzelTooltip = class {
|
|
|
36023
36152
|
}
|
|
36024
36153
|
}
|
|
36025
36154
|
render() {
|
|
36026
|
-
return (h(Host, { key: '
|
|
36155
|
+
return (h(Host, { key: '93486d37c5dcaaf9a3d0d1c53d6308ddd5712560', style: {
|
|
36027
36156
|
position: 'fixed',
|
|
36028
36157
|
zIndex: '9999',
|
|
36029
36158
|
transition: 'opacity 0.3s ease-in-out, transform 0.3s ease-in-out',
|
|
36030
36159
|
visibility: this.isVisible ? 'visible' : 'hidden',
|
|
36031
36160
|
left: `${this.positionX}px`,
|
|
36032
36161
|
bottom: `${this.positionY}px`,
|
|
36033
|
-
} }, h("div", { key: '
|
|
36162
|
+
} }, h("div", { key: '4b5cf451f75d09459145b874eb3c7faffafa87e0', class: "tooltip-content", onClick: event => event.stopPropagation(), onPointerDown: event => event.stopPropagation(), onMouseDown: event => event.stopPropagation() }, h("slot", { key: '6c7fda100473a7d4fc533edc52d67bf6909bdc0e' }))));
|
|
36034
36163
|
}
|
|
36035
36164
|
static get watchers() { return {
|
|
36036
36165
|
"triggerElement": [{
|
|
@@ -36071,7 +36200,7 @@ const KritzelUtilityPanel = class {
|
|
|
36071
36200
|
this.redo.emit();
|
|
36072
36201
|
}
|
|
36073
36202
|
render() {
|
|
36074
|
-
return (h(Host, { key: '
|
|
36203
|
+
return (h(Host, { key: '57c1a6746e4d5b319bb368c9d0bfc52a31d8c8de' }, h("button", { key: '5fb00d62b68de41feda9fafb3eec46cc0b85ba0e', class: "utility-button", "data-testid": "utility-undo", disabled: !this.undoState?.canUndo, onClick: event => this.handleUndo(event), "aria-label": this.terms['utility.undo'] ?? 'Undo' }, h("kritzel-icon", { key: '5ed2c36405ac7113ac697de9102aaf7067127e2a', name: "undo" })), h("button", { key: '0d58c8cbbb8e9547b9416dbf81a2c8011208dc6c', class: "utility-button", "data-testid": "utility-redo", disabled: !this.undoState?.canRedo, onClick: event => this.handleRedo(event), "aria-label": this.terms['utility.redo'] ?? 'Redo' }, h("kritzel-icon", { key: '70264118cbe0f54335a02941fdc868f63476cd1c', name: "redo" })), h("div", { key: '6eed6a603b8bc62e55b1f6fe82e7d035d1f5833c', class: "utility-separator" }), h("button", { key: 'd11195da7a86496afcca26105a6a0f066b1b2340', class: "utility-button", "data-testid": "utility-delete", onClick: () => this.delete.emit(), "aria-label": this.terms['utility.delete'] ?? 'Delete selected items' }, h("kritzel-icon", { key: '5e4c731f90863b4db917c67ac7e87c2945c7bcaa', name: "delete" }))));
|
|
36075
36204
|
}
|
|
36076
36205
|
};
|
|
36077
36206
|
KritzelUtilityPanel.style = kritzelUtilityPanelCss();
|
|
@@ -36092,7 +36221,7 @@ const KritzelWatermark = class {
|
|
|
36092
36221
|
label;
|
|
36093
36222
|
render() {
|
|
36094
36223
|
const label = this.label ?? this.core.localizationManager.translate('watermark.poweredBy');
|
|
36095
|
-
return (h(Host, { key: '
|
|
36224
|
+
return (h(Host, { key: 'ae00d98f16912afcb7a90d47a9fc4d55fc7468f0' }, h("a", { key: '8781f94c9efe44b0e7a7a8c20a119160cb9feb8e', class: "watermark-link", href: KRITZEL_WEBSITE_URL, target: "_blank", rel: "noopener noreferrer", part: "watermark", onPointerDown: (ev) => ev.stopPropagation(), onPointerUp: (ev) => ev.stopPropagation() }, label)));
|
|
36096
36225
|
}
|
|
36097
36226
|
};
|
|
36098
36227
|
KritzelWatermark.style = kritzelWatermarkCss();
|
|
@@ -36280,7 +36409,7 @@ const KritzelZoomPanel = class {
|
|
|
36280
36409
|
return Number.isFinite(this.zoomPercent) ? Math.max(1, Math.round(this.zoomPercent)) : 100;
|
|
36281
36410
|
}
|
|
36282
36411
|
render() {
|
|
36283
|
-
return (h(Host, { key: '
|
|
36412
|
+
return (h(Host, { key: 'ac5b3f37fbc298b1522f0ff80c26734164b5358a' }, h("div", { key: '8ac3f3600c45c064d9c4c4c9efa78397790edf4b', class: { panel: true, visible: this.visible } }, h("button", { key: '63b2a3fce804a310146d95cc9c2a874707f9e265', class: "zoom-button", type: "button", "aria-label": this.terms['zoom.zoomOut'] ?? 'Zoom out', disabled: this.disabled, onClick: this.handleZoomOut }, h("kritzel-icon", { key: '86ebb85dfc2b746cedd0ed63cd2ae90378f6bbb8', name: "minus" })), h("span", { key: '5191cc1aa9966234c1634882af145403acd32211', class: "zoom-level", "aria-live": "polite" }, this.normalizedZoomPercent, "%"), h("button", { key: '47a7ee5b6c1cf1c99cd1826877e0a1c4ce224442', class: "zoom-button", type: "button", "aria-label": this.terms['zoom.zoomIn'] ?? 'Zoom in', disabled: this.disabled, onClick: this.handleZoomIn }, h("kritzel-icon", { key: '09782e094534fbc5bbcc612f24eea359568d6132', name: "plus" })))));
|
|
36284
36413
|
}
|
|
36285
36414
|
};
|
|
36286
36415
|
KritzelZoomPanel.style = kritzelZoomPanelCss();
|