kritzel-stencil 0.4.25 → 0.4.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/dist/cjs/index-Xav9JFHg.js +2 -2
  2. package/dist/cjs/{kritzel-active-users_47.cjs.entry.js → kritzel-active-users_46.cjs.entry.js} +54 -154
  3. package/dist/cjs/loader.cjs.js +1 -1
  4. package/dist/cjs/stencil.cjs.js +1 -1
  5. package/dist/collection/classes/core/core.class.js +0 -4
  6. package/dist/collection/classes/structures/object-map.structure.js +0 -65
  7. package/dist/collection/collection-manifest.json +0 -1
  8. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +10 -33
  9. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +0 -20
  10. package/dist/collection/components/core/kritzel-watermark/kritzel-watermark.js +1 -1
  11. package/dist/collection/components/shared/kritzel-avatar/kritzel-avatar.js +3 -3
  12. package/dist/collection/components/shared/kritzel-button/kritzel-button.js +2 -2
  13. package/dist/collection/components/shared/kritzel-color/kritzel-color.js +2 -2
  14. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js +1 -1
  15. package/dist/collection/components/shared/kritzel-font/kritzel-font.js +1 -1
  16. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js +1 -1
  17. package/dist/collection/components/shared/kritzel-input/kritzel-input.js +1 -1
  18. package/dist/collection/components/shared/kritzel-master-detail/kritzel-master-detail.js +3 -3
  19. package/dist/collection/components/shared/kritzel-menu/kritzel-menu.js +1 -1
  20. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.js +2 -2
  21. package/dist/collection/components/shared/kritzel-numeric-input/kritzel-numeric-input.js +1 -1
  22. package/dist/collection/components/shared/kritzel-opacity-slider/kritzel-opacity-slider.js +1 -1
  23. package/dist/collection/components/shared/kritzel-portal/kritzel-portal.js +1 -1
  24. package/dist/collection/components/shared/kritzel-slide-toggle/kritzel-slide-toggle.js +1 -1
  25. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.js +1 -1
  26. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js +1 -1
  27. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js +2 -2
  28. package/dist/collection/components/ui/kritzel-back-to-content/kritzel-back-to-content.js +1 -1
  29. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +6 -6
  30. package/dist/collection/components/ui/kritzel-current-user/kritzel-current-user.js +1 -1
  31. package/dist/collection/components/ui/kritzel-current-user-dialog/kritzel-current-user-dialog.js +1 -1
  32. package/dist/collection/components/ui/kritzel-export/kritzel-export.js +1 -1
  33. package/dist/collection/components/ui/kritzel-loading-overlay/kritzel-loading-overlay.js +1 -1
  34. package/dist/collection/components/ui/kritzel-login-dialog/kritzel-login-dialog.js +1 -1
  35. package/dist/collection/components/ui/kritzel-more-menu/kritzel-more-menu.js +1 -1
  36. package/dist/collection/components/ui/kritzel-settings/kritzel-settings.js +1 -1
  37. package/dist/collection/components/ui/kritzel-share-dialog/kritzel-share-dialog.js +2 -2
  38. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +1 -1
  39. package/dist/collection/components/ui/kritzel-zoom-panel/kritzel-zoom-panel.js +1 -1
  40. package/dist/collection/constants/version.js +1 -1
  41. package/dist/components/index.d.ts +0 -2
  42. package/dist/components/index.js +1 -2
  43. package/dist/components/kritzel-active-users.js +1 -1
  44. package/dist/components/kritzel-avatar.js +1 -1
  45. package/dist/components/kritzel-back-to-content.js +1 -1
  46. package/dist/components/kritzel-button.js +1 -1
  47. package/dist/components/kritzel-color-palette.js +1 -1
  48. package/dist/components/kritzel-color.js +1 -1
  49. package/dist/components/kritzel-controls.js +1 -1
  50. package/dist/components/kritzel-current-user-dialog.js +1 -1
  51. package/dist/components/kritzel-current-user.js +1 -1
  52. package/dist/components/kritzel-editor.js +92 -107
  53. package/dist/components/kritzel-engine.js +1 -1
  54. package/dist/components/kritzel-export.js +1 -1
  55. package/dist/components/kritzel-font-size.js +1 -1
  56. package/dist/components/kritzel-font.js +1 -1
  57. package/dist/components/kritzel-input.js +1 -1
  58. package/dist/components/kritzel-loading-overlay.js +1 -1
  59. package/dist/components/kritzel-login-dialog.js +1 -1
  60. package/dist/components/kritzel-master-detail.js +1 -1
  61. package/dist/components/kritzel-menu-item.js +1 -1
  62. package/dist/components/kritzel-menu.js +1 -1
  63. package/dist/components/kritzel-more-menu.js +1 -1
  64. package/dist/components/kritzel-numeric-input.js +1 -1
  65. package/dist/components/kritzel-opacity-slider.js +1 -1
  66. package/dist/components/kritzel-portal.js +1 -1
  67. package/dist/components/kritzel-settings.js +1 -1
  68. package/dist/components/kritzel-share-dialog.js +1 -1
  69. package/dist/components/kritzel-slide-toggle.js +1 -1
  70. package/dist/components/kritzel-split-button.js +1 -1
  71. package/dist/components/kritzel-stroke-size.js +1 -1
  72. package/dist/components/kritzel-tool-config.js +1 -1
  73. package/dist/components/kritzel-tooltip.js +1 -1
  74. package/dist/components/kritzel-utility-panel.js +1 -1
  75. package/dist/components/kritzel-watermark.js +1 -1
  76. package/dist/components/kritzel-workspace-manager.js +1 -1
  77. package/dist/components/kritzel-zoom-panel.js +1 -1
  78. package/dist/components/{p-fL9rl200.js → p-B38_9BJg.js} +1 -1
  79. package/dist/components/{p-eZXIu4yK.js → p-BPzdPKWE.js} +3 -3
  80. package/dist/components/{p-BoN700-O.js → p-Ba0c-tu2.js} +2 -2
  81. package/dist/components/{p-B-585egz.js → p-BeSKOETx.js} +2 -2
  82. package/dist/components/{p-2WiGyky4.js → p-BprEDRpA.js} +2 -2
  83. package/dist/components/{p-B5SWPDuq.js → p-C0FEC_gS.js} +1 -1
  84. package/dist/components/{p-BrNsOp2v.js → p-CAXR5-S9.js} +4 -4
  85. package/dist/components/{p-BPsKYMH6.js → p-CBrn5AIB.js} +1 -1
  86. package/dist/components/{p-C98Eb3_R.js → p-Ce1j1-Hg.js} +3 -3
  87. package/dist/components/{p-DDTMGbtA.js → p-CeffYwAK.js} +15 -15
  88. package/dist/components/{p-CwZ3KKFq.js → p-ChPs27Fd.js} +3 -3
  89. package/dist/components/{p-D1rjfWgJ.js → p-CoXN583u.js} +3 -3
  90. package/dist/components/{p-DwMqCX2P.js → p-CucCT7Qn.js} +2 -2
  91. package/dist/components/{p-DB58Oa5V.js → p-Cva3jIIU.js} +1 -1
  92. package/dist/components/{p-vqEUQ-4Q.js → p-D0Ed8epW.js} +3 -3
  93. package/dist/components/{p-DBqoPgev.js → p-DFMZEarE.js} +1 -1
  94. package/dist/components/{p-DtnMdWWB.js → p-DK0anxtL.js} +1 -1
  95. package/dist/components/{p-4SPnZZkH.js → p-DN9p3G9K.js} +3 -3
  96. package/dist/components/{p-Dt7-I2Xz.js → p-DOTdJ3JQ.js} +2 -2
  97. package/dist/components/{p-HoO86l1o.js → p-DOl-95VY.js} +6 -6
  98. package/dist/components/{p-DKGg-76-.js → p-DTB3ykgO.js} +1 -1
  99. package/dist/components/{p-CzW58DHM.js → p-DUmLsjKb.js} +1 -1
  100. package/dist/components/{p-gJcH-huF.js → p-DUoQyGKc.js} +1 -76
  101. package/dist/components/{p-Czhdc844.js → p-D_cyY7Nd.js} +1 -1
  102. package/dist/components/{p-CF8pLc07.js → p-DhabvHJM.js} +3 -3
  103. package/dist/components/{p-CaBbajU2.js → p-DkHYY72B.js} +2 -2
  104. package/dist/components/{p-CrHvaLRV.js → p-DnmVD1Mz.js} +1 -1
  105. package/dist/components/{p-GKmqCI8r.js → p-DoxFuOy1.js} +2 -2
  106. package/dist/components/{p-dsxHDlQ3.js → p-Dpm75DfV.js} +2 -2
  107. package/dist/components/{p-BozrueXV.js → p-Dvn6ad4a.js} +1 -1
  108. package/dist/components/{p-PjPPCHVL.js → p-NOWtUeeQ.js} +1 -1
  109. package/dist/components/{p-DVXTPI71.js → p-OUl5CA4Y.js} +1 -1
  110. package/dist/components/{p-0fhjWRmT.js → p-m7SeNszM.js} +5 -5
  111. package/dist/esm/index-Dhio9uis.js +2 -2
  112. package/dist/esm/{kritzel-active-users_47.entry.js → kritzel-active-users_46.entry.js} +55 -154
  113. package/dist/esm/loader.js +1 -1
  114. package/dist/esm/stencil.js +1 -1
  115. package/dist/stencil/{p-dc5783ee.entry.js → p-5c045d3e.entry.js} +55 -154
  116. package/dist/stencil/stencil.esm.js +1 -1
  117. package/dist/types/classes/structures/object-map.structure.d.ts +0 -14
  118. package/dist/types/components/core/kritzel-editor/kritzel-editor.d.ts +0 -3
  119. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +0 -3
  120. package/dist/types/components.d.ts +0 -44
  121. package/dist/types/constants/version.d.ts +1 -1
  122. package/package.json +1 -1
  123. package/dist/collection/components/shared/kritzel-sync-indicator/kritzel-sync-indicator.css +0 -50
  124. package/dist/collection/components/shared/kritzel-sync-indicator/kritzel-sync-indicator.js +0 -66
  125. package/dist/components/kritzel-sync-indicator.d.ts +0 -11
  126. package/dist/components/kritzel-sync-indicator.js +0 -6
  127. package/dist/components/p-CAoN_STZ.js +0 -39
  128. package/dist/types/components/shared/kritzel-sync-indicator/kritzel-sync-indicator.d.ts +0 -7
@@ -5,7 +5,7 @@ import { c as commonjsGlobal } from './p-BFTU3MAI.js';
5
5
  import { a as KritzelColorHelper, D as DEFAULT_COLOR_PALETTE, K as KritzelThemeManager } from './p-7I4Uzjrw.js';
6
6
  import { K as KritzelDevicesHelper } from './p-jGOpkGDl.js';
7
7
  import { K as KritzelFontRegistry, r as resolveTextToolAvailableFonts } from './p-DJkKlUyZ.js';
8
- import { A as ABSOLUTE_SCALE_MAX, a as ABSOLUTE_SCALE_MIN, d as defineCustomElement$1 } from './p-DtnMdWWB.js';
8
+ import { A as ABSOLUTE_SCALE_MAX, a as ABSOLUTE_SCALE_MIN, d as defineCustomElement$1 } from './p-DK0anxtL.js';
9
9
  import { K as KritzelWorkspace, W as WORKSPACE_EXPORT_VERSION } from './p-DAwPPDMS.js';
10
10
  import { K as KritzelHTMLHelper } from './p-WUdQqYnu.js';
11
11
  import { O as ObjectHelper } from './p-DPONTran.js';
@@ -43322,14 +43322,6 @@ class KritzelObjectMap {
43322
43322
  _lastAwarenessEmitTime = 0;
43323
43323
  _awarenessEmitTimeout = null;
43324
43324
  AWARENESS_THROTTLE_INTERVAL = 100; // milliseconds
43325
- // Identities of the raw network-provider instances (e.g. WebsocketProvider, HocuspocusProvider)
43326
- // that Yjs tags as transaction origin for remote updates; local providers (IndexedDB,
43327
- // BroadcastChannel) never appear here, so their transactions never toggle isSyncing.
43328
- _networkTransactionOrigins = new Set();
43329
- _isSyncing = false;
43330
- _syncingChangeCallbacks = [];
43331
- _beforeTransactionHandler = null;
43332
- _afterAllTransactionsHandler = null;
43333
43325
  /**
43334
43326
  * When true, update() only modifies local state (quadtree + idMap)
43335
43327
  * without writing to Yjs. Used during drag operations to avoid
@@ -43505,22 +43497,6 @@ class KritzelObjectMap {
43505
43497
  this._objectsChangeCallbacks = this._objectsChangeCallbacks.filter(existingCallback => existingCallback !== callback);
43506
43498
  };
43507
43499
  }
43508
- /**
43509
- * Whether the local copy currently differs from data a remote peer is in the process of merging in.
43510
- */
43511
- get isSyncing() {
43512
- return this._isSyncing;
43513
- }
43514
- /**
43515
- * Registers a callback invoked when a remote sync starts (`true`) or finishes (`false`).
43516
- * "Starts" fires from `beforeTransaction`, before the incoming remote update is merged.
43517
- */
43518
- onSyncingChange(callback) {
43519
- this._syncingChangeCallbacks.push(callback);
43520
- return () => {
43521
- this._syncingChangeCallbacks = this._syncingChangeCallbacks.filter(existingCallback => existingCallback !== callback);
43522
- };
43523
- }
43524
43500
  /**
43525
43501
  * Returns the Yjs UndoManager instance for managing undo/redo operations.
43526
43502
  * @returns The UndoManager instance, or `null` if not initialized
@@ -43614,36 +43590,6 @@ class KritzelObjectMap {
43614
43590
  const providerList = this._providers.map(p => `${p.constructor.name} (${p.type})`).join(', ');
43615
43591
  console.info(`[Kritzel] Workspace sync providers initialized for ${docName}: ${providerList || 'none'}`);
43616
43592
  }
43617
- // Only network providers (WebSocket, Hocuspocus) represent a genuine remote peer;
43618
- // local providers (IndexedDB, BroadcastChannel) never appear as a transaction origin here,
43619
- // so loading from IndexedDB or a same-device tab never toggles isSyncing.
43620
- this._networkTransactionOrigins = new Set(this._providers
43621
- .filter(p => p.type === 'network')
43622
- .map(p => p.rawProvider)
43623
- .filter((origin) => origin != null));
43624
- // Fires before a remote-origin transaction integrates its update, so this always
43625
- // precedes any local/remote reconciliation for that update.
43626
- this._beforeTransactionHandler = transaction => {
43627
- if (this._isSyncing || !this._networkTransactionOrigins.has(transaction.origin)) {
43628
- return;
43629
- }
43630
- this._isSyncing = true;
43631
- this._syncingChangeCallbacks.forEach(callback => callback(true));
43632
- };
43633
- // Fires once a batch of transactions (possibly several remote updates) has fully settled.
43634
- this._afterAllTransactionsHandler = (_doc, transactions) => {
43635
- if (!this._isSyncing) {
43636
- return;
43637
- }
43638
- const hadRemoteTransaction = transactions.some(transaction => this._networkTransactionOrigins.has(transaction.origin));
43639
- if (!hadRemoteTransaction) {
43640
- return;
43641
- }
43642
- this._isSyncing = false;
43643
- this._syncingChangeCallbacks.forEach(callback => callback(false));
43644
- };
43645
- this._ydoc.on('beforeTransaction', this._beforeTransactionHandler);
43646
- this._ydoc.on('afterAllTransactions', this._afterAllTransactionsHandler);
43647
43593
  // captureTimeout is effectively infinite — undo-step boundaries are
43648
43594
  // marked explicitly via markUndoBoundary() in insert/remove/reset and
43649
43595
  // at stroke/gesture boundaries in the tools. This prevents a single
@@ -44392,20 +44338,11 @@ class KritzelObjectMap {
44392
44338
  p.destroy();
44393
44339
  });
44394
44340
  this._providers = [];
44395
- this._networkTransactionOrigins = new Set();
44396
44341
  // Clear object map references
44397
44342
  this._objectsMap = null;
44398
44343
  this._metadataMap = null;
44399
44344
  // Destroy Y.Doc
44400
44345
  if (this._ydoc) {
44401
- if (this._beforeTransactionHandler) {
44402
- this._ydoc.off('beforeTransaction', this._beforeTransactionHandler);
44403
- this._beforeTransactionHandler = null;
44404
- }
44405
- if (this._afterAllTransactionsHandler) {
44406
- this._ydoc.off('afterAllTransactions', this._afterAllTransactionsHandler);
44407
- this._afterAllTransactionsHandler = null;
44408
- }
44409
44346
  this._ydoc.destroy();
44410
44347
  this._ydoc = null;
44411
44348
  }
@@ -44415,8 +44352,6 @@ class KritzelObjectMap {
44415
44352
  this._workspaceId = null;
44416
44353
  this._isReady = false;
44417
44354
  this._temporaryItemsCount = 0;
44418
- this._isSyncing = false;
44419
- this._syncingChangeCallbacks = [];
44420
44355
  }
44421
44356
  }
44422
44357
 
@@ -46267,10 +46202,6 @@ class KritzelCore {
46267
46202
  objectsMap.onAwarenessChange(states => {
46268
46203
  this.engine.emitAwarenessChange(states);
46269
46204
  });
46270
- // Forward remote sync start/finish to the engine as events
46271
- objectsMap.onSyncingChange(isSyncing => {
46272
- this.engine.emitIsSyncing(isSyncing);
46273
- });
46274
46205
  // Rebuild anchor index after loading objects
46275
46206
  this._anchorManager.rebuildIndex();
46276
46207
  this.engine.emitObjectsChange();
@@ -48968,8 +48899,6 @@ const KritzelEngine = /*@__PURE__*/ proxyCustomElement(class KritzelEngine exten
48968
48899
  viewportChange;
48969
48900
  /** Emitted when the awareness state changes (remote user cursors, presence). */
48970
48901
  awarenessChange;
48971
- /** Emitted when a remote sync starts (`true`, data differs from the local copy) or finishes (`false`). */
48972
- isSyncing;
48973
48902
  /** Emitted when notifications change. */
48974
48903
  notificationsChange;
48975
48904
  /** Emitted when context-menu visibility, items, or position changes. */
@@ -50682,7 +50611,6 @@ const KritzelEngine = /*@__PURE__*/ proxyCustomElement(class KritzelEngine exten
50682
50611
  this.objectsInViewportChange = createEvent(this, "objectsInViewportChange");
50683
50612
  this.viewportChange = createEvent(this, "viewportChange");
50684
50613
  this.awarenessChange = createEvent(this, "awarenessChange");
50685
- this.isSyncing = createEvent(this, "isSyncing");
50686
50614
  this.notificationsChange = createEvent(this, "notificationsChange");
50687
50615
  this.contextMenuStateChange = createEvent(this, "contextMenuStateChange");
50688
50616
  this.loadingChange = createEvent(this, "loadingChange");
@@ -50989,9 +50917,6 @@ const KritzelEngine = /*@__PURE__*/ proxyCustomElement(class KritzelEngine exten
50989
50917
  emitAwarenessChange(states) {
50990
50918
  this.awarenessChange.emit(states);
50991
50919
  }
50992
- emitIsSyncing(isSyncing) {
50993
- this.isSyncing.emit(isSyncing);
50994
- }
50995
50920
  emitObjectsInViewportChange() {
50996
50921
  const visibleObjects = this.core.store.objectsInViewport;
50997
50922
  this.objectsInViewportChange.emit(visibleObjects);
@@ -28,7 +28,7 @@ const KritzelBackToContent = /*@__PURE__*/ proxyCustomElement(class KritzelBackT
28
28
  this.backToContent.emit();
29
29
  };
30
30
  render() {
31
- 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" }))));
31
+ return (h(Host, { key: '0a41ed93e39193416eebdaf786557bffd4653dd0' }, h("button", { key: '1f621de9699127a095e94d910d5c96328324b299', class: { 'back-to-content-button': true, visible: this.visible }, onClick: this.handleClick, "aria-label": this.text }, h("kritzel-icon", { key: '8ff49df055a0472edbbc57d84044a2de09b543c8', name: "chevrons-left" }))));
32
32
  }
33
33
  static get style() { return kritzelBackToContentCss(); }
34
34
  }, [513, "kritzel-back-to-content", {
@@ -102,15 +102,15 @@ const KritzelMasterDetail = /*@__PURE__*/ proxyCustomElement(class KritzelMaster
102
102
  const selectedItem = this.items.find(item => item.id === this.selectedItemId);
103
103
  const panelId = 'master-detail-panel';
104
104
  const selectedTabId = selectedItem ? `tab-${selectedItem.id}` : undefined;
105
- return (h(Host, { key: '0166376f16ebb098049cd2ef5539a86086a5570e' }, h("div", { key: 'f5091fe672bc4751c8f66d43baa5c1fc86fca034', class: {
105
+ return (h(Host, { key: 'fc187266604f9d48210096a1574bf86482498a40' }, h("div", { key: '2886b386c6e96df671ff4902b2c9f7084f0c3191', class: {
106
106
  'master-detail-container': true,
107
107
  'is-mobile-detail-visible': this.showMobileDetail,
108
- } }, 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: {
108
+ } }, h("nav", { key: '94a35861b7c97d7f5f1505e4c25bc7f584c6351f', 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: {
109
109
  'menu-item': true,
110
110
  'is-selected': item.id === this.selectedItemId,
111
111
  'is-disabled': !!item.disabled,
112
112
  'is-focused': index === this.focusedIndex,
113
- }, 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' })))));
113
+ }, 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: 'd55507c8e818314bd548506d1b568357062378db', id: panelId, class: "detail-panel", role: "tabpanel", "aria-labelledby": selectedTabId }, h("button", { key: 'f7bf50b2ecd7093110ee0fc91d49caf468ee9116', class: "mobile-back-button", onClick: this.handleBackClick, "aria-label": "Back to menu" }, h("kritzel-icon", { key: 'c809cea0d279439ced7a580ea2a4f44d5ec2b8b6', name: "chevron-left", size: 20, class: "mobile-back-icon" }), "Back"), h("slot", { key: '78babf63e193db45e26ea6602ab09dde045bf06e' })))));
114
114
  }
115
115
  static get watchers() { return {
116
116
  "selectedItemId": [{
@@ -140,14 +140,14 @@ const KritzelTooltip = /*@__PURE__*/ proxyCustomElement(class KritzelTooltip ext
140
140
  }
141
141
  }
142
142
  render() {
143
- return (h(Host, { key: '93486d37c5dcaaf9a3d0d1c53d6308ddd5712560', style: {
143
+ return (h(Host, { key: '407a2f458626f02808fc9d718046a635de71662b', style: {
144
144
  position: 'fixed',
145
145
  zIndex: '9999',
146
146
  transition: 'opacity 0.3s ease-in-out, transform 0.3s ease-in-out',
147
147
  visibility: this.isVisible ? 'visible' : 'hidden',
148
148
  left: `${this.positionX}px`,
149
149
  bottom: `${this.positionY}px`,
150
- } }, h("div", { key: '4b5cf451f75d09459145b874eb3c7faffafa87e0', class: "tooltip-content", onClick: event => event.stopPropagation(), onPointerDown: event => event.stopPropagation(), onMouseDown: event => event.stopPropagation() }, h("slot", { key: '6c7fda100473a7d4fc533edc52d67bf6909bdc0e' }))));
150
+ } }, h("div", { key: '13c00678bd485f1f5bc2676e2c89fd0019f5e089', class: "tooltip-content", onClick: event => event.stopPropagation(), onPointerDown: event => event.stopPropagation(), onMouseDown: event => event.stopPropagation() }, h("slot", { key: '67937f71c611f36a2c47ee2632a8657ced1d8cc7' }))));
151
151
  }
152
152
  static get watchers() { return {
153
153
  "triggerElement": [{
@@ -33,7 +33,7 @@ const KritzelOpacitySlider = /*@__PURE__*/ proxyCustomElement(class KritzelOpaci
33
33
  }
34
34
  render() {
35
35
  const percentage = this.getPercentage();
36
- 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: {
36
+ return (h(Host, { key: '51b1e93e982f29f181f9f542dcc2939fca08d7de' }, h("div", { key: '3376dac02effb137c04efc5aa9de96d4a5b36452', class: "opacity-container" }, h("div", { key: '3d1d2c0fe1b4b4185e37dcbf61a6c3a955fe1356', class: "slider-wrapper" }, h("input", { key: '6c43f519ff5d7bbc17ce7804909e52efc6e9533b', type: "range", class: "opacity-slider", min: this.min, max: this.max, step: this.step, value: this.value, onInput: (e) => this.handleInput(e), style: {
37
37
  '--slider-progress': `${percentage}%`,
38
38
  '--kritzel-opacity-slider-thumb-border-color': this.previewColor,
39
39
  } })))));
@@ -1,5 +1,5 @@
1
1
  import { p as proxyCustomElement, H, c as createEvent, h, d as Host, t as transformTag } from './p-B43upypT.js';
2
- import { d as defineCustomElement$1 } from './p-Dt7-I2Xz.js';
2
+ import { d as defineCustomElement$1 } from './p-DOTdJ3JQ.js';
3
3
 
4
4
  const kritzelStrokeSizeCss = () => `:host{display:flex;align-items:flex-start;gap:0;padding:0;width:100%;box-sizing:border-box}.size-grid{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 32px);gap:8px;justify-items:center}.size-container{display:flex;justify-content:center;align-items:center;width:32px;height:32px;border-radius:50%;cursor:var(--kritzel-global-pointer-cursor, pointer);border:2px solid transparent;box-sizing:border-box}.size-container:hover{background-color:var(--kritzel-stroke-size-hover-background-color, #ebebeb)}.size-container.selected{border-color:var(--kritzel-selection-border-color, #007AFF);background-color:var(--kritzel-stroke-size-selected-background-color, #ebebeb)}`;
5
5
 
@@ -21,7 +21,7 @@ const KritzelStrokeSize = /*@__PURE__*/ proxyCustomElement(class KritzelStrokeSi
21
21
  }
22
22
  render() {
23
23
  const sizes = this.sizes ?? [];
24
- return (h(Host, { key: 'c0307e527e6f9d5d663ae3f8f605162cdde2a339' }, h("div", { key: '9533e0486f8078d25b7e8fc3323126d77700ac72', class: "size-grid" }, sizes.map(size => (h("div", { tabIndex: 0, class: {
24
+ return (h(Host, { key: '8b12f354a3395cd69c7199115ce998cf2eb26eb2' }, h("div", { key: '39008613327d50b75270dd78ea498113e5e9617b', class: "size-grid" }, sizes.map(size => (h("div", { tabIndex: 0, class: {
25
25
  'size-container': true,
26
26
  'selected': this.selectedSize === size,
27
27
  }, onClick: () => this.handleSizeClick(size) }, h("kritzel-color", { value: 'var(--kritzel-global-text-primary)', size: size })))))));
@@ -2,7 +2,7 @@ import { p as proxyCustomElement, H, c as createEvent, h, d as Host, t as transf
2
2
  import { d as defineCustomElement$5 } from './p-DX2nriaq.js';
3
3
  import { d as defineCustomElement$4 } from './p-Df3BwVGy.js';
4
4
  import { d as defineCustomElement$3 } from './p-CSuU8frA.js';
5
- import { d as defineCustomElement$2 } from './p-PjPPCHVL.js';
5
+ import { d as defineCustomElement$2 } from './p-NOWtUeeQ.js';
6
6
  import { d as defineCustomElement$1 } from './p-jIKskj3S.js';
7
7
 
8
8
  const kritzelExportCss = () => `:host{display:flex;flex-direction:column;min-height:0}.export-content{display:flex;flex-direction:column;gap:16px;padding:0;flex:1}.export-content kritzel-pill-tabs{align-self:center}.export-tab-content{display:flex;flex-direction:column;gap:16px;min-height:330px}.format-selection{display:flex;flex-direction:column;gap:6px}.format-selection label{font-size:14px;font-weight:500;color:var(--kritzel-global-text-primary, #333)}.export-primary-button{width:100%;padding:12px 24px;background-color:var(--kritzel-global-primary-color, #007AFF);color:var(--kritzel-global-primary-text-color, #fff);border:none;border-radius:var(--kritzel-button-border-radius, 8px);font-size:14px;font-weight:600;cursor:pointer;transition:background-color 0.2s ease;-webkit-tap-highlight-color:transparent}.export-primary-button:hover{background-color:var(--kritzel-global-primary-hover-color, #0066d6)}.export-primary-button:focus-visible{outline:revert;outline-offset:revert}.preview-container{width:100%;display:flex;justify-content:center;align-items:center;box-sizing:border-box;margin-bottom:8px}.preview-container img{max-width:100%;max-height:250px;object-fit:contain;box-shadow:0 4px 8px rgba(0, 0, 0, 0.15);border-radius:4px;border:1px solid var(--kritzel-global-border-color, #dbdbdb)}.export-content p{margin:0;color:var(--kritzel-global-text-secondary, #666)}@media (max-width: 576px){.export-tab-content{flex:1;min-height:0}}`;
@@ -87,7 +87,7 @@ const KritzelExport = /*@__PURE__*/ proxyCustomElement(class KritzelExport exten
87
87
  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 })));
88
88
  }
89
89
  render() {
90
- 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')))));
90
+ return (h(Host, { key: '61ce7589d0453a1bd9fde8f33a711e06225eacde' }, h("kritzel-dialog", { key: '48da046edabdb5659b6edefaca56adb7531f9862', isOpen: this.isDialogOpen, dialogTitle: this.terms['export.dialogTitle'] ?? 'Export', closable: true, contained: true, onDialogClose: this.closeDialog }, h("div", { key: 'b7afc64ad1f558a78aa68c07b4dec65e6ca21c67', class: "export-content" }, h("kritzel-pill-tabs", { key: '59f759ade5a590eda6ba87f89eb433ced62da0cd', tabs: this.tabs, value: this.activeTab, onValueChange: this.handleTabChange }), this.activeTab === 'viewport' && this.renderViewportExport(), this.activeTab === 'workspace' && this.renderWorkspaceExport()), h("div", { key: 'a38bf30c9c5256d417cd3b0baf743e245a8cf3e4', slot: "footer" }, h("button", { key: '3dc9c53416ff9c8ca47df003f41767a2143fa4ef', class: "export-primary-button", onClick: this.handleExport }, this.terms['export.exportButton'] ?? 'Export')))));
91
91
  }
92
92
  static get style() { return kritzelExportCss(); }
93
93
  }, [513, "kritzel-export", {
@@ -32,7 +32,7 @@ const KritzelSlideToggle = /*@__PURE__*/ proxyCustomElement(class KritzelSlideTo
32
32
  }
33
33
  };
34
34
  render() {
35
- 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" }))));
35
+ return (h(Host, { key: 'd8a9509138995da84fe798da448f0487d8c082b5', 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: '0966d487def99332139fe6f4a604fff310088d72', class: "toggle-track" }, h("div", { key: 'aeec11224dffa71178f38b0a96a7e15c35f67bcf', class: "toggle-thumb" }))));
36
36
  }
37
37
  static get style() { return kritzelSlideToggleCss(); }
38
38
  }, [513, "kritzel-slide-toggle", {
@@ -39,7 +39,7 @@ const KritzelInput = /*@__PURE__*/ proxyCustomElement(class KritzelInput extends
39
39
  this.valueChange.emit(input.value);
40
40
  };
41
41
  render() {
42
- 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)))));
42
+ return (h(Host, { key: '92393344834011156bda2f682e559e7806864d19' }, h("div", { key: '5d569b8746d9285701259979ec554dbb41df4490', class: "input-container" }, this.label && h("label", { key: 'a27844d3da23d353b0ea2dede3c664fdbcbb6aab', class: "input-label" }, this.label), h("div", { key: 'fab4f3f1bda07c78f39ea96ba87c42be5de08286', class: { 'input-wrapper': true, 'has-suffix': !!this.suffix } }, h("input", { key: '4294687bc9f6006b0b64427c111af08d82ad5ffd', type: this.type, class: "text-input", value: this.inputValue, placeholder: this.placeholder, disabled: this.disabled, onInput: this.handleInput }), this.suffix && h("span", { key: '83adbd2978c92e969fedd9ad75f2c89b017b31a5', class: "input-suffix" }, this.suffix)))));
43
43
  }
44
44
  static get watchers() { return {
45
45
  "value": [{
@@ -14,7 +14,7 @@ const KritzelFont = /*@__PURE__*/ proxyCustomElement(class KritzelFont extends H
14
14
  size = 24;
15
15
  color = '#000000';
16
16
  render() {
17
- return (h(Host, { key: '42f058426e2afcc49c788f2385e23a5ff153e77c' }, h("div", { key: '962dfc48ba84c5f5d2b98eb2464c69c04764ab0f', class: "font-preview", style: {
17
+ return (h(Host, { key: '08ef3f41967f34f17cbbc42982b0edbb59edb2e2' }, h("div", { key: 'dc7b64d53dbee634a2da068c618a352e6b43bea7', class: "font-preview", style: {
18
18
  fontFamily: this.fontFamily,
19
19
  fontSize: `${this.size}px`,
20
20
  color: this.color
@@ -3,16 +3,16 @@ import { C as CURRENT_APP_STATE_SCHEMA_VERSION, a as CURRENT_WORKSPACE_SCHEMA_VE
3
3
  import { d as defineCustomElement$6 } from './p-DX2nriaq.js';
4
4
  import { d as defineCustomElement$5 } from './p-Df3BwVGy.js';
5
5
  import { d as defineCustomElement$4 } from './p-CSuU8frA.js';
6
- import { d as defineCustomElement$3 } from './p-CF8pLc07.js';
7
- import { d as defineCustomElement$2 } from './p-DKGg-76-.js';
8
- import { d as defineCustomElement$1 } from './p-BozrueXV.js';
6
+ import { d as defineCustomElement$3 } from './p-DhabvHJM.js';
7
+ import { d as defineCustomElement$2 } from './p-DTB3ykgO.js';
8
+ import { d as defineCustomElement$1 } from './p-Dvn6ad4a.js';
9
9
 
10
10
  /**
11
11
  * The current version of the Kritzel library.
12
12
  * This file is auto-generated by the version bump scripts.
13
13
  * Do not modify manually.
14
14
  */
15
- const KRITZEL_VERSION = '0.4.25';
15
+ const KRITZEL_VERSION = '0.4.26';
16
16
 
17
17
  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)}`;
18
18
 
@@ -228,7 +228,7 @@ const KritzelSettings = /*@__PURE__*/ proxyCustomElement(class KritzelSettings e
228
228
  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)))));
229
229
  }
230
230
  render() {
231
- 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()))));
231
+ return (h(Host, { key: '96981b34953ffdda4cfdfa9e6acc832dedc0c64a' }, h("kritzel-dialog", { key: '792a68aa1fe66780a937a95db802e9c6a2135091', isOpen: this.isDialogOpen, dialogTitle: this.t('settings.dialogTitle', 'Settings'), size: "large", contained: true, onDialogClose: this.closeDialog }, h("kritzel-master-detail", { key: 'dc7d99c2b90ea4a86bc23527a39eaec70d95acc8', items: this.categories, selectedItemId: this.selectedCategoryId, onItemSelect: this.handleCategorySelect }, this.renderCategoryContent()))));
232
232
  }
233
233
  static get watchers() { return {
234
234
  "settings": [{
@@ -112,10 +112,10 @@ var loadModule = (cmpMeta, hostRef, hmrVersionId) => {
112
112
  }
113
113
  switch(bundleId) {
114
114
 
115
- case 'kritzel-active-users_47':
115
+ case 'kritzel-active-users_46':
116
116
  return import(
117
117
  /* webpackMode: "lazy" */
118
- './kritzel-active-users_47.entry.js').then(processMod, consoleError);
118
+ './kritzel-active-users_46.entry.js').then(processMod, consoleError);
119
119
  case 'kritzel-brush-style':
120
120
  return import(
121
121
  /* webpackMode: "lazy" */